diff --git a/.github/workflows/reVC_msvc_amd64.yml b/.github/workflows/reVC_msvc_amd64.yml new file mode 100644 index 0000000..9cd83ee --- /dev/null +++ b/.github/workflows/reVC_msvc_amd64.yml @@ -0,0 +1,65 @@ +name: reVC premake amd64 + +on: + pull_request: + push: + release: + types: published +env: + GLFW_VER: "3.3.2" + GLFW_BASE: "glfw-3.3.2.bin.WIN64" + GLFW_FILE: "glfw-3.3.2.bin.WIN64.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, Vanilla] + steps: + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v1.0.2 + - uses: actions/checkout@v2 + with: + submodules: 'true' + - 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.GLFW_FILE}} + - name: Configure build + run: | + ./premake5 vs2019 --with-librw --glfwdir64=${{env.GLFW_BASE}} + - name: Build + run: | + msbuild -m build/reVC.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}} + # - name: Pack artifacts + # run: | + # 7z a reVC_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/* + - name: Move binaries to gamefiles + run: | + mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reVC.exe ./gamefiles/ + mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reVC.pdb ./gamefiles/ + - name: Move dynamic dependencies to gamefiles + run: | + mv ./vendor/mpg123/dist/Win64/libmpg123-0.dll ./gamefiles/ + mv ./vendor/openal-soft/dist/Win64/OpenAL32.dll ./gamefiles/ + - name: Upload artifact to actions + uses: actions/upload-artifact@v2 + with: + name: reVC_${{matrix.buildtype}}_${{matrix.platform}} + path: ./gamefiles/* +# - name: Upload artifact to Bintray +# uses: hpcsc/upload-bintray-docker-action@v1 +# with: +# repository: reVC +# 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/reVC_msvc_x86.yml b/.github/workflows/reVC_msvc_x86.yml new file mode 100644 index 0000000..dc5eaed --- /dev/null +++ b/.github/workflows/reVC_msvc_x86.yml @@ -0,0 +1,67 @@ +name: reVC premake x86 + +on: + pull_request: + push: + release: + types: published +env: + GLFW_VER: "3.3.2" + GLFW_BASE: "glfw-3.3.2.bin.WIN32" + GLFW_FILE: "glfw-3.3.2.bin.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, Vanilla] + steps: + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v1.0.2 + - uses: actions/checkout@v2 + with: + submodules: 'true' + - 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.GLFW_FILE}} + - name: Configure build + run: | + ./premake5 vs2019 --with-librw --glfwdir32=${{env.GLFW_BASE}} + - name: Build + run: | + msbuild -m build/reVC.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}} + # - name: Pack artifacts + # run: | + # 7z a reVC_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/* + - name: Move binaries to gamefiles + run: | + mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reVC.exe ./gamefiles/ + mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reVC.pdb ./gamefiles/ + - if: contains(matrix.platform, 'oal') + name: Move dynamic dependencies to gamefiles + run: | + mv ./vendor/mpg123/dist/Win32/libmpg123-0.dll ./gamefiles/ + mv ./vendor/openal-soft/dist/Win32/OpenAL32.dll ./gamefiles/ + - name: Upload artifact to actions + uses: actions/upload-artifact@v2 + with: + name: reVC_${{matrix.buildtype}}_${{matrix.platform}} + path: ./gamefiles/* +# - name: Upload artifact to Bintray +# uses: hpcsc/upload-bintray-docker-action@v1 +# with: +# repository: reVC +# 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/CMakeLists.txt b/CMakeLists.txt index 199bfeb..e8689b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.8) -set(EXECUTABLE reLCS) -set(PROJECT RELCS) +set(EXECUTABLE reVC) +set(PROJECT REVC) project(${EXECUTABLE} C CXX) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") diff --git a/conanfile.py b/conanfile.py index 69a7750..c5b7480 100644 --- a/conanfile.py +++ b/conanfile.py @@ -5,8 +5,8 @@ import shutil import textwrap -class ReLCSConan(ConanFile): - name = "reLCS" +class ReVCConan(ConanFile): + name = "reVC" version = "master" license = "???" # FIXME: https://github.com/GTAmodding/re3/issues/794 settings = "os", "arch", "compiler", "build_type" @@ -69,10 +69,10 @@ class ReLCSConan(ConanFile): raise ConanInvalidConfiguration("Only `glfw` is supported as gl3_gfxlib.") #if not self.options.with_opus: # if not self.options["libsndfile"].with_external_libs: - # raise ConanInvalidConfiguration("reLCS with opus support requires a libsndfile built with external libs (=ogg/flac/opus/vorbis)") + # raise ConanInvalidConfiguration("reVC with opus support requires a libsndfile built with external libs (=ogg/flac/opus/vorbis)") @property - def _reLCS_audio(self): + def _reVC_audio(self): return { "miles": "MSS", "openal": "OAL", @@ -111,16 +111,16 @@ class ReLCSConan(ConanFile): include("{}/conanbuildinfo.cmake") conan_basic_setup(TARGETS NO_OUTPUT_DIRS) - add_subdirectory("{}" reLCS) + add_subdirectory("{}" reVC) """).format(self.install_folder.replace("\\", "/"), self.source_folder.replace("\\", "/"))) except FileNotFoundError: pass cmake = CMake(self) - cmake.definitions["RELCS_AUDIO"] = self._reLCS_audio - cmake.definitions["RELCS_WITH_OPUS"] = self.options.with_opus - cmake.definitions["RELCS_INSTALL"] = True - cmake.definitions["RELCS_VENDORED_LIBRW"] = False + cmake.definitions["REVC_AUDIO"] = self._reVC_audio + cmake.definitions["REVC_WITH_OPUS"] = self.options.with_opus + cmake.definitions["REVC_INSTALL"] = True + cmake.definitions["REVC_VENDORED_LIBRW"] = False env = {} if self._os_is_playstation2: cmake.definitions["CMAKE_TOOLCHAIN_FILE"] = self.deps_user_info["ps2dev-cmaketoolchain"].cmake_toolchain_file diff --git a/gamefiles/TEXT/ENGLISH.gxt b/gamefiles/TEXT/ENGLISH.gxt deleted file mode 100644 index cbd5844..0000000 Binary files a/gamefiles/TEXT/ENGLISH.gxt and /dev/null differ diff --git a/gamefiles/TEXT/american.gxt b/gamefiles/TEXT/american.gxt new file mode 100644 index 0000000..4db81fc Binary files /dev/null and b/gamefiles/TEXT/american.gxt differ diff --git a/gamefiles/TEXT/french.gxt b/gamefiles/TEXT/french.gxt index fc4026d..36f4225 100644 Binary files a/gamefiles/TEXT/french.gxt and b/gamefiles/TEXT/french.gxt differ diff --git a/gamefiles/TEXT/german.gxt b/gamefiles/TEXT/german.gxt index 7f087fd..772865d 100644 Binary files a/gamefiles/TEXT/german.gxt and b/gamefiles/TEXT/german.gxt differ diff --git a/gamefiles/TEXT/italian.gxt b/gamefiles/TEXT/italian.gxt index 265bf35..fd087c0 100644 Binary files a/gamefiles/TEXT/italian.gxt and b/gamefiles/TEXT/italian.gxt differ diff --git a/gamefiles/TEXT/russian.gxt b/gamefiles/TEXT/russian.gxt new file mode 100644 index 0000000..375323b Binary files /dev/null and b/gamefiles/TEXT/russian.gxt differ diff --git a/gamefiles/TEXT/spanish.gxt b/gamefiles/TEXT/spanish.gxt index 88191fa..7a71144 100644 Binary files a/gamefiles/TEXT/spanish.gxt and b/gamefiles/TEXT/spanish.gxt differ diff --git a/gamefiles/models/fonts_r.txd b/gamefiles/models/fonts_r.txd new file mode 100644 index 0000000..b6d50ac Binary files /dev/null and b/gamefiles/models/fonts_r.txd differ diff --git a/gamefiles/models/generic.txd b/gamefiles/models/generic.txd new file mode 100644 index 0000000..885cba1 Binary files /dev/null and b/gamefiles/models/generic.txd differ diff --git a/gamefiles/models/particle.txd b/gamefiles/models/particle.txd new file mode 100644 index 0000000..b0c585f Binary files /dev/null and b/gamefiles/models/particle.txd differ diff --git a/premake5.lua b/premake5.lua index 77530c5..531f92e 100644 --- a/premake5.lua +++ b/premake5.lua @@ -1,420 +1,409 @@ -newoption { - trigger = "glfwdir64", - value = "PATH", - description = "Directory of glfw", - default = "vendor/glfw-3.3.2.bin.WIN64", -} - -newoption { - trigger = "glfwdir32", - value = "PATH", - description = "Directory of glfw", - default = "vendor/glfw-3.3.2.bin.WIN32", -} - -newoption { - trigger = "with-asan", - description = "Build with address sanitizer" -} - -newoption { - trigger = "with-librw", - description = "Build and use librw from this solution" -} - -newoption { - trigger = "with-opus", - description = "Build with opus" -} - -newoption { - trigger = "lto", - description = "Use link time optimization" -} - -if(_OPTIONS["with-librw"]) then - Librw = "vendor/librw" -else - Librw = os.getenv("LIBRW") or "vendor/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' - elseif a == 'ARM64' then - return 'arm64' - end - return a -end - -workspace "reLCS" - language "C++" - configurations { "Debug", "Release", "Vanilla" } - startproject "reLCS" - location "build" - symbols "Full" - staticruntime "off" - - -- for CVECTORHACK - configuration { "gmake*" } - buildoptions { "-fpermissive" } - - filter { "platforms:macosx*" } - buildoptions { "-Wno-address-of-temporary" } - - if _OPTIONS["with-asan"] then - buildoptions { "-fsanitize=address -g3 -fno-omit-frame-pointer" } - linkoptions { "-fsanitize=address" } - end - - filter { "system:windows" } - platforms { - "win-x86-RW34_d3d8-mss", - "win-x86-librw_d3d9-mss", - "win-x86-librw_gl3_glfw-mss", - "win-x86-RW34_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", - "linux-arm64-librw_gl3_glfw-oal", - } - - filter { "system:bsd" } - platforms { - "bsd-x86-librw_gl3_glfw-oal", - "bsd-amd64-librw_gl3_glfw-oal", - "bsd-arm-librw_gl3_glfw-oal", - "bsd-arm64-librw_gl3_glfw-oal" - } - - filter { "system:macosx" } - platforms { - "macosx-arm64-librw_gl3_glfw-oal", - "macosx-amd64-librw_gl3_glfw-oal", - } - - filter "configurations:Debug" - defines { "DEBUG" } - - filter "configurations:not Debug" - defines { "NDEBUG" } - optimize "Speed" - if(_OPTIONS["lto"]) then - flags { "LinkTimeOptimization" } - end - - filter "configurations:Vanilla" - defines { "VANILLA_DEFINES" } - - filter { "platforms:win*" } - system "windows" - - filter { "platforms:linux*" } - system "linux" - - filter { "platforms:bsd*" } - system "bsd" - - filter { "platforms:macosx*" } - system "macosx" - - filter { "platforms:*x86*" } - architecture "x86" - - filter { "platforms:*amd64*" } - architecture "amd64" - - filter { "platforms:*arm*" } - architecture "ARM" - - filter { "platforms:macosx-arm64-*" } - buildoptions { "-target", "arm64-apple-macos11", "-std=gnu++14" } - - filter { "platforms:macosx-amd64-*" } - buildoptions { "-target", "x86_64-apple-macos10.12", "-std=gnu++14" } - - 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" } - 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 {} - - function setpaths (gamepath, exepath) - if (gamepath) then - postbuildcommands { - '{COPYFILE} "%{cfg.buildtarget.abspath}" "' .. gamepath .. '%{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 - end - -if(_OPTIONS["with-librw"]) then -project "librw" - kind "StaticLib" - targetname "rw" - targetdir(path.join(Librw, "lib/%{cfg.platform}/%{cfg.buildcfg}")) - files { path.join(Librw, "src/*.*") } +newoption { + trigger = "glfwdir64", + value = "PATH", + description = "Directory of glfw", + default = "vendor/glfw-3.3.2.bin.WIN64", +} + +newoption { + trigger = "glfwdir32", + value = "PATH", + description = "Directory of glfw", + default = "vendor/glfw-3.3.2.bin.WIN32", +} + +newoption { + trigger = "with-asan", + description = "Build with address sanitizer" +} + +newoption { + trigger = "with-librw", + description = "Build and use librw from this solution" +} + +newoption { + trigger = "with-opus", + description = "Build with opus" +} + +newoption { + trigger = "lto", + description = "Use link time optimization" +} + +if(_OPTIONS["with-librw"]) then + Librw = "vendor/librw" +else + Librw = os.getenv("LIBRW") or "vendor/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' + elseif a == 'ARM64' then + return 'arm64' + end + return a +end + +workspace "reVC" + language "C++" + configurations { "Debug", "Release", "Vanilla" } + startproject "reVC" + location "build" + symbols "Full" + staticruntime "off" + + if _OPTIONS["with-asan"] then + buildoptions { "-fsanitize=address -g3 -fno-omit-frame-pointer" } + linkoptions { "-fsanitize=address" } + end + + filter { "system:windows" } + platforms { + "win-x86-RW34_d3d8-mss", + "win-x86-librw_d3d9-mss", + "win-x86-librw_gl3_glfw-mss", + "win-x86-RW34_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", + "linux-arm64-librw_gl3_glfw-oal", + } + + filter { "system:bsd" } + platforms { + "bsd-x86-librw_gl3_glfw-oal", + "bsd-amd64-librw_gl3_glfw-oal", + "bsd-arm-librw_gl3_glfw-oal", + "bsd-arm64-librw_gl3_glfw-oal" + } + + filter { "system:macosx" } + platforms { + "macosx-arm64-librw_gl3_glfw-oal", + "macosx-amd64-librw_gl3_glfw-oal", + } + + filter "configurations:Debug" + defines { "DEBUG" } + + filter "configurations:not Debug" + defines { "NDEBUG" } + optimize "Speed" + if(_OPTIONS["lto"]) then + flags { "LinkTimeOptimization" } + end + + filter "configurations:Vanilla" + defines { "VANILLA_DEFINES" } + + filter { "platforms:win*" } + system "windows" + + filter { "platforms:linux*" } + system "linux" + + filter { "platforms:bsd*" } + system "bsd" + + filter { "platforms:macosx*" } + system "macosx" + + filter { "platforms:*x86*" } + architecture "x86" + + filter { "platforms:*amd64*" } + architecture "amd64" + + filter { "platforms:*arm*" } + architecture "ARM" + + filter { "platforms:macosx-arm64-*" } + buildoptions { "-target", "arm64-apple-macos11", "-std=gnu++14" } + + filter { "platforms:macosx-amd64-*" } + buildoptions { "-target", "x86_64-apple-macos10.12", "-std=gnu++14" } + + 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" } + 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 {} + + function setpaths (gamepath, exepath) + if (gamepath) then + postbuildcommands { + '{COPYFILE} "%{cfg.buildtarget.abspath}" "' .. gamepath .. '%{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 + end + +if(_OPTIONS["with-librw"]) then +project "librw" + kind "StaticLib" + targetname "rw" + targetdir(path.join(Librw, "lib/%{cfg.platform}/%{cfg.buildcfg}")) + files { path.join(Librw, "src/*.*") } files { path.join(Librw, "src/*/*.*") } - files { path.join(Librw, "src/gl/*/*.*") } - - filter { "platforms:*x86*" } - architecture "x86" - - filter { "platforms:*amd64*" } - architecture "amd64" - - filter "platforms:win*" - defines { "_CRT_SECURE_NO_WARNINGS", "_CRT_NONSTDC_NO_DEPRECATE" } - staticruntime "on" - buildoptions { "/Zc:sizedDealloc-" } - - filter "platforms:bsd*" - includedirs { "/usr/local/include" } - libdirs { "/usr/local/lib" } - - filter "platforms:macosx*" - -- Support MacPorts and Homebrew - includedirs { "/opt/local/include" } - includedirs {"/usr/local/include" } - libdirs { "/opt/local/lib" } - libdirs { "/usr/local/lib" } - - filter "platforms:*gl3_glfw*" - staticruntime "off" - - filter "platforms:*RW34*" - flags { "ExcludeFromBuild" } - filter {} -end - -local function addSrcFiles( prefix ) - return prefix .. "/*cpp", prefix .. "/*.h", prefix .. "/*.c", prefix .. "/*.ico", prefix .. "/*.rc" -end - -project "reLCS" - kind "WindowedApp" - targetname "reLCS" - targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" - - if(_OPTIONS["with-librw"]) then - dependson "librw" - end - - files { addSrcFiles("src") } - files { addSrcFiles("src/animation") } - files { addSrcFiles("src/audio") } - files { addSrcFiles("src/audio/eax") } - files { addSrcFiles("src/audio/oal") } - files { addSrcFiles("src/buildings") } - files { addSrcFiles("src/collision") } - files { addSrcFiles("src/control") } - files { addSrcFiles("src/core") } - files { addSrcFiles("src/entities") } - files { addSrcFiles("src/leeds") } - files { addSrcFiles("src/leeds/base") } - 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") } - files { "src/extras/GitSHA1.cpp" } -- this won't be in repo in first build - - includedirs { "src" } - includedirs { "src/animation" } - includedirs { "src/audio" } - includedirs { "src/audio/eax" } - includedirs { "src/audio/oal" } - includedirs { "src/buildings" } - includedirs { "src/collision" } - includedirs { "src/control" } - includedirs { "src/core" } - includedirs { "src/entities" } - includedirs { "src/leeds" } - includedirs { "src/leeds/base" } - 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 { "vendor/ogg/include" } - includedirs { "vendor/opus/include" } - includedirs { "vendor/opusfile/include" } - end - - filter "platforms:*mss" - defines { "AUDIO_MSS" } - includedirs { "vendor/milessdk/include" } - libdirs { "vendor/milessdk/lib" } - - if _OPTIONS["with-opus"] then - filter "platforms:win*" - 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 - - filter "platforms:*oal" - defines { "AUDIO_OAL" } - - filter {} - if(os.getenv("GTA_LCS_RE_DIR")) then - setpaths(os.getenv("GTA_LCS_RE_DIR") .. "/", "%(cfg.buildtarget.name)") - end - - filter "platforms:win*" - files { addSrcFiles("src/skel/win") } - includedirs { "src/skel/win" } - buildoptions { "/Zc:sizedDealloc-" } - linkoptions "/SAFESEH:NO" - characterset ("MBCS") - targetextension ".exe" - if(_OPTIONS["with-librw"]) then - -- external librw is dynamic - staticruntime "on" - end - prebuildcommands { '"%{prj.location}..\\printHash.bat" "%{prj.location}..\\src\\extras\\GitSHA1.cpp"' } - - filter "platforms:not win*" - prebuildcommands { '"%{prj.location}/../printHash.sh" "%{prj.location}/../src/extras/GitSHA1.cpp"' } - - filter "platforms:win*glfw*" - staticruntime "off" - - filter "platforms:win*oal" - includedirs { "vendor/openal-soft/include" } - includedirs { "vendor/libsndfile/include" } - includedirs { "vendor/mpg123/include" } - - filter "platforms:win-x86*oal" - libdirs { "vendor/mpg123/lib/Win32" } - libdirs { "vendor/libsndfile/lib/Win32" } - libdirs { "vendor/openal-soft/libs/Win32" } - - filter "platforms:win-amd64*oal" - 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" } - - filter "platforms:bsd*oal" - links { "openal", "mpg123", "sndfile", "pthread" } - - filter "platforms:macosx*oal" - links { "openal", "mpg123", "sndfile", "pthread" } - includedirs { "/usr/local/opt/openal-soft/include" } - libdirs { "/usr/local/opt/openal-soft/lib" } - - if _OPTIONS["with-opus"] then - filter {} - links { "libogg" } - links { "opus" } - links { "opusfile" } - end - - filter "platforms:*RW34*" - includedirs { "sdk/rwsdk/include/d3d8" } - libdirs { "sdk/rwsdk/lib/d3d8/release" } - links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtanim", "rtcharse", "rpanisot" } - 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 { "vendor/librw/lib/%{cfg.platform}/%{cfg.buildcfg}" } - end - links { "rw" } - - filter "platforms:*d3d9*" - defines { "USE_D3D9" } - links { "d3d9" } - - filter "platforms:*x86*d3d*" - includedirs { "sdk/dx8sdk/include" } - libdirs { "sdk/dx8sdk/lib" } - - filter "platforms:win-x86*gl3_glfw*" - libdirs { path.join(_OPTIONS["glfwdir32"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) } - links { "opengl32", "glfw3" } - - filter "platforms:win-amd64*gl3_glfw*" - libdirs { path.join(_OPTIONS["glfwdir64"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) } - links { "opengl32", "glfw3" } - - filter "platforms:linux*gl3_glfw*" - links { "GL", "glfw" } - - filter "platforms:bsd*gl3_glfw*" - links { "GL", "glfw", "sysinfo" } - includedirs { "/usr/local/include" } - libdirs { "/usr/local/lib" } - - filter "platforms:macosx*gl3_glfw*" - links { "glfw" } - linkoptions { "-framework OpenGL" } - includedirs { "/opt/local/include" } - includedirs { "/usr/local/include" } - libdirs { "/opt/local/lib" } - libdirs { "/usr/local/lib" } + files { path.join(Librw, "src/gl/*/*.*") } + + filter { "platforms:*x86*" } + architecture "x86" + + filter { "platforms:*amd64*" } + architecture "amd64" + + filter "platforms:win*" + defines { "_CRT_SECURE_NO_WARNINGS", "_CRT_NONSTDC_NO_DEPRECATE" } + staticruntime "on" + buildoptions { "/Zc:sizedDealloc-" } + + filter "platforms:bsd*" + includedirs { "/usr/local/include" } + libdirs { "/usr/local/lib" } + + filter "platforms:macosx*" + -- Support MacPorts and Homebrew + includedirs { "/opt/local/include" } + includedirs {"/usr/local/include" } + libdirs { "/opt/local/lib" } + libdirs { "/usr/local/lib" } + + filter "platforms:*gl3_glfw*" + staticruntime "off" + + filter "platforms:*RW34*" + flags { "ExcludeFromBuild" } + filter {} +end + +local function addSrcFiles( prefix ) + return prefix .. "/*cpp", prefix .. "/*.h", prefix .. "/*.c", prefix .. "/*.ico", prefix .. "/*.rc" +end + +project "reVC" + kind "WindowedApp" + targetname "reVC" + targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" + + if(_OPTIONS["with-librw"]) then + dependson "librw" + end + + files { addSrcFiles("src") } + files { addSrcFiles("src/animation") } + files { addSrcFiles("src/audio") } + files { addSrcFiles("src/audio/eax") } + files { addSrcFiles("src/audio/oal") } + files { addSrcFiles("src/buildings") } + files { addSrcFiles("src/collision") } + 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") } + files { "src/extras/GitSHA1.cpp" } -- this won't be in repo in first build + + includedirs { "src" } + includedirs { "src/animation" } + includedirs { "src/audio" } + includedirs { "src/audio/eax" } + includedirs { "src/audio/oal" } + includedirs { "src/buildings" } + includedirs { "src/collision" } + 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 { "vendor/ogg/include" } + includedirs { "vendor/opus/include" } + includedirs { "vendor/opusfile/include" } + end + + filter "platforms:*mss" + defines { "AUDIO_MSS" } + includedirs { "vendor/milessdk/include" } + libdirs { "vendor/milessdk/lib" } + + if _OPTIONS["with-opus"] then + filter "platforms:win*" + 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 + + filter "platforms:*oal" + defines { "AUDIO_OAL" } + + filter {} + if(os.getenv("GTA_VC_RE_DIR")) then + setpaths(os.getenv("GTA_VC_RE_DIR") .. "/", "%(cfg.buildtarget.name)") + end + + filter "platforms:win*" + files { addSrcFiles("src/skel/win") } + includedirs { "src/skel/win" } + buildoptions { "/Zc:sizedDealloc-" } + linkoptions "/SAFESEH:NO" + characterset ("MBCS") + targetextension ".exe" + if(_OPTIONS["with-librw"]) then + -- external librw is dynamic + staticruntime "on" + end + prebuildcommands { '"%{prj.location}..\\printHash.bat" "%{prj.location}..\\src\\extras\\GitSHA1.cpp"' } + + filter "platforms:not win*" + prebuildcommands { '"%{prj.location}/../printHash.sh" "%{prj.location}/../src/extras/GitSHA1.cpp"' } + + filter "platforms:win*glfw*" + staticruntime "off" + + filter "platforms:win*oal" + includedirs { "vendor/openal-soft/include" } + includedirs { "vendor/libsndfile/include" } + includedirs { "vendor/mpg123/include" } + + filter "platforms:win-x86*oal" + libdirs { "vendor/mpg123/lib/Win32" } + libdirs { "vendor/libsndfile/lib/Win32" } + libdirs { "vendor/openal-soft/libs/Win32" } + + filter "platforms:win-amd64*oal" + 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", "X11" } + + filter "platforms:bsd*oal" + links { "openal", "mpg123", "sndfile", "pthread", "X11" } + + filter "platforms:macosx*oal" + links { "openal", "mpg123", "sndfile", "pthread" } + includedirs { "/usr/local/opt/openal-soft/include" } + libdirs { "/usr/local/opt/openal-soft/lib" } + + if _OPTIONS["with-opus"] then + filter {} + links { "libogg" } + links { "opus" } + links { "opusfile" } + end + + filter "platforms:*RW34*" + includedirs { "sdk/rwsdk/include/d3d8" } + libdirs { "sdk/rwsdk/lib/d3d8/release" } + links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtanim", "rtcharse", "rpanisot" } + 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 { "vendor/librw/lib/%{cfg.platform}/%{cfg.buildcfg}" } + end + links { "rw" } + + filter "platforms:*d3d9*" + defines { "USE_D3D9" } + links { "d3d9" } + + filter "platforms:*x86*d3d*" + includedirs { "sdk/dx8sdk/include" } + libdirs { "sdk/dx8sdk/lib" } + + filter "platforms:win-x86*gl3_glfw*" + libdirs { path.join(_OPTIONS["glfwdir32"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) } + links { "opengl32", "glfw3" } + + filter "platforms:win-amd64*gl3_glfw*" + libdirs { path.join(_OPTIONS["glfwdir64"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) } + links { "opengl32", "glfw3" } + + filter "platforms:linux*gl3_glfw*" + links { "GL", "glfw" } + + filter "platforms:bsd*gl3_glfw*" + links { "GL", "glfw", "sysinfo" } + includedirs { "/usr/local/include" } + libdirs { "/usr/local/lib" } + + filter "platforms:macosx*gl3_glfw*" + links { "glfw" } + linkoptions { "-framework OpenGL" } + includedirs { "/opt/local/include" } + includedirs { "/usr/local/include" } + libdirs { "/opt/local/lib" } + libdirs { "/usr/local/lib" } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 10b40be..6c8ab28 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -107,8 +107,6 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang if (NOT LIBRW_PLATFORM_PS2) target_compile_options(${EXECUTABLE} PRIVATE - -fpermissive # for CVECTORHACK - -Wno-address-of-temporary # for CVECTORHACK -Wextra -Wdouble-promotion -Wpedantic diff --git a/src/animation/AnimBlendAssocGroup.cpp b/src/animation/AnimBlendAssocGroup.cpp index 7c0a10d..935e7fd 100644 --- a/src/animation/AnimBlendAssocGroup.cpp +++ b/src/animation/AnimBlendAssocGroup.cpp @@ -18,7 +18,6 @@ #include "RpAnimBlend.h" #include "AnimBlendAssociation.h" #include "AnimBlendAssocGroup.h" -#include "KeyGen.h" CAnimBlendAssocGroup::CAnimBlendAssocGroup(void) { @@ -112,34 +111,27 @@ strcmpIgnoringDigits(const char *s1, const char *s2) } } -extern const char* csPlayerNames[]; -extern const char* playerNames[]; - CBaseModelInfo* GetModelFromName(const char *name) { int i; - CBaseModelInfo* mi; - if (CKeyGen::GetUppercaseKey(name) == CKeyGen::GetUppercaseKey("cstoni_a")) { - i = 0; - while (csPlayerNames[i][0] != '\0') { - if (CModelInfo::GetModelInfo(0)->GetNameHashKey() == CKeyGen::GetUppercaseKey(playerNames[i])) { - name = csPlayerNames[i]; - break; - } - i++; - } + CBaseModelInfo *mi; + char playername[32]; + + if(strncasecmp(name, "CSplay", 6) == 0 && + strncasecmp(CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName(), "ig", 2) == 0){ + strcpy(playername, CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName()); + playername[0] = 'C'; + playername[1] = 'S'; + name = playername; } - uint32 hashKey = CKeyGen::GetUppercaseKey(name); - for (i = 0; i < MODELINFOSIZE; i++) { + for(i = 0; i < MODELINFOSIZE; i++){ mi = CModelInfo::GetModelInfo(i); - if (mi && mi->GetRwObject() - && RwObjectGetType(mi->GetRwObject()) == rpCLUMP && - hashKey == mi->GetNameHashKey()) + if(mi && mi->GetRwObject() && RwObjectGetType(mi->GetRwObject()) == rpCLUMP && + strcmpIgnoringDigits(mi->GetModelName(), name)) return mi; } - return nil; } @@ -193,45 +185,3 @@ CAnimBlendAssocGroup::CreateAssociations(const char *blockName, RpClump *clump, } numAssociations = numAssocs; } - -void -CAnimBlendAssocGroup::CreateAssociations(const char *blockName, const char *animNames, const char *objectNames, int numChars) -{ - if (!objectNames) { - CreateAssociations(blockName); - return; - } - - if (assocList) - DestroyAssociations(); - - animBlock = CAnimManager::GetAnimationBlock(blockName); - assocList = new CAnimBlendAssociation[animBlock->numAnims]; - - numAssociations = 0; - if (animBlock->numAnims > 0) - { - int i, j; - for (i = 0; i < animBlock->numAnims; i++) { - int animId = -1; - for (j = 0; j != animBlock->numAnims; j++) - if (strcmp(CAnimManager::GetAnimation(i + animBlock->firstIndex)->name, animNames + numChars * j) == 0) - animId = j; - - if (animId != -1) { - CBaseModelInfo* minfo = GetModelFromName(objectNames + numChars * animId); - if (minfo) - { - RpClump* clump = (RpClump*)minfo->CreateInstance(); - RpAnimBlendClumpInit(clump); - assocList[numAssociations].Init(clump, CAnimManager::GetAnimation(i + animBlock->firstIndex)); - if (IsClumpSkinned(clump)) - RpClumpForAllAtomics(clump, AtomicRemoveAnimFromSkinCB, nil); - RpClumpDestroy(clump); - assocList[numAssociations].animId = i + numAssociations; - assocList[numAssociations++].groupId = groupId; - } - } - } - } -} \ No newline at end of file diff --git a/src/animation/AnimBlendAssocGroup.h b/src/animation/AnimBlendAssocGroup.h index e264787..86f0ca1 100644 --- a/src/animation/AnimBlendAssocGroup.h +++ b/src/animation/AnimBlendAssocGroup.h @@ -21,5 +21,4 @@ public: CAnimBlendAssociation *CopyAnimation(const char *name); void CreateAssociations(const char *name); void CreateAssociations(const char *blockName, RpClump *clump, const char **animNames, int numAssocs); - void CreateAssociations(const char *blockName, const char *animNames, const char *objectNames, int numChars); }; diff --git a/src/animation/AnimManager.cpp b/src/animation/AnimManager.cpp index d0763ef..f6ac3eb 100644 --- a/src/animation/AnimManager.cpp +++ b/src/animation/AnimManager.cpp @@ -20,373 +20,281 @@ CAnimBlendAssocGroup *CAnimManager::ms_aAnimAssocGroups; CLinkList CAnimManager::ms_animCache; AnimAssocDesc aStdAnimDescs[] = { - { ANIM_STD_WALK, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_WALK }, - { ANIM_STD_RUN, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_WALK }, - { ANIM_STD_RUNFAST, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_WALK }, - { ANIM_STD_IDLE, ASSOC_REPEAT }, - { ANIM_STD_STARTWALK, ASSOC_HAS_TRANSLATION }, - { ANIM_STD_RUNSTOP1, ASSOC_DELETEFADEDOUT | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_RUNSTOP2, ASSOC_DELETEFADEDOUT | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_IDLE_CAM, ASSOC_REPEAT | ASSOC_PARTIAL }, - { ANIM_STD_IDLE_HBHB, ASSOC_REPEAT | ASSOC_PARTIAL }, - { ANIM_STD_IDLE_TIRED, ASSOC_REPEAT }, - { ANIM_STD_IDLE_BIGGUN, ASSOC_REPEAT | ASSOC_PARTIAL }, - { ANIM_STD_CHAT, ASSOC_REPEAT | ASSOC_PARTIAL }, - { ANIM_STD_HAILTAXI, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_KO_FRONT, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, - { ANIM_STD_KO_LEFT, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, - { ANIM_STD_KO_BACK, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, - { ANIM_STD_KO_RIGHT, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, - { ANIM_STD_KO_SHOT_FACE, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_KO_SHOT_STOMACH, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, - { ANIM_STD_KO_SHOT_ARM_L, ASSOC_PARTIAL | ASSOC_FRONTAL }, - { ANIM_STD_KO_SHOT_ARM_R, ASSOC_PARTIAL | ASSOC_FRONTAL }, - { ANIM_STD_KO_SHOT_LEG_L, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_KO_SHOT_LEG_R, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_SPINFORWARD_LEFT, ASSOC_PARTIAL }, - { ANIM_STD_SPINFORWARD_RIGHT, ASSOC_PARTIAL }, - { ANIM_STD_HIGHIMPACT_FRONT, ASSOC_PARTIAL }, - { ANIM_STD_HIGHIMPACT_LEFT, ASSOC_PARTIAL }, - { ANIM_STD_HIGHIMPACT_BACK, ASSOC_PARTIAL | ASSOC_FRONTAL }, - { ANIM_STD_HIGHIMPACT_RIGHT, ASSOC_PARTIAL }, - { ANIM_STD_HITBYGUN_FRONT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK }, - { ANIM_STD_HITBYGUN_LEFT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK }, - { ANIM_STD_HITBYGUN_BACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK }, - { ANIM_STD_HITBYGUN_RIGHT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK }, - { ANIM_STD_HIT_FRONT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_HIT_LEFT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_HIT_BACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_HIT_RIGHT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_HIT_FLOOR, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_HIT_WALL, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_HIT_FLOOR_FRONT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_FRONTAL }, - { ANIM_STD_HIT_BEHIND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_FIGHT_IDLE, ASSOC_REPEAT }, - { ANIM_STD_FIGHT_2IDLE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_FIGHT_SHUFFLE_F, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_PARTIAL_PUNCH, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_NOWALK }, - { ANIM_FIGHT_ATTACK_A1, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_FIGHT_ATTACK_A2, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_FIGHT_ATTACK_A3, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_FIGHT_ATTACK_B1, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_FIGHT_ATTACK_B2, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_FIGHT_ATTACK_B3, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_FIGHT_HIT_A1, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_FIGHT_HIT_A2, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_FIGHT_HIT_A3, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_FIGHT_HIT_B1, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_FIGHT_HIT_B2, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_FIGHT_HIT_B3, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_DETONATE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_PUNCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_PARTIALPUNCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_KICKGROUND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_THROW_UNDER, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_FIGHT_SHUFFLE_B, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_JACKEDCAR_RHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_JACKEDCAR_LO_RHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_JACKEDCAR_LHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_JACKEDCAR_LO_LHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_QUICKJACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_QUICKJACKED, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_CAR_ALIGN_DOOR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_ALIGNHI_DOOR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_OPEN_DOOR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CARDOOR_LOCKED_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_PULL_OUT_PED_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_PULL_OUT_PED_LO_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_GET_IN_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_GET_IN_LO_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_CLOSE_DOOR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_CLOSE_DOOR_LO_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_CLOSE_DOOR_ROLLING_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_CLOSE_DOOR_ROLLING_LO_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_JUMP_IN_LO_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_GETOUT_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_GETOUT_LO_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_CLOSE_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_ALIGN_DOOR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_ALIGNHI_DOOR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_OPEN_DOOR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CARDOOR_LOCKED_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_PULL_OUT_PED_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_PULL_OUT_PED_LO_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_GET_IN_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_GET_IN_LO_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_CLOSE_DOOR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_CLOSE_DOOR_LO_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_SHUFFLE_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_SHUFFLE_LO_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_SIT, ASSOC_DELETEFADEDOUT }, - { ANIM_STD_CAR_SIT_LO, ASSOC_DELETEFADEDOUT }, - { ANIM_STD_CAR_SIT_P, ASSOC_DELETEFADEDOUT }, - { ANIM_STD_CAR_SIT_P_LO, ASSOC_DELETEFADEDOUT }, - { ANIM_STD_CAR_DRIVE_LEFT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_STD_CAR_DRIVE_RIGHT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_STD_CAR_DRIVE_LEFT_LO, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_STD_CAR_DRIVE_RIGHT_LO, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_STD_CAR_DRIVEBY_LEFT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_STD_CAR_DRIVEBY_RIGHT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_STD_CAR_DRIVEBY_LEFT_LO, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_STD_CAR_DRIVEBY_RIGHT_LO, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_STD_CAR_LOOKBEHIND, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_STD_BOAT_DRIVE, ASSOC_DELETEFADEDOUT | ASSOC_DRIVING }, - { ANIM_STD_BOAT_DRIVE_LEFT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_STD_BOAT_DRIVE_RIGHT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_STD_BOAT_LOOKBEHIND, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_STD_BIKE_PICKUP_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_BIKE_PICKUP_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_BIKE_PULLUP_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_BIKE_PULLUP_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_BIKE_ELBOW_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_BIKE_ELBOW_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_BIKE_FALLOFF, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_BIKE_FALLBACK, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_GETOUT_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_GETOUT_LO_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_CLOSE_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CAR_HOOKERTALK, ASSOC_REPEAT | ASSOC_PARTIAL }, - { ANIM_STD_TRAIN_GETIN, ASSOC_DELETEFADEDOUT }, - { ANIM_STD_TRAIN_GETOUT, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE }, - { ANIM_STD_CRAWLOUT_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_CRAWLOUT_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_ROLLOUT_LHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION | ASSOC_FRONTAL }, - { ANIM_STD_ROLLOUT_RHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION | ASSOC_FRONTAL }, - { ANIM_STD_GET_UP, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_GET_UP_LEFT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_GET_UP_RIGHT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_GET_UP_FRONT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_JUMP_LAUNCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_JUMP_GLIDE, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_JUMP_LAND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_FALL, ASSOC_DELETEFADEDOUT }, - { ANIM_STD_FALL_GLIDE, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_FALL_LAND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_FALL_COLLAPSE, ASSOC_REPEAT | ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_FALL_ONBACK, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_FALL_ONFRONT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_FRONTAL }, - { ANIM_STD_EVADE_STEP, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_EVADE_DIVE, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, - { ANIM_STD_COMMANDO_ROLL, ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, - { ANIM_STD_XPRESS_SCRATCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_STD_ROADCROSS, ASSOC_REPEAT | ASSOC_PARTIAL }, - { ANIM_STD_TURN180, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_ARREST, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_DROWN, ASSOC_PARTIAL }, - { ANIM_STD_DUCK_DOWN, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_DUCK_LOW, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_DUCK_WEAPON, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_RBLOCK_SHOOT, ASSOC_RUNNING }, - { ANIM_STD_HANDSUP, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_HANDSCOWER, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_STD_PARTIAL_FUCKU, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK }, - { ANIM_STD_PHONE_IN, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_PHONE_OUT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_PHONE_TALK, ASSOC_REPEAT | ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, - { ANIM_STD_SEAT_DOWN, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_SEAT_UP, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_SEAT_IDLE, ASSOC_REPEAT | ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_SEAT_RVRS, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_ATM, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_ABSEIL, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_WALK, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_WALK }, + { ANIM_STD_RUN, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_WALK }, + { ANIM_STD_RUNFAST, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_WALK }, + { ANIM_STD_IDLE, ASSOC_REPEAT }, + { ANIM_STD_STARTWALK, ASSOC_HAS_TRANSLATION }, + { ANIM_STD_RUNSTOP1, ASSOC_DELETEFADEDOUT | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_RUNSTOP2, ASSOC_DELETEFADEDOUT | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_IDLE_CAM, ASSOC_REPEAT | ASSOC_PARTIAL }, + { ANIM_STD_IDLE_HBHB, ASSOC_REPEAT | ASSOC_PARTIAL }, + { ANIM_STD_IDLE_TIRED, ASSOC_REPEAT }, + { ANIM_STD_IDLE_BIGGUN, ASSOC_REPEAT | ASSOC_PARTIAL }, + { ANIM_STD_CHAT, ASSOC_REPEAT | ASSOC_PARTIAL }, + { ANIM_STD_HAILTAXI, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_KO_FRONT, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, + { ANIM_STD_KO_LEFT, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, + { ANIM_STD_KO_BACK, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, + { ANIM_STD_KO_RIGHT, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, + { ANIM_STD_KO_SHOT_FACE, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, + { ANIM_STD_KO_SHOT_STOMACH, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_KO_SHOT_ARM_L, ASSOC_PARTIAL | ASSOC_FRONTAL }, + { ANIM_STD_KO_SHOT_ARM_R, ASSOC_PARTIAL | ASSOC_FRONTAL }, + { ANIM_STD_KO_SHOT_LEG_L, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_KO_SHOT_LEG_R, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_SPINFORWARD_LEFT, ASSOC_PARTIAL | ASSOC_FRONTAL }, + { ANIM_STD_SPINFORWARD_RIGHT, ASSOC_PARTIAL | ASSOC_FRONTAL }, + { ANIM_STD_HIGHIMPACT_FRONT, ASSOC_PARTIAL }, + { ANIM_STD_HIGHIMPACT_LEFT, ASSOC_PARTIAL }, + { ANIM_STD_HIGHIMPACT_BACK, ASSOC_PARTIAL | ASSOC_FRONTAL }, + { ANIM_STD_HIGHIMPACT_RIGHT, ASSOC_PARTIAL }, + { ANIM_STD_HITBYGUN_FRONT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK }, + { ANIM_STD_HITBYGUN_LEFT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK }, + { ANIM_STD_HITBYGUN_BACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK }, + { ANIM_STD_HITBYGUN_RIGHT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK }, + { ANIM_STD_HIT_FRONT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_HIT_LEFT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_HIT_BACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_HIT_RIGHT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_HIT_FLOOR, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_HIT_BODYBLOW, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_HIT_CHEST, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_HIT_HEAD, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_HIT_WALK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_HIT_WALL, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_HIT_FLOOR_FRONT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_FRONTAL }, + { ANIM_STD_HIT_BEHIND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_IDLE, ASSOC_REPEAT }, + { ANIM_STD_FIGHT_2IDLE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_SHUFFLE_F, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_FIGHT_BODYBLOW, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_HEAD, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_KICK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_KNEE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_LHOOK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_PUNCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_ROUNDHOUSE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_FIGHT_LONGKICK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_PARTIAL_PUNCH, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_NOWALK }, + { ANIM_STD_FIGHT_JAB, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_ELBOW_L, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_ELBOW_R, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_BKICK_L, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_BKICK_R, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_DETONATE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_PUNCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_PARTIALPUNCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_KICKGROUND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_THROW_UNDER, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_FIGHT_SHUFFLE_B, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_JACKEDCAR_RHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_JACKEDCAR_LO_RHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_JACKEDCAR_LHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_JACKEDCAR_LO_LHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_QUICKJACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_QUICKJACKED, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_CAR_ALIGN_DOOR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_ALIGNHI_DOOR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_OPEN_DOOR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CARDOOR_LOCKED_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_PULL_OUT_PED_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_PULL_OUT_PED_LO_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_GET_IN_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_GET_IN_LO_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_CLOSE_DOOR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_CLOSE_DOOR_LO_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_CLOSE_DOOR_ROLLING_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_CLOSE_DOOR_ROLLING_LO_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_JUMP_IN_LO_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_GETOUT_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_GETOUT_LO_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_CLOSE_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_ALIGN_DOOR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_ALIGNHI_DOOR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_OPEN_DOOR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CARDOOR_LOCKED_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_PULL_OUT_PED_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_PULL_OUT_PED_LO_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_GET_IN_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_GET_IN_LO_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_CLOSE_DOOR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_CLOSE_DOOR_LO_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_SHUFFLE_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_SHUFFLE_LO_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_SIT, ASSOC_DELETEFADEDOUT}, + { ANIM_STD_CAR_SIT_LO, ASSOC_DELETEFADEDOUT}, + { ANIM_STD_CAR_SIT_P, ASSOC_DELETEFADEDOUT}, + { ANIM_STD_CAR_SIT_P_LO, ASSOC_DELETEFADEDOUT}, + { ANIM_STD_CAR_DRIVE_LEFT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_STD_CAR_DRIVE_RIGHT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_STD_CAR_DRIVE_LEFT_LO, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_STD_CAR_DRIVE_RIGHT_LO, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_STD_CAR_DRIVEBY_LEFT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_STD_CAR_DRIVEBY_RIGHT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_STD_CAR_DRIVEBY_LEFT_LO, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_STD_CAR_DRIVEBY_RIGHT_LO, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_STD_CAR_LOOKBEHIND, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_STD_BOAT_DRIVE, ASSOC_DELETEFADEDOUT | ASSOC_DRIVING }, + { ANIM_STD_BOAT_DRIVE_LEFT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_STD_BOAT_DRIVE_RIGHT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_STD_BOAT_LOOKBEHIND, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_STD_BIKE_PICKUP_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_BIKE_PICKUP_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_BIKE_PULLUP_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_BIKE_PULLUP_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_BIKE_ELBOW_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_BIKE_ELBOW_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_BIKE_FALLOFF, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_BIKE_FALLBACK, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_GETOUT_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_GETOUT_LO_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_CLOSE_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CAR_HOOKERTALK, ASSOC_REPEAT | ASSOC_PARTIAL }, + { ANIM_STD_TRAIN_GETIN, ASSOC_PARTIAL }, + { ANIM_STD_TRAIN_GETOUT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CRAWLOUT_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_CRAWLOUT_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_ROLLOUT_LHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION }, + { ANIM_STD_ROLLOUT_RHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION }, + { ANIM_STD_GET_UP, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_GET_UP_LEFT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_GET_UP_RIGHT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_GET_UP_FRONT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_JUMP_LAUNCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_JUMP_GLIDE, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_JUMP_LAND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_FALL, ASSOC_REPEAT | ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_FALL_GLIDE, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_FALL_LAND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_FALL_COLLAPSE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_FALL_ONBACK, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_FALL_ONFRONT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_FRONTAL }, + { ANIM_STD_EVADE_STEP, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_EVADE_DIVE, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL }, + { ANIM_STD_XPRESS_SCRATCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, + { ANIM_STD_ROADCROSS, ASSOC_REPEAT | ASSOC_PARTIAL }, + { ANIM_STD_TURN180, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_ARREST, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_DROWN, ASSOC_PARTIAL }, + { ANIM_STD_DUCK_DOWN, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_DUCK_LOW, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_DUCK_WEAPON, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_RBLOCK_SHOOT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_HANDSUP, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_HANDSCOWER, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_STD_PARTIAL_FUCKU, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK }, + { ANIM_STD_PHONE_IN, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_PHONE_OUT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_PHONE_TALK, ASSOC_REPEAT | ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, + { ANIM_STD_SEAT_DOWN, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_SEAT_UP, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_SEAT_IDLE, ASSOC_REPEAT | ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_SEAT_RVRS, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_ATM, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_ABSEIL, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL }, }; AnimAssocDesc aVanAnimDescs[] = { - { ANIM_STD_VAN_OPEN_DOOR_REAR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_VAN_GET_IN_REAR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_VAN_CLOSE_DOOR_REAR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_VAN_GET_OUT_REAR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_VAN_OPEN_DOOR_REAR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_VAN_GET_IN_REAR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_VAN_CLOSE_DOOR_REAR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_VAN_GET_OUT_REAR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_VAN_OPEN_DOOR_REAR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_VAN_GET_IN_REAR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_VAN_CLOSE_DOOR_REAR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_VAN_GET_OUT_REAR_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_VAN_OPEN_DOOR_REAR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_VAN_GET_IN_REAR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_VAN_CLOSE_DOOR_REAR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_VAN_GET_OUT_REAR_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, }; AnimAssocDesc aCoachAnimDescs[] = { - { ANIM_STD_COACH_OPEN_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_COACH_OPEN_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_COACH_GET_IN_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_COACH_GET_IN_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STD_COACH_GET_OUT_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_COACH_OPEN_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_COACH_OPEN_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_COACH_GET_IN_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_COACH_GET_IN_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STD_COACH_GET_OUT_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, }; AnimAssocDesc aBikeAnimDescs[] = { - { ANIM_BIKE_RIDE, ASSOC_DELETEFADEDOUT }, - { ANIM_BIKE_READY, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_BIKE_LEFT, ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_BIKE_RIGHT, ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_BIKE_LEANB, ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_BIKE_LEANF, ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_BIKE_WALKBACK, ASSOC_REPEAT | ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_BIKE_JUMPON_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_BIKE_JUMPON_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_BIKE_KICK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_BIKE_HIT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_BIKE_GETOFF_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_BIKE_GETOFF_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_BIKE_GETOFF_BACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, - { ANIM_BIKE_DRIVEBY_LHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_BIKE_DRIVEBY_RHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_BIKE_DRIVEBY_FORWARD, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, - { ANIM_BIKE_RIDE_P, ASSOC_DELETEFADEDOUT | ASSOC_DRIVING }, + { ANIM_BIKE_RIDE, ASSOC_DELETEFADEDOUT}, + { ANIM_BIKE_READY, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_BIKE_LEFT, ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_BIKE_RIGHT, ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_BIKE_LEANB, ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_BIKE_LEANF, ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_BIKE_WALKBACK, ASSOC_REPEAT | ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_BIKE_JUMPON_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_BIKE_JUMPON_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_BIKE_KICK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_BIKE_HIT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_BIKE_GETOFF_LHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_BIKE_GETOFF_RHS, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_BIKE_GETOFF_BACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_BIKE_DRIVEBY_LHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_BIKE_DRIVEBY_RHS, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_BIKE_DRIVEBY_FORWARD, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_DRIVING }, + { ANIM_BIKE_RIDE_P, ASSOC_DELETEFADEDOUT | ASSOC_DRIVING }, }; AnimAssocDesc aMeleeAnimDescs[] = { - { ANIM_MELEE_ATTACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_MELEE_ATTACK_2ND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_MELEE_ATTACK_START, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK }, - { ANIM_MELEE_IDLE_FIGHTMODE, ASSOC_REPEAT }, - { ANIM_MELEE_ATTACK_FINISH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, + { ANIM_MELEE_ATTACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_MELEE_ATTACK_2ND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_MELEE_ATTACK_START, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK }, + { ANIM_MELEE_IDLE_FIGHTMODE, ASSOC_REPEAT }, + { ANIM_MELEE_ATTACK_FINISH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION }, }; AnimAssocDesc aSwingAnimDescs[] = { - { ANIM_MELEE_ATTACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_MELEE_ATTACK_2ND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_MELEE_ATTACK_START, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_MELEE_IDLE_FIGHTMODE, ASSOC_REPEAT }, - { ANIM_MELEE_ATTACK_FINISH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_MELEE_ATTACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_MELEE_ATTACK_2ND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_MELEE_ATTACK_START, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_MELEE_IDLE_FIGHTMODE, ASSOC_REPEAT }, + { ANIM_MELEE_ATTACK_FINISH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, }; AnimAssocDesc aWeaponAnimDescs[] = { - { ANIM_ATTACK_1, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_ATTACK_2, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_ATTACK_EXTRA1, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_ATTACK_EXTRA2, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_WEAPON_FIRE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_WEAPON_CROUCHFIRE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_WEAPON_RELOAD, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_WEAPON_CROUCHRELOAD, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_WEAPON_FIRE_3RD, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, }; AnimAssocDesc aMedicAnimDescs[] = { - { ANIM_MEDIC_CPR, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_MEDIC_CPR, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, }; AnimAssocDesc aSunbatheAnimDescs[] = { - { ANIM_SUNBATHE_IDLE, ASSOC_REPEAT | ASSOC_PARTIAL }, - { ANIM_SUNBATHE_DOWN, ASSOC_HAS_X_TRANSLATION | ASSOC_HAS_TRANSLATION | ASSOC_PARTIAL }, - { ANIM_SUNBATHE_UP, ASSOC_HAS_X_TRANSLATION | ASSOC_HAS_TRANSLATION | ASSOC_PARTIAL }, - { ANIM_SUNBATHE_ESCAPE, ASSOC_HAS_X_TRANSLATION | ASSOC_HAS_TRANSLATION | ASSOC_PARTIAL }, + { ANIM_SUNBATHE_IDLE, ASSOC_REPEAT | ASSOC_PARTIAL }, + { ANIM_SUNBATHE_DOWN, ASSOC_REPEAT | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION }, + { ANIM_SUNBATHE_UP, ASSOC_REPEAT | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION }, + { ANIM_SUNBATHE_ESCAPE, ASSOC_REPEAT | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION }, }; AnimAssocDesc aPlayerIdleAnimDescs[] = { - { ANIM_PLAYER_IDLE1, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_PLAYER_IDLE2, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_PLAYER_IDLE3, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_PLAYER_IDLE4, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_PLAYER_IDLE1, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_PLAYER_IDLE2, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_PLAYER_IDLE3, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_PLAYER_IDLE4, ASSOC_DELETEFADEDOUT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, }; AnimAssocDesc aRiotAnimDescs[] = { - { ANIM_RIOT_ANGRY, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_RIOT_ANGRY_B, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_RIOT_CHANT, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_RIOT_PUNCHES, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_RIOT_SHOUT, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_RIOT_CHALLENGE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_RIOT_FUCKYOU, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_RIOT_ANGRY, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_RIOT_ANGRY_B, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_RIOT_CHANT, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_RIOT_PUNCHES, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_RIOT_SHOUT, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_RIOT_CHALLENGE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_RIOT_FUCKYOU, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, }; AnimAssocDesc aStripAnimDescs[] = { - { ANIM_STRIP_A, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STRIP_B, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STRIP_C, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STRIP_D, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STRIP_E, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STRIP_F, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, - { ANIM_STRIP_G, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STRIP_A, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STRIP_B, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STRIP_C, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STRIP_D, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STRIP_E, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STRIP_F, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, + { ANIM_STRIP_G, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL }, }; +#ifdef PC_PLAYER_CONTROLS AnimAssocDesc aStdAnimDescsSide[] = { - { ANIM_STD_WALK, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION | ASSOC_WALK }, - { ANIM_STD_RUN, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION | ASSOC_WALK }, - { ANIM_STD_RUNFAST, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION | ASSOC_WALK }, - { ANIM_STD_IDLE, ASSOC_REPEAT }, - { ANIM_STD_STARTWALK, ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION }, + { ANIM_STD_WALK, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION | ASSOC_WALK }, + { ANIM_STD_RUN, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION | ASSOC_WALK }, + { ANIM_STD_RUNFAST, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION | ASSOC_WALK }, + { ANIM_STD_IDLE, ASSOC_REPEAT }, + { ANIM_STD_STARTWALK, ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION }, }; -AnimAssocDesc aMPNoteAnimDescs[] = { - { ANIM_MULTIPLAYER_CUTSCENE_MPNOTE, ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_MULTIPLAYER_CUTSCENE_MPNOTE_LOOP, ASSOC_REPEAT | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aCSMiscAnimDescs[] = { - { ANIM_CS_MISC_IDLE_LOOK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_CS_MISC_IDLE_NO, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_CS_MISC_IDLE_YES, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_CS_MISC_IDLE_CHAT2, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_CS_MISC_IDLE_COUGH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_CS_MISC_IDLE_GIGGLE_FEMALE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_CS_MISC_IDLE_TOUGH_CHAT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_CS_MISC_IDLE_CELL_TALK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aDONH2AnimDescs[] = { - { ANIM_DONH2_CAMERA, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aDONH3AnimDescs[] = { - { ANIM_DONH3_HAPPY, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aJDT2AnimDescs[] = { - { ANIM_JDT2_ANXIOUS_TALK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_JDT2_SHRUG, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aJDT4AnimDescs[] = { - { ANIM_JDT4_DILDO_TALK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aJDT5AnimDescs[] = { - { ANIM_JDT5_CALM_DOWN, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_JDT5_POINT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aJDT6AnimDescs[] = { - { ANIM_JDT6_PICKUP, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_JDT6_KNOCK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aMAR1AnimDescs[] = { - { ANIM_MAR1_SKIRT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aMAR2AnimDescs[] = { - { ANIM_MAR2_CELL_ANSWER, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_MAR2_CELL_END, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_MAR2_CELL_TALK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_MAR2_FOOT_TAP, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aMAR3AnimDescs[] = { - { ANIM_MAR3_HOOCHY, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_MAR3_NOTE_IDLE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_MAR3_NOTE_PICKUP, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aSAL1AnimDescs[] = { - { ANIM_SAL1_BIREFCASE_DOWN, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aSAL2AnimDescs[] = { - { ANIM_SAL2_IDLE_SEATED, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_SAL2_SEAT_TO_STAND, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aSAL3AnimDescs[] = { - { ANIM_SAL3_SEATED_TALK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_SAL3_SEATED_IDLE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_SAL3_SIT_DOWN, ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aSAL4AnimDescs[] = { - { ANIM_SAL4_DUST_DOWN, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_SAL4_GIRL_RUN, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aSAL6AnimDescs[] = { - { ANIM_SAL6_ANGRY_SEATED, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_SAL6_IDLE_SEATED, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aSAL7AnimDescs[] = { - { ANIM_SAL7_LOOKOUT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aVIC2AnimDescs[] = { - { ANIM_VIC2_POINT_ANGRY, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aVIC3AnimDescs[] = { - { ANIM_VIC3_WAFT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_VIC3_PICKUP_ROLL, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aVIC4AnimDescs[] = { - { ANIM_VIC4_CARRY_BOX, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_VIC4_CELL_LOOK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_VIC4_CRATE_IDLE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aVIC6AnimDescs[] = { - { ANIM_VIC6_CELL_ANGRY, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aTouristAnimDescs[] = { - { ANIM_TOURIST3, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_TOURIST2, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, - { ANIM_TOURIST1, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aMAC2AnimDescs[] = { - { ANIM_MAC2_PLEAD, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; -AnimAssocDesc aVIC7AnimDescs[] = { - { ANIM_VIC7_PROD_WITH_FOOT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE }, -}; - -char const *aStdAnimations[] = { +#endif +char const* aStdAnimations[] = { "walk_civi", "run_civi", "sprint_panic", @@ -410,8 +318,8 @@ char const *aStdAnimations[] = { "KO_shot_armR", "KO_shot_legl", "KO_shot_legR", - "BIKE_fall_off", - "BIKE_fall_off", + "KD_left", + "KD_right", "KO_skid_front", "KO_spin_R", "KO_skid_back", @@ -425,28 +333,30 @@ char const *aStdAnimations[] = { "HIT_back", "HIT_R", "FLOOR_hit", - + "HIT_bodyblow", + "HIT_chest", + "HIT_head", + "HIT_walk", "HIT_wall", "FLOOR_hit_f", "HIT_behind", "FIGHTIDLE", "FIGHT2IDLE", "FIGHTsh_F", + "FIGHTbodyblow", + "FIGHThead", + "FIGHTkick", + "FIGHTknee", + "FIGHTLhook", + "FIGHTpunch", + "FIGHTrndhse", + "FIGHTlngkck", "FIGHTppunch", - - "l_hook", - "r_hook", - "uppercut", - "headbutt", - "frontkick", - "roundhouse", - "hit_l_hook", - "hit_r_hook", - "hit_uppercut", - "hit_headbutt", - "hit_frontkick", - "hit_rhouse", - + "FIGHTjab", + "FIGHTelbowL", + "FIGHTelbowR", + "FIGHTbkickL", + "FIGHTbkickR", "bomber", "punchR", "FIGHTppunch", @@ -516,13 +426,12 @@ char const *aStdAnimations[] = { "CAR_getoutL_RHS", "CAR_close_RHS", "car_hookertalk", - - "TRAIN_getin", - "TRAIN_getout", + "idle_stance", + "idle_stance", "CAR_crawloutRHS", "CAR_crawloutRHS", "CAR_rollout_LHS", - "CAR_rollout_RHS", + "CAR_rollout_LHS", "Getup", "Getup", "Getup", @@ -538,8 +447,6 @@ char const *aStdAnimations[] = { "FALL_front", "EV_step", "EV_dive", - - "commando_roll", "XPRESSscratch", "roadcross", "TURN_180", @@ -562,7 +469,7 @@ char const *aStdAnimations[] = { "ATM", "abseil", }; -char const *aVanAnimations[] = { +char const* aVanAnimations[] = { "VAN_openL", "VAN_getinL", "VAN_closeL", @@ -572,14 +479,14 @@ char const *aVanAnimations[] = { "VAN_close", "VAN_getout", }; -char const *aCoachAnimations[] = { +char const* aCoachAnimations[] = { + "COACH_opnL", "COACH_opnL", - "COACH_opnR", "COACH_inL", - "COACH_inR", + "COACH_inL", "COACH_outL", }; -char const *aBikesAnimations[] = { +char const* aBikesAnimations[] = { "BIKEs_Ride", "BIKEs_Still", "BIKEs_Left", @@ -599,7 +506,7 @@ char const *aBikesAnimations[] = { "BIKEs_drivebyFT", "BIKEs_passenger", }; -char const *aBikevAnimations[] = { +char const* aBikevAnimations[] = { "BIKEv_Ride", "BIKEv_Still", "BIKEv_Left", @@ -619,7 +526,7 @@ char const *aBikevAnimations[] = { "BIKEv_drivebyFT", "BIKEv_passenger", }; -char const *aBikehAnimations[] = { +char const* aBikehAnimations[] = { "BIKEh_Ride", "BIKEh_Still", "BIKEh_Left", @@ -639,7 +546,7 @@ char const *aBikehAnimations[] = { "BIKEh_drivebyFT", "BIKEh_passenger", }; -char const *aBikedAnimations[] = { +char const* aBikedAnimations[] = { "BIKEd_Ride", "BIKEd_Still", "BIKEd_Left", @@ -659,123 +566,115 @@ char const *aBikedAnimations[] = { "BIKEd_drivebyFT", "BIKEd_passenger", }; -char const *aUnarmedAnimations[] = { +char const* aUnarmedAnimations[] = { "punchR", "KICK_floor", "FIGHTppunch", }; -char const *aScrewdriverAnimations[] = { - "r_hook", - "r_hook", +char const* aScrewdriverAnimations[] = { + "FIGHTbodyblow", + "FIGHTbodyblow", "FIGHTppunch", "FIGHTIDLE", - "r_hook", + "FIGHTbodyblow", }; -char const *aKnifeAnimations[] = { +char const* aKnifeAnimations[] = { "WEAPON_knife_1", "WEAPON_knife_2", "knife_part", "WEAPON_knifeidle", "WEAPON_knife_3", }; -char const *aBaseballbatAnimations[] = { +char const* aBaseballbatAnimations[] = { "WEAPON_bat_h", "WEAPON_bat_v", "BAT_PART", "WEAPON_bat_h", "WEAPON_golfclub", }; -char const *aGolfclubAnimations[] = { +char const* aGolfclubAnimations[] = { "WEAPON_bat_h", "WEAPON_golfclub", "BAT_PART", "WEAPON_bat_h", "WEAPON_bat_v", }; -char const *aChainsawAnimations[] = { +char const* aChainsawAnimations[] = { "WEAPON_csaw", "WEAPON_csawlo", "csaw_part", }; -char const *aPythonAnimations[] = { +char const* aPythonAnimations[] = { "python_fire", "python_crouchfire", "python_reload", "python_crouchreload", }; -char const *aColtAnimations[] = { +char const* aColtAnimations[] = { "colt45_fire", "colt45_crouchfire", "colt45_reload", "colt45_crouchreload", "colt45_cop", }; -char const *aShotgunAnimations[] = { +char const* aShotgunAnimations[] = { "shotgun_fire", "shotgun_crouchfire", }; -char const *aBuddyAnimations[] = { +char const* aBuddyAnimations[] = { "buddy_fire", "buddy_crouchfire", - "buddy_reload", }; -char const *aTecAnimations[] = { +char const* aTecAnimations[] = { "TEC_fire", "TEC_crouchfire", "TEC_reload", "TEC_crouchreload", }; -char const *aUziAnimations[] = { +char const* aUziAnimations[] = { "UZI_fire", "UZI_crouchfire", "UZI_reload", "UZI_crouchreload", }; -char const *aRifleAnimations[] = { +char const* aRifleAnimations[] = { "RIFLE_fire", "RIFLE_crouchfire", "RIFLE_load", "RIFLE_crouchload", }; -char const *aM60Animations[] = { +char const* aM60Animations[] = { "M60_fire", "M60_fire", "M60_reload", }; -char const *aSniperAnimations[] = { - "sniper_fire", - "sniper_fire", - "sniper_reload", +char const* aSniperAnimations[] = { + "WEAPON_sniper", }; -char const *aThrowAnimations[] = { +char const* aThrowAnimations[] = { "WEAPON_throw", "WEAPON_throwu", "WEAPON_start_throw", }; -char const *aFlamethrowerAnimations[] = { +char const* aFlamethrowerAnimations[] = { "FLAME_fire", }; -char const *aRocketLauncherAnimations[] = { - "rocket_fire", - "rocket_fire", - "rocket_reload", -}; -char const *aMedicAnimations[] = { +char const* aMedicAnimations[] = { "CPR", }; -char const *aSunbatheAnimations[] = { +char const* aSunbatheAnimations[] = { "bather", "batherdown", "batherup", "batherscape", }; -char const *aPlayerIdleAnimations[] = { +char const* aPlayerIdleAnimations[] = { "stretch", "time", "shldr", "strleg", }; -char const *aRiotAnimations[] = { +char const* aRiotAnimations[] = { "riot_angry", "riot_angry_b", "riot_chant", @@ -784,7 +683,7 @@ char const *aRiotAnimations[] = { "riot_challenge", "riot_fuku", }; -char const *aStripAnimations[] = { +char const* aStripAnimations[] = { "strip_A", "strip_B", "strip_C", @@ -793,287 +692,212 @@ char const *aStripAnimations[] = { "strip_F", "strip_G", }; -char const *aLanceAnimations[] = { +char const* aLanceAnimations[] = { "lance", }; -char const *aPlayerAnimations[] = { +char const* aPlayerAnimations[] = { "walk_player", "run_player", "SPRINT_civi", "IDLE_STANCE", "walk_start", }; -char const *aPlayerWithRocketAnimations[] = { +char const* aPlayerWithRocketAnimations[] = { "walk_rocket", "run_rocket", - "sprint_rocket", + "run_rocket", "idle_rocket", "walk_start_rocket", }; -char const *aPlayer1ArmedAnimations[] = { +char const* aPlayer1ArmedAnimations[] = { "walk_player", "run_1armed", "SPRINT_civi", "IDLE_STANCE", "walk_start", }; -char const *aPlayer2ArmedAnimations[] = { +char const* aPlayer2ArmedAnimations[] = { "walk_armed", "run_armed", - "playersprint_armed", + "run_armed", "idle_armed", "walk_start_armed", }; -char const *aAIChainsawAnimations[] = { - "walk_aicsaw", - "run_aicsaw", - "run_aicsaw", - "IDLE_csaw", - "walk_start_aicsaw", +char const* aPlayerBBBatAnimations[] = { + "walk_player", + "run_player", + "run_player", + "IDLE_STANCE", + "walk_start", }; -char const *aPlayerChainsawAnimations[] = { +char const* aPlayerChainsawAnimations[] = { "walk_csaw", "run_csaw", - "sprint_csaw", + "run_csaw", "IDLE_csaw", "walk_start_csaw", }; -char const *aShuffleAnimations[] = { +char const* aShuffleAnimations[] = { "WALK_shuffle", "RUN_civi", "SPRINT_civi", "IDLE_STANCE", }; -char const *aOldAnimations[] = { +char const* aOldAnimations[] = { "walk_old", "run_civi", "sprint_civi", "idle_stance", }; -char const *aGang1Animations[] = { +char const* aGang1Animations[] = { "walk_gang1", "run_gang1", "sprint_civi", "idle_stance", }; -char const *aGang2Animations[] = { +char const* aGang2Animations[] = { "walk_gang2", "run_gang1", "sprint_civi", "idle_stance", }; -char const *aFatAnimations[] = { +char const* aFatAnimations[] = { "walk_fat", "run_civi", "woman_runpanic", "idle_stance", }; -char const *aOldFatAnimations[] = { +char const* aOldFatAnimations[] = { "walk_fatold", "run_fatold", "woman_runpanic", "idle_stance", }; -char const *aJoggerAnimations[] = { +char const* aJoggerAnimations[] = { "JOG_maleA", "run_civi", "sprint_civi", "idle_stance", }; -char const *aStdWomanAnimations[] = { +char const* aStdWomanAnimations[] = { "woman_walknorm", "woman_run", "woman_runpanic", "woman_idlestance", }; -char const *aWomanShopAnimations[] = { +char const* aWomanShopAnimations[] = { "woman_walkshop", "woman_run", "woman_run", "woman_idlestance", }; -char const *aBusyWomanAnimations[] = { +char const* aBusyWomanAnimations[] = { "woman_walkbusy", "woman_run", "woman_runpanic", "woman_idlestance", }; -char const *aSexyWomanAnimations[] = { +char const* aSexyWomanAnimations[] = { "woman_walksexy", "woman_run", "woman_runpanic", "woman_idlestance", }; -char const *aFatWomanAnimations[] = { +char const* aFatWomanAnimations[] = { "walk_fat", "woman_run", "woman_runpanic", "woman_idlestance", }; -char const *aOldWomanAnimations[] = { +char const* aOldWomanAnimations[] = { "woman_walkold", "woman_run", "woman_runpanic", "woman_idlestance", }; -char const *aJoggerWomanAnimations[] = { +char const* aJoggerWomanAnimations[] = { "JOG_maleB", "woman_run", "woman_runpanic", "woman_idlestance", }; -char const *aPanicChunkyAnimations[] = { +char const* aPanicChunkyAnimations[] = { "run_fatold", "woman_runpanic", "woman_runpanic", "idle_stance", }; -char const *aSkateAnimations[] = { +char const* aSkateAnimations[] = { "skate_run", "skate_sprint", "skate_sprint", "skate_idle", }; -char const *aPlayerStrafeBackAnimations[] = { +#ifdef PC_PLAYER_CONTROLS +char const* aPlayerStrafeBackAnimations[] = { "walk_back", "run_back", "run_back", "IDLE_STANCE", "walk_start_back", }; -char const *aPlayerStrafeLeftAnimations[] = { +char const* aPlayerStrafeLeftAnimations[] = { "walk_left", "run_left", "run_left", "IDLE_STANCE", "walk_start_left", }; -char const *aPlayerStrafeRightAnimations[] = { +char const* aPlayerStrafeRightAnimations[] = { "walk_right", "run_right", "run_right", "IDLE_STANCE", "walk_start_right", }; -char const *aRocketStrafeBackAnimations[] = { +char const* aRocketStrafeBackAnimations[] = { "walk_rocket_back", "run_rocket_back", "run_rocket_back", "idle_rocket", "walkst_rocket_back", }; -char const *aRocketStrafeLeftAnimations[] = { +char const* aRocketStrafeLeftAnimations[] = { "walk_rocket_left", "run_rocket_left", "run_rocket_left", "idle_rocket", "walkst_rocket_left", }; -char const *aRocketStrafeRightAnimations[] = { +char const* aRocketStrafeRightAnimations[] = { "walk_rocket_right", "run_rocket_right", "run_rocket_right", "idle_rocket", "walkst_rocket_right", }; -char const *aMPNoteAnimations[] = { - "MPNote", - "MPNoteloop", +char const* aChainsawStrafeBackAnimations[] = { + "walk_csaw_back", + "run_csaw_back", + "run_csaw_back", + "idle_csaw", + "walkst_csaw_back", }; -char const *aCSMiscAnimations[] = { - "IDLE_look", - "IDLE_no", - "IDLE_yes", - "IDLE_chat2", - "IDLE_cough", - "IDLE_giggle_female", - "IDLE_tough_chat", - "IDLE_cell_talk", +char const* aChainsawStrafeLeftAnimations[] = { + "walk_csaw_left", + "run_csaw_left", + "run_csaw_left", + "idle_csaw", + "walkst_csaw_left", }; -char const *aDONH2Animations[] = { - "DONH2_camera", -}; -char const *aDONH3Animations[] = { - "DONH3_happy", -}; -char const *aJDT2Animations[] = { - "JDT2_anxious_talk", - "JDT2_shrug", -}; -char const *aJDT4Animations[] = { - "JDT4_dildo_talk", -}; -char const *aJDT5Animations[] = { - "JDT5_calm_down", - "JDT5_point", -}; -char const *aJDT6Animations[] = { - "JDT6_pickup", - "JDT6_doorknock", -}; -char const *aMAR1Animations[] = { - "MAR1_skirt", -}; -char const *aMAR2Animations[] = { - "MAR2_cell_answer", - "MAR2_cell_end", - "MAR2_cell_talk", - "MAR2_foot_tap", -}; -char const *aMAR3Animations[] = { - "MAR3_hoochy", - "MAR3_note_idle", - "MAR3_note_pick", -}; -char const *aSAL1Animations[] = { - "SAL1_briefcase_down", -}; -char const *aSAL2Animations[] = { - "SAL2_idle_seated", - "SAL2_seat_to_stand", -}; -char const *aSAL3Animations[] = { - "SAL3_seated_talk", - "SAL3_seated_idle", - "SAL3_sit_down", -}; -char const *aSAL4Animations[] = { - "SAL4_dustdown", - "SAL4_girlrun", -}; -char const *aSAL6Animations[] = { - "SAL6_angry_seated", - "SAL6_idle_seated", -}; -char const *aSAL7Animations[] = { - "SAL7_lookout", -}; -char const *aVIC2Animations[] = { - "VIC2_point_angry", -}; -char const *aVIC3Animations[] = { - "VIC3_waft", - "VIC3_pickup_roll", -}; -char const *aVIC4Animations[] = { - "VIC4_carry_box", - "VIC4_cell_look", - "VIC4_crate_idle", -}; -char const *aVIC6Animations[] = { - "VIC6_cell_angry", -}; -char const *aTouristAnimations[] = { - "tourist3", - "tourist2", - "tourist1", -}; -char const *aMAC2Animations[] = { - "MAC2_plead", -}; -char const *aVIC7Animations[] = { - "VIC7_prod_with_foot", +char const* aChainsawStrafeRightAnimations[] = { + "walk_csaw_right", + "run_csaw_right", + "run_csaw_right", + "idle_csaw", + "walkst_csaw_right", }; +#endif #define awc(a) ARRAY_SIZE(a), a const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_GROUPS] = { @@ -1101,7 +925,6 @@ const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_ { "sniper", "sniper", MI_COP, awc(aSniperAnimations), aWeaponAnimDescs }, { "grenade", "grenade", MI_COP, awc(aThrowAnimations), aWeaponAnimDescs }, { "flame", "flame", MI_COP, awc(aFlamethrowerAnimations), aWeaponAnimDescs }, - { "rocketla", "rocketla", MI_COP, awc(aRocketLauncherAnimations), aWeaponAnimDescs }, { "medic", "medic", MI_COP, awc(aMedicAnimations), aMedicAnimDescs }, { "sunbathe", "sunbathe", MI_COP, 1, aSunbatheAnimations, aSunbatheAnimDescs }, // NB: not using awc here! { "playidles", "playidles", MI_COP, awc(aPlayerIdleAnimations), aPlayerIdleAnimDescs }, @@ -1112,8 +935,7 @@ const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_ { "playerrocket", "ped", MI_COP, awc(aPlayerWithRocketAnimations), aStdAnimDescs }, { "player1armed", "ped", MI_COP, awc(aPlayer1ArmedAnimations), aStdAnimDescs }, { "player2armed", "ped", MI_COP, awc(aPlayer2ArmedAnimations), aStdAnimDescs }, - { "playerBBBat", "ped", MI_COP, awc(aPlayer1ArmedAnimations), aStdAnimDescs }, - { "aicsaw2", "ped", MI_COP, awc(aAIChainsawAnimations), aStdAnimDescs }, + { "playerBBBat", "ped", MI_COP, awc(aPlayerBBBatAnimations), aStdAnimDescs }, { "playercsaw", "ped", MI_COP, awc(aPlayerChainsawAnimations), aStdAnimDescs }, { "shuffle", "ped", MI_COP, awc(aShuffleAnimations), aStdAnimDescs }, { "oldman", "ped", MI_COP, awc(aOldAnimations), aStdAnimDescs }, @@ -1131,39 +953,17 @@ const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_ { "jogwoman", "ped", MI_COP, awc(aJoggerWomanAnimations), aStdAnimDescs }, { "panicchunky", "ped", MI_COP, awc(aPanicChunkyAnimations), aStdAnimDescs }, { "skate", "skate", MI_COP, awc(aSkateAnimations), aStdAnimDescs }, -#ifdef PC_PLAYER_CONTROLS // strangely enabled even on PS2 +#ifdef PC_PLAYER_CONTROLS { "playerback", "ped", MI_COP, awc(aPlayerStrafeBackAnimations), aStdAnimDescs }, { "playerleft", "ped", MI_COP, awc(aPlayerStrafeLeftAnimations), aStdAnimDescsSide }, { "playerright", "ped", MI_COP, awc(aPlayerStrafeRightAnimations), aStdAnimDescsSide }, { "rocketback", "ped", MI_COP, awc(aRocketStrafeBackAnimations), aStdAnimDescs }, { "rocketleft", "ped", MI_COP, awc(aRocketStrafeLeftAnimations), aStdAnimDescsSide }, { "rocketright", "ped", MI_COP, awc(aRocketStrafeRightAnimations), aStdAnimDescsSide }, + { "csawback", "ped", MI_COP, awc(aChainsawStrafeBackAnimations), aStdAnimDescs }, + { "csawleft", "ped", MI_COP, awc(aChainsawStrafeLeftAnimations), aStdAnimDescsSide }, + { "csawright", "ped", MI_COP, awc(aChainsawStrafeRightAnimations), aStdAnimDescsSide }, #endif - - { "MPNote", "MPNote", MI_COP, awc(aMPNoteAnimations), aMPNoteAnimDescs }, - { "CS_MISC", "CS_MISC", MI_COP, awc(aCSMiscAnimations), aCSMiscAnimDescs }, - { "DONH2", "DONH2", MI_COP, awc(aDONH2Animations), aDONH2AnimDescs }, - { "DONH3", "DONH3", MI_COP, awc(aDONH3Animations), aDONH3AnimDescs }, - { "JDT2", "JDT2", MI_COP, awc(aJDT2Animations), aJDT2AnimDescs }, - { "JDT4", "JDT4", MI_COP, awc(aJDT4Animations), aJDT4AnimDescs }, - { "JDT5", "JDT5", MI_COP, awc(aJDT5Animations), aJDT5AnimDescs }, - { "JDT6", "JDT6", MI_COP, awc(aJDT6Animations), aJDT6AnimDescs }, - { "MAR1", "MAR1", MI_COP, awc(aMAR1Animations), aMAR1AnimDescs }, - { "MAR2", "MAR2", MI_COP, awc(aMAR2Animations), aMAR2AnimDescs }, - { "MAR3", "MAR3", MI_COP, awc(aMAR3Animations), aMAR3AnimDescs }, - { "SAL1", "SAL1", MI_COP, awc(aSAL1Animations), aSAL1AnimDescs }, - { "SAL2", "SAL2", MI_COP, awc(aSAL2Animations), aSAL2AnimDescs }, - { "SAL3", "SAL3", MI_COP, awc(aSAL3Animations), aSAL3AnimDescs }, - { "SAL4", "SAL4", MI_COP, awc(aSAL4Animations), aSAL4AnimDescs }, - { "SAL6", "SAL6", MI_COP, awc(aSAL6Animations), aSAL6AnimDescs }, - { "SAL7", "SAL7", MI_COP, awc(aSAL7Animations), aSAL7AnimDescs }, - { "VIC2", "VIC2", MI_COP, awc(aVIC2Animations), aVIC2AnimDescs }, - { "VIC3", "VIC3", MI_COP, awc(aVIC3Animations), aVIC3AnimDescs }, - { "VIC4", "VIC4", MI_COP, awc(aVIC4Animations), aVIC4AnimDescs }, - { "VIC6", "VIC6", MI_COP, awc(aVIC6Animations), aVIC6AnimDescs }, - { "TOURIST", "TOURIST", MI_COP, awc(aTouristAnimations), aTouristAnimDescs }, - { "MAC2", "MAC2", MI_COP, awc(aMAC2Animations), aMAC2AnimDescs }, - { "VIC7", "VIC7", MI_COP, awc(aVIC7Animations), aVIC7AnimDescs }, }; #undef awc diff --git a/src/animation/AnimManager.h b/src/animation/AnimManager.h index 9f556b5..213326b 100644 --- a/src/animation/AnimManager.h +++ b/src/animation/AnimManager.h @@ -29,7 +29,6 @@ enum AssocGroupId ASSOCGRP_SNIPER, ASSOCGRP_THROW, ASSOCGRP_FLAMETHROWER, - ASSOCGRP_ROCKETLAUNCHER, ASSOCGRP_MEDIC, ASSOCGRP_SUNBATHE, ASSOCGRP_PLAYER_IDLE, @@ -41,7 +40,6 @@ enum AssocGroupId ASSOCGRP_PLAYER1ARMED, ASSOCGRP_PLAYER2ARMED, ASSOCGRP_PLAYERBBBAT, - ASSOCGRP_AICHAINSAW, ASSOCGRP_PLAYERCHAINSAW, ASSOCGRP_SHUFFLE, ASSOCGRP_OLD, @@ -66,33 +64,11 @@ enum AssocGroupId ASSOCGRP_ROCKETBACK, ASSOCGRP_ROCKETLEFT, ASSOCGRP_ROCKETRIGHT, + ASSOCGRP_CHAINSAWBACK, + ASSOCGRP_CHAINSAWLEFT, + ASSOCGRP_CHAINSAWRIGHT, #endif - ASSOCGRP_MPNOTE, - ASSOCGRP_CSMISC, - ASSOCGRP_DONH2, - ASSOCGRP_DONH3, - ASSOCGRP_JDT2, - ASSOCGRP_JDT4, - ASSOCGRP_JDT5, - ASSOCGRP_JDT6, - ASSOCGRP_MAR1, - ASSOCGRP_MAR2, - ASSOCGRP_MAR3, - ASSOCGRP_SAL1, - ASSOCGRP_SAL2, - ASSOCGRP_SAL3, - ASSOCGRP_SAL4, - ASSOCGRP_SAL6, - ASSOCGRP_SAL7, - ASSOCGRP_VIC2, - ASSOCGRP_VIC3, - ASSOCGRP_VIC4, - ASSOCGRP_VIC6, - ASSOCGRP_TOURIST, - ASSOCGRP_MAC2, - ASSOCGRP_VIC7, - NUM_ANIM_ASSOC_GROUPS }; diff --git a/src/animation/AnimationId.h b/src/animation/AnimationId.h index 5a8f728..0b5d8d8 100644 --- a/src/animation/AnimationId.h +++ b/src/animation/AnimationId.h @@ -40,25 +40,42 @@ enum AnimationId ANIM_STD_HIT_BACK, ANIM_STD_HIT_RIGHT, ANIM_STD_HIT_FLOOR, + + /* names made up */ + ANIM_STD_HIT_BODYBLOW, + ANIM_STD_HIT_CHEST, + ANIM_STD_HIT_HEAD, + ANIM_STD_HIT_WALK, + /**/ + ANIM_STD_HIT_WALL, ANIM_STD_HIT_FLOOR_FRONT, ANIM_STD_HIT_BEHIND, ANIM_STD_FIGHT_IDLE, ANIM_STD_FIGHT_2IDLE, ANIM_STD_FIGHT_SHUFFLE_F, + + /* names made up */ + ANIM_STD_FIGHT_BODYBLOW, + ANIM_STD_FIGHT_HEAD, + ANIM_STD_FIGHT_KICK, + ANIM_STD_FIGHT_KNEE, + ANIM_STD_FIGHT_LHOOK, + ANIM_STD_FIGHT_PUNCH, + ANIM_STD_FIGHT_ROUNDHOUSE, + ANIM_STD_FIGHT_LONGKICK, + /**/ + ANIM_STD_PARTIAL_PUNCH, - ANIM_FIGHT_ATTACK_A1, - ANIM_FIGHT_ATTACK_A2, - ANIM_FIGHT_ATTACK_A3, - ANIM_FIGHT_ATTACK_B1, - ANIM_FIGHT_ATTACK_B2, - ANIM_FIGHT_ATTACK_B3, - ANIM_FIGHT_HIT_A1, - ANIM_FIGHT_HIT_A2, - ANIM_FIGHT_HIT_A3, - ANIM_FIGHT_HIT_B1, - ANIM_FIGHT_HIT_B2, - ANIM_FIGHT_HIT_B3, + + /* names made up */ + ANIM_STD_FIGHT_JAB, + ANIM_STD_FIGHT_ELBOW_L, + ANIM_STD_FIGHT_ELBOW_R, + ANIM_STD_FIGHT_BKICK_L, + ANIM_STD_FIGHT_BKICK_R, + /**/ + ANIM_STD_DETONATE, ANIM_STD_PUNCH, ANIM_STD_PARTIALPUNCH, @@ -157,7 +174,6 @@ enum AnimationId ANIM_STD_EVADE_STEP, ANIM_STD_EVADE_DIVE, - ANIM_STD_COMMANDO_ROLL, ANIM_STD_XPRESS_SCRATCH, ANIM_STD_ROADCROSS, ANIM_STD_TURN180, @@ -268,65 +284,4 @@ enum AnimationId ANIM_STRIP_E, ANIM_STRIP_F, ANIM_STRIP_G, - - - ANIM_MULTIPLAYER_CUTSCENE_MPNOTE, - ANIM_MULTIPLAYER_CUTSCENE_MPNOTE_LOOP, - - ANIM_CS_MISC_IDLE_LOOK, - ANIM_CS_MISC_IDLE_NO, - ANIM_CS_MISC_IDLE_YES, - ANIM_CS_MISC_IDLE_CHAT2, - ANIM_CS_MISC_IDLE_COUGH, - ANIM_CS_MISC_IDLE_GIGGLE_FEMALE, - ANIM_CS_MISC_IDLE_TOUGH_CHAT, - ANIM_CS_MISC_IDLE_CELL_TALK, - - ANIM_DONH2_CAMERA, - ANIM_DONH3_HAPPY, - - ANIM_JDT2_ANXIOUS_TALK, - ANIM_JDT2_SHRUG, - ANIM_JDT4_DILDO_TALK, - ANIM_JDT5_CALM_DOWN, - ANIM_JDT5_POINT, - ANIM_JDT6_PICKUP, - ANIM_JDT6_KNOCK, - - ANIM_MAR1_SKIRT, - ANIM_MAR2_CELL_ANSWER, - ANIM_MAR2_CELL_END, - ANIM_MAR2_CELL_TALK, - ANIM_MAR2_FOOT_TAP, - ANIM_MAR3_HOOCHY, - ANIM_MAR3_NOTE_IDLE, - ANIM_MAR3_NOTE_PICKUP, - - ANIM_SAL1_BIREFCASE_DOWN, - ANIM_SAL2_IDLE_SEATED, - ANIM_SAL2_SEAT_TO_STAND, - ANIM_SAL3_SEATED_TALK, - ANIM_SAL3_SEATED_IDLE, - ANIM_SAL3_SIT_DOWN, - ANIM_SAL4_DUST_DOWN, - ANIM_SAL4_GIRL_RUN, - ANIM_SAL6_ANGRY_SEATED, - ANIM_SAL6_IDLE_SEATED, - ANIM_SAL7_LOOKOUT, - - ANIM_VIC2_POINT_ANGRY, - ANIM_VIC3_WAFT, - ANIM_VIC3_PICKUP_ROLL, - ANIM_VIC4_CARRY_BOX, - ANIM_VIC4_CELL_LOOK, - ANIM_VIC4_CRATE_IDLE, - ANIM_VIC6_CELL_ANGRY, - - ANIM_TOURIST3, - ANIM_TOURIST2, - ANIM_TOURIST1, - - ANIM_MAC2_PLEAD, - - ANIM_VIC7_PROD_WITH_FOOT }; \ No newline at end of file diff --git a/src/animation/CutsceneMgr.cpp b/src/animation/CutsceneMgr.cpp index 088cb41..633618b 100644 --- a/src/animation/CutsceneMgr.cpp +++ b/src/animation/CutsceneMgr.cpp @@ -22,54 +22,154 @@ #include "ColStore.h" #include "Radar.h" #include "Pools.h" -#include "crossplatform.h" -static bool bModelsRemovedForCutscene; -static int32 NumberOfSavedWeapons; -static eWeaponType SavedWeaponIDs[TOTAL_WEAPON_SLOTS]; -static int32 SavedWeaponAmmo[TOTAL_WEAPON_SLOTS]; +const struct { + const char *szTrackName; + int iTrackId; +} musicNameIdAssoc[] = { + { "ASS_1", STREAMED_SOUND_CUTSCENE_ASS_1 }, + { "ASS_2", STREAMED_SOUND_CUTSCENE_ASS_2 }, + { "BANK_1", STREAMED_SOUND_CUTSCENE_BANK_1 }, + { "BANK_2A", STREAMED_SOUND_CUTSCENE_BANK_2A }, + { "BANK_2B", STREAMED_SOUND_CUTSCENE_BANK_2B }, + { "BANK_3A", STREAMED_SOUND_CUTSCENE_BANK_3A }, + { "BANK_3B", STREAMED_SOUND_CUTSCENE_BANK_3B }, + { "BANK_4", STREAMED_SOUND_CUTSCENE_BANK_4 }, + { "BIKE_1", STREAMED_SOUND_CUTSCENE_BIKE_1 }, + { "BIKE_2", STREAMED_SOUND_CUTSCENE_BIKE_2 }, + { "BIKE_3", STREAMED_SOUND_CUTSCENE_BIKE_3 }, + { "BUD_1", STREAMED_SOUND_CUTSCENE_BUD_1 }, + { "BUD_2", STREAMED_SOUND_CUTSCENE_BUD_2 }, + { "BUD_3", STREAMED_SOUND_CUTSCENE_BUD_3 }, + { "CAP_1", STREAMED_SOUND_CUTSCENE_CAP_1 }, + { "CAR_1", STREAMED_SOUND_CUTSCENE_CAR_1 }, + { "CNT_1A", STREAMED_SOUND_CUTSCENE_CNT_1A }, + { "CNT_1B", STREAMED_SOUND_CUTSCENE_CNT_1B }, + { "CNT_2", STREAMED_SOUND_CUTSCENE_CNT_2 }, + { "COK_1", STREAMED_SOUND_CUTSCENE_COK_1 }, + { "COK_2A", STREAMED_SOUND_CUTSCENE_COK_2A }, + { "COK_2B", STREAMED_SOUND_CUTSCENE_COK_2B }, + { "COK_3", STREAMED_SOUND_CUTSCENE_COK_3 }, + { "COK_4A", STREAMED_SOUND_CUTSCENE_COK_4A }, + { "COK_4A2", STREAMED_SOUND_CUTSCENE_COK_4A2 }, + { "COK_4B", STREAMED_SOUND_CUTSCENE_COK_4B }, + { "COL_1", STREAMED_SOUND_CUTSCENE_COL_1 }, + { "COL_2", STREAMED_SOUND_CUTSCENE_COL_2 }, + { "COL_3A", STREAMED_SOUND_CUTSCENE_COL_3A }, + { "COL_4A", STREAMED_SOUND_CUTSCENE_COL_4A }, + { "COL_5A", STREAMED_SOUND_CUTSCENE_COL_5A }, + { "COL_5B", STREAMED_SOUND_CUTSCENE_COL_5B }, + { "CUB_1", STREAMED_SOUND_CUTSCENE_CUB_1 }, + { "CUB_2", STREAMED_SOUND_CUTSCENE_CUB_2 }, + { "CUB_3", STREAMED_SOUND_CUTSCENE_CUB_3 }, + { "CUB_4", STREAMED_SOUND_CUTSCENE_CUB_4 }, + { "DRUG_1", STREAMED_SOUND_CUTSCENE_DRUG_1 }, + { "FIN", STREAMED_SOUND_CUTSCENE_FIN }, + { "FIN_2", STREAMED_SOUND_CUTSCENE_FIN2 }, + { "FINALE", STREAMED_SOUND_CUTSCENE_FINALE }, + { "HAT_1", STREAMED_SOUND_CUTSCENE_HAT_1 }, + { "HAT_2", STREAMED_SOUND_CUTSCENE_HAT_2 }, + { "HAT_3", STREAMED_SOUND_CUTSCENE_HAT_3 }, + { "ICE_1", STREAMED_SOUND_CUTSCENE_ICE_1 }, + { "INT_A", STREAMED_SOUND_CUTSCENE_INT_A }, + { "INT_B", STREAMED_SOUND_CUTSCENE_INT_B }, + { "INT_D", STREAMED_SOUND_CUTSCENE_INT_D }, + { "INT_M", STREAMED_SOUND_CUTSCENE_INT_M }, + { "LAW_1A", STREAMED_SOUND_CUTSCENE_LAW_1A }, + { "LAW_1B", STREAMED_SOUND_CUTSCENE_LAW_1B }, + { "LAW_2A", STREAMED_SOUND_CUTSCENE_LAW_2A }, + { "LAW_2B", STREAMED_SOUND_CUTSCENE_LAW_2B }, + { "LAW_2C", STREAMED_SOUND_CUTSCENE_LAW_2C }, + { "LAW_3", STREAMED_SOUND_CUTSCENE_LAW_3 }, + { "LAW_4", STREAMED_SOUND_CUTSCENE_LAW_4 }, + { "PHIL_1", STREAMED_SOUND_CUTSCENE_PHIL_1 }, + { "PHIL_2", STREAMED_SOUND_CUTSCENE_PHIL_2 }, + { "PORN_1", STREAMED_SOUND_CUTSCENE_PORN_1 }, + { "PORN_2", STREAMED_SOUND_CUTSCENE_PORN_2 }, + { "PORN_3", STREAMED_SOUND_CUTSCENE_PORN_3 }, + { "PORN_4", STREAMED_SOUND_CUTSCENE_PORN_4 }, + { "RESC_1A", STREAMED_SOUND_CUTSCENE_RESC_1A }, + { "ROK_1", STREAMED_SOUND_CUTSCENE_ROK_1 }, + { "ROK_2", STREAMED_SOUND_CUTSCENE_ROK_2 }, + { "ROK_3A", STREAMED_SOUND_CUTSCENE_ROK_3A }, + { "STRIPA", STREAMED_SOUND_CUTSCENE_STRIPA }, + { "TAX_1", STREAMED_SOUND_CUTSCENE_TAX_1 }, + { "TEX_1", STREAMED_SOUND_CUTSCENE_TEX_1 }, + { "TEX_2", STREAMED_SOUND_CUTSCENE_TEX_2 }, + { "TEX_3", STREAMED_SOUND_CUTSCENE_TEX_3 }, + { "GSPOT", STREAMED_SOUND_CUTSCENE_GLIGHT }, + { "FIST", STREAMED_SOUND_CUTSCENE_FIST }, + { "EL_PH1", STREAMED_SOUND_CUTSCENE_ELBURRO1_PH1 }, + { "EL_PH2", STREAMED_SOUND_CUTSCENE_ELBURRO2_PH2 }, + { NULL, 0 } +}; -char CCutsceneMgr::ms_cAppendAnimName[NUMCUTSCENEOBJECTS][NAMELENGTH]; -char CCutsceneMgr::ms_cAppendObjectName[NUMCUTSCENEOBJECTS][NAMELENGTH]; -int CCutsceneMgr::ms_numAppendObjectNames; -CDirectory *CCutsceneMgr::ms_pCutsceneDir; -bool CCutsceneMgr::ms_loaded; -bool CCutsceneMgr::ms_hasFileInfo; -bool CCutsceneMgr::ms_wasCutsceneSkipped; -bool CCutsceneMgr::ms_useLodMultiplier; -bool CCutsceneMgr::ms_cutsceneProcessing; -bool CCutsceneMgr::ms_running; -bool CCutsceneMgr::ms_animLoaded; -uint32 CCutsceneMgr::ms_cutsceneLoadStatus; - -void -CCutsceneMgr::Initialise(void *dir) +int +FindCutsceneAudioTrackId(const char *szCutsceneName) { - ms_cutsceneLoadStatus = CUTSCENE_NOT_LOADED; - ms_running = false; - ms_animLoaded = false; - ms_cutsceneProcessing = false; - ms_useLodMultiplier = false; - ms_wasCutsceneSkipped = false; - ms_hasFileInfo = false; - //ms_numCutsceneObjs = 0; - //ms_loaded = false; - if (gMakeResources) { - ms_pCutsceneDir = new CDirectory(CUTSCENEDIRSIZE); - ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR"); + for (int i = 0; musicNameIdAssoc[i].szTrackName; i++) { + if (!CGeneral::faststricmp(musicNameIdAssoc[i].szTrackName, szCutsceneName)) + return musicNameIdAssoc[i].iTrackId; } - else - ms_pCutsceneDir = (CDirectory*)dir; - - //numUncompressedAnims = 0; - //uncompressedAnims[0][0] = '\0'; + return -1; } -void CCutsceneMgr::Write(base::cRelocatableChunkWriter& writer) +bool CCutsceneMgr::ms_running; +bool CCutsceneMgr::ms_cutsceneProcessing; +CDirectory *CCutsceneMgr::ms_pCutsceneDir; +CCutsceneObject *CCutsceneMgr::ms_pCutsceneObjects[NUMCUTSCENEOBJECTS]; +int32 CCutsceneMgr::ms_numCutsceneObjs; +bool CCutsceneMgr::ms_loaded; +bool CCutsceneMgr::ms_animLoaded; +bool CCutsceneMgr::ms_useLodMultiplier; +char CCutsceneMgr::ms_cutsceneName[CUTSCENENAMESIZE]; +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) { - writer.AllocateRaw(ms_pCutsceneDir, sizeof(*ms_pCutsceneDir), 4, false, true); - writer.AllocateRaw(ms_pCutsceneDir->entries, sizeof(CDirectory::DirectoryInfo) * ms_pCutsceneDir->numEntries, 4, false, true); - writer.AddPatch(ms_pCutsceneDir); + float radius = RpAtomicGetBoundingSphere(atomic)->radius; + RwV3d center = RpAtomicGetBoundingSphere(atomic)->center; + + for (RwFrame *frame = RpAtomicGetFrame(atomic); RwFrameGetParent(frame); frame = RwFrameGetParent(frame)) + RwV3dTransformPoints(¢er, ¢er, 1, RwFrameGetMatrix(frame)); + + float size = RwV3dLength(¢er) + radius; + if (size > *(float *)data) + *(float *)data = size; + return atomic; +} + +void +CCutsceneMgr::Initialise(void) +{ + ms_numCutsceneObjs = 0; + ms_loaded = false; + ms_wasCutsceneSkipped = false; + ms_running = false; + ms_useLodMultiplier = false; + ms_animLoaded = false; + ms_cutsceneProcessing = false; + + ms_pCutsceneDir = new CDirectory(CUTSCENEDIRSIZE); + ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR"); + + numUncompressedAnims = 0; + uncompressedAnims[0][0] = '\0'; } void @@ -81,25 +181,431 @@ CCutsceneMgr::Shutdown(void) void CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName) { - LoadCutsceneData_overlay(szCutsceneName); + int file; + uint32 size; + uint32 offset; + CPlayerPed *pPlayerPed; + + ms_cutsceneProcessing = true; + ms_wasCutsceneSkipped = false; + CTimer::Suspend(); + if (!bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver) + CStreaming::RemoveCurrentZonesModels(); + + ms_pCutsceneDir->numEntries = 0; + ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR"); + + CStreaming::RemoveUnusedModelsInLoadedList(); + CGame::DrasticTidyUpMemory(true); + + strcpy(ms_cutsceneName, szCutsceneName); + + RwStream *stream; + stream = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMREAD, "ANIM\\CUTS.IMG"); + assert(stream); + + // Load animations + sprintf(gString, "%s.IFP", szCutsceneName); + if (ms_pCutsceneDir->FindItem(gString, offset, size)) { + CStreaming::MakeSpaceFor(size << 11); + CStreaming::ImGonnaUseStreamingMemory(); + RwStreamSkip(stream, offset << 11); + CAnimManager::LoadAnimFile(stream, true, uncompressedAnims); + ms_cutsceneAssociations.CreateAssociations(szCutsceneName); + CStreaming::IHaveUsedStreamingMemory(); + ms_animLoaded = true; + } else { + ms_animLoaded = false; + } + RwStreamClose(stream, nil); + + // Load camera data + file = CFileMgr::OpenFile("ANIM\\CUTS.IMG", "rb"); + sprintf(gString, "%s.DAT", szCutsceneName); + if (ms_pCutsceneDir->FindItem(gString, offset, size)) { + CStreaming::ImGonnaUseStreamingMemory(); + CFileMgr::Seek(file, offset << 11, SEEK_SET); + TheCamera.LoadPathSplines(file); + CStreaming::IHaveUsedStreamingMemory(); + bCamLoaded = true; + } else { + bCamLoaded = false; + } + + CFileMgr::CloseFile(file); + + if (CGeneral::faststricmp(ms_cutsceneName, "finale")) { + DMAudio.ChangeMusicMode(MUSICMODE_CUTSCENE); + int trackId = FindCutsceneAudioTrackId(szCutsceneName); + if (trackId != -1) { + printf("Start preload audio %s\n", szCutsceneName); + DMAudio.PreloadCutSceneMusic(trackId); + printf("End preload audio %s\n", szCutsceneName); + } + } + + ms_cutsceneTimer = 0.0f; + ms_loaded = true; + ms_cutsceneOffset = CVector(0.0f, 0.0f, 0.0f); + + pPlayerPed = FindPlayerPed(); + pPlayerPed->m_pWanted->ClearQdCrimes(); + pPlayerPed->bIsVisible = false; + pPlayerPed->m_fCurrentStamina = pPlayerPed->m_fMaxStamina; + CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_CUTSCENE); + CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(true); + + CTimer::Resume(); +} + +void +CCutsceneMgr::FinishCutscene() +{ + ms_wasCutsceneSkipped = true; + if (bCamLoaded) { + CCutsceneMgr::ms_cutsceneTimer = TheCamera.GetCutSceneFinishTime() * 0.001f; + TheCamera.FinishCutscene(); + } + + FindPlayerPed()->bIsVisible = true; + CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false); +} + +void +CCutsceneMgr::SetupCutsceneToStart(void) +{ + if (bCamLoaded) { + TheCamera.SetCamCutSceneOffSet(ms_cutsceneOffset); + TheCamera.TakeControlWithSpline(JUMP_CUT); + TheCamera.SetWideScreenOn(); + } + + ms_cutsceneOffset.z++; + + for (int i = ms_numCutsceneObjs - 1; i >= 0; i--) { + assert(RwObjectGetType(ms_pCutsceneObjects[i]->m_rwObject) == rpCLUMP); + if (CAnimBlendAssociation *pAnimBlendAssoc = RpAnimBlendClumpGetFirstAssociation((RpClump*)ms_pCutsceneObjects[i]->m_rwObject)) { + assert(pAnimBlendAssoc->hierarchy->sequences[0].HasTranslation()); + if (ms_pCutsceneObjects[i]->m_pAttachTo != nil) { + pAnimBlendAssoc->flags &= (~ASSOC_HAS_TRANSLATION); + } else { + if (pAnimBlendAssoc->hierarchy->IsCompressed()){ + KeyFrameTransCompressed *keyFrames = ((KeyFrameTransCompressed*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrameCompressed(0)); + CVector trans; + keyFrames->GetTranslation(&trans); + ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + trans); + }else{ + KeyFrameTrans *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); + } + CWorld::Add(ms_pCutsceneObjects[i]); + if (RwObjectGetType(ms_pCutsceneObjects[i]->m_rwObject) == rpCLUMP) { + ms_pCutsceneObjects[i]->UpdateRpHAnim(); + } + } + + CTimer::Update(); + CTimer::Update(); + ms_running = true; + ms_cutsceneTimer = 0.0f; +} + +void +CCutsceneMgr::SetCutsceneAnim(const char *animName, CObject *pObject) +{ + CAnimBlendAssociation *pNewAnim; + CAnimBlendClumpData *pAnimBlendClumpData; + + assert(RwObjectGetType(pObject->m_rwObject) == rpCLUMP); + debug("Give cutscene anim %s\n", animName); + RpAnimBlendClumpRemoveAllAssociations((RpClump*)pObject->m_rwObject); + + 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->keepCompressed = 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->keepCompressed) + pAnimBlendClumpData->frames->flag |= AnimBlendFrameData::COMPRESSED; +} + +void +CCutsceneMgr::SetCutsceneAnimToLoop(const char* animName) +{ + ms_cutsceneAssociations.GetAnimation(animName)->flags |= ASSOC_REPEAT; +} + +CCutsceneHead * +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; + CCutsceneObject *pCutsceneObject; + + CStreaming::ImGonnaUseStreamingMemory(); + debug("Created cutscene object %s\n", CModelInfo::GetModelInfo(modelId)->GetModelName()); + if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05) { + pModelInfo = CModelInfo::GetModelInfo(modelId); + pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01]; + pModelInfo->SetColModel(pColModel); + 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); + } + + pCutsceneObject = new CCutsceneObject(); + pCutsceneObject->SetModelIndex(modelId); + if (ms_useCutsceneShadows) + pCutsceneObject->CreateShadow(); + ms_pCutsceneObjects[ms_numCutsceneObjs++] = pCutsceneObject; + CStreaming::IHaveUsedStreamingMemory(); + return pCutsceneObject; } void CCutsceneMgr::DeleteCutsceneData(void) { - DeleteCutsceneData_overlay(); - if (bModelsRemovedForCutscene) - LoadEverythingBecauseCutsceneDeletedAllOfIt(); + if (!ms_loaded) return; + CTimer::Suspend(); + + ms_cutsceneProcessing = false; + ms_useLodMultiplier = false; + ms_useCutsceneShadows = true; + + for (--ms_numCutsceneObjs; ms_numCutsceneObjs >= 0; ms_numCutsceneObjs--) { + CWorld::Remove(ms_pCutsceneObjects[ms_numCutsceneObjs]); + ms_pCutsceneObjects[ms_numCutsceneObjs]->DeleteRwObject(); + delete ms_pCutsceneObjects[ms_numCutsceneObjs]; + ms_pCutsceneObjects[ms_numCutsceneObjs] = nil; + } + 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; + numUncompressedAnims = 0; + uncompressedAnims[0][0] = '\0'; + + if (bCamLoaded) { + TheCamera.RestoreWithJumpCut(); + TheCamera.SetWideScreenOff(); + TheCamera.DeleteCutSceneCamDataMemory(); + } + ms_running = false; + ms_loaded = false; + + FindPlayerPed()->bIsVisible = true; + CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_CUTSCENE); + CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false); + + if (CGeneral::faststricmp(ms_cutsceneName, "finale")) { + DMAudio.StopCutSceneMusic(); + DMAudio.ChangeMusicMode(MUSICMODE_GAME); + } + + CStreaming::ms_disableStreaming = false; + CWorld::bProcessCutsceneOnly = false; + + if(bCamLoaded) + CGame::DrasticTidyUpMemory(TheCamera.GetScreenFadeStatus() == FADE_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(); } void -CCutsceneMgr::RemoveEverythingBecauseCutsceneDoesntFitInMemory() +CCutsceneMgr::Update(void) { - //CStreaming::ms_disableStreaming = true; - CWorld::ClearExcitingStuffFromArea(FindPlayerCoors(), 120.0f, true); + enum { + CUTSCENE_LOADING_0 = 0, + CUTSCENE_LOADING_AUDIO, + CUTSCENE_LOADING_2, + CUTSCENE_LOADING_3, + CUTSCENE_LOADING_4 + }; + + switch (ms_cutsceneLoadStatus) { + case CUTSCENE_LOADING_AUDIO: + SetupCutsceneToStart(); + if (CGeneral::faststricmp(ms_cutsceneName, "finale")) + DMAudio.PlayPreloadedCutSceneMusic(); + ms_cutsceneLoadStatus++; + break; + case CUTSCENE_LOADING_2: + case CUTSCENE_LOADING_3: + ms_cutsceneLoadStatus++; + break; + case CUTSCENE_LOADING_4: + ms_cutsceneLoadStatus = CUTSCENE_LOADING_0; + break; + default: + break; + } + + if (!ms_running) return; + + ms_cutsceneTimer += CTimer::GetTimeStepNonClippedInSeconds(); + + 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(); + } +} + +bool CCutsceneMgr::HasCutsceneFinished(void) { return !bCamLoaded || TheCamera.GetPositionAlongSpline() == 1.0f; } + +void +CCutsceneMgr::LoadAnimationUncompressed(char const* name) +{ + strcpy(uncompressedAnims[numUncompressedAnims], name); + + // Because that's how CAnimManager knows the end of array + ++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())->GetModelName(), CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName()); +} + +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())->GetModelName(), + frame, + CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName()); + if (RwObjectGetType(pObject->m_rwObject) == rpCLUMP) { + RpClump *clump = (RpClump*)pObject->m_rwObject; + 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())->GetModelName(), + CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName()); +} + +void +CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver() +{ + CStreaming::ms_disableStreaming = true; CColStore::RemoveAllCollision(); CWorld::bProcessCutsceneOnly = true; - /*ms_cutsceneProcessing = true; + ms_cutsceneProcessing = true; for (int i = CPools::GetPedPool()->GetSize() - 1; i >= 0; i--) { CPed *pPed = CPools::GetPedPool()->GetSlot(i); @@ -120,21 +626,25 @@ CCutsceneMgr::RemoveEverythingBecauseCutsceneDoesntFitInMemory() } } } - CWorld::bProcessCutsceneOnly = true; - //bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = true;*/ + + bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = true; CStreaming::RemoveCurrentZonesModels(); - while (CStreaming::RemoveLoadedVehicle()); - CRadar::RemoveRadarSections(); CStreaming::SetModelIsDeletable(MI_MALE01); CStreaming::SetModelTxdIsDeletable(MI_MALE01); - CStreaming::SetModelIsDeletable(MI_COLT45); - CStreaming::SetModelTxdIsDeletable(MI_COLT45); + CStreaming::SetModelIsDeletable(MI_TAXI_D); + CStreaming::SetModelTxdIsDeletable(MI_TAXI_D); CStreaming::SetModelIsDeletable(MI_NIGHTSTICK); CStreaming::SetModelTxdIsDeletable(MI_NIGHTSTICK); CStreaming::SetModelIsDeletable(MI_MISSILE); CStreaming::SetModelTxdIsDeletable(MI_MISSILE); + CStreaming::SetModelIsDeletable(MI_POLICE); + CStreaming::SetModelTxdIsDeletable(MI_POLICE); - /*for (int i = CPools::GetDummyPool()->GetSize() - 1; i >= 0; i--) { + 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(); @@ -154,7 +664,7 @@ CCutsceneMgr::RemoveEverythingBecauseCutsceneDoesntFitInMemory() if (!pBuilding->bImBeingRendered) pBuilding->DeleteRwObject(); } - }*/ + } CPlayerPed *pPlayerPed = FindPlayerPed(); pPlayerPed->RemoveWeaponAnims(0, -1000.0f); @@ -169,69 +679,5 @@ CCutsceneMgr::RemoveEverythingBecauseCutsceneDoesntFitInMemory() } pPlayerPed->ClearWeapons(); - bModelsRemovedForCutscene = true; - //CGame::DrasticTidyUpMemory(true); -} - -void -CCutsceneMgr::LoadEverythingBecauseCutsceneDeletedAllOfIt() -{ - bModelsRemovedForCutscene = false; - CStreaming::LoadInitialPeds(); - CStreaming::LoadInitialWeapons(); - //CStreaming::LoadInitialVehicles(); - - 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; -} - -void -CCutsceneMgr::Update(void) -{ - if (ms_cutsceneLoadStatus != CUTSCENE_NOT_LOADED) - Update_overlay(); -} - -void -CCutsceneMgr::LoadAnimationUncompressed(char const* name) -{ - strcpy(ms_aUncompressedCutsceneAnims[ms_numUncompressedCutsceneAnims], name); - - // Because that's how CAnimManager knows the end of array - ++ms_numUncompressedCutsceneAnims; - assert(ms_numUncompressedCutsceneAnims < ARRAY_SIZE(ms_aUncompressedCutsceneAnims)); - ms_aUncompressedCutsceneAnims[ms_numUncompressedCutsceneAnims][0] = '\0'; -} - - -bool -CCutsceneMgr::IsCutsceneSkipButtonBeingPressed() -{ - return (CPad::GetPad(0)->GetCrossJustDown() - || CPad::GetPad(0)->GetLeftMouseJustDown() - || CPad::GetPad(0)->GetEnterJustDown() - || CPad::GetPad(0)->GetCharJustDown(' ')); -} - -void -CCutsceneMgr::AppendToNextCutscene(const char *object, const char *anim) -{ - strcpy(ms_cAppendObjectName[ms_numAppendObjectNames], object); - strlwr(ms_cAppendObjectName[ms_numAppendObjectNames]); - strcpy(ms_cAppendAnimName[ms_numAppendObjectNames], anim); - strlwr(ms_cAppendAnimName[ms_numAppendObjectNames]); - ms_numAppendObjectNames++; + CGame::DrasticTidyUpMemory(true); } \ No newline at end of file diff --git a/src/animation/CutsceneMgr.h b/src/animation/CutsceneMgr.h index 7c749d4..51ef6c0 100644 --- a/src/animation/CutsceneMgr.h +++ b/src/animation/CutsceneMgr.h @@ -1,69 +1,14 @@ #pragma once #include "CutsceneObject.h" +#define CUTSCENENAMESIZE 8 class CDirectory; class CAnimBlendAssocGroup; class CCutsceneHead; -enum { - CUTSCENE_NOT_LOADED = 0, - CUTSCENE_LOADING, - CUTSCENE_LOADED, -}; - -enum { - CUTSCENE_PLAYING_0 = 0, - CUTSCENE_STARTED, - CUTSCENE_PLAYING_2, - CUTSCENE_PLAYING_3, - CUTSCENE_PLAYING_4, -}; - -enum -{ - NAMELENGTH = 32, - NUM_CUTS_PARTICLE_EFFECTS = 8, - NUM_CUTS_MAX_TEXTS = 64, - NUM_CUTS_UNCOMPRESSED_ANIMS = 8, - TEXT_KEY_SIZE = 8, - CUTSCENENAMESIZE = 8 -}; - -struct sToHideItem -{ - float x, y, z; - char name[NAMELENGTH]; -}; - -// TODO: figure out from SA -// this is unused in LCS anyway -struct sParticleEffect -{ - char name[NAMELENGTH]; - bool bPlayed; // ?? - int iTime; - int unk1; - int unk2; - char name2[NAMELENGTH]; - float x; - float y; - float z; - float unkX; - float unkY; - float unkZ; - bool unk10; - bool unk11; -}; - -struct sAttachInfo -{ - int attachToId, objectId, boneId; -}; - class CCutsceneMgr { - static bool ms_running; static CCutsceneObject *ms_pCutsceneObjects[NUMCUTSCENEOBJECTS]; @@ -79,55 +24,10 @@ class CCutsceneMgr static bool ms_wasCutsceneSkipped; static bool ms_cutsceneProcessing; static bool ms_useCutsceneShadows; - static bool ms_hasFileInfo; - static int ms_numLoadObjectNames; - - static char ms_cAppendAnimName[NUMCUTSCENEOBJECTS][NAMELENGTH]; - static char ms_cAppendObjectName[NUMCUTSCENEOBJECTS][NAMELENGTH]; - static int ms_numAppendObjectNames; public: static CDirectory *ms_pCutsceneDir; static uint32 ms_cutsceneLoadStatus; - static bool mCutsceneSkipFading; - static int mCutsceneSkipFadeTime; - - static float m_fPrevCarDensity; - static float m_fPrevPedDensity; - - static bool m_PrevExtraColourOn; - static uint32 m_PrevExtraColour; - - static uint32 ms_iNumParticleEffects; - static sParticleEffect ms_pParticleEffects[NUM_CUTS_PARTICLE_EFFECTS]; - - static sToHideItem ms_crToHideItems[NUMCUTSCENEOBJECTS]; - static uint32 ms_iNumHiddenEntities; - static CEntity *ms_pHiddenEntities[NUMCUTSCENEOBJECTS]; - - static int ms_numAttachObjectToBones; - static bool ms_bRepeatObject[NUMCUTSCENEOBJECTS]; - - static sAttachInfo ms_iAttachObjectToBone[NUMCUTSCENEOBJECTS]; - - static uint32 ms_numUncompressedCutsceneAnims; - - static char ms_aUncompressedCutsceneAnims[NUM_CUTS_UNCOMPRESSED_ANIMS][NAMELENGTH]; - - static uint32 ms_iTextDuration[NUM_CUTS_MAX_TEXTS]; - static uint32 ms_iTextStartTime[NUM_CUTS_MAX_TEXTS]; - static char ms_cTextOutput[NUM_CUTS_MAX_TEXTS][TEXT_KEY_SIZE]; - - static uint32 ms_currTextOutput; - static uint32 ms_numTextOutput; - static uint32 ms_iModelIndex[NUMCUTSCENEOBJECTS]; - - static char ms_cLoadAnimName[NUMCUTSCENEOBJECTS][NAMELENGTH]; - static char ms_cLoadObjectName[NUMCUTSCENEOBJECTS][NAMELENGTH]; - - static uint32 ms_cutscenePlayStatus; - - static void StartCutscene(); static void StartCutsceneProcessing() { ms_cutsceneProcessing = true; } static bool IsRunning(void) { return ms_running; } static bool HasLoaded(void) { return ms_loaded; } @@ -135,19 +35,19 @@ public: static bool WasCutsceneSkipped(void) { return ms_wasCutsceneSkipped; } static bool UseLodMultiplier(void) { return ms_useLodMultiplier; } static CCutsceneObject* GetCutsceneObject(int id) { return ms_pCutsceneObjects[id]; } - static uint32 GetCutsceneTimeInMilleseconds(void); + static int GetCutsceneTimeInMilleseconds(void) { return 1000.0f * ms_cutsceneTimer; } static char *GetCutsceneName(void) { return ms_cutsceneName; } static void SetCutsceneOffset(const CVector& vec) { ms_cutsceneOffset = vec; } static bool HasCutsceneFinished(void); - static void Initialise(void *dir = nil); + static void Initialise(void); static void Shutdown(void); static void LoadCutsceneData(const char *szCutsceneName); static void FinishCutscene(void); static void SetupCutsceneToStart(void); static void SetCutsceneAnim(const char *animName, CObject *pObject); static void SetCutsceneAnimToLoop(const char *animName); - static CCutsceneHead *SetHeadAnim(const char*, CObject *pObject); + static CCutsceneHead *AddCutsceneHead(CObject *pObject, int modelId); static CCutsceneObject *CreateCutsceneObject(int modelId); static void DeleteCutsceneData(void); static void LoadAnimationUncompressed(char const*); @@ -156,24 +56,6 @@ public: 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 RemoveEverythingBecauseCutsceneDoesntFitInMemory(); - static void LoadEverythingBecauseCutsceneDeletedAllOfIt(); + static void RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver(); static void DisableCutsceneShadows() { ms_useCutsceneShadows = false; } - - - static void LoadCutsceneData_overlay(const char* szCutsceneName); - static bool LoadCutsceneData_postload(bool b = false); - static void Update_overlay(void); - static void DeleteCutsceneData_overlay(void); - - static bool IsCutsceneSkipButtonBeingPressed(); - static void AppendToNextCutscene(const char *object, const char *anim); - - static void LoadCutsceneData_preload(); - static void LoadCutsceneData_loading(); - static void HideRequestedObjects(); - - static bool PresubBodge(); - - static void Write(base::cRelocatableChunkWriter& writer); }; diff --git a/src/animation/CutsceneMgr_overlay.cpp b/src/animation/CutsceneMgr_overlay.cpp deleted file mode 100644 index 5fcb752..0000000 --- a/src/animation/CutsceneMgr_overlay.cpp +++ /dev/null @@ -1,1030 +0,0 @@ -#include "common.h" -#include "relocatableChunk.h" - -#include "General.h" -#include "CutsceneMgr.h" -#include "Directory.h" -#include "Camera.h" -#include "Streaming.h" -#include "FileMgr.h" -#include "main.h" -#include "AnimManager.h" -#include "AnimBlendAssociation.h" -#include "AnimBlendAssocGroup.h" -#include "AnimBlendClumpData.h" -#include "Pad.h" -#include "DMAudio.h" -#include "World.h" -#include "PlayerPed.h" -#include "Wanted.h" -#include "RpAnimBlend.h" -#include "ModelIndices.h" -#include "TempColModels.h" -#include "ColStore.h" -#include "Radar.h" -#include "Pools.h" -#include "Messages.h" -#include "Population.h" -#include "CarCtrl.h" -#include "Timecycle.h" -#include "Rubbish.h" -#include "Text.h" -#include "Hud.h" -#include "crossplatform.h" - -const struct { - const char *szTrackName; - int iTrackId; -} musicNameIdAssoc[] = { - { "BIKER", STREAMED_SOUND_CUTSCENE_BIKER }, - { "BONEVOY", STREAMED_SOUND_CUTSCENE_BONEVOY }, - { "CAMPAIN", STREAMED_SOUND_CUTSCENE_CAMPAIN }, - { "CASHCHP", STREAMED_SOUND_CUTSCENE_CASHCHP }, - { "CONTBAN", STREAMED_SOUND_CUTSCENE_CONTBAN }, - { "CRAZY69", STREAMED_SOUND_CUTSCENE_CRAZY69 }, - { "CUTTEST", STREAMED_SOUND_CUTSCENE_CUTTEST }, - { "DEADLY", STREAMED_SOUND_CUTSCENE_DEADLY }, - { "DONPROB", STREAMED_SOUND_CUTSCENE_DONPROB }, - { "DRIVNMR", STREAMED_SOUND_CUTSCENE_DRIVNMR }, - { "ELECTON", STREAMED_SOUND_CUTSCENE_ELECTON }, - { "FINAL", STREAMED_SOUND_CUTSCENE_FINAL }, - { "FINAL_2", STREAMED_SOUND_CUTSCENE_FINAL_2 }, - { "HOMSWET", STREAMED_SOUND_CUTSCENE_HOMSWET }, - { "HOTWHEL", STREAMED_SOUND_CUTSCENE_HOTWHEL }, - { "KIDNAPP", STREAMED_SOUND_CUTSCENE_KIDNAPP }, - { "LANDGRB", STREAMED_SOUND_CUTSCENE_LANDGRB }, - { "MORGUE", STREAMED_SOUND_CUTSCENE_MORGUE }, - { "OVERDOS", STREAMED_SOUND_CUTSCENE_OVERDOS }, - { "RUFJUST", STREAMED_SOUND_CUTSCENE_RUFJUST }, - { "SAYONAR", STREAMED_SOUND_CUTSCENE_SAYONAR }, - { "SICILAN", STREAMED_SOUND_CUTSCENE_SICILAN }, - { "THEOFER", STREAMED_SOUND_CUTSCENE_THEOFER }, - { "INTRO", STREAMED_SOUND_CUTSCENE_INTRO }, - { "FINALE", STREAMED_SOUND_CUTSCENE_FINALE }, - { NULL, 0 } -}; - -int -FindCutsceneAudioTrackId(const char *szCutsceneName) -{ - debug("looking for cutscene music track\n"); - for (int i = 0; musicNameIdAssoc[i].szTrackName; i++) { - if (!CGeneral::faststricmp(musicNameIdAssoc[i].szTrackName, szCutsceneName)) { - debug("HUZZA! FOUND cutscene music track\n"); - return musicNameIdAssoc[i].iTrackId; - } - } - debug("NOT FOUND cutscene music track\n"); - return -1; -} - -const char * -GetNextLine(const char *buf, char *line, uint32 lineSize) -{ - while (*buf == '\n' || *buf == '\r') - buf++; - - if (*buf == '\0') - return nil; - - // size check never happened, eh? - while (*buf != '\n' && *buf != '\r') { - if (*buf == '\0') - break; - *(line++) = *(buf++); - } - *(line++) = '\0'; - return buf; -} - -RpAtomic* -CalculateBoundingSphereRadiusCB(RpAtomic* atomic, void* data) -{ - float radius = RpAtomicGetBoundingSphere(atomic)->radius; - RwV3d center = RpAtomicGetBoundingSphere(atomic)->center; - - for (RwFrame* frame = RpAtomicGetFrame(atomic); RwFrameGetParent(frame); frame = RwFrameGetParent(frame)) - RwV3dTransformPoints(¢er, ¢er, 1, RwFrameGetMatrix(frame)); - - float size = RwV3dLength(¢er) + radius; - if (size > *(float*)data) - *(float*)data = size; - return atomic; -} - -void UpdateCutsceneObjectBoundingBox(RpClump* clump, int modelId) -{ - if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ10) { - CColModel* pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01]; - float oldRadius = pColModel->boundingSphere.radius; - float radius = 0.0f; - RpClumpForAllAtomics(clump, CalculateBoundingSphereRadiusCB, &radius); - if (oldRadius < 20.0f) oldRadius = 20.0f; - if (oldRadius < radius) { - debug("Limiting cutscene object radius %f\n", oldRadius); - radius = oldRadius; - } - radius = oldRadius; - pColModel->boundingSphere.radius = radius; - pColModel->boundingBox.min = CVector(-radius, -radius, -radius); - pColModel->boundingBox.max = CVector(radius, radius, radius); - } -} - -bool bCamLoaded; -bool bCamFading; - -// yes, they've actually doubled this thing here, thus this one is unused -static bool bModelsRemovedForCutscene; -static int32 NumberOfSavedWeapons; -static eWeaponType SavedWeaponIDs[TOTAL_WEAPON_SLOTS]; -static int32 SavedWeaponAmmo[TOTAL_WEAPON_SLOTS]; - -enum -{ - CUTMODEL_PLAYER = 1, - CUTMODEL_SIMPLE, - CUTMODEL_REPEATED, -}; - -bool CCutsceneMgr::ms_useCutsceneShadows = true; -bool CCutsceneMgr::mCutsceneSkipFading; -int CCutsceneMgr::mCutsceneSkipFadeTime; -float CCutsceneMgr::m_fPrevCarDensity; -float CCutsceneMgr::m_fPrevPedDensity; -bool CCutsceneMgr::m_PrevExtraColourOn; -uint32 CCutsceneMgr::m_PrevExtraColour; -uint32 CCutsceneMgr::ms_iNumParticleEffects; -sParticleEffect CCutsceneMgr::ms_pParticleEffects[NUM_CUTS_PARTICLE_EFFECTS]; -sToHideItem CCutsceneMgr::ms_crToHideItems[NUMCUTSCENEOBJECTS]; -uint32 CCutsceneMgr::ms_iNumHiddenEntities; -CEntity *CCutsceneMgr::ms_pHiddenEntities[NUMCUTSCENEOBJECTS]; -int CCutsceneMgr::ms_numAttachObjectToBones; -bool CCutsceneMgr::ms_bRepeatObject[NUMCUTSCENEOBJECTS]; -sAttachInfo CCutsceneMgr::ms_iAttachObjectToBone[NUMCUTSCENEOBJECTS]; -uint32 CCutsceneMgr::ms_numUncompressedCutsceneAnims; -char CCutsceneMgr::ms_aUncompressedCutsceneAnims[NUM_CUTS_UNCOMPRESSED_ANIMS][NAMELENGTH]; -uint32 CCutsceneMgr::ms_iTextDuration[NUM_CUTS_MAX_TEXTS]; -uint32 CCutsceneMgr::ms_iTextStartTime[NUM_CUTS_MAX_TEXTS]; -char CCutsceneMgr::ms_cTextOutput[NUM_CUTS_MAX_TEXTS][TEXT_KEY_SIZE]; -uint32 CCutsceneMgr::ms_currTextOutput; -uint32 CCutsceneMgr::ms_numTextOutput; -uint32 CCutsceneMgr::ms_iModelIndex[NUMCUTSCENEOBJECTS]; -char CCutsceneMgr::ms_cLoadAnimName[NUMCUTSCENEOBJECTS][NAMELENGTH]; -char CCutsceneMgr::ms_cLoadObjectName[NUMCUTSCENEOBJECTS][NAMELENGTH]; -int CCutsceneMgr::ms_numLoadObjectNames; -CCutsceneObject *CCutsceneMgr::ms_pCutsceneObjects[NUMCUTSCENEOBJECTS]; -int32 CCutsceneMgr::ms_numCutsceneObjs; -CVector CCutsceneMgr::ms_cutsceneOffset; -float CCutsceneMgr::ms_cutsceneTimer; -uint32 CCutsceneMgr::ms_cutscenePlayStatus; -CAnimBlendAssocGroup CCutsceneMgr::ms_cutsceneAssociations; -char CCutsceneMgr::ms_cutsceneName[CUTSCENENAMESIZE]; - -CCutsceneObject * -CCutsceneMgr::CreateCutsceneObject(int modelId) -{ - CBaseModelInfo *pModelInfo; - CColModel *pColModel; - CCutsceneObject *pCutsceneObject; - - CStreaming::ImGonnaUseStreamingMemory(); - debug("Created cutscene object %s\n", CModelInfo::GetModelInfo(modelId)->GetModelName()); - if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ10) { - pModelInfo = CModelInfo::GetModelInfo(modelId); - pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01]; - pModelInfo->SetColModel(pColModel); - UpdateCutsceneObjectBoundingBox((RpClump*)pModelInfo->GetRwObject(), modelId); - } - - pCutsceneObject = new CCutsceneObject(); - pCutsceneObject->SetModelIndex(modelId); - if (ms_useCutsceneShadows) - pCutsceneObject->CreateShadow(); - ms_pCutsceneObjects[ms_numCutsceneObjs++] = pCutsceneObject; - CStreaming::IHaveUsedStreamingMemory(); - return pCutsceneObject; -} - -void -CCutsceneMgr::SetCutsceneAnim(const char *animName, CObject *pObject) -{ - CAnimBlendAssociation *pNewAnim; - CAnimBlendClumpData *pAnimBlendClumpData; - - debug("Give cutscene anim %s\n", animName); - /*assert(RwObjectGetType(pObject->m_rwObject) == rpCLUMP); - debug("Give cutscene anim %s\n", animName); - RpAnimBlendClumpRemoveAllAssociations((RpClump*)pObject->m_rwObject); - - 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->keepCompressed = 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->keepCompressed) - // pAnimBlendClumpData->frames->flag |= AnimBlendFrameData::COMPRESSED; -} - -void -CCutsceneMgr::SetCutsceneAnimToLoop(const char* animName) -{ - ms_cutsceneAssociations.GetAnimation(animName)->flags |= ASSOC_REPEAT; -} - -CCutsceneHead* -CCutsceneMgr::SetHeadAnim(const char*, CObject* pObject) -{ - return nil; -} - -void -CCutsceneMgr::StartCutscene() -{ - ms_cutscenePlayStatus = CUTSCENE_STARTED; - if (bCamLoaded) { - TheCamera.SetWideScreenOn(); - CHud::SetHelpMessage(nil, true); - } -} - -void -CCutsceneMgr::SetupCutsceneToStart(void) -{ - if (bCamLoaded) { - TheCamera.SetCamCutSceneOffSet(ms_cutsceneOffset); - TheCamera.TakeControlWithSpline(JUMP_CUT); - TheCamera.SetWideScreenOn(); - CHud::SetHelpMessage(nil, true); - } - - ms_cutsceneOffset.z += 1.0f; - - for (int i = ms_numCutsceneObjs - 1; i >= 0; i--) { - assert(RwObjectGetType(ms_pCutsceneObjects[i]->m_rwObject) == rpCLUMP); - if (CAnimBlendAssociation *pAnimBlendAssoc = RpAnimBlendClumpGetFirstAssociation((RpClump*)ms_pCutsceneObjects[i]->m_rwObject)) { - assert(pAnimBlendAssoc->hierarchy->sequences[0].HasTranslation()); - if (ms_pCutsceneObjects[i]->m_pAttachTo != nil) { - pAnimBlendAssoc->flags &= (~ASSOC_HAS_TRANSLATION); - } else { - if (pAnimBlendAssoc->hierarchy->IsCompressed()){ - KeyFrameTransCompressed *keyFrames = ((KeyFrameTransCompressed*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrameCompressed(0)); - CVector trans; - keyFrames->GetTranslation(&trans); - ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + trans); - }else{ - KeyFrameTrans *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); - } - CWorld::Add(ms_pCutsceneObjects[i]); - if (RwObjectGetType(ms_pCutsceneObjects[i]->m_rwObject) == rpCLUMP) { - ms_pCutsceneObjects[i]->UpdateRpHAnim(); - } - } - - CTimer::Update(); - CTimer::Update(); - ms_cutsceneTimer = 0.0f; - ms_running = true; - mCutsceneSkipFadeTime = 0; - mCutsceneSkipFading = 0; -} - -void -CCutsceneMgr::FinishCutscene() -{ - if (bCamLoaded) { - ms_cutsceneTimer = TheCamera.GetCutSceneFinishTime() * 0.001f; - TheCamera.FinishCutscene(); - } - - FindPlayerPed()->bIsVisible = true; - CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false); -} - -uint32 -CCutsceneMgr::GetCutsceneTimeInMilleseconds(void) -{ - return 1000.0f * ms_cutsceneTimer; -} - -bool CCutsceneMgr::HasCutsceneFinished(void) -{ - return !bCamLoaded || TheCamera.GetPositionAlongSpline() == 1.0f; -} - -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())->GetModelName(), - // CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName()); -} - -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())->GetModelName(), - // frame, - // CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName()); - if (RwObjectGetType(pObject->m_rwObject) == rpCLUMP) { - RpClump *clump = (RpClump*)pObject->m_rwObject; - if (IsClumpSkinned(clump)) - RpAtomicGetBoundingSphere(GetFirstAtomic(clump))->radius *= 1.1f; - } -} - -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())->GetModelName(), CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName()); -} - -void -CCutsceneMgr::HideRequestedObjects(void) -{ - int num = ms_iNumHiddenEntities; - ms_iNumHiddenEntities = 0; - - for (int i = 0; i < num; i++) { - int id; - if (CModelInfo::GetModelInfo(ms_crToHideItems[i].name, &id)) { - CVector pos(ms_crToHideItems[i].x, ms_crToHideItems[i].y, ms_crToHideItems[i].z); - int16 foundEntities; - CEntity* pEntities[32]; - CWorld::FindObjectsOfTypeInRange(id, pos, 1.5f, true, &foundEntities, 32, pEntities, true, false, false, true, true); - for (int j = 0; i < foundEntities; j++) { - if (pEntities[j]->bIsVisible) { - ms_pHiddenEntities[ms_iNumHiddenEntities] = pEntities[j]; - ms_pHiddenEntities[ms_iNumHiddenEntities]->RegisterReference(&ms_pHiddenEntities[ms_iNumHiddenEntities]); - ms_pHiddenEntities[ms_iNumHiddenEntities]->bIsVisible = false; - ms_iNumHiddenEntities++; - } - } - } - } -} - -bool -CCutsceneMgr::PresubBodge() -{ - return true; -} - -void -CCutsceneMgr::LoadCutsceneData_loading() -{ - for (int i = 0; i < ms_numLoadObjectNames; i++) { - int mi = ms_iModelIndex[i]; - if (mi >= MI_CUTOBJ01 && mi <= MI_CUTOBJ10) { - if (CStreaming::ms_aInfoForModel[mi].m_loadState != STREAMSTATE_LOADED) - return; - } - } - - if (!LoadCutsceneData_postload()) - return; - - CCutsceneObject* cutsceneObject; - for (int i = 0; i < ms_numLoadObjectNames; i++) { - if (!ms_bRepeatObject[i]) - cutsceneObject = CreateCutsceneObject(ms_iModelIndex[i]); - if (ms_cLoadAnimName[i][0] != '\0') - SetCutsceneAnim(ms_cLoadAnimName[i], cutsceneObject); - } - - for (int i = 0; i < ms_numAttachObjectToBones; i++) { - int objectId = ms_iAttachObjectToBone[i].objectId; - int attachToId = ms_iAttachObjectToBone[i].attachToId; - int bone = ms_iAttachObjectToBone[i].boneId; - AttachObjectToBone(ms_pCutsceneObjects[objectId], ms_pCutsceneObjects[attachToId], bone); - } -} - -bool -CCutsceneMgr::LoadCutsceneData_postload(bool b) -{ - RwStream *stream = nil; - uint32 size; - uint32 offset; - - bool result; - - CMessages::ClearThisBigPrintNow(0); - CPopulation::PedDensityMultiplier = 0.0f; - CCarCtrl::CarDensityMultiplier = 0.0f; - CStreaming::ms_disableStreaming = false; - if (b) - { - sprintf(gString, "%s.IFP", ms_cutsceneName); - result = false; - ms_animLoaded = false; - RwStreamClose(stream, nil); // umm... - sprintf(gString, "%s.DAT", ms_cutsceneName); - bCamLoaded = false; - } else { - - stream = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMREAD, "ANIM\\CUTS.IMG"); - sprintf(gString, "%s.IFP", ms_cutsceneName); - if (stream) { - if (ms_pCutsceneDir->FindItem(gString, offset, size)) - { - CStreaming::MakeSpaceFor(size << 11); - CStreaming::ImGonnaUseStreamingMemory(); - RwStreamSkip(stream, offset << 11); - CAnimManager::LoadAnimFile(stream, true, ms_aUncompressedCutsceneAnims); - ms_cutsceneAssociations.CreateAssociations(ms_cutsceneName, ms_cLoadAnimName[0], ms_cLoadObjectName[0], NAMELENGTH); - CStreaming::IHaveUsedStreamingMemory(); - ms_animLoaded = true; - } - else - { - ms_animLoaded = false; - } - RwStreamClose(stream, nil); - - int file = CFileMgr::OpenFile("ANIM\\CUTS.IMG", "rb"); - sprintf(gString, "%s.DAT", ms_cutsceneName); - if (file) { - if (ms_pCutsceneDir->FindItem(gString, offset, size)) - { - CStreaming::ImGonnaUseStreamingMemory(); - CFileMgr::Seek(file, offset << 11, 0); - TheCamera.LoadPathSplines(file); - CStreaming::IHaveUsedStreamingMemory(); - bCamLoaded = true; - } - else - { - bCamLoaded = false; - } - result = true; - CFileMgr::CloseFile(file); - } - else - { - bCamLoaded = false; - result = true; - } - } - else - { - result = false; - ms_animLoaded = false; - RwStreamClose(stream, nil); - sprintf(gString, "%s.DAT", ms_cutsceneName); - bCamLoaded = false; - } - } - ms_cutsceneLoadStatus = CUTSCENE_LOADED; - ms_cutsceneTimer = 0.0f; - FindPlayerPed()->m_pWanted->ClearQdCrimes(); - return result; -} - -void -CCutsceneMgr::LoadCutsceneData_overlay(const char *szCutsceneName) -{ - CTimer::Suspend(); - ms_cutsceneProcessing = true; - ms_wasCutsceneSkipped = false; - if (!bModelsRemovedForCutscene) - CStreaming::RemoveCurrentZonesModels(); - - ms_pCutsceneDir->numEntries = 0; - ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR"); - - CStreaming::RemoveUnusedModelsInLoadedList(); - CGame::DrasticTidyUpMemory(true); - - strcpy(ms_cutsceneName, szCutsceneName); - - LoadCutsceneData_preload(); - CTimer::Resume(); -} - -void -CCutsceneMgr::LoadCutsceneData_preload(void) -{ - uint32 size; - uint32 offset; - CPlayerPed* pPlayerPed; - if (CGeneral::faststricmp(ms_cutsceneName, "finale")) { - DMAudio.ChangeMusicMode(MUSICMODE_CUTSCENE); - int trackId = FindCutsceneAudioTrackId(ms_cutsceneName); - if (trackId != -1) { - printf("Start preload audio %s\n", ms_cutsceneName); - DMAudio.PreloadCutSceneMusic(trackId); - printf("End preload audio %s\n", ms_cutsceneName); - } - } - - for (int i = MI_CUTOBJ01; i <= MI_CUTOBJ10; i++) { - if (CModelInfo::GetModelInfo(i)->GetNumRefs() <= 0) { - if (CStreaming::ms_aInfoForModel[i].m_loadState == STREAMSTATE_LOADED) { - CStreaming::RemoveModel(i); - CModelInfo::GetModelInfo(i)->SetModelName("&*%"); - } - } - } - - m_PrevExtraColour = CTimeCycle::m_ExtraColour; - m_PrevExtraColourOn = CTimeCycle::m_bExtraColourOn != 0; - m_fPrevPedDensity = CPopulation::PedDensityMultiplier; - m_fPrevCarDensity = CCarCtrl::CarDensityMultiplier; - ms_cutsceneOffset = CVector(0.0f, 0.0f, 0.0f); - ms_numTextOutput = 0; - ms_currTextOutput = 0; - ms_numLoadObjectNames = 0; - ms_numUncompressedCutsceneAnims = 0; - ms_numAttachObjectToBones = 0; - ms_iNumHiddenEntities = 0; - bCamFading = false; - ms_iNumParticleEffects = 0; - - for (int i = 0; i < NUM_CUTS_UNCOMPRESSED_ANIMS; i++) - ms_aUncompressedCutsceneAnims[i][0] = '\0'; - - memset(ms_iModelIndex, 0, sizeof(ms_iModelIndex)); - CRubbish::SetVisibility(false); - - pPlayerPed = FindPlayerPed(); - pPlayerPed->m_pWanted->ClearQdCrimes(); - pPlayerPed->bIsVisible = false; - pPlayerPed->m_fCurrentStamina = pPlayerPed->m_fMaxStamina; - CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_CUTSCENE); - CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(true); - - sprintf(gString, "%s.CUT", ms_cutsceneName); - if (!ms_pCutsceneDir->FindItem(gString, offset, size)) { - LoadCutsceneData_postload(); - return; - } - - size <<= 11; - offset <<= 11; - - char *cutsBuf = new char[size]; - - RwStream* stream = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMREAD, "ANIM\\CUTS.IMG"); - - if (stream) { - RwStreamSkip(stream, offset); - RwStreamRead(stream, cutsBuf, size); - RwStreamClose(stream, nil); - } - - enum - { - CUT_NONE = 0, - CUT_INFO, - CUT_MODEL, - CUT_TEXT, - CUT_UNCOMPRESS, - CUT_ATTACH, - CUT_REMOVE, - CUT_PARTICLE_EFFECT, - CUT_EXTRA_COLOR, - }; - - int cutSection = CUT_NONE; - bool bExtraColSet = false; - - char line[1024]; - const char *pCurLine = cutsBuf; - - while (true) - { - pCurLine = GetNextLine(pCurLine, line, sizeof(line)); - if (pCurLine) { - if (line[0] == '\0') - break; - - if (strcmp(line, "end") == 0) { - cutSection = CUT_NONE; - continue; - } - - switch (cutSection) - { - case CUT_NONE: - if (strcmp(line, "info") == 0) - cutSection = CUT_INFO; - if (strcmp(line, "model") == 0) - cutSection = CUT_MODEL; - if (strcmp(line, "text") == 0) - cutSection = CUT_TEXT; - if (strcmp(line, "uncompress") == 0) - cutSection = CUT_UNCOMPRESS; - if (strcmp(line, "attach") == 0) - cutSection = CUT_ATTACH; - if (strcmp(line, "remove") == 0) - cutSection = CUT_REMOVE; - if (strcmp(line, "peffect") == 0) - cutSection = CUT_PARTICLE_EFFECT; - if (strcmp(line, "extracol") == 0) - cutSection = CUT_EXTRA_COLOR; - break; - case CUT_INFO: - { - if (strncmp(line, "offset", 6) == 0) { - float x, y, z; - sscanf(line+7, "%f %f %f", &x, &y, &z); - FindPlayerPed(); // called for some sa check in here - ms_cutsceneOffset = CVector(x, y, z); - } - break; - } - case CUT_MODEL: - { - char objectName[NAMELENGTH]; - char animName[NAMELENGTH]; - - int num; // unused - sscanf(strtok(line, " ,"), "%d", &num); - strcpy(objectName, strtok(nil, " ,")); - char* pAnimName = strtok(0, " ,"); - strlwr(objectName); - - bool bUsedFirstTime = true; - if (pAnimName) { - do { - strcpy(animName, pAnimName); - strlwr(animName); - strcpy(ms_cLoadObjectName[ms_numLoadObjectNames], objectName); - strcpy(ms_cLoadAnimName[ms_numLoadObjectNames], animName); - if (bUsedFirstTime) { - bUsedFirstTime = false; - ms_iModelIndex[ms_numLoadObjectNames] = CUTMODEL_SIMPLE; - ms_bRepeatObject[ms_numLoadObjectNames] = false; - } else { - ms_bRepeatObject[ms_numLoadObjectNames] = true; - ms_iModelIndex[ms_numLoadObjectNames] = CUTMODEL_REPEATED; - } - ms_numLoadObjectNames++; - pAnimName = strtok(0, " ,"); - } while (pAnimName); - } - break; - } - case CUT_TEXT: - { - int iTextStartTime, iTextDuration; - char cTextOutput[8]; - sscanf(line, "%d,%d,%s", &iTextStartTime, &iTextDuration, cTextOutput); - for (size_t i = 0; i < strlen(cTextOutput); i++) - cTextOutput[i] = toupper(cTextOutput[i]); - - memcpy(ms_cTextOutput[ms_numTextOutput], cTextOutput, strlen(cTextOutput)+1); - ms_iTextStartTime[ms_numTextOutput] = iTextStartTime; - ms_iTextDuration[ms_numTextOutput] = iTextDuration; - ms_numTextOutput++; - break; - } - case CUT_UNCOMPRESS: - LoadAnimationUncompressed(strtok(line, " ,")); - break; - case CUT_ATTACH: - { - int attachToId, objectId, bone; - sscanf(line, "%d,%d,%d", &attachToId, &objectId, &bone); - ms_iAttachObjectToBone[ms_numAttachObjectToBones].attachToId = attachToId; - ms_iAttachObjectToBone[ms_numAttachObjectToBones].objectId = objectId; - ms_iAttachObjectToBone[ms_numAttachObjectToBones].boneId = bone; - ms_numAttachObjectToBones++; - break; - } - case CUT_REMOVE: - { - float x, y, z; - char name[NAMELENGTH]; - sscanf(line, "%f,%f,%f,%s", &x, &y, &z, name); - ms_crToHideItems[ms_iNumHiddenEntities].x = x; - ms_crToHideItems[ms_iNumHiddenEntities].y = y; - ms_crToHideItems[ms_iNumHiddenEntities].z = z; - strcpy(ms_crToHideItems[ms_iNumHiddenEntities].name, name); - ms_iNumHiddenEntities++; - break; - } - case CUT_PARTICLE_EFFECT: - { - char name[NAMELENGTH]; - char name2[NAMELENGTH]; - - int iTime; - int unk1; - int unk2; - float x; - float y; - float z; - float unkX; - float unkY; - float unkZ; - - memset(name, 0, NAMELENGTH); - memset(name2, 0, NAMELENGTH); - - strncpy(name, strtok(line, ","), NAMELENGTH-1); - iTime = atoi(strtok(0, ",")); - unk1 = atoi(strtok(0, ",")); - unk2 = atoi(strtok(0, ",")); - strncpy(name, strtok(line, ","), NAMELENGTH-1); - x = strtod(strtok(0, ","), nil); - y = strtod(strtok(0, ","), nil); - z = strtod(strtok(0, ","), nil); - unkX = strtod(strtok(0, ","), nil); - unkY = strtod(strtok(0, ","), nil); - unkZ = strtod(strtok(0, ","), nil); - - ms_pParticleEffects[ms_iNumParticleEffects].bPlayed = false; - ms_pParticleEffects[ms_iNumParticleEffects].iTime = iTime; - ms_pParticleEffects[ms_iNumParticleEffects].unk1 = unk1; - ms_pParticleEffects[ms_iNumParticleEffects].unk2 = unk2; - strcpy(CCutsceneMgr::ms_pParticleEffects[ms_iNumParticleEffects].name2, name2); - ms_pParticleEffects[ms_iNumParticleEffects].unk10 = false; - ms_pParticleEffects[ms_iNumParticleEffects].x = x; - ms_pParticleEffects[ms_iNumParticleEffects].y = y; - ms_pParticleEffects[ms_iNumParticleEffects].z = z; - ms_pParticleEffects[ms_iNumParticleEffects].unkX = unkX; - ms_pParticleEffects[ms_iNumParticleEffects].unkY = unkY; - ms_pParticleEffects[ms_iNumParticleEffects].unkZ = unkZ; - ms_pParticleEffects[ms_iNumParticleEffects].unk11 = false; - strcpy(CCutsceneMgr::ms_pParticleEffects[ms_iNumParticleEffects].name, name); - ms_iNumParticleEffects++; - break; - } - case CUT_EXTRA_COLOR: - if (!bExtraColSet) { - int colorId; - sscanf(line, "%d", &colorId); - if (colorId == 0) - bExtraColSet = false; - else { - CTimeCycle::StartExtraColour(colorId - 1, false); - bExtraColSet = true; - } - } - break; - default: - break; - }; - - } - else - { - delete[]cutsBuf; - - // add manually inserted objects - for (int i = 0; i < ms_numAppendObjectNames; i++) { - strcpy(ms_cLoadObjectName[ms_numLoadObjectNames], ms_cAppendObjectName[i]); - strcpy(ms_cLoadAnimName[ms_numLoadObjectNames], ms_cAppendAnimName[i]); - ms_iModelIndex[ms_numLoadObjectNames] = CUTMODEL_SIMPLE; - ms_numLoadObjectNames++; - } - ms_numAppendObjectNames = 0; - - int specialId = 0; - for (int i = 0; i < ms_numLoadObjectNames; i++) - { - if (strcasecmp(ms_cLoadObjectName[i], "csplay") == 0) { - ms_iModelIndex[i] = CUTMODEL_PLAYER; - continue; - } else if (ms_iModelIndex[i] == CUTMODEL_SIMPLE) { - int id; - if (CModelInfo::GetModelInfo(ms_cLoadObjectName[i], &id)) { - ms_iModelIndex[i] = id; - CStreaming::RequestModel(id, STREAMFLAGS_SCRIPTOWNED | STREAMFLAGS_DEPENDENCY | STREAMFLAGS_PRIORITY); - } else { - CStreaming::RequestSpecialModel(specialId + MI_CUTOBJ01, ms_cLoadObjectName[i], STREAMFLAGS_SCRIPTOWNED | STREAMFLAGS_DEPENDENCY | STREAMFLAGS_PRIORITY); - ms_iModelIndex[i] = specialId + MI_CUTOBJ01; - specialId++; - // skip if id is busy - while (CStreaming::ms_aInfoForModel[specialId + MI_CUTOBJ01].m_loadState == STREAMSTATE_LOADED) - specialId++; - } - } - else if (ms_iModelIndex[i] == CUTMODEL_REPEATED && i != 0) - ms_iModelIndex[i] = ms_iModelIndex[i - 1]; - } - - CStreaming::LoadAllRequestedModels(true); - ms_cutsceneLoadStatus = CUTSCENE_LOADING; - return; - } - } - - delete[]cutsBuf; - LoadCutsceneData_postload(true); -} - -void -CCutsceneMgr::DeleteCutsceneData_overlay(void) -{ - if (ms_cutsceneLoadStatus == CUTSCENE_NOT_LOADED) return; - CTimer::Suspend(); - CPopulation::PedDensityMultiplier = m_fPrevPedDensity; - CCarCtrl::CarDensityMultiplier = m_fPrevCarDensity; - if (m_PrevExtraColourOn) - CTimeCycle::StartExtraColour(m_PrevExtraColour, false); - else - CTimeCycle::StopExtraColour(m_PrevExtraColourOn); - - for (uint32 i = 0; i < ms_iNumHiddenEntities; i++) { - if (ms_pHiddenEntities[i]) { - ms_pHiddenEntities[i]->CleanUpOldReference(&ms_pHiddenEntities[i]); - ms_pHiddenEntities[i]->bIsVisible = true; - } - } - - ms_iNumHiddenEntities = 0; - ms_iNumParticleEffects = 0; - CMessages::ClearMessages(); - CRubbish::SetVisibility(true); - - ms_cutsceneProcessing = false; - ms_useLodMultiplier = false; - ms_useCutsceneShadows = false; - - ms_numCutsceneObjs--; - while (ms_numCutsceneObjs >= 0) { - CWorld::Remove(ms_pCutsceneObjects[ms_numCutsceneObjs]); - ms_pCutsceneObjects[ms_numCutsceneObjs]->DeleteRwObject(); - delete ms_pCutsceneObjects[ms_numCutsceneObjs]; - ms_pCutsceneObjects[ms_numCutsceneObjs] = nil; - ms_numCutsceneObjs--; - } - ms_numCutsceneObjs = 0; - - if (ms_animLoaded) - CAnimManager::RemoveLastAnimFile(); - - ms_animLoaded = false; - ms_cutsceneAssociations.DestroyAssociations(); - - ms_aUncompressedCutsceneAnims[0][0] = '\0'; - ms_numUncompressedCutsceneAnims = 0; - - if (bCamLoaded) { - TheCamera.RestoreWithJumpCut(); - TheCamera.SetWideScreenOff(); - TheCamera.DeleteCutSceneCamDataMemory(); - } - ms_cutsceneLoadStatus = CUTSCENE_NOT_LOADED; - ms_running = false; - - FindPlayerPed()->bIsVisible = true; - CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_CUTSCENE); - CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false); - - if (CGeneral::faststricmp(ms_cutsceneName, "finale")) { - DMAudio.StopCutSceneMusic(); - DMAudio.ChangeMusicMode(MUSICMODE_GAME); - } - - CStreaming::ms_disableStreaming = false; - CWorld::bProcessCutsceneOnly = false; - - //if(bCamLoaded) - // CGame::DrasticTidyUpMemory(TheCamera.GetScreenFadeStatus() == FADE_2); - - CPad::GetPad(0)->Clear(false); - - if (bModelsRemovedForCutscene) { - CStreaming::LoadInitialPeds(); - CStreaming::LoadInitialWeapons(); - CStreaming::LoadInitialVehicles(); - bModelsRemovedForCutscene = 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; - } - - for (int i = 0; i < ms_numLoadObjectNames; i++) - CStreaming::SetMissionDoesntRequireModel(ms_iModelIndex[i]); - - CStreaming::SetMissionDoesntRequireModel(MI_COP); - CStreaming::StreamZoneModels(FindPlayerCoors()); - CTimer::Resume(); -} - -void -CCutsceneMgr::Update_overlay(void) -{ - if (ms_cutsceneLoadStatus == CUTSCENE_LOADING) { - debug("Loading Cutscene...\n"); - CTimer::Suspend(); - LoadCutsceneData_loading(); - CTimer::Resume(); - return; - } - - if (ms_cutsceneLoadStatus != CUTSCENE_LOADED) { - debug("Cutscene Not Loaded!\n"); - return; - } - - switch (ms_cutscenePlayStatus) { - case CUTSCENE_STARTED: - SetupCutsceneToStart(); - HideRequestedObjects(); - ms_cutscenePlayStatus++; - break; - case CUTSCENE_PLAYING_2: - case CUTSCENE_PLAYING_3: - ms_cutscenePlayStatus++; - break; - case CUTSCENE_PLAYING_4: - ms_cutscenePlayStatus = CUTSCENE_PLAYING_0; - if (CGeneral::faststricmp(ms_cutsceneName, "finale")) - DMAudio.PlayPreloadedCutSceneMusic(); - break; - default: - break; - } - - if (!ms_running) return; - - ms_cutsceneTimer += CTimer::GetTimeStepNonClippedInSeconds(); - uint32 cutsceneTimeInMS = GetCutsceneTimeInMilleseconds(); - - if (ms_currTextOutput < ms_numTextOutput && cutsceneTimeInMS > ms_iTextStartTime[ms_currTextOutput]) { - CMessages::AddMessageJumpQ(TheText.Get(ms_cTextOutput[ms_currTextOutput]), ms_iTextDuration[ms_currTextOutput], 1); - ms_currTextOutput++; - } - - for (int i = 0; i < ms_numCutsceneObjs; i++) { - int modelId = ms_pCutsceneObjects[i]->GetModelIndex(); - if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ10) - UpdateCutsceneObjectBoundingBox(ms_pCutsceneObjects[i]->GetClump(), modelId); - } - - if (!bCamLoaded) return; - - if (CGeneral::faststricmp(ms_cutsceneName, "finale") && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FLYBY && ms_cutsceneLoadStatus == CUTSCENE_LOADED) { - if (TheCamera.GetCutSceneFinishTime() < cutsceneTimeInMS + 1000) { - if (!bCamFading) { - bCamFading = true; - TheCamera.Fade(1.0f, FADE_OUT); - } - } - if (mCutsceneSkipFading) { - mCutsceneSkipFadeTime -= CTimer::GetTimeStepInMilliseconds(); - if (mCutsceneSkipFadeTime < 0) { - CHud::m_BigMessage[1][0] = '\0'; - ms_wasCutsceneSkipped = true; - FinishCutscene(); - mCutsceneSkipFading = false; - mCutsceneSkipFadeTime = 0; - } - } - else if (IsCutsceneSkipButtonBeingPressed() && PresubBodge()){ - mCutsceneSkipFading = true; - mCutsceneSkipFadeTime = 1000; - TheCamera.Fade(1.0f, FADE_OUT); - } - } -} \ No newline at end of file diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index f3d41b8..7469f57 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -4366,18 +4366,14 @@ cAudioManager::ProcessPedOneShots(cPedParams ¶ms) if (weaponType == WEAPONTYPE_BRASSKNUCKLE) { CPed* ped = params.m_pPed; uint32 fightMove = ped->m_curFightMove; - // LCS:removed for now - //if (fightMove == FIGHTMOVE_BACKLEFT || fightMove == FIGHTMOVE_STDPUNCH || fightMove == FIGHTMOVE_PUNCH || - if ( + if (fightMove == FIGHTMOVE_BACKLEFT || fightMove == FIGHTMOVE_STDPUNCH || fightMove == FIGHTMOVE_PUNCH || ped->m_nPedState == PED_ATTACK) { CEntity* damageEntity = ped->m_pDamageEntity; if (!damageEntity) m_sQueueSample.m_nSampleIndex = m_anRandomTable[3] % 2 + SFX_HAMMER_HIT_1; else if (damageEntity->GetType() != ENTITY_TYPE_PED) m_sQueueSample.m_nSampleIndex = m_anRandomTable[3] % 2 + SFX_HAMMER_HIT_1; - // LCS:removed for now - //else if (((CPed*)damageEntity)->m_curFightMove != FIGHTMOVE_HITHEAD) - else if(1) + else if (((CPed*)damageEntity)->m_curFightMove != FIGHTMOVE_HITHEAD) m_sQueueSample.m_nSampleIndex = m_anRandomTable[3] % 2 + SFX_HAMMER_HIT_1; else m_sQueueSample.m_nSampleIndex = SFX_HAMMER_HIT_1; @@ -5303,7 +5299,6 @@ cAudioManager::GetPedCommentSfx(CPed *ped, int32 sound) case MI_MEDIC: return GetMedicTalkSfx(ped, sound); case MI_FIREMAN: return GetFiremanTalkSfx(ped, sound); case MI_MALE01: return GetDefaultTalkSfx(ped, sound); -/* LCS: removed for now case MI_HFYST: return GetHFYSTTalkSfx(ped, sound); case MI_HFOST: return GetHFOSTTalkSfx(ped, sound); case MI_HMYST: return GetHMYSTTalkSfx(ped, sound); @@ -5392,7 +5387,6 @@ cAudioManager::GetPedCommentSfx(CPed *ped, int32 sound) case MI_BKB: return GetBKTalkSfx(ped, sound); case MI_PGA: case MI_PGB: return GetPGTalkSfx(ped, sound); -*/ case MI_VICE1: case MI_VICE2: case MI_VICE3: @@ -7576,8 +7570,7 @@ cAudioManager::GetSGTalkSfx(CPed *ped, int16 sound) case SOUND_PED_CHAT: GetPhrase(sfx, ped->m_lastComment, 1064, 12); break; default: return GetGenericMaleTalkSfx(ped, sound); } -// LCS removed for now -// if(ped->GetModelIndex() == MI_SGB) sfx += 93; + if(ped->GetModelIndex() == MI_SGB) sfx += 93; return sfx; } @@ -9313,8 +9306,7 @@ cAudioManager::ProcessBridge() void cAudioManager::ProcessBridgeWarning() { - // TODO: LCS -/* if (CStats::CommercialPassed && m_sQueueSample.m_fDistance < 450.f) { + if (CStats::CommercialPassed && m_sQueueSample.m_fDistance < 450.f) { m_sQueueSample.m_nVolume = ComputeVolume(100, 450.f, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 0; @@ -9335,7 +9327,7 @@ cAudioManager::ProcessBridgeWarning() m_sQueueSample.m_bRequireReflection = false; AddSampleToRequestedQueue(); } - }*/ + } } void @@ -9411,7 +9403,7 @@ struct MissionAudioData { const MissionAudioData MissionAudioNameSfxAssoc[] = { - /*{"mobring", STREAMED_SOUND_MISSION_MOBR1}, {"pagring", STREAMED_SOUND_MISSION_PAGER}, {"carrev", STREAMED_SOUND_MISSION_CARREV}, + {"mobring", STREAMED_SOUND_MISSION_MOBR1}, {"pagring", STREAMED_SOUND_MISSION_PAGER}, {"carrev", STREAMED_SOUND_MISSION_CARREV}, {"bikerev", STREAMED_SOUND_MISSION_BIKEREV}, {"liftop", STREAMED_SOUND_MISSION_LIFTOP}, {"liftcl", STREAMED_SOUND_MISSION_LIFTCL}, {"liftrun", STREAMED_SOUND_MISSION_LIFTRUN}, {"liftbel", STREAMED_SOUND_MISSION_LIFTBEL}, {"inlift", STREAMED_SOUND_MISSION_INLIFT}, {"caml", STREAMED_SOUND_MISSION_CAMERAL}, {"camr", STREAMED_SOUND_MISSION_CAMERAR}, {"cheer1", STREAMED_SOUND_MISSION_CHEER1}, @@ -9784,7 +9776,7 @@ const MissionAudioData MissionAudioNameSfxAssoc[] = { {"bust_18", STREAMED_SOUND_MISSION_BUST_18}, {"bust_19", STREAMED_SOUND_MISSION_BUST_19}, {"bust_20", STREAMED_SOUND_MISSION_BUST_20}, {"bust_21", STREAMED_SOUND_MISSION_BUST_21}, {"bust_22", STREAMED_SOUND_MISSION_BUST_22}, {"bust_23", STREAMED_SOUND_MISSION_BUST_23}, {"bust_24", STREAMED_SOUND_MISSION_BUST_24}, {"bust_25", STREAMED_SOUND_MISSION_BUST_25}, {"bust_26", STREAMED_SOUND_MISSION_BUST_26}, - {"bust_27", STREAMED_SOUND_MISSION_BUST_27}, {"bust_28", STREAMED_SOUND_MISSION_BUST_28}, */ {nil, 0} }; + {"bust_27", STREAMED_SOUND_MISSION_BUST_27}, {"bust_28", STREAMED_SOUND_MISSION_BUST_28}, {nil, 0} }; int32 FindMissionAudioSfx(const char *name) @@ -9851,8 +9843,8 @@ cAudioManager::PlayLoadedMissionAudio(uint8 slot) bool cAudioManager::ShouldDuckMissionAudio(uint8 slot) const { - //if (IsMissionAudioSamplePlaying(slot)) - // return m_sMissionAudio.m_nSampleIndex[slot] != STREAMED_SOUND_MISSION_ROK2_01; + if (IsMissionAudioSamplePlaying(slot)) + return m_sMissionAudio.m_nSampleIndex[slot] != STREAMED_SOUND_MISSION_ROK2_01; return false; } @@ -9951,11 +9943,11 @@ cAudioManager::ProcessMissionAudioSlot(uint8 slot) if (m_nUserPause) SampleManager.PauseStream(1, slot + 1); if (m_sMissionAudio.m_bPredefinedProperties[slot]) { - //if (m_sMissionAudio.m_nSampleIndex[slot] == STREAMED_SOUND_MISSION_CAMERAL) - // SampleManager.SetStreamedVolumeAndPan(80, 0, 1, slot + 1); - //else if (m_sMissionAudio.m_nSampleIndex[slot] == STREAMED_SOUND_MISSION_CAMERAR) - // SampleManager.SetStreamedVolumeAndPan(80, 127, 1, slot + 1); - //else + if (m_sMissionAudio.m_nSampleIndex[slot] == STREAMED_SOUND_MISSION_CAMERAL) + SampleManager.SetStreamedVolumeAndPan(80, 0, 1, slot + 1); + else if (m_sMissionAudio.m_nSampleIndex[slot] == STREAMED_SOUND_MISSION_CAMERAR) + SampleManager.SetStreamedVolumeAndPan(80, 127, 1, slot + 1); + else SampleManager.SetStreamedVolumeAndPan(80, 63, 1, slot + 1); } else { distSquared = GetDistanceSquared(m_sMissionAudio.m_vecPos[slot]); @@ -9977,8 +9969,8 @@ cAudioManager::ProcessMissionAudioSlot(uint8 slot) } m_sMissionAudio.m_nPlayStatus[slot] = PLAY_STATUS_PLAYING; nCheckPlayingDelay[slot] = 30; - //if (m_sMissionAudio.m_nSampleIndex[slot] >= STREAMED_SOUND_MISSION_MOB_01A && m_sMissionAudio.m_nSampleIndex[slot] <= STREAMED_SOUND_MISSION_MOB_99A) - // m_sMissionAudio.m_bIsMobile[slot] = true; + if (m_sMissionAudio.m_nSampleIndex[slot] >= STREAMED_SOUND_MISSION_MOB_01A && m_sMissionAudio.m_nSampleIndex[slot] <= STREAMED_SOUND_MISSION_MOB_99A) + m_sMissionAudio.m_bIsMobile[slot] = true; break; case PLAY_STATUS_PLAYING: if (m_bTimerJustReset) { @@ -10021,12 +10013,12 @@ cAudioManager::ProcessMissionAudioSlot(uint8 slot) SampleManager.SetStreamedVolumeAndPan(emittingVol, pan, 1, slot + 1); } } - //} else if (m_sMissionAudio.m_nSampleIndex[slot] == STREAMED_SOUND_MISSION_ROK2_01) { - // m_sMissionAudio.m_nPlayStatus[slot] = PLAY_STATUS_STOPPED; + } else if (m_sMissionAudio.m_nSampleIndex[slot] == STREAMED_SOUND_MISSION_ROK2_01) { + m_sMissionAudio.m_nPlayStatus[slot] = PLAY_STATUS_STOPPED; } else { m_sMissionAudio.m_nPlayStatus[slot] = PLAY_STATUS_FINISHED; - //if (m_sMissionAudio.m_nSampleIndex[slot] >= STREAMED_SOUND_MISSION_MOB_01A && m_sMissionAudio.m_nSampleIndex[slot] <= STREAMED_SOUND_MISSION_MOB_99A) - // m_sMissionAudio.m_bIsMobile[slot] = false; + if (m_sMissionAudio.m_nSampleIndex[slot] >= STREAMED_SOUND_MISSION_MOB_01A && m_sMissionAudio.m_nSampleIndex[slot] <= STREAMED_SOUND_MISSION_MOB_99A) + m_sMissionAudio.m_bIsMobile[slot] = false; m_sMissionAudio.m_nSampleIndex[slot] = NO_SAMPLE; SampleManager.StopStreamedFile(slot + 1); m_sMissionAudio.m_nMissionAudioCounter[slot] = 0; diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 2eb2220..14eacda 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -466,7 +466,7 @@ public: void ProcessScriptObject(int32 id); // done void ProcessSpecial(); // done #ifdef GTA_TRAIN - bool ProcessTrainNoise(cVehicleParams ¶ms); //done(bcs not exists in VC) + bool ProcessTrainNoise(cVehicleParams *params); //done(bcs not exists in VC) #endif void ProcessVehicle(CVehicle *vehicle); // done bool ProcessVehicleDoors(cVehicleParams ¶ms); // done @@ -544,8 +544,8 @@ public: #endif }; -//#ifdef AUDIO_MSS -//static_assert(sizeof(cAudioManager) == 0x5558, "cAudioManager: error"); -//#endif +#ifdef AUDIO_MSS +static_assert(sizeof(cAudioManager) == 0x5558, "cAudioManager: error"); +#endif extern cAudioManager AudioManager; diff --git a/src/audio/AudioSamples.h b/src/audio/AudioSamples.h index 403ef68..5c5d857 100644 --- a/src/audio/AudioSamples.h +++ b/src/audio/AudioSamples.h @@ -814,8 +814,4 @@ enum eSfxSample SAMPLEBANK_PED_START = SFX_FOOTSTEP_SAND_4 + 1, SAMPLEBANK_PED_END = 9940, SAMPLEBANK_PED_MAX = SAMPLEBANK_PED_END + 1, - - // LCS: TODO - SFX_TRAIN_FAR = NO_SAMPLE, - SFX_TRAIN_NEAR = NO_SAMPLE, }; diff --git a/src/audio/MusicManager.cpp b/src/audio/MusicManager.cpp index 34eae77..f2e3cfd 100644 --- a/src/audio/MusicManager.cpp +++ b/src/audio/MusicManager.cpp @@ -164,8 +164,8 @@ cMusicManager::SetStartingTrackPositions(uint8 isNewGameTimer) if (i < STREAMED_SOUND_CITY_AMBIENT && isNewGameTimer) m_aTracks[i].m_nPosition = NewGameRadioTimers[i]; - //else if (i < STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED) - // m_aTracks[i].m_nPosition = (pos * AudioManager.GetRandomNumber(i % 5)) % m_aTracks[i].m_nLength; + else if (i < STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED) + m_aTracks[i].m_nPosition = (pos * AudioManager.GetRandomNumber(i % 5)) % m_aTracks[i].m_nLength; else m_aTracks[i].m_nPosition = 0; @@ -578,7 +578,7 @@ cMusicManager::ServiceGameMode() if (!m_bRadioStreamReady) { if(vehicle == nil) { - m_nFrontendTrack = STREAMED_SOUND_RADIO_LCFR; // huh? + m_nFrontendTrack = STREAMED_SOUND_RADIO_WAVE; // huh? return; } if(m_bRadioSetByScript) { @@ -751,7 +751,7 @@ cMusicManager::SetUpCorrectAmbienceTrack() else if (TheCamera.DistanceToWater <= 90.0f) { if (CCullZones::bAtBeachForAudio) { if (CWeather::OldWeatherType != WEATHER_HURRICANE && CWeather::NewWeatherType != WEATHER_HURRICANE || CWeather::Wind <= 1.0f) - m_nFrontendTrack = STREAMED_SOUND_SAWMILL; + m_nFrontendTrack = STREAMED_SOUND_BEACH_AMBIENT; else m_nFrontendTrack = STREAMED_SOUND_HAVANA_BEACH_AMBIENT; } @@ -1299,12 +1299,31 @@ cMusicManager::DisplayRadioStationName() case RADIO_ESPANTOSO: string = TheText.Get("FEA_FM6"); break; case EMOTION: string = TheText.Get("FEA_FM7"); break; case WAVE: string = TheText.Get("FEA_FM8"); break; - case 9: string = TheText.Get("FEA_FM9"); break; - case 10: + case USERTRACK: if (!SampleManager.IsMP3RadioChannelAvailable()) return; string = TheText.Get("FEA_MP3"); break; - default: string = TheText.Get("FEA_NON"); break; +#ifdef RADIO_OFF_TEXT + case STREAMED_SOUND_RADIO_POLICE: + case STREAMED_SOUND_RADIO_TAXI: + return; + default: { + // Otherwise pausing-resuming game will show RADIO OFF, since radio isn't set yet + if (m_nPlayingTrack == NO_TRACK && m_nFrontendTrack == NO_TRACK) + return; + + extern wchar WideErrorString[]; + + string = TheText.Get("FEA_NON"); + if (string == WideErrorString) { + pCurrentStation = nil; + return; + } + break; + } +#else + default: return; +#endif }; if (pCurrentStation != string) { @@ -1318,22 +1337,21 @@ cMusicManager::DisplayRadioStationName() CFont::SetJustifyOff(); CFont::SetBackgroundOff(); - CFont::SetDropShadowPosition(2); - CFont::SetScale(PSP_SCREEN_SCALE_X(0.5f), PSP_SCREEN_SCALE_Y(0.88f)); + CFont::SetScale(SCREEN_SCALE_X(0.8f), SCREEN_SCALE_Y(1.35f)); CFont::SetPropOn(); - CFont::SetFontStyle(FONT_BANK); + CFont::SetFontStyle(FONT_STANDARD); CFont::SetCentreOn(); - CFont::SetCentreSize(PSP_SCREEN_SCALE_X(260.0f)); - CFont::SetDropColor(CRGBA(0, 0, 0, 255)); + CFont::SetCentreSize(SCREEN_STRETCH_X(DEFAULT_SCREEN_WIDTH)); + CFont::SetColor(CRGBA(0, 0, 0, 255)); + CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), SCREEN_SCALE_Y(22.0f) + SCREEN_SCALE_Y(2.0f), pCurrentStation); if (gNumRetunePresses) - CFont::SetColor(CRGBA(77, 155, 210, 255)); + CFont::SetColor(CRGBA(102, 133, 143, 255)); else - CFont::SetColor(CRGBA(77, 155, 210, 255)); + CFont::SetColor(CRGBA(147, 196, 211, 255)); - CFont::PrintString(SCREEN_WIDTH / 2, PSP_SCREEN_SCALE_Y(7.0f), pCurrentStation); + CFont::PrintString(SCREEN_WIDTH / 2, SCREEN_SCALE_Y(22.0f), pCurrentStation); CFont::DrawFonts(); - CFont::SetCentreSize(SCREEN_STRETCH_X(DEFAULT_SCREEN_WIDTH)); } } // Always show station text after entering car. Same behaviour as III and SA. @@ -1364,7 +1382,7 @@ cMusicManager::UsesPoliceRadio(CVehicle *veh) bool cMusicManager::UsesTaxiRadio(CVehicle *veh) { - if (veh->GetModelIndex() != MI_CABBIE) return false; + if (veh->GetModelIndex() != MI_KAUFMAN) return false; return CTheScripts::bPlayerHasMetDebbieHarry; } diff --git a/src/audio/PoliceRadio.cpp b/src/audio/PoliceRadio.cpp index b8f44f6..227d27d 100644 --- a/src/audio/PoliceRadio.cpp +++ b/src/audio/PoliceRadio.cpp @@ -547,7 +547,8 @@ cAudioManager::SetupSuspectLastSeenReport() break; case MI_TAXI: case MI_CABBIE: - case MI_BORGNINE: + case MI_ZEBRA: + case MI_KAUFMAN: sample = SFX_POLICE_RADIO_TAXI; break; case MI_BOBCAT: diff --git a/src/audio/audio_enums.h b/src/audio/audio_enums.h index cd3e2e4..990b2d7 100644 --- a/src/audio/audio_enums.h +++ b/src/audio/audio_enums.h @@ -12,8 +12,8 @@ enum eRadioStation EMOTION, WAVE, USERTRACK, - NUM_RADIOS = 11, - POLICE_RADIO = 11, + NUM_RADIOS = 10, + POLICE_RADIO = 10, RADIO_OFF = 10, //TAXI_RADIO, }; @@ -38,72 +38,1230 @@ enum ePlayerMood enum eStreamedSounds { - STREAMED_SOUND_RADIO_HEAD, - STREAMED_SOUND_RADIO_DOUBLE, - STREAMED_SOUND_RADIO_KJAH, - STREAMED_SOUND_RADIO_RISE, - STREAMED_SOUND_RADIO_LIPS, - STREAMED_SOUND_RADIO_MUNDO, - STREAMED_SOUND_RADIO_MSX, + STREAMED_SOUND_RADIO_WILD, STREAMED_SOUND_RADIO_FLASH, - STREAMED_SOUND_RADIO_LCJ, - STREAMED_SOUND_RADIO_LCFR, + STREAMED_SOUND_RADIO_KCHAT, + STREAMED_SOUND_RADIO_FEVER, + STREAMED_SOUND_RADIO_VROCK, + STREAMED_SOUND_RADIO_VCPR, + STREAMED_SOUND_RADIO_ESPANTOSO, + STREAMED_SOUND_RADIO_EMOTION, + STREAMED_SOUND_RADIO_WAVE, STREAMED_SOUND_RADIO_MP3_PLAYER, STREAMED_SOUND_CITY_AMBIENT, STREAMED_SOUND_WATER_AMBIENT, - STREAMED_SOUND_SAWMILL, - STREAMED_SOUND_HAVANA_CITY_AMBIENT, // CITY - STREAMED_SOUND_HAVANA_WATER_AMBIENT, // WATER - STREAMED_SOUND_HAVANA_BEACH_AMBIENT, // WATER - STREAMED_SOUND_MALL_AMBIENT, // CITY - STREAMED_SOUND_STRIPCLUB_AMBIENT, // CITY - STREAMED_SOUND_MALIBU_AMBIENT, // CITY - STREAMED_SOUND_HOTEL_AMBIENT, // CITY - STREAMED_SOUND_DIRTRING_AMBIENT, // CITY - STREAMED_SOUND_LAW4RIOT_AMBIENT, // CITY - STREAMED_SOUND_AMBSIL_AMBIENT, // CITY + STREAMED_SOUND_BEACH_AMBIENT, + STREAMED_SOUND_HAVANA_CITY_AMBIENT, + STREAMED_SOUND_HAVANA_WATER_AMBIENT, + STREAMED_SOUND_HAVANA_BEACH_AMBIENT, + STREAMED_SOUND_MALL_AMBIENT, + STREAMED_SOUND_STRIPCLUB_AMBIENT, + STREAMED_SOUND_MALIBU_AMBIENT, + STREAMED_SOUND_HOTEL_AMBIENT, + STREAMED_SOUND_DIRTRING_AMBIENT, + STREAMED_SOUND_LAW4RIOT_AMBIENT, + STREAMED_SOUND_AMBSIL_AMBIENT, STREAMED_SOUND_RADIO_POLICE, STREAMED_SOUND_RADIO_TAXI, - STREAMED_SOUND_NEWS_A, - STREAMED_SOUND_NEWS_B, - STREAMED_SOUND_NEWS_C, - STREAMED_SOUND_NEWS_D, - STREAMED_SOUND_NEWS_E, - STREAMED_SOUND_NEWS_F, - STREAMED_SOUND_NEWS_G, - STREAMED_SOUND_NEWS_H, - STREAMED_SOUND_NEWS_I, - STREAMED_SOUND_NEWS_J, - STREAMED_SOUND_NEWS_K, - STREAMED_SOUND_NEWS_L, - STREAMED_SOUND_NEWS_M, - STREAMED_SOUND_NEWS_N, - STREAMED_SOUND_CUTSCENE_BIKER, - STREAMED_SOUND_CUTSCENE_BONEVOY, - STREAMED_SOUND_CUTSCENE_CAMPAIN, - STREAMED_SOUND_CUTSCENE_CASHCHP, - STREAMED_SOUND_CUTSCENE_CONTBAN, - STREAMED_SOUND_CUTSCENE_CRAZY69, - STREAMED_SOUND_CUTSCENE_CUTTEST, - STREAMED_SOUND_CUTSCENE_DEADLY, - STREAMED_SOUND_CUTSCENE_DONPROB, - STREAMED_SOUND_CUTSCENE_DRIVNMR, - STREAMED_SOUND_CUTSCENE_ELECTON, - STREAMED_SOUND_CUTSCENE_FINAL, - STREAMED_SOUND_CUTSCENE_FINAL_2, - STREAMED_SOUND_CUTSCENE_HOMSWET, - STREAMED_SOUND_CUTSCENE_HOTWHEL, - STREAMED_SOUND_CUTSCENE_KIDNAPP, - STREAMED_SOUND_CUTSCENE_LANDGRB, - STREAMED_SOUND_CUTSCENE_MORGUE, - STREAMED_SOUND_CUTSCENE_OVERDOS, - STREAMED_SOUND_CUTSCENE_RUFJUST, - STREAMED_SOUND_CUTSCENE_SAYONAR, - STREAMED_SOUND_CUTSCENE_SICILAN, - STREAMED_SOUND_CUTSCENE_THEOFER, - STREAMED_SOUND_CUTSCENE_INTRO, + STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED, + STREAMED_SOUND_ANNOUNCE_BRIDGE_OPEN, + STREAMED_SOUND_CUTSCENE_ASS_1, + STREAMED_SOUND_CUTSCENE_ASS_2, + STREAMED_SOUND_CUTSCENE_BANK_1, + STREAMED_SOUND_CUTSCENE_BANK_2A, + STREAMED_SOUND_CUTSCENE_BANK_2B, + STREAMED_SOUND_CUTSCENE_BANK_3A, + STREAMED_SOUND_CUTSCENE_BANK_3B, + STREAMED_SOUND_CUTSCENE_BANK_4, + STREAMED_SOUND_CUTSCENE_BIKE_1, + STREAMED_SOUND_CUTSCENE_BIKE_2, + STREAMED_SOUND_CUTSCENE_BIKE_3, + STREAMED_SOUND_CUTSCENE_BUD_1, + STREAMED_SOUND_CUTSCENE_BUD_2, + STREAMED_SOUND_CUTSCENE_BUD_3, + STREAMED_SOUND_CUTSCENE_CAP_1, + STREAMED_SOUND_CUTSCENE_CAR_1, + STREAMED_SOUND_CUTSCENE_CNT_1A, + STREAMED_SOUND_CUTSCENE_CNT_1B, + STREAMED_SOUND_CUTSCENE_CNT_2, + STREAMED_SOUND_CUTSCENE_COK_1, + STREAMED_SOUND_CUTSCENE_COK_2A, + STREAMED_SOUND_CUTSCENE_COK_2B, + STREAMED_SOUND_CUTSCENE_COK_3, + STREAMED_SOUND_CUTSCENE_COK_4A, + STREAMED_SOUND_CUTSCENE_COK_4A2, + STREAMED_SOUND_CUTSCENE_COK_4B, + STREAMED_SOUND_CUTSCENE_COL_1, + STREAMED_SOUND_CUTSCENE_COL_2, + STREAMED_SOUND_CUTSCENE_COL_3A, + STREAMED_SOUND_CUTSCENE_COL_4A, + STREAMED_SOUND_CUTSCENE_COL_5A, + STREAMED_SOUND_CUTSCENE_COL_5B, + STREAMED_SOUND_CUTSCENE_CUB_1, + STREAMED_SOUND_CUTSCENE_CUB_2, + STREAMED_SOUND_CUTSCENE_CUB_3, + STREAMED_SOUND_CUTSCENE_CUB_4, + STREAMED_SOUND_CUTSCENE_DRUG_1, + STREAMED_SOUND_CUTSCENE_FIN, + STREAMED_SOUND_CUTSCENE_FIN2, STREAMED_SOUND_CUTSCENE_FINALE, + STREAMED_SOUND_CUTSCENE_HAT_1, + STREAMED_SOUND_CUTSCENE_HAT_2, + STREAMED_SOUND_CUTSCENE_HAT_3, + STREAMED_SOUND_CUTSCENE_ICE_1, + STREAMED_SOUND_CUTSCENE_INT_A, + STREAMED_SOUND_CUTSCENE_INT_B, + STREAMED_SOUND_CUTSCENE_INT_D, + STREAMED_SOUND_CUTSCENE_INT_M, + STREAMED_SOUND_CUTSCENE_LAW_1A, + STREAMED_SOUND_CUTSCENE_LAW_1B, + STREAMED_SOUND_CUTSCENE_LAW_2A, + STREAMED_SOUND_CUTSCENE_LAW_2B, + STREAMED_SOUND_CUTSCENE_LAW_2C, + STREAMED_SOUND_CUTSCENE_LAW_3, + STREAMED_SOUND_CUTSCENE_LAW_4, + STREAMED_SOUND_CUTSCENE_PHIL_1, + STREAMED_SOUND_CUTSCENE_PHIL_2, + STREAMED_SOUND_CUTSCENE_PORN_1, + STREAMED_SOUND_CUTSCENE_PORN_2, + STREAMED_SOUND_CUTSCENE_PORN_3, + STREAMED_SOUND_CUTSCENE_PORN_4, + STREAMED_SOUND_CUTSCENE_RESC_1A, + STREAMED_SOUND_CUTSCENE_ROK_1, + STREAMED_SOUND_CUTSCENE_ROK_2, + STREAMED_SOUND_CUTSCENE_ROK_3A, + STREAMED_SOUND_CUTSCENE_STRIPA, + STREAMED_SOUND_CUTSCENE_TAX_1, + STREAMED_SOUND_CUTSCENE_TEX_1, + STREAMED_SOUND_CUTSCENE_TEX_2, + STREAMED_SOUND_CUTSCENE_TEX_3, + STREAMED_SOUND_CUTSCENE_GLIGHT, + STREAMED_SOUND_CUTSCENE_FIST, + STREAMED_SOUND_CUTSCENE_ELBURRO1_PH1, + STREAMED_SOUND_CUTSCENE_ELBURRO2_PH2, STREAMED_SOUND_MISSION_COMPLETED, + STREAMED_SOUND_MISSION_COMPLETED4, + STREAMED_SOUND_MISSION_MOBR1, + STREAMED_SOUND_MISSION_PAGER, + STREAMED_SOUND_MISSION_CARREV, + STREAMED_SOUND_MISSION_BIKEREV, + STREAMED_SOUND_MISSION_LIFTOP, + STREAMED_SOUND_MISSION_LIFTCL, + STREAMED_SOUND_MISSION_LIFTRUN, + STREAMED_SOUND_MISSION_LIFTBEL, + STREAMED_SOUND_MISSION_INLIFT, + STREAMED_SOUND_MISSION_SFX_01, + STREAMED_SOUND_MISSION_SFX_02, + STREAMED_SOUND_MISSION_CAMERAL, + STREAMED_SOUND_MISSION_CAMERAR, + STREAMED_SOUND_MISSION_CHEER1, + STREAMED_SOUND_MISSION_CHEER2, + STREAMED_SOUND_MISSION_CHEER3, + STREAMED_SOUND_MISSION_CHEER4, + STREAMED_SOUND_MISSION_OOH1, + STREAMED_SOUND_MISSION_OOH2, + STREAMED_SOUND_MISSION_RACE1, + STREAMED_SOUND_MISSION_RACE2, + STREAMED_SOUND_MISSION_RACE3, + STREAMED_SOUND_MISSION_RACE4, + STREAMED_SOUND_MISSION_RACE5, + STREAMED_SOUND_MISSION_RACE6, + STREAMED_SOUND_MISSION_RACE7, + STREAMED_SOUND_MISSION_RACE8, + STREAMED_SOUND_MISSION_RACE9, + STREAMED_SOUND_MISSION_RACE10, + STREAMED_SOUND_MISSION_RACE11, + STREAMED_SOUND_MISSION_RACE12, + STREAMED_SOUND_MISSION_RACE13, + STREAMED_SOUND_MISSION_RACE14, + STREAMED_SOUND_MISSION_RACE15, + STREAMED_SOUND_MISSION_HOT1, + STREAMED_SOUND_MISSION_HOT2, + STREAMED_SOUND_MISSION_HOT3, + STREAMED_SOUND_MISSION_HOT4, + STREAMED_SOUND_MISSION_HOT5, + STREAMED_SOUND_MISSION_HOT6, + STREAMED_SOUND_MISSION_HOT7, + STREAMED_SOUND_MISSION_HOT8, + STREAMED_SOUND_MISSION_HOT9, + STREAMED_SOUND_MISSION_HOT10, + STREAMED_SOUND_MISSION_HOT11, + STREAMED_SOUND_MISSION_HOT12, + STREAMED_SOUND_MISSION_HOT13, + STREAMED_SOUND_MISSION_HOT14, + STREAMED_SOUND_MISSION_HOT15, + STREAMED_SOUND_MISSION_LANSTP1, + STREAMED_SOUND_MISSION_LANSTP2, + STREAMED_SOUND_MISSION_LANAMU1, + STREAMED_SOUND_MISSION_LANAMU2, + STREAMED_SOUND_MISSION_AIRHORNL, + STREAMED_SOUND_MISSION_AIRHORNR, + STREAMED_SOUND_MISSION_SNIPSCRL, + STREAMED_SOUND_MISSION_SNIPSHORT, + STREAMED_SOUND_MISSION_BLOWROOF, + STREAMED_SOUND_MISSION_ASS_1, + STREAMED_SOUND_MISSION_ASS_2, + STREAMED_SOUND_MISSION_ASS_3, + STREAMED_SOUND_MISSION_ASS_4, + STREAMED_SOUND_MISSION_ASS_5, + STREAMED_SOUND_MISSION_ASS_6, + STREAMED_SOUND_MISSION_ASS_7, + STREAMED_SOUND_MISSION_ASS_8, + STREAMED_SOUND_MISSION_ASS_9, + STREAMED_SOUND_MISSION_ASS_10, + STREAMED_SOUND_MISSION_ASS_11, + STREAMED_SOUND_MISSION_ASS_12, + STREAMED_SOUND_MISSION_ASS_13, + STREAMED_SOUND_MISSION_ASS_14, + STREAMED_SOUND_MISSION_BIKE1_1, + STREAMED_SOUND_MISSION_BIKE1_2, + STREAMED_SOUND_MISSION_BIKE1_3, + STREAMED_SOUND_MISSION_BNK1_1, + STREAMED_SOUND_MISSION_BNK1_2, + STREAMED_SOUND_MISSION_BNK1_3, + STREAMED_SOUND_MISSION_BNK1_4, + STREAMED_SOUND_MISSION_BNK1_5, + STREAMED_SOUND_MISSION_BNK1_6, + STREAMED_SOUND_MISSION_BNK1_7, + STREAMED_SOUND_MISSION_BNK1_8, + STREAMED_SOUND_MISSION_BNK1_10, + STREAMED_SOUND_MISSION_BNK1_11, + STREAMED_SOUND_MISSION_BNK1_12, + STREAMED_SOUND_MISSION_BNK1_13, + STREAMED_SOUND_MISSION_BNK1_14, + STREAMED_SOUND_MISSION_BNK2_1, + STREAMED_SOUND_MISSION_BNK2_2, + STREAMED_SOUND_MISSION_BNK2_3, + STREAMED_SOUND_MISSION_BNK2_4, + STREAMED_SOUND_MISSION_BNK2_5, + STREAMED_SOUND_MISSION_BNK2_6, + STREAMED_SOUND_MISSION_BNK2_7, + STREAMED_SOUND_MISSION_BNK2_8, + STREAMED_SOUND_MISSION_BNK2_9, + STREAMED_SOUND_MISSION_BNK3_1, + STREAMED_SOUND_MISSION_BNK3_2, + STREAMED_SOUND_MISSION_BNK3_3A, + STREAMED_SOUND_MISSION_BNK3_3B, + STREAMED_SOUND_MISSION_BNK3_3C, + STREAMED_SOUND_MISSION_BNK3_4A, + STREAMED_SOUND_MISSION_BNK3_4B, + STREAMED_SOUND_MISSION_BNK3_4C, + STREAMED_SOUND_MISSION_BNK4_1, + STREAMED_SOUND_MISSION_BNK4_2, + STREAMED_SOUND_MISSION_BNK4_3A, + STREAMED_SOUND_MISSION_BNK4_3B, + STREAMED_SOUND_MISSION_BNK4_3C, + STREAMED_SOUND_MISSION_BNK4_3D, + STREAMED_SOUND_MISSION_BNK4_3E, + STREAMED_SOUND_MISSION_BNK4_3F, + STREAMED_SOUND_MISSION_BNK4_3G, + STREAMED_SOUND_MISSION_BNK4_3H, + STREAMED_SOUND_MISSION_BNK4_3I, + STREAMED_SOUND_MISSION_BNK4_3J, + STREAMED_SOUND_MISSION_BNK4_3K, + STREAMED_SOUND_MISSION_BNK4_3M, + STREAMED_SOUND_MISSION_BNK4_3O, + STREAMED_SOUND_MISSION_BNK4_3P, + STREAMED_SOUND_MISSION_BNK4_3Q, + STREAMED_SOUND_MISSION_BNK4_3R, + STREAMED_SOUND_MISSION_BNK4_3S, + STREAMED_SOUND_MISSION_BNK4_3T, + STREAMED_SOUND_MISSION_BNK4_3U, + STREAMED_SOUND_MISSION_BNK4_3V, + STREAMED_SOUND_MISSION_BNK4_4A, + STREAMED_SOUND_MISSION_BNK4_4B, + STREAMED_SOUND_MISSION_BNK4_5, + STREAMED_SOUND_MISSION_BNK4_6, + STREAMED_SOUND_MISSION_BNK4_7, + STREAMED_SOUND_MISSION_BNK4_8, + STREAMED_SOUND_MISSION_BNK4_9, + STREAMED_SOUND_MISSION_BNK4_10, + STREAMED_SOUND_MISSION_BNK4_11, + STREAMED_SOUND_MISSION_BK4_12A, + STREAMED_SOUND_MISSION_BK4_12B, + STREAMED_SOUND_MISSION_BK4_12C, + STREAMED_SOUND_MISSION_BNK4_13, + STREAMED_SOUND_MISSION_BK4_14A, + STREAMED_SOUND_MISSION_BK4_14B, + STREAMED_SOUND_MISSION_BNK4_15, + STREAMED_SOUND_MISSION_BNK4_16, + STREAMED_SOUND_MISSION_BNK4_17, + STREAMED_SOUND_MISSION_BNK4_18, + STREAMED_SOUND_MISSION_BK4_19A, + STREAMED_SOUND_MISSION_BK4_19B, + STREAMED_SOUND_MISSION_BK4_20A, + STREAMED_SOUND_MISSION_BK4_20B, + STREAMED_SOUND_MISSION_BNK4_21, + STREAMED_SOUND_MISSION_BNK422A, + STREAMED_SOUND_MISSION_BNK422B, + STREAMED_SOUND_MISSION_BK4_23A, + STREAMED_SOUND_MISSION_BK4_23B, + STREAMED_SOUND_MISSION_BK4_23C, + STREAMED_SOUND_MISSION_BK4_23D, + STREAMED_SOUND_MISSION_BK4_24A, + STREAMED_SOUND_MISSION_BK4_24B, + STREAMED_SOUND_MISSION_BNK4_25, + STREAMED_SOUND_MISSION_BNK4_26, + STREAMED_SOUND_MISSION_BNK4_27, + STREAMED_SOUND_MISSION_BNK4_28, + STREAMED_SOUND_MISSION_BNK4_29, + STREAMED_SOUND_MISSION_BNK4_30, + STREAMED_SOUND_MISSION_BK4_31A, + STREAMED_SOUND_MISSION_BK4_31B, + STREAMED_SOUND_MISSION_BNK4_32, + STREAMED_SOUND_MISSION_BK4_34A, + STREAMED_SOUND_MISSION_BK4_34B, + STREAMED_SOUND_MISSION_BK4_35A, + STREAMED_SOUND_MISSION_BK4_35B, + STREAMED_SOUND_MISSION_BNK4_36, + STREAMED_SOUND_MISSION_BNK4_37, + STREAMED_SOUND_MISSION_BNK4_38, + STREAMED_SOUND_MISSION_BNK4_39, + STREAMED_SOUND_MISSION_BK4_40A, + STREAMED_SOUND_MISSION_BK4_40B, + STREAMED_SOUND_MISSION_BNK4_41, + STREAMED_SOUND_MISSION_BNK4_42, + STREAMED_SOUND_MISSION_BNK4_43, + STREAMED_SOUND_MISSION_BNK4_44, + STREAMED_SOUND_MISSION_BNK4_45, + STREAMED_SOUND_MISSION_BNK4_46, + STREAMED_SOUND_MISSION_BNK4_47, + STREAMED_SOUND_MISSION_BNK4_48, + STREAMED_SOUND_MISSION_BNK4_49, + STREAMED_SOUND_MISSION_BNK450A, + STREAMED_SOUND_MISSION_BNK450B, + STREAMED_SOUND_MISSION_BNK4_51, + STREAMED_SOUND_MISSION_BNK4_94, + STREAMED_SOUND_MISSION_BNK4_95, + STREAMED_SOUND_MISSION_BNK4_96, + STREAMED_SOUND_MISSION_BNK4_97, + STREAMED_SOUND_MISSION_BNK4_98, + STREAMED_SOUND_MISSION_BNK4_99, + STREAMED_SOUND_MISSION_BUD1_1, + STREAMED_SOUND_MISSION_BUD1_2, + STREAMED_SOUND_MISSION_BUD1_3, + STREAMED_SOUND_MISSION_BUD1_4, + STREAMED_SOUND_MISSION_BUD1_5, + STREAMED_SOUND_MISSION_BUD1_9, + STREAMED_SOUND_MISSION_BUD1_10, + STREAMED_SOUND_MISSION_BUD2_1, + STREAMED_SOUND_MISSION_BUD2_2, + STREAMED_SOUND_MISSION_BUD2_3, + STREAMED_SOUND_MISSION_BUD2_4, + STREAMED_SOUND_MISSION_BUD2_5, + STREAMED_SOUND_MISSION_BUD2_6, + STREAMED_SOUND_MISSION_BUD2_7, + STREAMED_SOUND_MISSION_BUD3_1, + STREAMED_SOUND_MISSION_BUD3_1A, + STREAMED_SOUND_MISSION_BUD3_1B, + STREAMED_SOUND_MISSION_BUD3_1C, + STREAMED_SOUND_MISSION_BUD3_2, + STREAMED_SOUND_MISSION_BUD3_3, + STREAMED_SOUND_MISSION_BUD3_4, + STREAMED_SOUND_MISSION_BUD3_5, + STREAMED_SOUND_MISSION_BUD3_6, + STREAMED_SOUND_MISSION_BUD3_7, + STREAMED_SOUND_MISSION_BUD3_8A, + STREAMED_SOUND_MISSION_BUD3_8B, + STREAMED_SOUND_MISSION_BUD3_8C, + STREAMED_SOUND_MISSION_BUD3_9A, + STREAMED_SOUND_MISSION_BUD3_9B, + STREAMED_SOUND_MISSION_BUD3_9C, + STREAMED_SOUND_MISSION_CAP1_2, + STREAMED_SOUND_MISSION_CAP1_3, + STREAMED_SOUND_MISSION_CAP1_4, + STREAMED_SOUND_MISSION_CAP1_5, + STREAMED_SOUND_MISSION_CAP1_6, + STREAMED_SOUND_MISSION_CAP1_7, + STREAMED_SOUND_MISSION_CAP1_8, + STREAMED_SOUND_MISSION_CAP1_9, + STREAMED_SOUND_MISSION_CAP1_10, + STREAMED_SOUND_MISSION_CAP1_11, + STREAMED_SOUND_MISSION_CAP1_12, + STREAMED_SOUND_MISSION_CNT1_1, + STREAMED_SOUND_MISSION_CNT1_2, + STREAMED_SOUND_MISSION_CNT1_3, + STREAMED_SOUND_MISSION_CNT1_4, + STREAMED_SOUND_MISSION_CNT1_5, + STREAMED_SOUND_MISSION_CNT2_1, + STREAMED_SOUND_MISSION_CNT2_2, + STREAMED_SOUND_MISSION_CNT2_3, + STREAMED_SOUND_MISSION_CNT2_4, + STREAMED_SOUND_MISSION_COK1_1, + STREAMED_SOUND_MISSION_COK1_2, + STREAMED_SOUND_MISSION_COK1_3, + STREAMED_SOUND_MISSION_COK1_4, + STREAMED_SOUND_MISSION_COK1_5, + STREAMED_SOUND_MISSION_COK1_6, + STREAMED_SOUND_MISSION_COK2_1, + STREAMED_SOUND_MISSION_COK2_2, + STREAMED_SOUND_MISSION_COK2_3, + STREAMED_SOUND_MISSION_COK2_4, + STREAMED_SOUND_MISSION_COK2_5, + STREAMED_SOUND_MISSION_COK2_6, + STREAMED_SOUND_MISSION_COK2_7A, + STREAMED_SOUND_MISSION_COK2_7B, + STREAMED_SOUND_MISSION_COK2_7C, + STREAMED_SOUND_MISSION_COK2_8A, + STREAMED_SOUND_MISSION_COK2_8B, + STREAMED_SOUND_MISSION_COK2_8C, + STREAMED_SOUND_MISSION_COK2_8D, + STREAMED_SOUND_MISSION_COK2_9, + STREAMED_SOUND_MISSION_COK210A, + STREAMED_SOUND_MISSION_COK210B, + STREAMED_SOUND_MISSION_COK210C, + STREAMED_SOUND_MISSION_COK212A, + STREAMED_SOUND_MISSION_COK212B, + STREAMED_SOUND_MISSION_COK2_13, + STREAMED_SOUND_MISSION_COK2_14, + STREAMED_SOUND_MISSION_COK2_15, + STREAMED_SOUND_MISSION_COK2_16, + STREAMED_SOUND_MISSION_COK2_20, + STREAMED_SOUND_MISSION_COK2_21, + STREAMED_SOUND_MISSION_COK2_22, + STREAMED_SOUND_MISSION_COK3_1, + STREAMED_SOUND_MISSION_COK3_2, + STREAMED_SOUND_MISSION_COK3_3, + STREAMED_SOUND_MISSION_COK3_4, + STREAMED_SOUND_MISSION_COK4_1, + STREAMED_SOUND_MISSION_COK4_2, + STREAMED_SOUND_MISSION_COK4_3, + STREAMED_SOUND_MISSION_COK4_4, + STREAMED_SOUND_MISSION_COK4_5, + STREAMED_SOUND_MISSION_COK4_6, + STREAMED_SOUND_MISSION_COK4_7, + STREAMED_SOUND_MISSION_COK4_8, + STREAMED_SOUND_MISSION_COK4_9, + STREAMED_SOUND_MISSION_COK4_9A, + STREAMED_SOUND_MISSION_COK4_10, + STREAMED_SOUND_MISSION_COK4_11, + STREAMED_SOUND_MISSION_COK4_12, + STREAMED_SOUND_MISSION_COK4_13, + STREAMED_SOUND_MISSION_COK4_14, + STREAMED_SOUND_MISSION_COK4_15, + STREAMED_SOUND_MISSION_COK4_16, + STREAMED_SOUND_MISSION_COK4_17, + STREAMED_SOUND_MISSION_COK4_18, + STREAMED_SOUND_MISSION_COK4_19, + STREAMED_SOUND_MISSION_COK4_20, + STREAMED_SOUND_MISSION_COK4_21, + STREAMED_SOUND_MISSION_COK4_22, + STREAMED_SOUND_MISSION_COK4_23, + STREAMED_SOUND_MISSION_COK4_24, + STREAMED_SOUND_MISSION_COK4_25, + STREAMED_SOUND_MISSION_COK4_26, + STREAMED_SOUND_MISSION_COK4_27, + STREAMED_SOUND_MISSION_COL1_1, + STREAMED_SOUND_MISSION_COL1_2, + STREAMED_SOUND_MISSION_COL1_3, + STREAMED_SOUND_MISSION_COL1_4, + STREAMED_SOUND_MISSION_COL1_5, + STREAMED_SOUND_MISSION_COL1_6, + STREAMED_SOUND_MISSION_COL1_7, + STREAMED_SOUND_MISSION_COL1_8, + STREAMED_SOUND_MISSION_COL2_1, + STREAMED_SOUND_MISSION_COL2_2, + STREAMED_SOUND_MISSION_COL2_3, + STREAMED_SOUND_MISSION_COL2_4, + STREAMED_SOUND_MISSION_COL2_5, + STREAMED_SOUND_MISSION_COL2_6A, + STREAMED_SOUND_MISSION_COL2_7, + STREAMED_SOUND_MISSION_COL2_8, + STREAMED_SOUND_MISSION_COL2_9, + STREAMED_SOUND_MISSION_COL2_10, + STREAMED_SOUND_MISSION_COL2_11, + STREAMED_SOUND_MISSION_COL2_12, + STREAMED_SOUND_MISSION_COL2_13, + STREAMED_SOUND_MISSION_COL2_14, + STREAMED_SOUND_MISSION_COL2_15, + STREAMED_SOUND_MISSION_COL2_16, + STREAMED_SOUND_MISSION_COL3_1, + STREAMED_SOUND_MISSION_COL3_2, + STREAMED_SOUND_MISSION_COL3_2A, + STREAMED_SOUND_MISSION_COL3_2B, + STREAMED_SOUND_MISSION_COL3_3, + STREAMED_SOUND_MISSION_COL3_4, + STREAMED_SOUND_MISSION_COL3_5, + STREAMED_SOUND_MISSION_COL3_6, + STREAMED_SOUND_MISSION_COL3_7, + STREAMED_SOUND_MISSION_COL3_8, + STREAMED_SOUND_MISSION_COL3_9, + STREAMED_SOUND_MISSION_COL3_10, + STREAMED_SOUND_MISSION_COL3_11, + STREAMED_SOUND_MISSION_COL3_12, + STREAMED_SOUND_MISSION_COL3_13, + STREAMED_SOUND_MISSION_COL3_14, + STREAMED_SOUND_MISSION_COL3_15, + STREAMED_SOUND_MISSION_COL3_16, + STREAMED_SOUND_MISSION_COL3_17, + STREAMED_SOUND_MISSION_COL3_18, + STREAMED_SOUND_MISSION_COL3_19, + STREAMED_SOUND_MISSION_COL3_20, + STREAMED_SOUND_MISSION_COL3_21, + STREAMED_SOUND_MISSION_COL3_23, + STREAMED_SOUND_MISSION_COL3_24, + STREAMED_SOUND_MISSION_COL3_25, + STREAMED_SOUND_MISSION_COL4_1, + STREAMED_SOUND_MISSION_COL4_2, + STREAMED_SOUND_MISSION_COL4_3, + STREAMED_SOUND_MISSION_COL4_4, + STREAMED_SOUND_MISSION_COL4_5, + STREAMED_SOUND_MISSION_COL4_6, + STREAMED_SOUND_MISSION_COL4_7, + STREAMED_SOUND_MISSION_COL4_8, + STREAMED_SOUND_MISSION_COL4_9, + STREAMED_SOUND_MISSION_COL4_10, + STREAMED_SOUND_MISSION_COL4_11, + STREAMED_SOUND_MISSION_COL4_12, + STREAMED_SOUND_MISSION_COL4_13, + STREAMED_SOUND_MISSION_COL4_14, + STREAMED_SOUND_MISSION_COL4_15, + STREAMED_SOUND_MISSION_COL4_16, + STREAMED_SOUND_MISSION_COL4_17, + STREAMED_SOUND_MISSION_COL4_18, + STREAMED_SOUND_MISSION_COL4_19, + STREAMED_SOUND_MISSION_COL4_20, + STREAMED_SOUND_MISSION_COL4_21, + STREAMED_SOUND_MISSION_COL4_22, + STREAMED_SOUND_MISSION_COL4_23, + STREAMED_SOUND_MISSION_COL4_24, + STREAMED_SOUND_MISSION_COL4_25, + STREAMED_SOUND_MISSION_COL4_26, + STREAMED_SOUND_MISSION_COL5_1, + STREAMED_SOUND_MISSION_COL5_2, + STREAMED_SOUND_MISSION_COL5_3, + STREAMED_SOUND_MISSION_COL5_4, + STREAMED_SOUND_MISSION_COL5_5, + STREAMED_SOUND_MISSION_COL5_6, + STREAMED_SOUND_MISSION_COL5_7, + STREAMED_SOUND_MISSION_COL5_8, + STREAMED_SOUND_MISSION_COL5_9, + STREAMED_SOUND_MISSION_COL5_10, + STREAMED_SOUND_MISSION_COL5_11, + STREAMED_SOUND_MISSION_COL5_12, + STREAMED_SOUND_MISSION_COL5_13, + STREAMED_SOUND_MISSION_COL5_14, + STREAMED_SOUND_MISSION_COL5_15, + STREAMED_SOUND_MISSION_COL5_16, + STREAMED_SOUND_MISSION_COL5_17, + STREAMED_SOUND_MISSION_COL5_18, + STREAMED_SOUND_MISSION_COL5_19, + STREAMED_SOUND_MISSION_COL5_20, + STREAMED_SOUND_MISSION_COL5_21, + STREAMED_SOUND_MISSION_COL5_22, + STREAMED_SOUND_MISSION_CUB1_1, + STREAMED_SOUND_MISSION_CUB1_2, + STREAMED_SOUND_MISSION_CUB1_3, + STREAMED_SOUND_MISSION_CUB1_4, + STREAMED_SOUND_MISSION_CUB1_5, + STREAMED_SOUND_MISSION_CUB1_6, + STREAMED_SOUND_MISSION_CUB1_7, + STREAMED_SOUND_MISSION_CUB1_8, + STREAMED_SOUND_MISSION_CUB1_9, + STREAMED_SOUND_MISSION_CUB1_10, + STREAMED_SOUND_MISSION_CUB2_1, + STREAMED_SOUND_MISSION_CUB2_2, + STREAMED_SOUND_MISSION_CUB2_3A, + STREAMED_SOUND_MISSION_CUB2_3B, + STREAMED_SOUND_MISSION_CUB2_3C, + STREAMED_SOUND_MISSION_CUB2_4A, + STREAMED_SOUND_MISSION_CUB2_5, + STREAMED_SOUND_MISSION_CUB2_6, + STREAMED_SOUND_MISSION_CUB2_7, + STREAMED_SOUND_MISSION_CUB2_8, + STREAMED_SOUND_MISSION_CUB2_9, + STREAMED_SOUND_MISSION_CUB2_10, + STREAMED_SOUND_MISSION_CUB2_11, + STREAMED_SOUND_MISSION_CUB3_1, + STREAMED_SOUND_MISSION_CUB3_2, + STREAMED_SOUND_MISSION_CUB3_3, + STREAMED_SOUND_MISSION_CUB3_4, + STREAMED_SOUND_MISSION_CUB4_1, + STREAMED_SOUND_MISSION_CUB4_2, + STREAMED_SOUND_MISSION_CUB4_3, + STREAMED_SOUND_MISSION_CUB4_4, + STREAMED_SOUND_MISSION_CUB4_5, + STREAMED_SOUND_MISSION_CUB4_5A, + STREAMED_SOUND_MISSION_CUB4_6, + STREAMED_SOUND_MISSION_CUB4_7, + STREAMED_SOUND_MISSION_CUB4_8, + STREAMED_SOUND_MISSION_CUB4_9, + STREAMED_SOUND_MISSION_CUB4_10, + STREAMED_SOUND_MISSION_CUB4_11, + STREAMED_SOUND_MISSION_CUB4_12, + STREAMED_SOUND_MISSION_CUB4_13, + STREAMED_SOUND_MISSION_CUB4_14, + STREAMED_SOUND_MISSION_CUB4_15, + STREAMED_SOUND_MISSION_CUB4_16, + STREAMED_SOUND_MISSION_GOLF_1, + STREAMED_SOUND_MISSION_GOLF_2, + STREAMED_SOUND_MISSION_GOLF_3, + STREAMED_SOUND_MISSION_BAR_1, + STREAMED_SOUND_MISSION_BAR_2, + STREAMED_SOUND_MISSION_BAR_3, + STREAMED_SOUND_MISSION_BAR_4, + STREAMED_SOUND_MISSION_BAR_5, + STREAMED_SOUND_MISSION_BAR_6, + STREAMED_SOUND_MISSION_BAR_7, + STREAMED_SOUND_MISSION_BAR_8, + STREAMED_SOUND_MISSION_STRIP_1, + STREAMED_SOUND_MISSION_STRIP_2, + STREAMED_SOUND_MISSION_STRIP_3, + STREAMED_SOUND_MISSION_STRIP_4, + STREAMED_SOUND_MISSION_STRIP_5, + STREAMED_SOUND_MISSION_STRIP_6, + STREAMED_SOUND_MISSION_STRIP_7, + STREAMED_SOUND_MISSION_STRIP_8, + STREAMED_SOUND_MISSION_STRIP_9, + STREAMED_SOUND_MISSION_STAR_1, + STREAMED_SOUND_MISSION_STAR_2, + STREAMED_SOUND_MISSION_STAR_3, + STREAMED_SOUND_MISSION_STAR_4, + STREAMED_SOUND_MISSION_FIN_1A, + STREAMED_SOUND_MISSION_FIN_1B, + STREAMED_SOUND_MISSION_FIN_1C, + STREAMED_SOUND_MISSION_FIN_2B, + STREAMED_SOUND_MISSION_FIN_2C, + STREAMED_SOUND_MISSION_FIN_3, + STREAMED_SOUND_MISSION_FIN_4, + STREAMED_SOUND_MISSION_FIN_5, + STREAMED_SOUND_MISSION_FIN_6, + STREAMED_SOUND_MISSION_FIN_10, + STREAMED_SOUND_MISSION_FIN_11A, + STREAMED_SOUND_MISSION_FIN_11B, + STREAMED_SOUND_MISSION_FIN_12A, + STREAMED_SOUND_MISSION_FIN_12B, + STREAMED_SOUND_MISSION_FIN_12C, + STREAMED_SOUND_MISSION_FIN_13, + STREAMED_SOUND_MISSION_FINKILL, + STREAMED_SOUND_MISSION_LAW1_1, + STREAMED_SOUND_MISSION_LAW1_2, + STREAMED_SOUND_MISSION_LAW1_3, + STREAMED_SOUND_MISSION_LAW1_4, + STREAMED_SOUND_MISSION_LAW1_5, + STREAMED_SOUND_MISSION_LAW1_6, + STREAMED_SOUND_MISSION_LAW1_7, + STREAMED_SOUND_MISSION_LAW1_8, + STREAMED_SOUND_MISSION_LAW1_9, + STREAMED_SOUND_MISSION_LAW1_10, + STREAMED_SOUND_MISSION_LAW2_1, + STREAMED_SOUND_MISSION_LAW2_2, + STREAMED_SOUND_MISSION_LAW2_3, + STREAMED_SOUND_MISSION_LAW2_4, + STREAMED_SOUND_MISSION_LAW2_5, + STREAMED_SOUND_MISSION_LAW2_6, + STREAMED_SOUND_MISSION_LAW2_7, + STREAMED_SOUND_MISSION_LAW2_8, + STREAMED_SOUND_MISSION_LAW2_9, + STREAMED_SOUND_MISSION_LAW2_10, + STREAMED_SOUND_MISSION_LAW3_1, + STREAMED_SOUND_MISSION_LAW3_2, + STREAMED_SOUND_MISSION_LAW3_3, + STREAMED_SOUND_MISSION_LAW3_4, + STREAMED_SOUND_MISSION_LAW3_5, + STREAMED_SOUND_MISSION_LAW3_6, + STREAMED_SOUND_MISSION_LAW3_10, + STREAMED_SOUND_MISSION_LAW3_11, + STREAMED_SOUND_MISSION_LAW3_12, + STREAMED_SOUND_MISSION_LAW3_13, + STREAMED_SOUND_MISSION_LAW3_14, + STREAMED_SOUND_MISSION_LAW3_16, + STREAMED_SOUND_MISSION_LAW3_17, + STREAMED_SOUND_MISSION_LAW3_18, + STREAMED_SOUND_MISSION_LAW3_19, + STREAMED_SOUND_MISSION_LAW3_20, + STREAMED_SOUND_MISSION_LAW3_21, + STREAMED_SOUND_MISSION_LAW3_22, + STREAMED_SOUND_MISSION_LAW3_23, + STREAMED_SOUND_MISSION_LAW3_24, + STREAMED_SOUND_MISSION_LAW3_25, + STREAMED_SOUND_MISSION_LAW4_1A, + STREAMED_SOUND_MISSION_LAW4_1B, + STREAMED_SOUND_MISSION_LAW4_1C, + STREAMED_SOUND_MISSION_LAW4_1D, + STREAMED_SOUND_MISSION_LAW4_10, + STREAMED_SOUND_MISSION_LAW4_3, + STREAMED_SOUND_MISSION_LAW4_4, + STREAMED_SOUND_MISSION_LAW4_5, + STREAMED_SOUND_MISSION_LAW4_6, + STREAMED_SOUND_MISSION_LAW4_7, + STREAMED_SOUND_MISSION_LAW4_8, + STREAMED_SOUND_MISSION_LAW4_9, + STREAMED_SOUND_MISSION_PHIL1_2, + STREAMED_SOUND_MISSION_PHIL1_3, + STREAMED_SOUND_MISSION_PHIL2_1, + STREAMED_SOUND_MISSION_PHIL2_2, + STREAMED_SOUND_MISSION_PHIL2_3, + STREAMED_SOUND_MISSION_PHIL2_4, + STREAMED_SOUND_MISSION_PHIL2_5, + STREAMED_SOUND_MISSION_PHIL2_6, + STREAMED_SOUND_MISSION_PHIL2_7, + STREAMED_SOUND_MISSION_PHIL2_8, + STREAMED_SOUND_MISSION_PHIL2_9, + STREAMED_SOUND_MISSION_PHIL210, + STREAMED_SOUND_MISSION_PHIL211, + STREAMED_SOUND_MISSION_PORN1_1, + STREAMED_SOUND_MISSION_PORN1_2, + STREAMED_SOUND_MISSION_PORN1_3, + STREAMED_SOUND_MISSION_PRN1_3A, + STREAMED_SOUND_MISSION_PORN1_4, + STREAMED_SOUND_MISSION_PORN1_5, + STREAMED_SOUND_MISSION_PORN1_6, + STREAMED_SOUND_MISSION_PORN1_7, + STREAMED_SOUND_MISSION_PORN1_8, + STREAMED_SOUND_MISSION_PORN1_9, + STREAMED_SOUND_MISSION_PRN1_10, + STREAMED_SOUND_MISSION_PRN1_11, + STREAMED_SOUND_MISSION_PRN1_12, + STREAMED_SOUND_MISSION_PRN1_13, + STREAMED_SOUND_MISSION_PRN1_14, + STREAMED_SOUND_MISSION_PRN1_15, + STREAMED_SOUND_MISSION_PRN1_16, + STREAMED_SOUND_MISSION_PRN1_17, + STREAMED_SOUND_MISSION_PRN1_18, + STREAMED_SOUND_MISSION_PRN1_19, + STREAMED_SOUND_MISSION_PRN1_20, + STREAMED_SOUND_MISSION_PRN1_21, + STREAMED_SOUND_MISSION_PORN3_1, + STREAMED_SOUND_MISSION_PORN3_2, + STREAMED_SOUND_MISSION_PORN3_3, + STREAMED_SOUND_MISSION_PORN3_4, + STREAMED_SOUND_MISSION_PSYCH_1, + STREAMED_SOUND_MISSION_PSYCH_2, + STREAMED_SOUND_MISSION_ROK2_01, + STREAMED_SOUND_MISSION_ROK3_1, + STREAMED_SOUND_MISSION_ROK3_2, + STREAMED_SOUND_MISSION_ROK3_3, + STREAMED_SOUND_MISSION_ROK3_4, + STREAMED_SOUND_MISSION_ROK3_5, + STREAMED_SOUND_MISSION_ROK3_6, + STREAMED_SOUND_MISSION_ROK3_7, + STREAMED_SOUND_MISSION_ROK3_8, + STREAMED_SOUND_MISSION_ROK3_9, + STREAMED_SOUND_MISSION_ROK3_10, + STREAMED_SOUND_MISSION_ROK3_11, + STREAMED_SOUND_MISSION_ROK3_12, + STREAMED_SOUND_MISSION_ROK3_13, + STREAMED_SOUND_MISSION_ROK3_14, + STREAMED_SOUND_MISSION_ROK3_15, + STREAMED_SOUND_MISSION_ROK3_16, + STREAMED_SOUND_MISSION_ROK3_17, + STREAMED_SOUND_MISSION_ROK3_18, + STREAMED_SOUND_MISSION_ROK3_19, + STREAMED_SOUND_MISSION_ROK3_20, + STREAMED_SOUND_MISSION_ROK3_21, + STREAMED_SOUND_MISSION_ROK3_22, + STREAMED_SOUND_MISSION_ROK3_23, + STREAMED_SOUND_MISSION_ROK3_24, + STREAMED_SOUND_MISSION_ROK3_25, + STREAMED_SOUND_MISSION_ROK3_26, + STREAMED_SOUND_MISSION_ROK3_27, + STREAMED_SOUND_MISSION_ROK3_62, + STREAMED_SOUND_MISSION_ROK3_63, + STREAMED_SOUND_MISSION_ROK3_64, + STREAMED_SOUND_MISSION_ROK3_65, + STREAMED_SOUND_MISSION_ROK3_66, + STREAMED_SOUND_MISSION_ROK3_67, + STREAMED_SOUND_MISSION_ROK3_68, + STREAMED_SOUND_MISSION_ROK3_69, + STREAMED_SOUND_MISSION_ROK3_70, + STREAMED_SOUND_MISSION_ROK3_71, + STREAMED_SOUND_MISSION_ROK3_73, + STREAMED_SOUND_MISSION_RESC_1, + STREAMED_SOUND_MISSION_RESC_2, + STREAMED_SOUND_MISSION_RESC_3, + STREAMED_SOUND_MISSION_RESC_4, + STREAMED_SOUND_MISSION_RESC_5, + STREAMED_SOUND_MISSION_RESC_6, + STREAMED_SOUND_MISSION_RESC_7, + STREAMED_SOUND_MISSION_RESC_8, + STREAMED_SOUND_MISSION_RESC_9, + STREAMED_SOUND_MISSION_RESC_10, + STREAMED_SOUND_MISSION_ROK1_1A, + STREAMED_SOUND_MISSION_ROK1_1B, + STREAMED_SOUND_MISSION_ROK1_5, + STREAMED_SOUND_MISSION_ROK1_6, + STREAMED_SOUND_MISSION_ROK1_7, + STREAMED_SOUND_MISSION_ROK1_8, + STREAMED_SOUND_MISSION_ROK1_9, + STREAMED_SOUND_MISSION_TAX1_1, + STREAMED_SOUND_MISSION_TAX1_2, + STREAMED_SOUND_MISSION_TAX1_3, + STREAMED_SOUND_MISSION_TAX1_4, + STREAMED_SOUND_MISSION_TAX1_5, + STREAMED_SOUND_MISSION_TAX2_1, + STREAMED_SOUND_MISSION_TAX2_2, + STREAMED_SOUND_MISSION_TAX2_3, + STREAMED_SOUND_MISSION_TAX2_4, + STREAMED_SOUND_MISSION_TAX2_5, + STREAMED_SOUND_MISSION_TAX2_6, + STREAMED_SOUND_MISSION_TAX2_7, + STREAMED_SOUND_MISSION_TAX3_1, + STREAMED_SOUND_MISSION_TAX3_2, + STREAMED_SOUND_MISSION_TAX3_3, + STREAMED_SOUND_MISSION_TAX3_4, + STREAMED_SOUND_MISSION_TAX3_5, + STREAMED_SOUND_MISSION_TEX1_1, + STREAMED_SOUND_MISSION_TEX1_2, + STREAMED_SOUND_MISSION_TEX1_3, + STREAMED_SOUND_MISSION_TEX1_4, + STREAMED_SOUND_MISSION_TEX1_5, + STREAMED_SOUND_MISSION_TEX1_6, + STREAMED_SOUND_MISSION_TEX2_1, + STREAMED_SOUND_MISSION_TEX3_1, + STREAMED_SOUND_MISSION_TEX3_2, + STREAMED_SOUND_MISSION_TEX3_3, + STREAMED_SOUND_MISSION_TEX3_4, + STREAMED_SOUND_MISSION_TEX3_5, + STREAMED_SOUND_MISSION_TEX3_6, + STREAMED_SOUND_MISSION_TEX3_7, + STREAMED_SOUND_MISSION_TEX3_8, + STREAMED_SOUND_MISSION_HAT_1A, + STREAMED_SOUND_MISSION_INTRO1, + STREAMED_SOUND_MISSION_INTRO2, + STREAMED_SOUND_MISSION_INTRO3, + STREAMED_SOUND_MISSION_INTRO4, + STREAMED_SOUND_MISSION_MOB_01A, + STREAMED_SOUND_MISSION_MOB_01B, + STREAMED_SOUND_MISSION_MOB_01C, + STREAMED_SOUND_MISSION_MOB_02A, + STREAMED_SOUND_MISSION_MOB_02B, + STREAMED_SOUND_MISSION_MOB_02C, + STREAMED_SOUND_MISSION_MOB_03A, + STREAMED_SOUND_MISSION_MOB_03B, + STREAMED_SOUND_MISSION_MOB_03C, + STREAMED_SOUND_MISSION_MOB_03D, + STREAMED_SOUND_MISSION_MOB_03E, + STREAMED_SOUND_MISSION_SHARK_1, + STREAMED_SOUND_MISSION_SHARK_2, + STREAMED_SOUND_MISSION_SHARK_3, + STREAMED_SOUND_MISSION_SHARK_4, + STREAMED_SOUND_MISSION_SHARK_5, + STREAMED_SOUND_MISSION_MOB_04A, + STREAMED_SOUND_MISSION_MOB_04B, + STREAMED_SOUND_MISSION_MOB_04C, + STREAMED_SOUND_MISSION_MOB_04D, + STREAMED_SOUND_MISSION_MOB_05A, + STREAMED_SOUND_MISSION_MOB_05B, + STREAMED_SOUND_MISSION_MOB_05C, + STREAMED_SOUND_MISSION_MOB_05D, + STREAMED_SOUND_MISSION_MOB_06A, + STREAMED_SOUND_MISSION_MOB_06B, + STREAMED_SOUND_MISSION_MOB_06C, + STREAMED_SOUND_MISSION_MOB_07A, + STREAMED_SOUND_MISSION_MOB_07B, + STREAMED_SOUND_MISSION_MOB_08A, + STREAMED_SOUND_MISSION_MOB_08B, + STREAMED_SOUND_MISSION_MOB_08C, + STREAMED_SOUND_MISSION_MOB_08D, + STREAMED_SOUND_MISSION_MOB_08E, + STREAMED_SOUND_MISSION_MOB_08F, + STREAMED_SOUND_MISSION_MOB_08G, + STREAMED_SOUND_MISSION_MOB_09A, + STREAMED_SOUND_MISSION_MOB_09B, + STREAMED_SOUND_MISSION_MOB_09C, + STREAMED_SOUND_MISSION_MOB_09D, + STREAMED_SOUND_MISSION_MOB_09E, + STREAMED_SOUND_MISSION_MOB_09F, + STREAMED_SOUND_MISSION_MOB_10A, + STREAMED_SOUND_MISSION_MOB_10B, + STREAMED_SOUND_MISSION_MOB_10C, + STREAMED_SOUND_MISSION_MOB_10D, + STREAMED_SOUND_MISSION_MOB_10E, + STREAMED_SOUND_MISSION_MOB_11A, + STREAMED_SOUND_MISSION_MOB_11B, + STREAMED_SOUND_MISSION_MOB_11C, + STREAMED_SOUND_MISSION_MOB_11D, + STREAMED_SOUND_MISSION_MOB_11E, + STREAMED_SOUND_MISSION_MOB_11F, + STREAMED_SOUND_MISSION_MOB_14A, + STREAMED_SOUND_MISSION_MOB_14B, + STREAMED_SOUND_MISSION_MOB_14C, + STREAMED_SOUND_MISSION_MOB_14D, + STREAMED_SOUND_MISSION_MOB_14E, + STREAMED_SOUND_MISSION_MOB_14F, + STREAMED_SOUND_MISSION_MOB_14G, + STREAMED_SOUND_MISSION_MOB_14H, + STREAMED_SOUND_MISSION_MOB_16A, + STREAMED_SOUND_MISSION_MOB_16B, + STREAMED_SOUND_MISSION_MOB_16C, + STREAMED_SOUND_MISSION_MOB_16D, + STREAMED_SOUND_MISSION_MOB_16E, + STREAMED_SOUND_MISSION_MOB_16F, + STREAMED_SOUND_MISSION_MOB_16G, + STREAMED_SOUND_MISSION_MOB_17A, + STREAMED_SOUND_MISSION_MOB_17B, + STREAMED_SOUND_MISSION_MOB_17C, + STREAMED_SOUND_MISSION_MOB_17D, + STREAMED_SOUND_MISSION_MOB_17E, + STREAMED_SOUND_MISSION_MOB_17G, + STREAMED_SOUND_MISSION_MOB_17H, + STREAMED_SOUND_MISSION_MOB_17I, + STREAMED_SOUND_MISSION_MOB_17J, + STREAMED_SOUND_MISSION_MOB_17K, + STREAMED_SOUND_MISSION_MOB_17L, + STREAMED_SOUND_MISSION_MOB_18A, + STREAMED_SOUND_MISSION_MOB_18B, + STREAMED_SOUND_MISSION_MOB_18C, + STREAMED_SOUND_MISSION_MOB_18D, + STREAMED_SOUND_MISSION_MOB_18E, + STREAMED_SOUND_MISSION_MOB_18F, + STREAMED_SOUND_MISSION_MOB_18G, + STREAMED_SOUND_MISSION_MOB_20A, + STREAMED_SOUND_MISSION_MOB_20B, + STREAMED_SOUND_MISSION_MOB_20C, + STREAMED_SOUND_MISSION_MOB_20D, + STREAMED_SOUND_MISSION_MOB_20E, + STREAMED_SOUND_MISSION_MOB_24A, + STREAMED_SOUND_MISSION_MOB_24B, + STREAMED_SOUND_MISSION_MOB_24C, + STREAMED_SOUND_MISSION_MOB_24D, + STREAMED_SOUND_MISSION_MOB_24E, + STREAMED_SOUND_MISSION_MOB_24F, + STREAMED_SOUND_MISSION_MOB_24G, + STREAMED_SOUND_MISSION_MOB_24H, + STREAMED_SOUND_MISSION_MOB_25A, + STREAMED_SOUND_MISSION_MOB_25B, + STREAMED_SOUND_MISSION_MOB_25C, + STREAMED_SOUND_MISSION_MOB_25D, + STREAMED_SOUND_MISSION_MOB_26A, + STREAMED_SOUND_MISSION_MOB_26B, + STREAMED_SOUND_MISSION_MOB_26C, + STREAMED_SOUND_MISSION_MOB_26D, + STREAMED_SOUND_MISSION_MOB_26E, + STREAMED_SOUND_MISSION_MOB_29A, + STREAMED_SOUND_MISSION_MOB_29B, + STREAMED_SOUND_MISSION_MOB_29C, + STREAMED_SOUND_MISSION_MOB_29D, + STREAMED_SOUND_MISSION_MOB_29E, + STREAMED_SOUND_MISSION_MOB_29F, + STREAMED_SOUND_MISSION_MOB_29G, + STREAMED_SOUND_MISSION_MOB_30A, + STREAMED_SOUND_MISSION_MOB_30B, + STREAMED_SOUND_MISSION_MOB_30C, + STREAMED_SOUND_MISSION_MOB_30D, + STREAMED_SOUND_MISSION_MOB_30E, + STREAMED_SOUND_MISSION_MOB_30F, + STREAMED_SOUND_MISSION_MOB_33A, + STREAMED_SOUND_MISSION_MOB_33B, + STREAMED_SOUND_MISSION_MOB_33C, + STREAMED_SOUND_MISSION_MOB_33D, + STREAMED_SOUND_MISSION_MOB_34A, + STREAMED_SOUND_MISSION_MOB_34B, + STREAMED_SOUND_MISSION_MOB_34C, + STREAMED_SOUND_MISSION_MOB_34D, + STREAMED_SOUND_MISSION_MOB_35A, + STREAMED_SOUND_MISSION_MOB_35B, + STREAMED_SOUND_MISSION_MOB_35C, + STREAMED_SOUND_MISSION_MOB_35D, + STREAMED_SOUND_MISSION_MOB_36A, + STREAMED_SOUND_MISSION_MOB_36B, + STREAMED_SOUND_MISSION_MOB_36C, + STREAMED_SOUND_MISSION_MOB_40A, + STREAMED_SOUND_MISSION_MOB_40B, + STREAMED_SOUND_MISSION_MOB_40C, + STREAMED_SOUND_MISSION_MOB_40D, + STREAMED_SOUND_MISSION_MOB_40E, + STREAMED_SOUND_MISSION_MOB_40F, + STREAMED_SOUND_MISSION_MOB_40G, + STREAMED_SOUND_MISSION_MOB_40H, + STREAMED_SOUND_MISSION_MOB_40I, + STREAMED_SOUND_MISSION_MOB_41A, + STREAMED_SOUND_MISSION_MOB_41B, + STREAMED_SOUND_MISSION_MOB_41C, + STREAMED_SOUND_MISSION_MOB_41D, + STREAMED_SOUND_MISSION_MOB_41E, + STREAMED_SOUND_MISSION_MOB_41F, + STREAMED_SOUND_MISSION_MOB_41G, + STREAMED_SOUND_MISSION_MOB_41H, + STREAMED_SOUND_MISSION_MOB_42A, + STREAMED_SOUND_MISSION_MOB_42B, + STREAMED_SOUND_MISSION_MOB_42C, + STREAMED_SOUND_MISSION_MOB_42D, + STREAMED_SOUND_MISSION_MOB_42E, + STREAMED_SOUND_MISSION_MOB_43A, + STREAMED_SOUND_MISSION_MOB_43B, + STREAMED_SOUND_MISSION_MOB_43C, + STREAMED_SOUND_MISSION_MOB_43D, + STREAMED_SOUND_MISSION_MOB_43E, + STREAMED_SOUND_MISSION_MOB_43F, + STREAMED_SOUND_MISSION_MOB_43G, + STREAMED_SOUND_MISSION_MOB_43H, + STREAMED_SOUND_MISSION_MOB_45A, + STREAMED_SOUND_MISSION_MOB_45B, + STREAMED_SOUND_MISSION_MOB_45C, + STREAMED_SOUND_MISSION_MOB_45D, + STREAMED_SOUND_MISSION_MOB_45E, + STREAMED_SOUND_MISSION_MOB_45F, + STREAMED_SOUND_MISSION_MOB_45G, + STREAMED_SOUND_MISSION_MOB_45H, + STREAMED_SOUND_MISSION_MOB_45I, + STREAMED_SOUND_MISSION_MOB_45J, + STREAMED_SOUND_MISSION_MOB_45K, + STREAMED_SOUND_MISSION_MOB_45L, + STREAMED_SOUND_MISSION_MOB_45M, + STREAMED_SOUND_MISSION_MOB_45N, + STREAMED_SOUND_MISSION_MOB_46A, + STREAMED_SOUND_MISSION_MOB_46B, + STREAMED_SOUND_MISSION_MOB_46C, + STREAMED_SOUND_MISSION_MOB_46D, + STREAMED_SOUND_MISSION_MOB_46E, + STREAMED_SOUND_MISSION_MOB_46F, + STREAMED_SOUND_MISSION_MOB_46G, + STREAMED_SOUND_MISSION_MOB_46H, + STREAMED_SOUND_MISSION_MOB_47A, + STREAMED_SOUND_MISSION_MOB_52A, + STREAMED_SOUND_MISSION_MOB_52B, + STREAMED_SOUND_MISSION_MOB_52C, + STREAMED_SOUND_MISSION_MOB_52D, + STREAMED_SOUND_MISSION_MOB_52E, + STREAMED_SOUND_MISSION_MOB_52F, + STREAMED_SOUND_MISSION_MOB_52G, + STREAMED_SOUND_MISSION_MOB_52H, + STREAMED_SOUND_MISSION_MOB_54A, + STREAMED_SOUND_MISSION_MOB_54B, + STREAMED_SOUND_MISSION_MOB_54C, + STREAMED_SOUND_MISSION_MOB_54D, + STREAMED_SOUND_MISSION_MOB_54E, + STREAMED_SOUND_MISSION_MOB_55A, + STREAMED_SOUND_MISSION_MOB_55B, + STREAMED_SOUND_MISSION_MOB_55C, + STREAMED_SOUND_MISSION_MOB_55D, + STREAMED_SOUND_MISSION_MOB_55E, + STREAMED_SOUND_MISSION_MOB_55F, + STREAMED_SOUND_MISSION_MOB_56A, + STREAMED_SOUND_MISSION_MOB_56B, + STREAMED_SOUND_MISSION_MOB_56C, + STREAMED_SOUND_MISSION_MOB_56D, + STREAMED_SOUND_MISSION_MOB_56E, + STREAMED_SOUND_MISSION_MOB_56F, + STREAMED_SOUND_MISSION_MOB_57A, + STREAMED_SOUND_MISSION_MOB_57B, + STREAMED_SOUND_MISSION_MOB_57C, + STREAMED_SOUND_MISSION_MOB_57D, + STREAMED_SOUND_MISSION_MOB_57E, + STREAMED_SOUND_MISSION_MOB_58A, + STREAMED_SOUND_MISSION_MOB_58B, + STREAMED_SOUND_MISSION_MOB_58C, + STREAMED_SOUND_MISSION_MOB_58D, + STREAMED_SOUND_MISSION_MOB_58E, + STREAMED_SOUND_MISSION_MOB_58F, + STREAMED_SOUND_MISSION_MOB_58G, + STREAMED_SOUND_MISSION_MOB_61A, + STREAMED_SOUND_MISSION_MOB_61B, + STREAMED_SOUND_MISSION_MOB_62A, + STREAMED_SOUND_MISSION_MOB_62B, + STREAMED_SOUND_MISSION_MOB_62C, + STREAMED_SOUND_MISSION_MOB_62D, + STREAMED_SOUND_MISSION_MOB_63A, + STREAMED_SOUND_MISSION_MOB_63B, + STREAMED_SOUND_MISSION_MOB_63C, + STREAMED_SOUND_MISSION_MOB_63D, + STREAMED_SOUND_MISSION_MOB_63E, + STREAMED_SOUND_MISSION_MOB_63F, + STREAMED_SOUND_MISSION_MOB_63G, + STREAMED_SOUND_MISSION_MOB_63H, + STREAMED_SOUND_MISSION_MOB_63I, + STREAMED_SOUND_MISSION_MOB_63J, + STREAMED_SOUND_MISSION_MOB_66A, + STREAMED_SOUND_MISSION_MOB_66B, + STREAMED_SOUND_MISSION_MOB_68A, + STREAMED_SOUND_MISSION_MOB_68B, + STREAMED_SOUND_MISSION_MOB_68C, + STREAMED_SOUND_MISSION_MOB_68D, + STREAMED_SOUND_MISSION_MOB_70A, + STREAMED_SOUND_MISSION_MOB_70B, + STREAMED_SOUND_MISSION_MOB_71A, + STREAMED_SOUND_MISSION_MOB_71B, + STREAMED_SOUND_MISSION_MOB_71C, + STREAMED_SOUND_MISSION_MOB_71D, + STREAMED_SOUND_MISSION_MOB_71E, + STREAMED_SOUND_MISSION_MOB_71F, + STREAMED_SOUND_MISSION_MOB_71G, + STREAMED_SOUND_MISSION_MOB_71H, + STREAMED_SOUND_MISSION_MOB_71I, + STREAMED_SOUND_MISSION_MOB_71J, + STREAMED_SOUND_MISSION_MOB_71K, + STREAMED_SOUND_MISSION_MOB_71L, + STREAMED_SOUND_MISSION_MOB_71M, + STREAMED_SOUND_MISSION_MOB_71N, + STREAMED_SOUND_MISSION_MOB_72A, + STREAMED_SOUND_MISSION_MOB_72B, + STREAMED_SOUND_MISSION_MOB_72C, + STREAMED_SOUND_MISSION_MOB_72D, + STREAMED_SOUND_MISSION_MOB_72E, + STREAMED_SOUND_MISSION_MOB_72F, + STREAMED_SOUND_MISSION_MOB_72G, + STREAMED_SOUND_MISSION_MOB_73A, + STREAMED_SOUND_MISSION_MOB_73C, + STREAMED_SOUND_MISSION_MOB_73D, + STREAMED_SOUND_MISSION_MOB_73F, + STREAMED_SOUND_MISSION_MOB_73G, + STREAMED_SOUND_MISSION_MOB_73I, + STREAMED_SOUND_MISSION_MOB_95A, + STREAMED_SOUND_MISSION_MOB_96A, + STREAMED_SOUND_MISSION_MOB_98A, + STREAMED_SOUND_MISSION_MOB_99A, + STREAMED_SOUND_MISSION_JOB1_1B, + STREAMED_SOUND_MISSION_JOB1_1C, + STREAMED_SOUND_MISSION_JOB1_1D, + STREAMED_SOUND_MISSION_JOB2_1B, + STREAMED_SOUND_MISSION_JOB2_2, + STREAMED_SOUND_MISSION_JOB2_3, + STREAMED_SOUND_MISSION_JOB2_4, + STREAMED_SOUND_MISSION_JOB2_5, + STREAMED_SOUND_MISSION_JOB2_6, + STREAMED_SOUND_MISSION_JOB2_7, + STREAMED_SOUND_MISSION_JOB2_8, + STREAMED_SOUND_MISSION_JOB2_9, + STREAMED_SOUND_MISSION_JOB3_1, + STREAMED_SOUND_MISSION_JOB3_2, + STREAMED_SOUND_MISSION_JOB3_3, + STREAMED_SOUND_MISSION_JOB4_1, + STREAMED_SOUND_MISSION_JOB4_2, + STREAMED_SOUND_MISSION_JOB4_3, + STREAMED_SOUND_MISSION_JOB5_1, + STREAMED_SOUND_MISSION_JOB5_2, + STREAMED_SOUND_MISSION_JOB5_3, + STREAMED_SOUND_MISSION_BJM1_20, + STREAMED_SOUND_MISSION_BJM1_4, + STREAMED_SOUND_MISSION_BJM1_5, + STREAMED_SOUND_MISSION_MERC_39, + STREAMED_SOUND_MISSION_MONO_1, + STREAMED_SOUND_MISSION_MONO_2, + STREAMED_SOUND_MISSION_MONO_3, + STREAMED_SOUND_MISSION_MONO_4, + STREAMED_SOUND_MISSION_MONO_5, + STREAMED_SOUND_MISSION_MONO_6, + STREAMED_SOUND_MISSION_MONO_7, + STREAMED_SOUND_MISSION_MONO_8, + STREAMED_SOUND_MISSION_MONO_9, + STREAMED_SOUND_MISSION_MONO10, + STREAMED_SOUND_MISSION_MONO11, + STREAMED_SOUND_MISSION_MONO12, + STREAMED_SOUND_MISSION_MONO13, + STREAMED_SOUND_MISSION_MONO14, + STREAMED_SOUND_MISSION_MONO15, + STREAMED_SOUND_MISSION_MONO16, + STREAMED_SOUND_MISSION_FUD_01, + STREAMED_SOUND_MISSION_FUD_02, + STREAMED_SOUND_MISSION_FUD_03, + STREAMED_SOUND_MISSION_FUD_04, + STREAMED_SOUND_MISSION_FUD_05, + STREAMED_SOUND_MISSION_FUD_06, + STREAMED_SOUND_MISSION_FUD_07, + STREAMED_SOUND_MISSION_FUD_08, + STREAMED_SOUND_MISSION_FUD_09, + STREAMED_SOUND_MISSION_FUD_10, + STREAMED_SOUND_MISSION_FUD_11, + STREAMED_SOUND_MISSION_FUD_12, + STREAMED_SOUND_MISSION_FUD_13, + STREAMED_SOUND_MISSION_FUD_14, + STREAMED_SOUND_MISSION_FUD_15, + STREAMED_SOUND_MISSION_FUD_16, + STREAMED_SOUND_MISSION_FUD_17, + STREAMED_SOUND_MISSION_FUD_18, + STREAMED_SOUND_MISSION_FUD_19, + STREAMED_SOUND_MISSION_FUD_20, + STREAMED_SOUND_MISSION_BURG_01, + STREAMED_SOUND_MISSION_BURG_02, + STREAMED_SOUND_MISSION_BURG_03, + STREAMED_SOUND_MISSION_BURG_04, + STREAMED_SOUND_MISSION_BURG_05, + STREAMED_SOUND_MISSION_BURG_06, + STREAMED_SOUND_MISSION_BURG_07, + STREAMED_SOUND_MISSION_BURG_08, + STREAMED_SOUND_MISSION_BURG_09, + STREAMED_SOUND_MISSION_BURG_10, + STREAMED_SOUND_MISSION_BURG_11, + STREAMED_SOUND_MISSION_BURG_12, + STREAMED_SOUND_MISSION_CRUST01, + STREAMED_SOUND_MISSION_CRUST02, + STREAMED_SOUND_MISSION_CRUST03, + STREAMED_SOUND_MISSION_CRUST04, + STREAMED_SOUND_MISSION_CRUST05, + STREAMED_SOUND_MISSION_CRUST06, + STREAMED_SOUND_MISSION_CRUST07, + STREAMED_SOUND_MISSION_CRUST08, + STREAMED_SOUND_MISSION_CRUST09, + STREAMED_SOUND_MISSION_BAND_01, + STREAMED_SOUND_MISSION_BAND_02, + STREAMED_SOUND_MISSION_BAND_03, + STREAMED_SOUND_MISSION_BAND_04, + STREAMED_SOUND_MISSION_BAND_05, + STREAMED_SOUND_MISSION_BAND_06, + STREAMED_SOUND_MISSION_BAND_07, + STREAMED_SOUND_MISSION_BAND_08, + STREAMED_SOUND_MISSION_SHAFT01, + STREAMED_SOUND_MISSION_SHAFT02, + STREAMED_SOUND_MISSION_SHAFT03, + STREAMED_SOUND_MISSION_SHAFT04, + STREAMED_SOUND_MISSION_SHAFT05, + STREAMED_SOUND_MISSION_SHAFT06, + STREAMED_SOUND_MISSION_SHAFT07, + STREAMED_SOUND_MISSION_SHAFT08, + STREAMED_SOUND_MISSION_PISS_01, + STREAMED_SOUND_MISSION_PISS_02, + STREAMED_SOUND_MISSION_PISS_03, + STREAMED_SOUND_MISSION_PISS_04, + STREAMED_SOUND_MISSION_PISS_05, + STREAMED_SOUND_MISSION_PISS_06, + STREAMED_SOUND_MISSION_PISS_07, + STREAMED_SOUND_MISSION_PISS_08, + STREAMED_SOUND_MISSION_PISS_09, + STREAMED_SOUND_MISSION_PISS_10, + STREAMED_SOUND_MISSION_PISS_11, + STREAMED_SOUND_MISSION_PISS_12, + STREAMED_SOUND_MISSION_PISS_13, + STREAMED_SOUND_MISSION_PISS_14, + STREAMED_SOUND_MISSION_PISS_15, + STREAMED_SOUND_MISSION_PISS_16, + STREAMED_SOUND_MISSION_PISS_17, + STREAMED_SOUND_MISSION_PISS_18, + STREAMED_SOUND_MISSION_PISS_19, + STREAMED_SOUND_MISSION_GIMME01, + STREAMED_SOUND_MISSION_GIMME02, + STREAMED_SOUND_MISSION_GIMME03, + STREAMED_SOUND_MISSION_GIMME04, + STREAMED_SOUND_MISSION_GIMME05, + STREAMED_SOUND_MISSION_GIMME06, + STREAMED_SOUND_MISSION_GIMME07, + STREAMED_SOUND_MISSION_GIMME08, + STREAMED_SOUND_MISSION_GIMME09, + STREAMED_SOUND_MISSION_GIMME10, + STREAMED_SOUND_MISSION_GIMME11, + STREAMED_SOUND_MISSION_GIMME12, + STREAMED_SOUND_MISSION_GIMME13, + STREAMED_SOUND_MISSION_GIMME14, + STREAMED_SOUND_MISSION_GIMME15, + STREAMED_SOUND_MISSION_BUST_01, + STREAMED_SOUND_MISSION_BUST_02, + STREAMED_SOUND_MISSION_BUST_03, + STREAMED_SOUND_MISSION_BUST_04, + STREAMED_SOUND_MISSION_BUST_05, + STREAMED_SOUND_MISSION_BUST_06, + STREAMED_SOUND_MISSION_BUST_07, + STREAMED_SOUND_MISSION_BUST_08, + STREAMED_SOUND_MISSION_BUST_09, + STREAMED_SOUND_MISSION_BUST_10, + STREAMED_SOUND_MISSION_BUST_11, + STREAMED_SOUND_MISSION_BUST_12, + STREAMED_SOUND_MISSION_BUST_13, + STREAMED_SOUND_MISSION_BUST_14, + STREAMED_SOUND_MISSION_BUST_15, + STREAMED_SOUND_MISSION_BUST_16, + STREAMED_SOUND_MISSION_BUST_17, + STREAMED_SOUND_MISSION_BUST_18, + STREAMED_SOUND_MISSION_BUST_19, + STREAMED_SOUND_MISSION_BUST_20, + STREAMED_SOUND_MISSION_BUST_21, + STREAMED_SOUND_MISSION_BUST_22, + STREAMED_SOUND_MISSION_BUST_23, + STREAMED_SOUND_MISSION_BUST_24, + STREAMED_SOUND_MISSION_BUST_25, + STREAMED_SOUND_MISSION_BUST_26, + STREAMED_SOUND_MISSION_BUST_27, + STREAMED_SOUND_MISSION_BUST_28, TOTAL_STREAMED_SOUNDS, NO_TRACK, }; diff --git a/src/audio/sampman.h b/src/audio/sampman.h index 697a7aa..5d7d39a 100644 --- a/src/audio/sampman.h +++ b/src/audio/sampman.h @@ -277,72 +277,109 @@ static char StreamedNameTable[][25] = { #elif defined(PS2_AUDIO_PATHS) static char StreamedNameTable[][40] = { - "AUDIO\\MUSIC\\HEAD.VB", - "AUDIO\\MUSIC\\DOUBLE.VB", - "AUDIO\\MUSIC\\KJAH.VB", - "AUDIO\\MUSIC\\RISE.VB", - "AUDIO\\MUSIC\\LIPS.VB", - "AUDIO\\MUSIC\\MUNDO.VB", - "AUDIO\\MUSIC\\MSX.VB", + "AUDIO\\MUSIC\\WILD.VB", "AUDIO\\MUSIC\\FLASH.VB", - "AUDIO\\MUSIC\\LCJ.VB", - "AUDIO\\MUSIC\\LCFR.VB", - "AUDIO\\MUSIC\\MISCOM2.VB", + "AUDIO\\MUSIC\\KCHAT.VB", // 16 khz + "AUDIO\\MUSIC\\FEVER.VB", + "AUDIO\\MUSIC\\VROCK.VB", + "AUDIO\\MUSIC\\VCPR.VB", // 16 khz + "AUDIO\\MUSIC\\ESPANT.VB", + "AUDIO\\MUSIC\\EMOTION.VB", + "AUDIO\\MUSIC\\WAVE.VB", + "AUDIO\\MUSIC\\MISCOM.VB", "AUDIO\\MUSIC\\CITY.VB", "AUDIO\\MUSIC\\WATER.VB", - "AUDIO\\MUSIC\\SAWMILL.VB", - "AUDIO\\MUSIC\\CITY.VB", - "AUDIO\\MUSIC\\WATER.VB", - "AUDIO\\MUSIC\\WATER.VB", - "AUDIO\\MUSIC\\CITY.VB", - "AUDIO\\MUSIC\\CITY.VB", - "AUDIO\\MUSIC\\CITY.VB", - "AUDIO\\MUSIC\\CITY.VB", - "AUDIO\\MUSIC\\CITY.VB", - "AUDIO\\MUSIC\\CITY.VB", - "AUDIO\\MUSIC\\CITY.VB", - "AUDIO\\MUSIC\\POLICE.VB", + "AUDIO\\MUSIC\\BEACHAMB.VB", + "AUDIO\\MUSIC\\HCITY.VB", + "AUDIO\\MUSIC\\HWATER.VB", + "AUDIO\\MUSIC\\HBEACH.VB", + "AUDIO\\MUSIC\\MALLAMB.VB", + "AUDIO\\MUSIC\\STRIP.VB", + "AUDIO\\MUSIC\\MALIBU.VB", + "AUDIO\\MUSIC\\HOTEL.VB", + "AUDIO\\MUSIC\\DIRTRING.VB", + "AUDIO\\MUSIC\\LAW4RIOT.VB", + "AUDIO\\MUSIC\\AMBSIL.VB", + "AUDIO\\MUSIC\\POLICE.VB", // 16 khz "AUDIO\\MUSIC\\TAXI.VB", - "AUDIO\\NEWS\\NEWS_A.VB", - "AUDIO\\NEWS\\NEWS_B.VB", - "AUDIO\\NEWS\\NEWS_C.VB", - "AUDIO\\NEWS\\NEWS_D.VB", - "AUDIO\\NEWS\\NEWS_E.VB", - "AUDIO\\NEWS\\NEWS_F.VB", - "AUDIO\\NEWS\\NEWS_G.VB", - "AUDIO\\NEWS\\NEWS_H.VB", - "AUDIO\\NEWS\\NEWS_I.VB", - "AUDIO\\NEWS\\NEWS_J.VB", - "AUDIO\\NEWS\\NEWS_K.VB", - "AUDIO\\NEWS\\NEWS_L.VB", - "AUDIO\\NEWS\\NEWS_M.VB", - "AUDIO\\NEWS\\NEWS_N.VB", - "AUDIO\\CUTSCENE\\BIKER.VB", - "AUDIO\\CUTSCENE\\BONEVOY.VB", - "AUDIO\\CUTSCENE\\CAMPAIN.VB", - "AUDIO\\CUTSCENE\\CASHCHP.VB", - "AUDIO\\CUTSCENE\\CONTBAN.VB", - "AUDIO\\CUTSCENE\\CRAZY69.VB", - "AUDIO\\CUTSCENE\\CRAZY69.VB", - "AUDIO\\CUTSCENE\\DEADLY.VB", - "AUDIO\\CUTSCENE\\DONPROB.VB", - "AUDIO\\CUTSCENE\\DRIVNMR.VB", - "AUDIO\\CUTSCENE\\ELECTON.VB", - "AUDIO\\CUTSCENE\\FINAL.VB", - "AUDIO\\CUTSCENE\\FINAL_2.VB", - "AUDIO\\CUTSCENE\\HOMSWET.VB", - "AUDIO\\CUTSCENE\\HOTWHEL.VB", - "AUDIO\\CUTSCENE\\KIDNAPP.VB", - "AUDIO\\CUTSCENE\\LANDGRB.VB", - "AUDIO\\CUTSCENE\\MORGUE.VB", - "AUDIO\\CUTSCENE\\OVERDOS.VB", - "AUDIO\\CUTSCENE\\RUFJUST.VB", - "AUDIO\\CUTSCENE\\SAYONAR.VB", - "AUDIO\\CUTSCENE\\SICILAN.VB", - "AUDIO\\CUTSCENE\\THEOFER.VB", - "AUDIO\\CUTSCENE\\INTRO.VB", - "AUDIO\\MUSIC\\FINALE.VB", - "AUDIO\\MUSIC\\MISCOM2.VB" + "AUDIO\\MUSIC\\BCLOSED.VB", + "AUDIO\\MUSIC\\BOPEN.VB", + "AUDIO\\CUTSCENE\\ASS\\ASS_1.VB", + "AUDIO\\CUTSCENE\\ASS\\ASS_2.VB", + "AUDIO\\CUTSCENE\\BANK\\BANK_1.VB", + "AUDIO\\CUTSCENE\\BANK\\BANK_2A.VB", + "AUDIO\\CUTSCENE\\BANK\\BANK_2B.VB", + "AUDIO\\CUTSCENE\\BANK\\BANK_3A.VB", + "AUDIO\\CUTSCENE\\BANK\\BANK_3B.VB", + "AUDIO\\CUTSCENE\\BANK\\BANK_4.VB", + "AUDIO\\CUTSCENE\\BIKE\\BIKE_1.VB", + "AUDIO\\CUTSCENE\\BIKE\\BIKE_2.VB", + "AUDIO\\CUTSCENE\\BIKE\\BIKE_3.VB", + "AUDIO\\CUTSCENE\\BUD\\BUD_1.VB", + "AUDIO\\CUTSCENE\\BUD\\BUD_2.VB", + "AUDIO\\CUTSCENE\\BUD\\BUD_3.VB", + "AUDIO\\CUTSCENE\\CAP\\CAP_1.VB", + "AUDIO\\CUTSCENE\\CAR\\CAR_1.VB", + "AUDIO\\CUTSCENE\\CNT\\CNT_1A.VB", + "AUDIO\\CUTSCENE\\CNT\\CNT_1B.VB", + "AUDIO\\CUTSCENE\\CNT\\CNT_2.VB", + "AUDIO\\CUTSCENE\\COK\\COK_1.VB", + "AUDIO\\CUTSCENE\\COK\\COK_2A.VB", + "AUDIO\\CUTSCENE\\COK\\COK_2B.VB", + "AUDIO\\CUTSCENE\\COK\\COK_3.VB", + "AUDIO\\CUTSCENE\\COK\\COK_4A.VB", + "AUDIO\\CUTSCENE\\COK\\COK_4A2.VB", + "AUDIO\\CUTSCENE\\COK\\COK_4B.VB", + "AUDIO\\CUTSCENE\\COL\\COL_1.VB", + "AUDIO\\CUTSCENE\\COL\\COL_2.VB", + "AUDIO\\CUTSCENE\\COL\\COL_3A.VB", + "AUDIO\\CUTSCENE\\COL\\COL_4A.VB", + "AUDIO\\CUTSCENE\\COL\\COL_5A.VB", + "AUDIO\\CUTSCENE\\COL\\COL_5B.VB", + "AUDIO\\CUTSCENE\\CUB\\CUB_1.VB", + "AUDIO\\CUTSCENE\\CUB\\CUB_2.VB", + "AUDIO\\CUTSCENE\\CUB\\CUB_3.VB", + "AUDIO\\CUTSCENE\\CUB\\CUB_4.VB", + "AUDIO\\CUTSCENE\\DRUG\\DRUG_1.VB", + "AUDIO\\CUTSCENE\\FIN\\FIN.VB", + "AUDIO\\CUTSCENE\\FIN\\FIN2.VB", + "AUDIO\\CUTSCENE\\FINALE\\FINALE.VB", + "AUDIO\\CUTSCENE\\HAT\\HAT_1.VB", + "AUDIO\\CUTSCENE\\HAT\\HAT_2.VB", + "AUDIO\\CUTSCENE\\HAT\\HAT_3.VB", + "AUDIO\\CUTSCENE\\ICE\\ICE_1.VB", + "AUDIO\\CUTSCENE\\INT\\INT_A.VB", + "AUDIO\\CUTSCENE\\INT\\INT_B.VB", + "AUDIO\\CUTSCENE\\INT\\INT_D.VB", + "AUDIO\\CUTSCENE\\INT\\INT_M.VB", + "AUDIO\\CUTSCENE\\LAW\\LAW_1A.VB", + "AUDIO\\CUTSCENE\\LAW\\LAW_1B.VB", + "AUDIO\\CUTSCENE\\LAW\\LAW_2A.VB", + "AUDIO\\CUTSCENE\\LAW\\LAW_2B.VB", + "AUDIO\\CUTSCENE\\LAW\\LAW_2C.VB", + "AUDIO\\CUTSCENE\\LAW\\LAW_3.VB", + "AUDIO\\CUTSCENE\\LAW\\LAW_4.VB", + "AUDIO\\CUTSCENE\\PHIL\\PHIL_1.VB", + "AUDIO\\CUTSCENE\\PHIL\\PHIL_2.VB", + "AUDIO\\CUTSCENE\\PORN\\PORN_1.VB", + "AUDIO\\CUTSCENE\\PORN\\PORN_2.VB", + "AUDIO\\CUTSCENE\\PORN\\PORN_3.VB", + "AUDIO\\CUTSCENE\\PORN\\PORN_4.VB", + "AUDIO\\CUTSCENE\\RESC\\RESC_1A.VB", + "AUDIO\\CUTSCENE\\ROK\\ROK_1.VB", + "AUDIO\\CUTSCENE\\ROK\\ROK_2.VB", + "AUDIO\\CUTSCENE\\ROK\\ROK_3A.VB", + "AUDIO\\CUTSCENE\\STRIPA\\STRIPA.VB", + "AUDIO\\CUTSCENE\\TAX\\TAX_1.VB", + "AUDIO\\CUTSCENE\\TEX\\TEX_1.VB", + "AUDIO\\CUTSCENE\\TEX\\TEX_2.VB", + "AUDIO\\CUTSCENE\\TEX\\TEX_3.VB", + "AUDIO\\MUSIC\\GLIGHT.VB", + "AUDIO\\MUSIC\\FIST.VB", + "AUDIO\\MUSIC\\MISCOM.VB", + "AUDIO\\MUSIC\\MISCOM.VB", + "AUDIO\\MUSIC\\MISCOM.VB", + "AUDIO\\MUSIC\\MISCOM.VB", #else static char StreamedNameTable[][25] = { @@ -450,5 +487,1125 @@ static char StreamedNameTable[][25] = "AUDIO\\MISCOM.MP3", "AUDIO\\MISCOM.MP3", #endif - + "AUDIO\\MOBR1.WAV", + "AUDIO\\PAGER.WAV", + "AUDIO\\CARREV.WAV", + "AUDIO\\BIKEREV.WAV", + "AUDIO\\LIFTOP.WAV", + "AUDIO\\LIFTCL.WAV", + "AUDIO\\LIFTRUN.WAV", + "AUDIO\\LIFTBEL.WAV", + "AUDIO\\INLIFT.WAV", + "AUDIO\\SFX_01.WAV", + "AUDIO\\SFX_02.WAV", + "AUDIO\\CAMERAL.WAV", + "AUDIO\\CAMERAR.WAV", + "AUDIO\\CHEER1.WAV", + "AUDIO\\CHEER2.WAV", + "AUDIO\\CHEER3.WAV", + "AUDIO\\CHEER4.WAV", + "AUDIO\\OOH1.WAV", + "AUDIO\\OOH2.WAV", + "AUDIO\\RACE1.WAV", + "AUDIO\\RACE2.WAV", + "AUDIO\\RACE3.WAV", + "AUDIO\\RACE4.WAV", + "AUDIO\\RACE5.WAV", + "AUDIO\\RACE6.WAV", + "AUDIO\\RACE7.WAV", + "AUDIO\\RACE8.WAV", + "AUDIO\\RACE9.WAV", + "AUDIO\\RACE10.WAV", + "AUDIO\\RACE11.WAV", + "AUDIO\\RACE12.WAV", + "AUDIO\\RACE13.WAV", + "AUDIO\\RACE14.WAV", + "AUDIO\\RACE15.WAV", + "AUDIO\\HOT1.WAV", + "AUDIO\\HOT2.WAV", + "AUDIO\\HOT3.WAV", + "AUDIO\\HOT4.WAV", + "AUDIO\\HOT5.WAV", + "AUDIO\\HOT6.WAV", + "AUDIO\\HOT7.WAV", + "AUDIO\\HOT8.WAV", + "AUDIO\\HOT9.WAV", + "AUDIO\\HOT10.WAV", + "AUDIO\\HOT11.WAV", + "AUDIO\\HOT12.WAV", + "AUDIO\\HOT13.WAV", + "AUDIO\\HOT14.WAV", + "AUDIO\\HOT15.WAV", + "AUDIO\\LANSTP1.WAV", + "AUDIO\\LANSTP2.WAV", + "AUDIO\\LANAMU1.WAV", + "AUDIO\\LANAMU2.WAV", + "AUDIO\\AIRHORNL.WAV", + "AUDIO\\AIRHORNR.WAV", + "AUDIO\\SNIPSCRL.WAV", + "AUDIO\\SNIPSHORT.WAV", + "AUDIO\\BLOWROOF.WAV", + "AUDIO\\ASS_1.WAV", + "AUDIO\\ASS_2.WAV", + "AUDIO\\ASS_3.WAV", + "AUDIO\\ASS_4.WAV", + "AUDIO\\ASS_5.WAV", + "AUDIO\\ASS_6.WAV", + "AUDIO\\ASS_7.WAV", + "AUDIO\\ASS_8.WAV", + "AUDIO\\ASS_9.WAV", + "AUDIO\\ASS_10.WAV", + "AUDIO\\ASS_11.WAV", + "AUDIO\\ASS_12.WAV", + "AUDIO\\ASS_13.WAV", + "AUDIO\\ASS_14.WAV", + "AUDIO\\BIKE1_1.WAV", + "AUDIO\\BIKE1_2.WAV", + "AUDIO\\BIKE1_3.WAV", + "AUDIO\\BNK1_1.WAV", + "AUDIO\\BNK1_2.WAV", + "AUDIO\\BNK1_3.WAV", + "AUDIO\\BNK1_4.WAV", + "AUDIO\\BNK1_5.WAV", + "AUDIO\\BNK1_6.WAV", + "AUDIO\\BNK1_7.WAV", + "AUDIO\\BNK1_8.WAV", + "AUDIO\\BNK1_10.WAV", + "AUDIO\\BNK1_11.WAV", + "AUDIO\\BNK1_12.WAV", + "AUDIO\\BNK1_13.WAV", + "AUDIO\\BNK1_14.WAV", + "AUDIO\\BNK2_1.WAV", + "AUDIO\\BNK2_2.WAV", + "AUDIO\\BNK2_3.WAV", + "AUDIO\\BNK2_4.WAV", + "AUDIO\\BNK2_5.WAV", + "AUDIO\\BNK2_6.WAV", + "AUDIO\\BNK2_7.WAV", + "AUDIO\\BNK2_8.WAV", + "AUDIO\\BNK2_9.WAV", + "AUDIO\\BNK3_1.WAV", + "AUDIO\\BNK3_2.WAV", + "AUDIO\\BNK3_3A.WAV", + "AUDIO\\BNK3_3B.WAV", + "AUDIO\\BNK3_3C.WAV", + "AUDIO\\BNK3_4A.WAV", + "AUDIO\\BNK3_4B.WAV", + "AUDIO\\BNK3_4C.WAV", + "AUDIO\\BNK4_1.WAV", + "AUDIO\\BNK4_2.WAV", + "AUDIO\\BNK4_3A.WAV", + "AUDIO\\BNK4_3B.WAV", + "AUDIO\\BNK4_3C.WAV", + "AUDIO\\BNK4_3D.WAV", + "AUDIO\\BNK4_3E.WAV", + "AUDIO\\BNK4_3F.WAV", + "AUDIO\\BNK4_3G.WAV", + "AUDIO\\BNK4_3H.WAV", + "AUDIO\\BNK4_3I.WAV", + "AUDIO\\BNK4_3J.WAV", + "AUDIO\\BNK4_3K.WAV", + "AUDIO\\BNK4_3M.WAV", + "AUDIO\\BNK4_3O.WAV", + "AUDIO\\BNK4_3P.WAV", + "AUDIO\\BNK4_3Q.WAV", + "AUDIO\\BNK4_3R.WAV", + "AUDIO\\BNK4_3S.WAV", + "AUDIO\\BNK4_3T.WAV", + "AUDIO\\BNK4_3U.WAV", + "AUDIO\\BNK4_3V.WAV", + "AUDIO\\BNK4_4A.WAV", + "AUDIO\\BNK4_4B.WAV", + "AUDIO\\BNK4_5.WAV", + "AUDIO\\BNK4_6.WAV", + "AUDIO\\BNK4_7.WAV", + "AUDIO\\BNK4_8.WAV", + "AUDIO\\BNK4_9.WAV", + "AUDIO\\BNK4_10.WAV", + "AUDIO\\BNK4_11.WAV", + "AUDIO\\BK4_12A.WAV", + "AUDIO\\BK4_12B.WAV", + "AUDIO\\BK4_12C.WAV", + "AUDIO\\BNK4_13.WAV", + "AUDIO\\BK4_14A.WAV", + "AUDIO\\BK4_14B.WAV", + "AUDIO\\BNK4_15.WAV", + "AUDIO\\BNK4_16.WAV", + "AUDIO\\BNK4_17.WAV", + "AUDIO\\BNK4_18.WAV", + "AUDIO\\BK4_19A.WAV", + "AUDIO\\BK4_19B.WAV", + "AUDIO\\BK4_20A.WAV", + "AUDIO\\BK4_20B.WAV", + "AUDIO\\BNK4_21.WAV", + "AUDIO\\BNK422A.WAV", + "AUDIO\\BNK422B.WAV", + "AUDIO\\BK4_23A.WAV", + "AUDIO\\BK4_23B.WAV", + "AUDIO\\BK4_23C.WAV", + "AUDIO\\BK4_23D.WAV", + "AUDIO\\BK4_24A.WAV", + "AUDIO\\BK4_24B.WAV", + "AUDIO\\BNK4_25.WAV", + "AUDIO\\BNK4_26.WAV", + "AUDIO\\BNK4_27.WAV", + "AUDIO\\BNK4_28.WAV", + "AUDIO\\BNK4_29.WAV", + "AUDIO\\BNK4_30.WAV", + "AUDIO\\BK4_31A.WAV", + "AUDIO\\BK4_31B.WAV", + "AUDIO\\BNK4_32.WAV", + "AUDIO\\BK4_34A.WAV", + "AUDIO\\BK4_34B.WAV", + "AUDIO\\BK4_35A.WAV", + "AUDIO\\BK4_35B.WAV", + "AUDIO\\BNK4_36.WAV", + "AUDIO\\BNK4_37.WAV", + "AUDIO\\BNK4_38.WAV", + "AUDIO\\BNK4_39.WAV", + "AUDIO\\BK4_40A.WAV", + "AUDIO\\BK4_40B.WAV", + "AUDIO\\BNK4_41.WAV", + "AUDIO\\BNK4_42.WAV", + "AUDIO\\BNK4_43.WAV", + "AUDIO\\BNK4_44.WAV", + "AUDIO\\BNK4_45.WAV", + "AUDIO\\BNK4_46.WAV", + "AUDIO\\BNK4_47.WAV", + "AUDIO\\BNK4_48.WAV", + "AUDIO\\BNK4_49.WAV", + "AUDIO\\BNK450A.WAV", + "AUDIO\\BNK450B.WAV", + "AUDIO\\BNK4_51.WAV", + "AUDIO\\BNK4_94.WAV", + "AUDIO\\BNK4_95.WAV", + "AUDIO\\BNK4_96.WAV", + "AUDIO\\BNK4_97.WAV", + "AUDIO\\BNK4_98.WAV", + "AUDIO\\BNK4_99.WAV", + "AUDIO\\BUD1_1.WAV", + "AUDIO\\BUD1_2.WAV", + "AUDIO\\BUD1_3.WAV", + "AUDIO\\BUD1_4.WAV", + "AUDIO\\BUD1_5.WAV", + "AUDIO\\BUD1_9.WAV", + "AUDIO\\BUD1_10.WAV", + "AUDIO\\BUD2_1.WAV", + "AUDIO\\BUD2_2.WAV", + "AUDIO\\BUD2_3.WAV", + "AUDIO\\BUD2_4.WAV", + "AUDIO\\BUD2_5.WAV", + "AUDIO\\BUD2_6.WAV", + "AUDIO\\BUD2_7.WAV", + "AUDIO\\BUD3_1.WAV", + "AUDIO\\BUD3_1A.WAV", + "AUDIO\\BUD3_1B.WAV", + "AUDIO\\BUD3_1C.WAV", + "AUDIO\\BUD3_2.WAV", + "AUDIO\\BUD3_3.WAV", + "AUDIO\\BUD3_4.WAV", + "AUDIO\\BUD3_5.WAV", + "AUDIO\\BUD3_6.WAV", + "AUDIO\\BUD3_7.WAV", + "AUDIO\\BUD3_8A.WAV", + "AUDIO\\BUD3_8B.WAV", + "AUDIO\\BUD3_8C.WAV", + "AUDIO\\BUD3_9A.WAV", + "AUDIO\\BUD3_9B.WAV", + "AUDIO\\BUD3_9C.WAV", + "AUDIO\\CAP1_2.WAV", + "AUDIO\\CAP1_3.WAV", + "AUDIO\\CAP1_4.WAV", + "AUDIO\\CAP1_5.WAV", + "AUDIO\\CAP1_6.WAV", + "AUDIO\\CAP1_7.WAV", + "AUDIO\\CAP1_8.WAV", + "AUDIO\\CAP1_9.WAV", + "AUDIO\\CAP1_10.WAV", + "AUDIO\\CAP1_11.WAV", + "AUDIO\\CAP1_12.WAV", + "AUDIO\\CNT1_1.WAV", + "AUDIO\\CNT1_2.WAV", + "AUDIO\\CNT1_3.WAV", + "AUDIO\\CNT1_4.WAV", + "AUDIO\\CNT1_5.WAV", + "AUDIO\\CNT2_1.WAV", + "AUDIO\\CNT2_2.WAV", + "AUDIO\\CNT2_3.WAV", + "AUDIO\\CNT2_4.WAV", + "AUDIO\\COK1_1.WAV", + "AUDIO\\COK1_2.WAV", + "AUDIO\\COK1_3.WAV", + "AUDIO\\COK1_4.WAV", + "AUDIO\\COK1_5.WAV", + "AUDIO\\COK1_6.WAV", + "AUDIO\\COK2_1.WAV", + "AUDIO\\COK2_2.WAV", + "AUDIO\\COK2_3.WAV", + "AUDIO\\COK2_4.WAV", + "AUDIO\\COK2_5.WAV", + "AUDIO\\COK2_6.WAV", + "AUDIO\\COK2_7A.WAV", + "AUDIO\\COK2_7B.WAV", + "AUDIO\\COK2_7C.WAV", + "AUDIO\\COK2_8A.WAV", + "AUDIO\\COK2_8B.WAV", + "AUDIO\\COK2_8C.WAV", + "AUDIO\\COK2_8D.WAV", + "AUDIO\\COK2_9.WAV", + "AUDIO\\COK210A.WAV", + "AUDIO\\COK210B.WAV", + "AUDIO\\COK210C.WAV", + "AUDIO\\COK212A.WAV", + "AUDIO\\COK212B.WAV", + "AUDIO\\COK2_13.WAV", + "AUDIO\\COK2_14.WAV", + "AUDIO\\COK2_15.WAV", + "AUDIO\\COK2_16.WAV", + "AUDIO\\COK2_20.WAV", + "AUDIO\\COK2_21.WAV", + "AUDIO\\COK2_2.WAV", // this is probably a typo of COK2_22 + "AUDIO\\COK3_1.WAV", + "AUDIO\\COK3_2.WAV", + "AUDIO\\COK3_3.WAV", + "AUDIO\\COK3_4.WAV", + "AUDIO\\COK4_1.WAV", + "AUDIO\\COK4_2.WAV", + "AUDIO\\COK4_3.WAV", + "AUDIO\\COK4_4.WAV", + "AUDIO\\COK4_5.WAV", + "AUDIO\\COK4_6.WAV", + "AUDIO\\COK4_7.WAV", + "AUDIO\\COK4_8.WAV", + "AUDIO\\COK4_9.WAV", + "AUDIO\\COK4_9A.WAV", + "AUDIO\\COK4_10.WAV", + "AUDIO\\COK4_11.WAV", + "AUDIO\\COK4_12.WAV", + "AUDIO\\COK4_13.WAV", + "AUDIO\\COK4_14.WAV", + "AUDIO\\COK4_15.WAV", + "AUDIO\\COK4_16.WAV", + "AUDIO\\COK4_17.WAV", + "AUDIO\\COK4_18.WAV", + "AUDIO\\COK4_19.WAV", + "AUDIO\\COK4_20.WAV", + "AUDIO\\COK4_21.WAV", + "AUDIO\\COK4_22.WAV", + "AUDIO\\COK4_23.WAV", + "AUDIO\\COK4_24.WAV", + "AUDIO\\COK4_25.WAV", + "AUDIO\\COK4_26.WAV", + "AUDIO\\COK4_27.WAV", + "AUDIO\\COL1_1.WAV", + "AUDIO\\COL1_2.WAV", + "AUDIO\\COL1_3.WAV", + "AUDIO\\COL1_4.WAV", + "AUDIO\\COL1_5.WAV", + "AUDIO\\COL1_6.WAV", + "AUDIO\\COL1_7.WAV", + "AUDIO\\COL1_8.WAV", + "AUDIO\\COL2_1.WAV", + "AUDIO\\COL2_2.WAV", + "AUDIO\\COL2_3.WAV", + "AUDIO\\COL2_4.WAV", + "AUDIO\\COL2_5.WAV", + "AUDIO\\COL2_6A.WAV", + "AUDIO\\COL2_7.WAV", + "AUDIO\\COL2_8.WAV", + "AUDIO\\COL2_9.WAV", + "AUDIO\\COL2_10.WAV", + "AUDIO\\COL2_11.WAV", + "AUDIO\\COL2_12.WAV", + "AUDIO\\COL2_13.WAV", + "AUDIO\\COL2_14.WAV", + "AUDIO\\COL2_15.WAV", + "AUDIO\\COL2_16.WAV", + "AUDIO\\COL3_1.WAV", + "AUDIO\\COL3_2.WAV", + "AUDIO\\COL3_2A.WAV", + "AUDIO\\COL3_2B.WAV", + "AUDIO\\COL3_3.WAV", + "AUDIO\\COL3_4.WAV", + "AUDIO\\COL3_5.WAV", + "AUDIO\\COL3_6.WAV", + "AUDIO\\COL3_7.WAV", + "AUDIO\\COL3_8.WAV", + "AUDIO\\COL3_9.WAV", + "AUDIO\\COL3_10.WAV", + "AUDIO\\COL3_11.WAV", + "AUDIO\\COL3_12.WAV", + "AUDIO\\COL3_13.WAV", + "AUDIO\\COL3_14.WAV", + "AUDIO\\COL3_15.WAV", + "AUDIO\\COL3_16.WAV", + "AUDIO\\COL3_17.WAV", + "AUDIO\\COL3_18.WAV", + "AUDIO\\COL3_19.WAV", + "AUDIO\\COL3_20.WAV", + "AUDIO\\COL3_21.WAV", + "AUDIO\\COL3_23.WAV", + "AUDIO\\COL3_24.WAV", + "AUDIO\\COL3_25.WAV", + "AUDIO\\COL4_1.WAV", + "AUDIO\\COL4_2.WAV", + "AUDIO\\COL4_3.WAV", + "AUDIO\\COL4_4.WAV", + "AUDIO\\COL4_5.WAV", + "AUDIO\\COL4_6.WAV", + "AUDIO\\COL4_7.WAV", + "AUDIO\\COL4_8.WAV", + "AUDIO\\COL4_9.WAV", + "AUDIO\\COL4_10.WAV", + "AUDIO\\COL4_11.WAV", + "AUDIO\\COL4_12.WAV", + "AUDIO\\COL4_13.WAV", + "AUDIO\\COL4_14.WAV", + "AUDIO\\COL4_15.WAV", + "AUDIO\\COL4_16.WAV", + "AUDIO\\COL4_17.WAV", + "AUDIO\\COL4_18.WAV", + "AUDIO\\COL4_19.WAV", + "AUDIO\\COL4_20.WAV", + "AUDIO\\COL4_21.WAV", + "AUDIO\\COL4_22.WAV", + "AUDIO\\COL4_23.WAV", + "AUDIO\\COL4_24.WAV", + "AUDIO\\COL4_25.WAV", + "AUDIO\\COL4_26.WAV", + "AUDIO\\COL5_1.WAV", + "AUDIO\\COL5_2.WAV", + "AUDIO\\COL5_3.WAV", + "AUDIO\\COL5_4.WAV", + "AUDIO\\COL5_5.WAV", + "AUDIO\\COL5_6.WAV", + "AUDIO\\COL5_7.WAV", + "AUDIO\\COL5_8.WAV", + "AUDIO\\COL5_9.WAV", + "AUDIO\\COL5_10.WAV", + "AUDIO\\COL5_11.WAV", + "AUDIO\\COL5_12.WAV", + "AUDIO\\COL5_13.WAV", + "AUDIO\\COL5_14.WAV", + "AUDIO\\COL5_15.WAV", + "AUDIO\\COL5_16.WAV", + "AUDIO\\COL5_17.WAV", + "AUDIO\\COL5_18.WAV", + "AUDIO\\COL5_19.WAV", + "AUDIO\\COL5_20.WAV", + "AUDIO\\COL5_21.WAV", + "AUDIO\\COL5_22.WAV", + "AUDIO\\CUB1_1.WAV", + "AUDIO\\CUB1_2.WAV", + "AUDIO\\CUB1_3.WAV", + "AUDIO\\CUB1_4.WAV", + "AUDIO\\CUB1_5.WAV", + "AUDIO\\CUB1_6.WAV", + "AUDIO\\CUB1_7.WAV", + "AUDIO\\CUB1_8.WAV", + "AUDIO\\CUB1_9.WAV", + "AUDIO\\CUB1_10.WAV", + "AUDIO\\CUB2_1.WAV", + "AUDIO\\CUB2_2.WAV", + "AUDIO\\CUB2_3A.WAV", + "AUDIO\\CUB2_3B.WAV", + "AUDIO\\CUB2_3C.WAV", + "AUDIO\\CUB2_4A.WAV", + "AUDIO\\CUB2_5.WAV", + "AUDIO\\CUB2_6.WAV", + "AUDIO\\CUB2_7.WAV", + "AUDIO\\CUB2_8.WAV", + "AUDIO\\CUB2_9.WAV", + "AUDIO\\CUB2_10.WAV", + "AUDIO\\CUB2_11.WAV", + "AUDIO\\CUB3_1.WAV", + "AUDIO\\CUB3_2.WAV", + "AUDIO\\CUB3_3.WAV", + "AUDIO\\CUB3_4.WAV", + "AUDIO\\CUB4_1.WAV", + "AUDIO\\CUB4_2.WAV", + "AUDIO\\CUB4_3.WAV", + "AUDIO\\CUB4_4.WAV", + "AUDIO\\CUB4_5.WAV", + "AUDIO\\CUB4_5A.WAV", + "AUDIO\\CUB4_6.WAV", + "AUDIO\\CUB4_7.WAV", + "AUDIO\\CUB4_8.WAV", + "AUDIO\\CUB4_9.WAV", + "AUDIO\\CUB4_10.WAV", + "AUDIO\\CUB4_11.WAV", + "AUDIO\\CUB4_12.WAV", + "AUDIO\\CUB4_13.WAV", + "AUDIO\\CUB4_14.WAV", + "AUDIO\\CUB4_15.WAV", + "AUDIO\\CUB4_16.WAV", + "AUDIO\\GOLF_1.WAV", + "AUDIO\\GOLF_2.WAV", + "AUDIO\\GOLF_3.WAV", + "AUDIO\\BAR_1.WAV", + "AUDIO\\BAR_2.WAV", + "AUDIO\\BAR_3.WAV", + "AUDIO\\BAR_4.WAV", + "AUDIO\\BAR_5.WAV", + "AUDIO\\BAR_6.WAV", + "AUDIO\\BAR_7.WAV", + "AUDIO\\BAR_8.WAV", + "AUDIO\\STRIP_1.WAV", + "AUDIO\\STRIP_2.WAV", + "AUDIO\\STRIP_3.WAV", + "AUDIO\\STRIP_4.WAV", + "AUDIO\\STRIP_5.WAV", + "AUDIO\\STRIP_6.WAV", + "AUDIO\\STRIP_7.WAV", + "AUDIO\\STRIP_8.WAV", + "AUDIO\\STRIP_9.WAV", + "AUDIO\\STAR_1.WAV", + "AUDIO\\STAR_2.WAV", + "AUDIO\\STAR_3.WAV", + "AUDIO\\STAR_4.WAV", + "AUDIO\\FIN_1A.WAV", + "AUDIO\\FIN_1B.WAV", + "AUDIO\\FIN_1C.WAV", + "AUDIO\\FIN_2B.WAV", + "AUDIO\\FIN_2C.WAV", + "AUDIO\\FIN_3.WAV", + "AUDIO\\FIN_4.WAV", + "AUDIO\\FIN_5.WAV", + "AUDIO\\FIN_6.WAV", + "AUDIO\\FIN_10.WAV", + "AUDIO\\FIN_11A.WAV", + "AUDIO\\FIN_11B.WAV", + "AUDIO\\FIN_12A.WAV", + "AUDIO\\FIN_12B.WAV", + "AUDIO\\FIN_12C.WAV", + "AUDIO\\FIN_13.WAV", + "AUDIO\\FINKILL.WAV", + "AUDIO\\LAW1_1.WAV", + "AUDIO\\LAW1_2.WAV", + "AUDIO\\LAW1_3.WAV", + "AUDIO\\LAW1_4.WAV", + "AUDIO\\LAW1_5.WAV", + "AUDIO\\LAW1_6.WAV", + "AUDIO\\LAW1_7.WAV", + "AUDIO\\LAW1_8.WAV", + "AUDIO\\LAW1_9.WAV", + "AUDIO\\LAW1_10.WAV", + "AUDIO\\LAW2_1.WAV", + "AUDIO\\LAW2_2.WAV", + "AUDIO\\LAW2_3.WAV", + "AUDIO\\LAW2_4.WAV", + "AUDIO\\LAW2_5.WAV", + "AUDIO\\LAW2_6.WAV", + "AUDIO\\LAW2_7.WAV", + "AUDIO\\LAW2_8.WAV", + "AUDIO\\LAW2_9.WAV", + "AUDIO\\LAW2_10.WAV", + "AUDIO\\LAW3_1.WAV", + "AUDIO\\LAW3_2.WAV", + "AUDIO\\LAW3_3.WAV", + "AUDIO\\LAW3_4.WAV", + "AUDIO\\LAW3_5.WAV", + "AUDIO\\LAW3_6.WAV", + "AUDIO\\LAW3_10.WAV", + "AUDIO\\LAW3_11.WAV", + "AUDIO\\LAW3_12.WAV", + "AUDIO\\LAW3_13.WAV", + "AUDIO\\LAW3_14.WAV", + "AUDIO\\LAW3_16.WAV", + "AUDIO\\LAW3_17.WAV", + "AUDIO\\LAW3_18.WAV", + "AUDIO\\LAW3_19.WAV", + "AUDIO\\LAW3_20.WAV", + "AUDIO\\LAW3_21.WAV", + "AUDIO\\LAW3_22.WAV", + "AUDIO\\LAW3_23.WAV", + "AUDIO\\LAW3_24.WAV", + "AUDIO\\LAW3_25.WAV", + "AUDIO\\LAW4_1A.WAV", + "AUDIO\\LAW4_1B.WAV", + "AUDIO\\LAW4_1C.WAV", + "AUDIO\\LAW4_1D.WAV", + "AUDIO\\LAW4_10.WAV", + "AUDIO\\LAW4_3.WAV", + "AUDIO\\LAW4_4.WAV", + "AUDIO\\LAW4_5.WAV", + "AUDIO\\LAW4_6.WAV", + "AUDIO\\LAW4_7.WAV", + "AUDIO\\LAW4_8.WAV", + "AUDIO\\LAW4_9.WAV", + "AUDIO\\PHIL1_2.WAV", + "AUDIO\\PHIL1_3.WAV", + "AUDIO\\PHIL2_1.WAV", + "AUDIO\\PHIL2_2.WAV", + "AUDIO\\PHIL2_3.WAV", + "AUDIO\\PHIL2_4.WAV", + "AUDIO\\PHIL2_5.WAV", + "AUDIO\\PHIL2_6.WAV", + "AUDIO\\PHIL2_7.WAV", + "AUDIO\\PHIL2_8.WAV", + "AUDIO\\PHIL2_9.WAV", + "AUDIO\\PHIL210.WAV", + "AUDIO\\PHIL211.WAV", + "AUDIO\\PORN1_1.WAV", + "AUDIO\\PORN1_2.WAV", + "AUDIO\\PORN1_3.WAV", + "AUDIO\\PRN1_3A.WAV", + "AUDIO\\PORN1_4.WAV", + "AUDIO\\PORN1_5.WAV", + "AUDIO\\PORN1_6.WAV", + "AUDIO\\PORN1_7.WAV", + "AUDIO\\PORN1_8.WAV", + "AUDIO\\PORN1_9.WAV", + "AUDIO\\PRN1_10.WAV", + "AUDIO\\PRN1_11.WAV", + "AUDIO\\PRN1_12.WAV", + "AUDIO\\PRN1_13.WAV", + "AUDIO\\PRN1_14.WAV", + "AUDIO\\PRN1_15.WAV", + "AUDIO\\PRN1_16.WAV", + "AUDIO\\PRN1_17.WAV", + "AUDIO\\PRN1_18.WAV", + "AUDIO\\PRN1_19.WAV", + "AUDIO\\PRN1_20.WAV", + "AUDIO\\PRN1_21.WAV", + "AUDIO\\PORN3_1.WAV", + "AUDIO\\PORN3_2.WAV", + "AUDIO\\PORN3_3.WAV", + "AUDIO\\PORN3_4.WAV", + "AUDIO\\PSYCH_1.WAV", + "AUDIO\\PSYCH_2.WAV", + "AUDIO\\ROK2_01.WAV", + "AUDIO\\ROK3_1.WAV", + "AUDIO\\ROK3_2.WAV", + "AUDIO\\ROK3_3.WAV", + "AUDIO\\ROK3_4.WAV", + "AUDIO\\ROK3_5.WAV", + "AUDIO\\ROK3_6.WAV", + "AUDIO\\ROK3_7.WAV", + "AUDIO\\ROK3_8.WAV", + "AUDIO\\ROK3_9.WAV", + "AUDIO\\ROK3_10.WAV", + "AUDIO\\ROK3_11.WAV", + "AUDIO\\ROK3_12.WAV", + "AUDIO\\ROK3_13.WAV", + "AUDIO\\ROK3_14.WAV", + "AUDIO\\ROK3_15.WAV", + "AUDIO\\ROK3_16.WAV", + "AUDIO\\ROK3_17.WAV", + "AUDIO\\ROK3_18.WAV", + "AUDIO\\ROK3_19.WAV", + "AUDIO\\ROK3_20.WAV", + "AUDIO\\ROK3_21.WAV", + "AUDIO\\ROK3_22.WAV", + "AUDIO\\ROK3_23.WAV", + "AUDIO\\ROK3_24.WAV", + "AUDIO\\ROK3_25.WAV", + "AUDIO\\ROK3_26.WAV", + "AUDIO\\ROK3_27.WAV", + "AUDIO\\ROK3_62.WAV", + "AUDIO\\ROK3_63.WAV", + "AUDIO\\ROK3_64.WAV", + "AUDIO\\ROK3_65.WAV", + "AUDIO\\ROK3_66.WAV", + "AUDIO\\ROK3_67.WAV", + "AUDIO\\ROK3_68.WAV", + "AUDIO\\ROK3_69.WAV", + "AUDIO\\ROK3_70.WAV", + "AUDIO\\ROK3_71.WAV", + "AUDIO\\ROK3_73.WAV", + "AUDIO\\RESC_1.WAV", + "AUDIO\\RESC_2.WAV", + "AUDIO\\RESC_3.WAV", + "AUDIO\\RESC_4.WAV", + "AUDIO\\RESC_5.WAV", + "AUDIO\\RESC_6.WAV", + "AUDIO\\RESC_7.WAV", + "AUDIO\\RESC_8.WAV", + "AUDIO\\RESC_9.WAV", + "AUDIO\\RESC_10.WAV", + "AUDIO\\ROK1_1A.WAV", + "AUDIO\\ROK1_1B.WAV", + "AUDIO\\ROK1_5.WAV", + "AUDIO\\ROK1_6.WAV", + "AUDIO\\ROK1_7.WAV", + "AUDIO\\ROK1_8.WAV", + "AUDIO\\ROK1_9.WAV", + "AUDIO\\TAX1_1.WAV", + "AUDIO\\TAX1_2.WAV", + "AUDIO\\TAX1_3.WAV", + "AUDIO\\TAX1_4.WAV", + "AUDIO\\TAX1_5.WAV", + "AUDIO\\TAX2_1.WAV", + "AUDIO\\TAX2_2.WAV", + "AUDIO\\TAX2_3.WAV", + "AUDIO\\TAX2_4.WAV", + "AUDIO\\TAX2_5.WAV", + "AUDIO\\TAX2_6.WAV", + "AUDIO\\TAX2_7.WAV", + "AUDIO\\TAX3_1.WAV", + "AUDIO\\TAX3_2.WAV", + "AUDIO\\TAX3_3.WAV", + "AUDIO\\TAX3_4.WAV", + "AUDIO\\TAX3_5.WAV", + "AUDIO\\TEX1_1.WAV", + "AUDIO\\TEX1_2.WAV", + "AUDIO\\TEX1_3.WAV", + "AUDIO\\TEX1_4.WAV", + "AUDIO\\TEX1_5.WAV", + "AUDIO\\TEX1_6.WAV", + "AUDIO\\TEX2_1.WAV", + "AUDIO\\TEX3_1.WAV", + "AUDIO\\TEX3_2.WAV", + "AUDIO\\TEX3_3.WAV", + "AUDIO\\TEX3_4.WAV", + "AUDIO\\TEX3_5.WAV", + "AUDIO\\TEX3_6.WAV", + "AUDIO\\TEX3_7.WAV", + "AUDIO\\TEX3_8.WAV", + "AUDIO\\HAT_1A.WAV", + "AUDIO\\INTRO1.WAV", + "AUDIO\\INTRO2.WAV", + "AUDIO\\INTRO3.WAV", + "AUDIO\\INTRO4.WAV", + "AUDIO\\MOB_01A.WAV", + "AUDIO\\MOB_01B.WAV", + "AUDIO\\MOB_01C.WAV", + "AUDIO\\MOB_02A.WAV", + "AUDIO\\MOB_02B.WAV", + "AUDIO\\MOB_02C.WAV", + "AUDIO\\MOB_03A.WAV", + "AUDIO\\MOB_03B.WAV", + "AUDIO\\MOB_03C.WAV", + "AUDIO\\MOB_03D.WAV", + "AUDIO\\MOB_03E.WAV", + "AUDIO\\SHARK_1.WAV", + "AUDIO\\SHARK_2.WAV", + "AUDIO\\SHARK_3.WAV", + "AUDIO\\SHARK_4.WAV", + "AUDIO\\SHARK_5.WAV", + "AUDIO\\MOB_04A.WAV", + "AUDIO\\MOB_04B.WAV", + "AUDIO\\MOB_04C.WAV", + "AUDIO\\MOB_04D.WAV", + "AUDIO\\MOB_05A.WAV", + "AUDIO\\MOB_05B.WAV", + "AUDIO\\MOB_05C.WAV", + "AUDIO\\MOB_05D.WAV", + "AUDIO\\MOB_06A.WAV", + "AUDIO\\MOB_06B.WAV", + "AUDIO\\MOB_06C.WAV", + "AUDIO\\MOB_07A.WAV", + "AUDIO\\MOB_07B.WAV", + "AUDIO\\MOB_08A.WAV", + "AUDIO\\MOB_08B.WAV", + "AUDIO\\MOB_08C.WAV", + "AUDIO\\MOB_08D.WAV", + "AUDIO\\MOB_08E.WAV", + "AUDIO\\MOB_08F.WAV", + "AUDIO\\MOB_08G.WAV", + "AUDIO\\MOB_09A.WAV", + "AUDIO\\MOB_09B.WAV", + "AUDIO\\MOB_09C.WAV", + "AUDIO\\MOB_09D.WAV", + "AUDIO\\MOB_09E.WAV", + "AUDIO\\MOB_09F.WAV", + "AUDIO\\MOB_10A.WAV", + "AUDIO\\MOB_10B.WAV", + "AUDIO\\MOB_10C.WAV", + "AUDIO\\MOB_10D.WAV", + "AUDIO\\MOB_10E.WAV", + "AUDIO\\MOB_11A.WAV", + "AUDIO\\MOB_11B.WAV", + "AUDIO\\MOB_11C.WAV", + "AUDIO\\MOB_11D.WAV", + "AUDIO\\MOB_11E.WAV", + "AUDIO\\MOB_11F.WAV", + "AUDIO\\MOB_14A.WAV", + "AUDIO\\MOB_14B.WAV", + "AUDIO\\MOB_14C.WAV", + "AUDIO\\MOB_14D.WAV", + "AUDIO\\MOB_14E.WAV", + "AUDIO\\MOB_14F.WAV", + "AUDIO\\MOB_14G.WAV", + "AUDIO\\MOB_14H.WAV", + "AUDIO\\MOB_16A.WAV", + "AUDIO\\MOB_16B.WAV", + "AUDIO\\MOB_16C.WAV", + "AUDIO\\MOB_16D.WAV", + "AUDIO\\MOB_16E.WAV", + "AUDIO\\MOB_16F.WAV", + "AUDIO\\MOB_16G.WAV", + "AUDIO\\MOB_17A.WAV", + "AUDIO\\MOB_17B.WAV", + "AUDIO\\MOB_17C.WAV", + "AUDIO\\MOB_17D.WAV", + "AUDIO\\MOB_17E.WAV", + "AUDIO\\MOB_17G.WAV", + "AUDIO\\MOB_17H.WAV", + "AUDIO\\MOB_17I.WAV", + "AUDIO\\MOB_17J.WAV", + "AUDIO\\MOB_17K.WAV", + "AUDIO\\MOB_17L.WAV", + "AUDIO\\MOB_18A.WAV", + "AUDIO\\MOB_18B.WAV", + "AUDIO\\MOB_18C.WAV", + "AUDIO\\MOB_18D.WAV", + "AUDIO\\MOB_18E.WAV", + "AUDIO\\MOB_18F.WAV", + "AUDIO\\MOB_18G.WAV", + "AUDIO\\MOB_20A.WAV", + "AUDIO\\MOB_20B.WAV", + "AUDIO\\MOB_20C.WAV", + "AUDIO\\MOB_20D.WAV", + "AUDIO\\MOB_20E.WAV", + "AUDIO\\MOB_24A.WAV", + "AUDIO\\MOB_24B.WAV", + "AUDIO\\MOB_24C.WAV", + "AUDIO\\MOB_24D.WAV", + "AUDIO\\MOB_24E.WAV", + "AUDIO\\MOB_24F.WAV", + "AUDIO\\MOB_24G.WAV", + "AUDIO\\MOB_24H.WAV", + "AUDIO\\MOB_25A.WAV", + "AUDIO\\MOB_25B.WAV", + "AUDIO\\MOB_25C.WAV", + "AUDIO\\MOB_25D.WAV", + "AUDIO\\MOB_26A.WAV", + "AUDIO\\MOB_26B.WAV", + "AUDIO\\MOB_26C.WAV", + "AUDIO\\MOB_26D.WAV", + "AUDIO\\MOB_26E.WAV", + "AUDIO\\MOB_29A.WAV", + "AUDIO\\MOB_29B.WAV", + "AUDIO\\MOB_29C.WAV", + "AUDIO\\MOB_29D.WAV", + "AUDIO\\MOB_29E.WAV", + "AUDIO\\MOB_29F.WAV", + "AUDIO\\MOB_29G.WAV", + "AUDIO\\MOB_30A.WAV", + "AUDIO\\MOB_30B.WAV", + "AUDIO\\MOB_30C.WAV", + "AUDIO\\MOB_30D.WAV", + "AUDIO\\MOB_30E.WAV", + "AUDIO\\MOB_30F.WAV", + "AUDIO\\MOB_33A.WAV", + "AUDIO\\MOB_33B.WAV", + "AUDIO\\MOB_33C.WAV", + "AUDIO\\MOB_33D.WAV", + "AUDIO\\MOB_34A.WAV", + "AUDIO\\MOB_34B.WAV", + "AUDIO\\MOB_34C.WAV", + "AUDIO\\MOB_34D.WAV", + "AUDIO\\MOB_35A.WAV", + "AUDIO\\MOB_35B.WAV", + "AUDIO\\MOB_35C.WAV", + "AUDIO\\MOB_35D.WAV", + "AUDIO\\MOB_36A.WAV", + "AUDIO\\MOB_36B.WAV", + "AUDIO\\MOB_36C.WAV", + "AUDIO\\MOB_40A.WAV", + "AUDIO\\MOB_40B.WAV", + "AUDIO\\MOB_40C.WAV", + "AUDIO\\MOB_40D.WAV", + "AUDIO\\MOB_40E.WAV", + "AUDIO\\MOB_40F.WAV", + "AUDIO\\MOB_40G.WAV", + "AUDIO\\MOB_40H.WAV", + "AUDIO\\MOB_40I.WAV", + "AUDIO\\MOB_41A.WAV", + "AUDIO\\MOB_41B.WAV", + "AUDIO\\MOB_41C.WAV", + "AUDIO\\MOB_41D.WAV", + "AUDIO\\MOB_41E.WAV", + "AUDIO\\MOB_41F.WAV", + "AUDIO\\MOB_41G.WAV", + "AUDIO\\MOB_41H.WAV", + "AUDIO\\MOB_42A.WAV", + "AUDIO\\MOB_42B.WAV", + "AUDIO\\MOB_42C.WAV", + "AUDIO\\MOB_42D.WAV", + "AUDIO\\MOB_42E.WAV", + "AUDIO\\MOB_43A.WAV", + "AUDIO\\MOB_43B.WAV", + "AUDIO\\MOB_43C.WAV", + "AUDIO\\MOB_43D.WAV", + "AUDIO\\MOB_43E.WAV", + "AUDIO\\MOB_43F.WAV", + "AUDIO\\MOB_43G.WAV", + "AUDIO\\MOB_43H.WAV", + "AUDIO\\MOB_45A.WAV", + "AUDIO\\MOB_45B.WAV", + "AUDIO\\MOB_45C.WAV", + "AUDIO\\MOB_45D.WAV", + "AUDIO\\MOB_45E.WAV", + "AUDIO\\MOB_45F.WAV", + "AUDIO\\MOB_45G.WAV", + "AUDIO\\MOB_45H.WAV", + "AUDIO\\MOB_45I.WAV", + "AUDIO\\MOB_45J.WAV", + "AUDIO\\MOB_45K.WAV", + "AUDIO\\MOB_45L.WAV", + "AUDIO\\MOB_45M.WAV", + "AUDIO\\MOB_45N.WAV", + "AUDIO\\MOB_46A.WAV", + "AUDIO\\MOB_46B.WAV", + "AUDIO\\MOB_46C.WAV", + "AUDIO\\MOB_46D.WAV", + "AUDIO\\MOB_46E.WAV", + "AUDIO\\MOB_46F.WAV", + "AUDIO\\MOB_46G.WAV", + "AUDIO\\MOB_46H.WAV", + "AUDIO\\MOB_47A.WAV", + "AUDIO\\MOB_52A.WAV", + "AUDIO\\MOB_52B.WAV", + "AUDIO\\MOB_52C.WAV", + "AUDIO\\MOB_52D.WAV", + "AUDIO\\MOB_52E.WAV", + "AUDIO\\MOB_52F.WAV", + "AUDIO\\MOB_52G.WAV", + "AUDIO\\MOB_52H.WAV", + "AUDIO\\MOB_54A.WAV", + "AUDIO\\MOB_54B.WAV", + "AUDIO\\MOB_54C.WAV", + "AUDIO\\MOB_54D.WAV", + "AUDIO\\MOB_54E.WAV", + "AUDIO\\MOB_55A.WAV", + "AUDIO\\MOB_55B.WAV", + "AUDIO\\MOB_55C.WAV", + "AUDIO\\MOB_55D.WAV", + "AUDIO\\MOB_55E.WAV", + "AUDIO\\MOB_55F.WAV", + "AUDIO\\MOB_56A.WAV", + "AUDIO\\MOB_56B.WAV", + "AUDIO\\MOB_56C.WAV", + "AUDIO\\MOB_56D.WAV", + "AUDIO\\MOB_56E.WAV", + "AUDIO\\MOB_56F.WAV", + "AUDIO\\MOB_57A.WAV", + "AUDIO\\MOB_57B.WAV", + "AUDIO\\MOB_57C.WAV", + "AUDIO\\MOB_57D.WAV", + "AUDIO\\MOB_57E.WAV", + "AUDIO\\MOB_58A.WAV", + "AUDIO\\MOB_58B.WAV", + "AUDIO\\MOB_58C.WAV", + "AUDIO\\MOB_58D.WAV", + "AUDIO\\MOB_58E.WAV", + "AUDIO\\MOB_58F.WAV", + "AUDIO\\MOB_58G.WAV", + "AUDIO\\MOB_61A.WAV", + "AUDIO\\MOB_61B.WAV", + "AUDIO\\MOB_62A.WAV", + "AUDIO\\MOB_62B.WAV", + "AUDIO\\MOB_62C.WAV", + "AUDIO\\MOB_62D.WAV", + "AUDIO\\MOB_63A.WAV", + "AUDIO\\MOB_63B.WAV", + "AUDIO\\MOB_63C.WAV", + "AUDIO\\MOB_63D.WAV", + "AUDIO\\MOB_63E.WAV", + "AUDIO\\MOB_63F.WAV", + "AUDIO\\MOB_63G.WAV", + "AUDIO\\MOB_63H.WAV", + "AUDIO\\MOB_63I.WAV", + "AUDIO\\MOB_63J.WAV", + "AUDIO\\MOB_66A.WAV", + "AUDIO\\MOB_66B.WAV", + "AUDIO\\MOB_68A.WAV", + "AUDIO\\MOB_68B.WAV", + "AUDIO\\MOB_68C.WAV", + "AUDIO\\MOB_68D.WAV", + "AUDIO\\MOB_70A.WAV", + "AUDIO\\MOB_70B.WAV", + "AUDIO\\MOB_71A.WAV", + "AUDIO\\MOB_71B.WAV", + "AUDIO\\MOB_71C.WAV", + "AUDIO\\MOB_71D.WAV", + "AUDIO\\MOB_71E.WAV", + "AUDIO\\MOB_71F.WAV", + "AUDIO\\MOB_71G.WAV", + "AUDIO\\MOB_71H.WAV", + "AUDIO\\MOB_71I.WAV", + "AUDIO\\MOB_71J.WAV", + "AUDIO\\MOB_71K.WAV", + "AUDIO\\MOB_71L.WAV", + "AUDIO\\MOB_71M.WAV", + "AUDIO\\MOB_71N.WAV", + "AUDIO\\MOB_72A.WAV", + "AUDIO\\MOB_72B.WAV", + "AUDIO\\MOB_72C.WAV", + "AUDIO\\MOB_72D.WAV", + "AUDIO\\MOB_72E.WAV", + "AUDIO\\MOB_72F.WAV", + "AUDIO\\MOB_72G.WAV", + "AUDIO\\MOB_73A.WAV", + "AUDIO\\MOB_73C.WAV", + "AUDIO\\MOB_73D.WAV", + "AUDIO\\MOB_73F.WAV", + "AUDIO\\MOB_73G.WAV", + "AUDIO\\MOB_73I.WAV", + "AUDIO\\MOB_95A.WAV", + "AUDIO\\MOB_96A.WAV", + "AUDIO\\MOB_98A.WAV", + "AUDIO\\MOB_99A.WAV", + "AUDIO\\JOB1_1B.WAV", + "AUDIO\\JOB1_1C.WAV", + "AUDIO\\JOB1_1D.WAV", + "AUDIO\\JOB2_1B.WAV", + "AUDIO\\JOB2_2.WAV", + "AUDIO\\JOB2_3.WAV", + "AUDIO\\JOB2_4.WAV", + "AUDIO\\JOB2_5.WAV", + "AUDIO\\JOB2_6.WAV", + "AUDIO\\JOB2_7.WAV", + "AUDIO\\JOB2_8.WAV", + "AUDIO\\JOB2_9.WAV", + "AUDIO\\JOB3_1.WAV", + "AUDIO\\JOB3_2.WAV", + "AUDIO\\JOB3_3.WAV", + "AUDIO\\JOB4_1.WAV", + "AUDIO\\JOB4_2.WAV", + "AUDIO\\JOB4_3.WAV", + "AUDIO\\JOB5_1.WAV", + "AUDIO\\JOB5_2.WAV", + "AUDIO\\JOB5_3.WAV", + "AUDIO\\BJM1_20.WAV", + "AUDIO\\BJM1_4.WAV", + "AUDIO\\BJM1_5.WAV", + "AUDIO\\MERC_39.WAV", + "AUDIO\\MONO_1.WAV", + "AUDIO\\MONO_2.WAV", + "AUDIO\\MONO_3.WAV", + "AUDIO\\MONO_4.WAV", + "AUDIO\\MONO_5.WAV", + "AUDIO\\MONO_6.WAV", + "AUDIO\\MONO_7.WAV", + "AUDIO\\MONO_8.WAV", + "AUDIO\\MONO_9.WAV", + "AUDIO\\MONO10.WAV", + "AUDIO\\MONO11.WAV", + "AUDIO\\MONO12.WAV", + "AUDIO\\MONO13.WAV", + "AUDIO\\MONO14.WAV", + "AUDIO\\MONO15.WAV", + "AUDIO\\MONO16.WAV", + "AUDIO\\FUD_01.WAV", + "AUDIO\\FUD_02.WAV", + "AUDIO\\FUD_03.WAV", + "AUDIO\\FUD_04.WAV", + "AUDIO\\FUD_05.WAV", + "AUDIO\\FUD_06.WAV", + "AUDIO\\FUD_07.WAV", + "AUDIO\\FUD_08.WAV", + "AUDIO\\FUD_09.WAV", + "AUDIO\\FUD_10.WAV", + "AUDIO\\FUD_11.WAV", + "AUDIO\\FUD_12.WAV", + "AUDIO\\FUD_13.WAV", + "AUDIO\\FUD_14.WAV", + "AUDIO\\FUD_15.WAV", + "AUDIO\\FUD_16.WAV", + "AUDIO\\FUD_17.WAV", + "AUDIO\\FUD_18.WAV", + "AUDIO\\FUD_19.WAV", + "AUDIO\\FUD_20.WAV", + "AUDIO\\BURG_01.WAV", + "AUDIO\\BURG_02.WAV", + "AUDIO\\BURG_03.WAV", + "AUDIO\\BURG_04.WAV", + "AUDIO\\BURG_05.WAV", + "AUDIO\\BURG_06.WAV", + "AUDIO\\BURG_07.WAV", + "AUDIO\\BURG_08.WAV", + "AUDIO\\BURG_09.WAV", + "AUDIO\\BURG_10.WAV", + "AUDIO\\BURG_11.WAV", + "AUDIO\\BURG_12.WAV", + "AUDIO\\CRUST01.WAV", + "AUDIO\\CRUST02.WAV", + "AUDIO\\CRUST03.WAV", + "AUDIO\\CRUST04.WAV", + "AUDIO\\CRUST05.WAV", + "AUDIO\\CRUST06.WAV", + "AUDIO\\CRUST07.WAV", + "AUDIO\\CRUST08.WAV", + "AUDIO\\CRUST09.WAV", + "AUDIO\\BAND_01.WAV", + "AUDIO\\BAND_02.WAV", + "AUDIO\\BAND_03.WAV", + "AUDIO\\BAND_04.WAV", + "AUDIO\\BAND_05.WAV", + "AUDIO\\BAND_06.WAV", + "AUDIO\\BAND_07.WAV", + "AUDIO\\BAND_08.WAV", + "AUDIO\\SHAFT01.WAV", + "AUDIO\\SHAFT02.WAV", + "AUDIO\\SHAFT03.WAV", + "AUDIO\\SHAFT04.WAV", + "AUDIO\\SHAFT05.WAV", + "AUDIO\\SHAFT06.WAV", + "AUDIO\\SHAFT07.WAV", + "AUDIO\\SHAFT08.WAV", + "AUDIO\\PISS_01.WAV", + "AUDIO\\PISS_02.WAV", + "AUDIO\\PISS_03.WAV", + "AUDIO\\PISS_04.WAV", + "AUDIO\\PISS_05.WAV", + "AUDIO\\PISS_06.WAV", + "AUDIO\\PISS_07.WAV", + "AUDIO\\PISS_08.WAV", + "AUDIO\\PISS_09.WAV", + "AUDIO\\PISS_10.WAV", + "AUDIO\\PISS_11.WAV", + "AUDIO\\PISS_12.WAV", + "AUDIO\\PISS_13.WAV", + "AUDIO\\PISS_14.WAV", + "AUDIO\\PISS_15.WAV", + "AUDIO\\PISS_16.WAV", + "AUDIO\\PISS_17.WAV", + "AUDIO\\PISS_18.WAV", + "AUDIO\\PISS_19.WAV", + "AUDIO\\GIMME01.WAV", + "AUDIO\\GIMME02.WAV", + "AUDIO\\GIMME03.WAV", + "AUDIO\\GIMME04.WAV", + "AUDIO\\GIMME05.WAV", + "AUDIO\\GIMME06.WAV", + "AUDIO\\GIMME07.WAV", + "AUDIO\\GIMME08.WAV", + "AUDIO\\GIMME09.WAV", + "AUDIO\\GIMME10.WAV", + "AUDIO\\GIMME11.WAV", + "AUDIO\\GIMME12.WAV", + "AUDIO\\GIMME13.WAV", + "AUDIO\\GIMME14.WAV", + "AUDIO\\GIMME15.WAV", + "AUDIO\\BUST_01.WAV", + "AUDIO\\BUST_02.WAV", + "AUDIO\\BUST_03.WAV", + "AUDIO\\BUST_04.WAV", + "AUDIO\\BUST_05.WAV", + "AUDIO\\BUST_06.WAV", + "AUDIO\\BUST_07.WAV", + "AUDIO\\BUST_08.WAV", + "AUDIO\\BUST_09.WAV", + "AUDIO\\BUST_10.WAV", + "AUDIO\\BUST_11.WAV", + "AUDIO\\BUST_12.WAV", + "AUDIO\\BUST_13.WAV", + "AUDIO\\BUST_14.WAV", + "AUDIO\\BUST_15.WAV", + "AUDIO\\BUST_16.WAV", + "AUDIO\\BUST_17.WAV", + "AUDIO\\BUST_18.WAV", + "AUDIO\\BUST_19.WAV", + "AUDIO\\BUST_20.WAV", + "AUDIO\\BUST_21.WAV", + "AUDIO\\BUST_22.WAV", + "AUDIO\\BUST_23.WAV", + "AUDIO\\BUST_24.WAV", + "AUDIO\\BUST_25.WAV", + "AUDIO\\BUST_26.WAV", + "AUDIO\\BUST_27.WAV", + "AUDIO\\BUST_28.WAV", }; \ No newline at end of file diff --git a/src/audio/sampman_miles.cpp b/src/audio/sampman_miles.cpp index bf91a87..3eee78a 100644 --- a/src/audio/sampman_miles.cpp +++ b/src/audio/sampman_miles.cpp @@ -1054,7 +1054,7 @@ cSampleManager::Initialise(void) m_szCDRomRootPath[0] = '\0'; strcpy(m_WavFilesPath, m_szCDRomRootPath); - /* + #ifdef AUDIO_CACHE if ( CreateCache ) #endif @@ -1081,7 +1081,7 @@ cSampleManager::Initialise(void) return false; } } - */ + // Find path of MP3s (originally in CD-Rom) // if NO_CDCHECK is NOT defined but AUDIO_CACHE is defined, we still need to find MP3s' path, but will exit after the first file #ifndef NO_CDCHECK @@ -1099,7 +1099,7 @@ cSampleManager::Initialise(void) { #endif - for (int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++) + for (int32 i = 0; i < STREAMED_SOUND_MISSION_MOBR1; i++) { strcpy(filepath, m_MP3FilesPath); strcat(filepath, StreamedNameTable[i]); @@ -1140,7 +1140,7 @@ cSampleManager::Initialise(void) #endif if ( !bFileNotFound ) { -/* + #ifdef AUDIO_CACHE if ( CreateCache ) #endif @@ -1166,7 +1166,7 @@ cSampleManager::Initialise(void) bFileNotFound = true; break; } - }*/ + } } m_bInitialised = !bFileNotFound; @@ -2043,7 +2043,7 @@ cSampleManager::PreloadStreamedFile(uint32 nFile, uint8 nStream) char filepath[MAX_PATH]; - strcpy(filepath, m_MP3FilesPath); + strcpy(filepath, nFile < STREAMED_SOUND_MISSION_COMPLETED4 ? m_MP3FilesPath : (nFile < STREAMED_SOUND_MISSION_MOBR1 ? m_MiscomPath : m_WavFilesPath)); strcat(filepath, StreamedNameTable[nFile]); mp3Stream[nStream] = AIL_open_stream(DIG, filepath, 0); @@ -2082,142 +2082,136 @@ cSampleManager::StartPreloadedStreamedFile(uint8 nStream) bool cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream) { + int i = 0; uint32 position = nPos; char filename[MAX_PATH]; - if ( m_bInitialised && nFile < TOTAL_STREAMED_SOUNDS ) + if ( !m_bInitialised || nFile >= TOTAL_STREAMED_SOUNDS ) + return false; + + if ( mp3Stream[nStream] ) { - if ( mp3Stream[nStream] ) + AIL_pause_stream(mp3Stream[nStream], 1); + AIL_close_stream(mp3Stream[nStream]); + } + if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER ) + { + do { - AIL_pause_stream(mp3Stream[nStream], 1); - AIL_close_stream(mp3Stream[nStream]); - } - - if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER ) - { - uint32 i = 0; - do { - if(i != 0 || _bIsMp3Active) { - if(++_CurMP3Index >= nNumMP3s) _CurMP3Index = 0; - - _CurMP3Pos = 0; - - tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index); - - if(mp3) { - mp3 = _pMP3List; - if(mp3 == NULL) { - _bIsMp3Active = false; - nFile = 0; - strcpy(filename, m_MiscomPath); - strcat(filename, StreamedNameTable[nFile]); - - mp3Stream[nStream] = - AIL_open_stream(DIG, filename, 0); - if(mp3Stream[nStream]) { - AIL_set_stream_loop_count( - mp3Stream[nStream], nStreamLoopedFlag[nStream] ? 0 : 1); - nStreamLoopedFlag[nStream] = true; - AIL_set_stream_ms_position( - mp3Stream[nStream], position); - AIL_pause_stream(mp3Stream[nStream], - 0); - return true; - } - - return false; - } - } - - if(mp3->pLinkPath != NULL) - mp3Stream[nStream] = - AIL_open_stream(DIG, mp3->pLinkPath, 0); - else { - strcpy(filename, _mp3DirectoryPath); - strcat(filename, mp3->aFilename); - - mp3Stream[nStream] = - AIL_open_stream(DIG, filename, 0); - } + // Just switched to MP3 player + if ( !_bIsMp3Active && i == 0 ) + { + if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] ) + position = 0; + tMP3Entry *e = _pMP3List; + // Try to continue from previous song, if already started + if(!_GetMP3PosFromStreamPos(&position, &e) && !e) { + nFile = 0; + strcpy(filename, m_MiscomPath); + strcat(filename, StreamedNameTable[nFile]); + mp3Stream[nStream] = + AIL_open_stream(DIG, filename, 0); if(mp3Stream[nStream]) { - AIL_set_stream_loop_count(mp3Stream[nStream], 1); - AIL_set_stream_ms_position(mp3Stream[nStream], 0); + AIL_set_stream_loop_count(mp3Stream[nStream], nStreamLoopedFlag[nStream] ? 0 : 1); + nStreamLoopedFlag[nStream] = true; + AIL_set_stream_ms_position(mp3Stream[nStream], position); AIL_pause_stream(mp3Stream[nStream], 0); return true; } + return false; - _bIsMp3Active = false; - continue; - } - if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] ) - position = 0; + } else { + if ( e->pLinkPath != NULL ) + mp3Stream[nStream] = AIL_open_stream(DIG, e->pLinkPath, 0); + else { + strcpy(filename, _mp3DirectoryPath); + strcat(filename, e->aFilename); + + mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0); + } + + if ( mp3Stream[nStream] ) { + AIL_set_stream_loop_count(mp3Stream[nStream], 1); + AIL_set_stream_ms_position(mp3Stream[nStream], position); + AIL_pause_stream(mp3Stream[nStream], 0); + + _bIsMp3Active = true; - tMP3Entry *e; - if ( !_GetMP3PosFromStreamPos(&position, &e) ) + return true; + } + // fall through, start playing from another song + } + } else { + if(++_CurMP3Index >= nNumMP3s) _CurMP3Index = 0; + + _CurMP3Pos = 0; + + tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index); + if ( !mp3 ) { - if ( e == NULL ) + mp3 = _pMP3List; + if ( !_pMP3List ) { nFile = 0; + _bIsMp3Active = 0; strcpy(filename, m_MiscomPath); strcat(filename, StreamedNameTable[nFile]); + mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0); if(mp3Stream[nStream]) { - AIL_set_stream_loop_count(mp3Stream[nStream], nStreamLoopedFlag[nStream] ? 0 : 1); + AIL_set_stream_loop_count( + mp3Stream[nStream], nStreamLoopedFlag[nStream] ? 0 : 1); nStreamLoopedFlag[nStream] = true; - AIL_set_stream_ms_position(mp3Stream[nStream], position); - AIL_pause_stream(mp3Stream[nStream], 0); + AIL_set_stream_ms_position( + mp3Stream[nStream], position); + AIL_pause_stream(mp3Stream[nStream], + 0); return true; } - return false; } } - - if ( e->pLinkPath != NULL ) - mp3Stream[nStream] = AIL_open_stream(DIG, e->pLinkPath, 0); - else - { + if(mp3->pLinkPath != NULL) + mp3Stream[nStream] = AIL_open_stream(DIG, mp3->pLinkPath, 0); + else { strcpy(filename, _mp3DirectoryPath); - strcat(filename, e->aFilename); - - mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0); + strcat(filename, mp3->aFilename); + + mp3Stream[nStream] = + AIL_open_stream(DIG, filename, 0); } - - if ( mp3Stream[nStream] ) - { + + if(mp3Stream[nStream]) { AIL_set_stream_loop_count(mp3Stream[nStream], 1); - AIL_set_stream_ms_position(mp3Stream[nStream], position); + AIL_set_stream_ms_position(mp3Stream[nStream], 0); AIL_pause_stream(mp3Stream[nStream], 0); - +#ifdef FIX_BUGS _bIsMp3Active = true; - +#endif return true; } - - _bIsMp3Active = false; - } while(++i < nNumMP3s); - - position = 0; - nFile = 0; - } - - strcpy(filename, m_MiscomPath); - strcat(filename, StreamedNameTable[nFile]); - - mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0); - if ( mp3Stream[nStream] ) - { - AIL_set_stream_loop_count(mp3Stream[nStream], nStreamLoopedFlag[nStream] ? 0 : 1); - nStreamLoopedFlag[nStream] = true; - AIL_set_stream_ms_position(mp3Stream[nStream], position); - AIL_pause_stream(mp3Stream[nStream], 0); - return true; + } + _bIsMp3Active = 0; } + while ( ++i < nNumMP3s ); + position = 0; + nFile = 0; } + strcpy(filename, m_MiscomPath); + strcat(filename, StreamedNameTable[nFile]); + mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0); + if ( mp3Stream[nStream] ) + { + AIL_set_stream_loop_count(mp3Stream[nStream], nStreamLoopedFlag[nStream] ? 0 : 1); + nStreamLoopedFlag[nStream] = true; + AIL_set_stream_ms_position(mp3Stream[nStream], position); + AIL_pause_stream(mp3Stream[nStream], 0); + return true; + } return false; } diff --git a/src/audio/sampman_oal.cpp b/src/audio/sampman_oal.cpp index 57a7024..5a300cf 100644 --- a/src/audio/sampman_oal.cpp +++ b/src/audio/sampman_oal.cpp @@ -392,7 +392,7 @@ set_new_provider(int index) static bool IsThisTrackAt16KHz(uint32 track) { - return false;// track == STREAMED_SOUND_RADIO_KCHAT || track == STREAMED_SOUND_RADIO_VCPR || track == STREAMED_SOUND_RADIO_POLICE; + return track == STREAMED_SOUND_RADIO_KCHAT || track == STREAMED_SOUND_RADIO_VCPR || track == STREAMED_SOUND_RADIO_POLICE; } cSampleManager::cSampleManager(void) @@ -1734,93 +1734,94 @@ cSampleManager::StartPreloadedStreamedFile(uint8 nStream) bool cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream) { + int i = 0; uint32 position = nPos; - char filename[256]; + char filename[MAX_PATH]; - ASSERT( nStream < MAX_STREAMS ); - - if ( nFile < TOTAL_STREAMED_SOUNDS ) + if ( nFile >= TOTAL_STREAMED_SOUNDS ) + return false; + + if ( aStream[nStream] ) { - if ( aStream[nStream] ) + delete aStream[nStream]; + aStream[nStream] = NULL; + } + if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER ) + { + do { - delete aStream[nStream]; - aStream[nStream] = NULL; - } - - if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER ) - { - uint32 i = 0; - do { - if(i != 0 || _bIsMp3Active) { - if(++_CurMP3Index >= nNumMP3s) _CurMP3Index = 0; + // Just switched to MP3 player + if ( !_bIsMp3Active && i == 0 ) + { + if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] ) + position = 0; + tMP3Entry *e = _pMP3List; - _CurMP3Pos = 0; + // Try to continue from previous song, if already started + if(!_GetMP3PosFromStreamPos(&position, &e) && !e) { + nFile = 0; - tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index); + strcpy(filename, StreamedNameTable[nFile]); + CStream* stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); - if(mp3) { - mp3 = _pMP3List; - if(mp3 == NULL) { - _bIsMp3Active = false; - nFile = 0; - strcat(filename, StreamedNameTable[nFile]); + aStream[nStream] = stream; - CStream* stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); - ASSERT(stream != NULL); + if (stream->Setup()) { + stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1); + nStreamLoopedFlag[nStream] = true; + if (position != 0) + stream->SetPosMS(position); - aStream[nStream] = stream; + stream->Start(); - if (stream->Setup()) { - stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1); - nStreamLoopedFlag[nStream] = true; - if (position != 0) - stream->SetPosMS(position); - - stream->Start(); - - return true; - } else { - delete stream; - aStream[nStream] = NULL; - } - - return false; - } + return true; + } else { + delete stream; + aStream[nStream] = NULL; } + return false; - if (mp3->pLinkPath != NULL) - aStream[nStream] = new CStream(mp3->pLinkPath, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); + } else { + + if (e->pLinkPath != NULL) + aStream[nStream] = new CStream(e->pLinkPath, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); else { strcpy(filename, _mp3DirectoryPath); - strcat(filename, mp3->aFilename); + strcat(filename, e->aFilename); - aStream[nStream] = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); + aStream[nStream] = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream]); } if (aStream[nStream]->Setup()) { + if (position != 0) + aStream[nStream]->SetPosMS(position); + aStream[nStream]->Start(); + _bIsMp3Active = true; return true; } else { delete aStream[nStream]; aStream[nStream] = NULL; } - - _bIsMp3Active = false; - continue; + // fall through, start playing from another song } - if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] ) - position = 0; - - tMP3Entry *e; - if ( !_GetMP3PosFromStreamPos(&position, &e) ) + } else { + if(++_CurMP3Index >= nNumMP3s) _CurMP3Index = 0; + + _CurMP3Pos = 0; + + tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index); + if ( !mp3 ) { - if ( e == NULL ) + mp3 = _pMP3List; + if ( !_pMP3List ) { nFile = 0; - strcat(filename, StreamedNameTable[nFile]); + _bIsMp3Active = 0; + strcpy(filename, StreamedNameTable[nFile]); + CStream* stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); - ASSERT(stream != NULL); aStream[nStream] = stream; @@ -1837,63 +1838,55 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream) delete stream; aStream[nStream] = NULL; } - return false; } } - - if (e->pLinkPath != NULL) - aStream[nStream] = new CStream(e->pLinkPath, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); + if (mp3->pLinkPath != NULL) + aStream[nStream] = new CStream(mp3->pLinkPath, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); else { strcpy(filename, _mp3DirectoryPath); - strcat(filename, e->aFilename); + strcat(filename, mp3->aFilename); - aStream[nStream] = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream]); + aStream[nStream] = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); } if (aStream[nStream]->Setup()) { - if (position != 0) - aStream[nStream]->SetPosMS(position); - aStream[nStream]->Start(); - +#ifdef FIX_BUGS _bIsMp3Active = true; +#endif return true; } else { delete aStream[nStream]; aStream[nStream] = NULL; } - - _bIsMp3Active = false; - } while(++i < nNumMP3s); - - position = 0; - nFile = 0; - } - - strcpy(filename, StreamedNameTable[nFile]); - - CStream *stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); - ASSERT(stream != NULL); - - aStream[nStream] = stream; - - if ( stream->Setup() ) { - stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1); - nStreamLoopedFlag[nStream] = true; - if (position != 0) - stream->SetPosMS(position); - - stream->Start(); - - return true; - } else { - delete stream; - aStream[nStream] = NULL; + } + _bIsMp3Active = 0; } + while ( ++i < nNumMP3s ); + position = 0; + nFile = 0; } + strcpy(filename, StreamedNameTable[nFile]); + CStream *stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); + + aStream[nStream] = stream; + + if ( stream->Setup() ) { + stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1); + nStreamLoopedFlag[nStream] = true; + if (position != 0) + stream->SetPosMS(position); + + stream->Start(); + + return true; + } else { + delete stream; + aStream[nStream] = NULL; + } return false; } diff --git a/src/collision/ColBox.h b/src/collision/ColBox.h index 721756b..0df5592 100644 --- a/src/collision/ColBox.h +++ b/src/collision/ColBox.h @@ -19,12 +19,4 @@ struct CColBox : public CBox using CBox::Set; CColBox& operator=(const CColBox &other); -}; - -// no name for this -// bounds for a number of triangles -struct CColTriBBox : public CBox -{ - int32 first; - int32 last; -}; +}; \ No newline at end of file diff --git a/src/collision/ColLine.h b/src/collision/ColLine.h index a2cb9a0..21587a0 100644 --- a/src/collision/ColLine.h +++ b/src/collision/ColLine.h @@ -4,9 +4,9 @@ struct CColLine { // NB: this has to be compatible with two CVuVectors CVector p0; -// int pad0; + int pad0; CVector p1; -// int pad1; + int pad1; CColLine(void) { }; CColLine(const CVector &p0, const CVector &p1) { this->p0 = p0; this->p1 = p1; }; diff --git a/src/collision/ColModel.cpp b/src/collision/ColModel.cpp index 2071369..49847db 100644 --- a/src/collision/ColModel.cpp +++ b/src/collision/ColModel.cpp @@ -1,5 +1,4 @@ #include "common.h" -#include "main.h" #include "ColModel.h" #include "Collision.h" #include "Game.h" @@ -8,10 +7,6 @@ CColModel::CColModel(void) { - boundingSphere.Set(0.0001f, CVector(0.0f, 0.0f, 0.0f)); - boundingBox.Set(CVector(0.0f, 0.0f, 0.0f), CVector(0.0f, 0.0f, 0.0f)); - numTriBBoxes = 0; - triBBoxes = nil; numSpheres = 0; spheres = nil; numLines = 0; @@ -23,18 +18,14 @@ CColModel::CColModel(void) triangles = nil; trianglePlanes = nil; level = LEVEL_GENERIC; // generic col slot -// ownsCollisionVolumes = true; + ownsCollisionVolumes = true; } CColModel::~CColModel(void) { - if(!gNASTY_NASTY_MEM_SHUTDOWN_HACK){ - RemoveTrianglePlanes(); - RemoveCollisionVolumes(); - } + RemoveCollisionVolumes(); } -//--LCS: no pool used, but maybe we better keep it? void* CColModel::operator new(size_t) { @@ -52,28 +43,19 @@ CColModel::operator delete(void *p, size_t) void CColModel::RemoveCollisionVolumes(void) { -#ifdef FIX_BUGS - // why is this missing? - if(ownsCollisionVolumes) -#endif - if(!gUseChunkFiles){ - delete[] triBBoxes; - delete[] spheres; - delete[] lines; - delete[] boxes; - delete[] vertices; - delete[] triangles; + if(ownsCollisionVolumes){ + RwFree(spheres); + RwFree(lines); + RwFree(boxes); + RwFree(vertices); + RwFree(triangles); + CCollision::RemoveTrianglePlanes(this); } - CCollision::RemoveTrianglePlanes(this); numSpheres = 0; - numTriBBoxes = 0; numLines = 0; numBoxes = 0; numTriangles = 0; spheres = nil; -#ifdef FIX_BUGS - triBBoxes = nil; -#endif lines = nil; boxes = nil; vertices = nil; @@ -86,7 +68,7 @@ CColModel::CalculateTrianglePlanes(void) PUSH_MEMID(MEMID_COLLISION); // HACK: allocate space for one more element to stuff the link pointer into - trianglePlanes = new CColTrianglePlane[numTriangles+1]; + trianglePlanes = (CColTrianglePlane*)RwMalloc(sizeof(CColTrianglePlane) * (numTriangles+1)); REGISTER_MEMPTR(&trianglePlanes); for(int i = 0; i < numTriangles; i++) trianglePlanes[i].Set(vertices, triangles[i]); @@ -97,10 +79,8 @@ CColModel::CalculateTrianglePlanes(void) void CColModel::RemoveTrianglePlanes(void) { - if(trianglePlanes){ - delete[] trianglePlanes; - trianglePlanes = nil; - } + RwFree(trianglePlanes); + trianglePlanes = nil; } void @@ -132,33 +112,20 @@ CColModel::operator=(const CColModel &other) boundingSphere = other.boundingSphere; boundingBox = other.boundingBox; - // copy tri bboxes - if(other.numTriBBoxes){ - if(numTriBBoxes != other.numTriBBoxes){ - numTriBBoxes = other.numTriBBoxes; - delete[] triBBoxes; - triBBoxes = new CColTriBBox[numTriBBoxes]; - } - for(i = 0; i < numTriBBoxes; i++) - triBBoxes[i] = other.triBBoxes[i]; - }else{ - numTriBBoxes = 0; - delete[] triBBoxes; - triBBoxes = nil; - } - // copy spheres if(other.numSpheres){ if(numSpheres != other.numSpheres){ numSpheres = other.numSpheres; - delete[] spheres; - spheres = new CColSphere[numSpheres]; + if(spheres) + RwFree(spheres); + spheres = (CColSphere*)RwMalloc(numSpheres*sizeof(CColSphere)); } for(i = 0; i < numSpheres; i++) spheres[i] = other.spheres[i]; }else{ numSpheres = 0; - delete[] spheres; + if(spheres) + RwFree(spheres); spheres = nil; } @@ -166,14 +133,16 @@ CColModel::operator=(const CColModel &other) if(other.numLines){ if(numLines != other.numLines){ numLines = other.numLines; - delete[] lines; - lines = new CColLine[numLines]; + if(lines) + RwFree(lines); + lines = (CColLine*)RwMalloc(numLines*sizeof(CColLine)); } for(i = 0; i < numLines; i++) lines[i] = other.lines[i]; }else{ numLines = 0; - delete[] lines; + if(lines) + RwFree(lines); lines = nil; } @@ -181,21 +150,23 @@ CColModel::operator=(const CColModel &other) if(other.numBoxes){ if(numBoxes != other.numBoxes){ numBoxes = other.numBoxes; - delete[] boxes; - boxes = new CColBox[numBoxes]; + if(boxes) + RwFree(boxes); + boxes = (CColBox*)RwMalloc(numBoxes*sizeof(CColBox)); } for(i = 0; i < numBoxes; i++) boxes[i] = other.boxes[i]; }else{ numBoxes = 0; - delete[] boxes; + if(boxes) + RwFree(boxes); boxes = nil; } // copy mesh if(other.numTriangles){ // copy vertices - numVerts = -1; + numVerts = 0; for(i = 0; i < other.numTriangles; i++){ if(other.triangles[i].a > numVerts) numVerts = other.triangles[i].a; @@ -205,9 +176,10 @@ CColModel::operator=(const CColModel &other) numVerts = other.triangles[i].c; } numVerts++; - delete[] vertices; + if(vertices) + RwFree(vertices); if(numVerts){ - vertices = new CompressedVector[numVerts]; + vertices = (CompressedVector*)RwMalloc(numVerts*sizeof(CompressedVector)); for(i = 0; i < numVerts; i++) vertices[i] = other.vertices[i]; } @@ -215,54 +187,20 @@ CColModel::operator=(const CColModel &other) // copy triangles if(numTriangles != other.numTriangles){ numTriangles = other.numTriangles; - delete[] triangles; - triangles = new CColTriangle[numTriangles]; + if(triangles) + RwFree(triangles); + triangles = (CColTriangle*)RwMalloc(numTriangles*sizeof(CColTriangle)); } for(i = 0; i < numTriangles; i++) triangles[i] = other.triangles[i]; }else{ numTriangles = 0; - delete[] triangles; + if(triangles) + RwFree(triangles); triangles = nil; - delete[] vertices; + if(vertices) + RwFree(vertices); vertices = nil; } return *this; } - -bool -CColModel::Write(base::cRelocatableChunkWriter &writer, bool allocSpace) -{ - int numVerts = -1; - for(int i = 0; i < numTriangles; i++){ - if(triangles[i].a > numVerts) - numVerts = triangles[i].a; - if(triangles[i].b > numVerts) - numVerts = triangles[i].b; - if(triangles[i].c > numVerts) - numVerts = triangles[i].c; - } - numVerts++; - - if(allocSpace) - writer.AllocateRaw(this, sizeof(*this), 16, false, true); - writer.AllocateRaw(spheres, sizeof(*spheres)*numSpheres, 16, false, true); - writer.AddPatch(&spheres); - writer.AllocateRaw(lines, sizeof(*lines)*numLines, 16, false, true); - writer.AddPatch(&lines); - writer.AllocateRaw(boxes, sizeof(*boxes)*numBoxes, 16, false, true); - writer.AddPatch(&boxes); - if(triBBoxes && numTriBBoxes != 0){ - writer.AllocateRaw(triBBoxes, sizeof(*triBBoxes)*numTriBBoxes, 16, false, true); - writer.AddPatch(&triBBoxes); - }else - triBBoxes = nil; - if(numTriangles != 0){ - writer.AllocateRaw(vertices, sizeof(*vertices)*numVerts, 2, false, true); - writer.AddPatch(&vertices); - writer.AllocateRaw(triangles, sizeof(*triangles)*numTriangles, 2, false, true); - writer.AddPatch(&triangles); - RemoveTrianglePlanes(); - } - return 1; -} diff --git a/src/collision/ColModel.h b/src/collision/ColModel.h index 64911db..cd5ae65 100644 --- a/src/collision/ColModel.h +++ b/src/collision/ColModel.h @@ -15,13 +15,11 @@ struct CColModel int16 numBoxes; int16 numTriangles; int8 numLines; - int8 numTriBBoxes; uint8 level; // colstore slot but probably still named level bool ownsCollisionVolumes; CColSphere *spheres; CColLine *lines; CColBox *boxes; - CColTriBBox *triBBoxes; CompressedVector *vertices; CColTriangle *triangles; CColTrianglePlane *trianglePlanes; @@ -38,6 +36,4 @@ struct CColModel void *operator new(size_t); void operator delete(void *p, size_t); CColModel& operator=(const CColModel& other); - - bool Write(base::cRelocatableChunkWriter &writer, bool allocSpace); }; \ No newline at end of file diff --git a/src/collision/ColPoint.h b/src/collision/ColPoint.h index 36801ef..a15b234 100644 --- a/src/collision/ColPoint.h +++ b/src/collision/ColPoint.h @@ -3,13 +3,15 @@ struct CColPoint { CVector point; - float depth; + int pad1; // the surface normal on the surface of point CVector normal; + int pad2; uint8 surfaceA; uint8 pieceA; uint8 surfaceB; uint8 pieceB; + float depth; const CVector &GetNormal() { return normal; } float GetDepth() { return depth; } diff --git a/src/collision/ColSphere.h b/src/collision/ColSphere.h index 3f18d8c..f86b282 100644 --- a/src/collision/ColSphere.h +++ b/src/collision/ColSphere.h @@ -2,11 +2,10 @@ #include "SurfaceTable.h" -// TODO(LCS): maybe this was in a union with CVuVector? or is the alignment manual? -struct TYPEALIGN(16) CSphere +struct CSphere { // NB: this has to be compatible with a CVuVector - RwV3d center; + CVector center; float radius; void Set(float radius, const CVector ¢er) { this->center = center; this->radius = radius; } }; diff --git a/src/collision/ColStore.cpp b/src/collision/ColStore.cpp index 90a29bc..f1e695f 100644 --- a/src/collision/ColStore.cpp +++ b/src/collision/ColStore.cpp @@ -1,7 +1,5 @@ #include "common.h" -#include "main.h" -#include "smallHeap.h" #include "templates.h" #include "General.h" #include "ModelInfo.h" @@ -10,9 +8,6 @@ #include "Script.h" #include "Timer.h" #include "Camera.h" -#include "World.h" -#include "Zones.h" -#include "Garages.h" #include "Frontend.h" #include "Physical.h" #include "ColStore.h" @@ -20,55 +15,16 @@ #include "Pools.h" CPool *CColStore::ms_pColPool; -bool CColStore::m_onlyBB; #ifndef MASTER bool bDispColInMem; #endif -// LCS: file done except unused: -// CColStore::LoadCol(int,char const*) -// CColStore::LoadAllBoundingBoxes(void) -// CColStore::Write(base::cRelocatableChunkWriter &) - -const CVector& -LevelPos(eLevelName level) -{ - static CVector pos[4] = { - CVector(1060.0f, -800.0f, 0.0f), - CVector(1060.0f, -800.0f, 0.0f), - CVector(350.0f, -624.0f, 0.0f), - CVector(-670.0f, -511.0f, 0.0f) - }; - return pos[level]; -}; - -static eLevelName -PosLevel(const CVector &pos) -{ - static eLevelName lastPlayerLevel = LEVEL_INDUSTRIAL; - static eLevelName lastOtherLevel = LEVEL_INDUSTRIAL; - - if(Abs(FindPlayerCoors().x - pos.x) < 5.0f && - Abs(FindPlayerCoors().y - pos.y) < 5.0f && - Abs(FindPlayerCoors().z - pos.z) < 5.0f){ - if(CGame::currLevel != LEVEL_GENERIC) - lastPlayerLevel = CGame::currLevel; - return lastPlayerLevel; - }else{ - eLevelName lvl = CTheZones::GetLevelFromPosition(&pos); - if(lvl != LEVEL_GENERIC) - lastOtherLevel = lvl; - return lastOtherLevel; - } -} - void CColStore::Initialise(void) { - if(ms_pColPool == nil){ + if(ms_pColPool == nil) ms_pColPool = new CPool(COLSTORESIZE, "CollisionFiles"); - AddColSlot("generic"); // slot 0. not streamed - } + AddColSlot("generic"); // slot 0. not streamed #ifndef MASTER VarConsole.Add("Display collision in memory", &bDispColInMem, true); #endif @@ -82,9 +38,7 @@ CColStore::Shutdown(void) RemoveColSlot(i); if(ms_pColPool) delete ms_pColPool; -#ifdef FIX_BUGS ms_pColPool = nil; -#endif } int @@ -165,34 +119,11 @@ CColStore::LoadCol(int32 slot, uint8 *buffer, int32 bufsize) return success; } -struct ColChunkEntry -{ - int32 modelId; // -1 marks end - CColModel *colModel; -}; - -void -CColStore::LoadColCHK(int32 slot, void *data, void *chunk) -{ - ColDef *def = GetSlot(slot); - def->chunk = chunk; - CStreaming::RegisterPointer(&def->chunk, 1, true); - for(ColChunkEntry *entry = (ColChunkEntry*)data; entry->modelId != -1; entry++){ - CBaseModelInfo *mi = CModelInfo::GetModelInfo(entry->modelId); - mi->SetColModel(entry->colModel, true); // we own this? can that work? - CStreaming::RegisterPointer(&mi->m_colModel, 1, true); - } - def->isLoaded = true; -} - -CColModel nullCollision; - void CColStore::RemoveCol(int32 slot) { int id; - ColDef *def = GetSlot(slot); - def->isLoaded = false; + GetSlot(slot)->isLoaded = false; for(id = 0; id < MODELINFOSIZE; id++){ CBaseModelInfo *mi = CModelInfo::GetModelInfo(id); if(mi){ @@ -201,23 +132,6 @@ CColStore::RemoveCol(int32 slot) col->RemoveCollisionVolumes(); } } - if(gUseChunkFiles){ - for(id = 0; id < MODELINFOSIZE; id++){ - CBaseModelInfo *mi = CModelInfo::GetModelInfo(id); - if(mi){ - CColModel *col = mi->GetColModel(); - if(col && col->level == slot){ - mi->SetColModel(&nullCollision); - CStreaming::UnregisterPointer(&mi->m_colModel, 1); - } - } - } - if(def->chunk){ - CStreaming::UnregisterPointer(&def->chunk, 1); - cSmallHeap::msInstance.Free(def->chunk); - def->chunk = nil; - } - } } void @@ -242,49 +156,29 @@ CColStore::RemoveAllCollision(void) } static bool bLoadAtSecondPosition; -static CVector secondPosition; +static CVector2D secondPosition; void -CColStore::AddCollisionNeededAtPosn(const CVector &pos) +CColStore::AddCollisionNeededAtPosn(const CVector2D &pos) { bLoadAtSecondPosition = true; secondPosition = pos; } void -CColStore::LoadCollision(const CVector &pos, eLevelName level) +CColStore::LoadCollision(const CVector2D &pos) { int i; if(CStreaming::ms_disableStreaming) return; - if(level == LEVEL_GENERIC) - level = PosLevel(pos); - - eLevelName allowedLevel = (eLevelName)CTheScripts::AllowedCollision[0]; - if(allowedLevel == LEVEL_GENERIC) - allowedLevel = (eLevelName)CTheScripts::AllowedCollision[1]; - - bool requestedSomething = false; - for(i = 1; i < COLSTORESIZE; i++){ - if(GetSlot(i) == nil || !DoScriptsWantThisIn(i)) + if(GetSlot(i) == nil) continue; bool wantThisOne = false; - if(strcmp(GetColName(i), "indust") == 0){ - if(allowedLevel != LEVEL_GENERIC && level != LEVEL_INDUSTRIAL) - wantThisOne = allowedLevel == LEVEL_INDUSTRIAL; - else - wantThisOne = level == LEVEL_INDUSTRIAL; - }else if(GetBoundingBox(i).IsPointInside(LevelPos(level))) - wantThisOne = true; - else if(allowedLevel != LEVEL_GENERIC && GetBoundingBox(i).IsPointInside(LevelPos(allowedLevel))) - wantThisOne = true; - -/* // LCS: removed if(GetBoundingBox(i).IsPointInside(pos) || bLoadAtSecondPosition && GetBoundingBox(i).IsPointInside(secondPosition, -119.0f) || strcmp(GetColName(i), "yacht") == 0){ @@ -309,38 +203,28 @@ CColStore::LoadCollision(const CVector &pos, eLevelName level) } } } -*/ - if(wantThisOne){ + if(wantThisOne) CStreaming::RequestCol(i, STREAMFLAGS_PRIORITY); - requestedSomething = true; - }else + else CStreaming::RemoveCol(i); } - if(requestedSomething){ - CTimer::Suspend(); - // BUG? request was done with priority but now loading non-priority? - CStreaming::LoadAllRequestedModels(false); - CGarages::SetupAnyGaragesForThisIsland(); - CTimer::Resume(); - } bLoadAtSecondPosition = false; } void -CColStore::RequestCollision(const CVector &pos) +CColStore::RequestCollision(const CVector2D &pos) { int i; for(i = 1; i < COLSTORESIZE; i++) - if(GetSlot(i) && DoScriptsWantThisIn(i) && GetBoundingBox(i).IsPointInside(LevelPos(PosLevel(pos)), -115.0f)) + if(GetSlot(i) && GetBoundingBox(i).IsPointInside(pos, -115.0f)) CStreaming::RequestCol(i, STREAMFLAGS_PRIORITY); } void -CColStore::EnsureCollisionIsInMemory(const CVector &pos) +CColStore::EnsureCollisionIsInMemory(const CVector2D &pos) { -/* // LCS: removed int i; if(CStreaming::ms_disableStreaming) @@ -356,48 +240,16 @@ CColStore::EnsureCollisionIsInMemory(const CVector &pos) CStreaming::LoadAllRequestedModels(false); CTimer::Resume(); } -*/ } bool -CColStore::DoScriptsWantThisIn(int32 slot) -{ - if(slot == 0) - return false; - ColDef *coldef = GetSlot(slot); - if(coldef == nil) - return false; - if(strcmp(coldef->name, "fortstaunton") == 0) - return !CTheScripts::IsFortStauntonDestroyed(); - if(strcmp(coldef->name, "fortdestroyed") == 0) - return CTheScripts::IsFortStauntonDestroyed(); - return true; -} - -bool -CColStore::HasCollisionLoaded(eLevelName level) +CColStore::HasCollisionLoaded(const CVector2D &pos) { int i; - const CVector &pos = LevelPos(level); for(i = 1; i < COLSTORESIZE; i++) - if(GetSlot(i) && DoScriptsWantThisIn(i) && - (!CGeneral::faststricmp(GetColName(i), "indust") && level == LEVEL_INDUSTRIAL || - GetBoundingBox(i).IsPointInside(pos)) && + if(GetSlot(i) && GetBoundingBox(i).IsPointInside(pos, -115.0f) && !GetSlot(i)->isLoaded) return false; return true; } - -bool -CColStore::HasCollisionLoaded(const CVector &pos) -{ - return HasCollisionLoaded(PosLevel(pos)); -} - -void -CColStore::Load(bool onlyBB, CPool *pool) -{ - ms_pColPool = pool; - m_onlyBB = onlyBB; -} diff --git a/src/collision/ColStore.h b/src/collision/ColStore.h index d09bbf8..8e2a3a7 100644 --- a/src/collision/ColStore.h +++ b/src/collision/ColStore.h @@ -9,13 +9,11 @@ struct ColDef { // made up name char name[20]; int16 minIndex; int16 maxIndex; - void *chunk; }; class CColStore { static CPool *ms_pColPool; - static bool m_onlyBB; public: static void Initialise(void); @@ -27,18 +25,14 @@ public: static CRect &GetBoundingBox(int32 slot); static void IncludeModelIndex(int32 slot, int32 modelIndex); static bool LoadCol(int32 storeID, uint8 *buffer, int32 bufsize); - static void LoadColCHK(int32 slot, void *data, void *chunk); static void RemoveCol(int32 slot); - static void AddCollisionNeededAtPosn(const CVector &pos); + static void AddCollisionNeededAtPosn(const CVector2D &pos); static void LoadAllCollision(void); static void RemoveAllCollision(void); - static void LoadCollision(const CVector &pos, eLevelName level = LEVEL_GENERIC); - static void RequestCollision(const CVector &pos); - static void EnsureCollisionIsInMemory(const CVector &pos); - static bool DoScriptsWantThisIn(int32 slot); - static bool HasCollisionLoaded(eLevelName level); - static bool HasCollisionLoaded(const CVector &pos); - static void Load(bool, CPool *pool); + static void LoadCollision(const CVector2D &pos); + static void RequestCollision(const CVector2D &pos); + static void EnsureCollisionIsInMemory(const CVector2D &pos); + static bool HasCollisionLoaded(const CVector2D &pos); static ColDef *GetSlot(int slot) { assert(slot >= 0); diff --git a/src/collision/ColTriangle.h b/src/collision/ColTriangle.h index 5ce543b..a2580c5 100644 --- a/src/collision/ColTriangle.h +++ b/src/collision/ColTriangle.h @@ -62,7 +62,6 @@ struct CColTrianglePlane } #endif #else - // TODO(LCS): LCS actually uses CompressedVector too CVector normal; float dist; uint8 dir; diff --git a/src/collision/Collision.cpp b/src/collision/Collision.cpp index 1f15670..50c22e3 100644 --- a/src/collision/Collision.cpp +++ b/src/collision/Collision.cpp @@ -24,10 +24,6 @@ #include "Camera.h" #include "ColStore.h" -// gotta figure out how they handled CSphere exactly -// so using this to remind me to look into it again. -#define CVECTORHACK(rwv3d) CVector(rwv3d) - #ifdef VU_COLLISION #include "VuCollision.h" @@ -403,7 +399,7 @@ CCollision::TestLineSphere(const CColLine &line, const CColSphere &sph) // The length of the tangent would be this: Sqrt((c-p0)^2 - r^2). // Negative if p0 is inside the sphere! This breaks the test! float tansq = 4.0f * linesq * - (CVECTORHACK(sph.center).MagnitudeSqr() - 2.0f*DotProduct(sph.center, line.p0) + line.p0.MagnitudeSqr() - sph.radius*sph.radius); + (sph.center.MagnitudeSqr() - 2.0f*DotProduct(sph.center, line.p0) + line.p0.MagnitudeSqr() - sph.radius*sph.radius); float diffsq = projline*projline - tansq; // if diffsq < 0 that means the line is a passant, so no intersection if(diffsq < 0.0f) @@ -482,9 +478,9 @@ CCollision::TestSphereTriangle(const CColSphere &sphere, case 2: // closest to an edge // looks like original game as DistToLine manually inlined - if(!insideAB) dist = DistToLine(&va, &vb, &CVECTORHACK(sphere.center)); - else if(!insideAC) dist = DistToLine(&va, &vc, &CVECTORHACK(sphere.center)); - else if(!insideBC) dist = DistToLine(&vb, &vc, &CVECTORHACK(sphere.center)); + if(!insideAB) dist = DistToLine(&va, &vb, &sphere.center); + else if(!insideAC) dist = DistToLine(&va, &vc, &sphere.center); + else if(!insideBC) dist = DistToLine(&vb, &vc, &sphere.center); else assert(0); break; case 3: @@ -1300,9 +1296,9 @@ CCollision::ProcessSphereTriangle(const CColSphere &sphere, case 2: // closest to an edge // looks like original game as DistToLine manually inlined - if(!insideAB) dist = DistToLine(&va, &vb, &CVECTORHACK(sphere.center), p); - else if(!insideAC) dist = DistToLine(&va, &vc, &CVECTORHACK(sphere.center), p); - else if(!insideBC) dist = DistToLine(&vb, &vc, &CVECTORHACK(sphere.center), p); + if(!insideAB) dist = DistToLine(&va, &vb, &sphere.center, p); + else if(!insideAC) dist = DistToLine(&va, &vc, &sphere.center, p); + else if(!insideBC) dist = DistToLine(&vb, &vc, &sphere.center, p); else assert(0); break; case 3: diff --git a/src/collision/TempColModels.cpp b/src/collision/TempColModels.cpp index 148b86f..0c0d437 100644 --- a/src/collision/TempColModels.cpp +++ b/src/collision/TempColModels.cpp @@ -1,25 +1,22 @@ #include "common.h" -#include "main.h" #include "TempColModels.h" #include "Game.h" -// LCS: haven't yet checked the numbers but they probably haven't changed - +CColModel CTempColModels::ms_colModelPed1; CColModel CTempColModels::ms_colModelPed2; +CColModel CTempColModels::ms_colModelBBox; CColModel CTempColModels::ms_colModelBumper1; CColModel CTempColModels::ms_colModelWheel1; CColModel CTempColModels::ms_colModelPanel1; CColModel CTempColModels::ms_colModelBodyPart2; CColModel CTempColModels::ms_colModelBodyPart1; -CColModel CTempColModels::ms_colModelCutObj[10]; +CColModel CTempColModels::ms_colModelCutObj[5]; CColModel CTempColModels::ms_colModelPedGroundHit; CColModel CTempColModels::ms_colModelBoot1; CColModel CTempColModels::ms_colModelDoor1; CColModel CTempColModels::ms_colModelBonnet1; -CColModel CTempColModels::ms_colModelFerryDocked; - -CTempColModels *gpTempColModels; +CColModel CTempColModels::ms_colModelWeapon; CColSphere s_aPedSpheres[3]; @@ -37,7 +34,6 @@ CColSphere s_aBootSpheres[4]; CColSphere s_aWheelSpheres[2]; CColSphere s_aBodyPartSpheres1[2]; CColSphere s_aBodyPartSpheres2[2]; -CColBox S_aFerryDockedBoxes[1]; void CTempColModels::Initialise(void) @@ -48,27 +44,12 @@ CTempColModels::Initialise(void) colmodel.level = LEVEL_GENERIC;\ colmodel.ownsCollisionVolumes = false; - if(gMakeResources){ - if(gpTempColModels == nil){ - gpTempColModels = new CTempColModels; - gpTempColModels->Initialise(); - return; - } - - ms_colModelBBox.boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f)); - ms_colModelBBox.boundingBox.Set(CVector(-2.0f, -2.0f, -2.0f), CVector(2.0f, 2.0f, 2.0f)); - ms_colModelBBox.level = LEVEL_GENERIC; - - ms_colModelPed1.boundingSphere.Set(1.25f, CVector(0.0f, 0.0f, 0.0f)); - ms_colModelPed1.boundingBox.Set(CVector(-0.35f, -0.35f, -1.0f), CVector(0.35f, 0.35f, 0.9f)); - SET_COLMODEL_SPHERES(ms_colModelPed1, s_aPedSpheres); - - ms_colModelWeapon.boundingSphere.Set(0.25f, CVector(0.0f, 0.0f, 0.0f)); - ms_colModelWeapon.boundingBox.Set(CVector(-0.25f, -0.25f, -0.25f), CVector(0.25f, 0.25f, 0.25f)); - } - int i; + ms_colModelBBox.boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f)); + ms_colModelBBox.boundingBox.Set(CVector(-2.0f, -2.0f, -2.0f), CVector(2.0f, 2.0f, 2.0f)); + ms_colModelBBox.level = LEVEL_GENERIC; + for (i = 0; i < ARRAY_SIZE(ms_colModelCutObj); i++) { ms_colModelCutObj[i].boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f)); ms_colModelCutObj[i].boundingBox.Set(CVector(-2.0f, -2.0f, -2.0f), CVector(2.0f, 2.0f, 2.0f)); @@ -93,6 +74,10 @@ CTempColModels::Initialise(void) s_aPedSpheres[i].piece = 0; } + ms_colModelPed1.boundingSphere.Set(1.25f, CVector(0.0f, 0.0f, 0.0f)); + ms_colModelPed1.boundingBox.Set(CVector(-0.35f, -0.35f, -1.0f), CVector(0.35f, 0.35f, 0.9f)); + SET_COLMODEL_SPHERES(ms_colModelPed1, s_aPedSpheres); + // Ped 2 Spheres s_aPed2Spheres[0].radius = 0.3f; @@ -309,47 +294,13 @@ CTempColModels::Initialise(void) SET_COLMODEL_SPHERES(ms_colModelBodyPart2, s_aBodyPartSpheres2); - // Ferry Docked - - S_aFerryDockedBoxes[0].Set(CVector(-6.3f, -22.78f, -2.0f), CVector(6.3f, 22.78f, 2.8f), SURFACE_THICK_METAL_PLATE, SURFACE_DEFAULT); - - ms_colModelFerryDocked.boundingSphere.Set(35.0f, CVector(0.0f, -0.0f, 0.0f)); - ms_colModelFerryDocked.boundingBox.Set(S_aFerryDockedBoxes[0].min, S_aFerryDockedBoxes[0].max); - ms_colModelFerryDocked.spheres = nil; - ms_colModelFerryDocked.numSpheres = 0; - ms_colModelFerryDocked.boxes = S_aFerryDockedBoxes; - ms_colModelFerryDocked.numBoxes = ARRAY_SIZE(S_aFerryDockedBoxes); - ms_colModelFerryDocked.level = LEVEL_GENERIC; - + ms_colModelWeapon.boundingSphere.radius = 0.25f; + ms_colModelWeapon.boundingBox.min.x = -0.25f; + ms_colModelWeapon.boundingBox.min.y = -0.25f; + ms_colModelWeapon.boundingBox.min.z = -0.25f; + ms_colModelWeapon.boundingBox.max.x = 0.25f; + ms_colModelWeapon.boundingBox.max.y = 0.25f; + ms_colModelWeapon.boundingBox.max.z = 0.25f; #undef SET_COLMODEL_SPHERES } - -void -CTempColModels::Write(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), 0x10, false, true); - - ms_colModelBBox.Write(writer, false); - writer.AddPatch(&ms_colModelBBox); - - ms_colModelPed1.Write(writer, false); - writer.AddPatch(&ms_colModelPed1); - - ms_colModelWeapon.Write(writer, false); - writer.AddPatch(&ms_colModelWeapon); - - for(int i = 0; i < ARRAY_SIZE(ms_colModelCutObj); i++) - ms_colModelCutObj[i].Write(writer, true); - ms_colModelPed2.Write(writer, true); - ms_colModelPedGroundHit.Write(writer, true); - ms_colModelDoor1.Write(writer, true); - ms_colModelBumper1.Write(writer, true); - ms_colModelPanel1.Write(writer, true); - ms_colModelBonnet1.Write(writer, true); - ms_colModelBoot1.Write(writer, true); - ms_colModelWheel1.Write(writer, true); - ms_colModelBodyPart1.Write(writer, true); - ms_colModelBodyPart2.Write(writer, true); - ms_colModelFerryDocked.Write(writer, true); -} diff --git a/src/collision/TempColModels.h b/src/collision/TempColModels.h index 0f1f06c..1a88872 100644 --- a/src/collision/TempColModels.h +++ b/src/collision/TempColModels.h @@ -5,25 +5,20 @@ class CTempColModels { public: - CColModel ms_colModelPed1; - CColModel ms_colModelBBox; - CColModel ms_colModelWeapon; - + static CColModel ms_colModelPed1; static CColModel ms_colModelPed2; + static CColModel ms_colModelBBox; static CColModel ms_colModelBumper1; static CColModel ms_colModelWheel1; static CColModel ms_colModelPanel1; static CColModel ms_colModelBodyPart2; static CColModel ms_colModelBodyPart1; - static CColModel ms_colModelCutObj[10]; + static CColModel ms_colModelCutObj[5]; static CColModel ms_colModelPedGroundHit; static CColModel ms_colModelBoot1; static CColModel ms_colModelDoor1; static CColModel ms_colModelBonnet1; - static CColModel ms_colModelFerryDocked; + static CColModel ms_colModelWeapon; - void Initialise(void); - void Write(base::cRelocatableChunkWriter &writer); + static void Initialise(void); }; - -extern CTempColModels *gpTempColModels; diff --git a/src/control/Bridge.cpp b/src/control/Bridge.cpp index e7c76a9..1e63cf3 100644 --- a/src/control/Bridge.cpp +++ b/src/control/Bridge.cpp @@ -161,23 +161,3 @@ bool CBridge::ThisIsABridgeObjectMovingUp(int index) return false; #endif } - -void CBridge::ForceBridgeState(uint8 state) -{ -#ifdef GTA_BRIDGE - State = state; - switch (state) - { - case STATE_BRIDGE_LOCKED: - case STATE_LIFT_PART_MOVING_DOWN: - case STATE_LIFT_PART_ABOUT_TO_MOVE_UP: - ThePaths.SetLinksBridgeLights(-330.0f, -230.0f, -700.0f, -588.0f, true); - break; - case STATE_BRIDGE_ALWAYS_UNLOCKED: - ThePaths.SetLinksBridgeLights(-330.0f, -230.0f, -700.0f, -588.0f, false); - break; - default: - break; - } -#endif -} \ No newline at end of file diff --git a/src/control/Bridge.h b/src/control/Bridge.h index e639d4c..c570262 100644 --- a/src/control/Bridge.h +++ b/src/control/Bridge.h @@ -8,8 +8,7 @@ enum bridgeStates { STATE_LIFT_PART_MOVING_DOWN, STATE_LIFT_PART_IS_DOWN, STATE_LIFT_PART_ABOUT_TO_MOVE_UP, - STATE_LIFT_PART_MOVING_UP, - STATE_BRIDGE_ALWAYS_UNLOCKED + STATE_LIFT_PART_MOVING_UP }; class CBridge @@ -26,5 +25,4 @@ public: static bool ShouldLightsBeFlashing(); static void FindBridgeEntities(); static bool ThisIsABridgeObjectMovingUp(int); - static void ForceBridgeState(uint8 state); }; diff --git a/src/control/CarAI.cpp b/src/control/CarAI.cpp index 45652b2..8e79fee 100644 --- a/src/control/CarAI.cpp +++ b/src/control/CarAI.cpp @@ -4,7 +4,6 @@ #include "Accident.h" #include "AutoPilot.h" -#include "Bridge.h" #include "CarCtrl.h" #include "General.h" #include "HandlingMgr.h" @@ -73,18 +72,6 @@ void CCarAI::UpdateCarAI(CVehicle* pVehicle) case STATUS_PLAYER_DISABLED: break; case STATUS_SIMPLE: - { - if (pVehicle->m_pCurGroundEntity && CBridge::ThisIsABridgeObjectMovingUp(pVehicle->m_pCurGroundEntity->GetModelIndex())) - pVehicle->SetStatus(STATUS_PHYSICS); - CColPoint colPoint; - CEntity* pEntity; - if ((pVehicle->m_randomSeed & 0x3F) == (CTimer::GetFrameCounter() & 0x3F) && - !CWorld::ProcessVerticalLine(pVehicle->GetPosition(), -2.0f, colPoint, pEntity, true, false, false, false, true, false, nil)) { - debug("FLOATING CAR TURNED INTO PHYSICS CAR!\n"); - pVehicle->SetStatus(STATUS_PHYSICS); - } - } - // fallthough case STATUS_PHYSICS: switch (pVehicle->AutoPilot.m_nCarMission) { case MISSION_RAMPLAYER_FARAWAY: diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index ac02abe..8db6fd9 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -11,7 +11,6 @@ #include "Cranes.h" #include "Curves.h" #include "CutsceneMgr.h" -#include "Frontend.h" #include "Gangs.h" #include "Game.h" #include "Garages.h" @@ -78,11 +77,10 @@ #define DISTANCE_BETWEEN_CAR_AND_DEAD_PED (6.0f) #define PROBABILITY_OF_PASSENGER_IN_VEHICLE (0.125f) -#define ONSCREEN_DESPAWN_RANGE (190.0f) -#define MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN (130.0f) -#define REQUEST_ONSCREEN_DISTANCE (140.0f) -#define OFFSCREEN_DESPAWN_RANGE (60.0f) -#define MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN (40.0f) +#define ONSCREEN_DESPAWN_RANGE (120.0f) +#define MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN (100.0f) +#define REQUEST_ONSCREEN_DISTANCE ((ONSCREEN_DESPAWN_RANGE + MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN) / 2) +#define OFFSCREEN_DESPAWN_RANGE (40.0f) #define EXTENDED_RANGE_DESPAWN_MULTIPLIER (1.5f) bool CCarCtrl::bMadDriversCheat; @@ -96,7 +94,7 @@ int32 CCarCtrl::NumRandomCars; int32 CCarCtrl::NumParkedCars; int32 CCarCtrl::NumPermanentCars; int8 CCarCtrl::CountDownToCarsAtStart; -int32 CCarCtrl::MaxNumberOfCarsInUse = 30; +int32 CCarCtrl::MaxNumberOfCarsInUse = 12; uint32 CCarCtrl::LastTimeLawEnforcerCreated; uint32 CCarCtrl::LastTimeFireTruckCreated; uint32 CCarCtrl::LastTimeAmbulanceCreated; @@ -111,8 +109,6 @@ int32 CCarCtrl::LoadedCarsArray[TOTAL_CUSTOM_CLASSES][MAX_CAR_MODELS_IN_ARRAY]; CVehicle* apCarsToKeep[MAX_CARS_TO_KEEP]; uint32 aCarsToKeepTime[MAX_CARS_TO_KEEP]; -bool gbEmergencyVehiclesEnabled = true; - void CCarCtrl::GenerateRandomCars() { @@ -162,19 +158,14 @@ CCarCtrl::GenerateOneRandomCar() carClass = COPS; carModel = ChoosePoliceCarModel(); }else{ - for (int i = 0; i < 5; i++) { - carModel = ChooseModel(&zone, &carClass); - if (carModel == -1) - return; - if (!(carClass == COPS && pWanted->GetWantedLevel() >= 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. */ - break; - } + carModel = ChooseModel(&zone, &carClass); + if (carModel == -1 || (carClass == COPS && pWanted->GetWantedLevel() >= 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; } float frontX, frontY; float preferredDistance, angleLimit; - float requestMultiplier = 1.0f; bool invertAngleLimitTest; CVector spawnPosition; int32 curNodeId, nextNodeId; @@ -194,14 +185,11 @@ CCarCtrl::GenerateOneRandomCar() angleLimit = -1.0f; bTopDownCamera = true; invertAngleLimitTest = true; - preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN + 15.0f; + preferredDistance = OFFSCREEN_DESPAWN_RANGE + 15.0f; /* BUG: testForCollision not initialized in original game. */ testForCollision = false; }else if (!pPlayerVehicle){ /* Player is not in vehicle. */ - requestMultiplier = 13.0f / 20.0f; - if (FrontEndMenuManager.m_PrefsUseWideScreen) // TODO(LCS): static - requestMultiplier *= 4.0f / 3.0f; testForCollision = true; frontX = TheCamera.CamFrontXNorm; frontY = TheCamera.CamFrontYNorm; @@ -211,105 +199,95 @@ CCarCtrl::GenerateOneRandomCar() /* Forward to his current direction (camera direction). */ angleLimit = 0.707f; /* 45 degrees */ invertAngleLimitTest = true; - preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier; + preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; break; case 1: /* Spawn a vehicle close to player to his side. */ /* Kinda not within camera angle. */ angleLimit = 0.707f; /* 45 degrees */ invertAngleLimitTest = false; - preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN; + preferredDistance = OFFSCREEN_DESPAWN_RANGE; break; } - } - else { - requestMultiplier = 13.0f / 20.0f; - if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_1STPERSON && !FrontEndMenuManager.m_PrefsUseWideScreen) - requestMultiplier *= 0.9f; - if (FrontEndMenuManager.m_PrefsUseWideScreen) // TODO(LCS): static - requestMultiplier *= 4.0f / 3.0f; - if (fPlayerVehicleSpeed > 0.4f) { /* 72 km/h */ + }else if (fPlayerVehicleSpeed > 0.4f){ /* 72 km/h */ /* Player is moving fast in vehicle */ /* Prefer spawning vehicles very far away from him. */ - frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed; - frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed; - testForCollision = false; - switch (CTimer::GetFrameCounter() & 3) { - case 0: - case 1: - /* Spawn a vehicle in a very narrow gap in front of a player */ - angleLimit = 0.85f; /* approx 30 degrees */ - invertAngleLimitTest = true; - preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier; - break; - case 2: - /* Spawn a vehicle relatively far away from player. */ - /* Forward to his current direction (camera direction). */ - angleLimit = 0.707f; /* 45 degrees */ - invertAngleLimitTest = true; - preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier; - break; - case 3: - /* Spawn a vehicle close to player to his side. */ - /* Kinda not within camera angle. */ - angleLimit = 0.707f; /* 45 degrees */ - invertAngleLimitTest = false; - preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN; - break; - } + frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed; + frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed; + testForCollision = false; + switch (CTimer::GetFrameCounter() & 3) { + case 0: + case 1: + /* Spawn a vehicle in a very narrow gap in front of a player */ + angleLimit = 0.85f; /* approx 30 degrees */ + invertAngleLimitTest = true; + preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; + break; + case 2: + /* Spawn a vehicle relatively far away from player. */ + /* Forward to his current direction (camera direction). */ + angleLimit = 0.707f; /* 45 degrees */ + invertAngleLimitTest = true; + preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; + break; + case 3: + /* Spawn a vehicle close to player to his side. */ + /* Kinda not within camera angle. */ + angleLimit = 0.707f; /* 45 degrees */ + invertAngleLimitTest = false; + preferredDistance = OFFSCREEN_DESPAWN_RANGE; + break; } - else if (fPlayerVehicleSpeed > 0.1f) { /* 18 km/h */ - /* Player is moving moderately fast in vehicle */ - /* Spawn more vehicles to player's side. */ - frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed; - frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed; - testForCollision = false; - switch (CTimer::GetFrameCounter() & 3) { - case 0: - /* Spawn a vehicle in a very narrow gap in front of a player */ - angleLimit = 0.85f; /* approx 30 degrees */ - invertAngleLimitTest = true; - preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier; - break; - case 1: - /* Spawn a vehicle relatively far away from player. */ - /* Forward to his current direction (camera direction). */ - angleLimit = 0.707f; /* 45 degrees */ - invertAngleLimitTest = true; - preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier; - break; - case 2: - case 3: - /* Spawn a vehicle close to player to his side. */ - /* Kinda not within camera angle. */ - angleLimit = 0.707f; /* 45 degrees */ - invertAngleLimitTest = false; - preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN; - break; - } + }else if (fPlayerVehicleSpeed > 0.1f){ /* 18 km/h */ + /* Player is moving moderately fast in vehicle */ + /* Spawn more vehicles to player's side. */ + frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed; + frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed; + testForCollision = false; + switch (CTimer::GetFrameCounter() & 3) { + case 0: + /* Spawn a vehicle in a very narrow gap in front of a player */ + angleLimit = 0.85f; /* approx 30 degrees */ + invertAngleLimitTest = true; + preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; + break; + case 1: + /* Spawn a vehicle relatively far away from player. */ + /* Forward to his current direction (camera direction). */ + angleLimit = 0.707f; /* 45 degrees */ + invertAngleLimitTest = true; + preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; + break; + case 2: + case 3: + /* Spawn a vehicle close to player to his side. */ + /* Kinda not within camera angle. */ + angleLimit = 0.707f; /* 45 degrees */ + invertAngleLimitTest = false; + preferredDistance = OFFSCREEN_DESPAWN_RANGE; + break; } - else { - /* Player is in vehicle but moving very slow. */ - /* Then use camera direction instead of vehicle direction. */ - testForCollision = true; - frontX = TheCamera.CamFrontXNorm; - frontY = TheCamera.CamFrontYNorm; - switch (CTimer::GetFrameCounter() & 1) { - case 0: - /* Spawn a vehicle relatively far away from player. */ - /* Forward to his current direction (camera direction). */ - angleLimit = 0.707f; /* 45 degrees */ - invertAngleLimitTest = true; - preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier; - break; - case 1: - /* Spawn a vehicle close to player to his side. */ - /* Kinda not within camera angle. */ - angleLimit = 0.707f; /* 45 degrees */ - invertAngleLimitTest = false; - preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN; - break; - } + }else{ + /* Player is in vehicle but moving very slow. */ + /* Then use camera direction instead of vehicle direction. */ + testForCollision = true; + frontX = TheCamera.CamFrontXNorm; + frontY = TheCamera.CamFrontYNorm; + switch (CTimer::GetFrameCounter() & 1) { + case 0: + /* Spawn a vehicle relatively far away from player. */ + /* Forward to his current direction (camera direction). */ + angleLimit = 0.707f; /* 45 degrees */ + invertAngleLimitTest = true; + preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; + break; + case 1: + /* Spawn a vehicle close to player to his side. */ + /* Kinda not within camera angle. */ + angleLimit = 0.707f; /* 45 degrees */ + invertAngleLimitTest = false; + preferredDistance = OFFSCREEN_DESPAWN_RANGE; + break; } } if (!ThePaths.GenerateCarCreationCoors(vecTargetPos.x, vecTargetPos.y, frontX, frontY, @@ -319,8 +297,6 @@ CCarCtrl::GenerateOneRandomCar() CPathNode* pCurNode = &ThePaths.m_pathNodes[curNodeId]; CPathNode* pNextNode = &ThePaths.m_pathNodes[nextNodeId]; bool bBoatGenerated = false; - if (!OkToCreateVehicleAtThisPosition(spawnPosition)) - return; if ((CGeneral::GetRandomNumber() & 0xF) > Min(pCurNode->spawnRate, pNextNode->spawnRate)) return; if (pCurNode->bWaterPath) { @@ -620,12 +596,12 @@ CCarCtrl::GenerateOneRandomCar() return; } }else{ - if ((vecTargetPos - pVehicle->GetPosition()).Magnitude2D() > TheCamera.GenerationDistMultiplier * requestMultiplier * (pVehicle->bExtendedRange ? EXTENDED_RANGE_DESPAWN_MULTIPLIER : 1.0f) * ONSCREEN_DESPAWN_RANGE || - (vecTargetPos - pVehicle->GetPosition()).Magnitude2D() < TheCamera.GenerationDistMultiplier * requestMultiplier * MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN) { + if ((vecTargetPos - pVehicle->GetPosition()).Magnitude2D() > TheCamera.GenerationDistMultiplier * (pVehicle->bExtendedRange ? EXTENDED_RANGE_DESPAWN_MULTIPLIER : 1.0f) * ONSCREEN_DESPAWN_RANGE || + (vecTargetPos - pVehicle->GetPosition()).Magnitude2D() < TheCamera.GenerationDistMultiplier * MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN) { delete pVehicle; return; } - if ((TheCamera.GetPosition() - pVehicle->GetPosition()).Magnitude2D() < 105.0f * requestMultiplier * TheCamera.GenerationDistMultiplier || bTopDownCamera) { + if ((TheCamera.GetPosition() - pVehicle->GetPosition()).Magnitude2D() < 82.5f * TheCamera.GenerationDistMultiplier || bTopDownCamera) { delete pVehicle; return; } @@ -675,13 +651,13 @@ CCarCtrl::GenerateOneRandomCar() int nMadDrivers; switch (pVehicle->GetVehicleAppearance()) { case VEHICLE_APPEARANCE_BIKE: - nMadDrivers = 20; + nMadDrivers = 30; break; case VEHICLE_APPEARANCE_BOAT: nMadDrivers = 40; break; default: - nMadDrivers = 3; + nMadDrivers = 6; break; } if ((CGeneral::GetRandomNumber() & 0x7F) < nMadDrivers || bMadDriversCheat) { @@ -740,6 +716,12 @@ CCarCtrl::GenerateOneRandomCar() } } +bool +CCarCtrl::BoatWithTallMast(int32 mi) +{ + return mi == MI_RIO || mi == MI_TROPIC || mi == MI_MARQUIS; +} + int32 CCarCtrl::ChooseBoatModel(int32 rating) { @@ -959,7 +941,6 @@ CCarCtrl::RemoveCarsIfThePoolGetsFull(void) } } if (pClosestVehicle) { - debug(":::::::::::\'Nearest removed\' cause pools was full -> NumRandomCars %d\n", NumRandomCars); CWorld::Remove(pClosestVehicle); delete pClosestVehicle; } @@ -982,10 +963,7 @@ CCarCtrl::PossiblyRemoveVehicle(CVehicle* pVehicle) return; } float distanceToPlayer = (pVehicle->GetPosition() - vecPlayerPos).Magnitude2D(); - float despawnMultiplier = 1.0f; - if (FindPlayerVehicle() && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_1STPERSON && !FrontEndMenuManager.m_PrefsUseWideScreen) - despawnMultiplier = 0.75f; - float threshold = OFFSCREEN_DESPAWN_RANGE * despawnMultiplier; + float threshold = OFFSCREEN_DESPAWN_RANGE; if (pVehicle->GetIsOnScreen() || TheCamera.Cams[TheCamera.ActiveCam].LookingLeft || TheCamera.Cams[TheCamera.ActiveCam].LookingRight || @@ -998,7 +976,7 @@ CCarCtrl::PossiblyRemoveVehicle(CVehicle* pVehicle) pVehicle->bIsCarParkVehicle || CTimer::GetTimeInMilliseconds() < pVehicle->m_nSetPieceExtendedRangeTime ){ - threshold = ONSCREEN_DESPAWN_RANGE * despawnMultiplier * TheCamera.GenerationDistMultiplier; + threshold = ONSCREEN_DESPAWN_RANGE * TheCamera.GenerationDistMultiplier; } if (TheCamera.GetForward().z < -0.9f) threshold = 70.0f; @@ -1591,7 +1569,7 @@ void CCarCtrl::WeaveForOtherCar(CEntity* pOtherEntity, CVehicle* pVehicle, float if (pVehicle->AutoPilot.m_nCarMission == MISSION_RAMCAR_CLOSE && pOtherEntity == pVehicle->AutoPilot.m_pTargetCar) return; CVector2D vecDiff = pOtherCar->GetPosition() - pVehicle->GetPosition(); - float angleBetweenVehicles = GetATanOfXY(vecDiff.x, vecDiff.y); + float angleBetweenVehicles = CGeneral::GetATanOfXY(vecDiff.x, vecDiff.y); float distance = vecDiff.Magnitude(); if (distance < 1.0f) return; @@ -1601,7 +1579,7 @@ void CCarCtrl::WeaveForOtherCar(CEntity* pOtherEntity, CVehicle* pVehicle, float return; CVector2D forward = pVehicle->GetForward(); forward.Normalise(); - float forwardAngle = GetATanOfXY(forward.x, forward.y); + float forwardAngle = CGeneral::GetATanOfXY(forward.x, forward.y); float angleDiff = angleBetweenVehicles - forwardAngle; float lenProjection = ABS(pOtherCar->GetColModel()->boundingBox.max.y * sin(angleDiff)); float widthProjection = ABS(pOtherCar->GetColModel()->boundingBox.max.x * cos(angleDiff)); @@ -1610,12 +1588,16 @@ void CCarCtrl::WeaveForOtherCar(CEntity* pOtherEntity, CVehicle* pVehicle, float diffToLeftAngle = ABS(diffToLeftAngle); float angleToWeave = lengthToEvade / 2; if (diffToLeftAngle < angleToWeave){ - *pAngleToWeaveLeft = LimitRadianAngle(angleBetweenVehicles - angleToWeave); + *pAngleToWeaveLeft = angleBetweenVehicles - angleToWeave; + while (*pAngleToWeaveLeft < -PI) + *pAngleToWeaveLeft += TWOPI; } float diffToRightAngle = LimitRadianAngle(angleBetweenVehicles - *pAngleToWeaveRight); diffToRightAngle = ABS(diffToRightAngle); if (diffToRightAngle < angleToWeave){ - *pAngleToWeaveRight = LimitRadianAngle(angleBetweenVehicles + angleToWeave); + *pAngleToWeaveRight = angleBetweenVehicles + angleToWeave; + while (*pAngleToWeaveRight > PI) + *pAngleToWeaveRight -= TWOPI; } } @@ -1647,19 +1629,23 @@ void CCarCtrl::WeaveForPed(CEntity* pOtherEntity, CVehicle* pVehicle, float* pAn return; CPed* pPed = (CPed*)pOtherEntity; CVector2D vecDiff = pPed->GetPosition() - pVehicle->GetPosition(); - float angleBetweenVehicleAndPed = GetATanOfXY(vecDiff.x, vecDiff.y); + float angleBetweenVehicleAndPed = CGeneral::GetATanOfXY(vecDiff.x, vecDiff.y); float distance = vecDiff.Magnitude(); float lengthToEvade = (WIDTH_COEF_TO_WEAVE_SAFELY * 2 * pVehicle->GetColModel()->boundingBox.max.x + PED_WIDTH_TO_WEAVE) / distance; float diffToLeftAngle = LimitRadianAngle(angleBetweenVehicleAndPed - *pAngleToWeaveLeft); diffToLeftAngle = ABS(diffToLeftAngle); float angleToWeave = lengthToEvade / 2; if (diffToLeftAngle < angleToWeave) { - *pAngleToWeaveLeft = LimitRadianAngle(angleBetweenVehicleAndPed - angleToWeave); + *pAngleToWeaveLeft = angleBetweenVehicleAndPed - angleToWeave; + while (*pAngleToWeaveLeft < -PI) + *pAngleToWeaveLeft += TWOPI; } float diffToRightAngle = LimitRadianAngle(angleBetweenVehicleAndPed - *pAngleToWeaveRight); diffToRightAngle = ABS(diffToRightAngle); if (diffToRightAngle < angleToWeave) { - *pAngleToWeaveRight = LimitRadianAngle(angleBetweenVehicleAndPed + angleToWeave); + *pAngleToWeaveRight = angleBetweenVehicleAndPed + angleToWeave; + while (*pAngleToWeaveRight > PI) + *pAngleToWeaveRight -= TWOPI; } } @@ -1715,19 +1701,23 @@ void CCarCtrl::WeaveForObject(CEntity* pOtherEntity, CVehicle* pVehicle, float* rightCoef * pObject->GetRight() + forwardCoef * pObject->GetForward() - pVehicle->GetPosition(); - float angleBetweenVehicleAndObject = GetATanOfXY(vecDiff.x, vecDiff.y); + float angleBetweenVehicleAndObject = CGeneral::GetATanOfXY(vecDiff.x, vecDiff.y); float distance = vecDiff.Magnitude(); float lengthToEvade = (WIDTH_COEF_TO_WEAVE_SAFELY * 2 * pVehicle->GetColModel()->boundingBox.max.x + OBJECT_WIDTH_TO_WEAVE) / distance; float diffToLeftAngle = LimitRadianAngle(angleBetweenVehicleAndObject - *pAngleToWeaveLeft); diffToLeftAngle = ABS(diffToLeftAngle); float angleToWeave = lengthToEvade / 2; if (diffToLeftAngle < angleToWeave) { - *pAngleToWeaveLeft = LimitRadianAngle(angleBetweenVehicleAndObject - angleToWeave); + *pAngleToWeaveLeft = angleBetweenVehicleAndObject - angleToWeave; + while (*pAngleToWeaveLeft < -PI) + *pAngleToWeaveLeft += TWOPI; } float diffToRightAngle = LimitRadianAngle(angleBetweenVehicleAndObject - *pAngleToWeaveRight); diffToRightAngle = ABS(diffToRightAngle); if (diffToRightAngle < angleToWeave) { - *pAngleToWeaveRight = LimitRadianAngle(angleBetweenVehicleAndObject + angleToWeave); + *pAngleToWeaveRight = angleBetweenVehicleAndObject + angleToWeave; + while (*pAngleToWeaveRight > PI) + *pAngleToWeaveRight -= TWOPI; } } @@ -1769,7 +1759,7 @@ bool CCarCtrl::PickNextNodeAccordingStrategy(CVehicle* pVehicle) void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle) { if (pVehicle->m_nRouteSeed) - CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++); + CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed); int32 prevNode = pVehicle->AutoPilot.m_nCurrentRouteNode; int32 curNode = pVehicle->AutoPilot.m_nNextRouteNode; uint8 totalLinks = ThePaths.m_pathNodes[curNode].numLinks; @@ -1855,15 +1845,13 @@ void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle) pNextPathNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nNextRouteNode]; if ((!pNextPathNode->bDisabled || pPrevPathNode->bDisabled) && (!pNextPathNode->bBetweenLevels || pPrevPathNode->bBetweenLevels || !pVehicle->AutoPilot.m_bStayInCurrentLevel)) - break; + /* Nice way to exit loop but this will fail because this is used for indexing! */ + nextLink = 1000; } } - if (nextLink >= totalLinks) { + if (nextLink < 999) /* If everything else failed, turn vehicle around */ - nextLink = 0; - debug("Couldn\'t find ANYTHING. Just go back from where we came.\n"); pVehicle->AutoPilot.m_nNextRouteNode = prevNode; - } } pNextPathNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nNextRouteNode]; pNextLink = &ThePaths.m_carPathLinks[ThePaths.m_carPathConnections[nextLink + pCurPathNode->firstLink]]; @@ -1976,7 +1964,7 @@ void CCarCtrl::PickNextNodeToChaseCar(CVehicle* pVehicle, float targetX, float t #endif { if (pVehicle->m_nRouteSeed) - CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++); + CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed); int prevNode = pVehicle->AutoPilot.m_nCurrentRouteNode; int curNode = pVehicle->AutoPilot.m_nNextRouteNode; CPathNode* pPrevNode = &ThePaths.m_pathNodes[prevNode]; @@ -1996,7 +1984,7 @@ void CCarCtrl::PickNextNodeToChaseCar(CVehicle* pVehicle, float targetX, float t int nextLink; if (numNodes != 1 && numNodes != 2 || pTargetNode[0] == pCurNode){ if (numNodes != 2 || pTargetNode[1] == pCurNode) { - float currentAngle = GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); + float currentAngle = CGeneral::GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); nextLink = 0; float lowestAngleChange = 10.0f; int numLinks = pCurNode->numLinks; @@ -2006,7 +1994,7 @@ void CCarCtrl::PickNextNodeToChaseCar(CVehicle* pVehicle, float targetX, float t if (conNode == prevNode && i > 1) continue; CPathNode* pTestNode = &ThePaths.m_pathNodes[conNode]; - float angle = GetATanOfXY(pTestNode->GetX() - pCurNode->GetX(), pTestNode->GetY() - pCurNode->GetY()); + float angle = CGeneral::GetATanOfXY(pTestNode->GetX() - pCurNode->GetX(), pTestNode->GetY() - pCurNode->GetY()); angle = LimitRadianAngle(angle - currentAngle); angle = ABS(angle); if (angle < lowestAngleChange) { @@ -2424,16 +2412,6 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe *pHandbrake = true; return; case MISSION_CRUISE: - if (CTrafficLights::ShouldCarStopForBridge(pVehicle)) { - *pAccel = 0.0f; - *pBrake = 1.0f; - *pHandbrake = true; -#ifdef FIX_BUGS - *pSwerve = 0.0f; -#endif - break; - } - // fallthough case MISSION_RAMPLAYER_FARAWAY: case MISSION_BLOCKPLAYER_FARAWAY: case MISSION_GOTOCOORDS: @@ -2504,19 +2482,11 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe *pHandbrake = false; return; case MISSION_RAMCAR_CLOSE: - if (!pVehicle->AutoPilot.m_pTargetCar) { - debug("NO TARGET VEHICLE FOR MISSION_RAMCAR_CLOSE\n"); - return; - } SteerAICarWithPhysicsHeadingForTarget(pVehicle, pVehicle->AutoPilot.m_pTargetCar, pVehicle->AutoPilot.m_pTargetCar->GetPosition().x, pVehicle->AutoPilot.m_pTargetCar->GetPosition().y, pSwerve, pAccel, pBrake, pHandbrake); return; case MISSION_BLOCKCAR_CLOSE: - if (!pVehicle->AutoPilot.m_pTargetCar) { - debug("NO TARGET VEHICLE FOR MISSION_BLOCKCAR_CLOSE\n"); - return; - } SteerAICarWithPhysicsTryingToBlockTarget(pVehicle, pVehicle->AutoPilot.m_pTargetCar->GetPosition().x, pVehicle->AutoPilot.m_pTargetCar->GetPosition().y, @@ -2525,9 +2495,6 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe pSwerve, pAccel, pBrake, pHandbrake); return; case MISSION_BLOCKCAR_HANDBRAKESTOP: - if (!pVehicle->AutoPilot.m_pTargetCar) { - return; - } SteerAICarWithPhysicsTryingToBlockTarget_Stop(pVehicle, pVehicle->AutoPilot.m_pTargetCar->GetPosition().x, pVehicle->AutoPilot.m_pTargetCar->GetPosition().y, @@ -2605,8 +2572,8 @@ void CCarCtrl::SteerAIBoatWithPhysicsHeadingForTarget(CVehicle* pVehicle, float { CVector2D forward = pVehicle->GetForward(); forward.Normalise(); - float angleToTarget = GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); - float angleForward = GetATanOfXY(forward.x, forward.y); + float angleToTarget = CGeneral::GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); + float angleForward = CGeneral::GetATanOfXY(forward.x, forward.y); float steerAngle = LimitRadianAngle(angleToTarget - angleForward); steerAngle = clamp(steerAngle, -DEFAULT_MAX_STEER_ANGLE, DEFAULT_MAX_STEER_ANGLE); #ifdef FIX_BUGS @@ -2637,8 +2604,8 @@ void CCarCtrl::SteerAIBoatWithPhysicsAttackingPlayer(CVehicle* pVehicle, float* CVector2D forward = pVehicle->GetForward(); forward.Normalise(); CVector2D vecToProjection = FindPlayerCoors() + FindPlayerSpeed() * projection * GAME_SPEED_TO_CARAI_SPEED; - float angleToTarget = GetATanOfXY(vecToProjection.x - pVehicle->GetPosition().x, vecToProjection.y - pVehicle->GetPosition().y); - float angleForward = GetATanOfXY(forward.x, forward.y); + float angleToTarget = CGeneral::GetATanOfXY(vecToProjection.x - pVehicle->GetPosition().x, vecToProjection.y - pVehicle->GetPosition().y); + float angleForward = CGeneral::GetATanOfXY(forward.x, forward.y); float steerAngle = LimitRadianAngle(angleToTarget - angleForward); #ifdef FIX_BUGS float speedTarget = pVehicle->AutoPilot.GetCruiseSpeed(); @@ -2726,7 +2693,7 @@ void CCarCtrl::SteerAIHeliTowardsTargetCoors(CAutomobile* pHeli) if (distanceToTarget < 8.0f && pHeli->m_fHeliOrientation < 0.0f) ZTurnSpeedTarget = 0.0f; else { - float fAngleTarget = GetATanOfXY(vecToTarget.x, vecToTarget.y) + PI; + float fAngleTarget = CGeneral::GetATanOfXY(vecToTarget.x, vecToTarget.y) + PI; if (pHeli->m_fHeliOrientation >= 0.0f) fAngleTarget = pHeli->m_fHeliOrientation; fAngleTarget -= pHeli->m_fOrientation; @@ -2769,7 +2736,7 @@ 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 = GetATanOfXY(vecToTarget.x, vecToTarget.y); + float angle = CGeneral::GetATanOfXY(vecToTarget.x, vecToTarget.y); while (angle > TWOPI) angle -= TWOPI; float difference = LimitRadianAngle(angle - pPlane->m_fOrientation); @@ -2866,8 +2833,8 @@ void CCarCtrl::SteerAICarWithPhysicsFollowPath(CVehicle* pVehicle, float* pSwerv projectedPosition.y = positionOnCurrentLinkIncludingLane.y; } CVector2D distanceToProjectedPosition = projectedPosition - pVehicle->GetPosition(); - float angleCurrentLink = GetATanOfXY(distanceToProjectedPosition.x, distanceToProjectedPosition.y); - float angleForward = GetATanOfXY(forward.x, forward.y); + float angleCurrentLink = CGeneral::GetATanOfXY(distanceToProjectedPosition.x, distanceToProjectedPosition.y); + float angleForward = CGeneral::GetATanOfXY(forward.x, forward.y); if (pVehicle->AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_AVOID_CARS) angleCurrentLink = FindAngleToWeaveThroughTraffic(pVehicle, nil, angleCurrentLink, angleForward); float steerAngle = LimitRadianAngle(angleCurrentLink - angleForward); @@ -2912,11 +2879,11 @@ void CCarCtrl::SteerAICarWithPhysicsFollowPath(CVehicle* pVehicle, float* pSwerv pCurrentLink->GetY() - ((pVehicle->AutoPilot.m_nCurrentLane + pCurrentLink->OneWayLaneOffset()) * LANE_WIDTH) * currentPathLinkForward.x); trajectory -= pVehicle->GetPosition(); float speedAngleMultiplier = FindSpeedMultiplier( - GetATanOfXY(trajectory.x, trajectory.y) - angleForward, + CGeneral::GetATanOfXY(trajectory.x, trajectory.y) - angleForward, MIN_ANGLE_FOR_SPEED_LIMITING, MAX_ANGLE_FOR_SPEED_LIMITING, MIN_LOWERING_SPEED_COEFFICIENT); float tmpWideMultiplier = FindSpeedMultiplier( - GetATanOfXY(currentPathLinkForward.x, currentPathLinkForward.y) - - GetATanOfXY(nextPathLinkForwardX, nextPathLinkForwardY), + CGeneral::GetATanOfXY(currentPathLinkForward.x, currentPathLinkForward.y) - + CGeneral::GetATanOfXY(nextPathLinkForwardX, nextPathLinkForwardY), MIN_ANGLE_FOR_SPEED_LIMITING_BETWEEN_NODES, MAX_ANGLE_FOR_SPEED_LIMITING, MIN_LOWERING_SPEED_COEFFICIENT); float speedNodesMultiplier; if (scalarDistanceToNextNode > DISTANCE_TO_NEXT_NODE_TO_CONSIDER_SLOWING_DOWN || pVehicle->AutoPilot.m_nCruiseSpeed < 12) @@ -2950,8 +2917,8 @@ void CCarCtrl::SteerAICarWithPhysicsHeadingForTarget(CVehicle* pVehicle, CPhysic *pHandbrake = false; CVector2D forward = pVehicle->GetForward(); forward.Normalise(); - float angleToTarget = GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); - float angleForward = GetATanOfXY(forward.x, forward.y); + float angleToTarget = CGeneral::GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); + float angleForward = CGeneral::GetATanOfXY(forward.x, forward.y); if (pVehicle->AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_AVOID_CARS) angleToTarget = FindAngleToWeaveThroughTraffic(pVehicle, pTarget, angleToTarget, angleForward); float steerAngle = LimitRadianAngle(angleToTarget - angleForward); @@ -3157,7 +3124,7 @@ bool CCarCtrl::JoinCarWithRoadSystemGotoCoors(CVehicle* pVehicle, CVector vecTar void CCarCtrl::FindLinksToGoWithTheseNodes(CVehicle* pVehicle) { if (pVehicle->m_nRouteSeed) - CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++); + CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed); int nextLink; CPathNode* pCurNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nCurrentRouteNode]; for (nextLink = 0; nextLink < 12; nextLink++) @@ -3199,12 +3166,10 @@ void CCarCtrl::GenerateEmergencyServicesCar(void) return; if (CGame::IsInInterior()) return; - if (TheCamera.m_WideScreenOn) // TODO(LCS): verify - return; if (NumFiretrucksOnDuty + NumAmbulancesOnDuty + NumParkedCars + NumMissionCars + NumLawEnforcerCars + NumRandomCars > MaxNumberOfCarsInUse) return; - if (NumAmbulancesOnDuty == 0 && gbEmergencyVehiclesEnabled){ + if (NumAmbulancesOnDuty == 0){ if (gAccidentManager.CountActiveAccidents() < 2){ if (CStreaming::HasModelLoaded(MI_AMBULAN)) CStreaming::SetModelIsDeletable(MI_MEDIC); @@ -3224,7 +3189,7 @@ void CCarCtrl::GenerateEmergencyServicesCar(void) } } } - if (NumFiretrucksOnDuty == 0 && gbEmergencyVehiclesEnabled){ + if (NumFiretrucksOnDuty == 0){ if (gFireManager.GetTotalActiveFires() < 3){ if (CStreaming::HasModelLoaded(MI_FIRETRUCK)) CStreaming::SetModelIsDeletable(MI_FIREMAN); @@ -3273,7 +3238,7 @@ bool CCarCtrl::GenerateOneEmergencyServicesCar(uint32 mi, CVector vecPos) attempts += 1; } if (attempts >= 5) - return nil; + return false; CAutomobile* pVehicle = new CAutomobile(mi, RANDOM_VEHICLE); pVehicle->AutoPilot.m_vecDestinationCoors = vecPos; pVehicle->SetPosition(spawnPos); @@ -3388,17 +3353,6 @@ bool CCarCtrl::MapCouldMoveInThisArea(float x, float y) #endif } -bool -CCarCtrl::BoatWithTallMast(int32 mi) -{ - return mi == MI_RIO || mi == MI_TROPIC || mi == MI_MARQUIS; -} - -bool CCarCtrl::OkToCreateVehicleAtThisPosition(const CVector& pos) -{ - return true; -} - float CCarCtrl::FindSpeedMultiplierWithSpeedFromNodes(int8 type) { switch (type) @@ -3408,8 +3362,3 @@ float CCarCtrl::FindSpeedMultiplierWithSpeedFromNodes(int8 type) } return 1.0f; } - -void CCarCtrl::RenderDebugInfo(CVehicle*) -{ - //TODO(LCS) -} diff --git a/src/control/CarCtrl.h b/src/control/CarCtrl.h index edf1f41..5efbe27 100644 --- a/src/control/CarCtrl.h +++ b/src/control/CarCtrl.h @@ -1,7 +1,6 @@ #pragma once #include "PathFind.h" #include "Boat.h" -#include "General.h" #include "Vehicle.h" #define GAME_SPEED_TO_METERS_PER_SECOND 50.0f @@ -131,10 +130,6 @@ public: static void SteerAIBoatWithPhysicsAttackingPlayer(CVehicle*, float*, float*, float*, bool*); static void SteerAICarBlockingPlayerForwardAndBack(CVehicle*, float*, float*, float*, bool*); - static bool OkToCreateVehicleAtThisPosition(const CVector&); - static void RenderDebugInfo(CVehicle*); - static float GetATanOfXY(float x, float y) { float t = CGeneral::GetATanOfXY(x, y); if (t < 0.0f) t += TWOPI; return t; } - static float GetPositionAlongCurrentCurve(CVehicle* pVehicle) { uint32 timeInCurve = CTimer::GetTimeInMilliseconds() - pVehicle->AutoPilot.m_nTimeEnteredCurve; @@ -143,7 +138,11 @@ public: static float LimitRadianAngle(float angle) { - return CGeneral::LimitRadianAngle(angle); + while (angle < -PI) + angle += TWOPI; + while (angle > PI) + angle -= TWOPI; + return angle; } static bool bMadDriversCheat; @@ -172,5 +171,4 @@ public: static int32 LoadedCarsArray[TOTAL_CUSTOM_CLASSES][MAX_CAR_MODELS_IN_ARRAY]; }; -extern CVehicle* apCarsToKeep[MAX_CARS_TO_KEEP]; -extern bool gbEmergencyVehiclesEnabled; \ No newline at end of file +extern CVehicle* apCarsToKeep[MAX_CARS_TO_KEEP]; \ No newline at end of file diff --git a/src/control/GameLogic.cpp b/src/control/GameLogic.cpp index e238a8b..33c40c9 100644 --- a/src/control/GameLogic.cpp +++ b/src/control/GameLogic.cpp @@ -45,7 +45,6 @@ float CGameLogic::AfterDeathStartPointOrientation[NUM_SHORTCUT_START_POINTS]; CVector CGameLogic::ShortCutDropOffForMission; float CGameLogic::ShortCutDropOffOrientationForMission; bool CGameLogic::MissionDropOffReadyToBeUsed; -char CGameLogic::mStoredPlayerOutfit[8] = "plr3"; #define SHORTCUT_TAXI_COST (9) #define TOTAL_BUSTED_AUDIO (28) @@ -89,7 +88,7 @@ CGameLogic::SortOutStreamingAndMemory(const CVector &pos) CStreaming::DeleteRwObjectsAfterDeath(pos); CStreaming::RemoveUnusedModelsInLoadedList(); CGame::DrasticTidyUpMemory(true); - CWorld::Players[CWorld::PlayerInFocus].m_pPed->Undress(mStoredPlayerOutfit); + CWorld::Players[CWorld::PlayerInFocus].m_pPed->Undress("player"); CStreaming::LoadSceneCollision(pos); CStreaming::LoadScene(pos); CWorld::Players[CWorld::PlayerInFocus].m_pPed->Dress(); @@ -392,7 +391,7 @@ CGameLogic::RestorePlayerStuffDuringResurrection(CPlayerPed *pPlayerPed, CVector CWorld::Add(pPlayerPed); CHud::ResetWastedText(); CStreaming::StreamZoneModels(pos); - //clearWaterDrop = true; + clearWaterDrop = true; } void @@ -419,7 +418,7 @@ CGameLogic::SetUpShortCut(CVector vStartPos, float fStartAngle, CVector vEndPos, ShortCutStartOrientation = fStartAngle; ShortCutDestination = vEndPos; ShortCutDestinationOrientation = fEndAngle; - CStreaming::RequestModel(MI_CABBIE, 0); + CStreaming::RequestModel(MI_KAUFMAN, 0); } void @@ -451,11 +450,11 @@ CGameLogic::UpdateShortCut() { switch (ShortCutState) { case SHORTCUT_INIT: - if (!CStreaming::HasModelLoaded(MI_CABBIE)) { - CStreaming::RequestModel(MI_CABBIE, 0); + if (!CStreaming::HasModelLoaded(MI_KAUFMAN)) { + CStreaming::RequestModel(MI_KAUFMAN, 0); return; } - pShortCutTaxi = new CAutomobile(MI_CABBIE, RANDOM_VEHICLE); + pShortCutTaxi = new CAutomobile(MI_KAUFMAN, RANDOM_VEHICLE); if (!pShortCutTaxi) return; pShortCutTaxi->SetPosition(ShortCutStart); diff --git a/src/control/GameLogic.h b/src/control/GameLogic.h index a12b403..9b774cc 100644 --- a/src/control/GameLogic.h +++ b/src/control/GameLogic.h @@ -48,5 +48,4 @@ public: static CVector ShortCutDropOffForMission; static float ShortCutDropOffOrientationForMission; static bool MissionDropOffReadyToBeUsed; - static char mStoredPlayerOutfit[8]; }; \ No newline at end of file diff --git a/src/control/Garages.cpp b/src/control/Garages.cpp index c0eac80..7cf58d0 100644 --- a/src/control/Garages.cpp +++ b/src/control/Garages.cpp @@ -8,7 +8,6 @@ #include "DMAudio.h" #include "General.h" #include "Font.h" -#include "Frontend.h" #include "HandlingMgr.h" #include "Hud.h" #include "Messages.h" @@ -16,9 +15,7 @@ #include "Pad.h" #include "Particle.h" #include "PlayerPed.h" -#include "Radar.h" #include "Replay.h" -#include "Script.h" #include "Stats.h" #include "Streaming.h" #include "Text.h" @@ -46,7 +43,7 @@ #define RESPRAY_PRICE (100) // Distances -#define DISTANCE_TO_CALL_OFF_CHASE (50.0f) +#define DISTANCE_TO_CALL_OFF_CHASE (10.0f) #define DISTANCE_FOR_MRWHOOP_HACK (0.5f) #define DISTANCE_TO_ACTIVATE_GARAGE (8.0f) #define DISTANCE_TO_ACTIVATE_KEEPCAR_GARAGE (17.0f) @@ -103,10 +100,10 @@ const int32 gaCarsToCollectInCraigsGarages[TOTAL_COLLECTCARS_GARAGES][TOTAL_COLLECTCARS_CARS] = { - { MI_HEARSE, MI_FAGGIO, MI_FREEWAY, MI_SPIDER, MI_MANANA, MI_SHELBY, MI_PONTIAC, MI_ESPRIT, MI_HOTROD, MI_PCJ600, MI_SENTINEL, MI_INFERNUS, MI_BANSHEE, MI_PATRIOT, MI_BFINJECT, MI_LANDSTAL }, - { MI_HEARSE, MI_FAGGIO, MI_FREEWAY, MI_SPIDER, MI_MANANA, MI_SHELBY, MI_PONTIAC, MI_ESPRIT, MI_HOTROD, MI_PCJ600, MI_SENTINEL, MI_INFERNUS, MI_BANSHEE, MI_PATRIOT, MI_BFINJECT, MI_LANDSTAL }, - { MI_HEARSE, MI_FAGGIO, MI_FREEWAY, MI_SPIDER, MI_MANANA, MI_SHELBY, MI_PONTIAC, MI_ESPRIT, MI_HOTROD, MI_PCJ600, MI_SENTINEL, MI_INFERNUS, MI_BANSHEE, MI_PATRIOT, MI_BFINJECT, MI_LANDSTAL }, - { MI_HEARSE, MI_FAGGIO, MI_FREEWAY, MI_SPIDER, MI_MANANA, MI_SHELBY, MI_PONTIAC, MI_ESPRIT, MI_HOTROD, MI_PCJ600, MI_SENTINEL, MI_INFERNUS, MI_BANSHEE, MI_PATRIOT, MI_BFINJECT, MI_LANDSTAL }, + { MI_LANDSTAL, MI_IDAHO, MI_ESPERANT, MI_STALLION, MI_RANCHER, MI_BLISTAC }, + { MI_SABRE, MI_VIRGO, MI_SENTINEL, MI_STRETCH, MI_WASHING, MI_ADMIRAL }, + { MI_CHEETAH, MI_INFERNUS, MI_BANSHEE, MI_PHEONIX, MI_COMET, MI_STINGER }, + { MI_VOODOO, MI_CUBAN, MI_CADDY, MI_BAGGAGE, MI_MRWHOOP, MI_PIZZABOY } }; const int32 gaCarsToCollectIn60Seconds[] = { MI_CHEETAH, MI_TAXI, MI_ESPERANT, MI_SENTINEL, MI_IDAHO }; @@ -130,7 +127,6 @@ CStoredCar CGarages::aCarsInSafeHouses[TOTAL_HIDEOUT_GARAGES][NUM_GARAGE_STORED_ int32 hGarages = AEHANDLE_NONE; CGarage CGarages::aGarages[NUM_GARAGES]; bool CGarages::bCamShouldBeOutisde; -uint8 CGarages::CrusherRewardMultiplier; #ifndef MASTER bool bPrintNearestObject; @@ -141,7 +137,6 @@ void CGarages::Init(void) #ifndef MASTER VarConsole.Add("Print nearest object", &bPrintNearestObject, true); #endif - CrusherRewardMultiplier = 1; CrushedCarId = -1; NumGarages = 0; MessageEndTime = 0; @@ -222,7 +217,7 @@ int16 CGarages::AddOne(float X1, float Y1, float Z1, float X2, float Y2, float X pGarage->m_fSupX = Max(Max(X1, X2), X3); pGarage->m_fInfY = Min(Min(Min(Y1, Y2), Y3), Y2 + Y3 - Y1); pGarage->m_fSupY = Max(Max(Y1, Y2), Y3); - pGarage->m_vecCorner1 = CVector2D(X1, Y1); + pGarage->m_vecCorner1 = CVector(X1, Y1, Z1); pGarage->m_fInfZ = Z1; pGarage->m_vDir1 = CVector2D(X2 - X1, Y2 - Y1); pGarage->m_vDir2 = CVector2D(X3 - X1, Y3 - Y1); @@ -240,22 +235,6 @@ int16 CGarages::AddOne(float X1, float Y1, float Z1, float X2, float Y2, float X pGarage->m_bRecreateDoorOnNextRefresh = false; pGarage->m_bRotatedDoor = false; pGarage->m_bCameraFollowsPlayer = false; - pGarage->m_nTimeToStartAction = 0; - pGarage->field_2 = false; - pGarage->m_nTargetModelIndex = targetId; - pGarage->m_bCollectedCarsState = 0; - pGarage->m_bDeactivated = false; - pGarage->m_bResprayHappened = false; - pGarage->m_bInitialized = false; - pGarage->m_bSSGarageAcceptedVehicle = false; - pGarage->m_bSSGarageStateChanging = false; - pGarage->m_bInitialized = InitDoorGubbins(NumGarages, type); - return NumGarages++; -} - -bool CGarages::InitDoorGubbins(uint32 id, uint8 type) -{ - CGarage* pGarage = &aGarages[id]; pGarage->RefreshDoorPointers(true); if (pGarage->m_pDoor1) { pGarage->m_fDoor1Z = pGarage->m_pDoor1->GetPosition().z; @@ -270,6 +249,12 @@ bool CGarages::InitDoorGubbins(uint32 id, uint8 type) pGarage->m_fDoorHeight = pGarage->m_pDoor1 ? FindDoorHeightForMI(pGarage->m_pDoor1->GetModelIndex()) : 4.0f; pGarage->m_fDoorPos = 0.0f; pGarage->m_eGarageState = GS_FULLYCLOSED; + pGarage->m_nTimeToStartAction = 0; + pGarage->field_2 = false; + pGarage->m_nTargetModelIndex = targetId; + pGarage->m_bCollectedCarsState = 0; + pGarage->m_bDeactivated = false; + pGarage->m_bResprayHappened = false; switch (type) { case GARAGE_MISSION: case GARAGE_COLLECTORSITEMS: @@ -278,6 +263,7 @@ bool CGarages::InitDoorGubbins(uint32 id, uint8 type) case GARAGE_COLLECTCARS_2: case GARAGE_COLLECTCARS_3: case GARAGE_FORCARTOCOMEOUTOF: + case GARAGE_60SECONDS: case GARAGE_MISSION_KEEPCAR: case GARAGE_FOR_SCRIPT_TO_OPEN: case GARAGE_HIDEOUT_ONE: @@ -304,7 +290,6 @@ bool CGarages::InitDoorGubbins(uint32 id, uint8 type) case GARAGE_BOMBSHOP2: case GARAGE_BOMBSHOP3: case GARAGE_RESPRAY: - case GARAGE_CRATE_GARAGE: pGarage->m_eGarageState = GS_OPENED; pGarage->m_fDoorPos = pGarage->m_fDoorHeight; break; @@ -319,16 +304,7 @@ bool CGarages::InitDoorGubbins(uint32 id, uint8 type) pGarage->UpdateCrusherAngle(); else pGarage->UpdateDoorsHeight(); - return pGarage->m_fDoorHeight > 0.0f; -} - -void CGarages::SetupAnyGaragesForThisIsland(void) -{ - for (uint32 i = 0; i < NumGarages; i++) { - CGarage* pGarage = &aGarages[i]; - if (!pGarage->m_bInitialized) - pGarage->m_bInitialized = InitDoorGubbins(i, pGarage->m_eGarageType); - } + return NumGarages++; } void CGarages::ChangeGarageType(int16 garage, uint8 type, int32 mi) @@ -339,27 +315,8 @@ void CGarages::ChangeGarageType(int16 garage, uint8 type, int32 mi) pGarage->m_eGarageState = GS_FULLYCLOSED; } -void CGarages::LockGarage(int16 garage, bool state) -{ - CGarage* pGarage = &aGarages[garage]; - pGarage->m_bLocked = state; - if (pGarage->m_bLocked) { - pGarage->m_fDoorPos = 0.0f; - pGarage->m_eGarageState = GS_FULLYCLOSED; - pGarage->m_nTimeToStartAction = CTimer::GetTimeInMilliseconds() + 2000; - pGarage->UpdateDoorsHeight(); - } - else { - pGarage->m_eGarageState = GS_OPENING; - } -} - void CGarage::Update() { -#ifdef GTA_NETWORK - if (/* gIsMultiplayerGame && */m_eGarageType != GARAGE_CRATE_GARAGE) // TODO(multiplayer) - return; -#endif if (m_eGarageType != GARAGE_CRUSHER) { switch (m_eGarageState) { case GS_FULLYCLOSED: @@ -397,7 +354,7 @@ void CGarage::Update() if (m_bDeactivated && m_eGarageState == GS_FULLYCLOSED) return; if (m_bRotatedDoor) { -#if defined GTA_PS2 || defined GTA_PSP +#ifdef GTA_PS2 if (m_eGarageState == GS_OPENING) { if (m_pDoor1) { if (FindPlayerPed()->m_pCurrentPhysSurface == m_pDoor1) @@ -481,10 +438,7 @@ void CGarage::Update() #else if (FindPlayerVehicle()) #endif - { ((CAutomobile*)(FindPlayerVehicle()))->m_fFireBlowUpTimer = 0.0f; - FindPlayerVehicle()->m_bGarageTurnedLightsOff = true; - } CWorld::CallOffChaseForArea( m_fInfX - DISTANCE_TO_CALL_OFF_CHASE, m_fInfY - DISTANCE_TO_CALL_OFF_CHASE, @@ -492,7 +446,6 @@ void CGarage::Update() m_fSupY + DISTANCE_TO_CALL_OFF_CHASE); break; case GS_FULLYCLOSED: - m_fDoorPos = 0.0f; if (CTimer::GetTimeInMilliseconds() > m_nTimeToStartAction) { m_eGarageState = GS_OPENING; DMAudio.PlayFrontEndSound(SOUND_GARAGE_OPENING, 1); @@ -527,8 +480,11 @@ void CGarage::Update() FindPlayerVehicle()->GetRight() = -FindPlayerVehicle()->GetRight(); } bChangedColour = false; - if ((!FindPlayerVehicle()->IsCar() || !((CAutomobile*)(FindPlayerVehicle()))->bFixedColour) && - (!FindPlayerVehicle()->IsBike() || !((CBike*)(FindPlayerVehicle()))->bFixedColour)) { +#ifdef FIX_BUGS + if (!FindPlayerVehicle()->IsCar() || !((CAutomobile*)(FindPlayerVehicle()))->bFixedColour) { +#else + if (!((CAutomobile*)(FindPlayerVehicle()))->bFixedColour) { +#endif uint8 colour1, colour2; uint16 attempt; FindPlayerVehicle()->GetModelInfo()->ChooseVehicleColour(colour1, colour2); @@ -541,36 +497,12 @@ void CGarage::Update() FindPlayerVehicle()->m_currentColour1 = colour1; FindPlayerVehicle()->m_currentColour2 = colour2; if (bChangedColour) { - CVector vCorners[] = { - CVector(m_fInfX, m_fInfY, 0.0f), CVector(m_fInfX, m_fSupY, 0.0f), - CVector(m_fSupX, m_fInfY, 0.0f), CVector(m_fSupX, m_fSupY, 0.0f) - }; - CVector vMiddles[] = { - CVector(m_fInfX + (m_fSupX - m_fInfX) / 2, m_fInfY, 0.0f), CVector(m_fInfX, m_fInfY + (m_fSupY - m_fInfY) / 2, 0.0f), - CVector(m_fInfX + (m_fSupX - m_fInfX) / 2, m_fSupY, 0.0f), CVector(m_fSupX, m_fInfY + (m_fSupY - m_fInfY) / 2, 0.0f), - }; - int nClosestCornerToCamera = 0; - int nClosestMiddleToCamera = 0; - for (int i = 1; i < 4; i++) { - if ((vCorners[nClosestCornerToCamera] - TheCamera.GetPosition()).Magnitude() > - (vCorners[i] - TheCamera.GetPosition()).Magnitude()) - nClosestCornerToCamera = i; - if ((vMiddles[nClosestMiddleToCamera] - TheCamera.GetPosition()).Magnitude() > - (vMiddles[i] - TheCamera.GetPosition()).Magnitude()) - nClosestMiddleToCamera = i; - } - CVector vDirectionCenterToMiddle = vMiddles[nClosestMiddleToCamera] - CVector(GetGarageCenterX(), GetGarageCenterY(), 0.0f); - vDirectionCenterToMiddle.Normalise(); - for (int i = 0; i < NUM_PARTICLES_IN_RESPRAY; i++) { - CVector pos(vMiddles[nClosestMiddleToCamera] - vDirectionCenterToMiddle * 0.5f); - CVector dir(CrossProduct(vDirectionCenterToMiddle, CVector(0.0f, 0.0f, 1.0f))); - float fDirMultiplier = (vCorners[nClosestCornerToCamera] - vMiddles[nClosestMiddleToCamera]).Magnitude(); - pos += dir * CGeneral::GetRandomNumberInRange(-1.0f, 1.0f) * fDirMultiplier; // TODO: base::RandomReal? - pos += vDirectionCenterToMiddle * CGeneral::GetRandomNumberInRange(-6.0f, 0.4f); - dir = vDirectionCenterToMiddle * 0.04f; - pos.z = m_fInfZ + CGeneral::GetRandomNumberInRange(-0.4f, 0.0f); - CParticle::AddParticle(PARTICLE_GARAGEPAINT_SPRAY, pos, dir, nil, 0.0f, CVehicleModelInfo::mspInfo->ms_vehicleColourTable[colour1]); + CVector pos; + pos.x = CGeneral::GetRandomNumberInRange(m_fInfX + 0.5f, m_fSupX - 0.5f); + pos.y = CGeneral::GetRandomNumberInRange(m_fInfY + 0.5f, m_fSupY - 0.5f); + pos.z = CGeneral::GetRandomNumberInRange(m_fDoor1Z - 3.0f, m_fDoor1Z + 1.0f); + CParticle::AddParticle(PARTICLE_GARAGEPAINT_SPRAY, pos, CVector(0.0f, 0.0f, 0.0f), nil, 0.0f, CVehicleModelInfo::ms_vehicleColourTable[colour1]); } } } @@ -580,11 +512,8 @@ void CGarage::Update() if (!CGarages::RespraysAreFree) { CWorld::Players[CWorld::PlayerInFocus].m_nMoney = Max(0, CWorld::Players[CWorld::PlayerInFocus].m_nMoney - RESPRAY_PRICE); CStats::AutoPaintingBudget += RESPRAY_PRICE; - CGarages::TriggerMessage("GA_2", -1, 4000, -1); // New engine and paint job. The cops won't recognize you! - } - else { - CGarages::TriggerMessage("GA_17", -1, 4000, -1); } + CGarages::TriggerMessage("GA_2", -1, 4000, -1); // New engine and paint job. The cops won't recognize you! } else if (bChangedColour) { if (CGeneral::GetRandomTrueFalse()) @@ -609,8 +538,6 @@ void CGarage::Update() UpdateDoorsHeight(); break; case GS_OPENEDCONTAINSCAR: - if (FindPlayerVehicle()) - FindPlayerVehicle()->m_bGarageTurnedLightsOff = false; if (IsPlayerOutsideGarage()) m_eGarageState = GS_OPENED; break; @@ -623,20 +550,9 @@ void CGarage::Update() case GARAGE_BOMBSHOP1: case GARAGE_BOMBSHOP2: case GARAGE_BOMBSHOP3: - if (m_bLocked) { - UpdateDoorsHeight(); - break; - } switch (m_eGarageState) { case GS_OPENED: - UpdateDoorsHeight(); if (IsStaticPlayerCarEntirelyInside()) { - if (FindPlayerVehicle()->GetVehicleAppearance() == VEHICLE_APPEARANCE_BIKE) { - CGarages::TriggerMessage("GA_22", -1, 4000, -1); - m_eGarageState = GS_OPENEDCONTAINSCAR; - DMAudio.PlayFrontEndSound(SOUND_GARAGE_BOMB_ALREADY_SET, 1); - break; - } if (!FindPlayerVehicle() || FindPlayerVehicle()->m_bombType) { CGarages::TriggerMessage("GA_5", -1, 4000, -1); //"Your car is already fitted with a bomb" m_eGarageState = GS_OPENEDCONTAINSCAR; @@ -663,8 +579,6 @@ void CGarage::Update() m_nTimeToStartAction = CTimer::GetTimeInMilliseconds() + TIME_TO_SETUP_BOMB; DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f); } - if (FindPlayerVehicle()) - FindPlayerVehicle()->m_bGarageTurnedLightsOff = true; UpdateDoorsHeight(); if (m_eGarageType == GARAGE_BOMBSHOP3) CStreaming::RequestModel(MI_BOMB, STREAMFLAGS_DONT_REMOVE); @@ -681,25 +595,13 @@ void CGarage::Update() if (!CGarages::BombsAreFree) CWorld::Players[CWorld::PlayerInFocus].m_nMoney = Max(0, CWorld::Players[CWorld::PlayerInFocus].m_nMoney - BOMB_PRICE); if (FindPlayerVehicle() && (FindPlayerVehicle()->IsCar() || FindPlayerVehicle()->IsBike())) { -#if (!defined GTA_PS2 || defined FIX_BUGS) // <- this remained in CAutomobile in LCS +#if (!defined GTA_PS2 || defined FIX_BUGS) FindPlayerVehicle()->m_bombType = CGarages::GetBombTypeForGarageType(m_eGarageType); FindPlayerVehicle()->m_pBombRigger = FindPlayerPed(); #else // PS2 version contained a bug: CBike was casted to CAutomobile, but due to coincidence it didn't corrupt memory ((CAutomobile*)(FindPlayerVehicle()))->m_bombType = CGarages::GetBombTypeForGarageType(m_eGarageType); ((CAutomobile*)(FindPlayerVehicle()))->m_pBombRigger = FindPlayerPed(); #endif - // what is this - uint32 i = CPools::GetVehiclePool()->GetSize(); - while (i--) { - CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i); - if (pVehicle) { - if (pVehicle->IsCar() && pVehicle->GetStatus() == STATUS_WRECKED) { - CAutomobile* pCar = (CAutomobile*)pVehicle; - pCar->m_pBombRigger = nil; - pCar->m_pBlowUpEntity = nil; - } - } - } if (m_eGarageType == GARAGE_BOMBSHOP3) CGarages::GivePlayerDetonator(); CStats::KgsOfExplosivesUsed += KGS_OF_EXPLOSIVES_IN_BOMB; @@ -738,7 +640,6 @@ void CGarage::Update() CHud::SetHelpMessage(TheText.Get("GA_8"), false); // Use the detonator to activate the bomb. break; } - CGarages::TriggerMessage(CGarages::BombsAreFree ? "GA_24" : "GA_23", -1, 4000, -1); CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_GARAGE); FindPlayerPed()->m_pWanted->m_bIgnoredByCops = false; } @@ -756,8 +657,6 @@ void CGarage::Update() UpdateDoorsHeight(); break; case GS_OPENEDCONTAINSCAR: - if (FindPlayerVehicle()) - FindPlayerVehicle()->m_bGarageTurnedLightsOff = false; if (IsPlayerOutsideGarage()) m_eGarageState = GS_OPENED; break; @@ -771,12 +670,16 @@ void CGarage::Update() switch (m_eGarageState) { case GS_OPENED: if (((CVector2D)FindPlayerCoors() - CVector2D(GetGarageCenterX(), GetGarageCenterY())).MagnitudeSqr() > SQR(DISTANCE_TO_CLOSE_MISSION_GARAGE)) { - if ((CTimer::GetFrameCounter() & 0x1F) == 0 && !IsAnyOtherCarTouchingGarage(nil)) { + if ((CTimer::GetFrameCounter() & 0x1F) == 0 +#ifndef GTA_PS2 + && (!m_pTarget || IsEntityTouching3D(m_pTarget)) +#endif + ) { m_eGarageState = GS_CLOSING; m_bClosingWithoutTargetCar = true; } } - else if (m_pTarget && IsEntityEntirelyInside3D(m_pTarget, 0.0f) && + else if (!FindPlayerVehicle() && m_pTarget && IsEntityEntirelyInside3D(m_pTarget, 0.0f) && IsEntityEntirelyOutside(FindPlayerVehicle() ? (CEntity*)FindPlayerVehicle() : (CEntity*)FindPlayerPed(), 2.0f)) { CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_GARAGE); FindPlayerPed()->m_pWanted->m_bIgnoredByCops = true; @@ -788,11 +691,7 @@ void CGarage::Update() if (m_pTarget) ThrowCarsNearDoorOutOfGarage(m_pTarget); m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep()); - if (!IsEntityEntirelyOutside(FindPlayerPed(), 1.0f)) { - printf("FIX FOR IE GARAGE TRAPPING PLAYER\n"); - m_eGarageState = GS_OPENING; - } - else if (m_fDoorPos == 0.0f) { + if (m_fDoorPos == 0.0f) { DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f); if (m_bClosingWithoutTargetCar) m_eGarageState = GS_FULLYCLOSED; @@ -888,21 +787,22 @@ void CGarage::Update() UpdateDoorsHeight(); break; case GS_FULLYCLOSED: - if (CTheScripts::IsPlayerOnAMission()) { - m_pTarget = nil; - break; - } - if (!IsEntityEntirelyOutside(FindPlayerPed(), 0.0f)) { - printf("FIX FOR IE GARAGE TRAPPING PLAYER\n"); - m_eGarageState = GS_OPENING; - } if (FindPlayerVehicle() && CalcSmallestDistToGarageDoorSquared( FindPlayerVehicle()->GetPosition().x, FindPlayerVehicle()->GetPosition().y ) < SQR(DISTANCE_TO_ACTIVATE_GARAGE)) { if (DoesCraigNeedThisCar(FindPlayerVehicle()->GetModelIndex())) { - m_eGarageState = GS_OPENING; + if (FindPlayerVehicle()->VehicleCreatedBy == MISSION_VEHICLE) + CGarages::TriggerMessage("GA_1A", -1, 5000, -1); // Come back when you're not so busy... + else + m_eGarageState = GS_OPENING; + } + else { + if (HasCraigCollectedThisCar(FindPlayerVehicle()->GetModelIndex())) + CGarages::TriggerMessage("GA_20", -1, 5000, -1); // We got more of these than we can shift. Sorry man, no deal. + else if (FindPlayerSpeed().Magnitude() < MAX_SPEED_TO_SHOW_COLLECTED_MESSAGE) + CGarages::TriggerMessage("GA_19", -1, 5000, -1); // We're not interested in that model. } } m_pTarget = nil; @@ -938,7 +838,6 @@ void CGarage::Update() m_eGarageState = GS_FULLYCLOSED; DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f); } - UpdateDoorsHeight(); if (!IsGarageEmpty()) m_eGarageState = GS_OPENING; break; @@ -959,169 +858,8 @@ void CGarage::Update() break; } break; - case GARAGE_CRATE_GARAGE: -#ifdef GTA_NETWORK - { - switch (m_eGarageState) { - case GS_OPENED: - if (m_pSSVehicle) { - // if (m_pSSVehicle->GetVehiclePointer() && IsEntityEntirelyInside3D(m_pSSVehicle->GetVehiclePointer()) - { - if (m_pSSTargetCar) - m_pSSTargetCar->CleanUpOldReference((CEntity**)&m_pSSTargetCar); - // m_pSSTargetCar = m_pSSVehicle->GetVehiclePointer(); - m_pSSTargetCar->RegisterReference((CEntity**)&m_pSSTargetCar); - } - // else - { - if (m_pSSTargetCar) - m_pSSTargetCar->CleanUpOldReference((CEntity**)&m_pSSTargetCar); - m_pSSTargetCar = nil; - } - if (m_pSSTargetCar) { - if (!FindPlayerVehicle()/* && m_pSSTargetCar == m_pSSVehicle->GetVehiclePointer() */) - { - if (IsEntityEntirelyOutside(FindPlayerPed(), 6.0f)) { - if (FindPlayerPed()->m_fHealth > 0.0f) { - CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_GARAGE); - m_eGarageState = GS_CLOSING; - m_bSSGarageStateChanging = true; - } - } - } - } - } - break; - case GS_CLOSING: - m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep()); - if (m_fDoorPos == 0.0f) { - // if (? == m_nSSGarageState) - { - if (m_pSSTargetCar) { - // if (m_pSSVehicle->GetVehiclePointer()) - { - if (IsEntityEntirelyInside3D(/* m_pSSVehicle->GetVehiclePointer() */nil, 0.0f)) { - if (m_pSSTargetCar) - m_pSSTargetCar->CleanUpOldReference((CEntity**)&m_pSSTargetCar); - CWorld::Remove(m_pSSTargetCar); - delete m_pSSTargetCar; - m_pSSTargetCar = nil; - m_pSSVehicle = nil; - m_bSSGarageAcceptedVehicle = true; - printf("Destroying Car Inside Crate....\n"); - } - } - } - } - // TODO: some loop :( - CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_GARAGE); - m_eGarageState = GS_FULLYCLOSED; - DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f); - } - UpdateDoorsHeight(); - if (!IsGarageEmpty()) - m_eGarageState = GS_OPENING; - break; - case GS_FULLYCLOSED: - { - // if (? == m_nSSGarageState) - { - if (CalcDistToGarageRectangleSquared(FindPlayerPed()->GetPosition().x, FindPlayerPed()->GetPosition().y) > SQR(10.0f)) - m_eGarageState = GS_OPENING; - } - break; - } - case GS_OPENING: - m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep()); - if (m_fDoorPos == m_fDoorHeight) { - m_bSSGarageStateChanging = false; - m_eGarageState = GS_OPENED; - DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f); - } - UpdateDoorsHeight(); - break; - } - break; - } -#endif case GARAGE_CRUSHER: - { - switch (m_eGarageState) { - case GS_OPENED: - { - int i = CPools::GetVehiclePool()->GetSize() * (CTimer::GetFrameCounter() % CRUSHER_VEHICLE_TEST_SPAN) / CRUSHER_VEHICLE_TEST_SPAN; - int end = CPools::GetVehiclePool()->GetSize() * (CTimer::GetFrameCounter() % CRUSHER_VEHICLE_TEST_SPAN + 1) / CRUSHER_VEHICLE_TEST_SPAN; - for (; i < end; i++) { - CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i); - if (!pVehicle) - continue; - if ((pVehicle->IsCar() || pVehicle->IsBike()) && IsEntityEntirelyInside3D(pVehicle, 0.0f)) { - m_eGarageState = GS_WAITINGFORCAR; - m_pTarget = pVehicle; - m_nTimeCrusherCraneActivated = CTimer::GetTimeInMilliseconds(); - m_pTarget->RegisterReference((CEntity**)&m_pTarget); - } - } - break; - } - case GS_CLOSING: - if (m_pTarget) { - m_fDoorPos = Max(0.0f, m_fDoorPos - CRUSHER_CRANE_SPEED * CTimer::GetTimeStep()); - if (m_fDoorPos < TWOPI / 5) { - m_pTarget->bUsesCollision = false; - m_pTarget->bAffectedByGravity = false; - m_pTarget->SetMoveSpeed(0.0f, 0.0f, 0.0f); - } - else { - m_pTarget->SetMoveSpeed(m_pTarget->GetMoveSpeed() * Pow(0.8f, CTimer::GetTimeStep())); - } - if (m_fDoorPos == 0.0f) { - CGarages::CrushedCarId = CPools::GetVehiclePool()->GetIndex(m_pTarget); - float reward = Min(CRUSHER_MAX_REWARD, CRUSHER_MIN_REWARD + m_pTarget->pHandling->nMonetaryValue * m_pTarget->m_fHealth * CRUSHER_REWARD_COEFFICIENT); - CWorld::Players[CWorld::PlayerInFocus].m_nMoney += reward * CGarages::CrusherRewardMultiplier; - CMessages::AddMessageWithNumber(TheText.Get("CRUSHED"), 5000, 1, reward* CGarages::CrusherRewardMultiplier, -1, -1, -1, -1, -1); - DestroyVehicleAndDriverAndPassengers(m_pTarget); - //++CStats::CarsCrushed; // TODO - m_pTarget = nil; - m_eGarageState = GS_AFTERDROPOFF; - m_nTimeToStartAction = CTimer::GetTimeInMilliseconds() + TIME_TO_CRUSH_CAR; - DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f); - } - } - else - m_eGarageState = GS_OPENING; - UpdateCrusherAngle(); - break; - case GS_AFTERDROPOFF: - if (CTimer::GetTimeInMilliseconds() <= m_nTimeToStartAction) { - UpdateCrusherShake((myrand() & 0xFF - 128) * 0.0002f, (myrand() & 0xFF - 128) * 0.0002f); - } - else { - UpdateCrusherShake(0.0f, 0.0f); - m_eGarageState = GS_OPENING; - } - break; - case GS_OPENING: - m_fDoorPos = Min(HALFPI, m_fDoorPos + CTimer::GetTimeStep() * CRUSHER_CRANE_SPEED); - if (m_fDoorPos == HALFPI) { - m_eGarageState = GS_OPENED; - DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f); - } - UpdateCrusherAngle(); - break; - case GS_WAITINGFORCAR: - if (m_pTarget) { - if (CTimer::GetTimeInMilliseconds() - m_nTimeCrusherCraneActivated > 3000) - m_eGarageState = GS_CLOSING; - } - break; - default: - break; - } - if (!FindPlayerVehicle() && (CTimer::GetFrameCounter() & 0x1F) == 0x17 && IsEntityEntirelyInside3D(FindPlayerPed(), 0.0f)) - FindPlayerPed()->InflictDamage(nil, WEAPONTYPE_RAMMEDBYCAR, 300.0f, PEDPIECE_TORSO, 0); break; - } case GARAGE_MISSION_KEEPCAR: case GARAGE_MISSION_KEEPCAR_REMAINCLOSED: switch (m_eGarageState) { @@ -1279,10 +1017,7 @@ void CGarage::Update() break; case GS_FULLYCLOSED: { - float distance = INFINITY; - if (CWorld::Players[CWorld::PlayerInFocus].m_pPed) { - distance = CalcDistToGarageRectangleSquared(FindPlayerCoors().x, FindPlayerCoors().y); - } + float distance = CalcDistToGarageRectangleSquared(FindPlayerCoors().x, FindPlayerCoors().y); if (distance < SQR(DISTANCE_TO_OPEN_HIDEOUT_GARAGE_ON_FOOT) || distance < SQR(DISTANCE_TO_OPEN_HIDEOUT_GARAGE_IN_CAR) && FindPlayerVehicle()) { if (FindPlayerVehicle() && CGarages::CountCarsInHideoutGarage(m_eGarageType) >= FindMaxNumStoredCarsForGarage()) { @@ -1474,15 +1209,8 @@ bool CGarage::IsEntityEntirelyInside3D(CEntity* pEntity, float fMargin) for (int i = 0; i < pColModel->numSpheres; i++) { CVector pos = pEntity->GetMatrix() * pColModel->spheres[i].center; float radius = pColModel->spheres[i].radius; - if (m_eGarageType == GARAGE_CRATE_GARAGE) { - if (pos.x + radius < m_fInfX - fMargin || pos.x - radius > m_fSupX + fMargin || - pos.y + radius < m_fInfY - fMargin || pos.y - radius > m_fSupX + fMargin) - return false; - } - else { - if (!IsPointInsideGarage(pos, fMargin - radius)) - return false; - } + if (!IsPointInsideGarage(pos, fMargin - radius)) + return false; } return true; } @@ -1496,23 +1224,12 @@ bool CGarage::IsEntityEntirelyOutside(CEntity * pEntity, float fMargin) for (int i = 0; i < pColModel->numSpheres; i++) { CVector pos = pEntity->GetMatrix() * pColModel->spheres[i].center; float radius = pColModel->spheres[i].radius; - if (m_eGarageType == GARAGE_CRATE_GARAGE) { - if (pos.x + radius > m_fInfX - fMargin && pos.x - radius < m_fSupX + fMargin && - pos.y + radius > m_fInfY - fMargin && pos.y - radius < m_fSupX + fMargin) - return false; - } - else { - if (IsPointInsideGarage(pos, fMargin + radius)) - return false; - } + if (IsPointInsideGarage(pos, fMargin + radius)) + return false; } return true; } -#ifdef GTA_NETWORK -// some CGarage method (0x134E7C) -#endif - bool CGarage::IsGarageEmpty() { int16 num; @@ -1683,20 +1400,23 @@ void CGarage::RemoveCarsBlockingDoorNotInside() void CGarages::PrintMessages() { if (CTimer::GetTimeInMilliseconds() > MessageStartTime && CTimer::GetTimeInMilliseconds() < MessageEndTime) { - // CRadar::m_FadeDownRadar = true; // TODO CFont::DrawFonts(); - float x_scale = FrontEndMenuManager.m_PrefsUseWideScreen ? 0.34506f : 0.3834f; - CFont::SetScale(PSP_SCREEN_SCALE_X(x_scale), PSP_SCREEN_SCALE_Y(0.71f)); + CFont::SetScale(SCREEN_SCALE_X(1.2f), SCREEN_SCALE_Y(1.5f)); CFont::SetPropOn(); CFont::SetJustifyOff(); CFont::SetBackgroundOff(); +#ifdef FIX_BUGS + CFont::SetCentreSize(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH - 50)); +#else + CFont::SetCentreSize(SCREEN_WIDTH - 50); +#endif CFont::SetCentreOn(); CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD)); CFont::SetColor(CRGBA(27, 89, 130, 255)); CFont::SetDropShadowPosition(2); CFont::SetDropColor(CRGBA(0, 0, 0, 255)); - CFont::SetCentreSize(PSP_SCREEN_SCALE_X(454.0f)); - float y_offset = PSP_SCREEN_SCALE_Y(170.0f); + + float y_offset = SCREEN_SCALE_Y(140.0f); if (MessageNumberInString2 >= 0) { CMessages::InsertNumberInString(TheText.Get(MessageIDString), MessageNumberInString, MessageNumberInString2, -1, -1, -1, -1, gUString); @@ -1717,7 +1437,6 @@ bool CGarages::IsCarSprayable(CVehicle * pVehicle) switch (pVehicle->GetModelIndex()) { case MI_FIRETRUCK: case MI_AMBULAN: - case MI_FBICAR: case MI_POLICE: case MI_ENFORCER: case MI_BUS: @@ -1725,6 +1444,9 @@ bool CGarages::IsCarSprayable(CVehicle * pVehicle) case MI_BARRACKS: case MI_DODO: case MI_COACH: +#ifndef GTA_PS2 + case MI_FBIRANCH: +#endif return false; default: break; @@ -1781,7 +1503,6 @@ void CGarage::UpdateCrusherAngle() void CGarage::UpdateCrusherShake(float X, float Y) { - /* RefreshDoorPointers(false); m_pDoor1->GetMatrix().GetPosition().x += X; m_pDoor1->GetMatrix().GetPosition().y += Y; @@ -1795,7 +1516,6 @@ void CGarage::UpdateCrusherShake(float X, float Y) m_pDoor2->UpdateRwFrame(); m_pDoor2->GetMatrix().GetPosition().x -= X; m_pDoor2->GetMatrix().GetPosition().y -= Y; - */ } void CGarage::RefreshDoorPointers(bool bCreate) @@ -1861,7 +1581,6 @@ void CGarages::TriggerMessage(const char* text, int16 num1, uint16 time, int16 n MessageEndTime = CTimer::GetTimeInMilliseconds() - 500 + time; } else { - CMessages::AddToPreviousBriefArray(TheText.Get(text), -1, -1, -1, -1, -1, -1, nil); strcpy(MessageIDString, text); MessageStartTime = CTimer::GetTimeInMilliseconds(); MessageEndTime = CTimer::GetTimeInMilliseconds() + time; @@ -1907,8 +1626,7 @@ int32 CGarages::QueryCarsCollected(int16 garage) bool CGarages::HasImportExportGarageCollectedThisCar(int16 garage, int8 car) { - uint32 total; - return CarTypesCollected[GetCarsCollectedIndexForGarageType(aGarages[garage].m_eGarageType, total)] & (BIT(car)); + return CarTypesCollected[GetCarsCollectedIndexForGarageType(aGarages[garage].m_eGarageType)] & (BIT(car)); } bool CGarages::IsGarageOpen(int16 garage) @@ -1928,9 +1646,8 @@ bool CGarages::HasThisCarBeenCollected(int16 garage, uint8 id) bool CGarage::DoesCraigNeedThisCar(int32 mi) { - uint32 total; - int ct = CGarages::GetCarsCollectedIndexForGarageType(m_eGarageType, total); - for (int i = 0; i < total; i++) { + int ct = CGarages::GetCarsCollectedIndexForGarageType(m_eGarageType); + for (int i = 0; i < TOTAL_COLLECTCARS_CARS; i++) { if (mi == gaCarsToCollectInCraigsGarages[ct][i] || (gaCarsToCollectInCraigsGarages[ct][i] == MI_CHEETAH && mi == MI_VICECHEE)) return (CGarages::CarTypesCollected[ct] & BIT(i)) == 0; } @@ -1939,10 +1656,9 @@ bool CGarage::DoesCraigNeedThisCar(int32 mi) bool CGarage::HasCraigCollectedThisCar(int32 mi) { - uint32 total; - int ct = CGarages::GetCarsCollectedIndexForGarageType(m_eGarageType, total); - for (int i = 0; i < total; i++) { - if (mi == gaCarsToCollectInCraigsGarages[ct][i]) + int ct = CGarages::GetCarsCollectedIndexForGarageType(m_eGarageType); + for (int i = 0; i < TOTAL_COLLECTCARS_CARS; i++) { + if (mi == gaCarsToCollectInCraigsGarages[ct][i] || (gaCarsToCollectInCraigsGarages[ct][i] == MI_CHEETAH && mi == MI_VICECHEE)) return CGarages::CarTypesCollected[ct] & BIT(i); } return false; @@ -1950,21 +1666,24 @@ bool CGarage::HasCraigCollectedThisCar(int32 mi) bool CGarage::MarkThisCarAsCollectedForCraig(int32 mi) { - uint32 total; - int ct = CGarages::GetCarsCollectedIndexForGarageType(m_eGarageType, total); + int ct = CGarages::GetCarsCollectedIndexForGarageType(m_eGarageType); int index; - for (index = 0; index < total; index++) { - if (mi == gaCarsToCollectInCraigsGarages[ct][index]) + for (index = 0; index < TOTAL_COLLECTCARS_CARS; index++) { + if (mi == gaCarsToCollectInCraigsGarages[ct][index] || (gaCarsToCollectInCraigsGarages[ct][index] == MI_CHEETAH && mi == MI_VICECHEE)) break; } - if (index >= total) + if (index >= TOTAL_COLLECTCARS_CARS) return false; CGarages::CarTypesCollected[ct] |= BIT(index); - for (int i = 0; i < total; i++) { + CWorld::Players[CWorld::PlayerInFocus].m_nMoney += IMPORT_REWARD; + for (int i = 0; i < TOTAL_COLLECTCARS_CARS; i++) { if ((CGarages::CarTypesCollected[ct] & BIT(i)) == 0) { + CGarages::TriggerMessage("GA_13", -1, 5000, -1); // Delivered like a pro. Complete the list and there'll be a bonus for you. return false; } } + CWorld::Players[CWorld::PlayerInFocus].m_nMoney += IMPORT_ALLCARS_REWARD; + CGarages::TriggerMessage("GA_14", -1, 5000, -1); // All the cars. NICE! Here's a little something. return true; } @@ -2032,17 +1751,15 @@ void CGarage::FindDoorsEntities() } } if (m_pDoor1 && m_pDoor2) { - if (m_pDoor1->GetModelIndex() != MI_CRUSHERBODY && m_pDoor1->GetModelIndex() != MI_CRUSHERLID) { - CVector2D vecDoor1ToGarage(m_pDoor1->GetPosition().x - GetGarageCenterX(), m_pDoor1->GetPosition().y - GetGarageCenterY()); - CVector2D vecDoor2ToGarage(m_pDoor2->GetPosition().x - GetGarageCenterX(), m_pDoor2->GetPosition().y - GetGarageCenterY()); - if (DotProduct2D(vecDoor1ToGarage, vecDoor2ToGarage) > 0.0f) { - if (vecDoor1ToGarage.MagnitudeSqr() >= vecDoor2ToGarage.MagnitudeSqr()) { - m_pDoor1 = m_pDoor2; - m_bDoor1IsDummy = m_bDoor2IsDummy; - } - m_pDoor2 = nil; - m_bDoor2IsDummy = false; + CVector2D vecDoor1ToGarage(m_pDoor1->GetPosition().x - GetGarageCenterX(), m_pDoor1->GetPosition().y - GetGarageCenterY()); + CVector2D vecDoor2ToGarage(m_pDoor2->GetPosition().x - GetGarageCenterX(), m_pDoor2->GetPosition().y - GetGarageCenterY()); + if (DotProduct2D(vecDoor1ToGarage, vecDoor2ToGarage) > 0.0f) { + if (vecDoor1ToGarage.MagnitudeSqr() >= vecDoor2ToGarage.MagnitudeSqr()) { + m_pDoor1 = m_pDoor2; + m_bDoor1IsDummy = m_bDoor2IsDummy; } + m_pDoor2 = nil; + m_bDoor2IsDummy = false; } } if (m_pDoor1) @@ -2061,27 +1778,8 @@ void CGarage::FindDoorsEntitiesSectorList(CPtrList& list, bool dummy) pEntity->m_scanCode = CWorld::GetCurrentScanCode(); if (!pEntity || !CGarages::IsModelIndexADoor(pEntity->GetModelIndex())) continue; - if (Abs(pEntity->GetPosition().x - GetGarageCenterX()) >= 20.0f || - Abs(pEntity->GetPosition().y - GetGarageCenterY()) >= 20.0f) + if (!IsPointInsideGarage(pEntity->GetPosition(), 2.0f)) continue; - if (pEntity->GetModelIndex() == MI_CRUSHERBODY) { - m_pDoor1 = pEntity; - m_bDoor1IsDummy = dummy; - if (dummy) - m_bDoor1PoolIndex = (CPools::GetDummyPool()->GetIndex((CDummy*)pEntity)) & 0x7F; - else - m_bDoor1PoolIndex = (CPools::GetObjectPool()->GetIndex((CObject*)pEntity)) & 0x7F; - continue; - } - if (pEntity->GetModelIndex() == MI_CRUSHERLID) { - m_pDoor2 = pEntity; - m_bDoor2IsDummy = dummy; - if (dummy) - m_bDoor2PoolIndex = (CPools::GetDummyPool()->GetIndex((CDummy*)pEntity)) & 0x7F; - else - m_bDoor2PoolIndex = (CPools::GetObjectPool()->GetIndex((CObject*)pEntity)) & 0x7F; - continue; - } if (!m_pDoor1) { m_pDoor1 = pEntity; m_bDoor1IsDummy = dummy; @@ -2138,48 +1836,25 @@ bool CGarages::HasCarBeenCrushed(int32 handle) void CStoredCar::StoreCar(CVehicle* pVehicle) { m_nModelIndex = pVehicle->GetModelIndex(); - m_fPosX = pVehicle->GetPosition().x; - m_fPosY = pVehicle->GetPosition().y; - m_fPosY = pVehicle->GetPosition().z; - m_fForwardX = pVehicle->GetForward().x; - m_fForwardY = pVehicle->GetForward().y; - m_fForwardZ = pVehicle->GetForward().z; - m_fTractionMultiplier = 1.0f; + m_vecPos = pVehicle->GetPosition(); + m_vecAngle = pVehicle->GetForward(); m_nPrimaryColor = pVehicle->m_currentColour1; m_nSecondaryColor = pVehicle->m_currentColour2; m_nRadioStation = pVehicle->m_nRadioStation; m_nVariationA = pVehicle->m_aExtras[0]; m_nVariationB = pVehicle->m_aExtras[1]; - m_nFlags = 0; - if (pVehicle->bRewardVehicle) m_nFlags |= FLAG_REWARD_VEHICLE; - if (pVehicle->bBulletProof) m_nFlags |= FLAG_BULLETPROOF; - if (pVehicle->bFireProof) m_nFlags |= FLAG_FIREPROOF; - if (pVehicle->bExplosionProof) m_nFlags |= FLAG_EXPLOSIONPROOF; - if (pVehicle->bCollisionProof) m_nFlags |= FLAG_COLLISIONPROOF; - if (pVehicle->bMeleeProof) m_nFlags |= FLAG_MELEEPROOF; - if (pVehicle->bTyresDontBurst) m_nFlags |= FLAG_TIRES_INVULNERABLE; - if (pVehicle->bTakeLessDamage) m_nFlags |= FLAG_STRONG; - if (pVehicle->bIsHeavy) m_nFlags |= FLAG_HEAVY; - if (pVehicle->IsCar()) { - CAutomobile* pAutomobile = (CAutomobile*)pVehicle; - if (pAutomobile->bFixedColour) m_nFlags |= FLAG_PERMANENT_COLOUR; - if (pAutomobile->m_bombType) m_nFlags |= FLAG_BOMB; - if (pAutomobile->bNotDamagedUpsideDown) m_nFlags |= FLAG_NOT_DAMAGED_UPSIDEDOWN; - m_fTractionMultiplier = pAutomobile->m_fTraction; - } - else if (pVehicle->IsBike()) { - CBike* pBike = (CBike*)pVehicle; - if (pBike->bFixedColour) m_nFlags |= FLAG_PERMANENT_COLOUR; - m_fTractionMultiplier = pBike->m_fTraction; - } + m_bBulletproof = pVehicle->bBulletProof; + m_bFireproof = pVehicle->bFireProof; + m_bExplosionproof = pVehicle->bExplosionProof; + m_bCollisionproof = pVehicle->bCollisionProof; + m_bMeleeproof = pVehicle->bMeleeProof; + if (pVehicle->IsCar() || pVehicle->IsBike()) + m_nCarBombType = ((CAutomobile*)pVehicle)->m_bombType; // NB: cast to CAutomobile is original behaviour } CVehicle* CStoredCar::RestoreCar() { CStreaming::RequestModel(m_nModelIndex, STREAMFLAGS_DEPENDENCY); - uint8 owner = RANDOM_VEHICLE; - if (m_nFlags & FLAG_REWARD_VEHICLE) - owner = MISSION_VEHICLE; if (!CStreaming::HasModelLoaded(m_nModelIndex)) return nil; #ifdef FIX_BUGS @@ -2192,19 +1867,19 @@ CVehicle* CStoredCar::RestoreCar() } CVehicle* pVehicle; if (CModelInfo::IsBoatModel(m_nModelIndex)) - pVehicle = new CBoat(m_nModelIndex, owner); + pVehicle = new CBoat(m_nModelIndex, RANDOM_VEHICLE); else if (CModelInfo::IsBikeModel(m_nModelIndex)) { - CBike* pBike = new CBike(m_nModelIndex, owner); + CBike* pBike = new CBike(m_nModelIndex, RANDOM_VEHICLE); pBike->bIsStanding = true; pVehicle = pBike; } else - pVehicle = new CAutomobile(m_nModelIndex, owner); - pVehicle->SetPosition(m_fPosX, m_fPosY, m_fPosZ); + pVehicle = new CAutomobile(m_nModelIndex, RANDOM_VEHICLE); + pVehicle->SetPosition(m_vecPos); pVehicle->SetStatus(STATUS_ABANDONED); - pVehicle->GetForward() = CVector(m_fForwardX, m_fForwardY, m_fForwardZ); - pVehicle->GetRight() = CVector(m_fForwardY, -m_fForwardX, 0.0f); + pVehicle->GetForward() = m_vecAngle; + pVehicle->GetRight() = CVector(m_vecAngle.y, -m_vecAngle.x, 0.0f); pVehicle->GetUp() = CVector(0.0f, 0.0f, 1.0f); pVehicle->pDriver = nil; pVehicle->m_currentColour1 = m_nPrimaryColor; @@ -2221,36 +1896,11 @@ CVehicle* CStoredCar::RestoreCar() } pVehicle->bHasBeenOwnedByPlayer = true; pVehicle->m_nDoorLock = CARLOCK_UNLOCKED; - if (m_nFlags & FLAG_REWARD_VEHICLE) pVehicle->bRewardVehicle = true; - if (m_nFlags & FLAG_BULLETPROOF) pVehicle->bBulletProof = true; - if (m_nFlags & FLAG_FIREPROOF) pVehicle->bFireProof = true; - if (m_nFlags & FLAG_EXPLOSIONPROOF) pVehicle->bExplosionProof = true; - if (m_nFlags & FLAG_COLLISIONPROOF) pVehicle->bCollisionProof = true; - if (m_nFlags & FLAG_MELEEPROOF) pVehicle->bMeleeProof = true; - if (m_nFlags & FLAG_TIRES_INVULNERABLE) pVehicle->bTyresDontBurst = true; - if (m_nFlags & FLAG_STRONG) pVehicle->bTakeLessDamage = true; - if (m_nFlags & FLAG_HEAVY) { - pVehicle->bIsHeavy = true; - pVehicle->m_fMass = pVehicle->pHandling->GetMass(); - pVehicle->m_fTurnMass = pVehicle->pHandling->GetTurnMass(); - } - else { - pVehicle->bIsHeavy = false; - pVehicle->m_fMass = pVehicle->pHandling->GetMass() * 3.0f; - pVehicle->m_fTurnMass = pVehicle->pHandling->GetTurnMass() * 5.0f; - } - if (pVehicle->IsCar()) { - CAutomobile* pAutomobile = (CAutomobile*)pVehicle; - if (m_nFlags & FLAG_PERMANENT_COLOUR) pAutomobile->bFixedColour = true; - if (m_nFlags & FLAG_BOMB) pAutomobile->m_bombType = CARBOMB_TIMED; - if (m_nFlags & FLAG_NOT_DAMAGED_UPSIDEDOWN) pAutomobile->bNotDamagedUpsideDown = true; - m_fTractionMultiplier = pAutomobile->m_fTraction; - } - else if (pVehicle->IsBike()) { - CBike* pBike = (CBike*)pVehicle; - if (m_nFlags & FLAG_PERMANENT_COLOUR) pBike->bFixedColour = true; - m_fTractionMultiplier = pBike->m_fTraction; - } + pVehicle->bBulletProof = m_bBulletproof; + pVehicle->bFireProof = m_bFireproof; + pVehicle->bExplosionProof = m_bExplosionproof; + pVehicle->bCollisionProof = m_bCollisionproof; + pVehicle->bMeleeProof = m_bMeleeproof; return pVehicle; } @@ -2265,23 +1915,13 @@ void CGarage::StoreAndRemoveCarsForThisHideout(CStoredCar* aCars, int32 nMax) if (!pVehicle) continue; if (IsPointInsideGarage(pVehicle->GetPosition())) { -#if defined GTA_PS2 || defined GTA_MOBILE - if (pVehicle->GetStatus() == STATUS_WRECKED) { + if (pVehicle->VehicleCreatedBy != MISSION_VEHICLE) { + if (index < Max(NUM_GARAGE_STORED_CARS, nMax) && !EntityHasASphereWayOutsideGarage(pVehicle, 1.0f)) + aCars[index++].StoreCar(pVehicle); CWorld::Players[CWorld::PlayerInFocus].CancelPlayerEnteringCars(pVehicle); CWorld::Remove(pVehicle); delete pVehicle; } - else if (pVehicle->m_bombType == CARBOMB_NONE || pVehicle->bRewardVehicle) // <- probably condition looked different -#endif - { - if (pVehicle->VehicleCreatedBy != MISSION_VEHICLE || pVehicle->bRewardVehicle) { - if (index < Max(NUM_GARAGE_STORED_CARS, nMax) && !EntityHasASphereWayOutsideGarage(pVehicle, 1.0f)) - aCars[index++].StoreCar(pVehicle); - CWorld::Players[CWorld::PlayerInFocus].CancelPlayerEnteringCars(pVehicle); - CWorld::Remove(pVehicle); - delete pVehicle; - } - } } } // why? @@ -2432,7 +2072,7 @@ void CGarage::PlayerArrestedOrDied() case GARAGE_COLLECTCARS_2: case GARAGE_COLLECTCARS_3: case GARAGE_FORCARTOCOMEOUTOF: - case GARAGE_CRATE_GARAGE: + case GARAGE_60SECONDS: case GARAGE_MISSION_KEEPCAR: case GARAGE_FOR_SCRIPT_TO_OPEN: case GARAGE_HIDEOUT_ONE: @@ -2622,7 +2262,7 @@ void CGarages::SetAllDoorsBackToOriginalHeight() void CGarages::Save(uint8 * buf, uint32 * size) { //INITSAVEBUF - *size = 10692; // for some reason it's not actual size again + *size = 7876; // for some reason it's not actual size again //*size = (6 * sizeof(uint32) + TOTAL_COLLECTCARS_GARAGES * sizeof(*CarTypesCollected) + sizeof(uint32) + TOTAL_HIDEOUT_GARAGES * NUM_GARAGE_STORED_CARS * sizeof(CStoredCar) + NUM_GARAGES * sizeof(CGarage)); CloseHideOutGaragesBeforeSave(); WriteSaveBuf(buf, NumGarages); @@ -2644,10 +2284,29 @@ void CGarages::Save(uint8 * buf, uint32 * size) //VALIDATESAVEBUF(*size); } +const CStoredCar &CStoredCar::operator=(const CStoredCar & other) +{ + m_nModelIndex = other.m_nModelIndex; + m_vecPos = other.m_vecPos; + m_vecAngle = other.m_vecAngle; + m_bBulletproof = other.m_bBulletproof; + m_bFireproof = other.m_bFireproof; + m_bExplosionproof = other.m_bExplosionproof; + m_bCollisionproof = other.m_bCollisionproof; + m_bMeleeproof = other.m_bMeleeproof; + m_nPrimaryColor = other.m_nPrimaryColor; + m_nSecondaryColor = other.m_nSecondaryColor; + m_nRadioStation = other.m_nRadioStation; + m_nVariationA = other.m_nVariationA; + m_nVariationB = other.m_nVariationB; + m_nCarBombType = other.m_nCarBombType; + return *this; +} + void CGarages::Load(uint8* buf, uint32 size) { //INITSAVEBUF - assert(size == 10692); + assert(size = 7876); //assert(size == (6 * sizeof(uint32) + TOTAL_COLLECTCARS_GARAGES * sizeof(*CarTypesCollected) + sizeof(uint32) + TOTAL_HIDEOUT_GARAGES * NUM_GARAGE_STORED_CARS * sizeof(CStoredCar) + NUM_GARAGES * sizeof(CGarage))); CloseHideOutGaragesBeforeSave(); NumGarages = ReadSaveBuf(buf); @@ -2686,24 +2345,7 @@ void CGarages::Load(uint8* buf, uint32 size) bool CGarages::IsModelIndexADoor(uint32 id) { - return id == MI_GARAGEDOOR1 || - id == MI_GARAGEDOOR17 || - id == MI_GARAGEDOOR27 || - id == MI_GARAGEDOOR28 || - id == MI_GARAGEDOOR29 || - id == MI_GARAGEDOOR30 || - id == MI_GARAGEDOOR31 || - id == MI_GARAGEDOOR32 || - id == MI_GARAGEDOOR33 || - id == MI_GARAGEDOOR34 || - id == MI_GARAGEDOOR35 || - id == MI_GARAGEDOOR36 || - id == MI_GARAGEDOOR37 || - id == MI_GARAGEDOOR38 || - id == MI_GARAGEDOOR39 || - id == MI_CRUSHERBODY || - id == MI_CRUSHERLID || - id == MI_GARAGEDOOR2 || + return id == MI_GARAGEDOOR2 || id == MI_GARAGEDOOR3 || id == MI_GARAGEDOOR4 || id == MI_GARAGEDOOR5 || @@ -2725,8 +2367,7 @@ CGarages::IsModelIndexADoor(uint32 id) id == MI_GARAGEDOOR23 || id == MI_GARAGEDOOR24 || id == MI_GARAGEDOOR25 || - id == MI_GARAGEDOOR26 || - id == MI_DOOR2_SJL; + id == MI_GARAGEDOOR26; } void CGarages::StopCarFromBlowingUp(CAutomobile* pCar) @@ -2766,109 +2407,3 @@ bool CGarage::IsPlayerEntirelyInsideGarage() { return IsEntityEntirelyInside3D(FindPlayerVehicle() ? (CEntity*)FindPlayerVehicle() : (CEntity*)FindPlayerPed(), 0.0f); } - -int16 CGarages::AddCrateGarage(CVector pos, float angle) -{ - CMatrix matrix; - matrix.SetUnity(); - matrix.SetRotateZOnly(DEGTORAD(angle)); - CStreaming::RequestModel(MI_CRATE_SJL, STREAMFLAGS_DEPENDENCY); -#ifdef FIX_BUGS - CStreaming::LoadAllRequestedModels(false); -#endif - CObject* pCrate = new CObject(MI_CRATE_SJL, false); - pCrate->ObjectCreatedBy = MISSION_OBJECT; - pCrate->SetPosition(pos); - pCrate->SetOrientation(0.0f, 0.0f, DEGTORAD(angle)); - pCrate->GetMatrix().UpdateRW(); - pCrate->UpdateRwFrame(); - pCrate->bAffectedByGravity = false; - pCrate->m_phy_flagA08 = true; - pCrate->bExplosionProof = true; - pCrate->bIsStatic = false; - - CStreaming::RequestModel(MI_DOOR1_SJL, STREAMFLAGS_DEPENDENCY); -#ifdef FIX_BUGS - CStreaming::LoadAllRequestedModels(false); -#endif - CObject* pDoor1 = new CObject(MI_DOOR1_SJL, false); - pDoor1->ObjectCreatedBy = MISSION_OBJECT; - CVector vDoor1Pos = matrix * CVector(0.0f, 5.64f, 5.168f); - pDoor1->SetPosition(vDoor1Pos); - pDoor1->SetOrientation(0.0f, 0.0f, DEGTORAD(angle)); - pDoor1->GetMatrix().UpdateRW(); - pDoor1->UpdateRwFrame(); - pDoor1->bAffectedByGravity = false; - pDoor1->m_phy_flagA08 = true; - pDoor1->bExplosionProof = true; - pDoor1->bIsStatic = false; - - CStreaming::RequestModel(MI_DOOR2_SJL, STREAMFLAGS_DEPENDENCY); -#ifdef FIX_BUGS - CStreaming::LoadAllRequestedModels(false); -#endif - CObject* pDoor2 = new CObject(MI_DOOR2_SJL, false); - pDoor2->ObjectCreatedBy = MISSION_OBJECT; - CVector vDoor2Pos = matrix * CVector(0.0f, -5.64f, 5.168f); - pDoor2->SetPosition(vDoor2Pos); - pDoor2->SetOrientation(0.0f, 0.0f, DEGTORAD(angle)); - pDoor2->GetMatrix().UpdateRW(); - pDoor2->UpdateRwFrame(); - pDoor2->bAffectedByGravity = false; - pDoor2->m_phy_flagA08 = true; - pDoor2->bExplosionProof = true; - pDoor2->bIsStatic = false; - - CWorld::Add(pCrate); - CWorld::Add(pDoor1); - CWorld::Add(pDoor2); - - CVector corner = matrix * CVector(-3.0f, -3.5f, -0.5f) + pos; - CVector xplane = matrix * CVector(0.0f, 2.0f, 0.0f) + pos; - CVector yplane = matrix * CVector(0.0f, 0.0f, 0.0f) + pos; - - printf("Posttrans Corner[%f][%f][%f] XPlane[%f][%f][%f] YPlane[%f][%f][%f]", - corner.x, corner.y, corner.z, xplane.x, xplane.y, xplane.z, yplane.x, yplane.y, yplane.z); - int16 index = AddOne(corner.x, corner.y, corner.z, xplane.x, xplane.y, yplane.x, yplane.y, pos.z + 4.0f, GARAGE_CRATE_GARAGE, 0); - SetLeaveCameraForThisGarage(index); - CGarage* pGarage = &aGarages[index]; - pGarage->m_bSSGarageAcceptedVehicle = false; - pGarage->m_bSSGarageStateChanging = false; - pGarage->m_vecSSGaragePos = pos; - pGarage->m_fSSGarageAngle = angle; - return index; -} - -#ifdef GTA_NETWORK -void CGarages::RemoveAllCrateGarages() -{ - for (uint32 i = 0; i < NUM_GARAGES; i++) { - CGarage* pGarage = &aGarages[i]; - if (pGarage->m_eGarageType == GARAGE_CRATE_GARAGE) { - pGarage->m_eGarageType = GARAGE_NONE; - pGarage->m_bSSGarageStateChanging = false; - pGarage->m_bSSGarageAcceptedVehicle = false; - pGarage->m_pSSVehicle = nil; - --NumGarages; - } - } -} - -bool CGarages::HasSSGarageAcceptedVehicle(int16 garage) -{ - return aGarages[garage].m_bSSGarageAcceptedVehicle; -} - -void CGarages::SetVehicleForSSGarage(bool state, int16 garage, void* pVehicle) -{ - CGarage* pGarage = &aGarages[garage]; - pGarage->m_pSSVehicle = pVehicle; - pGarage->m_nSSGarageState = state; - pGarage->m_bSSGarageAcceptedVehicle = false; - if (!pVehicle) { - if (pGarage->m_pSSTargetCar) - pGarage->m_pSSTargetCar->CleanUpOldReference((CEntity**)pGarage->m_pSSTargetCar); - pGarage->m_pSSTargetCar = nil; - } -} -#endif diff --git a/src/control/Garages.h b/src/control/Garages.h index 2ab7460..07d5f71 100644 --- a/src/control/Garages.h +++ b/src/control/Garages.h @@ -15,7 +15,6 @@ enum eGarageState GS_OPENEDCONTAINSCAR, GS_CLOSEDCONTAINSCAR, GS_AFTERDROPOFF, - GS_WAITINGFORCAR }; enum eGarageType @@ -32,7 +31,7 @@ enum eGarageType GARAGE_COLLECTCARS_2, GARAGE_COLLECTCARS_3, GARAGE_FORCARTOCOMEOUTOF, - GARAGE_CRATE_GARAGE, + GARAGE_60SECONDS, GARAGE_CRUSHER, GARAGE_MISSION_KEEPCAR, GARAGE_FOR_SCRIPT_TO_OPEN, @@ -59,34 +58,19 @@ enum { TOTAL_COLLECTCARS_GARAGES = 4, TOTAL_HIDEOUT_GARAGES = 12, - TOTAL_COLLECTCARS_CARS = 16 + TOTAL_COLLECTCARS_CARS = 6 }; class CStoredCar { - enum { - FLAG_BULLETPROOF = 0x1, - FLAG_FIREPROOF = 0x2, - FLAG_EXPLOSIONPROOF = 0x4, - FLAG_COLLISIONPROOF = 0x8, - FLAG_MELEEPROOF = 0x10, - FLAG_TIRES_INVULNERABLE = 0x20, - FLAG_STRONG = 0x40, - FLAG_HEAVY = 0x80, - FLAG_PERMANENT_COLOUR = 0x100, - FLAG_BOMB = 0x200, - FLAG_NOT_DAMAGED_UPSIDEDOWN = 0x400, - FLAG_REWARD_VEHICLE = 0x8000 - }; int32 m_nModelIndex; - float m_fPosX; - float m_fPosY; - float m_fPosZ; - float m_fForwardX; - float m_fForwardY; - float m_fForwardZ; - float m_fTractionMultiplier; - int32 m_nFlags; + CVector m_vecPos; + CVector m_vecAngle; + int32 m_bBulletproof : 1; + int32 m_bFireproof : 1; + int32 m_bExplosionproof : 1; + int32 m_bCollisionproof : 1; + int32 m_bMeleeproof : 1; int8 m_nPrimaryColor; int8 m_nSecondaryColor; int8 m_nRadioStation; @@ -97,6 +81,7 @@ public: void Init() { m_nModelIndex = 0; } void Clear() { m_nModelIndex = 0; } bool HasCar() { return m_nModelIndex != 0; } + const CStoredCar &operator=(const CStoredCar& other); void StoreCar(CVehicle*); CVehicle* RestoreCar(); }; @@ -130,16 +115,12 @@ public: CVector2D m_vDir1; CVector2D m_vDir2; float m_fSupZ; - CVector m_vecSSGaragePos; - float m_fSSGarageAngle; float m_fDir1Len; float m_fDir2Len; float m_fInfX; float m_fSupX; float m_fInfY; float m_fSupY; - uint32 m_nTimeCrusherCraneActivated; - CVehicle* m_pSSTargetCar; float m_fDoorPos; float m_fDoorHeight; float m_fDoor1X; @@ -152,14 +133,6 @@ public: uint8 m_bCollectedCarsState; CVehicle *m_pTarget; CStoredCar m_sStoredCar; // not needed - bool m_bInitialized; -#ifdef GTA_NETWORK - void* m_pSSVehicle; // some multiplayer vehicle structure, +104 == GetVehiclePointer -#endif - bool m_bSSGarageAcceptedVehicle; - bool m_bLocked; - bool m_nSSGarageState; - bool m_bSSGarageStateChanging; void OpenThisGarage(); void CloseThisGarage(); @@ -246,7 +219,6 @@ public: static CGarage aGarages[NUM_GARAGES]; static CStoredCar aCarsInSafeHouses[TOTAL_HIDEOUT_GARAGES][NUM_GARAGE_STORED_CARS]; static bool bCamShouldBeOutisde; - static uint8 CrusherRewardMultiplier; static void Init(void); #ifndef PS2 @@ -294,13 +266,13 @@ public: static void CloseHideOutGaragesBeforeSave(void); static int32 CountCarsInHideoutGarage(uint8); static int32 GetBombTypeForGarageType(uint8 type) { return type - GARAGE_BOMBSHOP1 + 1; } - static int32 GetCarsCollectedIndexForGarageType(uint8 type, uint32& total) + static int32 GetCarsCollectedIndexForGarageType(uint8 type) { switch (type) { - case GARAGE_COLLECTCARS_1: total = TOTAL_COLLECTCARS_CARS; return 0; - case GARAGE_COLLECTCARS_2: total = 0; return 1; - case GARAGE_COLLECTCARS_3: total = 0; return 2; - case GARAGE_COLLECTCARS_4: total = 0; return 3; + case GARAGE_COLLECTCARS_1: return 0; + case GARAGE_COLLECTCARS_2: return 1; + case GARAGE_COLLECTCARS_3: return 2; + case GARAGE_COLLECTCARS_4: return 3; default: assert(0); } return 0; @@ -325,15 +297,4 @@ public: } static bool IsThisGarageTypeSafehouse(uint8 type) { return FindSafeHouseIndexForGarageType(type) >= 0; } - static bool InitDoorGubbins(uint32, uint8); - static void SetupAnyGaragesForThisIsland(void); - static void LockGarage(int16, bool); - static int16 AddCrateGarage(CVector, float); - -#ifdef GTA_NETWORK - static void RemoveAllCrateGarages(); - static bool HasSSGarageAcceptedVehicle(int16 garage); - static void SetVehicleForSSGarage(bool state, int16 garage, void* pVehicle); // void* -> ? -#endif - }; diff --git a/src/control/PathFind.cpp b/src/control/PathFind.cpp index 3d18eb0..bf72199 100644 --- a/src/control/PathFind.cpp +++ b/src/control/PathFind.cpp @@ -1763,18 +1763,18 @@ CPathFind::TestCoorsCloseness(CVector target, uint8 type, CVector start) float dist; if(type == PATH_CAR) - DoPathSearch(type, start, -1, target, pNodeList, &DummyResult, 32, nil, &dist, 170.0f, -1); + DoPathSearch(type, start, -1, target, pNodeList, &DummyResult, 32, nil, &dist, 999999.88f, -1); else DoPathSearch(type, start, -1, target, nil, &DummyResult2, 0, nil, &dist, 50.0f, -1); #ifdef FIX_BUGS // dist has GenerationDistMultiplier as a factor, so our reference dist should have it too if(type == PATH_CAR) - return dist < 180.0f*TheCamera.GenerationDistMultiplier; + return dist < 150.0f*TheCamera.GenerationDistMultiplier; else return dist < 100.0f*TheCamera.GenerationDistMultiplier; #else if(type == PATH_CAR) - return dist < 180.0f; + return dist < 150.0f; else return dist < 100.0f; #endif diff --git a/src/control/Pickups.cpp b/src/control/Pickups.cpp index 0b4a8b6..7bc8832 100644 --- a/src/control/Pickups.cpp +++ b/src/control/Pickups.cpp @@ -1671,20 +1671,4 @@ CPed::CreateDeadPedPickupCoors(float *x, float *y, float *z) *y = GetPosition().y; *z = GetPosition().z + 0.4f; #undef NUMBER_OF_ATTEMPTS -} - -float CPickups::GetValue(int index) -{ - int i = GetActualPickupIndex(index); - if (i == -1) - return 0.0f; - return aPickUps[i].m_fRevenue; -} - -void CPickups::SetValue(int index, float value) -{ - int i = GetActualPickupIndex(index); - if (i == -1) - return; - aPickUps[i].m_fRevenue = value; -} +} \ No newline at end of file diff --git a/src/control/Pickups.h b/src/control/Pickups.h index fd8b15c..0de7f82 100644 --- a/src/control/Pickups.h +++ b/src/control/Pickups.h @@ -117,9 +117,6 @@ public: static void RemoveAllPickupsOfACertainWeaponGroupWithNoAmmo(eWeaponType); static CPickup *FindPickUpForThisObject(CEntity*); - - static float GetValue(int); - static void SetValue(int, float); }; extern uint16 AmmoForWeapon[WEAPONTYPE_TOTALWEAPONS + 1]; diff --git a/src/control/Remote.cpp b/src/control/Remote.cpp index dc02554..047b19f 100644 --- a/src/control/Remote.cpp +++ b/src/control/Remote.cpp @@ -9,7 +9,7 @@ #include "PlayerInfo.h" #include "Vehicle.h" -CVehicle* +void CRemote::GivePlayerRemoteControlledCar(float x, float y, float z, float rot, uint16 model) { CAutomobile *car = new CAutomobile(model, MISSION_VEHICLE); @@ -40,7 +40,6 @@ CRemote::GivePlayerRemoteControlledCar(float x, float y, float z, float rot, uin TheCamera.SetZoomValueCamStringScript(0); } else TheCamera.TakeControl(car, CCam::MODE_BEHINDCAR, INTERPOLATION, CAMCONTROL_SCRIPT); - return car; } void diff --git a/src/control/Remote.h b/src/control/Remote.h index 4c40dd9..72cabb7 100644 --- a/src/control/Remote.h +++ b/src/control/Remote.h @@ -3,6 +3,6 @@ class CRemote { public: - static CVehicle* GivePlayerRemoteControlledCar(float, float, float, float, uint16); + static void GivePlayerRemoteControlledCar(float, float, float, float, uint16); static void TakeRemoteControlledCarFromPlayer(bool blowUp = true); }; diff --git a/src/control/Replay.cpp b/src/control/Replay.cpp index 6134578..cd612d5 100644 --- a/src/control/Replay.cpp +++ b/src/control/Replay.cpp @@ -1285,7 +1285,7 @@ void CReplay::TriggerPlayback(uint8 cam_mode, float cam_x, float cam_y, float ca DMAudio.SetEffectsFadeVol(0); DMAudio.SetMusicFadeVol(0); CEscalators::Shutdown(); - //CWaterCreatures::RemoveAll(); + CWaterCreatures::RemoveAll(); int current; for (current = 0; current < NUM_REPLAYBUFFERS; current++) if (BufferStatus[current] == REPLAYBUFFER_RECORD) diff --git a/src/control/Replay.h b/src/control/Replay.h index 98e0257..5dd8b65 100644 --- a/src/control/Replay.h +++ b/src/control/Replay.h @@ -46,7 +46,7 @@ enum { struct CStoredDetailedAnimationState { - uint16 aAnimId[NUM_MAIN_ANIMS_IN_REPLAY]; + uint8 aAnimId[NUM_MAIN_ANIMS_IN_REPLAY]; uint8 aCurTime[NUM_MAIN_ANIMS_IN_REPLAY]; uint8 aSpeed[NUM_MAIN_ANIMS_IN_REPLAY]; uint8 aBlendAmount[NUM_MAIN_ANIMS_IN_REPLAY]; @@ -54,7 +54,7 @@ struct CStoredDetailedAnimationState uint8 aFunctionCallbackID[NUM_MAIN_ANIMS_IN_REPLAY]; uint16 aFlags[NUM_MAIN_ANIMS_IN_REPLAY]; uint8 aGroupId[NUM_MAIN_ANIMS_IN_REPLAY]; - uint16 aAnimId2[NUM_PARTIAL_ANIMS_IN_REPLAY]; + uint8 aAnimId2[NUM_PARTIAL_ANIMS_IN_REPLAY]; uint8 aCurTime2[NUM_PARTIAL_ANIMS_IN_REPLAY]; uint8 aSpeed2[NUM_PARTIAL_ANIMS_IN_REPLAY]; uint8 aBlendAmount2[NUM_PARTIAL_ANIMS_IN_REPLAY]; diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 1bf9415..cb20891 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -11,7 +11,6 @@ #include "CivilianPed.h" #include "Clock.h" #include "CopPed.h" -#include "Coronas.h" #include "Debug.h" #include "DMAudio.h" #include "EmergencyPed.h" @@ -50,19 +49,16 @@ #include "Timecycle.h" #include "TxdStore.h" #include "Bike.h" -#include "smallHeap.h" #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT #include #endif -//--LCS: file done except TODOs and command table -uint8* CTheScripts::ScriptSpace; +uint8 CTheScripts::ScriptSpace[SIZE_SCRIPT_SPACE]; CRunningScript CTheScripts::ScriptsArray[MAX_NUM_SCRIPTS]; intro_text_line CTheScripts::IntroTextLines[MAX_NUM_INTRO_TEXT_LINES]; intro_script_rectangle CTheScripts::IntroRectangles[MAX_NUM_INTRO_RECTANGLES]; CSprite2d CTheScripts::ScriptSprites[MAX_NUM_SCRIPT_SRPITES]; script_sphere_struct CTheScripts::ScriptSphereArray[MAX_NUM_SCRIPT_SPHERES]; -tCollectiveData CTheScripts::CollectiveArray[MAX_NUM_COLLECTIVES]; tUsedObject CTheScripts::UsedObjectArray[MAX_NUM_USED_OBJECTS]; int32 CTheScripts::MultiScriptArray[MAX_NUM_MISSION_SCRIPTS]; tBuildingSwap CTheScripts::BuildingSwapArray[MAX_NUM_BUILDING_SWAPS]; @@ -98,19 +94,10 @@ uint32 CTheScripts::LastMissionPassedTime; uint16 CTheScripts::NumberOfExclusiveMissionScripts; bool CTheScripts::bPlayerHasMetDebbieHarry; bool CTheScripts::bPlayerIsInTheStatium; -int CTheScripts::AllowedCollision[MAX_ALLOWED_COLLISIONS]; -int CTheScripts::FSDestroyedFlag; -short* CTheScripts::SavedVarIndices; -int CTheScripts::NumSaveVars; -int gScriptsFile = -1; -int CTheScripts::NextProcessId = 1; -bool CTheScripts::InTheScripts; -CRunningScript* pCurrent; -uint16 CTheScripts::NumTrueGlobals; -uint16 CTheScripts::MostGlobals; -CVector gVectorSetInLua; -int CTheScripts::NextScriptCoronaID; -base::cSList CTheScripts::mCoronas; +#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) +int16 CTheScripts::CardStack[CARDS_IN_DECK * MAX_DECKS]; +int16 CTheScripts::CardStackPosition; +#endif #ifdef MISSION_REPLAY @@ -367,11 +354,6 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_WHILE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_WHILENOT, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_ENDWHILE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_214, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_215, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_216, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_217, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_218, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_ANDOR, INPUT_ARGUMENTS(ARGTYPE_ANDOR,), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_LAUNCH_MISSION, INPUT_ARGUMENTS(ARGTYPE_LABEL,), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_MISSION_HAS_FINISHED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), @@ -426,7 +408,7 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_ADD_SCORE, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_IS_SCORE_GREATER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), REGISTER_COMMAND(COMMAND_STORE_SCORE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_GIVE_REMOTE_CONTROLLED_CAR_TO_PLAYER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), + REGISTER_COMMAND(COMMAND_GIVE_REMOTE_CONTROLLED_CAR_TO_PLAYER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_ALTER_WANTED_LEVEL, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_ALTER_WANTED_LEVEL_NO_DROP, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_IS_WANTED_LEVEL_GREATER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), @@ -1234,7 +1216,7 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_IS_CAR_PASSENGER_SEAT_FREE, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), REGISTER_COMMAND(COMMAND_GET_CHAR_IN_CAR_PASSENGER_SEAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), REGISTER_COMMAND(COMMAND_SET_CHAR_IS_CHRIS_CRIMINAL, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_START_CREDITS, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_START_CREDITS, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_STOP_CREDITS, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_ARE_CREDITS_FINISHED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), REGISTER_COMMAND(COMMAND_CREATE_SINGLE_PARTICLE, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), @@ -1322,7 +1304,7 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_SHUT_CHAR_UP, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_SET_ENABLE_RC_DETONATE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_SET_CAR_RANDOM_ROUTE_SEED, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_ANY_PICKUP_AT_COORDS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), true, -1, ""), + REGISTER_COMMAND(COMMAND_IS_ANY_PICKUP_AT_COORDS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), true, -1, ""), REGISTER_COMMAND(COMMAND_GET_FIRST_PICKUP_COORDS, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), false, -1, ""), REGISTER_COMMAND(COMMAND_GET_NEXT_PICKUP_COORDS, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), false, -1, ""), REGISTER_COMMAND(COMMAND_REMOVE_ALL_CHAR_WEAPONS, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), @@ -1594,222 +1576,39 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_REGISTER_FIRE_LEVEL, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_IS_AUSTRALIAN_GAME, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), REGISTER_COMMAND(COMMAND_DISARM_CAR_BOMB, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), +#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT) REGISTER_COMMAND(COMMAND_IS_JAPANESE_GAME, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_1442, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1443, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_DISTANCE_BETWEEN_2D_POINTS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_DISTANCE_BETWEEN_3D_POINTS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_DOT_PRODUCT_2D, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_DOT_PRODUCT_3D, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_DEBUG_PRINT_WITH_1_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_DEBUG_PRINT_WITH_2_FLOATS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_DEBUG_PRINT_WITH_3_FLOATS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_PAD_BUTTON_STATE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_NAVIGATION_ARROW, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CLEAR_NAVIGATION_ARROW, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CALL, INPUT_ARGUMENTS(ARGTYPE_FUNCTION, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CALLNOT, INPUT_ARGUMENTS(ARGTYPE_FUNCTION, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_CAR_AUTOMOBILE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_IS_CAR_BIKE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_IS_CAR_PLANE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_IS_CAR_HELI, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_1460, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1461, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1462, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1463, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1464, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1465, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1466, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1467, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1468, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1469, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1470, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1471, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1472, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1473, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1474, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1475, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1476, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_RETURN_IF_TRUE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_RETURN_TRUE_IF_TRUE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CHAR_ONLY_ALLOWED_TO_SIT_BEHIND, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_RC_HELI_HEIGHT_LIMIT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CREATE_SCRIPT_CORONA, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REMOVE_SCRIPT_CORONA, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_BOAT_IN_WATER, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_IS_CAR_DRIVER_BEING_JACKED, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CHAR_ONLY_ALLOWED_TO_SIT_IN_FRONT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CAR_TILTED_BY_CHAR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_WEAPON_TYPE_FOR_PICKUP_IN_AREA, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_PLAYER_USING_FIRST_PERSON_WEAPON_CAMERA, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_1489, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1490, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1491, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_DEBUG_MENU_ACTIVE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_DRAW_HUD, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_RANDOM_CHAR_IN_AREA_NO_CHECKS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_RANDOM_CAR_IN_AREA_NO_CHECKS_NO_SAVE, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_STORE_CAR_COLLIDED_WITH_NO_SAVE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_DISABLE_FERRY_PATH, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ENABLE_FERRY_PATH, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_CLOSEST_DOCKED_FERRY, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_OPEN_FERRY_DOOR, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CLOSE_FERRY_DOOR, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_FERRY_DOOR_OPEN, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_IS_FERRY_DOOR_CLOSED, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_SKIP_FERRY_TO_NEXT_DOCK, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CHAR_DROPS_WEAPONS_ON_DEATH, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_CHAR_CROUCHING, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_GET_FERRY_BOARDING_SPACE, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_FERRY_HEADING, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_FERRIES_ENABLED, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_COMPLETE_FERRY_DOOR_MOVEMENT, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_OVERRIDE_CAR_REMOTE_CONTROL, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CANCEL_REMOTE_MODE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_CAR_SOLD, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_MONEY_MADE_WITH_CAR_SALES, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_BRIDGE_STATE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_OBJECT_TURN_SPEED, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_OBJECT_MASS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_HAS_CUTSCENE_LOADED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_SET_UNIQUE_JUMPS_FOUND, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_HIDDEN_PACKAGES_COLLECTED, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_BIKE_SOLD, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_MONEY_MADE_WITH_BIKE_SALES, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_PACKAGE_SMUGGLED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_SMUGGLER_WASTED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_FASTEST_SMUGGLING_TIME, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CHAR_DIVE_FROM_CAR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_WRECK_CAR, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_MONEY_MADE_IN_COACH, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_MONEY_MADE_COLLECTING_TRASH, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_HITMAN_KILLED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_GUARDIAN_ANGEL_MISSION_PASSED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_HIGHEST_GUARDIAN_ANGEL_JUSTICE_DISHED, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_BEST_BANDIT_LAP_TIME, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_BEST_BANDIT_POSITION, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_MOST_TIME_LEFT_TRAIN_RACE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_HIGHEST_TRAIN_CASH_EARNED, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_FASTEST_HELI_RACE_TIME, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_BEST_HELI_RACE_POSITION, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_OUTFIT_CHANGE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_STREET_RACE_FASTEST_TIME, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_STREET_RACE_FASTEST_LAP, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_STREET_RACE_BEST_POSITION, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_HAS_OBJECT_BEEN_DAMAGED_BY_WEAPON, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_CLEAR_OBJECT_LAST_WEAPON_DAMAGE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CAR_TURN_SPEED, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CAR_MOVE_SPEED, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_OBJECT_PROOFS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_CAMERA_PED_ZOOM_INDICATOR, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CAMERA_PED_ZOOM_INDICATOR, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_CAR_ORIENTATION, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CAR_ORIENTATION, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_DEBUG_MENU_ON, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_OPEN_VAN_BACK_DOORS, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_CHAR_THREAT_CHAR, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_FREEZE_PED_ZOOM_SWITCH, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_OBJECT_RENDERED_DAMAGED, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_RANDOM_CAR_IN_AREA_NO_SAVE, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_PLAYER_MADE_SAFE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_IF_FREE, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_E3_BUILD, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_DECLARE_FORT_STAUNTON_DESTROYED_FLAG, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CLEAR_BIG_MESSAGES, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CLEAR_AREA_OF_OBJECTS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_LOAD_NON_STANDARD_PED_ANIM, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_UNLOAD_NON_STANDARD_PED_ANIM, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1566, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_BUILD_WORLD_GEOMETRY, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_STORE_BUILDING_SWAP, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_MULTIPLAYER_ACTIVE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_GET_MULTIPLAYER_MODE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_MULTIPLAYER_SCRIPT_DONE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_IS_MULTIPLAYER_SERVER, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_IS_MULTIPLAYER_TEAM_GAME, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_GET_MULTIPLAYER_TEAM_ID, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_DOES_SHORTCUT_TAXI_EXIST, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_SET_ONSCREEN_TIMER_COLOUR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_ONSCREEN_TIMER_BACKGROUND_COLOUR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REMOVE_CAR_BOOT, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_POINT_3D_MARKER, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_VECTOR_FROM_MULTIPLAYER, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_HELP_ALWAYS, INPUT_ARGUMENTS(ARGTYPE_STRING, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_HELP_FOREVER_ALWAYS, INPUT_ARGUMENTS(ARGTYPE_STRING, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SWITCH_FERRY_COLLISION, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CHAR_MAX_HEALTH, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CHAR_SHOOT_TIMER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CHAR_ATTACK_TIMER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_HELI_ROTOR_BLADES_FULLSPEED, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CRUSHER_REWARD_MULTIPLIER, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SWAP_BUILDINGS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_STREAM_BUILDING_SWAPS, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_IS_WORLD_STREAMING_COMPLETE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_SWAP_TO_STREAMED_SECTOR, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CHAR_ATTACKS_PLAYER_WITH_COPS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_FACE_PLANT_DISTANCE, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_MAX_SECONDS_ON_CARNAGE_LEFT, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_MAX_KILLS_ON_RC_TRIAD, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_HIGHEST_LEVEL_SLASH_TV, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_MONEY_MADE_WITH_SLASH_TV, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_TOTAL_KILLS_ON_SLASH_TV, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_NOODLES_DELIVERED, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_SCRAPYARD_CHALLENGE_SCORE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_9MM_MAYHEM_SCORE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_SCOOTER_SHOOTER_SCORE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_MONEY_MADE_FROM_TOURIST, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_TOURISTS_TAKEN_TO_SPOTS, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_EXPORTED_CARS, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_TOTAL_EXPORT_CARS, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_DIRT_BIKE_FASTEST_LAP, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_DIRT_BIKE_FASTEST_TIME, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_DIRT_BIKE_AIR_TIME, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_ARROW_3D_MARKER, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_NOW_OVERRIDE_FADE, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_PICKUP_VALUE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_PICKUP_VALUE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_DEVELOPER, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_SET_DEVELOPER_FLAG, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_WICHITA_WIPEOUT_SCORE, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ATTACH_OBJECT_TO_CAR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_DETACH_OBJECT_FROM_CAR, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_PAD_STICKS_MULTIPLIER, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_SUBTITLE_NOW, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_SUBTITLE_NOW_OVERRIDE_FADE, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_SUBTITLE_NOW_NO_BRIEF, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_WITH_NUMBER_NOW_NO_BRIEF, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_ANGLE_BETWEEN_POINTS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_OVERRIDE_CHAR_MOVE_ANIM, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_1627, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ENABLE_EMERGENCY_VEHICLES, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_UNLOCKED_COSTUME, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CLEAR_MULTIPLAYER_SPLASH_SCREEN, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_WITH_2_NUMBERS_NOW_NO_BRIEF, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_OBJECT_ORIENTATION, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_OBJECT_ORIENTATION, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CHANGE_ONSCREEN_COUNTER_PREFIX, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_STORE_PLAYER_OUTFIT, INPUT_ARGUMENTS(ARGTYPE_STRING, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_NUMBER_AND_STRING, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_STRING, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_PLAYER_CURRENT_WEAPON_AMMO_IN_CLIP, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CHAR_WAIT_STATE_REPEAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_BEST_TIME_GOGO_FAGGIO, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_LOCK_GARAGE, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_FINAL_GAME, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_SET_ALLOWED_COLLISION, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_REGISTER_GUARDIAN_ANGEL_LEVEL, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_NUMBER_AND_2_STRINGS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_STRING, ARGTYPE_STRING, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_PLAYER_STORED_WEAPON, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_DISABLE_PAUSE_MENU, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_CHANNEL_PLAYING, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CLOCK_EVENT_WARNING, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_EXTRA_COLOUR_LIGHT_DIRECTION, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CHAR_CAN_BE_TARGETTED_BY_LEADER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_HELP_NO_BRIEF, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_HELP_FOREVER_NO_BRIEF, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_HELP_ALWAYS_NO_BRIEF, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PRINT_HELP_FOREVER_ALWAYS_NO_BRIEF, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_CAR_IS_REWARD, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_FREEZE_ALL_PLAYER_FOLLOWERS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), +#elif (!defined GTA_PS2) + REGISTER_COMMAND(COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), +#endif +#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) + REGISTER_COMMAND(COMMAND_SHUFFLE_CARD_DECKS, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_FETCH_NEXT_CARD, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), + REGISTER_COMMAND(COMMAND_GET_OBJECT_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), false, -1, ""), + REGISTER_COMMAND(COMMAND_IS_DEBUG_CAMERA_ON, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), + REGISTER_COMMAND(COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_SET_OBJECT_ROTATION_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_IS_OBJECT_STATIC, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), + REGISTER_COMMAND(COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ), false, -1, ""), + REGISTER_COMMAND(COMMAND_DO_2D_RECTANGLES_COLLIDE, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), true, -1, ""), + REGISTER_COMMAND(COMMAND_GET_OBJECT_ROTATION_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), false, -1, ""), + REGISTER_COMMAND(COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_GET_OBJECT_SPEED, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ), false, -1, ""), +#endif +#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT) + REGISTER_COMMAND(COMMAND_MARK_CUTSCENE_START, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_MARK_CUTSCENE_END, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_CUTSCENE_SCROLL, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), +#elif (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) + REGISTER_COMMAND(COMMAND_IS_MISSION_SKIP, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), + REGISTER_COMMAND(COMMAND_SET_IN_AMMUNATION, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_DO_SAVE_GAME, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_IS_RETRY, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), + REGISTER_COMMAND(COMMAND_DUMMY, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_MARK_CUTSCENE_START, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_MARK_CUTSCENE_END, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_CUTSCENE_SCROLL, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), +#endif }; #undef REGISTER_COMMAND #undef INPUT_ARGUMENTS @@ -1882,23 +1681,6 @@ cleanup_entity_struct* CMissionCleanup::FindFree() return nil; } -void SleepThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) -{ - printf("*** SLEEPING PED %i %i\n", pCleanup->id, pPed->GetModelIndex()); - if (!pPed->GetIsStatic()) - pPed->RemoveFromMovingList(); - pPed->bIsStaticWaitingForCollision = true; -} - -void WakeThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) -{ - printf("*** WAKING UP PED %i %i\n", pCleanup->id, pPed->GetModelIndex()); - pPed->bIsStaticWaitingForCollision = false; - if (!pPed->bIsStatic) - pPed->AddToMovingList(); - -} - void CMissionCleanup::AddEntityToList(int32 id, uint8 type) { cleanup_entity_struct* pNew = FindFree(); @@ -1968,100 +1750,46 @@ void CMissionCleanup::CheckIfCollisionHasLoadedForMissionObjects() { CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id); if (pVehicle) { - eLevelName level = CTheZones::GetLevelFromPosition(&pVehicle->GetPosition()); - if (level == LEVEL_GENERIC) - level = CGame::currLevel; - if (!CColStore::HasCollisionLoaded(level)) { - if (!pVehicle->bIsStaticWaitingForCollision) { - if (!pVehicle->IsHeli() && !pVehicle->IsPlane() && pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI && - pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT && pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE) { - printf("*** SLEEPING VEHICLE %i %i\n", m_sEntities[i].id, pVehicle->GetModelIndex()); - if (!pVehicle->GetIsStatic()) - pVehicle->RemoveFromMovingList(); - pVehicle->bIsStaticWaitingForCollision = true; - } - } - } - else { - if (pVehicle->bIsStaticWaitingForCollision) { - printf("*** WAKING UP VEHICLE %i %i\n", m_sEntities[i].id, pVehicle->GetModelIndex()); + if (pVehicle->bIsStaticWaitingForCollision) { + if (CColStore::HasCollisionLoaded(pVehicle->GetPosition())) { pVehicle->bIsStaticWaitingForCollision = false; - if (!pVehicle->bIsStatic) - pVehicle->AddToMovingList(); + if (!pVehicle->GetIsStatic()) + pVehicle->AddToMovingList(); } } } + break; } - break; - case CLEANUP_OBJECT: - CObject* pObject = CPools::GetObjectPool()->GetAt(m_sEntities[i].id); - if (pObject) { - eLevelName level = CTheZones::GetLevelFromPosition(&pObject->GetPosition()); - if (level == LEVEL_GENERIC) - level = CGame::currLevel; - if (!CColStore::HasCollisionLoaded(level)) { - if (!pObject->bIsStaticWaitingForCollision) { - if (!pObject->GetIsStatic()) - pObject->RemoveFromMovingList(); - pObject->bIsStaticWaitingForCollision = true; - } - } - else { - if (pObject->bIsStaticWaitingForCollision) { - pObject->bIsStaticWaitingForCollision = false; - if (!pObject->bIsStatic) - pObject->AddToMovingList(); - } - } - } - } - } - for (int i = 0; i < MAX_CLEANUP; i++) { - switch (m_sEntities[i].type) { case CLEANUP_CHAR: { CPed* pPed = CPools::GetPedPool()->GetAt(m_sEntities[i].id); if (pPed) { - eLevelName level = CTheZones::GetLevelFromPosition(&pPed->GetPosition()); - if (level == LEVEL_GENERIC) - level = CGame::currLevel; - if (!pPed->bIsStaticWaitingForCollision) { - if (pPed->bInVehicle) { - if (pPed->m_pMyVehicle->GetIsStatic()) { - SleepThisPed(&m_sEntities[i], pPed); - continue; - } - } - if (!CColStore::HasCollisionLoaded(level)) { - if (pPed->bInVehicle && pPed->m_pMyVehicle->GetIsStatic() || - pPed->m_attachedTo && pPed->m_attachedTo->GetIsStatic()) - SleepThisPed(&m_sEntities[i], pPed); + if (pPed->bIsStaticWaitingForCollision) { + if (CColStore::HasCollisionLoaded(pPed->GetPosition())) { + pPed->bIsStaticWaitingForCollision = false; + if (!pPed->GetIsStatic()) + pPed->AddToMovingList(); } } - else { - if (!pPed->bInVehicle) { - if (CColStore::HasCollisionLoaded(level)) { - if (!(pPed->bInVehicle && pPed->m_pMyVehicle->GetIsStatic() || - pPed->m_attachedTo && pPed->m_attachedTo->GetIsStatic())) - WakeThisPed(&m_sEntities[i], pPed); - } - } - else { - if (!pPed->m_pMyVehicle->GetIsStatic()) { - WakeThisPed(&m_sEntities[i], pPed); - continue; - } - if (CColStore::HasCollisionLoaded(level)) { - if (!(pPed->bInVehicle && pPed->m_pMyVehicle->GetIsStatic() || - pPed->m_attachedTo && pPed->m_attachedTo->GetIsStatic())) - WakeThisPed(&m_sEntities[i], pPed); - } - } - } - } + break; } - break; + case CLEANUP_OBJECT: + { + CObject* pObject = CPools::GetObjectPool()->GetAt(m_sEntities[i].id); + if (pObject) { + if (pObject->bIsStaticWaitingForCollision) { + if (CColStore::HasCollisionLoaded(pObject->GetPosition())) { + pObject->bIsStaticWaitingForCollision = false; + if (!pObject->GetIsStatic()) + pObject->AddToMovingList(); + } + } + } + break; + } + default: + break; } } } @@ -2073,8 +1801,6 @@ void CMissionCleanup::Process() CCarCtrl::CarDensityMultiplier = 1.0f; CPed::nThreatReactionRangeMultiplier = 1; CPed::nEnterCarRangeMultiplier = 1; - for (int i = 0; i < MAX_ALLOWED_COLLISIONS; i++) - CTheScripts::AllowedCollision[i] = 0; FindPlayerPed()->m_pWanted->m_fCrimeSensitivity = 1.0f; CRoadBlocks::ClearScriptRoadBlocks(); CRouteNode::Initialise(); @@ -2082,19 +1808,20 @@ void CMissionCleanup::Process() TheCamera.Restore(); TheCamera.SetWideScreenOff(); CSpecialFX::bLiftCam = false; - // TODO(LCS): CHud::m_ClockEventWarningMinutes = 0; - // TODO(LCS): CHud::m_ClockEventFlashTimer = 0; - CTimeCycle::StopExtraColour(0); // TODO: thiscall + CSpecialFX::bVideoCam = false; + CTimeCycle::StopExtraColour(0); for (int i = 0; i < MISSION_AUDIO_SLOTS; i++) DMAudio.ClearMissionAudio(i); CWeather::ReleaseWeather(); for (int i = 0; i < NUM_OF_SPECIAL_CHARS; i++) CStreaming::SetMissionDoesntRequireSpecialChar(i); + for (int i = 0; i < NUM_OF_CUTSCENE_OBJECTS; i++) + CStreaming::SetMissionDoesntRequireModel(MI_CUTOBJ01 + i); CStreaming::ms_disableStreaming = false; - if (CHud::m_ItemToFlash != ITEM_ARMOUR && CHud::m_ItemToFlash != ITEM_HEALTH) - CHud::m_ItemToFlash = -1; - CHud::SetHelpMessage(nil, false); // nil, false, false, true TODO(LCS) + CHud::m_ItemToFlash = -1; + CHud::SetHelpMessage(nil, false); CUserDisplay::OnscnTimer.m_bDisabled = false; + CTheScripts::RemoveScriptTextureDictionary(); 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); @@ -2102,11 +1829,10 @@ void CMissionCleanup::Process() CWorld::Players[0].m_pPed->m_nDrunkCountdown = 0; CPad::GetPad(0)->SetDrunkInputDelay(0); CWorld::Players[0].m_bDriveByAllowed = true; - CPad::GetPad(0)->unk_B4 = 1.0f; - CPad::GetPad(0)->unk_B8 = 0.5f; DMAudio.ShutUpPlayerTalking(0); CVehicle::bDisableRemoteDetonation = false; CVehicle::bDisableRemoteDetonationOnContact = false; + CGameLogic::ClearShortCut(); CTheScripts::RiotIntensity = 0; CTheScripts::StoreVehicleIndex = -1; CTheScripts::StoreVehicleWasRandom = true; @@ -2142,10 +1868,6 @@ void CMissionCleanup::Process() } RemoveEntityFromList(m_sEntities[i].id, m_sEntities[i].type); } - for (int i = 1; i < NUMSTREAMINFO; i++) { - if (CStreaming::IsScriptOwnedModel(i)) - CStreaming::SetMissionDoesntRequireModel(i); - } #ifdef SECUROM if ((myrand() & 3) == 2){ // if pirated game @@ -2174,7 +1896,7 @@ bool CUpsideDownCarCheck::IsCarUpsideDown(int32 id) bool CUpsideDownCarCheck::IsCarUpsideDown(CVehicle* pVehicle) { - script_assert(pVehicle); + assert(pVehicle); return pVehicle->GetUp().z <= UPSIDEDOWN_UP_THRESHOLD && pVehicle->GetMoveSpeed().Magnitude() < UPSIDEDOWN_MOVE_SPEED_THRESHOLD && pVehicle->GetTurnSpeed().Magnitude() < UPSIDEDOWN_TURN_SPEED_THRESHOLD; @@ -2313,157 +2035,109 @@ bool CStuckCarCheck::HasCarBeenStuckForAWhile(int32 id) return false; } -void CRunningScript::CollectParameters(uint32* pIp, int16 total, int* pParameters) +void CRunningScript::CollectParameters(uint32* pIp, int16 total) { - while (total--){ + for (int16 i = 0; i < total; i++){ + uint16 varIndex; switch (CTheScripts::Read1ByteFromScript(pIp)) { - case ARGUMENT_END: - return; - case ARGUMENT_INT_ZERO: - *pParameters = 0; - break; - case ARGUMENT_FLOAT_ZERO: - *pParameters = 0; - break; - case ARGUMENT_FLOAT_1BYTE: - *pParameters = (uint32)(uint8)CTheScripts::Read1ByteFromScript(pIp) << 24; - break; - case ARGUMENT_FLOAT_2BYTES: - *pParameters = (uint32)(uint16)CTheScripts::Read2BytesFromScript(pIp) << 16; - break; - case ARGUMENT_FLOAT_3BYTES: - *pParameters = (uint32)(uint8)CTheScripts::Read1ByteFromScript(pIp) << 8; - *pParameters |= (uint32)(uint16)CTheScripts::Read2BytesFromScript(pIp) << 16; - break; case ARGUMENT_INT32: case ARGUMENT_FLOAT: - *pParameters = CTheScripts::Read4BytesFromScript(pIp); + ScriptParams[i] = CTheScripts::Read4BytesFromScript(pIp); + break; + case ARGUMENT_GLOBALVAR: + varIndex = CTheScripts::Read2BytesFromScript(pIp); + script_assert(varIndex >= 8 && varIndex < CTheScripts::GetSizeOfVariableSpace()); + ScriptParams[i] = *((int32*)&CTheScripts::ScriptSpace[varIndex]); + break; + case ARGUMENT_LOCALVAR: + varIndex = CTheScripts::Read2BytesFromScript(pIp); + script_assert(varIndex >= 0 && varIndex < ARRAY_SIZE(m_anLocalVariables)); + ScriptParams[i] = m_anLocalVariables[varIndex]; break; case ARGUMENT_INT8: - *pParameters = CTheScripts::Read1ByteFromScript(pIp); + ScriptParams[i] = CTheScripts::Read1ByteFromScript(pIp); break; case ARGUMENT_INT16: - *pParameters = CTheScripts::Read2BytesFromScript(pIp); + ScriptParams[i] = CTheScripts::Read2BytesFromScript(pIp); break; default: - *pIp -= 1; - *pParameters = *GetPointerToScriptVariable(pIp, 0); + script_assert(0); break; } - pParameters++; } } #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT -int32* GetPointerToScriptVariableForDebug(CRunningScript* pScript, uint32* pIp, char* buf) -{ - char tmpstr[24]; - uint8 type = CTheScripts::Read1ByteFromScript(pIp); - if (type >= ARGUMENT_GLOBAL_ARRAY) { - uint8 index_in_block = CTheScripts::Read1ByteFromScript(pIp); - uint8 index_id = CTheScripts::Read1ByteFromScript(pIp); - uint8 size = CTheScripts::Read1ByteFromScript(pIp); - script_assert(size > 0); - script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size); - uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1); - sprintf(tmpstr, " $%d[%d@ (%d)]", ((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index_in_block, index_id, pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id]); - strcat(buf, tmpstr); - return (int32*)&CTheScripts::ScriptSpace[4 * (((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index + index_in_block)]; - } - else if (type >= ARGUMENT_GLOBAL) { - uint8 index_in_block = CTheScripts::Read1ByteFromScript(pIp); - sprintf(tmpstr, " $%d", ((int)(type - ARGUMENT_GLOBAL) << 8) + index_in_block); - strcat(buf, tmpstr); - return (int32*)&CTheScripts::ScriptSpace[4 * (((int)(type - ARGUMENT_GLOBAL) << 8) + index_in_block)]; - } - else if (type >= ARGUMENT_LOCAL_ARRAY) { - uint8 index_id = CTheScripts::Read1ByteFromScript(pIp); - uint8 size = CTheScripts::Read1ByteFromScript(pIp); - script_assert(size > 0); - script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size); - uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1); - sprintf(tmpstr, " %d@[%d@ (%d)]", (type - ARGUMENT_LOCAL_ARRAY), index_id, pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id]); - strcat(buf, tmpstr); - return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL_ARRAY) + index]; - } - else if (type >= ARGUMENT_LOCAL) { - sprintf(tmpstr, " %d@", (type - ARGUMENT_LOCAL)); - strcat(buf, tmpstr); - return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL)]; - } - else if (type >= ARGUMENT_TIMER) { - sprintf(tmpstr, " TIMER%d@", (type - ARGUMENT_TIMER)); - strcat(buf, tmpstr); - return &pScript->m_anLocalVariables[NUM_LOCAL_VARS + 8 + (type - ARGUMENT_TIMER)]; // why 8? - } - script_assert(false && "wrong type for variable"); - return nil; -} - int CRunningScript::CollectParameterForDebug(char* buf, bool& var) { + uint16 varIndex; + char tmpstr[24]; var = false; - int tmp; switch (CTheScripts::Read1ByteFromScript(&m_nIp)) { - case ARGUMENT_END: - return 0; // TODO(LCS) - case ARGUMENT_INT_ZERO: - return 0; - case ARGUMENT_FLOAT_ZERO: - return 0; - case ARGUMENT_FLOAT_1BYTE: - return (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 24; - case ARGUMENT_FLOAT_2BYTES: - return (uint32)(uint16)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; - case ARGUMENT_FLOAT_3BYTES: - tmp = (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 8; - tmp |= (uint32)(uint16)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; - return tmp; case ARGUMENT_INT32: case ARGUMENT_FLOAT: return CTheScripts::Read4BytesFromScript(&m_nIp); + case ARGUMENT_GLOBALVAR: + varIndex = CTheScripts::Read2BytesFromScript(&m_nIp); + script_assert(varIndex >= 8 && varIndex < CTheScripts::GetSizeOfVariableSpace()); + var = true; + sprintf(tmpstr, " $%d", varIndex / 4); + strcat(buf, tmpstr); + return *((int32*)&CTheScripts::ScriptSpace[varIndex]); + case ARGUMENT_LOCALVAR: + varIndex = CTheScripts::Read2BytesFromScript(&m_nIp); + script_assert(varIndex >= 0 && varIndex < ARRAY_SIZE(m_anLocalVariables)); + var = true; + sprintf(tmpstr, " %d@", varIndex); + strcat(buf, tmpstr); + return m_anLocalVariables[varIndex]; case ARGUMENT_INT8: return CTheScripts::Read1ByteFromScript(&m_nIp); case ARGUMENT_INT16: return CTheScripts::Read2BytesFromScript(&m_nIp); default: - var = true; - --m_nIp; - return *GetPointerToScriptVariableForDebug(this, &m_nIp, buf); + PrintToLog("%s - script assertion failed in CollectParameterForDebug", buf); + script_assert(0); + break; } return 0; } void CRunningScript::GetStoredParameterForDebug(char* buf) { - GetPointerToScriptVariableForDebug(this, &m_nIp, buf); + uint16 varIndex; + char tmpstr[24]; + switch (CTheScripts::Read1ByteFromScript(&m_nIp)) { + case ARGUMENT_GLOBALVAR: + varIndex = CTheScripts::Read2BytesFromScript(&m_nIp); + sprintf(tmpstr, " $%d", varIndex / 4); + strcat(buf, tmpstr); + break; + case ARGUMENT_LOCALVAR: + varIndex = CTheScripts::Read2BytesFromScript(&m_nIp); + sprintf(tmpstr, " %d@", varIndex); + strcat(buf, tmpstr); + break; + default: + PrintToLog("%s - script_assertion failed in GetStoredParameterForDebug", buf); + script_assert(0); + } } #endif int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) { uint32* pIp = &ip; - int tmp; switch (CTheScripts::Read1ByteFromScript(pIp)) { - case ARGUMENT_END: - return 0; // TODO(LCS) - case ARGUMENT_INT_ZERO: - return 0; - case ARGUMENT_FLOAT_ZERO: - return 0; - case ARGUMENT_FLOAT_1BYTE: - return (uint32)(uint8)CTheScripts::Read1ByteFromScript(pIp) << 24; - case ARGUMENT_FLOAT_2BYTES: - return (uint32)(uint16)CTheScripts::Read2BytesFromScript(pIp) << 16; - case ARGUMENT_FLOAT_3BYTES: - tmp = (uint32)(uint8)CTheScripts::Read1ByteFromScript(pIp) << 8; - tmp |= (uint32)(uint16)CTheScripts::Read2BytesFromScript(pIp) << 16; - return tmp; case ARGUMENT_INT32: return CTheScripts::Read4BytesFromScript(pIp); + case ARGUMENT_GLOBALVAR: + return *((int32*)&CTheScripts::ScriptSpace[(uint16)CTheScripts::Read2BytesFromScript(pIp)]); + case ARGUMENT_LOCALVAR: + return m_anLocalVariables[CTheScripts::Read2BytesFromScript(pIp)]; case ARGUMENT_INT8: return CTheScripts::Read1ByteFromScript(pIp); case ARGUMENT_INT16: @@ -2471,8 +2145,7 @@ int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) case ARGUMENT_FLOAT: return CTheScripts::Read4BytesFromScript(pIp); default: - (*pIp)--; - return *GetPointerToScriptVariable(pIp, 0); + script_assert(0); } return -1; } @@ -2480,61 +2153,38 @@ int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) void CRunningScript::StoreParameters(uint32* pIp, int16 number) { for (int16 i = 0; i < number; i++){ - *GetPointerToScriptVariable(pIp, 0) = ScriptParams[i]; + switch (CTheScripts::Read1ByteFromScript(pIp)) { + case ARGUMENT_GLOBALVAR: + *(int32*)&CTheScripts::ScriptSpace[(uint16)CTheScripts::Read2BytesFromScript(pIp)] = ScriptParams[i]; + break; + case ARGUMENT_LOCALVAR: + m_anLocalVariables[CTheScripts::Read2BytesFromScript(pIp)] = ScriptParams[i]; + break; + default: + script_assert(0); + } } } -int32* GetPointerToScriptVariable(CRunningScript* pScript, uint32* pIp) -{ - uint8 type = CTheScripts::Read1ByteFromScript(pIp); - if (type >= ARGUMENT_GLOBAL_ARRAY) { - uint8 index_in_block = CTheScripts::Read1ByteFromScript(pIp); - uint8 index_id = CTheScripts::Read1ByteFromScript(pIp); - uint8 size = CTheScripts::Read1ByteFromScript(pIp); - script_assert(size > 0); - script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size); - uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1); - return (int32*)&CTheScripts::ScriptSpace[4 * (((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index + index_in_block)]; - } - else if (type >= ARGUMENT_GLOBAL) { - uint8 index_in_block = CTheScripts::Read1ByteFromScript(pIp); - return (int32*)&CTheScripts::ScriptSpace[4 * (((int)(type - ARGUMENT_GLOBAL) << 8) + index_in_block)]; - } - else if (type >= ARGUMENT_LOCAL_ARRAY) { - uint8 index_id = CTheScripts::Read1ByteFromScript(pIp); - uint8 size = CTheScripts::Read1ByteFromScript(pIp); - script_assert(size > 0); - script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size); - uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1); - return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL_ARRAY) + index]; - } - else if (type >= ARGUMENT_LOCAL) { - return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL)]; - } - else if (type >= ARGUMENT_TIMER) { - return &pScript->m_anLocalVariables[NUM_LOCAL_VARS + 8 + (type - ARGUMENT_TIMER)]; - } - script_assert(false && "wrong type for variable"); - return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL)]; -} - int32 *CRunningScript::GetPointerToScriptVariable(uint32* pIp, int16 type) { - return ::GetPointerToScriptVariable(this, pIp); -} - -int CTheScripts::GetSaveVarIndex(int var) -{ - for (int i = 0; i < NumSaveVars; i++) { - if (SavedVarIndices[i] == var) - return i; + switch (CTheScripts::Read1ByteFromScript(pIp)) + { + case ARGUMENT_GLOBALVAR: + script_assert(type == VAR_GLOBAL); + return (int32*)&CTheScripts::ScriptSpace[(uint16)CTheScripts::Read2BytesFromScript(pIp)]; + case ARGUMENT_LOCALVAR: + script_assert(type == VAR_LOCAL); + return &m_anLocalVariables[CTheScripts::Read2BytesFromScript(pIp)]; + default: + script_assert(0); } - return -1; + return nil; } void CRunningScript::Init() { - sprintf(m_abScriptName, "id%02i", m_nId); + strcpy(m_abScriptName, "noname"); next = prev = nil; SetIP(0); for (int i = 0; i < MAX_STACK_DEPTH; i++) @@ -2545,28 +2195,13 @@ void CRunningScript::Init() m_bCondResult = false; m_bIsMissionScript = false; m_bSkipWakeTime = false; - for (int i = 0; i < NUM_LOCAL_VARS + 8 + NUM_TIMERS; i++) + for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++) m_anLocalVariables[i] = 0; m_nAndOrState = 0; m_bNotFlag = false; m_bDeatharrestEnabled = true; m_bDeatharrestExecuted = false; m_bMissionFlag = false; - m_nLocalsPointer = 0; -} - -void CTheScripts::Shutdown() -{ - if (gScriptsFile != -1) { - CFileMgr::CloseFile(gScriptsFile); - gScriptsFile = -1; - } - if (ScriptSpace) { - base::cMainMemoryManager::Instance()->Free(ScriptSpace); - ScriptSpace = nil; - FSDestroyedFlag = false; - OnAMissionFlag = 0; - } } #ifdef USE_DEBUG_SCRIPT_LOADER @@ -2589,17 +2224,17 @@ int open_script() #endif switch (scriptToLoad) { case 0: scriptfile = "main.scm"; break; - case 1: scriptfile = "freeroam_lcs.scm"; break; + case 1: scriptfile = "freeroam_miami.scm"; break; case 2: scriptfile = "main_d.scm"; break; } return CFileMgr::OpenFile(scriptfile, "rb"); } #endif -bool CTheScripts::Init(bool loaddata) +void CTheScripts::Init() { - bool retval = false; - printf("CTheScripts::Init\n"); + for (int i = 0; i < SIZE_SCRIPT_SPACE; i++) + ScriptSpace[i] = 0; pActiveScripts = pIdleScripts = nil; for (int i = 0; i < MAX_NUM_SCRIPTS; i++){ ScriptsArray[i].Init(); @@ -2608,47 +2243,25 @@ bool CTheScripts::Init(bool loaddata) MissionCleanUp.Init(); UpsideDownCars.Init(); StuckCars.Init(); - StoreVehicleIndex = -1; - StoreVehicleWasRandom = true; - OnAMissionFlag = 0; - LastMissionPassedTime = (uint32)-1; - for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - CollectiveArray[i].colIndex = -1; - CollectiveArray[i].pedIndex = 0; - } - NextFreeCollectiveIndex = 0; - LastRandomPedId = -1; - for (int i = 0; i < MAX_NUM_USED_OBJECTS; i++){ - memset(&UsedObjectArray[i].name, 0, sizeof(UsedObjectArray[i].name)); - UsedObjectArray[i].index = 0; - } -#if defined FIX_BUGS || (!defined GTA_PS2 && !defined GTA_PSP) - for (base::cSList::tSItem* i = CTheScripts::mCoronas.first; i;) { - base::cSList::tSItem* next = i->next; - delete i; - i = next; - } - CTheScripts::mCoronas.first = nil; -#endif - NumberOfUsedObjects = 0; - if (ScriptSpace) - Shutdown(); - CFileMgr::SetDir("DATA"); + CFileMgr::SetDir("data"); #ifdef USE_DEBUG_SCRIPT_LOADER int mainf = open_script(); #else int mainf = CFileMgr::OpenFile("main.scm", "rb"); #endif - CFileMgr::Read(mainf, (char*)&MainScriptSize, sizeof(MainScriptSize)); - int nLargestMissionSize = 0; - CFileMgr::Read(mainf, (char*)&nLargestMissionSize, sizeof(nLargestMissionSize)); - if (!cSmallHeap::msInstance.IsLocked()) - cSmallHeap::msInstance.Lock(); - ScriptSpace = (uint8*)base::cMainMemoryManager::Instance()->Allocate(MainScriptSize + nLargestMissionSize); - memset(ScriptSpace, 0, MainScriptSize + nLargestMissionSize); - CFileMgr::Read(mainf, (char*)ScriptSpace, MainScriptSize); - gScriptsFile = mainf; + CFileMgr::Read(mainf, (char*)ScriptSpace, SIZE_MAIN_SCRIPT); + CFileMgr::CloseFile(mainf); CFileMgr::SetDir(""); + StoreVehicleIndex = -1; + StoreVehicleWasRandom = true; + OnAMissionFlag = 0; + LastMissionPassedTime = (uint32)-1; + LastRandomPedId = -1; + for (int i = 0; i < MAX_NUM_USED_OBJECTS; i++){ + memset(&UsedObjectArray[i].name, 0, sizeof(UsedObjectArray[i].name)); + UsedObjectArray[i].index = 0; + } + NumberOfUsedObjects = 0; ReadObjectNamesFromScript(); UpdateObjectIndices(); bAlreadyRunningAMissionScript = false; @@ -2658,10 +2271,11 @@ bool CTheScripts::Init(bool loaddata) NumberOfExclusiveMissionScripts = 0; NumberOfMissionScripts = 0; LargestMissionScriptSize = 0; + MainScriptSize = 0; ReadMultiScriptFileOffsetsFromScript(); FailCurrentMission = 0; DbgFlag = false; - //NumScriptDebugLines = 0; + NumScriptDebugLines = 0; RiotIntensity = 0; bPlayerHasMetDebbieHarry = false; bPlayerIsInTheStatium = false; @@ -2685,7 +2299,7 @@ bool CTheScripts::Init(bool loaddata) IntroRectangles[i].m_sColor = CRGBA(255, 255, 255, 255); } NumberOfIntroRectanglesThisFrame = 0; - //RemoveScriptTextureDictionary(); // TODO(LCS) - probably not needed + RemoveScriptTextureDictionary(); for (int i = 0; i < MAX_NUM_BUILDING_SWAPS; i++){ BuildingSwapArray[i].m_pBuilding = nil; BuildingSwapArray[i].m_nNewModel = -1; @@ -2693,12 +2307,6 @@ bool CTheScripts::Init(bool loaddata) } for (int i = 0; i < MAX_NUM_INVISIBILITY_SETTINGS; i++) InvisibilitySettingArray[i] = nil; - if (loaddata) { - printf("loaddata = true\n"); - //retval = GenericLoad(); // TODO - } - for (int i = 0; i < MAX_ALLOWED_COLLISIONS; i++) - AllowedCollision[i] = 0; #if defined USE_ADVANCED_SCRIPT_DEBUG_OUTPUT && SCRIPT_LOG_FILE_LEVEL == 2 CFileMgr::SetDirMyDocuments(); @@ -2709,10 +2317,8 @@ bool CTheScripts::Init(bool loaddata) PrintToLog(init_msg); CFileMgr::SetDir(""); #endif - return retval; } -/* void CTheScripts::RemoveScriptTextureDictionary() { for (int i = 0; i < ARRAY_SIZE(CTheScripts::ScriptSprites); i++) @@ -2721,7 +2327,6 @@ void CTheScripts::RemoveScriptTextureDictionary() if (slot != -1) CTxdStore::RemoveTxd(slot); } -*/ void CRunningScript::RemoveScriptFromList(CRunningScript** ppScript) { @@ -2747,7 +2352,6 @@ CRunningScript* CTheScripts::StartNewScript(uint32 ip) CRunningScript* pNew = pIdleScripts; script_assert(pNew); pNew->RemoveScriptFromList(&pIdleScripts); - pNew->m_nId = NextProcessId++; pNew->Init(); pNew->SetIP(ip); pNew->AddScriptToList(&pActiveScripts); @@ -2759,8 +2363,6 @@ void CTheScripts::Process() { if (CReplay::IsPlayingBack()) return; - if (!ScriptSpace) - return; CommandsExecuted = 0; ScriptsUpdated = 0; float timeStep = CTimer::GetTimeStepInMilliseconds(); @@ -2832,7 +2434,6 @@ void CTheScripts::Process() #endif CRunningScript* script = pActiveScripts; - InTheScripts = true; while (script != nil){ CRunningScript* next = script->GetNext(); ++ScriptsUpdated; @@ -2842,11 +2443,6 @@ void CTheScripts::Process() if (script && !script->m_bIsActive) script = nil; } - InTheScripts = false; - for (base::cSList::tSItem* i = CTheScripts::mCoronas.first; i; i = i->next) { - CCoronas::RegisterCorona((uint32)(uintptr)i, i->item.r, i->item.g, i->item.b, 255, CVector(i->item.x, i->item.y, i->item.z), - -i->item.size, 450.0f, i->item.type, i->item.flareType, 1, 0, 0, 0.0f); - } DbgFlag = false; #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT PrintToLog("Script processing done, ScriptsUpdated: %d, CommandsExecuted: %d\n", ScriptsUpdated, CommandsExecuted); @@ -2872,7 +2468,6 @@ void CRunningScript::Process() #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT PrintToLog("\n\nProcessing script %s (id %d)\n\n", m_abScriptName, this - CTheScripts::ScriptsArray); #endif - pCurrent = this; if (m_bIsMissionScript) DoDeatharrestCheck(); if (m_bMissionFlag && CTheScripts::FailCurrentMission == 1 && m_nStackPointer == 1) @@ -2905,59 +2500,34 @@ int8 CRunningScript::ProcessOneCommand() #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT char commandInfo[1024]; uint32 ip = m_nIp; - uint8 nInputParams; - uint8 nOutputParameters; - uint8 nLocalsOffset; if (command < ARRAY_SIZE(commands)) { script_assert(commands[command].id == command); m_nIp -= 2; - sprintf(commandInfo, m_nIp >= CTheScripts::MainScriptSize ? "M<%5d> " : "<%6d> ", m_nIp >= CTheScripts::MainScriptSize ? m_nIp - CTheScripts::MainScriptSize : m_nIp); + sprintf(commandInfo, m_nIp >= SIZE_MAIN_SCRIPT ? "M<%5d> " : "<%6d> ", m_nIp >= SIZE_MAIN_SCRIPT ? m_nIp - SIZE_MAIN_SCRIPT : m_nIp); m_nIp += 2; if (m_bNotFlag) strcat(commandInfo, "NOT "); if (commands[command].position == -1) strcat(commandInfo, commands[command].name + sizeof("COMMAND_") - 1); - if (commands[command].input[0] == ARGTYPE_FUNCTION) { + for (int i = 0; commands[command].input[i] != ARGTYPE_NONE; i++) { char tmp[32]; bool var = false; - nInputParams = CTheScripts::Read1ByteFromScript(&m_nIp); - nOutputParameters = CTheScripts::Read1ByteFromScript(&m_nIp); - nLocalsOffset = CTheScripts::Read1ByteFromScript(&m_nIp); - int value = CollectParameterForDebug(commandInfo, var); - sprintf(tmp, var ? " (%s(%d))" : " %s(%d)", value >= 0 ? "G" : "L", abs(value)); + int value; + switch (commands[command].input[i]) { + case ARGTYPE_INT: + case ARGTYPE_PED_HANDLE: + case ARGTYPE_VEHICLE_HANDLE: + case ARGTYPE_OBJECT_HANDLE: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%d)" : " %d", value); break; + case ARGTYPE_FLOAT: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%.3f)" : " %.3f", *(float*)&value); break; + case ARGTYPE_STRING: sprintf(tmp, " '%s'", (const char*)&CTheScripts::ScriptSpace[m_nIp]); m_nIp += KEY_LENGTH_IN_SCRIPT; break; + case ARGTYPE_LABEL: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%s(%d))" : " %s(%d)", value >= 0 ? "G" : "L", abs(value)); break; + case ARGTYPE_BOOL: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%s)" : " %s", value ? "TRUE" : "FALSE"); break; + case ARGTYPE_ANDOR: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, " %d %ss", (value + 1) % 10, value / 10 == 0 ? "AND" : "OR"); break; + default: script_assert(0); + } strcat(commandInfo, tmp); - strcat(commandInfo, "{"); - for (int i = 0; i < nInputParams; i++) { - if (i != 0) - strcat(commandInfo, ", "); - value = CollectParameterForDebug(commandInfo, var); - sprintf(tmp, var ? "(%d)" : "%d", value); - strcat(commandInfo, tmp); - - } - strcat(commandInfo, "}"); - } - else { - for (int i = 0; commands[command].input[i] != ARGTYPE_NONE; i++) { - char tmp[32]; - bool var = false; - int value; - switch (commands[command].input[i]) { - case ARGTYPE_INT: - case ARGTYPE_PED_HANDLE: - case ARGTYPE_VEHICLE_HANDLE: - case ARGTYPE_OBJECT_HANDLE: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%d)" : " %d", value); break; - case ARGTYPE_FLOAT: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%.3f)" : " %.3f", *(float*)&value); break; - case ARGTYPE_STRING: sprintf(tmp, " '%s'", (const char*)&CTheScripts::ScriptSpace[m_nIp]); m_nIp += KEY_LENGTH_IN_SCRIPT; break; - case ARGTYPE_LABEL: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%s(%d))" : " %s(%d)", value >= 0 ? "G" : "L", abs(value)); break; - case ARGTYPE_BOOL: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%s)" : " %s", value ? "TRUE" : "FALSE"); break; - case ARGTYPE_ANDOR: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, " %d %ss", (value) % 10, value / 10 == 0 ? "AND" : "OR"); break; - default: script_assert(0); - } - strcat(commandInfo, tmp); - if (commands[command].position == i) - strcat(commandInfo, commands[command].name_override); - } + if (commands[command].position == i) + strcat(commandInfo, commands[command].name_override); } uint32 t = m_nIp; m_nIp = ip; @@ -2968,38 +2538,32 @@ int8 CRunningScript::ProcessOneCommand() retval = ProcessCommands0To99(command); else if (command < 200) retval = ProcessCommands100To199(command); - else if (command < 305) + else if (command < 300) retval = ProcessCommands200To299(command); - else if (command < 405) + else if (command < 400) retval = ProcessCommands300To399(command); - else if (command < 505) + else if (command < 500) retval = ProcessCommands400To499(command); - else if (command < 605) + else if (command < 600) retval = ProcessCommands500To599(command); - else if (command < 705) + else if (command < 700) retval = ProcessCommands600To699(command); - else if (command < 805) + else if (command < 800) retval = ProcessCommands700To799(command); - else if (command < 905) + else if (command < 900) retval = ProcessCommands800To899(command); - else if (command < 1005) + else if (command < 1000) retval = ProcessCommands900To999(command); - else if (command < 1105) + else if (command < 1100) retval = ProcessCommands1000To1099(command); - else if (command < 1205) + else if (command < 1200) retval = ProcessCommands1100To1199(command); - else if (command < 1305) + else if (command < 1300) retval = ProcessCommands1200To1299(command); - else if (command < 1405) + else if (command < 1400) retval = ProcessCommands1300To1399(command); - else if (command < 1497) + else if (command < 1500) retval = ProcessCommands1400To1499(command); - else if (command < 1600) - retval = ProcessCommands1500To1599(command); - else if (command < 1700) - retval = ProcessCommands1600To1699(command); - else - script_assert(false); #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT if (command < ARRAY_SIZE(commands)) { if (commands[command].cond || commands[command].output[0] != ARGTYPE_NONE) { @@ -3009,17 +2573,15 @@ int8 CRunningScript::ProcessOneCommand() uint32 t = m_nIp; m_nIp = ip; ip = t; - if (commands[command].input[0] != ARGTYPE_FUNCTION) { - for (int i = 0; commands[command].output[i] != ARGTYPE_NONE; i++) { - char tmp[32]; - switch (commands[command].output[i]) { - case ARGTYPE_INT: - case ARGTYPE_PED_HANDLE: - case ARGTYPE_VEHICLE_HANDLE: - case ARGTYPE_OBJECT_HANDLE: GetStoredParameterForDebug(commandInfo); sprintf(tmp, " (%d)", ScriptParams[i]); strcat(commandInfo, tmp); break; - case ARGTYPE_FLOAT: GetStoredParameterForDebug(commandInfo); sprintf(tmp, " (%8.3f)", *(float*)&ScriptParams[i]); strcat(commandInfo, tmp); break; - default: script_assert(0 && "Script only returns INTs and FLOATs"); - } + for (int i = 0; commands[command].output[i] != ARGTYPE_NONE; i++) { + char tmp[32]; + switch (commands[command].output[i]) { + case ARGTYPE_INT: + case ARGTYPE_PED_HANDLE: + case ARGTYPE_VEHICLE_HANDLE: + case ARGTYPE_OBJECT_HANDLE: GetStoredParameterForDebug(commandInfo); sprintf(tmp, " (%d)", ScriptParams[i]); strcat(commandInfo, tmp); break; + case ARGTYPE_FLOAT: GetStoredParameterForDebug(commandInfo); sprintf(tmp, " (%8.3f)", *(float*)&ScriptParams[i]); strcat(commandInfo, tmp); break; + default: script_assert(0 && "Script only returns INTs and FLOATs"); } } m_nIp = ip; @@ -3048,18 +2610,16 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) float *fScriptVar1; int *nScriptVar1; switch (command) { - /* case COMMAND_NOP: return 0; - */ case COMMAND_WAIT: CollectParameters(&m_nIp, 1); - m_nWakeTime = CTimer::GetTimeInMilliseconds() + GET_INTEGER_PARAM(0); + m_nWakeTime = CTimer::GetTimeInMilliseconds() + ScriptParams[0]; m_bSkipWakeTime = false; return 1; case COMMAND_GOTO: CollectParameters(&m_nIp, 1); - SetIP(GET_INTEGER_PARAM(0) >= 0 ? GET_INTEGER_PARAM(0) : CTheScripts::MainScriptSize - GET_INTEGER_PARAM(0)); + SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : SIZE_MAIN_SCRIPT - ScriptParams[0]); /* Known issue: GOTO to 0. It might have been "better" to use > instead of >= */ /* simply because it never makes sense to jump to start of the script */ /* but jumping to start of a custom mission is an issue for simple mission-like scripts */ @@ -3068,174 +2628,174 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) return 0; case COMMAND_SHAKE_CAM: CollectParameters(&m_nIp, 1); - CamShakeNoPos(&TheCamera, GET_INTEGER_PARAM(0) / 1000.0f); + CamShakeNoPos(&TheCamera, ScriptParams[0] / 1000.0f); return 0; case COMMAND_SET_VAR_INT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *ptr = GET_INTEGER_PARAM(0); + *ptr = ScriptParams[0]; return 0; } case COMMAND_SET_VAR_FLOAT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr = GET_FLOAT_PARAM(0); + *(float*)ptr = *(float*)&ScriptParams[0]; return 0; } case COMMAND_SET_LVAR_INT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *ptr = GET_INTEGER_PARAM(0); + *ptr = ScriptParams[0]; return 0; } case COMMAND_SET_LVAR_FLOAT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr = GET_FLOAT_PARAM(0); + *(float*)ptr = *(float*)&ScriptParams[0]; return 0; } case COMMAND_ADD_VAL_TO_INT_VAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *ptr += GET_INTEGER_PARAM(0); + *ptr += ScriptParams[0]; return 0; } case COMMAND_ADD_VAL_TO_FLOAT_VAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr += GET_FLOAT_PARAM(0); + *(float*)ptr += *(float*)&ScriptParams[0]; return 0; } case COMMAND_ADD_VAL_TO_INT_LVAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *ptr += GET_INTEGER_PARAM(0); + *ptr += ScriptParams[0]; return 0; } case COMMAND_ADD_VAL_TO_FLOAT_LVAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr += GET_FLOAT_PARAM(0); + *(float*)ptr += *(float*)&ScriptParams[0]; return 0; } case COMMAND_SUB_VAL_FROM_INT_VAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *ptr -= GET_INTEGER_PARAM(0); + *ptr -= ScriptParams[0]; return 0; } case COMMAND_SUB_VAL_FROM_FLOAT_VAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr -= GET_FLOAT_PARAM(0); + *(float*)ptr -= *(float*)&ScriptParams[0]; return 0; } case COMMAND_SUB_VAL_FROM_INT_LVAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *ptr -= GET_INTEGER_PARAM(0); + *ptr -= ScriptParams[0]; return 0; } case COMMAND_SUB_VAL_FROM_FLOAT_LVAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr -= GET_FLOAT_PARAM(0); + *(float*)ptr -= *(float*)&ScriptParams[0]; return 0; } case COMMAND_MULT_INT_VAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *ptr *= GET_INTEGER_PARAM(0); + *ptr *= ScriptParams[0]; return 0; } case COMMAND_MULT_FLOAT_VAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr *= GET_FLOAT_PARAM(0); + *(float*)ptr *= *(float*)&ScriptParams[0]; return 0; } case COMMAND_MULT_INT_LVAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *ptr *= GET_INTEGER_PARAM(0); + *ptr *= ScriptParams[0]; return 0; } case COMMAND_MULT_FLOAT_LVAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr *= GET_FLOAT_PARAM(0); + *(float*)ptr *= *(float*)&ScriptParams[0]; return 0; } case COMMAND_DIV_INT_VAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *ptr /= GET_INTEGER_PARAM(0); + *ptr /= ScriptParams[0]; return 0; } case COMMAND_DIV_FLOAT_VAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr /= GET_FLOAT_PARAM(0); + *(float*)ptr /= *(float*)&ScriptParams[0]; return 0; } case COMMAND_DIV_INT_LVAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *ptr /= GET_INTEGER_PARAM(0); + *ptr /= ScriptParams[0]; return 0; } case COMMAND_DIV_FLOAT_LVAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr /= GET_FLOAT_PARAM(0); + *(float*)ptr /= *(float*)&ScriptParams[0]; return 0; } case COMMAND_IS_INT_VAR_GREATER_THAN_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr > GET_INTEGER_PARAM(0)); + UpdateCompareFlag(*ptr > ScriptParams[0]); return 0; } case COMMAND_IS_INT_LVAR_GREATER_THAN_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr > GET_INTEGER_PARAM(0)); + UpdateCompareFlag(*ptr > ScriptParams[0]); return 0; } case COMMAND_IS_NUMBER_GREATER_THAN_INT_VAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); - UpdateCompareFlag(GET_INTEGER_PARAM(0) > *ptr); + UpdateCompareFlag(ScriptParams[0] > *ptr); return 0; } case COMMAND_IS_NUMBER_GREATER_THAN_INT_LVAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); - UpdateCompareFlag(GET_INTEGER_PARAM(0) > *ptr); + UpdateCompareFlag(ScriptParams[0] > *ptr); return 0; } case COMMAND_IS_INT_VAR_GREATER_THAN_INT_VAR: @@ -3270,28 +2830,28 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*(float*)ptr > GET_FLOAT_PARAM(0)); + UpdateCompareFlag(*(float*)ptr > *(float*)&ScriptParams[0]); return 0; } case COMMAND_IS_FLOAT_LVAR_GREATER_THAN_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*(float*)ptr > GET_FLOAT_PARAM(0)); + UpdateCompareFlag(*(float*)ptr > *(float*)&ScriptParams[0]); return 0; } case COMMAND_IS_NUMBER_GREATER_THAN_FLOAT_VAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); - UpdateCompareFlag(GET_FLOAT_PARAM(0) > *(float*)ptr); + UpdateCompareFlag(*(float*)&ScriptParams[0] > *(float*)ptr); return 0; } case COMMAND_IS_NUMBER_GREATER_THAN_FLOAT_LVAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); - UpdateCompareFlag(GET_FLOAT_PARAM(0) > *(float*)ptr); + UpdateCompareFlag(*(float*)&ScriptParams[0] > *(float*)ptr); return 0; } case COMMAND_IS_FLOAT_VAR_GREATER_THAN_FLOAT_VAR: @@ -3326,28 +2886,28 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr >= GET_INTEGER_PARAM(0)); + UpdateCompareFlag(*ptr >= ScriptParams[0]); return 0; } case COMMAND_IS_INT_LVAR_GREATER_OR_EQUAL_TO_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr >= GET_INTEGER_PARAM(0)); + UpdateCompareFlag(*ptr >= ScriptParams[0]); return 0; } case COMMAND_IS_NUMBER_GREATER_OR_EQUAL_TO_INT_VAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); - UpdateCompareFlag(GET_INTEGER_PARAM(0) >= *ptr); + UpdateCompareFlag(ScriptParams[0] >= *ptr); return 0; } case COMMAND_IS_NUMBER_GREATER_OR_EQUAL_TO_INT_LVAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); - UpdateCompareFlag(GET_INTEGER_PARAM(0) >= *ptr); + UpdateCompareFlag(ScriptParams[0] >= *ptr); return 0; } case COMMAND_IS_INT_VAR_GREATER_OR_EQUAL_TO_INT_VAR: @@ -3382,28 +2942,28 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*(float*)ptr >= GET_FLOAT_PARAM(0)); + UpdateCompareFlag(*(float*)ptr >= *(float*)&ScriptParams[0]); return 0; } case COMMAND_IS_FLOAT_LVAR_GREATER_OR_EQUAL_TO_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*(float*)ptr >= GET_FLOAT_PARAM(0)); + UpdateCompareFlag(*(float*)ptr >= *(float*)&ScriptParams[0]); return 0; } case COMMAND_IS_NUMBER_GREATER_OR_EQUAL_TO_FLOAT_VAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); - UpdateCompareFlag(GET_FLOAT_PARAM(0) >= *(float*)ptr); + UpdateCompareFlag(*(float*)&ScriptParams[0] >= *(float*)ptr); return 0; } case COMMAND_IS_NUMBER_GREATER_OR_EQUAL_TO_FLOAT_LVAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); - UpdateCompareFlag(GET_FLOAT_PARAM(0) >= *(float*)ptr); + UpdateCompareFlag(*(float*)&ScriptParams[0] >= *(float*)ptr); return 0; } case COMMAND_IS_FLOAT_VAR_GREATER_OR_EQUAL_TO_FLOAT_VAR: @@ -3438,14 +2998,14 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr == GET_INTEGER_PARAM(0)); + UpdateCompareFlag(*ptr == ScriptParams[0]); return 0; } case COMMAND_IS_INT_LVAR_EQUAL_TO_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr == GET_INTEGER_PARAM(0)); + UpdateCompareFlag(*ptr == ScriptParams[0]); return 0; } case COMMAND_IS_INT_VAR_EQUAL_TO_INT_VAR: @@ -3478,14 +3038,14 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*(float*)ptr == GET_FLOAT_PARAM(0)); + UpdateCompareFlag(*(float*)ptr == *(float*)&ScriptParams[0]); return 0; } case COMMAND_IS_FLOAT_LVAR_EQUAL_TO_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*(float*)ptr == GET_FLOAT_PARAM(0)); + UpdateCompareFlag(*(float*)ptr == *(float*)&ScriptParams[0]); return 0; } case COMMAND_IS_FLOAT_VAR_EQUAL_TO_FLOAT_VAR: @@ -3514,15 +3074,17 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) //case COMMAND_IS_FLOAT_VAR_NOT_EQUAL_TO_FLOAT_VAR: //case COMMAND_IS_FLOAT_LVAR_NOT_EQUAL_TO_FLOAT_LVAR: //case COMMAND_IS_FLOAT_VAR_NOT_EQUAL_TO_FLOAT_LVAR: + /* case COMMAND_GOTO_IF_TRUE: CollectParameters(&m_nIp, 1); if (m_bCondResult) - SetIP(GET_INTEGER_PARAM(0) >= 0 ? GET_INTEGER_PARAM(0) : CTheScripts::MainScriptSize - GET_INTEGER_PARAM(0)); + SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : SIZE_MAIN_SCRIPT - ScriptParams[0]); return 0; + */ case COMMAND_GOTO_IF_FALSE: CollectParameters(&m_nIp, 1); if (!m_bCondResult) - SetIP(GET_INTEGER_PARAM(0) >= 0 ? GET_INTEGER_PARAM(0) : CTheScripts::MainScriptSize - GET_INTEGER_PARAM(0)); + SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : SIZE_MAIN_SCRIPT - ScriptParams[0]); /* Check COMMAND_GOTO note. */ return 0; case COMMAND_TERMINATE_THIS_SCRIPT: @@ -3548,19 +3110,47 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) case COMMAND_START_NEW_SCRIPT: { CollectParameters(&m_nIp, 1); - script_assert(GET_INTEGER_PARAM(0) >= 0); - CRunningScript* pNew = CTheScripts::StartNewScript(GET_INTEGER_PARAM(0)); - CollectParameters(&m_nIp, NUM_LOCAL_VARS, pNew->m_anLocalVariables); + script_assert(ScriptParams[0] >= 0); + CRunningScript* pNew = CTheScripts::StartNewScript(ScriptParams[0]); + pNew->m_bIsActive = true; + int8 type = CTheScripts::Read1ByteFromScript(&m_nIp); + float tmp; + for (int i = 0; type != ARGUMENT_END; type = CTheScripts::Read1ByteFromScript(&m_nIp), i++) { + switch (type) { + case ARGUMENT_INT32: + pNew->m_anLocalVariables[i] = CTheScripts::Read4BytesFromScript(&m_nIp); + break; + case ARGUMENT_GLOBALVAR: + pNew->m_anLocalVariables[i] = *(int32*)&CTheScripts::ScriptSpace[(uint16)CTheScripts::Read2BytesFromScript(&m_nIp)]; + break; + case ARGUMENT_LOCALVAR: + pNew->m_anLocalVariables[i] = m_anLocalVariables[CTheScripts::Read2BytesFromScript(&m_nIp)]; + break; + case ARGUMENT_INT8: + pNew->m_anLocalVariables[i] = CTheScripts::Read1ByteFromScript(&m_nIp); + break; + case ARGUMENT_INT16: + pNew->m_anLocalVariables[i] = CTheScripts::Read2BytesFromScript(&m_nIp); + break; + case ARGUMENT_FLOAT: + tmp = CTheScripts::ReadFloatFromScript(&m_nIp); + pNew->m_anLocalVariables[i] = *(int32*)&tmp; + break; + default: + break; + } + } return 0; } case COMMAND_GOSUB: CollectParameters(&m_nIp, 1); script_assert(m_nStackPointer < MAX_STACK_DEPTH); m_anStack[m_nStackPointer++] = m_nIp; - SetIP(GET_INTEGER_PARAM(0) >= 0 ? GET_INTEGER_PARAM(0) : CTheScripts::MainScriptSize - GET_INTEGER_PARAM(0)); + SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : SIZE_MAIN_SCRIPT - ScriptParams[0]); return 0; case COMMAND_RETURN: - ReturnFromGosubOrFunction(); + script_assert(m_nStackPointer > 0); /* No more SSU */ + SetIP(m_anStack[--m_nStackPointer]); return 0; case COMMAND_LINE: CollectParameters(&m_nIp, 6); @@ -3569,7 +3159,7 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) case COMMAND_CREATE_PLAYER: { CollectParameters(&m_nIp, 4); - int32 index = GET_INTEGER_PARAM(0); + int32 index = ScriptParams[0]; script_assert(index < NUMPLAYERS); printf("&&&&&&&&&&&&&Creating player: %d\n", index); if (!CStreaming::HasModelLoaded(MI_PLAYER)) { @@ -3579,14 +3169,14 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) CPlayerPed::SetupPlayerPed(index); CWorld::Players[index].m_pPed->CharCreatedBy = MISSION_CHAR; CPlayerPed::DeactivatePlayerPed(index); - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += CWorld::Players[index].m_pPed->GetDistanceFromCentreOfMassToBaseOfModel(); CWorld::Players[index].m_pPed->SetPosition(pos); CTheScripts::ClearSpaceForMissionEntity(pos, CWorld::Players[index].m_pPed); CPlayerPed::ReactivatePlayerPed(index); - SET_INTEGER_PARAM(0, index); + ScriptParams[0] = index; StoreParameters(&m_nIp, 1); return 0; } @@ -3594,23 +3184,23 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { CVector pos; CollectParameters(&m_nIp, 1); - if (CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->bInVehicle && CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->m_pMyVehicle) - pos = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->m_pMyVehicle->GetPosition(); + if (CWorld::Players[ScriptParams[0]].m_pPed->bInVehicle) + pos = CWorld::Players[ScriptParams[0]].m_pPed->m_pMyVehicle->GetPosition(); else - pos = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->GetPosition(); - SET_VECTOR_PARAM(0, pos); + pos = CWorld::Players[ScriptParams[0]].m_pPed->GetPosition(); + *(CVector*)&ScriptParams[0] = pos; StoreParameters(&m_nIp, 3); return 0; } case COMMAND_SET_PLAYER_COORDINATES: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(1); - int index = GET_INTEGER_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[1]; + int index = ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CPlayerPed* ped = CWorld::Players[index].m_pPed; - if (ped->bInVehicle && ped->m_pMyVehicle) { + if (ped->bInVehicle) { pos.z += ped->m_pMyVehicle->GetDistanceFromCentreOfMassToBaseOfModel(); ped->m_pMyVehicle->Teleport(pos); // removed dumb stuff that was present here CTheScripts::ClearSpaceForMissionEntity(pos, ped->m_pMyVehicle); @@ -3658,43 +3248,39 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) case COMMAND_IS_PLAYER_IN_AREA_2D: { CollectParameters(&m_nIp, 6); - CPlayerPed* ped = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; - float x1 = GET_FLOAT_PARAM(1); - float y1 = GET_FLOAT_PARAM(2); - float x2 = GET_FLOAT_PARAM(3); - float y2 = GET_FLOAT_PARAM(4); + CPlayerPed* ped = CWorld::Players[ScriptParams[0]].m_pPed; + float x1 = *(float*)&ScriptParams[1]; + float y1 = *(float*)&ScriptParams[2]; + float x2 = *(float*)&ScriptParams[3]; + float y2 = *(float*)&ScriptParams[4]; if (!ped->bInVehicle) UpdateCompareFlag(ped->IsWithinArea(x1, y1, x2, y2)); else UpdateCompareFlag(ped->m_pMyVehicle->IsWithinArea(x1, y1, x2, y2)); - if (GET_INTEGER_PARAM(5)) + if (ScriptParams[5]) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugSquare(x1, y1, x2, y2); - */ return 0; } case COMMAND_IS_PLAYER_IN_AREA_3D: { CollectParameters(&m_nIp, 8); - CPlayerPed* ped = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; - float x1 = GET_FLOAT_PARAM(1); - float y1 = GET_FLOAT_PARAM(2); - float z1 = GET_FLOAT_PARAM(3); - float x2 = GET_FLOAT_PARAM(4); - float y2 = GET_FLOAT_PARAM(5); - float z2 = GET_FLOAT_PARAM(6); + CPlayerPed* ped = CWorld::Players[ScriptParams[0]].m_pPed; + float x1 = *(float*)&ScriptParams[1]; + float y1 = *(float*)&ScriptParams[2]; + float z1 = *(float*)&ScriptParams[3]; + float x2 = *(float*)&ScriptParams[4]; + float y2 = *(float*)&ScriptParams[5]; + float z2 = *(float*)&ScriptParams[6]; if (ped->bInVehicle) UpdateCompareFlag(ped->m_pMyVehicle->IsWithinArea(x1, y1, z1, x2, y2, z2)); else UpdateCompareFlag(ped->IsWithinArea(x1, y1, z1, x2, y2, z2)); - if (GET_INTEGER_PARAM(7)) + if (ScriptParams[7]) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, (z1 + z2) / 2); - /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugCube(x1, y1, z1, x2, y2, z2); - */ return 0; } case COMMAND_ADD_INT_VAR_TO_INT_VAR: @@ -3841,25 +3427,33 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr += CTimer::GetTimeStep() * GET_FLOAT_PARAM(0); + *(float*)ptr += CTimer::GetTimeStep() * *(float*)&ScriptParams[0]; return 0; } case COMMAND_ADD_TIMED_VAL_TO_FLOAT_LVAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr += CTimer::GetTimeStep() * GET_FLOAT_PARAM(0); + *(float*)ptr += CTimer::GetTimeStep() * *(float*)&ScriptParams[0]; return 0; } case COMMAND_ADD_TIMED_FLOAT_VAR_TO_FLOAT_VAR: fScriptVar1 = (float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); *fScriptVar1 += CTimer::GetTimeStep() * *(float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); return 0; +#ifdef FIX_BUGS case COMMAND_ADD_TIMED_FLOAT_VAR_TO_FLOAT_LVAR: +#else + case COMMAND_ADD_TIMED_FLOAT_LVAR_TO_FLOAT_VAR: +#endif fScriptVar1 = (float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); *fScriptVar1 += CTimer::GetTimeStep() * *(float*)GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); return 0; +#ifdef FIX_BUGS case COMMAND_ADD_TIMED_FLOAT_LVAR_TO_FLOAT_VAR: +#else + case COMMAND_ADD_TIMED_FLOAT_VAR_TO_FLOAT_LVAR: +#endif fScriptVar1 = (float*)GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); *fScriptVar1 += CTimer::GetTimeStep() * *(float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); return 0; @@ -3871,25 +3465,33 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr -= CTimer::GetTimeStep() * GET_FLOAT_PARAM(0); + *(float*)ptr -= CTimer::GetTimeStep() * *(float*)&ScriptParams[0]; return 0; } case COMMAND_SUB_TIMED_VAL_FROM_FLOAT_LVAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr -= CTimer::GetTimeStep() * GET_FLOAT_PARAM(0); + *(float*)ptr -= CTimer::GetTimeStep() * *(float*)&ScriptParams[0]; return 0; } case COMMAND_SUB_TIMED_FLOAT_VAR_FROM_FLOAT_VAR: fScriptVar1 = (float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); *fScriptVar1 -= CTimer::GetTimeStep() * *(float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); return 0; +#ifdef FIX_BUGS // in SA it was fixed by reversing their order in enum case COMMAND_SUB_TIMED_FLOAT_VAR_FROM_FLOAT_LVAR: +#else + case COMMAND_SUB_TIMED_FLOAT_LVAR_FROM_FLOAT_VAR: +#endif fScriptVar1 = (float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); *fScriptVar1 -= CTimer::GetTimeStep() * *(float*)GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); return 0; +#ifdef FIX_BUGS case COMMAND_SUB_TIMED_FLOAT_LVAR_FROM_FLOAT_VAR: +#else + case COMMAND_SUB_TIMED_FLOAT_VAR_FROM_FLOAT_LVAR: +#endif fScriptVar1 = (float*)GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); *fScriptVar1 -= CTimer::GetTimeStep() * *(float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); return 0; @@ -4038,46 +3640,46 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_CREATE_CHAR: { CollectParameters(&m_nIp, 5); - switch (GET_INTEGER_PARAM(1)) { + switch (ScriptParams[1]) { case MI_COP: - if (GET_INTEGER_PARAM(0) == PEDTYPE_COP) - SET_INTEGER_PARAM(1, COP_STREET); + if (ScriptParams[0] == PEDTYPE_COP) + ScriptParams[1] = COP_STREET; break; case MI_SWAT: - if (GET_INTEGER_PARAM(0) == PEDTYPE_COP) - SET_INTEGER_PARAM(1, COP_SWAT); + if (ScriptParams[0] == PEDTYPE_COP) + ScriptParams[1] = COP_SWAT; break; case MI_FBI: - if (GET_INTEGER_PARAM(0) == PEDTYPE_COP) - SET_INTEGER_PARAM(1, COP_FBI); + if (ScriptParams[0] == PEDTYPE_COP) + ScriptParams[1] = COP_FBI; break; case MI_ARMY: - if (GET_INTEGER_PARAM(0) == PEDTYPE_COP) - SET_INTEGER_PARAM(1, COP_ARMY); + if (ScriptParams[0] == PEDTYPE_COP) + ScriptParams[1] = COP_ARMY; break; case MI_MEDIC: - if (GET_INTEGER_PARAM(0) == PEDTYPE_EMERGENCY) - SET_INTEGER_PARAM(1, PEDTYPE_EMERGENCY); + if (ScriptParams[0] == PEDTYPE_EMERGENCY) + ScriptParams[1] = PEDTYPE_EMERGENCY; break; case MI_FIREMAN: - if (GET_INTEGER_PARAM(0) == PEDTYPE_FIREMAN) - SET_INTEGER_PARAM(1, PEDTYPE_FIREMAN); + if (ScriptParams[0] == PEDTYPE_FIREMAN) + ScriptParams[1] = PEDTYPE_FIREMAN; break; default: break; } CPed* ped; - if (GET_INTEGER_PARAM(0) == PEDTYPE_COP) - ped = new CCopPed((eCopType)GET_INTEGER_PARAM(1)); - else if (GET_INTEGER_PARAM(0) == PEDTYPE_EMERGENCY || GET_INTEGER_PARAM(0) == PEDTYPE_FIREMAN) - ped = new CEmergencyPed(GET_INTEGER_PARAM(1)); + if (ScriptParams[0] == PEDTYPE_COP) + ped = new CCopPed((eCopType)ScriptParams[1]); + else if (ScriptParams[0] == PEDTYPE_EMERGENCY || ScriptParams[0] == PEDTYPE_FIREMAN) + ped = new CEmergencyPed(ScriptParams[1]); else - ped = new CCivilianPed((ePedType)GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + ped = new CCivilianPed((ePedType)ScriptParams[0], ScriptParams[1]); ped->CharCreatedBy = MISSION_CHAR; ped->bRespondsToThreats = false; ped->bAllowMedicsToReviveMe = false; ped->bIsPlayerFriend = false; - CVector pos = GET_VECTOR_PARAM(2); + CVector pos = *(CVector*)&ScriptParams[2]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += 1.0f; @@ -4089,29 +3691,29 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) CWorld::Add(ped); ped->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pos); CPopulation::ms_nTotalMissionPeds++; - SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(ped)); + ScriptParams[0] = CPools::GetPedPool()->GetIndex(ped); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); + CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); return 0; } case COMMAND_DELETE_CHAR: { CollectParameters(&m_nIp, 1); - CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); CTheScripts::RemoveThisPed(ped); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR); return 0; } case COMMAND_CHAR_WANDER_DIR: { CollectParameters(&m_nIp, 2); - CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(ped); ped->ClearAll(); - int8 path = GET_INTEGER_PARAM(1); - if (GET_INTEGER_PARAM(1) < 0 || GET_INTEGER_PARAM(1) > 7) + int8 path = ScriptParams[1]; + if (ScriptParams[1] < 0 || ScriptParams[1] > 7) // Max number GetRandomNumberInRange returns is max-1 #ifdef FIX_BUGS path = CGeneral::GetRandomNumberInRange(0, 8); @@ -4126,19 +3728,19 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_CHAR_FOLLOW_PATH: { CollectParameters(&m_nIp, 6); - CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(ped); if (ped->GetPedState() == PED_ATTACK || ped->GetPedState() == PED_FIGHT || !ped->IsPedInControl()) return 0; - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - float radius = GET_FLOAT_PARAM(4); + float radius = *(float*)&ScriptParams[4]; eMoveState state; - switch (GET_INTEGER_PARAM(5)) { + switch (ScriptParams[5]) { case 0: state = PEDMOVE_WALK; break; case 1: state = PEDMOVE_RUN; break; - default: state = PEDMOVE_WALK; break; + default: assert(0); } ped->ClearAll(); ped->m_pathNodeTimer = 0; @@ -4148,7 +3750,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_CHAR_SET_IDLE: { CollectParameters(&m_nIp, 1); - CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(ped); ped->bScriptObjectiveCompleted = false; ped->SetObjective(OBJECTIVE_WAIT_ON_FOOT); @@ -4157,7 +3759,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_GET_CHAR_COORDINATES: { CollectParameters(&m_nIp, 1); - CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(ped); CVehicle* vehicle; CVector pos; @@ -4170,21 +3772,21 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) pos = vehicle->GetPosition(); else pos = ped->GetPosition(); - SET_VECTOR_PARAM(0, pos); + *(CVector*)&ScriptParams[0] = pos; StoreParameters(&m_nIp, 3); return 0; } case COMMAND_SET_CHAR_COORDINATES: { CollectParameters(&m_nIp, 4); - CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(ped); CVehicle* vehicle; if (ped->bInVehicle) vehicle = ped->m_pMyVehicle; else vehicle = nil; - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); // removed dumb stuff again @@ -4207,74 +3809,72 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) } return 0; } + /* case COMMAND_IS_CHAR_STILL_ALIVE: { CollectParameters(&m_nIp, 1); - CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - UpdateCompareFlag(ped && !ped->DyingOrDead()); + CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); + UpdateCompareFlag(ped && ped->GetPedState() != PED_DEAD && ped->GetPedState() != PED_DIE); return 0; } + */ case COMMAND_IS_CHAR_IN_AREA_2D: { CollectParameters(&m_nIp, 6); - CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(ped); CVehicle* vehicle; if (ped->bInVehicle) vehicle = ped->m_pMyVehicle; else vehicle = nil; - float x1 = GET_FLOAT_PARAM(1); - float y1 = GET_FLOAT_PARAM(2); - float x2 = GET_FLOAT_PARAM(3); - float y2 = GET_FLOAT_PARAM(4); + float x1 = *(float*)&ScriptParams[1]; + float y1 = *(float*)&ScriptParams[2]; + float x2 = *(float*)&ScriptParams[3]; + float y2 = *(float*)&ScriptParams[4]; if (vehicle) UpdateCompareFlag(ped->m_pMyVehicle->IsWithinArea(x1, y1, x2, y2)); else UpdateCompareFlag(ped->IsWithinArea(x1, y1, x2, y2)); - if (GET_INTEGER_PARAM(5)) + if (ScriptParams[5]) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugSquare(x1, y1, x2, y2); - */ return 0; } case COMMAND_IS_CHAR_IN_AREA_3D: { CollectParameters(&m_nIp, 8); - CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(ped); CVehicle* vehicle; if (ped->bInVehicle) vehicle = ped->m_pMyVehicle; else vehicle = nil; - float x1 = GET_FLOAT_PARAM(1); - float y1 = GET_FLOAT_PARAM(2); - float z1 = GET_FLOAT_PARAM(3); - float x2 = GET_FLOAT_PARAM(4); - float y2 = GET_FLOAT_PARAM(5); - float z2 = GET_FLOAT_PARAM(6); + float x1 = *(float*)&ScriptParams[1]; + float y1 = *(float*)&ScriptParams[2]; + float z1 = *(float*)&ScriptParams[3]; + float x2 = *(float*)&ScriptParams[4]; + float y2 = *(float*)&ScriptParams[5]; + float z2 = *(float*)&ScriptParams[6]; if (vehicle) UpdateCompareFlag(ped->m_pMyVehicle->IsWithinArea(x1, y1, z1, x2, y2, z2)); else UpdateCompareFlag(ped->IsWithinArea(x1, y1, z1, x2, y2, z2)); - if (GET_INTEGER_PARAM(7)) + if (ScriptParams[7]) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, (z1 + z2) / 2); - /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugCube(x1, y1, z1, x2, y2, z2); - */ return 0; } case COMMAND_CREATE_CAR: { CollectParameters(&m_nIp, 4); int32 handle; - if (CModelInfo::IsBoatModel(GET_INTEGER_PARAM(0))) { - CBoat* boat = new CBoat(GET_INTEGER_PARAM(0), MISSION_VEHICLE); - CVector pos = GET_VECTOR_PARAM(1); + if (CModelInfo::IsBoatModel(ScriptParams[0])) { + CBoat* boat = new CBoat(ScriptParams[0], MISSION_VEHICLE); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += boat->GetDistanceFromCentreOfMassToBaseOfModel(); @@ -4293,13 +3893,13 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) else { CVehicle* car; - if (!CModelInfo::IsBikeModel(GET_INTEGER_PARAM(0))) - car = new CAutomobile(GET_INTEGER_PARAM(0), MISSION_VEHICLE); + if (!CModelInfo::IsBikeModel(ScriptParams[0])) + car = new CAutomobile(ScriptParams[0], MISSION_VEHICLE); else { - car = new CBike(GET_INTEGER_PARAM(0), MISSION_VEHICLE); + car = new CBike(ScriptParams[0], MISSION_VEHICLE); ((CBike*)(car))->bIsStanding = true; } - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += car->GetDistanceFromCentreOfMassToBaseOfModel(); @@ -4314,14 +3914,14 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) car->AutoPilot.m_nCruiseSpeed = car->AutoPilot.m_fMaxTrafficSpeed = 9.0f; car->AutoPilot.m_nCurrentLane = car->AutoPilot.m_nNextLane = 0; car->bEngineOn = false; - car->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pos); // TODO: gpTheZones + car->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pos); car->bHasBeenOwnedByPlayer = true; if (m_bIsMissionScript) car->bIsStaticWaitingForCollision = true; CWorld::Add(car); handle = CPools::GetVehiclePool()->GetIndex(car); } - SET_INTEGER_PARAM(0, handle); + ScriptParams[0] = handle; StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) CTheScripts::MissionCleanUp.AddEntityToList(handle, CLEANUP_CAR); @@ -4330,26 +3930,25 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_DELETE_CAR: { CollectParameters(&m_nIp, 1); - CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); if (car) { CWorld::Remove(car); CWorld::RemoveReferencesToDeletedObject(car); delete car; } if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR); return 0; } case COMMAND_CAR_GOTO_COORDINATES: { CollectParameters(&m_nIp, 4); - CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(car); - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += car->GetDistanceFromCentreOfMassToBaseOfModel(); - uint8 nOldMission = car->AutoPilot.m_nCarMission; if (CCarCtrl::JoinCarWithRoadSystemGotoCoors(car, pos, false)) car->AutoPilot.m_nCarMission = MISSION_GOTOCOORDS_STRAIGHT; else @@ -4357,14 +3956,13 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) car->SetStatus(STATUS_PHYSICS); car->bEngineOn = true; car->AutoPilot.m_nCruiseSpeed = Max(1, car->AutoPilot.m_nCruiseSpeed); - if (nOldMission != car->AutoPilot.m_nCarMission) - car->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds(); + car->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds(); return 0; } case COMMAND_CAR_WANDER_RANDOMLY: { CollectParameters(&m_nIp, 1); - CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(car); CCarCtrl::JoinCarWithRoadSystem(car); car->AutoPilot.m_nCarMission = MISSION_CRUISE; @@ -4376,7 +3974,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_CAR_SET_IDLE: { CollectParameters(&m_nIp, 1); - CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(car); car->AutoPilot.m_nCarMission = MISSION_NONE; return 0; @@ -4384,18 +3982,18 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_GET_CAR_COORDINATES: { CollectParameters(&m_nIp, 1); - CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(car); - SET_VECTOR_PARAM(0, car->GetPosition()); + *(CVector*)&ScriptParams[0] = car->GetPosition(); StoreParameters(&m_nIp, 3); return 0; } case COMMAND_SET_CAR_COORDINATES: { CollectParameters(&m_nIp, 4); - CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(car); - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += car->GetDistanceFromCentreOfMassToBaseOfModel(); @@ -4441,84 +4039,80 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) } return 0; } + /* case COMMAND_IS_CAR_STILL_ALIVE: { CollectParameters(&m_nIp, 1); - CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); UpdateCompareFlag(car && car->GetStatus() != STATUS_WRECKED && (car->IsBoat() || !car->bIsInWater)); return 0; } + */ case COMMAND_SET_CAR_CRUISE_SPEED: { CollectParameters(&m_nIp, 2); - CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(car); #if defined MISSION_REPLAY && defined SIMPLIER_MISSIONS - car->AutoPilot.m_nCruiseSpeed = GET_FLOAT_PARAM(1); + car->AutoPilot.m_nCruiseSpeed = *(float*)&ScriptParams[1]; if (missionRetryScriptIndex == 40 && car->GetModelIndex() == MI_CHEETAH) // Turismo car->AutoPilot.m_nCruiseSpeed = 8 * car->AutoPilot.m_nCruiseSpeed / 10; car->AutoPilot.m_nCruiseSpeed = Min(car->AutoPilot.m_nCruiseSpeed, 60.0f * car->pHandling->Transmission.fMaxCruiseVelocity); #else - car->AutoPilot.m_nCruiseSpeed = Min(GET_FLOAT_PARAM(1), 60.0f * car->pHandling->Transmission.fMaxCruiseVelocity); + car->AutoPilot.m_nCruiseSpeed = Min(*(float*)&ScriptParams[1], 60.0f * car->pHandling->Transmission.fMaxCruiseVelocity); #endif return 0; } case COMMAND_SET_CAR_DRIVING_STYLE: { CollectParameters(&m_nIp, 2); - CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(car); - car->AutoPilot.m_nDrivingStyle = (uint8)GET_INTEGER_PARAM(1); + car->AutoPilot.m_nDrivingStyle = (uint8)ScriptParams[1]; return 0; } case COMMAND_SET_CAR_MISSION: { CollectParameters(&m_nIp, 2); - CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(car); - if ((uint8)GET_INTEGER_PARAM(1) != car->AutoPilot.m_nCarMission) { - car->AutoPilot.m_nCarMission = (uint8)GET_INTEGER_PARAM(1); - car->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds(); - } + car->AutoPilot.m_nCarMission = (uint8)ScriptParams[1]; + car->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds(); car->bEngineOn = true; return 0; } case COMMAND_IS_CAR_IN_AREA_2D: { CollectParameters(&m_nIp, 6); - CVehicle* vehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* vehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(vehicle); - float x1 = GET_FLOAT_PARAM(1); - float y1 = GET_FLOAT_PARAM(2); - float x2 = GET_FLOAT_PARAM(3); - float y2 = GET_FLOAT_PARAM(4); + float x1 = *(float*)&ScriptParams[1]; + float y1 = *(float*)&ScriptParams[2]; + float x2 = *(float*)&ScriptParams[3]; + float y2 = *(float*)&ScriptParams[4]; UpdateCompareFlag(vehicle->IsWithinArea(x1, y1, x2, y2)); - if (GET_INTEGER_PARAM(5)) + if (ScriptParams[5]) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugSquare(x1, y1, x2, y2); - */ return 0; } case COMMAND_IS_CAR_IN_AREA_3D: { CollectParameters(&m_nIp, 8); - CVehicle* vehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* vehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(vehicle); - float x1 = GET_FLOAT_PARAM(1); - float y1 = GET_FLOAT_PARAM(2); - float z1 = GET_FLOAT_PARAM(3); - float x2 = GET_FLOAT_PARAM(4); - float y2 = GET_FLOAT_PARAM(5); - float z2 = GET_FLOAT_PARAM(6); + float x1 = *(float*)&ScriptParams[1]; + float y1 = *(float*)&ScriptParams[2]; + float z1 = *(float*)&ScriptParams[3]; + float x2 = *(float*)&ScriptParams[4]; + float y2 = *(float*)&ScriptParams[5]; + float z2 = *(float*)&ScriptParams[6]; UpdateCompareFlag(vehicle->IsWithinArea(x1, y1, z1, x2, y2, z2)); - if (GET_INTEGER_PARAM(7)) + if (ScriptParams[7]) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, (z1 + z2) / 2); - /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugCube(x1, y1, z1, x2, y2, z2); - */ return 0; } case COMMAND_SPECIAL_0: @@ -4539,54 +4133,56 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) AllowMissionReplay = 1; #endif CollectParameters(&m_nIp, 2); - CMessages::AddBigMessage(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1) - 1); + CMessages::AddBigMessage(key, ScriptParams[0], ScriptParams[1] - 1); return 0; } case COMMAND_PRINT: { wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 2); - CMessages::AddMessage(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CMessages::AddMessage(key, ScriptParams[0], ScriptParams[1]); return 0; } case COMMAND_PRINT_NOW: { wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 2); - CMessages::AddMessageJumpQ(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CMessages::AddMessageJumpQ(key, ScriptParams[0], ScriptParams[1]); return 0; } + /* case COMMAND_PRINT_SOON: { wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 2); - CMessages::AddMessageSoon(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CMessages::AddMessageSoon(key, ScriptParams[0], ScriptParams[1]); return 0; } + */ case COMMAND_CLEAR_PRINTS: CMessages::ClearMessages(); return 0; case COMMAND_GET_TIME_OF_DAY: - SET_INTEGER_PARAM(0, CClock::GetHours()); - SET_INTEGER_PARAM(1, CClock::GetMinutes()); + ScriptParams[0] = CClock::GetHours(); + ScriptParams[1] = CClock::GetMinutes(); StoreParameters(&m_nIp, 2); return 0; case COMMAND_SET_TIME_OF_DAY: CollectParameters(&m_nIp, 2); - CClock::SetGameClock(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CClock::SetGameClock(ScriptParams[0], ScriptParams[1]); return 0; case COMMAND_GET_MINUTES_TO_TIME_OF_DAY: CollectParameters(&m_nIp, 2); - SET_INTEGER_PARAM(0, CClock::GetGameClockMinutesUntil(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1))); + ScriptParams[0] = CClock::GetGameClockMinutesUntil(ScriptParams[0], ScriptParams[1]); StoreParameters(&m_nIp, 1); return 0; case COMMAND_IS_POINT_ON_SCREEN: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= -100) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - UpdateCompareFlag(TheCamera.IsSphereVisible(pos, GET_FLOAT_PARAM(3))); + UpdateCompareFlag(TheCamera.IsSphereVisible(pos, *(float*)&ScriptParams[3])); return 0; } case COMMAND_DEBUG_ON: @@ -4595,14 +4191,14 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_DEBUG_OFF: CTheScripts::DbgFlag = false; return 0; + /* case COMMAND_RETURN_TRUE: UpdateCompareFlag(true); - ReturnFromGosubOrFunction(); return 0; case COMMAND_RETURN_FALSE: UpdateCompareFlag(false); - ReturnFromGosubOrFunction(); return 0; + */ //case COMMAND_VAR_INT: default: script_assert(0); @@ -4629,21 +4225,18 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_WHILE: case COMMAND_WHILENOT: case COMMAND_ENDWHILE: - case COMMAND_214: - case COMMAND_215: - case COMMAND_216: - case COMMAND_217: - case COMMAND_218: */ case COMMAND_ANDOR: CollectParameters(&m_nIp, 1); - m_nAndOrState = GET_INTEGER_PARAM(0); + m_nAndOrState = ScriptParams[0]; if (m_nAndOrState == ANDOR_NONE){ m_bCondResult = false; // pointless }else if (m_nAndOrState >= ANDS_1 && m_nAndOrState <= ANDS_8){ m_bCondResult = true; + m_nAndOrState++; }else if (m_nAndOrState >= ORS_1 && m_nAndOrState <= ORS_8){ m_bCondResult = false; + m_nAndOrState++; }else{ script_assert(0 && "COMMAND_ANDOR: invalid ANDOR state"); } @@ -4651,7 +4244,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_LAUNCH_MISSION: { CollectParameters(&m_nIp, 1); - CRunningScript* pNew = CTheScripts::StartNewScript(GET_INTEGER_PARAM(0)); + CRunningScript* pNew = CTheScripts::StartNewScript(ScriptParams[0]); pNew->m_bIsMissionScript = true; return 0; } @@ -4665,7 +4258,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_STORE_CAR_CHAR_IS_IN: { CollectParameters(&m_nIp, 1); - CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(ped); CVehicle* pCurrent = nil; if (ped->bInVehicle) { @@ -4710,14 +4303,14 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) break; } } - SET_INTEGER_PARAM(0, CTheScripts::StoreVehicleIndex); + ScriptParams[0] = CTheScripts::StoreVehicleIndex; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_STORE_CAR_PLAYER_IS_IN: { CollectParameters(&m_nIp, 1); - CPed* ped = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* ped = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(ped); if (!ped->bInVehicle) return 0; // No value written to output variable @@ -4761,15 +4354,15 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) break; } } - SET_INTEGER_PARAM(0, CTheScripts::StoreVehicleIndex); + ScriptParams[0] = CTheScripts::StoreVehicleIndex; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_IS_CHAR_IN_CAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - CVehicle* pCheckedVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CVehicle* pCheckedVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); CVehicle* pActualVehicle = pPed->bInVehicle ? pPed->m_pMyVehicle : nil; UpdateCompareFlag(pActualVehicle && pActualVehicle == pCheckedVehicle); return 0; @@ -4777,51 +4370,51 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_IS_PLAYER_IN_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pCheckedVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CVehicle* pCheckedVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle == pCheckedVehicle); return 0; } case COMMAND_IS_CHAR_IN_MODEL: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); CVehicle* pActualVehicle = pPed->bInVehicle ? pPed->m_pMyVehicle : nil; - UpdateCompareFlag(pActualVehicle && pActualVehicle->GetModelIndex() == GET_INTEGER_PARAM(1)); + UpdateCompareFlag(pActualVehicle && pActualVehicle->GetModelIndex() == ScriptParams[1]); return 0; } case COMMAND_IS_PLAYER_IN_MODEL: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; - UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetModelIndex() == GET_INTEGER_PARAM(1)); + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetModelIndex() == ScriptParams[1]); return 0; } case COMMAND_IS_CHAR_IN_ANY_CAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle); return 0; } case COMMAND_IS_PLAYER_IN_ANY_CAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle); return 0; } case COMMAND_IS_BUTTON_PRESSED: { CollectParameters(&m_nIp, 2); - UpdateCompareFlag(GetPadState(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)) != 0); + UpdateCompareFlag(GetPadState(ScriptParams[0], ScriptParams[1]) != 0); return 0; } /* case COMMAND_GET_PAD_STATE: { CollectParameters(&m_nIp, 1); - SET_INTEGER_PARAM(0, GetPadState(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1))); + ScriptParams[0] = GetPadState(ScriptParams[0], ScriptParams[1]); StoreParameters(&m_nIp, 1); return 0; } @@ -4881,10 +4474,10 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_CREATE_OBJECT: { CollectParameters(&m_nIp, 4); - int mi = GET_INTEGER_PARAM(0) >= 0 ? GET_INTEGER_PARAM(0) : CTheScripts::UsedObjectArray[-GET_INTEGER_PARAM(0)].index; + int mi = ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::UsedObjectArray[-ScriptParams[0]].index; CObject* pObj = new CObject(mi, false); pObj->ObjectCreatedBy = MISSION_OBJECT; - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += pObj->GetDistanceFromCentreOfMassToBaseOfModel(); @@ -4892,72 +4485,73 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) pObj->SetOrientation(0.0f, 0.0f, 0.0f); pObj->GetMatrix().UpdateRW(); pObj->UpdateRwFrame(); + CBaseModelInfo* pModelInfo = CModelInfo::GetModelInfo(mi); + if (pModelInfo->IsBuilding() && ((CSimpleModelInfo*)pModelInfo)->m_isBigBuilding) + pObj->SetupBigBuilding(); CTheScripts::ClearSpaceForMissionEntity(pos, pObj); CWorld::Add(pObj); - SET_INTEGER_PARAM(0, CPools::GetObjectPool()->GetIndex(pObj)); + ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pObj); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_OBJECT); + CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT); return 0; } case COMMAND_DELETE_OBJECT: { CollectParameters(&m_nIp, 1); - CObject* pObj = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObj = CPools::GetObjectPool()->GetAt(ScriptParams[0]); if (pObj){ CWorld::Remove(pObj); CWorld::RemoveReferencesToDeletedObject(pObj); delete pObj; } if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_OBJECT); + CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT); return 0; } case COMMAND_ADD_SCORE: CollectParameters(&m_nIp, 2); - CWorld::Players[GET_INTEGER_PARAM(0)].m_nMoney += GET_INTEGER_PARAM(1); - if (CWorld::Players[GET_INTEGER_PARAM(0)].m_nMoney < 0) - CWorld::Players[GET_INTEGER_PARAM(0)].m_nMoney = 0; + CWorld::Players[ScriptParams[0]].m_nMoney += ScriptParams[1]; + if (CWorld::Players[ScriptParams[0]].m_nMoney < 0) + CWorld::Players[ScriptParams[0]].m_nMoney = 0; return 0; case COMMAND_IS_SCORE_GREATER: CollectParameters(&m_nIp, 2); - UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_nMoney > GET_INTEGER_PARAM(1)); + UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_nMoney > ScriptParams[1]); return 0; case COMMAND_STORE_SCORE: CollectParameters(&m_nIp, 1); - SET_INTEGER_PARAM(0, CWorld::Players[GET_INTEGER_PARAM(0)].m_nMoney); + ScriptParams[0] = CWorld::Players[ScriptParams[0]].m_nMoney; StoreParameters(&m_nIp, 1); return 0; case COMMAND_GIVE_REMOTE_CONTROLLED_CAR_TO_PLAYER: { CollectParameters(&m_nIp, 5); - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CVehicle* pVehicle = CRemote::GivePlayerRemoteControlledCar(pos.x, pos.y, pos.z, DEGTORAD(GET_FLOAT_PARAM(4)), MI_RCBANDIT); - SET_INTEGER_PARAM(0, CPools::GetVehiclePool()->GetIndex(pVehicle)); - StoreParameters(&m_nIp, 1); + CRemote::GivePlayerRemoteControlledCar(pos.x, pos.y, pos.z, DEGTORAD(*(float*)&ScriptParams[4]), MI_RCBANDIT); return 0; } case COMMAND_ALTER_WANTED_LEVEL: CollectParameters(&m_nIp, 2); - CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->SetWantedLevel(GET_INTEGER_PARAM(1)); + CWorld::Players[ScriptParams[0]].m_pPed->SetWantedLevel(ScriptParams[1]); return 0; case COMMAND_ALTER_WANTED_LEVEL_NO_DROP: CollectParameters(&m_nIp, 2); - CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->SetWantedLevelNoDrop(GET_INTEGER_PARAM(1)); + CWorld::Players[ScriptParams[0]].m_pPed->SetWantedLevelNoDrop(ScriptParams[1]); return 0; case COMMAND_IS_WANTED_LEVEL_GREATER: CollectParameters(&m_nIp, 2); - UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->m_pWanted->GetWantedLevel() > GET_INTEGER_PARAM(1)); + UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_pPed->m_pWanted->GetWantedLevel() > ScriptParams[1]); return 0; case COMMAND_CLEAR_WANTED_LEVEL: CollectParameters(&m_nIp, 1); - CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->SetWantedLevel(0); + CWorld::Players[ScriptParams[0]].m_pPed->SetWantedLevel(0); return 0; case COMMAND_SET_DEATHARREST_STATE: CollectParameters(&m_nIp, 1); - m_bDeatharrestEnabled = (GET_INTEGER_PARAM(0) == 1); + m_bDeatharrestEnabled = (ScriptParams[0] == 1); return 0; case COMMAND_HAS_DEATHARREST_BEEN_EXECUTED: UpdateCompareFlag(m_bDeatharrestExecuted); @@ -4966,54 +4560,51 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_ADD_AMMO_TO_PLAYER: { CollectParameters(&m_nIp, 3); - CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->GrantAmmo((eWeaponType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + CWorld::Players[ScriptParams[0]].m_pPed->GrantAmmo((eWeaponType)ScriptParams[1], ScriptParams[2]); return 0; } */ case COMMAND_ADD_AMMO_TO_CHAR: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->GrantAmmo((eWeaponType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + pPed->GrantAmmo((eWeaponType)ScriptParams[1], ScriptParams[2]); return 0; } //case COMMAND_ADD_AMMO_TO_CAR: - case COMMAND_IS_PLAYER_STILL_ALIVE: - CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_WBState != WBSTATE_WASTED); - return 0; + //case COMMAND_IS_PLAYER_STILL_ALIVE: case COMMAND_IS_PLAYER_DEAD: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_WBState == WBSTATE_WASTED); + UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_WBState == WBSTATE_WASTED); return 0; case COMMAND_IS_CHAR_DEAD: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - UpdateCompareFlag(!pPed || pPed->DyingOrDead() || pPed->m_objective == OBJECTIVE_LEAVE_CAR_AND_DIE); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + UpdateCompareFlag(!pPed || pPed->DyingOrDead()); return 0; } case COMMAND_IS_CAR_DEAD: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); UpdateCompareFlag(!pVehicle || pVehicle->GetStatus() == STATUS_WRECKED || pVehicle->bIsDrowning); return 0; } case COMMAND_SET_CHAR_THREAT_SEARCH: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->m_fearFlags |= GET_INTEGER_PARAM(1); + pPed->m_fearFlags |= ScriptParams[1]; return 0; } //case COMMAND_SET_CHAR_THREAT_REACTION: case COMMAND_SET_CHAR_OBJ_NO_OBJ: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->ClearObjective(); @@ -5026,7 +4617,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_IS_PLAYER_IN_ZONE: { CollectParameters(&m_nIp, 1); - CPlayerInfo* pPlayer = &CWorld::Players[GET_INTEGER_PARAM(0)]; + CPlayerInfo* pPlayer = &CWorld::Players[ScriptParams[0]]; char label[12]; CTheScripts::ReadTextLabelFromScript(&m_nIp, label); int zoneToCheck = CTheZones::FindZoneByLabelAndReturnIndex(label, ZONE_DEFAULT); @@ -5039,15 +4630,15 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) } case COMMAND_IS_PLAYER_PRESSING_HORN: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->GetPedState() == PED_DRIVING && - CPad::GetPad(GET_INTEGER_PARAM(0))->GetHorn()); + UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_pPed->GetPedState() == PED_DRIVING && + CPad::GetPad(ScriptParams[0])->GetHorn()); return 0; case COMMAND_HAS_CHAR_SPOTTED_PLAYER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - UpdateCompareFlag(pPed->OurPedCanSeeThisOne(CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed)); + UpdateCompareFlag(pPed->OurPedCanSeeThisOne(CWorld::Players[ScriptParams[1]].m_pPed)); return 0; } //case COMMAND_ORDER_CHAR_TO_BACKDOOR: @@ -5055,7 +4646,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_IS_CHAR_OBJECTIVE_PASSED: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->bScriptObjectiveCompleted); return 0; @@ -5067,43 +4658,43 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_CREATE_CHAR_INSIDE_CAR: { CollectParameters(&m_nIp, 3); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - switch (GET_INTEGER_PARAM(2)) { + switch (ScriptParams[2]) { case MI_COP: - if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) - SET_INTEGER_PARAM(2, COP_STREET); + if (ScriptParams[1] == PEDTYPE_COP) + ScriptParams[2] = COP_STREET; break; case MI_SWAT: - if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) - SET_INTEGER_PARAM(2, COP_SWAT); + if (ScriptParams[1] == PEDTYPE_COP) + ScriptParams[2] = COP_SWAT; break; case MI_FBI: - if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) - SET_INTEGER_PARAM(2, COP_FBI); + if (ScriptParams[1] == PEDTYPE_COP) + ScriptParams[2] = COP_FBI; break; case MI_ARMY: - if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) - SET_INTEGER_PARAM(2, COP_ARMY); + if (ScriptParams[1] == PEDTYPE_COP) + ScriptParams[2] = COP_ARMY; break; case MI_MEDIC: - if (GET_INTEGER_PARAM(1) == PEDTYPE_EMERGENCY) - SET_INTEGER_PARAM(2, PEDTYPE_EMERGENCY); + if (ScriptParams[1] == PEDTYPE_EMERGENCY) + ScriptParams[2] = PEDTYPE_EMERGENCY; break; case MI_FIREMAN: - if (GET_INTEGER_PARAM(1) == PEDTYPE_FIREMAN) - SET_INTEGER_PARAM(2, PEDTYPE_FIREMAN); + if (ScriptParams[1] == PEDTYPE_FIREMAN) + ScriptParams[2] = PEDTYPE_FIREMAN; break; default: break; } CPed* pPed; - if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) - pPed = new CCopPed((eCopType)GET_INTEGER_PARAM(2)); - else if (GET_INTEGER_PARAM(1) == PEDTYPE_EMERGENCY || GET_INTEGER_PARAM(1) == PEDTYPE_FIREMAN) - pPed = new CEmergencyPed(GET_INTEGER_PARAM(2)); + if (ScriptParams[1] == PEDTYPE_COP) + pPed = new CCopPed((eCopType)ScriptParams[2]); + else if (ScriptParams[1] == PEDTYPE_EMERGENCY || ScriptParams[1] == PEDTYPE_FIREMAN) + pPed = new CEmergencyPed(ScriptParams[2]); else - pPed = new CCivilianPed((ePedType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + pPed = new CCivilianPed((ePedType)ScriptParams[1], ScriptParams[2]); pPed->CharCreatedBy = MISSION_CHAR; pPed->bRespondsToThreats = false; pPed->bAllowMedicsToReviveMe = false; @@ -5113,6 +4704,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) pPed->SetPosition(pVehicle->GetPosition()); pPed->SetOrientation(0.0f, 0.0f, 0.0f); pPed->SetPedState(PED_DRIVING); + CPopulation::ms_nTotalMissionPeds++; script_assert(!pVehicle->pDriver); pVehicle->pDriver = pPed; pVehicle->pDriver->RegisterReference((CEntity**)&pVehicle->pDriver); @@ -5127,18 +4719,17 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) pPed->AddInCarAnims(pVehicle, true); pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pPed->GetPosition()); CWorld::Add(pPed); - CPopulation::ms_nTotalMissionPeds++; - SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(pPed)); + ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); + CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); return 0; } case COMMAND_WARP_PLAYER_FROM_CAR_TO_COORD: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(1); - CPlayerInfo* pPlayer = &CWorld::Players[GET_INTEGER_PARAM(0)]; + CVector pos = *(CVector*)&ScriptParams[1]; + CPlayerInfo* pPlayer = &CWorld::Players[ScriptParams[0]]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); if (pPlayer->m_pPed->bInVehicle){ @@ -5181,24 +4772,6 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) return -1; } -void CRunningScript::ReturnFromGosubOrFunction() -{ - uint32 val = m_nIp = m_anStack[--m_nStackPointer]; - if (!(m_nIp & BIT(STACKVALUE_IS_FUNCTION_CALL_BIT))) - return; - if (m_nIp & BIT(STACKVALUE_INVERT_RETURN_BIT)) - m_bCondResult = !m_bCondResult; - m_nIp = m_nIp & STACKVALUE_IP_MASK; - uint8 nInputParameters = CTheScripts::Read1ByteFromScript(&m_nIp); - uint8 nOutputParameters = CTheScripts::Read1ByteFromScript(&m_nIp); - uint8 nLocalsOffset = CTheScripts::Read1ByteFromScript(&m_nIp); - for (int i = 0; i < nOutputParameters; i++) - ScriptParams[i] = m_anLocalVariables[m_nLocalsPointer + nInputParameters + i]; - m_nIp += val >> STACKVALUE_IP_PARAMS_OFFSET; - m_nLocalsPointer -= nLocalsOffset; - StoreParameters(&m_nIp, nOutputParameters); -} - #ifdef MISSION_REPLAY bool CRunningScript::CanAllowMissionReplay() @@ -5269,19 +4842,23 @@ CTheScripts::SwitchToMission(int32 mission) CStats::LastMissionPassedName[0] = '\0'; #endif CTimer::Suspend(); - int offset = CTheScripts::MultiScriptArray[mission] + 8; - int size = CTheScripts::MultiScriptArray[mission + 1] - CTheScripts::MultiScriptArray[mission]; - if (size <= 0) - size = CTheScripts::LargestMissionScriptSize; - CFileMgr::Seek(gScriptsFile, offset, 0); - CFileMgr::Read(gScriptsFile, (const char*)&CTheScripts::ScriptSpace[CTheScripts::MainScriptSize], size); - CRunningScript* pMissionScript = CTheScripts::StartNewScript(CTheScripts::MainScriptSize); + int offset = CTheScripts::MultiScriptArray[mission]; +#ifdef USE_DEBUG_SCRIPT_LOADER + CFileMgr::ChangeDir("\\data\\"); + int handle = CFileMgr::OpenFile(scriptfile, "rb"); + CFileMgr::ChangeDir("\\"); +#else + CFileMgr::ChangeDir("\\"); + int handle = CFileMgr::OpenFile("data\\main.scm", "rb"); +#endif + CFileMgr::Seek(handle, offset, 0); + CFileMgr::Read(handle, (const char*)&CTheScripts::ScriptSpace[SIZE_MAIN_SCRIPT], SIZE_MISSION_SCRIPT); + CFileMgr::CloseFile(handle); + CRunningScript* pMissionScript = CTheScripts::StartNewScript(SIZE_MAIN_SCRIPT); CTimer::Resume(); pMissionScript->m_bIsMissionScript = true; pMissionScript->m_bMissionFlag = true; CTheScripts::bAlreadyRunningAMissionScript = true; - memset(&CTheScripts::ScriptSpace[CTheScripts::NumTrueGlobals * 4 + 8], 0, CTheScripts::MostGlobals * 4); CGameLogic::ClearShortCut(); - pMissionScript->Process(); } #endif diff --git a/src/control/Script.h b/src/control/Script.h index 8b54f28..80c0536 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -1,9 +1,7 @@ #pragma once -#include "Font.h" -#include "Ped.h" +#include "Font.h" #include "PedType.h" #include "Text.h" -#include "sList.h" #include "Sprite2d.h" class CEntity; @@ -19,7 +17,7 @@ class CRunningScript; extern int32 ScriptParams[32]; void FlushLog(); -#define script_assert(_Expression) { FlushLog(); assert(_Expression); } +#define script_assert(_Expression) FlushLog(); assert(_Expression); #define PICKUP_PLACEMENT_OFFSET (0.5f) #define PED_FIND_Z_OFFSET (5.0f) @@ -30,9 +28,9 @@ void FlushLog(); #define UPSIDEDOWN_TURN_SPEED_THRESHOLD (0.02f) #define UPSIDEDOWN_TIMER_THRESHOLD (1000) -#define SPHERE_MARKER_R (255) -#define SPHERE_MARKER_G (255) -#define SPHERE_MARKER_B (128) +#define SPHERE_MARKER_R (252) +#define SPHERE_MARKER_G (138) +#define SPHERE_MARKER_B (242) #define SPHERE_MARKER_A (228) #define SPHERE_MARKER_PULSE_PERIOD 2048 #define SPHERE_MARKER_PULSE_FRACTION 0.1f @@ -49,15 +47,7 @@ void FlushLog(); #define KEY_LENGTH_IN_SCRIPT (8) -#define GET_INTEGER_PARAM(i) (ScriptParams[i]) -#define GET_FLOAT_PARAM(i) (*(float*)&ScriptParams[i]) -#define GET_VECTOR_PARAM(i) (CVector(GET_FLOAT_PARAM(i), GET_FLOAT_PARAM(i+1), GET_FLOAT_PARAM(i+2))) - -#define SET_INTEGER_PARAM(i, x) ScriptParams[i] = x -#define SET_FLOAT_PARAM(i, x) *(float*)&ScriptParams[i] = x -#define SET_VECTOR_PARAM(i, v) { *(float*)&ScriptParams[i] = (v).x; *(float*)&ScriptParams[i+1] = (v).y; *(float*)&ScriptParams[i+2] = (v).z; } - -#define GTA_SCRIPT_COLLECTIVE +//#define GTA_SCRIPT_COLLECTIVE struct intro_script_rectangle { @@ -224,34 +214,16 @@ public: bool HasCarBeenStuckForAWhile(int32); }; -enum { - MAX_STACK_DEPTH = 16, - NUM_LOCAL_VARS = 96, - NUM_TIMERS = 2, - NUM_GLOBAL_SLOTS = 26 -}; - enum { ARGUMENT_END = 0, - ARGUMENT_INT_ZERO, - ARGUMENT_FLOAT_ZERO, - ARGUMENT_FLOAT_1BYTE, - ARGUMENT_FLOAT_2BYTES, - ARGUMENT_FLOAT_3BYTES, ARGUMENT_INT32, + ARGUMENT_GLOBALVAR, + ARGUMENT_LOCALVAR, ARGUMENT_INT8, ARGUMENT_INT16, - ARGUMENT_FLOAT, - ARGUMENT_TIMER, - ARGUMENT_LOCAL = ARGUMENT_TIMER + NUM_TIMERS, - ARGUMENT_LOCAL_ARRAY = ARGUMENT_LOCAL + NUM_LOCAL_VARS, - ARGUMENT_GLOBAL = ARGUMENT_LOCAL_ARRAY + NUM_LOCAL_VARS, - ARGUMENT_GLOBAL_ARRAY = ARGUMENT_GLOBAL + NUM_GLOBAL_SLOTS, - MAX_ARGUMENT = ARGUMENT_GLOBAL_ARRAY + NUM_GLOBAL_SLOTS + ARGUMENT_FLOAT }; -static_assert(MAX_ARGUMENT <= 256, "MAX_ARGUMENT must be less or equal to 256"); - struct tCollectiveData { int32 colIndex; @@ -275,18 +247,11 @@ struct tBuildingSwap int32 m_nOldModel; }; -struct script_corona -{ - int id; - float x; - float y; - float z; - float size; - uint8 r; - uint8 g; - uint8 b; - int type; - int flareType; + +enum { + MAX_STACK_DEPTH = 6, + NUM_LOCAL_VARS = 16, + NUM_TIMERS = 2 }; class CRunningScript @@ -311,25 +276,14 @@ class CRunningScript ORS_8 }; - enum { - STACKVALUE_IP_BITS = 22, - STACKVALUE_INVERT_RETURN_BIT = STACKVALUE_IP_BITS, - STACKVALUE_IS_FUNCTION_CALL_BIT, - STACKVALUE_IP_PARAMS_OFFSET, - - STACKVALUE_IP_MASK = ((1 << STACKVALUE_IP_BITS) - 1) - }; - public: CRunningScript* next; CRunningScript* prev; - int32 m_nId; char m_abScriptName[8]; uint32 m_nIp; uint32 m_anStack[MAX_STACK_DEPTH]; uint16 m_nStackPointer; - int32 m_anLocalVariables[NUM_LOCAL_VARS + 8 + NUM_TIMERS]; // TODO(LCS): figure out why 106 - int32 m_nLocalsPointer; + int32 m_anLocalVariables[NUM_LOCAL_VARS + NUM_TIMERS]; bool m_bIsActive; bool m_bCondResult; bool m_bIsMissionScript; @@ -349,8 +303,8 @@ public: void Load(uint8*& buf); void UpdateTimers(float timeStep) { - for (int i = 0; i < NUM_TIMERS; i++) - m_anLocalVariables[NUM_LOCAL_VARS + 8 + i] += timeStep; + m_anLocalVariables[NUM_LOCAL_VARS] += timeStep; + m_anLocalVariables[NUM_LOCAL_VARS + 1] += timeStep; } void Init(); @@ -361,37 +315,14 @@ public: static const uint32 nSaveStructSize; - void CollectParameters(uint32*, int16, int* pParams = (int*)&ScriptParams); + void CollectParameters(uint32*, int16); int32 CollectNextParameterWithoutIncreasingPC(uint32); int32* GetPointerToScriptVariable(uint32*, int16); void StoreParameters(uint32*, int16); int8 ProcessOneCommand(); void DoDeatharrestCheck(); - void UpdateCompareFlag(bool flag) - { - if (m_bNotFlag) - flag = !flag; - if (m_nAndOrState == ANDOR_NONE) { - m_bCondResult = flag; - return; - } - if (m_nAndOrState >= ANDS_1 && m_nAndOrState <= ANDS_8) { - m_bCondResult &= flag; - if (m_nAndOrState == ANDS_1) { - m_nAndOrState = ANDOR_NONE; - return; - } - } - else { - m_bCondResult |= flag; - if (m_nAndOrState <= ORS_1) { - m_nAndOrState = ANDOR_NONE; - return; - } - } - m_nAndOrState--; - } + void UpdateCompareFlag(bool); int16 GetPadState(uint16, uint16); int8 ProcessCommands0To99(int32); @@ -409,10 +340,7 @@ public: int8 ProcessCommands1200To1299(int32); int8 ProcessCommands1300To1399(int32); int8 ProcessCommands1400To1499(int32); - int8 ProcessCommands1500To1599(int32); - int8 ProcessCommands1600To1699(int32); - uint32 CollectLocateParameters(uint32*, bool); void LocatePlayerCommand(int32, uint32*); void LocatePlayerCharCommand(int32, uint32*); void LocatePlayerCarCommand(int32, uint32*); @@ -450,10 +378,9 @@ public: bool ThisIsAValidRandomCop(uint32 mi, int cop, int swat, int fbi, int army, int miami); bool ThisIsAValidRandomPed(uint32 pedtype, int civ, int gang, int criminal); - bool CheckDamagedWeaponType(int32 actual, int32 type); - - void ReturnFromGosubOrFunction(); + bool CheckDamagedWeaponType(int32 actual, int32 type); + }; @@ -462,31 +389,38 @@ enum { VAR_GLOBAL = 2, }; +enum { +#ifdef PS2 + SIZE_MAIN_SCRIPT = 205512, +#else + SIZE_MAIN_SCRIPT = 225512, +#endif + SIZE_MISSION_SCRIPT = 35000, + SIZE_SCRIPT_SPACE = SIZE_MAIN_SCRIPT + SIZE_MISSION_SCRIPT +}; + enum { MAX_NUM_SCRIPTS = 128, MAX_NUM_INTRO_TEXT_LINES = 48, MAX_NUM_INTRO_RECTANGLES = 16, MAX_NUM_SCRIPT_SRPITES = 16, MAX_NUM_SCRIPT_SPHERES = 16, - MAX_NUM_COLLECTIVES = 32, - MAX_NUM_USED_OBJECTS = 305, - MAX_NUM_MISSION_SCRIPTS = 150, - MAX_NUM_BUILDING_SWAPS = 80, - MAX_NUM_INVISIBILITY_SETTINGS = 52, - MAX_NUM_STORED_LINES = 1024, - MAX_ALLOWED_COLLISIONS = 2 + MAX_NUM_USED_OBJECTS = 220, + MAX_NUM_MISSION_SCRIPTS = 120, + MAX_NUM_BUILDING_SWAPS = 25, + MAX_NUM_INVISIBILITY_SETTINGS = 20, + MAX_NUM_STORED_LINES = 1024 }; class CTheScripts { public: - static uint8* ScriptSpace; + static uint8 ScriptSpace[SIZE_SCRIPT_SPACE]; static CRunningScript ScriptsArray[MAX_NUM_SCRIPTS]; static intro_text_line IntroTextLines[MAX_NUM_INTRO_TEXT_LINES]; static intro_script_rectangle IntroRectangles[MAX_NUM_INTRO_RECTANGLES]; static CSprite2d ScriptSprites[MAX_NUM_SCRIPT_SRPITES]; static script_sphere_struct ScriptSphereArray[MAX_NUM_SCRIPT_SPHERES]; - static tCollectiveData CollectiveArray[MAX_NUM_COLLECTIVES]; static tUsedObject UsedObjectArray[MAX_NUM_USED_OBJECTS]; static int32 MultiScriptArray[MAX_NUM_MISSION_SCRIPTS]; static tBuildingSwap BuildingSwapArray[MAX_NUM_BUILDING_SWAPS]; @@ -518,24 +452,20 @@ public: static uint16 ScriptsUpdated; static uint32 LastMissionPassedTime; static uint16 NumberOfExclusiveMissionScripts; - +#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) +#define CARDS_IN_SUIT (13) +#define NUM_SUITS (4) +#define MAX_DECKS (6) +#define CARDS_IN_DECK (CARDS_IN_SUIT * NUM_SUITS) +#define CARDS_IN_STACK (CARDS_IN_DECK * MAX_DECKS) + static int16 CardStack[CARDS_IN_STACK]; + static int16 CardStackPosition; +#endif static bool bPlayerIsInTheStatium; static uint8 RiotIntensity; static bool bPlayerHasMetDebbieHarry; - static int AllowedCollision[MAX_ALLOWED_COLLISIONS]; - static short* SavedVarIndices; - static int NumSaveVars; - static int FSDestroyedFlag; - static int NextProcessId; - static bool InTheScripts; - static CRunningScript* pCurrent; - static uint16 NumTrueGlobals; - static uint16 MostGlobals; - static base::cSList mCoronas; - static int NextScriptCoronaID; - - static bool Init(bool loaddata = false); + static void Init(); static void Process(); static CRunningScript* StartTestScript(); @@ -545,13 +475,11 @@ public: static void UndoBuildingSwaps(); static void UndoEntityInvisibilitySettings(); - /* static void ScriptDebugLine3D(float x1, float y1, float z1, float x2, float y2, float z2, uint32 col, uint32 col2); static void RenderTheScriptDebugLines(); - */ static void SaveAllScripts(uint8*, uint32*); - static bool LoadAllScripts(uint8*, uint32); + static void LoadAllScripts(uint8*, uint32); static bool IsDebugOn() { return DbgFlag; }; static void InvertDebugFlag() { DbgFlag = !DbgFlag; } @@ -607,12 +535,10 @@ public: static void DrawScriptSpheres(); static void HighlightImportantArea(uint32, float, float, float, float, float); static void HighlightImportantAngledArea(uint32, float, float, float, float, float, float, float, float, float); - /* static void DrawDebugSquare(float, float, float, float); static void DrawDebugAngledSquare(float, float, float, float, float, float, float, float); static void DrawDebugCube(float, float, float, float, float, float); static void DrawDebugAngledCube(float, float, float, float, float, float, float, float, float, float); - */ static void AddToInvisibilitySwapArray(CEntity*, bool); static void AddToBuildingSwapArray(CBuilding*, int32, int32); @@ -621,7 +547,7 @@ public: static int32 AddScriptSphere(int32 id, CVector pos, float radius); static int32 GetNewUniqueScriptSphereIndex(int32 index); static void RemoveScriptSphere(int32 index); - //static void RemoveScriptTextureDictionary(); + static void RemoveScriptTextureDictionary(); public: static void RemoveThisPed(CPed* pPed); @@ -630,10 +556,6 @@ public: static void SwitchToMission(int32 mission); #endif - static int GetSaveVarIndex(int); - static void Shutdown(void); - static void SwapNearestBuildingModel(float, float, float, float, int, int); - #ifdef GTA_SCRIPT_COLLECTIVE static void AdvanceCollectiveIndex() { @@ -653,14 +575,8 @@ public: static void SetObjectiveForAllPedsInCollective(int, eObjective); #endif - static bool IsFortStauntonDestroyed() { return FSDestroyedFlag && *(int32*)&ScriptSpace[FSDestroyedFlag] == 1; } - }; -extern int ScriptParams[32]; - -VALIDATE_SIZE(uStackReturnValue, 4); - #ifdef USE_DEBUG_SCRIPT_LOADER extern int scriptToLoad; #endif @@ -683,7 +599,3 @@ void RetryMission(int, int); #ifdef USE_DEBUG_SCRIPT_LOADER extern int scriptToLoad; #endif - -extern int gScriptsFile; -extern CVector gVectorSetInLua; - diff --git a/src/control/Script10.cpp b/src/control/Script10.cpp deleted file mode 100644 index ac3961a..0000000 --- a/src/control/Script10.cpp +++ /dev/null @@ -1,421 +0,0 @@ -#include "common.h" - -#include "Script.h" -#include "ScriptCommands.h" - -#include "CarCtrl.h" -#include "DMAudio.h" -#include "Frontend.h" -#include "GameLogic.h" -#include "Garages.h" -#include "General.h" -#include "Hud.h" -#include "Messages.h" -#include "Object.h" -#include "Pad.h" -#include "Pickups.h" -#include "PlayerPed.h" -#include "Pools.h" -#include "Vehicle.h" -#include "SpecialFX.h" -#include "Stats.h" -#include "User.h" -#include "Weather.h" -#include "World.h" - -bool gDeveloperFlag; - -int8 CRunningScript::ProcessCommands1600To1699(int32 command) -{ - switch (command) { - case COMMAND_ADD_NOODLES_DELIVERED: - CollectParameters(&m_nIp, 1); - // CStats::NoodlesDelievered += GET_INTEGER_PARAM(0); - return 0; - case COMMAND_REGISTER_SCRAPYARD_CHALLENGE_SCORE: - CollectParameters(&m_nIp, 1); - //CStats::TopScrapyardChallengeScore = Max(CStats::TopScrapyardChallengeScore, GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_REGISTER_9MM_MAYHEM_SCORE: - CollectParameters(&m_nIp, 1); - //CStats::Top9mmMayhemScore = Max(CStats::Top9mmMayhemScore, GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_REGISTER_SCOOTER_SHOOTER_SCORE: - CollectParameters(&m_nIp, 1); - //CStats::TopScooterShooterScore = Max(CStats::TopScooterShooterScore, GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_ADD_MONEY_MADE_FROM_TOURIST: - CollectParameters(&m_nIp, 1); - // CStats::MoneyMadeFromTourist += GET_INTEGER_PARAM(0); - return 0; - case COMMAND_ADD_TOURISTS_TAKEN_TO_SPOTS: - CollectParameters(&m_nIp, 1); - // CStats::TouristsTakenToSpots += GET_INTEGER_PARAM(0); - return 0; - case COMMAND_ADD_EXPORTED_CARS: - CollectParameters(&m_nIp, 1); - // CStats::NumberOfExportedCars += GET_INTEGER_PARAM(0); - return 0; - case COMMAND_SET_TOTAL_EXPORT_CARS: - CollectParameters(&m_nIp, 1); - // CStats::TotalNumberOfCarExport = GET_INTEGER_PARAM(0); - return 0; - case COMMAND_REGISTER_DIRT_BIKE_FASTEST_LAP: - CollectParameters(&m_nIp, 2); - // CStats::RegisterDirtBikeFastestLap(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); - return 0; - case COMMAND_REGISTER_DIRT_BIKE_FASTEST_TIME: - CollectParameters(&m_nIp, 2); - // CStats::RegisterDirtBikeFastestTime(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); - return 0; - case COMMAND_REGISTER_DIRT_BIKE_AIR_TIME: - CollectParameters(&m_nIp, 1); - //CStats::DirtBikeMostAir = Max(CStats::DirtBikeMostAir, GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_ADD_ARROW_3D_MARKER: - { - uint32 ip = m_nIp; - uint32 id = (uint32)(uintptr)GetPointerToScriptVariable(&ip, 0); - CollectParameters(&m_nIp, 10); - CVector pos = GET_VECTOR_PARAM(0); - CVector dir = GET_VECTOR_PARAM(3); - pos.z += GET_FLOAT_PARAM(9) + 7.0f; - //C3dMarkers::PlaceMarker(id, MARKERTYPE_ARROW, pos, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(8), 200, 1, 3.2f, 1, dir, 1.0f, 0, 0); - TODO - return 0; - } - case COMMAND_PRINT_NOW_OVERRIDE_FADE: - { - wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CollectParameters(&m_nIp, 2); - CMessages::AddMessageJumpQ(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); // true, true - return 0; - } - case COMMAND_GET_PICKUP_VALUE: - { - CollectParameters(&m_nIp, 1); - SET_INTEGER_PARAM(0, CPickups::GetValue(GET_INTEGER_PARAM(0))); - return 0; - } - case COMMAND_SET_PICKUP_VALUE: - { - CollectParameters(&m_nIp, 2); - CPickups::SetValue(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); - return 0; - } - case COMMAND_IS_DEVELOPER: - UpdateCompareFlag(gDeveloperFlag); - return 0; - case COMMAND_SET_DEVELOPER_FLAG: - CollectParameters(&m_nIp, 1); - gDeveloperFlag = GET_INTEGER_PARAM(0); - return 0; - case COMMAND_REGISTER_WICHITA_WIPEOUT_SCORE: - CollectParameters(&m_nIp, 1); - //CStats::TopWichitaWipeoutScore = Max(CStats::TopWichitaWipeoutScore, GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_ATTACH_OBJECT_TO_CAR: - { - CollectParameters(&m_nIp, 5); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pObject); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); - script_assert(pVehicle); - CVector offset = GET_VECTOR_PARAM(2); - // pObject->AttachObjectToEntity(pVehicle, offset); - return 0; - } - case COMMAND_DETACH_OBJECT_FROM_CAR: - { - CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pObject); - // if (pObject && pObject->m_pAttachedTo) - // pObject->DettachObjectFromEntity(); - return 0; - } - case COMMAND_SET_PAD_STICKS_MULTIPLIER: - { - CollectParameters(&m_nIp, 2); - CPad::GetPad(0)->unk_B4 = GET_FLOAT_PARAM(0); - CPad::GetPad(0)->unk_B8 = GET_FLOAT_PARAM(1); - return 0; - } - case COMMAND_PRINT_SUBTITLE_NOW: - { - wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CollectParameters(&m_nIp, 2); - if (FrontEndMenuManager.m_PrefsShowSubtitles) - CMessages::AddMessageJumpQ(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); // false, true - else - CMessages::AddToPreviousBriefArray(key, -1, -1, -1, -1, -1, -1, nil); - return 0; - } - case COMMAND_PRINT_SUBTITLE_NOW_OVERRIDE_FADE: - { - wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CollectParameters(&m_nIp, 2); - if (FrontEndMenuManager.m_PrefsShowSubtitles) - CMessages::AddMessageJumpQ(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); // true, true - else - CMessages::AddToPreviousBriefArray(key, -1, -1, -1, -1, -1, -1, nil); - return 0; - } - case COMMAND_PRINT_SUBTITLE_NOW_NO_BRIEF: - { - wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CollectParameters(&m_nIp, 2); - if (FrontEndMenuManager.m_PrefsShowSubtitles) - CMessages::AddMessageJumpQ(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); // false, false - else - CMessages::AddToPreviousBriefArray(key, -1, -1, -1, -1, -1, -1, nil); - return 0; - } - case COMMAND_PRINT_WITH_NUMBER_NOW_NO_BRIEF: - { - wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CollectParameters(&m_nIp, 3); - CMessages::AddMessageJumpQWithNumber(key, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1); // 0 - return 0; - } - case COMMAND_GET_ANGLE_BETWEEN_POINTS: - { - CollectParameters(&m_nIp, 4); - SET_FLOAT_PARAM(0, CGeneral::GetAngleBetweenPoints(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), GET_FLOAT_PARAM(3))); - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_OVERRIDE_CHAR_MOVE_ANIM: - { - CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pPed); - pPed->bOverrideMoveAnim = true; - return 0; - } - case COMMAND_1627: - { - CollectParameters(&m_nIp, 1); - // something related to debug menu, not implemented - return 0; - } - case COMMAND_ENABLE_EMERGENCY_VEHICLES: - { - CollectParameters(&m_nIp, 1); - gbEmergencyVehiclesEnabled = GET_INTEGER_PARAM(0) != 0; - return 0; - } - case COMMAND_ADD_UNLOCKED_COSTUME: - CollectParameters(&m_nIp, 1); - // CStats::AddUnlockedCostume(GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_CLEAR_MULTIPLAYER_SPLASH_SCREEN: - // ClearMultiplayerSplashScreen(); - return 0; - case COMMAND_PRINT_WITH_2_NUMBERS_NOW_NO_BRIEF: - { - wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CollectParameters(&m_nIp, 4); - CMessages::AddMessageJumpQWithNumber(key, GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1); // 0 - return 0; - } - case COMMAND_GET_OBJECT_ORIENTATION: - { - CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pObject); - SET_FLOAT_PARAM(1, LimitAngleOnCircle(RADTODEG(Asin(pObject->GetForward().z)))); - SET_FLOAT_PARAM(2, LimitAngleOnCircle(RADTODEG(Atan2(-pObject->GetForward().x, pObject->GetForward().y)))); - SET_FLOAT_PARAM(0, LimitAngleOnCircle(RADTODEG(Atan2(-pObject->GetRight().z, pObject->GetUp().z)))); - StoreParameters(&m_nIp, 3); - return 0; - } - case COMMAND_SET_OBJECT_ORIENTATION: - { - CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pObject); - pObject->SetOrientation(DEGTORAD(GET_FLOAT_PARAM(2)), DEGTORAD(GET_FLOAT_PARAM(1)), DEGTORAD(GET_FLOAT_PARAM(3))); - return 0; - } - case COMMAND_CHANGE_ONSCREEN_COUNTER_PREFIX: - { - uint16 offset = (uint8*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - CTheScripts::ScriptSpace; - CollectParameters(&m_nIp, 1); - //CUserDisplay::OnscnTimer.ChangeCounterPrefix(offset, GET_INTEGER_PARAMS(0)); - return 0; - } - case COMMAND_STORE_PLAYER_OUTFIT: - { - char tmp[12]; // TODO - CTheScripts::ReadTextLabelFromScript(&m_nIp, tmp); - for (int i = 0; i < KEY_LENGTH_IN_SCRIPT; i++) - CGameLogic::mStoredPlayerOutfit[i] = tmp[i]; - printf("STORED PLAYOUR OUTFIT : %s\n", CGameLogic::mStoredPlayerOutfit); - m_nIp += KEY_LENGTH_IN_SCRIPT; - return 0; - } - case COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_NUMBER_AND_STRING: - { - char onscreen_str1[12]; - uint16 var = (uint8*)GetPointerToScriptVariable(&m_nIp, 0) - CTheScripts::ScriptSpace; - CollectParameters(&m_nIp, 2); - wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); - strncpy(onscreen_str1, (char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); - m_nIp += KEY_LENGTH_IN_SCRIPT; - CUserDisplay::OnscnTimer.AddCounter(var, GET_INTEGER_PARAM(1), onscreen_str1, 0); // TODO - second set of data - return 0; - } - case COMMAND_SET_PLAYER_CURRENT_WEAPON_AMMO_IN_CLIP: - { - CollectParameters(&m_nIp, 1); - CWeapon* pWeapon = FindPlayerPed()->GetWeapon(); - if (pWeapon && GET_INTEGER_PARAM(0)) - pWeapon->m_nAmmoInClip = GET_INTEGER_PARAM(0); - return 0; - } - case COMMAND_SET_CHAR_WAIT_STATE_REPEAT: - { - CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - if (pPed) - pPed->SetWaitState((eWaitState)GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1) >= 0 ? (void*)GET_INTEGER_PARAM(0) : nil); // + true - return 0; - } - case COMMAND_REGISTER_BEST_TIME_GOGO_FAGGIO: - CollectParameters(&m_nIp, 1); - // CStats::RegisterBestTimeGoGoFaggio(GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_LOCK_GARAGE: - CollectParameters(&m_nIp, 2); - CGarages::LockGarage(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); - return 0; - case COMMAND_IS_FINAL_GAME: -#ifdef FINAL - UpdateCompareFlag(true); -#else - UpdateCompareFlag(false); -#endif - return 0; - case COMMAND_SET_ALLOWED_COLLISION: - { - CollectParameters(&m_nIp, 2); - CTheScripts::AllowedCollision[0] = GET_INTEGER_PARAM(0); - CTheScripts::AllowedCollision[1] = GET_INTEGER_PARAM(1); - return 0; - } - case COMMAND_REGISTER_GUARDIAN_ANGEL_LEVEL: - CollectParameters(&m_nIp, 3); - //CStats::GuardianAngelHighestLevel_Ind = Max(CStats::GuardianAngelHighestLevel_Ind, GET_INTEGER_PARAM(0)); - //CStats::GuardianAngelHighestLevel_Com = Max(CStats::GuardianAngelHighestLevel_Com, GET_INTEGER_PARAM(1)); - //CStats::GuardianAngelHighestLevel_Sub = Max(CStats::GuardianAngelHighestLevel_Sub, GET_INTEGER_PARAM(2)); - return 0; - case COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_NUMBER_AND_2_STRINGS: - { - char onscreen_str1[12]; - char onscreen_str2[12]; - uint16 var = (uint8*)GetPointerToScriptVariable(&m_nIp, 0) - CTheScripts::ScriptSpace; - CollectParameters(&m_nIp, 3); - wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); - strncpy(onscreen_str1, (char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); - m_nIp += KEY_LENGTH_IN_SCRIPT; - wchar* text2 = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); - strncpy(onscreen_str2, (char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); - m_nIp += KEY_LENGTH_IN_SCRIPT; - CUserDisplay::OnscnTimer.AddCounter(var, GET_INTEGER_PARAM(1), onscreen_str1, 0); // TODO - second set of data - return 0; - } - case COMMAND_GET_PLAYER_STORED_WEAPON: - { - CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; - script_assert(pPed); - SET_INTEGER_PARAM(0, pPed->m_storedWeapon); - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_DISABLE_PAUSE_MENU: - CollectParameters(&m_nIp, 1); - // FrontEndMenuManager.mDisablePauseMenu = GET_INTEGER_PARAM(0) != 0; // TODO: static + member - return 0; - case COMMAND_IS_CHANNEL_PLAYING: - CollectParameters(&m_nIp, 1); - //UpdateCompareFlag(DMAudio.IsChannelPlaying(GET_INTEGER_PARAM(0)); - UpdateCompareFlag(false); - return 0; - case COMMAND_SET_CLOCK_EVENT_WARNING: - CollectParameters(&m_nIp, 3); - /* - if (CHud::m_ClockEventWarningMinutes || GET_INTEGER_PARAMS(2)){ - CHud::m_ClockEventWarningMinutes = GET_INTEGER_PARAMS(2); - CHud::m_ClockEventMinutes = GET_INTEGER_PARAMS(1); - CHud::m_ClockEventHours = GET_INTEGER_PARAMS(0); - CHud::m_ClockEventFlashTimer = 0; - } - */ - return 0; - case COMMAND_SET_EXTRA_COLOUR_LIGHT_DIRECTION: - CollectParameters(&m_nIp, 3); - // CWeather::ExtraColourLightDir = GET_VECTOR_PARAM(0); - // CWeather::ExtraColourLightDir.Normalise(); - return 0; - case COMMAND_SET_CHAR_CAN_BE_TARGETTED_BY_LEADER: - { - CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pPed); - pPed->bCanBeTargettedByLeader = GET_INTEGER_PARAM(1) != 0; - return 0; - } - case COMMAND_PRINT_HELP_NO_BRIEF: - { - wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CHud::SetHelpMessage(text, false); // + false, false - return 0; - } - case COMMAND_PRINT_HELP_FOREVER_NO_BRIEF: - { - wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CHud::SetHelpMessage(text, false, true); // + false - return 0; - } - case COMMAND_PRINT_HELP_ALWAYS_NO_BRIEF: - { - // CHud::mAlwaysAllowHelpText = true; - wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CHud::SetHelpMessage(text, false); // + false, false - return 0; - } - case COMMAND_PRINT_HELP_FOREVER_ALWAYS_NO_BRIEF: - { - // CHud::mAlwaysAllowHelpText = true; - wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CHud::SetHelpMessage(text, false, true); // + false - return 0; - } - case COMMAND_SET_CAR_IS_REWARD: - { - CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - pVehicle->bRewardVehicle = (GET_INTEGER_PARAM(1) != 0); - return 0; - } - case COMMAND_FREEZE_ALL_PLAYER_FOLLOWERS: - { - CollectParameters(&m_nIp, 2); - CPlayerPed* pPlayerPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; - script_assert(pPlayerPed); - for (int i = 0; i < CPools::GetVehiclePool()->GetSize(); i++) { - CPed* pPed = CPools::GetPedPool()->GetSlot(i); - if (pPed && IsPedPointerValid(pPed)) { - if (pPed->m_leader == pPlayerPed || (pPed->m_objective == OBJECTIVE_FOLLOW_CHAR_IN_FORMATION && pPed->m_pedInObjective == pPlayerPed)) - pPed->bIsFrozen = (GET_INTEGER_PARAM(1) != 0); - } - } - return 0; - } - default: - script_assert(0); - } - return -1; -} \ No newline at end of file diff --git a/src/control/Script2.cpp b/src/control/Script2.cpp index e4c7140..656973c 100644 --- a/src/control/Script2.cpp +++ b/src/control/Script2.cpp @@ -28,8 +28,6 @@ #include "World.h" #include "Zones.h" -// LCS: file done except TODOs - int8 CRunningScript::ProcessCommands300To399(int32 command) { switch (command) { @@ -37,10 +35,12 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) //case COMMAND_SET_PLAYER_INVINCIBLE: //case COMMAND_SET_CHAR_GRAPHIC_TYPE: //case COMMAND_SET_PLAYER_GRAPHIC_TYPE: + /* case COMMAND_HAS_PLAYER_BEEN_ARRESTED: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_WBState == WBSTATE_BUSTED); + UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_WBState == WBSTATE_BUSTED); return 0; + */ //case COMMAND_STOP_CHAR_DRIVING: //case COMMAND_KILL_CHAR: //case COMMAND_SET_FAVOURITE_CAR_MODEL_FOR_CHAR: @@ -49,25 +49,25 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_CHANGE_CAR_LOCK: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->m_nDoorLock = (eCarLock)GET_INTEGER_PARAM(1); + pVehicle->m_nDoorLock = (eCarLock)ScriptParams[1]; return 0; } case COMMAND_SHAKE_CAM_WITH_POINT: CollectParameters(&m_nIp, 4); - TheCamera.CamShake(GET_INTEGER_PARAM(0) / 1000.0f, - GET_FLOAT_PARAM(1), - GET_FLOAT_PARAM(2), - GET_FLOAT_PARAM(3)); + TheCamera.CamShake(ScriptParams[0] / 1000.0f, + *(float*)&ScriptParams[1], + *(float*)&ScriptParams[2], + *(float*)&ScriptParams[3]); return 0; */ case COMMAND_IS_CAR_MODEL: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - UpdateCompareFlag(pVehicle->GetModelIndex() == GET_INTEGER_PARAM(1)); + UpdateCompareFlag(pVehicle->GetModelIndex() == ScriptParams[1]); return 0; } //case COMMAND_IS_CAR_REMAP: @@ -77,15 +77,15 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_IS_CAR_DEAD_IN_AREA_2D: { CollectParameters(&m_nIp, 6); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - float x1 = GET_FLOAT_PARAM(1); - float y1 = GET_FLOAT_PARAM(2); - float x2 = GET_FLOAT_PARAM(3); - float y2 = GET_FLOAT_PARAM(4); + float x1 = *(float*)&ScriptParams[1]; + float y1 = *(float*)&ScriptParams[2]; + float x2 = *(float*)&ScriptParams[3]; + float y2 = *(float*)&ScriptParams[4]; UpdateCompareFlag(pVehicle->GetStatus() == STATUS_WRECKED && pVehicle->IsWithinArea(x1, y1, x2, y2)); - if (GET_INTEGER_PARAM(5)) + if (ScriptParams[5]) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, MAP_Z_LOW_LIMIT); if (CTheScripts::DbgFlag) CTheScripts::DrawDebugSquare(x1, y1, x2, y2); @@ -94,17 +94,17 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_IS_CAR_DEAD_IN_AREA_3D: { CollectParameters(&m_nIp, 8); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - float x1 = GET_FLOAT_PARAM(1); - float y1 = GET_FLOAT_PARAM(2); - float z1 = GET_FLOAT_PARAM(3); - float x2 = GET_FLOAT_PARAM(4); - float y2 = GET_FLOAT_PARAM(5); - float z2 = GET_FLOAT_PARAM(6); + float x1 = *(float*)&ScriptParams[1]; + float y1 = *(float*)&ScriptParams[2]; + float z1 = *(float*)&ScriptParams[3]; + float x2 = *(float*)&ScriptParams[4]; + float y2 = *(float*)&ScriptParams[5]; + float z2 = *(float*)&ScriptParams[6]; UpdateCompareFlag(pVehicle->GetStatus() == STATUS_WRECKED && pVehicle->IsWithinArea(x1, y1, z1, x2, y2, z2)); - if (GET_INTEGER_PARAM(7)) + if (ScriptParams[7]) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, (z1 + z2) / 2); if (CTheScripts::DbgFlag) CTheScripts::DrawDebugCube(x1, y1, z1, x2, y2, z2); @@ -121,45 +121,38 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) //case COMMAND_SET_CAR_FLAMEPROOF: //case COMMAND_SET_CAR_ROCKETPROOF: //case COMMAND_IS_CARBOMB_ACTIVE: - case COMMAND_GIVE_CAR_ALARM: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - pVehicle->m_nAlarmState = -1; - return 0; - } + //case COMMAND_GIVE_CAR_ALARM: //case COMMAND_PUT_CAR_ON_TRAILER: + /* case COMMAND_IS_CAR_CRUSHED: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CGarages::HasCarBeenCrushed(GET_INTEGER_PARAM(0))); + UpdateCompareFlag(CGarages::HasCarBeenCrushed(ScriptParams[0])); return 0; - //case COMMAND_CREATE_GANG_CAR: + */ + //case COMMAND_CREATE_GANG_CAR: case COMMAND_CREATE_CAR_GENERATOR: { CollectParameters(&m_nIp, 12); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z > MAP_Z_LOW_LIMIT) pos.z += 0.015f; - SET_INTEGER_PARAM(0, CTheCarGenerators::CreateCarGenerator( - pos.x, pos.y, pos.z, GET_FLOAT_PARAM(3), - GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), - GET_INTEGER_PARAM(8), GET_INTEGER_PARAM(9), GET_INTEGER_PARAM(10), GET_INTEGER_PARAM(11))); + ScriptParams[0] = CTheCarGenerators::CreateCarGenerator( + pos.x, pos.y, pos.z, *(float*)&ScriptParams[3], + ScriptParams[4], ScriptParams[5], ScriptParams[6], ScriptParams[7], + ScriptParams[8], ScriptParams[9], ScriptParams[10], ScriptParams[11]); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SWITCH_CAR_GENERATOR: { CollectParameters(&m_nIp, 2); - CCarGenerator* pCarGen = &CTheCarGenerators::CarGeneratorArray[GET_INTEGER_PARAM(0)]; - if (GET_INTEGER_PARAM(1) == 0) { + CCarGenerator* pCarGen = &CTheCarGenerators::CarGeneratorArray[ScriptParams[0]]; + if (ScriptParams[1] == 0){ pCarGen->SwitchOff(); - } - else if (GET_INTEGER_PARAM(1) <= 100) { + }else if (ScriptParams[1] <= 100){ pCarGen->SwitchOn(); - pCarGen->SetUsesRemaining(GET_INTEGER_PARAM(1)); - } - else { + pCarGen->SetUsesRemaining(ScriptParams[1]); + }else{ pCarGen->SwitchOn(); } return 0; @@ -169,34 +162,40 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 3); - CUserDisplay::Pager.AddMessage(text, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + CUserDisplay::Pager.AddMessage(text, ScriptParams[0], ScriptParams[1], ScriptParams[2]); return 0; } */ case COMMAND_DISPLAY_ONSCREEN_TIMER: { - uint16 offset = (uint8*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - CTheScripts::ScriptSpace; + script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); + m_nIp++; + uint16 offset = CTheScripts::Read2BytesFromScript(&m_nIp); CollectParameters(&m_nIp, 1); - CUserDisplay::OnscnTimer.AddClock(offset, nil, GET_INTEGER_PARAM(0) != 0); + CUserDisplay::OnscnTimer.AddClock(offset, nil, ScriptParams[0] != 0); return 0; } case COMMAND_CLEAR_ONSCREEN_TIMER: { - uint16 offset = (uint8*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - CTheScripts::ScriptSpace; - CUserDisplay::OnscnTimer.ClearClock(offset); + script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); + m_nIp++; + CUserDisplay::OnscnTimer.ClearClock((uint16)CTheScripts::Read2BytesFromScript(&m_nIp)); return 0; } case COMMAND_DISPLAY_ONSCREEN_COUNTER: { - uint16 counter = (uint8*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - CTheScripts::ScriptSpace; + script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); + m_nIp++; + int16 counter = CTheScripts::Read2BytesFromScript(&m_nIp); CollectParameters(&m_nIp, 1); - CUserDisplay::OnscnTimer.AddCounter(counter, GET_INTEGER_PARAM(0), nil, 0); + CUserDisplay::OnscnTimer.AddCounter(counter, ScriptParams[0], nil, 0); return 0; } case COMMAND_CLEAR_ONSCREEN_COUNTER: { - uint16 counter = (uint8*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - CTheScripts::ScriptSpace; - CUserDisplay::OnscnTimer.ClearCounter(counter); + script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); + m_nIp++; + CUserDisplay::OnscnTimer.ClearCounter((uint16)CTheScripts::Read2BytesFromScript(&m_nIp)); return 0; } case COMMAND_SET_ZONE_CAR_INFO: @@ -220,7 +219,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) return 0; } while (zone >= 0) { - CTheZones::SetZoneCarInfo(zone, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(11), gangDensities); + CTheZones::SetZoneCarInfo(zone, ScriptParams[0], ScriptParams[1], ScriptParams[11], gangDensities); zone = CTheZones::FindNextZoneByLabelAndReturnIndex(label, ZONE_INFO); } return 0; @@ -229,7 +228,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_IS_CHAR_IN_ZONE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); char label[12]; CTheScripts::ReadTextLabelFromScript(&m_nIp, label); @@ -240,70 +239,39 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) UpdateCompareFlag(CTheZones::PointLiesWithinZone(&pos, CTheZones::GetNavigationZone(zone))); return 0; } - case COMMAND_SET_CAR_DENSITY: - { - char label[12]; - CTheScripts::ReadTextLabelFromScript(&m_nIp, label); - int16 zone = CTheZones::FindZoneByLabelAndReturnIndex(label, ZONE_INFO); - m_nIp += 8; - CollectParameters(&m_nIp, 2); - if (zone < 0) { - debug("Couldn't find zone - %s\n", label); - return 0; - } - while (zone >= 0) { - CTheZones::SetCarDensity(zone, ScriptParams[0], ScriptParams[1]); - zone = CTheZones::FindNextZoneByLabelAndReturnIndex(label, ZONE_INFO); - } - return 0; - } - case COMMAND_SET_PED_DENSITY: - { - char label[12]; - CTheScripts::ReadTextLabelFromScript(&m_nIp, label); - int16 zone = CTheZones::FindZoneByLabelAndReturnIndex(label, ZONE_INFO); - m_nIp += KEY_LENGTH_IN_SCRIPT; - CollectParameters(&m_nIp, 2); - if (zone < 0) { - debug("Couldn't find zone - %s\n", label); - return 0; - } - while (zone >= 0) { - CTheZones::SetPedDensity(zone, ScriptParams[0], ScriptParams[1]); - zone = CTheZones::FindNextZoneByLabelAndReturnIndex(label, ZONE_INFO); - } - return 0; - } + //case COMMAND_SET_CAR_DENSITY: + //case COMMAND_SET_PED_DENSITY: case COMMAND_POINT_CAMERA_AT_PLAYER: { CollectParameters(&m_nIp, 3); - TheCamera.TakeControl(nil, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), CAMCONTROL_SCRIPT); + // ScriptParams[0] is unused. + TheCamera.TakeControl(nil, ScriptParams[1], ScriptParams[2], CAMCONTROL_SCRIPT); return 0; } case COMMAND_POINT_CAMERA_AT_CAR: { CollectParameters(&m_nIp, 3); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); if (pVehicle) - TheCamera.TakeControl(pVehicle, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), CAMCONTROL_SCRIPT); + TheCamera.TakeControl(pVehicle, ScriptParams[1], ScriptParams[2], CAMCONTROL_SCRIPT); return 0; } case COMMAND_POINT_CAMERA_AT_CHAR: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); if (pPed) - TheCamera.TakeControl(pPed, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), CAMCONTROL_SCRIPT); + TheCamera.TakeControl(pPed, ScriptParams[1], ScriptParams[2], CAMCONTROL_SCRIPT); return 0; } case COMMAND_RESTORE_CAMERA: TheCamera.Restore(); return 0; - /* - case COMMAND_SHAKE_PAD: - CPad::GetPad(GET_INTEGER_PARAM(0))->StartShake(GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); - return 0; - */ + /* + case COMMAND_SHAKE_PAD: + CPad::GetPad(ScriptParams[0])->StartShake(ScriptParams[1], ScriptParams[2]); + return 0; + */ case COMMAND_SET_ZONE_PED_INFO: { char label[12]; @@ -316,61 +284,61 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) return 0; } while (zone >= 0) { - CTheZones::SetZonePedInfo(zone, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), - GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(8), GET_INTEGER_PARAM(9), GET_INTEGER_PARAM(10), GET_INTEGER_PARAM(11)); + CTheZones::SetZonePedInfo(zone, ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], + ScriptParams[4], ScriptParams[5], ScriptParams[6], ScriptParams[7], ScriptParams[8], ScriptParams[9], ScriptParams[10], ScriptParams[11]); zone = CTheZones::FindNextZoneByLabelAndReturnIndex(label, ZONE_INFO); } return 0; } case COMMAND_SET_TIME_SCALE: CollectParameters(&m_nIp, 1); - CTimer::SetTimeScale(GET_FLOAT_PARAM(0)); + CTimer::SetTimeScale(*(float*)&ScriptParams[0]); return 0; - /* - case COMMAND_IS_CAR_IN_AIR: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle && pVehicle->IsCar()); - CAutomobile* pCar = (CAutomobile*)pVehicle; - UpdateCompareFlag(pCar->GetAllWheelsOffGround()); - return 0; - } - */ + /* + case COMMAND_IS_CAR_IN_AIR: + { + CollectParameters(&m_nIp, 1); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + script_assert(pVehicle && pVehicle->IsCar()); + CAutomobile* pCar = (CAutomobile*)pVehicle; + UpdateCompareFlag(pCar->GetAllWheelsOffGround()); + return 0; + } + */ case COMMAND_SET_FIXED_CAMERA_POSITION: { CollectParameters(&m_nIp, 6); TheCamera.SetCamPositionForFixedMode( - CVector(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2)), - CVector(GET_FLOAT_PARAM(3), GET_FLOAT_PARAM(4), GET_FLOAT_PARAM(5))); + CVector(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1], *(float*)&ScriptParams[2]), + CVector(*(float*)&ScriptParams[3], *(float*)&ScriptParams[4], *(float*)&ScriptParams[5])); return 0; } case COMMAND_POINT_CAMERA_AT_POINT: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - TheCamera.TakeControlNoEntity(pos, GET_INTEGER_PARAM(3), CAMCONTROL_SCRIPT); + TheCamera.TakeControlNoEntity(pos, ScriptParams[3], CAMCONTROL_SCRIPT); return 0; } case COMMAND_ADD_BLIP_FOR_CAR_OLD: { CollectParameters(&m_nIp, 3); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CRadar::SetEntityBlip(BLIP_CAR, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), (eBlipDisplay)GET_INTEGER_PARAM(2))); + ScriptParams[0] = CRadar::SetEntityBlip(BLIP_CAR, ScriptParams[0], ScriptParams[1], (eBlipDisplay)ScriptParams[2]); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_BLIP_FOR_CHAR_OLD: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CRadar::SetEntityBlip(BLIP_CHAR, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), (eBlipDisplay)GET_INTEGER_PARAM(2))); + ScriptParams[0] = CRadar::SetEntityBlip(BLIP_CHAR, ScriptParams[0], ScriptParams[1], (eBlipDisplay)ScriptParams[2]); StoreParameters(&m_nIp, 1); return 0; } @@ -378,61 +346,57 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_ADD_BLIP_FOR_OBJECT_OLD: { CollectParameters(&m_nIp, 3); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CRadar::SetEntityBlip(BLIP_OBJECT, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), (eBlipDisplay)GET_INTEGER_PARAM(2))); + ScriptParams[0] = CRadar::SetEntityBlip(BLIP_OBJECT, ScriptParams[0], ScriptParams[1], (eBlipDisplay)ScriptParams[2]); StoreParameters(&m_nIp, 1); return 0; } */ case COMMAND_REMOVE_BLIP: CollectParameters(&m_nIp, 1); - CRadar::ClearBlip(GET_INTEGER_PARAM(0)); + CRadar::ClearBlip(ScriptParams[0]); return 0; case COMMAND_CHANGE_BLIP_COLOUR: CollectParameters(&m_nIp, 2); - CRadar::ChangeBlipColour(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CRadar::ChangeBlipColour(ScriptParams[0], ScriptParams[1]); return 0; case COMMAND_DIM_BLIP: CollectParameters(&m_nIp, 2); - CRadar::ChangeBlipBrightness(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CRadar::ChangeBlipBrightness(ScriptParams[0], ScriptParams[1]); return 0; case COMMAND_ADD_BLIP_FOR_COORD_OLD: { CollectParameters(&m_nIp, 5); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CRadar::SetCoordBlip(BLIP_COORD, pos, GET_INTEGER_PARAM(3), (eBlipDisplay)GET_INTEGER_PARAM(4))); + ScriptParams[0] = CRadar::SetCoordBlip(BLIP_COORD, pos, ScriptParams[3], (eBlipDisplay)ScriptParams[4]); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_CHANGE_BLIP_SCALE: CollectParameters(&m_nIp, 2); - CRadar::ChangeBlipScale(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CRadar::ChangeBlipScale(ScriptParams[0], ScriptParams[1]); return 0; case COMMAND_SET_FADING_COLOUR: CollectParameters(&m_nIp, 3); - TheCamera.SetFadeColour(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + TheCamera.SetFadeColour(ScriptParams[0], ScriptParams[1], ScriptParams[2]); return 0; case COMMAND_DO_FADE: - { - // unknown empty call on PS2, not mobile CollectParameters(&m_nIp, 2); - float fFadeTime = GET_INTEGER_PARAM(0); - TheCamera.Fade(fFadeTime > 2 ? fFadeTime / 1000.0f : 0.0f, GET_INTEGER_PARAM(1)); + TheCamera.Fade(ScriptParams[0] / 1000.0f, ScriptParams[1]); return 0; - } case COMMAND_GET_FADING_STATUS: UpdateCompareFlag(TheCamera.GetFading()); return 0; case COMMAND_ADD_HOSPITAL_RESTART: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); - float angle = GET_FLOAT_PARAM(3); + CVector pos = *(CVector*)&ScriptParams[0]; + float angle = *(float*)&ScriptParams[3]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRestart::AddHospitalRestartPoint(pos, angle); @@ -441,8 +405,8 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_ADD_POLICE_RESTART: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); - float angle = GET_FLOAT_PARAM(3); + CVector pos = *(CVector*)&ScriptParams[0]; + float angle = *(float*)&ScriptParams[3]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRestart::AddPoliceRestartPoint(pos, angle); @@ -451,8 +415,8 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_OVERRIDE_NEXT_RESTART: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); - float angle = GET_FLOAT_PARAM(3); + CVector pos = *(CVector*)&ScriptParams[0]; + float angle = *(float*)&ScriptParams[3]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRestart::OverrideNextRestart(pos, angle); @@ -462,9 +426,9 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_DRAW_SHADOW: { CollectParameters(&m_nIp, 10); - CVector pos = GET_VECTOR_PARAM(1); - float angle = GET_FLOAT_PARAM(4); - float length = GET_FLOAT_PARAM(5); + CVector pos = *(CVector*)&ScriptParams[1]; + float angle = *(float*)&ScriptParams[4]; + float length = *(float*)&ScriptParams[5]; float x, y; if (angle != 0.0f){ y = cos(angle) * length; @@ -477,40 +441,40 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) float frontY = y; float sideX = y; float sideY = x; - CShadows::StoreShadowToBeRendered(GET_INTEGER_PARAM(0), &pos, frontX, frontY, sideX, sideY, - GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(8), GET_INTEGER_PARAM(9)); + CShadows::StoreShadowToBeRendered(ScriptParams[0], &pos, frontX, frontY, sideX, sideY, + ScriptParams[6], ScriptParams[7], ScriptParams[8], ScriptParams[9]); return 0; } */ case COMMAND_GET_PLAYER_HEADING: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; float angle = pPed->bInVehicle ? pPed->m_pMyVehicle->GetForward().Heading() : pPed->GetForward().Heading(); angle = RADTODEG(angle); if (angle < 0.0f) angle += 360.0f; if (angle > 360.0f) angle -= 360.0f; - SET_FLOAT_PARAM(0, angle); + *(float*)&ScriptParams[0] = angle; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_PLAYER_HEADING: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); if (pPed->bInVehicle) return 0; - pPed->m_fRotationDest = pPed->m_fRotationCur = DEGTORAD(GET_FLOAT_PARAM(1)); - pPed->SetHeading(DEGTORAD(GET_FLOAT_PARAM(1))); + pPed->m_fRotationDest = pPed->m_fRotationCur = DEGTORAD(*(float*)&ScriptParams[1]); + pPed->SetHeading(DEGTORAD(*(float*)&ScriptParams[1])); return 0; } case COMMAND_GET_CHAR_HEADING: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); float angle = pPed->bInVehicle ? pPed->m_pMyVehicle->GetForward().Heading() : pPed->GetForward().Heading(); angle = RADTODEG(angle); @@ -518,25 +482,25 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) angle += 360.0f; if (angle > 360.0f) angle -= 360.0f; - SET_FLOAT_PARAM(0, angle); + *(float*)&ScriptParams[0] = angle; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_CHAR_HEADING: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); if (pPed->bInVehicle) return 0; - pPed->m_fRotationDest = pPed->m_fRotationCur = DEGTORAD(GET_FLOAT_PARAM(1)); - pPed->SetHeading(DEGTORAD(GET_FLOAT_PARAM(1))); + pPed->m_fRotationDest = pPed->m_fRotationCur = DEGTORAD(*(float*)&ScriptParams[1]); + pPed->SetHeading(DEGTORAD(*(float*)&ScriptParams[1])); return 0; } case COMMAND_GET_CAR_HEADING: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); float angle = pVehicle->GetForward().Heading(); angle = RADTODEG(angle); @@ -544,22 +508,22 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) angle += 360.0f; if (angle > 360.0f) angle -= 360.0f; - SET_FLOAT_PARAM(0, angle); + *(float*)&ScriptParams[0] = angle; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_CAR_HEADING: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->SetHeading(DEGTORAD(GET_FLOAT_PARAM(1))); + pVehicle->SetHeading(DEGTORAD(*(float*)&ScriptParams[1])); return 0; } case COMMAND_GET_OBJECT_HEADING: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); float angle = pObject->GetForward().Heading(); angle = RADTODEG(angle); @@ -567,39 +531,39 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) angle += 360.0f; if (angle > 360.0f) angle -= 360.0f; - SET_FLOAT_PARAM(0, angle); + *(float*)&ScriptParams[0] = angle; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_OBJECT_HEADING: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); CWorld::Remove(pObject); - pObject->SetHeading(DEGTORAD(GET_FLOAT_PARAM(1))); + pObject->SetHeading(DEGTORAD(*(float*)&ScriptParams[1])); pObject->GetMatrix().UpdateRW(); pObject->UpdateRwFrame(); CWorld::Add(pObject); return 0; } + /* case COMMAND_IS_PLAYER_TOUCHING_OBJECT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[1]); script_assert(pObject); CPhysical* pEntityToTest = pPed->bInVehicle ? (CPhysical*)pPed->m_pMyVehicle : pPed; UpdateCompareFlag(pEntityToTest->GetHasCollidedWith(pObject)); return 0; } - /* case COMMAND_IS_CHAR_TOUCHING_OBJECT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[1]); script_assert(pObject); CPhysical* pEntityToTest = pPed->bInVehicle ? (CPhysical*)pPed->m_pMyVehicle : pPed; UpdateCompareFlag(pEntityToTest->GetHasCollidedWith(pObject)); @@ -609,119 +573,121 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_SET_PLAYER_AMMO: { CollectParameters(&m_nIp, 3); - CWorld::Players[0].m_pPed->SetAmmo((eWeaponType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + CWorld::Players[0].m_pPed->SetAmmo((eWeaponType)ScriptParams[1], ScriptParams[2]); return 0; } + /* case COMMAND_SET_CHAR_AMMO: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - pPed->SetAmmo((eWeaponType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + pPed->SetAmmo((eWeaponType)ScriptParams[1], ScriptParams[2]); return 0; } + */ //case COMMAND_SET_CAR_AMMO: //case COMMAND_LOAD_CAMERA_SPLINE: //case COMMAND_MOVE_CAMERA_ALONG_SPLINE: //case COMMAND_GET_CAMERA_POSITION_ALONG_SPLINE: case COMMAND_DECLARE_MISSION_FLAG: - CTheScripts::OnAMissionFlag = (uint8*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - CTheScripts::ScriptSpace; + CTheScripts::OnAMissionFlag = (uint16)CTheScripts::Read2BytesFromScript(&++m_nIp); return 0; case COMMAND_DECLARE_MISSION_FLAG_FOR_CONTACT: return 0; - //case COMMAND_DECLARE_BASE_BRIEF_ID_FOR_CONTACT: + //case COMMAND_DECLARE_BASE_BRIEF_ID_FOR_CONTACT: case COMMAND_IS_PLAYER_HEALTH_GREATER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; - UpdateCompareFlag(pPed->m_fHealth > GET_INTEGER_PARAM(1)); + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + UpdateCompareFlag(pPed->m_fHealth > ScriptParams[1]); return 0; } case COMMAND_IS_CHAR_HEALTH_GREATER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - UpdateCompareFlag(pPed->m_fHealth > GET_INTEGER_PARAM(1)); + UpdateCompareFlag(pPed->m_fHealth > ScriptParams[1]); return 0; } case COMMAND_IS_CAR_HEALTH_GREATER: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - UpdateCompareFlag(pVehicle->m_fHealth > GET_INTEGER_PARAM(1)); + UpdateCompareFlag(pVehicle->m_fHealth > ScriptParams[1]); return 0; } case COMMAND_ADD_BLIP_FOR_CAR: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int handle = CRadar::SetEntityBlip(BLIP_CAR, GET_INTEGER_PARAM(0), 0, BLIP_DISPLAY_BOTH); + int handle = CRadar::SetEntityBlip(BLIP_CAR, ScriptParams[0], 0, BLIP_DISPLAY_BOTH); CRadar::ChangeBlipScale(handle, 3); - SET_INTEGER_PARAM(0, handle); + ScriptParams[0] = handle; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_BLIP_FOR_CHAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int handle = CRadar::SetEntityBlip(BLIP_CHAR, GET_INTEGER_PARAM(0), 1, BLIP_DISPLAY_BOTH); + int handle = CRadar::SetEntityBlip(BLIP_CHAR, ScriptParams[0], 1, BLIP_DISPLAY_BOTH); CRadar::ChangeBlipScale(handle, 3); - SET_INTEGER_PARAM(0, handle); + ScriptParams[0] = handle; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_BLIP_FOR_OBJECT: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int handle = CRadar::SetEntityBlip(BLIP_OBJECT, GET_INTEGER_PARAM(0), 6, BLIP_DISPLAY_BOTH); + int handle = CRadar::SetEntityBlip(BLIP_OBJECT, ScriptParams[0], 6, BLIP_DISPLAY_BOTH); CRadar::ChangeBlipScale(handle, 3); - SET_INTEGER_PARAM(0, handle); + ScriptParams[0] = handle; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_BLIP_FOR_CONTACT_POINT: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; 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_CONTACT_POINT, pos, 2, BLIP_DISPLAY_BOTH); CRadar::ChangeBlipScale(handle, 3); - SET_INTEGER_PARAM(0, handle); + ScriptParams[0] = handle; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_BLIP_FOR_COORD: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; 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, 5, BLIP_DISPLAY_BOTH); CRadar::ChangeBlipScale(handle, 3); - SET_INTEGER_PARAM(0, handle); + ScriptParams[0] = handle; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_CHANGE_BLIP_DISPLAY: CollectParameters(&m_nIp, 2); - CRadar::ChangeBlipDisplay(GET_INTEGER_PARAM(0), (eBlipDisplay)GET_INTEGER_PARAM(1)); + CRadar::ChangeBlipDisplay(ScriptParams[0], (eBlipDisplay)ScriptParams[1]); return 0; case COMMAND_ADD_ONE_OFF_SOUND: { CollectParameters(&m_nIp, 4); - switch (GET_INTEGER_PARAM(3)) { + switch (ScriptParams[3]) { case SCRIPT_SOUND_PART_MISSION_COMPLETE: DMAudio.PlayFrontEndSound(SOUND_PART_MISSION_COMPLETE, 0); return 0; @@ -746,20 +712,14 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case SCRIPT_SOUND_IMRAN_ARM_BOMB: DMAudio.PlayFrontEndSound(SOUND_AMMUNATION_IMRAN_ARM_BOMB, 0); return 0; - case 0x46: // TODO - DMAudio.PlayFrontEndSound(0xC4, 0); - return 0; - case 0x47: // TODO - DMAudio.PlayFrontEndSound(0xCD, 0); - return 0; default: break; } - if (!DMAudio.IsAudioInitialised()) // LCS doesn't have it. Why? + if (!DMAudio.IsAudioInitialised()) return 0; cAudioScriptObject* obj = new cAudioScriptObject(); - obj->Posn = GET_VECTOR_PARAM(0); - obj->AudioId = GET_INTEGER_PARAM(3); + obj->Posn = *(CVector*)&ScriptParams[0]; + obj->AudioId = ScriptParams[3]; obj->AudioEntity = AEHANDLE_NONE; DMAudio.CreateOneShotScriptObject(obj); return 0; @@ -767,23 +727,23 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_ADD_CONTINUOUS_SOUND: { CollectParameters(&m_nIp, 4); - if (DMAudio.IsAudioInitialised()) { // LCS doesn't have it. Why? + if (DMAudio.IsAudioInitialised()) { cAudioScriptObject* obj = new cAudioScriptObject(); - obj->Posn = GET_VECTOR_PARAM(0); - obj->AudioId = GET_INTEGER_PARAM(3); + obj->Posn = *(CVector*)&ScriptParams[0]; + obj->AudioId = ScriptParams[3]; obj->AudioEntity = DMAudio.CreateLoopingScriptObject(obj); - SET_INTEGER_PARAM(0, CPools::GetAudioScriptObjectPool()->GetIndex(obj)); + ScriptParams[0] = CPools::GetAudioScriptObjectPool()->GetIndex(obj); } else - SET_INTEGER_PARAM(0, -1); + ScriptParams[0] = -1; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_REMOVE_SOUND: { CollectParameters(&m_nIp, 1); - cAudioScriptObject* obj = CPools::GetAudioScriptObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - if (!obj) { + cAudioScriptObject* obj = CPools::GetAudioScriptObjectPool()->GetAt(ScriptParams[0]); + if (!obj){ debug("REMOVE_SOUND - Sound doesn't exist\n"); return 0; } @@ -794,9 +754,9 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_IS_CAR_STUCK_ON_ROOF: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - UpdateCompareFlag(CTheScripts::UpsideDownCars.HasCarBeenUpsideDownForAWhile(GET_INTEGER_PARAM(0))); + UpdateCompareFlag(CTheScripts::UpsideDownCars.HasCarBeenUpsideDownForAWhile(ScriptParams[0])); return 0; } default: @@ -811,22 +771,22 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_ADD_UPSIDEDOWN_CAR_CHECK: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - CTheScripts::UpsideDownCars.AddCarToCheck(GET_INTEGER_PARAM(0)); + CTheScripts::UpsideDownCars.AddCarToCheck(ScriptParams[0]); return 0; } case COMMAND_REMOVE_UPSIDEDOWN_CAR_CHECK: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - CTheScripts::UpsideDownCars.RemoveCarFromCheck(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CTheScripts::UpsideDownCars.RemoveCarFromCheck(ScriptParams[0]); return 0; } case COMMAND_SET_CHAR_OBJ_WAIT_ON_FOOT: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_WAIT_ON_FOOT); @@ -835,7 +795,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_FLEE_ON_FOOT_TILL_SAFE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE); @@ -844,31 +804,32 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_GUARD_SPOT: { CollectParameters(&m_nIp, 4); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_GUARD_SPOT, pos); return 0; } + /* case COMMAND_SET_CHAR_OBJ_GUARD_AREA: { CollectParameters(&m_nIp, 5); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - float infX = GET_FLOAT_PARAM(1); - float infY = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(1); + float infX = *(float*)&ScriptParams[1]; + float infY = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + if (infX > supX){ + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[1]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(2); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[2]; } CVector pos; pos.x = (infX + supX) / 2; @@ -882,12 +843,13 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_WAIT_IN_CAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_WAIT_IN_CAR); return 0; } + */ case COMMAND_IS_PLAYER_IN_AREA_ON_FOOT_2D: case COMMAND_IS_PLAYER_IN_AREA_IN_CAR_2D: case COMMAND_IS_PLAYER_STOPPED_IN_AREA_2D: @@ -925,17 +887,17 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_GIVE_WEAPON_TO_PLAYER: { CollectParameters(&m_nIp, 3); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - pPed->m_nSelectedWepSlot = pPed->GiveWeapon((eWeaponType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + pPed->m_nSelectedWepSlot = pPed->GiveWeapon((eWeaponType)ScriptParams[1], ScriptParams[2]); return 0; } case COMMAND_GIVE_WEAPON_TO_CHAR: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->SetCurrentWeapon(pPed->GiveWeapon((eWeaponType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2))); + pPed->SetCurrentWeapon(pPed->GiveWeapon((eWeaponType)ScriptParams[1], ScriptParams[2])); if (pPed->bInVehicle && pPed->m_pMyVehicle) pPed->RemoveWeaponModel(CWeaponInfo::GetWeaponInfo(pPed->m_weapons[pPed->m_currentWeapon].m_eWeaponType)->m_nModelId); return 0; @@ -944,35 +906,23 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_PLAYER_CONTROL: { CollectParameters(&m_nIp, 2); - CPlayerInfo* pPlayer = &CWorld::Players[GET_INTEGER_PARAM(0)]; - if (FindPlayerPed()) { - if (FindPlayerPed()->GetPedState() != PED_JUMP) { - FindPlayerPed()->bIsLanding = false; - FindPlayerPed()->bIsInTheAir = false; - } - FindPlayerPed()->RestoreHeadingRate(); - } - if (GET_INTEGER_PARAM(1)) { + CPlayerInfo* pPlayer = &CWorld::Players[ScriptParams[0]]; + if (ScriptParams[1]){ pPlayer->MakePlayerSafe(false); - if (FindPlayerPed()->GetStatus() != PED_DRIVING && !FindPlayerPed()->m_attachedTo) { - // FindPlayerPed()->SetIdleAndResetAnim(); // TODO! - } - } - else { + if (strcmp(m_abScriptName, "serg1") == 0) // Four Iron + pPlayer->m_pPed->ClearFollowPath(); + }else{ pPlayer->MakePlayerSafe(true); - if (FindPlayerPed()->GetPedState() > PED_STATES_NO_AI && FindPlayerPed()->GetPedState() != PED_DRIVING && TheCamera.GetScreenFadeStatus() == FADE_2) { - // FindPlayerPed()->SetIdleAndResetAnim(); // TODO! - } } return 0; } case COMMAND_FORCE_WEATHER: CollectParameters(&m_nIp, 1); - CWeather::ForceWeather(GET_INTEGER_PARAM(0)); + CWeather::ForceWeather(ScriptParams[0]); return 0; case COMMAND_FORCE_WEATHER_NOW: CollectParameters(&m_nIp, 1); - CWeather::ForceWeatherNow(GET_INTEGER_PARAM(0)); + CWeather::ForceWeatherNow(ScriptParams[0]); return 0; case COMMAND_RELEASE_WEATHER: CWeather::ReleaseWeather(); @@ -980,9 +930,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CURRENT_PLAYER_WEAPON: { CollectParameters(&m_nIp, 2); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; - for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) { - if (pPed->m_weapons[i].m_eWeaponType == GET_INTEGER_PARAM(1)) + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++){ + if (pPed->m_weapons[i].m_eWeaponType == ScriptParams[1]) pPed->m_nSelectedWepSlot = i; } return 0; @@ -990,9 +940,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CURRENT_CHAR_WEAPON: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) { - if (pPed->m_weapons[i].m_eWeaponType == GET_INTEGER_PARAM(1)) + if (pPed->m_weapons[i].m_eWeaponType == ScriptParams[1]) pPed->SetCurrentWeapon(i); } return 0; @@ -1001,18 +951,18 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_GET_OBJECT_COORDINATES: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - SET_VECTOR_PARAM(0, pObject->GetPosition()); + *(CVector*)&ScriptParams[0] = pObject->GetPosition(); StoreParameters(&m_nIp, 3); return 0; } case COMMAND_SET_OBJECT_COORDINATES: { CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pObject->Teleport(pos); @@ -1020,13 +970,13 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) return 0; } case COMMAND_GET_GAME_TIMER: - SET_INTEGER_PARAM(0, CTimer::GetTimeInMilliseconds()); + ScriptParams[0] = CTimer::GetTimeInMilliseconds(); StoreParameters(&m_nIp, 1); return 0; case COMMAND_TURN_CHAR_TO_FACE_COORD: { CollectParameters(&m_nIp, 4); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); CVehicle* pVehicle; CVector pos; @@ -1038,11 +988,11 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) pos = pVehicle->GetPosition(); else pos = pPed->GetPosition(); - float heading = CGeneral::GetATanOfXY(pos.x - GET_FLOAT_PARAM(1), pos.y - GET_FLOAT_PARAM(2)); + float heading = CGeneral::GetATanOfXY(pos.x - *(float*)&ScriptParams[1], pos.y - *(float*)&ScriptParams[2]); heading += HALFPI; if (heading > TWOPI) heading -= TWOPI; - if (!pVehicle) { + if (!pVehicle){ pPed->m_fRotationCur = heading; pPed->m_fRotationDest = heading; pPed->SetHeading(heading); @@ -1052,7 +1002,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_TURN_PLAYER_TO_FACE_COORD: { CollectParameters(&m_nIp, 4); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); CVehicle* pVehicle; CVector pos; @@ -1064,7 +1014,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) pos = pVehicle->GetPosition(); else pos = pPed->GetPosition(); - float heading = CGeneral::GetATanOfXY(pos.x - GET_FLOAT_PARAM(1), pos.y - GET_FLOAT_PARAM(2)); + float heading = CGeneral::GetATanOfXY(pos.x - *(float*)&ScriptParams[1], pos.y - *(float*)&ScriptParams[2]); heading += HALFPI; if (heading > TWOPI) heading -= TWOPI; @@ -1078,16 +1028,16 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_STORE_WANTED_LEVEL: { CollectParameters(&m_nIp, 1); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - SET_INTEGER_PARAM(0, pPed->m_pWanted->GetWantedLevel()); + ScriptParams[0] = pPed->m_pWanted->GetWantedLevel(); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_IS_CAR_STOPPED: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); UpdateCompareFlag(CTheScripts::IsVehicleStopped(pVehicle)); return 0; @@ -1095,94 +1045,94 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_MARK_CHAR_AS_NO_LONGER_NEEDED: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); CTheScripts::CleanUpThisPed(pPed); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR); return 0; } case COMMAND_MARK_CAR_AS_NO_LONGER_NEEDED: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); CTheScripts::CleanUpThisVehicle(pVehicle); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR); return 0; } case COMMAND_MARK_OBJECT_AS_NO_LONGER_NEEDED: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); CTheScripts::CleanUpThisObject(pObject); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_OBJECT); + CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT); return 0; } case COMMAND_DONT_REMOVE_CHAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR); return 0; } case COMMAND_DONT_REMOVE_CAR: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR); return 0; } case COMMAND_DONT_REMOVE_OBJECT: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_OBJECT); + CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT); return 0; } case COMMAND_CREATE_CHAR_AS_PASSENGER: { CollectParameters(&m_nIp, 4); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - switch (GET_INTEGER_PARAM(2)) { + switch (ScriptParams[2]) { case MI_COP: - if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) - SET_INTEGER_PARAM(2, COP_STREET); + if (ScriptParams[1] == PEDTYPE_COP) + ScriptParams[2] = COP_STREET; break; case MI_SWAT: - if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) - SET_INTEGER_PARAM(2, COP_SWAT); + if (ScriptParams[1] == PEDTYPE_COP) + ScriptParams[2] = COP_SWAT; break; case MI_FBI: - if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) - SET_INTEGER_PARAM(2, COP_FBI); + if (ScriptParams[1] == PEDTYPE_COP) + ScriptParams[2] = COP_FBI; break; case MI_ARMY: - if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) - SET_INTEGER_PARAM(2, COP_ARMY); + if (ScriptParams[1] == PEDTYPE_COP) + ScriptParams[2] = COP_ARMY; break; case MI_MEDIC: - if (GET_INTEGER_PARAM(1) == PEDTYPE_EMERGENCY) - SET_INTEGER_PARAM(2, PEDTYPE_EMERGENCY); + if (ScriptParams[1] == PEDTYPE_EMERGENCY) + ScriptParams[2] = PEDTYPE_EMERGENCY; break; case MI_FIREMAN: - if (GET_INTEGER_PARAM(1) == PEDTYPE_FIREMAN) - SET_INTEGER_PARAM(2, PEDTYPE_FIREMAN); + if (ScriptParams[1] == PEDTYPE_FIREMAN) + ScriptParams[2] = PEDTYPE_FIREMAN; break; default: break; } CPed* pPed; - if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) - pPed = new CCopPed((eCopType)GET_INTEGER_PARAM(2)); - else if (GET_INTEGER_PARAM(1) == PEDTYPE_EMERGENCY || GET_INTEGER_PARAM(1) == PEDTYPE_FIREMAN) - pPed = new CEmergencyPed(GET_INTEGER_PARAM(2)); + if (ScriptParams[1] == PEDTYPE_COP) + pPed = new CCopPed((eCopType)ScriptParams[2]); + else if (ScriptParams[1] == PEDTYPE_EMERGENCY || ScriptParams[1] == PEDTYPE_FIREMAN) + pPed = new CEmergencyPed(ScriptParams[2]); else - pPed = new CCivilianPed((ePedType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + pPed = new CCivilianPed((ePedType)ScriptParams[1], ScriptParams[2]); pPed->CharCreatedBy = MISSION_CHAR; pPed->bRespondsToThreats = false; pPed->bAllowMedicsToReviveMe = false; @@ -1193,8 +1143,8 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) pPed->SetOrientation(0.0f, 0.0f, 0.0f); CPopulation::ms_nTotalMissionPeds++; CWorld::Add(pPed); - if (GET_INTEGER_PARAM(3) >= 0) - pVehicle->AddPassenger(pPed, GET_INTEGER_PARAM(3)); + if (ScriptParams[3] >= 0) + pVehicle->AddPassenger(pPed, ScriptParams[3]); else pVehicle->AddPassenger(pPed); pPed->m_pMyVehicle = pVehicle; @@ -1204,18 +1154,18 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) pPed->bUsesCollision = false; pPed->AddInCarAnims(pVehicle, false); pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pPed->GetPosition()); - SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(pPed)); + ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); + CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); return 0; } case COMMAND_SET_CHAR_OBJ_KILL_CHAR_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, pTarget); return 0; @@ -1223,9 +1173,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_KILL_PLAYER_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CPed* pTarget = CWorld::Players[ScriptParams[1]].m_pPed; pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, pTarget); return 0; @@ -1233,9 +1183,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_KILL_CHAR_ANY_MEANS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_KILL_CHAR_ANY_MEANS, pTarget); return 0; @@ -1243,9 +1193,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_KILL_PLAYER_ANY_MEANS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CPed* pTarget = CWorld::Players[ScriptParams[1]].m_pPed; pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_KILL_CHAR_ANY_MEANS, pTarget); return 0; @@ -1254,9 +1204,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_FLEE_CHAR_ON_FOOT_TILL_SAFE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pTarget); return 0; @@ -1265,9 +1215,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_FLEE_PLAYER_ON_FOOT_TILL_SAFE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CPed* pTarget = CWorld::Players[ScriptParams[1]].m_pPed; pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pTarget); return 0; @@ -1275,9 +1225,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_FLEE_CHAR_ON_FOOT_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pTarget); return 0; @@ -1285,9 +1235,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_FLEE_PLAYER_ON_FOOT_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CPed* pTarget = CWorld::Players[ScriptParams[1]].m_pPed; pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pTarget); return 0; @@ -1295,9 +1245,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_GOTO_CHAR_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_GOTO_CHAR_ON_FOOT, pTarget); return 0; @@ -1305,9 +1255,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_GOTO_PLAYER_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CPed* pTarget = CWorld::Players[ScriptParams[1]].m_pPed; pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_GOTO_CHAR_ON_FOOT, pTarget); return 0; @@ -1315,9 +1265,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_LEAVE_CAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_LEAVE_CAR, pVehicle); return 0; @@ -1325,9 +1275,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_ENTER_CAR_AS_PASSENGER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_ENTER_CAR_AS_PASSENGER, pVehicle); return 0; @@ -1335,9 +1285,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_ENTER_CAR_AS_DRIVER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_ENTER_CAR_AS_DRIVER, pVehicle); return 0; @@ -1347,9 +1297,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_DESTROY_OBJECT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[1]); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_DESTROY_OBJECT, pObject); return 0; @@ -1357,29 +1307,30 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_DESTROY_CAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_DESTROY_CAR, pVehicle); return 0; } + /* case COMMAND_SET_CHAR_OBJ_GOTO_AREA_ON_FOOT: { CollectParameters(&m_nIp, 5); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - float infX = GET_FLOAT_PARAM(1); - float infY = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); + float infX = *(float*)&ScriptParams[1]; + float infY = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(1); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[1]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(2); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[2]; } CVector pos; pos.x = (infX + supX) / 2; @@ -1390,31 +1341,32 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) pPed->SetObjective(OBJECTIVE_GOTO_AREA_ON_FOOT, pos, radius); return 0; } + */ //case COMMAND_SET_CHAR_OBJ_GOTO_AREA_IN_CAR: //case COMMAND_SET_CHAR_OBJ_FOLLOW_CAR_ON_FOOT_WITH_OFFSET: //case COMMAND_SET_CHAR_OBJ_GUARD_ATTACK: case COMMAND_SET_CHAR_AS_LEADER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); pPed->SetObjective(OBJECTIVE_SET_LEADER, pTarget); return 0; } case COMMAND_SET_PLAYER_AS_LEADER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CPed* pTarget = CWorld::Players[ScriptParams[1]].m_pPed; pPed->SetObjective(OBJECTIVE_SET_LEADER, pTarget); return 0; } case COMMAND_LEAVE_GROUP: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->ClearLeader(); return 0; @@ -1422,66 +1374,60 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_FOLLOW_ROUTE: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; - pPed->SetObjective(OBJECTIVE_FOLLOW_ROUTE, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + pPed->SetObjective(OBJECTIVE_FOLLOW_ROUTE, ScriptParams[1], ScriptParams[2]); return 0; } case COMMAND_ADD_ROUTE_POINT: { CollectParameters(&m_nIp, 4); - CRouteNode::AddRoutePoint(GET_INTEGER_PARAM(0), GET_VECTOR_PARAM(1)); + CRouteNode::AddRoutePoint(ScriptParams[0], *(CVector*)&ScriptParams[1]); return 0; } case COMMAND_PRINT_WITH_NUMBER_BIG: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 3); - CMessages::AddBigMessageWithNumber(text, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2) - 1, GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1); + CMessages::AddBigMessageWithNumber(text, ScriptParams[1], ScriptParams[2] - 1, ScriptParams[0], -1, -1, -1, -1, -1); return 0; } case COMMAND_PRINT_WITH_NUMBER: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 3); - CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1); + CMessages::AddMessageWithNumber(text, ScriptParams[1], ScriptParams[2], ScriptParams[0], -1, -1, -1, -1, -1); return 0; } case COMMAND_PRINT_WITH_NUMBER_NOW: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 3); - CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1); // 1 - return 0; - } - case COMMAND_PRINT_WITH_NUMBER_SOON: - { - wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CollectParameters(&m_nIp, 3); - CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1); + CMessages::AddMessageJumpQWithNumber(text, ScriptParams[1], ScriptParams[2], ScriptParams[0], -1, -1, -1, -1, -1); return 0; } + //case COMMAND_PRINT_WITH_NUMBER_SOON: case COMMAND_SWITCH_ROADS_ON: { CollectParameters(&m_nIp, 6); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); - if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(0); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + float supZ = *(float*)&ScriptParams[5]; + if (infX > supX){ + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[0]; } - if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(1); + if (infY > supY){ + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[1]; } - if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(2); + if (infZ > supZ){ + infZ = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[2]; } ThePaths.SwitchRoadsOffInArea(infX, supX, infY, supY, infZ, supZ, false); return 0; @@ -1489,23 +1435,23 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SWITCH_ROADS_OFF: { CollectParameters(&m_nIp, 6); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + float supZ = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(0); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[0]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(1); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[1]; } if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(2); + infZ = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[2]; } ThePaths.SwitchRoadsOffInArea(infX, supX, infY, supY, infZ, supZ, true); return 0; @@ -1513,83 +1459,85 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_GET_NUMBER_OF_PASSENGERS: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - SET_INTEGER_PARAM(0, pVehicle->m_nNumPassengers); + ScriptParams[0] = pVehicle->m_nNumPassengers; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_GET_MAXIMUM_NUMBER_OF_PASSENGERS: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - SET_INTEGER_PARAM(0, pVehicle->m_nNumMaxPassengers); + ScriptParams[0] = pVehicle->m_nNumMaxPassengers; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_CAR_DENSITY_MULTIPLIER: { CollectParameters(&m_nIp, 1); - CCarCtrl::CarDensityMultiplier = GET_FLOAT_PARAM(0); + CCarCtrl::CarDensityMultiplier = *(float*)&ScriptParams[0]; return 0; } case COMMAND_SET_CAR_HEAVY: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - if (GET_INTEGER_PARAM(1) != 0) { + if (ScriptParams[1] != 0) { pVehicle->bIsHeavy = true; - pVehicle->m_fMass = 3.0f * pVehicle->pHandling->fMass; // TODO: tHandlingData::GetMass() - pVehicle->m_fTurnMass = 5.0f * pVehicle->pHandling->fTurnMass; // TODO: tHandlingData::GetTurnMass() + pVehicle->m_fMass = 3.0f * pVehicle->pHandling->fMass; + pVehicle->m_fTurnMass = 5.0f * pVehicle->pHandling->fTurnMass; } else { pVehicle->bIsHeavy = false; - pVehicle->m_fMass = pVehicle->pHandling->fMass; // TODO: tHandlingData::GetMass() - pVehicle->m_fTurnMass = pVehicle->pHandling->fTurnMass; // TODO: tHandlingData::GetTurnMass() + pVehicle->m_fMass = pVehicle->pHandling->fMass; + pVehicle->m_fTurnMass = pVehicle->pHandling->fTurnMass; } return 0; } case COMMAND_CLEAR_CHAR_THREAT_SEARCH: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->m_fearFlags = 0; return 0; } + /* case COMMAND_ACTIVATE_CRANE: { CollectParameters(&m_nIp, 10); - float infX = GET_FLOAT_PARAM(2); - float infY = GET_FLOAT_PARAM(3); - float supX = GET_FLOAT_PARAM(4); - float supY = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[2]; + float infY = *(float*)&ScriptParams[3]; + float supX = *(float*)&ScriptParams[4]; + float supY = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(4); - supX = GET_FLOAT_PARAM(2); + infX = *(float*)&ScriptParams[4]; + supX = *(float*)&ScriptParams[2]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(5); - supY = GET_FLOAT_PARAM(3); + infY = *(float*)&ScriptParams[5]; + supY = *(float*)&ScriptParams[3]; } CCranes::ActivateCrane(infX, supX, infY, supY, - GET_FLOAT_PARAM(6), GET_FLOAT_PARAM(7), GET_FLOAT_PARAM(8), - DEGTORAD(GET_FLOAT_PARAM(9)), false, false, - GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1)); + *(float*)&ScriptParams[6], *(float*)&ScriptParams[7], *(float*)&ScriptParams[8], + DEGTORAD(*(float*)&ScriptParams[9]), false, false, + *(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); return 0; } case COMMAND_DEACTIVATE_CRANE: { CollectParameters(&m_nIp, 2); - CCranes::DeActivateCrane(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1)); + CCranes::DeActivateCrane(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); return 0; } + */ case COMMAND_SET_MAX_WANTED_LEVEL: { CollectParameters(&m_nIp, 1); - CWanted::SetMaximumWantedLevel(GET_INTEGER_PARAM(0)); + CWanted::SetMaximumWantedLevel(ScriptParams[0]); return 0; } //case COMMAND_SAVE_VAR_INT: @@ -1597,7 +1545,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_IS_CAR_IN_AIR_PROPER: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); UpdateCompareFlag(pVehicle->m_nCollisionRecords == 0); return 0; diff --git a/src/control/Script3.cpp b/src/control/Script3.cpp index 64014ac..acd3988 100644 --- a/src/control/Script3.cpp +++ b/src/control/Script3.cpp @@ -6,7 +6,6 @@ #include "Boat.h" #include "CarCtrl.h" #include "Clock.h" -#include "ColStore.h" #include "Coronas.h" #include "Cranes.h" #include "CutsceneMgr.h" @@ -37,25 +36,23 @@ #include "Bike.h" #include "Wanted.h" -// LCS: file done except TODOs - int8 CRunningScript::ProcessCommands500To599(int32 command) { switch (command) { case COMMAND_IS_CAR_UPSIDEDOWN: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - UpdateCompareFlag(pVehicle->GetUp().z <= UPSIDEDOWN_UP_THRESHOLD); + UpdateCompareFlag(pVehicle->GetUp().z <= -0.97f); return 0; } case COMMAND_GET_PLAYER_CHAR: { CollectParameters(&m_nIp, 1); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(pPed)); + ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); StoreParameters(&m_nIp, 1); return 0; } @@ -65,9 +62,9 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_SET_POLICE_IGNORE_PLAYER: { CollectParameters(&m_nIp, 2); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - if (GET_INTEGER_PARAM(1)) { + if (ScriptParams[1]) { pPed->m_pWanted->m_bIgnoredByCops = true; CWorld::StopAllLawEnforcersInTheirTracks(); } @@ -81,8 +78,8 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 4); - CUserDisplay::Pager.AddMessageWithNumber(text, GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1, - GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3)); + CUserDisplay::Pager.AddMessageWithNumber(text, ScriptParams[0], -1, -1, -1, -1, -1, + ScriptParams[1], ScriptParams[2], ScriptParams[3]); return 0; } */ @@ -90,21 +87,21 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 8); - CDarkel::StartFrenzy((eWeaponType)GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), - GET_INTEGER_PARAM(3), text, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), - GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7) != 0, false); + CDarkel::StartFrenzy((eWeaponType)ScriptParams[0], ScriptParams[1], ScriptParams[2], + ScriptParams[3], text, ScriptParams[4], ScriptParams[5], + ScriptParams[6], ScriptParams[7] != 0, false); return 0; } case COMMAND_READ_KILL_FRENZY_STATUS: { - SET_INTEGER_PARAM(0, CDarkel::ReadStatus()); + ScriptParams[0] = CDarkel::ReadStatus(); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SQRT: { CollectParameters(&m_nIp, 1); - SET_FLOAT_PARAM(0, Sqrt(GET_FLOAT_PARAM(0))); + *(float*)&ScriptParams[0] = Sqrt(*(float*)&ScriptParams[0]); StoreParameters(&m_nIp, 1); return 0; } @@ -126,40 +123,39 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) return 0; case COMMAND_GENERATE_RANDOM_FLOAT_IN_RANGE: CollectParameters(&m_nIp, 2); - SET_FLOAT_PARAM(0, CGeneral::GetRandomNumberInRange(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1))); + *(float*)&ScriptParams[0] = CGeneral::GetRandomNumberInRange(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); StoreParameters(&m_nIp, 1); return 0; case COMMAND_GENERATE_RANDOM_INT_IN_RANGE: CollectParameters(&m_nIp, 2); - SET_INTEGER_PARAM(0, CGeneral::GetRandomNumberInRange(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1))); + ScriptParams[0] = CGeneral::GetRandomNumberInRange(ScriptParams[0], ScriptParams[1]); StoreParameters(&m_nIp, 1); return 0; case COMMAND_LOCK_CAR_DOORS: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->m_nDoorLock = (eCarLock)GET_INTEGER_PARAM(1); + pVehicle->m_nDoorLock = (eCarLock)ScriptParams[1]; return 0; } case COMMAND_EXPLODE_CAR: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->bCanBeDamaged = true; pVehicle->BlowUpCar(nil); return 0; } case COMMAND_ADD_EXPLOSION: CollectParameters(&m_nIp, 4); - CExplosion::AddExplosion(nil, nil, (eExplosionType)GET_INTEGER_PARAM(3), GET_VECTOR_PARAM(0), 0, true); // last argument is 0 (default? - TODO) + CExplosion::AddExplosion(nil, nil, (eExplosionType)ScriptParams[3], *(CVector*)&ScriptParams[0], 0, true); return 0; case COMMAND_IS_CAR_UPRIGHT: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); UpdateCompareFlag(pVehicle->GetUp().z >= 0.0f); return 0; @@ -167,8 +163,8 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_TURN_CHAR_TO_FACE_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pSourcePed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - CPed* pTargetPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pSourcePed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); CVehicle* pVehicle = pSourcePed->bInVehicle ? pSourcePed->m_pMyVehicle : nil; CVector2D sourcePos = pSourcePed->bInVehicle ? pVehicle->GetPosition() : pSourcePed->GetPosition(); CVector2D targetPos = pTargetPed->bInVehicle ? pTargetPed->m_pMyVehicle->GetPosition() : pTargetPed->GetPosition(); @@ -185,8 +181,8 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_TURN_CHAR_TO_FACE_PLAYER: { CollectParameters(&m_nIp, 2); - CPed* pSourcePed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - CPed* pTargetPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CPed* pSourcePed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pTargetPed = CWorld::Players[ScriptParams[1]].m_pPed; CVehicle* pVehicle = pSourcePed->bInVehicle ? pSourcePed->m_pMyVehicle : nil; CVector2D sourcePos = pSourcePed->bInVehicle ? pVehicle->GetPosition() : pSourcePed->GetPosition(); CVector2D targetPos = pTargetPed->bInVehicle ? pTargetPed->m_pMyVehicle->GetPosition() : pTargetPed->GetPosition(); @@ -203,8 +199,8 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_TURN_PLAYER_TO_FACE_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pSourcePed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; - CPed* pTargetPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pSourcePed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); CVehicle* pVehicle = pSourcePed->bInVehicle ? pSourcePed->m_pMyVehicle : nil; CVector2D sourcePos = pSourcePed->bInVehicle ? pVehicle->GetPosition() : pSourcePed->GetPosition(); CVector2D targetPos = pTargetPed->bInVehicle ? pTargetPed->m_pMyVehicle->GetPosition() : pTargetPed->GetPosition(); @@ -221,11 +217,11 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_SET_CHAR_OBJ_GOTO_COORD_ON_FOOT: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); CVector target; - target.x = GET_FLOAT_PARAM(1); - target.y = GET_FLOAT_PARAM(2); + target.x = *(float*)&ScriptParams[1]; + target.y = *(float*)&ScriptParams[2]; target.z = CWorld::FindGroundZForCoord(target.x, target.y); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_GOTO_AREA_ON_FOOT, target); @@ -235,61 +231,63 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_CREATE_PICKUP: { CollectParameters(&m_nIp, 5); - int16 model = GET_INTEGER_PARAM(0); + int16 model = ScriptParams[0]; if (model < 0) model = CTheScripts::UsedObjectArray[-model].index; - CVector pos = GET_VECTOR_PARAM(2); + CVector pos = *(CVector*)&ScriptParams[2]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, model, GET_INTEGER_PARAM(1), 0)); + ScriptParams[0] = CPickups::GenerateNewOne(pos, model, ScriptParams[1], 0); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_HAS_PICKUP_BEEN_COLLECTED: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CPickups::IsPickUpPickedUp(GET_INTEGER_PARAM(0)) != 0); + UpdateCompareFlag(CPickups::IsPickUpPickedUp(ScriptParams[0]) != 0); return 0; case COMMAND_REMOVE_PICKUP: CollectParameters(&m_nIp, 1); - CPickups::RemovePickUp(GET_INTEGER_PARAM(0)); + CPickups::RemovePickUp(ScriptParams[0]); return 0; case COMMAND_SET_TAXI_LIGHTS: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR); - ((CAutomobile*)pVehicle)->SetTaxiLight(GET_INTEGER_PARAM(1) != 0); + ((CAutomobile*)pVehicle)->SetTaxiLight(ScriptParams[1] != 0); return 0; } case COMMAND_PRINT_BIG_Q: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 2); - CMessages::AddBigMessageQ(text, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1) - 1); + CMessages::AddBigMessageQ(text, ScriptParams[0], ScriptParams[1] - 1); return 0; } + /* case COMMAND_PRINT_WITH_NUMBER_BIG_Q: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 3); - CMessages::AddBigMessageWithNumberQ(text, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2) - 1, - GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1); + CMessages::AddBigMessageWithNumberQ(text, ScriptParams[1], ScriptParams[2] - 1, + ScriptParams[0], -1, -1, -1, -1, -1); return 0; } + */ case COMMAND_SET_GARAGE: { CollectParameters(&m_nIp, 9); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float X2 = GET_FLOAT_PARAM(3); - float Y2 = GET_FLOAT_PARAM(4); - float supX = GET_FLOAT_PARAM(5); - float supY = GET_FLOAT_PARAM(6); - float supZ = GET_FLOAT_PARAM(7); - SET_INTEGER_PARAM(0, CGarages::AddOne(infX, infY, infZ, X2, Y2, supX, supY, supZ, GET_INTEGER_PARAM(8), 0)); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float X2 = *(float*)&ScriptParams[3]; + float Y2 = *(float*)&ScriptParams[4]; + float supX = *(float*)&ScriptParams[5]; + float supY = *(float*)&ScriptParams[6]; + float supZ = *(float*)&ScriptParams[7]; + ScriptParams[0] = CGarages::AddOne(infX, infY, infZ, X2, Y2, supX, supY, supZ, ScriptParams[8], 0); StoreParameters(&m_nIp, 1); return 0; } @@ -297,15 +295,15 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_SET_GARAGE_WITH_CAR_MODEL: { CollectParameters(&m_nIp, 10); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float X2 = GET_FLOAT_PARAM(3); - float Y2 = GET_FLOAT_PARAM(4); - float supX = GET_FLOAT_PARAM(5); - float supY = GET_FLOAT_PARAM(6); - float supZ = GET_FLOAT_PARAM(7); - SET_INTEGER_PARAM(0, CGarages::AddOne(infX, infY, infZ, X2, Y2, supX, supY, supZ, GET_INTEGER_PARAM(8), GET_INTEGER_PARAM(9))); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float X2 = *(float*)&ScriptParams[3]; + float Y2 = *(float*)&ScriptParams[4]; + float supX = *(float*)&ScriptParams[5]; + float supY = *(float*)&ScriptParams[6]; + float supZ = *(float*)&ScriptParams[7]; + ScriptParams[0] = CGarages::AddOne(infX, infY, infZ, X2, Y2, supX, supY, supZ, ScriptParams[8], ScriptParams[9]); StoreParameters(&m_nIp, 1); return 0; } @@ -314,34 +312,34 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pTarget; - if (GET_INTEGER_PARAM(1) >= 0) { - pTarget = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + if (ScriptParams[1] >= 0) { + pTarget = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pTarget); } else { pTarget = nil; } - CGarages::SetTargetCarForMissonGarage(GET_INTEGER_PARAM(0), pTarget); + CGarages::SetTargetCarForMissonGarage(ScriptParams[0], pTarget); return 0; } case COMMAND_IS_CAR_IN_MISSION_GARAGE: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CGarages::HasCarBeenDroppedOffYet(GET_INTEGER_PARAM(0))); + UpdateCompareFlag(CGarages::HasCarBeenDroppedOffYet(ScriptParams[0])); return 0; +/* case COMMAND_SET_FREE_BOMBS: CollectParameters(&m_nIp, 1); - CGarages::SetFreeBombs(GET_INTEGER_PARAM(0) != 0); + CGarages::SetFreeBombs(ScriptParams[0] != 0); return 0; - /* case COMMAND_SET_POWERPOINT: { CollectParameters(&m_nIp, 7); - float f1 = GET_FLOAT_PARAM(0); - float f2 = GET_FLOAT_PARAM(1); - float f3 = GET_FLOAT_PARAM(2); - float f4 = GET_FLOAT_PARAM(3); - float f5 = GET_FLOAT_PARAM(4); - float f6 = GET_FLOAT_PARAM(5); + float f1 = *(float*)&ScriptParams[0]; + float f2 = *(float*)&ScriptParams[1]; + float f3 = *(float*)&ScriptParams[2]; + float f4 = *(float*)&ScriptParams[3]; + float f5 = *(float*)&ScriptParams[4]; + float f6 = *(float*)&ScriptParams[5]; float temp; if (f1 > f4) { @@ -362,43 +360,43 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) f6 = temp; } - CPowerPoints::GenerateNewOne(f1, f2, f3, f4, f5, f6, *(uint8*)&GET_INTEGER_PARAM(6)); + CPowerPoints::GenerateNewOne(f1, f2, f3, f4, f5, f6, *(uint8*)&ScriptParams[6]); return 0; } case COMMAND_SET_ALL_TAXI_LIGHTS: CollectParameters(&m_nIp, 1); - CAutomobile::SetAllTaxiLights(GET_INTEGER_PARAM(0) != 0); + CAutomobile::SetAllTaxiLights(ScriptParams[0] != 0); return 0; - */ case COMMAND_IS_CAR_ARMED_WITH_ANY_BOMB: { CollectParameters(&m_nIp, 1); - CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pCar); script_assert(pCar->m_vehType == VEHICLE_TYPE_CAR); UpdateCompareFlag(pCar->m_bombType != 0); //TODO: enum return 0; } + */ case COMMAND_APPLY_BRAKES_TO_PLAYERS_CAR: CollectParameters(&m_nIp, 2); - CPad::GetPad(GET_INTEGER_PARAM(0))->bApplyBrakes = (GET_INTEGER_PARAM(1) != 0); + CPad::GetPad(ScriptParams[0])->bApplyBrakes = (ScriptParams[1] != 0); return 0; case COMMAND_SET_PLAYER_HEALTH: { CollectParameters(&m_nIp, 2); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - pPed->m_fHealth = Min(GET_INTEGER_PARAM(1), CWorld::Players[GET_INTEGER_PARAM(0)].m_nMaxHealth); + pPed->m_fHealth = Min(ScriptParams[1], CWorld::Players[ScriptParams[0]].m_nMaxHealth); return 0; } case COMMAND_SET_CHAR_HEALTH: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - if (GET_INTEGER_PARAM(1)) { - pPed->m_fHealth = GET_INTEGER_PARAM(1); + if (ScriptParams[1]) { + pPed->m_fHealth = ScriptParams[1]; } else if (pPed->bInVehicle) { pPed->SetDead(); @@ -406,84 +404,86 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) pPed->FlagToDestroyWhenNextProcessed(); } else { - pPed->SetDie(); // last argument = 13 (default? TODO) + pPed->SetDie(); } return 0; } case COMMAND_SET_CAR_HEALTH: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->m_fHealth = GET_INTEGER_PARAM(1); + pVehicle->m_fHealth = ScriptParams[1]; return 0; } case COMMAND_GET_PLAYER_HEALTH: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - SET_INTEGER_PARAM(0, pPed->m_fHealth); + ScriptParams[0] = pPed->m_fHealth; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_GET_CHAR_HEALTH: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - SET_INTEGER_PARAM(0, pPed->m_fHealth); + ScriptParams[0] = pPed->m_fHealth; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_GET_CAR_HEALTH: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - SET_INTEGER_PARAM(0, pVehicle->m_fHealth); + ScriptParams[0] = pVehicle->m_fHealth; StoreParameters(&m_nIp, 1); return 0; } + /* case COMMAND_IS_CAR_ARMED_WITH_BOMB: { CollectParameters(&m_nIp, 2); - CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pCar); script_assert(pCar->m_vehType == VEHICLE_TYPE_CAR); - UpdateCompareFlag(pCar->m_bombType == GET_INTEGER_PARAM(1)); + UpdateCompareFlag(pCar->m_bombType == ScriptParams[1]); return 0; } + */ case COMMAND_CHANGE_CAR_COLOUR: { CollectParameters(&m_nIp, 3); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - if (GET_INTEGER_PARAM(1) >= 256 || GET_INTEGER_PARAM(2) >= 256) + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + if (ScriptParams[1] >= 256 || ScriptParams[2] >= 256) debug("CHANGE_CAR_COLOUR - Colours must be less than %d", 256); - pVehicle->m_currentColour1 = GET_INTEGER_PARAM(1); - pVehicle->m_currentColour2 = GET_INTEGER_PARAM(2); + pVehicle->m_currentColour1 = ScriptParams[1]; + pVehicle->m_currentColour2 = ScriptParams[2]; return 0; } case COMMAND_SWITCH_PED_ROADS_ON: { CollectParameters(&m_nIp, 6); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + float supZ = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(0); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[0]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(1); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[1]; } if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(2); + infZ = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[2]; } ThePaths.SwitchPedRoadsOffInArea(infX, supX, infY, supY, infZ, supZ, false); return 0; @@ -491,23 +491,23 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_SWITCH_PED_ROADS_OFF: { CollectParameters(&m_nIp, 6); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + float supZ = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(0); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[0]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(1); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[1]; } if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(2); + infZ = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[2]; } ThePaths.SwitchPedRoadsOffInArea(infX, supX, infY, supY, infZ, supZ, true); return 0; @@ -515,20 +515,20 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_CHAR_LOOK_AT_CHAR_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pSourcePed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pSourcePed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pSourcePed); - CPed* pTargetPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pTargetPed); - pSourcePed->SetLookFlag(pTargetPed, true, true); + pSourcePed->SetLookFlag(pTargetPed, true); pSourcePed->SetLookTimer(60000); return 0; } case COMMAND_CHAR_LOOK_AT_PLAYER_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pSourcePed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pSourcePed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pSourcePed); - CPed* pTargetPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CPed* pTargetPed = CWorld::Players[ScriptParams[1]].m_pPed; script_assert(pTargetPed); pSourcePed->SetLookFlag(pTargetPed, true); pSourcePed->SetLookTimer(60000); @@ -537,9 +537,9 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_PLAYER_LOOK_AT_CHAR_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pSourcePed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pSourcePed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pSourcePed); - CPed* pTargetPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pTargetPed); pSourcePed->SetLookFlag(pTargetPed, true); pSourcePed->SetLookTimer(60000); @@ -548,7 +548,7 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_STOP_CHAR_LOOKING: { CollectParameters(&m_nIp, 1); - CPed* pSourcePed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pSourcePed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pSourcePed); pSourcePed->ClearLookFlag(); pSourcePed->bKeepTryingToLook = false; @@ -559,7 +559,7 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_STOP_PLAYER_LOOKING: { CollectParameters(&m_nIp, 1); - CPed* pSourcePed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pSourcePed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pSourcePed); pSourcePed->ClearLookFlag(); pSourcePed->bKeepTryingToLook = false; @@ -570,7 +570,7 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) /* case COMMAND_SWITCH_HELICOPTER: CollectParameters(&m_nIp, 1); - CHeli::ActivateHeli(GET_INTEGER_PARAM(0) != 0); + CHeli::ActivateHeli(ScriptParams[0] != 0); return 0; */ //case COMMAND_SET_GANG_ATTITUDE: @@ -578,33 +578,33 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) //case COMMAND_SET_GANG_PLAYER_ATTITUDE: case COMMAND_SET_GANG_PED_MODELS: CollectParameters(&m_nIp, 3); - CGangs::SetGangPedModels(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + CGangs::SetGangPedModels(ScriptParams[0], ScriptParams[1], ScriptParams[2]); return 0; case COMMAND_SET_GANG_CAR_MODEL: CollectParameters(&m_nIp, 2); - CGangs::SetGangVehicleModel(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CGangs::SetGangVehicleModel(ScriptParams[0], ScriptParams[1]); return 0; case COMMAND_SET_GANG_WEAPONS: CollectParameters(&m_nIp, 3); - CGangs::SetGangWeapons(GET_INTEGER_PARAM(0), (eWeaponType)GET_INTEGER_PARAM(1), (eWeaponType)GET_INTEGER_PARAM(2)); + CGangs::SetGangWeapons(ScriptParams[0], (eWeaponType)ScriptParams[1], (eWeaponType)ScriptParams[2]); return 0; /* case COMMAND_SET_CHAR_OBJ_RUN_TO_AREA: { CollectParameters(&m_nIp, 5); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - float infX = GET_FLOAT_PARAM(1); - float infY = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); + float infX = *(float*)&ScriptParams[1]; + float infY = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(1); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[1]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(2); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[2]; } CVector pos; pos.x = (infX + supX) / 2; @@ -619,11 +619,11 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_SET_CHAR_OBJ_RUN_TO_COORD: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); CVector pos; - pos.x = GET_FLOAT_PARAM(1); - pos.y = GET_FLOAT_PARAM(2); + pos.x = *(float*)&ScriptParams[1]; + pos.y = *(float*)&ScriptParams[2]; pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_RUN_TO_AREA, pos); @@ -633,9 +633,9 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_IS_PLAYER_TOUCHING_OBJECT_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[1]); bool isTouching = false; if (pPed->bInVehicle) isTouching = false; @@ -647,9 +647,9 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_IS_CHAR_TOUCHING_OBJECT_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[1]); bool isTouching = false; if (pPed->InVehicle()) isTouching = false; @@ -666,115 +666,110 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) strncpy(name, (char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); for (int i = 0; i < KEY_LENGTH_IN_SCRIPT; i++) name[i] = tolower(name[i]); - CStreaming::RequestSpecialChar(GET_INTEGER_PARAM(0) - 1, name, STREAMFLAGS_DEPENDENCY | (m_bIsMissionScript ? STREAMFLAGS_SCRIPTOWNED : STREAMFLAGS_AMBIENT_SCRIPT_OWNED)); + CStreaming::RequestSpecialChar(ScriptParams[0] - 1, name, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_SCRIPTOWNED); m_nIp += KEY_LENGTH_IN_SCRIPT; return 0; } case COMMAND_HAS_SPECIAL_CHARACTER_LOADED: { CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CStreaming::HasSpecialCharLoaded(GET_INTEGER_PARAM(0) - 1)); + UpdateCompareFlag(CStreaming::HasSpecialCharLoaded(ScriptParams[0] - 1)); return 0; } /* case COMMAND_FLASH_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->bHasBlip = (GET_INTEGER_PARAM(1) != 0); + pVehicle->bHasBlip = (ScriptParams[1] != 0); return 0; } case COMMAND_FLASH_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bHasBlip = (GET_INTEGER_PARAM(1) != 0); + pPed->bHasBlip = (ScriptParams[1] != 0); return 0; } case COMMAND_FLASH_OBJECT: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - pObject->bHasBlip = (GET_INTEGER_PARAM(1) != 0); + pObject->bHasBlip = (ScriptParams[1] != 0); return 0; } */ case COMMAND_IS_PLAYER_IN_REMOTE_MODE: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].IsPlayerInRemoteMode()); + UpdateCompareFlag(CWorld::Players[ScriptParams[0]].IsPlayerInRemoteMode()); return 0; + /* case COMMAND_ARM_CAR_WITH_BOMB: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR); - ((CAutomobile*)pVehicle)->m_bombType = GET_INTEGER_PARAM(1); + ((CAutomobile*)pVehicle)->m_bombType = ScriptParams[1]; ((CAutomobile*)pVehicle)->m_pBombRigger = FindPlayerPed(); return 0; } + */ case COMMAND_SET_CHAR_PERSONALITY: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->SetPedStats((ePedStats)GET_INTEGER_PARAM(1)); + pPed->SetPedStats((ePedStats)ScriptParams[1]); return 0; } case COMMAND_SET_CUTSCENE_OFFSET: CollectParameters(&m_nIp, 3); - CCutsceneMgr::SetCutsceneOffset(GET_VECTOR_PARAM(0)); + CCutsceneMgr::SetCutsceneOffset(*(CVector*)&ScriptParams[0]); return 0; case COMMAND_SET_ANIM_GROUP_FOR_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->m_animGroup = (AssocGroupId)GET_INTEGER_PARAM(1); - pPed->bOverrideMoveAnim = false; + pPed->m_animGroup = (AssocGroupId)ScriptParams[1]; return 0; } /* case COMMAND_SET_ANIM_GROUP_FOR_PLAYER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - pPed->m_animGroup = (AssocGroupId)GET_INTEGER_PARAM(1); + pPed->m_animGroup = (AssocGroupId)ScriptParams[1]; return 0; } */ case COMMAND_REQUEST_MODEL: { CollectParameters(&m_nIp, 1); - int model = GET_INTEGER_PARAM(0); + int model = ScriptParams[0]; if (model < 0) model = CTheScripts::UsedObjectArray[-model].index; - CStreaming::RequestModel(model, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_NOFADE | (m_bIsMissionScript ? STREAMFLAGS_SCRIPTOWNED : STREAMFLAGS_AMBIENT_SCRIPT_OWNED)); - if (model == MI_MINIGUN) -#ifdef FIX_BUGS - CStreaming::RequestModel(MI_MINIGUN2, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_NOFADE | (m_bIsMissionScript ? STREAMFLAGS_SCRIPTOWNED : STREAMFLAGS_AMBIENT_SCRIPT_OWNED)); -#else - CStreaming::RequestModel(MI_MINIGUN2, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_NOFADE | STREAMFLAGS_SCRIPTOWNED); -#endif + CStreaming::RequestModel(model, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_NOFADE | STREAMFLAGS_SCRIPTOWNED); return 0; } case COMMAND_HAS_MODEL_LOADED: { CollectParameters(&m_nIp, 1); - int model = GET_INTEGER_PARAM(0); + int model = ScriptParams[0]; if (model < 0) model = CTheScripts::UsedObjectArray[-model].index; - UpdateCompareFlag(CStreaming::HasModelLoaded(model)/* || cWorldStream::Instance()->pDynamic(model, 0) */); // TODO + UpdateCompareFlag(CStreaming::HasModelLoaded(model)); return 0; } case COMMAND_MARK_MODEL_AS_NO_LONGER_NEEDED: { CollectParameters(&m_nIp, 1); - int model = GET_INTEGER_PARAM(0); + int model = ScriptParams[0]; if (model < 0) model = CTheScripts::UsedObjectArray[-model].index; CStreaming::SetMissionDoesntRequireModel(model); @@ -783,7 +778,7 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_GRAB_PHONE: { CollectParameters(&m_nIp, 2); - SET_INTEGER_PARAM(0, gPhoneInfo.GrabPhone(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1))); + ScriptParams[0] = gPhoneInfo.GrabPhone(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); StoreParameters(&m_nIp, 1); return 0; } @@ -792,85 +787,80 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) { CollectParameters(&m_nIp, 1); wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_Repeatedly(GET_INTEGER_PARAM(0), text, nil, nil, nil, nil, nil); + gPhoneInfo.SetPhoneMessage_Repeatedly(ScriptParams[0], text, nil, nil, nil, nil, nil); return 0; } case COMMAND_SET_PHONE_MESSAGE: { CollectParameters(&m_nIp, 1); wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_JustOnce(GET_INTEGER_PARAM(0), text, nil, nil, nil, nil, nil); + gPhoneInfo.SetPhoneMessage_JustOnce(ScriptParams[0], text, nil, nil, nil, nil, nil); return 0; } case COMMAND_HAS_PHONE_DISPLAYED_MESSAGE: { CollectParameters(&m_nIp, 1); - UpdateCompareFlag(gPhoneInfo.HasMessageBeenDisplayed(GET_INTEGER_PARAM(0))); + UpdateCompareFlag(gPhoneInfo.HasMessageBeenDisplayed(ScriptParams[0])); return 0; } */ case COMMAND_TURN_PHONE_OFF: { CollectParameters(&m_nIp, 1); - gPhoneInfo.SetPhoneMessage_JustOnce(GET_INTEGER_PARAM(0), nil, nil, nil, nil, nil, nil); + gPhoneInfo.SetPhoneMessage_JustOnce(ScriptParams[0], nil, nil, nil, nil, nil, nil); return 0; } case COMMAND_DRAW_CORONA: { - uint32 ip = m_nIp; - int32* ptr = GetPointerToScriptVariable(&ip, 0); CollectParameters(&m_nIp, 9); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CCoronas::RegisterCorona((uintptr)ptr, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(8), - 255, pos, -GET_FLOAT_PARAM(3), 450.0f, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), 1, 0, 0, 0.0f); + CCoronas::RegisterCorona((uintptr)this + m_nIp, ScriptParams[6], ScriptParams[7], ScriptParams[8], + 255, pos, *(float*)&ScriptParams[3], 450.0f, ScriptParams[4], ScriptParams[5], 1, 0, 0, 0.0f); return 0; } - /* case COMMAND_DRAW_LIGHT: { CollectParameters(&m_nIp, 6); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; CVector unused(0.0f, 0.0f, 0.0f); - CPointLights::AddLight(0, GET_VECTOR_PARAM(0), CVector(0.0f, 0.0f, 0.0f), 12.0f, - GET_INTEGER_PARAM(3) / 255.0f, GET_INTEGER_PARAM(4) / 255.0f, GET_INTEGER_PARAM(5) / 255.0f, 0, true); + CPointLights::AddLight(0, *(CVector*)&ScriptParams[0], CVector(0.0f, 0.0f, 0.0f), 12.0f, + ScriptParams[3] / 255.0f, ScriptParams[4] / 255.0f, ScriptParams[5] / 255.0f, 0, true); return 0; } - */ - case COMMAND_STORE_WEATHER: - CWeather::StoreWeatherState(); - return 0; - case COMMAND_RESTORE_WEATHER: - CWeather::RestoreWeatherState(); + //case COMMAND_STORE_WEATHER: + //case COMMAND_RESTORE_WEATHER: case COMMAND_STORE_CLOCK: CClock::StoreClock(); return 0; case COMMAND_RESTORE_CLOCK: CClock::RestoreClock(); return 0; + /* case COMMAND_RESTART_CRITICAL_MISSION: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CRestart::OverrideNextRestart(pos, GET_FLOAT_PARAM(3)); + CRestart::OverrideNextRestart(pos, *(float*)&ScriptParams[3]); if (CWorld::Players[CWorld::PlayerInFocus].m_WBState != WBSTATE_PLAYING) printf("RESTART_CRITICAL_MISSION - Player state is not PLAYING\n"); CWorld::Players[CWorld::PlayerInFocus].PlayerFailedCriticalMission(); return 0; } + */ case COMMAND_IS_PLAYER_PLAYING: { CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_WBState == WBSTATE_PLAYING); + UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_WBState == WBSTATE_PLAYING); return 0; } #ifdef GTA_SCRIPT_COLLECTIVE case COMMAND_SET_COLL_OBJ_NO_OBJ: CollectParameters(&m_nIp, 1); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_NONE); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_NONE); return 0; #endif default: @@ -885,134 +875,134 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) #ifdef GTA_SCRIPT_COLLECTIVE case COMMAND_SET_COLL_OBJ_WAIT_ON_FOOT: CollectParameters(&m_nIp, 1); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_WAIT_ON_FOOT); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_WAIT_ON_FOOT); return 0; case COMMAND_SET_COLL_OBJ_FLEE_ON_FOOT_TILL_SAFE: CollectParameters(&m_nIp, 1); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_FLEE_ON_FOOT_TILL_SAFE); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_ON_FOOT_TILL_SAFE); return 0; case COMMAND_SET_COLL_OBJ_GUARD_SPOT: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GUARD_AREA, pos); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GUARD_AREA, pos); return 0; } case COMMAND_SET_COLL_OBJ_GUARD_AREA: { CollectParameters(&m_nIp, 5); - float infX = GET_FLOAT_PARAM(1); - float supX = GET_FLOAT_PARAM(3); + float infX = *(float*)&ScriptParams[1]; + float supX = *(float*)&ScriptParams[3]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(1); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[1]; } - float infY = GET_FLOAT_PARAM(2); - float supY = GET_FLOAT_PARAM(4); + float infY = *(float*)&ScriptParams[2]; + float supY = *(float*)&ScriptParams[4]; if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(2); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[2]; } CVector pos; pos.x = (infX + supX) / 2; pos.y = (infY + supY) / 2; pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); float radius = Max(pos.x - infX, pos.y - infY); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GUARD_AREA, pos, radius); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GUARD_AREA, pos, radius); return 0; } case COMMAND_SET_COLL_OBJ_WAIT_IN_CAR: CollectParameters(&m_nIp, 1); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_WAIT_IN_CAR); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_WAIT_IN_CAR); return 0; case COMMAND_SET_COLL_OBJ_KILL_CHAR_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_KILL_CHAR_ON_FOOT, pPed); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_KILL_CHAR_ON_FOOT, pPed); return 0; } case COMMAND_SET_COLL_OBJ_KILL_PLAYER_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_KILL_CHAR_ON_FOOT, pPed); + CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_KILL_CHAR_ON_FOOT, pPed); return 0; } case COMMAND_SET_COLL_OBJ_KILL_CHAR_ANY_MEANS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_KILL_CHAR_ANY_MEANS, pPed); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_KILL_CHAR_ANY_MEANS, pPed); return 0; } case COMMAND_SET_COLL_OBJ_KILL_PLAYER_ANY_MEANS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_KILL_CHAR_ANY_MEANS, pPed); + CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_KILL_CHAR_ANY_MEANS, pPed); return 0; } case COMMAND_SET_COLL_OBJ_FLEE_CHAR_ON_FOOT_TILL_SAFE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pPed); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pPed); return 0; } case COMMAND_SET_COLL_OBJ_FLEE_PLAYER_ON_FOOT_TILL_SAFE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pPed); + CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pPed); return 0; } case COMMAND_SET_COLL_OBJ_FLEE_CHAR_ON_FOOT_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pPed); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pPed); return 0; } case COMMAND_SET_COLL_OBJ_FLEE_PLAYER_ON_FOOT_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pPed); + CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pPed); return 0; } case COMMAND_SET_COLL_OBJ_GOTO_CHAR_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GOTO_CHAR_ON_FOOT, pPed); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_CHAR_ON_FOOT, pPed); return 0; } case COMMAND_SET_COLL_OBJ_GOTO_PLAYER_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GOTO_CHAR_ON_FOOT, pPed); + CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_CHAR_ON_FOOT, pPed); return 0; } case COMMAND_SET_COLL_OBJ_LEAVE_CAR: CollectParameters(&m_nIp, 1); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_LEAVE_CAR); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_LEAVE_CAR); return 0; case COMMAND_SET_COLL_OBJ_ENTER_CAR_AS_PASSENGER: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_ENTER_CAR_AS_PASSENGER, pVehicle); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_ENTER_CAR_AS_PASSENGER, pVehicle); return 0; } case COMMAND_SET_COLL_OBJ_ENTER_CAR_AS_DRIVER: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_ENTER_CAR_AS_DRIVER, pVehicle); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_ENTER_CAR_AS_DRIVER, pVehicle); return 0; } /* @@ -1023,31 +1013,31 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_SET_COLL_OBJ_DESTROY_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_DESTROY_CAR, pVehicle); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_DESTROY_CAR, pVehicle); return 0; } case COMMAND_SET_COLL_OBJ_GOTO_AREA_ON_FOOT: { CollectParameters(&m_nIp, 5); - float infX = GET_FLOAT_PARAM(1); - float supX = GET_FLOAT_PARAM(3); + float infX = *(float*)&ScriptParams[1]; + float supX = *(float*)&ScriptParams[3]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(1); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[1]; } - float infY = GET_FLOAT_PARAM(2); - float supY = GET_FLOAT_PARAM(4); + float infY = *(float*)&ScriptParams[2]; + float supY = *(float*)&ScriptParams[4]; if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(2); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[2]; } CVector pos; pos.x = (infX + supX) / 2; pos.y = (infY + supY) / 2; pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); float radius = Max(pos.x - infX, pos.y - infY); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GOTO_AREA_ON_FOOT, pos, radius); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_AREA_ON_FOOT, pos, radius); return 0; } /* @@ -1057,66 +1047,66 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) */ case COMMAND_SET_COLL_OBJ_FOLLOW_ROUTE: CollectParameters(&m_nIp, 3); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_FOLLOW_ROUTE, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FOLLOW_ROUTE, ScriptParams[1], ScriptParams[2]); return 0; case COMMAND_SET_COLL_OBJ_GOTO_COORD_ON_FOOT: { CollectParameters(&m_nIp, 3); - CVector pos(GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), CWorld::FindGroundZForCoord(GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2))); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GOTO_AREA_ON_FOOT, pos); + CVector pos(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2], CWorld::FindGroundZForCoord(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2])); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_AREA_ON_FOOT, pos); return 0; } //case COMMAND_SET_COLL_OBJ_GOTO_COORD_IN_CAR: case COMMAND_SET_COLL_OBJ_RUN_TO_AREA: { CollectParameters(&m_nIp, 5); - float infX = GET_FLOAT_PARAM(1); - float supX = GET_FLOAT_PARAM(3); + float infX = *(float*)&ScriptParams[1]; + float supX = *(float*)&ScriptParams[3]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(1); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[1]; } - float infY = GET_FLOAT_PARAM(2); - float supY = GET_FLOAT_PARAM(4); + float infY = *(float*)&ScriptParams[2]; + float supY = *(float*)&ScriptParams[4]; if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(2); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[2]; } CVector pos; pos.x = (infX + supX) / 2; pos.y = (infY + supY) / 2; pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); float radius = Max(pos.x - infX, pos.y - infY); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_RUN_TO_AREA, pos, radius); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_RUN_TO_AREA, pos, radius); return 0; } case COMMAND_SET_COLL_OBJ_RUN_TO_COORD: { CollectParameters(&m_nIp, 3); - CVector pos(GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), CWorld::FindGroundZForCoord(GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2))); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_RUN_TO_AREA, pos); + CVector pos(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2], CWorld::FindGroundZForCoord(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2])); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_RUN_TO_AREA, pos); return 0; } case COMMAND_ADD_PEDS_IN_AREA_TO_COLL: { CollectParameters(&m_nIp, 3); - float X = GET_FLOAT_PARAM(0); - float Y = GET_FLOAT_PARAM(1); + float X = *(float*)&ScriptParams[0]; + float Y = *(float*)&ScriptParams[1]; float Z = CWorld::FindGroundZForCoord(X, Y); - float radius = GET_FLOAT_PARAM(2); - SET_INTEGER_PARAM(0, CTheScripts::AddPedsInAreaToCollective(X, Y, Z, radius)); + float radius = *(float*)&ScriptParams[2]; + ScriptParams[0] = CTheScripts::AddPedsInAreaToCollective(X, Y, Z, radius); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_PEDS_IN_VEHICLE_TO_COLL: CollectParameters(&m_nIp, 1); - SET_INTEGER_PARAM(0, CTheScripts::AddPedsInVehicleToCollective(GET_INTEGER_PARAM(0))); + ScriptParams[0] = CTheScripts::AddPedsInVehicleToCollective(ScriptParams[0]); StoreParameters(&m_nIp, 1); return 0; case COMMAND_CLEAR_COLL: CollectParameters(&m_nIp, 1); for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - if (CTheScripts::CollectiveArray[i].colIndex == GET_INTEGER_PARAM(0)) { + if (CTheScripts::CollectiveArray[i].colIndex == ScriptParams[0]) { CTheScripts::CollectiveArray[i].colIndex = -1; CTheScripts::CollectiveArray[i].pedIndex = 0; } @@ -1185,7 +1175,7 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) total++; } } - SET_INTEGER_PARAM(0, total); + ScriptParams[0] = total; StoreParameters(&m_nIp, 1); return 0; } @@ -1193,77 +1183,72 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_SET_CHAR_HEED_THREATS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bRespondsToThreats = (GET_INTEGER_PARAM(1) != 0); + pPed->bRespondsToThreats = (ScriptParams[1] != 0); return 0; } case COMMAND_SET_PLAYER_HEED_THREATS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - pPed->bRespondsToThreats = (GET_INTEGER_PARAM(1) != 0); + pPed->bRespondsToThreats = (ScriptParams[1] != 0); return 0; } case COMMAND_GET_CONTROLLER_MODE: #if defined(GTA_PC) && !defined(DETECT_PAD_INPUT_SWITCH) - SET_INTEGER_PARAM(0, 0); + ScriptParams[0] = 0; #else - SET_INTEGER_PARAM(0, CPad::IsAffectedByController ? CPad::GetPad(0)->Mode : 0); + ScriptParams[0] = CPad::IsAffectedByController ? CPad::GetPad(0)->Mode : 0; #endif StoreParameters(&m_nIp, 1); return 0; case COMMAND_SET_CAN_RESPRAY_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); //assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR); // they DO call this for bikes, we don't really want to destroy the structure... #ifdef FIX_BUGS if (pVehicle->m_vehType == VEHICLE_TYPE_CAR) #endif - ((CAutomobile*)pVehicle)->bFixedColour = (GET_INTEGER_PARAM(1) == 0); -#ifdef FIX_BUGS - else if (pVehicle->m_vehType == VEHICLE_TYPE_BIKE) - ((CBike*)pVehicle)->bFixedColour = (GET_INTEGER_PARAM(1) == 0); -#endif + ((CAutomobile*)pVehicle)->bFixedColour = (ScriptParams[1] == 0); return 0; } + /* case COMMAND_IS_TAXI: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); UpdateCompareFlag(pVehicle->IsTaxi()); return 0; } + */ case COMMAND_UNLOAD_SPECIAL_CHARACTER: CollectParameters(&m_nIp, 1); - if (m_bIsMissionScript) - CStreaming::SetMissionDoesntRequireSpecialChar(GET_INTEGER_PARAM(0) - 1); - //else - // CStreaming::SetAmbientMissionDoesntRequireSpecialChar(GET_INTEGER_PARAM(0) - 1); // TODO + CStreaming::SetMissionDoesntRequireSpecialChar(ScriptParams[0] - 1); return 0; case COMMAND_RESET_NUM_OF_MODELS_KILLED_BY_PLAYER: CDarkel::ResetModelsKilledByPlayer(); return 0; case COMMAND_GET_NUM_OF_MODELS_KILLED_BY_PLAYER: CollectParameters(&m_nIp, 1); - SET_INTEGER_PARAM(0, CDarkel::QueryModelsKilledByPlayer(GET_INTEGER_PARAM(0))); + ScriptParams[0] = CDarkel::QueryModelsKilledByPlayer(ScriptParams[0]); StoreParameters(&m_nIp, 1); return 0; /* case COMMAND_ACTIVATE_GARAGE: CollectParameters(&m_nIp, 1); - CGarages::ActivateGarage(GET_INTEGER_PARAM(0)); + CGarages::ActivateGarage(ScriptParams[0]); return 0; case COMMAND_SWITCH_TAXI_TIMER: { CollectParameters(&m_nIp, 1); - if (GET_INTEGER_PARAM(0) != 0){ + if (ScriptParams[0] != 0){ CWorld::Players[CWorld::PlayerInFocus].m_nUnusedTaxiTimer = CTimer::GetTimeInMilliseconds(); CWorld::Players[CWorld::PlayerInFocus].m_bUnusedTaxiThing = true; }else{ @@ -1275,10 +1260,10 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_CREATE_OBJECT_NO_OFFSET: { CollectParameters(&m_nIp, 4); - int mi = GET_INTEGER_PARAM(0) >= 0 ? GET_INTEGER_PARAM(0) : CTheScripts::UsedObjectArray[-GET_INTEGER_PARAM(0)].index; + int mi = ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::UsedObjectArray[-ScriptParams[0]].index; CObject* pObj = new CObject(mi, false); ; pObj->ObjectCreatedBy = MISSION_OBJECT; - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pObj->SetPosition(pos); @@ -1290,37 +1275,37 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) pObj->SetupBigBuilding(); CTheScripts::ClearSpaceForMissionEntity(pos, pObj); CWorld::Add(pObj); - SET_INTEGER_PARAM(0, CPools::GetObjectPool()->GetIndex(pObj)); + ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pObj); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_OBJECT); - return 0; - } - case COMMAND_IS_BOAT: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - UpdateCompareFlag(pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT); + CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT); return 0; } /* + case COMMAND_IS_BOAT: + { + CollectParameters(&m_nIp, 1); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + script_assert(pVehicle); + UpdateCompareFlag(pVehicle->m_vehType == VEHICLE_TYPE_BOAT); + return 0; + } case COMMAND_SET_CHAR_OBJ_GOTO_AREA_ANY_MEANS: { CollectParameters(&m_nIp, 5); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - float infX = GET_FLOAT_PARAM(1); - float infY = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); + float infX = *(float*)&ScriptParams[1]; + float infY = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(1); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[1]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(2); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[2]; } CVector pos; pos.x = (infX + supX) / 2; @@ -1331,107 +1316,105 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) pPed->SetObjective(OBJECTIVE_GOTO_AREA_ANY_MEANS, pos, radius); return 0; } + */ #ifdef GTA_SCRIPT_COLLECTIVE case COMMAND_SET_COLL_OBJ_GOTO_AREA_ANY_MEANS: { CollectParameters(&m_nIp, 5); - float infX = GET_FLOAT_PARAM(1); - float supX = GET_FLOAT_PARAM(3); + float infX = *(float*)&ScriptParams[1]; + float supX = *(float*)&ScriptParams[3]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(1); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[1]; } - float infY = GET_FLOAT_PARAM(2); - float supY = GET_FLOAT_PARAM(4); + float infY = *(float*)&ScriptParams[2]; + float supY = *(float*)&ScriptParams[4]; if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(2); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[2]; } CVector pos; pos.x = (infX + supX) / 2; pos.y = (infY + supY) / 2; pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); float radius = Max(pos.x - infX, pos.y - infY); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GOTO_AREA_ANY_MEANS, pos, radius); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_AREA_ANY_MEANS, pos, radius); return 0; } #endif -*/ case COMMAND_IS_PLAYER_STOPPED: { CollectParameters(&m_nIp, 1); - CPlayerInfo* pPlayer = &CWorld::Players[GET_INTEGER_PARAM(0)]; + CPlayerInfo* pPlayer = &CWorld::Players[ScriptParams[0]]; UpdateCompareFlag(CTheScripts::IsPlayerStopped(pPlayer)); return 0; } + /* case COMMAND_IS_CHAR_STOPPED: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); UpdateCompareFlag(CTheScripts::IsPedStopped(pPed)); return 0; } case COMMAND_MESSAGE_WAIT: CollectParameters(&m_nIp, 2); - m_nWakeTime = CTimer::GetTimeInMilliseconds() + GET_INTEGER_PARAM(0); - if (GET_INTEGER_PARAM(1) != 0) + m_nWakeTime = CTimer::GetTimeInMilliseconds() + ScriptParams[0]; + if (ScriptParams[1] != 0) m_bSkipWakeTime = true; return 1; - /* case COMMAND_ADD_PARTICLE_EFFECT: { CollectParameters(&m_nIp, 5); - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CParticleObject::AddObject(GET_INTEGER_PARAM(0), pos, GET_INTEGER_PARAM(4) != 0); + CParticleObject::AddObject(ScriptParams[0], pos, ScriptParams[4] != 0); return 0; } */ case COMMAND_SWITCH_WIDESCREEN: CollectParameters(&m_nIp, 1); - if (GET_INTEGER_PARAM(0) != 0) + if (ScriptParams[0] != 0) TheCamera.SetWideScreenOn(); - else { - // TODO: unknown field + else TheCamera.SetWideScreenOff(); - } return 0; /* case COMMAND_ADD_SPRITE_BLIP_FOR_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int id = CRadar::SetEntityBlip(BLIP_CAR, GET_INTEGER_PARAM(0), 0, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(1)); - SET_INTEGER_PARAM(0, id); + int id = CRadar::SetEntityBlip(BLIP_CAR, ScriptParams[0], 0, BLIP_DISPLAY_BOTH); + CRadar::SetBlipSprite(id, ScriptParams[1]); + ScriptParams[0] = id; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_SPRITE_BLIP_FOR_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int id = CRadar::SetEntityBlip(BLIP_CHAR, GET_INTEGER_PARAM(0), 1, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(1)); - SET_INTEGER_PARAM(0, id); + int id = CRadar::SetEntityBlip(BLIP_CHAR, ScriptParams[0], 1, BLIP_DISPLAY_BOTH); + CRadar::SetBlipSprite(id, ScriptParams[1]); + ScriptParams[0] = id; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_SPRITE_BLIP_FOR_OBJECT: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int id = CRadar::SetEntityBlip(BLIP_OBJECT, GET_INTEGER_PARAM(0), 6, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(1)); - SET_INTEGER_PARAM(0, id); + int id = CRadar::SetEntityBlip(BLIP_OBJECT, ScriptParams[0], 6, BLIP_DISPLAY_BOTH); + CRadar::SetBlipSprite(id, ScriptParams[1]); + ScriptParams[0] = id; StoreParameters(&m_nIp, 1); return 0; } @@ -1439,67 +1422,67 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_ADD_SPRITE_BLIP_FOR_CONTACT_POINT: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); int id = CRadar::SetCoordBlip(BLIP_CONTACT_POINT, pos, 2, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(3)); - SET_INTEGER_PARAM(0, id); + CRadar::SetBlipSprite(id, ScriptParams[3]); + ScriptParams[0] = id; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_SPRITE_BLIP_FOR_COORD: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int id = CRadar::SetCoordBlip(BLIP_COORD, pos, 4, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(3)); - SET_INTEGER_PARAM(0, id); + int id = CRadar::SetCoordBlip(BLIP_COORD, pos, 5, BLIP_DISPLAY_BOTH); + CRadar::SetBlipSprite(id, ScriptParams[3]); + ScriptParams[0] = id; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_CHAR_ONLY_DAMAGED_BY_PLAYER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bOnlyDamagedByPlayer = (GET_INTEGER_PARAM(1) != 0); + pPed->bOnlyDamagedByPlayer = (ScriptParams[1] != 0); return 0; } case COMMAND_SET_CAR_ONLY_DAMAGED_BY_PLAYER: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->bOnlyDamagedByPlayer = (GET_INTEGER_PARAM(1) != 0); + pVehicle->bOnlyDamagedByPlayer = (ScriptParams[1] != 0); return 0; } case COMMAND_SET_CHAR_PROOFS: { CollectParameters(&m_nIp, 6); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bBulletProof = (GET_INTEGER_PARAM(1) != 0); - pPed->bFireProof = (GET_INTEGER_PARAM(2) != 0); - pPed->bExplosionProof = (GET_INTEGER_PARAM(3) != 0); - pPed->bCollisionProof = (GET_INTEGER_PARAM(4) != 0); - pPed->bMeleeProof = (GET_INTEGER_PARAM(5) != 0); + pPed->bBulletProof = (ScriptParams[1] != 0); + pPed->bFireProof = (ScriptParams[2] != 0); + pPed->bExplosionProof = (ScriptParams[3] != 0); + pPed->bCollisionProof = (ScriptParams[4] != 0); + pPed->bMeleeProof = (ScriptParams[5] != 0); return 0; } case COMMAND_SET_CAR_PROOFS: { CollectParameters(&m_nIp, 6); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->bBulletProof = (GET_INTEGER_PARAM(1) != 0); - pVehicle->bFireProof = (GET_INTEGER_PARAM(2) != 0); - pVehicle->bExplosionProof = (GET_INTEGER_PARAM(3) != 0); - pVehicle->bCollisionProof = (GET_INTEGER_PARAM(4) != 0); - pVehicle->bMeleeProof = (GET_INTEGER_PARAM(5) != 0); + pVehicle->bBulletProof = (ScriptParams[1] != 0); + pVehicle->bFireProof = (ScriptParams[2] != 0); + pVehicle->bExplosionProof = (ScriptParams[3] != 0); + pVehicle->bCollisionProof = (ScriptParams[4] != 0); + pVehicle->bMeleeProof = (ScriptParams[5] != 0); return 0; } case COMMAND_IS_PLAYER_IN_ANGLED_AREA_2D: @@ -1519,16 +1502,16 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) /* case COMMAND_DEACTIVATE_GARAGE: CollectParameters(&m_nIp, 1); - CGarages::DeActivateGarage(GET_INTEGER_PARAM(0)); + CGarages::DeActivateGarage(ScriptParams[0]); return 0; case COMMAND_GET_NUMBER_OF_CARS_COLLECTED_BY_GARAGE: CollectParameters(&m_nIp, 1); - SET_INTEGER_PARAM(0, CGarages::QueryCarsCollected(GET_INTEGER_PARAM(0))); + ScriptParams[0] = CGarages::QueryCarsCollected(ScriptParams[0]); StoreParameters(&m_nIp, 1); return 0; case COMMAND_HAS_CAR_BEEN_TAKEN_TO_GARAGE: CollectParameters(&m_nIp, 2); - UpdateCompareFlag(CGarages::HasThisCarBeenCollected(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1) - 1)); + UpdateCompareFlag(CGarages::HasThisCarBeenCollected(ScriptParams[0], ScriptParams[1] - 1)); return 0; */ default: @@ -1543,55 +1526,54 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) /* case COMMAND_SET_SWAT_REQUIRED: CollectParameters(&m_nIp, 1); - FindPlayerPed()->m_pWanted->m_bSwatRequired = (GET_INTEGER_PARAM(0) != 0); + FindPlayerPed()->m_pWanted->m_bSwatRequired = (ScriptParams[0] != 0); return 0; case COMMAND_SET_FBI_REQUIRED: CollectParameters(&m_nIp, 1); - FindPlayerPed()->m_pWanted->m_bFbiRequired = (GET_INTEGER_PARAM(0) != 0); + FindPlayerPed()->m_pWanted->m_bFbiRequired = (ScriptParams[0] != 0); return 0; case COMMAND_SET_ARMY_REQUIRED: CollectParameters(&m_nIp, 1); - FindPlayerPed()->m_pWanted->m_bArmyRequired = (GET_INTEGER_PARAM(0) != 0); + FindPlayerPed()->m_pWanted->m_bArmyRequired = (ScriptParams[0] != 0); return 0; */ case COMMAND_IS_CAR_IN_WATER: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); UpdateCompareFlag(pVehicle && pVehicle->bIsInWater); return 0; } case COMMAND_GET_CLOSEST_CHAR_NODE: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CPathNode* pNode = &ThePaths.m_pathNodes[ThePaths.FindNodeClosestToCoors(pos, 1, 800.0f, true)]; - SET_VECTOR_PARAM(0, pNode->GetPosition()); + CPathNode* pNode = &ThePaths.m_pathNodes[ThePaths.FindNodeClosestToCoors(pos, 1, 999999.9f, true)]; + *(CVector*)&ScriptParams[0] = pNode->GetPosition(); StoreParameters(&m_nIp, 3); return 0; } case COMMAND_GET_CLOSEST_CAR_NODE: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - SET_VECTOR_PARAM(0, ThePaths.FindNodeCoorsForScript(ThePaths.FindNodeClosestToCoors(pos, 0, 800.0f, true, true))); + *(CVector*)&ScriptParams[0] = ThePaths.FindNodeCoorsForScript(ThePaths.FindNodeClosestToCoors(pos, 0, 999999.9f, true, true)); StoreParameters(&m_nIp, 3); return 0; } case COMMAND_CAR_GOTO_COORDINATES_ACCURATE: { CollectParameters(&m_nIp, 4); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += pVehicle->GetDistanceFromCentreOfMassToBaseOfModel(); - uint8 nOldMission = pVehicle->AutoPilot.m_nCarMission; if (CCarCtrl::JoinCarWithRoadSystemGotoCoors(pVehicle, pos, false)) pVehicle->AutoPilot.m_nCarMission = MISSION_GOTO_COORDS_STRAIGHT_ACCURATE; else @@ -1599,20 +1581,19 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) pVehicle->SetStatus(STATUS_PHYSICS); pVehicle->bEngineOn = true; pVehicle->AutoPilot.m_nCruiseSpeed = Max(1, pVehicle->AutoPilot.m_nCruiseSpeed); - if (nOldMission != pVehicle->AutoPilot.m_nCarMission) - pVehicle->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds(); + pVehicle->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds(); return 0; } /* case COMMAND_START_PACMAN_RACE: CollectParameters(&m_nIp, 1); - CPacManPickups::StartPacManRace(GET_INTEGER_PARAM(0)); + CPacManPickups::StartPacManRace(ScriptParams[0]); return 0; case COMMAND_START_PACMAN_RECORD: CPacManPickups::StartPacManRecord(); return 0; case COMMAND_GET_NUMBER_OF_POWER_PILLS_EATEN: - SET_INTEGER_PARAM(0, CPacManPickups::QueryPowerPillsEatenInRace()); + ScriptParams[0] = CPacManPickups::QueryPowerPillsEatenInRace(); StoreParameters(&m_nIp, 1); return 0; case COMMAND_CLEAR_PACMAN: @@ -1621,14 +1602,14 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_START_PACMAN_SCRAMBLE: { CollectParameters(&m_nIp, 5); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CPacManPickups::StartPacManScramble(pos, GET_FLOAT_PARAM(3), GET_INTEGER_PARAM(4)); + CPacManPickups::StartPacManScramble(pos, *(float*)&ScriptParams[3], ScriptParams[4]); return 0; } case COMMAND_GET_NUMBER_OF_POWER_PILLS_CARRIED: - SET_INTEGER_PARAM(0, CPacManPickups::QueryPowerPillsCarriedByPlayer()); + ScriptParams[0] = CPacManPickups::QueryPowerPillsCarriedByPlayer(); StoreParameters(&m_nIp, 1); return 0; case COMMAND_CLEAR_NUMBER_OF_POWER_PILLS_CARRIED: @@ -1638,7 +1619,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_CAR_ON_SCREEN: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); UpdateCompareFlag(TheCamera.IsSphereVisible(pVehicle->GetBoundCentre(), pVehicle->GetBoundRadius())); return 0; @@ -1646,7 +1627,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_CHAR_ON_SCREEN: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(TheCamera.IsSphereVisible(pPed->GetBoundCentre(), pPed->GetBoundRadius())); return 0; @@ -1654,65 +1635,67 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_OBJECT_ON_SCREEN: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); UpdateCompareFlag(TheCamera.IsSphereVisible(pObject->GetBoundCentre(), pObject->GetBoundRadius())); return 0; } + /* case COMMAND_GOSUB_FILE: { CollectParameters(&m_nIp, 2); script_assert(m_nStackPointer < MAX_STACK_DEPTH); m_anStack[m_nStackPointer++] = m_nIp; - SetIP(GET_INTEGER_PARAM(0)); - // GET_INTEGER_PARAM(1) == filename + SetIP(ScriptParams[0]); + // ScriptParams[1] == filename return 0; } + */ case COMMAND_GET_GROUND_Z_FOR_3D_COORD: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; bool success; - SET_FLOAT_PARAM(0, CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z, &success)); + *(float*)&ScriptParams[0] = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z, &success); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_START_SCRIPT_FIRE: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - SET_INTEGER_PARAM(0, gFireManager.StartScriptFire(pos, nil, 0.8f, 1)); + ScriptParams[0] = gFireManager.StartScriptFire(pos, nil, 0.8f, 1); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_IS_SCRIPT_FIRE_EXTINGUISHED: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(gFireManager.IsScriptFireExtinguish(GET_INTEGER_PARAM(0))); + UpdateCompareFlag(gFireManager.IsScriptFireExtinguish(ScriptParams[0])); return 0; case COMMAND_REMOVE_SCRIPT_FIRE: CollectParameters(&m_nIp, 1); - gFireManager.RemoveScriptFire(GET_INTEGER_PARAM(0)); + gFireManager.RemoveScriptFire(ScriptParams[0]); return 0; /* case COMMAND_SET_COMEDY_CONTROLS: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->bComedyControls = (GET_INTEGER_PARAM(1) != 0); + pVehicle->bComedyControls = (ScriptParams[1] != 0); return 0; } */ case COMMAND_BOAT_GOTO_COORDS: { CollectParameters(&m_nIp, 4); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_BOAT); CBoat* pBoat = (CBoat*)pVehicle; - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) CWaterLevel::GetWaterLevel(pos.x, pos.y, pos.z, &pos.z, false); pBoat->AutoPilot.m_nCarMission = MISSION_GOTOCOORDS_ASTHECROWSWIMS; @@ -1726,7 +1709,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_BOAT_STOP: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_BOAT); CBoat* pBoat = (CBoat*)pVehicle; @@ -1739,53 +1722,49 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_PLAYER_SHOOTING_IN_AREA: { CollectParameters(&m_nIp, 6); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - float x1 = GET_FLOAT_PARAM(1); - float y1 = GET_FLOAT_PARAM(2); - float x2 = GET_FLOAT_PARAM(3); - float y2 = GET_FLOAT_PARAM(4); + float x1 = *(float*)&ScriptParams[1]; + float y1 = *(float*)&ScriptParams[2]; + float x2 = *(float*)&ScriptParams[3]; + float y2 = *(float*)&ScriptParams[4]; UpdateCompareFlag(pPed->bIsShooting && pPed->IsWithinArea(x1, y1, x2, y2)); - if (GET_INTEGER_PARAM(5)) + if (ScriptParams[5]) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugSquare(x1, y1, x2, y2); - */ return 0; } case COMMAND_IS_CHAR_SHOOTING_IN_AREA: { CollectParameters(&m_nIp, 6); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - float x1 = GET_FLOAT_PARAM(1); - float y1 = GET_FLOAT_PARAM(2); - float x2 = GET_FLOAT_PARAM(3); - float y2 = GET_FLOAT_PARAM(4); + float x1 = *(float*)&ScriptParams[1]; + float y1 = *(float*)&ScriptParams[2]; + float x2 = *(float*)&ScriptParams[3]; + float y2 = *(float*)&ScriptParams[4]; UpdateCompareFlag(pPed->bIsShooting && pPed->IsWithinArea(x1, y1, x2, y2)); - if (GET_INTEGER_PARAM(5)) + if (ScriptParams[5]) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugSquare(x1, y1, x2, y2); - */ return 0; } case COMMAND_IS_CURRENT_PLAYER_WEAPON: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - UpdateCompareFlag(GET_INTEGER_PARAM(1) == pPed->GetWeapon()->m_eWeaponType); + UpdateCompareFlag(ScriptParams[1] == pPed->GetWeapon()->m_eWeaponType); return 0; } case COMMAND_IS_CURRENT_CHAR_WEAPON: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - UpdateCompareFlag(GET_INTEGER_PARAM(1) == pPed->GetWeapon()->m_eWeaponType); + UpdateCompareFlag(ScriptParams[1] == pPed->GetWeapon()->m_eWeaponType); return 0; } /* @@ -1795,7 +1774,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_ADD_POWER_PILL: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CPacManPickups::GenerateOnePMPickUp(pos); @@ -1805,22 +1784,23 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_SET_BOAT_CRUISE_SPEED: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_BOAT); CBoat* pBoat = (CBoat*)pVehicle; - pBoat->AutoPilot.m_nCruiseSpeed = GET_FLOAT_PARAM(1); + pBoat->AutoPilot.m_nCruiseSpeed = *(float*)&ScriptParams[1]; return 0; } + /* case COMMAND_GET_RANDOM_CHAR_IN_AREA: { - CollectParameters(&m_nIp, 7); + CollectParameters(&m_nIp, 4); int ped_handle = -1; CVector pos = FindPlayerCoors(); - float x1 = GET_FLOAT_PARAM(0); - float y1 = GET_FLOAT_PARAM(1); - float x2 = GET_FLOAT_PARAM(2); - float y2 = GET_FLOAT_PARAM(3); + float x1 = *(float*)&ScriptParams[0]; + float y1 = *(float*)&ScriptParams[1]; + float x2 = *(float*)&ScriptParams[2]; + float y2 = *(float*)&ScriptParams[3]; int i = CPools::GetPedPool()->GetSize(); while (--i && ped_handle == -1){ CPed* pPed = CPools::GetPedPool()->GetSlot(i); @@ -1836,9 +1816,9 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) continue; if (pPed->bFadeOut) continue; - if (pPed->m_nWaitState != WAITSTATE_FALSE) - continue; - if (!ThisIsAValidRandomPed(pPed->m_nPedType, GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7))) +// if (pPed->GetModelIndex() == MI_SCUM_WOM || pPed->GetModelIndex() == MI_SCUM_MAN) +// continue; + if (!ThisIsAValidRandomPed(pPed->m_nPedType)) continue; if (pPed->bIsLeader || pPed->m_leader) continue; @@ -1856,10 +1836,11 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) if (m_bIsMissionScript) CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR); } - SET_INTEGER_PARAM(0, ped_handle); + ScriptParams[0] = ped_handle; StoreParameters(&m_nIp, 1); return 0; } + */ case COMMAND_GET_RANDOM_CHAR_IN_ZONE: { char zone[KEY_LENGTH_IN_SCRIPT]; @@ -1888,7 +1869,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) continue; if (pPed->m_nWaitState != WAITSTATE_FALSE) continue; - if (!ThisIsAValidRandomPed(pPed->m_nPedType, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2))) + if (!ThisIsAValidRandomPed(pPed->m_nPedType, ScriptParams[0], ScriptParams[1], ScriptParams[2])) continue; if (pPed->bIsLeader || pPed->m_leader) continue; @@ -1910,14 +1891,14 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) if (m_bIsMissionScript) CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR); } - SET_INTEGER_PARAM(0, ped_handle); + ScriptParams[0] = ped_handle; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_IS_PLAYER_IN_TAXI: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->IsTaxi()); return 0; @@ -1925,7 +1906,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_PLAYER_SHOOTING: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); UpdateCompareFlag(pPed->bIsShooting); return 0; @@ -1933,7 +1914,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_CHAR_SHOOTING: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->bIsShooting); return 0; @@ -1941,28 +1922,28 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_CREATE_MONEY_PICKUP: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_MONEY, PICKUP_MONEY, GET_INTEGER_PARAM(3))); // MI_MONEY -> gpModelIndices[...] + ScriptParams[0] = CPickups::GenerateNewOne(pos, MI_MONEY, PICKUP_MONEY, ScriptParams[3]); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_CHAR_ACCURACY: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->m_wepAccuracy = GET_INTEGER_PARAM(1) * 1.25f; + pPed->m_wepAccuracy = ScriptParams[1]; return 0; } case COMMAND_GET_CAR_SPEED: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - SET_FLOAT_PARAM(0, pVehicle->GetSpeed().Magnitude() * GAME_SPEED_TO_METERS_PER_SECOND); + *(float*)&ScriptParams[0] = pVehicle->GetSpeed().Magnitude() * GAME_SPEED_TO_METERS_PER_SECOND; StoreParameters(&m_nIp, 1); return 0; } @@ -1970,17 +1951,15 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { char name[KEY_LENGTH_IN_SCRIPT]; strncpy(name, (const char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); - // unknown call FUN_29df68(name) on PS2 m_nIp += KEY_LENGTH_IN_SCRIPT; - CColStore::RemoveAllCollision(); CCutsceneMgr::LoadCutsceneData(name); return 0; } case COMMAND_CREATE_CUTSCENE_OBJECT: { CollectParameters(&m_nIp, 1); - CCutsceneObject* pCutObj = CCutsceneMgr::CreateCutsceneObject(GET_INTEGER_PARAM(0)); - SET_INTEGER_PARAM(0, CPools::GetObjectPool()->GetIndex(pCutObj)); + CCutsceneObject* pCutObj = CCutsceneMgr::CreateCutsceneObject(ScriptParams[0]); + ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pCutObj); StoreParameters(&m_nIp, 1); return 0; } @@ -1988,7 +1967,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { CollectParameters(&m_nIp, 1); char name[KEY_LENGTH_IN_SCRIPT]; - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); strncpy(name, (const char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); m_nIp += KEY_LENGTH_IN_SCRIPT; @@ -1996,23 +1975,16 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) return 0; } case COMMAND_START_CUTSCENE: - CCutsceneMgr::StartCutscene(); + CCutsceneMgr::ms_cutsceneLoadStatus = 1; return 0; case COMMAND_GET_CUTSCENE_TIME: - SET_INTEGER_PARAM(0, CCutsceneMgr::GetCutsceneTimeInMilleseconds()); + ScriptParams[0] = CCutsceneMgr::GetCutsceneTimeInMilleseconds(); StoreParameters(&m_nIp, 1); return 0; case COMMAND_HAS_CUTSCENE_FINISHED: - { - bool bFinished = CCutsceneMgr::HasCutsceneFinished(); - if (bFinished) - printf("cutscene has now finished\n"); - UpdateCompareFlag(bFinished); + UpdateCompareFlag(CCutsceneMgr::HasCutsceneFinished()); return 0; - } case COMMAND_CLEAR_CUTSCENE: - // unknown call on PS2 FUN_29DFA0(); - printf("clear cutscene\n"); CCutsceneMgr::DeleteCutsceneData(); return 0; case COMMAND_RESTORE_CAMERA_JUMPCUT: @@ -2021,37 +1993,37 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_CREATE_COLLECTABLE1: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; - CPickups::GenerateNewOne(pos, MI_COLLECTABLE1, PICKUP_COLLECTABLE1, 0); // TODO: gpModelIndices + CPickups::GenerateNewOne(pos, MI_COLLECTABLE1, PICKUP_COLLECTABLE1, 0); return 0; } case COMMAND_SET_COLLECTABLE1_TOTAL: CollectParameters(&m_nIp, 1); - CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages = GET_INTEGER_PARAM(0); + CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages = ScriptParams[0]; return 0; /* case COMMAND_IS_PROJECTILE_IN_AREA: { CollectParameters(&m_nIp, 6); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + float supZ = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(0); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[0]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(1); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[1]; } if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(2); + infZ = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[2]; } UpdateCompareFlag(CProjectileInfo::IsProjectileInRange(infX, supX, infY, supY, infZ, supZ, false)); if (CTheScripts::DbgFlag) @@ -2061,23 +2033,23 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_DESTROY_PROJECTILES_IN_AREA: { CollectParameters(&m_nIp, 6); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + float supZ = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(0); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[0]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(1); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[1]; } if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(2); + infZ = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[2]; } UpdateCompareFlag(CProjectileInfo::IsProjectileInRange(infX, supX, infY, supY, infZ, supZ, true)); if (CTheScripts::DbgFlag) @@ -2087,7 +2059,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_DROP_MINE: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GenerateNewOne(pos, MI_CARMINE, PICKUP_MINE_INACTIVE, 0); @@ -2096,7 +2068,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_DROP_NAUTICAL_MINE: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GenerateNewOne(pos, MI_NAUTICALMINE, PICKUP_MINE_INACTIVE, 0); @@ -2106,9 +2078,9 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_CHAR_MODEL: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - UpdateCompareFlag(GET_INTEGER_PARAM(1) == pPed->GetModelIndex()); + UpdateCompareFlag(ScriptParams[1] == pPed->GetModelIndex()); return 0; } case COMMAND_LOAD_SPECIAL_MODEL: @@ -2118,7 +2090,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) strncpy(name, (const char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); for (int i = 0; i < KEY_LENGTH_IN_SCRIPT; i++) name[i] = tolower(name[i]); - CStreaming::RequestSpecialModel(GET_INTEGER_PARAM(0), name, STREAMFLAGS_DEPENDENCY | (m_bIsMissionScript ? STREAMFLAGS_SCRIPTOWNED : STREAMFLAGS_AMBIENT_SCRIPT_OWNED)); + CStreaming::RequestSpecialModel(ScriptParams[0], name, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_SCRIPTOWNED); m_nIp += KEY_LENGTH_IN_SCRIPT; return 0; } @@ -2126,98 +2098,102 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) //case COMMAND_SET_CUTSCENE_HEAD_ANIM: case COMMAND_SIN: CollectParameters(&m_nIp, 1); - SET_FLOAT_PARAM(0, Sin(DEGTORAD(GET_FLOAT_PARAM(0)))); + *(float*)&ScriptParams[0] = Sin(DEGTORAD(*(float*)&ScriptParams[0])); StoreParameters(&m_nIp, 1); return 0; case COMMAND_COS: CollectParameters(&m_nIp, 1); - SET_FLOAT_PARAM(0, Cos(DEGTORAD(GET_FLOAT_PARAM(0)))); + *(float*)&ScriptParams[0] = Cos(DEGTORAD(*(float*)&ScriptParams[0])); StoreParameters(&m_nIp, 1); return 0; case COMMAND_GET_CAR_FORWARD_X: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); float forwardX = pVehicle->GetForward().x / pVehicle->GetForward().Magnitude2D(); - SET_FLOAT_PARAM(0, forwardX); + *(float*)&ScriptParams[0] = forwardX; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_GET_CAR_FORWARD_Y: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); float forwardY = pVehicle->GetForward().y / pVehicle->GetForward().Magnitude2D(); - SET_FLOAT_PARAM(0, forwardY); + *(float*)&ScriptParams[0] = forwardY; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_CHANGE_GARAGE_TYPE: CollectParameters(&m_nIp, 2); - CGarages::ChangeGarageType(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), 0); + CGarages::ChangeGarageType(ScriptParams[0], ScriptParams[1], 0); return 0; + /* case COMMAND_ACTIVATE_CRUSHER_CRANE: { CollectParameters(&m_nIp, 10); - float infX = GET_FLOAT_PARAM(2); - float infY = GET_FLOAT_PARAM(3); - float supX = GET_FLOAT_PARAM(4); - float supY = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[2]; + float infY = *(float*)&ScriptParams[3]; + float supX = *(float*)&ScriptParams[4]; + float supY = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(4); - supX = GET_FLOAT_PARAM(2); + infX = *(float*)&ScriptParams[4]; + supX = *(float*)&ScriptParams[2]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(5); - supY = GET_FLOAT_PARAM(3); + infY = *(float*)&ScriptParams[5]; + supY = *(float*)&ScriptParams[3]; } CCranes::ActivateCrane(infX, supX, infY, supY, - GET_FLOAT_PARAM(6), GET_FLOAT_PARAM(7), GET_FLOAT_PARAM(8), - DEGTORAD(GET_FLOAT_PARAM(9)), true, false, - GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1)); + *(float*)&ScriptParams[6], *(float*)&ScriptParams[7], *(float*)&ScriptParams[8], + DEGTORAD(*(float*)&ScriptParams[9]), true, false, + *(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); return 0; } case COMMAND_PRINT_WITH_2_NUMBERS: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 4); - CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1); + CMessages::AddMessageWithNumber(text, ScriptParams[2], ScriptParams[3], ScriptParams[0], ScriptParams[1], -1, -1, -1, -1); return 0; } + */ case COMMAND_PRINT_WITH_2_NUMBERS_NOW: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 4); - CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1); + CMessages::AddMessageJumpQWithNumber(text, ScriptParams[2], ScriptParams[3], ScriptParams[0], ScriptParams[1], -1, -1, -1, -1); return 0; } + /* case COMMAND_PRINT_WITH_2_NUMBERS_SOON: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 4); - CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1); + CMessages::AddMessageSoonWithNumber(text, ScriptParams[2], ScriptParams[3], ScriptParams[0], ScriptParams[1], -1, -1, -1, -1); return 0; } + */ case COMMAND_PRINT_WITH_3_NUMBERS: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 5); - CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), -1, -1, -1); + CMessages::AddMessageWithNumber(text, ScriptParams[3], ScriptParams[4], ScriptParams[0], ScriptParams[1], ScriptParams[2], -1, -1, -1); return 0; } + /* case COMMAND_PRINT_WITH_3_NUMBERS_NOW: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 5); - CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), -1, -1, -1); + CMessages::AddMessageJumpQWithNumber(text, ScriptParams[3], ScriptParams[4], ScriptParams[0], ScriptParams[1], ScriptParams[2], -1, -1, -1); return 0; } - /* case COMMAND_PRINT_WITH_3_NUMBERS_SOON: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 5); - CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), -1, -1, -1); + CMessages::AddMessageSoonWithNumber(text, ScriptParams[3], ScriptParams[4], ScriptParams[0], ScriptParams[1], ScriptParams[2], -1, -1, -1); return 0; } */ @@ -2225,7 +2201,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 6); - CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), -1, -1); + CMessages::AddMessageWithNumber(text, ScriptParams[4], ScriptParams[5], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], -1, -1); return 0; } /* @@ -2233,35 +2209,35 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 6); - CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), -1, -1); + CMessages::AddMessageJumpQWithNumber(text, ScriptParams[4], ScriptParams[5], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], -1, -1); return 0; } case COMMAND_PRINT_WITH_4_NUMBERS_SOON: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 6); - CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), -1, -1); + CMessages::AddMessageSoonWithNumber(text, ScriptParams[4], ScriptParams[5], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], -1, -1); return 0; } case COMMAND_PRINT_WITH_5_NUMBERS: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 7); - CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), -1); + CMessages::AddMessageWithNumber(text, ScriptParams[5], ScriptParams[6], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], -1); return 0; } case COMMAND_PRINT_WITH_5_NUMBERS_NOW: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 7); - CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), -1); + CMessages::AddMessageJumpQWithNumber(text, ScriptParams[5], ScriptParams[6], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], -1); return 0; } case COMMAND_PRINT_WITH_5_NUMBERS_SOON: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 7); - CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), -1); + CMessages::AddMessageSoonWithNumber(text, ScriptParams[5], ScriptParams[6], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], -1); return 0; } */ @@ -2269,7 +2245,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 8); - CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5)); + CMessages::AddMessageWithNumber(text, ScriptParams[6], ScriptParams[7], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], ScriptParams[5]); return 0; } /* @@ -2277,69 +2253,71 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 8); - CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5)); + CMessages::AddMessageJumpQWithNumber(text, ScriptParams[6], ScriptParams[7], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], ScriptParams[5]); return 0; } case COMMAND_PRINT_WITH_6_NUMBERS_SOON: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 8); - CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5)); + CMessages::AddMessageSoonWithNumber(text, ScriptParams[6], ScriptParams[7], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], ScriptParams[5]); return 0; } - */ case COMMAND_SET_CHAR_OBJ_FOLLOW_CHAR_IN_FORMATION: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTargetPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FOLLOW_CHAR_IN_FORMATION, pTargetPed); - pPed->SetFormation((eFormation)GET_INTEGER_PARAM(2)); + pPed->SetFormation((eFormation)ScriptParams[2]); return 0; } + */ case COMMAND_PLAYER_MADE_PROGRESS: CollectParameters(&m_nIp, 1); - CStats::ProgressMade += GET_INTEGER_PARAM(0); + CStats::ProgressMade += ScriptParams[0]; return 0; case COMMAND_SET_PROGRESS_TOTAL: CollectParameters(&m_nIp, 1); - CStats::TotalProgressInGame = GET_INTEGER_PARAM(0); + CStats::TotalProgressInGame = ScriptParams[0]; + if (CGame::germanGame) + CStats::TotalProgressInGame -= 2; return 0; case COMMAND_REGISTER_JUMP_DISTANCE: CollectParameters(&m_nIp, 1); - CStats::MaximumJumpDistance = Max(CStats::MaximumJumpDistance, GET_FLOAT_PARAM(0)); + CStats::MaximumJumpDistance = Max(CStats::MaximumJumpDistance, *(float*)&ScriptParams[0]); return 0; case COMMAND_REGISTER_JUMP_HEIGHT: CollectParameters(&m_nIp, 1); - CStats::MaximumJumpHeight = Max(CStats::MaximumJumpHeight, GET_FLOAT_PARAM(0)); + CStats::MaximumJumpHeight = Max(CStats::MaximumJumpHeight, *(float*)&ScriptParams[0]); return 0; case COMMAND_REGISTER_JUMP_FLIPS: CollectParameters(&m_nIp, 1); - CStats::MaximumJumpFlips = Max(CStats::MaximumJumpFlips, GET_INTEGER_PARAM(0)); + CStats::MaximumJumpFlips = Max(CStats::MaximumJumpFlips, ScriptParams[0]); return 0; case COMMAND_REGISTER_JUMP_SPINS: CollectParameters(&m_nIp, 1); - CStats::MaximumJumpSpins = Max(CStats::MaximumJumpSpins, GET_INTEGER_PARAM(0)); + CStats::MaximumJumpSpins = Max(CStats::MaximumJumpSpins, ScriptParams[0]); return 0; case COMMAND_REGISTER_JUMP_STUNT: CollectParameters(&m_nIp, 1); - CStats::BestStuntJump = Max(CStats::BestStuntJump, GET_INTEGER_PARAM(0)); + CStats::BestStuntJump = Max(CStats::BestStuntJump, ScriptParams[0]); return 0; case COMMAND_REGISTER_UNIQUE_JUMP_FOUND: ++CStats::NumberOfUniqueJumpsFound; return 0; case COMMAND_SET_UNIQUE_JUMPS_TOTAL: CollectParameters(&m_nIp, 1); - CStats::TotalNumberOfUniqueJumps = GET_INTEGER_PARAM(0); + CStats::TotalNumberOfUniqueJumps = ScriptParams[0]; return 0; case COMMAND_REGISTER_PASSENGER_DROPPED_OFF_TAXI: ++CStats::PassengersDroppedOffWithTaxi; return 0; case COMMAND_REGISTER_MONEY_MADE_TAXI: CollectParameters(&m_nIp, 1); - CStats::MoneyMadeWithTaxi += GET_INTEGER_PARAM(0); + CStats::MoneyMadeWithTaxi += ScriptParams[0]; return 0; case COMMAND_REGISTER_MISSION_GIVEN: ++CStats::MissionsGiven; @@ -2359,9 +2337,9 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_SET_CHAR_RUNNING: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bIsRunning = (GET_INTEGER_PARAM(1) != 0); + pPed->bIsRunning = (ScriptParams[1] != 0); return 0; } case COMMAND_REMOVE_ALL_SCRIPT_FIRES: @@ -2371,32 +2349,32 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_FIRST_CAR_COLOUR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - UpdateCompareFlag(pVehicle->m_currentColour1 == GET_INTEGER_PARAM(1)); + UpdateCompareFlag(pVehicle->m_currentColour1 == ScriptParams[1]); return 0; } case COMMAND_IS_SECOND_CAR_COLOUR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - UpdateCompareFlag(pVehicle->m_currentColour2 == GET_INTEGER_PARAM(1)); + UpdateCompareFlag(pVehicle->m_currentColour2 == ScriptParams[1]); return 0; } */ case COMMAND_HAS_CHAR_BEEN_DAMAGED_BY_WEAPON: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); bool result = false; if (!pPed) printf("HAS_CHAR_BEEN_DAMAGED_BY_WEAPON - Character doesn't exist\n"); else { - if (GET_INTEGER_PARAM(1) == WEAPONTYPE_ANYMELEE || GET_INTEGER_PARAM(1) == WEAPONTYPE_ANYWEAPON) - result = CheckDamagedWeaponType(pPed->m_lastWepDam, GET_INTEGER_PARAM(1)); + if (ScriptParams[1] == WEAPONTYPE_ANYMELEE || ScriptParams[1] == WEAPONTYPE_ANYWEAPON) + result = CheckDamagedWeaponType(pPed->m_lastWepDam, ScriptParams[1]); else - result = GET_INTEGER_PARAM(1) == pPed->m_lastWepDam; + result = ScriptParams[1] == pPed->m_lastWepDam; } UpdateCompareFlag(result); return 0; @@ -2404,15 +2382,15 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_HAS_CAR_BEEN_DAMAGED_BY_WEAPON: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); bool result = false; if (!pVehicle) printf("HAS_CAR_BEEN_DAMAGED_BY_WEAPON - Vehicle doesn't exist\n"); else { - if (GET_INTEGER_PARAM(1) == WEAPONTYPE_ANYMELEE || GET_INTEGER_PARAM(1) == WEAPONTYPE_ANYWEAPON) - result = CheckDamagedWeaponType(pVehicle->m_nLastWeaponDamage, GET_INTEGER_PARAM(1)); + if (ScriptParams[1] == WEAPONTYPE_ANYMELEE || ScriptParams[1] == WEAPONTYPE_ANYWEAPON) + result = CheckDamagedWeaponType(pVehicle->m_nLastWeaponDamage, ScriptParams[1]); else - result = GET_INTEGER_PARAM(1) == pVehicle->m_nLastWeaponDamage; + result = ScriptParams[1] == pVehicle->m_nLastWeaponDamage; } UpdateCompareFlag(result); return 0; @@ -2420,8 +2398,8 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_CHAR_IN_CHARS_GROUP: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - CPed* pLeader = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pLeader = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pPed); script_assert(pLeader); UpdateCompareFlag(pPed->m_leader == pLeader && !pPed->bWaitForLeaderToComeCloser); diff --git a/src/control/Script4.cpp b/src/control/Script4.cpp index 4f443ad..878278c 100644 --- a/src/control/Script4.cpp +++ b/src/control/Script4.cpp @@ -41,12 +41,19 @@ #include "Bike.h" #include "Wanted.h" -// LCS: file done except TODOs - #ifdef FIX_BUGS static bool IsSlideObjectUsedWrongByScript(const CVector& posTarget, const CVector& slideBy) { - // TODO? + if (posTarget == CVector(-559.476f, 784.807f, 23.279f) && slideBy == CVector(0.0f, 10.0f, 0.0f)) + return true; // G-Spotlight bottom elevator, east side + if (posTarget == CVector(-559.476f, 779.64f, 23.279f) && slideBy == CVector(0.0f, 10.0f, 0.0f)) + return true; // G-Spotlight bottom elevator, west side + if (posTarget == CVector(-553.563f, 790.595f, 97.917f) && slideBy == CVector(0.0f, 10.0f, 0.0f)) + return true; // G-Spotlight top elevator, east side + if (posTarget == CVector(-553.563f, 785.427f, 97.917f) && slideBy == CVector(0.0f, 10.0f, 0.0f)) + return true; // G-Spotlight top elevator, west side + if (posTarget == CVector(-866.689f, -572.095f, 15.573f) && slideBy == CVector(0.0f, 0.0f, 4.5f)) + return true; // Cherry Popper garage door return false; } #endif @@ -58,8 +65,8 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_IS_CHAR_IN_PLAYERS_GROUP: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - CPed* pLeader = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pLeader = CWorld::Players[ScriptParams[1]].m_pPed; script_assert(pPed); script_assert(pLeader); UpdateCompareFlag(pPed->m_leader == pLeader && !pPed->bWaitForLeaderToComeCloser); @@ -68,7 +75,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_EXPLODE_CHAR_HEAD: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->InflictDamage(nil, WEAPONTYPE_SNIPERRIFLE, 1000.0f, PEDPIECE_HEAD, 0); return 0; @@ -76,7 +83,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_EXPLODE_PLAYER_HEAD: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); pPed->InflictDamage(nil, WEAPONTYPE_SNIPERRIFLE, 1000.0f, PEDPIECE_HEAD, 0); return 0; @@ -84,9 +91,9 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_ANCHOR_BOAT: { CollectParameters(&m_nIp, 2); - CBoat* pBoat = (CBoat*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CBoat* pBoat = (CBoat*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pBoat && pBoat->m_vehType == VEHICLE_TYPE_BOAT); - pBoat->m_bIsAnchored = (GET_INTEGER_PARAM(1) != 0); + pBoat->m_bIsAnchored = (ScriptParams[1] != 0); return 0; } case COMMAND_SET_ZONE_GROUP: @@ -101,7 +108,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) return 0; } while (zone_id >= 0) { - CTheZones::SetPedGroup(zone_id, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CTheZones::SetPedGroup(zone_id, ScriptParams[0], ScriptParams[1]); zone_id = CTheZones::FindNextZoneByLabelAndReturnIndex(zone, ZONE_INFO); } return 0; @@ -109,18 +116,18 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_START_CAR_FIRE: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - SET_INTEGER_PARAM(0, gFireManager.StartScriptFire(pVehicle->GetPosition(), pVehicle, 0.8f, 1)); + ScriptParams[0] = gFireManager.StartScriptFire(pVehicle->GetPosition(), pVehicle, 0.8f, 1); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_START_CHAR_FIRE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - SET_INTEGER_PARAM(0, gFireManager.StartScriptFire(pPed->GetPosition(), pPed, 0.8f, 1)); + ScriptParams[0] = gFireManager.StartScriptFire(pPed->GetPosition(), pPed, 0.8f, 1); StoreParameters(&m_nIp, 1); return 0; } @@ -129,10 +136,10 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) CollectParameters(&m_nIp, 5); int handle = -1; uint32 i = CPools::GetVehiclePool()->GetSize(); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float supX = GET_FLOAT_PARAM(2); - float supY = GET_FLOAT_PARAM(3); + 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) @@ -141,7 +148,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) continue; if (!pVehicle->bUsesCollision) continue; - if (GET_INTEGER_PARAM(4) != pVehicle->GetModelIndex() && GET_INTEGER_PARAM(4) >= 0) + if (ScriptParams[4] != pVehicle->GetModelIndex() && ScriptParams[4] >= 0) continue; if (pVehicle->VehicleCreatedBy != RANDOM_VEHICLE) continue; @@ -154,7 +161,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) if (m_bIsMissionScript) CTheScripts::MissionCleanUp.AddEntityToList(handle, CLEANUP_CAR); } - SET_INTEGER_PARAM(0, handle); + ScriptParams[0] = handle; StoreParameters(&m_nIp, 1); return 0; } @@ -174,7 +181,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i); if (!pVehicle) continue; - if (GET_INTEGER_PARAM(0) != pVehicle->GetModelIndex() && GET_INTEGER_PARAM(0) >= 0) + if (ScriptParams[0] != pVehicle->GetModelIndex() && ScriptParams[0] >= 0) continue; if (pVehicle->VehicleCreatedBy != RANDOM_VEHICLE) continue; @@ -187,7 +194,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) if (m_bIsMissionScript) CTheScripts::MissionCleanUp.AddEntityToList(handle, CLEANUP_CAR); } - SET_INTEGER_PARAM(0, handle); + ScriptParams[0] = handle; StoreParameters(&m_nIp, 1); return 0; } @@ -195,38 +202,38 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_HAS_RESPRAY_HAPPENED: { CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CGarages::HasResprayHappened(GET_INTEGER_PARAM(0))); + UpdateCompareFlag(CGarages::HasResprayHappened(ScriptParams[0])); return 0; } case COMMAND_SET_CAMERA_ZOOM: { CollectParameters(&m_nIp, 1); if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FOLLOWPED) - TheCamera.SetZoomValueFollowPedScript(GET_INTEGER_PARAM(0)); + TheCamera.SetZoomValueFollowPedScript(ScriptParams[0]); else if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_CAM_ON_A_STRING) - TheCamera.SetZoomValueCamStringScript(GET_INTEGER_PARAM(0)); + TheCamera.SetZoomValueCamStringScript(ScriptParams[0]); return 0; } case COMMAND_CREATE_PICKUP_WITH_AMMO: { CollectParameters(&m_nIp, 6); - int16 model = GET_INTEGER_PARAM(0); + int16 model = ScriptParams[0]; if (model < 0) model = CTheScripts::UsedObjectArray[-model].index; - CVector pos = GET_VECTOR_PARAM(3); + CVector pos = *(CVector*)&ScriptParams[3]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, model, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2))); + ScriptParams[0] = CPickups::GenerateNewOne(pos, model, ScriptParams[1], ScriptParams[2]); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_CAR_RAM_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - CVehicle* pTarget = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pTarget = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pTarget); CCarAI::TellCarToRamOtherCar(pVehicle, pTarget); return 0; @@ -235,9 +242,9 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_SET_CAR_BLOCK_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - CVehicle* pTarget = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pTarget = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pTarget); CCarAI::TellCarToBlockOtherCar(pVehicle, pTarget); return 0; @@ -245,112 +252,115 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_SET_CHAR_OBJ_CATCH_TRAIN: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_CATCH_TRAIN); return 0; } + */ #ifdef GTA_SCRIPT_COLLECTIVE case COMMAND_SET_COLL_OBJ_CATCH_TRAIN: CollectParameters(&m_nIp, 1); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_CATCH_TRAIN); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_CATCH_TRAIN); return 0; #endif - */ case COMMAND_SET_PLAYER_NEVER_GETS_TIRED: { CollectParameters(&m_nIp, 2); - CPlayerInfo* pPlayer = &CWorld::Players[GET_INTEGER_PARAM(0)]; - pPlayer->m_bInfiniteSprint = (GET_INTEGER_PARAM(1) != 0); + CPlayerInfo* pPlayer = &CWorld::Players[ScriptParams[0]]; + pPlayer->m_bInfiniteSprint = (ScriptParams[1] != 0); return 0; } case COMMAND_SET_PLAYER_FAST_RELOAD: { CollectParameters(&m_nIp, 2); - CPlayerInfo* pPlayer = &CWorld::Players[GET_INTEGER_PARAM(0)]; - pPlayer->m_bFastReload = (GET_INTEGER_PARAM(1) != 0); + CPlayerInfo* pPlayer = &CWorld::Players[ScriptParams[0]]; + pPlayer->m_bFastReload = (ScriptParams[1] != 0); return 0; } case COMMAND_SET_CHAR_BLEEDING: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bPedIsBleeding = (GET_INTEGER_PARAM(1) != 0); + pPed->bPedIsBleeding = (ScriptParams[1] != 0); return 0; } /* case COMMAND_SET_CAR_FUNNY_SUSPENSION: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); // no action return 0; - */ + } case COMMAND_SET_CAR_BIG_WHEELS: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR); CAutomobile* pCar = (CAutomobile*)pVehicle; - pCar->bBigWheels = (GET_INTEGER_PARAM(1) != 0); + pCar->bBigWheels = (ScriptParams[1] != 0); return 0; } + */ case COMMAND_SET_FREE_RESPRAYS: CollectParameters(&m_nIp, 1); - CGarages::SetFreeResprays(GET_INTEGER_PARAM(0) != 0); + CGarages::SetFreeResprays(ScriptParams[0] != 0); return 0; case COMMAND_SET_PLAYER_VISIBLE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - pPed->bIsVisible = (GET_INTEGER_PARAM(1) != 0); + pPed->bIsVisible = (ScriptParams[1] != 0); return 0; } case COMMAND_SET_CHAR_VISIBLE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bIsVisible = (GET_INTEGER_PARAM(1) != 0); + pPed->bIsVisible = (ScriptParams[1] != 0); return 0; } + /* case COMMAND_SET_CAR_VISIBLE: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->bIsVisible = (GET_INTEGER_PARAM(1) != 0); + pVehicle->bIsVisible = (ScriptParams[1] != 0); return 0; } + */ case COMMAND_IS_AREA_OCCUPIED: { CollectParameters(&m_nIp, 11); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + float supZ = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(0); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[0]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(1); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[1]; } if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(2); + infZ = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[2]; } int16 total; CWorld::FindObjectsIntersectingCube(CVector(infX, infY, infZ), CVector(supX, supY, supZ), &total, 2, nil, - !!GET_INTEGER_PARAM(6), !!GET_INTEGER_PARAM(7), !!GET_INTEGER_PARAM(8), !!GET_INTEGER_PARAM(9), !!GET_INTEGER_PARAM(10)); + !!ScriptParams[6], !!ScriptParams[7], !!ScriptParams[8], !!ScriptParams[9], !!ScriptParams[10]); UpdateCompareFlag(total > 0); return 0; } @@ -366,15 +376,15 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) return 0; case COMMAND_SAVE_PLAYER_FROM_FIRES: CollectParameters(&m_nIp, 1); - gFireManager.ExtinguishPoint(CWorld::Players[GET_INTEGER_PARAM(0)].GetPos(), 3.0f); + gFireManager.ExtinguishPoint(CWorld::Players[ScriptParams[0]].GetPos(), 3.0f); return 0; */ case COMMAND_DISPLAY_TEXT: { CollectParameters(&m_nIp, 2); wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fAtX = GET_FLOAT_PARAM(0); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fAtY = GET_FLOAT_PARAM(1); + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fAtX = *(float*)&ScriptParams[0]; + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fAtY = *(float*)&ScriptParams[1]; uint16 len = CMessages::GetWideStringLength(text); for (uint16 i = 0; i < len; i++) CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_Text[i] = text[i]; @@ -386,47 +396,47 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_SET_TEXT_SCALE: { CollectParameters(&m_nIp, 2); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fScaleX = GET_FLOAT_PARAM(0); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fScaleY = GET_FLOAT_PARAM(1); + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fScaleX = *(float*)&ScriptParams[0]; + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fScaleY = *(float*)&ScriptParams[1]; return 0; } case COMMAND_SET_TEXT_COLOUR: { CollectParameters(&m_nIp, 4); CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_sColor = - CRGBA(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3)); + CRGBA(ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3]); return 0; } case COMMAND_SET_TEXT_JUSTIFY: { CollectParameters(&m_nIp, 1); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bJustify = (GET_INTEGER_PARAM(0) != 0); + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bJustify = (ScriptParams[0] != 0); return 0; } case COMMAND_SET_TEXT_CENTRE: { CollectParameters(&m_nIp, 1); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bCentered = (GET_INTEGER_PARAM(0) != 0); + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bCentered = (ScriptParams[0] != 0); return 0; } case COMMAND_SET_TEXT_WRAPX: { CollectParameters(&m_nIp, 1); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fWrapX = GET_FLOAT_PARAM(0); + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fWrapX = *(float*)&ScriptParams[0]; return 0; } /* case COMMAND_SET_TEXT_CENTRE_SIZE: { CollectParameters(&m_nIp, 1); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fCenterSize = GET_FLOAT_PARAM(0); + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fCenterSize = *(float*)&ScriptParams[0]; return 0; } */ case COMMAND_SET_TEXT_BACKGROUND: { CollectParameters(&m_nIp, 1); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bBackground = (GET_INTEGER_PARAM(0) != 0); + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bBackground = (ScriptParams[0] != 0); return 0; } /* @@ -434,56 +444,53 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) { CollectParameters(&m_nIp, 4); CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_sBackgroundColor = - CRGBA(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3)); + CRGBA(ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3]); return 0; } case COMMAND_SET_TEXT_BACKGROUND_ONLY_TEXT: { CollectParameters(&m_nIp, 1); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bBackgroundOnly = (GET_INTEGER_PARAM(0) != 0); + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bBackgroundOnly = (ScriptParams[0] != 0); return 0; } */ case COMMAND_SET_TEXT_PROPORTIONAL: { CollectParameters(&m_nIp, 1); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bTextProportional = (GET_INTEGER_PARAM(0) != 0); + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bTextProportional = (ScriptParams[0] != 0); return 0; } /* case COMMAND_SET_TEXT_FONT: { CollectParameters(&m_nIp, 1); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_nFont = GET_INTEGER_PARAM(0); + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_nFont = ScriptParams[0]; return 0; } - */ case COMMAND_INDUSTRIAL_PASSED: - CollectParameters(&m_nIp, 1); - CStats::IndustrialPassed = GET_INTEGER_PARAM(0); + CStats::IndustrialPassed = true; + DMAudio.PlayRadioAnnouncement(STREAMED_SOUND_ANNOUNCE_COMMERCIAL_OPEN); return 0; case COMMAND_COMMERCIAL_PASSED: - CollectParameters(&m_nIp, 1); - CStats::CommercialPassed = GET_INTEGER_PARAM(0); + CStats::CommercialPassed = true; + DMAudio.PlayRadioAnnouncement(STREAMED_SOUND_ANNOUNCE_SUBURBAN_OPEN); return 0; case COMMAND_SUBURBAN_PASSED: - CollectParameters(&m_nIp, 1); - CStats::SuburbanPassed = GET_INTEGER_PARAM(0); + CStats::SuburbanPassed = true; return 0; + */ case COMMAND_ROTATE_OBJECT: { CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - float fx = pObject->GetForward().x; - float fy = pObject->GetForward().y; float heading = LimitAngleOnCircle( RADTODEG(Atan2(-pObject->GetForward().x, pObject->GetForward().y))); - float headingTarget = GET_FLOAT_PARAM(1); + float headingTarget = *(float*)&ScriptParams[1]; #ifdef FIX_BUGS - float rotateBy = GET_FLOAT_PARAM(2) * CTimer::GetTimeStepFix(); + float rotateBy = *(float*)&ScriptParams[2] * CTimer::GetTimeStepFix(); #else - float rotateBy = GET_FLOAT_PARAM(2); + float rotateBy = *(float*)&ScriptParams[2]; #endif if (headingTarget == heading) { // using direct comparasion here is fine UpdateCompareFlag(true); @@ -497,7 +504,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) else newHeading = rotateBy < angleCounterclockwise ? heading - rotateBy : headingTarget; bool obstacleInPath = false; - if (GET_INTEGER_PARAM(3)) { + if (ScriptParams[3]) { CVector pos = pObject->GetPosition(); tmp_matrix.SetRotateZ(DEGTORAD(newHeading)); tmp_matrix.GetPosition() += pos; @@ -529,11 +536,11 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_SLIDE_OBJECT: { CollectParameters(&m_nIp, 8); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); CVector pos = pObject->GetPosition(); - CVector posTarget = GET_VECTOR_PARAM(1); - CVector slideBy = GET_VECTOR_PARAM(4); + CVector posTarget = *(CVector*)&ScriptParams[1]; + CVector slideBy = *(CVector*)&ScriptParams[4]; #ifdef FIX_BUGS // the check is a hack for original script, where some objects are moved // via SLIDE_OBJECT instead of SET_OBJECT_POSITION @@ -561,7 +568,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) else newPosition.z = posDiff.z < slideBy.z ? posTarget.z : pos.z - slideBy.z; bool obstacleInPath = false; - if (GET_INTEGER_PARAM(7)) { + if (ScriptParams[7]) { tmp_matrix = pObject->GetMatrix(); tmp_matrix.GetPosition() = newPosition; CColModel* pColModel = pObject->GetColModel(); @@ -590,7 +597,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_REMOVE_CHAR_ELEGANTLY: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); if (pPed && pPed->CharCreatedBy == MISSION_CHAR){ CWorld::RemoveReferencesToDeletedObject(pPed); if (pPed->bInVehicle && pPed->m_pMyVehicle) @@ -606,15 +613,15 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) } } if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR); return 0; } case COMMAND_SET_CHAR_STAY_IN_SAME_PLACE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bKindaStayInSamePlace = (GET_INTEGER_PARAM(1) != 0); + pPed->bKindaStayInSamePlace = (ScriptParams[1] != 0); return 0; } /* @@ -625,7 +632,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_UNDRESS_CHAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); char name[KEY_LENGTH_IN_SCRIPT]; CTheScripts::ReadTextLabelFromScript(&m_nIp, name); @@ -638,7 +645,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_DRESS_CHAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->Dress(); return 0; @@ -648,39 +655,37 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) CollectParameters(&m_nIp, 1); CTimer::Suspend(); CStreaming::DeleteAllRwObjects(); - CRecordDataForChase::StartChaseScene(GET_FLOAT_PARAM(0)); + CRecordDataForChase::StartChaseScene(*(float*)&ScriptParams[0]); CTimer::Resume(); return 0; case COMMAND_STOP_CHASE_SCENE: CRecordDataForChase::CleanUpChaseScene(); return 0; - */ case COMMAND_IS_EXPLOSION_IN_AREA: { CollectParameters(&m_nIp, 7); - float infX = GET_FLOAT_PARAM(1); - float infY = GET_FLOAT_PARAM(2); - float infZ = GET_FLOAT_PARAM(3); - float supX = GET_FLOAT_PARAM(4); - float supY = GET_FLOAT_PARAM(5); - float supZ = GET_FLOAT_PARAM(6); + float infX = *(float*)&ScriptParams[1]; + float infY = *(float*)&ScriptParams[2]; + float infZ = *(float*)&ScriptParams[3]; + float supX = *(float*)&ScriptParams[4]; + float supY = *(float*)&ScriptParams[5]; + float supZ = *(float*)&ScriptParams[6]; if (infX > supX) { - infX = GET_FLOAT_PARAM(4); - supX = GET_FLOAT_PARAM(1); + infX = *(float*)&ScriptParams[4]; + supX = *(float*)&ScriptParams[1]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(5); - supY = GET_FLOAT_PARAM(2); + infY = *(float*)&ScriptParams[5]; + supY = *(float*)&ScriptParams[2]; } if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(6); - supZ = GET_FLOAT_PARAM(3); + infZ = *(float*)&ScriptParams[6]; + supZ = *(float*)&ScriptParams[3]; } - UpdateCompareFlag(CExplosion::TestForExplosionInArea((eExplosionType)GET_INTEGER_PARAM(0), + UpdateCompareFlag(CExplosion::TestForExplosionInArea((eExplosionType)ScriptParams[0], infX, supX, infY, supY, infZ, supZ)); return 0; } - /* case COMMAND_IS_EXPLOSION_IN_ZONE: { CollectParameters(&m_nIp, 1); @@ -690,7 +695,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) if (zone_id != -1) m_nIp += KEY_LENGTH_IN_SCRIPT; CZone* pZone = CTheZones::GetNavigationZone(zone_id); - UpdateCompareFlag(CExplosion::TestForExplosionInArea((eExplosionType)GET_INTEGER_PARAM(0), + UpdateCompareFlag(CExplosion::TestForExplosionInArea((eExplosionType)ScriptParams[0], pZone->minx, pZone->maxx, pZone->miny, pZone->maxy, pZone->minz, pZone->maxz)); return 0; } @@ -703,17 +708,17 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_FIND_DROP_OFF_PLANE_COORDINATES: { CVector pos = CPlane::FindDropOffCesnaCoordinates(); - SET_VECTOR_PARAM(0, pos); + *(CVector*)&ScriptParams[0] = pos; StoreParameters(&m_nIp, 3); return 0; } case COMMAND_CREATE_FLOATING_PACKAGE: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; - SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_FLOATPACKAGE1, PICKUP_FLOATINGPACKAGE, 0)); + ScriptParams[0] = CPickups::GenerateNewOne(pos, MI_FLOATPACKAGE1, PICKUP_FLOATINGPACKAGE, 0); StoreParameters(&m_nIp, 1); return 0; } @@ -721,58 +726,58 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_PLACE_OBJECT_RELATIVE_TO_CAR: { CollectParameters(&m_nIp, 5); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pVehicle); - CVector offset = GET_VECTOR_PARAM(2); + CVector offset = *(CVector*)&ScriptParams[2]; CPhysical::PlacePhysicalRelativeToOtherPhysical(pVehicle, pObject, offset); return 0; } case COMMAND_MAKE_OBJECT_TARGETTABLE: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); CPlayerPed* pPlayerPed = CWorld::Players[CWorld::PlayerInFocus].m_pPed; script_assert(pPlayerPed); - pPlayerPed->MakeObjectTargettable(GET_INTEGER_PARAM(0)); + pPlayerPed->MakeObjectTargettable(ScriptParams[0]); return 0; } case COMMAND_ADD_ARMOUR_TO_PLAYER: { CollectParameters(&m_nIp, 2); - CPlayerPed* pPlayerPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPlayerPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPlayerPed); - pPlayerPed->m_fArmour = clamp(pPlayerPed->m_fArmour + GET_INTEGER_PARAM(1), 0.0f, CWorld::Players[GET_INTEGER_PARAM(0)].m_nMaxArmour); + pPlayerPed->m_fArmour = clamp(pPlayerPed->m_fArmour + ScriptParams[1], 0.0f, CWorld::Players[ScriptParams[0]].m_nMaxArmour); return 0; } case COMMAND_ADD_ARMOUR_TO_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->m_fArmour = clamp(pPed->m_fArmour + GET_INTEGER_PARAM(1), 0.0f, 100.0f); + pPed->m_fArmour = clamp(pPed->m_fArmour + ScriptParams[1], 0.0f, 100.0f); return 0; } case COMMAND_OPEN_GARAGE: { CollectParameters(&m_nIp, 1); - CGarages::OpenGarage(GET_INTEGER_PARAM(0)); + CGarages::OpenGarage(ScriptParams[0]); return 0; } case COMMAND_CLOSE_GARAGE: { CollectParameters(&m_nIp, 1); - CGarages::CloseGarage(GET_INTEGER_PARAM(0)); + CGarages::CloseGarage(ScriptParams[0]); return 0; } case COMMAND_WARP_CHAR_FROM_CAR_TO_COORD: { CollectParameters(&m_nIp, 4); - CPed *pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed *pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); if (pPed->bInVehicle){ @@ -843,11 +848,11 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_SET_VISIBILITY_OF_CLOSEST_OBJECT_OF_TYPE: { CollectParameters(&m_nIp, 6); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - float range = GET_FLOAT_PARAM(3); - int mi = GET_INTEGER_PARAM(4) < 0 ? CTheScripts::UsedObjectArray[-GET_INTEGER_PARAM(4)].index : GET_INTEGER_PARAM(4); + float range = *(float*)&ScriptParams[3]; + int mi = ScriptParams[4] < 0 ? CTheScripts::UsedObjectArray[-ScriptParams[4]].index : ScriptParams[4]; int16 total; CEntity* apEntities[16]; CWorld::FindObjectsOfTypeInRange(mi, pos, range, true, &total, 16, apEntities, true, false, false, true, true); @@ -865,25 +870,27 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) } } if (pClosestEntity) { - pClosestEntity->bIsVisible = (GET_INTEGER_PARAM(5) != 0); - CTheScripts::AddToInvisibilitySwapArray(pClosestEntity, GET_INTEGER_PARAM(5) != 0); + pClosestEntity->bIsVisible = (ScriptParams[5] != 0); + CTheScripts::AddToInvisibilitySwapArray(pClosestEntity, ScriptParams[5] != 0); } return 0; } + /* case COMMAND_HAS_CHAR_SPOTTED_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pTarget); UpdateCompareFlag(pPed->OurPedCanSeeThisOne(pTarget)); return 0; } + */ case COMMAND_SET_CHAR_OBJ_HAIL_TAXI: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_HAIL_TAXI); @@ -892,113 +899,110 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_HAS_OBJECT_BEEN_DAMAGED: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); UpdateCompareFlag(pObject->bRenderDamaged || !pObject->bIsVisible); return 0; } + /* case COMMAND_START_KILL_FRENZY_HEADSHOT: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 8); - CDarkel::StartFrenzy((eWeaponType)GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), - GET_INTEGER_PARAM(3), text, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), - GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7) != 0, true); + CDarkel::StartFrenzy((eWeaponType)ScriptParams[0], ScriptParams[1], ScriptParams[2], + ScriptParams[3], text, ScriptParams[4], ScriptParams[5], + ScriptParams[6], ScriptParams[7] != 0, true); return 0; } case COMMAND_ACTIVATE_MILITARY_CRANE: { CollectParameters(&m_nIp, 10); - float infX = GET_FLOAT_PARAM(2); - float infY = GET_FLOAT_PARAM(3); - float supX = GET_FLOAT_PARAM(4); - float supY = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[2]; + float infY = *(float*)&ScriptParams[3]; + float supX = *(float*)&ScriptParams[4]; + float supY = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(4); - supX = GET_FLOAT_PARAM(2); + infX = *(float*)&ScriptParams[4]; + supX = *(float*)&ScriptParams[2]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(5); - supY = GET_FLOAT_PARAM(3); + infY = *(float*)&ScriptParams[5]; + supY = *(float*)&ScriptParams[3]; } CCranes::ActivateCrane(infX, supX, infY, supY, - GET_FLOAT_PARAM(6), GET_FLOAT_PARAM(7), GET_FLOAT_PARAM(8), - DEGTORAD(GET_FLOAT_PARAM(9)), false, true, - GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1)); + *(float*)&ScriptParams[6], *(float*)&ScriptParams[7], *(float*)&ScriptParams[8], + DEGTORAD(*(float*)&ScriptParams[9]), false, true, + *(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); return 0; } + */ case COMMAND_WARP_PLAYER_INTO_CAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pVehicle); pPed->SetObjective(OBJECTIVE_ENTER_CAR_AS_DRIVER, pVehicle); pPed->WarpPedIntoCar(pVehicle); - pPed->RestorePreviousObjective(); return 0; } case COMMAND_WARP_CHAR_INTO_CAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pVehicle); pPed->SetObjective(OBJECTIVE_ENTER_CAR_AS_DRIVER, pVehicle); pPed->WarpPedIntoCar(pVehicle); - pPed->RestorePreviousObjective(); return 0; } - case COMMAND_SWITCH_CAR_RADIO: - CollectParameters(&m_nIp, 1); - DMAudio.ChangeMusicMode(GET_INTEGER_PARAM(0)); - return 0; + //case COMMAND_SWITCH_CAR_RADIO: //case COMMAND_SET_AUDIO_STREAM: case COMMAND_PRINT_WITH_2_NUMBERS_BIG: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 4); - CMessages::AddBigMessageWithNumber(text, GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3) - 1, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1); + CMessages::AddBigMessageWithNumber(text, ScriptParams[2], ScriptParams[3] - 1, ScriptParams[0], ScriptParams[1], -1, -1, -1, -1); return 0; } + /* case COMMAND_PRINT_WITH_3_NUMBERS_BIG: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 5); - CMessages::AddBigMessageWithNumber(text, GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4) - 1, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), -1, -1, -1); + CMessages::AddBigMessageWithNumber(text, ScriptParams[3], ScriptParams[4] - 1, ScriptParams[0], ScriptParams[1], ScriptParams[2], -1, -1, -1); return 0; } - /* case COMMAND_PRINT_WITH_4_NUMBERS_BIG: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 6); - CMessages::AddBigMessageWithNumber(text, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5) - 1, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), -1, -1); + CMessages::AddBigMessageWithNumber(text, ScriptParams[4], ScriptParams[5] - 1, ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], -1, -1); return 0; } case COMMAND_PRINT_WITH_5_NUMBERS_BIG: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 7); - CMessages::AddBigMessageWithNumber(text, GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6) - 1, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), -1); + CMessages::AddBigMessageWithNumber(text, ScriptParams[5], ScriptParams[6] - 1, ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], -1); return 0; } case COMMAND_PRINT_WITH_6_NUMBERS_BIG: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 8); - CMessages::AddBigMessageWithNumber(text, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7) - 1, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5)); + CMessages::AddBigMessageWithNumber(text, ScriptParams[6], ScriptParams[7] - 1, ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], ScriptParams[5]); return 0; } */ case COMMAND_SET_CHAR_WAIT_STATE: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->SetWaitState((eWaitState)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2) >= 0 ? &GET_INTEGER_PARAM(2) : nil); + pPed->SetWaitState((eWaitState)ScriptParams[1], ScriptParams[2] >= 0 ? &ScriptParams[2] : nil); return 0; } case COMMAND_SET_CAMERA_BEHIND_PLAYER: @@ -1007,14 +1011,14 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) /* case COMMAND_SET_MOTION_BLUR: CollectParameters(&m_nIp, 1); - TheCamera.SetMotionBlur(0, 0, 0, 0, GET_INTEGER_PARAM(0)); + TheCamera.SetMotionBlur(0, 0, 0, 0, ScriptParams[0]); return 0; case COMMAND_PRINT_STRING_IN_STRING: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* string = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 2); - CMessages::AddMessageWithString(text, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), string); + CMessages::AddMessageWithString(text, ScriptParams[0], ScriptParams[1], string); return 0; } */ @@ -1041,7 +1045,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) ped->bRespondsToThreats = false; ped->bAllowMedicsToReviveMe = false; ped->bIsPlayerFriend = false; - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += 1.0f; @@ -1053,16 +1057,16 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) CWorld::Add(ped); ped->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pos); CPopulation::ms_nTotalMissionPeds++; - SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(ped)); + ScriptParams[0] = CPools::GetPedPool()->GetIndex(ped); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); + CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); return 0; } case COMMAND_SET_CHAR_OBJ_STEAL_ANY_CAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_STEAL_ANY_CAR); @@ -1074,7 +1078,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) CollectParameters(&m_nIp, 1); wchar* text1 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text2 = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_Repeatedly(GET_INTEGER_PARAM(0), text1, text2, nil, nil, nil, nil); + gPhoneInfo.SetPhoneMessage_Repeatedly(ScriptParams[0], text1, text2, nil, nil, nil, nil); return 0; } case COMMAND_SET_2_PHONE_MESSAGES: @@ -1082,7 +1086,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) CollectParameters(&m_nIp, 1); wchar* text1 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text2 = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_JustOnce(GET_INTEGER_PARAM(0), text1, text2, nil, nil, nil, nil); + gPhoneInfo.SetPhoneMessage_JustOnce(ScriptParams[0], text1, text2, nil, nil, nil, nil); return 0; } case COMMAND_SET_3_REPEATED_PHONE_MESSAGES: @@ -1091,7 +1095,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) wchar* text1 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text2 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text3 = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_Repeatedly(GET_INTEGER_PARAM(0), text1, text2, text3, nil, nil, nil); + gPhoneInfo.SetPhoneMessage_Repeatedly(ScriptParams[0], text1, text2, text3, nil, nil, nil); return 0; } case COMMAND_SET_3_PHONE_MESSAGES: @@ -1100,7 +1104,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) wchar* text1 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text2 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text3 = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_JustOnce(GET_INTEGER_PARAM(0), text1, text2, text3, nil, nil, nil); + gPhoneInfo.SetPhoneMessage_JustOnce(ScriptParams[0], text1, text2, text3, nil, nil, nil); return 0; } case COMMAND_SET_4_REPEATED_PHONE_MESSAGES: @@ -1110,7 +1114,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) wchar* text2 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text3 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text4 = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_Repeatedly(GET_INTEGER_PARAM(0), text1, text2, text3, text4, nil, nil); + gPhoneInfo.SetPhoneMessage_Repeatedly(ScriptParams[0], text1, text2, text3, text4, nil, nil); return 0; } case COMMAND_SET_4_PHONE_MESSAGES: @@ -1120,30 +1124,30 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) wchar* text2 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text3 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text4 = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_JustOnce(GET_INTEGER_PARAM(0), text1, text2, text3, text4, nil, nil); + gPhoneInfo.SetPhoneMessage_JustOnce(ScriptParams[0], text1, text2, text3, text4, nil, nil); return 0; } */ case COMMAND_IS_SNIPER_BULLET_IN_AREA: { CollectParameters(&m_nIp, 6); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + float supZ = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(0); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[0]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(1); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[1]; } if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(2); + infZ = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[2]; } UpdateCompareFlag(CBulletInfo::TestForSniperBullet(infX, supX, infY, supY, infZ, supZ)); return 0; @@ -1152,33 +1156,33 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_GIVE_PLAYER_DETONATOR: CGarages::GivePlayerDetonator(); return 0; + */ #ifdef GTA_SCRIPT_COLLECTIVE case COMMAND_SET_COLL_OBJ_STEAL_ANY_CAR: CollectParameters(&m_nIp, 1); - CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_STEAL_ANY_CAR); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_STEAL_ANY_CAR); return 0; #endif - */ case COMMAND_SET_OBJECT_VELOCITY: { CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - pObject->SetMoveSpeed(GET_VECTOR_PARAM(1) * METERS_PER_SECOND_TO_GAME_SPEED); + pObject->SetMoveSpeed(*(CVector*)&ScriptParams[1] * METERS_PER_SECOND_TO_GAME_SPEED); return 0; } case COMMAND_SET_OBJECT_COLLISION: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - pObject->bUsesCollision = (GET_INTEGER_PARAM(1) != 0); + pObject->bUsesCollision = (ScriptParams[1] != 0); return 0; } case COMMAND_IS_ICECREAM_JINGLE_ON: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); // Adding this check to correspond to command name. // All original game scripts always assume that the vehicle is actually Mr. Whoopee, @@ -1203,7 +1207,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) wchar* source = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* pstr = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 2); - CMessages::AddMessageJumpQWithString(source, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), pstr); + CMessages::AddMessageJumpQWithString(source, ScriptParams[0], ScriptParams[1], pstr); return 0; } //case COMMAND_PRINT_STRING_IN_STRING_SOON: @@ -1216,7 +1220,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) wchar* text3 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text4 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text5 = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_Repeatedly(GET_INTEGER_PARAM(0), text1, text2, text3, text4, text5, nil); + gPhoneInfo.SetPhoneMessage_Repeatedly(ScriptParams[0], text1, text2, text3, text4, text5, nil); return 0; } case COMMAND_SET_5_PHONE_MESSAGES: @@ -1227,7 +1231,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) wchar* text3 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text4 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text5 = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_JustOnce(GET_INTEGER_PARAM(0), text1, text2, text3, text4, text5, nil); + gPhoneInfo.SetPhoneMessage_JustOnce(ScriptParams[0], text1, text2, text3, text4, text5, nil); return 0; } case COMMAND_SET_6_REPEATED_PHONE_MESSAGES: @@ -1239,7 +1243,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) wchar* text4 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text5 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text6 = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_Repeatedly(GET_INTEGER_PARAM(0), text1, text2, text3, text4, text5, text6); + gPhoneInfo.SetPhoneMessage_Repeatedly(ScriptParams[0], text1, text2, text3, text4, text5, text6); return 0; } case COMMAND_SET_6_PHONE_MESSAGES: @@ -1251,19 +1255,19 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) wchar* text4 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text5 = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text6 = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_JustOnce(GET_INTEGER_PARAM(0), text1, text2, text3, text4, text5, text6); + gPhoneInfo.SetPhoneMessage_JustOnce(ScriptParams[0], text1, text2, text3, text4, text5, text6); return 0; } */ case COMMAND_IS_POINT_OBSCURED_BY_A_MISSION_ENTITY: { CollectParameters(&m_nIp, 6); - float infX = GET_FLOAT_PARAM(0) - GET_FLOAT_PARAM(3); - float supX = GET_FLOAT_PARAM(0) + GET_FLOAT_PARAM(3); - float infY = GET_FLOAT_PARAM(1) - GET_FLOAT_PARAM(4); - float supY = GET_FLOAT_PARAM(1) + GET_FLOAT_PARAM(4); - float infZ = GET_FLOAT_PARAM(2) - GET_FLOAT_PARAM(5); - float supZ = GET_FLOAT_PARAM(2) + GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[0] - *(float*)&ScriptParams[3]; + float supX = *(float*)&ScriptParams[0] + *(float*)&ScriptParams[3]; + float infY = *(float*)&ScriptParams[1] - *(float*)&ScriptParams[4]; + float supY = *(float*)&ScriptParams[1] + *(float*)&ScriptParams[4]; + float infZ = *(float*)&ScriptParams[2] - *(float*)&ScriptParams[5]; + float supZ = *(float*)&ScriptParams[2] + *(float*)&ScriptParams[5]; if (infX > supX) { float tmp = infX; infX = supX; @@ -1300,20 +1304,19 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_ADD_TO_OBJECT_VELOCITY: { CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - pObject->AddToMoveSpeed(GET_VECTOR_PARAM(1) * METERS_PER_SECOND_TO_GAME_SPEED); + pObject->AddToMoveSpeed(*(CVector*)&ScriptParams[1] * METERS_PER_SECOND_TO_GAME_SPEED); return 0; } - /* case COMMAND_DRAW_SPRITE: { CollectParameters(&m_nIp, 9); CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_bIsUsed = true; - CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_nTextureId = GET_INTEGER_PARAM(0) - 1; + CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_nTextureId = ScriptParams[0] - 1; CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_sRect = CRect( - GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), GET_FLOAT_PARAM(1) + GET_FLOAT_PARAM(3), GET_FLOAT_PARAM(2) + GET_FLOAT_PARAM(4)); - CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_sColor = CRGBA(GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(8)); + *(float*)&ScriptParams[1], *(float*)&ScriptParams[2], *(float*)&ScriptParams[1] + *(float*)&ScriptParams[3], *(float*)&ScriptParams[2] + *(float*)&ScriptParams[4]); + CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_sColor = CRGBA(ScriptParams[5], ScriptParams[6], ScriptParams[7], ScriptParams[8]); CTheScripts::NumberOfIntroRectanglesThisFrame++; return 0; } @@ -1323,8 +1326,8 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_bIsUsed = true; CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_nTextureId = -1; CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_sRect = CRect( - GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(0) + GET_FLOAT_PARAM(2), GET_FLOAT_PARAM(1) + GET_FLOAT_PARAM(3)); - CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_sColor = CRGBA(GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7)); + *(float*)&ScriptParams[0], *(float*)&ScriptParams[1], *(float*)&ScriptParams[0] + *(float*)&ScriptParams[2], *(float*)&ScriptParams[1] + *(float*)&ScriptParams[3]); + CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_sColor = CRGBA(ScriptParams[4], ScriptParams[5], ScriptParams[6], ScriptParams[7]); CTheScripts::NumberOfIntroRectanglesThisFrame++; return 0; } @@ -1338,7 +1341,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) int slot = CTxdStore::FindTxdSlot("script"); CTxdStore::PushCurrentTxd(); CTxdStore::SetCurrentTxd(slot); - CTheScripts::ScriptSprites[GET_INTEGER_PARAM(0) - 1].SetTexture(str); + CTheScripts::ScriptSprites[ScriptParams[0] - 1].SetTexture(str); CTxdStore::PopCurrentTxd(); return 0; } @@ -1360,13 +1363,12 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) CTheScripts::RemoveScriptTextureDictionary(); return 0; } - */ case COMMAND_SET_OBJECT_DYNAMIC: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - if (GET_INTEGER_PARAM(1)) { + if (ScriptParams[1]) { if (pObject->bIsStatic) { pObject->SetIsStatic(false); pObject->AddToMovingList(); @@ -1384,11 +1386,11 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_SET_CHAR_ANIM_SPEED: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); CAnimBlendAssociation* pAssoc = RpAnimBlendClumpGetFirstAssociation(pPed->GetClump()); if (pAssoc) - pAssoc->speed = GET_FLOAT_PARAM(1); + pAssoc->speed = *(float*)&ScriptParams[1]; return 0; } */ @@ -1396,127 +1398,126 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) { CollectParameters(&m_nIp, 1); DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND); - DMAudio.PlayFrontEndTrack(GET_INTEGER_PARAM(0) + STREAMED_SOUND_MISSION_COMPLETED - 1, 0); - //DMAudio.SaveAnnouncementsWhenMissionPassedPlayed(); // TODO! + DMAudio.PlayFrontEndTrack(ScriptParams[0] + STREAMED_SOUND_MISSION_COMPLETED - 1, 0); return 0; } case COMMAND_CLEAR_AREA: { CollectParameters(&m_nIp, 5); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CWorld::ClearExcitingStuffFromArea(pos, GET_FLOAT_PARAM(3), GET_INTEGER_PARAM(4)); + CWorld::ClearExcitingStuffFromArea(pos, *(float*)&ScriptParams[3], ScriptParams[4]); return 0; } case COMMAND_FREEZE_ONSCREEN_TIMER: CollectParameters(&m_nIp, 1); - CUserDisplay::OnscnTimer.m_bDisabled = GET_INTEGER_PARAM(0) != 0; + CUserDisplay::OnscnTimer.m_bDisabled = ScriptParams[0] != 0; return 0; case COMMAND_SWITCH_CAR_SIREN: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->m_bSirenOrAlarm = GET_INTEGER_PARAM(1) != 0; + pVehicle->m_bSirenOrAlarm = ScriptParams[1] != 0; return 0; } /* case COMMAND_SWITCH_PED_ROADS_ON_ANGLED: { CollectParameters(&m_nIp, 7); - ThePaths.SwitchRoadsInAngledArea(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), - GET_FLOAT_PARAM(3), GET_FLOAT_PARAM(4), GET_FLOAT_PARAM(5), GET_FLOAT_PARAM(6), 0, 1); + ThePaths.SwitchRoadsInAngledArea(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1], *(float*)&ScriptParams[2], + *(float*)&ScriptParams[3], *(float*)&ScriptParams[4], *(float*)&ScriptParams[5], *(float*)&ScriptParams[6], 0, 1); return 0; } - */ case COMMAND_SWITCH_PED_ROADS_OFF_ANGLED: CollectParameters(&m_nIp, 7); - ThePaths.SwitchRoadsInAngledArea(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), - GET_FLOAT_PARAM(3), GET_FLOAT_PARAM(4), GET_FLOAT_PARAM(5), GET_FLOAT_PARAM(6), 0, 0); + ThePaths.SwitchRoadsInAngledArea(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1], *(float*)&ScriptParams[2], + *(float*)&ScriptParams[3], *(float*)&ScriptParams[4], *(float*)&ScriptParams[5], *(float*)&ScriptParams[6], 0, 0); return 0; - /* case COMMAND_SWITCH_ROADS_ON_ANGLED: CollectParameters(&m_nIp, 7); - ThePaths.SwitchRoadsInAngledArea(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), - GET_FLOAT_PARAM(3), GET_FLOAT_PARAM(4), GET_FLOAT_PARAM(5), GET_FLOAT_PARAM(6), 1, 1); + ThePaths.SwitchRoadsInAngledArea(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1], *(float*)&ScriptParams[2], + *(float*)&ScriptParams[3], *(float*)&ScriptParams[4], *(float*)&ScriptParams[5], *(float*)&ScriptParams[6], 1, 1); return 0; case COMMAND_SWITCH_ROADS_OFF_ANGLED: CollectParameters(&m_nIp, 7); - ThePaths.SwitchRoadsInAngledArea(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), - GET_FLOAT_PARAM(3), GET_FLOAT_PARAM(4), GET_FLOAT_PARAM(5), GET_FLOAT_PARAM(6), 1, 0); + ThePaths.SwitchRoadsInAngledArea(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1], *(float*)&ScriptParams[2], + *(float*)&ScriptParams[3], *(float*)&ScriptParams[4], *(float*)&ScriptParams[5], *(float*)&ScriptParams[6], 1, 0); return 0; - */ + */ case COMMAND_SET_CAR_WATERTIGHT: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); if (pVehicle->IsBike()) { CBike* pBike = (CBike*)pVehicle; - pBike->bWaterTight = GET_INTEGER_PARAM(1) != 0; + pBike->bWaterTight = ScriptParams[1] != 0; } else if (pVehicle->IsCar()) { CAutomobile* pCar = (CAutomobile*)pVehicle; - pCar->bWaterTight = GET_INTEGER_PARAM(1) != 0; + pCar->bWaterTight = ScriptParams[1] != 0; } return 0; } case COMMAND_ADD_MOVING_PARTICLE_EFFECT: { CollectParameters(&m_nIp, 12); - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - float size = Max(0.0f, GET_FLOAT_PARAM(7)); - eParticleObjectType type = (eParticleObjectType)GET_INTEGER_PARAM(0); + float size = Max(0.0f, *(float*)&ScriptParams[7]); + eParticleObjectType type = (eParticleObjectType)ScriptParams[0]; RwRGBA color; - if (type == POBJECT_SMOKE_TRAIL){ // 17 in LCS -- assuming enum is the same + if (type == POBJECT_SMOKE_TRAIL){ color.alpha = -1; - color.red = GET_INTEGER_PARAM(8); - color.green = GET_INTEGER_PARAM(9); - color.blue = GET_INTEGER_PARAM(10); + color.red = ScriptParams[8]; + color.green = ScriptParams[9]; + color.blue = ScriptParams[10]; }else{ color.alpha = color.red = color.blue = color.green = 0; } - CVector target = GET_VECTOR_PARAM(4); - CParticleObject::AddObject(type, pos, target, size, GET_INTEGER_PARAM(11), color, 1); + CVector target = *(CVector*)&ScriptParams[4]; + CParticleObject::AddObject(type, pos, target, size, ScriptParams[11], color, 1); return 0; } case COMMAND_SET_CHAR_CANT_BE_DRAGGED_OUT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bDontDragMeOutCar = GET_INTEGER_PARAM(1) != 0; + pPed->bDontDragMeOutCar = ScriptParams[1] != 0; return 0; } case COMMAND_TURN_CAR_TO_FACE_COORD: { CollectParameters(&m_nIp, 3); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); const CVector& pos = pVehicle->GetPosition(); - float heading = CGeneral::GetATanOfXY(pos.x - GET_FLOAT_PARAM(1), pos.y - GET_FLOAT_PARAM(2)) + HALFPI; + float heading = CGeneral::GetATanOfXY(pos.x - *(float*)&ScriptParams[1], pos.y - *(float*)&ScriptParams[2]) + HALFPI; if (heading > TWOPI) heading -= TWOPI; pVehicle->SetHeading(heading); return 0; } + /* case COMMAND_IS_CRANE_LIFTING_CAR: { CollectParameters(&m_nIp, 3); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(2)); - UpdateCompareFlag(CCranes::IsThisCarPickedUp(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), pVehicle)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[2]); + UpdateCompareFlag(CCranes::IsThisCarPickedUp(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1], pVehicle)); return 0; } + */ case COMMAND_DRAW_SPHERE: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + 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, MARKERTYPE_CYLINDER, pos, GET_FLOAT_PARAM(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; @@ -1524,15 +1525,15 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_SET_CAR_STATUS: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->SetStatus(GET_INTEGER_PARAM(1)); + pVehicle->SetStatus(ScriptParams[1]); return 0; } case COMMAND_IS_CHAR_MALE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->m_nPedType != PEDTYPE_CIVFEMALE && pPed->m_nPedType != PEDTYPE_PROSTITUTE); return 0; @@ -1550,11 +1551,11 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_CHANGE_GARAGE_TYPE_WITH_CAR_MODEL: { CollectParameters(&m_nIp, 3); - CGarages::ChangeGarageType(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + CGarages::ChangeGarageType(ScriptParams[0], ScriptParams[1], ScriptParams[2]); return 0; } case COMMAND_FIND_DRUG_PLANE_COORDINATES: - SET_VECTOR_PARAM(0, CPlane::FindDrugPlaneCoordinates()); + *(CVector*)&ScriptParams[0] = CPlane::FindDrugPlaneCoordinates(); StoreParameters(&m_nIp, 3); return 0; */ @@ -1569,33 +1570,33 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) return 0; case COMMAND_POLICE_RADIO_MESSAGE: CollectParameters(&m_nIp, 3); - DMAudio.PlaySuspectLastSeen(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2)); + DMAudio.PlaySuspectLastSeen(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1], *(float*)&ScriptParams[2]); return 0; case COMMAND_SET_CAR_STRONG: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->bTakeLessDamage = GET_INTEGER_PARAM(1) != 0; + pVehicle->bTakeLessDamage = ScriptParams[1] != 0; return 0; } case COMMAND_REMOVE_ROUTE: CollectParameters(&m_nIp, 1); - CRouteNode::RemoveRoute(GET_INTEGER_PARAM(0)); + CRouteNode::RemoveRoute(ScriptParams[0]); return 0; case COMMAND_SWITCH_RUBBISH: CollectParameters(&m_nIp, 1); - CRubbish::SetVisibility(GET_INTEGER_PARAM(0) != 0); + CRubbish::SetVisibility(ScriptParams[0] != 0); return 0; case COMMAND_REMOVE_PARTICLE_EFFECTS_IN_AREA: { CollectParameters(&m_nIp, 6); - float x1 = GET_FLOAT_PARAM(0); - float y1 = GET_FLOAT_PARAM(1); - float z1 = GET_FLOAT_PARAM(2); - float x2 = GET_FLOAT_PARAM(3); - float y2 = GET_FLOAT_PARAM(4); - float z2 = GET_FLOAT_PARAM(5); + float x1 = *(float*)&ScriptParams[0]; + float y1 = *(float*)&ScriptParams[1]; + float z1 = *(float*)&ScriptParams[2]; + float x2 = *(float*)&ScriptParams[3]; + float y2 = *(float*)&ScriptParams[4]; + float z2 = *(float*)&ScriptParams[5]; CParticleObject* tmp = CParticleObject::pCloseListHead; while (tmp) { CParticleObject* next = tmp->m_pNext; @@ -1614,15 +1615,15 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) } case COMMAND_SWITCH_STREAMING: CollectParameters(&m_nIp, 1); - CStreaming::ms_disableStreaming = GET_INTEGER_PARAM(0) == 0; + CStreaming::ms_disableStreaming = ScriptParams[0] == 0; return 0; case COMMAND_IS_GARAGE_OPEN: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CGarages::IsGarageOpen(GET_INTEGER_PARAM(0))); + UpdateCompareFlag(CGarages::IsGarageOpen(ScriptParams[0])); return 0; case COMMAND_IS_GARAGE_CLOSED: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CGarages::IsGarageClosed(GET_INTEGER_PARAM(0))); + UpdateCompareFlag(CGarages::IsGarageClosed(ScriptParams[0])); return 0; /* case COMMAND_START_CATALINA_HELI: @@ -1641,17 +1642,45 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_SWAP_NEAREST_BUILDING_MODEL: { CollectParameters(&m_nIp, 6); - CTheScripts::SwapNearestBuildingModel(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), GET_FLOAT_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5)); + CVector pos = *(CVector*)&ScriptParams[0]; + if (pos.z <= MAP_Z_LOW_LIMIT) + pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); + float radius = *(float*)&ScriptParams[3]; + int mi1 = ScriptParams[4] >= 0 ? ScriptParams[4] : CTheScripts::UsedObjectArray[-ScriptParams[4]].index; + int mi2 = ScriptParams[5] >= 0 ? ScriptParams[5] : CTheScripts::UsedObjectArray[-ScriptParams[5]].index; + int16 total; + CEntity* apEntities[16]; + CWorld::FindObjectsOfTypeInRange(mi1, pos, radius, true, &total, 16, apEntities, true, false, false, false, false); + if (total == 0) + CWorld::FindObjectsOfTypeInRangeSectorList(mi1, CWorld::GetBigBuildingList(LEVEL_GENERIC), pos, radius, true, &total, 16, apEntities); + if (total == 0) + CWorld::FindObjectsOfTypeInRangeSectorList(mi1, CWorld::GetBigBuildingList(CTheZones::GetLevelFromPosition(&pos)), pos, radius, true, &total, 16, apEntities); + CEntity* pClosestEntity = nil; + float min_dist = 2.0f * radius; + for (int i = 0; i < total; i++) { + float dist = (apEntities[i]->GetPosition() - pos).Magnitude(); + if (dist < min_dist) { + min_dist = dist; + pClosestEntity = apEntities[i]; + } + } + if (!pClosestEntity) { + printf("Failed to find building\n"); + return 0; + } + CBuilding* pReplacedBuilding = ((CBuilding*)pClosestEntity); + pReplacedBuilding->ReplaceWithNewModel(mi2); + CTheScripts::AddToBuildingSwapArray(pReplacedBuilding, mi1, mi2); return 0; } case COMMAND_SWITCH_WORLD_PROCESSING: CollectParameters(&m_nIp, 1); - CWorld::bProcessCutsceneOnly = GET_INTEGER_PARAM(0) == 0; + CWorld::bProcessCutsceneOnly = ScriptParams[0] == 0; return 0; case COMMAND_REMOVE_ALL_PLAYER_WEAPONS: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); pPed->ClearWeapons(); return 0; @@ -1660,7 +1689,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_GRAB_CATALINA_HELI: { CHeli* pHeli = CHeli::FindPointerToCatalinasHeli(); - SET_INTEGER_PARAM(0, pHeli ? CPools::GetVehiclePool()->GetIndex(pHeli) : -1); + ScriptParams[0] = pHeli ? CPools::GetVehiclePool()->GetIndex(pHeli) : -1; StoreParameters(&m_nIp, 1); return 0; } @@ -1668,46 +1697,46 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_CLEAR_AREA_OF_CARS: { CollectParameters(&m_nIp, 6); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + float supZ = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(0); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[0]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(1); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[1]; } if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(2); + infZ = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[2]; } CWorld::ClearCarsFromArea(infX, infY, infZ, supX, supY, supZ); return 0; } case COMMAND_SET_ROTATING_GARAGE_DOOR: CollectParameters(&m_nIp, 1); - CGarages::SetGarageDoorToRotate(GET_INTEGER_PARAM(0)); + CGarages::SetGarageDoorToRotate(ScriptParams[0]); return 0; case COMMAND_ADD_SPHERE: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - float radius = GET_FLOAT_PARAM(3); + float radius = *(float*)&ScriptParams[3]; CTheScripts::GetActualScriptSphereIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CTheScripts::AddScriptSphere((uintptr)this + m_nIp, pos, radius)); + ScriptParams[0] = CTheScripts::AddScriptSphere((uintptr)this + m_nIp, pos, radius); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_REMOVE_SPHERE: CollectParameters(&m_nIp, 1); - CTheScripts::RemoveScriptSphere(GET_INTEGER_PARAM(0)); + CTheScripts::RemoveScriptSphere(ScriptParams[0]); return 0; /* case COMMAND_CATALINA_HELI_FLY_AWAY: @@ -1717,9 +1746,9 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_SET_EVERYONE_IGNORE_PLAYER: { CollectParameters(&m_nIp, 2); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - if (GET_INTEGER_PARAM(1)) { + if (ScriptParams[1]) { pPed->m_pWanted->m_bIgnoredByEveryone = true; CWorld::StopAllLawEnforcersInTheirTracks(); } @@ -1731,47 +1760,49 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_STORE_CAR_CHAR_IS_IN_NO_SAVE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); CVehicle* pVehicle = pPed->bInVehicle ? pPed->m_pMyVehicle : nil; - SET_INTEGER_PARAM(0, CPools::GetVehiclePool()->GetIndex(pVehicle)); + ScriptParams[0] = CPools::GetVehiclePool()->GetIndex(pVehicle); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_STORE_CAR_PLAYER_IS_IN_NO_SAVE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); CVehicle* pVehicle = pPed->bInVehicle ? pPed->m_pMyVehicle : nil; - SET_INTEGER_PARAM(0, CPools::GetVehiclePool()->GetIndex(pVehicle)); + ScriptParams[0] = CPools::GetVehiclePool()->GetIndex(pVehicle); StoreParameters(&m_nIp, 1); return 0; } /* case COMMAND_IS_PHONE_DISPLAYING_MESSAGE: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(gPhoneInfo.IsMessageBeingDisplayed(GET_INTEGER_PARAM(0))); + UpdateCompareFlag(gPhoneInfo.IsMessageBeingDisplayed(ScriptParams[0])); return 0; */ case COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_STRING: { - uint16 var = (uint8*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - CTheScripts::ScriptSpace; + script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); + uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp); CollectParameters(&m_nIp, 1); wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ??? strncpy(onscreen_str, (char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); m_nIp += KEY_LENGTH_IN_SCRIPT; - CUserDisplay::OnscnTimer.AddClock(var, onscreen_str, GET_INTEGER_PARAM(0) != 0); + CUserDisplay::OnscnTimer.AddClock(var, onscreen_str, ScriptParams[0] != 0); return 0; } case COMMAND_DISPLAY_ONSCREEN_COUNTER_WITH_STRING: { - uint16 var = (uint8*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - CTheScripts::ScriptSpace; + script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); + uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp); CollectParameters(&m_nIp, 1); wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ??? strncpy(onscreen_str, (char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); m_nIp += KEY_LENGTH_IN_SCRIPT; - CUserDisplay::OnscnTimer.AddCounter(var, GET_INTEGER_PARAM(0), onscreen_str, 0); + CUserDisplay::OnscnTimer.AddCounter(var, ScriptParams[0], onscreen_str, 0); return 0; } case COMMAND_CREATE_RANDOM_CAR_FOR_CAR_PARK: @@ -1790,8 +1821,6 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) continue; if (CModelInfo::IsCarModel(model) || CModelInfo::IsBikeModel(model)) { switch (model) { - // TODO(LCS): do it right - // apparently leeds didn't :lmao: case MI_LANDSTAL: case MI_LINERUN: case MI_RIO: @@ -1817,13 +1846,13 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case MI_ANGEL: case MI_COACH: case MI_RCBANDIT: - //case MI_ROMERO: - //case MI_PACKER: - //case MI_SENTXS: + case MI_ROMERO: + case MI_PACKER: + case MI_SENTXS: case MI_SQUALO: case MI_SEASPAR: case MI_PIZZABOY: - //case MI_GANGBUR: + case MI_GANGBUR: case MI_AIRTRAIN: case MI_DEADDODO: case MI_SPEEDER: @@ -1832,44 +1861,44 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case MI_FLATBED: case MI_YANKEE: case MI_CADDY: - //case MI_ZEBRA: + case MI_ZEBRA: case MI_TOPFUN: case MI_SKIMMER: case MI_RCBARON: case MI_RCRAIDER: case MI_SPARROW: case MI_PATRIOT: - //case MI_LOVEFIST: + case MI_LOVEFIST: case MI_COASTG: case MI_DINGHY: - //case MI_HERMES: - //case MI_SABRETUR: + case MI_HERMES: + case MI_SABRETUR: case MI_PHEONIX: - //case MI_WALTON: + case MI_WALTON: case MI_COMET: - //case MI_DELUXO: - //case MI_BURRITO: - //case MI_SPAND: + case MI_DELUXO: + case MI_BURRITO: + case MI_SPAND: case MI_MARQUIS: case MI_BAGGAGE: - //case MI_KAUFMAN: + case MI_KAUFMAN: case MI_MAVERICK: case MI_VCNMAV: - //case MI_RANCHER: + case MI_RANCHER: case MI_FBIRANCH: case MI_JETMAX: - //case MI_HOTRING: + case MI_HOTRING: case MI_SANDKING: - //case MI_BLISTAC: + case MI_BLISTAC: case MI_POLMAV: - //case MI_BOXVILLE: - //case MI_BENSON: - //case MI_MESA: + case MI_BOXVILLE: + case MI_BENSON: + case MI_MESA: case MI_RCGOBLIN: - //case MI_HOTRINA: - //case MI_HOTRINB: - //case MI_BLOODRA: - //case MI_BLOODRB: + case MI_HOTRINA: + case MI_HOTRINB: + case MI_BLOODRA: + case MI_BLOODRB: case MI_VICECHEE: model = -1; break; @@ -1884,23 +1913,23 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case MI_MOONBEAM: case MI_ESPERANT: case MI_TAXI: - //case MI_WASHING: + case MI_WASHING: case MI_BOBCAT: case MI_BANSHEE: - //case MI_CABBIE: + case MI_CABBIE: case MI_STALLION: case MI_RUMPO: - //case MI_ADMIRAL: + case MI_ADMIRAL: case MI_PCJ600: case MI_FAGGIO: case MI_FREEWAY: - //case MI_GLENDALE: - //case MI_OCEANIC: + case MI_GLENDALE: + case MI_OCEANIC: case MI_SANCHEZ: - //case MI_SABRE: - //case MI_REGINA: - //case MI_VIRGO: - //case MI_GREENWOO: + case MI_SABRE: + case MI_REGINA: + case MI_VIRGO: + case MI_GREENWOO: break; default: printf("CREATE_RANDOM_CAR_FOR_CAR_PARK - Unknown car model %d\n", CStreaming::ms_vehiclesLoaded[index]); @@ -1922,10 +1951,10 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) } else car = new CAutomobile(model, RANDOM_VEHICLE); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; pos.z += car->GetDistanceFromCentreOfMassToBaseOfModel(); car->SetPosition(pos); - car->SetHeading(DEGTORAD(GET_FLOAT_PARAM(3))); + car->SetHeading(DEGTORAD(*(float*)&ScriptParams[3])); CTheScripts::ClearSpaceForMissionEntity(pos, car); car->SetStatus(STATUS_ABANDONED); car->bIsLocked = false; @@ -1941,33 +1970,37 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) CWorld::Add(car); return 0; } + /* case COMMAND_IS_COLLISION_IN_MEMORY: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CGame::currLevel == GET_INTEGER_PARAM(0)); + UpdateCompareFlag(CCollision::ms_collisionInMemory == ScriptParams[0]); return 0; + */ case COMMAND_SET_WANTED_MULTIPLIER: CollectParameters(&m_nIp, 1); - FindPlayerPed()->m_pWanted->m_fCrimeSensitivity = GET_FLOAT_PARAM(0); + FindPlayerPed()->m_pWanted->m_fCrimeSensitivity = *(float*)&ScriptParams[0]; return 0; case COMMAND_SET_CAMERA_IN_FRONT_OF_PLAYER: TheCamera.SetCameraDirectlyInFrontForFollowPed_CamOnAString(); return 0; + /* case COMMAND_IS_CAR_VISIBLY_DAMAGED: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); UpdateCompareFlag(pVehicle->bIsDamaged); return 0; } + */ case COMMAND_DOES_OBJECT_EXIST: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0))); + UpdateCompareFlag(CPools::GetObjectPool()->GetAt(ScriptParams[0])); return 0; case COMMAND_LOAD_SCENE: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; #ifdef FIX_BUGS CTimer::Suspend(); #else @@ -1984,20 +2017,20 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_ADD_STUCK_CAR_CHECK: { CollectParameters(&m_nIp, 3); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - CTheScripts::StuckCars.AddCarToCheck(GET_INTEGER_PARAM(0), GET_FLOAT_PARAM(1), GET_INTEGER_PARAM(2)); + CTheScripts::StuckCars.AddCarToCheck(ScriptParams[0], *(float*)&ScriptParams[1], ScriptParams[2]); return 0; } case COMMAND_REMOVE_STUCK_CAR_CHECK: { CollectParameters(&m_nIp, 1); - CTheScripts::StuckCars.RemoveCarFromCheck(GET_INTEGER_PARAM(0)); + CTheScripts::StuckCars.RemoveCarFromCheck(ScriptParams[0]); return 0; } case COMMAND_IS_CAR_STUCK: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CTheScripts::StuckCars.HasCarBeenStuckForAWhile(GET_INTEGER_PARAM(0))); + UpdateCompareFlag(CTheScripts::StuckCars.HasCarBeenStuckForAWhile(ScriptParams[0])); return 0; case COMMAND_LOAD_MISSION_AUDIO: { @@ -2006,43 +2039,41 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) for (int i = 0; i < KEY_LENGTH_IN_SCRIPT; i++) str[i] = tolower(str[i]); m_nIp += KEY_LENGTH_IN_SCRIPT; - DMAudio.PreloadMissionAudio(GET_INTEGER_PARAM(0) - 1, str); + DMAudio.PreloadMissionAudio(ScriptParams[0] - 1, str); return 0; } case COMMAND_HAS_MISSION_AUDIO_LOADED: { CollectParameters(&m_nIp, 1); - //UpdateCompareFlag(DMAudio.GetMissionAudioLoadingStatus(GET_INTEGER_PARAM(0) - 1) == 1); - UpdateCompareFlag(true); // TODO + UpdateCompareFlag(DMAudio.GetMissionAudioLoadingStatus(ScriptParams[0] - 1) == 1); return 0; } case COMMAND_PLAY_MISSION_AUDIO: CollectParameters(&m_nIp, 1); - DMAudio.PlayLoadedMissionAudio(GET_INTEGER_PARAM(0) - 1); + DMAudio.PlayLoadedMissionAudio(ScriptParams[0] - 1); return 0; case COMMAND_HAS_MISSION_AUDIO_FINISHED: { CollectParameters(&m_nIp, 1); - //UpdateCompareFlag(DMAudio.IsMissionAudioSampleFinished(GET_INTEGER_PARAM(0) - 1)); // TODO - UpdateCompareFlag(true); + UpdateCompareFlag(DMAudio.IsMissionAudioSampleFinished(ScriptParams[0] - 1)); return 0; } case COMMAND_GET_CLOSEST_CAR_NODE_WITH_HEADING: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); int node = ThePaths.FindNodeClosestToCoors(pos, 0, 999999.9f, true, true); - SET_VECTOR_PARAM(0, ThePaths.FindNodeCoorsForScript(node)); - SET_FLOAT_PARAM(3, ThePaths.FindNodeOrientationForCarPlacement(node)); + *(CVector*)&ScriptParams[0] = ThePaths.FindNodeCoorsForScript(node); + *(float*)&ScriptParams[3] = ThePaths.FindNodeOrientationForCarPlacement(node); StoreParameters(&m_nIp, 4); return 0; } case COMMAND_HAS_IMPORT_GARAGE_SLOT_BEEN_FILLED: { CollectParameters(&m_nIp, 2); - UpdateCompareFlag(CGarages::HasImportExportGarageCollectedThisCar(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1) - 1)); + UpdateCompareFlag(CGarages::HasImportExportGarageCollectedThisCar(ScriptParams[0], ScriptParams[1] - 1)); return 0; } case COMMAND_CLEAR_THIS_PRINT: @@ -2060,8 +2091,8 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_SET_MISSION_AUDIO_POSITION: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(1); - DMAudio.SetMissionAudioLocation(GET_INTEGER_PARAM(0) - 1, pos.x, pos.y, pos.z); + CVector pos = *(CVector*)&ScriptParams[1]; + DMAudio.SetMissionAudioLocation(ScriptParams[0] - 1, pos.x, pos.y, pos.z); return 0; } case COMMAND_ACTIVATE_SAVE_MENU: @@ -2077,15 +2108,15 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) return 0; case COMMAND_NO_SPECIAL_CAMERA_FOR_THIS_GARAGE: CollectParameters(&m_nIp, 1); - CGarages::SetLeaveCameraForThisGarage(GET_INTEGER_PARAM(0)); + CGarages::SetLeaveCameraForThisGarage(ScriptParams[0]); return 0; /* case COMMAND_ADD_BLIP_FOR_PICKUP_OLD: { CollectParameters(&m_nIp, 3); - CObject* pObject = CPickups::aPickUps[CPickups::GetActualPickupIndex(GET_INTEGER_PARAM(0))].m_pObject; + CObject* pObject = CPickups::aPickUps[CPickups::GetActualPickupIndex(ScriptParams[0])].m_pObject; CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CRadar::SetEntityBlip(BLIP_OBJECT, CPools::GetObjectPool()->GetIndex(pObject), GET_INTEGER_PARAM(1), (eBlipDisplay)GET_INTEGER_PARAM(2))); + ScriptParams[0] = CRadar::SetEntityBlip(BLIP_OBJECT, CPools::GetObjectPool()->GetIndex(pObject), ScriptParams[1], (eBlipDisplay)ScriptParams[2]); StoreParameters(&m_nIp, 1); return 0; } @@ -2093,11 +2124,11 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_ADD_BLIP_FOR_PICKUP: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPickups::aPickUps[CPickups::GetActualPickupIndex(GET_INTEGER_PARAM(0))].m_pObject; + CObject* pObject = CPickups::aPickUps[CPickups::GetActualPickupIndex(ScriptParams[0])].m_pObject; CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); int handle = CRadar::SetEntityBlip(BLIP_OBJECT, CPools::GetObjectPool()->GetIndex(pObject), 6, BLIP_DISPLAY_BOTH); CRadar::ChangeBlipScale(handle, 3); - SET_INTEGER_PARAM(0, handle); + ScriptParams[0] = handle; StoreParameters(&m_nIp, 1); return 0; } @@ -2105,55 +2136,52 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_ADD_SPRITE_BLIP_FOR_PICKUP: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPickups::aPickUps[CPickups::GetActualPickupIndex(GET_INTEGER_PARAM(0))].m_pObject; + CObject* pObject = CPickups::aPickUps[CPickups::GetActualPickupIndex(ScriptParams[0])].m_pObject; CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); int handle = CRadar::SetEntityBlip(BLIP_OBJECT, CPools::GetObjectPool()->GetIndex(pObject), 6, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(handle, GET_INTEGER_PARAM(1)); - SET_INTEGER_PARAM(0, handle); + CRadar::SetBlipSprite(handle, ScriptParams[1]); + ScriptParams[0] = handle; StoreParameters(&m_nIp, 1); return 0; } */ case COMMAND_SET_PED_DENSITY_MULTIPLIER: CollectParameters(&m_nIp, 1); - CPopulation::PedDensityMultiplier = GET_FLOAT_PARAM(0); + CPopulation::PedDensityMultiplier = *(float*)&ScriptParams[0]; return 0; case COMMAND_FORCE_RANDOM_PED_TYPE: CollectParameters(&m_nIp, 1); - CPopulation::m_AllRandomPedsThisType = GET_INTEGER_PARAM(0); + CPopulation::m_AllRandomPedsThisType = ScriptParams[0]; return 0; /* case COMMAND_SET_TEXT_DRAW_BEFORE_FADE: CollectParameters(&m_nIp, 1); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bTextBeforeFade = GET_INTEGER_PARAM(0) != 0; + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bTextBeforeFade = ScriptParams[0] != 0; return 0; */ case COMMAND_GET_COLLECTABLE1S_COLLECTED: - SET_INTEGER_PARAM(0, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages); + ScriptParams[0] = CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages; StoreParameters(&m_nIp, 1); return 0; case COMMAND_SET_CHAR_OBJ_LEAVE_ANY_CAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_LEAVE_CAR, pPed->m_pMyVehicle); return 0; } - /* case COMMAND_SET_SPRITES_DRAW_BEFORE_FADE: CollectParameters(&m_nIp, 1); - CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_bBeforeFade = GET_INTEGER_PARAM(0) != 0; + CTheScripts::IntroRectangles[CTheScripts::NumberOfIntroRectanglesThisFrame].m_bBeforeFade = ScriptParams[0] != 0; return 0; - */ case COMMAND_SET_TEXT_RIGHT_JUSTIFY: CollectParameters(&m_nIp, 1); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bRightJustify = GET_INTEGER_PARAM(0) != 0; + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_bRightJustify = ScriptParams[0] != 0; return 0; case COMMAND_PRINT_HELP: { - /* maybe will be useful? TODO if (CCamera::m_bUseMouse3rdPerson && ( strcmp((char*)&CTheScripts::ScriptSpace[m_nIp], "HELP15") == 0 || strcmp((char*)&CTheScripts::ScriptSpace[m_nIp], "GUN_2A") == 0 || @@ -2162,18 +2190,16 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) m_nIp += KEY_LENGTH_IN_SCRIPT; return 0; } - */ wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CHud::SetHelpMessage(text, false); return 0; } case COMMAND_CLEAR_HELP: - //CHud::gLastPrintForeverString = false; TODO CHud::SetHelpMessage(nil, false); return 0; case COMMAND_FLASH_HUD_OBJECT: CollectParameters(&m_nIp, 1); - CHud::m_ItemToFlash = GET_INTEGER_PARAM(0); + CHud::m_ItemToFlash = ScriptParams[0]; return 0; default: script_assert(0); @@ -2238,36 +2264,6 @@ void CTheScripts::RemoveScriptSphere(int32 index) ScriptSphereArray[index].m_Id = 0; } -void CTheScripts::SwapNearestBuildingModel(float x, float y, float z, float radius, int mi1, int mi2) -{ - CVector pos(x, y, z); - if (pos.z <= MAP_Z_LOW_LIMIT) - pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - if (mi1 < 0) - mi1 = CTheScripts::UsedObjectArray[-mi1].index; - if (mi2 < 0) - mi2 = CTheScripts::UsedObjectArray[-mi2].index; - int16 total; - CEntity* apEntities[16]; - CWorld::FindObjectsOfTypeInRange(mi1, pos, radius, true, &total, 16, apEntities, true, false, false, false, false); - if (total == 0) - CWorld::FindObjectsOfTypeInRangeSectorList(mi1, CWorld::GetBigBuildingList(LEVEL_GENERIC), pos, radius, true, &total, 16, apEntities); - if (total == 0) - CWorld::FindObjectsOfTypeInRangeSectorList(mi1, CWorld::GetBigBuildingList(CTheZones::GetLevelFromPosition(&pos)), pos, radius, true, &total, 16, apEntities); - CEntity* pClosestEntity = nil; - float min_dist = 2.0f * radius; - for (int i = 0; i < total; i++) { - float dist = (apEntities[i]->GetPosition() - pos).Magnitude(); - if (dist < min_dist) { - min_dist = dist; - pClosestEntity = apEntities[i]; - } - } - CBuilding* pReplacedBuilding = ((CBuilding*)pClosestEntity); - pReplacedBuilding->ReplaceWithNewModel(mi2); - AddToBuildingSwapArray(pReplacedBuilding, mi1, mi2); -} - void CTheScripts::AddToBuildingSwapArray(CBuilding* pBuilding, int32 old_model, int32 new_model) { int i = 0; diff --git a/src/control/Script5.cpp b/src/control/Script5.cpp index 8354492..1371f2e 100644 --- a/src/control/Script5.cpp +++ b/src/control/Script5.cpp @@ -17,20 +17,32 @@ #include "World.h" #include "main.h" -// LCS: file done except TODOs - -uint32 CRunningScript::CollectLocateParameters(uint32* pIp, bool b3D) +void CRunningScript::UpdateCompareFlag(bool flag) { - CollectParameters(pIp, 1); - uint32 id = (uintptr)this + (*pIp - 16); - uint32 ip = *pIp; - uint8 type = CTheScripts::Read1ByteFromScript(&ip); - if (type >= ARGUMENT_LOCAL) { - ip--; - id = (uint32)(uintptr)GetPointerToScriptVariable(&ip, 0); + if (m_bNotFlag) + flag = !flag; + if (m_nAndOrState == ANDOR_NONE) { + m_bCondResult = flag; + return; } - CollectParameters(pIp, b3D ? 7 : 5, &(ScriptParams[1])); - return id; + if (m_nAndOrState >= ANDS_1 && m_nAndOrState <= ANDS_8) { + m_bCondResult &= flag; + if (m_nAndOrState == ANDS_1) { + m_nAndOrState = ANDOR_NONE; + return; + } + } + else if (m_nAndOrState >= ORS_1 && m_nAndOrState <= ORS_8) { + m_bCondResult |= flag; + if (m_nAndOrState == ORS_1) { + m_nAndOrState = ANDOR_NONE; + return; + } + } + else { + return; + } + m_nAndOrState--; } void CRunningScript::LocatePlayerCommand(int32 command, uint32* pIp) @@ -50,8 +62,8 @@ void CRunningScript::LocatePlayerCommand(int32 command, uint32* pIp) b3D = false; break; } - uint32 id = CollectLocateParameters(pIp, b3D); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; + CollectParameters(pIp, b3D ? 8 : 6); + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; switch (command) { case COMMAND_LOCATE_STOPPED_PLAYER_ANY_MEANS_2D: case COMMAND_LOCATE_STOPPED_PLAYER_ANY_MEANS_3D: @@ -67,23 +79,37 @@ void CRunningScript::LocatePlayerCommand(int32 command, uint32* pIp) default: break; } - X = GET_FLOAT_PARAM(1); - Y = GET_FLOAT_PARAM(2); + X = *(float*)&ScriptParams[1]; + Y = *(float*)&ScriptParams[2]; if (b3D) { - Z = GET_FLOAT_PARAM(3); - dX = GET_FLOAT_PARAM(4); - dY = GET_FLOAT_PARAM(5); - dZ = GET_FLOAT_PARAM(6); - debug = GET_INTEGER_PARAM(7); + Z = *(float*)&ScriptParams[3]; + dX = *(float*)&ScriptParams[4]; + dY = *(float*)&ScriptParams[5]; + dZ = *(float*)&ScriptParams[6]; + debug = ScriptParams[7]; } else { - dX = GET_FLOAT_PARAM(3); - dY = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dX = *(float*)&ScriptParams[3]; + dY = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } - CVector pos = pPlayerInfo->GetPos(); if (!decided) { + CVector pos = pPlayerInfo->GetPos(); result = false; - if (Abs(pos.x - X) < dX && Abs(pos.y - Y) < dY && (!b3D || Abs(pos.z - Z) < dZ)) { + bool in_area; + if (b3D) { + in_area = X - dX <= pos.x && + X + dX >= pos.x && + Y - dY <= pos.y && + Y + dY >= pos.y && + Z - dZ <= pos.z && + Z + dZ >= pos.z; + } else { + in_area = X - dX <= pos.x && + X + dX >= pos.x && + Y - dY <= pos.y && + Y + dY >= pos.y; + } + if (in_area) { switch (command) { case COMMAND_LOCATE_PLAYER_ANY_MEANS_2D: case COMMAND_LOCATE_PLAYER_ANY_MEANS_3D: @@ -110,16 +136,14 @@ void CRunningScript::LocatePlayerCommand(int32 command, uint32* pIp) } } UpdateCompareFlag(result); - if (debug && Abs(pos.x - X) < 80.0f && Abs(pos.y - Y) < 80.0f) - CTheScripts::HighlightImportantArea(id, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); - /* + if (debug) + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::LocatePlayerCharCommand(int32 command, uint32* pIp) @@ -137,8 +161,8 @@ void CRunningScript::LocatePlayerCharCommand(int32 command, uint32* pIp) break; } CollectParameters(pIp, b3D ? 6 : 5); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; - CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; + CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pTarget); CVector pos = pPlayerInfo->GetPos(); if (pTarget->bInVehicle) { @@ -150,14 +174,14 @@ void CRunningScript::LocatePlayerCharCommand(int32 command, uint32* pIp) Y = pTarget->GetPosition().y; Z = pTarget->GetPosition().z; } - dX = GET_FLOAT_PARAM(2); - dY = GET_FLOAT_PARAM(3); + dX = *(float*)&ScriptParams[2]; + dY = *(float*)&ScriptParams[3]; if (b3D) { - dZ = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dZ = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } else { - debug = GET_INTEGER_PARAM(4); + debug = ScriptParams[4]; } result = false; bool in_area; @@ -201,14 +225,12 @@ void CRunningScript::LocatePlayerCharCommand(int32 command, uint32* pIp) #else CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dX, b3D ? Z : MAP_Z_LOW_LIMIT); #endif - /* if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::LocatePlayerCarCommand(int32 command, uint32* pIp) @@ -226,21 +248,21 @@ void CRunningScript::LocatePlayerCarCommand(int32 command, uint32* pIp) break; } CollectParameters(pIp, b3D ? 6 : 5); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; - CVehicle* pTarget = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; + CVehicle* pTarget = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pTarget); CVector pos = pPlayerInfo->GetPos(); X = pTarget->GetPosition().x; Y = pTarget->GetPosition().y; Z = pTarget->GetPosition().z; - dX = GET_FLOAT_PARAM(2); - dY = GET_FLOAT_PARAM(3); + dX = *(float*)&ScriptParams[2]; + dY = *(float*)&ScriptParams[3]; if (b3D) { - dZ = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dZ = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } else { - debug = GET_INTEGER_PARAM(4); + debug = ScriptParams[4]; } result = false; bool in_area; @@ -280,14 +302,12 @@ void CRunningScript::LocatePlayerCarCommand(int32 command, uint32* pIp) UpdateCompareFlag(result); if (debug) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::LocateCharCommand(int32 command, uint32* pIp) @@ -307,8 +327,8 @@ void CRunningScript::LocateCharCommand(int32 command, uint32* pIp) b3D = false; break; } - uint32 id = CollectLocateParameters(pIp, b3D); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CollectParameters(pIp, b3D ? 8 : 6); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); CVector pos = pPed->InVehicle() ? pPed->m_pMyVehicle->GetPosition() : pPed->GetPosition(); switch (command) { @@ -326,19 +346,19 @@ void CRunningScript::LocateCharCommand(int32 command, uint32* pIp) default: break; } - X = GET_FLOAT_PARAM(1); - Y = GET_FLOAT_PARAM(2); + X = *(float*)&ScriptParams[1]; + Y = *(float*)&ScriptParams[2]; if (b3D) { - Z = GET_FLOAT_PARAM(3); - dX = GET_FLOAT_PARAM(4); - dY = GET_FLOAT_PARAM(5); - dZ = GET_FLOAT_PARAM(6); - debug = GET_INTEGER_PARAM(7); + Z = *(float*)&ScriptParams[3]; + dX = *(float*)&ScriptParams[4]; + dY = *(float*)&ScriptParams[5]; + dZ = *(float*)&ScriptParams[6]; + debug = ScriptParams[7]; } else { - dX = GET_FLOAT_PARAM(3); - dY = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dX = *(float*)&ScriptParams[3]; + dY = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } if (!decided) { result = false; @@ -385,15 +405,13 @@ void CRunningScript::LocateCharCommand(int32 command, uint32* pIp) } UpdateCompareFlag(result); if (debug) - CTheScripts::HighlightImportantArea(id, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); - /* + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::LocateCharCharCommand(int32 command, uint32* pIp) @@ -411,9 +429,9 @@ void CRunningScript::LocateCharCharCommand(int32 command, uint32* pIp) break; } CollectParameters(pIp, b3D ? 6 : 5); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pTarget); CVector pos = pPed->bInVehicle ? pPed->m_pMyVehicle->GetPosition() : pPed->GetPosition(); if (pTarget->bInVehicle) { @@ -426,14 +444,14 @@ void CRunningScript::LocateCharCharCommand(int32 command, uint32* pIp) Y = pTarget->GetPosition().y; Z = pTarget->GetPosition().z; } - dX = GET_FLOAT_PARAM(2); - dY = GET_FLOAT_PARAM(3); + dX = *(float*)&ScriptParams[2]; + dY = *(float*)&ScriptParams[3]; if (b3D) { - dZ = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dZ = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } else { - debug = GET_INTEGER_PARAM(4); + debug = ScriptParams[4]; } result = false; bool in_area; @@ -477,14 +495,12 @@ void CRunningScript::LocateCharCharCommand(int32 command, uint32* pIp) #else CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dX, b3D ? Z : MAP_Z_LOW_LIMIT); #endif - /* if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::LocateCharCarCommand(int32 command, uint32* pIp) @@ -502,22 +518,22 @@ void CRunningScript::LocateCharCarCommand(int32 command, uint32* pIp) break; } CollectParameters(pIp, b3D ? 6 : 5); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CVehicle* pTarget = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pTarget = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pTarget); CVector pos = pPed->bInVehicle ? pPed->m_pMyVehicle->GetPosition() : pPed->GetPosition(); X = pTarget->GetPosition().x; Y = pTarget->GetPosition().y; Z = pTarget->GetPosition().z; - dX = GET_FLOAT_PARAM(2); - dY = GET_FLOAT_PARAM(3); + dX = *(float*)&ScriptParams[2]; + dY = *(float*)&ScriptParams[3]; if (b3D) { - dZ = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dZ = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } else { - debug = GET_INTEGER_PARAM(4); + debug = ScriptParams[4]; } result = false; bool in_area; @@ -557,14 +573,12 @@ void CRunningScript::LocateCharCarCommand(int32 command, uint32* pIp) UpdateCompareFlag(result); if (debug) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::LocateCharObjectCommand(int32 command, uint32* pIp) @@ -582,22 +596,22 @@ void CRunningScript::LocateCharObjectCommand(int32 command, uint32* pIp) break; } CollectParameters(pIp, b3D ? 6 : 5); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CObject* pTarget = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); + CObject* pTarget = CPools::GetObjectPool()->GetAt(ScriptParams[1]); script_assert(pTarget); CVector pos = pPed->bInVehicle ? pPed->m_pMyVehicle->GetPosition() : pPed->GetPosition(); X = pTarget->GetPosition().x; Y = pTarget->GetPosition().y; Z = pTarget->GetPosition().z; - dX = GET_FLOAT_PARAM(2); - dY = GET_FLOAT_PARAM(3); + dX = *(float*)&ScriptParams[2]; + dY = *(float*)&ScriptParams[3]; if (b3D) { - dZ = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dZ = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } else { - debug = GET_INTEGER_PARAM(4); + debug = ScriptParams[4]; } result = false; bool in_area; @@ -637,14 +651,12 @@ void CRunningScript::LocateCharObjectCommand(int32 command, uint32* pIp) UpdateCompareFlag(result); if (debug) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::LocateCarCommand(int32 command, uint32* pIp) @@ -660,8 +672,8 @@ void CRunningScript::LocateCarCommand(int32 command, uint32* pIp) b3D = false; break; } - uint32 id = CollectLocateParameters(pIp, b3D); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CollectParameters(pIp, b3D ? 8 : 6); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); CVector pos = pVehicle->GetPosition(); switch (command) { @@ -675,19 +687,19 @@ void CRunningScript::LocateCarCommand(int32 command, uint32* pIp) default: break; } - X = GET_FLOAT_PARAM(1); - Y = GET_FLOAT_PARAM(2); + X = *(float*)&ScriptParams[1]; + Y = *(float*)&ScriptParams[2]; if (b3D) { - Z = GET_FLOAT_PARAM(3); - dX = GET_FLOAT_PARAM(4); - dY = GET_FLOAT_PARAM(5); - dZ = GET_FLOAT_PARAM(6); - debug = GET_INTEGER_PARAM(7); + Z = *(float*)&ScriptParams[3]; + dX = *(float*)&ScriptParams[4]; + dY = *(float*)&ScriptParams[5]; + dZ = *(float*)&ScriptParams[6]; + debug = ScriptParams[7]; } else { - dX = GET_FLOAT_PARAM(3); - dY = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dX = *(float*)&ScriptParams[3]; + dY = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } if (!decided) { result = false; @@ -710,15 +722,13 @@ void CRunningScript::LocateCarCommand(int32 command, uint32* pIp) } UpdateCompareFlag(result); if (debug) - CTheScripts::HighlightImportantArea(id, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); - /* + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::LocateObjectCommand(int32 command, uint32* pIp) @@ -733,23 +743,23 @@ void CRunningScript::LocateObjectCommand(int32 command, uint32* pIp) b3D = false; break; } - uint32 id = CollectLocateParameters(pIp, b3D); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CollectParameters(pIp, b3D ? 8 : 6); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); CVector pos = pObject->GetPosition(); - X = GET_FLOAT_PARAM(1); - Y = GET_FLOAT_PARAM(2); + X = *(float*)&ScriptParams[1]; + Y = *(float*)&ScriptParams[2]; if (b3D) { - Z = GET_FLOAT_PARAM(3); - dX = GET_FLOAT_PARAM(4); - dY = GET_FLOAT_PARAM(5); - dZ = GET_FLOAT_PARAM(6); - debug = GET_INTEGER_PARAM(7); + Z = *(float*)&ScriptParams[3]; + dX = *(float*)&ScriptParams[4]; + dY = *(float*)&ScriptParams[5]; + dZ = *(float*)&ScriptParams[6]; + debug = ScriptParams[7]; } else { - dX = GET_FLOAT_PARAM(3); - dY = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dX = *(float*)&ScriptParams[3]; + dY = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } result = false; bool in_area; @@ -770,15 +780,13 @@ void CRunningScript::LocateObjectCommand(int32 command, uint32* pIp) result = in_area; UpdateCompareFlag(result); if (debug) - CTheScripts::HighlightImportantArea(id, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); - /* + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::LocateSniperBulletCommand(int32 command, uint32* pIp) @@ -794,32 +802,30 @@ void CRunningScript::LocateSniperBulletCommand(int32 command, uint32* pIp) break; } CollectParameters(pIp, b3D ? 7 : 5); - X = GET_FLOAT_PARAM(0); - Y = GET_FLOAT_PARAM(1); + X = *(float*)&ScriptParams[0]; + Y = *(float*)&ScriptParams[1]; if (b3D) { - Z = GET_FLOAT_PARAM(2); - dX = GET_FLOAT_PARAM(3); - dY = GET_FLOAT_PARAM(4); - dZ = GET_FLOAT_PARAM(5); - debug = GET_INTEGER_PARAM(6); + Z = *(float*)&ScriptParams[2]; + dX = *(float*)&ScriptParams[3]; + dY = *(float*)&ScriptParams[4]; + dZ = *(float*)&ScriptParams[5]; + debug = ScriptParams[6]; } else { - dX = GET_FLOAT_PARAM(2); - dY = GET_FLOAT_PARAM(3); - debug = GET_INTEGER_PARAM(4); + dX = *(float*)&ScriptParams[2]; + dY = *(float*)&ScriptParams[3]; + debug = ScriptParams[4]; } result = CBulletInfo::TestForSniperBullet(X - dX, X + dX, Y - dY, Y + dY, b3D ? Z - dZ : -1000.0f, b3D ? Z + dZ : 1000.0f); UpdateCompareFlag(result); if (debug) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::PlayerInAreaCheckCommand(int32 command, uint32* pIp) @@ -839,8 +845,8 @@ void CRunningScript::PlayerInAreaCheckCommand(int32 command, uint32* pIp) b3D = false; break; } - uint32 id = CollectLocateParameters(pIp, b3D); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; + CollectParameters(pIp, b3D ? 8 : 6); + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; switch (command) { case COMMAND_IS_PLAYER_STOPPED_IN_AREA_3D: case COMMAND_IS_PLAYER_STOPPED_IN_AREA_ON_FOOT_3D: @@ -856,23 +862,23 @@ void CRunningScript::PlayerInAreaCheckCommand(int32 command, uint32* pIp) default: break; } - infX = GET_FLOAT_PARAM(1); - infY = GET_FLOAT_PARAM(2); + infX = *(float*)&ScriptParams[1]; + infY = *(float*)&ScriptParams[2]; if (b3D) { - infZ = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(6); + infZ = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[6]; if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(6); - supZ = GET_FLOAT_PARAM(3); + infZ = *(float*)&ScriptParams[6]; + supZ = *(float*)&ScriptParams[3]; } - debug = GET_INTEGER_PARAM(7); + debug = ScriptParams[7]; } else { - supX = GET_FLOAT_PARAM(3); - supY = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + supX = *(float*)&ScriptParams[3]; + supY = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } if (infX > supX) { float tmp = infX; @@ -931,14 +937,12 @@ void CRunningScript::PlayerInAreaCheckCommand(int32 command, uint32* pIp) UpdateCompareFlag(result); if (debug) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, infX, infY, supX, supY, b3D ? (infZ + supZ) / 2 : MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(infX, infY, infZ, supX, supY, supZ); else CTheScripts::DrawDebugSquare(infX, infY, supX, supY); } - */ } void CRunningScript::PlayerInAngledAreaCheckCommand(int32 command, uint32* pIp) @@ -959,7 +963,7 @@ void CRunningScript::PlayerInAngledAreaCheckCommand(int32 command, uint32* pIp) break; } CollectParameters(pIp, b3D ? 9 : 7); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; switch (command) { case COMMAND_IS_PLAYER_STOPPED_IN_ANGLED_AREA_3D: case COMMAND_IS_PLAYER_STOPPED_IN_ANGLED_AREA_ON_FOOT_3D: @@ -975,25 +979,25 @@ void CRunningScript::PlayerInAngledAreaCheckCommand(int32 command, uint32* pIp) default: break; } - infX = GET_FLOAT_PARAM(1); - infY = GET_FLOAT_PARAM(2); + infX = *(float*)&ScriptParams[1]; + infY = *(float*)&ScriptParams[2]; if (b3D) { - infZ = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(6); + infZ = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[6]; if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(6); - supZ = GET_FLOAT_PARAM(3); + infZ = *(float*)&ScriptParams[6]; + supZ = *(float*)&ScriptParams[3]; } - side2length = GET_FLOAT_PARAM(7); - debug = GET_INTEGER_PARAM(8); + side2length = *(float*)&ScriptParams[7]; + debug = ScriptParams[8]; } else { - supX = GET_FLOAT_PARAM(3); - supY = GET_FLOAT_PARAM(4); - side2length = GET_FLOAT_PARAM(5); - debug = GET_INTEGER_PARAM(6); + supX = *(float*)&ScriptParams[3]; + supY = *(float*)&ScriptParams[4]; + side2length = *(float*)&ScriptParams[5]; + debug = ScriptParams[6]; } float initAngle = CGeneral::GetRadianAngleBetweenPoints(infX, infY, supX, supY) + HALFPI; while (initAngle < 0.0f) @@ -1056,7 +1060,6 @@ void CRunningScript::PlayerInAngledAreaCheckCommand(int32 command, uint32* pIp) if (debug) CTheScripts::HighlightImportantAngledArea((uintptr)this + m_nIp, infX, infY, supX, supY, rotatedSupX, rotatedSupY, rotatedInfX, rotatedInfY, b3D ? (infZ + supZ) / 2 : MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugAngledCube(infX, infY, infZ, supX, supY, supZ, @@ -1065,7 +1068,6 @@ void CRunningScript::PlayerInAngledAreaCheckCommand(int32 command, uint32* pIp) CTheScripts::DrawDebugAngledSquare(infX, infY, supX, supY, rotatedSupX, rotatedSupY, rotatedInfX, rotatedInfY); } - */ } void CRunningScript::CharInAreaCheckCommand(int32 command, uint32* pIp) @@ -1085,8 +1087,8 @@ void CRunningScript::CharInAreaCheckCommand(int32 command, uint32* pIp) b3D = false; break; } - uint32 id = CollectLocateParameters(pIp, b3D); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CollectParameters(pIp, b3D ? 8 : 6); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); CVector pos = pPed->InVehicle() ? pPed->m_pMyVehicle->GetPosition() : pPed->GetPosition(); switch (command) { @@ -1104,23 +1106,23 @@ void CRunningScript::CharInAreaCheckCommand(int32 command, uint32* pIp) default: break; } - infX = GET_FLOAT_PARAM(1); - infY = GET_FLOAT_PARAM(2); + infX = *(float*)&ScriptParams[1]; + infY = *(float*)&ScriptParams[2]; if (b3D) { - infZ = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(6); + infZ = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[6]; if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(6); - supZ = GET_FLOAT_PARAM(3); + infZ = *(float*)&ScriptParams[6]; + supZ = *(float*)&ScriptParams[3]; } - debug = GET_INTEGER_PARAM(7); + debug = ScriptParams[7]; } else { - supX = GET_FLOAT_PARAM(3); - supY = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + supX = *(float*)&ScriptParams[3]; + supY = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } if (infX > supX) { float tmp = infX; @@ -1177,15 +1179,13 @@ void CRunningScript::CharInAreaCheckCommand(int32 command, uint32* pIp) } UpdateCompareFlag(result); if (debug) - CTheScripts::HighlightImportantArea(id, infX, infY, supX, supY, b3D ? (infZ + supZ) / 2 : MAP_Z_LOW_LIMIT); - /* + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, infX, infY, supX, supY, b3D ? (infZ + supZ) / 2 : MAP_Z_LOW_LIMIT); if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(infX, infY, infZ, supX, supY, supZ); else CTheScripts::DrawDebugSquare(infX, infY, supX, supY); } - */ } void CRunningScript::CarInAreaCheckCommand(int32 command, uint32* pIp) @@ -1201,8 +1201,8 @@ void CRunningScript::CarInAreaCheckCommand(int32 command, uint32* pIp) b3D = false; break; } - uint32 id = CollectLocateParameters(pIp, b3D); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CollectParameters(pIp, b3D ? 8 : 6); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); CVector pos = pVehicle->GetPosition(); switch (command) { @@ -1216,23 +1216,23 @@ void CRunningScript::CarInAreaCheckCommand(int32 command, uint32* pIp) default: break; } - infX = GET_FLOAT_PARAM(1); - infY = GET_FLOAT_PARAM(2); + infX = *(float*)&ScriptParams[1]; + infY = *(float*)&ScriptParams[2]; if (b3D) { - infZ = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(6); + infZ = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[6]; if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(6); - supZ = GET_FLOAT_PARAM(3); + infZ = *(float*)&ScriptParams[6]; + supZ = *(float*)&ScriptParams[3]; } - debug = GET_INTEGER_PARAM(7); + debug = ScriptParams[7]; } else { - supX = GET_FLOAT_PARAM(3); - supY = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + supX = *(float*)&ScriptParams[3]; + supY = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } if (infX > supX) { float tmp = infX; @@ -1277,15 +1277,13 @@ void CRunningScript::CarInAreaCheckCommand(int32 command, uint32* pIp) } UpdateCompareFlag(result); if (debug) - CTheScripts::HighlightImportantArea(id, infX, infY, supX, supY, b3D ? (infZ + supZ) / 2 : MAP_Z_LOW_LIMIT); - /* + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, infX, infY, supX, supY, b3D ? (infZ + supZ) / 2 : MAP_Z_LOW_LIMIT); if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(infX, infY, infZ, supX, supY, supZ); else CTheScripts::DrawDebugSquare(infX, infY, supX, supY); } - */ } void CRunningScript::ObjectInAreaCheckCommand(int32 command, uint32* pIp) @@ -1300,27 +1298,27 @@ void CRunningScript::ObjectInAreaCheckCommand(int32 command, uint32* pIp) b3D = false; break; } - uint32 id = CollectLocateParameters(pIp, b3D); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CollectParameters(pIp, b3D ? 8 : 6); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); CVector pos = pObject->GetPosition(); - infX = GET_FLOAT_PARAM(1); - infY = GET_FLOAT_PARAM(2); + infX = *(float*)&ScriptParams[1]; + infY = *(float*)&ScriptParams[2]; if (b3D) { - infZ = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(6); + infZ = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[6]; if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(6); - supZ = GET_FLOAT_PARAM(3); + infZ = *(float*)&ScriptParams[6]; + supZ = *(float*)&ScriptParams[3]; } - debug = GET_INTEGER_PARAM(7); + debug = ScriptParams[7]; } else { - supX = GET_FLOAT_PARAM(3); - supY = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + supX = *(float*)&ScriptParams[3]; + supY = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } if (infX > supX) { float tmp = infX; @@ -1361,15 +1359,13 @@ void CRunningScript::ObjectInAreaCheckCommand(int32 command, uint32* pIp) } UpdateCompareFlag(result); if (debug) - CTheScripts::HighlightImportantArea(id, infX, infY, supX, supY, b3D ? (infZ + supZ) / 2 : MAP_Z_LOW_LIMIT); - /* + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, infX, infY, supX, supY, b3D ? (infZ + supZ) / 2 : MAP_Z_LOW_LIMIT); if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(infX, infY, infZ, supX, supY, supZ); else CTheScripts::DrawDebugSquare(infX, infY, supX, supY); } - */ } void CRunningScript::DoDeatharrestCheck() @@ -1390,8 +1386,7 @@ void CRunningScript::DoDeatharrestCheck() script_assert(m_nStackPointer > 0); while (m_nStackPointer > 1) --m_nStackPointer; - ReturnFromGosubOrFunction(); - m_nLocalsPointer = 0; + m_nIp = m_anStack[--m_nStackPointer]; CMessages::ClearSmallMessagesOnly(); *(int32*)&CTheScripts::ScriptSpace[CTheScripts::OnAMissionFlag] = 0; m_bDeatharrestExecuted = true; @@ -1445,24 +1440,24 @@ void CRunningScript::LocateCollectiveCommand(int32 command, uint32* pIp) b3D = true; break; } - uint32 id = CollectLocateParameters(pIp, b3D); - X = GET_FLOAT_PARAM(1); - Y = GET_FLOAT_PARAM(2); + CollectParameters(pIp, b3D ? 8 : 6); + X = *(float*)&ScriptParams[1]; + Y = *(float*)&ScriptParams[2]; if (b3D) { - Z = GET_FLOAT_PARAM(3); - dX = GET_FLOAT_PARAM(4); - dY = GET_FLOAT_PARAM(5); - dZ = GET_FLOAT_PARAM(6); - debug = GET_INTEGER_PARAM(7); + Z = *(float*)&ScriptParams[3]; + dX = *(float*)&ScriptParams[4]; + dY = *(float*)&ScriptParams[5]; + dZ = *(float*)&ScriptParams[6]; + debug = ScriptParams[7]; } else { - dX = GET_FLOAT_PARAM(3); - dY = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dX = *(float*)&ScriptParams[3]; + dY = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } result = true; for (int i = 0; i < MAX_NUM_COLLECTIVES && result; i++) { - if (GET_INTEGER_PARAM(0) != CTheScripts::CollectiveArray[i].colIndex) + if (ScriptParams[0] != CTheScripts::CollectiveArray[i].colIndex) continue; CPed* pPed = CPools::GetPedPool()->GetAt(CTheScripts::CollectiveArray[i].pedIndex); if (!pPed) { @@ -1523,15 +1518,13 @@ void CRunningScript::LocateCollectiveCommand(int32 command, uint32* pIp) } UpdateCompareFlag(result); if (debug) - CTheScripts::HighlightImportantArea(id, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); - /* + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::LocateCollectiveCharCommand(int32 command, uint32* pIp) @@ -1549,7 +1542,7 @@ void CRunningScript::LocateCollectiveCharCommand(int32 command, uint32* pIp) break; } CollectParameters(pIp, b3D ? 6 : 5); - CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pTarget); if (pTarget->bInVehicle) { X = pTarget->m_pMyVehicle->GetPosition().x; @@ -1561,18 +1554,18 @@ void CRunningScript::LocateCollectiveCharCommand(int32 command, uint32* pIp) Y = pTarget->GetPosition().y; Z = pTarget->GetPosition().z; } - dX = GET_FLOAT_PARAM(2); - dY = GET_FLOAT_PARAM(3); + dX = *(float*)&ScriptParams[2]; + dY = *(float*)&ScriptParams[3]; if (b3D) { - dZ = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dZ = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } else { - debug = GET_INTEGER_PARAM(4); + debug = ScriptParams[4]; } result = true; for (int i = 0; i < MAX_NUM_COLLECTIVES && result; i++) { - if (GET_INTEGER_PARAM(0) != CTheScripts::CollectiveArray[i].colIndex) + if (ScriptParams[0] != CTheScripts::CollectiveArray[i].colIndex) continue; CPed* pPed = CPools::GetPedPool()->GetAt(CTheScripts::CollectiveArray[i].pedIndex); if (!pPed) { @@ -1617,14 +1610,12 @@ void CRunningScript::LocateCollectiveCharCommand(int32 command, uint32* pIp) UpdateCompareFlag(result); if (debug) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::LocateCollectiveCarCommand(int32 command, uint32* pIp) @@ -1642,23 +1633,23 @@ void CRunningScript::LocateCollectiveCarCommand(int32 command, uint32* pIp) break; } CollectParameters(pIp, b3D ? 6 : 5); - CVehicle* pTarget = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pTarget = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pTarget); X = pTarget->GetPosition().x; Y = pTarget->GetPosition().y; Z = pTarget->GetPosition().z; - dX = GET_FLOAT_PARAM(2); - dY = GET_FLOAT_PARAM(3); + dX = *(float*)&ScriptParams[2]; + dY = *(float*)&ScriptParams[3]; if (b3D) { - dZ = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dZ = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } else { - debug = GET_INTEGER_PARAM(4); + debug = ScriptParams[4]; } result = true; for (int i = 0; i < MAX_NUM_COLLECTIVES && result; i++) { - if (GET_INTEGER_PARAM(0) != CTheScripts::CollectiveArray[i].colIndex) + if (ScriptParams[0] != CTheScripts::CollectiveArray[i].colIndex) continue; CPed* pPed = CPools::GetPedPool()->GetAt(CTheScripts::CollectiveArray[i].pedIndex); if (!pPed) { @@ -1703,14 +1694,12 @@ void CRunningScript::LocateCollectiveCarCommand(int32 command, uint32* pIp) UpdateCompareFlag(result); if (debug) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::LocateCollectivePlayerCommand(int32 command, uint32* pIp) @@ -1728,22 +1717,22 @@ void CRunningScript::LocateCollectivePlayerCommand(int32 command, uint32* pIp) break; } CollectParameters(pIp, b3D ? 6 : 5); - CVector pos = CWorld::Players[GET_INTEGER_PARAM(1)].GetPos(); + CVector pos = CWorld::Players[ScriptParams[1]].GetPos(); X = pos.x; Y = pos.y; Z = pos.z; - dX = GET_FLOAT_PARAM(2); - dY = GET_FLOAT_PARAM(3); + dX = *(float*)&ScriptParams[2]; + dY = *(float*)&ScriptParams[3]; if (b3D) { - dZ = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + dZ = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } else { - debug = GET_INTEGER_PARAM(4); + debug = ScriptParams[4]; } result = true; for (int i = 0; i < MAX_NUM_COLLECTIVES && result; i++) { - if (GET_INTEGER_PARAM(0) != CTheScripts::CollectiveArray[i].colIndex) + if (ScriptParams[0] != CTheScripts::CollectiveArray[i].colIndex) continue; CPed* pPed = CPools::GetPedPool()->GetAt(CTheScripts::CollectiveArray[i].pedIndex); if (!pPed) { @@ -1788,14 +1777,12 @@ void CRunningScript::LocateCollectivePlayerCommand(int32 command, uint32* pIp) UpdateCompareFlag(result); if (debug) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); else CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); } - */ } void CRunningScript::CollectiveInAreaCheckCommand(int32 command, uint32* pIp) @@ -1816,23 +1803,23 @@ void CRunningScript::CollectiveInAreaCheckCommand(int32 command, uint32* pIp) break; } CollectParameters(pIp, b3D ? 8 : 6); - infX = GET_FLOAT_PARAM(1); - infY = GET_FLOAT_PARAM(2); + infX = *(float*)&ScriptParams[1]; + infY = *(float*)&ScriptParams[2]; if (b3D) { - infZ = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(6); + infZ = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[6]; if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(6); - supZ = GET_FLOAT_PARAM(3); + infZ = *(float*)&ScriptParams[6]; + supZ = *(float*)&ScriptParams[3]; } - debug = GET_INTEGER_PARAM(7); + debug = ScriptParams[7]; } else { - supX = GET_FLOAT_PARAM(3); - supY = GET_FLOAT_PARAM(4); - debug = GET_INTEGER_PARAM(5); + supX = *(float*)&ScriptParams[3]; + supY = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; } if (infX > supX) { float tmp = infX; @@ -1846,7 +1833,7 @@ void CRunningScript::CollectiveInAreaCheckCommand(int32 command, uint32* pIp) } result = true; for (int i = 0; i < MAX_NUM_COLLECTIVES && result; i++) { - if (GET_INTEGER_PARAM(0) != CTheScripts::CollectiveArray[i].colIndex) + if (ScriptParams[0] != CTheScripts::CollectiveArray[i].colIndex) continue; CPed* pPed = CPools::GetPedPool()->GetAt(CTheScripts::CollectiveArray[i].pedIndex); if (!pPed) { @@ -1908,14 +1895,12 @@ void CRunningScript::CollectiveInAreaCheckCommand(int32 command, uint32* pIp) UpdateCompareFlag(result); if (debug) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, infX, infY, supX, supY, b3D ? (infZ + supZ) / 2 : MAP_Z_LOW_LIMIT); - /* if (CTheScripts::DbgFlag) { if (b3D) CTheScripts::DrawDebugCube(infX, infY, infZ, supX, supY, supZ); else CTheScripts::DrawDebugSquare(infX, infY, supX, supY); } - */ } #endif @@ -2002,9 +1987,8 @@ void CTheScripts::PrintListSizes() debug("active: %d, idle: %d", active, idle); } -//uint32 DbgLineColour = 0x0000FFFF; // r = 0, g = 0, b = 255, a = 255 +uint32 DbgLineColour = 0x0000FFFF; // r = 0, g = 0, b = 255, a = 255 -/* void CTheScripts::DrawDebugSquare(float infX, float infY, float supX, float supY) { CColPoint tmpCP; @@ -2111,7 +2095,6 @@ void CTheScripts::RenderTheScriptDebugLines() NumScriptDebugLines = 0; RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)0); } -*/ #define SCRIPT_DATA_SIZE sizeof(CTheScripts::OnAMissionFlag) +\ 4 * sizeof(uint32) * MAX_NUM_BUILDING_SWAPS + 2 * sizeof(uint32) * MAX_NUM_INVISIBILITY_SETTINGS + 5 * sizeof(uint32) @@ -2135,9 +2118,6 @@ INITSAVEBUF WriteSaveBuf(buf, script_data_size); WriteSaveBuf(buf, OnAMissionFlag); WriteSaveBuf(buf, LastMissionPassedTime); - for (uint32 i = 0; i < MAX_NUM_COLLECTIVES; i++) - WriteSaveBuf(buf, CollectiveArray[i]); - WriteSaveBuf(buf, NextFreeCollectiveIndex); for (uint32 i = 0; i < MAX_NUM_BUILDING_SWAPS; i++) { CBuilding* pBuilding = BuildingSwapArray[i].m_pBuilding; uint32 type, handle; @@ -2199,36 +2179,20 @@ INITSAVEBUF VALIDATESAVEBUF(*size) } -// TODO: I don't really understand how script loading works, so I leave it the VC way for now. -bool CTheScripts::LoadAllScripts(uint8* buf, uint32 size) +void CTheScripts::LoadAllScripts(uint8* buf, uint32 size) { - Init(); // TODO: in LCS CTheScripts::Init call GenericLoad, which then calls LoadAllScripts + Init(); INITSAVEBUF CheckSaveHeader(buf, 'S', 'C', 'R', '\0', size - SAVE_HEADER_SIZE); uint32 varSpace = ReadSaveBuf(buf); - if (*(int32*)&ScriptSpace[0] != *(int32*)&buf[0] || *(int32*)&ScriptSpace[4] != *(int32*)&buf[4]) { - printf("\n===================================================\nSave Game Mismatch!!!\n"); - return false; - } - for (uint32 i = 0; i < varSpace; i++) { // this is not exactly what function does - if (i < 8) - ScriptSpace[i] = ReadSaveBuf(buf); - else if (GetSaveVarIndex(i / 4 * 4) != -1) - ScriptSpace[i] = ReadSaveBuf(buf); - else - ReadSaveBuf(buf); - } - // everything else is... gone? TODO + for (uint32 i = 0; i < varSpace; i++) + ScriptSpace[i] = ReadSaveBuf(buf); script_assert(ReadSaveBuf(buf) == SCRIPT_DATA_SIZE); OnAMissionFlag = ReadSaveBuf(buf); LastMissionPassedTime = ReadSaveBuf(buf); - for (uint32 i = 0; i < MAX_NUM_COLLECTIVES; i++) - CollectiveArray[i] = ReadSaveBuf(buf); - NextFreeCollectiveIndex = ReadSaveBuf(buf); for (uint32 i = 0; i < MAX_NUM_BUILDING_SWAPS; i++) { uint32 type = ReadSaveBuf(buf); uint32 handle = ReadSaveBuf(buf); - /* switch (type) { case 0: BuildingSwapArray[i].m_pBuilding = nil; @@ -2242,18 +2206,14 @@ INITSAVEBUF default: script_assert(false); } - */ - /*BuildingSwapArray[i].m_nNewModel = */ReadSaveBuf(buf); - /*BuildingSwapArray[i].m_nOldModel = */ReadSaveBuf(buf); - /* + BuildingSwapArray[i].m_nNewModel = ReadSaveBuf(buf); + BuildingSwapArray[i].m_nOldModel = ReadSaveBuf(buf); if (BuildingSwapArray[i].m_pBuilding) BuildingSwapArray[i].m_pBuilding->ReplaceWithNewModel(BuildingSwapArray[i].m_nNewModel); - */ } for (uint32 i = 0; i < MAX_NUM_INVISIBILITY_SETTINGS; i++) { uint32 type = ReadSaveBuf(buf); uint32 handle = ReadSaveBuf(buf); - /* switch (type) { case 0: InvisibilitySettingArray[i] = nil; @@ -2275,10 +2235,9 @@ INITSAVEBUF } if (InvisibilitySettingArray[i]) InvisibilitySettingArray[i]->bIsVisible = false; - */ } script_assert(ReadSaveBuf(buf) == bUsingAMultiScriptFile); - /*bPlayerHasMetDebbieHarry = */ReadSaveBuf(buf); + bPlayerHasMetDebbieHarry = ReadSaveBuf(buf); ReadSaveBuf(buf); script_assert(ReadSaveBuf(buf) == MainScriptSize); script_assert(ReadSaveBuf(buf) == LargestMissionScriptSize); @@ -2286,9 +2245,7 @@ INITSAVEBUF script_assert(ReadSaveBuf(buf) == NumberOfExclusiveMissionScripts); uint32 runningScripts = ReadSaveBuf(buf); for (uint32 i = 0; i < runningScripts; i++) - CRunningScript().Load(buf); - StartTestScript(); // <- tmp hack - return true; + StartNewScript(0)->Load(buf); VALIDATESAVEBUF(size) } @@ -2298,7 +2255,6 @@ void CRunningScript::Save(uint8*& buf) { #ifdef COMPATIBLE_SAVES SkipSaveBuf(buf, 8); - WriteSaveBuf(buf, m_nId); for (int i = 0; i < 8; i++) WriteSaveBuf(buf, m_abScriptName[i]); WriteSaveBuf(buf, m_nIp); @@ -2310,11 +2266,10 @@ void CRunningScript::Save(uint8*& buf) WriteSaveBuf(buf, m_nStackPointer); SkipSaveBuf(buf, 2); #ifdef CHECK_STRUCT_SIZES - static_assert(NUM_LOCAL_VARS + 8 + NUM_TIMERS == 106, "Compatibility loss: NUM_LOCAL_VARS + NUM_TIMERS != 106"); + static_assert(NUM_LOCAL_VARS + NUM_TIMERS == 18, "Compatibility loss: NUM_LOCAL_VARS + NUM_TIMERS != 18"); #endif - for (int i = 0; i < NUM_LOCAL_VARS + 8 + NUM_TIMERS; i++) + for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++) WriteSaveBuf(buf, m_anLocalVariables[i]); - WriteSaveBuf(buf, m_nLocalsPointer); WriteSaveBuf(buf, m_bIsActive); WriteSaveBuf(buf, m_bCondResult); WriteSaveBuf(buf, m_bIsMissionScript); @@ -2335,7 +2290,6 @@ void CRunningScript::Load(uint8*& buf) { #ifdef COMPATIBLE_SAVES SkipSaveBuf(buf, 8); - m_nId = ReadSaveBuf(buf); for (int i = 0; i < 8; i++) m_abScriptName[i] = ReadSaveBuf(buf); m_nIp = ReadSaveBuf(buf); @@ -2347,11 +2301,10 @@ void CRunningScript::Load(uint8*& buf) m_nStackPointer = ReadSaveBuf(buf); SkipSaveBuf(buf, 2); #ifdef CHECK_STRUCT_SIZES - static_assert(NUM_LOCAL_VARS + 8 + NUM_TIMERS == 106, "Compatibility loss: NUM_LOCAL_VARS + 8 + NUM_TIMERS != 106"); + static_assert(NUM_LOCAL_VARS + NUM_TIMERS == 18, "Compatibility loss: NUM_LOCAL_VARS + NUM_TIMERS != 18"); #endif - for (int i = 0; i < NUM_LOCAL_VARS + 8 + NUM_TIMERS; i++) + for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++) m_anLocalVariables[i] = ReadSaveBuf(buf); - m_nLocalsPointer = ReadSaveBuf(buf); m_bIsActive = ReadSaveBuf(buf); m_bCondResult = ReadSaveBuf(buf); m_bIsMissionScript = ReadSaveBuf(buf); @@ -2730,14 +2683,8 @@ void CTheScripts::CleanUpThisPed(CPed* pPed) } else { if (pPed->m_pMyVehicle->m_vehType == VEHICLE_TYPE_CAR) { - if ((pPed->m_fHealth < 1.0f && !pPed->IsPedHeadAbovePos(-0.3f)) || pPed->bBodyPartJustCameOff) { - pPed->SetObjective(OBJECTIVE_LEAVE_CAR_AND_DIE, pPed->m_pMyVehicle); - pPed->bWanderPathAfterExitingCar = false; - } - else { - pPed->SetObjective(OBJECTIVE_LEAVE_CAR, pPed->m_pMyVehicle); - pPed->bWanderPathAfterExitingCar = true; - } + pPed->SetObjective(OBJECTIVE_LEAVE_CAR, pPed->m_pMyVehicle); + pPed->bWanderPathAfterExitingCar = true; } } } @@ -2750,7 +2697,6 @@ void CTheScripts::CleanUpThisPed(CPed* pPed) flees = true; } pPed->ClearObjective(); - pPed->SetWaitState(WAITSTATE_FALSE, nil); // third parameter is 0 TODO? pPed->bRespondsToThreats = true; pPed->bScriptObjectiveCompleted = false; pPed->bKindaStayInSamePlace = false; @@ -2794,9 +2740,6 @@ void CTheScripts::ReadObjectNamesFromScript() { int32 varSpace = GetSizeOfVariableSpace(); uint32 ip = varSpace + 8; - NumSaveVars = Read4BytesFromScript(&ip); - SavedVarIndices = (short*)&ScriptSpace[ip]; - ip += 2 * NumSaveVars; NumberOfUsedObjects = Read2BytesFromScript(&ip); ip += 2; for (uint16 i = 0; i < NumberOfUsedObjects; i++) { @@ -2808,16 +2751,30 @@ void CTheScripts::ReadObjectNamesFromScript() void CTheScripts::UpdateObjectIndices() { + char name[USED_OBJECT_NAME_LENGTH]; char error[112]; for (int i = 1; i < NumberOfUsedObjects; i++) { - UsedObjectArray[i].index = -1; - CModelInfo::GetModelInfo(UsedObjectArray[i].name, &UsedObjectArray[i].index); -#ifndef FINAL - if (UsedObjectArray[i].index == -1) { + bool found = false; + for (int j = 0; j < MODELINFOSIZE && !found; j++) { + CBaseModelInfo* pModel = CModelInfo::GetModelInfo(j); + if (!pModel) + continue; + strcpy(name, pModel->GetModelName()); +#ifdef FIX_BUGS + for (int k = 0; k < USED_OBJECT_NAME_LENGTH && name[k]; k++) +#else + for (int k = 0; k < USED_OBJECT_NAME_LENGTH; k++) +#endif + name[k] = toupper(name[k]); + if (strcmp(name, UsedObjectArray[i].name) == 0) { + found = true; + UsedObjectArray[i].index = j; + } + } + if (!found) { sprintf(error, "CTheScripts::UpdateObjectIndices - Couldn't find %s", UsedObjectArray[i].name); debug("%s\n", error); } -#endif } } @@ -2827,8 +2784,7 @@ void CTheScripts::ReadMultiScriptFileOffsetsFromScript() uint32 ip = varSpace + 3; int32 objectSize = Read4BytesFromScript(&ip); ip = objectSize + 8; - NumTrueGlobals = Read2BytesFromScript(&ip); - MostGlobals = Read2BytesFromScript(&ip); + MainScriptSize = Read4BytesFromScript(&ip); LargestMissionScriptSize = Read4BytesFromScript(&ip); NumberOfMissionScripts = Read2BytesFromScript(&ip); NumberOfExclusiveMissionScripts = Read2BytesFromScript(&ip); diff --git a/src/control/Script6.cpp b/src/control/Script6.cpp index 0e1256f..4d7121f 100644 --- a/src/control/Script6.cpp +++ b/src/control/Script6.cpp @@ -17,7 +17,6 @@ #ifdef MISSION_REPLAY #include "GenericGameStorage.h" #endif -#include "Hud.h" #include "Messages.h" #include "Pad.h" #include "Particle.h" @@ -39,8 +38,6 @@ #include "Pickups.h" #include "Fluff.h" -// LCS: file done except TODOs - #ifdef USE_DEBUG_SCRIPT_LOADER extern const char* scriptfile; #endif @@ -86,40 +83,43 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) { switch (command) { //case COMMAND_FLASH_RADAR_BLIP: + /* case COMMAND_IS_CHAR_IN_CONTROL: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); UpdateCompareFlag(pPed->IsPedInControl()); return 0; } + */ case COMMAND_SET_GENERATE_CARS_AROUND_CAMERA: CollectParameters(&m_nIp, 1); - CCarCtrl::bCarsGeneratedAroundCamera = (GET_INTEGER_PARAM(0) != 0); + CCarCtrl::bCarsGeneratedAroundCamera = (ScriptParams[0] != 0); return 0; case COMMAND_CLEAR_SMALL_PRINTS: CMessages::ClearSmallMessagesOnly(); - //CHud::ClearSmallMessages(); // TODO return 0; + /* case COMMAND_HAS_MILITARY_CRANE_COLLECTED_ALL_CARS: UpdateCompareFlag(CCranes::HaveAllCarsBeenCollectedByMilitaryCrane()); return 0; + */ case COMMAND_SET_UPSIDEDOWN_CAR_NOT_DAMAGED: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR); CAutomobile* pCar = (CAutomobile*)pVehicle; - pCar->bNotDamagedUpsideDown = (GET_INTEGER_PARAM(1) != 0); + pCar->bNotDamagedUpsideDown = (ScriptParams[1] != 0); return 0; } case COMMAND_CAN_PLAYER_START_MISSION: { CollectParameters(&m_nIp, 1); - CPlayerPed* pPlayerPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPlayerPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPlayerPed); - UpdateCompareFlag(pPlayerPed->CanStartMission() || pPlayerPed->m_nPedState == PED_DRIVING); + UpdateCompareFlag(pPlayerPed->IsPedInControl() || pPlayerPed->m_nPedState == PED_DRIVING); return 0; } case COMMAND_MAKE_PLAYER_SAFE_FOR_CUTSCENE: @@ -129,46 +129,46 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) AllowMissionReplay = 0; SaveGameForPause(3); #endif - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; - CPad::GetPad(GET_INTEGER_PARAM(0))->SetDisablePlayerControls(PLAYERCONTROL_CUTSCENE); + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; + CPad::GetPad(ScriptParams[0])->SetDisablePlayerControls(PLAYERCONTROL_CUTSCENE); pPlayerInfo->MakePlayerSafe(true); CCutsceneMgr::StartCutsceneProcessing(); return 0; } case COMMAND_USE_TEXT_COMMANDS: CollectParameters(&m_nIp, 1); - CTheScripts::UseTextCommands = (GET_INTEGER_PARAM(0) != 0) ? 2 : 1; + CTheScripts::UseTextCommands = (ScriptParams[0] != 0) ? 2 : 1; return 0; case COMMAND_SET_THREAT_FOR_PED_TYPE: CollectParameters(&m_nIp, 2); - CPedType::AddThreat(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CPedType::AddThreat(ScriptParams[0], ScriptParams[1]); return 0; case COMMAND_CLEAR_THREAT_FOR_PED_TYPE: CollectParameters(&m_nIp, 2); - CPedType::RemoveThreat(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CPedType::RemoveThreat(ScriptParams[0], ScriptParams[1]); return 0; case COMMAND_GET_CAR_COLOURS: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - SET_INTEGER_PARAM(0, pVehicle->m_currentColour1); - SET_INTEGER_PARAM(1, pVehicle->m_currentColour2); + ScriptParams[0] = pVehicle->m_currentColour1; + ScriptParams[1] = pVehicle->m_currentColour2; StoreParameters(&m_nIp, 2); return 0; } case COMMAND_SET_ALL_CARS_CAN_BE_DAMAGED: CollectParameters(&m_nIp, 1); - CWorld::SetAllCarsCanBeDamaged(GET_INTEGER_PARAM(0) != 0); - if (!GET_INTEGER_PARAM(0)) + CWorld::SetAllCarsCanBeDamaged(ScriptParams[0] != 0); + if (!ScriptParams[0]) CWorld::ExtinguishAllCarFiresInArea(FindPlayerCoors(), 4000.0f); return 0; case COMMAND_SET_CAR_CAN_BE_DAMAGED: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - pVehicle->bCanBeDamaged = GET_INTEGER_PARAM(1) != 0; - if (!GET_INTEGER_PARAM(1)) + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + pVehicle->bCanBeDamaged = ScriptParams[1] != 0; + if (!ScriptParams[1]) pVehicle->ExtinguishCarFire(); return 0; } @@ -178,7 +178,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) { CollectParameters(&m_nIp, 1); CTimer::Stop(); - CGame::currLevel = (eLevelName)GET_INTEGER_PARAM(0); + CGame::currLevel = (eLevelName)ScriptParams[0]; ISLAND_LOADING_IS(LOW) { CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); @@ -194,18 +194,18 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) return 0; } case COMMAND_GET_BODY_CAST_HEALTH: - // SET_INTEGER_PARAM(0, CObject::nBodyCastHealth); + // ScriptParams[0] = CObject::nBodyCastHealth; // StoreParameters(&m_nIp, 1); return 0; */ case COMMAND_SET_CHARS_CHATTING: { CollectParameters(&m_nIp, 3); - CPed* pPed1 = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - CPed* pPed2 = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pPed1 = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed2 = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pPed1 && pPed2); - pPed1->SetChat(pPed2, GET_INTEGER_PARAM(2)); - pPed2->SetChat(pPed1, GET_INTEGER_PARAM(2)); + pPed1->SetChat(pPed2, ScriptParams[2]); + pPed2->SetChat(pPed1, ScriptParams[2]); return 0; } //case COMMAND_MAKE_PLAYER_SAFE: @@ -213,9 +213,9 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_SET_CAR_STAYS_IN_CURRENT_LEVEL: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - if (GET_INTEGER_PARAM(1)) + if (ScriptParams[1]) pVehicle->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pVehicle->GetPosition()); else pVehicle->m_nZoneLevel = LEVEL_GENERIC; @@ -224,9 +224,9 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_SET_CHAR_STAYS_IN_CURRENT_LEVEL: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - if (GET_INTEGER_PARAM(1)) + if (ScriptParams[1]) pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pPed->GetPosition()); else pPed->m_nZoneLevel = LEVEL_GENERIC; @@ -236,16 +236,16 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_SET_DRUNK_INPUT_DELAY: { CollectParameters(&m_nIp, 2); - assert(GET_INTEGER_PARAM(1) < CPad::DRUNK_STEERING_BUFFER_SIZE); - CPad::GetPad(GET_INTEGER_PARAM(0))->SetDrunkInputDelay(GET_INTEGER_PARAM(1)); + assert(ScriptParams[1] < CPad::DRUNK_STEERING_BUFFER_SIZE); + CPad::GetPad(ScriptParams[0])->SetDrunkInputDelay(ScriptParams[1]); return 0; } case COMMAND_SET_CHAR_MONEY: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->m_nPedMoney = GET_INTEGER_PARAM(1); + pPed->m_nPedMoney = ScriptParams[1]; pPed->bMoneyHasBeenGivenByScript = true; return 0; } @@ -253,10 +253,10 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_GET_OFFSET_FROM_OBJECT_IN_WORLD_COORDS: { CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - CVector result = Multiply3x3(pObject->GetMatrix(), GET_VECTOR_PARAM(1)) + pObject->GetPosition(); - SET_VECTOR_PARAM(0, result); + CVector result = Multiply3x3(pObject->GetMatrix(), *(CVector*)&ScriptParams[1]) + pObject->GetPosition(); + *(CVector*)&ScriptParams[0] = result; StoreParameters(&m_nIp, 3); return 0; } @@ -268,34 +268,34 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) return 0; case COMMAND_REGISTER_AMBULANCE_LEVEL: CollectParameters(&m_nIp, 1); - CStats::RegisterLevelAmbulanceMission(GET_INTEGER_PARAM(0)); + CStats::RegisterLevelAmbulanceMission(ScriptParams[0]); return 0; case COMMAND_REGISTER_FIRE_EXTINGUISHED: CStats::AnotherFireExtinguished(); return 0; case COMMAND_TURN_PHONE_ON: CollectParameters(&m_nIp, 1); - gPhoneInfo.m_aPhones[GET_INTEGER_PARAM(0)].m_nState = PHONE_STATE_9; + gPhoneInfo.m_aPhones[ScriptParams[0]].m_nState = PHONE_STATE_9; return 0; /* case COMMAND_REGISTER_LONGEST_DODO_FLIGHT: CollectParameters(&m_nIp, 1); - CStats::RegisterLongestFlightInDodo(GET_INTEGER_PARAM(0)); + CStats::RegisterLongestFlightInDodo(ScriptParams[0]); return 0; */ case COMMAND_GET_OFFSET_FROM_CAR_IN_WORLD_COORDS: { CollectParameters(&m_nIp, 4); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - CVector result = Multiply3x3(pVehicle->GetMatrix(), GET_VECTOR_PARAM(1)) + pVehicle->GetPosition(); - SET_VECTOR_PARAM(0, result); + CVector result = Multiply3x3(pVehicle->GetMatrix(), *(CVector*)&ScriptParams[1]) + pVehicle->GetPosition(); + *(CVector*)&ScriptParams[0] = result; StoreParameters(&m_nIp, 3); return 0; } case COMMAND_SET_TOTAL_NUMBER_OF_KILL_FRENZIES: CollectParameters(&m_nIp, 1); - CStats::SetTotalNumberKillFrenzies(GET_INTEGER_PARAM(0)); + CStats::SetTotalNumberKillFrenzies(ScriptParams[0]); return 0; case COMMAND_BLOW_UP_RC_BUGGY: CWorld::Players[CWorld::PlayerInFocus].BlowUpRCBuggy(true); @@ -303,7 +303,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) /* case COMMAND_REMOVE_CAR_FROM_CHASE: CollectParameters(&m_nIp, 1); - CRecordDataForChase::RemoveCarFromChase(GET_INTEGER_PARAM(0)); + CRecordDataForChase::RemoveCarFromChase(ScriptParams[0]); return 0; */ case COMMAND_IS_FRENCH_GAME: @@ -314,57 +314,57 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) return 0; case COMMAND_CLEAR_MISSION_AUDIO: CollectParameters(&m_nIp, 1); - DMAudio.ClearMissionAudio(GET_INTEGER_PARAM(0) - 1); + DMAudio.ClearMissionAudio(ScriptParams[0] - 1); return 0; /* case COMMAND_SET_FADE_IN_AFTER_NEXT_ARREST: CollectParameters(&m_nIp, 1); - CRestart::bFadeInAfterNextArrest = !!GET_INTEGER_PARAM(0); + CRestart::bFadeInAfterNextArrest = !!ScriptParams[0]; return 0; case COMMAND_SET_FADE_IN_AFTER_NEXT_DEATH: CollectParameters(&m_nIp, 1); - CRestart::bFadeInAfterNextDeath = !!GET_INTEGER_PARAM(0); + CRestart::bFadeInAfterNextDeath = !!ScriptParams[0]; return 0; case COMMAND_SET_GANG_PED_MODEL_PREFERENCE: CollectParameters(&m_nIp, 2); - CGangs::SetGangPedModelOverride(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CGangs::SetGangPedModelOverride(ScriptParams[0], ScriptParams[1]); return 0; */ case COMMAND_SET_CHAR_USE_PEDNODE_SEEK: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - if (GET_INTEGER_PARAM(1)) + if (ScriptParams[1]) pPed->m_pNextPathNode = nil; - pPed->bUsePedNodeSeek = !!GET_INTEGER_PARAM(1); + pPed->bUsePedNodeSeek = !!ScriptParams[1]; return 0; } /* case COMMAND_SWITCH_VEHICLE_WEAPONS: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->bGunSwitchedOff = !GET_INTEGER_PARAM(1); + pVehicle->bGunSwitchedOff = !ScriptParams[1]; return 0; } - */ case COMMAND_SET_GET_OUT_OF_JAIL_FREE: CollectParameters(&m_nIp, 2); - CWorld::Players[GET_INTEGER_PARAM(0)].m_bGetOutOfJailFree = !!GET_INTEGER_PARAM(1); + CWorld::Players[ScriptParams[0]].m_bGetOutOfJailFree = !!ScriptParams[1]; return 0; + */ case COMMAND_SET_FREE_HEALTH_CARE: CollectParameters(&m_nIp, 2); - CWorld::Players[GET_INTEGER_PARAM(0)].m_bGetOutOfHospitalFree = !!GET_INTEGER_PARAM(1); + CWorld::Players[ScriptParams[0]].m_bGetOutOfHospitalFree = !!ScriptParams[1]; return 0; /* case COMMAND_IS_CAR_DOOR_CLOSED: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - UpdateCompareFlag(!pVehicle->IsDoorMissing((eDoors)GET_INTEGER_PARAM(1)) && pVehicle->IsDoorClosed((eDoors)GET_INTEGER_PARAM(1))); + UpdateCompareFlag(!pVehicle->IsDoorMissing((eDoors)ScriptParams[1]) && pVehicle->IsDoorClosed((eDoors)ScriptParams[1])); return 0; } */ @@ -374,49 +374,51 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) { CollectParameters(&m_nIp, 1); - if (CTheScripts::NumberOfExclusiveMissionScripts > 0) { - if (GET_INTEGER_PARAM(0) < UINT16_MAX - 1) - return 0; - SET_INTEGER_PARAM(0, UINT16_MAX - GET_INTEGER_PARAM(0)); - } + if (CTheScripts::NumberOfExclusiveMissionScripts > 0 && ScriptParams[0] <= UINT16_MAX - 2) + return 0; #ifdef MISSION_REPLAY - missionRetryScriptIndex = GET_INTEGER_PARAM(0); + missionRetryScriptIndex = ScriptParams[0]; if (missionRetryScriptIndex == 19) CStats::LastMissionPassedName[0] = '\0'; #endif CTimer::Suspend(); - int offset = CTheScripts::MultiScriptArray[GET_INTEGER_PARAM(0)] + 8; - int size = CTheScripts::MultiScriptArray[GET_INTEGER_PARAM(0) + 1] - CTheScripts::MultiScriptArray[GET_INTEGER_PARAM(0)]; - if (size <= 0) - size = CTheScripts::LargestMissionScriptSize; - CFileMgr::Seek(gScriptsFile, offset, 0); - CFileMgr::Read(gScriptsFile, (const char*)&CTheScripts::ScriptSpace[CTheScripts::MainScriptSize], size); // TODO - CRunningScript* pMissionScript = CTheScripts::StartNewScript(CTheScripts::MainScriptSize); + int offset = CTheScripts::MultiScriptArray[ScriptParams[0]]; +#ifdef USE_DEBUG_SCRIPT_LOADER + CFileMgr::ChangeDir("\\data\\"); + int handle = CFileMgr::OpenFile(scriptfile, "rb"); + CFileMgr::ChangeDir("\\"); +#else + CFileMgr::ChangeDir("\\"); + int handle = CFileMgr::OpenFile("data\\main.scm", "rb"); +#endif + CFileMgr::Seek(handle, offset, 0); + CFileMgr::Read(handle, (const char*)&CTheScripts::ScriptSpace[SIZE_MAIN_SCRIPT], SIZE_MISSION_SCRIPT); + CFileMgr::CloseFile(handle); + CRunningScript* pMissionScript = CTheScripts::StartNewScript(SIZE_MAIN_SCRIPT); CTimer::Resume(); pMissionScript->m_bIsMissionScript = true; pMissionScript->m_bMissionFlag = true; CTheScripts::bAlreadyRunningAMissionScript = true; - memset(&CTheScripts::ScriptSpace[CTheScripts::NumTrueGlobals * 4 + 8], 0, CTheScripts::MostGlobals * 4); - pMissionScript->Process(); + CGameLogic::ClearShortCut(); return 0; } case COMMAND_SET_OBJECT_DRAW_LAST: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - pObject->bDrawLast = !!GET_INTEGER_PARAM(1); + pObject->bDrawLast = !!ScriptParams[1]; return 0; } case COMMAND_GET_AMMO_IN_PLAYER_WEAPON: { CollectParameters(&m_nIp, 2); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - SET_INTEGER_PARAM(0, 0); + ScriptParams[0] = 0; for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) { - if (pPed->GetWeapon(i).m_eWeaponType == (eWeaponType)GET_INTEGER_PARAM(1)) - SET_INTEGER_PARAM(0, pPed->GetWeapon(i).m_nAmmoTotal); + if (pPed->GetWeapon(i).m_eWeaponType == (eWeaponType)ScriptParams[1]) + ScriptParams[0] = pPed->GetWeapon(i).m_nAmmoTotal; } StoreParameters(&m_nIp, 1); return 0; @@ -425,69 +427,83 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_GET_AMMO_IN_CHAR_WEAPON: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CWeapon* pWeaponSlot = &pPed->m_weapons[GET_INTEGER_PARAM(1)]; - if (pWeaponSlot->m_eWeaponType == (eWeaponType)GET_INTEGER_PARAM(1)) - SET_INTEGER_PARAM(0, pWeaponSlot->m_nAmmoTotal); + CWeapon* pWeaponSlot = &pPed->m_weapons[ScriptParams[1]]; + if (pWeaponSlot->m_eWeaponType == (eWeaponType)ScriptParams[1]) + ScriptParams[0] = pWeaponSlot->m_nAmmoTotal; else - SET_INTEGER_PARAM(0, 0); + ScriptParams[0] = 0; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_REGISTER_KILL_FRENZY_PASSED: CStats::AnotherKillFrenzyPassed(); return 0; - */ case COMMAND_SET_CHAR_SAY: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - switch (GET_INTEGER_PARAM(1)) { - case 15: - pPed->Say(0x93); // TODO + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + switch (ScriptParams[1]) { + case SCRIPT_SOUND_CHUNKY_RUN_SHOUT: + pPed->Say(SOUND_PED_FLEE_RUN); + break; + case SCRIPT_SOUND_SECURITY_GUARD_AWAY_SHOUT: + pPed->Say(SOUND_PED_FLEE_RUN); + break; + case SCRIPT_SOUND_SWAT_PED_SHOUT: + pPed->Say(SOUND_PED_PURSUIT_SWAT); + break; + case SCRIPT_SOUND_AMMUNATION_CHAT_1: + pPed->Say(SOUND_AMMUNATION_WELCOME_1); + break; + case SCRIPT_SOUND_AMMUNATION_CHAT_2: + pPed->Say(SOUND_AMMUNATION_WELCOME_2); + break; + case SCRIPT_SOUND_AMMUNATION_CHAT_3: + pPed->Say(SOUND_AMMUNATION_WELCOME_3); break; default: break; } return 0; } + */ case COMMAND_SET_NEAR_CLIP: CollectParameters(&m_nIp, 1); - TheCamera.SetNearClipScript(GET_FLOAT_PARAM(0)); + TheCamera.SetNearClipScript(*(float*)&ScriptParams[0]); return 0; case COMMAND_SET_RADIO_CHANNEL: CollectParameters(&m_nIp, 2); - // if (base::cSingleton::Instance()->unk()) - TODO on PS2, but it's not on mobile - DMAudio.SetRadioChannel(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + DMAudio.SetRadioChannel(ScriptParams[0], ScriptParams[1]); return 0; /* case COMMAND_OVERRIDE_HOSPITAL_LEVEL: CollectParameters(&m_nIp, 1); - CRestart::OverrideHospitalLevel = GET_INTEGER_PARAM(0); + CRestart::OverrideHospitalLevel = ScriptParams[0]; return 0; case COMMAND_OVERRIDE_POLICE_STATION_LEVEL: CollectParameters(&m_nIp, 1); - CRestart::OverridePoliceStationLevel = GET_INTEGER_PARAM(0); + CRestart::OverridePoliceStationLevel = ScriptParams[0]; return 0; case COMMAND_FORCE_RAIN: CollectParameters(&m_nIp, 1); - CWeather::bScriptsForceRain = !!GET_INTEGER_PARAM(0); + CWeather::bScriptsForceRain = !!ScriptParams[0]; return 0; - */ case COMMAND_DOES_GARAGE_CONTAIN_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pVehicle); - UpdateCompareFlag(CGarages::IsThisCarWithinGarageArea(GET_INTEGER_PARAM(0), pVehicle)); + UpdateCompareFlag(CGarages::IsThisCarWithinGarageArea(ScriptParams[0], pVehicle)); return 0; } + */ case COMMAND_SET_CAR_TRACTION: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - float fTraction = GET_FLOAT_PARAM(1); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + float fTraction = *(float*)&ScriptParams[1]; script_assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR || pVehicle->m_vehType == VEHICLE_TYPE_BIKE); if (pVehicle->m_vehType == VEHICLE_TYPE_CAR) ((CAutomobile*)pVehicle)->m_fTraction = fTraction; @@ -505,32 +521,33 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_CONVERT_METRES_TO_FEET: { CollectParameters(&m_nIp, 1); - float fMeterValue = GET_FLOAT_PARAM(0); + float fMeterValue = *(float*)&ScriptParams[0]; float fFeetValue = fMeterValue / METERS_IN_FOOT; - SET_FLOAT_PARAM(0, fFeetValue); + *(float*)&ScriptParams[0] = fFeetValue; StoreParameters(&m_nIp, 1); return 0; } + /* case COMMAND_MARK_ROADS_BETWEEN_LEVELS: { CollectParameters(&m_nIp, 6); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + float supZ = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(0); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[0]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(1); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[1]; } if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(2); + infZ = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[2]; } ThePaths.MarkRoadsBetweenLevelsInArea(infX, supX, infY, supY, infZ, supZ); return 0; @@ -538,136 +555,123 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_MARK_PED_ROADS_BETWEEN_LEVELS: { CollectParameters(&m_nIp, 6); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + float supZ = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(0); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[0]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(1); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[1]; } if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(2); + infZ = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[2]; } ThePaths.PedMarkRoadsBetweenLevelsInArea(infX, supX, infY, supY, infZ, supZ); return 0; } + */ case COMMAND_SET_CAR_AVOID_LEVEL_TRANSITIONS: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->AutoPilot.m_bStayInCurrentLevel = !!GET_INTEGER_PARAM(1); + pVehicle->AutoPilot.m_bStayInCurrentLevel = !!ScriptParams[1]; return 0; } /* case COMMAND_SET_CHAR_AVOID_LEVEL_TRANSITIONS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pPed); // not implemented return 0; } case COMMAND_IS_THREAT_FOR_PED_TYPE: CollectParameters(&m_nIp, 2); - UpdateCompareFlag(CPedType::IsThreat(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1))); + UpdateCompareFlag(CPedType::IsThreat(ScriptParams[0], ScriptParams[1])); return 0; */ case COMMAND_CLEAR_AREA_OF_CHARS: { CollectParameters(&m_nIp, 6); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float infZ = *(float*)&ScriptParams[2]; + float supX = *(float*)&ScriptParams[3]; + float supY = *(float*)&ScriptParams[4]; + float supZ = *(float*)&ScriptParams[5]; if (infX > supX) { - infX = GET_FLOAT_PARAM(3); - supX = GET_FLOAT_PARAM(0); + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[0]; } if (infY > supY) { - infY = GET_FLOAT_PARAM(4); - supY = GET_FLOAT_PARAM(1); + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[1]; } if (infZ > supZ) { - infZ = GET_FLOAT_PARAM(5); - supZ = GET_FLOAT_PARAM(2); + infZ = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[2]; } CWorld::ClearPedsFromArea(infX, infY, infZ, supX, supY, supZ); return 0; } case COMMAND_SET_TOTAL_NUMBER_OF_MISSIONS: CollectParameters(&m_nIp, 1); - CStats::SetTotalNumberMissions(CGame::germanGame ? GET_INTEGER_PARAM(0) - 2 : GET_INTEGER_PARAM(0)); + CStats::SetTotalNumberMissions(CGame::germanGame ? ScriptParams[0] - 2 : ScriptParams[0]); return 0; case COMMAND_CONVERT_METRES_TO_FEET_INT: CollectParameters(&m_nIp, 1); - GET_INTEGER_PARAM(0) *= FEET_IN_METER; + ScriptParams[0] *= FEET_IN_METER; StoreParameters(&m_nIp, 1); return 0; case COMMAND_REGISTER_FASTEST_TIME: CollectParameters(&m_nIp, 2); - CStats::RegisterFastestTime(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CStats::RegisterFastestTime(ScriptParams[0], ScriptParams[1]); return 0; case COMMAND_REGISTER_HIGHEST_SCORE: CollectParameters(&m_nIp, 2); - CStats::RegisterHighestScore(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CStats::RegisterHighestScore(ScriptParams[0], ScriptParams[1]); return 0; - case COMMAND_WARP_CHAR_INTO_CAR_AS_PASSENGER: - { - CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); - script_assert(pPed); - script_assert(pVehicle); - if (GET_INTEGER_PARAM(2) < 0) - pPed->WarpPedIntoCarAsPassenger(pVehicle, GET_INTEGER_PARAM(2)); - else { - script_assert(GET_INTEGER_PARAM(2) >= 0 && GET_INTEGER_PARAM(2) < ARRAY_SIZE(pVehicle->pPassengers)); - pPed->WarpPedIntoCarAsPassenger(pVehicle, GET_INTEGER_PARAM(2)); - } - return 0; - - } + //case COMMAND_WARP_CHAR_INTO_CAR_AS_PASSENGER: case COMMAND_IS_CAR_PASSENGER_SEAT_FREE: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - UpdateCompareFlag(GET_INTEGER_PARAM(1) < pVehicle->m_nNumMaxPassengers && pVehicle->pPassengers[GET_INTEGER_PARAM(1)] == nil); + UpdateCompareFlag(ScriptParams[1] < pVehicle->m_nNumMaxPassengers && pVehicle->pPassengers[ScriptParams[1]] == nil); return 0; } + /* case COMMAND_GET_CHAR_IN_CAR_PASSENGER_SEAT: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - script_assert(GET_INTEGER_PARAM(1) >= 0 && GET_INTEGER_PARAM(1) < ARRAY_SIZE(pVehicle->pPassengers)); - CPed* pPassenger = pVehicle->pPassengers[GET_INTEGER_PARAM(1)]; - SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(pPassenger)); + script_assert(ScriptParams[1] >= 0 && ScriptParams[1] < ARRAY_SIZE(pVehicle->pPassengers)); + CPed* pPassenger = pVehicle->pPassengers[ScriptParams[1]]; + ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPassenger); StoreParameters(&m_nIp, 1); return 0; } + */ case COMMAND_SET_CHAR_IS_CHRIS_CRIMINAL: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bChrisCriminal = !!GET_INTEGER_PARAM(1); + pPed->bChrisCriminal = !!ScriptParams[1]; return 0; } case COMMAND_START_CREDITS: - CollectParameters(&m_nIp, 1); - CCredits::Start(); // TODO: CCredits::Start(GET_INTEGER_PARAM(0)) + CCredits::Start(); return 0; case COMMAND_STOP_CREDITS: CCredits::Stop(); @@ -677,16 +681,16 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) return 0; case COMMAND_CREATE_SINGLE_PARTICLE: CollectParameters(&m_nIp, 8); - CParticle::AddParticle((tParticleType)GET_INTEGER_PARAM(0), GET_VECTOR_PARAM(1), - GET_VECTOR_PARAM(4), nil, GET_FLOAT_PARAM(7), 0, 0, 0, 0); + CParticle::AddParticle((tParticleType)ScriptParams[0], *(CVector*)&ScriptParams[1], + *(CVector*)&ScriptParams[4], nil, *(float*)&ScriptParams[7], 0, 0, 0, 0); return 0; /* case COMMAND_SET_CHAR_IGNORE_LEVEL_TRANSITIONS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - if (GET_INTEGER_PARAM(1)) + if (ScriptParams[1]) pPed->m_nZoneLevel = LEVEL_IGNORE; else pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pPed->GetPosition()); @@ -695,11 +699,11 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_GET_CHASE_CAR: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CRecordDataForChase::TurnChaseCarIntoScriptCar(GET_INTEGER_PARAM(0)); - SET_INTEGER_PARAM(0, CPools::GetVehiclePool()->GetIndex(pVehicle)); + CVehicle* pVehicle = CRecordDataForChase::TurnChaseCarIntoScriptCar(ScriptParams[0]); + ScriptParams[0] = CPools::GetVehiclePool()->GetIndex(pVehicle); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_CAR); + CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CAR); return 0; } case COMMAND_START_BOAT_FOAM_ANIMATION: @@ -708,7 +712,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_UPDATE_BOAT_FOAM_ANIMATION: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); CSpecialParticleStuff::UpdateBoatFoamAnimation(&pObject->GetMatrix()); return 0; @@ -716,12 +720,12 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) */ case COMMAND_SET_MUSIC_DOES_FADE: CollectParameters(&m_nIp, 1); - TheCamera.m_bIgnoreFadingStuffForMusic = (GET_INTEGER_PARAM(0) == 0); + TheCamera.m_bIgnoreFadingStuffForMusic = (ScriptParams[0] == 0); return 0; /* case COMMAND_SET_INTRO_IS_PLAYING: CollectParameters(&m_nIp, 1); - if (GET_INTEGER_PARAM(0)) { + if (ScriptParams[0]) { CGame::playingIntro = true; CStreaming::RemoveCurrentZonesModels(); } else { @@ -733,16 +737,17 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) CStreaming::LoadAllRequestedModels(false); } return 0; + */ case COMMAND_SET_PLAYER_HOOKER: { CollectParameters(&m_nIp, 2); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; - if (GET_INTEGER_PARAM(1) < 0) { + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; + if (ScriptParams[1] < 0) { pPlayerInfo->m_pHooker = nil; pPlayerInfo->m_nNextSexFrequencyUpdateTime = 0; pPlayerInfo->m_nNextSexMoneyUpdateTime = 0; } else { - CPed* pHooker = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pHooker = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pHooker); pPlayerInfo->m_pHooker = (CCivilianPed*)pHooker; pPlayerInfo->m_nSexFrequency = 1000; @@ -751,10 +756,8 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) } return 0; } - */ case COMMAND_PLAY_END_OF_GAME_TUNE: - DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND); - DMAudio.PlayFrontEndTrack(STREAMED_SOUND_CUTSCENE_FINALE, 1); // third parameter is 1 + DMAudio.PlayPreloadedCutSceneMusic(); return 0; case COMMAND_STOP_END_OF_GAME_TUNE: DMAudio.StopCutSceneMusic(); @@ -763,25 +766,25 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_GET_CAR_MODEL: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - SET_INTEGER_PARAM(0, pVehicle->GetModelIndex()); + ScriptParams[0] = pVehicle->GetModelIndex(); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_IS_PLAYER_SITTING_IN_CAR: { CollectParameters(&m_nIp, 2); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); UpdateCompareFlag(pPed->GetPedState() == PED_DRIVING && pPed->m_objective != OBJECTIVE_LEAVE_CAR && pPed->m_pMyVehicle == pVehicle); return 0; } case COMMAND_IS_PLAYER_SITTING_IN_ANY_CAR: { CollectParameters(&m_nIp, 1); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); UpdateCompareFlag(pPed->GetPedState() == PED_DRIVING && pPed->m_objective != OBJECTIVE_LEAVE_CAR); return 0; @@ -789,7 +792,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) /* case COMMAND_SET_SCRIPT_FIRE_AUDIO: CollectParameters(&m_nIp, 2); - gFireManager.SetScriptFireAudio(GET_INTEGER_PARAM(0), !!GET_INTEGER_PARAM(1)); + gFireManager.SetScriptFireAudio(ScriptParams[0], !!ScriptParams[1]); return 0; */ case COMMAND_ARE_ANY_CAR_CHEATS_ACTIVATED: @@ -798,16 +801,16 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_SET_CHAR_SUFFERS_CRITICAL_HITS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bNoCriticalHits = (GET_INTEGER_PARAM(1) == 0); + pPed->bNoCriticalHits = (ScriptParams[1] == 0); return 0; } /* case COMMAND_IS_PLAYER_LIFTING_A_PHONE: { CollectParameters(&m_nIp, 1); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); UpdateCompareFlag(pPed->GetPedState() == PED_MAKE_CALL); return 0; @@ -816,9 +819,9 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_IS_CHAR_SITTING_IN_CAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pVehicle); UpdateCompareFlag(pPed->GetPedState() == PED_DRIVING && pPed->m_objective != OBJECTIVE_LEAVE_CAR && pPed->m_pMyVehicle == pVehicle); return 0; @@ -826,7 +829,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_IS_CHAR_SITTING_IN_ANY_CAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->GetPedState() == PED_DRIVING && pPed->m_objective != OBJECTIVE_LEAVE_CAR); return 0; @@ -834,7 +837,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_IS_PLAYER_ON_FOOT: { CollectParameters(&m_nIp, 1); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); UpdateCompareFlag(!pPed->bInVehicle && pPed->m_objective != OBJECTIVE_ENTER_CAR_AS_PASSENGER && pPed->m_objective != OBJECTIVE_ENTER_CAR_AS_DRIVER); @@ -843,7 +846,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_IS_CHAR_ON_FOOT: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(!pPed->bInVehicle && pPed->m_objective != OBJECTIVE_ENTER_CAR_AS_PASSENGER && pPed->m_objective != OBJECTIVE_ENTER_CAR_AS_DRIVER); @@ -863,7 +866,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_LOAD_COLLISION_WITH_SCREEN: CollectParameters(&m_nIp, 1); CTimer::Stop(); - CGame::currLevel = (eLevelName)GET_INTEGER_PARAM(0); + CGame::currLevel = (eLevelName)ScriptParams[0]; if (CGame::currLevel != CCollision::ms_collisionInMemory) { ISLAND_LOADING_IS(LOW) { @@ -907,9 +910,9 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_SET_CAR_IGNORE_LEVEL_TRANSITIONS: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - if (GET_INTEGER_PARAM(1)) + if (ScriptParams[1]) pVehicle->m_nZoneLevel = LEVEL_IGNORE; else pVehicle->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pVehicle->GetPosition()); @@ -918,55 +921,61 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_MAKE_CRAIGS_CAR_A_BIT_STRONGER: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR); CAutomobile* pCar = (CAutomobile*)pVehicle; - pCar->bMoreResistantToDamage = GET_INTEGER_PARAM(1); + pCar->bMoreResistantToDamage = ScriptParams[1]; return 0; } */ case COMMAND_SET_JAMES_CAR_ON_PATH_TO_PLAYER: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); CCarCtrl::JoinCarWithRoadSystemGotoCoors(pVehicle, FindPlayerCoors(), false); return 0; } case COMMAND_LOAD_END_OF_GAME_TUNE: + DMAudio.ChangeMusicMode(MUSICMODE_CUTSCENE); + printf("Start preload end of game audio\n"); + DMAudio.PreloadCutSceneMusic(STREAMED_SOUND_CUTSCENE_FINALE); + printf("End preload end of game audio\n"); return 0; + /* case COMMAND_ENABLE_PLAYER_CONTROL_CAMERA: CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_CAMERA); return 0; + */ case COMMAND_SET_OBJECT_ROTATION: { CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); CWorld::Remove(pObject); pObject->SetOrientation( - DEGTORAD(GET_FLOAT_PARAM(1)), - DEGTORAD(GET_FLOAT_PARAM(2)), - DEGTORAD(GET_FLOAT_PARAM(3))); + DEGTORAD(*(float*)&ScriptParams[1]), + DEGTORAD(*(float*)&ScriptParams[2]), + DEGTORAD(*(float*)&ScriptParams[3])); pObject->GetMatrix().UpdateRW(); pObject->UpdateRwFrame(); CWorld::Add(pObject); return 0; } case COMMAND_GET_DEBUG_CAMERA_COORDINATES: - SET_VECTOR_PARAM(0, TheCamera.Cams[2].Source); + *(CVector*)&ScriptParams[0] = TheCamera.Cams[2].Source; StoreParameters(&m_nIp, 3); return 0; /* case COMMAND_GET_DEBUG_CAMERA_FRONT_VECTOR: - SET_VECTOR_PARAM(0, TheCamera.Cams[2].Front); + *(CVector*)&ScriptParams[0] = TheCamera.Cams[2].Front; StoreParameters(&m_nIp, 3); return 0; case COMMAND_IS_PLAYER_TARGETTING_ANY_CHAR: { CollectParameters(&m_nIp, 1); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); CEntity* pTarget = pPed->m_pPointGunAt; UpdateCompareFlag(pTarget && pTarget->IsPed()); @@ -976,13 +985,13 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_IS_PLAYER_TARGETTING_CHAR: { CollectParameters(&m_nIp, 2); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - CPed* pTestedPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTestedPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pTestedPed); CEntity* pTarget = pPed->m_pPointGunAt; bool bTargetting = pTarget && pTarget->IsPed() && pTarget == pTestedPed; -#ifdef GTA_PC + // PC shit static int nCounter = 0; nCounter = Max(0, nCounter - 1); if (!pPed->GetWeapon()->IsTypeMelee() && !bTargetting) { @@ -1009,50 +1018,22 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) } } } -#endif UpdateCompareFlag(bTargetting); return 0; } + /* case COMMAND_IS_PLAYER_TARGETTING_OBJECT: { CollectParameters(&m_nIp, 2); - CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - CObject* pTestedObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); + CObject* pTestedObject = CPools::GetObjectPool()->GetAt(ScriptParams[1]); script_assert(pTestedObject); CEntity* pTarget = pPed->m_pPointGunAt; - bool bTargetting = pTarget && pTarget->IsObject() && pTarget == pTestedObject; -#ifdef GTA_PC // we will never know if section is real - static int nCounter = 0; - nCounter = Max(0, nCounter - 1); - if (!pPed->GetWeapon()->IsTypeMelee() && !bTargetting) { - if ((pTestedObject->GetPosition() - TheCamera.GetPosition()).Magnitude() < 10.0f) { - CVector vTestedPos(pTestedObject->GetPosition().x, pTestedObject->GetPosition().y, pTestedObject->GetPosition().z); - CVector vScreenPos; - float w, h; - if (CSprite::CalcScreenCoors(vTestedPos, &vScreenPos, &w, &h, false)) { - CVector2D vCrosshairPosition(CCamera::m_f3rdPersonCHairMultX * RsGlobal.maximumWidth, CCamera::m_f3rdPersonCHairMultY * RsGlobal.maximumHeight); - float fScreenDistance = ((CVector2D)vScreenPos - vCrosshairPosition).Magnitude(); - if (SCREEN_STRETCH_X(0.45f) > fScreenDistance / w) { - CColPoint point; - CEntity* entity; - if (!CWorld::ProcessLineOfSight(TheCamera.GetPosition() + 2.0f * TheCamera.GetForward(), - vTestedPos, point, entity, true, true, true, true, true, false) || - entity == pTestedObject) { - nCounter += 2; - if (nCounter > 20) { - bTargetting = true; - nCounter = 20; - } - } - } - } - } - } - UpdateCompareFlag(bTargetting); -#endif + UpdateCompareFlag(pTarget && pTarget->IsObject() && pTarget == pTestedObject); return 0; } + */ case COMMAND_TERMINATE_ALL_SCRIPTS_WITH_THIS_NAME: { CTheScripts::ReadTextLabelFromScript(&m_nIp, tmp); @@ -1074,10 +1055,10 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 2); wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fAtX = GET_FLOAT_PARAM(0); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fAtY = GET_FLOAT_PARAM(1); + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fAtX = *(float*)&ScriptParams[0]; + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fAtY = *(float*)&ScriptParams[1]; CollectParameters(&m_nIp, 1); - CMessages::InsertNumberInString(text, GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1, + CMessages::InsertNumberInString(text, ScriptParams[0], -1, -1, -1, -1, -1, CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame++].m_Text); return 0; } @@ -1085,10 +1066,10 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 2); wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fAtX = GET_FLOAT_PARAM(0); - CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fAtY = GET_FLOAT_PARAM(1); + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fAtX = *(float*)&ScriptParams[0]; + CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame].m_fAtY = *(float*)&ScriptParams[1]; CollectParameters(&m_nIp, 2); - CMessages::InsertNumberInString(text, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1, + CMessages::InsertNumberInString(text, ScriptParams[0], ScriptParams[1], -1, -1, -1, -1, CTheScripts::IntroTextLines[CTheScripts::NumberOfIntroTextLinesThisFrame++].m_Text); return 0; } @@ -1100,11 +1081,11 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) return 0; /* CollectParameters(&m_nIp, 5); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - float range = GET_FLOAT_PARAM(3); - int mi = GET_INTEGER_PARAM(4) < 0 ? CTheScripts::UsedObjectArray[-GET_INTEGER_PARAM(4)].index : GET_INTEGER_PARAM(4); + float range = *(float*)&ScriptParams[3]; + int mi = ScriptParams[4] < 0 ? CTheScripts::UsedObjectArray[-ScriptParams[4]].index : ScriptParams[4]; int16 total; CEntity* apEntities[16]; CWorld::FindObjectsOfTypeInRange(mi, pos, range, true, &total, 16, apEntities, false, false, false, true, true); @@ -1136,9 +1117,9 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) script_assert(pClosestEntity->IsObject()); CObject* pObject = (CObject*)pClosestEntity; pObject->ObjectCreatedBy = MISSION_OBJECT; - SET_INTEGER_PARAM(0, CPools::GetObjectPool()->GetIndex(pObject)); + ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pObject); } else { - SET_INTEGER_PARAM(0, -1); + ScriptParams[0] = -1; } StoreParameters(&m_nIp, 1); return 0; @@ -1148,11 +1129,11 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_PLACE_OBJECT_RELATIVE_TO_OBJECT: { CollectParameters(&m_nIp, 5); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - CObject* pTarget = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); + CObject* pTarget = CPools::GetObjectPool()->GetAt(ScriptParams[1]); script_assert(pTarget); - CVector offset = GET_VECTOR_PARAM(2); + CVector offset = *(CVector*)&ScriptParams[2]; CPhysical::PlacePhysicalRelativeToOtherPhysical(pTarget, pObject, offset); return 0; } @@ -1160,81 +1141,79 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_SET_ALL_OCCUPANTS_OF_CAR_LEAVE_CAR: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); CCarAI::TellOccupantsToLeaveCar(pVehicle); return 0; } case COMMAND_SET_INTERPOLATION_PARAMETERS: CollectParameters(&m_nIp, 2); - TheCamera.SetParametersForScriptInterpolation(GET_FLOAT_PARAM(0), 100.0f - GET_FLOAT_PARAM(0), GET_INTEGER_PARAM(1)); + TheCamera.SetParametersForScriptInterpolation(*(float*)&ScriptParams[0], 100.0f - *(float*)&ScriptParams[0], ScriptParams[1]); return 0; /* case COMMAND_GET_CLOSEST_CAR_NODE_WITH_HEADING_TOWARDS_POINT: { CollectParameters(&m_nIp, 5); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - float destX = GET_FLOAT_PARAM(3); - float destY = GET_FLOAT_PARAM(4); + float destX = *(float*)&ScriptParams[3]; + float destY = *(float*)&ScriptParams[4]; int32 nid = ThePaths.FindNodeClosestToCoors(pos, 0, 999999.9f, true, true); CPathNode* pNode = &ThePaths.m_pathNodes[nid]; - SET_VECTOR_PARAM(0, pNode->GetPosition()); - SET_FLOAT_PARAM(3, ThePaths.FindNodeOrientationForCarPlacementFacingDestination(nid, destX, destY, true)); + *(CVector*)&ScriptParams[0] = pNode->GetPosition(); + *(float*)&ScriptParams[3] = ThePaths.FindNodeOrientationForCarPlacementFacingDestination(nid, destX, destY, true); StoreParameters(&m_nIp, 4); return 0; } case COMMAND_GET_CLOSEST_CAR_NODE_WITH_HEADING_AWAY_POINT: { CollectParameters(&m_nIp, 5); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - float destX = GET_FLOAT_PARAM(3); - float destY = GET_FLOAT_PARAM(4); + float destX = *(float*)&ScriptParams[3]; + float destY = *(float*)&ScriptParams[4]; int32 nid = ThePaths.FindNodeClosestToCoors(pos, 0, 999999.9f, true, true); CPathNode* pNode = &ThePaths.m_pathNodes[nid]; - SET_VECTOR_PARAM(0, pNode->GetPosition()); - SET_FLOAT_PARAM(3, ThePaths.FindNodeOrientationForCarPlacementFacingDestination(nid, destX, destY, false)); + *(CVector*)&ScriptParams[0] = pNode->GetPosition(); + *(float*)&ScriptParams[3] = ThePaths.FindNodeOrientationForCarPlacementFacingDestination(nid, destX, destY, false); StoreParameters(&m_nIp, 4); return 0; } */ case COMMAND_GET_DEBUG_CAMERA_POINT_AT: - SET_VECTOR_PARAM(0, TheCamera.Cams[2].Source + TheCamera.Cams[2].Front); + *(CVector*)&ScriptParams[0] = TheCamera.Cams[2].Source + TheCamera.Cams[2].Front; StoreParameters(&m_nIp, 3); return 0; case COMMAND_ATTACH_CHAR_TO_CAR: { CollectParameters(&m_nIp, 8); - CPed *pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - CVehicle *pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); - pPed->AttachPedToEntity(pVehicle, GET_VECTOR_PARAM(2), GET_INTEGER_PARAM(5), DEGTORAD(GET_FLOAT_PARAM(6)), (eWeaponType)GET_INTEGER_PARAM(7)); + CPed *pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CVehicle *pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + pPed->AttachPedToEntity(pVehicle, *(CVector*)&ScriptParams[2], ScriptParams[5], DEGTORAD(*(float*)&ScriptParams[6]), (eWeaponType)ScriptParams[7]); return 0; } case COMMAND_DETACH_CHAR_FROM_CAR: { CollectParameters(&m_nIp, 1); - CPed *pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - if (pPed && pPed->m_attachedTo) { + CPed *pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + if (pPed && pPed->m_attachedTo) pPed->DettachPedFromEntity(); - pPed->bIsAimingGun = false; - } return 0; } case COMMAND_SET_CAR_CHANGE_LANE: // for some reason changed in SA { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->AutoPilot.m_bStayInFastLane = !GET_INTEGER_PARAM(1); + pVehicle->AutoPilot.m_bStayInFastLane = !ScriptParams[1]; return 0; } case COMMAND_CLEAR_CHAR_LAST_WEAPON_DAMAGE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); if (pPed) pPed->m_lastWepDam = -1; else @@ -1244,7 +1223,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_CLEAR_CAR_LAST_WEAPON_DAMAGE: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); if (pVehicle) pVehicle->m_nLastWeaponDamage = -1; else @@ -1256,10 +1235,10 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) CollectParameters(&m_nIp, 9); int ped_handle = -1; CVector pos = FindPlayerCoors(); - float x1 = GET_FLOAT_PARAM(0); - float y1 = GET_FLOAT_PARAM(1); - float x2 = GET_FLOAT_PARAM(2); - float y2 = GET_FLOAT_PARAM(3); + float x1 = *(float*)&ScriptParams[0]; + float y1 = *(float*)&ScriptParams[1]; + float x2 = *(float*)&ScriptParams[2]; + float y2 = *(float*)&ScriptParams[3]; int i = CPools::GetPedPool()->GetSize(); while (--i && ped_handle == -1) { CPed* pPed = CPools::GetPedPool()->GetSlot(i); @@ -1269,7 +1248,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) continue; if (pPed->m_nPedType != PEDTYPE_COP) continue; - if (!ThisIsAValidRandomCop(pPed->GetModelIndex(), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(8))) + if (!ThisIsAValidRandomCop(pPed->GetModelIndex(), ScriptParams[4], ScriptParams[5], ScriptParams[6], ScriptParams[7], ScriptParams[8])) continue; if (pPed->CharCreatedBy != RANDOM_CHAR) continue; @@ -1295,7 +1274,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) if (m_bIsMissionScript) CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR); } - SET_INTEGER_PARAM(0, ped_handle); + ScriptParams[0] = ped_handle; StoreParameters(&m_nIp, 1); return 0; } @@ -1343,7 +1322,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) if (m_bIsMissionScript) CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR); } - SET_INTEGER_PARAM(0, ped_handle); + ScriptParams[0] = ped_handle; StoreParameters(&m_nIp, 1); return 0; } @@ -1351,9 +1330,9 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_SET_CHAR_OBJ_FLEE_CAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pVehicle); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FLEE_CAR, pVehicle); @@ -1362,20 +1341,20 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_GET_DRIVER_OF_CAR: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); CPed* pDriver = pVehicle->pDriver; if (pDriver) - SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(pDriver)); + ScriptParams[0] = CPools::GetPedPool()->GetIndex(pDriver); else - SET_INTEGER_PARAM(0, -1); + ScriptParams[0] = -1; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_GET_NUMBER_OF_FOLLOWERS: { CollectParameters(&m_nIp, 1); - CPed* pLeader = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pLeader = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pLeader); int total = 0; int i = CPools::GetPedPool()->GetSize(); @@ -1386,34 +1365,34 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) if (pPed->m_leader == pLeader) total++; } - SET_INTEGER_PARAM(0, total); + ScriptParams[0] = total; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_GIVE_REMOTE_CONTROLLED_MODEL_TO_PLAYER: { CollectParameters(&m_nIp, 6); - CVector pos = GET_VECTOR_PARAM(1); + CVector pos = *(CVector*)&ScriptParams[1]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CRemote::GivePlayerRemoteControlledCar(pos.x, pos.y, pos.z, DEGTORAD(GET_FLOAT_PARAM(4)), GET_INTEGER_PARAM(5)); + CRemote::GivePlayerRemoteControlledCar(pos.x, pos.y, pos.z, DEGTORAD(*(float*)&ScriptParams[4]), ScriptParams[5]); return 0; } case COMMAND_GET_CURRENT_PLAYER_WEAPON: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - SET_INTEGER_PARAM(0, pPed->GetWeapon()->m_eWeaponType); + ScriptParams[0] = pPed->GetWeapon()->m_eWeaponType; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_GET_CURRENT_CHAR_WEAPON: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - SET_INTEGER_PARAM(0, pPed->GetWeapon()->m_eWeaponType); + ScriptParams[0] = pPed->GetWeapon()->m_eWeaponType; StoreParameters(&m_nIp, 1); return 0; } @@ -1428,36 +1407,36 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_SET_CAR_TEMP_ACTION: { CollectParameters(&m_nIp, 3); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->AutoPilot.m_nTempAction = (uint8)GET_INTEGER_PARAM(1); - pVehicle->AutoPilot.m_nTimeTempAction = CTimer::GetTimeInMilliseconds() + GET_INTEGER_PARAM(2); + pVehicle->AutoPilot.m_nTempAction = (uint8)ScriptParams[1]; + pVehicle->AutoPilot.m_nTimeTempAction = CTimer::GetTimeInMilliseconds() + ScriptParams[2]; return 0; } /* case COMMAND_SET_CAR_HANDBRAKE_TURN_RIGHT: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); pVehicle->AutoPilot.m_nTempAction = TEMPACT_HANDBRAKETURNRIGHT; - pVehicle->AutoPilot.m_nTimeTempAction = CTimer::GetTimeInMilliseconds() + GET_INTEGER_PARAM(1); + pVehicle->AutoPilot.m_nTimeTempAction = CTimer::GetTimeInMilliseconds() + ScriptParams[1]; return 0; } case COMMAND_SET_CAR_HANDBRAKE_STOP: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); pVehicle->AutoPilot.m_nTempAction = TEMPACT_HANDBRAKESTRAIGHT; - pVehicle->AutoPilot.m_nTimeTempAction = CTimer::GetTimeInMilliseconds() + GET_INTEGER_PARAM(1); + pVehicle->AutoPilot.m_nTimeTempAction = CTimer::GetTimeInMilliseconds() + ScriptParams[1]; return 0; } */ case COMMAND_IS_CHAR_ON_ANY_BIKE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle&& pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BIKE); return 0; @@ -1467,16 +1446,16 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_LOCATE_SNIPER_BULLET_3D: LocateSniperBulletCommand(command, &m_nIp); return 0; + */ case COMMAND_GET_NUMBER_OF_SEATS_IN_MODEL: CollectParameters(&m_nIp, 1); - SET_INTEGER_PARAM(0, CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors(GET_INTEGER_PARAM(0)) + 1); + ScriptParams[0] = CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors(ScriptParams[0]) + 1; StoreParameters(&m_nIp, 1); return 0; - */ case COMMAND_IS_PLAYER_ON_ANY_BIKE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BIKE); return 0; @@ -1485,7 +1464,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_IS_CHAR_LYING_DOWN: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->bFallenDown); return 0; @@ -1494,9 +1473,9 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_CAN_CHAR_SEE_DEAD_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - int pedtype = GET_INTEGER_PARAM(1); + int pedtype = ScriptParams[1]; bool can = false; for (int i = 0; i < pPed->m_numNearPeds; i++) { CPed* pTestPed = pPed->m_nearPeds[i]; @@ -1508,75 +1487,69 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) } case COMMAND_SET_ENTER_CAR_RANGE_MULTIPLIER: CollectParameters(&m_nIp, 1); - CPed::nEnterCarRangeMultiplier = GET_FLOAT_PARAM(0); + CPed::nEnterCarRangeMultiplier = *(float*)&ScriptParams[0]; return 0; case COMMAND_SET_THREAT_REACTION_RANGE_MULTIPLIER: CollectParameters(&m_nIp, 1); - CPed::nThreatReactionRangeMultiplier = GET_FLOAT_PARAM(0); - if (CPed::nThreatReactionRangeMultiplier < 1) - CPed::nThreatReactionRangeMultiplier = 1; + CPed::nThreatReactionRangeMultiplier = *(float*)&ScriptParams[0]; return 0; case COMMAND_SET_CHAR_CEASE_ATTACK_TIMER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->m_ceaseAttackTimer = GET_INTEGER_PARAM(1); + pPed->m_ceaseAttackTimer = ScriptParams[1]; return 0; } case COMMAND_GET_REMOTE_CONTROLLED_CAR: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CWorld::Players[GET_INTEGER_PARAM(0)].m_pRemoteVehicle; + CVehicle* pVehicle = CWorld::Players[ScriptParams[0]].m_pRemoteVehicle; if (pVehicle) - SET_INTEGER_PARAM(0, CPools::GetVehiclePool()->GetIndex(pVehicle)); + ScriptParams[0] = CPools::GetVehiclePool()->GetIndex(pVehicle); else - SET_INTEGER_PARAM(0, -1); + ScriptParams[0] = -1; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_IS_PC_VERSION: -#ifdef GTA_PC UpdateCompareFlag(true); -#else - UpdateCompareFlag(false); -#endif return 0; //case COMMAND_REPLAY: //case COMMAND_IS_REPLAY_PLAYING: case COMMAND_IS_MODEL_AVAILABLE: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CModelInfo::GetModelInfo(GET_INTEGER_PARAM(0)) != nil); + UpdateCompareFlag(CModelInfo::GetModelInfo(ScriptParams[0]) != nil); return 0; case COMMAND_SHUT_CHAR_UP: CollectParameters(&m_nIp, 2); - DMAudio.SetPedTalkingStatus(CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)), GET_INTEGER_PARAM(1) == 0); + DMAudio.SetPedTalkingStatus(CPools::GetPedPool()->GetAt(ScriptParams[0]), ScriptParams[1] == 0); return 0; case COMMAND_SET_ENABLE_RC_DETONATE: CollectParameters(&m_nIp, 1); - CVehicle::bDisableRemoteDetonation = !GET_INTEGER_PARAM(0); + CVehicle::bDisableRemoteDetonation = !ScriptParams[0]; return 0; case COMMAND_SET_CAR_RANDOM_ROUTE_SEED: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->m_nRouteSeed = GET_INTEGER_PARAM(1); + pVehicle->m_nRouteSeed = ScriptParams[1]; return 0; } case COMMAND_IS_ANY_PICKUP_AT_COORDS: { - CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); - CRunningScript::UpdateCompareFlag(CPickups::TestForPickupsInBubble(pos, GET_FLOAT_PARAM(3))); + CollectParameters(&m_nIp, 3); + CVector pos = *(CVector*)&ScriptParams[0]; + CRunningScript::UpdateCompareFlag(CPickups::TestForPickupsInBubble(pos, 0.5f)); return 0; } - //case COMMAND_GET_FIRST_PICKUP_COORDS: - //case COMMAND_GET_NEXT_PICKUP_COORDS: + case COMMAND_GET_FIRST_PICKUP_COORDS: + case COMMAND_GET_NEXT_PICKUP_COORDS: case COMMAND_REMOVE_ALL_CHAR_WEAPONS: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->ClearWeapons(); return 0; @@ -1584,26 +1557,11 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_HAS_PLAYER_GOT_WEAPON: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); bool bFound = false; for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) { - if (pPed->GetWeapon(i).m_eWeaponType == GET_INTEGER_PARAM(1)) { - bFound = true; - break; - } - } - UpdateCompareFlag(bFound); - return 0; - } - case COMMAND_HAS_CHAR_GOT_WEAPON: - { - CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pPed); - bool bFound = false; - for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) { - if (pPed->GetWeapon(i).m_eWeaponType == GET_INTEGER_PARAM(1)) { + if (pPed->GetWeapon(i).m_eWeaponType == ScriptParams[1]) { bFound = true; break; } @@ -1611,30 +1569,31 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) UpdateCompareFlag(bFound); return 0; } + //case COMMAND_HAS_CHAR_GOT_WEAPON: //case COMMAND_IS_PLAYER_FACING_CHAR: case COMMAND_SET_TANK_DETONATE_CARS: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle && pVehicle->m_vehType == VEHICLE_TYPE_CAR); - ((CAutomobile*)pVehicle)->bTankDetonateCars = GET_INTEGER_PARAM(1); + ((CAutomobile*)pVehicle)->bTankDetonateCars = ScriptParams[1]; return 0; } case COMMAND_GET_POSITION_OF_ANALOGUE_STICKS: { CollectParameters(&m_nIp, 1); - CPad* pPad = CPad::GetPad(GET_INTEGER_PARAM(0)); - SET_INTEGER_PARAM(0, pPad->NewState.LeftStickX); - SET_INTEGER_PARAM(1, pPad->NewState.LeftStickY); - SET_INTEGER_PARAM(2, pPad->NewState.RightStickX); - SET_INTEGER_PARAM(3, pPad->NewState.RightStickY); + CPad* pPad = CPad::GetPad(ScriptParams[0]); + ScriptParams[0] = pPad->NewState.LeftStickX; + ScriptParams[1] = pPad->NewState.LeftStickY; + ScriptParams[2] = pPad->NewState.RightStickX; + ScriptParams[3] = pPad->NewState.RightStickY; StoreParameters(&m_nIp, 4); return 0; } case COMMAND_IS_CAR_ON_FIRE: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); bool bOnFire = false; if (pVehicle->m_pCarFire) @@ -1649,35 +1608,35 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_IS_CAR_TYRE_BURST: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); bool bIsBurst = false; CBike* pBike = (CBike*)pVehicle; if (pVehicle->IsBike()) { - if (GET_INTEGER_PARAM(1) == 4) { + if (ScriptParams[1] == 4) { for (int i = 0; i < 2; i++) { if (pBike->m_wheelStatus[i] == WHEEL_STATUS_BURST) bIsBurst = true; } } else { - if (GET_INTEGER_PARAM(1) == 2) - SET_INTEGER_PARAM(1, 0); - if (GET_INTEGER_PARAM(1) == 3) - SET_INTEGER_PARAM(1, 1); - bIsBurst = pBike->m_wheelStatus[GET_INTEGER_PARAM(1)] == WHEEL_STATUS_BURST; + if (ScriptParams[1] == 2) + ScriptParams[1] = 0; + if (ScriptParams[1] == 3) + ScriptParams[1] = 1; + bIsBurst = pBike->m_wheelStatus[ScriptParams[1]] == WHEEL_STATUS_BURST; } } else { CAutomobile* pCar = (CAutomobile*)pVehicle; - if (GET_INTEGER_PARAM(1) == 4) { + if (ScriptParams[1] == 4) { for (int i = 0; i < 4; i++) { if (pCar->Damage.GetWheelStatus(i) == WHEEL_STATUS_BURST) bIsBurst = true; } } else - bIsBurst = pCar->Damage.GetWheelStatus(GET_INTEGER_PARAM(1) == WHEEL_STATUS_BURST); + bIsBurst = pCar->Damage.GetWheelStatus(ScriptParams[1] == WHEEL_STATUS_BURST); } UpdateCompareFlag(bIsBurst); return 0; @@ -1693,85 +1652,85 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) while (counter < 3 && CScriptPaths::aArray[counter].m_state != SCRIPT_PATH_DISABLED) { counter++; } - CScriptPaths::aArray[counter].InitialiseOne(GET_INTEGER_PARAM(0), GET_FLOAT_PARAM(1)); - SET_INTEGER_PARAM(0, 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); - CObject *pObj = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject *pObj = CPools::GetObjectPool()->GetAt(ScriptParams[0]); assert(pObj); - CScriptPaths::aArray[GET_INTEGER_PARAM(1)].SetObjectToControl(pObj); + CScriptPaths::aArray[ScriptParams[1]].SetObjectToControl(pObj); return 0; } case COMMAND_SET_OBJECT_PATH_SPEED: { CollectParameters(&m_nIp, 2); - CScriptPaths::aArray[GET_INTEGER_PARAM(0)].m_fSpeed = GET_FLOAT_PARAM(1); + CScriptPaths::aArray[ScriptParams[0]].m_fSpeed = *(float*)&ScriptParams[1]; return 0; } case COMMAND_SET_OBJECT_PATH_POSITION: { CollectParameters(&m_nIp, 2); - CScriptPaths::aArray[GET_INTEGER_PARAM(0)].m_fPosition = GET_FLOAT_PARAM(1); + 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); - CScriptPaths::aArray[GET_INTEGER_PARAM(0)].Clear(); + CScriptPaths::aArray[ScriptParams[0]].Clear(); return 0; } case COMMAND_HELI_GOTO_COORDS: { CollectParameters(&m_nIp, 5); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle && pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI); - ((CAutomobile*)pVehicle)->TellHeliToGoToCoors(GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), GET_FLOAT_PARAM(3), GET_INTEGER_PARAM(4)); + ((CAutomobile*)pVehicle)->TellHeliToGoToCoors(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2], *(float*)&ScriptParams[3], ScriptParams[4]); return 0; } case COMMAND_IS_INT_VAR_EQUAL_TO_CONSTANT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr == GET_INTEGER_PARAM(0)); + UpdateCompareFlag(*ptr == ScriptParams[0]); return 0; } case COMMAND_IS_INT_LVAR_EQUAL_TO_CONSTANT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr == GET_INTEGER_PARAM(0)); + UpdateCompareFlag(*ptr == ScriptParams[0]); return 0; } case COMMAND_GET_DEAD_CHAR_PICKUP_COORDS: { CollectParameters(&m_nIp, 1); - CPed *pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed *pTarget = CPools::GetPedPool()->GetAt(ScriptParams[0]); CVector pos; pTarget->CreateDeadPedPickupCoors(&pos.x, &pos.y, &pos.z); - SET_VECTOR_PARAM(0, pos); + *(CVector*)&ScriptParams[0] = pos; StoreParameters(&m_nIp, 3); return 0; } case COMMAND_CREATE_PROTECTION_PICKUP: { CollectParameters(&m_nIp, 5); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_PICKUP_REVENUE, PICKUP_ASSET_REVENUE, GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4))); // TODO: gpModelIndices + ScriptParams[0] = CPickups::GenerateNewOne(pos, MI_PICKUP_REVENUE, PICKUP_ASSET_REVENUE, ScriptParams[3], ScriptParams[4]); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_IS_CHAR_IN_ANY_BOAT: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT); return 0; @@ -1779,7 +1738,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_IS_PLAYER_IN_ANY_BOAT: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT); return 0; @@ -1787,7 +1746,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_IS_CHAR_IN_ANY_HELI: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI); return 0; @@ -1795,7 +1754,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_IS_PLAYER_IN_ANY_HELI: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI); return 0; @@ -1803,7 +1762,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_IS_CHAR_IN_ANY_PLANE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE); return 0; @@ -1811,7 +1770,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_IS_PLAYER_IN_ANY_PLANE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI); return 0; @@ -1819,7 +1778,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) case COMMAND_IS_CHAR_IN_WATER: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); UpdateCompareFlag(pPed && pPed->bIsInWater); return 0; } @@ -1827,14 +1786,14 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *ptr = GET_INTEGER_PARAM(0); + *ptr = ScriptParams[0]; return 0; } case COMMAND_SET_LVAR_INT_TO_CONSTANT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *ptr = GET_INTEGER_PARAM(0); + *ptr = ScriptParams[0]; return 0; } default: diff --git a/src/control/Script7.cpp b/src/control/Script7.cpp index de389a1..71099cc 100644 --- a/src/control/Script7.cpp +++ b/src/control/Script7.cpp @@ -13,7 +13,6 @@ #include "General.h" #include "Glass.h" #include "Fluff.h" -#include "KeyGen.h" #include "Hud.h" #include "MBlur.h" #include "Pad.h" @@ -32,8 +31,6 @@ #include "World.h" #include "Zones.h" -// LCS: file done except TODOs - int8 CRunningScript::ProcessCommands1200To1299(int32 command) { switch (command) { @@ -41,66 +38,66 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr > GET_INTEGER_PARAM(0)); + UpdateCompareFlag(*ptr > ScriptParams[0]); return 0; } case COMMAND_IS_INT_LVAR_GREATER_THAN_CONSTANT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr > GET_INTEGER_PARAM(0)); + UpdateCompareFlag(*ptr > ScriptParams[0]); return 0; } case COMMAND_IS_CONSTANT_GREATER_THAN_INT_VAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); - UpdateCompareFlag(GET_INTEGER_PARAM(0) > *ptr); + UpdateCompareFlag(ScriptParams[0] > *ptr); return 0; } case COMMAND_IS_CONSTANT_GREATER_THAN_INT_LVAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); - UpdateCompareFlag(GET_INTEGER_PARAM(0) > *ptr); + UpdateCompareFlag(ScriptParams[0] > *ptr); return 0; } case COMMAND_IS_INT_VAR_GREATER_OR_EQUAL_TO_CONSTANT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr >= GET_INTEGER_PARAM(0)); + UpdateCompareFlag(*ptr >= ScriptParams[0]); return 0; } case COMMAND_IS_INT_LVAR_GREATER_OR_EQUAL_TO_CONSTANT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr >= GET_INTEGER_PARAM(0)); + UpdateCompareFlag(*ptr >= ScriptParams[0]); return 0; } case COMMAND_IS_CONSTANT_GREATER_OR_EQUAL_TO_INT_VAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); - UpdateCompareFlag(GET_INTEGER_PARAM(0) >= *ptr); + UpdateCompareFlag(ScriptParams[0] >= *ptr); return 0; } case COMMAND_IS_CONSTANT_GREATER_OR_EQUAL_TO_INT_LVAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); - UpdateCompareFlag(GET_INTEGER_PARAM(0) >= *ptr); + UpdateCompareFlag(ScriptParams[0] >= *ptr); return 0; } case COMMAND_GET_CHAR_WEAPON_IN_SLOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - SET_INTEGER_PARAM(0, pPed->GetWeapon(GET_INTEGER_PARAM(1) - 1).m_eWeaponType); - SET_INTEGER_PARAM(1, pPed->GetWeapon(GET_INTEGER_PARAM(1) - 1).m_nAmmoTotal); - SET_INTEGER_PARAM(2, CPickups::ModelForWeapon((eWeaponType)GET_INTEGER_PARAM(0))); + ScriptParams[0] = pPed->GetWeapon(ScriptParams[1] - 1).m_eWeaponType; + ScriptParams[1] = pPed->GetWeapon(ScriptParams[1] - 1).m_nAmmoTotal; + ScriptParams[2] = CPickups::ModelForWeapon((eWeaponType)ScriptParams[0]); StoreParameters(&m_nIp, 3); return 0; } @@ -109,16 +106,16 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) CollectParameters(&m_nIp, 5); int node1, node2; float angle; - ThePaths.FindNodePairClosestToCoors(GET_VECTOR_PARAM(0), PATH_CAR, &node1, &node2, &angle, - GET_FLOAT_PARAM(3), GET_FLOAT_PARAM(4), true, true); + ThePaths.FindNodePairClosestToCoors(*(CVector*)&ScriptParams[0], PATH_CAR, &node1, &node2, &angle, + *(float*)&ScriptParams[3], *(float*)&ScriptParams[4], true, true); if (node1 == -1) { for (int i = 0; i < 7; i++) ScriptParams[i] = 0; } else { - SET_VECTOR_PARAM(0, ThePaths.FindNodeCoorsForScript(node1)); - SET_VECTOR_PARAM(3, ThePaths.FindNodeCoorsForScript(node2)); - SET_FLOAT_PARAM(6, angle); + *(CVector*)&ScriptParams[0] = ThePaths.FindNodeCoorsForScript(node1); + *(CVector*)&ScriptParams[3] = ThePaths.FindNodeCoorsForScript(node2); + *(float*)&ScriptParams[6] = angle; } StoreParameters(&m_nIp, 7); return 0; @@ -126,9 +123,9 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_SET_CAR_FORWARD_SPEED: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - float speed = GET_FLOAT_PARAM(1) / GAME_SPEED_TO_CARAI_SPEED; + float speed = *(float*)&ScriptParams[1] / GAME_SPEED_TO_CARAI_SPEED; pVehicle->SetMoveSpeed(pVehicle->GetForward() * speed); if (pVehicle->IsRealHeli() && pVehicle->IsCar()) ((CAutomobile*)pVehicle)->m_aWheelSpeed[1] = 0.22f; @@ -136,8 +133,8 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) } case COMMAND_SET_AREA_VISIBLE: CollectParameters(&m_nIp, 1); - CGame::currArea = GET_INTEGER_PARAM(0); - CStreaming::RemoveBuildingsNotInArea(GET_INTEGER_PARAM(0)); + CGame::currArea = ScriptParams[0]; + CStreaming::RemoveBuildingsNotInArea(ScriptParams[0]); return 0; case COMMAND_SET_CUTSCENE_ANIM_TO_LOOP: { @@ -150,28 +147,28 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_MARK_CAR_AS_CONVOY_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->bPartOfConvoy = GET_INTEGER_PARAM(1); + pVehicle->bPartOfConvoy = ScriptParams[1]; return 0; } case COMMAND_RESET_HAVOC_CAUSED_BY_PLAYER: { CollectParameters(&m_nIp, 1); - CWorld::Players[GET_INTEGER_PARAM(0)].m_nHavocLevel = 0; + CWorld::Players[ScriptParams[0]].m_nHavocLevel = 0; return 0; } case COMMAND_GET_HAVOC_CAUSED_BY_PLAYER: { CollectParameters(&m_nIp, 1); - SET_INTEGER_PARAM(0, CWorld::Players[GET_INTEGER_PARAM(0)].m_nHavocLevel); + ScriptParams[0] = CWorld::Players[ScriptParams[0]].m_nHavocLevel; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_CREATE_SCRIPT_ROADBLOCK: { CollectParameters(&m_nIp, 6); - CRoadBlocks::RegisterScriptRoadBlock(GET_VECTOR_PARAM(0), GET_VECTOR_PARAM(3)); + CRoadBlocks::RegisterScriptRoadBlock(*(CVector*)&ScriptParams[0], *(CVector*)&ScriptParams[3]); return 0; } case COMMAND_CLEAR_ALL_SCRIPT_ROADBLOCKS: @@ -182,9 +179,9 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_SET_CHAR_OBJ_WALK_TO_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTargetPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pTargetPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_GOTO_CHAR_ON_FOOT_WALKING, pTargetPed); @@ -194,17 +191,17 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS: { CollectParameters(&m_nIp, 4); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CVector result = Multiply3x3(pPed->GetMatrix(), GET_VECTOR_PARAM(1)) + pPed->GetPosition(); - SET_VECTOR_PARAM(0, result); + CVector result = Multiply3x3(pPed->GetMatrix(), *(CVector*)&ScriptParams[1]) + pPed->GetPosition(); + *(CVector*)&ScriptParams[0] = result; StoreParameters(&m_nIp, 3); return 0; } case COMMAND_HAS_CHAR_BEEN_PHOTOGRAPHED: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); bool result = false; if (pPed->bHasBeenPhotographed) { @@ -217,9 +214,9 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_SET_CHAR_OBJ_AIM_GUN_AT_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CPed* pTargetPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pTargetPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_AIM_GUN_AT, pTargetPed); @@ -228,21 +225,14 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_SWITCH_SECURITY_CAMERA: { CollectParameters(&m_nIp, 1); - if (GET_INTEGER_PARAM(0) != 0) { - // TheCamera.MBlur.? = 3; TODO(LCS) - CSpecialFX::bVideoCam = true; - } - else { - // TheCamera.MBlur.Reset(); - CSpecialFX::bVideoCam = false; - } + CSpecialFX::bVideoCam = ScriptParams[0] != 0; return 0; } //case COMMAND_IS_CHAR_IN_FLYING_VEHICLE: case COMMAND_IS_PLAYER_IN_FLYING_VEHICLE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && (pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI || pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE)); return 0; @@ -254,27 +244,27 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_ADD_SHORT_RANGE_SPRITE_BLIP_FOR_COORD: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); int id = CRadar::SetShortRangeCoordBlip(BLIP_COORD, pos, 5, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(3)); - SET_INTEGER_PARAM(0, id); + CRadar::SetBlipSprite(id, ScriptParams[3]); + ScriptParams[0] = id; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_MONEY_SPENT_ON_CLOTHES: CollectParameters(&m_nIp, 1); - //CStats::MoneySpentOnFashion(GET_INTEGER_PARAM(0)); + CStats::MoneySpentOnFashion(ScriptParams[0]); return 0; case COMMAND_SET_HELI_ORIENTATION: { CollectParameters(&m_nIp, 2); - CAutomobile* pHeli = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CAutomobile* pHeli = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pHeli && pHeli->IsCar() && pHeli->IsRealHeli()); - float fAngle = DEGTORAD(GET_FLOAT_PARAM(1) - 90.0f); + float fAngle = DEGTORAD(*(float*)&ScriptParams[1] - 90.0f); while (fAngle < 0.0f) fAngle += TWOPI; while (fAngle > TWOPI) @@ -285,7 +275,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_CLEAR_HELI_ORIENTATION: { CollectParameters(&m_nIp, 1); - CAutomobile* pHeli = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CAutomobile* pHeli = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pHeli && pHeli->IsCar() && pHeli->IsRealHeli()); pHeli->ClearHeliOrientation(); return 0; @@ -293,75 +283,66 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_PLANE_GOTO_COORDS: { CollectParameters(&m_nIp, 5); - CAutomobile* pPlane = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CAutomobile* pPlane = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pPlane && pPlane->IsCar() && pPlane->IsRealPlane()); - pPlane->TellPlaneToGoToCoors(GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), GET_FLOAT_PARAM(3), GET_INTEGER_PARAM(4)); + pPlane->TellPlaneToGoToCoors(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2], *(float*)&ScriptParams[3], ScriptParams[4]); return 0; } case COMMAND_GET_NTH_CLOSEST_CAR_NODE: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - SET_VECTOR_PARAM(0, ThePaths.FindNodeCoorsForScript(ThePaths.FindNthNodeClosestToCoors(pos, 0, 999999.9f, true, true, GET_INTEGER_PARAM(3) - 1))); - StoreParameters(&m_nIp, 3); - return 0; - } - case COMMAND_GET_NTH_CLOSEST_CHAR_NODE: - { - CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); - if (pos.z <= MAP_Z_LOW_LIMIT) - pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - SET_VECTOR_PARAM(0, ThePaths.FindNodeCoorsForScript(ThePaths.FindNthNodeClosestToCoors(pos, 1, 999999.9f, true, true, GET_INTEGER_PARAM(3) - 1))); + *(CVector*)&ScriptParams[0] = ThePaths.FindNodeCoorsForScript(ThePaths.FindNthNodeClosestToCoors(pos, 0, 999999.9f, true, true, ScriptParams[3] - 1)); StoreParameters(&m_nIp, 3); return 0; } + //case COMMAND_GET_NTH_CLOSEST_CHAR_NODE: case COMMAND_DRAW_WEAPONSHOP_CORONA: { CollectParameters(&m_nIp, 9); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CCoronas::RegisterCorona((uintptr)this + m_nIp, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(8), 255, pos, -GET_FLOAT_PARAM(3), - 150.0f, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), 1, 0, 0, 0.0f, false, 0.2f); + CCoronas::RegisterCorona((uintptr)this + m_nIp, ScriptParams[6], ScriptParams[7], ScriptParams[8], 255, pos, *(float*)&ScriptParams[3], + 150.0f, ScriptParams[4], ScriptParams[5], 1, 0, 0, 0.0f, false, 0.2f); return 0; } case COMMAND_SET_ENABLE_RC_DETONATE_ON_CONTACT: { CollectParameters(&m_nIp, 1); - CVehicle::bDisableRemoteDetonationOnContact = (GET_INTEGER_PARAM(0) == 0); + CVehicle::bDisableRemoteDetonationOnContact = (ScriptParams[0] == 0); return 0; } case COMMAND_FREEZE_CHAR_POSITION: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bIsFrozen = GET_INTEGER_PARAM(1); + pPed->bIsFrozen = ScriptParams[1]; return 0; } case COMMAND_SET_CHAR_DROWNS_IN_WATER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bDrownsInWater = GET_INTEGER_PARAM(1); + pPed->bDrownsInWater = ScriptParams[1]; return 0; } case COMMAND_SET_OBJECT_RECORDS_COLLISIONS: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - pObject->bUseCollisionRecords = GET_INTEGER_PARAM(1); + pObject->bUseCollisionRecords = ScriptParams[1]; return 0; } case COMMAND_HAS_OBJECT_COLLIDED_WITH_ANYTHING: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); UpdateCompareFlag(pObject->m_nCollisionRecords != 0); return 0; @@ -371,15 +352,13 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) CWorld::Players[CWorld::PlayerInFocus].BlowUpRCBuggy(false); return 0; } - case COMMAND_HAS_PHOTOGRAPH_BEEN_TAKEN: - UpdateCompareFlag(CWeapon::bPhotographHasBeenTaken); - return 0; + //case COMMAND_HAS_PHOTOGRAPH_BEEN_TAKEN: case COMMAND_GET_CHAR_ARMOUR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - SET_INTEGER_PARAM(0, pPed->m_fArmour); + ScriptParams[0] = pPed->m_fArmour; StoreParameters(&m_nIp, 1); return 0; } @@ -387,23 +366,23 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_SET_HELI_STABILISER: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->bHeliMinimumTilt = GET_INTEGER_PARAM(1); + pVehicle->bHeliMinimumTilt = ScriptParams[1]; return 0; } case COMMAND_SET_CAR_STRAIGHT_LINE_DISTANCE: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->AutoPilot.m_nSwitchDistance = GET_INTEGER_PARAM(1); + pVehicle->AutoPilot.m_nSwitchDistance = ScriptParams[1]; return 0; } case COMMAND_POP_CAR_BOOT: { CollectParameters(&m_nIp, 1); - CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pCar&& pCar->IsCar()); pCar->PopBoot(); return 0; @@ -411,22 +390,21 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_SHUT_PLAYER_UP: { CollectParameters(&m_nIp, 2); - DMAudio.ShutUpPlayerTalking(!!GET_INTEGER_PARAM(1)); + DMAudio.ShutUpPlayerTalking(!!ScriptParams[1]); return 0; } case COMMAND_SET_PLAYER_MOOD: { CollectParameters(&m_nIp, 3); - DMAudio.SetPlayersMood(GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + DMAudio.SetPlayersMood(ScriptParams[1], ScriptParams[2]); return 0; } case COMMAND_REQUEST_COLLISION: { CollectParameters(&m_nIp, 2); - CVector pos; - pos.x = GET_FLOAT_PARAM(0); - pos.y = GET_FLOAT_PARAM(1); - pos.z = 0.0f; + CVector2D pos; + pos.x = *(float*)&ScriptParams[0]; + pos.y = *(float*)&ScriptParams[1]; CColStore::RequestCollision(pos); return 0; } @@ -437,8 +415,9 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_IS_OBJECT_IN_WATER: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - UpdateCompareFlag(pObject && pObject->bIsInWater); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + script_assert(pObject); + UpdateCompareFlag(pObject->bIsInWater); return 0; } //case COMMAND_SET_CHAR_OBJ_STEAL_ANY_CAR_EVEN_MISSION_CAR: @@ -449,11 +428,11 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_SET_CHAR_CROUCH: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - if (GET_INTEGER_PARAM(1)) { + if (ScriptParams[1]) { pPed->bCrouchWhenShooting = true; - pPed->SetDuck(GET_INTEGER_PARAM(2), true); + pPed->SetDuck(ScriptParams[2], true); } else { pPed->ClearDuck(true); @@ -481,7 +460,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) return 0; } while (zone >= 0) { - CTheZones::SetZoneCivilianCarInfo(zone, GET_INTEGER_PARAM(0), carDensities, boatDensities); + CTheZones::SetZoneCivilianCarInfo(zone, ScriptParams[0], carDensities, boatDensities); zone = CTheZones::FindNextZoneByLabelAndReturnIndex(label, ZONE_INFO); } return 0; @@ -491,7 +470,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) char key[KEY_LENGTH_IN_SCRIPT]; CTheScripts::ReadTextLabelFromScript(&m_nIp, key); m_nIp += KEY_LENGTH_IN_SCRIPT; - CStreaming::RequestAnim(CAnimManager::GetAnimationBlockIndex(key), (m_bIsMissionScript ? STREAMFLAGS_SCRIPTOWNED : STREAMFLAGS_AMBIENT_SCRIPT_OWNED)); + CStreaming::RequestAnim(CAnimManager::GetAnimationBlockIndex(key), STREAMFLAGS_SCRIPTOWNED); return 0; } case COMMAND_HAS_ANIMATION_LOADED: @@ -508,13 +487,12 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) CTheScripts::ReadTextLabelFromScript(&m_nIp, key); m_nIp += KEY_LENGTH_IN_SCRIPT; CStreaming::RemoveAnim(CAnimManager::GetAnimationBlockIndex(key)); - // + empty function on PS2 return 0; } case COMMAND_IS_CHAR_WAITING_FOR_WORLD_COLLISION: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->bIsStaticWaitingForCollision); return 0; @@ -522,101 +500,87 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_IS_CAR_WAITING_FOR_WORLD_COLLISION: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); UpdateCompareFlag(pVehicle->bIsStaticWaitingForCollision); return 0; } - /* case COMMAND_IS_OBJECT_WAITING_FOR_WORLD_COLLISION: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); UpdateCompareFlag(pObject->bIsStaticWaitingForCollision); return 0; } - */ case COMMAND_SET_CHAR_SHUFFLE_INTO_DRIVERS_SEAT: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); pPed->PedShuffle(); return 0; } case COMMAND_ATTACH_CHAR_TO_OBJECT: { CollectParameters(&m_nIp, 8); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); - pPed->AttachPedToEntity(pObject, GET_VECTOR_PARAM(2), GET_INTEGER_PARAM(5), DEGTORAD(GET_INTEGER_PARAM(6)), (eWeaponType)GET_INTEGER_PARAM(7)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[1]); + pPed->AttachPedToEntity(pObject, *(CVector*)&ScriptParams[2], ScriptParams[5], DEGTORAD(ScriptParams[6]), (eWeaponType)ScriptParams[7]); return 0; } case COMMAND_SET_CHAR_AS_PLAYER_FRIEND: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bIsPlayerFriend = GET_INTEGER_PARAM(2); + pPed->bIsPlayerFriend = ScriptParams[2]; return 0; } //case COMMAND_DISPLAY_NTH_ONSCREEN_COUNTER: case COMMAND_DISPLAY_NTH_ONSCREEN_COUNTER_WITH_STRING: { char onscreen_str[12]; - //script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); - uint16 var = (uint8*)GetPointerToScriptVariable(&m_nIp, 0) - CTheScripts::ScriptSpace; + script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); + uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp); CollectParameters(&m_nIp, 2); wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ??? strncpy(onscreen_str, (char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); m_nIp += KEY_LENGTH_IN_SCRIPT; - CUserDisplay::OnscnTimer.AddCounter(var, GET_INTEGER_PARAM(0), onscreen_str, GET_INTEGER_PARAM(1) - 1); // TODO: last params are -1, nil, 0 + CUserDisplay::OnscnTimer.AddCounter(var, ScriptParams[0], onscreen_str, ScriptParams[1] - 1); return 0; } case COMMAND_ADD_SET_PIECE: { CollectParameters(&m_nIp, 13); - float fTriggerInfX = GET_FLOAT_PARAM(1); - float fTriggerInfY = GET_FLOAT_PARAM(2); - float fTriggerSupX = GET_FLOAT_PARAM(3); - float fTriggerSupY = GET_FLOAT_PARAM(4); - float fSpawn1X = GET_FLOAT_PARAM(5); - float fSpawn1Y = GET_FLOAT_PARAM(6); - float fTarget1X = GET_FLOAT_PARAM(7); - float fTarget1Y = GET_FLOAT_PARAM(8); - float fSpawn2X = GET_FLOAT_PARAM(9); - float fSpawn2Y = GET_FLOAT_PARAM(10); - float fTarget2X = GET_FLOAT_PARAM(11); - float fTarget2Y = GET_FLOAT_PARAM(12); - CSetPieces::AddOne(GET_INTEGER_PARAM(0), - CVector2D(fTriggerInfX, fTriggerInfY), CVector2D(fTriggerSupX, fTriggerSupY), - CVector2D(fSpawn1X, fSpawn1Y), CVector2D(fTarget1X, fTarget1Y), - CVector2D(fSpawn2X, fSpawn2Y), CVector2D(fTarget2X, fTarget2Y)); + CSetPieces::AddOne(ScriptParams[0], + *(CVector2D*)&ScriptParams[1], *(CVector2D*)&ScriptParams[3], + *(CVector2D*)&ScriptParams[5], *(CVector2D*)&ScriptParams[7], + *(CVector2D*)&ScriptParams[9], *(CVector2D*)&ScriptParams[11]); return 0; } case COMMAND_SET_EXTRA_COLOURS: { CollectParameters(&m_nIp, 2); - CTimeCycle::StartExtraColour(GET_INTEGER_PARAM(0)-1, GET_INTEGER_PARAM(1) != 0); + CTimeCycle::StartExtraColour(ScriptParams[0]-1, ScriptParams[1] != 0); return 0; } case COMMAND_CLEAR_EXTRA_COLOURS: { CollectParameters(&m_nIp, 1); - CTimeCycle::StopExtraColour(GET_INTEGER_PARAM(0)); + CTimeCycle::StopExtraColour(ScriptParams[0]); return 0; } //case COMMAND_CLOSE_CAR_BOOT: case COMMAND_GET_WHEELIE_STATS: { CollectParameters(&m_nIp, 1); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; - SET_INTEGER_PARAM(0, pPlayerInfo->m_nLastTimeCarSpentOnTwoWheels); - SET_FLOAT_PARAM(1, pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels); - SET_INTEGER_PARAM(2, pPlayerInfo->m_nLastTimeSpentOnWheelie); - SET_FLOAT_PARAM(3, pPlayerInfo->m_nLastDistanceTravelledOnWheelie); - SET_INTEGER_PARAM(4, pPlayerInfo->m_nLastTimeSpentOnStoppie); - SET_FLOAT_PARAM(5, pPlayerInfo->m_nLastDistanceTravelledOnStoppie); + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; + ScriptParams[0] = pPlayerInfo->m_nLastTimeCarSpentOnTwoWheels; + *(float*)&ScriptParams[1] = pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels; + ScriptParams[2] = pPlayerInfo->m_nLastTimeSpentOnWheelie; + *(float*)&ScriptParams[3] = pPlayerInfo->m_nLastDistanceTravelledOnWheelie; + ScriptParams[4] = pPlayerInfo->m_nLastTimeSpentOnStoppie; + *(float*)&ScriptParams[5] = pPlayerInfo->m_nLastDistanceTravelledOnStoppie; StoreParameters(&m_nIp, 6); pPlayerInfo->m_nLastTimeCarSpentOnTwoWheels = 0; pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels = 0.0f; @@ -630,23 +594,23 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_BURST_CAR_TYRE: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); if (pVehicle->IsBike()) { - if (GET_INTEGER_PARAM(1) == 2) - SET_INTEGER_PARAM(1, 0); - else if (GET_INTEGER_PARAM(1) == 3) - SET_INTEGER_PARAM(1, 1); - pVehicle->BurstTyre(GET_INTEGER_PARAM(1), true); + if (ScriptParams[1] == 2) + ScriptParams[1] = 0; + else if (ScriptParams[1] == 3) + ScriptParams[1] = 1; + pVehicle->BurstTyre(ScriptParams[1], true); } else { - pVehicle->BurstTyre(GET_INTEGER_PARAM(1), true); + pVehicle->BurstTyre(ScriptParams[1], true); } return 0; } case COMMAND_IS_CHAR_OBJ_NO_OBJ: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->m_prevObjective == OBJECTIVE_NONE && pPed->m_objective == OBJECTIVE_NONE); return 0; @@ -659,26 +623,26 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) m_nIp += KEY_LENGTH_IN_SCRIPT; for (int i = 0; i < KEY_LENGTH_IN_SCRIPT; i++) key[i] = tolower(key[i]); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - UpdateCompareFlag(CModelInfo::GetModelInfo(pPed->GetModelIndex())->GetNameHashKey() == CKeyGen::GetUppercaseKey(key)); + UpdateCompareFlag(strcmp(key, CModelInfo::GetModelInfo(pPed->GetModelIndex())->GetModelName()) == 0); return 0; } case COMMAND_SET_PLAYER_CAN_DO_DRIVE_BY: { CollectParameters(&m_nIp, 2); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; - pPlayerInfo->m_bDriveByAllowed = GET_INTEGER_PARAM(1); + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; + pPlayerInfo->m_bDriveByAllowed = ScriptParams[1]; return 0; } case COMMAND_SET_CHAR_OBJ_SPRINT_TO_COORD: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); CVector pos; - pos.x = GET_FLOAT_PARAM(1); - pos.y = GET_FLOAT_PARAM(2); + pos.x = *(float*)&ScriptParams[1]; + pos.y = *(float*)&ScriptParams[2]; pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_SPRINT_TO_AREA, pos); @@ -687,7 +651,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_CREATE_SWAT_ROPE: { CollectParameters(&m_nIp, 3); - CRopes::CreateRopeWithSwatComingDown(GET_VECTOR_PARAM(0)); + CRopes::CreateRopeWithSwatComingDown(*(CVector*)&ScriptParams[0]); return 0; } //case COMMAND_SET_FIRST_PERSON_CONTROL_CAMERA: @@ -695,19 +659,19 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_SET_CAR_MODEL_COMPONENTS: { CollectParameters(&m_nIp, 3); - CVehicleModelInfo::SetComponentsToUse(GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + CVehicleModelInfo::SetComponentsToUse(ScriptParams[1], ScriptParams[2]); return 0; } case COMMAND_SWITCH_LIFT_CAMERA: { CollectParameters(&m_nIp, 1); - CSpecialFX::bLiftCam = GET_INTEGER_PARAM(0) != 0; + CSpecialFX::bLiftCam = ScriptParams[0] != 0; return 0; } case COMMAND_CLOSE_ALL_CAR_DOORS: { CollectParameters(&m_nIp, 1); - CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pCar&& pCar->IsCar()); pCar->CloseAllDoors(); return 0; @@ -715,25 +679,21 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_GET_DISTANCE_BETWEEN_COORDS_2D: { CollectParameters(&m_nIp, 4); - float X1 = GET_FLOAT_PARAM(0); - float Y1 = GET_FLOAT_PARAM(1); - float X2 = GET_FLOAT_PARAM(2); - float Y2 = GET_FLOAT_PARAM(3); - SET_FLOAT_PARAM(0, (CVector2D(X1, Y1) - CVector2D(X2, Y2)).Magnitude()); + *(float*)&ScriptParams[0] = (*(CVector2D*)&ScriptParams[0] - *(CVector2D*)&ScriptParams[2]).Magnitude(); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_GET_DISTANCE_BETWEEN_COORDS_3D: { CollectParameters(&m_nIp, 6); - SET_FLOAT_PARAM(0, (GET_VECTOR_PARAM(0) - GET_VECTOR_PARAM(3)).Magnitude()); + *(float*)&ScriptParams[0] = (*(CVector*)&ScriptParams[0] - *(CVector*)&ScriptParams[3]).Magnitude(); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_POP_CAR_BOOT_USING_PHYSICS: { CollectParameters(&m_nIp, 1); - CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pCar && pCar->IsCar()); pCar->PopBootUsingPhysics(); return 0; @@ -742,7 +702,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_IS_CHAR_LEAVING_VEHICLE_TO_DIE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->m_objective == OBJECTIVE_LEAVE_CAR_AND_DIE); return 0; @@ -750,29 +710,25 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_SORT_OUT_OBJECT_COLLISION_WITH_CAR: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - pObject->m_pCollidingEntity = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + pObject->m_pCollidingEntity = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); return 0; } //case COMMAND_GET_MAX_WANTED_LEVEL: case COMMAND_IS_CHAR_WANDER_PATH_CLEAR: { CollectParameters(&m_nIp, 5); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - UpdateCompareFlag(CWorld::IsWanderPathClear(pPed->GetPosition(), GET_VECTOR_PARAM(0), GET_FLOAT_PARAM(3), 4)); + UpdateCompareFlag(CWorld::IsWanderPathClear(pPed->GetPosition(), *(CVector*)&ScriptParams[0], *(float*)&ScriptParams[3], 4)); return 0; } //case COMMAND_PRINT_HELP_WITH_NUMBER: case COMMAND_PRINT_HELP_FOREVER: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CHud::SetHelpMessage(text, false, true); // + true - if (text != CHud::gLastPrintForeverString) { - CHud::gLastPrintForeverString = text; - DMAudio.PlayFrontEndSound(SOUND_HUD, 0); - } + CHud::SetHelpMessage(text, false, true); return 0; } //case COMMAND_PRINT_HELP_FOREVER_WITH_NUMBER: @@ -788,10 +744,10 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_SET_CHAR_CAN_BE_DAMAGED_BY_MEMBERS_OF_GANG: { CollectParameters(&m_nIp, 3); - CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pTarget); - uint8 flag = 1 << (uint8)GET_INTEGER_PARAM(1); - if (GET_INTEGER_PARAM(2)) + uint8 flag = 1 << (uint8)ScriptParams[1]; + if (ScriptParams[2]) pTarget->m_gangFlags |= flag; else pTarget->m_gangFlags &= ~flag; @@ -804,7 +760,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_CREATE_LOCKED_PROPERTY_PICKUP: { CollectParameters(&m_nIp, 3); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; char key[KEY_LENGTH_IN_SCRIPT]; @@ -812,14 +768,14 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) m_nIp += KEY_LENGTH_IN_SCRIPT; // TheText.Get(key); CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_PICKUP_PROPERTY, PICKUP_PROPERTY_LOCKED, 0, 0, false, key)); // TODO: gpModelIndices + ScriptParams[0] = CPickups::GenerateNewOne(pos, MI_PICKUP_PROPERTY, PICKUP_PROPERTY_LOCKED, 0, 0, false, key); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_CREATE_FORSALE_PROPERTY_PICKUP: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; char key[KEY_LENGTH_IN_SCRIPT]; @@ -827,24 +783,24 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) m_nIp += KEY_LENGTH_IN_SCRIPT; // TheText.Get(key); CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_PICKUP_PROPERTY_FORSALE, PICKUP_PROPERTY_FORSALE, GET_INTEGER_PARAM(3), 0, false, key)); // TODO: gpModelIndices + ScriptParams[0] = CPickups::GenerateNewOne(pos, MI_PICKUP_PROPERTY_FORSALE, PICKUP_PROPERTY_FORSALE, ScriptParams[3], 0, false, key); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_FREEZE_CAR_POSITION: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->bIsFrozen = GET_INTEGER_PARAM(1); - pVehicle->bInfiniteMass = GET_INTEGER_PARAM(1); + pVehicle->bIsFrozen = ScriptParams[1]; + pVehicle->bInfiniteMass = ScriptParams[1]; return 0; } case COMMAND_HAS_CHAR_BEEN_DAMAGED_BY_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - CPed* pTestedPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pTestedPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); bool result = false; if (pPed) { if (pPed->m_lastDamEntity) { @@ -858,75 +814,16 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) UpdateCompareFlag(result); return 0; } - case COMMAND_HAS_CHAR_BEEN_DAMAGED_BY_CAR: - { - CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - CVehicle* pTestedVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); - bool result = false; - if (pPed) { - if (pPed->m_lastDamEntity) { - if (pPed->m_lastDamEntity == pTestedVehicle) - result = true; - } - } - else - debug("HAS_CHAR_BEEN_DAMAGED_BY_CAR - Character doesn't exist\n"); - UpdateCompareFlag(result); - return 0; - } - case COMMAND_HAS_CAR_BEEN_DAMAGED_BY_CHAR: - { - CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - CPed* pTestedPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); - bool result = false; - if (pVehicle) { - if (pVehicle->m_pLastDamageEntity) { - if (pVehicle->m_pLastDamageEntity == pTestedPed) - result = true; - if (pTestedPed->bInVehicle && pVehicle->m_pLastDamageEntity == pTestedPed->m_pMyVehicle) - result = true; - } - } - else - debug("HAS_CAR_BEEN_DAMAGED_BY_CHAR - Car doesn't exist\n"); - UpdateCompareFlag(result); - return 0; - } - case COMMAND_HAS_CAR_BEEN_DAMAGED_BY_CAR: - { - CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - CVehicle* pTestedVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); - bool result = false; - if (pVehicle) { - if (pVehicle->m_pLastDamageEntity) { - if (pVehicle->m_pLastDamageEntity == pTestedVehicle) - result = true; - } - } - else - debug("HAS_CAR_BEEN_DAMAGED_BY_CAR - First car doesn't exist\n"); - UpdateCompareFlag(result); - return 0; - } - case COMMAND_GET_RADIO_CHANNEL: - { - uint8 radio = DMAudio.GetRadioInCar(); - if (radio < NUM_RADIOS || radio == STREAMED_SOUND_MISSION_COMPLETED) - SET_INTEGER_PARAM(0, radio); - else - SET_INTEGER_PARAM(0, -1); - StoreParameters(&m_nIp, 1); - return 0; - } + //case COMMAND_HAS_CHAR_BEEN_DAMAGED_BY_CAR: + //case COMMAND_HAS_CAR_BEEN_DAMAGED_BY_CHAR: + //case COMMAND_HAS_CAR_BEEN_DAMAGED_BY_CAR: + //case COMMAND_GET_RADIO_CHANNEL: //case COMMAND_DISPLAY_TEXT_WITH_3_NUMBERS: //case COMMAND_IS_CAR_DROWNING_IN_WATER: case COMMAND_IS_CHAR_DROWNING_IN_WATER: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); UpdateCompareFlag(pPed && pPed->bIsDrowning); return 0; } @@ -940,7 +837,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) CollectParameters(&m_nIp, 3); bool shattered = false; - if ( CGlass::HasGlassBeenShatteredAtCoors(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2)) ) + if ( CGlass::HasGlassBeenShatteredAtCoors(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1], *(float*)&ScriptParams[2]) ) shattered = true; UpdateCompareFlag(shattered); @@ -949,14 +846,14 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_ATTACH_CUTSCENE_OBJECT_TO_BONE: { CollectParameters(&m_nIp, 3); - CCutsceneMgr::AttachObjectToBone(CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)), CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)), GET_INTEGER_PARAM(2)); + 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); - CObject *obj1 = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - CObject *obj2 = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); + 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); @@ -968,26 +865,26 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_SET_CHAR_STAY_IN_CAR_WHEN_JACKED: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bStayInCarOnJack = GET_INTEGER_PARAM(1); + pPed->bStayInCarOnJack = ScriptParams[1]; return 0; } //case COMMAND_IS_MISSION_AUDIO_LOADING: case COMMAND_ADD_MONEY_SPENT_ON_WEAPONS: CollectParameters(&m_nIp, 1); - CStats::MoneySpentOnWeapons(GET_INTEGER_PARAM(0)); + CStats::MoneySpentOnWeapons(ScriptParams[0]); return 0; case COMMAND_ADD_MONEY_SPENT_ON_PROPERTY: CollectParameters(&m_nIp, 1); - //CStats::MoneySpentOnProperty(GET_INTEGER_PARAM(0)); + CStats::MoneySpentOnProperty(ScriptParams[0]); return 0; //case COMMAND_ADD_MONEY_SPENT_ON_AUTO_PAINTING: case COMMAND_SET_CHAR_ANSWERING_MOBILE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - if (GET_INTEGER_PARAM(1)) + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + if (ScriptParams[1]) pPed->SetAnswerMobile(); else pPed->ClearAnswerMobile(); @@ -996,8 +893,8 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_SET_PLAYER_DRUNKENNESS: { CollectParameters(&m_nIp, 2); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; - pPlayerInfo->m_pPed->m_nDrunkenness = GET_INTEGER_PARAM(1); + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; + pPlayerInfo->m_pPed->m_nDrunkenness = ScriptParams[1]; pPlayerInfo->m_pPed->m_nFadeDrunkenness = 0; if (pPlayerInfo->m_pPed->m_nDrunkenness == 0) CMBlur::ClearDrunkBlur(); @@ -1009,21 +906,21 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) //case COMMAND_ADD_LOAN_SHARK_VISITS: case COMMAND_ADD_STORES_KNOCKED_OFF: CollectParameters(&m_nIp, 1); - //CStats::NumOfStoresKnockedOff(GET_INTEGER_PARAM(0)); + CStats::NumOfStoresKnockedOff(ScriptParams[0]); return 0; //case COMMAND_ADD_MOVIE_STUNTS: case COMMAND_ADD_NUMBER_OF_ASSASSINATIONS: CollectParameters(&m_nIp, 1); - //CStats::NumOfAssassinations(GET_INTEGER_PARAM(0)); + CStats::NumOfAssassinations(ScriptParams[0]); return 0; case COMMAND_ADD_PIZZAS_DELIVERED: CollectParameters(&m_nIp, 1); - CStats::NumOfPizzasDelivered(GET_INTEGER_PARAM(0)); + CStats::NumOfPizzasDelivered(ScriptParams[0]); return 0; //case COMMAND_ADD_GARBAGE_PICKUPS: case COMMAND_ADD_ICE_CREAMS_SOLD: CollectParameters(&m_nIp, 1); - CStats::NumOfIceCreamSold(GET_INTEGER_PARAM(0)); + CStats::NumOfIceCreamSold(ScriptParams[0]); return 0; //case COMMAND_SET_TOP_SHOOTING_RANGE_SCORE: //case COMMAND_ADD_SHOOTING_RANGE_RANK: @@ -1033,15 +930,15 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_SET_CHAR_IN_PLAYERS_GROUP_CAN_FIGHT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bDontFight = !GET_INTEGER_PARAM(1); + pPed->bDontFight = !ScriptParams[1]; return 0; } case COMMAND_CLEAR_CHAR_WAIT_STATE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->ClearWaitState(); return 0; @@ -1051,17 +948,17 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) CollectParameters(&m_nIp, 5); int handle = -1; uint32 i = CPools::GetVehiclePool()->GetSize(); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float supX = GET_FLOAT_PARAM(2); - float supY = GET_FLOAT_PARAM(3); + 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->GetVehicleAppearance() != VEHICLE_APPEARANCE_CAR && pVehicle->GetVehicleAppearance() != VEHICLE_APPEARANCE_BIKE) continue; - if (GET_INTEGER_PARAM(4) != pVehicle->GetModelIndex() && GET_INTEGER_PARAM(4) >= 0) + if (ScriptParams[4] != pVehicle->GetModelIndex() && ScriptParams[4] >= 0) continue; if (pVehicle->VehicleCreatedBy != RANDOM_VEHICLE) continue; @@ -1069,30 +966,30 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) continue; handle = CPools::GetVehiclePool()->GetIndex(pVehicle); } - SET_INTEGER_PARAM(0, handle); + ScriptParams[0] = handle; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_CAN_BURST_CAR_TYRES: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - pVehicle->bTyresDontBurst = !GET_INTEGER_PARAM(1); + pVehicle->bTyresDontBurst = !ScriptParams[1]; return 0; } case COMMAND_SET_PLAYER_AUTO_AIM: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - pPed->bDoomAim = GET_INTEGER_PARAM(1); + pPed->bDoomAim = ScriptParams[1]; return 0; } case COMMAND_FIRE_HUNTER_GUN: { CollectParameters(&m_nIp, 1); - CVehicle *pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle *pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); if (CTimer::GetTimeInMilliseconds() > pVehicle->m_nGunFiringTime + 150) { CWeapon gun(WEAPONTYPE_HELICANNON, 5000); CVector worldGunPos = (pVehicle->GetMatrix() * vecHunterGunPos) + (CTimer::GetTimeStep() * pVehicle->m_vecMoveSpeed); @@ -1105,27 +1002,27 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) } case COMMAND_SET_PROPERTY_AS_OWNED: CollectParameters(&m_nIp, 1); - CStats::AddPropertyAsOwned(GET_INTEGER_PARAM(0)); + CStats::AddPropertyAsOwned(ScriptParams[0]); return 0; case COMMAND_ADD_BLOOD_RING_KILLS: CollectParameters(&m_nIp, 1); - CStats::AddNumBloodRingKills(GET_INTEGER_PARAM(0)); + CStats::AddNumBloodRingKills(ScriptParams[0]); return 0; case COMMAND_SET_LONGEST_TIME_IN_BLOOD_RING: CollectParameters(&m_nIp, 1); - CStats::LongestTimeInBloodRing(GET_INTEGER_PARAM(0)); + CStats::LongestTimeInBloodRing(ScriptParams[0]); return 0; case COMMAND_REMOVE_EVERYTHING_FOR_HUGE_CUTSCENE: { - //CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver(); + CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver(); return 0; } case COMMAND_IS_PLAYER_TOUCHING_VEHICLE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); CPhysical* pTestedEntity = pPed; if (pPed->bInVehicle && pPed->m_pMyVehicle) pTestedEntity = pPed->m_pMyVehicle; @@ -1136,15 +1033,15 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_CHECK_FOR_PED_MODEL_AROUND_PLAYER: { CollectParameters(&m_nIp, 6); - CVector d1 = CWorld::Players[GET_INTEGER_PARAM(0)].GetPos() - GET_VECTOR_PARAM(1); - CVector d2 = CWorld::Players[GET_INTEGER_PARAM(0)].GetPos() + GET_VECTOR_PARAM(1); + CVector d1 = CWorld::Players[ScriptParams[0]].GetPos() - *(CVector*)&ScriptParams[1]; + CVector d2 = CWorld::Players[ScriptParams[0]].GetPos() + *(CVector*)&ScriptParams[1]; int i = CPools::GetPedPool()->GetSize(); bool result = false; while (i--) { CPed* pPed = CPools::GetPedPool()->GetSlot(i); if (!pPed) continue; - if (GET_INTEGER_PARAM(4) != pPed->GetModelIndex() && GET_INTEGER_PARAM(5) != pPed->GetModelIndex()) + if (ScriptParams[4] != pPed->GetModelIndex() && ScriptParams[5] != pPed->GetModelIndex()) continue; if (pPed->IsWithinArea(d1.x, d1.y, d1.z, d2.x, d2.y, d2.z)) result = true; @@ -1155,7 +1052,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_CLEAR_CHAR_FOLLOW_PATH: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); if (pPed->GetPedState() == PED_FOLLOW_PATH) { pPed->RestorePreviousState(); @@ -1166,15 +1063,15 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_SET_CHAR_CAN_BE_SHOT_IN_VEHICLE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bCanBeShotInVehicle = GET_INTEGER_PARAM(1); + pPed->bCanBeShotInVehicle = ScriptParams[1]; return 0; } case COMMAND_ATTACH_CUTSCENE_OBJECT_TO_VEHICLE: { CollectParameters(&m_nIp, 2); - CCutsceneMgr::AttachObjectToParent(CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)), CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1))); + CCutsceneMgr::AttachObjectToParent(CPools::GetObjectPool()->GetAt(ScriptParams[0]), CPools::GetVehiclePool()->GetAt(ScriptParams[1])); return 0; } case COMMAND_LOAD_MISSION_TEXT: @@ -1188,48 +1085,39 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_SET_TONIGHTS_EVENT: { CollectParameters(&m_nIp, 1); - CScrollBar::TonightsEvent = GET_INTEGER_PARAM(0); + CScrollBar::TonightsEvent = ScriptParams[0]; return 0; } case COMMAND_CLEAR_CHAR_LAST_DAMAGE_ENTITY: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); if (pPed) pPed->m_lastDamEntity = nil; else debug("CLEAR_CHAR_LAST_DAMAGE_ENTITY - Character doesn't exist\n"); return 0; } - case COMMAND_CLEAR_CAR_LAST_DAMAGE_ENTITY: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - if (pVehicle) - pVehicle->m_pLastDamageEntity = nil; - else - debug("CLEAR_CAR_LAST_DAMAGE_ENTITY - Car doesn't exist\n"); - return 0; - } + //case COMMAND_CLEAR_CAR_LAST_DAMAGE_ENTITY: case COMMAND_FREEZE_OBJECT_POSITION: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - pObject->bIsFrozen = GET_INTEGER_PARAM(1); - pObject->bInfiniteMass = GET_INTEGER_PARAM(1); + pObject->bIsFrozen = ScriptParams[1]; + pObject->bInfiniteMass = ScriptParams[1]; return 0; } case COMMAND_SET_PLAYER_HAS_MET_DEBBIE_HARRY: { CollectParameters(&m_nIp, 1); - CTheScripts::bPlayerHasMetDebbieHarry = GET_INTEGER_PARAM(0); + CTheScripts::bPlayerHasMetDebbieHarry = ScriptParams[0]; return 0; } case COMMAND_SET_RIOT_INTENSITY: { CollectParameters(&m_nIp, 1); - CTheScripts::RiotIntensity = GET_INTEGER_PARAM(0); + CTheScripts::RiotIntensity = ScriptParams[0]; return 0; } //case COMMAND_IS_CAR_IN_ANGLED_AREA_2D: @@ -1239,28 +1127,27 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 8); CGameLogic::SetUpShortCut( - GET_VECTOR_PARAM(0), GET_FLOAT_PARAM(3), - GET_VECTOR_PARAM(4), GET_FLOAT_PARAM(7)); + *(CVector*)&ScriptParams[0], *(float*)&ScriptParams[3], + *(CVector*)&ScriptParams[4], *(float*)&ScriptParams[7]); return 0; } case COMMAND_CLEAR_TAXI_SHORTCUT: CGameLogic::ClearShortCut(); - CGameLogic::RemoveShortCutDropOffPointForMission(); return 0; //case COMMAND_SET_CHAR_OBJ_GOTO_CAR_ON_FOOT: //case COMMAND_GET_CLOSEST_WATER_NODE: case COMMAND_ADD_PORN_LEAFLET_TO_RUBBISH: CollectParameters(&m_nIp, 1); - CStats::PamphletMissionPassed = GET_INTEGER_PARAM(0); + CStats::PamphletMissionPassed = ScriptParams[0]; return 0; case COMMAND_CREATE_CLOTHES_PICKUP: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_PICKUP_CLOTHES, PICKUP_ON_STREET, GET_INTEGER_PARAM(3))); // TODO: gpModelIndices + ScriptParams[0] = CPickups::GenerateNewOne(pos, MI_PICKUP_CLOTHES, PICKUP_ON_STREET, ScriptParams[3]); StoreParameters(&m_nIp, 1); return 0; } @@ -1268,32 +1155,30 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_MAKE_PLAYER_FIRE_PROOF: { CollectParameters(&m_nIp, 2); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; - pPlayerInfo->m_bFireproof = GET_INTEGER_PARAM(1); + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; + pPlayerInfo->m_bFireproof = ScriptParams[1]; return 0; } case COMMAND_INCREASE_PLAYER_MAX_HEALTH: { CollectParameters(&m_nIp, 2); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; - pPlayerInfo->m_nMaxHealth += GET_INTEGER_PARAM(1); + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; + pPlayerInfo->m_nMaxHealth += ScriptParams[1]; pPlayerInfo->m_pPed->m_fHealth = pPlayerInfo->m_nMaxHealth; - CHud::m_ItemToFlash = ITEM_HEALTH; return 0; } case COMMAND_INCREASE_PLAYER_MAX_ARMOUR: { CollectParameters(&m_nIp, 2); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; - pPlayerInfo->m_nMaxArmour += GET_INTEGER_PARAM(1); + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; + pPlayerInfo->m_nMaxArmour += ScriptParams[1]; pPlayerInfo->m_pPed->m_fArmour = pPlayerInfo->m_nMaxArmour; - CHud::m_ItemToFlash = ITEM_ARMOUR; return 0; } case COMMAND_CREATE_RANDOM_CHAR_AS_DRIVER: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); CPed* pPed = CPopulation::AddPedInCar(pVehicle, true); pPed->CharCreatedBy = MISSION_CHAR; pPed->bRespondsToThreats = false; @@ -1315,16 +1200,16 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) pVehicle->bEngineOn = true; pVehicle->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pVehicle->GetPosition()); CPopulation::ms_nTotalMissionPeds++; - SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(pPed)); + ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); + CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); return 0; } case COMMAND_CREATE_RANDOM_CHAR_AS_PASSENGER: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); CPed* pPed = CPopulation::AddPedInCar(pVehicle, false); pPed->CharCreatedBy = MISSION_CHAR; pPed->bRespondsToThreats = false; @@ -1336,8 +1221,8 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) pPed->SetOrientation(0.0f, 0.0f, 0.0f); CPopulation::ms_nTotalMissionPeds++; pVehicle->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pVehicle->GetPosition()); - if (GET_INTEGER_PARAM(1) >= 0) - pVehicle->AddPassenger(pPed, GET_INTEGER_PARAM(1)); + if (ScriptParams[1] >= 0) + pVehicle->AddPassenger(pPed, ScriptParams[1]); else pVehicle->AddPassenger(pPed); @@ -1345,32 +1230,32 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) pPed->m_pMyVehicle->RegisterReference((CEntity**)&pPed->m_pMyVehicle); pPed->bInVehicle = true; pPed->SetPedState(PED_DRIVING); - SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(pPed)); + ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); + CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); return 0; } case COMMAND_SET_CHAR_IGNORE_THREATS_BEHIND_OBJECTS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bIgnoreThreatsBehindObjects = GET_INTEGER_PARAM(1); + pPed->bIgnoreThreatsBehindObjects = ScriptParams[1]; return 0; } case COMMAND_ENSURE_PLAYER_HAS_DRIVE_BY_WEAPON: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); if (pPed->bInVehicle) { if (pPed->GetWeapon(WEAPONSLOT_SUBMACHINEGUN).m_eWeaponType) { - if (pPed->GetWeapon(WEAPONSLOT_SUBMACHINEGUN).m_nAmmoTotal < GET_INTEGER_PARAM(1)) - pPed->SetAmmo(pPed->GetWeapon(WEAPONSLOT_SUBMACHINEGUN).m_eWeaponType, GET_INTEGER_PARAM(1)); + if (pPed->GetWeapon(WEAPONSLOT_SUBMACHINEGUN).m_nAmmoTotal < ScriptParams[1]) + pPed->SetAmmo(pPed->GetWeapon(WEAPONSLOT_SUBMACHINEGUN).m_eWeaponType, ScriptParams[1]); } else { - pPed->GiveWeapon(WEAPONTYPE_UZI, GET_INTEGER_PARAM(1), true); + pPed->GiveWeapon(WEAPONTYPE_UZI, ScriptParams[1], true); if (pPed->m_storedWeapon == WEAPONTYPE_UNIDENTIFIED) pPed->m_storedWeapon = pPed->GetWeapon()->m_eWeaponType; pPed->SetCurrentWeapon(WEAPONTYPE_UZI); @@ -1381,7 +1266,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_MAKE_HELI_COME_CRASHING_DOWN: { CollectParameters(&m_nIp, 1); - CAutomobile* pHeli = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CAutomobile* pHeli = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pHeli && pHeli->IsCar() && pHeli->IsRealHeli()); pHeli->bHeliDestroyed = true; return 0; @@ -1389,24 +1274,24 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_ADD_EXPLOSION_NO_SOUND: { CollectParameters(&m_nIp, 4); - CExplosion::AddExplosion(nil, nil, (eExplosionType)GET_INTEGER_PARAM(3), GET_VECTOR_PARAM(0), 0, false); + CExplosion::AddExplosion(nil, nil, (eExplosionType)ScriptParams[3], *(CVector*)&ScriptParams[0], 0, false); return 0; } case COMMAND_SET_OBJECT_AREA_VISIBLE: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); script_assert(pObject); - pObject->m_area = GET_INTEGER_PARAM(1); + pObject->m_area = ScriptParams[1]; return 0; } //case COMMAND_WAS_VEHICLE_EVER_POLICE: case COMMAND_SET_CHAR_NEVER_TARGETTED: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bNeverEverTargetThisPed = GET_INTEGER_PARAM(1); + pPed->bNeverEverTargetThisPed = ScriptParams[1]; return 0; } case COMMAND_LOAD_UNCOMPRESSED_ANIM: @@ -1425,7 +1310,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_SET_CHAR_CROUCH_WHEN_THREATENED: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); pPed->bCrouchWhenScared = true; return 0; @@ -1433,7 +1318,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_IS_CHAR_IN_ANY_POLICE_VEHICLE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle && pPed->m_pMyVehicle->IsLawEnforcementVehicle() && @@ -1442,42 +1327,27 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) } case COMMAND_DOES_CHAR_EXIST: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)) != 0); + UpdateCompareFlag(CPools::GetPedPool()->GetAt(ScriptParams[0]) != 0); return 0; - case COMMAND_DOES_VEHICLE_EXIST: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - bool bExist = false; - if (pVehicle) { - int index = GET_INTEGER_PARAM(0) >> 8; -#ifdef FIX_BUGS - bExist = (index >= 0 && index < NUMVEHICLES); // epic fail -#else - bExist = (index > 0 && index < NUMVEHICLES); -#endif - } - UpdateCompareFlag(bExist); - return 0; - } + //case COMMAND_DOES_VEHICLE_EXIST: //case COMMAND_ADD_SHORT_RANGE_BLIP_FOR_CONTACT_POINT: case COMMAND_ADD_SHORT_RANGE_SPRITE_BLIP_FOR_CONTACT_POINT: { CollectParameters(&m_nIp, 4); - CVector pos = GET_VECTOR_PARAM(0); + CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); int id = CRadar::SetShortRangeCoordBlip(BLIP_COORD, pos, 2, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(3)); - SET_INTEGER_PARAM(0, id); + CRadar::SetBlipSprite(id, ScriptParams[3]); + ScriptParams[0] = id; StoreParameters(&m_nIp, 1); return 0; } case COMMAND_IS_CHAR_STUCK: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->m_nWaitState == WAITSTATE_STUCK); return 0; @@ -1485,15 +1355,15 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_SET_ALL_TAXIS_HAVE_NITRO: { CollectParameters(&m_nIp, 1); - CVehicle::bAllTaxisHaveNitro = GET_INTEGER_PARAM(0) != 0; + CVehicle::bAllTaxisHaveNitro = ScriptParams[0] != 0; return 0; } case COMMAND_SET_CHAR_STOP_SHOOT_DONT_SEEK_ENTITY: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - if (GET_INTEGER_PARAM(1)) { + if (ScriptParams[1]) { pPed->bKindaStayInSamePlace = true; pPed->bStopAndShoot = true; } @@ -1507,9 +1377,9 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_FREEZE_CAR_POSITION_AND_DONT_LOAD_COLLISION: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - if (GET_INTEGER_PARAM(1)) { + if (ScriptParams[1]) { pVehicle->bIsFrozen = true; pVehicle->bInfiniteMass = true; if (m_bIsMissionScript) { diff --git a/src/control/Script8.cpp b/src/control/Script8.cpp index 6c7cbe9..56d7ed9 100644 --- a/src/control/Script8.cpp +++ b/src/control/Script8.cpp @@ -4,7 +4,7 @@ #include "ScriptCommands.h" #include "DMAudio.h" -#ifdef MORE_LANGUAGES +#if ((defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT) && defined MORE_LANGUAGES) #include "Frontend.h" #endif #include "GameLogic.h" @@ -12,10 +12,13 @@ #ifdef MISSION_REPLAY #include "GenericGameStorage.h" #endif +#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) +#include "General.h" +#include "maths.h" +#endif #include "Hud.h" #include "Pad.h" #include "PedAttractor.h" -#include "Pickups.h" #include "Population.h" #include "Pools.h" #include "RpAnimBlend.h" @@ -26,20 +29,19 @@ #include "World.h" #include "Zones.h" -// LCS: file done except TODOs (also check commented out strings) - int8 CRunningScript::ProcessCommands1400To1499(int32 command) { switch (command) { case COMMAND_REGISTER_VIGILANTE_LEVEL: CollectParameters(&m_nIp, 1); - CStats::RegisterLevelVigilanteMission(GET_INTEGER_PARAM(0)); + CStats::RegisterLevelVigilanteMission(ScriptParams[0]); return 0; case COMMAND_CLEAR_ALL_CHAR_ANIMS: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - if (pPed && pPed->GetPedState() != PED_DRIVING && pPed->GetPedState() != PED_AIM_GUN) { + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + script_assert(pPed); + if (!pPed->bInVehicle) { pPed->m_pVehicleAnim = nil; pPed->RestartNonPartialAnims(); RpAnimBlendClumpRemoveAllAssociations(pPed->GetClump()); @@ -60,7 +62,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) } case COMMAND_SET_MAXIMUM_NUMBER_OF_CARS_IN_GARAGE: CollectParameters(&m_nIp, 2); - CGarages::SetMaxNumStoredCarsForGarage(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CGarages::SetMaxNumStoredCarsForGarage(ScriptParams[0], ScriptParams[1]); return 0; case COMMAND_WANTED_STARS_ARE_FLASHING: { @@ -70,25 +72,25 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) } case COMMAND_SET_ALLOW_HURRICANES: CollectParameters(&m_nIp, 1); - CStats::NoMoreHurricanes = GET_INTEGER_PARAM(0); + CStats::NoMoreHurricanes = ScriptParams[0]; return 0; case COMMAND_PLAY_ANNOUNCEMENT: { CollectParameters(&m_nIp, 1); - DMAudio.PlayRadioAnnouncement(GET_INTEGER_PARAM(0) + STREAMED_SOUND_NEWS_A); + DMAudio.PlayRadioAnnouncement(ScriptParams[0] + STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED); return 0; } case COMMAND_SET_PLAYER_IS_IN_STADIUM: { CollectParameters(&m_nIp, 1); - CTheScripts::bPlayerIsInTheStatium = GET_INTEGER_PARAM(0); + CTheScripts::bPlayerIsInTheStatium = ScriptParams[0]; return 0; } case COMMAND_GET_BUS_FARES_COLLECTED_BY_PLAYER: { CollectParameters(&m_nIp, 1); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; - SET_INTEGER_PARAM(0, pPlayerInfo->m_pPed->m_nLastBusFareCollected); + 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; @@ -96,11 +98,11 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_SET_CHAR_OBJ_BUY_ICE_CREAM: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); script_assert(pVehicle); - SET_INTEGER_PARAM(0, 0); + 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 if (pEffect) { @@ -109,7 +111,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) if ((pPed->GetPosition() - pos).MagnitudeSqr() < SQR(20.0f)) { if (GetPedAttractorManager()->HasEmptySlot(pEffect) && GetPedAttractorManager()->IsApproachable(pEffect, pVehicle->GetMatrix(), 0, pPed)) { if (GetPedAttractorManager()->RegisterPedWithAttractor(pPed, pEffect, pVehicle->GetMatrix())) - SET_INTEGER_PARAM(0, 1); + ScriptParams[0] = 1; } } } @@ -119,17 +121,16 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) } case COMMAND_DISPLAY_RADAR: CollectParameters(&m_nIp, 1); - CHud::m_HideRadar = GET_INTEGER_PARAM(0) == 0; - // on PS2 two flags are set, on mobile none + CHud::m_HideRadar = ScriptParams[0] == 0; return 0; case COMMAND_REGISTER_BEST_POSITION: CollectParameters(&m_nIp, 2); - CStats::RegisterBestPosition(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); + CStats::RegisterBestPosition(ScriptParams[0], ScriptParams[1]); return 0; case COMMAND_IS_PLAYER_IN_INFO_ZONE: { CollectParameters(&m_nIp, 1); - CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; char key[KEY_LENGTH_IN_SCRIPT]; memset(key, 0, KEY_LENGTH_IN_SCRIPT); CTheScripts::ReadTextLabelFromScript(&m_nIp, key); @@ -142,7 +143,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_CLEAR_CHAR_ICE_CREAM_PURCHASE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); if (pPed->m_attractor) GetPedAttractorManager()->DeRegisterPed(pPed, pPed->m_attractor); @@ -154,7 +155,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_HAS_CHAR_ATTEMPTED_ATTRACTOR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->bHasAlreadyUsedAttractor); return 0; @@ -162,9 +163,9 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_SET_LOAD_COLLISION_FOR_CAR_FLAG: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - if (GET_INTEGER_PARAM(1)) { + if (ScriptParams[1]) { pVehicle->bDontLoadCollision = false; if (m_bMissionFlag) { CWorld::Remove(pVehicle); @@ -185,9 +186,9 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_SET_LOAD_COLLISION_FOR_CHAR_FLAG: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - if (GET_INTEGER_PARAM(1)) { + if (ScriptParams[1]) { pPed->bDontLoadCollision = false; if (m_bMissionFlag) { CWorld::Remove(pPed); @@ -209,31 +210,31 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_ADD_BIG_GUN_FLASH: { CollectParameters(&m_nIp, 6); - CWeapon::AddGunFlashBigGuns(GET_VECTOR_PARAM(0), GET_VECTOR_PARAM(3)); + CWeapon::AddGunFlashBigGuns(*(CVector*)&ScriptParams[0], *(CVector*)&ScriptParams[3]); return 0; } case COMMAND_HAS_CHAR_BOUGHT_ICE_CREAM: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(pPed->bBoughtIceCream); return 0; } case COMMAND_GET_PROGRESS_PERCENTAGE: - SET_FLOAT_PARAM(0, CStats::GetPercentageProgress()); + *(float*)&ScriptParams[0] = CStats::GetPercentageProgress(); StoreParameters(&m_nIp, 1); return 0; case COMMAND_SET_SHORTCUT_PICKUP_POINT: { CollectParameters(&m_nIp, 4); - CGameLogic::AddShortCutPointAfterDeath(GET_VECTOR_PARAM(0), GET_FLOAT_PARAM(3)); + CGameLogic::AddShortCutPointAfterDeath(*(CVector*)&ScriptParams[0], *(float*)&ScriptParams[3]); return 0; } case COMMAND_SET_SHORTCUT_DROPOFF_POINT_FOR_MISSION: { CollectParameters(&m_nIp, 4); - CGameLogic::AddShortCutDropOffPointForMission(GET_VECTOR_PARAM(0), GET_FLOAT_PARAM(3)); + CGameLogic::AddShortCutDropOffPointForMission(*(CVector*)&ScriptParams[0], *(float*)&ScriptParams[3]); return 0; } case COMMAND_GET_RANDOM_ICE_CREAM_CUSTOMER_IN_AREA: @@ -241,10 +242,10 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) CollectParameters(&m_nIp, 7); int ped_handle = -1; CVector pos = FindPlayerCoors(); - float x1 = GET_FLOAT_PARAM(0); - float y1 = GET_FLOAT_PARAM(1); - float x2 = GET_FLOAT_PARAM(2); - float y2 = GET_FLOAT_PARAM(3); + float x1 = *(float*)&ScriptParams[0]; + float y1 = *(float*)&ScriptParams[1]; + float x2 = *(float*)&ScriptParams[2]; + float y2 = *(float*)&ScriptParams[3]; int i = CPools::GetPedPool()->GetSize(); while (--i && ped_handle == -1) { CPed* pPed = CPools::GetPedPool()->GetSlot(i); @@ -266,7 +267,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) continue; if (pPed->m_attractor) continue; - if (!ThisIsAValidRandomPed(pPed->m_nPedType, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6))) + if (!ThisIsAValidRandomPed(pPed->m_nPedType, ScriptParams[4], ScriptParams[5], ScriptParams[6])) continue; if (pPed->bIsLeader || pPed->m_leader) continue; @@ -284,7 +285,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) if (m_bIsMissionScript) CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR); } - SET_INTEGER_PARAM(0, ped_handle); + ScriptParams[0] = ped_handle; StoreParameters(&m_nIp, 1); return 0; } @@ -293,10 +294,10 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) { CollectParameters(&m_nIp, 4); uint32 i = CPools::GetVehiclePool()->GetSize(); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float supX = GET_FLOAT_PARAM(2); - float supY = GET_FLOAT_PARAM(3); + 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) @@ -308,23 +309,22 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) } case COMMAND_SET_GANG_ATTACK_PLAYER_WITH_COPS: CollectParameters(&m_nIp, 2); - CGangs::SetWillAttackPlayerWithCops((ePedType)((int)PEDTYPE_GANG1 + GET_INTEGER_PARAM(0)), !!GET_INTEGER_PARAM(1)); + CGangs::SetWillAttackPlayerWithCops((ePedType)((int)PEDTYPE_GANG1 + ScriptParams[0]), !!ScriptParams[1]); return 0; case COMMAND_SET_CHAR_FRIGHTENED_IN_JACKED_CAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bHeldHostageInCar = GET_INTEGER_PARAM(1); - pPed->b1A4_2 = GET_INTEGER_PARAM(1); + pPed->bHeldHostageInCar = ScriptParams[1]; return 0; } case COMMAND_SET_VEHICLE_TO_FADE_IN: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); script_assert(pVehicle); - CVisibilityPlugins::SetClumpAlpha(pVehicle->GetClump(), GET_INTEGER_PARAM(1)); + CVisibilityPlugins::SetClumpAlpha(pVehicle->GetClump(), ScriptParams[1]); return 0; } case COMMAND_REGISTER_ODDJOB_MISSION_PASSED: @@ -336,7 +336,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_IS_PLAYER_IN_SHORTCUT_TAXI: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle && pPed->m_pMyVehicle == CGameLogic::pShortCutTaxi); return 0; @@ -344,7 +344,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_IS_CHAR_DUCKING: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); UpdateCompareFlag(RpAnimBlendClumpGetAssociation(pPed->GetClump(), ANIM_STD_DUCK_DOWN) != nil); return 0; @@ -352,24 +352,24 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_CREATE_DUST_EFFECT_FOR_CUTSCENE_HELI: { CollectParameters(&m_nIp, 3); - CObject* pHeli = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + CObject* pHeli = CPools::GetObjectPool()->GetAt(ScriptParams[0]); bool found = false; float waterLevel = -1000.0f; CVector pos = pHeli->GetPosition(); - float radius = GET_FLOAT_PARAM(1); + float radius = *(float*)&ScriptParams[1]; float ground = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z, &found); if (!CWaterLevel::GetWaterLevel(pos.x, pos.y, pos.z, &waterLevel, false)) waterLevel = 0.0f; if (waterLevel > ground) ground = waterLevel; - if (GET_INTEGER_PARAM(2) > 8) - SET_INTEGER_PARAM(2, 8); - CVehicle::HeliDustGenerate(pHeli, (pos.z - ground - 1.0f - radius) * 0.3 + radius, ground, GET_INTEGER_PARAM(2)); + if (ScriptParams[2] > 8) + ScriptParams[2] = 8; + CVehicle::HeliDustGenerate(pHeli, (pos.z - ground - 1.0f - radius) * 0.3 + radius, ground, ScriptParams[2]); return 0; } case COMMAND_REGISTER_FIRE_LEVEL: CollectParameters(&m_nIp, 1); - CStats::RegisterLevelFireMission(GET_INTEGER_PARAM(0)); + CStats::RegisterLevelFireMission(ScriptParams[0]); return 0; case COMMAND_IS_AUSTRALIAN_GAME: UpdateCompareFlag(false); // should we make some check? @@ -377,420 +377,237 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_DISARM_CAR_BOMB: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); if (pVehicle->m_bombType != CARBOMB_NONE) { pVehicle->m_bombType = CARBOMB_NONE; pVehicle->m_pBombRigger = nil; } return 0; } +#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT) case COMMAND_IS_JAPANESE_GAME: #ifdef MORE_LANGUAGES - UpdateCompareFlag(FrontEndMenuManager.m_PrefsLanguage == LANGUAGE_JAPANESE); + UpdateCompareFlag(FrontEndMenuManager.m_PrefsLanguage == CMenuManager::LANGUAGE_JAPANESE); #elif (defined GTAVC_JP_PATCH) UpdateCompareFlag(true); #else UpdateCompareFlag(false); #endif return 0; - case COMMAND_1442: - CollectParameters(&m_nIp, 4); - return 0; - //case COMMAND_1443: - case COMMAND_GET_DISTANCE_BETWEEN_2D_POINTS: +#elif (!defined GTA_PS2) + case COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED: { - CollectParameters(&m_nIp, 4); - float X1 = GET_FLOAT_PARAM(0); - float Y1 = GET_FLOAT_PARAM(1); - float X2 = GET_FLOAT_PARAM(2); - float Y2 = GET_FLOAT_PARAM(3); - float fDistance = Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2)); - SET_FLOAT_PARAM(0, fDistance); - StoreParameters(&m_nIp, 1); + script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); + uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp); + CollectParameters(&m_nIp, 1); + //CUserDisplay::OnscnTimer.SetCounterFlashWhenFirstDisplayed(var, ScriptParams[0]); return 0; } - case COMMAND_GET_DISTANCE_BETWEEN_3D_POINTS: - { - CollectParameters(&m_nIp, 6); - float X1 = GET_FLOAT_PARAM(0); - float Y1 = GET_FLOAT_PARAM(1); - float Z1 = GET_FLOAT_PARAM(2); - float X2 = GET_FLOAT_PARAM(3); - float Y2 = GET_FLOAT_PARAM(4); - float Z2 = GET_FLOAT_PARAM(5); - float fDistance = Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2) + (Z1 - Z2) * (Z1 - Z2)); - SET_FLOAT_PARAM(0, fDistance); - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_DOT_PRODUCT_2D: - { - CollectParameters(&m_nIp, 4); - float X1 = GET_FLOAT_PARAM(0); - float Y1 = GET_FLOAT_PARAM(1); - float X2 = GET_FLOAT_PARAM(2); - float Y2 = GET_FLOAT_PARAM(3); - float fDistance = X1 * X2 + Y1 * Y2; - SET_FLOAT_PARAM(0, fDistance); - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_DOT_PRODUCT_3D: - { - CollectParameters(&m_nIp, 6); - float X1 = GET_FLOAT_PARAM(0); - float Y1 = GET_FLOAT_PARAM(1); - float Z1 = GET_FLOAT_PARAM(2); - float X2 = GET_FLOAT_PARAM(3); - float Y2 = GET_FLOAT_PARAM(4); - float Z2 = GET_FLOAT_PARAM(5); - float fDistance = X1 * X2 + Y1 * Y2 + Z1 * Z2; - SET_FLOAT_PARAM(0, fDistance); - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_DEBUG_PRINT_WITH_1_FLOAT: - return 0; - case COMMAND_DEBUG_PRINT_WITH_2_FLOATS: - return 0; - case COMMAND_DEBUG_PRINT_WITH_3_FLOATS: - return 0; - case COMMAND_GET_PAD_BUTTON_STATE: +#endif +#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) + case COMMAND_SHUFFLE_CARD_DECKS: { CollectParameters(&m_nIp, 1); - switch (GET_INTEGER_PARAM(0)) { - case 0: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetOddJobTrigger()); break; - case 1: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetBrake()); break; - case 2: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetSteeringLeftRight()); break; - case 3: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetSteeringUpDown()); break; - case 4: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetCarGunLeftRight()); break; - case 5: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetCarGunUpDown()); break; - case 6: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetPedWalkLeftRight()); break; - case 7: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetPedWalkUpDown()); break; - case 8: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetLookLeft()); break; - case 9: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetLookRight()); break; - case 10: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetLookBehindForCar()); break; - case 11: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetLookBehindForPed()); break; - case 12: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetHorn()); break; - case 13: SET_INTEGER_PARAM(0, CPad::GetPad(0)->HornJustDown()); break; - case 14: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetCarGunFired()); break; - case 15: SET_INTEGER_PARAM(0, CPad::GetPad(0)->CarGunJustDown()); break; - case 16: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetHandBrake()); break; - case 17: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetBrake()); break; - case 18: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetExitVehicle()); break; - case 19: SET_INTEGER_PARAM(0, CPad::GetPad(0)->ExitVehicleJustDown()); break; - case 20: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetWeapon()); break; - case 21: SET_INTEGER_PARAM(0, CPad::GetPad(0)->WeaponJustDown()); break; - case 22: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetAccelerate()); break; - case 23: SET_INTEGER_PARAM(0, CPad::GetPad(0)->CycleCameraModeUpJustDown()); break; - case 24: SET_INTEGER_PARAM(0, CPad::GetPad(0)->CycleWeaponLeftJustDown()); break; - case 25: SET_INTEGER_PARAM(0, CPad::GetPad(0)->CycleWeaponRightJustDown()); break; - case 26: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetTarget()); break; - case 27: SET_INTEGER_PARAM(0, CPad::GetPad(0)->TargetJustDown()); break; - case 28: SET_INTEGER_PARAM(0, CPad::GetPad(0)->JumpJustDown()); break; - case 29: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetSprint()); break; - case 30: SET_INTEGER_PARAM(0, CPad::GetPad(0)->ShiftTargetLeftJustDown()); break; - case 31: SET_INTEGER_PARAM(0, CPad::GetPad(0)->ForceCameraBehindPlayer()); break; - case 32: SET_INTEGER_PARAM(0, CPad::GetPad(0)->SniperZoomIn()); break; - case 33: SET_INTEGER_PARAM(0, CPad::GetPad(0)->SniperZoomOut()); break; - case 34: SET_INTEGER_PARAM(0, CPad::GetPad(0)->SniperModeLookLeftRight()); break; - case 35: SET_INTEGER_PARAM(0, CPad::GetPad(0)->SniperModeLookUpDown()); break; - case 36: SET_INTEGER_PARAM(0, CPad::GetPad(0)->LookAroundLeftRight()); break; - case 37: SET_INTEGER_PARAM(0, CPad::GetPad(0)->LookAroundUpDown()); break; - case 38: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GuiLeft()); break; - case 39: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GuiRight()); break; - case 40: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GuiUp()); break; - case 41: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GuiDown()); break; - case 42: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GuiSelect()); break; - case 43: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GuiBack()); break; - case 44: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetSkipCutscene()); if (GET_INTEGER_PARAM(0)) TheCamera.m_bIgnoreFadingStuffForMusic = false; break; // spectacular hack + script_assert(ScriptParams[0] >= 0 && ScriptParams[0] <= 6); + for (int i = 0; i < CARDS_IN_STACK; i++) + CTheScripts::CardStack[i] = 0; + int16 seq[CARDS_IN_STACK]; + for (int i = 0; i < MAX_DECKS * CARDS_IN_DECK; i++) + seq[i] = i; + int cards_left = CARDS_IN_DECK * ScriptParams[0]; + for (int k = 1; k < CARDS_IN_DECK + 1; k++) { + for (int deck = 0; deck < ScriptParams[0]; deck++) { + int index = CGeneral::GetRandomNumberInRange(0, cards_left); + CTheScripts::CardStack[seq[index]] = k; + for (int l = index; l < cards_left; l++) { + if (l + 1 < CARDS_IN_STACK) + seq[l] = seq[l + 1]; + else + seq[l] = 0; + } + --cards_left; + } } + CTheScripts::CardStackPosition = 0; + return 0; + } + case COMMAND_FETCH_NEXT_CARD: + { + if (CTheScripts::CardStack[CTheScripts::CardStackPosition] == 0) + CTheScripts::CardStackPosition = 0; + ScriptParams[0] = CTheScripts::CardStack[CTheScripts::CardStackPosition++]; + if (CTheScripts::CardStackPosition == CARDS_IN_DECK * MAX_DECKS) + CTheScripts::CardStackPosition = 0; StoreParameters(&m_nIp, 1); return 0; } - case COMMAND_SET_NAVIGATION_ARROW: + case COMMAND_GET_OBJECT_VELOCITY: { - CollectParameters(&m_nIp, 3); - // cNavArrow::SetTarget(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(0)); // TODO, although it's unused - return 0; - } - case COMMAND_CLEAR_NAVIGATION_ARROW: - { - // cNavArrow::ClearTarget(); // TODO, although it's unused - return 0; - } - case COMMAND_CALL: - case COMMAND_CALLNOT: - { - m_anStack[m_nStackPointer++] = m_nIp | BIT(STACKVALUE_IS_FUNCTION_CALL_BIT) | ((command == COMMAND_CALLNOT) ? BIT(STACKVALUE_INVERT_RETURN_BIT) : 0); - uint8 nInputParams = CTheScripts::Read1ByteFromScript(&m_nIp); - uint8 nOutputParameters = CTheScripts::Read1ByteFromScript(&m_nIp); - uint8 nLocalsOffset = CTheScripts::Read1ByteFromScript(&m_nIp); - uint32 nIPBeforeParameters = m_nIp; CollectParameters(&m_nIp, 1); - if (nInputParams) - CollectParameters(&m_nIp, nInputParams, &m_anLocalVariables[m_nLocalsPointer + nLocalsOffset]); - m_nLocalsPointer += nLocalsOffset; - m_anStack[m_nStackPointer - 1] |= (m_nIp - nIPBeforeParameters) << STACKVALUE_IP_PARAMS_OFFSET; - if (GET_INTEGER_PARAM(0) < 0) - m_nIp = CTheScripts::MainScriptSize - GET_INTEGER_PARAM(0); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + *(CVector*)&ScriptParams[0] = GAME_SPEED_TO_METERS_PER_SECOND * pObject->GetMoveSpeed(); + StoreParameters(&m_nIp, 3); + return 0; + } + case COMMAND_IS_DEBUG_CAMERA_ON: + UpdateCompareFlag(TheCamera.WorldViewerBeingUsed); + return 0; + case COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY: + { + CollectParameters(&m_nIp, 4); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CVector newSpeed = pObject->GetTurnSpeed() + *(CVector*)&ScriptParams[1] / GAME_SPEED_TO_METERS_PER_SECOND; + if (pObject->bIsStatic) { + pObject->SetIsStatic(false); + pObject->AddToMovingList(); + } + pObject->SetTurnSpeed(newSpeed.x, newSpeed.y, newSpeed.z); + return 0; + } + case COMMAND_SET_OBJECT_ROTATION_VELOCITY: + { + CollectParameters(&m_nIp, 4); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CVector newSpeed = *(CVector*)&ScriptParams[1] / GAME_SPEED_TO_METERS_PER_SECOND; + if (pObject->bIsStatic) { + pObject->SetIsStatic(false); + pObject->AddToMovingList(); + } + pObject->SetTurnSpeed(newSpeed.x, newSpeed.y, newSpeed.z); + return 0; + } + case COMMAND_IS_OBJECT_STATIC: + { + CollectParameters(&m_nIp, 1); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + UpdateCompareFlag(pObject->GetIsStatic()); + return 0; + } + case COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS: + { + CollectParameters(&m_nIp, 4); + CVector2D v1 = *(CVector2D*)&ScriptParams[0]; + CVector2D v2 = *(CVector2D*)&ScriptParams[2]; + float c = DotProduct2D(v1, v2) / (v1.Magnitude() * v2.Magnitude()); +#ifdef FIX_BUGS // command is a SA leftover where it was fixed to this + *(float*)&ScriptParams[0] = RADTODEG(Acos(c)); +#else + *(float*)&ScriptParams[0] = Acos(c); +#endif + return 0; + } + case COMMAND_DO_2D_RECTANGLES_COLLIDE: + { + CollectParameters(&m_nIp, 8); + float infX1 = *(float*)&ScriptParams[0] - *(float*)&ScriptParams[2] * 0.5; // NB: not float + float supX1 = *(float*)&ScriptParams[0] + *(float*)&ScriptParams[2] * 0.5; + float infX2 = *(float*)&ScriptParams[4] - *(float*)&ScriptParams[6] * 0.5; + float supX2 = *(float*)&ScriptParams[4] + *(float*)&ScriptParams[6] * 0.5; + float infY1 = *(float*)&ScriptParams[1] - *(float*)&ScriptParams[3] * 0.5; + float supY1 = *(float*)&ScriptParams[1] + *(float*)&ScriptParams[3] * 0.5; + float infY2 = *(float*)&ScriptParams[5] - *(float*)&ScriptParams[7] * 0.5; + float supY2 = *(float*)&ScriptParams[5] + *(float*)&ScriptParams[7] * 0.5; + bool collide = true; + if (infY2 > supY1) + collide = false; + if (infY1 > supY2) + collide = false; + if (infX2 > supX1) + collide = false; + if (infX1 > supX2) + collide = false; + UpdateCompareFlag(collide); + return 0; + } + case COMMAND_GET_OBJECT_ROTATION_VELOCITY: + { + CollectParameters(&m_nIp, 1); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + *(CVector*)&ScriptParams[0] = pObject->GetTurnSpeed() * GAME_SPEED_TO_METERS_PER_SECOND; + StoreParameters(&m_nIp, 3); + return 0; + } + case COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY: + { + CollectParameters(&m_nIp, 4); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CVector vecAddition = *(CVector*)&ScriptParams[1] * CTimer::GetTimeStep() / GAME_SPEED_TO_METERS_PER_SECOND; + if (!pObject->bIsStatic) { + CVector vecCurrSpeed = pObject->GetSpeed(); + vecCurrSpeed.Normalise(); + if (vecCurrSpeed.z != 1.0) { // NB: not float! + CVector vx = CrossProduct(vecCurrSpeed, CVector(0.0f, 0.0f, 1.0f)); + vx.Normalise(); + CVector vz = CrossProduct(vx, vecCurrSpeed); + vz.Normalise(); + CVector vecNewSpeed = pObject->GetSpeed() + vecAddition.x * vx + vecAddition.y * vecCurrSpeed + vecAddition.z * vecCurrSpeed; + if (pObject->bIsStatic) { + pObject->SetIsStatic(false); + pObject->AddToMovingList(); + } + pObject->SetMoveSpeed(vecNewSpeed); + } + } + return 0; + } + case COMMAND_GET_OBJECT_SPEED: + { + CollectParameters(&m_nIp, 1); + CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + *(float*)&ScriptParams[0] = pObject->GetMoveSpeed().Magnitude() * GAME_SPEED_TO_METERS_PER_SECOND; + StoreParameters(&m_nIp, 1); + return 0; + } +#endif +#if (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) + case COMMAND_IS_MISSION_SKIP: +#ifdef MISSION_REPLAY + ScriptParams[0] = MissionSkipLevel; +#else + ScriptParams[0] = 0; +#endif + StoreParameters(&m_nIp, 1); + return 0; + case COMMAND_SET_IN_AMMUNATION: + CollectParameters(&m_nIp, 1); +#ifdef MISSION_REPLAY + IsInAmmunation = ScriptParams[0]; +#endif + return 0; + case COMMAND_DO_SAVE_GAME: + CollectParameters(&m_nIp, 1); +#ifdef MISSION_REPLAY + SaveGameForPause(ScriptParams[0]); +#endif + return 0; + case COMMAND_IS_RETRY: +#ifdef MISSION_REPLAY + if (strcmp(m_abScriptName, "porno4") != 0) + ScriptParams[0] = AllowMissionReplay; +#ifdef FIX_BUGS else - m_nIp = GET_INTEGER_PARAM(0); + ScriptParams[0] = gbTryingPorn4Again; +#else + else if (gbTryingPorn4Again) + ScriptParams[0] = 1; +#endif +#else + ScriptParams[0] = 0; +#endif + StoreParameters(&m_nIp, 1); return 0; - } - case COMMAND_IS_CAR_AUTOMOBILE: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - UpdateCompareFlag(pVehicle->GetModelIndex() >= MI_FIRST_VEHICLE && pVehicle->GetModelIndex() < MI_FERRY); - return 0; - } - case COMMAND_IS_CAR_BIKE: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - UpdateCompareFlag(pVehicle->GetModelIndex() >= MI_ANGEL && pVehicle->GetModelIndex() <= MI_SANCHEZ); - return 0; - } - return 0; - case COMMAND_IS_CAR_PLANE: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - UpdateCompareFlag(pVehicle->GetModelIndex() >= MI_AIRTRAIN && pVehicle->GetModelIndex() <= MI_DEADDODO); - return 0; - } - case COMMAND_IS_CAR_HELI: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - UpdateCompareFlag(pVehicle->GetModelIndex() >= MI_ESCAPE && pVehicle->GetModelIndex() <= MI_CHOPPER); - return 0; - } -#ifdef FIX_BUGS - case COMMAND_1476: // they DO have it in script + case COMMAND_DUMMY: return 0; #endif - case COMMAND_RETURN_IF_TRUE: - if (m_bCondResult) { - ReturnFromGosubOrFunction(); - } +#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) + // it is unknown what these commands do but they don't take parameters + case COMMAND_MARK_CUTSCENE_START: return 0; - case COMMAND_RETURN_TRUE_IF_TRUE: - if (m_bCondResult) { - UpdateCompareFlag(false); - ReturnFromGosubOrFunction(); - } + case COMMAND_MARK_CUTSCENE_END: return 0; - case COMMAND_SET_CHAR_ONLY_ALLOWED_TO_SIT_BEHIND: - { - CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pPed); - pPed->bOnlyAllowedToSitBehind = GET_INTEGER_PARAM(1); + case COMMAND_CUTSCENE_SCROLL: return 0; - } - case COMMAND_SET_RC_HELI_HEIGHT_LIMIT: - CollectParameters(&m_nIp, 1); - // CVehicle::rcHeliHeightLimit = GET_FLOAT_PARAM(0); // TODO - return 0; - case COMMAND_CREATE_SCRIPT_CORONA: - { - CollectParameters(&m_nIp, 9); - base::cSList::tSItem* pCorona = new base::cSList::tSItem(); - pCorona->item.x = GET_FLOAT_PARAM(0); - pCorona->item.y = GET_FLOAT_PARAM(1); - pCorona->item.z = GET_FLOAT_PARAM(2); - pCorona->item.id = CTheScripts::NextScriptCoronaID++; - if (pCorona->item.z <= MAP_Z_LOW_LIMIT) - pCorona->item.z = CWorld::FindGroundZForCoord(pCorona->item.x, pCorona->item.y); - pCorona->item.size = GET_FLOAT_PARAM(3); - pCorona->item.r = GET_INTEGER_PARAM(6); - pCorona->item.g = GET_INTEGER_PARAM(7); - pCorona->item.b = GET_INTEGER_PARAM(8); - pCorona->item.type = GET_INTEGER_PARAM(4); - pCorona->item.flareType = GET_INTEGER_PARAM(5); - SET_INTEGER_PARAM(0, pCorona->item.id); - CTheScripts::mCoronas.Insert(pCorona); - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_REMOVE_SCRIPT_CORONA: - { - CollectParameters(&m_nIp, 1); - for (base::cSList::tSItem* i = CTheScripts::mCoronas.first; i; i = i->next) { - if (i->item.id == GET_INTEGER_PARAM(0)) { - CTheScripts::mCoronas.Remove(i); - delete i; - break; - } - } - return 0; - } - case COMMAND_IS_BOAT_IN_WATER: - { - CollectParameters(&m_nIp, 1); - CBoat* pVehicle = (CBoat*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle && pVehicle->IsBoat()); - UpdateCompareFlag(pVehicle->bBoatInWater); - return 0; - } - case COMMAND_IS_CAR_DRIVER_BEING_JACKED: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - UpdateCompareFlag(pVehicle->bIsBeingCarJacked); - return 0; - } - case COMMAND_SET_CHAR_ONLY_ALLOWED_TO_SIT_IN_FRONT: - { - CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pPed); - pPed->bOnlyAllowedToSitInFront = GET_INTEGER_PARAM(1); - return 0; - } - case COMMAND_SET_CAR_TILTED_BY_CHAR: - { - CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); - script_assert(pVehicle); - pVehicle->ApplyTurnForce(0.0f, 0.0f, CGeneral::GetRandomNumberInRange(-0.8f, -1.2f)* pPed->m_fMass, - pPed->GetPosition().x - pVehicle->GetPosition().x, pPed->GetPosition().y - pVehicle->GetPosition().y, 0.0f); - DMAudio.PlayOneShot(pVehicle->m_audioEntityId, SOUND_CAR_JERK, 0.0f); - return 0; - } - case COMMAND_GET_WEAPON_TYPE_FOR_PICKUP_IN_AREA: - { - CollectParameters(&m_nIp, 4); - float X = GET_FLOAT_PARAM(0); - float Y = GET_FLOAT_PARAM(1); - float Z = GET_FLOAT_PARAM(2); - float radius = GET_FLOAT_PARAM(3); - int model = -1; - bool found = false; - for (uint32 i = 0; i < NUMPICKUPS; i++) { - CPickup* pPickup = &CPickups::aPickUps[i]; - if (pPickup->m_eType != PICKUP_NONE) { - CVector fDist = pPickup->m_vecPos - CVector(X, Y, Z); -#ifndef FIX_BUGS // this breaks ALL pickups! - pPickup->m_eModelIndex = 4; #endif - if (fDist.Magnitude() < radius && pPickup->m_pObject) { - found = true; - model = CPickups::WeaponForModel(pPickup->m_pObject->GetModelIndex()); - } - } - } - SET_INTEGER_PARAM(0, model); - StoreParameters(&m_nIp, 1); - } - case COMMAND_IS_PLAYER_USING_FIRST_PERSON_WEAPON_CAMERA: - CollectParameters(&m_nIp, 1); - UpdateCompareFlag(TheCamera.Using1stPersonWeaponMode()); - return 0; - //case COMMAND_1489: - //case COMMAND_1490: - //case COMMAND_1491: - case COMMAND_SET_DEBUG_MENU_ACTIVE: - CollectParameters(&m_nIp, 1); - // this sets two values on PS2, but not on mobile - TODO? - return 0; - case COMMAND_SET_DRAW_HUD: - CollectParameters(&m_nIp, 1); - CHud::m_Wants_To_Draw_Hud = (GET_INTEGER_PARAM(0) != 0); - return 0; - case COMMAND_GET_RANDOM_CHAR_IN_AREA_NO_CHECKS: - { - CollectParameters(&m_nIp, 4); - int ped_handle = -1; - CVector pos = FindPlayerCoors(); - float x1 = GET_FLOAT_PARAM(0); - float y1 = GET_FLOAT_PARAM(1); - float x2 = GET_FLOAT_PARAM(2); - float y2 = GET_FLOAT_PARAM(3); - int i = CPools::GetPedPool()->GetSize(); - while (--i && ped_handle == -1) { - CPed* pPed = CPools::GetPedPool()->GetSlot(i); - if (!pPed) - continue; - if (pPed->bRemoveFromWorld) - continue; - if (pPed->bFadeOut) - continue; - if (pPed->m_nWaitState != WAITSTATE_FALSE) - continue; - if (!pPed->IsWithinArea(x1, y1, x2, y2)) - continue; - if (pos.z - PED_FIND_Z_OFFSET > pPed->GetPosition().z) - continue; - if (pos.z + PED_FIND_Z_OFFSET < pPed->GetPosition().z) - continue; - ped_handle = CPools::GetPedPool()->GetIndex(pPed); - CTheScripts::LastRandomPedId = ped_handle; - pPed->CharCreatedBy = MISSION_CHAR; - pPed->bRespondsToThreats = false; - ++CPopulation::ms_nTotalMissionPeds; - if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR); - } - SET_INTEGER_PARAM(0, ped_handle); - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_GET_RANDOM_CAR_IN_AREA_NO_CHECKS_NO_SAVE: - { - CollectParameters(&m_nIp, 4); - int handle = -1; - uint32 i = CPools::GetVehiclePool()->GetSize(); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float supX = GET_FLOAT_PARAM(2); - float supY = GET_FLOAT_PARAM(3); - while (i-- && handle == -1) { - CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i); - if (!pVehicle) - continue; - if (!pVehicle->IsWithinArea(infX, infY, supX, supY)) - continue; - handle = CPools::GetVehiclePool()->GetIndex(pVehicle); - } - SET_INTEGER_PARAM(0, handle); - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_STORE_CAR_COLLIDED_WITH_NO_SAVE: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - if (!pVehicle) - printf("STORE_CAR_COLLIDED_WITH_NO_SAVE - Car doesn\'t exist\n"); - else { - if (pVehicle->m_pLastDamageEntity == nil) - SET_INTEGER_PARAM(0, -1); - else { - // what they are doing is not very safe as m_pLastDamageEntity doesn't have to be CVehicle -#ifdef FIX_BUGS - if (!pVehicle->m_pLastDamageEntity->IsVehicle()) { - SET_INTEGER_PARAM(0, -1); - } - else -#endif - { - SET_INTEGER_PARAM(0, CPools::GetVehiclePool()->GetIndex((CVehicle*)pVehicle->m_pLastDamageEntity)); - pVehicle->m_pLastDamageEntity = nil; - } - } - } - StoreParameters(&m_nIp, 1); - return 0; - } default: script_assert(0); } diff --git a/src/control/Script9.cpp b/src/control/Script9.cpp deleted file mode 100644 index 42851bb..0000000 --- a/src/control/Script9.cpp +++ /dev/null @@ -1,774 +0,0 @@ -#include "common.h" - -#include "Script.h" -#include "ScriptCommands.h" - -#include "Bridge.h" -#include "CarCtrl.h" -#include "Camera.h" -#include "CutsceneMgr.h" -#include "Garages.h" -#include "GameLogic.h" -#include "Hud.h" -#include "Messages.h" -#include "Object.h" -#include "Pad.h" -#include "Ped.h" -#include "Pools.h" -#include "Remote.h" -#include "SpecialFX.h" -#include "Stats.h" -#include "Vehicle.h" -#include "World.h" - -// LCS: file done except TODOs (also check commented out strings) - -int8 CRunningScript::ProcessCommands1500To1599(int32 command) -{ - switch (command) { - case COMMAND_DISABLE_FERRY_PATH: - { - CollectParameters(&m_nIp, 1); - // CFerry:DissableFerryPath(GET_INTEGER_PARAM(0)); TODO - return 0; - } - case COMMAND_ENABLE_FERRY_PATH: - { - CollectParameters(&m_nIp, 1); - // CFerry::EnableFerryPath(GET_INTEGER_PARAM(0)); - return 0; - } - case COMMAND_GET_CLOSEST_DOCKED_FERRY: - { - CollectParameters(&m_nIp, 2); - // CFerry* pFerry = CFerry::GetClosestFerry(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1)); - int id = -1; - // if (pFerry && pFerry->IsDocked() - // id = pFerry->GetId(); - SET_INTEGER_PARAM(0, id); - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_OPEN_FERRY_DOOR: - { - CollectParameters(&m_nIp, 1); - // CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0)); - // script_assert(pFerry); - // pFerry->OpenDoor(); - return 0; - } - case COMMAND_CLOSE_FERRY_DOOR: - { - CollectParameters(&m_nIp, 1); - // CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0)); - // script_assert(pFerry); - // pFerry->CloseDoor(); - return 0; - } - case COMMAND_IS_FERRY_DOOR_OPEN: - { - CollectParameters(&m_nIp, 1); - // CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0)); - // script_assert(pFerry); - // UpdateCompareFlag(pFerry->IsDoorOpen()); - UpdateCompareFlag(false); - return 0; - } - case COMMAND_IS_FERRY_DOOR_CLOSED: - { - CollectParameters(&m_nIp, 1); - // CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0)); - // script_assert(pFerry); - // UpdateCompareFlag(pFerry->IsDoorClosed()); - UpdateCompareFlag(true); - return 0; - } - case COMMAND_SKIP_FERRY_TO_NEXT_DOCK: - { - CollectParameters(&m_nIp, 1); - // CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0)); - // script_assert(pFerry); - // pFerry->SkipFerryToNextDock(); - return 0; - } - case COMMAND_SET_CHAR_DROPS_WEAPONS_ON_DEATH: - { - CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pPed); - pPed->bDropsWeaponsOnDeath = (GET_INTEGER_PARAM(1) != 0); - return 0; - } - case COMMAND_IS_CHAR_CROUCHING: - { - CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pPed); - UpdateCompareFlag(pPed->bIsDucking); - return 0; - } - case COMMAND_GET_FERRY_BOARDING_SPACE: - { - CollectParameters(&m_nIp, 4); - // CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0)); - // script_assert(pFerry); - // ? = pFerry->GetBoardingSpace((CFerry::eSpaceUse)GET_INTEGER_PARAMS(1), (CFerry::eSpaceStyle)GET_INTEGER_PARAMS(2), GET_INTEGER_PARAMS(3)); - SET_FLOAT_PARAM(0, 0.0f); - SET_FLOAT_PARAM(1, 0.0f); // TODO - StoreParameters(&m_nIp, 2); - return 0; - } - case COMMAND_GET_FERRY_HEADING: - { - CollectParameters(&m_nIp, 1); - // CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0)); - // script_assert(pFerry); - // float fHeading = CGeneral::GetATanOfXY(pFerry->GetForward().x, pFerry->GetForward().y); - // SET_FLOAT_PARAM(0, fHeading); - SET_FLOAT_PARAM(0, 0.0f); - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_SET_FERRIES_ENABLED: - { - CollectParameters(&m_nIp, 1); - // CFerry::SetFerriesEnabled(GET_INTEGER_PARAM(0)); - return 0; - } - case COMMAND_COMPLETE_FERRY_DOOR_MOVEMENT: - { - CollectParameters(&m_nIp, 1); - // CFerry::CompleteDorrMovement(GET_INTEGER_PARAM(0)); - return 0; - } - case COMMAND_OVERRIDE_CAR_REMOTE_CONTROL: - { - CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - pVehicle->SetStatus(STATUS_PLAYER_REMOTE); - CVehicle::bDisableRemoteDetonation = true; - CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle = pVehicle; - pVehicle->RegisterReference((CEntity**)&CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle); - if (pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI || pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE) { - TheCamera.TakeControl(pVehicle, CCam::MODE_CAM_ON_A_STRING, GET_INTEGER_PARAM(1) ? INTERPOLATION : JUMP_CUT, CAMCONTROL_SCRIPT); - TheCamera.SetZoomValueCamStringScript(0); - } - else { - TheCamera.TakeControl(pVehicle, CCam::MODE_1STPERSON, GET_INTEGER_PARAM(1) ? INTERPOLATION : JUMP_CUT, CAMCONTROL_SCRIPT); - script_assert(pVehicle->IsCar()); - //((CAutomobile*)pVehicle)->Damage.m_bSmashedDoorDoesntClose = true; - } - if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CAR); - if (FindPlayerVehicle()) - FindPlayerVehicle()->bCanBeDamaged = false; - return 0; - } - case COMMAND_CANCEL_REMOTE_MODE: - { - if (FindPlayerVehicle()) - FindPlayerVehicle()->bCanBeDamaged = true; - CRemote::TakeRemoteControlledCarFromPlayer(false); - CWorld::Players[CWorld::PlayerInFocus].field_D6 = false; - CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle = nil; - TheCamera.Restore(); - return 0; - } - case COMMAND_REGISTER_CAR_SOLD: - // CStats::CarsSold++; - return 0; - case COMMAND_ADD_MONEY_MADE_WITH_CAR_SALES: - CollectParameters(&m_nIp, 1); - // CStats::MoneyMadeWithCarSales += GET_INTEGER_PARAM(0); - return 0; - case COMMAND_SET_BRIDGE_STATE: - { - CollectParameters(&m_nIp, 1); -#ifdef GTA_BRIDGE - /* - * 0 = locked - * 1 = unlocked - * 2 = operational - */ - switch (GET_INTEGER_PARAM(0)) { - case 0: CBridge::ForceBridgeState(STATE_BRIDGE_LOCKED); break; - case 1: CBridge::ForceBridgeState(STATE_BRIDGE_ALWAYS_UNLOCKED); break; - case 2: - if (CBridge::State == STATE_LIFT_PART_IS_DOWN || CBridge::State == STATE_BRIDGE_ALWAYS_UNLOCKED) - CBridge::ForceBridgeState(STATE_LIFT_PART_ABOUT_TO_MOVE_UP); - else - CBridge::ForceBridgeState(STATE_LIFT_PART_MOVING_DOWN); - break; - default: script_assert(false); - } -#endif - return 0; - } - case COMMAND_SET_OBJECT_TURN_SPEED: - { - CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pObject); - CVector vSpeed = GET_VECTOR_PARAM(1) / GAME_SPEED_TO_METERS_PER_SECOND; - pObject->SetTurnSpeed(vSpeed.x, vSpeed.y, vSpeed.z); - return 0; - } - case COMMAND_SET_OBJECT_MASS: - { - CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pObject); - pObject->m_fMass = GET_FLOAT_PARAM(1); - pObject->m_fTurnMass = GET_FLOAT_PARAM(2); - pObject->m_fAirResistance = GET_FLOAT_PARAM(3); - if (pObject->m_fMass < 99998.0f) { - pObject->bInfiniteMass = false; - pObject->m_phy_flagA08 = false; - pObject->bAffectedByGravity = true; - } - else { - pObject->bInfiniteMass = true; - pObject->m_phy_flagA08 = true; - pObject->bAffectedByGravity = false; - } - return 0; - } - case COMMAND_HAS_CUTSCENE_LOADED: - UpdateCompareFlag(CCutsceneMgr::ms_cutsceneLoadStatus == CUTSCENE_LOADED); - return 0; - case COMMAND_SET_UNIQUE_JUMPS_FOUND: - CollectParameters(&m_nIp, 1); - CStats::NumberOfUniqueJumpsFound = GET_INTEGER_PARAM(0); - return 0; - case COMMAND_SET_HIDDEN_PACKAGES_COLLECTED: - CollectParameters(&m_nIp, 1); - CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages = GET_INTEGER_PARAM(0); - return 0; - case COMMAND_REGISTER_BIKE_SOLD: - // CStats::BikesSold++; - return 0; - case COMMAND_ADD_MONEY_MADE_WITH_BIKE_SALES: - CollectParameters(&m_nIp, 1); - // CStats::MoneyMadeWithBikeSales += GET_INTEGER_PARAM(0); - return 0; - case COMMAND_REGISTER_PACKAGE_SMUGGLED: - // CStats::PackagesSmuggled++; - return 0; - case COMMAND_REGISTER_SMUGGLER_WASTED: - // CStats::SmugglersWasted++; - return 0; - case COMMAND_REGISTER_FASTEST_SMUGGLING_TIME: - CollectParameters(&m_nIp, 1); - // CStats::RegisterFastestSmugglingTime(GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_SET_CHAR_DIVE_FROM_CAR: - { - CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); - script_assert(pPed); - pPed->bRespondsToThreats = true; - pPed->SetEvasiveDive(pVehicle, 1); - return 0; - } - case COMMAND_WRECK_CAR: - { - CollectParameters(&m_nIp, 1); - CAutomobile* pVehicle = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - script_assert(pVehicle->IsCar()); - pVehicle->m_fHealth = 0.0f; - pVehicle->SetStatus(STATUS_WRECKED); - pVehicle->bRenderScorched = true; - pVehicle->Damage.FuckCarCompletely(); - if (pVehicle->GetModelIndex() != MI_RCBANDIT) { - pVehicle->SetBumperDamage(CAR_BUMP_FRONT, VEHBUMPER_FRONT); - pVehicle->SetBumperDamage(CAR_BUMP_REAR, VEHBUMPER_REAR); - pVehicle->SetDoorDamage(CAR_BONNET, DOOR_BONNET); - pVehicle->SetDoorDamage(CAR_BOOT, DOOR_BOOT); - pVehicle->SetDoorDamage(CAR_DOOR_LF, DOOR_FRONT_LEFT); - pVehicle->SetDoorDamage(CAR_DOOR_RF, DOOR_FRONT_RIGHT); - pVehicle->SetDoorDamage(CAR_DOOR_LR, DOOR_REAR_LEFT); - pVehicle->SetDoorDamage(CAR_DOOR_RR, DOOR_REAR_RIGHT); - } - pVehicle->m_bombType = CARBOMB_NONE; - pVehicle->bEngineOn = false; - pVehicle->bLightsOn = false; - pVehicle->m_fHealth = 0.0f; - pVehicle->m_nBombTimer = 0; - pVehicle->m_bSirenOrAlarm = false; - return 0; - } - case COMMAND_ADD_MONEY_MADE_IN_COACH: - CollectParameters(&m_nIp, 1); - // CStats::MoneyMadeInCoach += GET_INTEGER_PARAM(0); - return 0; - case COMMAND_ADD_MONEY_MADE_COLLECTING_TRASH: - CollectParameters(&m_nIp, 1); - // CStats::MoneyMadeCollectingTrash += GET_INTEGER_PARAM(0); - return 0; - case COMMAND_REGISTER_HITMAN_KILLED: - // CStats::HitmenKilled++; - return 0; - case COMMAND_REGISTER_GUARDIAN_ANGEL_MISSION_PASSED: - // CStats::GaurdianAngelMissionsPassed++; - return 0; - case COMMAND_REGISTER_HIGHEST_GUARDIAN_ANGEL_JUSTICE_DISHED: - CollectParameters(&m_nIp, 1); - // CStats::RegisterHighestGaurdianAngelJusticeDished(GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_REGISTER_BEST_BANDIT_LAP_TIME: - CollectParameters(&m_nIp, 2); - // CStats::RegisterBestBanditLapTime(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); - return 0; - case COMMAND_REGISTER_BEST_BANDIT_POSITION: - CollectParameters(&m_nIp, 2); - // CStats::RegisterBestBanditPosition(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); - return 0; - case COMMAND_REGISTER_MOST_TIME_LEFT_TRAIN_RACE: - CollectParameters(&m_nIp, 1); - // CStats::RegisterMostTimeLeftTrainRace(GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_REGISTER_HIGHEST_TRAIN_CASH_EARNED: - CollectParameters(&m_nIp, 1); - // CStats::RegisterHighestTrainCashEarned(GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_REGISTER_FASTEST_HELI_RACE_TIME: - // CStats::RegisterFastestHeliRaceTime(GET_INTEGER_PARAM(0)); - CollectParameters(&m_nIp, 1); - return 0; - case COMMAND_REGISTER_BEST_HELI_RACE_POSITION: - // CStats::RegisterBestHeliRacePosition(GET_INTEGER_PARAM(0)); - CollectParameters(&m_nIp, 1); - return 0; - case COMMAND_REGISTER_OUTFIT_CHANGE: - // CStats::NumberOutfitChanges++; - return 0; - case COMMAND_REGISTER_STREET_RACE_FASTEST_TIME: - // CStats::RegisterStreetRaceFastestTime(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); - CollectParameters(&m_nIp, 2); - return 0; - case COMMAND_REGISTER_STREET_RACE_FASTEST_LAP: - CollectParameters(&m_nIp, 2); - // CStats::RegisterStreetRaceFastestLap(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); - return 0; - case COMMAND_REGISTER_STREET_RACE_BEST_POSITION: - CollectParameters(&m_nIp, 2); - // CStats::RegisterStreetRaceBestPosition(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); - return 0; - case COMMAND_HAS_OBJECT_BEEN_DAMAGED_BY_WEAPON: - { - CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - bool result = false; - if (!pObject) { - printf("HAS_OBJECT_BEEN_DAMAGED_BY_WEAPON - Object doesn\'t exist\n"); - } - else { - if (GET_INTEGER_PARAM(1) == WEAPONTYPE_ANYMELEE || GET_INTEGER_PARAM(1) == WEAPONTYPE_ANYWEAPON) - result = CheckDamagedWeaponType(pObject->m_nLastWeaponToDamage, GET_INTEGER_PARAM(1)); - else - result = GET_INTEGER_PARAM(1) == pObject->m_nLastWeaponToDamage; - } - UpdateCompareFlag(result); - return 0; - } - case COMMAND_CLEAR_OBJECT_LAST_WEAPON_DAMAGE: - { - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - if (!pObject) - printf("CLEAR_OBJECT_LAST_WEAPON_DAMAGE - pObject doesn\'t exist"); - else - pObject->m_nLastWeaponToDamage = -1; - return 0; - } - case COMMAND_SET_CAR_TURN_SPEED: - { - CollectParameters(&m_nIp, 4); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - CVector vSpeed = GET_VECTOR_PARAM(1) / GAME_SPEED_TO_METERS_PER_SECOND; - pVehicle->SetTurnSpeed(vSpeed.x, vSpeed.y, vSpeed.z); - return 0; - } - case COMMAND_SET_CAR_MOVE_SPEED: - { - CollectParameters(&m_nIp, 4); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - CVector vSpeed = GET_VECTOR_PARAM(1) / GAME_SPEED_TO_METERS_PER_SECOND; - pVehicle->SetMoveSpeed(vSpeed); - return 0; - } - case COMMAND_SET_OBJECT_PROOFS: - { - CollectParameters(&m_nIp, 6); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pObject); - pObject->bBulletProof = (GET_INTEGER_PARAM(1) != 0); - pObject->bFireProof = (GET_INTEGER_PARAM(2) != 0); - pObject->bExplosionProof = (GET_INTEGER_PARAM(3) != 0); - pObject->bCollisionProof = (GET_INTEGER_PARAM(4) != 0); - pObject->bMeleeProof = (GET_INTEGER_PARAM(5) != 0); - return 0; - } - case COMMAND_GET_CAMERA_PED_ZOOM_INDICATOR: - if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FOLLOWPED) - SET_INTEGER_PARAM(0, TheCamera.PedZoomIndicator); - else - SET_INTEGER_PARAM(0, -1); - StoreParameters(&m_nIp, 1); - return 0; - case COMMAND_SET_CAMERA_PED_ZOOM_INDICATOR: - CollectParameters(&m_nIp, 1); - if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FOLLOWPED) - TheCamera.PedZoomIndicator = GET_INTEGER_PARAM(0); - return 0; - case COMMAND_GET_CAR_ORIENTATION: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - SET_FLOAT_PARAM(1, LimitAngleOnCircle(RADTODEG(Asin(pVehicle->GetForward().z)))); - SET_FLOAT_PARAM(2, LimitAngleOnCircle(RADTODEG(Atan2(-pVehicle->GetForward().x, pVehicle->GetForward().y)))); - SET_FLOAT_PARAM(0, LimitAngleOnCircle(RADTODEG(Atan2(-pVehicle->GetRight().z, pVehicle->GetUp().z)))); - StoreParameters(&m_nIp, 3); - return 0; - } - case COMMAND_SET_CAR_ORIENTATION: - { - CollectParameters(&m_nIp, 4); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - pVehicle->SetOrientation(DEGTORAD(GET_FLOAT_PARAM(2)), DEGTORAD(GET_FLOAT_PARAM(1)), DEGTORAD(GET_FLOAT_PARAM(3))); - return 0; - } - case COMMAND_IS_DEBUG_MENU_ON: - // on PS2 it's something actual - TODO - UpdateCompareFlag(false); - return 0; - case COMMAND_OPEN_VAN_BACK_DOORS: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - assert(pVehicle); - pVehicle->ProcessOpenDoor(CAR_DOOR_RR, ANIM_STD_VAN_OPEN_DOOR_REAR_RHS, 1.0f); - pVehicle->ProcessOpenDoor(CAR_DOOR_LR, ANIM_STD_VAN_OPEN_DOOR_REAR_LHS, 1.0f); - return 0; - } - case COMMAND_GET_CHAR_THREAT_CHAR: - { - CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pPed); - SET_INTEGER_PARAM(0, 0); - CEntity* pThreat = pPed->m_threatEntity; - if (pThreat && pThreat->IsPed()) - SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex((CPed*)pThreat)); - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_FREEZE_PED_ZOOM_SWITCH: - CollectParameters(&m_nIp, 1); - TheCamera.m_bFreezePedZoomSwitch = GET_INTEGER_PARAM(0); - return 0; - case COMMAND_SET_OBJECT_RENDERED_DAMAGED: - { - CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pObject); - pObject->bRenderDamaged = true; - return 0; - } - case COMMAND_GET_RANDOM_CAR_IN_AREA_NO_SAVE: - { - CollectParameters(&m_nIp, 5); - int handle = -1; - uint32 i = CPools::GetVehiclePool()->GetSize(); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float supX = GET_FLOAT_PARAM(2); - float supY = GET_FLOAT_PARAM(3); - while (i-- && handle == -1) { - CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i); - if (!pVehicle) - continue; - if (pVehicle->GetVehicleAppearance() != VEHICLE_APPEARANCE_CAR && pVehicle->GetVehicleAppearance() != VEHICLE_APPEARANCE_BIKE) - continue; -#ifdef FIX_BUGS - if (pVehicle->m_fHealth <= 0.0f) -#else - if (pVehicle->m_fHealth == 0.0f) -#endif - continue; - if (pVehicle->GetModelIndex() != GET_INTEGER_PARAM(4) && GET_INTEGER_PARAM(4) >= 0) - continue; - if (pVehicle->VehicleCreatedBy != RANDOM_VEHICLE) - continue; - if (!pVehicle->IsWithinArea(infX, infY, supX, supY)) - continue; - handle = CPools::GetVehiclePool()->GetIndex(pVehicle); - } - SET_INTEGER_PARAM(0, handle); - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_IS_PLAYER_MADE_SAFE: - { - UpdateCompareFlag(CPad::GetPad(0)->IsPlayerControlsDisabledBy(PLAYERCONTROL_PLAYERINFO)); - return 0; - } - case COMMAND_PRINT_IF_FREE: - { - wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CollectParameters(&m_nIp, 2); - //CMessages::AddMessageIfFree(text, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); TODO - return 0; - } - case COMMAND_IS_E3_BUILD: - UpdateCompareFlag(false); - return 0; - case COMMAND_DECLARE_FORT_STAUNTON_DESTROYED_FLAG: - CTheScripts::FSDestroyedFlag = (uint8*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - CTheScripts::ScriptSpace; - return 0; - case COMMAND_CLEAR_BIG_MESSAGES: - //CMessages::ClearBigMessagesOnly(); TODO - //CHud::ClearBigMessagesExcept(2, 2); TODO - CGarages::MessageEndTime = CGarages::MessageStartTime; - return 0; - case COMMAND_CLEAR_AREA_OF_OBJECTS: - { - CollectParameters(&m_nIp, 6); - uint32 i = CPools::GetObjectPool()->GetSize(); - float infX = GET_FLOAT_PARAM(0); - float infY = GET_FLOAT_PARAM(1); - float infZ = GET_FLOAT_PARAM(2); - float supX = GET_FLOAT_PARAM(3); - float supY = GET_FLOAT_PARAM(4); - float supZ = GET_FLOAT_PARAM(5); - while (i--) { - CObject* pObject = CPools::GetObjectPool()->GetSlot(i); - if (pObject && pObject->CanBeDeleted() && pObject->IsWithinArea(infX, infY, infZ, supX, supY, supZ)) { - pObject->DeleteRwObject(); - CWorld::Remove(pObject); - delete pObject; - } - } - i = CPools::GetDummyPool()->GetSize(); - while (i--) { - CDummy* pDummy = CPools::GetDummyPool()->GetSlot(i); - if (pDummy && pDummy->IsObject() && pDummy->IsWithinArea(infX, infY, infZ, supX, supY, supZ)) { - pDummy->DeleteRwObject(); - CWorld::Remove(pDummy); - delete pDummy; - } - } - return 0; - } - case COMMAND_LOAD_NON_STANDARD_PED_ANIM: - CollectParameters(&m_nIp, 1); - // CPed::LoadNonStandardPedAnim(GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_UNLOAD_NON_STANDARD_PED_ANIM: - CollectParameters(&m_nIp, 1); - // CPed::UnloadNonStandardPedAnim(SET_INTEGER_PARAM(0)); - return 0; - case COMMAND_1566: - CollectParameters(&m_nIp, 1); - return 0; - case COMMAND_BUILD_WORLD_GEOMETRY: - CollectParameters(&m_nIp, 1); - if (/*gBuildWorldGeom*/ false) { - //base::cWorldGeom::GetInstance()->Build(GET_INTEGER_PARAM(0)); - UpdateCompareFlag(true); - } - else { - UpdateCompareFlag(false); - } - return 0; - case COMMAND_STORE_BUILDING_SWAP: - CollectParameters(&m_nIp, 4); - // base::cWorldGeom::GetInstance()->StoreBuildingSwap(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3) != 0); - return 0; - case COMMAND_IS_MULTIPLAYER_ACTIVE: - UpdateCompareFlag(false); // TODO? - return 0; - case COMMAND_GET_MULTIPLAYER_MODE: - SET_INTEGER_PARAM(0, 0); // TODO - StoreParameters(&m_nIp, 1); - return 0; - case COMMAND_MULTIPLAYER_SCRIPT_DONE: - //gbStartingScriptsFromLua = false; TODO? - return 0; - case COMMAND_IS_MULTIPLAYER_SERVER: - UpdateCompareFlag(false); // TODO? - return 0; - case COMMAND_IS_MULTIPLAYER_TEAM_GAME: - UpdateCompareFlag(false); // TODO? - return 0; - case COMMAND_GET_MULTIPLAYER_TEAM_ID: - SET_INTEGER_PARAM(0, 0); // TODO - StoreParameters(&m_nIp, 1); - return 0; - case COMMAND_DOES_SHORTCUT_TAXI_EXIST: - UpdateCompareFlag(CGameLogic::pShortCutTaxi != nil); - return 0; - case COMMAND_SET_ONSCREEN_TIMER_COLOUR: - CollectParameters(&m_nIp, 4); - // gbColour = CRGBA(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3)); - return 0; - case COMMAND_SET_ONSCREEN_TIMER_BACKGROUND_COLOUR: - CollectParameters(&m_nIp, 4); - // gbColour2 = CRGBA(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3)); - return 0; - case COMMAND_REMOVE_CAR_BOOT: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - script_assert(pVehicle->IsCar()); - CAutomobile* pAutomobile = (CAutomobile*)pVehicle; - pAutomobile->Damage.SetDoorStatus(DOOR_BOOT, DOOR_STATUS_MISSING); - pAutomobile->SetDoorDamage(CAR_BOOT, DOOR_BOOT, true); - return 0; - } - case COMMAND_ADD_POINT_3D_MARKER: - { - uint32 ip = m_nIp; - uint32 id = (uint32)(uintptr)GetPointerToScriptVariable(&ip, 0); - static CVector vPreviousLocation; - CollectParameters(&m_nIp, 7); - CVector pos = GET_VECTOR_PARAM(0); - if (pos.z <= MAP_Z_LOW_LIMIT) - pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - if (vPreviousLocation != pos) { - //C3dMarkers::CopyMarker(id, id - 1, 1, 1); - } - // TODO: 5 is not a valid type - //C3dMarkers::PlaceMarker(id, 5, pos, GET_FLOAT_PARAM(3) * 0.7f, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), 255, 128, 0.0f, 1); // TODO: 0, 100.0f, 1, 0 - vPreviousLocation = pos; - return 0; - } - case COMMAND_GET_VECTOR_FROM_MULTIPLAYER: - SET_VECTOR_PARAM(0, gVectorSetInLua); - StoreParameters(&m_nIp, 3); - return 0; - case COMMAND_PRINT_HELP_ALWAYS: - { - // CHud::mAlwaysAllowHelpText = true; // TODO - wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CHud::SetHelpMessage(text, false); // + false, true - return 0; - } - case COMMAND_PRINT_HELP_FOREVER_ALWAYS: - { - // CHud::mAlwaysAllowHelpText = true; // TODO - wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - CHud::SetHelpMessage(text, false, true); // + true - return 0; - } - case COMMAND_SWITCH_FERRY_COLLISION: - CollectParameters(&m_nIp, 1); - // CFerry::SwitchFerryCollision(GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_SET_CHAR_MAX_HEALTH: - { - CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pPed); - pPed->m_fHealth = GET_INTEGER_PARAM(1); - pPed->m_fMaxHealth = GET_INTEGER_PARAM(1); - return 0; - } - case COMMAND_SET_CHAR_SHOOT_TIMER: - { - CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pPed); - pPed->m_nScriptShootTimer = GET_INTEGER_PARAM(1); - return 0; - } - case COMMAND_SET_CHAR_ATTACK_TIMER: - { - CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pPed); - pPed->m_nScriptAttackTimer = GET_INTEGER_PARAM(1); - return 0; - } - case COMMAND_SET_HELI_ROTOR_BLADES_FULLSPEED: - { - CollectParameters(&m_nIp, 1); - CAutomobile* pHeli = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pHeli); - if (pHeli->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) - pHeli->m_aWheelSpeed[1] = 0.22f; - return 0; - } - case COMMAND_SET_CRUSHER_REWARD_MULTIPLIER: - { - CollectParameters(&m_nIp, 1); - // CGarages::CrusherRewardMultiplier = GET_INTEGER_PARAM(0); - return 0; - } - case COMMAND_SWAP_BUILDINGS: - { - CollectParameters(&m_nIp, 2); - // base::cWorldStream::Instance()->SwapBuilding(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); - return 0; - } - case COMMAND_STREAM_BUILDING_SWAPS: - { - // UpdateCompareFlag(base::cWorldStream::Instance()->StreamBuildingSwaps()); - UpdateCompareFlag(true); - return 0; - } - case COMMAND_IS_WORLD_STREAMING_COMPLETE: - { - // UpdateCompareFlag(base::cWorldStream::Instance()->IsStreamingComplet()); - UpdateCompareFlag(true); - return 0; - } - case COMMAND_SWAP_TO_STREAMED_SECTOR: - { - // base::cWorldStream::Instance()->SwapToStreamedSector(); - return 0; - } - case COMMAND_SET_CHAR_ATTACKS_PLAYER_WITH_COPS: - { - CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pPed); - pPed->bAttacksPlayerWithCops = (GET_INTEGER_PARAM(1) != 0); - return 0; - } - case COMMAND_REGISTER_FACE_PLANT_DISTANCE: - CollectParameters(&m_nIp, 1); - //CStats::LongestFacePlantDist = Max(CStats::LongestFacePlantDist, GET_FLOAT_PARAM(0)); - return 0; - case COMMAND_REGISTER_MAX_SECONDS_ON_CARNAGE_LEFT: - CollectParameters(&m_nIp, 1); - //CStats::MaxSecondsOnCarnageLeft = Max(CStats::MaxSecondsOnCarnageLeft, GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_REGISTER_MAX_KILLS_ON_RC_TRIAD: - CollectParameters(&m_nIp, 1); - //CStats::MaxKillsOnRcTriad = Max(CStats::MaxKillsOnRcTriad, GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_REGISTER_HIGHEST_LEVEL_SLASH_TV: - CollectParameters(&m_nIp, 1); - //CStats::HighestLevelSlashTv = Max(CStats::HighestLevelSlashTv, GET_INTEGER_PARAM(0)); - return 0; - case COMMAND_ADD_MONEY_MADE_WITH_SLASH_TV: - CollectParameters(&m_nIp, 1); - //CStats::MoneyMadeWithSlashTv += GET_INTEGER_PARAM(0); - return 0; - case COMMAND_ADD_TOTAL_KILLS_ON_SLASH_TV: - CollectParameters(&m_nIp, 1); - //CStats::TotalKillsOnSlashTV += GET_INTEGER_PARAM(0); - return 0; - default: - script_assert(0); - } - return -1; -} \ No newline at end of file diff --git a/src/control/ScriptCommands.h b/src/control/ScriptCommands.h index 000f561..9863e85 100644 --- a/src/control/ScriptCommands.h +++ b/src/control/ScriptCommands.h @@ -215,11 +215,6 @@ enum { COMMAND_WHILE, COMMAND_WHILENOT, COMMAND_ENDWHILE, - COMMAND_214, - COMMAND_215, - COMMAND_216, - COMMAND_217, - COMMAND_218, COMMAND_ANDOR, COMMAND_LAUNCH_MISSION, COMMAND_MISSION_HAS_FINISHED, @@ -1442,222 +1437,39 @@ enum { COMMAND_REGISTER_FIRE_LEVEL, COMMAND_IS_AUSTRALIAN_GAME, COMMAND_DISARM_CAR_BOMB, +#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT) COMMAND_IS_JAPANESE_GAME, - COMMAND_1442, - COMMAND_1443, - COMMAND_GET_DISTANCE_BETWEEN_2D_POINTS, - COMMAND_GET_DISTANCE_BETWEEN_3D_POINTS, - COMMAND_DOT_PRODUCT_2D, - COMMAND_DOT_PRODUCT_3D, - COMMAND_DEBUG_PRINT_WITH_1_FLOAT, - COMMAND_DEBUG_PRINT_WITH_2_FLOATS, - COMMAND_DEBUG_PRINT_WITH_3_FLOATS, - COMMAND_GET_PAD_BUTTON_STATE, - COMMAND_SET_NAVIGATION_ARROW, - COMMAND_CLEAR_NAVIGATION_ARROW, - COMMAND_CALL, - COMMAND_CALLNOT, - COMMAND_IS_CAR_AUTOMOBILE, - COMMAND_IS_CAR_BIKE, - COMMAND_IS_CAR_PLANE, - COMMAND_IS_CAR_HELI, - COMMAND_1460, - COMMAND_1461, - COMMAND_1462, - COMMAND_1463, - COMMAND_1464, - COMMAND_1465, - COMMAND_1466, - COMMAND_1467, - COMMAND_1468, - COMMAND_1469, - COMMAND_1470, - COMMAND_1471, - COMMAND_1472, - COMMAND_1473, - COMMAND_1474, - COMMAND_1475, - COMMAND_1476, - COMMAND_RETURN_IF_TRUE, - COMMAND_RETURN_TRUE_IF_TRUE, - COMMAND_SET_CHAR_ONLY_ALLOWED_TO_SIT_BEHIND, - COMMAND_SET_RC_HELI_HEIGHT_LIMIT, - COMMAND_CREATE_SCRIPT_CORONA, - COMMAND_REMOVE_SCRIPT_CORONA, - COMMAND_IS_BOAT_IN_WATER, - COMMAND_IS_CAR_DRIVER_BEING_JACKED, - COMMAND_SET_CHAR_ONLY_ALLOWED_TO_SIT_IN_FRONT, - COMMAND_SET_CAR_TILTED_BY_CHAR, - COMMAND_GET_WEAPON_TYPE_FOR_PICKUP_IN_AREA, - COMMAND_IS_PLAYER_USING_FIRST_PERSON_WEAPON_CAMERA, - COMMAND_1489, - COMMAND_1490, - COMMAND_1491, - COMMAND_SET_DEBUG_MENU_ACTIVE, - COMMAND_SET_DRAW_HUD, - COMMAND_GET_RANDOM_CHAR_IN_AREA_NO_CHECKS, - COMMAND_GET_RANDOM_CAR_IN_AREA_NO_CHECKS_NO_SAVE, - COMMAND_STORE_CAR_COLLIDED_WITH_NO_SAVE, - COMMAND_DISABLE_FERRY_PATH, - COMMAND_ENABLE_FERRY_PATH, - COMMAND_GET_CLOSEST_DOCKED_FERRY, - COMMAND_OPEN_FERRY_DOOR, - COMMAND_CLOSE_FERRY_DOOR, - COMMAND_IS_FERRY_DOOR_OPEN, - COMMAND_IS_FERRY_DOOR_CLOSED, - COMMAND_SKIP_FERRY_TO_NEXT_DOCK, - COMMAND_SET_CHAR_DROPS_WEAPONS_ON_DEATH, - COMMAND_IS_CHAR_CROUCHING, - COMMAND_GET_FERRY_BOARDING_SPACE, - COMMAND_GET_FERRY_HEADING, - COMMAND_SET_FERRIES_ENABLED, - COMMAND_COMPLETE_FERRY_DOOR_MOVEMENT, - COMMAND_OVERRIDE_CAR_REMOTE_CONTROL, - COMMAND_CANCEL_REMOTE_MODE, - COMMAND_REGISTER_CAR_SOLD, - COMMAND_ADD_MONEY_MADE_WITH_CAR_SALES, - COMMAND_SET_BRIDGE_STATE, - COMMAND_SET_OBJECT_TURN_SPEED, - COMMAND_SET_OBJECT_MASS, - COMMAND_HAS_CUTSCENE_LOADED, - COMMAND_SET_UNIQUE_JUMPS_FOUND, - COMMAND_SET_HIDDEN_PACKAGES_COLLECTED, - COMMAND_REGISTER_BIKE_SOLD, - COMMAND_ADD_MONEY_MADE_WITH_BIKE_SALES, - COMMAND_REGISTER_PACKAGE_SMUGGLED, - COMMAND_REGISTER_SMUGGLER_WASTED, - COMMAND_REGISTER_FASTEST_SMUGGLING_TIME, - COMMAND_SET_CHAR_DIVE_FROM_CAR, - COMMAND_WRECK_CAR, - COMMAND_ADD_MONEY_MADE_IN_COACH, - COMMAND_ADD_MONEY_MADE_COLLECTING_TRASH, - COMMAND_REGISTER_HITMAN_KILLED, - COMMAND_REGISTER_GUARDIAN_ANGEL_MISSION_PASSED, - COMMAND_REGISTER_HIGHEST_GUARDIAN_ANGEL_JUSTICE_DISHED, - COMMAND_REGISTER_BEST_BANDIT_LAP_TIME, - COMMAND_REGISTER_BEST_BANDIT_POSITION, - COMMAND_REGISTER_MOST_TIME_LEFT_TRAIN_RACE, - COMMAND_REGISTER_HIGHEST_TRAIN_CASH_EARNED, - COMMAND_REGISTER_FASTEST_HELI_RACE_TIME, - COMMAND_REGISTER_BEST_HELI_RACE_POSITION, - COMMAND_REGISTER_OUTFIT_CHANGE, - COMMAND_REGISTER_STREET_RACE_FASTEST_TIME, - COMMAND_REGISTER_STREET_RACE_FASTEST_LAP, - COMMAND_REGISTER_STREET_RACE_BEST_POSITION, - COMMAND_HAS_OBJECT_BEEN_DAMAGED_BY_WEAPON, - COMMAND_CLEAR_OBJECT_LAST_WEAPON_DAMAGE, - COMMAND_SET_CAR_TURN_SPEED, - COMMAND_SET_CAR_MOVE_SPEED, - COMMAND_SET_OBJECT_PROOFS, - COMMAND_GET_CAMERA_PED_ZOOM_INDICATOR, - COMMAND_SET_CAMERA_PED_ZOOM_INDICATOR, - COMMAND_GET_CAR_ORIENTATION, - COMMAND_SET_CAR_ORIENTATION, - COMMAND_IS_DEBUG_MENU_ON, - COMMAND_OPEN_VAN_BACK_DOORS, - COMMAND_GET_CHAR_THREAT_CHAR, - COMMAND_FREEZE_PED_ZOOM_SWITCH, - COMMAND_SET_OBJECT_RENDERED_DAMAGED, - COMMAND_GET_RANDOM_CAR_IN_AREA_NO_SAVE, - COMMAND_IS_PLAYER_MADE_SAFE, - COMMAND_PRINT_IF_FREE, - COMMAND_IS_E3_BUILD, - COMMAND_DECLARE_FORT_STAUNTON_DESTROYED_FLAG, - COMMAND_CLEAR_BIG_MESSAGES, - COMMAND_CLEAR_AREA_OF_OBJECTS, - COMMAND_LOAD_NON_STANDARD_PED_ANIM, - COMMAND_UNLOAD_NON_STANDARD_PED_ANIM, - COMMAND_1566, - COMMAND_BUILD_WORLD_GEOMETRY, - COMMAND_STORE_BUILDING_SWAP, - COMMAND_IS_MULTIPLAYER_ACTIVE, - COMMAND_GET_MULTIPLAYER_MODE, - COMMAND_MULTIPLAYER_SCRIPT_DONE, - COMMAND_IS_MULTIPLAYER_SERVER, - COMMAND_IS_MULTIPLAYER_TEAM_GAME, - COMMAND_GET_MULTIPLAYER_TEAM_ID, - COMMAND_DOES_SHORTCUT_TAXI_EXIST, - COMMAND_SET_ONSCREEN_TIMER_COLOUR, - COMMAND_SET_ONSCREEN_TIMER_BACKGROUND_COLOUR, - COMMAND_REMOVE_CAR_BOOT, - COMMAND_ADD_POINT_3D_MARKER, - COMMAND_GET_VECTOR_FROM_MULTIPLAYER, - COMMAND_PRINT_HELP_ALWAYS, - COMMAND_PRINT_HELP_FOREVER_ALWAYS, - COMMAND_SWITCH_FERRY_COLLISION, - COMMAND_SET_CHAR_MAX_HEALTH, - COMMAND_SET_CHAR_SHOOT_TIMER, - COMMAND_SET_CHAR_ATTACK_TIMER, - COMMAND_SET_HELI_ROTOR_BLADES_FULLSPEED, - COMMAND_SET_CRUSHER_REWARD_MULTIPLIER, - COMMAND_SWAP_BUILDINGS, - COMMAND_STREAM_BUILDING_SWAPS, - COMMAND_IS_WORLD_STREAMING_COMPLETE, - COMMAND_SWAP_TO_STREAMED_SECTOR, - COMMAND_SET_CHAR_ATTACKS_PLAYER_WITH_COPS, - COMMAND_REGISTER_FACE_PLANT_DISTANCE, - COMMAND_REGISTER_MAX_SECONDS_ON_CARNAGE_LEFT, - COMMAND_REGISTER_MAX_KILLS_ON_RC_TRIAD, - COMMAND_REGISTER_HIGHEST_LEVEL_SLASH_TV, - COMMAND_ADD_MONEY_MADE_WITH_SLASH_TV, - COMMAND_ADD_TOTAL_KILLS_ON_SLASH_TV, - COMMAND_ADD_NOODLES_DELIVERED, - COMMAND_REGISTER_SCRAPYARD_CHALLENGE_SCORE, - COMMAND_REGISTER_9MM_MAYHEM_SCORE, - COMMAND_REGISTER_SCOOTER_SHOOTER_SCORE, - COMMAND_ADD_MONEY_MADE_FROM_TOURIST, - COMMAND_ADD_TOURISTS_TAKEN_TO_SPOTS, - COMMAND_ADD_EXPORTED_CARS, - COMMAND_SET_TOTAL_EXPORT_CARS, - COMMAND_REGISTER_DIRT_BIKE_FASTEST_LAP, - COMMAND_REGISTER_DIRT_BIKE_FASTEST_TIME, - COMMAND_REGISTER_DIRT_BIKE_AIR_TIME, - COMMAND_ADD_ARROW_3D_MARKER, - COMMAND_PRINT_NOW_OVERRIDE_FADE, - COMMAND_GET_PICKUP_VALUE, - COMMAND_SET_PICKUP_VALUE, - COMMAND_IS_DEVELOPER, - COMMAND_SET_DEVELOPER_FLAG, - COMMAND_REGISTER_WICHITA_WIPEOUT_SCORE, - COMMAND_ATTACH_OBJECT_TO_CAR, - COMMAND_DETACH_OBJECT_FROM_CAR, - COMMAND_SET_PAD_STICKS_MULTIPLIER, - COMMAND_PRINT_SUBTITLE_NOW, - COMMAND_PRINT_SUBTITLE_NOW_OVERRIDE_FADE, - COMMAND_PRINT_SUBTITLE_NOW_NO_BRIEF, - COMMAND_PRINT_WITH_NUMBER_NOW_NO_BRIEF, - COMMAND_GET_ANGLE_BETWEEN_POINTS, - COMMAND_OVERRIDE_CHAR_MOVE_ANIM, - COMMAND_1627, - COMMAND_ENABLE_EMERGENCY_VEHICLES, - COMMAND_ADD_UNLOCKED_COSTUME, - COMMAND_CLEAR_MULTIPLAYER_SPLASH_SCREEN, - COMMAND_PRINT_WITH_2_NUMBERS_NOW_NO_BRIEF, - COMMAND_GET_OBJECT_ORIENTATION, - COMMAND_SET_OBJECT_ORIENTATION, - COMMAND_CHANGE_ONSCREEN_COUNTER_PREFIX, - COMMAND_STORE_PLAYER_OUTFIT, - COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_NUMBER_AND_STRING, - COMMAND_SET_PLAYER_CURRENT_WEAPON_AMMO_IN_CLIP, - COMMAND_SET_CHAR_WAIT_STATE_REPEAT, - COMMAND_REGISTER_BEST_TIME_GOGO_FAGGIO, - COMMAND_LOCK_GARAGE, - COMMAND_IS_FINAL_GAME, - COMMAND_SET_ALLOWED_COLLISION, - COMMAND_REGISTER_GUARDIAN_ANGEL_LEVEL, - COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_NUMBER_AND_2_STRINGS, - COMMAND_GET_PLAYER_STORED_WEAPON, - COMMAND_DISABLE_PAUSE_MENU, - COMMAND_IS_CHANNEL_PLAYING, - COMMAND_SET_CLOCK_EVENT_WARNING, - COMMAND_SET_EXTRA_COLOUR_LIGHT_DIRECTION, - COMMAND_SET_CHAR_CAN_BE_TARGETTED_BY_LEADER, - COMMAND_PRINT_HELP_NO_BRIEF, - COMMAND_PRINT_HELP_FOREVER_NO_BRIEF, - COMMAND_PRINT_HELP_ALWAYS_NO_BRIEF, - COMMAND_PRINT_HELP_FOREVER_ALWAYS_NO_BRIEF, - COMMAND_SET_CAR_IS_REWARD, - COMMAND_FREEZE_ALL_PLAYER_FOLLOWERS, +#elif (!defined GTA_PS2) + COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED, +#endif +#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) + COMMAND_SHUFFLE_CARD_DECKS, + COMMAND_FETCH_NEXT_CARD, + COMMAND_GET_OBJECT_VELOCITY, + COMMAND_IS_DEBUG_CAMERA_ON, + COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY, + COMMAND_SET_OBJECT_ROTATION_VELOCITY, + COMMAND_IS_OBJECT_STATIC, + COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS, + COMMAND_DO_2D_RECTANGLES_COLLIDE, + COMMAND_GET_OBJECT_ROTATION_VELOCITY, + COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY, + COMMAND_GET_OBJECT_SPEED, +#endif +#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT) + COMMAND_MARK_CUTSCENE_START, + COMMAND_MARK_CUTSCENE_END, + COMMAND_CUTSCENE_SCROLL, +#elif (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) + COMMAND_IS_MISSION_SKIP, + COMMAND_SET_IN_AMMUNATION, + COMMAND_DO_SAVE_GAME, + COMMAND_IS_RETRY, + COMMAND_DUMMY, + COMMAND_MARK_CUTSCENE_START, + COMMAND_MARK_CUTSCENE_END, + COMMAND_CUTSCENE_SCROLL, +#endif #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT LAST_SCRIPT_COMMAND #endif @@ -1676,9 +1488,7 @@ enum eScriptArgument ARGTYPE_PED_HANDLE, ARGTYPE_VEHICLE_HANDLE, ARGTYPE_OBJECT_HANDLE, - ARGTYPE_ANDOR, - ARGTYPE_LIST, - ARGTYPE_FUNCTION + ARGTYPE_ANDOR }; struct tScriptCommandData diff --git a/src/control/TrafficLights.cpp b/src/control/TrafficLights.cpp index d8f211d..df0761a 100644 --- a/src/control/TrafficLights.cpp +++ b/src/control/TrafficLights.cpp @@ -114,32 +114,6 @@ CTrafficLights::DisplayActualLight(CEntity *ent) CBrightLights::RegisterOne(pos1, ent->GetUp(), ent->GetRight(), CVector(0.0f, 0.0f, 0.0f), id + BRIGHTLIGHT_TRAFFIC_GREEN); CBrightLights::RegisterOne(pos2, ent->GetUp(), -ent->GetRight(), CVector(0.0f, 0.0f, 0.0f), id + BRIGHTLIGHT_TRAFFIC_GREEN); - - // TODO(LCS): check coordinates - static const float top = -0.127f; - static const float bot = -0.539f; - static const float mid = bot + (top - bot) / 3.0f; - static const float left = 1.256f; - static const float right = 0.706f; - phase = CTrafficLights::LightForPeds(); - if (phase == PED_LIGHTS_DONT_WALK) { - CVector p0(2.7f, right, top); - CVector p1(2.7f, left, top); - CVector p2(2.7f, right, mid); - CVector p3(2.7f, left, mid); - CShinyTexts::RegisterOne(ent->GetMatrix() * p0, ent->GetMatrix() * p1, ent->GetMatrix() * p2, ent->GetMatrix() * p3, - 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, - SHINYTEXT_WALK, 255, 0, 0, 60.0f); - } - else if (phase == PED_LIGHTS_WALK || CTimer::GetTimeInMilliseconds() & 0x100) { - CVector p0(2.7f, right, mid); - CVector p1(2.7f, left, mid); - CVector p2(2.7f, right, bot); - CVector p3(2.7f, left, bot); - CShinyTexts::RegisterOne(ent->GetMatrix() * p0, ent->GetMatrix() * p1, ent->GetMatrix() * p2, ent->GetMatrix() * p3, - 1.0f, 0.5f, 0.0f, 0.5f, 1.0f, 1.0f, 0.0f, 1.0f, - SHINYTEXT_WALK, 255, 255, 255, 60.0f); - } } else if (MI_TRAFFICLIGHTS_VERTICAL == m) { CBaseModelInfo* mi = CModelInfo::GetModelInfo(ent->GetModelIndex()); diff --git a/src/core/AnimViewer.cpp b/src/core/AnimViewer.cpp index dc9b44c..562b9c1 100644 --- a/src/core/AnimViewer.cpp +++ b/src/core/AnimViewer.cpp @@ -81,7 +81,7 @@ CAnimViewer::Initialise(void) { CCollision::Init(); CWorld::Initialise(); mod_HandlingManager.Initialise(); - gpTempColModels->Initialise(); + CTempColModels::Initialise(); CAnimManager::Initialise(); CModelInfo::Initialise(); CParticle::Initialise(); diff --git a/src/core/Cam.cpp b/src/core/Cam.cpp index 4895ef6..fdfe227 100644 --- a/src/core/Cam.cpp +++ b/src/core/Cam.cpp @@ -121,7 +121,6 @@ CCam::Process(void) else TargetOrientation = CGeneral::GetATanOfXY(CamTargetEntity->GetForward().x, CamTargetEntity->GetForward().y); -/* LCS: removed CVector Fwd(0.0f, 0.0f, 0.0f); Fwd.x = CamTargetEntity->GetForward().x; Fwd.y = CamTargetEntity->GetForward().y; @@ -139,9 +138,6 @@ CCam::Process(void) else TargetSpeedVar = -Min(Sqrt(SQR(FwdSpeedX) + SQR(FwdSpeedY))/1.8f, 0.5f); SpeedVar = 0.895f*SpeedVar + 0.105*TargetSpeedVar; -*/ - SpeedVar = 0.0f; - TargetSpeedVar = 0.0f; }else{ if(CamTargetEntity == FindPlayerPed()){ // Some fancy smoothing of player position and speed diff --git a/src/core/Camera.cpp b/src/core/Camera.cpp index adb3e57..5b3f9aa 100644 --- a/src/core/Camera.cpp +++ b/src/core/Camera.cpp @@ -114,7 +114,6 @@ CCamera::Init(void) m_1rstPersonRunCloseToAWall = false; m_fPositionAlongSpline = 0.0f; m_bCameraJustRestored = false; - m_bFreezePedZoomSwitch = false; Cams[0].Init(); Cams[1].Init(); Cams[2].Init(); @@ -986,7 +985,7 @@ CCamera::CamControl(void) // Change user selected mode if(CPad::GetPad(0)->CycleCameraModeUpJustDown() && !CReplay::IsPlayingBack() && (m_bLookingAtPlayer || WhoIsInControlOfTheCamera == CAMCONTROL_OBBE) && - !m_WideScreenOn && !m_bFailedCullZoneTestPreviously && !m_bFirstPersonBeingUsed && !m_bFreezePedZoomSwitch){ + !m_WideScreenOn && !m_bFailedCullZoneTestPreviously && !m_bFirstPersonBeingUsed){ if(FrontEndMenuManager.m_ControlMethod == CONTROL_STANDARD){ if(PedZoomIndicator == CAM_ZOOM_3) PedZoomIndicator = CAM_ZOOM_1; @@ -3864,7 +3863,7 @@ CCamera::GetScreenFadeStatus(void) } -//--LCS: TODO + void CCamera::RenderMotionBlur(void) { @@ -3873,8 +3872,7 @@ CCamera::RenderMotionBlur(void) CMBlur::MotionBlurRender(m_pRwCamera, m_BlurRed, m_BlurGreen, m_BlurBlue, -// m_motionBlur, m_BlurType, m_imotionBlurAddAlpha); - m_motionBlur, m_BlurType, 32); // hack hack + m_motionBlur, m_BlurType, m_imotionBlurAddAlpha); } void diff --git a/src/core/Camera.h b/src/core/Camera.h index 9354e8e..538ff06 100644 --- a/src/core/Camera.h +++ b/src/core/Camera.h @@ -368,7 +368,6 @@ public: bool m_bVehicleSuspenHigh; bool m_bEnable1rstPersonCamCntrlsScript; bool m_bAllow1rstPersonWeaponsCamera; - bool m_bFreezePedZoomSwitch; bool m_bFailedCullZoneTestPreviously; bool m_FadeTargetIsSplashScreen; diff --git a/src/core/Clock.cpp b/src/core/Clock.cpp index 0aa841a..a329834 100644 --- a/src/core/Clock.cpp +++ b/src/core/Clock.cpp @@ -18,7 +18,6 @@ uint16 CClock::ms_Stored_nGameClockSeconds; uint32 CClock::ms_nMillisecondsPerGameMinute; uint32 CClock::ms_nLastClockTick; bool CClock::ms_bClockHasBeenStored; -float CClock::ms_EnvMapTimeMultiplicator; #ifndef MASTER bool gbFreezeTime; @@ -34,7 +33,6 @@ CClock::Initialise(uint32 scale) ms_nMillisecondsPerGameMinute = scale; ms_nLastClockTick = CTimer::GetTimeInMilliseconds(); ms_bClockHasBeenStored = false; - ms_EnvMapTimeMultiplicator = 1.0f; debug("CClock ready\n"); #ifndef MASTER VarConsole.Add("Time (hour of day)", &ms_nGameClockHours, 1, 0, 23, true); @@ -136,10 +134,3 @@ CClock::RestoreClock(void) ms_nGameClockMinutes = ms_Stored_nGameClockMinutes; ms_nGameClockSeconds = ms_Stored_nGameClockSeconds; } - -void -CClock::CalcEnvMapTimeMultiplicator(void) -{ - float nightness = Abs(ms_nGameClockHours/24.0f - 0.5f); - ms_EnvMapTimeMultiplicator = SQR(1.0f - nightness);; -} diff --git a/src/core/Clock.h b/src/core/Clock.h index 808e61f..a611cd5 100644 --- a/src/core/Clock.h +++ b/src/core/Clock.h @@ -12,7 +12,6 @@ public: static uint32 ms_nMillisecondsPerGameMinute; static uint32 ms_nLastClockTick; static bool ms_bClockHasBeenStored; - static float ms_EnvMapTimeMultiplicator; static void Initialise(uint32 scale); static void Update(void); @@ -22,8 +21,6 @@ public: static void StoreClock(void); static void RestoreClock(void); - static void CalcEnvMapTimeMultiplicator(void); - static uint8 GetHours(void) { return ms_nGameClockHours; } static uint8 GetMinutes(void) { return ms_nGameClockMinutes; } static int16 GetSeconds(void) { return ms_nGameClockSeconds; } diff --git a/src/core/FileLoader.cpp b/src/core/FileLoader.cpp index e5d13b2..bf01725 100644 --- a/src/core/FileLoader.cpp +++ b/src/core/FileLoader.cpp @@ -291,7 +291,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname) { int i; - model.boundingSphere.radius = Max(*(float*)(buf), 0.1f); + model.boundingSphere.radius = *(float*)(buf); model.boundingSphere.center.x = *(float*)(buf+4); model.boundingSphere.center.y = *(float*)(buf+8); model.boundingSphere.center.z = *(float*)(buf+12); @@ -304,13 +304,10 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname) model.numSpheres = *(int16*)(buf+40); buf += 44; if(model.numSpheres > 0){ - model.spheres = new CColSphere[model.numSpheres]; + model.spheres = (CColSphere*)RwMalloc(model.numSpheres*sizeof(CColSphere)); REGISTER_MEMPTR(&model.spheres); for(i = 0; i < model.numSpheres; i++){ - float radius = *(float*)buf; - if(radius > model.boundingSphere.radius) - model.boundingSphere.radius = radius + 0.01f; - model.spheres[i].Set(radius, *(CVector*)(buf+4), buf[16], buf[17]); + model.spheres[i].Set(*(float*)buf, *(CVector*)(buf+4), buf[16], buf[17]); buf += 20; } }else @@ -319,7 +316,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname) model.numLines = *(int16*)buf; buf += 4; if(model.numLines > 0){ - //model.lines = new CColLine[model.numLines];; + //model.lines = (CColLine*)RwMalloc(model.numLines*sizeof(CColLine)); REGISTER_MEMPTR(&model.lines); for(i = 0; i < model.numLines; i++){ //model.lines[i].Set(*(CVector*)buf, *(CVector*)(buf+12)); @@ -333,7 +330,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname) model.numBoxes = *(int16*)buf; buf += 4; if(model.numBoxes > 0){ - model.boxes = new CColBox[model.numBoxes]; + model.boxes = (CColBox*)RwMalloc(model.numBoxes*sizeof(CColBox)); REGISTER_MEMPTR(&model.boxes); for(i = 0; i < model.numBoxes; i++){ model.boxes[i].Set(*(CVector*)buf, *(CVector*)(buf+12), buf[24], buf[25]); @@ -345,7 +342,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname) int32 numVertices = *(int16*)buf; buf += 4; if(numVertices > 0){ - model.vertices = new CompressedVector[numVertices]; + model.vertices = (CompressedVector*)RwMalloc(numVertices*sizeof(CompressedVector)); REGISTER_MEMPTR(&model.vertices); for(i = 0; i < numVertices; i++){ model.vertices[i].Set(*(float*)buf, *(float*)(buf+4), *(float*)(buf+8)); @@ -363,64 +360,14 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname) model.numTriangles = *(int16*)buf; buf += 4; if(model.numTriangles > 0){ - model.triangles = new CColTriangle[model.numTriangles]; + model.triangles = (CColTriangle*)RwMalloc(model.numTriangles*sizeof(CColTriangle)); REGISTER_MEMPTR(&model.triangles); for(i = 0; i < model.numTriangles; i++){ model.triangles[i].Set(*(int32*)buf, *(int32*)(buf+4), *(int32*)(buf+8), buf[12]); buf += 16; - - // skip small triangles - CVector vA = model.vertices[model.triangles[i].a].Get(); - CVector vB = model.vertices[model.triangles[i].b].Get(); - CVector vC = model.vertices[model.triangles[i].c].Get(); - float area = CrossProduct(vA - vB, vA - vC).Magnitude(); - if(area < 0.001f || vA == vB || vA == vC || vB == vC){ - i--; - model.numTriangles--; - } } }else model.triangles = nil; - - SplitColTrianglesIntoSections(model); -} - -void -CFileLoader::SplitColTrianglesIntoSections(CColModel &model) -{ - if(model.triangles == nil || model.numTriangles == 0) - return; - - model.numTriBBoxes = 1; - model.triBBoxes = new CColTriBBox[1]; - model.triBBoxes[0].first = 0; - model.triBBoxes[0].last = model.numTriangles-1; - CVector v = model.vertices[model.triangles[0].a].Get(); - model.triBBoxes[0].Set(v, v); - - for(int i = 0; i < model.numTriangles; i++){ - CVector vA = model.vertices[model.triangles[i].a].Get(); - CVector vB = model.vertices[model.triangles[i].b].Get(); - CVector vC = model.vertices[model.triangles[i].c].Get(); - model.triBBoxes[0].min.x = Min(vA.x, model.triBBoxes[0].min.x); - model.triBBoxes[0].min.y = Min(vA.y, model.triBBoxes[0].min.y); - model.triBBoxes[0].min.z = Min(vA.z, model.triBBoxes[0].min.z); - model.triBBoxes[0].min.x = Min(vB.x, model.triBBoxes[0].min.x); - model.triBBoxes[0].min.y = Min(vB.y, model.triBBoxes[0].min.y); - model.triBBoxes[0].min.z = Min(vB.z, model.triBBoxes[0].min.z); - model.triBBoxes[0].min.x = Min(vC.x, model.triBBoxes[0].min.x); - model.triBBoxes[0].min.y = Min(vC.y, model.triBBoxes[0].min.y); - model.triBBoxes[0].min.z = Min(vC.z, model.triBBoxes[0].min.z); - model.triBBoxes[0].max.x = Max(vA.x, model.triBBoxes[0].max.x); - model.triBBoxes[0].max.y = Max(vA.y, model.triBBoxes[0].max.y); - model.triBBoxes[0].max.z = Max(vA.z, model.triBBoxes[0].max.z); - model.triBBoxes[0].max.x = Max(vB.x, model.triBBoxes[0].max.x); - model.triBBoxes[0].max.y = Max(vB.y, model.triBBoxes[0].max.y); - model.triBBoxes[0].max.z = Max(vB.z, model.triBBoxes[0].max.z); - model.triBBoxes[0].max.x = Max(vC.x, model.triBBoxes[0].max.x); - model.triBBoxes[0].max.y = Max(vC.y, model.triBBoxes[0].max.y); - model.triBBoxes[0].max.z = Max(vC.z, model.triBBoxes[0].max.z); - } } static void @@ -661,14 +608,11 @@ CFileLoader::LoadObjectTypes(const char *filename) int section; int pathIndex; int id, pathType; - //int minID, maxID; - - for(int i = 0; i < ARRAY_SIZE(m_sTempIdeData); i++) - m_sTempIdeData[i].id = -1; + int minID, maxID; section = NONE; - //minID = INT32_MAX; - //maxID = -1; + minID = INT32_MAX; + maxID = -1; pathIndex = -1; debug("Loading object types from %s...\n", filename); @@ -692,13 +636,13 @@ CFileLoader::LoadObjectTypes(const char *filename) }else switch(section){ case OBJS: id = LoadObject(line); - //if(id > maxID) maxID = id; - //if(id < minID) minID = id; + if(id > maxID) maxID = id; + if(id < minID) minID = id; break; case TOBJ: id = LoadTimeObject(line); - //if(id > maxID) maxID = id; - //if(id < minID) minID = id; + if(id > maxID) maxID = id; + if(id < minID) minID = id; break; case WEAP: LoadWeaponObject(line); @@ -735,10 +679,10 @@ CFileLoader::LoadObjectTypes(const char *filename) } CFileMgr::CloseFile(fd); - for(id = 0; id < MODELINFOSIZE; id++){ + for(id = minID; id <= maxID; id++){ CSimpleModelInfo *mi = (CSimpleModelInfo*)CModelInfo::GetModelInfo(id); if(mi && mi->IsBuilding()) - mi->SetupBigBuilding(); + mi->SetupBigBuilding(minID, maxID); } } @@ -771,13 +715,6 @@ CFileLoader::LoadObject(const char *line) if(sscanf(line, "%d %s %s %d", &id, model, txd, &numObjs) != 4) return 0; // game returns return value - for(int i = 0; i < ARRAY_SIZE(m_sTempIdeData); i++) - if(m_sTempIdeData[i].id == -1){ - m_sTempIdeData[i].id = id; - strcpy(m_sTempIdeData[i].name, model); - break; - } - switch(numObjs){ case 1: sscanf(line, "%d %s %s %d %f %d", @@ -826,13 +763,6 @@ CFileLoader::LoadTimeObject(const char *line) if(sscanf(line, "%d %s %s %d", &id, model, txd, &numObjs) != 4) return 0; // game returns return value - for(int i = 0; i < ARRAY_SIZE(m_sTempIdeData); i++) - if(m_sTempIdeData[i].id < 0){ - m_sTempIdeData[i].id = id; - strcpy(m_sTempIdeData[i].name, model); - break; - } - switch(numObjs){ case 1: sscanf(line, "%d %s %s %d %f %d %d %d", @@ -863,7 +793,7 @@ CFileLoader::LoadTimeObject(const char *line) mi->m_firstDamaged = damaged; mi->SetTimes(timeOn, timeOff); mi->SetTexDictionary(txd); - other = mi->FindOtherTimeModel(model); + other = mi->FindOtherTimeModel(); if(other) other->SetOtherTimeModel(id); MatchModelString(model, id); @@ -887,7 +817,7 @@ CFileLoader::LoadWeaponObject(const char *line) mi->m_lodDistances[0] = dist; mi->SetTexDictionary(txd); mi->SetAnimFile(animFile); - mi->SetColModel(&gpTempColModels->ms_colModelWeapon); + mi->SetColModel(&CTempColModels::ms_colModelWeapon); MatchModelString(model, id); return id; } @@ -903,7 +833,7 @@ CFileLoader::LoadClumpObject(const char *line) mi = CModelInfo::AddClumpModel(id); mi->SetModelName(model); mi->SetTexDictionary(txd); - mi->SetColModel(&gpTempColModels->ms_colModelBBox); + mi->SetColModel(&CTempColModels::ms_colModelBBox); } } @@ -915,15 +845,14 @@ CFileLoader::LoadVehicleObject(const char *line) char type[8], handlingId[16], gamename[32], animFile[16], vehclass[12]; uint32 frequency, comprules; int32 level, misc; - float wheelScale, normalSplay; + float wheelScale; CVehicleModelInfo *mi; char *p; - sscanf(line, "%d %s %s %s %s %s %s %s %d %d %x %d %f %f", + sscanf(line, "%d %s %s %s %s %s %s %s %d %d %x %d %f", &id, model, txd, type, handlingId, gamename, animFile, vehclass, - &frequency, &level, &comprules, &misc, &wheelScale, - &normalSplay); + &frequency, &level, &comprules, &misc, &wheelScale); mi = CModelInfo::AddVehicleModel(id); mi->SetModelName(model); @@ -943,8 +872,6 @@ CFileLoader::LoadVehicleObject(const char *line) mi->m_vehicleType = VEHICLE_TYPE_BOAT; }else if(strcmp(type, "train") == 0){ mi->m_vehicleType = VEHICLE_TYPE_TRAIN; - }else if(strcmp(type, "ferry") == 0){ - mi->m_vehicleType = VEHICLE_TYPE_FERRY; }else if(strcmp(type, "heli") == 0){ mi->m_vehicleType = VEHICLE_TYPE_HELI; }else if(strcmp(type, "plane") == 0){ @@ -1010,7 +937,7 @@ CFileLoader::LoadPedObject(const char *line) mi->SetModelName(model); mi->SetTexDictionary(txd); mi->SetAnimFile(animFile); - mi->SetColModel(&gpTempColModels->ms_colModelPed1); + mi->SetColModel(&CTempColModels::ms_colModelPed1); mi->m_pedType = CPedType::FindPedType(pedType); mi->m_pedStatType = CPedStats::GetPedStatType(pedStats); for(animGroupId = 0; animGroupId < NUM_ANIM_ASSOC_GROUPS; animGroupId++) diff --git a/src/core/FileLoader.h b/src/core/FileLoader.h index 3a7d43a..077e7bd 100644 --- a/src/core/FileLoader.h +++ b/src/core/FileLoader.h @@ -11,7 +11,6 @@ public: static bool LoadCollisionFileFirstTime(uint8 *buffer, uint32 size, uint8 colSlot); static bool LoadCollisionFile(uint8 *buffer, uint32 size, uint8 colSlot); static void LoadCollisionModel(uint8 *buf, struct CColModel &model, char *name); - static void SplitColTrianglesIntoSections(CColModel &model); static void LoadModelFile(const char *filename); static RpAtomic *FindRelatedModelInfoCB(RpAtomic *atomic, void *data); static void LoadClumpFile(const char *filename); diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index e641906..d6c2649 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -36,16 +36,15 @@ #include "User.h" #include "sampman.h" -// --LCS: changed a bit to have lcs feel, needs more work // Similar story to Hud.cpp: // Game has colors inlined in code. // For easier modification we collect them here: -const CRGBA LABEL_COLOR(115, 173, 216, 255); +const CRGBA LABEL_COLOR(255, 150, 225, 255); const CRGBA SELECTIONBORDER_COLOR(25, 130, 70, 255); const CRGBA MENUOPTION_COLOR = LABEL_COLOR; -const CRGBA SELECTEDMENUOPTION_COLOR(255, 255, 255, 255); -const CRGBA HEADER_COLOR(197, 0, 0, 255); -const CRGBA DARKMENUOPTION_COLOR(115/2, 173/2, 216 / 2, 255); +const CRGBA SELECTEDMENUOPTION_COLOR = LABEL_COLOR; +const CRGBA HEADER_COLOR = LABEL_COLOR; +const CRGBA DARKMENUOPTION_COLOR(195, 90, 165, 255); const CRGBA SLIDERON_COLOR(97, 194, 247, 255); const CRGBA SLIDEROFF_COLOR(27, 89, 130, 255); const CRGBA LIST_BACKGROUND_COLOR(49, 101, 148, 130); @@ -54,19 +53,6 @@ const CRGBA RADIO_SELECTOR_COLOR = SLIDEROFF_COLOR; const CRGBA INACTIVE_RADIO_COLOR(100, 100, 255, 100); const CRGBA SCROLLBAR_COLOR = LABEL_COLOR; -#if 0 -// Mobile -#define DEFAULT_BRIGHTNESS 0x150 -#define MIN_BRIGHTNESS 180 -#define MAX_BRIGHTNESS 700 -#else -// PS2, also PSP probably -// 8 bars (32 step) -#define DEFAULT_BRIGHTNESS 0x120 -#define MIN_BRIGHTNESS 0x80 -#define MAX_BRIGHTNESS 0x180 -#endif - #define MAP_MIN_SIZE 162.f #define MAP_SIZE_TO_ALLOW_X_MOVE 297.f @@ -201,7 +187,7 @@ wchar* CMenuManager::m_pDialogText = nil; #endif #define SET_FONT_FOR_MENU_HEADER \ - CFont::SetRightJustifyOff(); \ + CFont::SetRightJustifyOn(); \ CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING)); \ CFont::SetScale(MENU_X(MENUHEADER_WIDTH), MENU_Y(MENUHEADER_HEIGHT)); \ CFont::SetDropShadowPosition(0); @@ -485,7 +471,7 @@ CMenuManager::CMenuManager() m_PrefsMusicVolume = 49; m_PrefsRadioStation = 0; m_PrefsStereoMono = 1; - m_PrefsBrightness = DEFAULT_BRIGHTNESS; + m_PrefsBrightness = 256; m_PrefsLOD = CRenderer::ms_lodDistScale; m_KeyPressedCode = -1; m_bFrontEnd_ReloadObrTxtGxt = false; @@ -710,8 +696,8 @@ CMenuManager::CheckSliderMovement(int value) { switch (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action) { case MENUACTION_BRIGHTNESS: - m_PrefsBrightness += value * 32.0f; - m_PrefsBrightness = clamp(m_PrefsBrightness, MIN_BRIGHTNESS, MAX_BRIGHTNESS); + m_PrefsBrightness += value * 24.19f; + m_PrefsBrightness = clamp(m_PrefsBrightness, 0, 384); break; case MENUACTION_DRAWDIST: if(value > 0) @@ -931,14 +917,14 @@ CMenuManager::DrawStandardMenus(bool activeScreen) #endif switch (m_nCurrScreen) { - /*case MENUPAGE_CHOOSE_LOAD_SLOT: + case MENUPAGE_CHOOSE_LOAD_SLOT: case MENUPAGE_CHOOSE_DELETE_SLOT: case MENUPAGE_CHOOSE_SAVE_SLOT: CSprite2d::Draw2DPolygon(MENU_X_LEFT_ALIGNED(38.0f), MENU_Y(85.0f), MENU_X_LEFT_ALIGNED(615.0f), MENU_Y(75.0f), MENU_X_LEFT_ALIGNED(30.0f), MENU_Y(320.0f), MENU_X_LEFT_ALIGNED(605.0f), MENU_Y(330.0f), CRGBA(LIST_BACKGROUND_COLOR.r, LIST_BACKGROUND_COLOR.g, LIST_BACKGROUND_COLOR.b, FadeIn(LIST_BACKGROUND_COLOR.a))); - break;*/ + break; case MENUPAGE_SOUND_SETTINGS: PrintRadioSelector(); break; @@ -954,11 +940,11 @@ CMenuManager::DrawStandardMenus(bool activeScreen) if (aScreens[m_nCurrScreen].m_ScreenName[0] != '\0') { SET_FONT_FOR_MENU_HEADER - //CFont::SetColor(CRGBA(30, 30, 30, FadeIn(255))); - //CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get(aScreens[m_nCurrScreen].m_ScreenName)); + CFont::SetColor(CRGBA(30, 30, 30, FadeIn(255))); + CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get(aScreens[m_nCurrScreen].m_ScreenName)); CFont::SetColor(CRGBA(HEADER_COLOR.r, HEADER_COLOR.g, HEADER_COLOR.b, FadeIn(255))); - CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get(aScreens[m_nCurrScreen].m_ScreenName)); + CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get(aScreens[m_nCurrScreen].m_ScreenName)); } // Label @@ -1034,21 +1020,18 @@ CMenuManager::DrawStandardMenus(bool activeScreen) #endif wchar* rightText = nil; wchar* leftText; - /*if (aScreens[m_nCurrScreen].m_aEntries[i].m_SaveSlot >= SAVESLOT_1 && aScreens[m_nCurrScreen].m_aEntries[i].m_SaveSlot <= SAVESLOT_8) { + if (aScreens[m_nCurrScreen].m_aEntries[i].m_SaveSlot >= SAVESLOT_1 && aScreens[m_nCurrScreen].m_aEntries[i].m_SaveSlot <= SAVESLOT_8) { CFont::SetColor(CRGBA(0, 0, 0, FadeIn(255))); CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD)); CFont::SetScale(MENU_X(MEDIUMTEXT_X_SCALE), MENU_Y(MEDIUMTEXT_Y_SCALE)); CFont::SetDropShadowPosition(0); - } else {*/ - CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD)); + } else { + CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING)); CFont::SetScale(MENU_X(BIGTEXT_X_SCALE), MENU_Y(BIGTEXT_Y_SCALE)); CFont::SetDropShadowPosition(2); CFont::SetDropColor(CRGBA(0, 0, 0, FadeIn(255))); - if (i == m_nCurrOption && itemsAreSelectable) - CFont::SetColor(CRGBA(SELECTEDMENUOPTION_COLOR.r, SELECTEDMENUOPTION_COLOR.g, SELECTEDMENUOPTION_COLOR.b, FadeIn(255))); - else - CFont::SetColor(CRGBA(MENUOPTION_COLOR.r, MENUOPTION_COLOR.g, MENUOPTION_COLOR.b, FadeIn(255))); - //} + CFont::SetColor(CRGBA(MENUOPTION_COLOR.r, MENUOPTION_COLOR.g, MENUOPTION_COLOR.b, FadeIn(255))); + } if (aScreens[m_nCurrScreen].m_aEntries[i].m_Align == MENUALIGN_LEFT) { CFont::SetCentreOff(); CFont::SetRightJustifyOff(); @@ -1404,7 +1387,7 @@ CMenuManager::DrawStandardMenus(bool activeScreen) // Actually bottomRight and bottomLeft should be exchanged here(although this is original code). // So this shows us either R* didn't use same struct for menu BG and highlight, or they just kept fields as x1,y1 etc. Yikes. - /*if (m_nOptionHighlightTransitionBlend == 0) { + if (m_nOptionHighlightTransitionBlend == 0) { if (m_firstStartCounter == 255 && m_nMenuFadeAlpha == 255 && !bMenuChangeOngoing) { CSprite2d::Draw2DPolygon(MENU_X_LEFT_ALIGNED(menuOptionHighlight.topLeft_x), MENU_Y(menuOptionHighlight.topLeft_y), MENU_X_LEFT_ALIGNED(menuOptionHighlight.topRight_x), MENU_Y(menuOptionHighlight.topRight_y), @@ -1440,7 +1423,7 @@ CMenuManager::DrawStandardMenus(bool activeScreen) MENU_X_LEFT_ALIGNED(menuOptionHighlight.bottomRight_x), MENU_Y(menuOptionHighlight.bottomRight_y), MENU_X_LEFT_ALIGNED(menuOptionHighlight.bottomLeft_x), MENU_Y(menuOptionHighlight.bottomLeft_y), SELECTIONBORDER_COLOR); } - }*/ + } static PauseModeTime lastBlendChange = 0; if (m_nOptionHighlightTransitionBlend <= 255) { @@ -1470,7 +1453,7 @@ CMenuManager::DrawStandardMenus(bool activeScreen) CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD)); CFont::SetScale(MENU_X(MEDIUMTEXT_X_SCALE), MENU_Y(MEDIUMTEXT_Y_SCALE)); } else { - CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD)); + CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING)); CFont::SetScale(MENU_X(BIGTEXT_X_SCALE), MENU_Y(BIGTEXT_Y_SCALE)); } CFont::PrintString(MENU_X_LEFT_ALIGNED(DEFAULT_SCREEN_WIDTH - RIGHT_ALIGNED_TEXT_RIGHT_MARGIN(xMargin)), MENU_Y(aScreens[m_nCurrScreen].m_aEntries[i].m_Y MINUS_SCROLL_OFFSET), rightText); @@ -1521,7 +1504,7 @@ CMenuManager::DrawStandardMenus(bool activeScreen) int lastActiveBarX; switch (aScreens[m_nCurrScreen].m_aEntries[i].m_Action) { case MENUACTION_BRIGHTNESS: - ProcessSlider((float)(m_PrefsBrightness - MIN_BRIGHTNESS) / (MAX_BRIGHTNESS - MIN_BRIGHTNESS), 70.0f, HOVEROPTION_INCREASE_BRIGHTNESS, HOVEROPTION_DECREASE_BRIGHTNESS, SCREEN_WIDTH, true); + ProcessSlider(m_PrefsBrightness / 384.0f, 70.0f, HOVEROPTION_INCREASE_BRIGHTNESS, HOVEROPTION_DECREASE_BRIGHTNESS, SCREEN_WIDTH, true); break; case MENUACTION_DRAWDIST: ProcessSlider((m_PrefsLOD - 0.925f) / 0.875f, 99.0f, HOVEROPTION_INCREASE_DRAWDIST, HOVEROPTION_DECREASE_DRAWDIST, SCREEN_WIDTH, true); @@ -2053,18 +2036,18 @@ CMenuManager::DrawControllerSetupScreen() // Shadow CFont::SetColor(CRGBA(30, 30, 30, FadeIn(255))); - //if (m_ControlMethod == CONTROL_STANDARD) - // CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get("FET_STI")); - //else if (m_ControlMethod == CONTROL_CLASSIC) - // CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get("FET_CTI")); + if (m_ControlMethod == CONTROL_STANDARD) + CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get("FET_STI")); + else if (m_ControlMethod == CONTROL_CLASSIC) + CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get("FET_CTI")); // Real header CFont::SetColor(CRGBA(HEADER_COLOR.r, HEADER_COLOR.g, HEADER_COLOR.b, FadeIn(255))); if (m_ControlMethod == CONTROL_STANDARD) - CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get("FET_STI")); + CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get("FET_STI")); else if (m_ControlMethod == CONTROL_CLASSIC) - CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get("FET_CTI")); + CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get("FET_CTI")); wchar *actionTexts[33]; actionTexts[0] = TheText.Get("FEC_FIR"); @@ -2217,7 +2200,7 @@ CMenuManager::DrawControllerSetupScreen() } // Back button and it's shadow - CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD)); + CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING)); CFont::SetScale(MENU_X(BIGTEXT_X_SCALE), MENU_Y(BIGTEXT_Y_SCALE)); CFont::SetRightJustifyOn(); CFont::SetDropShadowPosition(2); @@ -2276,7 +2259,7 @@ CMenuManager::DrawBackground(bool transitionCall) PrintMap(); // Left border - /*CSprite2d::Draw2DPolygon(SCREEN_STRETCH_X(menuBg.bottomLeft_x), SCREEN_STRETCH_Y(menuBg.bottomLeft_y), 0.0f, SCREEN_HEIGHT, + CSprite2d::Draw2DPolygon(SCREEN_STRETCH_X(menuBg.bottomLeft_x), SCREEN_STRETCH_Y(menuBg.bottomLeft_y), 0.0f, SCREEN_HEIGHT, SCREEN_STRETCH_X(menuBg.topLeft_x), SCREEN_STRETCH_Y(menuBg.topLeft_y), 0.0f, 0.0f, CRGBA(0, 0, 0, 255)); // Top border @@ -2289,7 +2272,7 @@ CMenuManager::DrawBackground(bool transitionCall) // Right border CSprite2d::Draw2DPolygon(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_STRETCH_X(menuBg.bottomRight_x), SCREEN_STRETCH_Y(menuBg.bottomRight_y), - SCREEN_WIDTH, 0.0f, SCREEN_STRETCH_X(menuBg.topRight_x), SCREEN_STRETCH_Y(menuBg.topRight_y), CRGBA(0, 0, 0, 255));*/ + SCREEN_WIDTH, 0.0f, SCREEN_STRETCH_X(menuBg.topRight_x), SCREEN_STRETCH_Y(menuBg.topRight_y), CRGBA(0, 0, 0, 255)); } else { m_nMenuFadeAlpha = 255; m_firstStartCounter = 255; @@ -2298,7 +2281,7 @@ CMenuManager::DrawBackground(bool transitionCall) PrintMap(); // Left border - /*CSprite2d::Draw2DPolygon(SCREEN_STRETCH_X(menuBg.bottomLeft_x), SCREEN_STRETCH_Y(menuBg.bottomLeft_y), 0.0f, SCREEN_HEIGHT, + CSprite2d::Draw2DPolygon(SCREEN_STRETCH_X(menuBg.bottomLeft_x), SCREEN_STRETCH_Y(menuBg.bottomLeft_y), 0.0f, SCREEN_HEIGHT, SCREEN_STRETCH_X(menuBg.topLeft_x), SCREEN_STRETCH_Y(menuBg.topLeft_y), 0.0f, 0.0f, CRGBA(0, 0, 0, 255)); // Top border @@ -2311,7 +2294,7 @@ CMenuManager::DrawBackground(bool transitionCall) // Right border CSprite2d::Draw2DPolygon(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_STRETCH_X(menuBg.bottomRight_x), SCREEN_STRETCH_Y(menuBg.bottomRight_y), - SCREEN_WIDTH, 0.0f, SCREEN_STRETCH_X(menuBg.topRight_x), SCREEN_STRETCH_Y(menuBg.topRight_y), CRGBA(0, 0, 0, 255));*/ + SCREEN_WIDTH, 0.0f, SCREEN_STRETCH_X(menuBg.topRight_x), SCREEN_STRETCH_Y(menuBg.topRight_y), CRGBA(0, 0, 0, 255)); } } else { menuBg.SaveCurrentCoors(); @@ -2403,9 +2386,9 @@ CMenuManager::DrawBackground(bool transitionCall) || forceFadeInCounter > 30 #endif ) { - m_nMenuFadeAlpha += 50; + m_nMenuFadeAlpha += 20; if (m_firstStartCounter < 255) { - m_firstStartCounter = Min(m_firstStartCounter + 50, 255); + m_firstStartCounter = Min(m_firstStartCounter + 20, 255); } LastFade = CTimer::GetTimeInMillisecondsPauseMode(); } @@ -2457,12 +2440,12 @@ CMenuManager::DrawBackground(bool transitionCall) CFont::DrawFonts(); SetFrontEndRenderStates(); - //if (m_nCurrScreen != MENUPAGE_OUTRO) - // if (m_firstStartCounter == 255) { - // m_aFrontEndSprites[MENUSPRITE_VCLOGO].Draw(CRect(SCREEN_STRETCH_X(27.0f), MENU_Y(8.0f), SCREEN_STRETCH_X(27.0f) + MENU_X(130.f), MENU_Y(138.0f)), CRGBA(255, 255, 255, 255)); - // } else { - // m_aFrontEndSprites[MENUSPRITE_VCLOGO].Draw(CRect(SCREEN_STRETCH_X(27.0f), MENU_Y(8.0f), SCREEN_STRETCH_X(27.0f) + MENU_X(130.f), MENU_Y(138.0f)), CRGBA(255, 255, 255, FadeIn(255))); - // } + if (m_nCurrScreen != MENUPAGE_OUTRO) + if (m_firstStartCounter == 255) { + m_aFrontEndSprites[MENUSPRITE_VCLOGO].Draw(CRect(SCREEN_STRETCH_X(27.0f), MENU_Y(8.0f), SCREEN_STRETCH_X(27.0f) + MENU_X(130.f), MENU_Y(138.0f)), CRGBA(255, 255, 255, 255)); + } else { + m_aFrontEndSprites[MENUSPRITE_VCLOGO].Draw(CRect(SCREEN_STRETCH_X(27.0f), MENU_Y(8.0f), SCREEN_STRETCH_X(27.0f) + MENU_X(130.f), MENU_Y(138.0f)), CRGBA(255, 255, 255, FadeIn(255))); + } if (m_ShowEmptyBindingError) { static PauseModeTime lastBindingError = CTimer::GetTimeInMillisecondsPauseMode(); @@ -2581,11 +2564,11 @@ CMenuManager::DrawPlayerSetupScreen(bool activeScreen) MENU_X_RIGHT_ALIGNED(PLAYERSETUP_LIST_RIGHT), SCREEN_SCALE_FROM_BOTTOM(PLAYERSETUP_LIST_BOTTOM)), CRGBA(LIST_BACKGROUND_COLOR.r, LIST_BACKGROUND_COLOR.g, LIST_BACKGROUND_COLOR.b, FadeIn(LIST_BACKGROUND_COLOR.a))); SET_FONT_FOR_MENU_HEADER - //CFont::SetColor(CRGBA(30, 30, 30, FadeIn(255))); - //CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get("FET_PS")); + CFont::SetColor(CRGBA(30, 30, 30, FadeIn(255))); + CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get("FET_PS")); CFont::SetColor(CRGBA(HEADER_COLOR.r, HEADER_COLOR.g, HEADER_COLOR.b, FadeIn(255))); - CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get("FET_PS")); + CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get("FET_PS")); // Header (Skin - Date) if (m_nCurrExLayer == HOVEROPTION_LIST) { @@ -2765,7 +2748,7 @@ CMenuManager::DrawPlayerSetupScreen(bool activeScreen) // Big apply button if (strcmp(m_aSkinName, m_PrefsSkinFile) != 0) { - CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD)); + CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING)); switch (m_PrefsLanguage) { case LANGUAGE_FRENCH: CFont::SetScale(MENU_X(1.1f), MENU_Y(1.9f)); @@ -2785,7 +2768,7 @@ CMenuManager::DrawPlayerSetupScreen(bool activeScreen) CFont::SetRightJustifyOff(); CFont::PrintString(MENU_X_LEFT_ALIGNED(24.0f), MENU_Y(220.0f), TheText.Get("FET_APP")); } - CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD)); + CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING)); CFont::SetScale(MENU_X(BIGTEXT_X_SCALE), MENU_Y(BIGTEXT_Y_SCALE)); @@ -2857,7 +2840,7 @@ CMenuManager::DrawPlayerSetupScreen(bool activeScreen) m_nHoverOption = HOVEROPTION_NOT_HOVERING; } } - CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD)); + CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING)); CFont::SetScale(MENU_X(BIGTEXT_X_SCALE), MENU_Y(BIGTEXT_Y_SCALE)); CFont::SetRightJustifyOn(); CFont::SetColor(CRGBA(MENUOPTION_COLOR.r, MENUOPTION_COLOR.g, MENUOPTION_COLOR.b, FadeIn(255))); @@ -3114,11 +3097,10 @@ CMenuManager::LoadSettings() #ifdef LOAD_INI_SETTINGS if (LoadINISettings()) { LoadINIControllerSettings(); - } else { - // no re3.ini, create it - SaveINISettings(); - SaveINIControllerSettings(); } + // if no reVC.ini, create it, or update it with new values + SaveINISettings(); + SaveINIControllerSettings(); #endif #ifdef FIX_BUGS @@ -3291,7 +3273,7 @@ CMenuManager::SmallMessageScreen(const char* text) void CMenuManager::PrintBriefs() { - CFont::SetColor(CRGBA(255, 255, 255, FadeIn(255))); + CFont::SetColor(CRGBA(0, 0, 0, FadeIn(255))); CFont::SetRightJustifyOff(); CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD)); CFont::SetScale(MENU_X(MEDIUMTEXT_X_SCALE), MENU_Y(MEDIUMTEXT_Y_SCALE)); @@ -3447,9 +3429,9 @@ CMenuManager::Process(void) #ifdef XBOX_MESSAGE_SCREEN ProcessDialogTimer(); #endif - // tmp hack to get saving to work - //if (TheCamera.GetScreenFadeStatus() != FADE_0) - // return; + + if (TheCamera.GetScreenFadeStatus() != FADE_0) + return; InitialiseChangedLanguageSettings(); @@ -4756,8 +4738,7 @@ CMenuManager::ProcessUserInput(uint8 goDown, uint8 goUp, uint8 optionSelected, u break; case MENUACTION_CANCELGAME: DMAudio.Service(); - RsEventHandler(rsQUITAPP, nil); - //SwitchToNewScreen(MENUPAGE_OUTRO); + SwitchToNewScreen(MENUPAGE_OUTRO); break; case MENUACTION_RESUME: #ifdef LEGACY_MENU_OPTIONS @@ -4829,7 +4810,7 @@ CMenuManager::ProcessUserInput(uint8 goDown, uint8 goUp, uint8 optionSelected, u DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); SaveSettings(); } else if (m_nCurrScreen == MENUPAGE_DISPLAY_SETTINGS) { - m_PrefsBrightness = DEFAULT_BRIGHTNESS; + m_PrefsBrightness = 256; m_PrefsLOD = 1.2f; #ifdef LEGACY_MENU_OPTIONS m_PrefsVsync = true; @@ -5687,7 +5668,7 @@ CMenuManager::DrawQuitGameScreen(void) static CSprite2d *splash = nil; if (splash == nil) - splash = LoadSplash("sceelee"); + splash = LoadSplash("OUTRO"); m_aFrontEndSprites[MENUSPRITE_VCLOGO].Draw(CRect(SCREEN_STRETCH_X(28.0f), MENU_Y(8.0f), SCREEN_STRETCH_X(27.0f) + MENU_X(130.f), MENU_Y(138.0f)), CRGBA(255, 255, 255, 255 - alpha)); diff --git a/src/core/Game.cpp b/src/core/Game.cpp index edd4d7c..43bd3d1 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -316,7 +316,7 @@ bool CGame::InitialiseOnceAfterRW(void) { TheText.Load(); CTimer::Initialise(); - gpTempColModels->Initialise(); + CTempColModels::Initialise(); mod_HandlingManager.Initialise(); CSurfaceTable::Initialise("DATA\\SURFACE.DAT"); CPedStats::Initialise(); @@ -366,16 +366,13 @@ bool CGame::Initialise(const char* datFile) CPools::Initialise(); - if(gMakeResources) - CVehicleModelInfo::Load(nil); - #ifndef GTA_PS2 CIniFile::LoadIniFile(); #endif #ifdef USE_TEXTURE_POOL _TexturePoolsUnknown(false); #endif - currLevel = LEVEL_INDUSTRIAL; + currLevel = LEVEL_BEACH; currArea = AREA_MAIN_MAP; PUSH_MEMID(MEMID_TEXTURES); @@ -446,7 +443,7 @@ bool CGame::Initialise(const char* datFile) CdStreamAddImage("MODELS\\GTA3.IMG"); -// CFileLoader::LoadLevel("DATA\\DEFAULT.DAT"); + CFileLoader::LoadLevel("DATA\\DEFAULT.DAT"); CFileLoader::LoadLevel(datFile); LoadingScreen("Loading the Game", "Add Particles", nil); @@ -589,7 +586,7 @@ bool CGame::ShutDown(void) CPlane::Shutdown(); CTrain::Shutdown(); CScriptPaths::Shutdown(); - //CWaterCreatures::RemoveAll(); + CWaterCreatures::RemoveAll(); CSpecialFX::Shutdown(); CGarages::Shutdown(); CMovingThings::Shutdown(); @@ -663,9 +660,8 @@ void CGame::ReInitGameObjectVariables(void) CDraw::SetFOV(120.0f); CDraw::ms_fLODDistance = 500.0f; CStreaming::RequestBigBuildings(LEVEL_GENERIC); - CStreaming::RemoveIslandsNotUsed(LEVEL_INDUSTRIAL); - CStreaming::RemoveIslandsNotUsed(LEVEL_COMMERCIAL); - CStreaming::RemoveIslandsNotUsed(LEVEL_SUBURBAN); + CStreaming::RemoveIslandsNotUsed(LEVEL_BEACH); + CStreaming::RemoveIslandsNotUsed(LEVEL_MAINLAND); CStreaming::LoadAllRequestedModels(false); currArea = AREA_MAIN_MAP; CPed::Initialise(); @@ -751,7 +747,7 @@ void CGame::ShutDownForRestart(void) CRadar::RemoveRadarSections(); FrontEndMenuManager.UnloadTextures(); CParticleObject::RemoveAllExpireableParticleObjects(); - //CWaterCreatures::RemoveAll(); + CWaterCreatures::RemoveAll(); CSetPieces::Init(); CPedType::Shutdown(); CSpecialFX::Shutdown(); @@ -856,9 +852,9 @@ void CGame::Process(void) gameProcessPirateCheck = 2; } #endif - //uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond(); + uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond(); CStreaming::Update(); - //uint32 processTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond() - startTime; + uint32 processTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond() - startTime; CWindModifiers::Number = 0; if (!CTimer::GetIsPaused()) { @@ -897,20 +893,20 @@ void CGame::Process(void) CEventList::Update(); CParticle::Update(); gFireManager.Update(); - //if (processTime >= 2) { - // CPopulation::Update(false); - //} else { - // uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond(); + if (processTime >= 2) { + CPopulation::Update(false); + } else { + uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond(); CPopulation::Update(true); - // processTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond() - startTime; - //} + processTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond() - startTime; + } CWeapon::UpdateWeapons(); if (!CCutsceneMgr::IsRunning()) CTheCarGenerators::Process(); if (!CReplay::IsPlayingBack()) CCranes::UpdateCranes(); CClouds::Update(); - //CMovingThings::Update(); // TODO + CMovingThings::Update(); CWaterCannons::Update(); CUserDisplay::Process(); CReplay::Update(); @@ -941,7 +937,7 @@ void CGame::Process(void) if (!CReplay::IsPlayingBack()) { PUSH_MEMID(MEMID_CARS); - //if (processTime < 2) + if (processTime < 2) CCarCtrl::GenerateRandomCars(); CRoadBlocks::GenerateRoadBlocks(); CCarCtrl::RemoveDistantCars(); diff --git a/src/core/Game.h b/src/core/Game.h index dd14278..4052eb0 100644 --- a/src/core/Game.h +++ b/src/core/Game.h @@ -3,10 +3,8 @@ enum eLevelName { LEVEL_IGNORE = -1, // beware, this is only used in CPhysical's m_nZoneLevel LEVEL_GENERIC = 0, - LEVEL_INDUSTRIAL, - LEVEL_COMMERCIAL, - LEVEL_SUBURBAN, - LEVEL_UNDERGROUND, + LEVEL_BEACH, + LEVEL_MAINLAND, NUM_LEVELS }; @@ -80,4 +78,4 @@ public: static void ProcessTidyUpMemory(void); }; -inline bool IsAreaVisible(int area) { return true; } +inline bool IsAreaVisible(int area) { return area == CGame::currArea || area == AREA_EVERYWHERE; } diff --git a/src/core/IniFile.cpp b/src/core/IniFile.cpp index 3dd9886..b903353 100644 --- a/src/core/IniFile.cpp +++ b/src/core/IniFile.cpp @@ -8,7 +8,7 @@ #include "Population.h" float CIniFile::PedNumberMultiplier = 0.6f; -float CIniFile::CarNumberMultiplier = 0.8f; +float CIniFile::CarNumberMultiplier = 0.6f; void CIniFile::LoadIniFile() { @@ -25,5 +25,5 @@ void CIniFile::LoadIniFile() } CPopulation::MaxNumberOfPedsInUse = 25.0f * PedNumberMultiplier; CPopulation::MaxNumberOfPedsInUseInterior = 40.0f * PedNumberMultiplier; - CCarCtrl::MaxNumberOfCarsInUse = 30.0f * CarNumberMultiplier; + CCarCtrl::MaxNumberOfCarsInUse = 12.0f * CarNumberMultiplier; } \ No newline at end of file diff --git a/src/core/KeyGen.cpp b/src/core/KeyGen.cpp deleted file mode 100644 index c95ab4b..0000000 --- a/src/core/KeyGen.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include "common.h" -#include "KeyGen.h" -#include - -uint32 CKeyGen::keyTable[256] = -{ - 0, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D -}; - -uint32 -CKeyGen::GetKey(const char *str, int size) -{ - uint32 key = 0xffffffff; - for (int i = 0; i < size; i++) - key = keyTable[(key ^ str[i]) & 0xFF] ^ (key >> 8); - return key; -} - -uint32 -CKeyGen::GetKey(const char *str) -{ - uint32 key = 0xffffffff; - while(*str != '\0') - key = keyTable[(key ^ *(str++)) & 0xFF] ^ (key >> 8); - return key; -} - -uint32 -CKeyGen::GetUppercaseKey(const char *str) -{ - uint32 key = 0xffffffff; - while (*str != '\0') - key = keyTable[(key ^ toupper(*(str++))) & 0xFF] ^ (key >> 8); - return key; -} - -uint32 -CKeyGen::AppendStringToKey(uint32 key, const char *str) -{ - while (*str != '\0') - key = keyTable[(key ^ *(str++)) & 0xFF] ^ (key >> 8); - return key; -} \ No newline at end of file diff --git a/src/core/KeyGen.h b/src/core/KeyGen.h deleted file mode 100644 index 129859c..0000000 --- a/src/core/KeyGen.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -class CKeyGen -{ - static uint32 keyTable[256]; -public: - static uint32 GetKey(const char *str, int size); - static uint32 GetKey(const char *str); - static uint32 GetUppercaseKey(const char *str); - static uint32 AppendStringToKey(uint32 key, const char *str); -}; \ No newline at end of file diff --git a/src/core/Leeds.cpp b/src/core/Leeds.cpp deleted file mode 100644 index cda5060..0000000 --- a/src/core/Leeds.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "common.h" -#include "Leeds.h" - -void LoadResource(RpAtomic *atomic) {} -void LoadResource(RpClump *clump) {} - - -void SaveResource(RwTexture *tex, base::cRelocatableChunkWriter &writer) {} -void SaveResource(RwTexDictionary *txd, base::cRelocatableChunkWriter &writer) {} -void SaveResource(RpMaterial *mat, base::cRelocatableChunkWriter &writer) {} -void SaveResource(RpMaterialList *matlist, base::cRelocatableChunkWriter &writer) {} -void SaveResource(RpGeometry *geo, base::cRelocatableChunkWriter &writer) {} -void SaveResource(RpAtomic *atomic, base::cRelocatableChunkWriter &writer) {} -void SaveResource(RpClump *clump, base::cRelocatableChunkWriter &writer) {} diff --git a/src/core/Leeds.h b/src/core/Leeds.h deleted file mode 100644 index bf71d7e..0000000 --- a/src/core/Leeds.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -/* -PatchElementModelInfo(RslElement *,void *) -ChunkName(char const*) -DestroyAndFreeResourceImage(void) -WriteOrder(char const*) -UnpatchTextures(void) -IsChunked(int) -SaveResourceImage(void) -LoadResourceImage(void) -SaveResource(RslNode *,base::cRelocatableChunkWriter &) -SaveResource(RslTAnimTree *,base::cRelocatableChunkWriter &) -SaveResource(RslSkin *,base::cRelocatableChunkWriter &) -SaveResource(CAnimBlendTree *,base::cRelocatableChunkWriter &) -PatchElementTextures(RslElement *) -PatchElementGroupTextures(RslElementGroup *) -*/ - -void LoadResource(RpAtomic *atomic); -void LoadResource(RpClump *clump); - -/* -cRelocatableChunkWriterGTA::Save(char const*,uint,uint,bool) -cRelocatableChunkGTA::cRelocatableChunkGTA(char const*,uint,uint,bool) -SaveAnimBlock(int) -SaveModel(int,bool) -*/ - -void SaveResource(RwTexture *tex, base::cRelocatableChunkWriter &writer); -void SaveResource(RwTexDictionary *txd, base::cRelocatableChunkWriter &writer); -void SaveResource(RpMaterial *mat, base::cRelocatableChunkWriter &writer); -void SaveResource(RpMaterialList *matlist, base::cRelocatableChunkWriter &writer); -void SaveResource(RpGeometry *geo, base::cRelocatableChunkWriter &writer); -void SaveResource(RpAtomic *atomic, base::cRelocatableChunkWriter &writer); -void SaveResource(RpClump *clump, base::cRelocatableChunkWriter &writer); diff --git a/src/core/MenuScreensCustom.cpp b/src/core/MenuScreensCustom.cpp index cdfb3c8..0534e34 100644 --- a/src/core/MenuScreensCustom.cpp +++ b/src/core/MenuScreensCustom.cpp @@ -181,38 +181,6 @@ void IslandLoadingAfterChange(int8 before, int8 after) { } #endif -#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 - #ifndef MULTISAMPLING void GraphicsGoBack() { } @@ -471,11 +439,6 @@ CMenuScreenCustom aScreens[] = { MENUACTION_LANG_GER, "FEL_GER", {nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS}, 0, 0, MENUALIGN_CENTER, MENUACTION_LANG_ITA, "FEL_ITA", {nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS}, 0, 0, MENUALIGN_CENTER, MENUACTION_LANG_SPA, "FEL_SPA", {nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS}, 0, 0, MENUALIGN_CENTER, -#ifdef MORE_LANGUAGES - MENUACTION_CFO_DYNAMIC, "FEL_POL", { new CCFODynamic(nil, nil, nil, nil, LangPolSelect) }, 0, 0, MENUALIGN_CENTER, - MENUACTION_CFO_DYNAMIC, "FEL_RUS", { new CCFODynamic(nil, nil, nil, nil, LangRusSelect) }, 0, 0, MENUALIGN_CENTER - MENUACTION_CFO_DYNAMIC, "FEL_JAP", { new CCFODynamic(nil, nil, nil, nil, LangJapSelect) }, 0, 0, MENUALIGN_CENTER, -#endif MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, MENUALIGN_CENTER, }, diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index 86c218f..e75510e 100644 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -88,7 +88,6 @@ extern bool gbFastTime; extern bool gGravityCheat; #endif -/* LCS: removed void SpecialCarCheats() { if ( !CVehicle::bCheat9 ) @@ -137,7 +136,6 @@ void SpecialCarCheats() CPad::bHasPlayerCheated = true; } } -*/ void PickUpChicksCheat() { @@ -363,7 +361,7 @@ void ChangePlayerCheat() do { do { - modelId = CGeneral::GetRandomNumberInRange(0, MI_GANG18); + modelId = CGeneral::GetRandomNumberInRange(0, MI_PGA); anotherModelId = modelId+1; } while (!CModelInfo::GetModelInfo(anotherModelId)); } while (anotherModelId >= MI_SPECIAL01 && anotherModelId <= MI_SPECIAL04 || modelId == MI_TAXI_D); @@ -582,18 +580,16 @@ void SuicideCheat(void) { } void DoChicksWithGunsCheat(void) { -/* // broken in LCS CHud::SetHelpMessage(TheText.Get("CHEAT1"), true); CStreaming::SetModelIsDeletable(CGangs::GetGangPedModel1(GANG_PLAYER)); CStreaming::SetModelIsDeletable(CGangs::GetGangPedModel2(GANG_PLAYER)); CStreaming::SetModelTxdIsDeletable(CGangs::GetGangPedModel1(GANG_PLAYER)); CStreaming::SetModelTxdIsDeletable(CGangs::GetGangPedModel2(GANG_PLAYER)); CStreaming::RemoveCurrentZonesModels(); - CGangs::SetGangPedModels(GANG_PLAYER, MI_CAS_WOM, MI_HOS_WOM); + CGangs::SetGangPedModels(GANG_PLAYER, MI_HFYBE, MI_WFYBE); CGangs::SetGangWeapons(GANG_PLAYER, WEAPONTYPE_M4, WEAPONTYPE_M4); CStats::CheatedCount += 1000; CPad::bHasPlayerCheated = true; -*/ } ////////////////////////////////////////////////////////////////////////// @@ -1415,8 +1411,6 @@ void CPad::AddToPCCheatString(char c) KeyBoardCheatString[0] = ' '; BlackCarsCheat(); } -/* - // LCS: removed for now // "TRAVELINSTYLE" else if (!Cheat_strncmp(KeyBoardCheatString, "HQ`U`iLSFaNZ[")) { KeyBoardCheatString[0] = ' '; @@ -1512,7 +1506,6 @@ void CPad::AddToPCCheatString(char c) KeyBoardCheatString[0] = ' '; ChangePlayerModel("igdiaz"); } -*/ // DEEPFRIEDMARSBARS else if (!Cheat_strncmp(KeyBoardCheatString, "VWHC`mDTEPVZMpRK")) { KeyBoardCheatString[0] = ' '; @@ -1528,13 +1521,11 @@ void CPad::AddToPCCheatString(char c) KeyBoardCheatString[0] = ' '; BackToTheFuture(); } -/* LCS: removed // LOADSOFLITTLETHINGS else if (!Cheat_strncmp(KeyBoardCheatString, "VLUJUoHSU_VTMo`J]bV")) { KeyBoardCheatString[0] = ' '; SpecialCarCheats(); } -*/ // HOPINGIRL else if (!Cheat_strncmp(KeyBoardCheatString, "OWPH[dSVI")) { KeyBoardCheatString[0] = ' '; diff --git a/src/core/Pad.h b/src/core/Pad.h index 748482e..f141ed6 100644 --- a/src/core/Pad.h +++ b/src/core/Pad.h @@ -164,8 +164,6 @@ public: int32 LastTimeTouched; int32 AverageWeapon; int32 AverageEntries; - float unk_B4; - float unk_B8; #ifdef DETECT_PAD_INPUT_SWITCH static bool IsAffectedByController; @@ -277,16 +275,6 @@ public: uint32 InputHowLongAgo(void); void SetDrunkInputDelay(int32 delay) { DrunkDrivingBufferUsed = delay; } - // TODO(LCS): properly, this is just to get some estimation for script - int16 GetOddJobTrigger() { return GetRightShockJustDown(); } - int16 GuiLeft() { return GetAnaloguePadLeft() || GetDPadLeftJustDown(); } - int16 GuiRight() { return GetAnaloguePadRight() || GetDPadRightJustDown(); } - int16 GuiUp() { return GetAnaloguePadUp() || GetDPadUpJustDown(); } - int16 GuiDown() { return GetAnaloguePadDown() || GetDPadDownJustDown(); } - int16 GuiSelect() { return GetCrossJustDown(); } - int16 GuiBack() { return GetTriangleJustDown(); } - int16 GetSkipCutscene() { return GetCrossJustDown(); } - #ifdef XINPUT static int XInputJoy1; static int XInputJoy2; diff --git a/src/core/PlayerInfo.cpp b/src/core/PlayerInfo.cpp index 337d631..a64d4cc 100644 --- a/src/core/PlayerInfo.cpp +++ b/src/core/PlayerInfo.cpp @@ -418,10 +418,8 @@ CPlayerInfo::Process(void) CTimer::Update(); } m_bInRemoteMode = false; - if (CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle) { - CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->bRemoveFromWorld = true; - CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle = nil; - } + CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->bRemoveFromWorld = true; + CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle = nil; if (FindPlayerVehicle()) { FindPlayerVehicle()->SetStatus(STATUS_PLAYER); } diff --git a/src/core/Radar.cpp b/src/core/Radar.cpp index e17c01a..4bb9c96 100644 --- a/src/core/Radar.cpp +++ b/src/core/Radar.cpp @@ -55,7 +55,7 @@ CSprite2d CRadar::SpraySprite; CSprite2d CRadar::TShirtSprite; CSprite2d CRadar::TommySprite; CSprite2d CRadar::PhoneSprite; -/*CSprite2d CRadar::RadioWildstyleSprite; +CSprite2d CRadar::RadioWildstyleSprite; CSprite2d CRadar::RadioFlashSprite; CSprite2d CRadar::RadioKChatSprite; CSprite2d CRadar::RadioFeverSprite; @@ -63,39 +63,7 @@ CSprite2d CRadar::RadioVRockSprite; CSprite2d CRadar::RadioVCPRSprite; CSprite2d CRadar::RadioEspantosoSprite; CSprite2d CRadar::RadioEmotionSprite; -CSprite2d CRadar::RadioWaveSprite;*/ -CSprite2d CRadar::EightBallSprite; -CSprite2d CRadar::BurnerSprite; -CSprite2d CRadar::CiprianiSprite; -CSprite2d CRadar::DonaldSprite; -CSprite2d CRadar::JosephSprite; -CSprite2d CRadar::LeoneSprite; -CSprite2d CRadar::MariaSprite; -CSprite2d CRadar::McraySprite; -CSprite2d CRadar::ToshikoSprite; -CSprite2d CRadar::VincenzoSprite; -CSprite2d CRadar::BombSprite; -CSprite2d CRadar::ClothesShopSprite; -CSprite2d CRadar::PropertyRedSprite; -CSprite2d CRadar::PhilCassidySprite; -CSprite2d CRadar::PowerupSprite; -CSprite2d CRadar::MPBase; -CSprite2d CRadar::MPCheckPoint; -CSprite2d CRadar::MPPlayer; -CSprite2d CRadar::MPObjective; -CSprite2d CRadar::MPCar; -CSprite2d CRadar::MPTank; -CSprite2d CRadar::MPCarLockup; -CSprite2d CRadar::MPTargetPlayer; -CSprite2d CRadar::MapHereSprite0; -CSprite2d CRadar::MapHereSprite1; -CSprite2d CRadar::MapHereSprite2; -CSprite2d CRadar::MapHereSprite3; -CSprite2d CRadar::MapHereSprite4; -CSprite2d CRadar::MapHereSprite5; -CSprite2d CRadar::MapHereSprite6; -CSprite2d CRadar::MapHereSprite7; -CSprite2d CRadar::MapWayPoint; +CSprite2d CRadar::RadioWaveSprite; CSprite2d *CRadar::RadarSprites[RADAR_SPRITE_COUNT] = { nil, @@ -129,38 +97,15 @@ CSprite2d *CRadar::RadarSprites[RADAR_SPRITE_COUNT] = { &TShirtSprite, &TommySprite, &PhoneSprite, - &EightBallSprite, - &BurnerSprite, - &CiprianiSprite, - &DonaldSprite, - &JosephSprite, - &LeoneSprite, - &MariaSprite, - &McraySprite, - &ToshikoSprite, - &VincenzoSprite, - &BombSprite, - &ClothesShopSprite, - &PropertyRedSprite, - &PhilCassidySprite, - &PowerupSprite, - &MPBase, - &MPCheckPoint, - &MPPlayer, - &MPObjective, - &MPCar, - &MPTank, - &MPCarLockup, - &MPTargetPlayer, - &MapHereSprite0, - &MapHereSprite1, - &MapHereSprite2, - &MapHereSprite3, - &MapHereSprite4, - &MapHereSprite5, - &MapHereSprite6, - &MapHereSprite7, - &MapWayPoint, + &RadioWildstyleSprite, + &RadioFlashSprite, + &RadioKChatSprite, + &RadioFeverSprite, + &RadioVRockSprite, + &RadioVCPRSprite, + &RadioEspantosoSprite, + &RadioEmotionSprite, + &RadioWaveSprite }; // Why this doesn't coincide with world coordinates i don't know @@ -1076,7 +1021,7 @@ CRadar::LoadTextures() TShirtSprite.SetTexture("tshirt"); TommySprite.SetTexture("tommy"); PhoneSprite.SetTexture("phone"); - /*RadioWildstyleSprite.SetTexture("RWildstyle"); + RadioWildstyleSprite.SetTexture("RWildstyle"); RadioFlashSprite.SetTexture("RFlash"); RadioKChatSprite.SetTexture("RKchat"); RadioFeverSprite.SetTexture("RFever"); @@ -1084,39 +1029,7 @@ CRadar::LoadTextures() RadioVCPRSprite.SetTexture("RVCPR"); RadioEspantosoSprite.SetTexture("REspantoso"); RadioEmotionSprite.SetTexture("REmotion"); - RadioWaveSprite.SetTexture("RWave");*/ - EightBallSprite.SetTexture("radar_8Ball"); - BurnerSprite.SetTexture("radar_Burner"); - CiprianiSprite.SetTexture("radar_Cipriani"); - DonaldSprite.SetTexture("radar_Donald"); - JosephSprite.SetTexture("radar_Joseph"); - LeoneSprite.SetTexture("radar_Leone"); - MariaSprite.SetTexture("radar_Maria"); - McraySprite.SetTexture("radar_McRay"); - ToshikoSprite.SetTexture("radar_Toshiko"); - VincenzoSprite.SetTexture("radar_Vincenzo"); - BombSprite.SetTexture("radar_Bomb"); - ClothesShopSprite.SetTexture("radar_cShop"); - PropertyRedSprite.SetTexture("radar_propertyR"); - PhilCassidySprite.SetTexture("radar_flag"); - PowerupSprite.SetTexture("radar_powerup"); - MPBase.SetTexture("mp_base"); - MPCheckPoint.SetTexture("radar_mp_checkpoint"); - MPPlayer.SetTexture("mp_player"); - MPObjective.SetTexture("mp_objective"); - MPCar.SetTexture("mp_car"); - MPTank.SetTexture("mp_tank"); - MPCarLockup.SetTexture("mp_carlockup"); - MPTargetPlayer.SetTexture("mp_targetplayer"); - MapHereSprite0.SetTexture("radar_arrow"); - MapHereSprite1.SetTexture("radar_arrow_01"); - MapHereSprite2.SetTexture("radar_arrow_02"); - MapHereSprite3.SetTexture("radar_arrow_03"); - MapHereSprite4.SetTexture("radar_arrow_04"); - MapHereSprite5.SetTexture("radar_arrow_05"); - MapHereSprite6.SetTexture("radar_arrow_06"); - MapHereSprite7.SetTexture("radar_arrow_07"); - MapWayPoint.SetTexture("radar_player_target"); + RadioWaveSprite.SetTexture("RWave"); CTxdStore::PopCurrentTxd(); } @@ -1216,7 +1129,6 @@ void CRadar::SetRadarMarkerState(int32 counter, bool flag) } void CRadar::ShowRadarMarker(CVector pos, uint32 color, float radius) { - /* float f1 = radius * 1.4f; float f2 = radius * 0.5f; CVector p1, p2; @@ -1236,7 +1148,6 @@ void CRadar::ShowRadarMarker(CVector pos, uint32 color, float radius) { p1 = pos - TheCamera.GetRight()*f1; p2 = pos - TheCamera.GetRight()*f2; CTheScripts::ScriptDebugLine3D(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, color, color); - */ } void CRadar::ShowRadarTrace(float x, float y, uint32 size, uint8 red, uint8 green, uint8 blue, uint8 alpha) @@ -1304,39 +1215,7 @@ void CRadar::Shutdown() TShirtSprite.Delete(); TommySprite.Delete(); PhoneSprite.Delete(); - EightBallSprite.Delete(); - BurnerSprite.Delete(); - CiprianiSprite.Delete(); - DonaldSprite.Delete(); - JosephSprite.Delete(); - LeoneSprite.Delete(); - MariaSprite.Delete(); - McraySprite.Delete(); - ToshikoSprite.Delete(); - VincenzoSprite.Delete(); - BombSprite.Delete(); - ClothesShopSprite.Delete(); - PropertyRedSprite.Delete(); - PhilCassidySprite.Delete(); - PowerupSprite.Delete(); - MPBase.Delete(); - MPCheckPoint.Delete(); - MPPlayer.Delete(); - MPObjective.Delete(); - MPCar.Delete(); - MPTank.Delete(); - MPCarLockup.Delete(); - MPTargetPlayer.Delete(); - MapHereSprite0.Delete(); - MapHereSprite1.Delete(); - MapHereSprite2.Delete(); - MapHereSprite3.Delete(); - MapHereSprite4.Delete(); - MapHereSprite5.Delete(); - MapHereSprite6.Delete(); - MapHereSprite7.Delete(); - MapWayPoint.Delete(); - /*RadioWildstyleSprite.Delete(); + RadioWildstyleSprite.Delete(); RadioFlashSprite.Delete(); RadioKChatSprite.Delete(); RadioFeverSprite.Delete(); @@ -1344,7 +1223,7 @@ void CRadar::Shutdown() RadioVCPRSprite.Delete(); RadioEspantosoSprite.Delete(); RadioEmotionSprite.Delete(); - RadioWaveSprite.Delete();*/ + RadioWaveSprite.Delete(); RemoveRadarSections(); } @@ -1787,7 +1666,7 @@ CRadar::DrawLegend(int32 x, int32 y, int32 sprite) case RADAR_SPRITE_PHONE: text = TheText.Get("LG_25"); break; - /*case RADAR_SPRITE_RADIO_WILDSTYLE: + case RADAR_SPRITE_RADIO_WILDSTYLE: text = TheText.Get("LG_26"); break; case RADAR_SPRITE_RADIO_FLASH: @@ -1813,9 +1692,8 @@ CRadar::DrawLegend(int32 x, int32 y, int32 sprite) break; case RADAR_SPRITE_RADIO_WAVE: text = TheText.Get("LG_34"); - break;*/ + break; default: - text = TheText.Get("LG_34"); // tmp hack break; } CFont::PrintString(SCREEN_SCALE_X(20.f) + x, SCREEN_SCALE_Y(3.0f) + y, text); diff --git a/src/core/Radar.h b/src/core/Radar.h index 3e61f8d..0829dda 100644 --- a/src/core/Radar.h +++ b/src/core/Radar.h @@ -16,9 +16,9 @@ #define OBJECTBLIP_MARKER_COLOR_B 242 #define OBJECTBLIP_MARKER_COLOR_A 255 -#define COORDBLIP_MARKER_COLOR_R 255 -#define COORDBLIP_MARKER_COLOR_G 255 -#define COORDBLIP_MARKER_COLOR_B 128 +#define COORDBLIP_MARKER_COLOR_R 252 +#define COORDBLIP_MARKER_COLOR_G 138 +#define COORDBLIP_MARKER_COLOR_B 242 #define COORDBLIP_MARKER_COLOR_A 228 #define NUM_MAP_LEGENDS 75 @@ -83,38 +83,15 @@ enum eRadarSprite RADAR_SPRITE_TSHIRT, RADAR_SPRITE_TOMMY, RADAR_SPRITE_PHONE, - RADAR_SPRITE_EIGHTBALL, - RADAR_SPRITE_BURNER, - RADAR_SPRITE_CIPRIANI, - RADAR_SPRITE_DONALD, - RADAR_SPRITE_JOSEPH, - RADAR_SPRITE_LEONE, - RADAR_SPRITE_MARIA, - RADAR_SPRITE_MCRAY, - RADAR_SPRITE_TOSHIKO, - RADAR_SPRITE_VINCENZO, // tmp - RADAR_SPRITE_BOMB, - RADAR_SPRITE_CLOTHES, - RADAR_SPRITE_PROPERTY_RED, - RADAR_SPRITE_PHIL_CASSIDY, - RADAR_SPRITE_POWERUP, - RADAR_SPRITE_MPBASE, - RADAR_SPRITE_MPCHECKPOINT, - RADAR_SPRITE_MPPLAYER, - RADAR_SPRITE_MPOBJECTIVE, - RADAR_SPRITE_MPCAR, - RADAR_SPRITE_MPTANK, - RADAR_SPRITE_MPCARLOCKUP, - RADAR_SPRITE_MPTARGETPLAYER, - RADAR_SPRITE_MAPHERE0, - RADAR_SPRITE_MAPHERE1, - RADAR_SPRITE_MAPHERE2, - RADAR_SPRITE_MAPHERE3, - RADAR_SPRITE_MAPHERE4, - RADAR_SPRITE_MAPHERE5, - RADAR_SPRITE_MAPHERE6, - RADAR_SPRITE_MAPHERE7, - RADAR_SPRITE_MAPWAYPOINT, + RADAR_SPRITE_RADIO_WILDSTYLE, + RADAR_SPRITE_RADIO_FLASH, + RADAR_SPRITE_RADIO_KCHAT, + RADAR_SPRITE_RADIO_FEVER, + RADAR_SPRITE_RADIO_VROCK, + RADAR_SPRITE_RADIO_VCPR, + RADAR_SPRITE_RADIO_ESPANTOSO, + RADAR_SPRITE_RADIO_EMOTION, + RADAR_SPRITE_RADIO_WAVE, RADAR_SPRITE_COUNT }; @@ -237,7 +214,7 @@ public: static CSprite2d TShirtSprite; static CSprite2d TommySprite; static CSprite2d PhoneSprite; -/* static CSprite2d RadioWildstyleSprite; + static CSprite2d RadioWildstyleSprite; static CSprite2d RadioFlashSprite; static CSprite2d RadioKChatSprite; static CSprite2d RadioFeverSprite; @@ -245,39 +222,7 @@ public: static CSprite2d RadioVCPRSprite; static CSprite2d RadioEspantosoSprite; static CSprite2d RadioEmotionSprite; - static CSprite2d RadioWaveSprite;*/ - static CSprite2d EightBallSprite; - static CSprite2d BurnerSprite; - static CSprite2d CiprianiSprite; - static CSprite2d DonaldSprite; - static CSprite2d JosephSprite; - static CSprite2d LeoneSprite; - static CSprite2d MariaSprite; - static CSprite2d McraySprite; - static CSprite2d ToshikoSprite; - static CSprite2d VincenzoSprite; - static CSprite2d BombSprite; - static CSprite2d ClothesShopSprite; - static CSprite2d PropertyRedSprite; - static CSprite2d PhilCassidySprite; - static CSprite2d PowerupSprite; - static CSprite2d MPBase; - static CSprite2d MPCheckPoint; - static CSprite2d MPPlayer; - static CSprite2d MPObjective; - static CSprite2d MPCar; - static CSprite2d MPTank; - static CSprite2d MPCarLockup; - static CSprite2d MPTargetPlayer; - static CSprite2d MapHereSprite0; - static CSprite2d MapHereSprite1; - static CSprite2d MapHereSprite2; - static CSprite2d MapHereSprite3; - static CSprite2d MapHereSprite4; - static CSprite2d MapHereSprite5; - static CSprite2d MapHereSprite6; - static CSprite2d MapHereSprite7; - static CSprite2d MapWayPoint; + static CSprite2d RadioWaveSprite; static CSprite2d *RadarSprites[RADAR_SPRITE_COUNT]; static float cachedCos; static float cachedSin; diff --git a/src/core/Ropes.cpp b/src/core/Ropes.cpp index 52427fc..e390a91 100644 --- a/src/core/Ropes.cpp +++ b/src/core/Ropes.cpp @@ -1,5 +1,6 @@ #include "common.h" +#include "main.h" #include "Timer.h" #include "ModelIndices.h" #include "Streaming.h" @@ -91,9 +92,11 @@ void CRopes::Render(void) { int i; + PUSH_RENDERGROUP("CRopes::Render"); for(i = 0; i < ARRAY_SIZE(aRopes); i++) if(aRopes[i].m_bActive) aRopes[i].Render(); + POP_RENDERGROUP(); } bool diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index bff832c..b28a99f 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -37,7 +37,6 @@ #include "Font.h" #include "Frontend.h" #include "VarConsole.h" -#include "KeyGen.h" bool CStreaming::ms_disableStreaming; bool CStreaming::ms_bLoadingBigModel; @@ -77,16 +76,10 @@ size_t CStreaming::ms_memoryAvailable; int32 desiredNumVehiclesLoaded = 12; -CEntity *pIslandLODindustEntity; -CEntity *pIslandLODcomIndEntity; -CEntity *pIslandLODcomSubEntity; -CEntity *pIslandLODsubIndEntity; -CEntity *pIslandLODsubComEntity; -int32 islandLODindust; -int32 islandLODcomInd; -int32 islandLODcomSub; -int32 islandLODsubInd; -int32 islandLODsubCom; +CEntity *pIslandLODmainlandEntity; +CEntity *pIslandLODbeachEntity; +int32 islandLODmainland; +int32 islandLODbeach; #ifndef MASTER bool gbPrintStats; @@ -249,21 +242,12 @@ CStreaming::Init2(void) // find island LODs - pIslandLODindustEntity = nil; - pIslandLODcomIndEntity = nil; - pIslandLODcomSubEntity = nil; - pIslandLODsubIndEntity = nil; - pIslandLODsubComEntity = nil; - islandLODindust = -1; - islandLODcomInd = -1; - islandLODcomSub = -1; - islandLODsubInd = -1; - islandLODsubCom = -1; - CModelInfo::GetModelInfo("IslandLODInd", &islandLODindust); - CModelInfo::GetModelInfo("IslandLODcomIND", &islandLODcomInd); - CModelInfo::GetModelInfo("IslandLODcomSUB", &islandLODcomSub); - CModelInfo::GetModelInfo("IslandLODsubIND", &islandLODsubInd); - CModelInfo::GetModelInfo("IslandLODsubCOM", &islandLODsubCom); + pIslandLODmainlandEntity = nil; + pIslandLODbeachEntity = nil; + islandLODmainland = -1; + islandLODbeach = -1; + CModelInfo::GetModelInfo("IslandLODmainland", &islandLODmainland); + CModelInfo::GetModelInfo("IslandLODbeach", &islandLODbeach); #ifndef MASTER VarConsole.Add("Streaming Debug", &gbPrintStats, true); @@ -935,61 +919,65 @@ CStreaming::RequestIslands(eLevelName level) { ISLAND_LOADING_ISNT(HIGH) switch(level){ - case LEVEL_INDUSTRIAL: - RequestModel(islandLODcomInd, BIGBUILDINGFLAGS); - RequestModel(islandLODsubInd, BIGBUILDINGFLAGS); + case LEVEL_MAINLAND: + if(islandLODbeach != -1) + RequestModel(islandLODbeach, BIGBUILDINGFLAGS); break; - case LEVEL_COMMERCIAL: - RequestModel(islandLODindust, BIGBUILDINGFLAGS); - RequestModel(islandLODsubCom, BIGBUILDINGFLAGS); - break; - case LEVEL_SUBURBAN: - RequestModel(islandLODindust, BIGBUILDINGFLAGS); - RequestModel(islandLODcomSub, BIGBUILDINGFLAGS); + case LEVEL_BEACH: + if(islandLODmainland != -1) + RequestModel(islandLODmainland, BIGBUILDINGFLAGS); break; default: break; } } -const char *csPlayerNames[] = -{ - "csplr", - "csplr2", - "csplr3", - "csplr4", - "csplr5", - "csplr6", - "csplr7", - "csplr8", - "csplr9", - "csplr10", - "csplr11", - "csplr12", - "csplr13", - "csplr14", - "csplr15", - "csplr16", +static char *IGnames[] = { + "player", + "player2", + "player3", + "player4", + "player5", + "player6", + "player7", + "player8", + "player9", + "play10", + "play11", + "igken", + "igcandy", + "igsonny", + "igbuddy", + "igjezz", + "ighlary", + "igphil", + "igmerc", + "igdick", + "igdiaz", "" }; -const char* playerNames[] = -{ - "plr", - "plr2", - "plr3", - "plr4", - "plr5", - "plr6", - "plr7", - "plr8", - "plr9", - "plr10", - "plr11", - "plr12", - "plr13", - "plr14", - "plr15", - "plr16", +static char *CSnames[] = { + "csplay", + "csplay2", + "csplay3", + "csplay4", + "csplay5", + "csplay6", + "csplay7", + "csplay8", + "csplay9", + "csplay10", + "csplay11", + "csken", + "cscandy", + "cssonny", + "csbuddy", + "csjezz", + "cshlary", + "csphil", + "csmerc", + "csdick", + "csdiaz", "" }; @@ -1003,17 +991,15 @@ CStreaming::RequestSpecialModel(int32 modelId, const char *modelName, int32 flag int i, n; mi = CModelInfo::GetModelInfo(modelId); - if (CKeyGen::GetUppercaseKey(modelName) == CKeyGen::GetUppercaseKey("cstoni_a")) { - i = 0; - while (csPlayerNames[i][0] != '\0') { - if (CModelInfo::GetModelInfo(0)->GetNameHashKey() == CKeyGen::GetUppercaseKey(playerNames[i])) { - modelName = csPlayerNames[i]; + if(strncasecmp("CSPlay", modelName, 6) == 0){ + char *curname = CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName(); + for(int i = 0; CSnames[i][0]; i++){ + if(strcasecmp(curname, IGnames[i]) == 0){ + modelName = CSnames[i]; break; } - i++; } } - if(!CGeneral::faststrcmp(mi->GetModelName(), modelName)){ // Already have the correct name, just request it RequestModel(modelId, flags); @@ -1148,9 +1134,10 @@ CStreaming::RemoveModel(int32 id) void CStreaming::RemoveUnusedBuildings(eLevelName level) { - for(int i = LEVEL_INDUSTRIAL; i < NUM_LEVELS; i++) - if(level != i) - RemoveBuildings((eLevelName)i); + if(level != LEVEL_BEACH) + RemoveBuildings(LEVEL_BEACH); + if(level != LEVEL_MAINLAND) + RemoveBuildings(LEVEL_MAINLAND); } void @@ -1273,9 +1260,10 @@ CStreaming::RemoveUnusedBigBuildings(eLevelName level) { ISLAND_LOADING_IS(LOW) { - for(int i = LEVEL_INDUSTRIAL; i < NUM_LEVELS; i++) - if(level != i) - RemoveBuildings((eLevelName)i); + if(level != LEVEL_BEACH) + RemoveBigBuildings(LEVEL_BEACH); + if(level != LEVEL_MAINLAND) + RemoveBigBuildings(LEVEL_MAINLAND); } RemoveIslandsNotUsed(level); } @@ -1297,53 +1285,29 @@ void CStreaming::RemoveIslandsNotUsed(eLevelName level) { int i; - if(pIslandLODindustEntity == nil) + if(pIslandLODmainlandEntity == nil) for(i = CPools::GetBuildingPool()->GetSize()-1; i >= 0; i--){ CBuilding *building = CPools::GetBuildingPool()->GetSlot(i); if(building == nil) continue; - if(building->GetModelIndex() == islandLODindust) - pIslandLODindustEntity = building; - else if(building->GetModelIndex() == islandLODcomInd) - pIslandLODcomIndEntity = building; - else if(building->GetModelIndex() == islandLODcomSub) - pIslandLODcomSubEntity = building; - else if(building->GetModelIndex() == islandLODsubInd) - pIslandLODsubIndEntity = building; - else if(building->GetModelIndex() == islandLODsubCom) - pIslandLODsubComEntity = building; + if(building->GetModelIndex() == islandLODmainland) + pIslandLODmainlandEntity = building; + if(building->GetModelIndex() == islandLODbeach) + pIslandLODbeachEntity = building; } #ifdef NO_ISLAND_LOADING if(FrontEndMenuManager.m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_HIGH) { - DeleteIsland(pIslandLODindustEntity); - DeleteIsland(pIslandLODcomIndEntity); - DeleteIsland(pIslandLODcomSubEntity); - DeleteIsland(pIslandLODsubIndEntity); - DeleteIsland(pIslandLODsubComEntity); + DeleteIsland(pIslandLODmainlandEntity); + DeleteIsland(pIslandLODbeachEntity); } else #endif switch(level){ - case LEVEL_INDUSTRIAL: - DeleteIsland(pIslandLODindustEntity); - DeleteIsland(pIslandLODcomSubEntity); - DeleteIsland(pIslandLODsubComEntity); + case LEVEL_MAINLAND: + DeleteIsland(pIslandLODmainlandEntity); break; - case LEVEL_COMMERCIAL: - DeleteIsland(pIslandLODcomIndEntity); - DeleteIsland(pIslandLODcomSubEntity); - DeleteIsland(pIslandLODsubIndEntity); - break; - case LEVEL_SUBURBAN: - DeleteIsland(pIslandLODsubIndEntity); - DeleteIsland(pIslandLODsubComEntity); - DeleteIsland(pIslandLODcomIndEntity); - break; - default: - DeleteIsland(pIslandLODindustEntity); - DeleteIsland(pIslandLODcomIndEntity); - DeleteIsland(pIslandLODcomSubEntity); - DeleteIsland(pIslandLODsubIndEntity); - DeleteIsland(pIslandLODsubComEntity); + case LEVEL_BEACH: + DeleteIsland(pIslandLODbeachEntity); + break; } } @@ -1605,7 +1569,6 @@ CStreaming::IsObjectInCdImage(int32 id) void CStreaming::SetModelIsDeletable(int32 id) { - assert(id >= 0); // guard against fake IDs ms_aInfoForModel[id].m_flags &= ~STREAMFLAGS_DONT_REMOVE; if ((id >= STREAM_OFFSET_TXD && id < STREAM_OFFSET_COL || CModelInfo::GetModelInfo(id)->GetModelType() != MITYPE_VEHICLE) && (ms_aInfoForModel[id].m_flags & STREAMFLAGS_SCRIPTOWNED) == 0){ @@ -1684,11 +1647,11 @@ CStreaming::StreamVehiclesAndPeds(void) } if(FindPlayerPed()->m_pWanted->AreFbiRequired()){ - RequestModel(MI_FBICAR, STREAMFLAGS_DONT_REMOVE); + RequestModel(MI_FBIRANCH, STREAMFLAGS_DONT_REMOVE); RequestModel(MI_FBI, STREAMFLAGS_DONT_REMOVE); }else{ - SetModelIsDeletable(MI_FBICAR); - if(!HasModelLoaded(MI_FBICAR)) + SetModelIsDeletable(MI_FBIRANCH); + if(!HasModelLoaded(MI_FBIRANCH)) SetModelIsDeletable(MI_FBI); } @@ -1708,7 +1671,6 @@ CStreaming::StreamVehiclesAndPeds(void) else SetModelIsDeletable(MI_CHOPPER); -/* LCS: removed if (FindPlayerPed()->m_pWanted->AreMiamiViceRequired()) { SetModelIsDeletable(MI_VICE1); SetModelIsDeletable(MI_VICE2); @@ -1750,7 +1712,6 @@ CStreaming::StreamVehiclesAndPeds(void) SetModelIsDeletable(MI_VICE7); SetModelIsDeletable(MI_VICE8); } -*/ if(timeBeforeNextLoad >= 0) timeBeforeNextLoad--; @@ -3180,46 +3141,6 @@ CStreaming::LoadSceneCollision(const CVector &pos) CStreaming::LoadAllRequestedModels(false); } -//--LCS: TODO PSP and PS2 -// some things commented out that might be Rsl3D dependent -void CStreaming::RegisterPointer(void *ptr, int, bool) {} -RpAtomic *CStreaming::RegisterAtomic(RpAtomic *atomic, void *) -{ - return atomic; -} -void CStreaming::RegisterClump(RpClump *clump) -{ - RpClumpForAllAtomics(clump, RegisterAtomic, nil); -} -RpAtomic *CStreaming::RegisterInstance(RpAtomic *atomic, void *) -{ -// RegisterPointer(&atomic->geometry, 2, true); - return atomic; -} -void CStreaming::RegisterInstance(RpClump *clump) -{ - RpClumpForAllAtomics(clump, RegisterInstance, nil); -} - -void CStreaming::UnregisterPointer(void *ptr, int) {} -RpAtomic *CStreaming::UnregisterAtomic(RpAtomic *atomic, void *) -{ - return atomic; -} -void CStreaming::UnregisterClump(RpClump *clump) -{ - RpClumpForAllAtomics(clump, UnregisterAtomic, nil); -} -RpAtomic *CStreaming::UnregisterInstance(RpAtomic *atomic, void *) -{ -// UnregisterPointer(&atomic->geometry, 2); - return atomic; -} -void CStreaming::UnregisterInstance(RpClump *clump) -{ - RpClumpForAllAtomics(clump, UnregisterInstance, nil); -} - void CStreaming::MemoryCardSave(uint8 *buf, uint32 *size) { diff --git a/src/core/Streaming.h b/src/core/Streaming.h index 1ca4367..4ddf0b3 100644 --- a/src/core/Streaming.h +++ b/src/core/Streaming.h @@ -17,10 +17,7 @@ enum StreamFlags STREAMFLAGS_PRIORITY = 0x08, STREAMFLAGS_NOFADE = 0x10, STREAMFLAGS_20 = 0x20, // TODO(MIAMI): what's this - STREAMFLAGS_40 = 0x40, // TODO(LCS): what's this - STREAMFLAGS_AMBIENT_SCRIPT_OWNED = 0x80, - // TODO(LCS): STREAMFLAGS_AMBIENT_SCRIPT_OWNED in STREAMFLAGS_CANT_REMOVE? check CColStore STREAMFLAGS_CANT_REMOVE = STREAMFLAGS_DONT_REMOVE|STREAMFLAGS_SCRIPTOWNED, STREAMFLAGS_KEEP_IN_MEMORY = STREAMFLAGS_DONT_REMOVE|STREAMFLAGS_SCRIPTOWNED|STREAMFLAGS_DEPENDENCY, }; @@ -130,7 +127,6 @@ public: static bool HasColLoaded(int32 id) { return HasModelLoaded(id+STREAM_OFFSET_COL); } static bool HasAnimLoaded(int32 id) { return HasModelLoaded(id+STREAM_OFFSET_ANIM); } static bool CanRemoveModel(int32 id) { return (ms_aInfoForModel[id].m_flags & STREAMFLAGS_CANT_REMOVE) == 0; } - static bool IsScriptOwnedModel(int32 id) { return (ms_aInfoForModel[id].m_flags & STREAMFLAGS_SCRIPTOWNED); } static bool CanRemoveTxd(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_TXD); } static bool CanRemoveCol(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_COL); } static bool CanRemoveAnim(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_ANIM); } @@ -214,17 +210,6 @@ public: static void LoadScene(const CVector &pos); static void LoadSceneCollision(const CVector &pos); - static void RegisterPointer(void *ptr, int, bool); - static RpAtomic *RegisterAtomic(RpAtomic *atomic, void *); - static void RegisterClump(RpClump *clump); - static RpAtomic *RegisterInstance(RpAtomic *atomic, void *); - static void RegisterInstance(RpClump *clump); - static void UnregisterPointer(void *ptr, int); - static RpAtomic *UnregisterAtomic(RpAtomic *atomic, void *); - static void UnregisterClump(RpClump *clump); - static RpAtomic *UnregisterInstance(RpAtomic *atomic, void *); - static void UnregisterInstance(RpClump *clump); - static void MemoryCardSave(uint8 *buffer, uint32 *length); static void MemoryCardLoad(uint8 *buffer, uint32 length); @@ -232,10 +217,3 @@ public: static void PrintStreamingBufferState(); }; - -// LCS(TODO): put them into CStreaming::mspInst -extern int32 islandLODindust; -extern int32 islandLODcomInd; -extern int32 islandLODcomSub; -extern int32 islandLODsubInd; -extern int32 islandLODsubCom; diff --git a/src/core/World.cpp b/src/core/World.cpp index 1bf3611..2683a28 100644 --- a/src/core/World.cpp +++ b/src/core/World.cpp @@ -1788,35 +1788,56 @@ void CWorld::RepositionOneObject(CEntity *pEntity) { int16 modelId = pEntity->GetModelIndex(); - if (IsLightThatNeedsRepositioning(modelId) || IsTreeModel(modelId) || modelId == MI_PARKINGMETER || - modelId == MI_PHONEBOOTH1 || modelId == MI_WASTEBIN || modelId == MI_BIN || modelId == MI_POSTBOX1 || - modelId == MI_NEWSSTAND || modelId == MI_TRAFFICCONE || modelId == MI_DUMP1 || - modelId == MI_ROADWORKBARRIER1 || modelId == MI_BUSSIGN1 || modelId == MI_NOPARKINGSIGN1 || - modelId == MI_PHONESIGN || modelId == MI_TAXISIGN || modelId == MI_FISHSTALL01 || - modelId == MI_FISHSTALL02 || modelId == MI_FISHSTALL03 || modelId == MI_FISHSTALL04 || - modelId == MI_BAGELSTAND2 || modelId == MI_FIRE_HYDRANT || modelId == MI_BOLLARDLIGHT || - modelId == MI_PARKTABLE) { + if (modelId == MI_PARKINGMETER || modelId == MI_PHONEBOOTH1 || modelId == MI_WASTEBIN || + modelId == MI_BIN || modelId == MI_POSTBOX1 || modelId == MI_NEWSSTAND || modelId == MI_TRAFFICCONE || + modelId == MI_DUMP1 || modelId == MI_ROADWORKBARRIER1 || modelId == MI_BUSSIGN1 || modelId == MI_NOPARKINGSIGN1 || + modelId == MI_PHONESIGN || modelId == MI_FIRE_HYDRANT || modelId == MI_BOLLARDLIGHT || + modelId == MI_PARKTABLE || modelId == MI_PARKINGMETER2 || modelId == MI_TELPOLE02 || + modelId == MI_PARKBENCH || modelId == MI_BARRIER1 || IsTreeModel(modelId) + ) { CVector& position = pEntity->GetMatrix().GetPosition(); - float fBoundingBoxMinZ = pEntity->GetColModel()->boundingBox.min.z; + CColModel* pColModel = pEntity->GetColModel(); + float fBoundingBoxMinZ = pColModel->boundingBox.min.z; + float fHeight = pColModel->boundingBox.max.z - pColModel->boundingBox.min.z; + if (fHeight < OBJECT_REPOSITION_OFFSET_Z) fHeight = OBJECT_REPOSITION_OFFSET_Z; position.z = FindGroundZFor3DCoord(position.x, position.y, - position.z + OBJECT_REPOSITION_OFFSET_Z, nil) - - fBoundingBoxMinZ; + position.z + fHeight, nil) - + fBoundingBoxMinZ; pEntity->m_matrix.UpdateRW(); pEntity->UpdateRwFrame(); - } else if(modelId == MI_BUOY) { - float fWaterLevel = 0.0f; + } else if(IsLightThatNeedsRepositioning(modelId)) { + CVector position = pEntity->GetMatrix().GetPosition(); + CColModel* pColModel = pEntity->GetColModel(); + float fBoundingBoxMinZ = pColModel->boundingBox.min.z; + float fHeight = pColModel->boundingBox.max.z - pColModel->boundingBox.min.z; + if (fHeight < OBJECT_REPOSITION_OFFSET_Z) fHeight = OBJECT_REPOSITION_OFFSET_Z; + if (pColModel->numBoxes == 1) + position = pEntity->GetMatrix() * CVector( + (pColModel->boxes[0].min.x + pColModel->boxes[0].max.x) / 2, + (pColModel->boxes[0].min.y + pColModel->boxes[0].max.y) / 2, + pColModel->boxes[0].min.z); + else if (pColModel->numSpheres > 0) { + position.z = 1000.0f; + for (int i = 0; i < pColModel->numSpheres; i++) { + if (pColModel->spheres[i].center.z < position.z) + position = pColModel->spheres[i].center; + } + if (position.z < 1000.0f) + position = pEntity->GetMatrix() * position; + } + pEntity->GetMatrix().GetPosition().z = FindGroundZFor3DCoord(position.x, position.y, pEntity->GetMatrix().GetPosition().z + fHeight, nil) - fBoundingBoxMinZ; + pEntity->GetMatrix().UpdateRW(); + pEntity->UpdateRwFrame(); + + } + if(modelId == MI_BUOY) { bool bFound = true; const CVector &position = pEntity->GetPosition(); float fGroundZ = FindGroundZFor3DCoord(position.x, position.y, position.z + OBJECT_REPOSITION_OFFSET_Z, &bFound); - if(CWaterLevel::GetWaterLevelNoWaves(position.x, position.y, position.z + OBJECT_REPOSITION_OFFSET_Z, - &fWaterLevel)) { - if(!bFound || fWaterLevel > fGroundZ) { - CColModel *pColModel = pEntity->GetColModel(); - float fHeight = pColModel->boundingBox.max.z - pColModel->boundingBox.min.z; - pEntity->GetMatrix().GetPosition().z = 0.2f * fHeight + fWaterLevel - 0.5f * fHeight; - } - } + CColModel *pColModel = pEntity->GetColModel(); + float fHeight = pColModel->boundingBox.max.z - pColModel->boundingBox.min.z; + pEntity->GetMatrix().GetPosition().z = 0.2f * fHeight + 6.0f - 0.5f * fHeight; } } @@ -2133,8 +2154,8 @@ CWorld::TriggerExplosionSectorList(CPtrList &list, const CVector &position, floa } else { CVector pos = pEntity->GetPosition(); pos.z -= 0.5f; - CParticleObject::AddObject(POBJECT_FIRE_HYDRANT, pos, true); - CParticleObject::AddObject(POBJECT_FIRE_HYDRANT_STEAM, pos, true); + CParticleObject::AddObject(POBJECT_FIRE_HYDRANT, + pos, true); pObject->bHasBeenDamaged = true; } } diff --git a/src/core/World.h b/src/core/World.h index b75b6a6..81eb5d4 100644 --- a/src/core/World.h +++ b/src/core/World.h @@ -5,19 +5,19 @@ #include "PlayerInfo.h" #include "Collision.h" -/* Sectors span from -2000 to 2000 in x and y. - * With 100x100 sectors, each is 40x40 units. */ +/* Sectors span from -2400 to 1600 in x and -2000 to 2000 y. + * With 80x80 sectors, each is 50x50 units. */ -#define SECTOR_SIZE_X (40.0f) -#define SECTOR_SIZE_Y (40.0f) +#define SECTOR_SIZE_X (50.0f) +#define SECTOR_SIZE_Y (50.0f) -#define NUMSECTORS_X (100) -#define NUMSECTORS_Y (100) +#define NUMSECTORS_X (80) +#define NUMSECTORS_Y (80) #define WORLD_SIZE_X (NUMSECTORS_X * SECTOR_SIZE_X) #define WORLD_SIZE_Y (NUMSECTORS_Y * SECTOR_SIZE_Y) -#define WORLD_MIN_X (-2000.0f) +#define WORLD_MIN_X (-2400.0f) #define WORLD_MIN_Y (-2000.0f) #define WORLD_MAX_X (WORLD_MIN_X + WORLD_SIZE_X) diff --git a/src/core/Zones.cpp b/src/core/Zones.cpp index 09f50a2..85564f0 100644 --- a/src/core/Zones.cpp +++ b/src/core/Zones.cpp @@ -86,20 +86,20 @@ CTheZones::Init(void) TotalNumberOfInfoZones = 1; strcpy(InfoZoneArray[0].name, "CITYINF"); - InfoZoneArray[0].minx = -2000.0f; + InfoZoneArray[0].minx = -2400.0f; InfoZoneArray[0].miny = -2000.0f; InfoZoneArray[0].minz = -500.0f; - InfoZoneArray[0].maxx = 2000.0f; + InfoZoneArray[0].maxx = 1600.0f; InfoZoneArray[0].maxy = 2000.0f; InfoZoneArray[0].maxz = 500.0f; InfoZoneArray[0].level = LEVEL_GENERIC; InfoZoneArray[0].type = ZONE_INFO; strcpy(NavigationZoneArray[0].name, "VICE_C"); - NavigationZoneArray[0].minx = -2000.0f; + NavigationZoneArray[0].minx = -2400.0f; NavigationZoneArray[0].miny = -2000.0f; NavigationZoneArray[0].minz = -500.0f; - NavigationZoneArray[0].maxx = 2000.0f; + NavigationZoneArray[0].maxx = 1600.0f; NavigationZoneArray[0].maxy = 2000.0f; NavigationZoneArray[0].maxz = 500.0f; NavigationZoneArray[0].level = LEVEL_GENERIC; @@ -113,10 +113,10 @@ CTheZones::Init(void) } TotalNumberOfMapZones = 1; strcpy(MapZoneArray[0].name, "THEMAP"); - MapZoneArray[0].minx = -2000.0f; + MapZoneArray[0].minx = -2400.0f; MapZoneArray[0].miny = -2000.0f; MapZoneArray[0].minz = -500.0f; - MapZoneArray[0].maxx = 2000.0f; + MapZoneArray[0].maxx = 1600.0f; MapZoneArray[0].maxy = 2000.0f; MapZoneArray[0].maxz = 500.0f; MapZoneArray[0].level = LEVEL_GENERIC; diff --git a/src/core/common.h b/src/core/common.h index 268bc83..d39531c 100644 --- a/src/core/common.h +++ b/src/core/common.h @@ -115,8 +115,6 @@ typedef ptrdiff_t ssize_t; #endif #include "config.h" -#include "memoryManager.h" -#include "relocatableChunk.h" #include #include @@ -214,18 +212,6 @@ inline uint32 ldb(uint32 p, uint32 s, uint32 w) #define SCALE_AND_CENTER_X(x) SCREEN_STRETCH_X(x) #endif -// these are temp marcos while we don't implement all PSP UI coordinates -#define PSP_DEFAULT_SCREEN_WIDTH (480) -#define PSP_DEFAULT_SCREEN_HEIGHT (272) - -#define PSP_SCALE_TO_PS2_X(a) ((float)a * ((float)DEFAULT_SCREEN_WIDTH / (float)PSP_DEFAULT_SCREEN_WIDTH)) -#define PSP_SCALE_TO_PS2_Y(a) ((float)a * ((float)DEFAULT_SCREEN_HEIGHT / (float)PSP_DEFAULT_SCREEN_HEIGHT)) - -#define PSP_SCREEN_SCALE_X(a) ((a) * (float) SCREEN_WIDTH / PSP_DEFAULT_SCREEN_WIDTH) -#define PSP_SCREEN_SCALE_Y(a) ((a) * (float) SCREEN_WIDTH / PSP_DEFAULT_SCREEN_WIDTH) -#define PSP_SCREEN_SCALE_FROM_RIGHT(a) (SCREEN_WIDTH - PSP_SCREEN_SCALE_X(a)) -#define PSP_SCREEN_SCALE_FROM_BOTTOM(a) (SCREEN_HEIGHT - PSP_SCREEN_SCALE_Y(a)) - #include "maths.h" #include "Vector.h" #include "Vector2D.h" diff --git a/src/core/config.h b/src/core/config.h index 1d4bf57..6d30a65 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -10,15 +10,15 @@ enum Config { MAX_CDIMAGES = 8, // additional cdimages MAX_CDCHANNELS = 5, - MODELINFOSIZE = 6500, // only 4900 - TXDSTORESIZE = 1385, // only 1200 - COLSTORESIZE = 31, // only 15 + MODELINFOSIZE = 6500, // 4900 on PS2 + TXDSTORESIZE = 1385, + COLSTORESIZE = 31, EXTRADIRSIZE = 256, CUTSCENEDIRSIZE = 512, SIMPLEMODELSIZE = 3885, TIMEMODELSIZE = 385, - CLUMPMODELSIZE = 10, + CLUMPMODELSIZE = 5, WEAPONMODELSIZE = 37, PEDMODELSIZE = 130, VEHICLEMODELSIZE = 110, @@ -29,19 +29,19 @@ enum Config { NUMOBJECTINFO = 210, // Pool sizes - NUMPTRNODES = 50000, // only 30100 - NUMENTRYINFOS = 4000, - NUMPEDS = 140, // only 70 - NUMVEHICLES = 110, // only 70 - NUMBUILDINGS = 7000, // only 6757 - NUMTREADABLES = 1300, - NUMOBJECTS = 475, - NUMDUMMIES = 3000, + NUMPTRNODES = 50000, + NUMENTRYINFOS = 3200, + NUMPEDS = 140, + NUMVEHICLES = 110, + NUMBUILDINGS = 7000, + NUMTREADABLES = 1, + NUMOBJECTS = 460, + NUMDUMMIES = 2340, NUMAUDIOSCRIPTOBJECTS = 192, NUMCOLMODELS = 4400, NUMCUTSCENEOBJECTS = 50, // not a pool in VC - NUMANIMBLOCKS = 60, + NUMANIMBLOCKS = 35, NUMANIMATIONS = 450, NUMTEMPOBJECTS = 40, @@ -61,20 +61,20 @@ enum Config { NUMREFERENCES = 800, // Zones - NUMAUDIOZONES = 36, + NUMAUDIOZONES = 14, NUMINFOZONES = 169, - NUMMAPZONES = 110, - NUMNAVIGZONES = 70, + NUMMAPZONES = 39, + NUMNAVIGZONES = 20, // Cull zones - NUMATTRIBZONES = 900, + NUMATTRIBZONES = 704, NUMOCCLUSIONVOLUMES = 350, NUMACTIVEOCCLUDERS = 48, PATHNODESIZE = 4500, - NUMWEATHERS = 8, + NUMWEATHERS = 7, NUMHOURS = 24, NUMEXTRADIRECTIONALS = 4, @@ -100,7 +100,7 @@ enum Config { NUMPACMANPICKUPS = 256, NUMEVENTS = 64, - NUM_CARGENS = 500, + NUM_CARGENS = 185, NUM_PATH_NODES_IN_AUTOPILOT = 8, @@ -114,7 +114,7 @@ enum Config { NUM_WATERCANNONS = 3, NUMPEDROUTES = 200, - NUMPHONES = 60, + NUMPHONES = 50, NUMPEDGROUPS = 67, NUMMODELSPERPEDGROUP = 16, MAXZONEPEDSLOADED = 8, @@ -139,7 +139,7 @@ enum Config { NUM_GARAGE_STORED_CARS = 4, - NUM_CRANES = 11, + NUM_CRANES = 8, NUM_ESCALATORS = 22, NUM_WATER_CREATURES = 8, @@ -204,9 +204,6 @@ enum Config { //#define COMPRESSED_COL_VECTORS // use compressed vectors for collision vertices //#define ANIM_COMPRESSION // only keep most recently used anims uncompressed -#define GTA_TRAIN -#define GTA_BRIDGE - #if defined GTA_PS2 # define GTA_PS2_STUFF # define RANDOMSPLASH @@ -219,7 +216,7 @@ enum Config { # define PS2_MATFX # endif # define PC_PLAYER_CONTROLS // mouse player/cam mode -//# define GTA_REPLAY +# define GTA_REPLAY # define GTA_SCENE_EDIT #elif defined GTA_XBOX #endif @@ -235,7 +232,6 @@ enum Config { // not in master builds #define VALIDATE_SAVE_SIZE - #define NO_MOVIES // disable intro videos #define DEBUGMENU #endif @@ -249,11 +245,13 @@ enum Config { #endif #define FIX_BUGS // fixes bugs that we've came across during reversing. You can undefine this only on release builds. -//#define MORE_LANGUAGES // Add more translations to the game +#define MORE_LANGUAGES // Add more translations to the game #define COMPATIBLE_SAVES // this allows changing structs while keeping saves compatible #define LOAD_INI_SETTINGS // as the name suggests. fundamental for CUSTOM_FRONTEND_OPTIONS #define FIX_HIGH_FPS_BUGS_ON_FRONTEND +#define NO_MOVIES // add option to disable intro videos + #if defined(__LP64__) || defined(_WIN64) #define FIX_BUGS_64 // Must have fixes to be able to run 64 bit build #endif @@ -277,7 +275,7 @@ enum Config { #define USE_TXD_CDIMAGE // generate and load textures from txd.img #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 DISABLE_LOADING_SCREEN // disable the loading screen which vastly improves the loading time #define DISABLE_VSYNC_ON_TEXTURE_CONVERSION // make texture conversion work faster by disabling vsync #define ANISOTROPIC_FILTERING // set all textures to max anisotropic filtering //#define USE_TEXTURE_POOL @@ -297,7 +295,6 @@ enum Config { // Water & Particle // #define PC_WATER #define WATER_CHEATS -//#define PSP_WATERCANNON //#define USE_CUTSCENE_SHADOW_FOR_PED #define DISABLE_CUTSCENE_SHADOWS @@ -340,7 +337,7 @@ enum Config { # ifdef CUSTOM_FRONTEND_OPTIONS # define GRAPHICS_MENU_OPTIONS // otherwise Display settings will be scrollable -//# 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 CUTSCENE_BORDERS_SWITCH # define MULTISAMPLING // adds MSAA option # define INVERT_LOOK_FOR_PAD // enable the hidden option @@ -362,7 +359,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually #endif //#define SIMPLIER_MISSIONS // apply simplifications from mobile #define USE_ADVANCED_SCRIPT_DEBUG_OUTPUT -#define SCRIPT_LOG_FILE_LEVEL 1 // 0 == no log, 1 == overwrite every frame, 2 == full log +#define SCRIPT_LOG_FILE_LEVEL 0 // 0 == no log, 1 == overwrite every frame, 2 == full log #if SCRIPT_LOG_FILE_LEVEL == 0 #undef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT @@ -399,7 +396,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually // Audio #define RADIO_SCROLL_TO_PREV_STATION // Won't work without FIX_BUGS #define AUDIO_CACHE // cache sound lengths to speed up the cold boot -#define PS2_AUDIO_PATHS // changes audio paths for cutscenes and radio to PS2 paths (needs vbdec on MSS builds) +//#define PS2_AUDIO_PATHS // changes audio paths for cutscenes and radio to PS2 paths (needs vbdec on MSS builds) //#define AUDIO_OAL_USE_SNDFILE // use libsndfile to decode WAVs instead of our internal decoder #define AUDIO_OAL_USE_MPG123 // use mpg123 to support mp3 files diff --git a/src/core/main.cpp b/src/core/main.cpp index 53deeb7..a38fe72 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -81,20 +81,12 @@ GlobalScene Scene; -uint8 work_buff[102400]; +uint8 work_buff[55000]; char gString[256]; char gString2[512]; wchar gUString[256]; wchar gUString2[256]; -// leeds -bool gMakeResources = true; -bool gUseChunkFiles = false; -bool gSecondExportPass; -bool gUseModelResources; -bool gUseResources; -bool gNASTY_NASTY_MEM_SHUTDOWN_HACK; // rather unused - float FramesPerSecond = 30.0f; bool gbPrintShite = false; @@ -103,7 +95,10 @@ bool gbModelViewer; bool gbShowTimebars; #endif #ifdef DRAW_GAME_VERSION_TEXT -bool gDrawVersionText; // Our addition, we think it was always enabled on !MASTER builds +bool gbDrawVersionText; // Our addition, we think it was always enabled on !MASTER builds +#endif +#ifdef NO_MOVIES +bool gbNoMovies; #endif volatile int32 frameCount; @@ -113,7 +108,7 @@ RwRGBA gColourTop; bool gameAlreadyInitialised; float NumberOfChunksLoaded; -#define TOTALNUMCHUNKS 52.0f +#define TOTALNUMCHUNKS 95.0f bool g_SlowMode = false; char version_name[64]; @@ -140,7 +135,7 @@ bool gbPrintMemoryUsage; #endif #ifdef NEW_RENDERER -bool gbNewRenderer = true; +bool gbNewRenderer; #endif #ifdef FIX_BUGS // need to clear stencil for mblur fx. no idea why it works in the original game @@ -611,11 +606,11 @@ GetRandomSplashScreen(void) static char splashName[128]; static int splashIndex[12] = { 1, 2, - 3, 0, - 1, 2, - 3, 0, - 1, 2, - 3, 0 + 3, 4, + 5, 11, + 6, 8, + 9, 10, + 7, 12 }; index = splashIndex[2*index2 + CGeneral::GetRandomNumberInRange(0, 2)]; @@ -629,12 +624,11 @@ GetRandomSplashScreen(void) Const char* GetLevelSplashScreen(int level) { - static Const char *splashScreens[5] = { + static Const char *splashScreens[4] = { nil, "splash1", "splash2", "splash3", - "loadsc0", }; return splashScreens[level]; @@ -646,7 +640,6 @@ ResetLoadingScreenBar() NumberOfChunksLoaded = 0.0f; } -//--LCS: not the real thing void LoadingScreen(const char *str1, const char *str2, const char *splashscreen) { @@ -658,7 +651,7 @@ LoadingScreen(const char *str1, const char *str2, const char *splashscreen) #endif #ifndef RANDOMSPLASH - splashscreen = "SCEELEE"; + splashscreen = "LOADSC0"; #endif splash = LoadSplash(splashscreen); @@ -680,27 +673,24 @@ LoadingScreen(const char *str1, const char *str2, const char *splashscreen) NumberOfChunksLoaded += 1; #ifndef RANDOMSPLASH - // this looks nice float hpos = SCREEN_SCALE_X(40); float length = SCREEN_WIDTH - SCREEN_SCALE_X(80); - float top = SCREEN_HEIGHT - SCREEN_SCALE_Y(30); - float bottom = top + SCREEN_SCALE_Y(8); + float top = SCREEN_HEIGHT - SCREEN_SCALE_Y(14); + float bottom = top + SCREEN_SCALE_Y(5); #else - // should correspond to PS2 position - float hpos = SCREEN_STRETCH_X(44); - float length = SCREEN_STRETCH_X(176); - float top = SCREEN_STRETCH_Y(420); - float bottom = top + SCREEN_STRETCH_Y(8); + float hpos = SCREEN_STRETCH_X(40); + float length = SCREEN_STRETCH_X(440); + // this is rather weird + float top = SCREEN_STRETCH_Y(407.4f - 7.0f/3.0f); + float bottom = SCREEN_STRETCH_Y(407.4f + 7.0f/3.0f); #endif - CSprite2d::DrawRect(CRect(hpos+4.0f, top+6.0f, hpos+length+4.0f, bottom+6.0f), CRGBA(0, 0, 0, 200)); + CSprite2d::DrawRect(CRect(hpos-1.0f, top-1.0f, hpos+length+1.0f, bottom+1.0f), CRGBA(40, 53, 68, 255)); - CSprite2d::DrawRect(CRect(hpos, top, hpos+length, bottom), CRGBA(0, 0, 0, 255)); - - CSprite2d::DrawRect(CRect(hpos+1.0f, top+1.0f, hpos+length-1.0f, bottom-1.0f), CRGBA(99, 99, 99, 255)); + CSprite2d::DrawRect(CRect(hpos, top, hpos+length, bottom), CRGBA(155, 50, 125, 255)); length *= NumberOfChunksLoaded/TOTALNUMCHUNKS; - CSprite2d::DrawRect(CRect(hpos+1.0f, top+1.0f, hpos+length-1.0f, bottom-1.0f), CRGBA(126, 15, 0, 255)); + CSprite2d::DrawRect(CRect(hpos, top, hpos+length, bottom), CRGBA(255, 150, 225, 255)); // this is done by the game but is unused CFont::SetBackgroundOff(); @@ -715,7 +705,7 @@ LoadingScreen(const char *str1, const char *str2, const char *splashscreen) // my attempt static wchar tmpstr[80]; float yscale = SCREEN_SCALE_Y(0.9f); - top = bottom+5*yscale; + top -= 45*yscale; CFont::SetScale(SCREEN_SCALE_X(0.75f), yscale); CFont::SetPropOn(); CFont::SetRightJustifyOff(); @@ -736,13 +726,12 @@ LoadingScreen(const char *str1, const char *str2, const char *splashscreen) } } -//--LCS: slightly fixed void LoadingIslandScreen(const char *levelName) { CSprite2d *splash; - splash = LoadSplash(GetLevelSplashScreen(CGame::currLevel)); + splash = LoadSplash(nil); if(!DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 255)) return; @@ -1082,7 +1071,7 @@ DisplayGameDebugText() #ifdef DRAW_GAME_VERSION_TEXT wchar ver[200]; - if(gDrawVersionText) // This realtime switch is our thing + if(gbDrawVersionText) // This realtime switch is our thing { #ifdef USE_OUR_VERSIONING @@ -1238,10 +1227,10 @@ MattRenderScene(void) /// CWorld::AdvanceCurrentScanCode(); // CMattRenderer::ResetRenderStates /// CRenderer::ClearForFrame(); // before ConstructRenderList - CClock::CalcEnvMapTimeMultiplicator(); + // CClock::CalcEnvMapTimeMultiplicator RwRenderStateSet(rwRENDERSTATECULLMODE, (void*)rwCULLMODECULLNONE); CWaterLevel::RenderWater(); // actually CMattRenderer::RenderWater - CClock::ms_EnvMapTimeMultiplicator = 1.0f; + // CClock::ms_EnvMapTimeMultiplicator = 1.0f; // cWorldStream::ClearDynamics /// CRenderer::ConstructRenderList(); // before PreRender if(gbRenderWorld0) @@ -1254,8 +1243,6 @@ if(gbRenderWorld1) if(gbRenderRoads) CRenderer::RenderRoads(); - CRenderer::GenerateEnvironmentMap(); // should be after static shadows, but that's weird - CRenderer::RenderPeds(); // not sure where to put these since LCS has no underwater entities @@ -1277,6 +1264,7 @@ if(gbRenderEverythingBarRoads) void RenderScene_new(void) { + PUSH_RENDERGROUP("RenderScene_new"); CClouds::Render(); DoRWRenderHorizon(); @@ -1284,6 +1272,7 @@ RenderScene_new(void) DefinedState(); // CMattRenderer::ResetRenderStates // moved CRenderer::RenderBoats to before transparent water + POP_RENDERGROUP(); } // TODO @@ -1291,7 +1280,9 @@ bool FredIsInFirstPersonCam(void) { return false; } void RenderEffects_new(void) { + PUSH_RENDERGROUP("RenderEffects_new"); CShadows::RenderStaticShadows(); + // CRenderer::GenerateEnvironmentMap CShadows::RenderStoredShadows(); CSkidmarks::Render(); CRubbish::Render(); @@ -1334,6 +1325,7 @@ if(gbRenderFadingInEntities) CPointLights::RenderFogEffect(); CMovingThings::Render(); CRenderer::RenderFirstPersonVehicle(); + POP_RENDERGROUP(); } #endif @@ -1346,6 +1338,7 @@ RenderScene(void) return; } #endif + PUSH_RENDERGROUP("RenderScene"); CClouds::Render(); DoRWRenderHorizon(); CRenderer::RenderRoads(); @@ -1361,12 +1354,14 @@ RenderScene(void) RwRenderStateSet(rwRENDERSTATECULLMODE, (void*)rwCULLMODECULLNONE); CWeather::RenderRainStreaks(); CCoronas::RenderSunReflection(); + POP_RENDERGROUP(); } void RenderDebugShit(void) { - //CTheScripts::RenderTheScriptDebugLines(); + PUSH_RENDERGROUP("RenderDebugShit"); + CTheScripts::RenderTheScriptDebugLines(); #ifndef FINAL if(gbShowCollisionLines) CRenderer::RenderCollisionLines(); @@ -1374,6 +1369,7 @@ RenderDebugShit(void) CDebug::DrawLines(); DefinedState(); #endif + POP_RENDERGROUP(); } void @@ -1385,6 +1381,7 @@ RenderEffects(void) return; } #endif + PUSH_RENDERGROUP("RenderEffects"); CGlass::Render(); CWaterCannons::Render(); CSpecialFX::Render(); @@ -1401,11 +1398,13 @@ RenderEffects(void) CPointLights::RenderFogEffect(); CMovingThings::Render(); CRenderer::RenderFirstPersonVehicle(); + POP_RENDERGROUP(); } void Render2dStuff(void) { + PUSH_RENDERGROUP("Render2dStuff"); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); @@ -1477,6 +1476,7 @@ Render2dStuff(void) #ifdef DEBUGMENU DebugMenuRender(); #endif + POP_RENDERGROUP(); } void @@ -1484,7 +1484,9 @@ RenderMenus(void) { if (FrontEndMenuManager.m_bMenuActive) { + PUSH_RENDERGROUP("RenderMenus"); FrontEndMenuManager.DrawFrontEnd(); + POP_RENDERGROUP(); } #ifndef MASTER else @@ -1495,6 +1497,7 @@ RenderMenus(void) void Render2dStuffAfterFade(void) { + PUSH_RENDERGROUP("Render2dStuffAfterFade"); #ifndef MASTER DisplayGameDebugText(); #endif @@ -1505,6 +1508,7 @@ Render2dStuffAfterFade(void) CHud::DrawAfterFade(); CFont::DrawFonts(); CCredits::Render(); + POP_RENDERGROUP(); } void diff --git a/src/core/main.h b/src/core/main.h index 8e4123f..803afb1 100644 --- a/src/core/main.h +++ b/src/core/main.h @@ -1,5 +1,16 @@ #pragma once +#ifndef FINAL +// defined in RwHelpder.cpp +void PushRendergroup(const char *name); +void PopRendergroup(void); +#define PUSH_RENDERGROUP(str) PushRendergroup(str) +#define POP_RENDERGROUP() PopRendergroup() +#else +#define PUSH_RENDERGROUP(str) +#define POP_RENDERGROUP() +#endif + struct GlobalScene { RpWorld *world; @@ -7,7 +18,7 @@ struct GlobalScene }; extern GlobalScene Scene; -extern uint8 work_buff[102400]; +extern uint8 work_buff[55000]; extern char gString[256]; extern char gString2[512]; extern wchar gUString[256]; @@ -24,14 +35,6 @@ extern bool gbShowTimebars; extern bool gbPrintMemoryUsage; #endif -// leeds -extern bool gMakeResources; -extern bool gUseChunkFiles; -extern bool gSecondExportPass; -extern bool gUseModelResources; -extern bool gUseResources; -extern bool gNASTY_NASTY_MEM_SHUTDOWN_HACK; - class CSprite2d; bool DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha); @@ -63,3 +66,11 @@ void SaveINIControllerSettings(); extern bool gbNewRenderer; bool FredIsInFirstPersonCam(void); #endif + +#ifdef DRAW_GAME_VERSION_TEXT +extern bool gbDrawVersionText; +#endif + +#ifdef NO_MOVIES +extern bool gbNoMovies; +#endif diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 3d077ba..0ce7f83 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -90,32 +90,99 @@ mysrand(unsigned int seed) #ifdef CUSTOM_FRONTEND_OPTIONS #include "frontendoption.h" + + +#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 + void CustomFrontendOptionsPopulate(void) { // Moved to an array in MenuScreensCustom.cpp, but APIs are still available. see frontendoption.h + int fd; // These work only if we have neo folder, so they're dynamically added #ifdef EXTENDED_PIPELINES - const char *pipelineNames[] = { "FED_PSP", "FED_PS2","FED_MOB" }; + const char *vehPipelineNames[] = { "FED_MFX", "FED_NEO" }; const char *off_on[] = { "FEM_OFF", "FEM_ON" }; - int fd = CFileMgr::OpenFile("neo/neo.txd","r"); + fd = CFileMgr::OpenFile("neo/neo.txd","r"); if (fd) { #ifdef GRAPHICS_MENU_OPTIONS FrontendOptionSetCursor(MENUPAGE_GRAPHICS_SETTINGS, -3, false); - FrontendOptionAddSelect("FED_VPL", 0, 0, MENUALIGN_LEFT, pipelineNames, ARRAY_SIZE(pipelineNames), (int8*)&CustomPipes::VehiclePipeSwitch, false, nil, "Graphics", "VehiclePipeline"); - FrontendOptionAddSelect("FED_WPL", 0, 0, MENUALIGN_LEFT, pipelineNames, ARRAY_SIZE(pipelineNames), (int8*)&CustomPipes::WorldPipeSwitch, false, nil, "Graphics", "WorldPipeline"); + FrontendOptionAddSelect("FED_VPL", 0, 0, MENUALIGN_LEFT, vehPipelineNames, ARRAY_SIZE(vehPipelineNames), (int8*)&CustomPipes::VehiclePipeSwitch, false, nil, "Graphics", "VehiclePipeline"); + FrontendOptionAddSelect("FED_PRM", 0, 0, MENUALIGN_LEFT, off_on, 2, (int8*)&CustomPipes::RimlightEnable, false, nil, "Graphics", "NeoRimLight"); FrontendOptionAddSelect("FED_WLM", 0, 0, MENUALIGN_LEFT, off_on, 2, (int8*)&CustomPipes::LightmapEnable, false, nil, "Graphics", "NeoLightMaps"); FrontendOptionAddSelect("FED_RGL", 0, 0, MENUALIGN_LEFT, off_on, 2, (int8*)&CustomPipes::GlossEnable, false, nil, "Graphics", "NeoRoadGloss"); #else FrontendOptionSetCursor(MENUPAGE_DISPLAY_SETTINGS, -3, false); - FrontendOptionAddSelect("FED_VPL", 0, 0, MENUALIGN_LEFT, pipelineNames, ARRAY_SIZE(pipelineNames), (int8*)&CustomPipes::VehiclePipeSwitch, false, nil, "Graphics", "VehiclePipeline"); - FrontendOptionAddSelect("FED_WPL", 0, 0, MENUALIGN_LEFT, pipelineNames, ARRAY_SIZE(pipelineNames), (int8*)&CustomPipes::WorldPipeSwitch, false, nil, "Graphics", "WorldPipeline"); + FrontendOptionAddSelect("FED_VPL", 0, 0, MENUALIGN_LEFT, vehPipelineNames, ARRAY_SIZE(vehPipelineNames), (int8*)&CustomPipes::VehiclePipeSwitch, false, nil, "Graphics", "VehiclePipeline"); + FrontendOptionAddSelect("FED_PRM", 0, 0, MENUALIGN_LEFT, off_on, 2, (int8*)&CustomPipes::RimlightEnable, false, nil, "Graphics", "NeoRimLight"); FrontendOptionAddSelect("FED_WLM", 0, 0, MENUALIGN_LEFT, off_on, 2, (int8*)&CustomPipes::LightmapEnable, false, nil, "Graphics", "NeoLightMaps"); FrontendOptionAddSelect("FED_RGL", 0, 0, MENUALIGN_LEFT, off_on, 2, (int8*)&CustomPipes::GlossEnable, false, nil, "Graphics", "NeoRoadGloss"); #endif CFileMgr::CloseFile(fd); } +#endif + // Add outsourced language translations, if files are found +#ifdef MORE_LANGUAGES + int fd2; + FrontendOptionSetCursor(MENUPAGE_LANGUAGE_SETTINGS, 5, false); +#if 0 + if (fd = CFileMgr::OpenFile("text/polish.gxt")) { + if (fd2 = CFileMgr::OpenFile("models/fonts_p.txd")) { + FrontendOptionAddDynamic("FEL_POL", 0, 0, MENUALIGN_CENTER, nil, nil, LangPolSelect, nil, nil); + CFileMgr::CloseFile(fd2); + } + CFileMgr::CloseFile(fd); + } +#endif + + if (fd = CFileMgr::OpenFile("text/russian.gxt")) { + if (fd2 = CFileMgr::OpenFile("models/fonts_r.txd")) { + FrontendOptionAddDynamic("FEL_RUS", 0, 0, MENUALIGN_CENTER, nil, nil, LangRusSelect, nil, nil); + CFileMgr::CloseFile(fd2); + } + CFileMgr::CloseFile(fd); + } + +#if 0 + if (fd = CFileMgr::OpenFile("text/japanese.gxt")) { + if (fd2 = CFileMgr::OpenFile("models/fonts_j.txd")) { + FrontendOptionAddDynamic("FEL_JAP", 0, 0, MENUALIGN_CENTER, nil, nil, LangJapSelect, nil, nil); + CFileMgr::CloseFile(fd2); + } + CFileMgr::CloseFile(fd); + } +#endif #endif } @@ -396,12 +463,12 @@ void SaveINIControllerSettings() #endif #endif StoreIni("Controller", "PadButtonsInited", ControlsManager.ms_padButtonsInited); - cfg.write_file("reLCS.ini"); + cfg.write_file("reVC.ini"); } bool LoadINISettings() { - if (!cfg.load_file("reLCS.ini")) + if (!cfg.load_file("reVC.ini")) return false; #ifdef IMPROVED_VIDEOMODE @@ -466,8 +533,10 @@ bool LoadINISettings() ReadIniIfExists("Draw", "FixSprites", &CDraw::ms_bFixSprites); #endif #ifdef DRAW_GAME_VERSION_TEXT - extern bool gDrawVersionText; - ReadIniIfExists("General", "DrawVersionText", &gDrawVersionText); + ReadIniIfExists("General", "DrawVersionText", &gbDrawVersionText); +#endif +#ifdef NO_MOVIES + ReadIniIfExists("General", "NoMovies", &gbNoMovies); #endif #ifdef CUSTOM_FRONTEND_OPTIONS @@ -563,8 +632,10 @@ void SaveINISettings() StoreIni("Draw", "FixSprites", CDraw::ms_bFixSprites); #endif #ifdef DRAW_GAME_VERSION_TEXT - extern bool gDrawVersionText; - StoreIni("General", "DrawVersionText", gDrawVersionText); + StoreIni("General", "DrawVersionText", gbDrawVersionText); +#endif +#ifdef NO_MOVIES + StoreIni("General", "NoMovies", gbNoMovies); #endif #ifdef CUSTOM_FRONTEND_OPTIONS for (int i = 0; i < MENUPAGES; i++) { @@ -581,7 +652,7 @@ void SaveINISettings() } #endif - cfg.write_file("reLCS.ini"); + cfg.write_file("reVC.ini"); } #endif @@ -611,6 +682,7 @@ void FastWeatherCheat(); void OnlyRenderWheelsCheat(); void ChittyChittyBangBangCheat(); void StrongGripCheat(); +void SpecialCarCheats(); void PickUpChicksCheat(); DebugMenuEntry *carCol1; @@ -729,15 +801,17 @@ SwitchToMission(void) #endif static const char *carnames[] = { - "spider", "landstal", "idaho", "stinger", "linerun", "peren", "sentinel", "patriot", "firetruk", "trash", "stretch", - "manana", "infernus", "blista", "pony", "mule", "cheetah", "ambulan", "fbicar", "moonbeam", "esperant", "taxi", - "kuruma", "bobcat", "mrwhoop", "bfinject", "hearse", "police", "enforcer", "securica", "banshee", "bus", "rhino", - "barracks", "dodo", "coach", "cabbie", "stallion", "rumpo", "rcbandit", "bellyup", "mrwongs", "mafia", "yardie", - "yakuza", "diablos", "columb", "hoods", "panlant", "flatbed", "yankee", "borgnine", "toyz", "campvan", "ballot", - "shelby", "pontiac", "esprit", "ammotruk", "hotrod", "Sindacco_Car", "Forelli_Car", "ferry", "ghost", "speeder", - "reefer", "predator", "train", "escape", "chopper", "airtrain", "deaddodo", "angel", "pizzaboy", "noodleboy", - "pcj600", "faggio", "freeway", "angel2", "sanchez2", "sanchez", "rcgoblin", "rcraider", "hunter", "maverick", - "polmav", "vcnmav" + "landstal", "idaho", "stinger", "linerun", "peren", "sentinel", "rio", "firetruk", "trash", "stretch", "manana", + "infernus", "voodoo", "pony", "mule", "cheetah", "ambulan", "fbicar", "moonbeam", "esperant", "taxi", "washing", + "bobcat", "mrwhoop", "bfinject", "hunter", "police", "enforcer", "securica", "banshee", "predator", "bus", + "rhino", "barracks", "cuban", "chopper", "angel", "coach", "cabbie", "stallion", "rumpo", "rcbandit", "romero", + "packer", "sentxs", "admiral", "squalo", "seaspar", "pizzaboy", "gangbur", "airtrain", "deaddodo", "speeder", + "reefer", "tropic", "flatbed", "yankee", "caddy", "zebra", "topfun", "skimmer", "pcj600", "faggio", "freeway", + "rcbaron", "rcraider", "glendale", "oceanic", "sanchez", "sparrow", "patriot", "lovefist", "coastg", "dinghy", + "hermes", "sabre", "sabretur", "pheonix", "walton", "regina", "comet", "deluxo", "burrito", "spand", "marquis", + "baggage", "kaufman", "maverick", "vcnmav", "rancher", "fbiranch", "virgo", "greenwoo", "jetmax", "hotring", + "sandking", "blistac", "polmav", "boxville", "benson", "mesa", "rcgoblin", "hotrina", "hotrinb", + "bloodra", "bloodrb", "vicechee" }; static CTweakVar** TweakVarsList; @@ -867,10 +941,11 @@ DebugMenuPopulate(void) DebugMenuAddCmd("Cheats", "Only render wheels", OnlyRenderWheelsCheat); DebugMenuAddCmd("Cheats", "Chitty chitty bang bang", ChittyChittyBangBangCheat); DebugMenuAddCmd("Cheats", "Strong grip", StrongGripCheat); + DebugMenuAddCmd("Cheats", "Special car", SpecialCarCheats); DebugMenuAddCmd("Cheats", "Pickup chicks", PickUpChicksCheat); static int spawnCarId = MI_LANDSTAL; - e = DebugMenuAddVar("Spawn", "Spawn Car ID", &spawnCarId, nil, 1, MI_SPIDER, MI_VCNMAV, carnames); + e = DebugMenuAddVar("Spawn", "Spawn Car ID", &spawnCarId, nil, 1, MI_LANDSTAL, MI_VICECHEE, carnames); DebugMenuEntrySetWrap(e, true); DebugMenuAddCmd("Spawn", "Spawn Car", [](){ if(spawnCarId == MI_CHOPPER || @@ -885,19 +960,22 @@ DebugMenuPopulate(void) DebugMenuAddCmd("Spawn", "Spawn Stinger", [](){ SpawnCar(MI_STINGER); }); DebugMenuAddCmd("Spawn", "Spawn Infernus", [](){ SpawnCar(MI_INFERNUS); }); DebugMenuAddCmd("Spawn", "Spawn Cheetah", [](){ SpawnCar(MI_CHEETAH); }); - DebugMenuAddCmd("Spawn", "Spawn Esprit", [](){ SpawnCar(MI_ESPRIT); }); + DebugMenuAddCmd("Spawn", "Spawn Phoenix", [](){ SpawnCar(MI_PHEONIX); }); DebugMenuAddCmd("Spawn", "Spawn Banshee", [](){ SpawnCar(MI_BANSHEE); }); DebugMenuAddCmd("Spawn", "Spawn Esperanto", [](){ SpawnCar(MI_ESPERANT); }); DebugMenuAddCmd("Spawn", "Spawn Stallion", [](){ SpawnCar(MI_STALLION); }); - DebugMenuAddCmd("Spawn", "Spawn Mafia", [](){ SpawnCar(MI_MAFIA); }); - DebugMenuAddCmd("Spawn", "Spawn Kuruma", [](){ SpawnCar(MI_KURUMA); }); + DebugMenuAddCmd("Spawn", "Spawn Admiral", [](){ SpawnCar(MI_ADMIRAL); }); + DebugMenuAddCmd("Spawn", "Spawn Washington", [](){ SpawnCar(MI_WASHING); }); DebugMenuAddCmd("Spawn", "Spawn Taxi", [](){ SpawnCar(MI_TAXI); }); DebugMenuAddCmd("Spawn", "Spawn Police", [](){ SpawnCar(MI_POLICE); }); DebugMenuAddCmd("Spawn", "Spawn Enforcer", [](){ SpawnCar(MI_ENFORCER); }); - DebugMenuAddCmd("Spawn", "Spawn Diablo", [](){ SpawnCar(MI_DIABLOS); }); - DebugMenuAddCmd("Spawn", "Spawn Yardie", [](){ SpawnCar(MI_YARDIE); }); + DebugMenuAddCmd("Spawn", "Spawn Cuban", [](){ SpawnCar(MI_CUBAN); }); + DebugMenuAddCmd("Spawn", "Spawn Voodoo", [](){ SpawnCar(MI_VOODOO); }); DebugMenuAddCmd("Spawn", "Spawn BF injection", [](){ SpawnCar(MI_BFINJECT); }); DebugMenuAddCmd("Spawn", "Spawn Maverick", [](){ SpawnCar(MI_MAVERICK); }); + DebugMenuAddCmd("Spawn", "Spawn VCN Maverick", [](){ SpawnCar(MI_VCNMAV); }); + DebugMenuAddCmd("Spawn", "Spawn Sparrow", [](){ SpawnCar(MI_SPARROW); }); + DebugMenuAddCmd("Spawn", "Spawn Sea Sparrow", [](){ SpawnCar(MI_SEASPAR); }); DebugMenuAddCmd("Spawn", "Spawn Hunter", [](){ SpawnCar(MI_HUNTER); }); DebugMenuAddCmd("Spawn", "Spawn Rhino", [](){ SpawnCar(MI_RHINO); }); DebugMenuAddCmd("Spawn", "Spawn Firetruck", [](){ SpawnCar(MI_FIRETRUCK); }); @@ -905,9 +983,10 @@ DebugMenuPopulate(void) DebugMenuAddCmd("Spawn", "Spawn PCJ 600", [](){ SpawnCar(MI_PCJ600); }); DebugMenuAddCmd("Spawn", "Spawn Faggio", [](){ SpawnCar(MI_FAGGIO); }); DebugMenuAddCmd("Spawn", "Spawn Freeway", [](){ SpawnCar(MI_FREEWAY); }); + DebugMenuAddCmd("Spawn", "Spawn Squalo", [](){ SpawnCar(MI_SQUALO); }); + DebugMenuAddCmd("Spawn", "Spawn Skimmer", [](){ SpawnCar(MI_SKIMMER); }); DebugMenuAddVarBool8("Render", "Draw hud", &CHud::m_Wants_To_Draw_Hud, nil); - DebugMenuAddVar("Render", "Brightness", &FrontEndMenuManager.m_PrefsBrightness, nil, 16, 0, 700, nil); #ifdef PROPER_SCALING DebugMenuAddVarBool8("Render", "Proper Scaling", &CDraw::ms_bProperScaling, nil); #endif @@ -947,8 +1026,8 @@ extern bool gbRenderWorld2; #endif #ifdef EXTENDED_COLOURFILTER - static const char *filternames[] = { "None", "PSP", "PS2" }; - e = DebugMenuAddVar("Render", "Colourfilter", &CPostFX::EffectSwitch, nil, 1, CPostFX::POSTFX_OFF, CPostFX::POSTFX_PS2, filternames); + 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); @@ -959,25 +1038,18 @@ extern bool gbRenderWorld2; DebugMenuAddVarBool8("Render", "Occlusion debug", &bDispayOccDebugStuff, nil); #endif #ifdef EXTENDED_PIPELINES - static const char *worldpipenames[] = { "PSP", "PS2", "Mobile" }; - e = DebugMenuAddVar("Render", "World Rendering", &CustomPipes::WorldPipeSwitch, nil, - 1, CustomPipes::WORLDPIPE_PSP, CustomPipes::WORLDPIPE_MOBILE, worldpipenames); - DebugMenuEntrySetWrap(e, true); - static const char *vehpipenames[] = { "PSP", "PS2", "Mobile" }; + static const char *vehpipenames[] = { "MatFX", "Neo" }; e = DebugMenuAddVar("Render", "Vehicle Pipeline", &CustomPipes::VehiclePipeSwitch, nil, - 1, CustomPipes::VEHICLEPIPE_PSP, CustomPipes::VEHICLEPIPE_MOBILE, vehpipenames); + 1, CustomPipes::VEHICLEPIPE_MATFX, CustomPipes::VEHICLEPIPE_NEO, vehpipenames); DebugMenuEntrySetWrap(e, true); - DebugMenuAddVarBool8("Render", "Glass Cars cheat", &CustomPipes::gGlassCarsCheat, nil); -extern bool gbRenderDebugEnvMap; - DebugMenuAddVarBool8("Render", "Show Env map", &gbRenderDebugEnvMap, nil); -// 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 Vehicle Shininess", &CustomPipes::VehicleShininess, nil, 0.1f, 0, 1.0f); + DebugMenuAddVar("Render", "Neo Vehicle Specularity", &CustomPipes::VehicleSpecularity, nil, 0.1f, 0, 1.0f); DebugMenuAddVarBool8("Render", "Neo Ped Rim light enable", &CustomPipes::RimlightEnable, nil); DebugMenuAddVar("Render", "Mult", &CustomPipes::RimlightMult, nil, 0.1f, 0, 1.0f); -// DebugMenuAddVarBool8("Render", "Neo World Lightmaps enable", &CustomPipes::LightmapEnable, nil); -// DebugMenuAddVar("Render", "Mult", &CustomPipes::LightmapMult, nil, 0.1f, 0, 1.0f); -// DebugMenuAddVarBool8("Render", "Neo Road Gloss enable", &CustomPipes::GlossEnable, nil); -// DebugMenuAddVar("Render", "Mult", &CustomPipes::GlossMult, nil, 0.1f, 0, 1.0f); + DebugMenuAddVarBool8("Render", "Neo World Lightmaps enable", &CustomPipes::LightmapEnable, nil); + DebugMenuAddVar("Render", "Mult", &CustomPipes::LightmapMult, nil, 0.1f, 0, 1.0f); + DebugMenuAddVarBool8("Render", "Neo Road Gloss enable", &CustomPipes::GlossEnable, nil); + DebugMenuAddVar("Render", "Mult", &CustomPipes::GlossMult, nil, 0.1f, 0, 1.0f); #endif DebugMenuAddVarBool8("Debug Render", "Show Ped Paths", &gbShowPedPaths, nil); DebugMenuAddVarBool8("Debug Render", "Show Car Paths", &gbShowCarPaths, nil); @@ -993,14 +1065,14 @@ extern bool gbRenderDebugEnvMap; #ifdef DRAW_GAME_VERSION_TEXT - extern bool gDrawVersionText; - DebugMenuAddVarBool8("Debug", "Version Text", &gDrawVersionText, nil); + DebugMenuAddVarBool8("Debug", "Version Text", &gbDrawVersionText, nil); #endif DebugMenuAddVarBool8("Debug", "Show DebugStuffInRelease", &gbDebugStuffInRelease, nil); #ifdef TIMEBARS DebugMenuAddVarBool8("Debug", "Show Timebars", &gbShowTimebars, nil); #endif #ifndef FINAL + DebugMenuAddVarBool8("Debug", "Use debug render groups", &bDebugRenderGroups, nil); DebugMenuAddVarBool8("Debug", "Print Memory Usage", &gbPrintMemoryUsage, nil); #ifdef USE_CUSTOM_ALLOCATOR DebugMenuAddCmd("Debug", "Parse Heap", ParseHeap); @@ -1031,30 +1103,24 @@ extern bool gbRenderDebugEnvMap; #ifdef MISSION_SWITCHER DebugMenuEntry *missionEntry; static const char* missions[] = { - "initial: objects", "initial: hidden packages", "initial: car generators", "initial: pickups", "initial: unique stunt jumps", - "initial: player", "initial: general info", "initial: lods", "initial: weapons", "Home Sweet Home", "Taxi-Driver Sub-Mission", - "Paramedic Sub-Mission", "Vigilante Sub-Mission", "Karmageddon", "Firefighter Sub-Mission", "Trash Dash", "RC Triad Take-Down", - "Thrashin' RC", "Ragin' RC", "Chasin' RC", "GO GO Faggio", "Noodleboy", "Pizzaboy", "Wong Side Of The Tracks", "Bumps and Grinds: Course 1", - "Bumps and Grinds: Course 2", "Bumps and Grinds: Course 3", "Bumps and Grinds: Course 4", "Bumps and Grinds: Course 5", "Bumps and Grinds: Course 6", - "Bumps and Grinds: Course 7", "Bumps and Grinds: Course 8", "Bumps and Grinds: Course 9", "Bumps and Grinds: Course 10", "Car Salesman", "Bike Salesman", - "RACE: Low-Rider Rumble", "RACE: Deimos Dash", "RACE: Wi-Cheetah Run", "RACE: Red Light Racing", "RACE: Torrington TT", "RACE: Gangsta GP", - "Scooter Shooter", "AWOL Angel", "9mm Mayhem", "Scrapyard Challenge", "See the Sight Before your Flight", "SlashTV", "Slacker (Vincenzo)", - "Dealing Revenge (Vincenzo)", "Snuff (Vincenzo)", "Smash and Grab (Vincenzo)", "Hot Wheels (Vincenzo)", "The Portland Chainsaw Masquerade (Vincenzo)", - "The Offer (Salvatore)", "Ho Selecta! (Salvatore)", "Frighteners (Salvatore)", "Rollercoaster Ride (Salvatore)", "Contra-Banned (Salvatore)", - "Sindacco Sabotage (Salvatore)", "The Trouble with Triads (Salvatore)", "Driving Mr Leone (Salvatore)", "conversation (JD)", "Bone Voyeur! (JD)", - "Don in 60 Seconds (JD)", "A Volatile Situation (JD)", "Blow up 'Dolls' (JD)", "Salvatore's Salvation (JD)", "The Guns of Leone (JD)", - "Calm before the Storm (JD)", "The Made Man (JD)", "Snappy Dresser (Ma Cipriani)", "Big Rumble in Little China (Ma Cipriani)", "Grease Sucho (Ma Cipriani)", - "Dead Meat (Ma Cipriani)", "No Son of Mine (Ma Cipriani)", "Shop 'til you Strop (Maria)", "Taken for a Ride (Maria)", "Booby Prize (Maria)", - "Biker Heat (Maria)", "Overdose of Trouble (Maria)", "Making Toni (Salvatore)", "A Walk In The Park (Salvatore)", "Caught In The Act (Salvatore)", - "Search And Rescue (Salvatore)", "Taking The Peace (Salvatore)", "Shoot The Messenger (Salvatore)", "Sayonara Sindaccos (Leon McAffrey)", - "The Whole 9 Yardies (Leon McAffrey)", "Crazy '69' (Leon McAffrey)", "Night Of The Livid Dreads (Leon McAffrey)", "Munitions Dump (Leon McAffrey)", - "The Morgue Party Candidate (Donald Love)", "Steering The Vote (Donald Love)", "Cam-Pain (Donald Love)", "Friggin' The Riggin' (Donald Love)", - "Love & Bullets (Donald Love)", "Counterfeit Count (Donald Love)", "Love On The Rocks (Donald Love)", "L.C. Confidential (Church Confessional)", - "The Passion Of The Heist (Church Confessional)", "Karmageddon (Church Confessional)", "False Idols (Church Confessional)", "Rough Justice (Salvatore)", - "Dead Reckoning (Salvatore)", "Shogun Showdown (Salvatore)", "The Shoreside Redemption (Salvatore)", "The Sicilian Gambit (Salvatore)", - "Panlantic Land Grab (Donald Love)", "Stop the Press (Donald Love)", "Morgue Party Resurrection (Donald Love)", "No Money, Mo' Problems (Donald Love)", - "Bringing the House Down (Donald Love)", "Love on the Run (Donald Love)", "More Deadly than the Male (Toshiko Kasen)", "Cash Clash (Toshiko Kasen)", - "A Date with Death (Toshiko Kasen)", "Cash in Kazuki's Chips (Toshiko Kasen)" + "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("Game", "Select mission", &nextMissionToSwitch, nil, 1, 0, ARRAY_SIZE(missions) - 1, missions); @@ -1112,7 +1178,7 @@ void re3_assert(const char *expr, const char *filename, unsigned int lineno, con strcat_s(re3_buff, re3_buffsize, "(Press Retry to debug the application)"); - nCode = ::MessageBoxA(nil, re3_buff, "RELCS Assertion Failed!", + nCode = ::MessageBoxA(nil, re3_buff, "REVC Assertion Failed!", MB_ABORTRETRYIGNORE|MB_ICONHAND|MB_SETFOREGROUND|MB_TASKMODAL); if (nCode == IDABORT) @@ -1133,7 +1199,7 @@ void re3_assert(const char *expr, const char *filename, unsigned int lineno, con abort(); #else // TODO - printf("\nRELCS ASSERT FAILED\n\tFile: %s\n\tLine: %d\n\tFunction: %s\n\tExpression: %s\n",filename,lineno,func,expr); + printf("\nREVC ASSERT FAILED\n\tFile: %s\n\tLine: %d\n\tFunction: %s\n\tExpression: %s\n",filename,lineno,func,expr); assert(false); #endif } @@ -1185,14 +1251,14 @@ void re3_usererror(const char *format, ...) vsprintf_s(re3_buff, re3_buffsize, format, va); va_end(va); - ::MessageBoxA(nil, re3_buff, "RELCS Error!", + ::MessageBoxA(nil, re3_buff, "REVC Error!", MB_OK|MB_ICONHAND|MB_SETFOREGROUND|MB_TASKMODAL); raise(SIGABRT); _exit(3); #else vsprintf(re3_buff, format, va); - printf("\nRELCS Error!\n\t%s\n",re3_buff); + printf("\nREVC Error!\n\t%s\n",re3_buff); assert(false); #endif } diff --git a/src/entities/Entity.cpp b/src/entities/Entity.cpp index 7e2104e..6204b74 100644 --- a/src/entities/Entity.cpp +++ b/src/entities/Entity.cpp @@ -4,7 +4,6 @@ #include "RwHelper.h" #include "ModelIndices.h" #include "Timer.h" -#include "Streaming.h" #include "Entity.h" #include "Object.h" #include "World.h" @@ -626,15 +625,10 @@ CEntity::SetupBigBuilding(void) m_level = CTheZones::GetLevelFromPosition(&GetPosition()); if(mi->m_lodDistances[0] <= 2000.0f) bStreamBIGBuilding = true; - if(m_modelIndex == islandLODindust || - m_modelIndex == islandLODcomInd || - m_modelIndex == islandLODcomSub || - m_modelIndex == islandLODsubInd || - m_modelIndex == islandLODsubCom || - mi->m_lodDistances[0] > 5000.0f || mi->m_ignoreDrawDist) + if(mi->m_lodDistances[0] > 2500.0f || mi->m_ignoreDrawDist) m_level = LEVEL_GENERIC; -// else if(m_level == LEVEL_GENERIC) -// printf("%s isn't in a level\n", mi->GetModelName()); + else if(m_level == LEVEL_GENERIC) + printf("%s isn't in a level\n", mi->GetModelName()); } float WindTabel[] = { diff --git a/src/entities/Entity.h b/src/entities/Entity.h index c7a6f88..2749e3f 100644 --- a/src/entities/Entity.h +++ b/src/entities/Entity.h @@ -24,11 +24,11 @@ enum eEntityStatus STATUS_PHYSICS, STATUS_ABANDONED, STATUS_WRECKED, - STATUS_TRAIN_MOVING, // these probably copied for FERRY + STATUS_TRAIN_MOVING, STATUS_TRAIN_NOT_MOVING, STATUS_HELI, STATUS_PLANE, - STATUS_PLAYER_REMOTE, // 12 in LCS + STATUS_PLAYER_REMOTE, STATUS_PLAYER_DISABLED, STATUS_GHOST }; diff --git a/src/entities/Physical.cpp b/src/entities/Physical.cpp index 7be5df2..b897a6e 100644 --- a/src/entities/Physical.cpp +++ b/src/entities/Physical.cpp @@ -21,7 +21,9 @@ #include "Pickups.h" #include "Physical.h" +#ifdef WALLCLIMB_CHEAT bool gGravityCheat; +#endif CPhysical::CPhysical(void) @@ -355,7 +357,7 @@ CPhysical::ProcessEntityCollision(CEntity *ent, CColPoint *colpoints) return numSpheres; } -//--LCS: done +// --MIAMI: Proof-read once void CPhysical::ProcessControl(void) { @@ -423,7 +425,7 @@ CPhysical::GetSpeed(const CVector &r) return m_vecMoveSpeed + m_vecMoveFriction + CrossProduct(m_vecTurnFriction + m_vecTurnSpeed, r); } -//--LCS: done +// --MIAMI: Proof-read once void CPhysical::ApplyMoveSpeed(void) { @@ -433,13 +435,13 @@ CPhysical::ApplyMoveSpeed(void) GetMatrix().Translate(m_vecMoveSpeed * CTimer::GetTimeStep()); } -//--LCS: done +// --MIAMI: Proof-read once void CPhysical::ApplyTurnSpeed(void) { if(bIsFrozen){ m_vecTurnSpeed = CVector(0.0f, 0.0f, 0.0f); - }else if(!m_vecTurnSpeed.IsZero()){ + }else{ // Move the coordinate axes by their speed // Note that this denormalizes the matrix CVector turnvec = m_vecTurnSpeed*CTimer::GetTimeStep(); @@ -449,36 +451,29 @@ CPhysical::ApplyTurnSpeed(void) } } -//--LCS: done +// --MIAMI: Proof-read once void CPhysical::ApplyMoveForce(float jx, float jy, float jz) { m_vecMoveSpeed += CVector(jx, jy, jz)*(1.0f/m_fMass); - m_vecTurnSpeed.x = clamp(m_vecTurnSpeed.x, -4.0f, 4.0f); - m_vecTurnSpeed.y = clamp(m_vecTurnSpeed.y, -4.0f, 4.0f); - m_vecTurnSpeed.z = clamp(m_vecTurnSpeed.z, -4.0f, 4.0f); } -//--LCS: done +// --MIAMI: Proof-read once void CPhysical::ApplyTurnForce(float jx, float jy, float jz, float px, float py, float pz) { CVector com = Multiply3x3(m_matrix, m_vecCentreOfMass); CVector turnimpulse = CrossProduct(CVector(px, py, pz)-com, CVector(jx, jy, jz)); m_vecTurnSpeed += turnimpulse*(1.0f/m_fTurnMass); - m_vecTurnSpeed.x = clamp(m_vecTurnSpeed.x, -4.0f, 4.0f); - m_vecTurnSpeed.y = clamp(m_vecTurnSpeed.y, -4.0f, 4.0f); - m_vecTurnSpeed.z = clamp(m_vecTurnSpeed.z, -4.0f, 4.0f); } -//--LCS: done void CPhysical::ApplyFrictionMoveForce(float jx, float jy, float jz) { m_vecMoveFriction += CVector(jx, jy, jz)*(1.0f/m_fMass); } -//--LCS: done +// --MIAMI: Proof-read once void CPhysical::ApplyFrictionTurnForce(float jx, float jy, float jz, float px, float py, float pz) { @@ -487,7 +482,7 @@ CPhysical::ApplyFrictionTurnForce(float jx, float jy, float jz, float px, float m_vecTurnFriction += turnimpulse*(1.0f/m_fTurnMass); } -//--LCS: done +// --MIAMI: Proof-read once bool CPhysical::ApplySpringCollision(float springConst, CVector &springDir, CVector &point, float springRatio, float bias) { @@ -501,16 +496,16 @@ CPhysical::ApplySpringCollision(float springConst, CVector &springDir, CVector & return true; } -//--LCS: done +// --MIAMI: Proof-read once bool -CPhysical::ApplySpringCollisionAlt(float springConst, CVector &springDir, CVector &point, float springRatio, float bias, CVector &forceDir, float &impulse) +CPhysical::ApplySpringCollisionAlt(float springConst, CVector &springDir, CVector &point, float springRatio, float bias, CVector &forceDir) { float compression = 1.0f - springRatio; if(compression > 0.0f){ if(DotProduct(springDir, forceDir) > 0.0f) forceDir *= -1.0f; float step = Min(CTimer::GetTimeStep(), 3.0f); - impulse = GRAVITY*m_fMass*step * springConst * compression * bias*2.0f; + float impulse = GRAVITY*m_fMass*step * springConst * compression * bias*2.0f; if(bIsHeavy) impulse *= 0.75f; ApplyMoveForce(forceDir*impulse); @@ -519,53 +514,36 @@ CPhysical::ApplySpringCollisionAlt(float springConst, CVector &springDir, CVecto return true; } -float DAMPING_LIMIT_OF_SPRING_FORCE = 0.999f; -float DAMPING_LIMIT_IN_FRAME= 0.25f; - -//--LCS: done +// --MIAMI: Proof-read once // What exactly is speed? bool -CPhysical::ApplySpringDampening(float damping, float dampingLimit, CVector &springDir, CVector &point, CVector &speed) +CPhysical::ApplySpringDampening(float damping, CVector &springDir, CVector &point, CVector &speed) { float speedA = DotProduct(speed, springDir); float speedB = DotProduct(GetSpeed(point), springDir); float step = Min(CTimer::GetTimeStep(), 3.0f); - damping *= step; + float impulse = -damping * (speedA + speedB)/2.0f * m_fMass * step * 0.53f; if(bIsHeavy) - damping *= 2.0f; - damping = clamp(damping, -DAMPING_LIMIT_IN_FRAME, DAMPING_LIMIT_IN_FRAME); + impulse *= 2.0f; // what is this? - float fSpeed = -speedA * damping; - if(fSpeed > 0.0f && fSpeed+speedB > 0.0f){ - if(speedB < 0.0f) - fSpeed = -speedB; - else - fSpeed = 0.0f; - }else if(fSpeed < 0.0f && fSpeed+speedB < 0.0f){ - if(speedB > 0.0f) - fSpeed = -speedB; - else - fSpeed = 0.0f; - } - - CVector com = Multiply3x3(m_matrix, m_vecCentreOfMass); - float impulse = fSpeed*GetMass(point-com, springDir); - float limit = Abs(dampingLimit)*DAMPING_LIMIT_OF_SPRING_FORCE; - if(impulse > limit) - impulse = limit; + float a = m_fTurnMass / ((point.MagnitudeSqr() + 1.0f) * 2.0f * m_fMass); + a = Min(a, 1.0f); + float b = Abs(impulse / (speedB * m_fMass)); + if(a < b) + impulse *= a/b; ApplyMoveForce(springDir*impulse); ApplyTurnForce(springDir*impulse, point); return true; } -//--LCS: done void CPhysical::ApplyGravity(void) { if (!bAffectedByGravity) return; +#ifdef WALLCLIMB_CHEAT if (gGravityCheat && this == FindPlayerVehicle()) { static CVector gravityUp(0.0f, 0.0f, 1.0f), surfaceUp(0.0f, 0.0f, 1.0f); CVector belowCar = GetPosition() - 2.0f*GetUp(); @@ -584,10 +562,10 @@ CPhysical::ApplyGravity(void) m_vecMoveSpeed -= GRAVITY * CTimer::GetTimeStep() * gravityUp; return; } +#endif m_vecMoveSpeed.z -= GRAVITY * CTimer::GetTimeStep(); } -//--LCS: done void CPhysical::ApplyFriction(void) { @@ -597,7 +575,7 @@ CPhysical::ApplyFriction(void) m_vecTurnFriction = CVector(0.0f, 0.0f, 0.0f); } -//--LCS: done +// --MIAMI: Proof-read once void CPhysical::ApplyAirResistance(void) { @@ -605,8 +583,8 @@ CPhysical::ApplyAirResistance(void) float f = Pow(m_fAirResistance, CTimer::GetTimeStep()); m_vecMoveSpeed *= f; m_vecTurnSpeed *= f; - }else{ - float f = Pow(1.0f - m_fAirResistance*m_vecMoveSpeed.Magnitude(), CTimer::GetTimeStep()); + }else if(GetStatus() != STATUS_GHOST){ + float f = Pow(1.0f/Abs(1.0f + m_fAirResistance*0.5f*m_vecMoveSpeed.MagnitudeSqr()), CTimer::GetTimeStep()); m_vecMoveSpeed *= f; m_vecTurnSpeed *= 0.99f; } @@ -715,7 +693,6 @@ CPhysical::ApplyCollision(CPhysical *B, CColPoint &colpoint, float &impulseA, fl int16 model = B->GetModelIndex(); if(model == MI_FIRE_HYDRANT && !Bobj->bHasBeenDamaged){ CParticleObject::AddObject(POBJECT_FIRE_HYDRANT, B->GetPosition() - CVector(0.0f, 0.0f, 0.5f), true); - CParticleObject::AddObject(POBJECT_FIRE_HYDRANT_STEAM, B->GetPosition() - CVector(0.0f, 0.0f, 0.5f), true); Bobj->bHasBeenDamaged = true; }else if(model == MI_PARKINGMETER || model == MI_PARKINGMETER2){ CPickups::CreateSomeMoney(GetPosition(), CGeneral::GetRandomNumber()%100); @@ -2331,44 +2308,3 @@ CPhysical::ProcessCollision(void) m_fElasticity = savedElasticity; RemoveAndAdd(); } - - - -// TEMP old VC code until bikes are done -bool -CPhysical::ApplySpringCollisionAlt(float springConst, CVector &springDir, CVector &point, float springRatio, float bias, CVector &forceDir) -{ - float compression = 1.0f - springRatio; - if(compression > 0.0f){ - if(DotProduct(springDir, forceDir) > 0.0f) - forceDir *= -1.0f; - float step = Min(CTimer::GetTimeStep(), 3.0f); - float impulse = GRAVITY*m_fMass*step * springConst * compression * bias*2.0f; - if(bIsHeavy) - impulse *= 0.75f; - ApplyMoveForce(forceDir*impulse); - ApplyTurnForce(forceDir*impulse, point); - } - return true; -} -bool -CPhysical::ApplySpringDampening(float damping, CVector &springDir, CVector &point, CVector &speed) -{ - float speedA = DotProduct(speed, springDir); - float speedB = DotProduct(GetSpeed(point), springDir); - float step = Min(CTimer::GetTimeStep(), 3.0f); - float impulse = -damping * (speedA + speedB)/2.0f * m_fMass * step * 0.53f; - if(bIsHeavy) - impulse *= 2.0f; - - // what is this? - float a = m_fTurnMass / ((point.MagnitudeSqr() + 1.0f) * 2.0f * m_fMass); - a = Min(a, 1.0f); - float b = Abs(impulse / (speedB * m_fMass)); - if(a < b) - impulse *= a/b; - - ApplyMoveForce(springDir*impulse); - ApplyTurnForce(springDir*impulse, point); - return true; -} diff --git a/src/entities/Physical.h b/src/entities/Physical.h index 290c267..926b976 100644 --- a/src/entities/Physical.h +++ b/src/entities/Physical.h @@ -158,8 +158,8 @@ public: void ApplyFrictionTurnForce(const CVector &j, const CVector &p) { ApplyFrictionTurnForce(j.x, j.y, j.z, p.x, p.y, p.z); } // springRatio: 1.0 fully extended, 0.0 fully compressed bool ApplySpringCollision(float springConst, CVector &springDir, CVector &point, float springRatio, float bias); - bool ApplySpringCollisionAlt(float springConst, CVector &springDir, CVector &point, float springRatio, float bias, CVector &forceDir, float &impulse); - bool ApplySpringDampening(float damping, float dampingLimit, CVector &springDir, CVector &point, CVector &speed); + bool ApplySpringCollisionAlt(float springConst, CVector &springDir, CVector &point, float springRatio, float bias, CVector &forceDir); + bool ApplySpringDampening(float damping, CVector &springDir, CVector &point, CVector &speed); void ApplyGravity(void); void ApplyFriction(void); void ApplyAirResistance(void); @@ -174,8 +174,4 @@ public: bool ProcessCollisionSectorList(CPtrList *lists); bool CheckCollision(void); bool CheckCollision_SimpleCar(void); - - // TEMP - bool ApplySpringCollisionAlt(float springConst, CVector &springDir, CVector &point, float springRatio, float bias, CVector &forceDir); - bool ApplySpringDampening(float damping, CVector &springDir, CVector &point, CVector &speed); }; diff --git a/src/extras/custompipes.cpp b/src/extras/custompipes.cpp index a874343..a485138 100644 --- a/src/extras/custompipes.cpp +++ b/src/extras/custompipes.cpp @@ -46,14 +46,13 @@ CustomMatCopy(void *dst, void *src, int32, int32) rw::TexDictionary *neoTxd; -bool gGlassCarsCheat; bool bRenderingEnvMap; -int32 EnvMapSize = 512; +int32 EnvMapSize = 128; rw::Camera *EnvMapCam; rw::Texture *EnvMapTex; rw::Texture *EnvMaskTex; -rw::RWDEVICE::Im2DVertex EnvScreenQuad[4]; -int16 QuadIndices[6] = { 0, 1, 2, 0, 2, 3 }; +static rw::RWDEVICE::Im2DVertex EnvScreenQuad[4]; +static int16 QuadIndices[6] = { 0, 1, 2, 0, 2, 3 }; static rw::Camera* CreateEnvMapCam(rw::World *world) @@ -342,7 +341,7 @@ ReadTweakValueTable(char *fp, InterpolatedValue &interp) * Neo Vehicle pipe */ -int32 VehiclePipeSwitch = VEHICLEPIPE_PS2; +int32 VehiclePipeSwitch = VEHICLEPIPE_MATFX; float VehicleShininess = 1.0f; float VehicleSpecularity = 1.0f; InterpolatedFloat Fresnel(0.4f); @@ -370,7 +369,6 @@ AttachVehiclePipe(rw::Clump *clump) * Neo World pipe */ -int32 WorldPipeSwitch = WORLDPIPE_PS2; bool LightmapEnable; float LightmapMult = 1.0f; InterpolatedFloat WorldLightmapBlend(1.0f); diff --git a/src/extras/custompipes.h b/src/extras/custompipes.h index faf99ef..7ad239f 100644 --- a/src/extras/custompipes.h +++ b/src/extras/custompipes.h @@ -75,23 +75,16 @@ void CustomPipeInit(void); void CustomPipeShutdown(void); void SetTxdFindCallback(void); -extern bool gGlassCarsCheat; extern bool bRenderingEnvMap; extern int32 EnvMapSize; extern rw::Camera *EnvMapCam; extern rw::Texture *EnvMapTex; extern rw::Texture *EnvMaskTex; -extern rw::RWDEVICE::Im2DVertex EnvScreenQuad[4]; -extern int16 QuadIndices[6]; void EnvMapRender(void); enum { - VEHICLEPIPE_PSP, - VEHICLEPIPE_PS2, - VEHICLEPIPE_MOBILE, - -// maybe later again... - VEHICLEPIPE_NEO = -1 + VEHICLEPIPE_MATFX, + VEHICLEPIPE_NEO }; extern int32 VehiclePipeSwitch; extern float VehicleShininess; @@ -106,12 +99,6 @@ void DestroyVehiclePipe(void); void AttachVehiclePipe(rw::Atomic *atomic); void AttachVehiclePipe(rw::Clump *clump); -enum { - WORLDPIPE_PSP, - WORLDPIPE_PS2, - WORLDPIPE_MOBILE -}; -extern int32 WorldPipeSwitch; extern bool LightmapEnable; extern float LightmapMult; extern InterpolatedFloat WorldLightmapBlend; @@ -146,6 +133,8 @@ void AttachRimPipe(rw::Clump *clump); } +#endif + namespace WorldRender{ extern int numBlendInsts[3]; void AtomicFirstPass(RpAtomic *atomic, int pass); @@ -154,4 +143,3 @@ void RenderBlendPass(int pass); } #endif -#endif diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp index cb5fcad..3ad824e 100644 --- a/src/extras/custompipes_d3d9.cpp +++ b/src/extras/custompipes_d3d9.cpp @@ -2,10 +2,6 @@ #include "common.h" #ifdef RW_D3D9 -#ifdef EXTENDED_PIPELINES - -#include "rpmatfx.h" - #include "main.h" #include "RwHelper.h" #include "Lights.h" @@ -18,12 +14,13 @@ #include "World.h" #include "custompipes.h" +#ifdef EXTENDED_PIPELINES + #ifndef LIBRW #error "Need librw for EXTENDED_PIPELINES" #endif -//extern RwTexture *gpWhiteTexture; // from vehicle model info -static RwTexture *gpWhiteTexture; // nil works as white in librw currently +extern RwTexture *gpWhiteTexture; // from vehicle model info namespace CustomPipes { @@ -39,212 +36,13 @@ enum { VSLOC_eye = rw::d3d::VSLOC_afterLights, VSLOC_reflProps, - VSLOC_specLights, - - // Leeds building, Leeds vehicle mobile - VSLOC_emissive = rw::d3d::VSLOC_afterLights, - VSLOC_ambient, - VSLOC_viewMat, // only vehicle - - // Leeds vehicle PS2 - VSLOC_texMat = rw::d3d::VSLOC_afterLights, - - PSLOC_colorscale = 1, - PSLOC_shininess, - PSLOC_skyTop, - PSLOC_skyBot + VSLOC_specLights }; /* - * Leeds & Neo Vehicle pipe + * Neo Vehicle pipe */ -static void *leedsVehicle_VS; -static void *leedsVehicle_mobile_VS; -static void *leedsVehicle_blend_PS; -static void *leedsVehicle_add_PS; -static void *leedsVehicle_mobile_PS; - -static rw::RawMatrix normal2texcoord_flipU = { - { -0.5f, 0.0f, 0.0f }, 0.0f, - { 0.0f, -0.5f, 0.0f }, 0.0f, - { 0.0f, 0.0f, 1.0f }, 0.0f, - { 0.5f, 0.5f, 0.0f }, 1.0f -}; - -void -uploadEnvMatrix(rw::Frame *frame) -{ - using namespace rw; - Matrix invMat; - if(frame == nil) - frame = engine->currentCamera->getFrame(); - - RawMatrix envMtx, invMtx; - Matrix tmp = *frame->getLTM(); - // Now the weird part: we remove the camera pitch - tmp.at.z = 0.0f; - tmp.at = normalize(tmp.at); - tmp.right.x = -tmp.at.y; - tmp.right.y = tmp.at.x; - tmp.right.z = 0.0f;; - tmp.up.set(0.0f, 0.0f, 1.0f); - tmp.pos.set(0.0f, 0.0f, 0.0f); - tmp.flags = Matrix::TYPEORTHONORMAL; - - Matrix::invert(&invMat, &tmp); - convMatrix(&invMtx, &invMat); - RawMatrix::mult(&envMtx, &invMtx, &normal2texcoord_flipU); - d3d::d3ddevice->SetVertexShaderConstantF(VSLOC_texMat, (float*)&envMtx, 4); -} - -void -leedsVehicleRenderCB(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(leedsVehicle_VS); - if(gGlassCarsCheat) - setPixelShader(leedsVehicle_blend_PS); - else - setPixelShader(leedsVehicle_add_PS); - - d3d::setTexture(1, EnvMapTex); - uploadEnvMatrix(nil); - - SetRenderState(SRCBLEND, BLENDONE); - - float colorscale[4]; - colorscale[3] = 1.0f; - - 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); - - float coef = 0.0f; - if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP){ - coef = CClock::ms_EnvMapTimeMultiplicator * RpMatFXMaterialGetEnvMapCoefficient(m)*0.5f; - if(gGlassCarsCheat) - coef = 1.0f; - } - d3ddevice->SetPixelShaderConstantF(PSLOC_shininess, (float*)&coef, 1); - - setMaterial(m->color, m->surfaceProps); - - float cs = 1.0f; - // how does the PS2 handle this actually? probably scaled material color? - if(VehiclePipeSwitch == VEHICLEPIPE_PSP && m->texture) - cs = 2.0f; - colorscale[0] = colorscale[1] = colorscale[2] = cs; - d3ddevice->SetPixelShaderConstantF(PSLOC_colorscale, colorscale, 1); - - if(m->texture) - d3d::setTexture(0, m->texture); - else - d3d::setTexture(0, gpWhiteTexture); - - drawInst(header, inst); - inst++; - } - - d3d::setTexture(1, nil); - - SetRenderState(SRCBLEND, BLENDSRCALPHA); -} - -void -uploadWorldLights(void) -{ - using namespace rw; - using namespace rw::d3d; - using namespace rw::d3d9; - - RGBAf amb, emiss; - amb.red = CTimeCycle::GetAmbientRed(); - amb.green = CTimeCycle::GetAmbientGreen(); - amb.blue = CTimeCycle::GetAmbientBlue(); - amb.alpha = 1.0f; - emiss = pAmbient->color; - - d3ddevice->SetVertexShaderConstantF(VSLOC_ambient, (float*)&amb, 1); - d3ddevice->SetVertexShaderConstantF(VSLOC_emissive, (float*)&emiss, 1); -} - -void -leedsVehicleRenderCB_mobile(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(leedsVehicle_mobile_VS); - setPixelShader(leedsVehicle_mobile_PS); - - uploadWorldLights(); - - RGBAf skyTop, skyBot; - skyTop.red = CTimeCycle::GetSkyTopRed()/255.0f; - skyTop.green = CTimeCycle::GetSkyTopGreen()/255.0f; - skyTop.blue = CTimeCycle::GetSkyTopBlue()/255.0f; - skyBot.red = CTimeCycle::GetSkyBottomRed()/255.0f; - skyBot.green = CTimeCycle::GetSkyBottomGreen()/255.0f; - skyBot.blue = CTimeCycle::GetSkyBottomBlue()/255.0f; - - d3ddevice->SetPixelShaderConstantF(PSLOC_skyTop, (float*)&skyTop, 1); - d3ddevice->SetPixelShaderConstantF(PSLOC_skyBot, (float*)&skyBot, 1); - - d3ddevice->SetVertexShaderConstantF(VSLOC_viewMat, (float*)&rw::engine->currentCamera->devView, 4); - - d3d::setTexture(1, EnvMapTex); - - 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); - - float coef = 0.0f; - if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP){ - coef = CClock::ms_EnvMapTimeMultiplicator * RpMatFXMaterialGetEnvMapCoefficient(m)*0.5f; - if(gGlassCarsCheat) - coef = 1.0f; - } - d3ddevice->SetPixelShaderConstantF(PSLOC_shininess, (float*)&coef, 1); - - setMaterial(m->color, m->surfaceProps); - - if(m->texture) - d3d::setTexture(0, m->texture); - else - d3d::setTexture(0, gpWhiteTexture); - - drawInst(header, inst); - inst++; - } - - d3d::setTexture(1, nil); -} - static void *neoVehicle_VS; static void *neoVehicle_PS; @@ -285,17 +83,13 @@ vehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) using namespace rw::d3d9; // TODO: make this less of a kludge - if(VehiclePipeSwitch == VEHICLEPIPE_PSP || VehiclePipeSwitch == VEHICLEPIPE_PS2){ - leedsVehicleRenderCB(atomic, header); - // matFXGlobals.pipelines[rw::platform]->render(atomic); - return; - } - if(VehiclePipeSwitch == VEHICLEPIPE_MOBILE){ - leedsVehicleRenderCB_mobile(atomic, header); + if(VehiclePipeSwitch == VEHICLEPIPE_MATFX){ + matFXGlobals.pipelines[rw::platform]->render(atomic); return; } int vsBits; + rw::uint32 flags = atomic->geometry->flags; setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); setIndices(header->indexBuffer); setVertexDeclaration(header->vertexDeclaration); @@ -327,7 +121,7 @@ vehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) reflProps[3] = m->surfaceProps.specular == 0.0f ? 0.0f : VehicleSpecularity; d3ddevice->SetVertexShaderConstantF(VSLOC_reflProps, reflProps, 1); - setMaterial(m->color, m->surfaceProps); + setMaterial(flags, m->color, m->surfaceProps); if(m->texture) d3d::setTexture(0, m->texture); @@ -347,15 +141,15 @@ vehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) 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); -// } + 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/obj/neoVehicle_VS.inc" neoVehicle_VS = rw::d3d::createVertexShader(neoVehicle_VS_cso); @@ -365,26 +159,6 @@ CreateVehiclePipe(void) neoVehicle_PS = rw::d3d::createPixelShader(neoVehicle_PS_cso); assert(neoVehicle_PS); -#include "shaders/obj/leedsDefault_ENV_VS.inc" - leedsVehicle_VS = rw::d3d::createVertexShader(leedsDefault_ENV_VS_cso); - assert(leedsVehicle_VS); - -#include "shaders/obj/leedsVehicle_mobile_VS.inc" - leedsVehicle_mobile_VS = rw::d3d::createVertexShader(leedsVehicle_mobile_VS_cso); - assert(leedsVehicle_mobile_VS); - -#include "shaders/obj/leedsDefault_BLEND_PS.inc" - leedsVehicle_blend_PS = rw::d3d::createPixelShader(leedsDefault_BLEND_PS_cso); - assert(leedsVehicle_blend_PS); - -#include "shaders/obj/leedsDefault_ADD_PS.inc" - leedsVehicle_add_PS = rw::d3d::createPixelShader(leedsDefault_ADD_PS_cso); - assert(leedsVehicle_add_PS); - -#include "shaders/obj/leedsVehicle_mobile_PS.inc" - leedsVehicle_mobile_PS = rw::d3d::createPixelShader(leedsVehicle_mobile_PS_cso); - assert(leedsVehicle_mobile_PS); - rw::d3d9::ObjPipeline *pipe = rw::d3d9::ObjPipeline::create(); pipe->instanceCB = rw::d3d9::defaultInstanceCB; @@ -402,15 +176,6 @@ DestroyVehiclePipe(void) rw::d3d::destroyPixelShader(neoVehicle_PS); neoVehicle_PS = nil; - rw::d3d::destroyVertexShader(leedsVehicle_VS); - leedsVehicle_VS = nil; - - rw::d3d::destroyPixelShader(leedsVehicle_blend_PS); - leedsVehicle_blend_PS = nil; - - rw::d3d::destroyPixelShader(leedsVehicle_add_PS); - leedsVehicle_add_PS = nil; - ((rw::d3d9::ObjPipeline*)vehiclePipe)->destroy(); vehiclePipe = nil; } @@ -418,12 +183,11 @@ DestroyVehiclePipe(void) /* - * Leeds World pipe + * Neo World pipe */ -static void *leedsBuilding_VS; -static void *leedsBuilding_mobile_VS; -static void *scale_PS; +static void *neoWorld_VS; +static void *neoWorldVC_PS; static void worldRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) @@ -432,64 +196,79 @@ worldRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) using namespace rw::d3d; using namespace rw::d3d9; + if(!LightmapEnable){ + defaultRenderCB_Shader(atomic, header); + return; + } + + int vsBits; setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); setIndices(header->indexBuffer); setVertexDeclaration(header->vertexDeclaration); - if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_MOBILE) - setVertexShader(CustomPipes::leedsBuilding_mobile_VS); - else - setVertexShader(CustomPipes::leedsBuilding_VS); - setPixelShader(scale_PS); - + vsBits = lightingCB_Shader(atomic); uploadMatrices(atomic->getFrame()->getLTM()); - uploadWorldLights(); - float colorscale[4]; - colorscale[3] = 1.0f; + float lightfactor[4]; InstanceData *inst = header->inst; for(rw::uint32 i = 0; i < header->numMeshes; i++){ Material *m = inst->material; - float cs = 1.0f; - if(WorldPipeSwitch != WORLDPIPE_MOBILE && m->texture) - cs = 255/128.0f; - colorscale[0] = colorscale[1] = colorscale[2] = cs; - d3ddevice->SetPixelShaderConstantF(PSLOC_colorscale, colorscale, 1); + 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); // actually we don't even render this - - setMaterial(m->color, m->surfaceProps, WorldPipeSwitch == WORLDPIPE_PS2 ? 0.5f : 1.0f); - - SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); + d3d::setTexture(0, gpWhiteTexture); + setPixelShader(neoWorldVC_PS); drawInst(header, inst); inst++; } + d3d::setTexture(1, nil); } 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); + 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/obj/default_UV2_VS.inc" + neoWorld_VS = rw::d3d::createVertexShader(default_UV2_VS_cso); + assert(neoWorld_VS); + +#include "shaders/obj/neoWorldVC_PS.inc" + neoWorldVC_PS = rw::d3d::createPixelShader(neoWorldVC_PS_cso); + assert(neoWorldVC_PS); -#include "shaders/obj/leedsBuilding_VS.inc" - leedsBuilding_VS = rw::d3d::createVertexShader(leedsBuilding_VS_cso); - assert(leedsBuilding_VS); -#include "shaders/obj/leedsBuilding_mobile_VS.inc" - leedsBuilding_mobile_VS = rw::d3d::createVertexShader(leedsBuilding_mobile_VS_cso); - assert(leedsBuilding_mobile_VS); -#include "shaders/obj/scale_PS.inc" - scale_PS = rw::d3d::createPixelShader(scale_PS_cso); - assert(scale_PS); rw::d3d9::ObjPipeline *pipe = rw::d3d9::ObjPipeline::create(); pipe->instanceCB = rw::d3d9::defaultInstanceCB; @@ -501,12 +280,10 @@ CreateWorldPipe(void) void DestroyWorldPipe(void) { - rw::d3d::destroyVertexShader(leedsBuilding_VS); - leedsBuilding_VS = nil; - rw::d3d::destroyVertexShader(leedsBuilding_mobile_VS); - leedsBuilding_mobile_VS = nil; - rw::d3d::destroyPixelShader(scale_PS); - scale_PS = nil; + rw::d3d::destroyVertexShader(neoWorld_VS); + neoWorld_VS = nil; + rw::d3d::destroyPixelShader(neoWorldVC_PS); + neoWorldVC_PS = nil; ((rw::d3d9::ObjPipeline*)worldPipe)->destroy(); @@ -645,6 +422,7 @@ rimRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) } int vsBits; + rw::uint32 flags = atomic->geometry->flags; setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); setIndices(header->indexBuffer); setVertexDeclaration(header->vertexDeclaration); @@ -662,7 +440,7 @@ rimRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); - setMaterial(m->color, m->surfaceProps); + setMaterial(flags, m->color, m->surfaceProps); if(m->texture){ d3d::setTexture(0, m->texture); @@ -688,7 +466,7 @@ rimSkinRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) } int vsBits; - + rw::uint32 flags = atomic->geometry->flags; setStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); setIndices((IDirect3DIndexBuffer9*)header->indexBuffer); @@ -709,7 +487,7 @@ rimSkinRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); - setMaterial(m->color, m->surfaceProps); + setMaterial(flags, m->color, m->surfaceProps); if(inst->material->texture){ d3d::setTexture(0, m->texture); @@ -777,7 +555,12 @@ DestroyRimLightPipes(void) } +#endif + #ifdef NEW_RENDERER +#ifndef LIBRW +#error "Need librw for NEW_PIPELINES" +#endif namespace WorldRender { @@ -830,20 +613,16 @@ AtomicFirstPass(RpAtomic *atomic, int pass) assert(building->instHeader->platform == PLATFORM_D3D9); building->fadeAlpha = 255; building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); + rw::uint32 flags = atomic->geometry->flags; bool setupDone = false; bool defer = false; SetMatrix(building, atomic->getFrame()->getLTM()); - float colorscale[4]; - InstanceData *inst = building->instHeader->inst; for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ Material *m = inst->material; - if(m->texture == nil) - continue; - if(inst->vertexAlpha || m->color.alpha != 255 || IsTextureTransparent(m->texture)){ defer = true; @@ -855,29 +634,22 @@ AtomicFirstPass(RpAtomic *atomic, int pass) setStreamSource(0, building->instHeader->vertexStream[0].vertexBuffer, 0, building->instHeader->vertexStream[0].stride); setIndices(building->instHeader->indexBuffer); setVertexDeclaration(building->instHeader->vertexDeclaration); - if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_MOBILE) - setVertexShader(CustomPipes::leedsBuilding_mobile_VS); - else - setVertexShader(CustomPipes::leedsBuilding_VS); - setPixelShader(CustomPipes::scale_PS); + setVertexShader(default_amb_VS); d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); - - CustomPipes::uploadWorldLights(); - - colorscale[3] = 1.0f; - + if(building->lighting) + setAmbient(pAmbient->color); + else + setAmbient(black); setupDone = true; } - float cs = 1.0f; - if(CustomPipes::WorldPipeSwitch != CustomPipes::WORLDPIPE_MOBILE && m->texture) - cs = 255/128.0f; - colorscale[0] = colorscale[1] = colorscale[2] = cs; - d3ddevice->SetPixelShaderConstantF(CustomPipes::PSLOC_colorscale, colorscale, 1); + setMaterial(flags, m->color, m->surfaceProps); - d3d::setTexture(0, m->texture); - - setMaterial(m->color, m->surfaceProps, CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_PS2 ? 0.5f : 1.0f); + if(m->texture){ + d3d::setTexture(0, m->texture); + setPixelShader(default_tex_PS); + }else + setPixelShader(default_PS); drawInst(building->instHeader, inst); } @@ -911,16 +683,7 @@ RenderBlendPass(int pass) using namespace rw::d3d; using namespace rw::d3d9; - if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_MOBILE) - setVertexShader(CustomPipes::leedsBuilding_mobile_VS); - else - setVertexShader(CustomPipes::leedsBuilding_VS); - setPixelShader(CustomPipes::scale_PS); - - CustomPipes::uploadWorldLights(); - - float colorscale[4]; - colorscale[3] = 1.0f; + setVertexShader(default_amb_VS); int i; for(i = 0; i < numBlendInsts[pass]; i++){ @@ -930,26 +693,26 @@ RenderBlendPass(int pass) setIndices(building->instHeader->indexBuffer); setVertexDeclaration(building->instHeader->vertexDeclaration); d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); + if(building->lighting) + setAmbient(pAmbient->color); + else + setAmbient(black); InstanceData *inst = building->instHeader->inst; for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ Material *m = inst->material; - if(m->texture == nil) - continue; if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) continue; // already done this one - float cs = 1.0f; - if(CustomPipes::WorldPipeSwitch != CustomPipes::WORLDPIPE_MOBILE && m->texture) - cs = 255/128.0f; - colorscale[0] = colorscale[1] = colorscale[2] = cs; - d3ddevice->SetPixelShaderConstantF(CustomPipes::PSLOC_colorscale, colorscale, 1); - - d3d::setTexture(0, m->texture); - rw::RGBA color = m->color; color.alpha = (color.alpha * building->fadeAlpha)/255; - setMaterial(color, m->surfaceProps, CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_PS2 ? 0.5f : 1.0f); + setMaterial(color, m->surfaceProps); // always modulate here + + if(m->texture){ + d3d::setTexture(0, m->texture); + setPixelShader(default_tex_PS); + }else + setPixelShader(default_PS); drawInst(building->instHeader, inst); } @@ -959,4 +722,3 @@ RenderBlendPass(int pass) #endif #endif -#endif diff --git a/src/extras/custompipes_gl.cpp b/src/extras/custompipes_gl.cpp index 5d24070..fd68c74 100644 --- a/src/extras/custompipes_gl.cpp +++ b/src/extras/custompipes_gl.cpp @@ -1,10 +1,6 @@ #include "common.h" #ifdef RW_OPENGL -#ifdef EXTENDED_PIPELINES - -#include "rpmatfx.h" - #include "main.h" #include "RwHelper.h" #include "Lights.h" @@ -17,6 +13,8 @@ #include "World.h" #include "custompipes.h" +#ifdef EXTENDED_PIPELINES + #ifndef LIBRW #error "Need librw for EXTENDED_PIPELINES" #endif @@ -35,211 +33,14 @@ static int32 u_reflProps; static int32 u_specDir; static int32 u_specColor; -static int32 u_amb; -static int32 u_emiss; -static int32 u_colorscale; - -static int32 u_texMatrix; -static int32 u_fxparams; - -static int32 u_skyTop; -static int32 u_skyBot; - #define U(i) currentShader->uniformLocations[i] /* - * Leeds & Neo Vehicle pipe + * Neo Vehicle pipe */ -rw::gl3::Shader *leedsVehicleShader_add; -rw::gl3::Shader *leedsVehicleShader_blend; -rw::gl3::Shader *leedsVehicleShader_mobile; - rw::gl3::Shader *neoVehicleShader; -static rw::RawMatrix normal2texcoord_flipU = { - { -0.5f, 0.0f, 0.0f }, 0.0f, - { 0.0f, -0.5f, 0.0f }, 0.0f, - { 0.0f, 0.0f, 1.0f }, 0.0f, - { 0.5f, 0.5f, 0.0f }, 1.0f -}; - -static void -uploadEnvMatrix(rw::Frame *frame) -{ - using namespace rw; - using namespace rw::gl3; - - Matrix invMat; - if(frame == nil) - frame = engine->currentCamera->getFrame(); - - // cache the matrix across multiple meshes - static RawMatrix envMtx; -// can't do it, frame matrix may change -// if(frame != lastEnvFrame){ -// lastEnvFrame = frame; - { - - Matrix tmp = *frame->getLTM(); - // Now the weird part: we remove the camera pitch - tmp.at.z = 0.0f; - tmp.at = normalize(tmp.at); - tmp.right.x = -tmp.at.y; - tmp.right.y = tmp.at.x; - tmp.right.z = 0.0f;; - tmp.up.set(0.0f, 0.0f, 1.0f); - tmp.pos.set(0.0f, 0.0f, 0.0f); - tmp.flags = Matrix::TYPEORTHONORMAL; - - RawMatrix invMtx; - Matrix::invert(&invMat, &tmp); - convMatrix(&invMtx, &invMat); - RawMatrix::mult(&envMtx, &invMtx, &normal2texcoord_flipU); - } - glUniformMatrix4fv(U(u_texMatrix), 1, GL_FALSE, (float*)&envMtx); -} - -static void -leedsVehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) -{ - using namespace rw; - using namespace rw::gl3; - - Material *m; - - setWorldMatrix(atomic->getFrame()->getLTM()); - lightingCB(atomic); - - setupVertexInput(header); - - InstanceData *inst = header->inst; - rw::int32 n = header->numMeshes; - - if(gGlassCarsCheat) - leedsVehicleShader_blend->use(); - else - leedsVehicleShader_add->use(); - - setTexture(1, EnvMapTex); - uploadEnvMatrix(nil); - - SetRenderState(SRCBLEND, BLENDONE); - - float colorscale[4]; - colorscale[3] = 1.0f; - - while(n--){ - m = inst->material; - - rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); - - float coef = 0.0f; - if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP){ - coef = CClock::ms_EnvMapTimeMultiplicator * RpMatFXMaterialGetEnvMapCoefficient(m)*0.5f; - if(gGlassCarsCheat) - coef = 1.0f; - } - glUniform1f(U(u_fxparams), coef); - - setMaterial(m->color, m->surfaceProps); - - float cs = 1.0f; - // how does the PS2 handle this actually? probably scaled material color? - if(VehiclePipeSwitch == VEHICLEPIPE_PSP && m->texture) - cs = 2.0f; - colorscale[0] = colorscale[1] = colorscale[2] = cs; - glUniform4fv(U(u_colorscale), 1, colorscale); - - setTexture(0, m->texture); - - drawInst(header, inst); - inst++; - } - - setTexture(1, nil); - - SetRenderState(SRCBLEND, BLENDSRCALPHA); - - teardownVertexInput(header); -} - -void -uploadWorldLights(void) -{ - using namespace rw; - using namespace rw::gl3; - - RGBAf amb, emiss; - amb.red = CTimeCycle::GetAmbientRed(); - amb.green = CTimeCycle::GetAmbientGreen(); - amb.blue = CTimeCycle::GetAmbientBlue(); - amb.alpha = 1.0f; - emiss = pAmbient->color; - - glUniform4fv(U(CustomPipes::u_amb), 1, (float*)&amb); - glUniform4fv(U(CustomPipes::u_emiss), 1, (float*)&emiss); -} - -static void -leedsVehicleRenderCB_mobile(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) -{ - using namespace rw; - using namespace rw::gl3; - - Material *m; - - setWorldMatrix(atomic->getFrame()->getLTM()); - lightingCB(atomic); - - setupVertexInput(header); - - InstanceData *inst = header->inst; - rw::int32 n = header->numMeshes; - - leedsVehicleShader_mobile->use(); - - uploadWorldLights(); - - RGBAf skyTop, skyBot; - skyTop.red = CTimeCycle::GetSkyTopRed()/255.0f; - skyTop.green = CTimeCycle::GetSkyTopGreen()/255.0f; - skyTop.blue = CTimeCycle::GetSkyTopBlue()/255.0f; - skyBot.red = CTimeCycle::GetSkyBottomRed()/255.0f; - skyBot.green = CTimeCycle::GetSkyBottomGreen()/255.0f; - skyBot.blue = CTimeCycle::GetSkyBottomBlue()/255.0f; - - glUniform3fv(U(u_skyTop), 1, (float*)&skyTop); - glUniform3fv(U(u_skyBot), 1, (float*)&skyBot); - - setTexture(1, EnvMapTex); - - while(n--){ - m = inst->material; - - rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); - - float coef = 0.0f; - if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP){ - coef = CClock::ms_EnvMapTimeMultiplicator * RpMatFXMaterialGetEnvMapCoefficient(m)*0.5f; - if(gGlassCarsCheat) - coef = 1.0f; - } - glUniform1f(U(u_fxparams), coef); - - setMaterial(m->color, m->surfaceProps); - - setTexture(0, m->texture); - - drawInst(header, inst); - inst++; - } - - setTexture(1, nil); - - teardownVertexInput(header); -} - static void uploadSpecLights(void) { @@ -279,18 +80,14 @@ vehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) using namespace rw::gl3; // TODO: make this less of a kludge - if(VehiclePipeSwitch == VEHICLEPIPE_PSP || VehiclePipeSwitch == VEHICLEPIPE_PS2){ - leedsVehicleRenderCB(atomic, header); -// matFXGlobals.pipelines[rw::platform]->render(atomic); - return; - } - if(VehiclePipeSwitch == VEHICLEPIPE_MOBILE){ - leedsVehicleRenderCB_mobile(atomic, header); + if(VehiclePipeSwitch == VEHICLEPIPE_MATFX){ + matFXGlobals.pipelines[rw::platform]->render(atomic); return; } Material *m; + rw::uint32 flags = atomic->geometry->flags; setWorldMatrix(atomic->getFrame()->getLTM()); lightingCB(atomic); @@ -317,7 +114,7 @@ vehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) while(n--){ m = inst->material; - setMaterial(m->color, m->surfaceProps); + setMaterial(flags, m->color, m->surfaceProps); setTexture(0, m->texture); @@ -344,15 +141,15 @@ 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); -// } + 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); + } { @@ -364,27 +161,6 @@ CreateVehiclePipe(void) assert(neoVehicleShader); } - { -#include "shaders/obj/leedsDefault_vert.inc" -#include "shaders/obj/leedsDefault_frag.inc" - const char *vs[] = { shaderDecl, header_vert_src, "#define ENVMAP\n", leedsDefault_vert_src, nil }; - const char *fs_add[] = { shaderDecl, header_frag_src, "#define PASS_ADD\n", leedsDefault_frag_src, nil }; - const char *fs_blend[] = { shaderDecl, header_frag_src, "#define PASS_BLEND\n", leedsDefault_frag_src, nil }; - leedsVehicleShader_add = Shader::create(vs, fs_add); - assert(leedsVehicleShader_add); - leedsVehicleShader_blend = Shader::create(vs, fs_blend); - assert(leedsVehicleShader_blend); - } - - { -#include "shaders/obj/leedsVehicle_mobile_frag.inc" -#include "shaders/obj/leedsVehicle_mobile_vert.inc" - const char *vs[] = { shaderDecl, header_vert_src, leedsVehicle_mobile_vert_src, nil }; - const char *fs[] = { shaderDecl, header_frag_src, leedsVehicle_mobile_frag_src, nil }; - leedsVehicleShader_mobile = Shader::create(vs, fs); - assert(leedsVehicleShader_mobile); - } - rw::gl3::ObjPipeline *pipe = rw::gl3::ObjPipeline::create(); pipe->instanceCB = rw::gl3::defaultInstanceCB; @@ -399,15 +175,6 @@ DestroyVehiclePipe(void) neoVehicleShader->destroy(); neoVehicleShader = nil; - leedsVehicleShader_add->destroy(); - leedsVehicleShader_add = nil; - - leedsVehicleShader_blend->destroy(); - leedsVehicleShader_blend = nil; - - leedsVehicleShader_mobile->destroy(); - leedsVehicleShader_mobile = nil; - ((rw::gl3::ObjPipeline*)vehiclePipe)->destroy(); vehiclePipe = nil; } @@ -415,11 +182,10 @@ DestroyVehiclePipe(void) /* - * Leeds World pipe + * Neo World pipe */ -rw::gl3::Shader *leedsWorldShader; -rw::gl3::Shader *leedsWorldShader_mobile; +rw::gl3::Shader *neoWorldShader; static void worldRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) @@ -427,43 +193,54 @@ worldRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) using namespace rw; using namespace rw::gl3; + if(!LightmapEnable){ + gl3::defaultRenderCB(atomic, header); + return; + } + Material *m; setWorldMatrix(atomic->getFrame()->getLTM()); + lightingCB(atomic); setupVertexInput(header); InstanceData *inst = header->inst; rw::int32 n = header->numMeshes; - if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_MOBILE) - CustomPipes::leedsWorldShader_mobile->use(); - else - CustomPipes::leedsWorldShader->use(); + neoWorldShader->use(); - uploadWorldLights(); - - float colorscale[4]; - colorscale[3] = 1.0f; + float lightfactor[4]; while(n--){ m = inst->material; - float cs = 1.0f; - if(WorldPipeSwitch != WORLDPIPE_MOBILE && m->texture) - cs = 255/128.0f; - colorscale[0] = colorscale[1] = colorscale[2] = cs; - glUniform4fv(U(u_colorscale), 1, colorscale); + 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); - setMaterial(m->color, m->surfaceProps, CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_PS2 ? 0.5f : 1.0f); - rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); drawInst(header, inst); inst++; } + setTexture(1, nil); teardownVertexInput(header); } @@ -473,22 +250,18 @@ 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); + 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/obj/scale_frag.inc" -#include "shaders/obj/leedsBuilding_vert.inc" -#include "shaders/obj/leedsBuilding_mobile_vert.inc" - const char *vs[] = { shaderDecl, header_vert_src, leedsBuilding_vert_src, nil }; - const char *vs_mobile[] = { shaderDecl, header_vert_src, leedsBuilding_mobile_vert_src, nil }; - const char *fs[] = { shaderDecl, header_frag_src, scale_frag_src, nil }; - leedsWorldShader = Shader::create(vs, fs); - assert(leedsWorldShader); - leedsWorldShader_mobile = Shader::create(vs_mobile, fs); - assert(leedsWorldShader_mobile); +#include "shaders/obj/neoWorldVC_frag.inc" +#include "shaders/obj/default_UV2_vert.inc" + 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); } @@ -502,10 +275,8 @@ CreateWorldPipe(void) void DestroyWorldPipe(void) { - leedsWorldShader->destroy(); - leedsWorldShader = nil; - leedsWorldShader_mobile->destroy(); - leedsWorldShader_mobile = nil; + neoWorldShader->destroy(); + neoWorldShader = nil; ((rw::gl3::ObjPipeline*)worldPipe)->destroy(); worldPipe = nil; @@ -541,7 +312,12 @@ glossRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) V3d eyePos = rw::engine->currentCamera->getFrame()->getLTM()->pos; glUniform3fv(U(u_eye), 1, (float*)&eyePos); - glUniform4fv(U(u_reflProps), 1, (float*)&GlossMult); + float reflProps[4]; + reflProps[0] = GlossMult; + reflProps[1] = 0.0f; + reflProps[2] = 0.0f; + reflProps[3] = 0.0f; + glUniform4fv(U(u_reflProps), 1, reflProps); SetRenderState(VERTEXALPHA, TRUE); SetRenderState(SRCBLEND, BLENDONE); @@ -650,6 +426,7 @@ rimSkinRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) Material *m; + rw::uint32 flags = atomic->geometry->flags; setWorldMatrix(atomic->getFrame()->getLTM()); lightingCB(atomic); @@ -667,7 +444,7 @@ rimSkinRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) while(n--){ m = inst->material; - setMaterial(m->color, m->surfaceProps); + setMaterial(flags, m->color, m->surfaceProps); setTexture(0, m->texture); @@ -692,6 +469,7 @@ rimRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) Material *m; + rw::uint32 flags = atomic->geometry->flags; setWorldMatrix(atomic->getFrame()->getLTM()); lightingCB(atomic); @@ -707,7 +485,7 @@ rimRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) while(n--){ m = inst->material; - setMaterial(m->color, m->surfaceProps); + setMaterial(flags, m->color, m->surfaceProps); setTexture(0, m->texture); @@ -799,22 +577,17 @@ CustomPipeRegisterGL(void) u_reflProps = rw::gl3::registerUniform("u_reflProps"); u_specDir = rw::gl3::registerUniform("u_specDir"); u_specColor = rw::gl3::registerUniform("u_specColor"); - - u_amb = rw::gl3::registerUniform("u_amb"); - u_emiss = rw::gl3::registerUniform("u_emiss"); - u_colorscale = rw::gl3::registerUniform("u_colorscale"); - - u_texMatrix = rw::gl3::registerUniform("u_texMatrix"); - u_fxparams = rw::gl3::registerUniform("u_fxparams"); - - u_skyTop = rw::gl3::registerUniform("u_skyTop"); - u_skyBot = rw::gl3::registerUniform("u_skyBot"); } } +#endif + #ifdef NEW_RENDERER +#ifndef LIBRW +#error "Need librw for NEW_PIPELINES" +#endif namespace WorldRender { @@ -855,20 +628,25 @@ AtomicFirstPass(RpAtomic *atomic, int pass) assert(building->instHeader->platform == PLATFORM_GL3); building->fadeAlpha = 255; building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); + rw::uint32 flags = atomic->geometry->flags; + + WorldLights lights; + lights.numAmbients = 1; + lights.numDirectionals = 0; + lights.numLocals = 0; + if(building->lighting) + lights.ambient = pAmbient->color; + else + lights.ambient = black; bool setupDone = false; bool defer = false; building->matrix = *atomic->getFrame()->getLTM(); - float colorscale[4]; - InstanceData *inst = building->instHeader->inst; for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ Material *m = inst->material; - if(m->texture == nil) - continue; - if(inst->vertexAlpha || m->color.alpha != 255 || IsTextureTransparent(m->texture)){ defer = true; @@ -877,27 +655,14 @@ AtomicFirstPass(RpAtomic *atomic, int pass) // alright we're rendering this atomic if(!setupDone){ - if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_MOBILE) - CustomPipes::leedsWorldShader_mobile->use(); - else - CustomPipes::leedsWorldShader->use(); + defaultShader->use(); setWorldMatrix(&building->matrix); setupVertexInput(building->instHeader); - - CustomPipes::uploadWorldLights(); - - colorscale[3] = 1.0f; - + setLights(&lights); setupDone = true; } - setMaterial(m->color, m->surfaceProps, CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_PS2 ? 0.5f : 1.0f); - - float cs = 1.0f; - if(CustomPipes::WorldPipeSwitch != CustomPipes::WORLDPIPE_MOBILE && m->texture) - cs = 255/128.0f; - colorscale[0] = colorscale[1] = colorscale[2] = cs; - glUniform4fv(U(CustomPipes::u_colorscale), 1, colorscale); + setMaterial(flags, m->color, m->surfaceProps); setTexture(0, m->texture); @@ -932,15 +697,11 @@ RenderBlendPass(int pass) using namespace rw; using namespace rw::gl3; - if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_MOBILE) - CustomPipes::leedsWorldShader_mobile->use(); - else - CustomPipes::leedsWorldShader->use(); - - CustomPipes::uploadWorldLights(); - - float colorscale[4]; - colorscale[3] = 1.0f; + defaultShader->use(); + WorldLights lights; + lights.numAmbients = 1; + lights.numDirectionals = 0; + lights.numLocals = 0; int i; for(i = 0; i < numBlendInsts[pass]; i++){ @@ -948,24 +709,21 @@ RenderBlendPass(int pass) setupVertexInput(building->instHeader); setWorldMatrix(&building->matrix); + if(building->lighting) + lights.ambient = pAmbient->color; + else + lights.ambient = black; + setLights(&lights); InstanceData *inst = building->instHeader->inst; for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ Material *m = inst->material; - if(m->texture == nil) - continue; if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) continue; // already done this one rw::RGBA color = m->color; color.alpha = (color.alpha * building->fadeAlpha)/255; - setMaterial(color, m->surfaceProps, CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_PS2 ? 0.5f : 1.0f); - - float cs = 1.0f; - if(CustomPipes::WorldPipeSwitch != CustomPipes::WORLDPIPE_MOBILE && m->texture) - cs = 255/128.0f; - colorscale[0] = colorscale[1] = colorscale[2] = cs; - glUniform4fv(U(CustomPipes::u_colorscale), 1, colorscale); + setMaterial(color, m->surfaceProps); // always modulate here setTexture(0, m->texture); @@ -978,4 +736,3 @@ RenderBlendPass(int pass) #endif #endif -#endif diff --git a/src/extras/postfx.cpp b/src/extras/postfx.cpp index 1ccd8ac..f698bd5 100644 --- a/src/extras/postfx.cpp +++ b/src/extras/postfx.cpp @@ -7,6 +7,7 @@ #error "Need librw for EXTENDED_COLOURFILTER" #endif +#include "main.h" #include "RwHelper.h" #include "Camera.h" #include "MBlur.h" @@ -15,25 +16,23 @@ RwRaster *CPostFX::pFrontBuffer; RwRaster *CPostFX::pBackBuffer; bool CPostFX::bJustInitialised; -int CPostFX::EffectSwitch = POSTFX_PS2; +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 }; -static RwIm2DVertex BlurVertex[12]; -static RwImVertexIndex BlurIndex[18] = { 0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11 }; #ifdef RW_D3D9 -void *colourfilterLCS_PS; +void *colourfilterVC_PS; void *contrast_PS; #endif #ifdef RW_OPENGL int32 u_blurcolor; int32 u_contrastAdd; int32 u_contrastMult; -rw::gl3::Shader *colourFilterLCS; +rw::gl3::Shader *colourFilterVC; rw::gl3::Shader *contrast; #endif @@ -144,8 +143,8 @@ CPostFX::Open(RwCamera *cam) #ifdef RW_D3D9 -#include "shaders/obj/colourfilterLCS_PS.inc" - colourfilterLCS_PS = rw::d3d::createPixelShader(colourfilterLCS_PS_cso); +#include "shaders/obj/colourfilterVC_PS.inc" + colourfilterVC_PS = rw::d3d::createPixelShader(colourfilterVC_PS_cso); #include "shaders/obj/contrastPS.inc" contrast_PS = rw::d3d::createPixelShader(contrastPS_cso); #endif @@ -154,11 +153,11 @@ CPostFX::Open(RwCamera *cam) { #include "shaders/obj/im2d_vert.inc" -#include "shaders/obj/colourfilterLCS_frag.inc" +#include "shaders/obj/colourfilterVC_frag.inc" const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil }; - const char *fs[] = { shaderDecl, header_frag_src, colourfilterLCS_frag_src, nil }; - colourFilterLCS = Shader::create(vs, fs); - assert(colourFilterLCS); + const char *fs[] = { shaderDecl, header_frag_src, colourfilterVC_frag_src, nil }; + colourFilterVC = Shader::create(vs, fs); + assert(colourFilterVC); } { @@ -185,9 +184,9 @@ CPostFX::Close(void) pBackBuffer = nil; } #ifdef RW_D3D9 - if(colourfilterLCS_PS){ - rw::d3d::destroyPixelShader(colourfilterLCS_PS); - colourfilterLCS_PS = nil; + if(colourfilterVC_PS){ + rw::d3d::destroyPixelShader(colourfilterVC_PS); + colourfilterVC_PS = nil; } if(contrast_PS){ rw::d3d::destroyPixelShader(contrast_PS); @@ -195,9 +194,9 @@ CPostFX::Close(void) } #endif #ifdef RW_OPENGL - if(colourFilterLCS){ - colourFilterLCS->destroy(); - colourFilterLCS = nil; + if(colourFilterVC){ + colourFilterVC->destroy(); + colourFilterVC = nil; } if(contrast){ contrast->destroy(); @@ -206,44 +205,9 @@ CPostFX::Close(void) #endif } -static float blurOffset = 0.6f;//3.0f/16.0f; // not quite sure sure about this -static float blurIntensity = 0.25f; - void CPostFX::RenderOverlayBlur(RwCamera *cam, int32 r, int32 g, int32 b, int32 a) { - memcpy(BlurVertex, Vertex, sizeof(Vertex)); - memcpy(BlurVertex+4, Vertex, sizeof(Vertex)); - memcpy(BlurVertex+8, Vertex, sizeof(Vertex)); - int intensity = 255*blurIntensity; - int i; - for(i = 0; i < 4; i++){ - RwIm2DVertexSetScreenX(&BlurVertex[i], RwIm2DVertexGetScreenX(&BlurVertex[i]) + blurOffset); - RwIm2DVertexSetIntRGBA(&BlurVertex[i], 255, 255, 255, intensity); - } - for(i = 4; i < 8; i++){ - RwIm2DVertexSetScreenX(&BlurVertex[i], RwIm2DVertexGetScreenX(&BlurVertex[i]) + blurOffset); - RwIm2DVertexSetScreenY(&BlurVertex[i], RwIm2DVertexGetScreenY(&BlurVertex[i]) + blurOffset); - RwIm2DVertexSetIntRGBA(&BlurVertex[i], 255, 255, 255, intensity); - } - for(i = 8; i < 12; i++){ - RwIm2DVertexSetScreenY(&BlurVertex[i], RwIm2DVertexGetScreenY(&BlurVertex[i]) + blurOffset); - RwIm2DVertexSetIntRGBA(&BlurVertex[i], 255, 255, 255, intensity); - } - - RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pBackBuffer); - RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR); - RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); - RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); - RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); - - RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, BlurVertex, 12, BlurIndex, 18); - - // this sucks: should render colourfilter with blending instead - // but can't change equation to subtraction for PSP here - GetBackBuffer(cam); - -/* the old way RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pFrontBuffer); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); @@ -276,7 +240,6 @@ CPostFX::RenderOverlayBlur(RwCamera *cam, int32 r, int32 g, int32 b, int32 a) RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6); RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, BlurOn ? Vertex2 : Vertex, 4, Index, 6); -*/ } void @@ -328,15 +291,15 @@ CPostFX::RenderOverlayShader(RwCamera *cam, int32 r, int32 g, int32 b, int32 a) blurcolors[0] = r*f/255.0f; blurcolors[1] = g*f/255.0f; blurcolors[2] = b*f/255.0f; - blurcolors[3] = EffectSwitch == POSTFX_PSP ? -1.0f : 1.0f; + blurcolors[3] = 30/255.0f; #ifdef RW_D3D9 rw::d3d::d3ddevice->SetPixelShaderConstantF(10, blurcolors, 1); - rw::d3d::im2dOverridePS = colourfilterLCS_PS; + rw::d3d::im2dOverridePS = colourfilterVC_PS; #endif #ifdef RW_OPENGL - rw::gl3::im2dOverrideShader = colourFilterLCS; - colourFilterLCS->use(); - glUniform4fv(colourFilterLCS->uniformLocations[u_blurcolor], 1, blurcolors); + rw::gl3::im2dOverrideShader = colourFilterVC; + colourFilterVC->use(); + glUniform4fv(colourFilterVC->uniformLocations[u_blurcolor], 1, blurcolors); #endif } RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6); @@ -376,8 +339,11 @@ CPostFX::NeedBackBuffer(void) case POSTFX_SIMPLE: // no actual rendering here return false; - case POSTFX_PSP: - case POSTFX_PS2: + case POSTFX_NORMAL: + if(MotionBlurOn) + return false; + else + return true; case POSTFX_MOBILE: return true; } @@ -388,11 +354,24 @@ bool CPostFX::NeedFrontBuffer(int32 type) { // Last frame -- needed for motion blur - if(MotionBlurOn) + 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; } @@ -407,17 +386,13 @@ CPostFX::GetBackBuffer(RwCamera *cam) void CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha) { - // LCS PS2 blur is drawn in three passes: - // blend frame with current frame 3 times to blur a bit - // blend one more time with colour filter - // motion blur like normal + PUSH_RENDERGROUP("CPostFX::Render"); if(pFrontBuffer == nil) Open(cam); assert(pFrontBuffer); assert(pBackBuffer); -/* // LCS: don't need that anymore if(type == MOTION_BLUR_LIGHT_SCENE){ SmoothColor(red, green, blue, blur); red = AvgRed; @@ -425,7 +400,6 @@ CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blu blue = AvgBlue; blur = AvgAlpha; } -*/ if(NeedBackBuffer()) GetBackBuffer(cam); @@ -433,15 +407,10 @@ CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blu DefinedState(); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); + RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); - if(BlurOn) - RenderOverlayBlur(cam, 0, 0, 0, 0); - - RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST); - - // TODO(LCS): check this out if(type == MOTION_BLUR_SNIPER){ if(!bJustInitialised) RenderOverlaySniper(cam, red, green, blue, blur); @@ -450,16 +419,21 @@ CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blu case POSTFX_SIMPLE: // no actual rendering here break; - case POSTFX_PSP: - case POSTFX_PS2: + 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(MotionBlurOn) - if(!bJustInitialised) - RenderMotionBlur(cam, bluralpha); + if(!bJustInitialised) + RenderMotionBlur(cam, 175.0f * CMBlur::Drunkness); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); @@ -475,6 +449,8 @@ CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blu bJustInitialised = false; }else bJustInitialised = true; + + POP_RENDERGROUP(); } int CPostFX::PrevRed[NUMAVERAGE], CPostFX::AvgRed; diff --git a/src/extras/postfx.h b/src/extras/postfx.h index 232c151..db702bf 100644 --- a/src/extras/postfx.h +++ b/src/extras/postfx.h @@ -7,12 +7,9 @@ class CPostFX public: enum { POSTFX_OFF, - POSTFX_PSP, - POSTFX_PS2, - - // not so sensible for the moment - POSTFX_SIMPLE = -1, - POSTFX_MOBILE = -2 + POSTFX_SIMPLE, + POSTFX_NORMAL, + POSTFX_MOBILE }; static RwRaster *pFrontBuffer; static RwRaster *pBackBuffer; diff --git a/src/extras/shaders/colourfilterLCS.frag b/src/extras/shaders/colourfilterLCS.frag deleted file mode 100644 index 272ebb0..0000000 --- a/src/extras/shaders/colourfilterLCS.frag +++ /dev/null @@ -1,20 +0,0 @@ -uniform sampler2D tex0; -uniform vec4 u_blurcolor; - -FSIN vec4 v_color; -FSIN vec2 v_tex0; -FSIN float v_fog; - -void -main(void) -{ - vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); - dst += dst*u_blurcolor; - - vec4 color; - color.rgb = dst.rgb; - color.a = 1.0; - - FRAGCOLOR(color); -} - diff --git a/src/extras/shaders/colourfilterLCS_PS.hlsl b/src/extras/shaders/colourfilterLCS_PS.hlsl deleted file mode 100644 index df1beef..0000000 --- a/src/extras/shaders/colourfilterLCS_PS.hlsl +++ /dev/null @@ -1,10 +0,0 @@ -sampler2D tex : register(s0); -float4 blurcol : register(c10); - -float4 main(in float2 texcoord : TEXCOORD0) : COLOR0 -{ - float4 dst = tex2D(tex, texcoord.xy); - dst += dst*blurcol*blurcol.a; - dst.a = 1.0; - return dst; -} diff --git a/src/extras/shaders/colourfilterVC.frag b/src/extras/shaders/colourfilterVC.frag new file mode 100644 index 0000000..283aa81 --- /dev/null +++ b/src/extras/shaders/colourfilterVC.frag @@ -0,0 +1,27 @@ +uniform sampler2D tex0; +uniform vec4 u_blurcolor; + +FSIN vec4 v_color; +FSIN vec2 v_tex0; +FSIN float v_fog; + +void +main(void) +{ + float a = u_blurcolor.a; + vec4 doublec = clamp(u_blurcolor*2.0, 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 tmp = dst*(1.0-a) + prev*doublec*a; + tmp += prev*u_blurcolor; + tmp += prev*u_blurcolor; + prev = clamp(tmp, 0.0, 1.0); + } + vec4 color; + color.rgb = prev.rgb; + color.a = 1.0; + + FRAGCOLOR(color); +} + diff --git a/src/extras/shaders/colourfilterVC_PS.hlsl b/src/extras/shaders/colourfilterVC_PS.hlsl new file mode 100644 index 0000000..90d3b50 --- /dev/null +++ b/src/extras/shaders/colourfilterVC_PS.hlsl @@ -0,0 +1,23 @@ +sampler2D tex : register(s0); +float4 blurcol : register(c10); + +//float4 blurcols[10] : register(c15); + + +float4 main(in float2 texcoord : TEXCOORD0) : COLOR0 +{ + float a = blurcol.a; + + float4 doublec = saturate(blurcol*2); + float4 dst = tex2D(tex, texcoord.xy); + float4 prev = dst; + for(int i = 0; i < 5; i++){ +// float4 doublec = saturate(blurcol*2); + float4 tmp = dst*(1-a) + prev*doublec*a; + tmp += prev*blurcol; + tmp += prev*blurcol; + prev = saturate(tmp); + } + prev.a = 1.0; + return prev; +} diff --git a/src/extras/shaders/leedsBuilding.vert b/src/extras/shaders/leedsBuilding.vert deleted file mode 100644 index 766cd08..0000000 --- a/src/extras/shaders/leedsBuilding.vert +++ /dev/null @@ -1,28 +0,0 @@ -uniform vec4 u_amb; -uniform vec4 u_emiss; - -#define surfEmissive (u_surfProps.w) - -VSIN(ATTRIB_POS) vec3 in_pos; - -VSOUT vec4 v_color; -VSOUT vec2 v_tex0; -VSOUT 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_color = in_color; - v_color.rgb *= u_amb.rgb; - v_color.rgb += u_emiss.rgb*surfEmissive; - v_color = clamp(v_color, 0.0, 1.0); - v_color.a *= u_matColor.a; - - v_fog = DoFog(gl_Position.w); -} diff --git a/src/extras/shaders/leedsBuilding_VS.hlsl b/src/extras/shaders/leedsBuilding_VS.hlsl deleted file mode 100644 index 1ed939c..0000000 --- a/src/extras/shaders/leedsBuilding_VS.hlsl +++ /dev/null @@ -1,43 +0,0 @@ -#include "standardConstants.h" - -#define surfEmissive (surfProps.w) - -float4 emissive : register(c41); -float4 ambient : register(c42); - -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 - 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.Color = input.Prelight; - output.Color.rgb *= ambient.rgb; - output.Color.rgb += emissive.rgb*surfEmissive; - - output.Color = clamp(output.Color, 0.0, 1.0); - output.Color.a *= matCol.a; - - output.TexCoord0.z = clamp((output.Position.w - fogEnd)*fogRange, fogDisable, 1.0); - - return output; -} diff --git a/src/extras/shaders/leedsBuilding_mobile.vert b/src/extras/shaders/leedsBuilding_mobile.vert deleted file mode 100644 index f06628e..0000000 --- a/src/extras/shaders/leedsBuilding_mobile.vert +++ /dev/null @@ -1,52 +0,0 @@ -uniform vec4 u_amb; -uniform vec4 u_emiss; - -#define surfEmissive (u_surfProps.w) - -#define vertContrast (1.5) -#define vertBrightness (0.25) -#define ambientContrast (1.2) -#define ambientBrightness (0.1) -#define emissiveContrast (1.25) -#define emissiveBrightness (0.05) - - -VSIN(ATTRIB_POS) vec3 in_pos; - -VSOUT vec4 v_color; -VSOUT vec2 v_tex0; -VSOUT 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; - - vec4 vertCol = in_color; - vec4 amb = u_amb; - vec4 emiss = u_emiss; - - vertCol.xyz = ((vertCol.xyz - 0.5) * max(vertContrast, 0.0)) + 0.5; - vertCol.xyz += vertBrightness; - vertCol.xyz = max(vertCol.xyz, vec3(0.0,0.0,0.0)); - - amb.xyz = ((amb.xyz - 0.5) * max(ambientContrast, 0.0)) + 0.5; - amb.xyz += ambientBrightness; - amb.xyz = max(amb.xyz, vec3(0.0,0.0,0.0)); - - emiss.xyz = ((emiss.xyz - 0.5) * max(emissiveContrast, 0.0)) + 0.5; - emiss.xyz += emissiveBrightness; - emiss.xyz = max(emiss.xyz, vec3(0.0,0.0,0.0)); - v_color.xyz = emiss.xyz + (vertCol.xyz * amb.xyz); - v_color.w = vertCol.w; - - - v_color = clamp(v_color, 0.0, 1.0); - v_color.a *= u_matColor.a; - - v_fog = DoFog(gl_Position.w); -} diff --git a/src/extras/shaders/leedsBuilding_mobile_VS.hlsl b/src/extras/shaders/leedsBuilding_mobile_VS.hlsl deleted file mode 100644 index 23accf6..0000000 --- a/src/extras/shaders/leedsBuilding_mobile_VS.hlsl +++ /dev/null @@ -1,64 +0,0 @@ -#include "standardConstants.h" - -#define surfEmissive (surfProps.w) - -#define vertContrast (1.5) -#define vertBrightness (0.25) -#define ambientContrast (1.2) -#define ambientBrightness (0.1) -#define emissiveContrast (1.25) -#define emissiveBrightness (0.05) - -float4 emissive : register(c41); -float4 ambient : register(c42); - -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 - 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; - - float4 vertCol = input.Prelight; - float4 amb = ambient; - float4 emiss = emissive; - - vertCol.xyz = ((vertCol.xyz - 0.5) * max(vertContrast, 0.0)) + 0.5; - vertCol.xyz += vertBrightness; - vertCol.xyz = max(vertCol.xyz, float3(0.0,0.0,0.0)); - - amb.xyz = ((amb.xyz - 0.5) * max(ambientContrast, 0.0)) + 0.5; - amb.xyz += ambientBrightness; - amb.xyz = max(amb.xyz, float3(0.0,0.0,0.0)); - - emiss.xyz = ((emiss.xyz - 0.5) * max(emissiveContrast, 0.0)) + 0.5; - emiss.xyz += emissiveBrightness; - emiss.xyz = max(emiss.xyz, float3(0.0,0.0,0.0)); - output.Color.xyz = emiss.xyz + (vertCol.xyz * amb.xyz); - output.Color.w = vertCol.w; - - output.Color = clamp(output.Color, 0.0, 1.0); - output.Color.a *= matCol.a; - - output.TexCoord0.z = clamp((output.Position.w - fogEnd)*fogRange, fogDisable, 1.0); - - return output; -} diff --git a/src/extras/shaders/leedsDefault.frag b/src/extras/shaders/leedsDefault.frag deleted file mode 100644 index 3955e6a..0000000 --- a/src/extras/shaders/leedsDefault.frag +++ /dev/null @@ -1,48 +0,0 @@ -uniform sampler2D tex0; -uniform sampler2D tex1; - -uniform float u_fxparams; -uniform vec4 u_colorscale; - -#define shininess (u_fxparams) - -FSIN vec4 v_color; -FSIN vec2 v_tex0; -#if defined(PASS_BLEND) || defined(PASS_ADD) -FSIN vec2 v_tex1; -#endif -FSIN float v_fog; - -void -main(void) -{ - vec4 pass1 = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y))*u_colorscale; - pass1.rgb = clamp(pass1.rgb, 0.0, 1.0); - pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog); - - vec4 color; -#if defined(PASS_BLEND) || defined(PASS_ADD) - vec4 pass2 = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y)); - pass2.a *= shininess; - pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_fog); - - // We simulate drawing this in two passes. -#if defined(PASS_ADD) - // First pass with standard blending, second with addition - // We premultiply alpha so render state should be one. - color.rgb = pass1.rgb*pass1.a + pass2.rgb*pass2.a; - color.a = pass1.a; -#elif defined(PASS_BLEND) - // We premultiply alpha so render state should be one. - color.rgb = pass1.rgb*pass1.a*(1.0-pass2.a) + pass2.rgb*pass2.a; - color.a = pass1.a*(1.0-pass2.a) + pass2.a; -#endif - -#else - color = pass1; -#endif - - DoAlphaTest(color.a); - - FRAGCOLOR(color); -} diff --git a/src/extras/shaders/leedsDefault.vert b/src/extras/shaders/leedsDefault.vert deleted file mode 100644 index 9cb18a6..0000000 --- a/src/extras/shaders/leedsDefault.vert +++ /dev/null @@ -1,51 +0,0 @@ -#ifdef ENVMAP -uniform mat4 u_texMatrix; -#endif -#ifdef SKIN -uniform mat4 u_boneMatrices[64]; -#endif - -VSIN(ATTRIB_POS) vec3 in_pos; - -VSOUT vec4 v_color; -VSOUT vec2 v_tex0; -#ifdef ENVMAP -VSOUT vec2 v_tex1; -#endif -VSOUT float v_fog; - -void -main(void) -{ -#ifdef SKIN - vec3 SkinVertex = vec3(0.0, 0.0, 0.0); - vec3 SkinNormal = vec3(0.0, 0.0, 0.0); - for(int i = 0; i < 4; i++){ - SkinVertex += (u_boneMatrices[int(in_indices[i])] * vec4(in_pos, 1.0)).xyz * in_weights[i]; - SkinNormal += (mat3(u_boneMatrices[int(in_indices[i])]) * in_normal) * in_weights[i]; - } - - vec4 Vertex = u_world * vec4(SkinVertex, 1.0); - gl_Position = u_proj * u_view * Vertex; - vec3 Normal = mat3(u_world) * SkinNormal; -#else - vec4 Vertex = u_world * vec4(in_pos, 1.0); - gl_Position = u_proj * u_view * Vertex; - vec3 Normal = mat3(u_world) * in_normal; -#endif - - v_tex0 = in_tex0; -#ifdef ENVMAP - v_tex1 = (u_texMatrix * vec4(Normal, 1.0)).xy; -#endif - - v_color = in_color; - v_color.rgb += u_ambLight.rgb*surfAmbient; - v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse; - // PS2 clamps before material color - // PSP clamps after...maybe another constant for this? - 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/leedsDefault_PS_x.hlsl b/src/extras/shaders/leedsDefault_PS_x.hlsl deleted file mode 100644 index 0b54652..0000000 --- a/src/extras/shaders/leedsDefault_PS_x.hlsl +++ /dev/null @@ -1,49 +0,0 @@ -struct VS_out { - float4 Position : POSITION; - float3 TexCoord0 : TEXCOORD0; -#if defined(PASS_BLEND) || defined(PASS_ADD) - float2 TexCoord1 : TEXCOORD1; -#endif - float4 Color : COLOR0; -}; - -sampler2D diffTex : register(s0); -sampler2D envTex : register(s1); - -float4 fogColor : register(c0); - -float4 colorscale : register(c1); -float4 fxparams : register(c2); - -#define shininess (fxparams.x) - -float4 main(VS_out input) : COLOR -{ - float4 pass1 = input.Color*tex2D(diffTex, input.TexCoord0.xy)*colorscale; - pass1.rgb = clamp(pass1.rgb, 0.0, 1.0); - pass1.rgb = lerp(fogColor.rgb, pass1.rgb, input.TexCoord0.z); - - float4 color; -#if defined(PASS_BLEND) || defined(PASS_ADD) - float4 pass2 = tex2D(envTex, input.TexCoord1.xy); - pass2.a *= shininess; - pass2.rgb = lerp(float3(0.0, 0.0, 0.0), pass2.rgb, input.TexCoord0.z); - - // We simulate drawing this in two passes. -#if defined(PASS_ADD) - // First pass with standard blending, second with addition - // We premultiply alpha so render state should be one. - color.rgb = pass1.rgb*pass1.a + pass2.rgb*pass2.a; - color.a = pass1.a; -#elif defined(PASS_BLEND) - // We premultiply alpha so render state should be one. - color.rgb = pass1.rgb*pass1.a*(1.0-pass2.a) + pass2.rgb*pass2.a; - color.a = pass1.a*(1.0-pass2.a) + pass2.a; -#endif - -#else - color = pass1; -#endif - - return color; -} diff --git a/src/extras/shaders/leedsDefault_VS_x.hlsl b/src/extras/shaders/leedsDefault_VS_x.hlsl deleted file mode 100644 index 58bee09..0000000 --- a/src/extras/shaders/leedsDefault_VS_x.hlsl +++ /dev/null @@ -1,72 +0,0 @@ -#include "standardConstants.h" - -#ifdef ENVMAP -float4x4 texMat : register(c41); -#endif -#ifdef SKIN -float4x3 boneMatrices[64] : register(c41); -#endif - -struct VS_in -{ - float4 Position : POSITION; - float3 Normal : NORMAL; - float2 TexCoord : TEXCOORD0; - float4 Prelight : COLOR0; -#ifdef SKIN - float4 Weights : BLENDWEIGHT; - int4 Indices : BLENDINDICES; -#endif -}; - -struct VS_out { - float4 Position : POSITION; - float3 TexCoord0 : TEXCOORD0; // also fog -#ifdef ENVMAP - float2 TexCoord1 : TEXCOORD1; -#endif - float4 Color : COLOR0; -}; - - -VS_out main(in VS_in input) -{ - VS_out output; - -#ifdef SKIN - 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, SkinVertex); -// float3 V = mul(worldMat, SkinVertex).xyz; - float3 N = mul(normalMat, SkinNormal); -#else - output.Position = mul(combinedMat, input.Position); -// float3 V = mul(worldMat, input.Position).xyz; - float3 N = mul(normalMat, input.Normal); -#endif - - output.TexCoord0.xy = input.TexCoord; -#ifdef ENVMAP - output.TexCoord1 = mul(texMat, float4(N, 1.0)).xy; -#endif - - output.Color = input.Prelight; - output.Color.rgb += ambientLight.rgb * surfAmbient; - - int i; - for(i = 0; i < numDirLights; i++) - output.Color.xyz += DoDirLight(lights[i+firstDirLight], N)*surfDiffuse; - // PS2 clamps before material color - // PSP clamps after...maybe another constant for this? - 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/leedsVehicle_mobile.frag b/src/extras/shaders/leedsVehicle_mobile.frag deleted file mode 100644 index 467379d..0000000 --- a/src/extras/shaders/leedsVehicle_mobile.frag +++ /dev/null @@ -1,76 +0,0 @@ -uniform sampler2D tex0; -uniform sampler2D tex1; - -uniform float u_fxparams; -uniform vec3 u_skyTop; -uniform vec3 u_skyBot; - -#define shininess (u_fxparams) - -// matfx: -// case 1 normal envmap -// custom1 (4.0, 1.0, 1.0, coef) -// custom2 (0.25, 3.0, 1.0, 1.0) -// case 2 too strong -// custom1 (4.0, 1.0, 2.0, coef) -// custom2 (0.5, 3.0, 1.0, 1.0) -// ???: practically no fresnel -// custom1 (4.0, 1.25, 0.01, coef) -// custom2 (1.0, 2.0, 1.1, 2.0) - -#define power (4.0) - -#define preMult (1.0) -#define postMult (1.0) -#define minRefl (0.25) -#define maxRefl (3.0) -#define minOpacity (1.0) -#define maxOpacity (1.0) - -//#define preMult (1.0) -//#define postMult (2.0) -//#define minRefl (0.5) -//#define maxRefl (3.0) -//#define minOpacity (1.0) -//#define maxOpacity (1.0) - -//#define preMult (1.25) -//#define postMult (0.01) -//#define minRefl (1.0) -//#define maxRefl (2.0) -//#define minOpacity (1.1) -//#define maxOpacity (2.0) - -FSIN vec4 v_color; -FSIN vec2 v_tex0; -FSIN vec2 v_tex1; -FSIN float v_fog; -FSIN vec2 v_reflData; - -#define v_NdotV (v_reflData.x) -#define v_lightingCont (v_reflData.y) - -void -main(void) -{ - vec4 pass1 = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); - - vec3 envtex = texture(tex1, v_tex1).rgb; // V flipped - vec3 skyColour = mix(u_skyBot, u_skyTop, envtex.g); - vec3 envOut = mix(envtex.rrr, skyColour, envtex.b); - - float fresnel = mix(shininess, shininess * 2.0, v_NdotV); - fresnel = pow(v_NdotV * preMult, power); - fresnel = clamp(fresnel * postMult, 0.0, 1.0); - float reflectivity = v_lightingCont * mix(minRefl, maxRefl, fresnel)*shininess; - - float opacity = mix(minOpacity, maxOpacity, fresnel)*pass1.a; - vec4 color = pass1 + vec4(reflectivity * envOut, 0.0); - color.a = opacity; - - color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog); - - DoAlphaTest(color.a); - - FRAGCOLOR(color); -} diff --git a/src/extras/shaders/leedsVehicle_mobile.vert b/src/extras/shaders/leedsVehicle_mobile.vert deleted file mode 100644 index b2123fa..0000000 --- a/src/extras/shaders/leedsVehicle_mobile.vert +++ /dev/null @@ -1,40 +0,0 @@ -uniform vec4 u_amb; -uniform vec4 u_emiss; - -VSIN(ATTRIB_POS) vec3 in_pos; - -VSOUT vec4 v_color; -VSOUT vec2 v_tex0; -VSOUT vec2 v_tex1; -VSOUT float v_fog; -VSOUT vec2 v_reflData; - -#define v_NdotV (v_reflData.x) -#define v_lightingCont (v_reflData.y) - -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 ViewNormal = mat3(u_view) * Normal; - v_tex1 = (ViewNormal.xy + vec2(1.0, 1.0))*0.5; - - v_color = in_color; - vec4 combinedAmbient = mix(u_emiss, u_amb, Normal.z); - v_color.rgb += combinedAmbient.rgb*surfAmbient; - v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse; - v_lightingCont = max(0.5, (v_color.r + v_color.g + v_color.b) / 3.0); - v_color *= u_matColor; - - // for fresnel - vec3 camPos = -u_view[3].xyz * mat3(u_view); - vec3 viewVec = normalize(Vertex.xyz - camPos); - v_NdotV = 1.0 - dot(-Normal.xyz, viewVec.xyz); - - v_fog = DoFog(gl_Position.w); -} diff --git a/src/extras/shaders/leedsVehicle_mobile_PS.hlsl b/src/extras/shaders/leedsVehicle_mobile_PS.hlsl deleted file mode 100644 index a343b32..0000000 --- a/src/extras/shaders/leedsVehicle_mobile_PS.hlsl +++ /dev/null @@ -1,53 +0,0 @@ -struct VS_out { - float4 Position : POSITION; - float3 TexCoord0 : TEXCOORD0; - float2 TexCoord1 : TEXCOORD1; - float2 ReflData : TEXCOORD2; - float4 Color : COLOR0; -}; - -#define NdotV (input.ReflData.x) -#define lightingCont (input.ReflData.y) - -sampler2D diffTex : register(s0); -sampler2D envTex : register(s1); - -float4 fogColor : register(c0); - -float4 fxparams : register(c2); -float3 skyTop : register(c3); -float3 skyBot : register(c4); - -#define shininess (fxparams.x) - -#define power (4.0) - -#define preMult (1.0) -#define postMult (1.0) -#define minRefl (0.25) -#define maxRefl (3.0) -#define minOpacity (1.0) -#define maxOpacity (1.0) - - -float4 main(VS_out input) : COLOR -{ - float4 pass1 = input.Color*tex2D(diffTex, input.TexCoord0.xy); - - float3 envtex = tex2D(envTex, float2(input.TexCoord1.x, 1.0-input.TexCoord1.y)).rgb; // V flipped - float3 skyColour = lerp(skyBot, skyTop, envtex.g); - float3 envOut = lerp(envtex.rrr, skyColour, envtex.b); - - float fresnel = lerp(shininess, shininess * 2.0, NdotV); - fresnel = pow(NdotV * preMult, power); - fresnel = clamp(fresnel * postMult, 0.0, 1.0); - float reflectivity = lightingCont * lerp(minRefl, maxRefl, fresnel)*shininess; - - float opacity = lerp(minOpacity, maxOpacity, fresnel)*pass1.a; - float4 color = pass1 + float4(reflectivity * envOut, 0.0); - color.a = opacity; - - color.rgb = lerp(fogColor.rgb, color.rgb, input.TexCoord0.z); - - return color; -} diff --git a/src/extras/shaders/leedsVehicle_mobile_VS.hlsl b/src/extras/shaders/leedsVehicle_mobile_VS.hlsl deleted file mode 100644 index 3085c5e..0000000 --- a/src/extras/shaders/leedsVehicle_mobile_VS.hlsl +++ /dev/null @@ -1,57 +0,0 @@ -#include "standardConstants.h" - -float4 emissive : register(c41); -float4 ambient : register(c42); -float4x4 viewMat : register(c43); - -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; - float2 ReflData : TEXCOORD2; - float4 Color : COLOR0; -}; - -#define NdotV (output.ReflData.x) -#define lightingCont (output.ReflData.y) - -VS_out main(in VS_in input) -{ - VS_out output; - - output.Position = mul(combinedMat, input.Position); - float3 V = mul(worldMat, input.Position).xyz; - float3 N = mul(normalMat, input.Normal); - - output.TexCoord0.xy = input.TexCoord; - - float4 ViewNormal = mul(viewMat, float4(N, 0.0)); - output.TexCoord1 = (ViewNormal.xy + float2(1.0, 1.0))*0.5; - - output.Color = input.Prelight; - float4 combinedAmbient = lerp(emissive, ambient, N.z); - output.Color.rgb += combinedAmbient.rgb * surfAmbient; - - int i; - for(i = 0; i < numDirLights; i++) - output.Color.xyz += DoDirLight(lights[i+firstDirLight], N)*surfDiffuse; - lightingCont = max(0.5, (output.Color.r + output.Color.g + output.Color.b) / 3.0); - output.Color *= matCol; - - // for fresnel - float3 camPos = mul(-viewMat._m03_m13_m23, (float3x3)(viewMat)); - float3 viewVec = normalize(V.xyz - camPos); - NdotV = 1.0 - dot(-N.xyz, viewVec.xyz); - - output.TexCoord0.z = clamp((output.Position.w - fogEnd)*fogRange, fogDisable, 1.0); - - return output; -} diff --git a/src/extras/shaders/make_hlsl.cmd b/src/extras/shaders/make_hlsl.cmd new file mode 100644 index 0000000..dee9528 --- /dev/null +++ b/src/extras/shaders/make_hlsl.cmd @@ -0,0 +1,3 @@ +@echo off +for %%f in (*PS.hlsl) do "%DXSDK_DIR%\Utilities\bin\x86\fxc.exe" /T ps_2_0 /nologo /E main /Fo obj\%%~nf.cso %%f +for %%f in (*VS.hlsl) do "%DXSDK_DIR%\Utilities\bin\x86\fxc.exe" /T vs_2_0 /nologo /E main /Fo obj\%%~nf.cso %%f diff --git a/src/extras/shaders/scale.frag b/src/extras/shaders/scale.frag deleted file mode 100644 index 7d9d1ff..0000000 --- a/src/extras/shaders/scale.frag +++ /dev/null @@ -1,19 +0,0 @@ -uniform sampler2D tex0; -uniform vec4 u_colorscale; - -FSIN vec4 v_color; -FSIN vec2 v_tex0; -FSIN float v_fog; - -void -main(void) -{ - vec4 color; - color = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y))*u_colorscale; - color.rgb = clamp(color.rgb, 0.0, 1.0); - color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog); - DoAlphaTest(color.a); - - FRAGCOLOR(color); -} - diff --git a/src/extras/shaders/scale_PS.hlsl b/src/extras/shaders/scale_PS.hlsl deleted file mode 100644 index 54da9c8..0000000 --- a/src/extras/shaders/scale_PS.hlsl +++ /dev/null @@ -1,19 +0,0 @@ -struct VS_out { - float4 Position : POSITION; - float3 TexCoord0 : TEXCOORD0; - float4 Color : COLOR0; -}; - -sampler2D tex0 : register(s0); - -float4 fogColor : register(c0); -float4 colorscale : register(c1); - -float4 main(VS_out input) : COLOR -{ - float4 color = input.Color; - color *= tex2D(tex0, input.TexCoord0.xy)*colorscale; - color.rgb = clamp(color.rgb, 0.0, 1.0); - color.rgb = lerp(fogColor.rgb, color.rgb, input.TexCoord0.z); - return color; -} diff --git a/src/fakerw/fake.cpp b/src/fakerw/fake.cpp index dde7d03..1faf6ee 100644 --- a/src/fakerw/fake.cpp +++ b/src/fakerw/fake.cpp @@ -394,7 +394,7 @@ RwStream *RwStreamOpen(RwStreamType type, RwStreamAccessType accessType, const v return nil; } } -RwBool RwStreamClose(RwStream * stream, void *pData) { if (!stream) return false; stream->close(); rwFree(stream); return true; } +RwBool RwStreamClose(RwStream * stream, void *pData) { stream->close(); rwFree(stream); return true; } RwUInt32 RwStreamRead(RwStream * stream, void *buffer, RwUInt32 length) { return stream->read8(buffer, length); } RwStream *RwStreamWrite(RwStream * stream, const void *buffer, RwUInt32 length) { stream->write8(buffer, length); return stream; } RwStream *RwStreamSkip(RwStream * stream, RwUInt32 offset) { stream->seek(offset); return stream; } @@ -411,9 +411,6 @@ void RwIm2DVertexSetRecipCameraZ(RwIm2DVertex *vert, RwReal recipz) { vert->setR void RwIm2DVertexSetScreenX(RwIm2DVertex *vert, RwReal scrnx) { vert->setScreenX(scrnx); } void RwIm2DVertexSetScreenY(RwIm2DVertex *vert, RwReal scrny) { vert->setScreenY(scrny); } void RwIm2DVertexSetScreenZ(RwIm2DVertex *vert, RwReal scrnz) { vert->setScreenZ(scrnz); } -float RwIm2DVertexGetScreenX(RwIm2DVertex *vert) { return vert->getScreenX(); } -float RwIm2DVertexGetScreenY(RwIm2DVertex *vert) { return vert->getScreenY(); } -float RwIm2DVertexGetScreenZ(RwIm2DVertex *vert) { return vert->getScreenZ(); } void RwIm2DVertexSetU(RwIm2DVertex *vert, RwReal texU, RwReal recipz) { vert->setU(texU, recipz); } void RwIm2DVertexSetV(RwIm2DVertex *vert, RwReal texV, RwReal recipz) { vert->setV(texV, recipz); } void RwIm2DVertexSetIntRGBA(RwIm2DVertex *vert, RwUInt8 red, RwUInt8 green, RwUInt8 blue, RwUInt8 alpha) { vert->setColor(red, green, blue, alpha); } diff --git a/src/fakerw/rpworld.h b/src/fakerw/rpworld.h index 8e3b09f..f10a375 100644 --- a/src/fakerw/rpworld.h +++ b/src/fakerw/rpworld.h @@ -13,7 +13,6 @@ //struct RpMaterial; typedef rw::Material RpMaterial; -typedef rw::MaterialList RpMaterialList; typedef RpMaterial *(*RpMaterialCallBack)(RpMaterial *material, void *data); diff --git a/src/fakerw/rwcore.h b/src/fakerw/rwcore.h index 7a142ab..e5d2186 100644 --- a/src/fakerw/rwcore.h +++ b/src/fakerw/rwcore.h @@ -34,9 +34,6 @@ void RwIm2DVertexSetRecipCameraZ(RwIm2DVertex *vert, RwReal recipz); void RwIm2DVertexSetScreenX(RwIm2DVertex *vert, RwReal scrnx); void RwIm2DVertexSetScreenY(RwIm2DVertex *vert, RwReal scrny); void RwIm2DVertexSetScreenZ(RwIm2DVertex *vert, RwReal scrnz); -float RwIm2DVertexGetScreenX(RwIm2DVertex *vert); -float RwIm2DVertexGetScreenY(RwIm2DVertex *vert); -float RwIm2DVertexGetScreenZ(RwIm2DVertex *vert); void RwIm2DVertexSetU(RwIm2DVertex *vert, RwReal texU, RwReal recipz); void RwIm2DVertexSetV(RwIm2DVertex *vert, RwReal texV, RwReal recipz); void RwIm2DVertexSetIntRGBA(RwIm2DVertex *vert, RwUInt8 red, RwUInt8 green, RwUInt8 blue, RwUInt8 alpha); diff --git a/src/leeds/base/memoryManager.cpp b/src/leeds/base/memoryManager.cpp deleted file mode 100644 index 57e7d95..0000000 --- a/src/leeds/base/memoryManager.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "common.h" -#include "memoryManager.h" - -namespace base -{ - cMemoryManager::cMemoryManager() - { - - } - - void* cMemoryManager::Allocate(uint32 size) - { - void* buf = malloc(size); - memset(buf, 0, size); - return buf; - } - - void* cMemoryManager::AllocateAligned(uint32 size) - { - void* buf = malloc(size); - memset(buf, 0, size); - return buf; - } - - void* cMemoryManager::Realloc(void* buf, uint32 newSize, bool unk) - { - return realloc(buf, newSize); - } - - void cMemoryManager::Free(void* buf) - { - if (buf) - free(buf); - } - - bool cMemoryManager::IsFree(void* buf) - { - return buf == nil; - } - - - cMainMemoryManager* cMainMemoryManager::m_pInstance = nil; - - cMainMemoryManager::cMainMemoryManager() - { - assert(m_pInstance == nil); - m_pInstance = this; - Init(nil, 0); - } - - void cMainMemoryManager::Init(void*, uint32) - { - - } -}; - -void* operator new(size_t size) -{ - return base::cMainMemoryManager::Instance()->Allocate(size); -} - -void* operator new[](size_t size) -{ - return base::cMainMemoryManager::Instance()->Allocate(size); -} - -void operator delete(void* buf) noexcept -{ - base::cMainMemoryManager::Instance()->Free(buf); -} - -void operator delete[](void* buf) noexcept -{ - base::cMainMemoryManager::Instance()->Free(buf); -} \ No newline at end of file diff --git a/src/leeds/base/memoryManager.h b/src/leeds/base/memoryManager.h deleted file mode 100644 index 91124cd..0000000 --- a/src/leeds/base/memoryManager.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -namespace base -{ - class cMemoryManager - { - public: - cMemoryManager(); - void* Allocate(uint32 size); - void* AllocateAligned(uint32 size); - void* Realloc(void* buf, uint32 newSize, bool unk); - void Free(void* buf); - bool IsFree(void* buf); - }; - - class cMainMemoryManager : public cMemoryManager - { - static cMainMemoryManager* m_pInstance; - static void Init(void*, uint32); - - public: - cMainMemoryManager(); - static cMainMemoryManager *Instance() - { - static cMainMemoryManager instance; - return &instance; - } - }; - - class cMemoryBlock - { - // TODO - }; -} - -void* operator new(size_t size); -void* operator new[](size_t size); -void operator delete(void* buf) noexcept; -void operator delete[](void* buf) noexcept; \ No newline at end of file diff --git a/src/leeds/base/relocatableChunk.cpp b/src/leeds/base/relocatableChunk.cpp deleted file mode 100644 index 5cb5a42..0000000 --- a/src/leeds/base/relocatableChunk.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "common.h" -#include "relocatableChunk.h" - -namespace base -{ - // TODO(LCS): add actual code (all of these are stubs) - - void* cRelocatableChunk::Load(void* data, bool bShrink) { return nil; } - void* cRelocatableChunk::Load(const char* name, bool bShrink) { return nil; } - void cRelocatableChunk::Fixup(const sChunkHeader& header, void* data) {} - void cRelocatableChunk::Fixup(void* data) {} - void* cRelocatableChunk::Shrink(const sChunkHeader& header, void* data) { return nil; } - void* cRelocatableChunk::Shrink(void* data) { return nil; } - - cRelocatableChunkClassInfo::cRelocatableChunkClassInfo(const char* class_name, const void* pVmt, int size) {} - - cRelocatableChunkWriter::cRelocatableChunkWriter() {} - cRelocatableChunkWriter::~cRelocatableChunkWriter() {} - - void cRelocatableChunkWriter::AddPatch(void* addr) {} - void cRelocatableChunkWriter::AddPatchWithInfo(const char* str, int unk, void* addr) {} - void cRelocatableChunkWriter::AllocateRaw(void* addr, uint32 size, uint32 align, bool a5, bool a6) {} - - void cRelocatableChunkWriter::Clear() {} - void cRelocatableChunkWriter::Class(void* ptr, const cRelocatableChunkClassInfo& classInfo) {} - void cRelocatableChunkWriter::DebugFileLine(void*) {} - - void cRelocatableChunkWriter::PatchFunc(void* ptr) {} - - bool cRelocatableChunkWriter::IsAllocated(void* addr) { return false; } - - void cRelocatableChunkWriter::Reserve(int, int) {} - - void cRelocatableChunkWriter::Save(const char* filename, uint32 a3, uint32 a4, bool a5) {} - void cRelocatableChunkWriter::Save(void* file, uint32 a3, uint32 a4, bool a5, sChunkHeader* pHeader) {} -}; \ No newline at end of file diff --git a/src/leeds/base/relocatableChunk.h b/src/leeds/base/relocatableChunk.h deleted file mode 100644 index 2658aa2..0000000 --- a/src/leeds/base/relocatableChunk.h +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -namespace base -{ - // TODO(LCS): add actual struct fields - - struct sChunkHeader; - struct sDataBlock; - struct sFileLine; - - class cRelocatableChunk - { - public: - void* Load(void* data, bool bShrink); - void* Load(const char* name, bool bShrink); - void Fixup(const sChunkHeader& header, void* data); - void Fixup(void* data); - void* Shrink(const sChunkHeader& header, void* data); - void* Shrink(void* data); - }; - -#define VTABLE_ADDR(obj) ((void*)obj) // TODO: make this portable - - class cRelocatableChunkClassInfo - { - public: - cRelocatableChunkClassInfo(const char* class_name, const void* pVmt, int size); - }; - - class cRelocatableChunkWriter - { - public: - cRelocatableChunkWriter(); - ~cRelocatableChunkWriter(); - - void AddPatch(void* addr); - void AddPatchWithInfo(const char* str, int unk, void* addr); - void AllocateRaw(void* addr, uint32 size, uint32 align, bool a5 = false, bool a6 = false); - - void Clear(); - void Class(void* ptr, const cRelocatableChunkClassInfo& classInfo); - void DebugFileLine(void*); - - void PatchFunc(void* ptr); - - bool IsAllocated(void* addr); - - void Reserve(int, int); - - void Save(const char* filename, uint32 a3, uint32 a4, bool a5); - void Save(void* file, uint32 a3, uint32 a4, bool a5, sChunkHeader* pHeader); - }; -}; \ No newline at end of file diff --git a/src/leeds/base/sList.h b/src/leeds/base/sList.h deleted file mode 100644 index 378d8e3..0000000 --- a/src/leeds/base/sList.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -namespace base -{ - -template -class cSList -{ -public: - struct tSItem - { - tSItem* next; - T item; - }; - // extra field on PS2 - tSItem* first; - - cSList() { first = nil; } - void Insert(tSItem* item) { tSItem* n = first; first = item; item->next = n; } - void Remove(tSItem* item) { - if (first == item) { - first = item->next; - return; - } - tSItem* i = first; - while (i && i->next != item) - i = i->next; - assert(i); - i->next = item->next; - - } - -}; - -} \ No newline at end of file diff --git a/src/leeds/smallHeap.cpp b/src/leeds/smallHeap.cpp deleted file mode 100644 index 262113a..0000000 --- a/src/leeds/smallHeap.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "common.h" -#include "smallHeap.h" - -cSmallHeap cSmallHeap::msInstance; - -cSmallHeap::cSmallHeap() -{ - bLocked = false; - bUnk = false; -} - -void cSmallHeap::Lock() -{ - // TODO: PS2 code -} - -void cSmallHeap::Unlock() -{ - // TODO: PS2 code -} \ No newline at end of file diff --git a/src/leeds/smallHeap.h b/src/leeds/smallHeap.h deleted file mode 100644 index f289768..0000000 --- a/src/leeds/smallHeap.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "memoryManager.h" - -class cSmallHeap : public base::cMemoryManager -{ - bool bLocked; - bool bUnk; -public: - cSmallHeap(); - void Lock(); - void Unlock(); - - bool IsLocked() const { return bLocked; } - - static cSmallHeap msInstance; -}; \ No newline at end of file diff --git a/src/math/Vector.cpp b/src/math/Vector.cpp index e29d433..ee76e55 100644 --- a/src/math/Vector.cpp +++ b/src/math/Vector.cpp @@ -44,18 +44,3 @@ operator*(const CMatrix &mat, const CVector &vec) mat.ry * vec.x + mat.fy * vec.y + mat.uy * vec.z + mat.py, mat.rz * vec.x + mat.fz * vec.y + mat.uz * vec.z + mat.pz); } - -void -RwV3dTransformPoints(CVector * pointsOut, const CVector * pointsIn, RwInt32 numPoints, const RwMatrix * matrix) -{ - while(numPoints--){ - float x = pointsIn->x*matrix->right.x + pointsIn->y*matrix->up.x + pointsIn->z*matrix->at.x + matrix->pos.x; - float y = pointsIn->x*matrix->right.y + pointsIn->y*matrix->up.y + pointsIn->z*matrix->at.y + matrix->pos.y; - float z = pointsIn->x*matrix->right.z + pointsIn->y*matrix->up.z + pointsIn->z*matrix->at.z + matrix->pos.z; - pointsOut->x = x; - pointsOut->y = y; - pointsOut->z = z; - pointsOut++; - pointsIn++; - } -} diff --git a/src/math/Vector.h b/src/math/Vector.h index 8789580..0212845 100644 --- a/src/math/Vector.h +++ b/src/math/Vector.h @@ -1,12 +1,8 @@ #pragma once -// TODO(LCS): this should have 16 byte alignment but VS doesn't like passing aligned values by value -// need a solution for this eventually if we ever want to load original assets class CVector : public RwV3d { public: - float w; - CVector(void) {} CVector(float x, float y, float z) { @@ -130,7 +126,4 @@ class CMatrix; CVector Multiply3x3(const CMatrix &mat, const CVector &vec); CVector Multiply3x3(const CVector &vec, const CMatrix &mat); -CVector operator*(const CMatrix &mat, const CVector &vec); - -// we need this because CVector and RwV3d have different size now -void RwV3dTransformPoints(CVector * pointsOut, const CVector * pointsIn, RwInt32 numPoints, const RwMatrix * matrix); +CVector operator*(const CMatrix &mat, const CVector &vec); \ No newline at end of file diff --git a/src/math/VuVector.h b/src/math/VuVector.h index 026965d..30d62cf 100644 --- a/src/math/VuVector.h +++ b/src/math/VuVector.h @@ -3,10 +3,10 @@ class TYPEALIGN(16) CVuVector : public CVector { public: -// float w; // in CVector now + float w; CVuVector(void) {} CVuVector(float x, float y, float z) : CVector(x, y, z) {} - CVuVector(float x, float y, float z, float w) : CVector(x, y, z)/*, w(w)*/ { this->w = w;} + CVuVector(float x, float y, float z, float w) : CVector(x, y, z), w(w) {} CVuVector(const CVector &v) : CVector(v.x, v.y, v.z) {} CVuVector(const RwV3d &v) : CVector(v) {} /* diff --git a/src/modelinfo/BaseModelInfo.cpp b/src/modelinfo/BaseModelInfo.cpp index ffd934b..765469b 100644 --- a/src/modelinfo/BaseModelInfo.cpp +++ b/src/modelinfo/BaseModelInfo.cpp @@ -1,15 +1,11 @@ #include "common.h" #include "templates.h" -#include "main.h" #include "TxdStore.h" #include "2dEffect.h" #include "BaseModelInfo.h" #include "ModelInfo.h" -#include "KeyGen.h" -#include "Streaming.h" -#include "smallHeap.h" -#include "TempColModels.h" +#include "ColModel.h" CBaseModelInfo::CBaseModelInfo(ModelInfoType type) { @@ -21,11 +17,6 @@ CBaseModelInfo::CBaseModelInfo(ModelInfoType type) m_type = type; m_num2dEffects = 0; m_bOwnsColModel = false; - m_nameKey = 0; - m_unk1 = 0; - m_unk2 = 0; - m_name = new char[MAX_MODEL_NAME]; - *(int32*)m_name = 0; } void @@ -33,7 +24,6 @@ CBaseModelInfo::Shutdown(void) { DeleteCollisionModel(); DeleteRwObject(); - DeleteChunk(); m_2dEffectsID = -1; m_num2dEffects = 0; m_txdSlot = -1; @@ -42,11 +32,11 @@ CBaseModelInfo::Shutdown(void) void CBaseModelInfo::DeleteCollisionModel(void) { - if(!gUseChunkFiles && m_colModel && m_bOwnsColModel){ + if(m_colModel && m_bOwnsColModel){ if(m_colModel) delete m_colModel; + m_colModel = nil; } - m_colModel = nil; } void @@ -59,10 +49,8 @@ CBaseModelInfo::AddRef(void) void CBaseModelInfo::RemoveRef(void) { - if(m_refCount > 0){ - m_refCount--; - RemoveTexDictionaryRef(); - } + m_refCount--; + RemoveTexDictionaryRef(); } void @@ -80,24 +68,12 @@ CBaseModelInfo::AddTexDictionaryRef(void) CTxdStore::AddRef(m_txdSlot); } -void -CBaseModelInfo::AddTexDictionaryRefGu(void) -{ - CTxdStore::AddRefGu(m_txdSlot); -} - void CBaseModelInfo::RemoveTexDictionaryRef(void) { CTxdStore::RemoveRef(m_txdSlot); } -void -CBaseModelInfo::RemoveTexDictionaryRefGu(void) -{ - CTxdStore::RemoveRefGu(m_txdSlot); -} - void CBaseModelInfo::Init2dEffects(void) { @@ -124,60 +100,3 @@ CBaseModelInfo::Get2dEffect(int n) else return nil; } - - -void -CBaseModelInfo::SetModelName(const char *name) -{ - m_nameKey = CKeyGen::GetUppercaseKey(name); - if (!gUseChunkFiles) - strcpy(m_name, name); -} - -void -CBaseModelInfo::DeleteChunk(void) -{ - // BUG? what if we're not using chunks? - if(m_chunk){ - CStreaming::UnregisterPointer(&m_chunk, 2); - cSmallHeap::msInstance.Free(m_chunk); - m_chunk = nil; - } -} - -inline int -GetColmodelID(CColModel *model) -{ - int colModelid = 0; - if(model == &gpTempColModels->ms_colModelBBox) colModelid = 1; - if(model == &gpTempColModels->ms_colModelPed1) colModelid = 2; - if(model == &gpTempColModels->ms_colModelWeapon) colModelid = 3; - if(model == &CTempColModels::ms_colModelPed2) colModelid = 4; - if(model == &CTempColModels::ms_colModelPedGroundHit) colModelid = 5; - if(model == &CTempColModels::ms_colModelDoor1) colModelid = 6; - if(model == &CTempColModels::ms_colModelBumper1) colModelid = 7; - if(model == &CTempColModels::ms_colModelPanel1) colModelid = 8; - if(model == &CTempColModels::ms_colModelBonnet1) colModelid = 9; - if(model == &CTempColModels::ms_colModelBoot1) colModelid = 10; - if(model == &CTempColModels::ms_colModelWheel1) colModelid = 11; - if(model == &CTempColModels::ms_colModelBodyPart1) colModelid = 12; - if(model == &CTempColModels::ms_colModelBodyPart2) colModelid = 13; - if(model == &CTempColModels::ms_colModelCutObj[0]) colModelid = 14; - if(model == &CTempColModels::ms_colModelCutObj[1]) colModelid = 15; - if(model == &CTempColModels::ms_colModelCutObj[2]) colModelid = 16; - if(model == &CTempColModels::ms_colModelCutObj[3]) colModelid = 17; - if(model == &CTempColModels::ms_colModelCutObj[4]) colModelid = 18; - return colModelid; -} - -void -CBaseModelInfo::Write(base::cRelocatableChunkWriter &writer) -{ - m_chunk = nil; - RcWriteThis(writer); - if(m_colModel){ - if(m_bOwnsColModel || GetColmodelID(m_colModel) != 0) - m_colModel->Write(writer, true); - writer.AddPatch(&m_colModel); - } -} diff --git a/src/modelinfo/BaseModelInfo.h b/src/modelinfo/BaseModelInfo.h index c9ea13b..2d1dc8a 100644 --- a/src/modelinfo/BaseModelInfo.h +++ b/src/modelinfo/BaseModelInfo.h @@ -2,7 +2,7 @@ struct CColModel; -#define MAX_MODEL_NAME (24) +#define MAX_MODEL_NAME (21) enum ModelInfoType { @@ -23,19 +23,11 @@ class C2dEffect; class CBaseModelInfo { protected: - uint32 m_unk1; - uint32 m_unk2; - uint32 m_nameKey; - union { - char *m_name; // if not using chunks - void *m_chunk; // else - }; + char m_name[MAX_MODEL_NAME]; uint8 m_type; uint8 m_num2dEffects; bool m_bOwnsColModel; -public: // need this in colstore CColModel *m_colModel; -protected: int16 m_2dEffectsID; int16 m_objectId; uint16 m_refCount; @@ -43,11 +35,7 @@ protected: public: CBaseModelInfo(ModelInfoType type); -#ifdef FIX_BUGS - virtual ~CBaseModelInfo() { delete []m_name; } -#else virtual ~CBaseModelInfo() {} -#endif virtual void Shutdown(void); virtual void DeleteRwObject(void) = 0; virtual RwObject *CreateInstance(void) = 0; @@ -57,24 +45,13 @@ public: virtual void ConvertAnimFileIndex(void) {} virtual int GetAnimFileIndex(void) { return -1; } - virtual void LoadModel(void *model, const void *chunk) = 0; - virtual void DeleteChunk(void); - // this writes the modelinfo struct, possibly including actual RW models - virtual void Write(base::cRelocatableChunkWriter &writer); - // this writes the RW models - virtual void *WriteModel(base::cRelocatableChunkWriter &writer) { return nil; } // = 0; // this is not in the vtable for some reason??? - // these allocate the space for a modelinfo struct and patch the vtable pointer - virtual void RcWriteThis(base::cRelocatableChunkWriter &writer) = 0; - virtual void RcWriteEmpty(base::cRelocatableChunkWriter &writer) = 0; - // one day it becomes virtual uint8 GetModelType() const { return m_type; } bool IsBuilding(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME; } bool IsSimple(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME || m_type == MITYPE_WEAPON; } bool IsClump(void) { return m_type == MITYPE_CLUMP || m_type == MITYPE_PED || m_type == MITYPE_VEHICLE; } char *GetModelName(void) { return m_name; } - void SetModelName(const char *name); - uint32 GetNameHashKey() { return m_nameKey; } + void SetModelName(const char *name) { strncpy(m_name, name, MAX_MODEL_NAME); } void SetColModel(CColModel *col, bool owns = false){ m_colModel = col; m_bOwnsColModel = owns; } CColModel *GetColModel(void) { return m_colModel; } @@ -88,9 +65,7 @@ public: void RemoveRef(void); void SetTexDictionary(const char *name); void AddTexDictionaryRef(void); - void AddTexDictionaryRefGu(void); void RemoveTexDictionaryRef(void); - void RemoveTexDictionaryRefGu(void); void Init2dEffects(void); void Add2dEffect(C2dEffect *fx); C2dEffect *Get2dEffect(int n); diff --git a/src/modelinfo/ClumpModelInfo.cpp b/src/modelinfo/ClumpModelInfo.cpp index 00c2c0f..ba18bfa 100644 --- a/src/modelinfo/ClumpModelInfo.cpp +++ b/src/modelinfo/ClumpModelInfo.cpp @@ -1,30 +1,17 @@ #include "common.h" -#include "main.h" #include "RwHelper.h" #include "General.h" #include "NodeName.h" #include "VisibilityPlugins.h" #include "ModelInfo.h" #include "AnimManager.h" -#include "Streaming.h" -#include "Leeds.h" - -base::cRelocatableChunkClassInfo CClumpModelInfo::msClassInfo("CElementGroupModelInfo", VTABLE_ADDR(&msClassInstance), sizeof(msClassInstance)); // the real name -CClumpModelInfo CClumpModelInfo::msClassInstance; void CClumpModelInfo::DeleteRwObject(void) { if(m_clump){ - if(!gUseChunkFiles) - RpClumpDestroy(m_clump); - else{ - CStreaming::UnregisterClump(m_clump); - CStreaming::UnregisterPointer(&m_clump, 2); - DeleteChunk(); - } - + RpClumpDestroy(m_clump); m_clump = nil; RemoveTexDictionaryRef(); if(GetAnimFileIndex() != -1) @@ -65,7 +52,6 @@ CClumpModelInfo::CreateInstance(RwMatrix *m) if(m_clump){ RpClump *clump = (RpClump*)CreateInstance(); *RwFrameGetMatrix(RpClumpGetFrame(clump)) = *m; - CStreaming::RegisterInstance(clump); return (RwObject*)clump; } return nil; @@ -87,15 +73,14 @@ CClumpModelInfo::SetClump(RpClump *clump) if(GetAnimFileIndex() != -1) CAnimManager::AddAnimBlockRef(GetAnimFileIndex()); if(IsClumpSkinned(clump)){ - //int i; + int i; RpHAnimHierarchy *hier; - //RpAtomic *skinAtomic; - //RpSkin *skin; + RpAtomic *skinAtomic; + RpSkin *skin; hier = GetAnimHierarchyFromClump(clump); assert(hier); RpClumpForAllAtomics(clump, SetHierarchyForSkinAtomic, hier); -/* skinAtomic = GetFirstAtomic(clump); assert(skinAtomic); @@ -109,7 +94,6 @@ CClumpModelInfo::SetClump(RpClump *clump) weights->w2 /= sum; weights->w3 /= sum; } -*/ RpHAnimHierarchySetFlags(hier, (RpHAnimHierarchyFlag)(rpHANIMHIERARCHYUPDATEMODELLINGMATRICES|rpHANIMHIERARCHYUPDATELTMS)); } } @@ -219,47 +203,3 @@ CClumpModelInfo::GetFrameFromId(RpClump *clump, int32 id) RwFrameForAllChildren(RpClumpGetFrame(clump), FindFrameFromIdCB, &assoc); return assoc.frame; } - - -void -CClumpModelInfo::LoadModel(void *clump, const void *chunk) -{ - m_chunk = (void*)chunk; - m_clump = (RpClump*)clump; - LoadResource(m_clump); - CStreaming::RegisterPointer(&m_chunk, 2, true); - CStreaming::RegisterClump(m_clump); - CStreaming::RegisterPointer(&m_clump, 2, true); -} - -void -CClumpModelInfo::Write(base::cRelocatableChunkWriter &writer) -{ - CBaseModelInfo::Write(writer); - if(m_clump){ - writer.AddPatch(&m_clump); - SaveResource(m_clump, writer); - } -} - -void* -CClumpModelInfo::WriteModel(base::cRelocatableChunkWriter &writer) -{ - if(m_clump) - SaveResource(m_clump, writer); - return m_clump; -} - -void -CClumpModelInfo::RcWriteThis(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), sizeof(void*), false, true); - writer.Class(VTABLE_ADDR(this), msClassInfo); -} - -void -CClumpModelInfo::RcWriteEmpty(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), sizeof(void*), false, true); - writer.Class(VTABLE_ADDR(this), msClassInfo); -} diff --git a/src/modelinfo/ClumpModelInfo.h b/src/modelinfo/ClumpModelInfo.h index b8507e5..0113d34 100644 --- a/src/modelinfo/ClumpModelInfo.h +++ b/src/modelinfo/ClumpModelInfo.h @@ -35,9 +35,6 @@ public: char *m_animFileName; }; - static base::cRelocatableChunkClassInfo msClassInfo; - static CClumpModelInfo msClassInstance; - CClumpModelInfo(void) : CBaseModelInfo(MITYPE_CLUMP) { m_animFileIndex = -1; } CClumpModelInfo(ModelInfoType id) : CBaseModelInfo(id) { m_animFileIndex = -1; } ~CClumpModelInfo() {} @@ -51,12 +48,6 @@ public: virtual void ConvertAnimFileIndex(void); virtual int GetAnimFileIndex(void) { return m_animFileIndex; } - virtual void LoadModel(void *model, const void *chunk); - virtual void Write(base::cRelocatableChunkWriter &writer); - virtual void *WriteModel(base::cRelocatableChunkWriter &writer); - virtual void RcWriteThis(base::cRelocatableChunkWriter &writer); - virtual void RcWriteEmpty(base::cRelocatableChunkWriter &writer); - static RpAtomic *SetAtomicRendererCB(RpAtomic *atomic, void *data); void SetFrameIds(RwObjectNameIdAssocation *assocs); static RwFrame *FindFrameFromNameCB(RwFrame *frame, void *data); diff --git a/src/modelinfo/ModelIndices.cpp b/src/modelinfo/ModelIndices.cpp index 8353940..98c7fb3 100644 --- a/src/modelinfo/ModelIndices.cpp +++ b/src/modelinfo/ModelIndices.cpp @@ -2,25 +2,17 @@ #include "General.h" #include "ModelIndices.h" -#include "main.h" -CModelIndices *gpModelIndices; - -/*#define X(name, var) int16 var = -1; +#define X(name, var) int16 var = -1; MODELINDICES -#undef X*/ +#undef X void InitModelIndices(void) { -/*#define X(name, var) var = -1; +#define X(name, var) var = -1; MODELINDICES -#undef X*/ - if (gMakeResources) - { - gpModelIndices = new CModelIndices; - memset(gpModelIndices, -1, sizeof(CModelIndices)); - } +#undef X } void diff --git a/src/modelinfo/ModelIndices.h b/src/modelinfo/ModelIndices.h index 3a6b825..836c409 100644 --- a/src/modelinfo/ModelIndices.h +++ b/src/modelinfo/ModelIndices.h @@ -2,591 +2,8 @@ #include "ModelInfo.h" -struct CModelIndices -{ - int16 TRAFFICLIGHTS; - int16 TLIGHT_POST; - int16 TLIGHT_WALK; - int16 TLIGHT_BOX1; - int16 TLIGHT_BOX2; - int16 TRAFFICLIGHTS_VERTICAL; - int16 TRAFFICLIGHTS_MIAMI; - int16 TRAFFICLIGHTS_TWOVERTICAL; - int16 SINGLESTREETLIGHTS1; - int16 SINGLESTREETLIGHTS2; - int16 SINGLESTREETLIGHTS3; - int16 DOUBLESTREETLIGHTS; - int16 STREETLAMP1; - int16 STREETLAMP2; - int16 ROADSFORROADBLOCKSSTART; - int16 ROADSFORROADBLOCKSEND; - int16 TREE2; - int16 TREE3; - int16 TREE6; - int16 TREE8; - int16 TREE1; - int16 TREE4; - int16 TREE5; - int16 TREE7; - int16 TREE9; - int16 TREE10; - int16 TREE11; - int16 TREE12; - int16 TREE13; - int16 TREE14; - int16 CRANE_1; - int16 CRANE_2; - int16 CRANE_3; - int16 CRANE_4; - int16 CRANE_5; - int16 CRANE_6; - int16 PARKINGMETER; - int16 PARKINGMETER2; - int16 MALLFAN; - int16 HOTELFAN_NIGHT; - int16 HOTELFAN_DAY; - int16 HOTROOMFAN; - int16 PHONEBOOTH1; - int16 WASTEBIN; - int16 BIN; - int16 POSTBOX1; - int16 NEWSSTAND; - int16 TRAFFICCONE; - int16 DUMP1; - int16 ROADWORKBARRIER1; - int16 BUSSIGN1; - int16 NOPARKINGSIGN1; - int16 PHONESIGN; - int16 TAXISIGN; - int16 FISHSTALL01; - int16 FISHSTALL02; - int16 FISHSTALL03; - int16 FISHSTALL04; - int16 BAGELSTAND2; - int16 FIRE_HYDRANT; - int16 COLLECTABLE1; - int16 MONEY; - int16 CARMINE; - int16 GARAGEDOOR1; - int16 GARAGEDOOR2; - int16 GARAGEDOOR3; - int16 GARAGEDOOR4; - int16 GARAGEDOOR5; - int16 GARAGEDOOR6; - int16 GARAGEDOOR7; - int16 GARAGEDOOR9; - int16 GARAGEDOOR10; - int16 GARAGEDOOR11; - int16 GARAGEDOOR12; - int16 GARAGEDOOR13; - int16 GARAGEDOOR14; - int16 GARAGEDOOR15; - int16 GARAGEDOOR16; - int16 GARAGEDOOR17; - int16 GARAGEDOOR18; - int16 GARAGEDOOR19; - int16 GARAGEDOOR20; - int16 GARAGEDOOR21; - int16 GARAGEDOOR22; - int16 GARAGEDOOR23; - int16 GARAGEDOOR24; - int16 GARAGEDOOR25; - int16 GARAGEDOOR26; - int16 GARAGEDOOR27; - int16 GARAGEDOOR28; - int16 GARAGEDOOR29; - int16 GARAGEDOOR30; - int16 GARAGEDOOR31; - int16 GARAGEDOOR32; - int16 GARAGEDOOR33; - int16 GARAGEDOOR34; - int16 GARAGEDOOR35; - int16 GARAGEDOOR36; - int16 GARAGEDOOR37; - int16 GARAGEDOOR38; - int16 GARAGEDOOR39; - int16 TESTRAMP1; // UNUSED - int16 TESTRAMP2; - int16 NAUTICALMINE; - int16 CRUSHERBODY; - int16 CRUSHERLID; - int16 DONKEYMAG; - int16 BULLION; - int16 FLOATPACKAGE1; - int16 BRIEFCASE; - int16 CHINABANNER1; - int16 CHINABANNER2; - int16 CHINABANNER3; - int16 CHINABANNER4; - int16 CHINABANNER5; - int16 CHINABANNER6; - int16 CHINABANNER7; - int16 CHINABANNER8; - int16 CHINABANNER9; - int16 CHINABANNER10; - int16 CHINABANNER11; - int16 CHINABANNER12; - int16 CHINALANTERN; - int16 GLASS1; - int16 GLASS2; - int16 GLASS3; - int16 GLASS4; - int16 GLASS5; - int16 GLASS6; - int16 GLASS7; - int16 GLASS8; - int16 BRIDGELIFT; - int16 BRIDGEWEIGHT; - int16 BRIDGEROADSEGMENT; - int16 EXPLODINGBARREL; - int16 ITALYBANNER1; - int16 MEGADAMAGE; - int16 REGENERATOR; - int16 INVISIBLE; - int16 GOOD_CAR; - int16 BAD_CAR; - int16 PICKUP_ADRENALINE; - int16 PICKUP_BODYARMOUR; - int16 PICKUP_INFO; - int16 PICKUP_HEALTH; - int16 PICKUP_BONUS; - int16 PICKUP_BRIBE; - int16 PICKUP_KILLFRENZY; - int16 PICKUP_CAMERA; - int16 PICKUP_REVENUE; - int16 PICKUP_SAVEGAME; - int16 PICKUP_PROPERTY; - int16 PICKUP_PROPERTY_FORSALE; - int16 PICKUP_CLOTHES; - int16 BOLLARDLIGHT; - int16 CA_SP1; - int16 CA_SP2; - int16 CA_SP3; - int16 CA_SP4; - int16 PACKAGE1IZZY; - int16 MAGNET; - int16 RAILTRACKS; - int16 FENCE; - int16 FENCE2; - int16 PETROLPUMP; - int16 PETROLPUMP2; - int16 BODYCAST; - int16 IZZY_CONFDOOR; - int16 SHIPDOOR; - int16 IZZY_JDDOOR; - int16 IZZY_JDDOOR_SLIDER; - int16 LITEHOUSE_GATE; - int16 COFFEE; - int16 BUOY; - int16 PARKTABLE; - int16 SUBWAY1; - int16 SUBWAY2; - int16 SUBWAY3; - int16 SUBWAY4; - int16 SUBWAY5; - int16 SUBWAY6; - int16 SUBWAY7; - int16 SUBWAY8; - int16 SUBWAY9; - int16 SUBWAY10; - int16 SUBWAY11; - int16 SUBWAY12; - int16 SUBWAY13; - int16 SUBWAY14; - int16 SUBWAY15; - int16 SUBWAY16; - int16 SUBWAY17; - int16 SUBWAY18; - int16 SUBPLATFORM_IND; - int16 SUBPLATFORM_COMS; - int16 SUBPLATFORM_COMS2; - int16 SUBPLATFORM_COMN; - int16 SUBPLATFORM_SUB; - int16 SUBPLATFORM_SUB2; - int16 FILES; - int16 LAMPPOST1; - int16 VEG_PALM01; - int16 VEG_PALM02; - int16 VEG_PALM03; - int16 VEG_PALM04; - int16 VEG_PALM05; - int16 VEG_PALM06; - int16 VEG_PALM07; - int16 VEG_PALM08; - int16 MLAMPPOST; - int16 BARRIER1; - int16 LITTLEHA_POLICE; - int16 TELPOLE02; - int16 TRAFFICLIGHT01; - int16 PARKBENCH; - int16 PLC_STINGER; - int16 LIGHTBEAM; - int16 AIRPORTRADAR; - int16 RCBOMB; - int16 JM_SALRADIO; - int16 BEACHBALL; - int16 SANDCASTLE1; - int16 SANDCASTLE2; - int16 JELLYFISH; - int16 JELLYFISH01; - int16 FISH1SINGLE; - int16 FISH1S; - int16 FISH2SINGLE; - int16 FISH2S; - int16 FISH3SINGLE; - int16 FISH3S; - int16 TURTLE; - int16 DOLPHIN; - int16 SHARK; - int16 SUBMARINE; - int16 ESCALATORSTEP; - int16 LOUNGE_WOOD_UP; - int16 LOUNGE_TOWEL_UP; - int16 LOUNGE_WOOD_DN; - int16 LOTION; - int16 BEACHTOWEL01; - int16 BEACHTOWEL02; - int16 BEACHTOWEL03; - int16 BEACHTOWEL04; - int16 BLIMP_NIGHT; - int16 BLIMP_DAY; - int16 YT_MAIN_BODY; - int16 YT_MAIN_BODY2; - int16 SMALL_HELIX; - int16 PT_BARRIER; - int16 SUBWAYGATE; - int16 IN_PMBRIDRAMP3; - int16 IN_PMBRIDG2_UPGS; - int16 IN_PMBRIDGE2; - int16 IN_PMBRIDG1_UPGS; - int16 PM_LIGHTRIG3; - int16 PM_LIGHTRIG1; - int16 IN_PMSCAFF_UPS; - int16 IN_PM_CONCBLOK2; - int16 IN_PMSCAFFH_NS; - int16 IN_PM_GRAVL_JMP; - int16 IN_PM_SCAFFCOVR; - int16 IN_PM_GIRDER2; - int16 IN_PM_SCAFFH_WE; - int16 IN_PM_SIXCONC2; - int16 IN_BMBRIDRAMP3; - int16 IN_BMBRIDG2_UPGS; - int16 IN_BMBRIDGE2; - int16 IN_BMBRIDG1_UPGS; - int16 BM_LIGHTRIG3; - int16 BM_LIGHTRIG1; - int16 IN_BMSCAFF_UPS; - int16 IN_BM_CONCBLOK2; - int16 IN_BMSCAFFH_NS; - int16 IN_BM_GRAVL_JMP; - int16 IN_BM_SCAFFCOVR; - int16 IN_BM_GIRDER2; - int16 IN_BM_SCAFFH_WE; - int16 IN_BM_SIXCONC2; - int16 CRATE_SJL; - int16 DOOR1_SJL; - int16 DOOR2_SJL; - int16 SJL_PORTACABIN; - int16 SJL_PORTACABINRED; - int16 advert_test; // txd -}; - -extern CModelIndices *gpModelIndices; - -#define MI_TRAFFICLIGHTS gpModelIndices->TRAFFICLIGHTS -#define MI_TLIGHT_POST gpModelIndices->TLIGHT_POST -#define MI_TLIGHT_WALK gpModelIndices->TLIGHT_WALK -#define MI_TLIGHT_BOX1 gpModelIndices->TLIGHT_BOX1 -#define MI_TLIGHT_BOX2 gpModelIndices->TLIGHT_BOX2 -#define MI_TRAFFICLIGHTS_VERTICAL gpModelIndices->TRAFFICLIGHTS_VERTICAL -#define MI_TRAFFICLIGHTS_MIAMI gpModelIndices->TRAFFICLIGHTS_MIAMI -#define MI_TRAFFICLIGHTS_TWOVERTICAL gpModelIndices->TRAFFICLIGHTS_TWOVERTICAL -#define MI_SINGLESTREETLIGHTS1 gpModelIndices->SINGLESTREETLIGHTS1 -#define MI_SINGLESTREETLIGHTS2 gpModelIndices->SINGLESTREETLIGHTS2 -#define MI_SINGLESTREETLIGHTS3 gpModelIndices->SINGLESTREETLIGHTS3 -#define MI_DOUBLESTREETLIGHTS gpModelIndices->DOUBLESTREETLIGHTS -#define MI_STREETLAMP1 gpModelIndices->STREETLAMP1 -#define MI_STREETLAMP2 gpModelIndices->STREETLAMP2 -#define MI_ROADSFORROADBLOCKSSTART gpModelIndices->ROADSFORROADBLOCKSSTART -#define MI_ROADSFORROADBLOCKSEND gpModelIndices->ROADSFORROADBLOCKSEND -#define MI_TREE2 gpModelIndices->TREE2 -#define MI_TREE3 gpModelIndices->TREE3 -#define MI_TREE6 gpModelIndices->TREE6 -#define MI_TREE8 gpModelIndices->TREE8 -#define MI_TREE1 gpModelIndices->TREE1 -#define MI_TREE4 gpModelIndices->TREE4 -#define MI_TREE5 gpModelIndices->TREE5 -#define MI_TREE7 gpModelIndices->TREE7 -#define MI_TREE9 gpModelIndices->TREE9 -#define MI_TREE10 gpModelIndices->TREE10 -#define MI_TREE11 gpModelIndices->TREE11 -#define MI_TREE12 gpModelIndices->TREE12 -#define MI_TREE13 gpModelIndices->TREE13 -#define MI_TREE14 gpModelIndices->TREE14 -#define MODELID_CRANE_1 gpModelIndices->CRANE_1 -#define MODELID_CRANE_2 gpModelIndices->CRANE_2 -#define MODELID_CRANE_3 gpModelIndices->CRANE_3 -#define MODELID_CRANE_4 gpModelIndices->CRANE_4 -#define MODELID_CRANE_5 gpModelIndices->CRANE_5 -#define MODELID_CRANE_6 gpModelIndices->CRANE_6 -#define MI_PARKINGMETER gpModelIndices->PARKINGMETER -#define MI_PARKINGMETER2 gpModelIndices->PARKINGMETER2 -#define MI_MALLFAN gpModelIndices->MALLFAN -#define MI_HOTELFAN_NIGHT gpModelIndices->HOTELFAN_NIGHT -#define MI_HOTELFAN_DAY gpModelIndices->HOTELFAN_DAY -#define MI_HOTROOMFAN gpModelIndices->HOTROOMFAN -#define MI_PHONEBOOTH1 gpModelIndices->PHONEBOOTH1 -#define MI_WASTEBIN gpModelIndices->WASTEBIN -#define MI_BIN gpModelIndices->BIN -#define MI_POSTBOX1 gpModelIndices->POSTBOX1 -#define MI_NEWSSTAND gpModelIndices->NEWSSTAND -#define MI_TRAFFICCONE gpModelIndices->TRAFFICCONE -#define MI_DUMP1 gpModelIndices->DUMP1 -#define MI_ROADWORKBARRIER1 gpModelIndices->ROADWORKBARRIER1 -#define MI_BUSSIGN1 gpModelIndices->BUSSIGN1 -#define MI_NOPARKINGSIGN1 gpModelIndices->NOPARKINGSIGN1 -#define MI_PHONESIGN gpModelIndices->PHONESIGN -#define MI_TAXISIGN gpModelIndices->TAXISIGN -#define MI_FISHSTALL01 gpModelIndices->FISHSTALL01 -#define MI_FISHSTALL02 gpModelIndices->FISHSTALL02 -#define MI_FISHSTALL03 gpModelIndices->FISHSTALL03 -#define MI_FISHSTALL04 gpModelIndices->FISHSTALL04 -#define MI_BAGELSTAND2 gpModelIndices->BAGELSTAND2 -#define MI_FIRE_HYDRANT gpModelIndices->FIRE_HYDRANT -#define MI_COLLECTABLE1 gpModelIndices->COLLECTABLE1 -#define MI_MONEY gpModelIndices->MONEY -#define MI_CARMINE gpModelIndices->CARMINE -#define MI_GARAGEDOOR1 gpModelIndices->GARAGEDOOR1 -#define MI_GARAGEDOOR2 gpModelIndices->GARAGEDOOR2 -#define MI_GARAGEDOOR3 gpModelIndices->GARAGEDOOR3 -#define MI_GARAGEDOOR4 gpModelIndices->GARAGEDOOR4 -#define MI_GARAGEDOOR5 gpModelIndices->GARAGEDOOR5 -#define MI_GARAGEDOOR6 gpModelIndices->GARAGEDOOR6 -#define MI_GARAGEDOOR7 gpModelIndices->GARAGEDOOR7 -#define MI_GARAGEDOOR9 gpModelIndices->GARAGEDOOR9 -#define MI_GARAGEDOOR10 gpModelIndices->GARAGEDOOR10 -#define MI_GARAGEDOOR11 gpModelIndices->GARAGEDOOR11 -#define MI_GARAGEDOOR12 gpModelIndices->GARAGEDOOR12 -#define MI_GARAGEDOOR13 gpModelIndices->GARAGEDOOR13 -#define MI_GARAGEDOOR14 gpModelIndices->GARAGEDOOR14 -#define MI_GARAGEDOOR15 gpModelIndices->GARAGEDOOR15 -#define MI_GARAGEDOOR16 gpModelIndices->GARAGEDOOR16 -#define MI_GARAGEDOOR17 gpModelIndices->GARAGEDOOR17 -#define MI_GARAGEDOOR18 gpModelIndices->GARAGEDOOR18 -#define MI_GARAGEDOOR19 gpModelIndices->GARAGEDOOR19 -#define MI_GARAGEDOOR20 gpModelIndices->GARAGEDOOR20 -#define MI_GARAGEDOOR21 gpModelIndices->GARAGEDOOR21 -#define MI_GARAGEDOOR22 gpModelIndices->GARAGEDOOR22 -#define MI_GARAGEDOOR23 gpModelIndices->GARAGEDOOR23 -#define MI_GARAGEDOOR24 gpModelIndices->GARAGEDOOR24 -#define MI_GARAGEDOOR25 gpModelIndices->GARAGEDOOR25 -#define MI_GARAGEDOOR26 gpModelIndices->GARAGEDOOR26 -#define MI_GARAGEDOOR27 gpModelIndices->GARAGEDOOR27 -#define MI_GARAGEDOOR28 gpModelIndices->GARAGEDOOR28 -#define MI_GARAGEDOOR29 gpModelIndices->GARAGEDOOR29 -#define MI_GARAGEDOOR30 gpModelIndices->GARAGEDOOR30 -#define MI_GARAGEDOOR31 gpModelIndices->GARAGEDOOR31 -#define MI_GARAGEDOOR32 gpModelIndices->GARAGEDOOR32 -#define MI_GARAGEDOOR33 gpModelIndices->GARAGEDOOR33 -#define MI_GARAGEDOOR34 gpModelIndices->GARAGEDOOR34 -#define MI_GARAGEDOOR35 gpModelIndices->GARAGEDOOR35 -#define MI_GARAGEDOOR36 gpModelIndices->GARAGEDOOR36 -#define MI_GARAGEDOOR37 gpModelIndices->GARAGEDOOR37 -#define MI_GARAGEDOOR38 gpModelIndices->GARAGEDOOR38 -#define MI_GARAGEDOOR39 gpModelIndices->GARAGEDOOR39 -#define MI_TESTRAMP1 gpModelIndices->TESTRAMP1 // UNUSED -#define MI_TESTRAMP2 gpModelIndices->TESTRAMP2 -#define MI_NAUTICALMINE gpModelIndices->NAUTICALMINE -#define MI_CRUSHERBODY gpModelIndices->CRUSHERBODY -#define MI_CRUSHERLID gpModelIndices->CRUSHERLID -#define MI_DONKEYMAG gpModelIndices->DONKEYMAG -#define MI_BULLION gpModelIndices->BULLION -#define MI_FLOATPACKAGE1 gpModelIndices->FLOATPACKAGE1 -#define MI_BRIEFCASE gpModelIndices->BRIEFCASE -#define MI_CHINABANNER1 gpModelIndices->CHINABANNER1 -#define MI_CHINABANNER2 gpModelIndices->CHINABANNER2 -#define MI_CHINABANNER3 gpModelIndices->CHINABANNER3 -#define MI_CHINABANNER4 gpModelIndices->CHINABANNER4 -#define MI_CHINABANNER5 gpModelIndices->CHINABANNER5 -#define MI_CHINABANNER6 gpModelIndices->CHINABANNER6 -#define MI_CHINABANNER7 gpModelIndices->CHINABANNER7 -#define MI_CHINABANNER8 gpModelIndices->CHINABANNER8 -#define MI_CHINABANNER9 gpModelIndices->CHINABANNER9 -#define MI_CHINABANNER10 gpModelIndices->CHINABANNER10 -#define MI_CHINABANNER11 gpModelIndices->CHINABANNER11 -#define MI_CHINABANNER12 gpModelIndices->CHINABANNER12 -#define MI_CHINALANTERN gpModelIndices->CHINALANTERN -#define MI_GLASS1 gpModelIndices->GLASS1 -#define MI_GLASS2 gpModelIndices->GLASS2 -#define MI_GLASS3 gpModelIndices->GLASS3 -#define MI_GLASS4 gpModelIndices->GLASS4 -#define MI_GLASS5 gpModelIndices->GLASS5 -#define MI_GLASS6 gpModelIndices->GLASS6 -#define MI_GLASS7 gpModelIndices->GLASS7 -#define MI_GLASS8 gpModelIndices->GLASS8 -#define MI_BRIDGELIFT gpModelIndices->BRIDGELIFT -#define MI_BRIDGEWEIGHT gpModelIndices->BRIDGEWEIGHT -#define MI_BRIDGEROADSEGMENT gpModelIndices->BRIDGEROADSEGMENT -#define MI_EXPLODINGBARREL gpModelIndices->EXPLODINGBARREL -#define MI_ITALYBANNER1 gpModelIndices->ITALYBANNER1 -#define MI_MEGADAMAGE gpModelIndices->MEGADAMAGE -#define MI_REGENERATOR gpModelIndices->REGENERATOR -#define MI_INVISIBLE gpModelIndices->INVISIBLE -#define MI_GOOD_CAR gpModelIndices->GOOD_CAR -#define MI_BAD_CAR gpModelIndices->BAD_CAR -#define MI_PICKUP_ADRENALINE gpModelIndices->PICKUP_ADRENALINE -#define MI_PICKUP_BODYARMOUR gpModelIndices->PICKUP_BODYARMOUR -#define MI_PICKUP_INFO gpModelIndices->PICKUP_INFO -#define MI_PICKUP_HEALTH gpModelIndices->PICKUP_HEALTH -#define MI_PICKUP_BONUS gpModelIndices->PICKUP_BONUS -#define MI_PICKUP_BRIBE gpModelIndices->PICKUP_BRIBE -#define MI_PICKUP_KILLFRENZY gpModelIndices->PICKUP_KILLFRENZY -#define MI_PICKUP_CAMERA gpModelIndices->PICKUP_CAMERA -#define MI_PICKUP_REVENUE gpModelIndices->PICKUP_REVENUE -#define MI_PICKUP_SAVEGAME gpModelIndices->PICKUP_SAVEGAME -#define MI_PICKUP_PROPERTY gpModelIndices->PICKUP_PROPERTY -#define MI_PICKUP_PROPERTY_FORSALE gpModelIndices->PICKUP_PROPERTY_FORSALE -#define MI_PICKUP_CLOTHES gpModelIndices->PICKUP_CLOTHES -#define MI_BOLLARDLIGHT gpModelIndices->BOLLARDLIGHT -#define MI_CA_SP1 gpModelIndices->CA_SP1 -#define MI_CA_SP2 gpModelIndices->CA_SP2 -#define MI_CA_SP3 gpModelIndices->CA_SP3 -#define MI_CA_SP4 gpModelIndices->CA_SP4 -#define MI_PACKAGE1IZZY gpModelIndices->PACKAGE1IZZY -#define MI_MAGNET gpModelIndices->MAGNET -#define MI_RAILTRACKS gpModelIndices->RAILTRACKS -#define MI_FENCE gpModelIndices->FENCE -#define MI_FENCE2 gpModelIndices->FENCE2 -#define MI_PETROLPUMP gpModelIndices->PETROLPUMP -#define MI_PETROLPUMP2 gpModelIndices->PETROLPUMP2 -#define MI_BODYCAST gpModelIndices->BODYCAST -#define MI_IZZY_CONFDOOR gpModelIndices->IZZY_CONFDOOR -#define MI_SHIPDOOR gpModelIndices->SHIPDOOR -#define MI_IZZY_JDDOOR gpModelIndices->IZZY_JDDOOR -#define MI_IZZY_JDDOOR_SLIDER gpModelIndices->IZZY_JDDOOR_SLIDER -#define MI_LITEHOUSE_GATE gpModelIndices->LITEHOUSE_GATE -#define MI_COFFEE gpModelIndices->COFFEE -#define MI_BUOY gpModelIndices->BUOY -#define MI_PARKTABLE gpModelIndices->PARKTABLE -#define MI_SUBWAY1 gpModelIndices->SUBWAY1 -#define MI_SUBWAY2 gpModelIndices->SUBWAY2 -#define MI_SUBWAY3 gpModelIndices->SUBWAY3 -#define MI_SUBWAY4 gpModelIndices->SUBWAY4 -#define MI_SUBWAY5 gpModelIndices->SUBWAY5 -#define MI_SUBWAY6 gpModelIndices->SUBWAY6 -#define MI_SUBWAY7 gpModelIndices->SUBWAY7 -#define MI_SUBWAY8 gpModelIndices->SUBWAY8 -#define MI_SUBWAY9 gpModelIndices->SUBWAY9 -#define MI_SUBWAY10 gpModelIndices->SUBWAY10 -#define MI_SUBWAY11 gpModelIndices->SUBWAY11 -#define MI_SUBWAY12 gpModelIndices->SUBWAY12 -#define MI_SUBWAY13 gpModelIndices->SUBWAY13 -#define MI_SUBWAY14 gpModelIndices->SUBWAY14 -#define MI_SUBWAY15 gpModelIndices->SUBWAY15 -#define MI_SUBWAY16 gpModelIndices->SUBWAY16 -#define MI_SUBWAY17 gpModelIndices->SUBWAY17 -#define MI_SUBWAY18 gpModelIndices->SUBWAY18 -#define MI_SUBPLATFORM_IND gpModelIndices->SUBPLATFORM_IND -#define MI_SUBPLATFORM_COMS gpModelIndices->SUBPLATFORM_COMS -#define MI_SUBPLATFORM_COMS2 gpModelIndices->SUBPLATFORM_COMS2 -#define MI_SUBPLATFORM_COMN gpModelIndices->SUBPLATFORM_COMN -#define MI_SUBPLATFORM_SUB gpModelIndices->SUBPLATFORM_SUB -#define MI_SUBPLATFORM_SUB2 gpModelIndices->SUBPLATFORM_SUB2 -#define MI_FILES gpModelIndices->FILES -#define MI_LAMPPOST1 gpModelIndices->LAMPPOST1 -#define MI_VEG_PALM01 gpModelIndices->VEG_PALM01 -#define MI_VEG_PALM02 gpModelIndices->VEG_PALM02 -#define MI_VEG_PALM03 gpModelIndices->VEG_PALM03 -#define MI_VEG_PALM04 gpModelIndices->VEG_PALM04 -#define MI_VEG_PALM05 gpModelIndices->VEG_PALM05 -#define MI_VEG_PALM06 gpModelIndices->VEG_PALM06 -#define MI_VEG_PALM07 gpModelIndices->VEG_PALM07 -#define MI_VEG_PALM08 gpModelIndices->VEG_PALM08 -#define MI_MLAMPPOST gpModelIndices->MLAMPPOST -#define MI_BARRIER1 gpModelIndices->BARRIER1 -#define MI_LITTLEHA_POLICE gpModelIndices->LITTLEHA_POLICE -#define MI_TELPOLE02 gpModelIndices->TELPOLE02 -#define MI_TRAFFICLIGHT01 gpModelIndices->TRAFFICLIGHT01 -#define MI_PARKBENCH gpModelIndices->PARKBENCH -#define MI_PLC_STINGER gpModelIndices->PLC_STINGER -#define MI_LIGHTBEAM gpModelIndices->LIGHTBEAM -#define MI_AIRPORTRADAR gpModelIndices->AIRPORTRADAR -#define MI_RCBOMB gpModelIndices->RCBOMB -#define MI_JM_SALRADIO gpModelIndices->JM_SALRADIO -#define MI_BEACHBALL gpModelIndices->BEACHBALL -#define MI_SANDCASTLE1 gpModelIndices->SANDCASTLE1 -#define MI_SANDCASTLE2 gpModelIndices->SANDCASTLE2 -#define MI_JELLYFISH gpModelIndices->JELLYFISH -#define MI_JELLYFISH01 gpModelIndices->JELLYFISH01 -#define MI_FISH1SINGLE gpModelIndices->FISH1SINGLE -#define MI_FISH1S gpModelIndices->FISH1S -#define MI_FISH2SINGLE gpModelIndices->FISH2SINGLE -#define MI_FISH2S gpModelIndices->FISH2S -#define MI_FISH3SINGLE gpModelIndices->FISH3SINGLE -#define MI_FISH3S gpModelIndices->FISH3S -#define MI_TURTLE gpModelIndices->TURTLE -#define MI_DOLPHIN gpModelIndices->DOLPHIN -#define MI_SHARK gpModelIndices->SHARK -#define MI_SUBMARINE gpModelIndices->SUBMARINE -#define MI_ESCALATORSTEP gpModelIndices->ESCALATORSTEP -#define MI_LOUNGE_WOOD_UP gpModelIndices->LOUNGE_WOOD_UP -#define MI_LOUNGE_TOWEL_UP gpModelIndices->LOUNGE_TOWEL_UP -#define MI_LOUNGE_WOOD_DN gpModelIndices->LOUNGE_WOOD_DN -#define MI_LOTION gpModelIndices->LOTION -#define MI_BEACHTOWEL01 gpModelIndices->BEACHTOWEL01 -#define MI_BEACHTOWEL02 gpModelIndices->BEACHTOWEL02 -#define MI_BEACHTOWEL03 gpModelIndices->BEACHTOWEL03 -#define MI_BEACHTOWEL04 gpModelIndices->BEACHTOWEL04 -#define MI_BLIMP_NIGHT gpModelIndices->BLIMP_NIGHT -#define MI_BLIMP_DAY gpModelIndices->BLIMP_DAY -#define MI_YT_MAIN_BODY gpModelIndices->YT_MAIN_BODY -#define MI_YT_MAIN_BODY2 gpModelIndices->YT_MAIN_BODY2 -#define MI_SMALL_HELIX gpModelIndices->SMALL_HELIX -#define MI_PT_BARRIER gpModelIndices->PT_BARRIER -#define MI_SUBWAYGATE gpModelIndices->SUBWAYGATE -#define MI_IN_PMBRIDRAMP3 gpModelIndices->IN_PMBRIDRAMP3 -#define MI_IN_PMBRIDG2_UPGS gpModelIndices->IN_PMBRIDG2_UPGS -#define MI_IN_PMBRIDGE2 gpModelIndices->IN_PMBRIDGE2 -#define MI_IN_PMBRIDG1_UPGS gpModelIndices->IN_PMBRIDG1_UPGS -#define MI_PM_LIGHTRIG3 gpModelIndices->PM_LIGHTRIG3 -#define MI_PM_LIGHTRIG1 gpModelIndices->PM_LIGHTRIG1 -#define MI_IN_PMSCAFF_UPS gpModelIndices->IN_PMSCAFF_UPS -#define MI_IN_PM_CONCBLOK2 gpModelIndices->IN_PM_CONCBLOK2 -#define MI_IN_PMSCAFFH_NS gpModelIndices->IN_PMSCAFFH_NS -#define MI_IN_PM_GRAVL_JMP gpModelIndices->IN_PM_GRAVL_JMP -#define MI_IN_PM_SCAFFCOVR gpModelIndices->IN_PM_SCAFFCOVR -#define MI_IN_PM_GIRDER2 gpModelIndices->IN_PM_GIRDER2 -#define MI_IN_PM_SCAFFH_WE gpModelIndices->IN_PM_SCAFFH_WE -#define MI_IN_PM_SIXCONC2 gpModelIndices->IN_PM_SIXCONC2 -#define MI_IN_BMBRIDRAMP3 gpModelIndices->IN_BMBRIDRAMP3 -#define MI_IN_BMBRIDG2_UPGS gpModelIndices->IN_BMBRIDG2_UPGS -#define MI_IN_BMBRIDGE2 gpModelIndices->IN_BMBRIDGE2 -#define MI_IN_BMBRIDG1_UPGS gpModelIndices->IN_BMBRIDG1_UPGS -#define MI_BM_LIGHTRIG3 gpModelIndices->BM_LIGHTRIG3 -#define MI_BM_LIGHTRIG1 gpModelIndices->BM_LIGHTRIG1 -#define MI_IN_BMSCAFF_UPS gpModelIndices->IN_BMSCAFF_UPS -#define MI_IN_BM_CONCBLOK2 gpModelIndices->IN_BM_CONCBLOK2 -#define MI_IN_BMSCAFFH_NS gpModelIndices->IN_BMSCAFFH_NS -#define MI_IN_BM_GRAVL_JMP gpModelIndices->IN_BM_GRAVL_JMP -#define MI_IN_BM_SCAFFCOVR gpModelIndices->IN_BM_SCAFFCOVR -#define MI_IN_BM_GIRDER2 gpModelIndices->IN_BM_GIRDER2 -#define MI_IN_BM_SCAFFH_WE gpModelIndices->IN_BM_SCAFFH_WE -#define MI_IN_BM_SIXCONC2 gpModelIndices->IN_BM_SIXCONC2 -#define MI_CRATE_SJL gpModelIndices->CRATE_SJL -#define MI_DOOR1_SJL gpModelIndices->DOOR1_SJL -#define MI_DOOR2_SJL gpModelIndices->DOOR2_SJL -#define MI_SJL_PORTACABIN gpModelIndices->SJL_PORTACABIN -#define MI_SJL_PORTACABINRED gpModelIndices->SJL_PORTACABINRED - #define MODELINDICES \ X("fire_hydrant", MI_FIRE_HYDRANT) \ - X("fire_hydrant", MI_FIRE_HYDRANT) /* BUG: second time */ \ - X("bagelstnd02", MI_BAGELSTAND2) \ - X("fish01", MI_FISHSTALL01) \ - X("fishstall02", MI_FISHSTALL02) \ - X("fishstall03", MI_FISHSTALL03) \ - X("fishstall04", MI_FISHSTALL04) \ - X("taxisign", MI_TAXISIGN) \ X("phonesign", MI_PHONESIGN) \ X("noparkingsign1", MI_NOPARKINGSIGN1) \ X("bussign1", MI_BUSSIGN1) \ @@ -599,17 +16,12 @@ extern CModelIndices *gpModelIndices; X("wastebin", MI_WASTEBIN) \ X("phonebooth1", MI_PHONEBOOTH1) \ X("parkingmeter", MI_PARKINGMETER) \ - X("trafficlight1", MI_TRAFFICLIGHTS) \ - X("tlight_post", MI_TLIGHT_POST) \ - X("tlight_walk", MI_TLIGHT_WALK) \ - X("tlight_box1", MI_TLIGHT_BOX1) \ - X("tlight_box2", MI_TLIGHT_BOX2) \ X("parkingmeterg", MI_PARKINGMETER2) \ X("mall_fans", MI_MALLFAN) \ X("htl_fan_rotate_nt", MI_HOTELFAN_NIGHT) \ X("htl_fan_rotate_dy", MI_HOTELFAN_DAY) \ X("hotroomfan", MI_HOTROOMFAN) \ - X("trafficlight1", MI_TRAFFICLIGHTS) /* BUG: second time */ \ + X("trafficlight1", MI_TRAFFICLIGHTS) \ X("MTraffic4", MI_TRAFFICLIGHTS_VERTICAL) \ X("MTraffic1", MI_TRAFFICLIGHTS_MIAMI) \ X("MTraffic2", MI_TRAFFICLIGHTS_TWOVERTICAL) \ @@ -619,110 +31,47 @@ extern CModelIndices *gpModelIndices; X("doublestreetlght1", MI_DOUBLESTREETLIGHTS) \ X("Streetlamp1", MI_STREETLAMP1) \ X("Streetlamp2", MI_STREETLAMP2) \ - X("rd_Road2A10", MI_ROADSFORROADBLOCKSSTART) \ - X("rd_Road1A30", MI_ROADSFORROADBLOCKSEND) \ - X("veg_tree1", MI_TREE1) \ X("veg_tree3", MI_TREE2) \ X("veg_treea1", MI_TREE3) \ - X("veg_treenew01", MI_TREE4) \ - X("veg_treenew05", MI_TREE5) \ X("veg_treeb1", MI_TREE6) \ - X("veg_treenew10", MI_TREE7) \ X("veg_treea3", MI_TREE8) \ - X("veg_treenew09", MI_TREE9) \ - X("veg_treenew08", MI_TREE10) \ - X("veg_treenew03", MI_TREE11) \ - X("veg_treenew16", MI_TREE12) \ - X("veg_treenew17", MI_TREE13) \ - X("veg_treenew06", MI_TREE14) \ - X("crusher_crane", MODELID_CRANE_1) \ + X("doc_crane_cab0", MODELID_CRANE_1) \ + X("doc_crane_cab01", MODELID_CRANE_2) \ + X("doc_crane_cab02", MODELID_CRANE_3) \ + X("doc_crane_cab03", MODELID_CRANE_4) \ + X("boatcranelg0", MODELID_CRANE_5) \ + X("LODnetopa0", MODELID_CRANE_6) \ X("package1", MI_COLLECTABLE1) \ X("Money", MI_MONEY) \ X("barrel1", MI_CARMINE) \ - X("oddjgaragdoor", MI_GARAGEDOOR1) \ - X("bombdoor", MI_GARAGEDOOR2) \ - X("door_bombshop", MI_GARAGEDOOR3) \ - X("vheistlocdoor", MI_GARAGEDOOR4) \ - X("door2_garage", MI_GARAGEDOOR5) \ - X("ind_slidedoor", MI_GARAGEDOOR6) \ - X("bankjobdoor", MI_GARAGEDOOR7) \ - X("door_jmsgrage", MI_GARAGEDOOR9) \ - X("ind_safeh_gdoor", MI_GARAGEDOOR10) \ - X("door_sfehousegrge", MI_GARAGEDOOR11) \ - X("shedgaragedoor", MI_GARAGEDOOR12) \ - X("door4_garage", MI_GARAGEDOOR13) \ - X("door_col_compnd_01", MI_GARAGEDOOR14) \ - X("door_col_compnd_02", MI_GARAGEDOOR15) \ - X("door_col_compnd_03", MI_GARAGEDOOR16) \ - X("door_col_compnd_04", MI_GARAGEDOOR17) \ - X("door_col_compnd_05", MI_GARAGEDOOR18) \ - X("impex_door", MI_GARAGEDOOR19) \ - X("SalvGarage", MI_GARAGEDOOR20) \ - X("door3_garage", MI_GARAGEDOOR21) \ - X("leveldoor2", MI_GARAGEDOOR22) \ - X("double_garage_dr", MI_GARAGEDOOR23) \ - X("amcogaragedoor", MI_GARAGEDOOR24) \ - X("towergaragedoor1", MI_GARAGEDOOR25) \ - X("towergaragedoor2", MI_GARAGEDOOR26) \ - X("towergaragedoor3", MI_GARAGEDOOR27) \ - X("plysve_gragedoor", MI_GARAGEDOOR28) \ - X("impexpsubgrgdoor", MI_GARAGEDOOR29) \ - X("Sub_sprayshopdoor", MI_GARAGEDOOR30) \ - X("ind_plyrwoor", MI_GARAGEDOOR31) \ - X("8ballsuburbandoor", MI_GARAGEDOOR32) \ - X("door_nthgrage", MI_GARAGEDOOR33) \ - X("hangardoor1", MI_GARAGEDOOR34) \ - X("hangardoor2", MI_GARAGEDOOR35) \ - X("neds_door", MI_GARAGEDOOR36) \ - X("fs_wrhsedoor", MI_GARAGEDOOR37) \ - X("jm_ContraGarage", MI_GARAGEDOOR38) \ - X("jm_imp_SalvGarage", MI_GARAGEDOOR39) \ - X("Testramp1", MI_TESTRAMP1) /* BUG: LCS used MI_TESTRAMP2 here */ \ - X("Testramp2", MI_TESTRAMP2) \ + X("dk_paynspraydoor", MI_GARAGEDOOR2) \ + X("dk_waretankdoor1", MI_GARAGEDOOR3) \ + X("hav_garagedoor1", MI_GARAGEDOOR4) \ + X("hav_garagedoor02", MI_GARAGEDOOR5) \ + X("hav_garagedoor03", MI_GARAGEDOOR6) \ + X("hav_garagedoor04", MI_GARAGEDOOR7) \ + X("lh_showdoor03", MI_GARAGEDOOR9) \ + X("lh_showdoor1", MI_GARAGEDOOR10) \ + X("lhtankdoor", MI_GARAGEDOOR11) \ + X("nbtgardoor", MI_GARAGEDOOR12) \ + X("dk_camjonesdoor", MI_GARAGEDOOR13) \ + X("nbtgardoor02", MI_GARAGEDOOR14) \ + X("dt_savedra", MI_GARAGEDOOR15) \ + X("dt_savedrb", MI_GARAGEDOOR16) \ + X("dk_bombdoor", MI_GARAGEDOOR18) \ + X("haiwshpnsdoor", MI_GARAGEDOOR19) \ + X("wshpnsdoor", MI_GARAGEDOOR20) \ + X("nbecpnsdoor", MI_GARAGEDOOR21) \ + X("nbtgardoor03", MI_GARAGEDOOR22) \ + X("dt_savedrc", MI_GARAGEDOOR23) \ + X("dt_savedrd", MI_GARAGEDOOR24) \ + X("man_frntstepGD", MI_GARAGEDOOR25) \ + X("svegrgedoor", MI_GARAGEDOOR26) \ X("barrel2", MI_NAUTICALMINE) \ - X("crushercrush", MI_CRUSHERBODY) \ - X("crushertop", MI_CRUSHERLID) \ - X("donkeymag", MI_DONKEYMAG) \ - X("bullion", MI_BULLION) \ - X("floatpackge1", MI_FLOATPACKAGE1) \ X("briefcase", MI_BRIEFCASE) \ - X("chinabanner1", MI_CHINABANNER1) \ - X("chinabanner2", MI_CHINABANNER2) \ - X("chinabanner3", MI_CHINABANNER3) \ - X("chinabanner4", MI_CHINABANNER4) \ - X("iten_chinatown5", MI_CHINABANNER5) \ - X("iten_chinatown7", MI_CHINABANNER6) \ - X("iten_chinatown3", MI_CHINABANNER7) \ - X("iten_chinatown2", MI_CHINABANNER8) \ - X("iten_chinatown4", MI_CHINABANNER9) \ - X("iten_washline01", MI_CHINABANNER10) \ - X("iten_washline02", MI_CHINABANNER11) \ - X("iten_washline03", MI_CHINABANNER12) \ - X("chinalanterns", MI_CHINALANTERN) \ - X("glassfx1", MI_GLASS1) \ - X("glassfx2", MI_GLASS2) \ - X("glassfx3", MI_GLASS3) \ - X("glassfx4", MI_GLASS4) \ - X("glassfx55", MI_GLASS5) \ - X("glassfxsub1", MI_GLASS6) \ - X("glassfxsub2", MI_GLASS7) \ + X("wglasssmash", MI_GLASS1) \ X("glassfx_composh", MI_GLASS8) \ - X("bridge_liftsec", MI_BRIDGELIFT) \ - X("bridge_liftweight", MI_BRIDGEWEIGHT) \ - X("subbridge_lift", MI_BRIDGEROADSEGMENT) \ - X("flagsitaly", MI_ITALYBANNER1) \ - X("small_helix", MI_SMALL_HELIX) \ X("barrel4", MI_EXPLODINGBARREL) \ - X("Crate_sjl", MI_CRATE_SJL) \ - X("Door1_sjl", MI_DOOR1_SJL) \ - X("Door2_sjl", MI_DOOR2_SJL) \ - X("SJL_PortaCabin", MI_SJL_PORTACABIN) \ - X("SJL_PortaCabinred", MI_SJL_PORTACABINRED) \ - X("megaDamage", MI_MEGADAMAGE) \ - X("regenerator", MI_REGENERATOR) \ - X("invisible", MI_INVISIBLE) \ - X("good_car", MI_GOOD_CAR) \ - X("bad_car", MI_BAD_CAR) \ X("adrenaline", MI_PICKUP_ADRENALINE) \ X("bodyarmour", MI_PICKUP_BODYARMOUR) \ X("info", MI_PICKUP_INFO) \ @@ -733,57 +82,16 @@ extern CModelIndices *gpModelIndices; X("camerapickup", MI_PICKUP_CAMERA) \ X("bigdollar", MI_PICKUP_REVENUE) \ X("pickupsave", MI_PICKUP_SAVEGAME) \ - X("clothesp", MI_PICKUP_CLOTHES) \ X("property_locked", MI_PICKUP_PROPERTY) \ X("property_fsale", MI_PICKUP_PROPERTY_FORSALE) \ + X("clothesp", MI_PICKUP_CLOTHES) \ X("bollardlight", MI_BOLLARDLIGHT) \ - X("ca_sp1", MI_CA_SP1) \ - X("ca_sp2", MI_CA_SP2) \ - X("ca_sp3", MI_CA_SP3) \ - X("ca_sp4", MI_CA_SP4) \ - X("package1izzy", MI_PACKAGE1IZZY) \ - X("magnet", MI_MAGNET) \ - X("streetlamp1", MI_STREETLAMP1) \ - X("streetlamp2", MI_STREETLAMP2) \ - X("railtrax_lo4b", MI_RAILTRACKS) \ X("bar_barrier10", MI_FENCE) \ X("bar_barrier12", MI_FENCE2) \ X("petrolpump", MI_PETROLPUMP) \ X("washgaspump", MI_PETROLPUMP2) \ - X("bodycast", MI_BODYCAST) \ - X("izzy_confDoor", MI_IZZY_CONFDOOR) \ - X("shipdoor", MI_SHIPDOOR) \ - X("izzy_jdDoor", MI_IZZY_JDDOOR) \ - X("izzy_jdDoor_slider", MI_IZZY_JDDOOR_SLIDER) \ - X("litehouse_gate", MI_LITEHOUSE_GATE) \ - X("coffee", MI_COFFEE) \ X("bouy", MI_BUOY) \ X("parktable1", MI_PARKTABLE) \ - X("sbwy_tunl_start", MI_SUBWAY1) \ - X("sbwy_tunl_bit", MI_SUBWAY2) \ - X("sbwy_tunl_bend", MI_SUBWAY3) \ - X("sbwy_tunl_cstm6", MI_SUBWAY4) \ - X("sbwy_tunl_cstm7", MI_SUBWAY5) \ - X("sbwy_tunl_cstm8", MI_SUBWAY6) \ - X("sbwy_tunl_cstm10", MI_SUBWAY7) \ - X("sbwy_tunl_cstm9", MI_SUBWAY8) \ - X("sbwy_tunl_cstm11", MI_SUBWAY9) \ - X("sbwy_tunl_cstm1", MI_SUBWAY10) \ - X("sbwy_tunl_cstm2", MI_SUBWAY11) \ - X("sbwy_tunl_cstm4", MI_SUBWAY12) \ - X("sbwy_tunl_cstm3", MI_SUBWAY13) \ - X("sbwy_tunl_cstm5", MI_SUBWAY14) \ - X("subplatform_n2", MI_SUBWAY15) \ - X("suby_tunl_start", MI_SUBWAY16) \ - X("sbwy_tunl_start2", MI_SUBWAY17) \ - X("indy_tunl_start", MI_SUBWAY18) \ - X("indsubway03", MI_SUBPLATFORM_IND) \ - X("comerside_subway", MI_SUBPLATFORM_COMS) \ - X("subplatform", MI_SUBPLATFORM_COMS2) \ - X("subplatform_n", MI_SUBPLATFORM_COMN) \ - X("Otherside_subway", MI_SUBPLATFORM_SUB) \ - X("subplatform_sub", MI_SUBPLATFORM_SUB2) \ - X("files", MI_FILES) \ X("lamppost1", MI_LAMPPOST1) \ X("veg_palm04", MI_VEG_PALM01) \ X("veg_palwee02", MI_VEG_PALM02) \ @@ -799,12 +107,10 @@ extern CModelIndices *gpModelIndices; X("telgrphpole02", MI_TELPOLE02) \ X("trafficlight1", MI_TRAFFICLIGHT01) \ X("parkbench1", MI_PARKBENCH) \ - X("Money", MI_MONEY) \ X("plc_stinger", MI_PLC_STINGER) \ X("od_lightbeam", MI_LIGHTBEAM) \ X("ap_radar1_01", MI_AIRPORTRADAR) \ X("rcbomb", MI_RCBOMB) \ - X("jm_salradio", MI_JM_SALRADIO) \ X("beachball", MI_BEACHBALL) \ X("sandcastle1", MI_SANDCASTLE1) \ X("sandcastle2", MI_SANDCASTLE2) \ @@ -832,42 +138,11 @@ extern CModelIndices *gpModelIndices; X("blimp_night", MI_BLIMP_NIGHT) \ X("blimp_day", MI_BLIMP_DAY) \ X("yt_main_body", MI_YT_MAIN_BODY) \ - X("pt_barrier", MI_PT_BARRIER) \ - X("subwaygate", MI_SUBWAYGATE) \ - X("in_PMbridramp3", MI_IN_PMBRIDRAMP3) \ - X("in_PMbridg2_upgs", MI_IN_PMBRIDG2_UPGS) \ - X("in_PMbridge2", MI_IN_PMBRIDGE2) \ - X("in_PMbridg1_upgs", MI_IN_PMBRIDG1_UPGS) \ - X("pm_lightrig3", MI_PM_LIGHTRIG3) \ - X("pm_lightrig1", MI_PM_LIGHTRIG1) \ - X("in_pmSCAFF_UPS", MI_IN_PMSCAFF_UPS) \ - X("in_pm_concblok2", MI_IN_PM_CONCBLOK2) \ - X("in_pmSCAFFH_ns", MI_IN_PMSCAFFH_NS) \ - X("in_pm_gravl_jmp", MI_IN_PM_GRAVL_JMP) \ - X("in_pm_scaffcovr", MI_IN_PM_SCAFFCOVR) \ - X("in_pm_girder2", MI_IN_PM_GIRDER2) \ - X("in_pm_scaffH_we", MI_IN_PM_SCAFFH_WE) \ - X("in_pm_sixconc2", MI_IN_PM_SIXCONC2) \ - X("in_BMbridramp3", MI_IN_BMBRIDRAMP3) \ - X("in_BMbridg2_upgs", MI_IN_BMBRIDG2_UPGS) \ - X("in_BMbridge2", MI_IN_BMBRIDGE2) \ - X("in_BMbridg1_upgs", MI_IN_BMBRIDG1_UPGS) \ - X("Bm_lightrig3", MI_BM_LIGHTRIG3) \ - X("bm_lightrig1", MI_BM_LIGHTRIG1) \ - X("in_BmSCAFF_UPS", MI_IN_BMSCAFF_UPS) \ - X("in_Bm_concblok2", MI_IN_BM_CONCBLOK2) \ - X("in_BmSCAFFH_ns", MI_IN_BMSCAFFH_NS) \ - X("in_Bm_gravl_jmp", MI_IN_BM_GRAVL_JMP) \ - X("in_Bm_scaffcovr", MI_IN_BM_SCAFFCOVR) \ - X("in_Bm_girder2", MI_IN_BM_GIRDER2) \ - X("in_Bm_scaffH_we", MI_IN_BM_SCAFFH_WE) \ - X("in_Bm_sixconc2", MI_IN_BM_SIXCONC2) + X("yt_main_body2", MI_YT_MAIN_BODY2) - /*X("yt_main_body2", MI_YT_MAIN_BODY2) \*/ - -//#define X(name, var) extern int16 var; -// MODELINDICES -//#undef X +#define X(name, var) extern int16 var; + MODELINDICES +#undef X // and some hardcoded ones // expand as needed @@ -882,85 +157,96 @@ enum MI_FIREMAN, MI_MALE01, - MI_TAXI_D = 9, - MI_PIMP, - MI_CRIMINAL01, - MI_CRIMINAL02, - MI_MALE02, - MI_MALE03, - MI_FATMALE01, - MI_FATMALE02, - MI_FEMALE01, - MI_FEMALE02, - MI_FEMALE03, - MI_FATFEMALE01, - MI_FATFEMALE02, - MI_PROSTITUTE, - MI_PROSTITUTE2, - MI_P_MAN1, - MI_P_MAN2, - MI_P_WOM1, - MI_P_WOM2, - MI_CT_MAN1, - MI_CT_MAN2, - MI_CT_WOM1, - MI_CT_WOM2, - MI_LI_MAN1, - MI_LI_MAN2, - MI_LI_WOM1, - MI_LI_WOM2, - MI_DOCKER1, - MI_DOCKER2, - MI_SCUM_MAN, - MI_SCUM_WOM, - MI_WORKER1, - MI_WORKER2, - MI_B_MAN1, - MI_B_MAN2, - MI_B_MAN3, - MI_B_WOM1, - MI_B_WOM2, - MI_B_WOM3, - MI_MOD_MAN, - MI_MOD_WOM, - MI_ST_MAN, - MI_ST_WOM, - MI_FAN_MAN1, - MI_FAN_MAN2, - MI_FAN_WOM, - MI_HOS_MAN, - MI_HOS_WOM, - MI_CONST1, - MI_CONST2, - MI_SHOPPER1, - MI_SHOPPER2, - MI_SHOPPER3, - MI_STUD_MAN, - MI_STUD_WOM, - MI_CAS_MAN, - MI_CAS_WOM, - MI_CAMP_MAN, - MI_CAMP_WOM, - MI_HITMAN, + MI_HFYST = 9, + MI_HFOST, + MI_HMYST, + MI_HMOST, + MI_HFYRI, + MI_HFORI, + MI_HMYRI, + MI_HMORI, + MI_HFYBE, + MI_HFOBE, + MI_HMYBE, + MI_HMOBE, + MI_HFYBU, + MI_HFYMD, + MI_HFYCG, + MI_HFYPR, + MI_HFOTR, + MI_HMOTR, + MI_HMYAP, + MI_HMOCA, + MI_TAXI_D = MI_HMOCA, + MI_BMODK, + MI_BMYKR, + MI_BFYST, + MI_BFOST, + MI_BMYST, + MI_BMOST, + MI_BFYRI, + MI_BFORI, + MI_BMYRI, + MI_BFYBE, + MI_BMYBE, + MI_BFOBE, + MI_BMOBE, + MI_BMYBU, + MI_BFYPR, + MI_BFOTR, + MI_BMOTR, + MI_BMYPI, + MI_BMYBB, + MI_WMYCR, + MI_WFYST, + MI_WFOST, + MI_WMYST, + MI_WMOST, + MI_WFYRI, + MI_WFORI, + MI_WMYRI, + MI_WMORI, + MI_WFYBE, + MI_WMYBE, + MI_WFOBE, + MI_WMOBE, + MI_WMYCW, + MI_WMYGO, + MI_WFOGO, + MI_WMOGO, + MI_WFYLG, + MI_WMYLG, + MI_WFYBU, + MI_WMYBU, + MI_WMOBU, + MI_WFYPR, + MI_WFOTR, + MI_WMOTR, + MI_WMYPI, + MI_WMOCA, + MI_WFYJG, + MI_WMYJG, + MI_WFYSK, + MI_WMYSK, + MI_WFYSH, + MI_WFOSH, + MI_JFOTO, + MI_JMOTO, - MI_GANG01 = 79, - MI_GANG02, - MI_GANG03, - MI_GANG04, - MI_GANG05, - MI_GANG06, - MI_GANG07, - MI_GANG08, - MI_GANG09, - MI_GANG10, - MI_GANG11, - MI_GANG12, - MI_GANG13, - MI_GANG14, - MI_GANG15, - MI_GANG16, - MI_GANG17, - MI_GANG18, + MI_CBA,// = 83, + MI_CBB, + MI_HNA, + MI_HNB, + MI_SGA, + MI_SGB, + MI_CLA, + MI_CLB, + MI_GDA, + MI_GDB, + MI_BKA, + MI_BKB, + MI_PGA, + MI_PGB, MI_VICE1, MI_VICE2, MI_VICE3, @@ -997,20 +283,19 @@ enum MI_LAST_PED = MI_SPECIAL21, MI_FIRST_VEHICLE, - MI_SPIDER = MI_FIRST_VEHICLE, - MI_LANDSTAL, + MI_LANDSTAL = MI_FIRST_VEHICLE, MI_IDAHO, MI_STINGER, MI_LINERUN, MI_PEREN, MI_SENTINEL, - MI_PATRIOT, + MI_RIO, MI_FIRETRUCK, MI_TRASH, MI_STRETCH, MI_MANANA, MI_INFERNUS, - MI_BLISTA, + MI_VOODOO, MI_PONY, MI_MULE, MI_CHEETAH, @@ -1019,120 +304,100 @@ enum MI_MOONBEAM, MI_ESPERANT, MI_TAXI, - MI_KURUMA, + MI_WASHING, MI_BOBCAT, MI_MRWHOOP, MI_BFINJECT, - MI_HEARSE, + MI_HUNTER, MI_POLICE, MI_ENFORCER, MI_SECURICA, MI_BANSHEE, + MI_PREDATOR, MI_BUS, MI_RHINO, MI_BARRACKS, - MI_DODO, + MI_CUBAN, + MI_CHOPPER, + MI_ANGEL, MI_COACH, MI_CABBIE, MI_STALLION, MI_RUMPO, MI_RCBANDIT, - MI_BELLYUP, - MI_MRWONGS, - MI_MAFIA, - MI_YARDIE, - MI_YAKUZA, - MI_DIABLOS, - MI_COLUMB, - MI_HOODS, - MI_PANLANT, - MI_FLATBED, - MI_YANKEE, - MI_BORGNINE, - MI_TOYZ, - MI_CAMPVAN, - MI_BALLOT, - MI_SHELBY, - MI_PONTIAC, - MI_ESPRIT, - MI_AMMOTRUK, - MI_HOTROD, - MI_SINDACCO_CAR, - MI_FORELLI_CAR, - MI_FERRY, - MI_GHOST, - MI_SPEEDER, - MI_REEFER, - MI_PREDATOR, - MI_TRAIN, - MI_ESCAPE, - MI_CHOPPER, + MI_ROMERO, + MI_PACKER, + MI_SENTXS, + MI_ADMIRAL, + MI_SQUALO, + MI_SEASPAR, + MI_PIZZABOY, + MI_GANGBUR, MI_AIRTRAIN, MI_DEADDODO, - MI_ANGEL, - MI_PIZZABOY, - MI_NOODLEBOY, + MI_SPEEDER, + MI_REEFER, + MI_TROPIC, + MI_FLATBED, + MI_YANKEE, + MI_CADDY, + MI_ZEBRA, + MI_TOPFUN, + MI_SKIMMER, MI_PCJ600, MI_FAGGIO, MI_FREEWAY, - MI_ANGEL2, - MI_SANCHEZ2, - MI_SANCHEZ, - MI_RCGOBLIN, - MI_RCRAIDER, - MI_HUNTER, - MI_MAVERICK, - MI_POLMAV, - MI_VCNMAV, - - MI_LAST_VEHICLE = MI_VCNMAV, - - // HACK HACK, hopefully temporary - MI_SEASPAR = -1000, - MI_SPARROW, MI_RCBARON, - MI_TOPFUN, - MI_CADDY, - MI_BAGGAGE, - MI_FBIRANCH, - MI_VICECHEE, - MI_RIO, - MI_SQUALO, - MI_JETMAX, - MI_COASTG, - MI_DINGHY, - MI_MARQUIS, - MI_SKIMMER, - MI_TROPIC, - MI_SANDKING, - MI_VOODOO, - MI_CUBAN, - MI_PHEONIX, - MI_COMET, - MI_SABRE, - MI_VIRGO, - MI_RANCHER, - MI_BLISTAC, - MI_WASHING, - MI_ADMIRAL, - MI_SABRETUR, - MI_DELUXO, - MI_HOTRING, - MI_REGINA, - MI_SENTXS, + MI_RCRAIDER, MI_GLENDALE, MI_OCEANIC, - MI_HERMES, - MI_GREENWOO, + MI_SANCHEZ, + MI_SPARROW, + MI_PATRIOT, MI_LOVEFIST, - MI_GANGBUR, + MI_COASTG, + MI_DINGHY, + MI_HERMES, + MI_SABRE, + MI_SABRETUR, + MI_PHEONIX, + MI_WALTON, + MI_REGINA, + MI_COMET, + MI_DELUXO, MI_BURRITO, MI_SPAND, - MI_PACKER, - MI_WALTON, - MI_ROMERO, + MI_MARQUIS, + MI_BAGGAGE, + MI_KAUFMAN, + MI_MAVERICK, + MI_VCNMAV, + MI_RANCHER, + MI_FBIRANCH, + MI_VIRGO, + MI_GREENWOO, + MI_JETMAX, + MI_HOTRING, + MI_SANDKING, + MI_BLISTAC, + MI_POLMAV, + MI_BOXVILLE, + MI_BENSON, + MI_MESA, + MI_RCGOBLIN, + MI_HOTRINA, + MI_HOTRINB, + MI_BLOODRA, + MI_BLOODRB, + MI_VICECHEE, - MI_WHEEL_RIM = 237, + // HACK + MI_TRAIN = -1, + MI_DODO = -2, + + MI_LAST_VEHICLE = MI_VICECHEE, + + MI_WHEEL_RIM, MI_WHEEL_OFFROAD, MI_WHEEL_TRUCK, @@ -1193,18 +458,14 @@ enum MI_FINGERS, MI_MINIGUN2, - MI_CUTOBJ01 = 120, + MI_CUTOBJ01,// = 295, MI_CUTOBJ02, MI_CUTOBJ03, MI_CUTOBJ04, MI_CUTOBJ05, - MI_CUTOBJ06, - MI_CUTOBJ07, - MI_CUTOBJ08, - MI_CUTOBJ09, - MI_CUTOBJ10, - NUM_DEFAULT_MODELS = 300 + + NUM_DEFAULT_MODELS,// = 300 }; enum{ @@ -1258,7 +519,11 @@ IsLightThatNeedsRepositioning(int16 id) return id == MI_SINGLESTREETLIGHTS1 || id == MI_SINGLESTREETLIGHTS2 || id == MI_SINGLESTREETLIGHTS3 || - id == MI_DOUBLESTREETLIGHTS; + id == MI_TRAFFICLIGHTS_MIAMI || + id == MI_TRAFFICLIGHTS_TWOVERTICAL || + id == MI_MLAMPPOST || + id == MI_STREETLAMP1 || + id == MI_STREETLAMP2; } inline bool @@ -1270,9 +535,7 @@ IsLightObject(int16 id) id == MI_SINGLESTREETLIGHTS2 || id == MI_SINGLESTREETLIGHTS3 || id == MI_DOUBLESTREETLIGHTS || - id == MI_TRAFFICLIGHTS_TWOVERTICAL || - id == MI_TRAFFICLIGHTS || - id == MI_FENCE; + id == MI_TRAFFICLIGHTS_TWOVERTICAL; } inline bool @@ -1304,26 +567,24 @@ IsPedModel(int16 id) inline bool IsPalmTreeModel(int16 id) { - return false; + return id == MI_VEG_PALM01 || + id == MI_VEG_PALM02 || + id == MI_VEG_PALM03 || + id == MI_VEG_PALM04 || + id == MI_VEG_PALM05 || + id == MI_VEG_PALM06 || + id == MI_VEG_PALM07 || + id == MI_VEG_PALM08; } inline bool IsTreeModel(int16 id) { - return id == MI_TREE1 || - id == MI_TREE2 || + return id == MI_TREE2 || id == MI_TREE3 || - id == MI_TREE4 || - id == MI_TREE5 || id == MI_TREE6 || - id == MI_TREE7 || id == MI_TREE8 || - id == MI_TREE9 || - id == MI_TREE10 || - id == MI_TREE11 || - id == MI_TREE12 || - id == MI_TREE13 || - id == MI_TREE14; + IsPalmTreeModel(id); } inline bool diff --git a/src/modelinfo/ModelInfo.cpp b/src/modelinfo/ModelInfo.cpp index 47f4e30..41515e2 100644 --- a/src/modelinfo/ModelInfo.cpp +++ b/src/modelinfo/ModelInfo.cpp @@ -4,7 +4,6 @@ #include "TempColModels.h" #include "ModelIndices.h" #include "ModelInfo.h" -#include "KeyGen.h" CBaseModelInfo *CModelInfo::ms_modelInfoPtrs[MODELINFOSIZE]; @@ -185,11 +184,10 @@ CModelInfo::AddVehicleModel(int id) CBaseModelInfo* CModelInfo::GetModelInfo(const char *name, int *id) { - uint32 hashKey = CKeyGen::GetUppercaseKey(name); CBaseModelInfo *modelinfo; for(int i = 0; i < MODELINFOSIZE; i++){ modelinfo = CModelInfo::ms_modelInfoPtrs[i]; - if(modelinfo && hashKey == modelinfo->GetNameHashKey()){ + if(modelinfo && !CGeneral::faststricmp(modelinfo->GetModelName(), name)){ if(id) *id = i; return modelinfo; @@ -201,14 +199,13 @@ CModelInfo::GetModelInfo(const char *name, int *id) CBaseModelInfo* CModelInfo::GetModelInfo(const char *name, int minIndex, int maxIndex) { - uint32 hashKey = CKeyGen::GetUppercaseKey(name); if (minIndex > maxIndex) return 0; CBaseModelInfo *modelinfo; for(int i = minIndex; i <= maxIndex; i++){ modelinfo = CModelInfo::ms_modelInfoPtrs[i]; - if(modelinfo && hashKey == modelinfo->GetNameHashKey()) + if(modelinfo && !CGeneral::faststricmp(modelinfo->GetModelName(), name)) return modelinfo; } return nil; diff --git a/src/modelinfo/PedModelInfo.cpp b/src/modelinfo/PedModelInfo.cpp index 1d519b1..28de250 100644 --- a/src/modelinfo/PedModelInfo.cpp +++ b/src/modelinfo/PedModelInfo.cpp @@ -1,6 +1,5 @@ #include "common.h" -#include "main.h" #include "RwHelper.h" #include "General.h" #include "Bones.h" @@ -10,19 +9,12 @@ #include "VisibilityPlugins.h" #include "ModelInfo.h" #include "custompipes.h" -#include "Streaming.h" -#include "Leeds.h" -#include "TempColModels.h" - -base::cRelocatableChunkClassInfo CPedModelInfo::msClassInfo("CPedModelInfo", VTABLE_ADDR(&msClassInstance), sizeof(msClassInstance)); -CPedModelInfo CPedModelInfo::msClassInstance; void CPedModelInfo::DeleteRwObject(void) { - CStreaming::UnregisterPointer(&m_hitColModel, 2); CClumpModelInfo::DeleteRwObject(); - if(!gUseChunkFiles && m_hitColModel) + if(m_hitColModel) delete m_hitColModel; m_hitColModel = nil; } @@ -49,15 +41,13 @@ CPedModelInfo::SetClump(RpClump *clump) #ifdef EXTENDED_PIPELINES CustomPipes::AttachRimPipe(clump); #endif - if(!IsClumpSkinned(clump)) - return; CClumpModelInfo::SetClump(clump); SetFrameIds(m_pPedIds); // not needed in VC actually if(m_hitColModel == nil) CreateHitColModelSkinned(clump); RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPedCB); - //if(strcmp(GetModelName(), "player") == 0) - // RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); + if(strcmp(GetModelName(), "player") == 0) + RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); } struct ColNodeInfo @@ -83,27 +73,40 @@ ColNodeInfo m_pColNodeInfos[NUMPEDINFONODES] = { { nil, PED_FOOTR, PEDPIECE_RIGHTLEG, 0.0f, 0.15f, 0.15f }, }; -bool +void CPedModelInfo::CreateHitColModelSkinned(RpClump *clump) { + RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(clump); CColModel *colmodel = new CColModel; CColSphere *spheres = (CColSphere*)RwMalloc(NUMPEDINFONODES*sizeof(CColSphere)); + RwFrame *root = RpClumpGetFrame(m_clump); + RwMatrix *invmat = RwMatrixCreate(); + RwMatrix *mat = RwMatrixCreate(); + RwMatrixInvert(invmat, RwFrameGetMatrix(RpClumpGetFrame(clump))); for(int i = 0; i < NUMPEDINFONODES; i++){ - spheres[i].center.x = 0.0f; - spheres[i].center.y = 0.0f; - spheres[i].center.z = 0.0f; + *mat = *invmat; + int id = ConvertPedNode2BoneTag(m_pColNodeInfos[i].pedNode); // this is wrong, wtf R* ??? + int idx = RpHAnimIDGetIndex(hier, id); + + // This doesn't really work as the positions are not initialized yet + RwMatrixTransform(mat, &RpHAnimHierarchyGetMatrixArray(hier)[idx], rwCOMBINEPRECONCAT); + RwV3d pos = { 0.0f, 0.0f, 0.0f }; + RwV3dTransformPoints(&pos, &pos, 1, mat); + + spheres[i].center = pos + CVector(m_pColNodeInfos[i].x, 0.0f, m_pColNodeInfos[i].z); spheres[i].radius = m_pColNodeInfos[i].radius; spheres[i].surface = SURFACE_PED; spheres[i].piece = m_pColNodeInfos[i].pieceType; } + RwMatrixDestroy(invmat); + RwMatrixDestroy(mat); colmodel->spheres = spheres; colmodel->numSpheres = NUMPEDINFONODES; colmodel->boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f)); colmodel->boundingBox.Set(CVector(-0.5f, -0.5f, -1.2f), CVector(0.5f, 0.5f, 1.2f)); colmodel->level = LEVEL_GENERIC; m_hitColModel = colmodel; - return true; } CColModel* @@ -111,27 +114,28 @@ CPedModelInfo::AnimatePedColModelSkinned(RpClump *clump) { if(m_hitColModel == nil){ CreateHitColModelSkinned(clump); -#ifndef FIX_BUGS return m_hitColModel; -#endif - // we should really animate this now } - RwMatrix invmat, mat; + RwMatrix *invmat, *mat; CColSphere *spheres = m_hitColModel->spheres; RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(clump); - RwMatrixInvert(&invmat, RwFrameGetMatrix(RpClumpGetFrame(clump))); + invmat = RwMatrixCreate(); + mat = RwMatrixCreate(); + RwMatrixInvert(invmat, RwFrameGetMatrix(RpClumpGetFrame(clump))); for(int i = 0; i < NUMPEDINFONODES; i++){ - mat = invmat; + *mat = *invmat; int id = ConvertPedNode2BoneTag(m_pColNodeInfos[i].pedNode); int idx = RpHAnimIDGetIndex(hier, id); - RwMatrixTransform(&mat, &RpHAnimHierarchyGetMatrixArray(hier)[idx], rwCOMBINEPRECONCAT); - RwV3d pos = { 0.0f, 0.0f, 0.0f }; // actually CVector - RwV3dTransformPoints(&pos, &pos, 1, &mat); + RwMatrixTransform(mat, &RpHAnimHierarchyGetMatrixArray(hier)[idx], rwCOMBINEPRECONCAT); + RwV3d pos = { 0.0f, 0.0f, 0.0f }; + RwV3dTransformPoints(&pos, &pos, 1, mat); spheres[i].center = pos + CVector(m_pColNodeInfos[i].x, 0.0f, m_pColNodeInfos[i].z); } + RwMatrixDestroy(invmat); + RwMatrixDestroy(mat); return m_hitColModel; } @@ -149,71 +153,10 @@ CPedModelInfo::AnimatePedColModelSkinnedWorld(RpClump *clump) int idx = RpHAnimIDGetIndex(hier, id); mat = &RpHAnimHierarchyGetMatrixArray(hier)[idx]; - RwV3d pos = { 0.0f, 0.0f, 0.0f }; // actually CVector + RwV3d pos = { 0.0f, 0.0f, 0.0f }; RwV3dTransformPoints(&pos, &pos, 1, mat); spheres[i].center = pos + CVector(m_pColNodeInfos[i].x, 0.0f, m_pColNodeInfos[i].z); } return m_hitColModel; } - - -struct PedChunk -{ - CColModel *colmodel; - RpClump *clump; -}; - -void -CPedModelInfo::LoadModel(void *data, const void *chunk) -{ - PedChunk *chk = (PedChunk*)data; - m_hitColModel = chk->colmodel; - CStreaming::RegisterPointer(&m_hitColModel, 2, true); - CClumpModelInfo::LoadModel(chk->clump, chunk); -} - -void -CPedModelInfo::Write(base::cRelocatableChunkWriter &writer) -{ - SetColModel(&gpTempColModels->ms_colModelPed1); - CClumpModelInfo::Write(writer); - if(m_hitColModel){ - writer.AddPatch(&m_hitColModel); - m_hitColModel->Write(writer, true); - } -} - -void* -CPedModelInfo::WriteModel(base::cRelocatableChunkWriter &writer) -{ - PedChunk *chunk = new PedChunk; // LEAK - chunk->colmodel = nil; - chunk->clump = nil; - writer.AllocateRaw(chunk, sizeof(*chunk), sizeof(void*), false, true); - - chunk->clump = (RpClump*)CClumpModelInfo::WriteModel(writer); - if(chunk->clump) - writer.AddPatch(&chunk->clump); - - chunk->colmodel = m_hitColModel; - if(chunk->colmodel){ - writer.AddPatch(&chunk->colmodel); - chunk->colmodel->Write(writer, true); - } - return nil; -} - -void -CPedModelInfo::RcWriteThis(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), sizeof(void*), false, true); - writer.Class(VTABLE_ADDR(this), msClassInfo); -} - -void -CPedModelInfo::RcWriteEmpty(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), sizeof(void*), false, true); - writer.Class(VTABLE_ADDR(this), msClassInfo); -} diff --git a/src/modelinfo/PedModelInfo.h b/src/modelinfo/PedModelInfo.h index 7baa2bd..79bd7ea 100644 --- a/src/modelinfo/PedModelInfo.h +++ b/src/modelinfo/PedModelInfo.h @@ -38,8 +38,6 @@ public: CColModel *m_hitColModel; int8 radio1, radio2; - static base::cRelocatableChunkClassInfo msClassInfo; - static CPedModelInfo msClassInstance; static RwObjectNameIdAssocation m_pPedIds[PED_NODE_MAX]; CPedModelInfo(void) : CClumpModelInfo(MITYPE_PED) { m_hitColModel = nil; } @@ -47,13 +45,7 @@ public: void DeleteRwObject(void); void SetClump(RpClump *); - virtual void LoadModel(void *model, const void *chunk); - virtual void Write(base::cRelocatableChunkWriter &writer); - virtual void *WriteModel(base::cRelocatableChunkWriter &writer); - virtual void RcWriteThis(base::cRelocatableChunkWriter &writer); - virtual void RcWriteEmpty(base::cRelocatableChunkWriter &writer); - - bool CreateHitColModelSkinned(RpClump *clump); + void CreateHitColModelSkinned(RpClump *clump); CColModel *GetHitColModel(void) { return m_hitColModel; } CColModel *AnimatePedColModelSkinned(RpClump *clump); CColModel *AnimatePedColModelSkinnedWorld(RpClump *clump); diff --git a/src/modelinfo/SimpleModelInfo.cpp b/src/modelinfo/SimpleModelInfo.cpp index 8d0ea67..18eb7e5 100644 --- a/src/modelinfo/SimpleModelInfo.cpp +++ b/src/modelinfo/SimpleModelInfo.cpp @@ -1,61 +1,37 @@ #include "common.h" -#include "main.h" #include "General.h" -#include "Renderer.h" #include "Camera.h" #include "Renderer.h" #include "ModelInfo.h" #include "AnimManager.h" #include "custompipes.h" -#include "Streaming.h" -#include "smallHeap.h" -#include "Leeds.h" - -TempIdeData m_sTempIdeData[800]; - -base::cRelocatableChunkClassInfo CSimpleModelInfo::msClassInfo("CSimpleModelInfo", VTABLE_ADDR(&msClassInstance), sizeof(msClassInstance)); -CSimpleModelInfo CSimpleModelInfo::msClassInstance; void CSimpleModelInfo::DeleteRwObject(void) { int i; RwFrame *f; - if(m_atomics == nil) - return; - if(!gUseChunkFiles){ - for(i = 0; i < m_numAtomics; i++) - if(m_atomics[i]){ - f = RpAtomicGetFrame(m_atomics[i]); - RpAtomicDestroy(m_atomics[i]); - RwFrameDestroy(f); - m_atomics[i] = nil; - RemoveTexDictionaryRef(); - if(GetAnimFileIndex() != -1) - CAnimManager::RemoveAnimBlockRef(GetAnimFileIndex()); - } - }else if(m_chunk){ - CStreaming::UnregisterPointer(&m_atomics, 2); - for(i = 0; i < m_numAtomics; i++) - CStreaming::UnregisterAtomic(m_atomics[i], nil); - DeleteChunk(); - RemoveTexDictionaryRef(); - if(GetAnimFileIndex() != -1) - CAnimManager::RemoveAnimBlockRef(GetAnimFileIndex()); - } - m_atomics = nil; + for(i = 0; i < m_numAtomics; i++) + if(m_atomics[i]){ + f = RpAtomicGetFrame(m_atomics[i]); + RpAtomicDestroy(m_atomics[i]); + RwFrameDestroy(f); + m_atomics[i] = nil; + RemoveTexDictionaryRef(); + if(GetAnimFileIndex() != -1) + CAnimManager::RemoveAnimBlockRef(GetAnimFileIndex()); + } } RwObject* CSimpleModelInfo::CreateInstance(void) { RpAtomic *atomic; - if(m_atomics == nil || m_atomics[0] == nil) + if(m_atomics[0] == nil) return nil; atomic = RpAtomicClone(m_atomics[0]); RpAtomicSetFrame(atomic, RwFrameCreate()); - CStreaming::RegisterInstance(atomic, nil); return (RwObject*)atomic; } @@ -65,20 +41,21 @@ CSimpleModelInfo::CreateInstance(RwMatrix *matrix) RpAtomic *atomic; RwFrame *frame; - if(m_atomics == nil || m_atomics[0] == nil) + if(m_atomics[0] == nil) return nil; atomic = RpAtomicClone(m_atomics[0]); frame = RwFrameCreate(); *RwFrameGetMatrix(frame) = *matrix; RpAtomicSetFrame(atomic, frame); - CStreaming::RegisterInstance(atomic, nil); return (RwObject*)atomic; } void CSimpleModelInfo::Init(void) { - m_atomics = new RpAtomic*[3]; + m_atomics[0] = nil; + m_atomics[1] = nil; + m_atomics[2] = nil; m_numAtomics = 0; m_firstDamaged = 0; m_wetRoadReflection = 0; @@ -94,30 +71,21 @@ CSimpleModelInfo::Init(void) m_ignoreDrawDist = 0; m_isCodeGlass = 0; m_isArtistGlass = 0; - m_relatedModel = nil; } void CSimpleModelInfo::SetAtomic(int n, RpAtomic *atomic) { - if(m_atomics == nil){ - m_atomics = new RpAtomic*[3]; - m_atomics[0] = nil; - m_atomics[1] = nil; - m_atomics[2] = nil; - } - m_atomics[n] = atomic; AddTexDictionaryRef(); + m_atomics[n] = atomic; if(GetAnimFileIndex() != -1) CAnimManager::AddAnimBlockRef(GetAnimFileIndex()); RpGeometry *geo = RpAtomicGetGeometry(atomic); if(m_ignoreLight) RpGeometrySetFlags(geo, RpGeometryGetFlags(geo) & ~rpGEOMETRYLIGHT); -/* if(RpGeometryGetFlags(geo) & rpGEOMETRYNORMALS && RpGeometryGetNumTriangles(geo) > 200) debug("%s has %d polys\n", m_name, RpGeometryGetNumTriangles(geo)); -*/ #ifdef EXTENDED_PIPELINES if(m_wetRoadReflection) @@ -167,47 +135,11 @@ CSimpleModelInfo::GetLargestLodDistance(void) return d * TheCamera.LODDistMultiplier; } -RpAtomic* -CSimpleModelInfo::GetLodAtomic(int n) -{ - if(m_atomics == nil || n >= m_numAtomics) - return nil; - return m_atomics[n]; -} - -RpAtomic* -CSimpleModelInfo::GetLastAtomic(void) -{ - if(m_atomics == nil) - return nil; - if(m_firstDamaged == 0 || m_isDamaged) - return m_atomics[m_numAtomics-1]; - else - return m_atomics[m_firstDamaged-1]; -} - -RpAtomic* -CSimpleModelInfo::GetLastAtomic(float dist) -{ - int n; - if(m_atomics == nil) - return nil; - if(m_firstDamaged == 0 || m_isDamaged) - n = m_numAtomics-1; - else - n = m_firstDamaged-1; - if(dist < m_lodDistances[n] * TheCamera.LODDistMultiplier) - return m_atomics[n]; - return nil; -} - RpAtomic* CSimpleModelInfo::GetAtomicFromDistance(float dist) { int i; i = 0; -// HACk until we figure out what's going on -if(m_atomics == nil) return nil; if(m_isDamaged) i = m_firstDamaged; for(; i < m_numAtomics; i++) @@ -219,40 +151,20 @@ if(m_atomics == nil) return nil; RpAtomic* CSimpleModelInfo::GetFirstAtomicFromDistance(float dist) { -// HACk until we figure out what's going on -if(m_atomics == nil) return nil; if(dist < m_lodDistances[0] * TheCamera.LODDistMultiplier) return m_atomics[0]; return nil; } void -CSimpleModelInfo::FindRelatedModel(void) +CSimpleModelInfo::FindRelatedModel(int32 minID, int32 maxID) { + int i; CBaseModelInfo *mi; - int thisIndex, otherIndex; - - // find our own index in temp data - for(thisIndex = 0; thisIndex < ARRAY_SIZE(m_sTempIdeData); thisIndex++){ - if(m_sTempIdeData[thisIndex].id == -1) - break; - if(this == CModelInfo::GetModelInfo(m_sTempIdeData[thisIndex].id)) - goto found; - } - thisIndex = -1; -found: -#ifdef FIX_BUGS - if(thisIndex == -1) - return; -#endif - - for(otherIndex = 0; otherIndex < ARRAY_SIZE(m_sTempIdeData); otherIndex++){ - if(m_sTempIdeData[otherIndex].id == -1) - break; - - mi = CModelInfo::GetModelInfo(m_sTempIdeData[otherIndex].id); + for(i = minID; i <= maxID; i++){ + mi = CModelInfo::GetModelInfo(i); if(mi && mi != this && - !CGeneral::faststrcmp(m_sTempIdeData[thisIndex].name+3, m_sTempIdeData[otherIndex].name+3)){ + !CGeneral::faststrcmp(GetModelName()+3, mi->GetModelName()+3)){ assert(mi->IsSimple()); this->SetRelatedModel((CSimpleModelInfo*)mi); return; @@ -260,17 +172,15 @@ found: } } -#define NEAR_DRAW_DIST 100.0f // 0.0f in vice city +#define NEAR_DRAW_DIST 0.0f // 100.0f in liberty city void -CSimpleModelInfo::SetupBigBuilding(void) +CSimpleModelInfo::SetupBigBuilding(int32 minID, int32 maxID) { CSimpleModelInfo *related; - if(m_lodDistances[0] < 0.0f) - m_lodDistances[0] = -m_lodDistances[0]; // what? - else if(m_lodDistances[0] > LOD_DISTANCE && GetRelatedModel() == nil){ + if(m_lodDistances[0] > LOD_DISTANCE && GetRelatedModel() == nil){ m_isBigBuilding = 1; - FindRelatedModel(); + FindRelatedModel(minID, maxID); related = GetRelatedModel(); if(related){ m_lodDistances[2] = related->GetLargestLodDistance()/TheCamera.LODDistMultiplier; @@ -282,79 +192,3 @@ CSimpleModelInfo::SetupBigBuilding(void) m_lodDistances[2] = NEAR_DRAW_DIST; } } - - -void -CSimpleModelInfo::LoadModel(void *atomics, const void *chunk) -{ - int i; - m_chunk = (void*)chunk; - m_atomics = (RpAtomic**)atomics; - CStreaming::RegisterPointer(m_chunk, 2, true); - CStreaming::RegisterPointer(m_atomics, 2, true); - for(i = 0; i < m_numAtomics; i++){ - LoadResource(m_atomics[i]); - CStreaming::RegisterAtomic(m_atomics[i], nil); - } -} - -void -CSimpleModelInfo::Write(base::cRelocatableChunkWriter &writer) -{ - CBaseModelInfo::Write(writer); - if(WriteModel(writer)) - writer.AddPatch(&m_atomics); - else - m_atomics = nil; - if(m_isBigBuilding) - writer.AddPatch(&m_relatedModel); -} - -void* -CSimpleModelInfo::WriteModel(base::cRelocatableChunkWriter &writer) -{ - int i; - if(m_atomics == nil || m_atomics[0] == nil) - return nil; - - // remove empty atomics - int numAtomics = 0; - for(i = 0; i < m_numAtomics; i++) - if(m_atomics[i]){ - m_atomics[numAtomics] = m_atomics[i]; -#ifdef FIX_BUGS - m_lodDistances[numAtomics] = m_lodDistances[i]; -#endif - numAtomics++; - } - if(m_firstDamaged){ - int firstDam = m_firstDamaged - m_numAtomics + numAtomics; - if(firstDam < numAtomics) - m_firstDamaged = firstDam; - else - m_firstDamaged = 0; - } - m_numAtomics = numAtomics; - - // write the actual models - writer.AllocateRaw(m_atomics, m_numAtomics*sizeof(void*), sizeof(void*), false, true); - for(i = 0; m_numAtomics; i++){ - writer.AddPatch(&m_atomics[i]); - SaveResource(m_atomics[i], writer); - } - return m_atomics; -} - -void -CSimpleModelInfo::RcWriteThis(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), 0x10, false, true); - writer.Class(VTABLE_ADDR(this), msClassInfo); -} - -void -CSimpleModelInfo::RcWriteEmpty(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), 0x10, false, true); - writer.Class(VTABLE_ADDR(this), msClassInfo); -} diff --git a/src/modelinfo/SimpleModelInfo.h b/src/modelinfo/SimpleModelInfo.h index f919194..986cb88 100644 --- a/src/modelinfo/SimpleModelInfo.h +++ b/src/modelinfo/SimpleModelInfo.h @@ -2,18 +2,11 @@ #include "BaseModelInfo.h" -// For linking up models by name -struct TempIdeData -{ - char name[24]; - int16 id; -}; -extern TempIdeData m_sTempIdeData[800]; - class CSimpleModelInfo : public CBaseModelInfo { public: - RpAtomic **m_atomics; + // atomics[2] is often a pointer to the non-LOD modelinfo + RpAtomic *m_atomics[3]; // m_lodDistances[2] holds the near distance for LODs float m_lodDistances[3]; uint8 m_numAtomics; @@ -38,26 +31,15 @@ public: uint16 m_isCodeGlass : 1; uint16 m_isArtistGlass : 1; - CSimpleModelInfo *m_relatedModel; - - static base::cRelocatableChunkClassInfo msClassInfo; - static CSimpleModelInfo msClassInstance; - CSimpleModelInfo(void) : CBaseModelInfo(MITYPE_SIMPLE) {} CSimpleModelInfo(ModelInfoType id) : CBaseModelInfo(id) {} ~CSimpleModelInfo() {} void DeleteRwObject(void); RwObject *CreateInstance(void); RwObject *CreateInstance(RwMatrix *); - RwObject *GetRwObject(void) { return m_atomics ? (RwObject*)m_atomics[0] : nil; } + RwObject *GetRwObject(void) { return (RwObject*)m_atomics[0]; } - virtual void LoadModel(void *atomics, const void *chunk); - virtual void Write(base::cRelocatableChunkWriter &writer); - virtual void *WriteModel(base::cRelocatableChunkWriter &writer); - virtual void RcWriteThis(base::cRelocatableChunkWriter &writer); - virtual void RcWriteEmpty(base::cRelocatableChunkWriter &writer); - - /*virtual*/ void SetAtomic(int n, RpAtomic *atomic); + virtual void SetAtomic(int n, RpAtomic *atomic); void Init(void); void IncreaseAlpha(void); @@ -65,18 +47,15 @@ public: float GetLodDistance(int i); float GetNearDistance(void); float GetLargestLodDistance(void); - RpAtomic *GetLodAtomic(int n); - RpAtomic *GetLastAtomic(void); - RpAtomic *GetLastAtomic(float dist); RpAtomic *GetAtomicFromDistance(float dist); RpAtomic *GetFirstAtomicFromDistance(float dist); - void FindRelatedModel(void); - void SetupBigBuilding(void); + void FindRelatedModel(int32 minID, int32 maxID); + void SetupBigBuilding(int32 minID, int32 maxID); void SetNumAtomics(int n) { m_numAtomics = n; } CSimpleModelInfo *GetRelatedModel(void){ - return m_relatedModel; } + return (CSimpleModelInfo*)m_atomics[2]; } void SetRelatedModel(CSimpleModelInfo *m){ - m_relatedModel = m; } + m_atomics[2] = (RpAtomic*)m; } }; //static_assert(sizeof(CSimpleModelInfo) == 0x4C, "CSimpleModelInfo: error"); diff --git a/src/modelinfo/TimeModelInfo.cpp b/src/modelinfo/TimeModelInfo.cpp index 85b59e4..0db5fb7 100644 --- a/src/modelinfo/TimeModelInfo.cpp +++ b/src/modelinfo/TimeModelInfo.cpp @@ -3,20 +3,15 @@ #include "Camera.h" #include "ModelInfo.h" #include "General.h" -#include "KeyGen.h" - -base::cRelocatableChunkClassInfo CTimeModelInfo::msClassInfo("CTimeModelInfo", VTABLE_ADDR(&msClassInstance), sizeof(msClassInstance)); -CTimeModelInfo CTimeModelInfo::msClassInstance; - CTimeModelInfo* -CTimeModelInfo::FindOtherTimeModel(const char *modelname) +CTimeModelInfo::FindOtherTimeModel(void) { char name[40]; char *p; int i; - strcpy(name, modelname); + strcpy(name, GetModelName()); // change _nt to _dy if(p = strstr(name, "_nt")) strncpy(p, "_dy", 4); @@ -26,29 +21,13 @@ CTimeModelInfo::FindOtherTimeModel(const char *modelname) else return nil; - uint32 nameKey = CKeyGen::GetUppercaseKey(name); - for(i = 0; i < MODELINFOSIZE; i++){ CBaseModelInfo *mi = CModelInfo::GetModelInfo(i); - if (mi && mi->GetModelType() == MITYPE_TIME && nameKey == mi->GetNameHashKey()){ + if (mi && mi->GetModelType() == MITYPE_TIME && + !CGeneral::faststrncmp(name, mi->GetModelName(), MAX_MODEL_NAME)){ m_otherTimeModelID = i; return (CTimeModelInfo*)mi; } } return nil; } - - -void -CTimeModelInfo::RcWriteThis(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), sizeof(void*), false, true); - writer.Class(VTABLE_ADDR(this), msClassInfo); -} - -void -CTimeModelInfo::RcWriteEmpty(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), sizeof(void*), false, true); - writer.Class(VTABLE_ADDR(this), msClassInfo); -} diff --git a/src/modelinfo/TimeModelInfo.h b/src/modelinfo/TimeModelInfo.h index 67273b2..6e3c64f 100644 --- a/src/modelinfo/TimeModelInfo.h +++ b/src/modelinfo/TimeModelInfo.h @@ -7,21 +7,14 @@ class CTimeModelInfo : public CSimpleModelInfo int32 m_timeOn; int32 m_timeOff; int32 m_otherTimeModelID; - - static base::cRelocatableChunkClassInfo msClassInfo; - static CTimeModelInfo msClassInstance; - public: CTimeModelInfo(void) : CSimpleModelInfo(MITYPE_TIME) { m_otherTimeModelID = -1; } - virtual void RcWriteThis(base::cRelocatableChunkWriter &writer); - virtual void RcWriteEmpty(base::cRelocatableChunkWriter &writer); - int32 GetTimeOn(void) { return m_timeOn; } int32 GetTimeOff(void) { return m_timeOff; } void SetTimes(int32 on, int32 off) { m_timeOn = on; m_timeOff = off; } int32 GetOtherTimeModel(void) { return m_otherTimeModelID; } void SetOtherTimeModel(int32 other) { m_otherTimeModelID = other; } - CTimeModelInfo *FindOtherTimeModel(const char *name); + CTimeModelInfo *FindOtherTimeModel(void); }; //static_assert(sizeof(CTimeModelInfo) == 0x58, "CTimeModelInfo: error"); diff --git a/src/modelinfo/VehicleModelInfo.cpp b/src/modelinfo/VehicleModelInfo.cpp index 2158370..d31962c 100644 --- a/src/modelinfo/VehicleModelInfo.cpp +++ b/src/modelinfo/VehicleModelInfo.cpp @@ -1,7 +1,6 @@ #include "common.h" #include -#include "main.h" #include "RwHelper.h" #include "General.h" #include "NodeName.h" @@ -15,28 +14,20 @@ #include "Automobile.h" #include "Boat.h" #include "Train.h" -#include "Ferry.h" #include "Plane.h" #include "Heli.h" #include "Bike.h" #include "ModelIndices.h" #include "ModelInfo.h" #include "custompipes.h" -#include "Streaming.h" -#include "Leeds.h" -base::cRelocatableChunkClassInfo CVehicleModelInfo::msClassInfo("CVehicleModelInfo", VTABLE_ADDR(&msClassInstance), sizeof(msClassInstance)); -CVehicleModelInfo CVehicleModelInfo::msClassInstance; +int8 CVehicleModelInfo::ms_compsToUse[2] = { -2, -2 }; +int8 CVehicleModelInfo::ms_compsUsed[2]; +RwRGBA CVehicleModelInfo::ms_vehicleColourTable[256]; +RwTexture *CVehicleModelInfo::ms_colourTextureTable[256]; -//int8 CVehicleModelInfo::ms_compsToUse[2] = { -2, -2 }; -//int8 CVehicleModelInfo::ms_compsUsed[2]; -//RwRGBA CVehicleModelInfo::ms_vehicleColourTable[256]; -CVehicleModelInfo::Statics *CVehicleModelInfo::mspInfo; - -//RwTexture *CVehicleModelInfo::ms_colourTextureTable[256]; - -//RwTexture *gpWhiteTexture; -//RwFrame *pMatFxIdentityFrame; +RwTexture *gpWhiteTexture; +RwFrame *pMatFxIdentityFrame; enum { VEHICLE_FLAG_COLLAPSE = 0x2, @@ -123,22 +114,6 @@ RwObjectNameIdAssocation trainIds[] = { { nil, 0, 0 } }; -RwObjectNameIdAssocation ferryIds[] = { - { "door_front_dummy", FERRY_DOOR_FRONT, VEHICLE_FLAG_LEFT | VEHICLE_FLAG_COLLAPSE }, - { "door_back_dummy", FERRY_DOOR_BACK, VEHICLE_FLAG_LEFT | VEHICLE_FLAG_COLLAPSE }, - { "ramp_front_dummy", FERRY_RAMP_FRONT, VEHICLE_FLAG_LEFT | VEHICLE_FLAG_COLLAPSE }, - { "ramp_back_dummy", FERRY_RAMP_BACK, VEHICLE_FLAG_LEFT | VEHICLE_FLAG_COLLAPSE }, - { "light_front", FERRY_POS_LIGHT_FRONT, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, - { "light_rear", FERRY_POS_LIGHT_REAR, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, - { "chim_left", FERRY_POS_CHIM_LEFT, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, - { "ped_point", FERRY_POS_PED_POINT, VEHICLE_FLAG_DOOR | VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, - { "car1_dummy", FERRY_POS_CAR1, VEHICLE_FLAG_DOOR | VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, - { "car2_dummy", FERRY_POS_CAR2, VEHICLE_FLAG_DOOR | VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, - { "car3_dummy", FERRY_POS_CAR3, VEHICLE_FLAG_DOOR | VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, - { "car4_dummy", FERRY_POS_CAR4, VEHICLE_FLAG_DOOR | VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, - { nil, 0, 0 } -}; - RwObjectNameIdAssocation heliIds[] = { { "chassis_dummy", HELI_CHASSIS, VEHICLE_FLAG_COLLAPSE }, { "toprotor", HELI_TOPROTOR, 0 }, @@ -187,36 +162,12 @@ RwObjectNameIdAssocation *CVehicleModelInfo::ms_vehicleDescs[] = { trainIds, heliIds, planeIds, - bikeIds, - ferryIds + bikeIds }; bool gbBlackCars; bool gbPinkCars; -void -CVehicleModelInfo::Load(void *inst) -{ - if(inst) - mspInfo = (CVehicleModelInfo::Statics*)inst; - else{ - mspInfo = new CVehicleModelInfo::Statics; - memset(mspInfo, 0, sizeof(*mspInfo)); - mspInfo->ms_compsToUse[0] = -2; - mspInfo->ms_compsToUse[1] = -2; - } -} - -void* -CVehicleModelInfo::WriteStaticInfo(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(mspInfo, sizeof(*mspInfo), sizeof(void*), false, true); - if(mspInfo->unknown) - writer.AddPatch(&mspInfo->unknown); - return mspInfo; - -} - CVehicleModelInfo::CVehicleModelInfo(void) : CClumpModelInfo(MITYPE_VEHICLE) { @@ -227,12 +178,7 @@ CVehicleModelInfo::CVehicleModelInfo(void) m_positions[i].z = 0.0f; } m_numColours = 0; - CClumpModelInfo::m_animFileIndex = -1; - - memset(m_materials1, 0, sizeof(m_materials1)); - memset(m_materials2, 0, sizeof(m_materials2)); m_animFileIndex = -1; - m_normalSplay = 0.3f; } void @@ -241,77 +187,15 @@ CVehicleModelInfo::DeleteRwObject(void) int32 i; RwFrame *f; - if(!gUseChunkFiles){ - for(i = 0; i < m_numComps; i++){ - f = RpAtomicGetFrame(m_comps[i]); - RpAtomicDestroy(m_comps[i]); - RwFrameDestroy(f); - } -#ifdef FIX_BUGS - delete[] m_comps; - m_comps = nil; -#endif - m_numComps = 0; + for(i = 0; i < m_numComps; i++){ + f = RpAtomicGetFrame(m_comps[i]); + RpAtomicDestroy(m_comps[i]); + RwFrameDestroy(f); } - - RemoveWheels(); - - for(i = 0; i < ARRAY_SIZE(m_materials1); i++) - CStreaming::UnregisterPointer(&m_materials1[i], 2); - for(i = 0; i < ARRAY_SIZE(m_materials2); i++) - CStreaming::UnregisterPointer(&m_materials2[i], 2); - - if(m_numComps > 0){ - CStreaming::UnregisterPointer(&m_comps, 2); - for(i = 0; i < m_numComps; i++) - CStreaming::UnregisterAtomic(m_comps[i], nil); - m_comps = nil; - } - + m_numComps = 0; CClumpModelInfo::DeleteRwObject(); } -RwObject* -RemoveWheelCB(RwObject *object, void *arg) -{ - RpAtomic *atomic = (RpAtomic*)object; - if(RwObjectGetType(object) == rpATOMIC){ - RpClumpRemoveAtomic((RpClump*)arg, atomic); -#ifdef LIBRW - CStreaming::UnregisterPointer(&atomic->inClump.next, 2); - CStreaming::UnregisterPointer(&atomic->inClump.prev, 2); - CStreaming::UnregisterPointer(&atomic->object.object.parent, 2); - CStreaming::UnregisterPointer(&atomic->object.inFrame.next, 2); - CStreaming::UnregisterPointer(&atomic->object.inFrame.prev, 2); - CStreaming::UnregisterPointer(&atomic->clump, 2); -#endif - RpAtomicDestroy(atomic); - } - return object; -} - -void -CVehicleModelInfo::RemoveWheels(void) -{ -#ifdef FIX_BUGS - if(m_clump == nil) - return; -#endif - RwObjectNameIdAssocation *desc = ms_vehicleDescs[m_vehicleType]; - for(int i = 0; desc[i].name; i++){ - RwObjectIdAssociation assoc; - - if(desc[i].flags & (VEHICLE_FLAG_COMP|VEHICLE_FLAG_POS)) - continue; - assoc.frame = nil; - assoc.id = desc[i].hierId; - RwFrameForAllChildren(RpClumpGetFrame(m_clump), - FindFrameFromIdCB, &assoc); - if(assoc.frame && desc[i].flags & VEHICLE_FLAG_ADD_WHEEL && m_wheelId != -1) - RwFrameForAllObjects(assoc.frame, RemoveWheelCB, m_clump); - } -} - RwObject* CVehicleModelInfo::CreateInstance(void) { @@ -321,7 +205,7 @@ CVehicleModelInfo::CreateInstance(void) int32 comp1, comp2; clump = (RpClump*)CClumpModelInfo::CreateInstance(); - if(clump && m_numComps != 0 && strcmp(m_gameName, "POLICAR") != 0){ + if(m_numComps != 0){ clumpframe = RpClumpGetFrame(clump); comp1 = ChooseComponent(); @@ -335,7 +219,7 @@ CVehicleModelInfo::CreateInstance(void) RpClumpAddAtomic(clump, atomic); RwFrameAddChild(clumpframe, f); } - mspInfo->ms_compsUsed[0] = comp1; + ms_compsUsed[0] = comp1; comp2 = ChooseSecondComponent(); if(comp2 != -1 && m_comps[comp2]){ @@ -348,27 +232,18 @@ CVehicleModelInfo::CreateInstance(void) RpClumpAddAtomic(clump, atomic); RwFrameAddChild(clumpframe, f); } - mspInfo->ms_compsUsed[1] = comp2; + ms_compsUsed[1] = comp2; }else{ - mspInfo->ms_compsUsed[0] = -1; - mspInfo->ms_compsUsed[1] = -1; + ms_compsUsed[0] = -1; + ms_compsUsed[1] = -1; } - CStreaming::RegisterInstance(clump); return (RwObject*)clump; } -RpAtomic* -SplayNormals(RpAtomic *atomic, void *arg) -{ - // PSP only? - return atomic; -} - void CVehicleModelInfo::SetClump(RpClump *clump) { CClumpModelInfo::SetClump(clump); - RpClumpForAllAtomics((RpClump*)GetRwObject(), SplayNormals, this); SetAtomicRenderCallbacks(); SetFrameIds(ms_vehicleDescs[m_vehicleType]); PreprocessHierarchy(); @@ -522,77 +397,36 @@ CVehicleModelInfo::SetAtomicRendererCB_Train(RpAtomic *atomic, void *data) return atomic; } -RpAtomic* -CVehicleModelInfo::SetAtomicRendererCB_Ferry(RpAtomic *atomic, void *data) -{ - char *name; - bool alpha; - - name = GetFrameNodeName(RpAtomicGetFrame(atomic)); - alpha = false; - RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), HasAlphaMaterialCB, &alpha); - if(strstr(name, "_hi")){ - if(alpha) - CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderTrainHiDetailAlphaCB); - else - CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderTrainHiDetailCB); - }else if(strstr(name, "_lo")){ - if(alpha) - CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleLowDetailAlphaCB_BigVehicle); - else - CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleLowDetailCB_BigVehicle); - }else if(strstr(name, "_vlo")) - CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleReallyLowDetailCB_BigVehicle); - else - CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil); - HideDamagedAtomicCB(atomic, nil); - return atomic; -} - RpAtomic* CVehicleModelInfo::SetAtomicRendererCB_Boat(RpAtomic *atomic, void *data) { RpClump *clump; char *name; + bool alpha; clump = (RpClump*)data; name = GetFrameNodeName(RpAtomicGetFrame(atomic)); + alpha = false; + RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), HasAlphaMaterialCB, &alpha); if(strcmp(name, "boat_hi") == 0 || !CGeneral::faststrncmp(name, "extra", 5)) CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailCB_Boat); - else if(strstr(name, "_hi")) - CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailCB); - else if(strstr(name, "_lo")){ + else if(strstr(name, "_hi")){ + if(alpha) + CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailAlphaCB_Boat); + else + CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailCB); + }else if(strstr(name, "_lo")){ RpClumpRemoveAtomic(clump, atomic); RpAtomicDestroy(atomic); return atomic; // BUG: not done by gta }else if(strstr(name, "_vlo")) CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleLoDetailCB_Boat); - else - CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil); - HideDamagedAtomicCB(atomic, nil); - return atomic; -} - -RpAtomic* -CVehicleModelInfo::SetAtomicRendererCB_Boat_Far(RpAtomic *atomic, void *data) -{ - RpClump *clump; - char *name; - - clump = (RpClump*)data; - name = GetFrameNodeName(RpAtomicGetFrame(atomic)); - if(strcmp(name, "boat_hi") == 0 || !CGeneral::faststrncmp(name, "extra", 5)) - CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailCB_Boat_Far); - else if(strstr(name, "_hi")) - CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailCB); - else if(strstr(name, "_lo")){ - RpClumpRemoveAtomic(clump, atomic); - RpAtomicDestroy(atomic); - return atomic; // BUG: not done by gta - }else if(strstr(name, "_vlo")) - CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleLoDetailCB_Boat_Far); - else - CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil); + else{ + if(alpha) + CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailAlphaCB_Boat); + else + CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil); + } HideDamagedAtomicCB(atomic, nil); return atomic; } @@ -600,7 +434,6 @@ CVehicleModelInfo::SetAtomicRendererCB_Boat_Far(RpAtomic *atomic, void *data) RpAtomic* CVehicleModelInfo::SetAtomicRendererCB_Heli(RpAtomic *atomic, void *data) { -/* // LCS: gone, may be better to keep it though char *name; name = GetFrameNodeName(RpAtomicGetFrame(atomic)); @@ -609,7 +442,6 @@ CVehicleModelInfo::SetAtomicRendererCB_Heli(RpAtomic *atomic, void *data) else if(strncmp(name, "rearrotor", 9) == 0) CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleTailRotorAlphaCB); else -*/ CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil); return atomic; } @@ -654,18 +486,13 @@ CVehicleModelInfo::SetAtomicRenderCallbacks(void) RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Train, nil); else #endif - if(m_vehicleType == VEHICLE_TYPE_FERRY) - RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Ferry, nil); - else if(m_vehicleType == VEHICLE_TYPE_HELI) + if(m_vehicleType == VEHICLE_TYPE_HELI) RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Heli, nil); else if(m_vehicleType == VEHICLE_TYPE_PLANE) RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_BigVehicle, nil); - else if(m_vehicleType == VEHICLE_TYPE_BOAT){ - if(strcmp(m_gameName, "REEFER") == 0) - RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Boat_Far, m_clump); - else - RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Boat, m_clump); - }else if(mod_HandlingManager.GetHandlingData((tVehicleType)m_handlingId)->Flags & HANDLING_IS_HELI) + else if(m_vehicleType == VEHICLE_TYPE_BOAT) + RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Boat, m_clump); + else if(mod_HandlingManager.GetHandlingData((tVehicleType)m_handlingId)->Flags & HANDLING_IS_HELI) RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_RealHeli, m_clump); else RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, m_clump); @@ -713,8 +540,6 @@ CVehicleModelInfo::PreprocessHierarchy(void) m_numDoors = 0; m_numComps = 0; - m_comps = new RpAtomic*[7]; - for(i = 0; desc[i].name; i++){ RwObjectNameAssociation assoc; @@ -772,23 +597,21 @@ CVehicleModelInfo::PreprocessHierarchy(void) SetVehicleComponentFlags(assoc.frame, desc[i].flags); - if(!(gMakeResources && gUseResources)){ - if(desc[i].flags & VEHICLE_FLAG_ADD_WHEEL){ - if(m_wheelId == -1) - RwFrameDestroy(assoc.frame); - else{ - RwV3d scale; - atomic = (RpAtomic*)CModelInfo::GetModelInfo(m_wheelId)->CreateInstance(); - RwFrameDestroy(RpAtomicGetFrame(atomic)); - RpAtomicSetFrame(atomic, assoc.frame); - RpClumpAddAtomic(m_clump, atomic); - CVisibilityPlugins::SetAtomicRenderCallback(atomic, - CVisibilityPlugins::RenderWheelAtomicCB); - scale.x = m_wheelScale; - scale.y = m_wheelScale; - scale.z = m_wheelScale; - RwFrameScale(assoc.frame, &scale, rwCOMBINEPRECONCAT); - } + if(desc[i].flags & VEHICLE_FLAG_ADD_WHEEL){ + if(m_wheelId == -1) + RwFrameDestroy(assoc.frame); + else{ + RwV3d scale; + atomic = (RpAtomic*)CModelInfo::GetModelInfo(m_wheelId)->CreateInstance(); + RwFrameDestroy(RpAtomicGetFrame(atomic)); + RpAtomicSetFrame(atomic, assoc.frame); + RpClumpAddAtomic(m_clump, atomic); + CVisibilityPlugins::SetAtomicRenderCallback(atomic, + CVisibilityPlugins::RenderWheelAtomicCB); + scale.x = m_wheelScale; + scale.y = m_wheelScale; + scale.z = m_wheelScale; + RwFrameScale(assoc.frame, &scale, rwCOMBINEPRECONCAT); } } } @@ -933,7 +756,7 @@ CVehicleModelInfo::ChooseComponent(void) int32 n; comp = -1; - if(mspInfo->ms_compsToUse[0] == -2){ + if(ms_compsToUse[0] == -2){ if(COMPRULE_RULE(m_compRules) && IsValidCompRule(COMPRULE_RULE(m_compRules))) comp = ::ChooseComponent(COMPRULE_RULE(m_compRules), COMPRULE_COMPS(m_compRules)); else if(CGeneral::GetRandomNumberInRange(0, 3) < 2){ @@ -942,8 +765,8 @@ CVehicleModelInfo::ChooseComponent(void) comp = comps[(int)CGeneral::GetRandomNumberInRange(0, n)]; } }else{ - comp = mspInfo->ms_compsToUse[0]; - mspInfo->ms_compsToUse[0] = -2; + comp = ms_compsToUse[0]; + ms_compsToUse[0] = -2; } return comp; } @@ -956,7 +779,7 @@ CVehicleModelInfo::ChooseSecondComponent(void) int32 n; comp = -1; - if(mspInfo->ms_compsToUse[1] == -2){ + if(ms_compsToUse[1] == -2){ if(COMPRULE2_RULE(m_compRules) && IsValidCompRule(COMPRULE2_RULE(m_compRules))) comp = ::ChooseComponent(COMPRULE2_RULE(m_compRules), COMPRULE2_COMPS(m_compRules)); else if(COMPRULE_RULE(m_compRules) && IsValidCompRule(COMPRULE_RULE(m_compRules)) && @@ -967,8 +790,8 @@ CVehicleModelInfo::ChooseSecondComponent(void) comp = comps[(int)CGeneral::GetRandomNumberInRange(0, n)]; } }else{ - comp = mspInfo->ms_compsToUse[1]; - mspInfo->ms_compsToUse[1] = -2; + comp = ms_compsToUse[1]; + ms_compsToUse[1] = -2; } return comp; } @@ -1036,7 +859,7 @@ CVehicleModelInfo::SetVehicleColour(uint8 c1, uint8 c2) RpMaterial **matp; if(c1 != m_currentColour1){ - col = mspInfo->ms_vehicleColourTable[c1]; + col = ms_vehicleColourTable[c1]; for(matp = m_materials1; *matp; matp++){ colp = (RwRGBA*)RpMaterialGetColor(*matp); // get rid of const colp->red = col.red; @@ -1047,7 +870,7 @@ CVehicleModelInfo::SetVehicleColour(uint8 c1, uint8 c2) } if(c2 != m_currentColour2){ - col = mspInfo->ms_vehicleColourTable[c2]; + col = ms_vehicleColourTable[c2]; for(matp = m_materials2; *matp; matp++){ colp = (RwRGBA*)RpMaterialGetColor(*matp); // get rid of const colp->red = col.red; @@ -1172,8 +995,8 @@ CVehicleModelInfo::LoadVehicleColours(void) fd = CFileMgr::OpenFile("CARCOLS.DAT", "r"); CFileMgr::ChangeDir("\\"); - //for(i = 0; i < 256; i++) - // ms_colourTextureTable[i] = nil; + for(i = 0; i < 256; i++) + ms_colourTextureTable[i] = nil; section = 0; numCols = 0; @@ -1205,10 +1028,10 @@ CVehicleModelInfo::LoadVehicleColours(void) }else if(section == COLOURS){ sscanf(&line[start], // BUG: games doesn't add start "%d %d %d", &r, &g, &b); - mspInfo->ms_vehicleColourTable[numCols].red = r; - mspInfo->ms_vehicleColourTable[numCols].green = g; - mspInfo->ms_vehicleColourTable[numCols].blue = b; - mspInfo->ms_vehicleColourTable[numCols].alpha = 0xFF; + ms_vehicleColourTable[numCols].red = r; + ms_vehicleColourTable[numCols].green = g; + ms_vehicleColourTable[numCols].blue = b; + ms_vehicleColourTable[numCols].alpha = 0xFF; numCols++; }else if(section == CARS){ n = sscanf(&line[start], // BUG: games doesn't add start @@ -1238,7 +1061,6 @@ CVehicleModelInfo::LoadVehicleColours(void) void CVehicleModelInfo::DeleteVehicleColourTextures(void) { -/* int i; for(i = 0; i < 256; i++){ @@ -1247,7 +1069,6 @@ CVehicleModelInfo::DeleteVehicleColourTextures(void) ms_colourTextureTable[i] = nil; } } -*/ } RpMaterial* @@ -1259,7 +1080,6 @@ CVehicleModelInfo::GetMatFXEffectMaterialCB(RpMaterial *material, void *data) return nil; } -/* RpMaterial* CVehicleModelInfo::SetDefaultEnvironmentMapCB(RpMaterial *material, void *data) { @@ -1276,9 +1096,7 @@ CVehicleModelInfo::SetDefaultEnvironmentMapCB(RpMaterial *material, void *data) } return material; } -*/ -/* RpAtomic* CVehicleModelInfo::SetEnvironmentMapCB(RpAtomic *atomic, void *data) { @@ -1294,12 +1112,10 @@ CVehicleModelInfo::SetEnvironmentMapCB(RpAtomic *atomic, void *data) } return atomic; } -*/ void CVehicleModelInfo::SetEnvironmentMap(void) { -/* CSimpleModelInfo *wheelmi; int32 i; @@ -1317,7 +1133,6 @@ CVehicleModelInfo::SetEnvironmentMap(void) for(i = 0; i < wheelmi->m_numAtomics; i++) SetEnvironmentMapCB(wheelmi->m_atomics[i], nil); } -*/ #ifdef EXTENDED_PIPELINES CustomPipes::AttachVehiclePipe(m_clump); @@ -1332,23 +1147,21 @@ CVehicleModelInfo::LoadEnvironmentMaps(void) txdslot = CTxdStore::FindTxdSlot("particle"); CTxdStore::PushCurrentTxd(); CTxdStore::SetCurrentTxd(txdslot); - /*if(gpWhiteTexture == nil){ + if(gpWhiteTexture == nil){ gpWhiteTexture = RwTextureRead("white", nil); RwTextureGetName(gpWhiteTexture)[0] = '@'; RwTextureSetFilterMode(gpWhiteTexture, rwFILTERLINEAR); - }*/ + } CTxdStore::PopCurrentTxd(); } void CVehicleModelInfo::ShutdownEnvironmentMaps(void) { -/* RwTextureDestroy(gpWhiteTexture); gpWhiteTexture = nil; RwFrameDestroy(pMatFxIdentityFrame); pMatFxIdentityFrame = nil; -*/ } int @@ -1371,162 +1184,10 @@ CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors(int id) } if(n == 0) - return id == MI_RCBANDIT /*|| id == MI_PIZZABOY || id == MI_BAGGAGE*/ ? 0 : 1; + return id == MI_RCBANDIT || id == MI_PIZZABOY || id == MI_BAGGAGE ? 0 : 1; if(id == MI_COACH) return 8; return n - 1; } - - -struct VehicleChunk -{ - RpClump *clump; - int32 numComps; - RpAtomic **comp; - RpMaterial *materials1[NUM_FIRST_MATERIALS]; - RpMaterial *materials2[NUM_SECOND_MATERIALS]; -}; - -void -CVehicleModelInfo::LoadModel(void *data, const void *chunk) -{ - int i; - VehicleChunk *chk = (VehicleChunk*)data; - CClumpModelInfo::LoadModel(chk->clump, chunk); - - // editable materials - for(i = 0; i < NUM_FIRST_MATERIALS; i++){ - m_materials1[i] = chk->materials1[i]; - if(m_materials1[i]) - CStreaming::RegisterPointer(&m_materials1[i], 2, true); - } - for(i = 0; i < NUM_SECOND_MATERIALS; i++){ - m_materials2[i] = chk->materials2[i]; - if(m_materials2[i]) - CStreaming::RegisterPointer(&m_materials2[i], 2, true); - } - - // extra components - m_numComps = chk->numComps; - if(m_numComps > 0){ - m_comps = chk->comp; - CStreaming::RegisterPointer(&m_comps, 2, true); - for(i = 0; i < m_numComps; i++){ - LoadResource(m_comps[i]); - CStreaming::RegisterAtomic(m_comps[i], nil); - } - }else - m_comps = nil; - - m_currentColour1 = -1; - m_currentColour2 = -1; - - // add wheels - RwObjectNameIdAssocation *desc = ms_vehicleDescs[m_vehicleType]; - for(i = 0; desc[i].name; i++){ - RwObjectIdAssociation assoc; - - if(desc[i].flags & (VEHICLE_FLAG_COMP|VEHICLE_FLAG_POS)) - continue; - assoc.frame = nil; - assoc.id = desc[i].hierId; - RwFrameForAllChildren(RpClumpGetFrame(m_clump), - FindFrameFromIdCB, &assoc); - if(assoc.frame && desc[i].flags & VEHICLE_FLAG_ADD_WHEEL && m_wheelId != -1){ - RwV3d scale; - RpAtomic *atomic = (RpAtomic*)CModelInfo::GetModelInfo(m_wheelId)->CreateInstance(); - RwFrameDestroy(RpAtomicGetFrame(atomic)); - RpAtomicSetFrame(atomic, assoc.frame); - RpClumpAddAtomic(m_clump, atomic); - CVisibilityPlugins::SetAtomicRenderCallback(atomic, - CVisibilityPlugins::RenderWheelAtomicCB); - scale.x = m_wheelScale; - scale.y = m_wheelScale; - scale.z = m_wheelScale; - RwFrameScale(assoc.frame, &scale, rwCOMBINEPRECONCAT); -#ifdef LIBRW - CStreaming::RegisterPointer(&atomic->inClump.next, 2, true); - CStreaming::RegisterPointer(&atomic->inClump.prev, 2, true); - CStreaming::RegisterPointer(&atomic->object.object.parent, 2, true); - CStreaming::RegisterPointer(&atomic->object.inFrame.next, 2, true); - CStreaming::RegisterPointer(&atomic->object.inFrame.prev, 2, true); - CStreaming::RegisterPointer(&atomic->clump, 2, true); -#endif - } - } -} - -void -CVehicleModelInfo::Write(base::cRelocatableChunkWriter &writer) -{ - CClumpModelInfo::Write(writer); -} - -void* -CVehicleModelInfo::WriteModel(base::cRelocatableChunkWriter &writer) -{ - if(GetRwObject() == nil) - return nil; - - int i; - VehicleChunk *chk = new VehicleChunk; - memset(chk, 0, sizeof(*chk)); - writer.AllocateRaw(chk, sizeof(*chk), sizeof(void*), false, true); - - // clump - chk->clump = (RpClump*)CClumpModelInfo::WriteModel(writer); - if(chk->clump) - writer.AddPatch(&chk->clump); - - // materials - for(i = 0; i < NUM_FIRST_MATERIALS; i++){ - if(m_materials1[i] == nil || m_vehicleType == VEHICLE_TYPE_FERRY) - chk->materials1[i] = nil; - else{ - SaveResource(m_materials1[i], writer); - chk->materials1[i] = m_materials1[i]; - writer.AddPatch(&chk->materials1[i]); - } - } - for(i = 0; i < NUM_SECOND_MATERIALS; i++){ - if(m_materials2[i] == nil || m_vehicleType == VEHICLE_TYPE_FERRY) - chk->materials2[i] = nil; - else{ - SaveResource(m_materials2[i], writer); - chk->materials2[i] = m_materials2[i]; - writer.AddPatch(&chk->materials2[i]); - } - } - - // extra components - chk->numComps = m_numComps; - chk->comp = nil; - if(m_numComps > 0){ - chk->comp = m_comps; - writer.AddPatch(&chk->comp); - - writer.AllocateRaw(m_comps, m_numComps*sizeof(void*), sizeof(void*), false, true); - for(i = 0; i < m_numComps; i++) - if(m_comps[i]){ - SaveResource(m_comps[i], writer); - writer.AddPatch(&m_comps[i]); - } - } - return chk; -} - -void -CVehicleModelInfo::RcWriteThis(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), sizeof(void*), false, true); - writer.Class(VTABLE_ADDR(this), msClassInfo); -} - -void -CVehicleModelInfo::RcWriteEmpty(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), sizeof(void*), false, true); - writer.Class(VTABLE_ADDR(this), msClassInfo); -} diff --git a/src/modelinfo/VehicleModelInfo.h b/src/modelinfo/VehicleModelInfo.h index 6f2cea3..c7a4112 100644 --- a/src/modelinfo/VehicleModelInfo.h +++ b/src/modelinfo/VehicleModelInfo.h @@ -3,8 +3,8 @@ #include "ClumpModelInfo.h" enum { - NUM_FIRST_MATERIALS = 25, - NUM_SECOND_MATERIALS = 25, + NUM_FIRST_MATERIALS = 24, + NUM_SECOND_MATERIALS = 20, NUM_VEHICLE_COLOURS = 8, }; @@ -31,7 +31,6 @@ enum eVehicleType { VEHICLE_TYPE_HELI, VEHICLE_TYPE_PLANE, VEHICLE_TYPE_BIKE, - VEHICLE_TYPE_FERRY, NUM_VEHICLE_TYPES }; @@ -49,18 +48,6 @@ enum eBoatPositions BOAT_POS_FRONTSEAT }; -enum eFerryPositions -{ - FERRY_POS_LIGHT_FRONT, - FERRY_POS_LIGHT_REAR, - FERRY_POS_CHIM_LEFT, - FERRY_POS_PED_POINT, - FERRY_POS_CAR1, - FERRY_POS_CAR2, - FERRY_POS_CAR3, - FERRY_POS_CAR4 -}; - enum eTrainPositions { TRAIN_POS_LIGHT_FRONT, @@ -110,30 +97,19 @@ public: uint8 m_lastColorVariation; uint8 m_currentColour1; uint8 m_currentColour2; - RpAtomic **m_comps; - float m_normalSplay; + RpAtomic *m_comps[6]; // This is stupid, CClumpModelInfo already has it! union { int32 m_animFileIndex; char *m_animFileName; }; - static base::cRelocatableChunkClassInfo msClassInfo; - static CVehicleModelInfo msClassInstance; - - struct Statics { - void *unknown; // unused too it seems - RwRGBA ms_vehicleColourTable[256]; - int8 ms_compsUsed[2]; - int8 ms_compsToUse[2]; - }; - //static RwTexture *ms_colourTextureTable[256]; - static Statics *mspInfo; + static int8 ms_compsToUse[2]; + static int8 ms_compsUsed[2]; + static RwRGBA ms_vehicleColourTable[256]; + static RwTexture *ms_colourTextureTable[256]; static RwObjectNameIdAssocation *ms_vehicleDescs[NUM_VEHICLE_TYPES]; - static void Load(void *inst); - static void *WriteStaticInfo(base::cRelocatableChunkWriter &writer); - CVehicleModelInfo(void); void DeleteRwObject(void); RwObject *CreateInstance(void); @@ -142,12 +118,6 @@ public: void ConvertAnimFileIndex(void); int GetAnimFileIndex(void) { return m_animFileIndex; } - virtual void LoadModel(void *model, const void *chunk); - virtual void Write(base::cRelocatableChunkWriter &writer); - virtual void *WriteModel(base::cRelocatableChunkWriter &writer); - virtual void RcWriteThis(base::cRelocatableChunkWriter &writer); - virtual void RcWriteEmpty(base::cRelocatableChunkWriter &writer); - static RwFrame *CollapseFramesCB(RwFrame *frame, void *data); static RwObject *MoveObjectsCB(RwObject *object, void *data); static RpAtomic *HideDamagedAtomicCB(RpAtomic *atomic, void *data); @@ -157,16 +127,13 @@ public: static RpAtomic *SetAtomicRendererCB(RpAtomic *atomic, void *data); static RpAtomic *SetAtomicRendererCB_BigVehicle(RpAtomic *atomic, void *data); static RpAtomic *SetAtomicRendererCB_Train(RpAtomic *atomic, void *data); - static RpAtomic *SetAtomicRendererCB_Ferry(RpAtomic *atomic, void *data); static RpAtomic *SetAtomicRendererCB_Boat(RpAtomic *atomic, void *data); - static RpAtomic *SetAtomicRendererCB_Boat_Far(RpAtomic *atomic, void *data); static RpAtomic *SetAtomicRendererCB_Heli(RpAtomic *atomic, void *data); static RpAtomic *SetAtomicRendererCB_RealHeli(RpAtomic *atomic, void *data); void SetAtomicRenderCallbacks(void); static RwObject *SetAtomicFlagCB(RwObject *object, void *data); static RwObject *ClearAtomicFlagCB(RwObject *atomic, void *data); - void RemoveWheels(void); void SetVehicleComponentFlags(RwFrame *frame, uint32 flags); void PreprocessHierarchy(void); void GetWheelPosn(int32 n, CVector &pos); @@ -192,7 +159,7 @@ public: static void ShutdownEnvironmentMaps(void); static int GetMaximumNumberOfPassengersFromNumberOfDoors(int id); - static void SetComponentsToUse(int8 c1, int8 c2) { mspInfo->ms_compsToUse[0] = c1; mspInfo->ms_compsToUse[1] = c2; } + static void SetComponentsToUse(int8 c1, int8 c2) { ms_compsToUse[0] = c1; ms_compsToUse[1] = c2; } }; extern bool gbBlackCars; diff --git a/src/modelinfo/WeaponModelInfo.cpp b/src/modelinfo/WeaponModelInfo.cpp index 1d194ec..d9294c3 100644 --- a/src/modelinfo/WeaponModelInfo.cpp +++ b/src/modelinfo/WeaponModelInfo.cpp @@ -4,9 +4,6 @@ #include "AnimManager.h" #include "VisibilityPlugins.h" -base::cRelocatableChunkClassInfo CWeaponModelInfo::msClassInfo("CWeaponModelInfo", VTABLE_ADDR(&msClassInstance), sizeof(msClassInstance)); -CWeaponModelInfo CWeaponModelInfo::msClassInstance; - void CWeaponModelInfo::SetAnimFile(const char *file) { @@ -38,34 +35,19 @@ CWeaponModelInfo::Init(void) void CWeaponModelInfo::SetWeaponInfo(int32 weaponId) { - m_relatedModel = (CSimpleModelInfo*)weaponId; + m_atomics[2] = (RpAtomic*)weaponId; } eWeaponType CWeaponModelInfo::GetWeaponInfo(void) { - return (eWeaponType)(uintptr)m_relatedModel; + return (eWeaponType)(uintptr)m_atomics[2]; } -/* void CWeaponModelInfo::SetAtomic(int n, RpAtomic *atomic) { CSimpleModelInfo::SetAtomic(n, atomic); CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderWeaponCB); } -*/ -void -CWeaponModelInfo::RcWriteThis(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), sizeof(void*), false, true); - writer.Class(VTABLE_ADDR(this), msClassInfo); -} - -void -CWeaponModelInfo::RcWriteEmpty(base::cRelocatableChunkWriter &writer) -{ - writer.AllocateRaw(this, sizeof(*this), sizeof(void*), false, true); - writer.Class(VTABLE_ADDR(this), msClassInfo); -} diff --git a/src/modelinfo/WeaponModelInfo.h b/src/modelinfo/WeaponModelInfo.h index 8dc9baf..548bf8a 100644 --- a/src/modelinfo/WeaponModelInfo.h +++ b/src/modelinfo/WeaponModelInfo.h @@ -9,21 +9,13 @@ class CWeaponModelInfo : public CSimpleModelInfo int32 m_animFileIndex; char *m_animFileName; }; - - static base::cRelocatableChunkClassInfo msClassInfo; - static CWeaponModelInfo msClassInstance; - public: CWeaponModelInfo(void) : CSimpleModelInfo(MITYPE_WEAPON) { m_animFileIndex = -1; } virtual void SetAnimFile(const char *file); virtual void ConvertAnimFileIndex(void); virtual int GetAnimFileIndex(void) { return m_animFileIndex; } - - virtual void RcWriteThis(base::cRelocatableChunkWriter &writer); - virtual void RcWriteEmpty(base::cRelocatableChunkWriter &writer); - - //virtual void SetAtomic(int n, RpAtomic *atomic); + virtual void SetAtomic(int n, RpAtomic *atomic); void Init(void); void SetWeaponInfo(int32 weaponId); diff --git a/src/objects/CutsceneObject.cpp b/src/objects/CutsceneObject.cpp index 803fcf0..7d9fe64 100644 --- a/src/objects/CutsceneObject.cpp +++ b/src/objects/CutsceneObject.cpp @@ -53,15 +53,12 @@ CCutsceneObject::SetModelIndex(uint32 id) void CCutsceneObject::CreateShadow(void) { - // empty in LCS - /* if ( IsPedModel(GetModelIndex()) ) { m_pShadow = new CCutsceneShadow(); if (!m_pShadow->IsInitialized()) m_pShadow->Create(m_rwObject, 6, true, 4, true); } - */ } void diff --git a/src/objects/Object.h b/src/objects/Object.h index a8205ba..e34043a 100644 --- a/src/objects/Object.h +++ b/src/objects/Object.h @@ -71,7 +71,6 @@ public: uint8 bIsWeapon : 1; uint8 bIsStreetLight : 1; int8 m_nBonusValue; - int8 m_nLastWeaponToDamage; uint16 m_nCostValue; float m_fCollisionDamageMultiplier; uint8 m_nCollisionDamageEffect; diff --git a/src/objects/ParticleObject.cpp b/src/objects/ParticleObject.cpp index a281062..4d080d1 100644 --- a/src/objects/ParticleObject.cpp +++ b/src/objects/ParticleObject.cpp @@ -242,16 +242,6 @@ CParticleObject::AddObject(uint16 type, CVector const &pos, CVector const &targe break; } - case POBJECT_FIRE_HYDRANT_STEAM: - { - pobj->m_ParticleType = PARTICLE_HYDRANT_STEAM; - pobj->m_nNumEffectCycles = 2; - pobj->m_nSkipFrames = 2; - pobj->m_nCreationChance = 8; - pobj->m_nRemoveTimer = CTimer::GetTimeInMilliseconds() + 5000; - break; - } - case POBJECT_CAR_WATER_SPLASH: case POBJECT_PED_WATER_SPLASH: { @@ -931,7 +921,6 @@ void CParticleObject::UpdateClose(void) CParticle::AddParticle(PARTICLE_CAR_SPLASH, splashpos, splashvel, nil, CGeneral::GetRandomNumberInRange(0.005f, 0.0075f), this->m_Color, 0, 0, 1, 300); } - for ( int32 i = 0; i < this->m_nNumEffectCycles; i++ ) { CParticle::AddParticle(this->m_ParticleType, pos, vel, nil, 0.0f, this->m_Color); diff --git a/src/objects/ParticleObject.h b/src/objects/ParticleObject.h index 1ac2945..f199e53 100644 --- a/src/objects/ParticleObject.h +++ b/src/objects/ParticleObject.h @@ -15,7 +15,6 @@ enum eParticleObjectType POBJECT_WALL_STEAM_SLOWMOTION, POBJECT_DARK_SMOKE, POBJECT_FIRE_HYDRANT, - POBJECT_FIRE_HYDRANT_STEAM, POBJECT_CAR_WATER_SPLASH, POBJECT_PED_WATER_SPLASH, POBJECT_SPLASHES_AROUND, @@ -50,7 +49,7 @@ public: CParticleObject *m_pNext; CParticleObject *m_pPrev; CParticle *m_pParticle; - uint32 m_nRemoveTimer; + uint32 m_nRemoveTimer; eParticleObjectType m_Type; tParticleType m_ParticleType; uint8 m_nNumEffectCycles; @@ -110,4 +109,4 @@ public: static void Remove(CParticleObject *particleobject); static CAudioHydrant *Get(int n); // for neo screen droplets -}; +}; \ No newline at end of file diff --git a/src/peds/Gangs.cpp b/src/peds/Gangs.cpp index e6de077..2d6d113 100644 --- a/src/peds/Gangs.cpp +++ b/src/peds/Gangs.cpp @@ -20,24 +20,23 @@ CGangInfo::CGangInfo() : void CGangs::Initialise(void) { - SetGangPedModels(GANG_MAFIA, MI_GANG01, MI_GANG02); - SetGangPedModels(GANG_TRIAD, MI_GANG03, MI_GANG04); - SetGangPedModels(GANG_DIABLOS, MI_GANG05, MI_GANG06); - SetGangPedModels(GANG_YAKUZA, MI_GANG07, MI_GANG08); - SetGangPedModels(GANG_YARDIE, MI_GANG09, MI_GANG10); - SetGangPedModels(GANG_COLUMB, MI_GANG11, MI_GANG12); - SetGangPedModels(GANG_HOODS, MI_GANG13, MI_GANG14); - SetGangPedModels(GANG_FORELLI, MI_GANG15, MI_GANG16); - SetGangPedModels(GANG_SINDACCO, MI_GANG17, MI_GANG18); - SetGangVehicleModel(GANG_MAFIA, MI_MAFIA); - SetGangVehicleModel(GANG_TRIAD, MI_BELLYUP); - SetGangVehicleModel(GANG_DIABLOS, MI_DIABLOS); - SetGangVehicleModel(GANG_YAKUZA, MI_YAKUZA); - SetGangVehicleModel(GANG_YARDIE, MI_YARDIE); - SetGangVehicleModel(GANG_COLUMB, MI_COLUMB); - SetGangVehicleModel(GANG_HOODS, MI_HOODS); - SetGangVehicleModel(GANG_FORELLI, MI_FORELLI_CAR); - SetGangVehicleModel(GANG_SINDACCO, MI_SINDACCO_CAR); + SetGangPedModels(GANG_CUBAN, MI_CBA, MI_CBB); + SetGangPedModels(GANG_HAITIAN, MI_HNA, MI_HNB); + SetGangPedModels(GANG_STREET, MI_SGA, MI_SGB); + SetGangPedModels(GANG_DIAZ, MI_CLA, MI_CLB); + SetGangPedModels(GANG_SECURITY, MI_GDA, MI_GDB); + SetGangPedModels(GANG_BIKER, MI_BKA, MI_BKB); + SetGangPedModels(GANG_PLAYER, MI_PGA, MI_PGB); + SetGangPedModels(GANG_GOLFER, MI_WFOGO, MI_WMOGO); + SetGangVehicleModel(GANG_CUBAN, MI_CUBAN); + SetGangVehicleModel(GANG_HAITIAN, MI_VOODOO); + SetGangVehicleModel(GANG_STREET, MI_GANGBUR); + SetGangVehicleModel(GANG_DIAZ, -1); + SetGangVehicleModel(GANG_SECURITY, -1); + SetGangVehicleModel(GANG_BIKER, MI_ANGEL); + SetGangVehicleModel(GANG_PLAYER, -1); + SetGangVehicleModel(GANG_GOLFER, MI_CADDY); + SetGangWeapons(GANG_GOLFER, WEAPONTYPE_GOLFCLUB, WEAPONTYPE_GOLFCLUB); #ifdef FIX_BUGS for (int i = 0; i < NUM_GANGS; i++) SetGangPedModelOverride(i, -1); diff --git a/src/peds/Gangs.h b/src/peds/Gangs.h index acb2fb9..c638134 100644 --- a/src/peds/Gangs.h +++ b/src/peds/Gangs.h @@ -17,15 +17,15 @@ struct CGangInfo VALIDATE_SIZE(CGangInfo, 0x10); enum { - GANG_MAFIA = 0, - GANG_TRIAD, - GANG_DIABLOS, - GANG_YAKUZA, - GANG_YARDIE, - GANG_COLUMB, - GANG_HOODS, - GANG_FORELLI, - GANG_SINDACCO, + GANG_CUBAN = 0, + GANG_HAITIAN, + GANG_STREET, + GANG_DIAZ, + GANG_SECURITY, + GANG_BIKER, + GANG_PLAYER, + GANG_GOLFER, + GANG_9, NUM_GANGS }; diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index 3497362..ba09e8a 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -9272,7 +9272,7 @@ CPed::SetRadioStation(void) if (IsPlayer() || !m_pMyVehicle || m_pMyVehicle->pDriver != this) return; - if (GetModelIndex() != MI_GANG13 && GetModelIndex() != MI_GANG14) { + if (GetModelIndex() != MI_PGA && GetModelIndex() != MI_PGB) { if (m_pMyVehicle->m_nRadioStation != modelInfo->radio1 && m_pMyVehicle->m_nRadioStation != modelInfo->radio2) { if (CGeneral::GetRandomTrueFalse()) m_pMyVehicle->m_nRadioStation = modelInfo->radio1; @@ -9285,10 +9285,8 @@ CPed::SetRadioStation(void) } void -CPed::WarpPedIntoCar(CVehicle *car) // LCS TODO: remove passenger logic +CPed::WarpPedIntoCar(CVehicle *car) { - if (GetPedState() == PED_FACE_PHONE) - QuitEnteringCar(); bInVehicle = true; m_pMyVehicle = car; m_pMyVehicle->RegisterReference((CEntity **) &m_pMyVehicle); @@ -9353,77 +9351,6 @@ CPed::WarpPedIntoCar(CVehicle *car) // LCS TODO: remove passenger logic bChangedSeat = true; } -void -CPed::WarpPedIntoCarAsPassenger(CVehicle* pVehicle, int32 position) -{ - if (GetPedState() == PED_FACE_PHONE) - QuitEnteringCar(); - bInVehicle = true; - m_pMyVehicle = pVehicle; - m_pMyVehicle->RegisterReference((CEntity**)&m_pMyVehicle); - m_carInObjective = pVehicle; - m_carInObjective->RegisterReference((CEntity**)&m_carInObjective); - SetPedState(PED_DRIVING); // TODO: this is PED_PASSENGER, but it needs to have some logic applied first - bUsesCollision = false; - bIsInTheAir = false; - bVehExitWillBeInstant = true; - if (pVehicle->IsBike() && !pVehicle->pPassengers[0]) { - pVehicle->pPassengers[0] = this; - pVehicle->pPassengers[0]->RegisterReference((CEntity**)&pVehicle->pPassengers[0]); - } - if (position >= 0) { - if (!pVehicle->pPassengers[position]) { - pVehicle->pPassengers[position] = this; - pVehicle->pPassengers[position]->RegisterReference((CEntity**)&pVehicle->pPassengers[position]); - } - } - else { - for (int i = 0; i < 4; i++) { - if (!pVehicle->pPassengers[i]) { - pVehicle->pPassengers[i] = this; - pVehicle->pPassengers[i]->RegisterReference((CEntity**)&pVehicle->pPassengers[i]); - break; - } - } - } - - if (IsPlayer()) { - pVehicle->SetStatus(STATUS_PLAYER); - AudioManager.PlayerJustGotInCar(); - CCarCtrl::RegisterVehicleOfInterest(pVehicle); - } - else { - pVehicle->SetStatus(STATUS_PHYSICS); - } - - CWorld::Remove(this); - SetPosition(pVehicle->GetPosition()); - CWorld::Add(this); - - if (pVehicle->bIsAmbulanceOnDuty) { - pVehicle->bIsAmbulanceOnDuty = false; - --CCarCtrl::NumAmbulancesOnDuty; - } - if (pVehicle->bIsFireTruckOnDuty) { - pVehicle->bIsFireTruckOnDuty = false; - --CCarCtrl::NumFiretrucksOnDuty; - } - if (!pVehicle->bEngineOn) { - pVehicle->bEngineOn = true; - DMAudio.PlayOneShot(pVehicle->m_audioEntityId, SOUND_CAR_ENGINE_START, 1.0f); - } - - RpAnimBlendClumpSetBlendDeltas(GetClump(), ASSOC_PARTIAL, -1000.0f); - - AddInCarAnims(pVehicle, pVehicle->pDriver == this); - RemoveWeaponWhenEnteringVehicle(); - - if (pVehicle->bIsBus) - bRenderPedInCar = false; - - bChangedSeat = true; -} - bool CPed::HasAttractor(void) { diff --git a/src/peds/Ped.h b/src/peds/Ped.h index 1ddb136..c94cd32 100644 --- a/src/peds/Ped.h +++ b/src/peds/Ped.h @@ -100,31 +100,9 @@ enum PedFightMoves { FIGHTMOVE_NULL, // Attacker -// FIGHTMOVE_STDPUNCH, + FIGHTMOVE_STDPUNCH, FIGHTMOVE_IDLE, FIGHTMOVE_SHUFFLE_F, - // Combos - FIGHTMOVE_COMBO_A1, - FIGHTMOVE_COMBO_A2, - FIGHTMOVE_COMBO_A3, - FIGHTMOVE_COMBO_B1, - FIGHTMOVE_COMBO_B2, - FIGHTMOVE_COMBO_B3, - // Melee - FIGHTMOVE_MELEE1, - FIGHTMOVE_MELEE2, - FIGHTMOVE_MELEE3, - // Special - FIGHTMOVE_GROUNDKICK, - // Opponent - FIGHTMOVE_HITFRONT, - FIGHTMOVE_HITBACK, - FIGHTMOVE_HITRIGHT, - FIGHTMOVE_HITLEFT, - FIGHTMOVE_HITONFLOOR, - FIGHTMOVE_HITBEHIND, - FIGHTMOVE_IDLE2NORM, -/* FIGHTMOVE_KNEE, FIGHTMOVE_PUNCHHOOK, FIGHTMOVE_PUNCHJAB, @@ -156,16 +134,7 @@ enum PedFightMoves FIGHTMOVE_MELEE2, FIGHTMOVE_MELEE3, FIGHTMOVE_IDLE2NORM, -*/ - - NUM_FIGHTMOVES, - - // LCS replacements for the old names: - // NB: this may be totally bogus, i just need it to compile - FIGHTMOVE_PUNCH = FIGHTMOVE_COMBO_A2, - FIGHTMOVE_FWDRIGHT = FIGHTMOVE_COMBO_B1, - FIGHTMOVE_LONGKICK = FIGHTMOVE_COMBO_B2, - FIGHTMOVE_ROUNDHOUSE = FIGHTMOVE_COMBO_B3, + NUM_FIGHTMOVES }; enum ePedPieceTypes @@ -406,7 +375,7 @@ public: float m_fCollisionSpeed; // cf. https://github.com/DK22Pac/plugin-sdk/blob/master/plugin_sa/game_sa/CPed.h from R* - uint32 bIsStanding : 1; // 0x194 on PS2, 0x1A4 on android + uint32 bIsStanding : 1; uint32 bWasStanding : 1; uint32 bIsAttacking : 1; // doesn't reset after fist fight uint32 bIsPointingGunAt : 1; @@ -499,7 +468,7 @@ public: uint32 bIsDrowning : 1; uint32 bDrownsInWater : 1; uint32 bWaitForLeaderToComeCloser : 1; - uint32 bHeldHostageInCar : 1; // one flag was added somewhere after this one (TODO: figure out where and which) + uint32 bHeldHostageInCar : 1; uint32 bIsPlayerFriend : 1; uint32 bHeadStuckInCollision : 1; uint32 bDeadPedInFrontOfCar : 1; @@ -512,7 +481,7 @@ public: uint32 bMakeFleeScream : 1; uint32 bPushedAlongByCar : 1; uint32 bRemoveMeWhenIGotIntoCar : 1; - uint32 bIgnoreThreatsBehindObjects : 1; // one flag was added somewhere before this one (TODO: figure out where and which) + uint32 bIgnoreThreatsBehindObjects : 1; uint32 bNeverEverTargetThisPed : 1; uint32 bCrouchWhenScared : 1; @@ -521,42 +490,18 @@ public: uint32 bCollectBusFare : 1; uint32 bBoughtIceCream : 1; uint32 bDonePositionOutOfCollision : 1; - - uint32 bCanAttackPlayerWithCops : 1; // 1A1_1 on PS2 - uint32 bOnlyAllowedToSitBehind : 1; - uint32 bOnlyAllowedToSitInFront : 1; - uint32 b1A1_8 : 1; - uint32 b1A1_10 : 1; - uint32 bOverrideMoveAnim : 1; + uint32 bCanAttackPlayerWithCops : 1; #ifdef KANGAROO_CHEAT // our own flags uint32 m_ped_flagI80 : 1; // KANGAROO_CHEAT define makes use of this as cheat toggle #endif - uint16 m_gangFlags; // <- this one is uint16 - - uint8 bDropsWeaponsOnDeath : 1; - uint8 b1A4_2 : 1; - uint8 bAttacksPlayerWithCops : 1; - uint8 b1A4_8 : 1; - uint8 b1A4_10 : 1; - uint8 b1A4_20 : 1; - uint8 b1A4_40 : 1; - uint8 b1A4_80 : 1; - - uint8 bCanBeTargettedByLeader : 1; - uint8 b1A5_2 : 1; - uint8 b1A5_4 : 1; - uint8 b1A5_8 : 1; - uint8 b1A5_10 : 1; - uint8 b1A5_20 : 1; - uint8 b1A5_40 : 1; - uint8 b1A5_80 : 1; - - uint8 unk_1A6; // <- init with 100 in constructor - - uint8 CharCreatedBy; // 1AC + uint8 m_gangFlags; + uint8 m_unused15D; // these 3 can't be padding but had to actually have been members ... + uint8 m_unused15E; + uint8 m_unused15F; + uint8 CharCreatedBy; eObjective m_objective; eObjective m_prevObjective; CPed *m_pedInObjective; @@ -605,8 +550,6 @@ public: float m_fHealth; float m_fArmour; uint32 m_nExtendedRangeTimer; - uint32 m_nScriptShootTimer; - uint32 m_nScriptAttackTimer; int16 m_routeLastPoint; uint16 m_routeStartPoint; int16 m_routePointsPassed; @@ -706,7 +649,6 @@ public: uint32 m_lastComment; CVector m_vecSpotToGuard; float m_radiusToGuard; - float m_fMaxHealth; static void *operator new(size_t); static void *operator new(size_t, int); @@ -776,7 +718,6 @@ public: void SetObjective(eObjective); void SetObjective(eObjective, int16, int16); void SetObjective(eObjective, CVector); - void SetObjective(eObjective, CVector, float); void SetObjective(eObjective, float, const CVector&); void ClearChat(void); void InformMyGangOfAttack(CEntity*); @@ -909,7 +850,6 @@ public: void SetSolicit(uint32 time); void ScanForInterestingStuff(void); void WarpPedIntoCar(CVehicle*); - void WarpPedIntoCarAsPassenger(CVehicle*, int32); void SetCarJack(CVehicle*); bool WarpPedToNearLeaderOffScreen(void); void Solicit(void); @@ -1064,16 +1004,6 @@ public: { return m_pMyVehicle != nil && ((CEntity*)m_pMyVehicle)->GetStatus() != STATUS_WRECKED; } - bool CanStartMission() // used in CAN_PLAYER_START_MISSION and can looks like inlined function - { - if (m_nPedState >= PED_WANDER_RANGE && m_nPedState < PED_STATES_NO_AI && m_nPedState != PED_ANSWER_MOBILE) - return false; - if (m_nPedState >= PED_JUMP && m_nPedState < PED_STATES_NO_ST) - return false; - if (m_nPedState >= PED_ENTER_TRAIN && m_nPedState < PED_DEPLOY_STINGER) - return false; - return !bIsInTheAir && !bIsLanding && m_fHealth > 0.0f; - } // My names. Inlined in VC AnimationId GetFireAnimNotDucking(CWeaponInfo* weapon) { @@ -1092,7 +1022,7 @@ public: static AnimationId GetFireAnimGround(CWeaponInfo* weapon, bool kickFloorIfNone = true) { if (weapon->IsFlagSet(WEAPONFLAG_GROUND_2ND)) - return ANIM_ATTACK_2; + return ANIM_WEAPON_CROUCHFIRE; else if (weapon->IsFlagSet(WEAPONFLAG_GROUND_3RD)) return ANIM_WEAPON_FIRE_3RD; else if (kickFloorIfNone) @@ -1105,26 +1035,26 @@ public: if (weapon->IsFlagSet(WEAPONFLAG_ANIMDETONATE)) return ANIM_STD_DETONATE; else - return ANIM_ATTACK_1; + return ANIM_WEAPON_FIRE; } static AnimationId GetCrouchReloadAnim(CWeaponInfo* weapon) { if (weapon->IsFlagSet(WEAPONFLAG_RELOAD)) - return ANIM_ATTACK_EXTRA2; + return ANIM_WEAPON_CROUCHRELOAD; else return (AnimationId)0; } static AnimationId GetCrouchFireAnim(CWeaponInfo* weapon) { if (weapon->IsFlagSet(WEAPONFLAG_CROUCHFIRE)) - return ANIM_ATTACK_2; + return ANIM_WEAPON_CROUCHFIRE; else return (AnimationId)0; } static AnimationId GetReloadAnim(CWeaponInfo* weapon) { if (weapon->IsFlagSet(WEAPONFLAG_RELOAD)) - return ANIM_ATTACK_EXTRA1; + return ANIM_WEAPON_RELOAD; else return (AnimationId)0; } diff --git a/src/peds/PedAI.cpp b/src/peds/PedAI.cpp index 06fecaf..cd8b06f 100644 --- a/src/peds/PedAI.cpp +++ b/src/peds/PedAI.cpp @@ -362,51 +362,6 @@ CPed::SetObjective(eObjective newObj, void *entity) } } -void -CPed::SetObjective(eObjective newObj, CVector dest, float safeDist) -{ - if (DyingOrDead()) - return; - - if (m_prevObjective != OBJECTIVE_NONE && m_prevObjective == newObj) - return; - - if (m_objective == newObj) { - if (newObj == OBJECTIVE_GOTO_AREA_ANY_MEANS || newObj == OBJECTIVE_GOTO_AREA_ON_FOOT || newObj == OBJECTIVE_RUN_TO_AREA || newObj == OBJECTIVE_SPRINT_TO_AREA) { - if (m_nextRoutePointPos == dest && m_distanceToCountSeekDone == safeDist) - return; - } - else if (newObj == OBJECTIVE_GUARD_SPOT) { - if (m_vecSpotToGuard == dest && m_radiusToGuard == safeDist) - return; - } - } - - ClearPointGunAt(); - SetObjectiveTimer(0); - bObjectiveCompleted = false; - if (IsTemporaryObjective(m_objective)) { - m_prevObjective = newObj; - } - else { - if (m_objective != newObj) - SetStoredObjective(); - - m_objective = newObj; - } - - if (newObj == OBJECTIVE_GUARD_SPOT) { - m_vecSpotToGuard = dest; - m_radiusToGuard = safeDist; - } - else if (newObj == OBJECTIVE_GOTO_AREA_ANY_MEANS || newObj == OBJECTIVE_GOTO_AREA_ON_FOOT || newObj == OBJECTIVE_RUN_TO_AREA || newObj == OBJECTIVE_SPRINT_TO_AREA) { - m_pNextPathNode = nil; - m_nextRoutePointPos = dest; - m_vecSeekPos = m_nextRoutePointPos; - bUsePedNodeSeek = true; - } -} - // Only used in 01E1: SET_CHAR_OBJ_FOLLOW_ROUTE opcode // IDA fails very badly in here, puts a fake loop and ignores SetFollowRoute call... void @@ -6410,7 +6365,7 @@ CPed::KillCharOnFootArmed(CVector &ourPos, CVector &targetPos, CVector &distWith } } if (m_pedInObjective->IsPlayer() && m_nPedType != PEDTYPE_COP - && CharCreatedBy != MISSION_CHAR && FindPlayerPed()->m_pWanted->m_CurrentCops != 0/* TODO: && !bAttacksPlayerWithCops*/) { + && CharCreatedBy != MISSION_CHAR && FindPlayerPed()->m_pWanted->m_CurrentCops != 0) { SetObjective(OBJECTIVE_FLEE_ON_FOOT_TILL_SAFE); return CANT_ATTACK; diff --git a/src/peds/PedFight.cpp b/src/peds/PedFight.cpp index 10a260c..79e0121 100644 --- a/src/peds/PedFight.cpp +++ b/src/peds/PedFight.cpp @@ -31,7 +31,6 @@ RpClump* flyingClumpTemp; FightMove tFightMoves[NUM_FIGHTMOVES] = { -/* { ANIM_STD_NUM, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, HITLEVEL_NULL, 0, 0 }, { ANIM_STD_PUNCH, 0.2f, 8.f/30.f, 0.0f, 0.3f, 1.0f, HITLEVEL_HIGH, 1, 0 }, { ANIM_STD_FIGHT_IDLE, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, HITLEVEL_NULL, 0, 0 }, @@ -64,7 +63,6 @@ FightMove tFightMoves[NUM_FIGHTMOVES] = { ANIM_ATTACK_2, 4.f/30.f, 7.f/30.f, 10.f/30.f, 0.4f, 1.0f, HITLEVEL_HIGH, 1, 0 }, { ANIM_ATTACK_3, 4.f / 30.f, 7.f / 30.f, 10.f / 30.f, 0.4f, 1.0f, HITLEVEL_HIGH, 1, 0 }, { ANIM_STD_FIGHT_2IDLE, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, HITLEVEL_NULL, 0, 0 } -*/ }; static PedOnGroundState @@ -184,14 +182,14 @@ CPed::SetPointGunAt(CEntity *to) if (bCrouchWhenShooting && bIsDucking && GetCrouchFireAnim(curWeapon)) { aimAssoc = RpAnimBlendClumpGetAssociation(GetClump(), GetCrouchFireAnim(curWeapon)); } else { - aimAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_ATTACK_1); + aimAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_FIRE); } if (!aimAssoc || aimAssoc->blendDelta < 0.0f) { if (bCrouchWhenShooting && bIsDucking && GetCrouchFireAnim(curWeapon)) { aimAssoc = CAnimManager::BlendAnimation(GetClump(), curWeapon->m_AnimToPlay, GetCrouchFireAnim(curWeapon), 4.0f); } else { - aimAssoc = CAnimManager::AddAnimation(GetClump(), curWeapon->m_AnimToPlay, ANIM_ATTACK_1); + aimAssoc = CAnimManager::AddAnimation(GetClump(), curWeapon->m_AnimToPlay, ANIM_WEAPON_FIRE); } aimAssoc->blendAmount = 0.0f; @@ -206,7 +204,7 @@ CPed::PointGunAt(void) { CWeaponInfo *weaponInfo = CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType); float animLoopStart = weaponInfo->m_fAnimLoopStart; - CAnimBlendAssociation *weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_ATTACK_1); + CAnimBlendAssociation *weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_FIRE); if (!weaponAssoc || weaponAssoc->blendDelta < 0.0f) { if (weaponInfo->IsFlagSet(WEAPONFLAG_CROUCHFIRE)) { weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), GetCrouchFireAnim(weaponInfo)); @@ -242,7 +240,7 @@ CPed::ClearPointGunAt(void) RestorePreviousState(); } weaponInfo = CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType); - animAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_ATTACK_1); + animAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_FIRE); if (!animAssoc || animAssoc->blendDelta < 0.0f) { if (weaponInfo->IsFlagSet(WEAPONFLAG_CROUCHFIRE)) { animAssoc = RpAnimBlendClumpGetAssociation(GetClump(), GetCrouchFireAnim(weaponInfo)); @@ -998,7 +996,7 @@ CPed::Attack(void) weaponAnimAssoc->SetFinishCallback(FinishedAttackCB, this); } else if (GetSecondFireAnim(ourWeapon)) { if (weaponAnimAssoc->animId == GetSecondFireAnim(ourWeapon)) { - weaponAnimAssoc = CAnimManager::BlendAnimation(GetClump(), ourWeapon->m_AnimToPlay, ANIM_ATTACK_1, 8.0f); + weaponAnimAssoc = CAnimManager::BlendAnimation(GetClump(), ourWeapon->m_AnimToPlay, ANIM_WEAPON_FIRE, 8.0f); } else { weaponAnimAssoc = CAnimManager::BlendAnimation(GetClump(), ourWeapon->m_AnimToPlay, GetSecondFireAnim(ourWeapon), 8.0f); } @@ -1104,7 +1102,10 @@ CPed::StartFightAttack(uint8 buttonPressure) break; } } else { - animAssoc->speed = 0.8f; + if (m_curFightMove == FIGHTMOVE_BACKKICK) + animAssoc->speed = 1.15f; + else + animAssoc->speed = 0.8f; } if (IsPlayer()) animAssoc->SetCurrentTime(0.08f); @@ -1212,14 +1213,12 @@ CPed::StartFightDefend(uint8 direction, uint8 hitLevel, uint8 unk) default: if (hitLevel == HITLEVEL_LOW) { hitAnim = ANIM_STD_KO_SHOT_STOMACH; -/* LCS: removed } else if (CGeneral::GetRandomNumber() & 1) { fall = false; hitAnim = ANIM_STD_HIT_WALK; } else if (CGeneral::GetRandomNumber() & 1) { fall = false; hitAnim = ANIM_STD_HIT_HEAD; -*/ } else { hitAnim = ANIM_STD_KO_SHOT_FACE; } @@ -1254,7 +1253,7 @@ CPed::StartFightDefend(uint8 direction, uint8 hitLevel, uint8 unk) Say(SOUND_PED_DEFEND); return; } - m_curFightMove = FIGHTMOVE_HITFRONT; // LCS + m_curFightMove = FIGHTMOVE_HITBODY; break; case HITLEVEL_HIGH: switch (direction) { @@ -1268,12 +1267,10 @@ CPed::StartFightDefend(uint8 direction, uint8 hitLevel, uint8 unk) m_curFightMove = FIGHTMOVE_HITRIGHT; break; default: - // LCS: removed - //if (unk <= 5) - // m_curFightMove = FIGHTMOVE_HITHEAD; - //else - // m_curFightMove = FIGHTMOVE_HITBIGSTEP; - m_curFightMove = FIGHTMOVE_HITFRONT; + if (unk <= 5) + m_curFightMove = FIGHTMOVE_HITHEAD; + else + m_curFightMove = FIGHTMOVE_HITBIGSTEP; break; } break; @@ -1289,12 +1286,10 @@ CPed::StartFightDefend(uint8 direction, uint8 hitLevel, uint8 unk) m_curFightMove = FIGHTMOVE_HITRIGHT; break; default: - // LCS: removed - //if (unk <= 5) - // m_curFightMove = FIGHTMOVE_HITCHEST; - //else - // m_curFightMove = FIGHTMOVE_HITBIGSTEP; - m_curFightMove = FIGHTMOVE_HITFRONT; + if (unk <= 5) + m_curFightMove = FIGHTMOVE_HITCHEST; + else + m_curFightMove = FIGHTMOVE_HITBIGSTEP; break; } break; @@ -1447,30 +1442,30 @@ CPed::Fight(void) CVector touchingNodePos(0.0f, 0.0f, 0.0f); switch (m_curFightMove) { - // case FIGHTMOVE_KNEE: - // TransformToNode(touchingNodePos, PED_LOWERLEGR); - // break; - // case FIGHTMOVE_PUNCHHOOK: - // case FIGHTMOVE_PUNCHJAB: - // TransformToNode(touchingNodePos, PED_HANDL); - // break; + case FIGHTMOVE_KNEE: + TransformToNode(touchingNodePos, PED_LOWERLEGR); + break; + case FIGHTMOVE_PUNCHHOOK: + case FIGHTMOVE_PUNCHJAB: + TransformToNode(touchingNodePos, PED_HANDL); + break; case FIGHTMOVE_LONGKICK: case FIGHTMOVE_ROUNDHOUSE: - // case FIGHTMOVE_FWDLEFT: - // case FIGHTMOVE_BACKRIGHT: + case FIGHTMOVE_FWDLEFT: + case FIGHTMOVE_BACKRIGHT: case FIGHTMOVE_GROUNDKICK: TransformToNode(touchingNodePos, PED_FOOTR); break; case FIGHTMOVE_FWDRIGHT: TransformToNode(touchingNodePos, PED_HEAD); break; - // case FIGHTMOVE_BACKKICK: - // case FIGHTMOVE_BACKFLIP: - // TransformToNode(touchingNodePos, PED_FOOTL); - // break; - // case FIGHTMOVE_BACKLEFT: - // TransformToNode(touchingNodePos, PED_UPPERARML); - // break; + case FIGHTMOVE_BACKKICK: + case FIGHTMOVE_BACKFLIP: + TransformToNode(touchingNodePos, PED_FOOTL); + break; + case FIGHTMOVE_BACKLEFT: + TransformToNode(touchingNodePos, PED_UPPERARML); + break; default: TransformToNode(touchingNodePos, PED_HANDR); break; @@ -1522,7 +1517,10 @@ CPed::Fight(void) tFightMoves[m_curFightMove].animId, 8.0f); if (weaponInfo->m_AnimToPlay != ASSOCGRP_KNIFE || m_curFightMove < FIGHTMOVE_MELEE1) { - animAssoc->speed = 0.8f; + if (m_curFightMove == FIGHTMOVE_BACKKICK) + animAssoc->speed = 1.15f; + else + animAssoc->speed = 0.8f; } else { switch (GetWeapon()->m_eWeaponType) { case WEAPONTYPE_SCREWDRIVER: @@ -1662,9 +1660,8 @@ CPed::ChooseAttackAI(uint8 buttonPressure, bool fightWithWeapon) return FIGHTMOVE_IDLE; } } - // LCS: removed - //if (dist < 0.95f && canKneeHead) - // return FIGHTMOVE_KNEE; + if (dist < 0.95f && canKneeHead) + return FIGHTMOVE_KNEE; if (dist < 1.4f) return FIGHTMOVE_PUNCH; if (dist < 2.f && canKick) { @@ -1782,11 +1779,9 @@ CPed::ChooseAttackPlayer(uint8 buttonPressure, bool fightWithWeapon) switch (dir) { case 0: // forward if (fightWithWeapon) { - // LCS: removed - //if (distToVictim < 0.95f - 0.2f && m_nPedState == PED_FIGHT) { - // choosenMove = FIGHTMOVE_KNEE; - //} else - { + if (distToVictim < 0.95f - 0.2f && m_nPedState == PED_FIGHT) { + choosenMove = FIGHTMOVE_KNEE; + } else { if (GetWeapon()->m_eWeaponType == WEAPONTYPE_CLEAVER) { if (distToVictim < 0.85f * weaponInfo->m_fRange) choosenMove = FIGHTMOVE_MELEE1; @@ -1809,20 +1804,18 @@ CPed::ChooseAttackPlayer(uint8 buttonPressure, bool fightWithWeapon) } } } - // LCS: removed - //} else if (distToVictim < 0.95f && m_nPedState == PED_FIGHT) { - // choosenMove = FIGHTMOVE_KNEE; + } else if (distToVictim < 0.95f && m_nPedState == PED_FIGHT) { + choosenMove = FIGHTMOVE_KNEE; } else if (distToVictim < 1.4f) { - // LCS: removed - /*if (m_curFightMove == FIGHTMOVE_PUNCHJAB) { + if (m_curFightMove == FIGHTMOVE_PUNCHJAB) { choosenMove = FIGHTMOVE_PUNCH; - } else*/ if (m_curFightMove != FIGHTMOVE_PUNCH || randVal != 1) { - //if (randVal == 2) + } else if (m_curFightMove != FIGHTMOVE_PUNCH || randVal != 1) { + if (randVal == 2) choosenMove = FIGHTMOVE_PUNCH; - //else - // choosenMove = FIGHTMOVE_PUNCHJAB; + else + choosenMove = FIGHTMOVE_PUNCHJAB; } else { choosenMove = FIGHTMOVE_LONGKICK; } @@ -1830,7 +1823,6 @@ CPed::ChooseAttackPlayer(uint8 buttonPressure, bool fightWithWeapon) choosenMove = FIGHTMOVE_LONGKICK; } break; -/* LCS: removed case 1: choosenMove = FIGHTMOVE_FWDLEFT; break; @@ -1843,7 +1835,6 @@ CPed::ChooseAttackPlayer(uint8 buttonPressure, bool fightWithWeapon) case 4: choosenMove = FIGHTMOVE_BACKRIGHT; break; -*/ default: choosenMove = FIGHTMOVE_FWDRIGHT; break; @@ -1909,22 +1900,20 @@ CPed::ChooseAttackPlayer(uint8 buttonPressure, bool fightWithWeapon) #else switch (CGeneral::GetRandomNumberInRange(0,3)) { #endif - // LCS: hack hack - // case 0: - // choosenMove = FIGHTMOVE_PUNCHJAB; - // break; - default: + case 0: + choosenMove = FIGHTMOVE_PUNCHJAB; + break; case 1: choosenMove = FIGHTMOVE_PUNCH; break; case 2: choosenMove = FIGHTMOVE_LONGKICK; break; - // case 3: - // choosenMove = FIGHTMOVE_KNEE; - // break; - // default: - // break; + case 3: + choosenMove = FIGHTMOVE_KNEE; + break; + default: + break; } } return choosenMove; @@ -1967,7 +1956,6 @@ CPed::EndFight(uint8 endType) void CPed::PlayHitSound(CPed *hitTo) { -#if 0 // LCS: temporarily removed // That was very complicated to reverse for me... // First index is our fight move ID (from 1 to 17, total 17), second is the one of we fight with (from 18 to 27, total 10). enum { @@ -2038,7 +2026,6 @@ CPed::PlayHitSound(CPed *hitTo) if (soundId != NO_SND) DMAudio.PlayOneShot(m_audioEntityId, soundId, (weapon << 8) | ENTITY_TYPE_PED); -#endif } bool @@ -2170,9 +2157,8 @@ CPed::FightHitPed(CPed *victim, CVector &touchPoint, CVector &dir, int16 piece) bool brassKnucklePunch = false; if (GetWeapon()->m_eWeaponType == WEAPONTYPE_BRASSKNUCKLE) { - // LCS: removed - if (/*m_curFightMove == FIGHTMOVE_PUNCHHOOK || m_curFightMove == FIGHTMOVE_PUNCHJAB || m_curFightMove == FIGHTMOVE_BACKLEFT || - m_curFightMove == FIGHTMOVE_STDPUNCH ||*/ m_curFightMove == FIGHTMOVE_PUNCH) { + if (m_curFightMove == FIGHTMOVE_PUNCHHOOK || m_curFightMove == FIGHTMOVE_PUNCHJAB || m_curFightMove == FIGHTMOVE_BACKLEFT || + m_curFightMove == FIGHTMOVE_STDPUNCH || m_curFightMove == FIGHTMOVE_PUNCH) { brassKnucklePunch = true; damageMult *= 1.5f; } @@ -4160,7 +4146,7 @@ CPed::RemoveWeaponAnims(int unused, float animDelta) CAnimBlendAssociation *weaponAssoc; //CWeaponInfo::GetWeaponInfo(unused); - weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_ATTACK_1); + weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_FIRE); if (weaponAssoc) { weaponAssoc->blendDelta = animDelta; weaponAssoc->flags |= ASSOC_DELETEFADEDOUT; @@ -4175,7 +4161,7 @@ CPed::RemoveWeaponAnims(int unused, float animDelta) weaponAssoc->blendDelta = animDelta; weaponAssoc->flags |= ASSOC_DELETEFADEDOUT; } - weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_ATTACK_EXTRA1); + weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_RELOAD); if (weaponAssoc) { weaponAssoc->blendDelta = animDelta; weaponAssoc->flags |= ASSOC_DELETEFADEDOUT; diff --git a/src/peds/PedType.h b/src/peds/PedType.h index 776dd14..a4698bb 100644 --- a/src/peds/PedType.h +++ b/src/peds/PedType.h @@ -95,9 +95,6 @@ VALIDATE_SIZE(CPedType, 0x20); enum ePedStats { - PEDSTAT_COWARD, - PEDSTAT_SHOPPER, - PEDSTAT_OLDSHOPPER, PEDSTAT_PLAYER, PEDSTAT_COP, PEDSTAT_MEDIC, @@ -109,8 +106,6 @@ enum ePedStats PEDSTAT_GANG5, PEDSTAT_GANG6, PEDSTAT_GANG7, - PEDSTAT_GANG8, - PEDSTAT_GANG9, PEDSTAT_STREET_GUY, PEDSTAT_SUIT_GUY, PEDSTAT_SENSIBLE_GUY, @@ -133,10 +128,13 @@ enum ePedStats PEDSTAT_PSYCHO, PEDSTAT_STEWARD, PEDSTAT_SPORTSFAN, + PEDSTAT_SHOPPER, + PEDSTAT_OLDSHOPPER, PEDSTAT_BEACH_GUY, PEDSTAT_BEACH_GIRL, PEDSTAT_SKATER, PEDSTAT_STD_MISSION, + PEDSTAT_COWARD, NUM_PEDSTATS }; diff --git a/src/peds/PlayerPed.cpp b/src/peds/PlayerPed.cpp index 78d45f9..9c668cf 100644 --- a/src/peds/PlayerPed.cpp +++ b/src/peds/PlayerPed.cpp @@ -1138,8 +1138,7 @@ void CPlayerPed::ProcessAnimGroups(void) { AssocGroupId groupToSet; -//#ifdef PC_PLAYER_CONTROLS -#if 0 // chainsaw anims missing in LCS +#ifdef PC_PLAYER_CONTROLS if ((m_fWalkAngle <= -DEGTORAD(50.0f) || m_fWalkAngle >= DEGTORAD(50.0f)) && TheCamera.Cams[TheCamera.ActiveCam].Using3rdPersonMouseCam() && CanStrafeOrMouseControl()) { diff --git a/src/peds/Population.cpp b/src/peds/Population.cpp index 0119b47..5603e2c 100644 --- a/src/peds/Population.cpp +++ b/src/peds/Population.cpp @@ -1205,11 +1205,10 @@ CPopulation::IsSkateable(CVector const& pos) return foundCol.surfaceB == SURFACE_TARMAC || foundCol.surfaceB == SURFACE_PAVEMENT; } -//--LCS: done bool CPopulation::CanJeerAtStripper(int32 model) { - return false; + return model == MI_WMOBE || model == MI_WMYBE || model == MI_WMOST || model == MI_BMYBB; } void @@ -1241,38 +1240,46 @@ bool CPopulation::IsMale(int32 model) { switch (model) { - // TODO(LCS): do this right - case MI_TAXI_D: - case MI_PIMP: - case MI_CRIMINAL01: - case MI_CRIMINAL02: - case MI_MALE02: - case MI_MALE03: - case MI_P_MAN1: - case MI_P_MAN2: - case MI_CT_MAN1: - case MI_CT_MAN2: - case MI_LI_MAN1: - case MI_LI_MAN2: - case MI_DOCKER1: - case MI_DOCKER2: - case MI_SCUM_MAN: - case MI_WORKER1: - case MI_WORKER2: - case MI_B_MAN1: - case MI_B_MAN2: - case MI_B_MAN3: - case MI_MOD_MAN: - case MI_ST_MAN: - case MI_FAN_MAN1: - case MI_FAN_MAN2: - case MI_HOS_MAN: - case MI_CONST1: - case MI_CONST2: - case MI_STUD_MAN: - case MI_CAS_MAN: - case MI_CAMP_MAN: - case MI_HITMAN: + case MI_HMYST: + case MI_HMOST: + case MI_HMYRI: + case MI_HMORI: + case MI_HMYBE: + case MI_HMOBE: + case MI_HMOTR: + case MI_HMYAP: + case MI_HMOCA: + case MI_BMODK: + case MI_BMYKR: + case MI_BMYST: + case MI_BMOST: + case MI_BMYRI: + case MI_BMYBE: + case MI_BMOBE: + case MI_BMYBU: + case MI_BMOTR: + case MI_BMYPI: + case MI_BMYBB: + case MI_WMYCR: + case MI_WMYST: + case MI_WMOST: + case MI_WMYRI: + case MI_WMORI: + case MI_WMYBE: + case MI_WMOBE: + case MI_WMYCW: + case MI_WMYGO: + case MI_WMOGO: + case MI_WMYLG: + case MI_WMYBU: + case MI_WMOBU: + case MI_WMOTR: + case MI_WMYPI: + case MI_WMOCA: + case MI_WMYJG: + case MI_WMYSK: + + // BUG? Why no JMOTO? return true; default: return false; @@ -1283,34 +1290,41 @@ bool CPopulation::IsFemale(int32 model) { switch (model) { - // TODO(LCS): do this right - case MI_FEMALE01: - case MI_FEMALE02: - case MI_FEMALE03: - case MI_FATFEMALE01: - case MI_FATFEMALE02: - case MI_PROSTITUTE: - case MI_PROSTITUTE2: - case MI_P_WOM1: - case MI_P_WOM2: - case MI_CT_WOM1: - case MI_CT_WOM2: - case MI_LI_WOM1: - case MI_LI_WOM2: - case MI_SCUM_WOM: - case MI_B_WOM1: - case MI_B_WOM2: - case MI_B_WOM3: - case MI_MOD_WOM: - case MI_ST_WOM: - case MI_FAN_WOM: - case MI_HOS_WOM: - case MI_SHOPPER1: - case MI_SHOPPER2: - case MI_SHOPPER3: - case MI_STUD_WOM: - case MI_CAS_WOM: - case MI_CAMP_WOM: + case MI_HFYST: + case MI_HFOST: + case MI_HFYRI: + case MI_HFORI: + case MI_HFYBE: + case MI_HFOBE: + case MI_HFYBU: + case MI_HFYMD: + case MI_HFYCG: + case MI_HFYPR: + case MI_HFOTR: + case MI_BFYST: + case MI_BFOST: + case MI_BFYRI: + case MI_BFORI: + case MI_BFYBE: + case MI_BFOBE: + case MI_BFYPR: + case MI_BFOTR: + case MI_WFYST: + case MI_WFOST: + case MI_WFYRI: + case MI_WFORI: + case MI_WFYBE: + case MI_WFOBE: + case MI_WFOGO: + case MI_WFYLG: + case MI_WFYBU: + case MI_WFYPR: + case MI_WFOTR: + case MI_WFYJG: + case MI_WFYSK: + case MI_WFYSH: + case MI_WFOSH: + case MI_JFOTO: return true; default: return false; @@ -1320,7 +1334,23 @@ CPopulation::IsFemale(int32 model) bool CPopulation::IsSunbather(int32 model) { - return false; + switch (model) { + case MI_HFYBE: + case MI_HFOBE: + case MI_HMYBE: + case MI_HMOBE: + case MI_BFYBE: + case MI_BMYBE: + case MI_BFOBE: + case MI_BMOBE: + case MI_WFYBE: + case MI_WMYBE: + case MI_WFOBE: + case MI_WMOBE: + return true; + default: + return false; + } } int32 @@ -1332,13 +1362,13 @@ CPopulation::ComputeRandomisedGangSize(void) bool CPopulation::CanSolicitPlayerInCar(int32 model) { - return model == MI_PROSTITUTE || model == MI_PROSTITUTE2; + return model == MI_HFYPR || model == MI_BFYPR || model == MI_WFYPR; } bool CPopulation::CanSolicitPlayerOnFoot(int32 model) { - return model == MI_B_WOM3 || model == MI_FEMALE01 || model == MI_FEMALE02 || model == MI_FEMALE03; + return model == MI_HFYMD || model == MI_HFYCG || model == MI_BFOTR || model == MI_BMOTR || model == MI_WFOTR || model == MI_WMOTR; } bool diff --git a/src/render/Antennas.cpp b/src/render/Antennas.cpp index 452069a..5e30aca 100644 --- a/src/render/Antennas.cpp +++ b/src/render/Antennas.cpp @@ -1,5 +1,6 @@ #include "common.h" +#include "main.h" #include "Antennas.h" CAntenna CAntennas::aAntennas[NUMANTENNAS]; @@ -70,6 +71,7 @@ CAntennas::Render(void) { int i, j; + PUSH_RENDERGROUP("CAntennas::Render"); for(i = 0; i < NUMANTENNAS; i++){ if(!aAntennas[i].active) continue; @@ -101,6 +103,8 @@ CAntennas::Render(void) } RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); + + POP_RENDERGROUP(); } void diff --git a/src/render/Clouds.cpp b/src/render/Clouds.cpp index e3a8c86..9cd32c5 100644 --- a/src/render/Clouds.cpp +++ b/src/render/Clouds.cpp @@ -1,5 +1,6 @@ #include "common.h" +#include "main.h" #include "Sprite.h" #include "Sprite2d.h" #include "General.h" @@ -119,6 +120,8 @@ CClouds::Render(void) if(!CGame::CanSeeOutSideFromCurrArea()) return; + PUSH_RENDERGROUP("CClouds::Render"); + CCoronas::SunBlockedByClouds = false; RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); @@ -301,6 +304,8 @@ CClouds::Render(void) RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + + POP_RENDERGROUP(); } bool @@ -313,6 +318,8 @@ void CClouds::RenderBackground(int16 topred, int16 topgreen, int16 topblue, int16 botred, int16 botgreen, int16 botblue, int16 alpha) { + PUSH_RENDERGROUP("CClouds::RenderBackground"); + CVector right = CrossProduct(TheCamera.GetUp(), TheCamera.GetForward()); right.Normalise(); float c = right.Magnitude2D(); @@ -415,6 +422,8 @@ CClouds::RenderBackground(int16 topred, int16 topgreen, int16 topblue, ms_colourBottom.g = fogg; ms_colourBottom.b = fogb; } + + POP_RENDERGROUP(); } void @@ -423,6 +432,8 @@ CClouds::RenderHorizon(void) if(UseDarkBackground()) return; + PUSH_RENDERGROUP("CClouds::RenderHorizon"); + ms_colourBottom.a = 230; ms_colourTop.a = 80; @@ -457,4 +468,6 @@ CClouds::RenderHorizon(void) CSprite2d::DrawAnyRect(0.0f, topleft, SCREEN_WIDTH, topright, 0.0f, botleft, SCREEN_WIDTH, botright, ms_colourBkGrd, ms_colourBkGrd, ms_colourBkGrd, ms_colourBkGrd); + + POP_RENDERGROUP(); } diff --git a/src/render/Coronas.cpp b/src/render/Coronas.cpp index e3d3416..8b137aa 100644 --- a/src/render/Coronas.cpp +++ b/src/render/Coronas.cpp @@ -249,6 +249,8 @@ CCoronas::Render(void) int i, j; int screenw, screenh; + PUSH_RENDERGROUP("CCoronas::Render"); + screenw = RwRasterGetWidth(RwCameraGetRaster(Scene.camera)); screenh = RwRasterGetHeight(RwCameraGetRaster(Scene.camera)); @@ -432,6 +434,8 @@ CCoronas::Render(void) RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); + + POP_RENDERGROUP(); } void @@ -442,6 +446,8 @@ CCoronas::RenderReflections(void) CEntity *entity; if(CWeather::WetRoads > 0.0f){ + PUSH_RENDERGROUP("CCoronas::RenderReflections"); + CSprite::InitSpriteBuffer(); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); @@ -517,6 +523,8 @@ CCoronas::RenderReflections(void) RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE); + + POP_RENDERGROUP(); }else{ for(i = 0; i < NUMCORONAS; i++) aCoronas[i].renderReflection = false; diff --git a/src/render/Fluff.cpp b/src/render/Fluff.cpp index e28ebc8..e92eee2 100644 --- a/src/render/Fluff.cpp +++ b/src/render/Fluff.cpp @@ -417,9 +417,8 @@ void CMovingThings::Init() } } -// LCS: removed -// CEscalators::Init(); -// aScrollBars[0].Init(CVector(-1069.209f, 1320.126f, 18.848f), CVector(-1069.209f, 1342.299f, 22.612f), SCROLL_ARENA_STRING, 128, 255, 0, 0.3f); + CEscalators::Init(); + aScrollBars[0].Init(CVector(-1069.209f, 1320.126f, 18.848f), CVector(-1069.209f, 1342.299f, 22.612f), SCROLL_ARENA_STRING, 128, 255, 0, 0.3f); } void CMovingThings::Shutdown() @@ -460,6 +459,7 @@ void CMovingThings::Update() void CMovingThings::Render() { + PUSH_RENDERGROUP("CMovingThings::Render"); CSmokeTrails::Update(); int i; @@ -472,6 +472,7 @@ void CMovingThings::Render() CPlaneTrails::Render(); CSmokeTrails::Render(); CPlaneBanners::Render(); + POP_RENDERGROUP(); } void CMovingThings::RegisterOne(CEntity *pEnt, uint16 nType) { diff --git a/src/render/Font.cpp b/src/render/Font.cpp index b38b0ef..9c49924 100644 --- a/src/render/Font.cpp +++ b/src/render/Font.cpp @@ -1,6 +1,5 @@ #include "common.h" -#include "main.h" #include "Sprite2d.h" #include "TxdStore.h" #include "Font.h" @@ -8,9 +7,6 @@ #include "FileMgr.h" #endif #include "Timer.h" -#include "Frontend.h" - -//--LCS: todo scaling (needs CSprite2d reversed), SuspendHandler, ReplaceGermanSZ, volatile mem, other todos void AsciiToUnicode(const char *src, wchar *dst) @@ -53,48 +49,225 @@ UnicodeMakeUpperCase(wchar *dst, const wchar *src) //idk what to do with it, see } CFontDetails CFont::Details; -bool16 CFont::NewLine; +int16 CFont::NewLine; CSprite2d CFont::Sprite[MAX_FONTS]; CFontRenderState CFont::RenderState; -int16 CFont::Size[MAX_FONTS][419] = { - {15, 6, 8, 24, 22, 28, 28, 2, 8, 8, 12, 24, 8, 10, 8, 12, 24, 8, 22, 20, 24, 22, 22, 22, 24, 22, 8, 8, 22, 22, 24, 16, 28, 26, 20, 22, 22, 18, 18, - 24, 22, 4, 16, 20, 18, 26, 20, 24, 20, 24, 22, 24, 20, 20, 26, 32, 26, 26, 20, 10, 12, 8, 22, 18, 6, 26, 20, 22, 22, 18, 18, 24, 22, 4, 16, 20, 18, 26, - 20, 24, 20, 24, 22, 24, 20, 20, 26, 32, 26, 26, 20, 10, 12, 8, 22, 18, 26, 26, 26, 26, 26, 26, 26, 22, 18, 18, 18, 18, 8, 8, 10, 10, 26, 20, 24, 24, 24, - 24, 24, 22, 24, 20, 20, 20, 20, 26, 22, 20, 26, 26, 26, 26, 26, 26, 26, 22, 18, 18, 18, 18, 8, 8, 10, 10, 26, 20, 24, 24, 24, 24, 24, 22, 24, 20, 20, 20, - 20, 26, 22, 24, 24, 8, 16, 10, 8, 28, 8, 8, 18, 16, 10, 28, 8, 28, 24, 6, 16, 22, 18, 24, 4, 14, 10, 26, 14, 16, 26, 12, 2, 16, 16, 32, 19, 19, 19, - 19, 19, 19, 19, 19, 24, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, -2, 0, -2, -2, 0, 0, 0, 0, -2, -2, -2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, -2, 0, -2, -2, 0, 0, 0, 0, -2, -2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28}, - {10, 12, 20, 24, 28, 30, 28, 12, 14, 14, 20, 24, 12, 16, 10, 28, 26, 20, 24, 24, 26, 24, 24, 24, 24, 24, 12, 12, 22, 22, 24, 24, 32, 28, 24, 26, 26, 24, 22, - 28, 26, 10, 22, 26, 22, 30, 28, 28, 26, 30, 26, 26, 28, 26, 26, 32, 26, 26, 26, 14, 18, 14, 22, 22, 14, 22, 22, 22, 22, 22, 18, 22, 22, 10, 12, 20, 10, 28, - 20, 22, 22, 22, 20, 22, 20, 20, 20, 30, 20, 22, 20, 16, 10, 16, 20, 0, 28, 28, 28, 28, 28, 28, 32, 26, 24, 24, 24, 24, 14, 14, 18, 16, 30, 28, 28, 28, 28, - 28, 28, 20, 30, 26, 26, 26, 26, 28, 26, 22, 22, 22, 22, 22, 22, 22, 32, 22, 22, 22, 22, 22, 14, 14, 18, 16, 22, 20, 22, 22, 22, 22, 22, 22, 24, 20, 20, 20, - 20, 22, 22, 22, 26, 12, 18, 18, 12, 32, 12, 12, 18, 18, 18, 32, 12, 32, 28, 10, 22, 28, 24, 28, 10, 26, 16, 30, 16, 20, 30, 18, 14, 18, 24, 32, 30, 30, 30, - 30, 24, 28, 24, 20, 24, 20, 20, 22, 20, 20, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, -2, -2, 0, 0, 2, 0, 0, 0, 0, -2, -2, 0, 0, 0, -2, -2, -2, 0, -2, 0, -2, 0, 0, 0, 0, 0, 0, - 0, 0, -2, -2, 0, 0, -2, 0, -2, 1, 0, -2, -1, 0, 0, 0, -2, 0, 0, 0, -2, 0, 0, -2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -2, -2, -2, -2, 0, 0, -2, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28}, - {15, 8, 0, 0, 18, 0, 22, 8, 13, 13, 0, 0, 7, 0, 8, 22, 18, 17, 18, 18, 20, 18, 18, 18, 18, 18, 8, 18, 18, 18, 18, 18, 15, 18, 18, 8, 18, 18, 13, - 28, 18, 18, 18, 18, 18, 18, 20, 18, 19, 30, 18, 18, 18, 18, 18, 18, 0, 18, 0, 28, 18, 18, 18, 18, 0, 8, 8, 8, 8, 0, 18, 18, 18, 18, 0, 18, 0, 0, - 18, 18, 18, 18, 0, 0, 20, 30, 18, 8, 9, 9, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22} +#ifdef MORE_LANGUAGES +uint8 CFont::LanguageSet = FONT_LANGSET_EFIGS; +int32 CFont::Slot = -1; +#define JAP_TERMINATION (0x8000 | '~') + +int16 CFont::Size[LANGSET_MAX][MAX_FONTS][210] = { + { +#else +int16 CFont::Size[MAX_FONTS][210] = { +#endif + { + //FONT2 EFIGS + //SPC,!, $, %, &, ', [, ], +, , -, ., + 12, 9, 22, 17, 19, 19, 25, 4, 33, 33, 25, 35, 11, 10, 6, 33, + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, ??, + 18, 10, 17, 17, 17, 17, 17, 15, 12, 16, 5, 30, 30, 30, 30, 30, + // A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, + 12, 16, 19, 16, 19, 18, 18, 17, 22, 11, 17, 18, 18, 30, 22, 19, + //P, Q, R, S, T, U, V, W, X, Y, Z, ??, ??, ??, ¡, \, + #ifdef FIX_BUGS + 22, 19, 19, 20, 18, 19, 19, 29, 19, 18, 19, 19, 33, 33, 10, 19, + #else + 22, 19, 19, 20, 18, 19, 19, 29, 19, 18, 19, 19, 33, 33, 19, 19, + #endif + //??,a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, + 12, 14, 11, 11, 16, 11, 12, 14, 14, 10, 13, 12, 10, 19, 18, 12, + //p, q, r, s, t, u, v, w, x, y, z, ??, ??, ??, ??, ??, + 16, 13, 13, 11, 12, 15, 12, 15, 13, 12, 12, 37, 33, 37, 35, 37, + //À, Á, Â, Ä, Æ, Ç, È, É, Ê, Ë, Ì, Í, Î, Ï, Ò, Ó, + 16, 16, 16, 16, 33, 17, 18, 18, 18, 18, 11, 11, 11, 11, 19, 19, + //Ô, Ö, Ù, Ú, Û, Ü, ß, à, á, â, ä, æ, ç, è, é, ê, + 19, 19, 19, 19, 19, 19, 15, 14, 14, 14, 14, 20, 14, 11, 11, 11, + //ë, ì, í, î, ï, ò, ó, ô, ö, ù, ú, û, ü, Ñ, ñ, ¿, + #ifdef FIX_BUGS + 11, 10, 10, 10, 10, 12, 12, 12, 12, 15, 15, 15, 15, 22, 18, 21, + #else + 11, 10, 10, 10, 10, 12, 12, 12, 12, 15, 15, 15, 15, 24, 18, 21, + #endif + //i,BLANKS + 10, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + //space, unprop + 19, 16 + }, + { + //FONT1 EFIGS + //Characters with a '2' refer to the Pricedown font. + //Characters that are referred as '*I' are characters that contain icons for PS2/XBOX, but contain regular characters on PC + //in order to display them properly in the Keyboard controls menu. + //!2,!, *I,(R), $, %, &, ', [, ], *I, +, , -, ., *I, + 15, 7, 31, 25, 20, 23, 21, 7, 11, 10, 26, 14, 6, 12, 6, 26, + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, *I, *I, *I, *I, ?, + 20, 7, 20, 20, 21, 20, 20, 19, 21, 20, 8, 30, 24, 30, 24, 19, + //TM,A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, + 20, 22, 22, 21, 22, 18, 18, 22, 22, 9, 14, 21, 18, 27, 21, 24, + //P, Q, R, S, T, U, V, W, X, Y, Z, *I, \, *I, ¡, °, + #ifdef FIX_BUGS + 22, 22, 23, 20, 19, 23, 22, 31, 23, 23, 21, 25, 13, 30, 7, 19, + #else + 22, 22, 23, 20, 19, 23, 22, 31, 23, 23, 21, 25, 13, 30, 10, 19, + #endif + //(C),a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, + 10, 17, 17, 16, 17, 17, 11, 17, 17, 7, 7, 18, 7, 25, 17, 17, + //p, q, r, s, t, u, v, w, x, y, z, *I, *I, $2, (2, )2, + 17, 17, 11, 17, 11, 17, 18, 25, 19, 18, 17, 28, 26, 20, 15, 15, + //À, Á, Â, Ä, Æ, Ç, È, É, Ê, Ë, Ì, Í, Î, Ï, Ò, Ó, + 20, 20, 20, 20, 29, 22, 19, 19, 19, 19, 9, 9, 9, 9, 23, 23, + //Ô, Ö, Ù, Ú, Û, Ü, ß, à, á, â, ä, æ, ç, è, é, ê, + 23, 23, 24, 24, 24, 24, 20, 19, 17, 17, 17, 30, 16, 17, 17, 17, + //ë, ì, í, î, ï, ò, ó, ô, ö, ù, ú, û, ü, Ñ, ñ, ¿, + #ifdef FIX_BUGS + 17, 11, 11, 15, 12, 17, 17, 17, 17, 17, 17, 17, 17, 21, 17, 19, + #else + 17, 11, 11, 15, 12, 17, 17, 17, 17, 17, 17, 17, 17, 19, 20, 20, + #endif + //02,12,22, 32, 42, 52, 62, 72, 82, 92, :2, A2, B2, C2, D2, E2, + 20, 18, 19, 19, 21, 19, 19, 19, 19, 19, 16, 19, 19, 19, 20, 19, + //F2,G2,H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, + 16, 19, 19, 9, 19, 20, 14, 29, 19, 19, 19, 19, 19, 19, 21, 19, + //V2,W2,X2, Y2, Z2, À2, Á2, Â2, Ä2, Æ2, Ç2, È2, É2, Ê2, Ë2, Ì2, + 20, 32, 20, 19, 19, 19, 19, 19, 19, 29, 19, 19, 19, 19, 19, 9, + //Í2,Î2,Ï2, Ò2, Ó2, Ô2, Ö2, Ù2, Ú2, Û2, Ü2, ß2, Ñ2, ¿2, '2, .2, + #ifdef FIX_BUGS + 9, 9, 9, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 10, 9, + #else + 9, 9, 9, 19, 19, 19, 19, 19, 19, 19, 19, 19, 21, 21, 10, 9, + #endif + //space, unprop + 10, 20 + } + +#ifdef MORE_LANGUAGES + }, + { + { + 5, 9, 9, 0, 17, 17, 23, 3, 21, 18, 0, 8, 3, 8, 3, 0, + 16, 9, 16, 16, 15, 19, 15, 14, 17, 17, 4, 4, 0, 0, 0, 17, + 19, 17, 19, 15, 21, 18, 19, 16, 21, 13, 15, 21, 20, 28, 21, 18, + 22, 17, 21, 20, 18, 18, 20, 26, 22, 18, 18, 0, 8, 0, 9, 8, + 0, 14, 11, 12, 16, 11, 13, 13, 15, 10, 14, 15, 11, 21, 17, 10, + 20, 15, 12, 12, 16, 17, 13, 16, 13, 21, 11, 0, 0, 0, 0, 0, + 20, 19, 19, 22, 27, 15, 18, 18, 20, 26, 21, 23, 17, 22, 21, 17, + 26, 25, 26, 17, 20, 26, 17, 16, 11, 12, 13, 21, 11, 17, 17, 12, + 21, 17, 17, 15, 24, 16, 10, 20, 23, 16, 7, 9, 16, 23, 12, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 19, 16 + }, + { + 11, 5, 10, 15, 19, 22, 20, 5, 9, 8, 11, 12, 5, 12, 6, 12, + 19, 5, 18, 19, 20, 18, 19, 18, 20, 19, 5, 6, 26, 12, 30, 19, + 23, 21, 20, 20, 20, 16, 16, 21, 19, 5, 13, 19, 16, 24, 20, 21, + 20, 21, 20, 19, 17, 20, 21, 30, 22, 21, 20, 25, 13, 30, 5, 9, + 10, 15, 15, 14, 15, 16, 10, 15, 15, 5, 5, 15, 5, 23, 15, 16, + 15, 15, 9, 16, 10, 15, 17, 24, 18, 15, 15, 27, 5, 19, 2, 2, + 20, 20, 16, 23, 30, 19, 20, 20, 21, 24, 19, 19, 20, 23, 22, 19, + 27, 29, 25, 20, 20, 28, 24, 16, 16, 14, 19, 25, 16, 16, 16, 17, + 19, 16, 16, 17, 25, 19, 15, 23, 26, 21, 16, 14, 22, 20, 16, 19, + 15, 14, 15, 16, 17, 15, 15, 15, 15, 15, 7, 15, 15, 15, 15, 15, + 13, 15, 15, 7, 15, 16, 13, 23, 15, 15, 15, 15, 15, 15, 17, 15, + 16, 24, 17, 17, 17, 15, 15, 13, 20, 23, 15, 17, 17, 16, 24, 15, + 15, 15, 23, 18, 15, 23, 26, 23, 16, 15, 23, 15, 15, 19, 2, 2, + 10, 20 + }, + }, + { + { + //FONT2 EFIGS + //SPC,!, $, %, &, ', [, ], +, , -, ., + 12, 9, 22, 17, 19, 19, 25, 4, 33, 33, 25, 35, 11, 10, 6, 33, + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, ??, + 18, 10, 17, 17, 17, 17, 17, 15, 12, 16, 5, 30, 30, 30, 30, 30, + // A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, + 12, 16, 19, 16, 19, 18, 18, 17, 22, 11, 17, 18, 18, 30, 22, 19, + //P, Q, R, S, T, U, V, W, X, Y, Z, ??, ??, ??, ¡, \, + 22, 19, 19, 20, 18, 19, 19, 29, 19, 18, 19, 19, 33, 33, 10, 19, + //??,a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, + 12, 14, 11, 11, 16, 11, 12, 14, 14, 10, 13, 12, 10, 19, 18, 12, + //p, q, r, s, t, u, v, w, x, y, z, ??, ??, ??, ??, ??, + 16, 13, 13, 11, 12, 15, 12, 15, 13, 12, 12, 37, 33, 37, 35, 37, + //À, Á, Â, Ä, Æ, Ç, È, É, Ê, Ë, Ì, Í, Î, Ï, Ò, Ó, + 16, 16, 16, 16, 33, 17, 18, 18, 18, 18, 11, 11, 11, 11, 19, 19, + //Ô, Ö, Ù, Ú, Û, Ü, ß, à, á, â, ä, æ, ç, è, é, ê, + 19, 19, 19, 19, 19, 19, 15, 14, 14, 14, 14, 20, 14, 11, 11, 11, + //ë, ì, í, î, ï, ò, ó, ô, ö, ù, ú, û, ü, Ñ, ñ, ¿, + 11, 10, 10, 10, 10, 12, 12, 12, 12, 15, 15, 15, 15, 22, 18, 21, + //i,BLANKS + 10, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + //space, unprop + 19, 16 + }, + { + //FONT1 EFIGS + //Characters with a '2' refer to the Pricedown font. + //Characters that are referred as '*I' are characters that contain icons for PS2/XBOX, but contain regular characters on PC + //in order to display them properly in the Keyboard controls menu. + //!2,!, *I,(R), $, %, &, ', [, ], *I, +, , -, ., *I, + 15, 7, 31, 25, 20, 23, 21, 7, 11, 10, 26, 14, 6, 12, 6, 26, + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, *I, *I, *I, *I, ?, + 20, 7, 20, 20, 21, 20, 20, 19, 21, 20, 8, 30, 24, 30, 24, 19, + //TM,A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, + 20, 22, 22, 21, 22, 18, 18, 22, 22, 9, 14, 21, 18, 27, 21, 24, + //P, Q, R, S, T, U, V, W, X, Y, Z, *I, \, *I, ¡, °, + 22, 22, 23, 20, 19, 23, 22, 31, 23, 23, 21, 25, 13, 30, 7, 19, + //(C),a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, + 10, 17, 17, 16, 17, 17, 11, 17, 17, 7, 7, 18, 7, 25, 17, 17, + //p, q, r, s, t, u, v, w, x, y, z, *I, *I, $2, (2, )2, + 17, 17, 11, 17, 11, 17, 18, 25, 19, 18, 17, 28, 26, 20, 15, 15, + //À, Á, Â, Ä, Æ, Ç, È, É, Ê, Ë, Ì, Í, Î, Ï, Ò, Ó, + 20, 20, 20, 20, 29, 22, 19, 19, 19, 19, 9, 9, 9, 9, 23, 23, + //Ô, Ö, Ù, Ú, Û, Ü, ß, à, á, â, ä, æ, ç, è, é, ê, + 23, 23, 24, 24, 24, 24, 20, 19, 17, 17, 17, 30, 16, 17, 17, 17, + //ë, ì, í, î, ï, ò, ó, ô, ö, ù, ú, û, ü, Ñ, ñ, ¿, + 17, 11, 11, 15, 12, 17, 17, 17, 17, 17, 17, 17, 17, 21, 17, 19, + //02,12,22, 32, 42, 52, 62, 72, 82, 92, :2, A2, B2, C2, D2, E2, + 20, 18, 19, 19, 21, 19, 19, 19, 19, 19, 16, 19, 19, 19, 20, 19, + //F2,G2,H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, + 16, 19, 19, 9, 19, 20, 14, 29, 19, 19, 19, 19, 19, 19, 21, 19, + //V2,W2,X2, Y2, Z2, À2, Á2, Â2, Ä2, Æ2, Ç2, È2, É2, Ê2, Ë2, Ì2, + 20, 32, 20, 19, 19, 19, 19, 19, 19, 29, 19, 19, 19, 19, 19, 9, + //Í2,Î2,Ï2, Ò2, Ó2, Ô2, Ö2, Ù2, Ú2, Û2, Ü2, ß2, Ñ2, ¿2, '2, .2, + 9, 9, 9, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 10, 9, + //space, unprop + 10, 20 + } + } +#endif }; - -int FontSizeIncrementers[] = { 4, -2, 2 }; +#ifdef MORE_LANGUAGES +int16 Size_jp[] = { + 15, 14, 16, 20, 19, 26, 22, 11, 18, 18, 27, 26, 13, //; 0 + 19, 20, 27, 19, 15, 19, 19, 21, 19, 20, 18, 19, 15, //; 13 + 13, 28, 15, 32, 15, 35, 15, 19, 19, 19, 19, 17, 16, //; 26 + 19, 20, 15, 19, 20, 14, 17, 19, 19, 19, 19, 19, 19, //; 39 + 19, 19, 20, 25, 20, 19, 19, 33, 31, 39, 37, 39, 37, //; 52 + 21, 21, 21, 19, 17, 15, 23, 21, 15, 19, 20, 16, 19, //; 65 + 19, 19, 20, 20, 17, 22, 19, 22, 22, 19, 22, 22, 23, //; 78 + 35, 35, 35, 35, 37, 19, 19, 19, 19, 29, 19, 19, 19, //; 91 + 19, 19, 9, 9, 9, 9, 19, 19, 19, 19, 19, 19, 19, 19, //; 104 + 19, 19, 19, 19, 19, 30, 19, 19, 19, 19, 19, 10, 10, //; 118 + 10, 10, 19, 19, 19, 19, 19, 19, 19, 19, 19, 23, 35, //; 131 + 12, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, //; 144 + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, //; 157 + 19, 19, 19, 11, 19, 19, 19, 19, 19, 19, 19, 19, 19, //; 170 + 19, 19, 19, 19, 19, 19, 19, 19, 19, 21 +}; +#endif wchar foreign_table[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -128,26 +301,44 @@ int CFont::PS2Symbol = BUTTON_NONE; int CFont::ButtonsSlot = -1; #endif // BUTTON_ICONS -//--TODO(LCS): volatile memory void CFont::Initialise(void) { int slot; - if (gMakeResources) + slot = CTxdStore::AddTxdSlot("fonts"); +#ifdef MORE_LANGUAGES + Slot = slot; + switch (LanguageSet) { - slot = CTxdStore::AddTxdSlot("fonts"); + case FONT_LANGSET_EFIGS: + default: CTxdStore::LoadTxd(slot, "MODELS/FONTS.TXD"); - CTxdStore::AddRef(slot); - CTxdStore::PushCurrentTxd(); - CTxdStore::SetCurrentTxd(slot); - Sprite[0].SetTexture("font2", "font2m"); - Sprite[1].SetTexture("font1", "font1m"); - Sprite[2].SetTexture("font3", "font3m"); - CTxdStore::PopCurrentTxd(); + break; + case FONT_LANGSET_POLISH: + CTxdStore::LoadTxd(slot, "MODELS/FONTS_P.TXD"); + break; + case FONT_LANGSET_RUSSIAN: + CTxdStore::LoadTxd(slot, "MODELS/FONTS_R.TXD"); + break; + case FONT_LANGSET_JAPANESE: + CTxdStore::LoadTxd(slot, "MODELS/FONTS_J.TXD"); + break; } - else - slot = CTxdStore::FindTxdSlot("fonts"); +#else + CTxdStore::LoadTxd(slot, "MODELS/FONTS.TXD"); +#endif + CTxdStore::AddRef(slot); + CTxdStore::PushCurrentTxd(); + CTxdStore::SetCurrentTxd(slot); + Sprite[0].SetTexture("font2", "font2m"); +#ifdef MORE_LANGUAGES + if (IsJapanese()) { + Sprite[1].SetTexture("FONTJAP", "FONTJAP_mask"); + Sprite[3].SetTexture("FONTJAP", "FONTJAP_mask"); + } +#endif // MORE_LANGUAGES + Sprite[1].SetTexture("font1", "font1m"); SetScale(1.0f, 1.0f); SetSlantRefPoint(SCREEN_WIDTH, 0.0f); SetSlant(0.0f); @@ -164,17 +355,7 @@ CFont::Initialise(void) SetRightJustifyWrap(0.0f); SetAlphaFade(255.0f); SetDropShadowPosition(0); - SetOutlineColor(CRGBA(0, 0, 0, 0)); - SetOutlineOn(0); - SetNewLineAdd(0); - SetNewLineAdd(2); - - /* - if (mspCompressedTexList) - { - // TODO (LCS): volatile shit - } - */ + CTxdStore::PopCurrentTxd(); #if !defined(GAMEPAD_MENU) && defined(BUTTON_ICONS) // loaded in CMenuManager with GAMEPAD_MENU defined @@ -237,9 +418,8 @@ CFont::ReloadFonts(uint8 set) if (Slot != -1 && LanguageSet != set) { Sprite[0].Delete(); Sprite[1].Delete(); - Sprite[2].Delete(); if (IsJapanese()) - Sprite[3].Delete(); + Sprite[2].Delete(); CTxdStore::PushCurrentTxd(); CTxdStore::RemoveTxd(Slot); switch (set) @@ -261,19 +441,15 @@ CFont::ReloadFonts(uint8 set) CTxdStore::SetCurrentTxd(Slot); Sprite[0].SetTexture("font2", "font2_mask"); if (set == FONT_LANGSET_JAPANESE) { - Sprite[1].SetTexture("FONTJAP", "FONTJAP_mask"); - Sprite[3].SetTexture("FONTJAP", "FONTJAP_mask"); + Sprite[2].SetTexture("FONTJAP", "FONTJAP_mask"); } - else - Sprite[1].SetTexture("pager", "pager_mask"); - Sprite[2].SetTexture("font1", "font1_mask"); + Sprite[1].SetTexture("font1", "font1_mask"); CTxdStore::PopCurrentTxd(); } LanguageSet = set; } #endif -//--TODO(LCS): gpFonts void CFont::Shutdown(void) { @@ -287,7 +463,6 @@ CFont::Shutdown(void) #endif Sprite[0].Delete(); Sprite[1].Delete(); - Sprite[2].Delete(); #ifdef MORE_LANGUAGES if (IsJapanese()) Sprite[3].Delete(); @@ -298,7 +473,6 @@ CFont::Shutdown(void) #endif } -//--LCS: Done void CFont::InitPerFrame(void) { @@ -341,39 +515,39 @@ CFont::DrawButton(float x, float y) } #endif -//--LCS: TODO (mostly done but could use some checking) void CFont::PrintChar(float x, float y, wchar c) { - if (!(c >= 0 && c < 209)) return; - bool bDontPrint = false; if(x <= 0.0f || x > SCREEN_WIDTH || - y <= -12.0f || y > SCREEN_HEIGHT) // BUG: game uses SCREENW again + y <= 0.0f || y > SCREEN_HEIGHT) // BUG: game uses SCREENW again return; bDontPrint = c == '\0'; float w = GetCharacterWidth(c) / 32.0f; - - if ( !RenderState.proportional && RenderState.rightJustify ) - x += (GetCharacterWidth(c) - GetCharacterWidth(c, true)) * RenderState.scaleX; - if (Details.bFontHalfTexture && c == 208) c = '\0'; - - float xoff = c % 16; float yoff = c / 16; - - // small float modifiers were left for pc +#ifdef MORE_LANGUAGES + if (IsJapaneseFont()) { + w = 21.0f; + xoff = (float)(c % 48); + yoff = c / 48; + } +#endif if(RenderState.style == FONT_BANK || RenderState.style == FONT_STANDARD){ if (bDontPrint) return; if (RenderState.slant == 0.0f) { +#ifdef FIX_BUGS if (c < 192) { +#else + if (c < 193) { +#endif CSprite2d::AddToBuffer( CRect(x, y, - x + 32.0f * RenderState.scaleX * 0.96f, + x + 32.0f * RenderState.scaleX * 1.0f, y + 40.0f * RenderState.scaleY * 0.5f), RenderState.color, xoff / 16.0f, yoff / 12.8f + 0.0021f, @@ -381,13 +555,10 @@ CFont::PrintChar(float x, float y, wchar c) xoff / 16.0f, (yoff + 1.0f) / 12.8f - 0.0021f, (xoff + 1.0f) / 16.0f - 0.001f, (yoff + 1.0f) / 12.8f - 0.0021f); } else { - float xScale = 0.54f; - if (FrontEndMenuManager.m_PrefsUseWideScreen) - xScale = 0.486f; CSprite2d::AddToBuffer( - CRect(x, y + RenderState.scaleY * 4.0f, - x + 32.0f * RenderState.scaleY * xScale * 0.96f, - y + 4.0f * RenderState.scaleY + 16.0f * RenderState.scaleY), + CRect(x, y, + x + 32.0f * RenderState.scaleX * 1.0f, + y + 33.0f * RenderState.scaleY * 0.5f), RenderState.color, xoff / 16.0f, yoff / 12.8f + 0.0021f, (xoff + 1.0f) / 16.0f - 0.001f, yoff / 12.8f + 0.0021f, @@ -397,13 +568,37 @@ CFont::PrintChar(float x, float y, wchar c) } else CSprite2d::AddToBuffer( CRect(x, y, - x + 32.0f * RenderState.scaleX * 0.96f, + x + 32.0f * RenderState.scaleX * 1.0f, y + 40.0f * RenderState.scaleY * 0.5f), RenderState.color, xoff / 16.0f, yoff / 12.8f + 0.00055f, (xoff + 1.0f) / 16.0f - 0.001f, yoff / 12.8f + 0.0021f + 0.01f, xoff / 16.0f, (yoff + 1.0f) / 12.8f - 0.009f, (xoff + 1.0f) / 16.0f - 0.001f, (yoff + 1.0f) / 12.8f - 0.0021f + 0.01f); +#ifdef MORE_LANGUAGES + /*}else if (IsJapaneseFont()) { + if (Details.dropShadowPosition != 0) { + CSprite2d::AddSpriteToBank(Details.bank + Details.style, // BUG: game doesn't add bank + CRect(x + SCREEN_SCALE_X(Details.dropShadowPosition), + y + SCREEN_SCALE_Y(Details.dropShadowPosition), + x + SCREEN_SCALE_X(Details.dropShadowPosition) + 32.0f * Details.scaleX * 1.0f, + y + SCREEN_SCALE_Y(Details.dropShadowPosition) + 40.0f * Details.scaleY / 2.75f), + Details.dropColor, + xoff * w / 1024.0f, yoff / 25.6f, + xoff * w / 1024.0f + (1.0f / 48.0f) - 0.001f, yoff / 25.6f, + xoff * w / 1024.0f, (yoff + 1.0f) / 25.6f, + xoff * w / 1024.0f + (1.0f / 48.0f) - 0.001f, (yoff + 1.0f) / 25.6f - 0.0001f); + } + CSprite2d::AddSpriteToBank(Details.bank + Details.style, // BUG: game doesn't add bank + CRect(x, y, + x + 32.0f * Details.scaleX * 1.0f, + y + 40.0f * Details.scaleY / 2.75f), + Details.color, + xoff * w / 1024.0f, yoff / 25.6f, + xoff * w / 1024.0f + (1.0f / 48.0f) - 0.001f, yoff / 25.6f, + xoff * w / 1024.0f, (yoff + 1.0f) / 25.6f - 0.002f, + xoff * w / 1024.0f + (1.0f / 48.0f) - 0.001f, (yoff + 1.0f) / 25.6f - 0.0001f);*/ +#endif } else { if (bDontPrint) return; CSprite2d::AddToBuffer( @@ -411,10 +606,10 @@ CFont::PrintChar(float x, float y, wchar c) x + 32.0f * RenderState.scaleX * w, y + 32.0f * RenderState.scaleY * 0.5f), RenderState.color, - xoff / 16.0f, yoff / 6.4f, - (xoff + w) / 16.0f, yoff / 6.4f, - xoff / 16.0f, (yoff + 1.0f) / 6.4f, - (xoff + w) / 16.0f, (yoff + 1.0f) / 6.4f); + xoff / 16.0f, yoff / 16.0f, + (xoff + w) / 16.0f, yoff / 16.0f, + xoff / 16.0f, (yoff + 1.0f) / 16.0f, + (xoff + w) / 16.0f - 0.0001f, (yoff + 1.0f) / 16.0f - 0.0001f); } } @@ -440,7 +635,6 @@ bool CFont::IsAnsiCharacter(wchar *s) } #endif -//--LCS: TODO (mostly done but could use some checking) void CFont::RenderFontBuffer() { @@ -453,7 +647,7 @@ CFont::RenderFontBuffer() bool bFlash = false; Sprite[RenderState.style].SetRenderState(); - RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); // TODO: not in lcs + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RenderState = *(CFontRenderState*)&FontRenderStateBuf[0]; textPosX = RenderState.fTextPosX; textPosY = RenderState.fTextPosY; @@ -495,15 +689,16 @@ CFont::RenderFontBuffer() } Details.color.alpha = Details.bFlashState ? 0 : 255; } - if (!RenderState.bIsShadow && !RenderState.bOutlineOn) + if (!RenderState.bIsShadow) RenderState.color = color; } wchar c = *pRenderStateBufPointer.pStr; c -= ' '; - if (c == 200) c = '^'; - if (c == 201) c = '>'; if (RenderState.bFontHalfTexture) - c = FindNewCharacter(c); + c = FindNewCharacter(c); + else if (c > 155) + c = '\0'; + if (RenderState.slant != 0.0f) textPosY = (RenderState.slantRefX - textPosX) * RenderState.slant + RenderState.slantRefY; PrintChar(textPosX, textPosY, c); @@ -512,11 +707,11 @@ CFont::RenderFontBuffer() PrintChar(textPosX + 2.0f, textPosY, c); textPosX += 2.0f; } +#ifdef FIX_BUGS + // PS2 uses different chars for some symbols + if (!RenderState.bFontHalfTexture && c == 30) c = 61; // wanted star +#endif textPosX += RenderState.scaleX * GetCharacterWidth(c); -//#ifdef FIX_BUGS -// // PS2 uses different chars for some symbols -// if (!RenderState.bFontHalfTexture && c == 30) c = 61; // wanted star -//#endif if (c == '\0') textPosX += RenderState.fExtraSpace; } @@ -524,8 +719,50 @@ CFont::RenderFontBuffer() FontRenderStatePointer.pRenderState = (CFontRenderState*)FontRenderStateBuf; } +#if 0 //def MORE_LANGUAGES +bool +CFont::PrintString(float x, float y, wchar *start, wchar *&end, float spwidth, float japX) +{ + wchar *s, c, unused; -//--LCS: TODO + if (IsJapanese()) { + float jx = 0.0f; + for (s = start; s < end; s++) { + if (*s == JAP_TERMINATION || *s == '~') + s = ParseToken(s, &unused, true); + if (NewLine) { + NewLine = false; + break; + } + jx += GetCharacterSize(*s - ' '); + } + s = start; + if (Details.centre) + x = japX - jx / 2.0f; + else if (Details.rightJustify) + x = japX - jx; + } + + for (s = start; s < end; s++) { + if (*s == '~' || (IsJapanese() && *s == JAP_TERMINATION)) + s = ParseToken(s, &unused); + if (NewLine && IsJapanese()) { + NewLine = false; + end = s; + return true; + } + c = *s - ' '; + if (Details.slant != 0.0f && !IsJapanese()) + y = (Details.slantRefX - x) * Details.slant + Details.slantRefY; + + PrintChar(x, y, c); + x += GetCharacterSize(c); + if (c == 0 && (!NewLine || !IsJapanese())) // space + x += spwidth; + } + return false; +} +#else void CFont::PrintString(float x, float y, uint32, wchar *start, wchar *end, float spwidth) { @@ -536,38 +773,26 @@ CFont::PrintString(float x, float y, uint32, wchar *start, wchar *end, float spw RenderState.style = Details.style; } - if (Details.outlineColor.a != 0) { + float dropShadowPosition = Details.dropShadowPosition; + if (dropShadowPosition != 0.0f && (Details.style == FONT_BANK || Details.style == FONT_STANDARD)) { CRGBA color = Details.color; - Details.color = Details.outlineColor; - Details.bOutlineOn = true; - Details.outlineColor.a = 0; + Details.color = Details.dropColor; Details.dropShadowPosition = 0; - Details.bIsShadow = false; - PrintString(x, y, Details.anonymous_25, start, end, spwidth); - Details.color = color; - Details.bOutlineOn = false; - } else { - float dropShadowPosition = Details.dropShadowPosition; - if (dropShadowPosition != 0.0f && (Details.style == FONT_BANK || Details.style == FONT_STANDARD)) { - CRGBA color = Details.color; - Details.color = Details.dropColor; - Details.dropShadowPosition = 0; - Details.bIsShadow = true; - if (Details.slant != 0.0f) { - Details.slantRefX += SCREEN_SCALE_X(dropShadowPosition); - Details.slantRefY += SCREEN_SCALE_Y(dropShadowPosition); - PrintString(SCREEN_SCALE_X(dropShadowPosition) + x, SCREEN_SCALE_Y(dropShadowPosition) + y, Details.anonymous_25, start, end, spwidth); - Details.slantRefX -= SCREEN_SCALE_X(dropShadowPosition); - Details.slantRefY -= SCREEN_SCALE_Y(dropShadowPosition); - } else { - PrintString(SCREEN_SCALE_X(dropShadowPosition) + x, SCREEN_SCALE_Y(dropShadowPosition) + y, Details.anonymous_25, start, end, spwidth); - } - Details.color = color; - Details.dropShadowPosition = dropShadowPosition; - Details.bIsShadow = false; + Details.bIsShadow = true; + if (Details.slant != 0.0f) { + Details.slantRefX += SCREEN_SCALE_X(dropShadowPosition); + Details.slantRefY += SCREEN_SCALE_Y(dropShadowPosition); + PrintString(SCREEN_SCALE_X(dropShadowPosition) + x, SCREEN_SCALE_Y(dropShadowPosition) + y, Details.anonymous_25, start, end, spwidth); + Details.slantRefX -= SCREEN_SCALE_X(dropShadowPosition); + Details.slantRefY -= SCREEN_SCALE_Y(dropShadowPosition); + } else { + PrintString(SCREEN_SCALE_X(dropShadowPosition) + x, SCREEN_SCALE_Y(dropShadowPosition) + y, Details.anonymous_25, start, end, spwidth); } + Details.color = color; + Details.dropShadowPosition = dropShadowPosition; + Details.bIsShadow = false; } - if ((uintptr)FontRenderStatePointer.pStr >= (uintptr)&FontRenderStateBuf[ARRAY_SIZE(FontRenderStateBuf)] - sizeof(wchar) * (end - start + 2) - sizeof(CFontRenderState)) + if (FontRenderStatePointer.pStr >= (wchar*)&FontRenderStateBuf[ARRAY_SIZE(FontRenderStateBuf)] - (end - start + 26)) // why 26? RenderFontBuffer(); CFontRenderState *pRenderState = FontRenderStatePointer.pRenderState; pRenderState->fTextPosX = x; @@ -603,18 +828,17 @@ CFont::PrintString(float x, float y, uint32, wchar *start, wchar *end, float spw *(FontRenderStatePointer.pStr++) = '\0'; FontRenderStatePointer.Align(); } +#endif -// LCS: Done void CFont::PrintStringFromBottom(float x, float y, wchar *str) { - y -= (32.0f * Details.scaleY / 2.0f + Details.line * Details.scaleY) * GetNumberLines(x, y, str); + y -= (32.0f * Details.scaleY / 2.0f + 2.0f * Details.scaleY) * GetNumberLines(x, y, str); if (Details.slant != 0.0f) y -= ((Details.slantRefX - x) * Details.slant + Details.slantRefY); PrintString(x, y, str); } -//--LCS: TODO void CFont::PrintString(float xstart, float ystart, wchar *s) { @@ -625,8 +849,7 @@ CFont::PrintString(float xstart, float ystart, wchar *s) bool first; wchar *start, *t; - CRGBA outlineColor = Details.outlineColor; - CFont::SetFlashOff(); + Details.bFlash = false; if(*s == '*') return; @@ -673,7 +896,7 @@ CFont::PrintString(float xstart, float ystart, wchar *s) float xleft = Details.centre ? xstart - x/2 : Details.rightJustify ? xstart - x : xstart; -#ifdef MORE_LANGUAGES +#if 0//def MORE_LANGUAGES PrintString(xleft, y, start, s, spaceWidth, xstart); #else PrintString(xleft, y, Details.anonymous_25, start, s, spaceWidth); @@ -711,7 +934,7 @@ CFont::PrintString(float xstart, float ystart, wchar *s) #endif lineLength = x; s = t+1; -#ifdef MORE_LANGUAGES +#if 0 //def MORE_LANGUAGES if (IsJapaneseFont() && !*s) { x += GetStringWidth(s); if (IsAnsiCharacter(s)) @@ -743,7 +966,7 @@ CFont::PrintString(float xstart, float ystart, wchar *s) float xleft = Details.centre ? xstart - x/2 : Details.rightJustify ? xstart - x : xstart; -#ifdef MORE_LANGUAGES +#if 0 //def MORE_LANGUAGES if (PrintString(xleft, y, start, s, 0.0f, xstart) && IsJapaneseFont()) { start = s; if (!Details.centre && !Details.rightJustify) @@ -761,7 +984,6 @@ CFont::PrintString(float xstart, float ystart, wchar *s) } } -//--LCS: TODO int CFont::GetNumberLines(float xstart, float ystart, wchar *s) { @@ -770,7 +992,7 @@ CFont::GetNumberLines(float xstart, float ystart, wchar *s) wchar *t; n = 0; -#ifdef MORE_LANGUAGES +#if 0//def MORE_LANGUAGES bool bSomeJapBool = false; if (IsJapanese()) { @@ -863,7 +1085,6 @@ CFont::GetNumberLines(float xstart, float ystart, wchar *s) return n; } -//--LCS: TODO void CFont::GetTextRect(CRect *rect, float xstart, float ystart, wchar *s) { @@ -969,65 +1190,101 @@ CFont::GetTextRect(CRect *rect, float xstart, float ystart, wchar *s) } } -//--LCS: done -bool IsPunctuation(wchar c) -{ - switch (c) - { - case '!': - case '?': - case '.': - case ',': - case ':': - case ';': - - // these are lucid it seems - //case '$': - //case '/': - //case '\\': - return true; - } - return false; -} - -//--LCS: done float -CFont::GetCharacterWidth(wchar c, bool forceProportional) +CFont::GetCharacterWidth(wchar c) { - if (RenderState.proportional || forceProportional) - { - float inc = c < 192 ? 0.0f : 4.0f; - return Size[RenderState.style][c] + Size[RenderState.style][c + 209] + FontSizeIncrementers[RenderState.style] + inc; - } else { - if (IsPunctuation(c + ' ')) - return Size[RenderState.style][418] / 1.6f + FontSizeIncrementers[RenderState.style]; - else - return Size[RenderState.style][418] + FontSizeIncrementers[RenderState.style]; +#ifdef MORE_LANGUAGES + if (IsJapanese()) { + if (!RenderState.proportional) + return Size[0][Details.style][192]; + if (c <= 94 || Details.style == FONT_HEADING || RenderState.style == FONT_BANK) { + switch (RenderState.style) + { + case FONT_JAPANESE: + return Size_jp[c]; + default: + return Size[0][RenderState.style][c]; + } + } + + switch (RenderState.style) + { + case FONT_JAPANESE: + return 29.4f; + case FONT_BANK: + return 10.0f; + default: + return Size[0][RenderState.style][c]; + } } + + else if (RenderState.proportional) + return Size[LanguageSet][RenderState.style][c]; + else + return Size[LanguageSet][RenderState.style][209]; +#else + + if (RenderState.proportional) + return Size[RenderState.style][c]; + else + return Size[RenderState.style][209]; +#endif // MORE_LANGUAGES } -//--LCS: done float CFont::GetCharacterSize(wchar c) { -//#ifdef FIX_BUGS +#ifdef MORE_LANGUAGES + + if (IsJapanese()) + { + if (!Details.proportional) + return Size[0][Details.style][209] * Details.scaleX; + if (c <= 94 || Details.style == FONT_HEADING || Details.style == FONT_BANK) { + switch (Details.style) + { + case FONT_JAPANESE: + return Size_jp[c] * Details.scaleX; + default: + return Size[0][Details.style][c] * Details.scaleX; + } + } + + switch (Details.style) + { + case FONT_JAPANESE: + return 29.4f * Details.scaleX; + case FONT_BANK: + return 10.0f * Details.scaleX; + default: + return Size[0][Details.style][c] * Details.scaleX; + } + } + else + { + if (!Details.bFontHalfTexture && c == 30) c = 61; // wanted star + if (Details.bFontHalfTexture) + c = FindNewCharacter(c); + if (Details.proportional) + return Size[LanguageSet][Details.style][c] * Details.scaleX; + else + return Size[LanguageSet][Details.style][209] * Details.scaleX; + } +#else + +#ifdef FIX_BUGS // PS2 don't call FindNewCharacter in here at all, and also uses different chars for some symbols -// if (!Details.bFontHalfTexture && c == 30) c = 61; // wanted star -//#endif + if (!Details.bFontHalfTexture && c == 30) c = 61; // wanted star +#endif if (Details.bFontHalfTexture) c = FindNewCharacter(c); - if (Details.proportional) { - float inc = c < 192 ? 0.0f : 4.0f; - return (Size[Details.style][c] + Size[Details.style][c + 209] + FontSizeIncrementers[Details.style] + inc) * Details.scaleX; - } else { - if (IsPunctuation(c + ' ')) - return (Size[Details.style][418] + FontSizeIncrementers[Details.style]) / 1.6f * Details.scaleX; - else - return Size[Details.style][418] + FontSizeIncrementers[Details.style] * Details.scaleX; - } + if (Details.proportional) + return Size[Details.style][c] * Details.scaleX; + else + return Size[Details.style][209] * Details.scaleX; +#endif // MORE_LANGUAGES } -//--LCS: TODO float CFont::GetStringWidth(wchar *s, bool spaces) { @@ -1140,19 +1397,6 @@ CFont::GetStringWidth_Jap(wchar* s) } #endif -//--LCS: done -bool16 -CFont::CheckNewLine(wchar *s) -{ - while (*s == ' ') - s++; - - if (*s == '~') - return s[1] == 'N' || s[1] == 'n'; - return false; -} - -//--LCS: TODO wchar* CFont::GetNextSpace(wchar *s) { @@ -1183,7 +1427,6 @@ CFont::GetNextSpace(wchar *s) return s; } -//--LCS: done wchar* CFont::ParseToken(wchar* str, CRGBA &color, bool &flash, bool &bold) { @@ -1196,36 +1439,28 @@ CFont::ParseToken(wchar* str, CRGBA &color, bool &flash, bool &bold) case 'B': bold = !bold; break; - case 'Y': - color.r = 255; - color.g = 227; - color.b = 79; - break; case 'b': - color.r = 77; - color.g = 155; - color.b = 210; + color.r = 27; + color.g = 89; + color.b = 130; break; case 'f': flash = !flash; break; case 'g': - color.r = 75; - color.g = 151; - color.b = 75; - Details.anonymous_23 = true; + color.r = 255; + color.g = 150; + color.b = 225; break; case 'h': - color.r = 255; - color.g = 255; - color.b = 255; - Details.anonymous_23 = true; + color.r = 225; + color.g = 225; + color.b = 225; break; case 'l': color.r = 0; color.g = 0; color.b = 0; - Details.anonymous_23 = true; break; case 'o': color.r = 229; @@ -1233,9 +1468,9 @@ CFont::ParseToken(wchar* str, CRGBA &color, bool &flash, bool &bold) color.b = 126; break; case 'p': - color.r = 151; - color.g = 82; - color.b = 197; + color.r = 168; + color.g = 110; + color.b = 252; break; case 'q': color.r = 199; @@ -1243,9 +1478,9 @@ CFont::ParseToken(wchar* str, CRGBA &color, bool &flash, bool &bold) color.b = 203; break; case 'r': - color.r = 174; - color.g = 0; - color.b = 0; + color.r = 255; + color.g = 150; + color.b = 225; break; case 't': color.r = 86; @@ -1253,20 +1488,27 @@ CFont::ParseToken(wchar* str, CRGBA &color, bool &flash, bool &bold) color.b = 146; break; case 'w': - color.r = 225; - color.g = 225; - color.b = 225; - Details.anonymous_23 = true; + color.r = 175; + color.g = 175; + color.b = 175; break; +#ifdef FIX_BUGS + case 'x': + color.r = 0; + color.g = 255; + color.b = 255; + break; +#else case 'x': color.r = 132; color.g = 146; color.b = 197; break; +#endif case 'y': color.r = 255; - color.g = 255; - color.b = 0; + color.g = 227; + color.b = 79; break; #ifdef BUTTON_ICONS case 'U': PS2Symbol = BUTTON_UP; break; @@ -1294,34 +1536,187 @@ CFont::ParseToken(wchar* str, CRGBA &color, bool &flash, bool &bold) } while (*s != '~') ++s; - - // seem to be gone in lcs - //if (*(++s) == '~') - // s = ParseToken(s, color, flash, bold); - - // wtf? - if (*s == '\0') s++; - s++; + if (*(++s) == '~') + s = ParseToken(s, color, flash, bold); return s; } -//--LCS: done +#if 0//def MORE_LANGUAGES +wchar* +CFont::ParseToken(wchar *s, bool japShit) +{ + s++; + if ((Details.color.r || Details.color.g || Details.color.b) && !japShit) { + wchar c = *s; + if (IsJapanese()) + c &= 0x7FFF; + switch (c) { + case 'N': + case 'n': + NewLine = true; + break; + case 'b': SetColor(CRGBA(128, 167, 243, 255)); break; + case 'g': SetColor(CRGBA(95, 160, 106, 255)); break; + case 'h': SetColor(CRGBA(225, 225, 225, 255)); break; + case 'l': SetColor(CRGBA(0, 0, 0, 255)); break; + case 'p': SetColor(CRGBA(168, 110, 252, 255)); break; + case 'r': SetColor(CRGBA(113, 43, 73, 255)); break; + case 'w': SetColor(CRGBA(175, 175, 175, 255)); break; + case 'y': SetColor(CRGBA(210, 196, 106, 255)); break; +#ifdef BUTTON_ICONS + case 'U': PS2Symbol = BUTTON_UP; break; + case 'D': PS2Symbol = BUTTON_DOWN; break; + case '<': PS2Symbol = BUTTON_LEFT; break; + case '>': PS2Symbol = BUTTON_RIGHT; break; + case 'X': PS2Symbol = BUTTON_CROSS; break; + case 'O': PS2Symbol = BUTTON_CIRCLE; break; + case 'Q': PS2Symbol = BUTTON_SQUARE; break; + case 'T': PS2Symbol = BUTTON_TRIANGLE; break; + case 'K': PS2Symbol = BUTTON_L1; break; + case 'M': PS2Symbol = BUTTON_L2; break; + case 'A': PS2Symbol = BUTTON_L3; break; + case 'J': PS2Symbol = BUTTON_R1; break; + case 'V': PS2Symbol = BUTTON_R2; break; + case 'C': PS2Symbol = BUTTON_R3; break; + case 'H': PS2Symbol = BUTTON_RSTICK_UP; break; + case 'L': PS2Symbol = BUTTON_RSTICK_DOWN; break; + case '(': PS2Symbol = BUTTON_RSTICK_LEFT; break; + case ')': PS2Symbol = BUTTON_RSTICK_RIGHT; break; +#endif + } + } else if (IsJapanese()) { + if ((*s & 0x7FFF) == 'N' || (*s & 0x7FFF) == 'n') + NewLine = true; + } + while ((!IsJapanese() || (*s != JAP_TERMINATION)) && *s != '~') s++; + return s + 1; +} +#else wchar* CFont::ParseToken(wchar *s) { - bool flash = false; - bool bold = false; - CRGBA color = Details.color; - s = ParseToken(s, color, flash, bold); - Details.bFlash = flash; - Details.bBold = bold; - - if (Details.anonymous_23) - Details.color = color; + Details.anonymous_23 = false; + s++; + if(Details.color.r || Details.color.g || Details.color.b) + switch(*s){ + case 'B': + Details.bBold = !Details.bBold; + break; + case 'N': + case 'n': + NewLine = true; + break; + case 'b': + Details.color.r = 27; + Details.color.g = 89; + Details.color.b = 130; + Details.anonymous_23 = true; + break; + case 'f': + Details.bFlash = !Details.bFlash; + if (!Details.bFlash) + Details.color.a = 255; + break; + case 'g': + Details.color.r = 255; + Details.color.g = 150; + Details.color.b = 225; + Details.anonymous_23 = true; + break; + case 'h': + Details.color.r = 225; + Details.color.g = 225; + Details.color.b = 225; + Details.anonymous_23 = true; + break; + case 'l': + Details.color.r = 0; + Details.color.g = 0; + Details.color.b = 0; + Details.anonymous_23 = true; + break; + case 'o': + Details.color.r = 229; + Details.color.g = 125; + Details.color.b = 126; + Details.anonymous_23 = true; + break; + case 'p': + Details.color.r = 168; + Details.color.g = 110; + Details.color.b = 252; + Details.anonymous_23 = true; + break; + case 'q': + Details.color.r = 199; + Details.color.g = 144; + Details.color.b = 203; + Details.anonymous_23 = true; + break; + case 'r': + Details.color.r = 255; + Details.color.g = 150; + Details.color.b = 225; + Details.anonymous_23 = true; + break; + case 't': + Details.color.r = 86; + Details.color.g = 212; + Details.color.b = 146; + Details.anonymous_23 = true; + break; + case 'w': + Details.color.r = 175; + Details.color.g = 175; + Details.color.b = 175; + Details.anonymous_23 = true; + break; + case 'x': +#ifdef FIX_BUGS + Details.color.r = 0; + Details.color.g = 255; + Details.color.b = 255; +#else + Details.color.r = 132; + Details.color.g = 146; + Details.color.b = 197; +#endif + Details.anonymous_23 = true; + break; + case 'y': + Details.color.r = 255; + Details.color.g = 227; + Details.color.b = 79; + Details.anonymous_23 = true; + break; +#ifdef BUTTON_ICONS + case 'U': PS2Symbol = BUTTON_UP; break; + case 'D': PS2Symbol = BUTTON_DOWN; break; + case '<': PS2Symbol = BUTTON_LEFT; break; + case '>': PS2Symbol = BUTTON_RIGHT; break; + case 'X': PS2Symbol = BUTTON_CROSS; break; + case 'O': PS2Symbol = BUTTON_CIRCLE; break; + case 'Q': PS2Symbol = BUTTON_SQUARE; break; + case 'T': PS2Symbol = BUTTON_TRIANGLE; break; + case 'K': PS2Symbol = BUTTON_L1; break; + case 'M': PS2Symbol = BUTTON_L2; break; + case 'A': PS2Symbol = BUTTON_L3; break; + case 'J': PS2Symbol = BUTTON_R1; break; + case 'V': PS2Symbol = BUTTON_R2; break; + case 'C': PS2Symbol = BUTTON_R3; break; + case 'H': PS2Symbol = BUTTON_RSTICK_UP; break; + case 'L': PS2Symbol = BUTTON_RSTICK_DOWN; break; + case '(': PS2Symbol = BUTTON_RSTICK_LEFT; break; + case ')': PS2Symbol = BUTTON_RSTICK_RIGHT; break; +#endif + } + while(*s != '~') s++; + if (*(++s) == '~') + s = ParseToken(s); return s; } +#endif -//--LCS: done void CFont::FilterOutTokensFromString(wchar *str) { @@ -1340,22 +1735,25 @@ CFont::FilterOutTokensFromString(wchar *str) str[newIdx] = '\0'; } -//--LCS: done void CFont::DrawFonts(void) { RenderFontBuffer(); } -//--LCS: done void CFont::SetScale(float x, float y) { +#ifdef MORE_LANGUAGES + /*if (IsJapanese()) { + x *= 1.35f; + y *= 1.25f; + }*/ +#endif Details.scaleX = x; Details.scaleY = y; } -//--LCS: done void CFont::SetSlantRefPoint(float x, float y) { @@ -1363,14 +1761,12 @@ CFont::SetSlantRefPoint(float x, float y) Details.slantRefY = y; } -//--LCS: done void CFont::SetSlant(float s) { Details.slant = s; } -//--LCS: done void CFont::SetColor(CRGBA col) { @@ -1379,14 +1775,6 @@ CFont::SetColor(CRGBA col) Details.color.a *= Details.alphaFade / 255.0f; } -//--LCS: done -void -CFont::SetFlashOff() -{ - Details.bFlash = false; -} - -//--LCS: done void CFont::SetJustifyOn(void) { @@ -1395,7 +1783,6 @@ CFont::SetJustifyOn(void) Details.rightJustify = false; } -//--LCS: done void CFont::SetJustifyOff(void) { @@ -1403,7 +1790,6 @@ CFont::SetJustifyOff(void) Details.rightJustify = false; } -//--LCS: done void CFont::SetCentreOn(void) { @@ -1412,65 +1798,54 @@ CFont::SetCentreOn(void) Details.rightJustify = false; } -//--LCS: done void CFont::SetCentreOff(void) { Details.centre = false; } -//--LCS: TODO void CFont::SetWrapx(float x) { - // uncomment when scaling is done - //x = clamp(x, 0.0f, DEFAULT_SCREEN_WIDTH); Details.wrapX = x; } -//--LCS: done void CFont::SetCentreSize(float s) { Details.centreSize = s; } -//--LCS: done void CFont::SetBackgroundOn(void) { Details.background = true; } -//--LCS: done void CFont::SetBackgroundOff(void) { Details.background = false; } -//--LCS: done void CFont::SetBackgroundColor(CRGBA col) { Details.backgroundColor = col; } -//--LCS: done void CFont::SetBackGroundOnlyTextOn(void) { Details.backgroundOnlyText = true; } -//--LCS: done void CFont::SetBackGroundOnlyTextOff(void) { Details.backgroundOnlyText = false; } -//--LCS: done void CFont::SetRightJustifyOn(void) { @@ -1479,7 +1854,6 @@ CFont::SetRightJustifyOn(void) Details.centre = false; } -//--LCS: done void CFont::SetRightJustifyOff(void) { @@ -1488,118 +1862,70 @@ CFont::SetRightJustifyOff(void) Details.centre = false; } -//--LCS: done void CFont::SetPropOff(void) { Details.proportional = false; } -//--LCS: done void CFont::SetPropOn(void) { Details.proportional = true; } -//--LCS: done void CFont::SetFontStyle(int16 style) { if (style == FONT_HEADING) { - Details.style = FONT_HEADING; + Details.style = FONT_STANDARD; Details.bFontHalfTexture = true; - } - else { + } else { Details.style = style; Details.bFontHalfTexture = false; } } -//--LCS: done void CFont::SetRightJustifyWrap(float wrap) { Details.rightJustifyWrap = wrap; } -//--LCS: done void CFont::SetAlphaFade(float fade) { Details.alphaFade = fade; } -//--LCS: done void CFont::SetDropColor(CRGBA col) { Details.dropColor = col; if (Details.alphaFade < 255.0f) - // TODO: was this a copypaste bug in here? - //Details.dropColor.a *= Details.alphaFade / 255.0f; - Details.dropColor.a = Details.color.a * Details.alphaFade / 255.0f; + Details.dropColor.a *= Details.alphaFade / 255.0f; } - -//--LCS: done -void -CFont::SetOutlineColor(CRGBA col) -{ - Details.outlineColor = col; - if (Details.alphaFade < 255.0f) - Details.outlineColor.a *= Details.alphaFade / 255.0f; -} - -//--LCS: done -void -CFont::SetOutlineOn(int on) -{ - Details.bOutlineOn = on; -} - -//--LCS: done -void -CFont::SetNewLineAdd(int line) -{ - Details.line = line; -} - -//--LCS: done void CFont::SetDropShadowPosition(int16 pos) { Details.dropShadowPosition = pos; } -int16 CFont::FindNewCharacter(int16 c) +wchar CFont::FindNewCharacter(wchar c) { - if (c >= 33 && c <= 33 + 25) - return c - 6; - else if(c >= 65 && c <= 65 + 25) - return c - 38; - else if (c >= 96 && c <= 96 + 31) - return c - 43; - else if (c >= 128 && c <= 128 + 31) - return c - 75; - - switch (c) - { - case 190: - return 90; - case 175: - return 87; - case 184: - return 88; - case 187: - return 89; - case 31: - return 88; - } - if (c >= 27 && c < 31) - return 2; - if (c >= 180 && c < 256) - c = 2; + if (c >= 16 && c <= 26) return c + 128; + if (c >= 8 && c <= 9) return c + 86; + if (c == 4) return c + 89; + if (c == 7) return 206; + if (c == 14) return 207; + if (c >= 33 && c <= 58) return c + 122; + if (c >= 65 && c <= 90) return c + 90; + if (c >= 96 && c <= 118) return c + 85; + if (c >= 119 && c <= 140) return c + 62; + if (c >= 141 && c <= 142) return 204; + if (c == 143) return 205; + if (c == 1) return 208; return c; } @@ -1609,4 +1935,4 @@ CFont::character_code(uint8 c) if(c < 128) return c; return foreign_table[c-128]; -} +} \ No newline at end of file diff --git a/src/render/Font.h b/src/render/Font.h index a433e05..42eb7b4 100644 --- a/src/render/Font.h +++ b/src/render/Font.h @@ -39,9 +39,6 @@ struct CFontDetails int nFlashTimer; bool8 anonymous_23; uint32 anonymous_25; - CRGBA outlineColor; - int bOutlineOn; - int line; }; struct CFontRenderState @@ -61,9 +58,6 @@ struct CFontRenderState bool8 proportional; bool8 anonymous_14; int16 style; - int bOutlineOn; - int line; - bool8 rightJustify; }; class CSprite2d; @@ -72,7 +66,10 @@ enum { FONT_BANK, FONT_STANDARD, FONT_HEADING, - MAX_FONTS +#ifdef MORE_LANGUAGES + FONT_JAPANESE, +#endif + MAX_FONTS = FONT_HEADING }; enum { @@ -126,13 +123,13 @@ enum class CFont { #ifdef MORE_LANGUAGES - static int16 Size[LANGSET_MAX][MAX_FONTS][193]; + static int16 Size[LANGSET_MAX][MAX_FONTS][210]; static uint8 LanguageSet; static int32 Slot; #else - static int16 Size[MAX_FONTS][419]; + static int16 Size[MAX_FONTS][210]; #endif - static bool16 NewLine; + static int16 NewLine; public: static CSprite2d Sprite[MAX_FONTS]; static CFontDetails Details; @@ -154,29 +151,30 @@ public: static void PrintChar(float x, float y, wchar c); static void PrintString(float x, float y, wchar *s); #ifdef XBOX_SUBTITLES + static void PrintStringFromBottom(float x, float y, wchar *str); static void PrintOutlinedString(float x, float y, wchar *str, float outlineStrength, bool fromBottom, CRGBA outlineColor); #endif static int GetNumberLines(float xstart, float ystart, wchar *s); static void GetTextRect(CRect *rect, float xstart, float ystart, wchar *s); -#ifdef MORE_LANGUAGES - static bool PrintString(float x, float y, wchar *start, wchar* &end, float spwidth, float japX); -#else +//#ifdef MORE_LANGUAGES +// static bool PrintString(float x, float y, wchar *start, wchar* &end, float spwidth, float japX); +//#else static void PrintString(float x, float y, uint32, wchar *start, wchar *end, float spwidth); -#endif +//#endif static void PrintStringFromBottom(float x, float y, wchar *str); - static float GetCharacterWidth(wchar c, bool forceProportional = false); + static float GetCharacterWidth(wchar c); static float GetCharacterSize(wchar c); static float GetStringWidth(wchar *s, bool spaces = false); #ifdef MORE_LANGUAGES static float GetStringWidth_Jap(wchar* s); #endif static uint16 *GetNextSpace(wchar *s); -#ifdef MORE_LANGUAGES - static uint16 *ParseToken(wchar *s, bool japShit = false); -#else +//#ifdef MORE_LANGUAGES +// static uint16 *ParseToken(wchar *s, bool japShit = false); +//#else static uint16 *ParseToken(wchar *s); static uint16 *ParseToken(wchar *s, CRGBA &color, bool &flash, bool &bold); -#endif +//#endif static void DrawFonts(void); static void RenderFontBuffer(void); static uint16 character_code(uint8 c); @@ -196,7 +194,6 @@ public: static void SetBackgroundOff(void); static void SetBackGroundOnlyTextOn(void); static void SetBackGroundOnlyTextOff(void); - static void SetFlashOff(void); static void SetPropOn(void); static void SetPropOff(void); static void SetFontStyle(int16 style); @@ -206,14 +203,8 @@ public: static void SetBackgroundColor(CRGBA col); static void SetColor(CRGBA col); static void SetDropColor(CRGBA col); - - static void SetOutlineColor(CRGBA col); - static void SetOutlineOn(int on); - static void SetNewLineAdd(int line); - - static int16 FindNewCharacter(int16 c); + static wchar FindNewCharacter(wchar c); static void FilterOutTokensFromString(wchar*); - static bool16 CheckNewLine(wchar *s); #ifdef MORE_LANGUAGES static void ReloadFonts(uint8 set); @@ -221,6 +212,6 @@ public: static bool IsAnsiCharacter(wchar* s); static bool IsJapanesePunctuation(wchar* str); static bool IsJapanese() { return LanguageSet == FONT_LANGSET_JAPANESE; } - static bool IsJapaneseFont() { return IsJapanese() && (Details.style == FONT_JAPANESE || Details.style == FONT_PAGER); } + static bool IsJapaneseFont() { return IsJapanese() && (Details.style == FONT_JAPANESE); } #endif }; diff --git a/src/render/Glass.cpp b/src/render/Glass.cpp index c6d0275..3409a05 100644 --- a/src/render/Glass.cpp +++ b/src/render/Glass.cpp @@ -276,6 +276,8 @@ CGlass::Render(void) RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDONE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE); + PUSH_RENDERGROUP("CGlass::Render"); + for ( int32 i = 0; i < NUM_GLASSPANES; i++ ) { if ( aGlassPanes[i].m_bActive ) @@ -285,6 +287,8 @@ CGlass::Render(void) for ( uint32 i = 0; i < NumGlassEntities; i++ ) RenderEntityInGlass(apEntitiesToBeRendered[i]); + POP_RENDERGROUP(); + NumGlassEntities = 0; RenderHiLightPolys(); diff --git a/src/render/Hud.cpp b/src/render/Hud.cpp index 2efa7b6..9150391 100644 --- a/src/render/Hud.cpp +++ b/src/render/Hud.cpp @@ -39,14 +39,14 @@ // Game has colors inlined in code. // For easier modification we collect them here: CRGBA MONEY_COLOR(0, 207, 133, 255); -CRGBA AMMO_COLOR(255, 255, 255, 255); +CRGBA AMMO_COLOR(255, 150, 225, 255); CRGBA HEALTH_COLOR(255, 150, 225, 255); CRGBA ARMOUR_COLOR(185, 185, 185, 255); CRGBA NOTWANTED_COLOR(27, 89, 130, 255); CRGBA WANTED_COLOR_FLASH(62, 141, 181, 255); CRGBA WANTED_COLOR(97, 194, 247, 255); -CRGBA ZONE_COLOR(255, 255, 255, 255); -CRGBA VEHICLE_COLOR(255, 255, 255, 255); +CRGBA ZONE_COLOR(45, 155, 90, 255); +CRGBA VEHICLE_COLOR(97, 194, 247, 255); CRGBA CLOCK_COLOR(97, 194, 247, 255); CRGBA TIMER_COLOR(97, 194, 247, 255); CRGBA COUNTER_COLOR(97, 194, 247, 255); @@ -89,7 +89,7 @@ bool CHud::m_HideRadar; int32 CHud::m_ClockState; // These aren't really in CHud -float BigMessageInUse[6]; +float CHud::BigMessageInUse[6]; float CHud::BigMessageAlpha[6]; float CHud::BigMessageX[6]; float CHud::OddJob2OffTimer; @@ -128,10 +128,6 @@ uint32 CHud::m_LastTimeEnergyLost; CSprite2d CHud::Sprites[NUM_HUD_SPRITES]; -wchar* CHud::gLastPrintForeverString; - -uint8 CHud::m_HudAlpha = 209; - struct { const char *name; @@ -188,25 +184,24 @@ struct { "", "" }, { "", "" }, { "radardisc", "radardisc" }, - { "radardiscback", "" }, { "", "" }, { "", "" }, { "", "" }, { "", "" }, { "", "" }, - { "bar_inside1dark", "" }, - { "bar_inside2dark", "" }, - { "hudnumbers", "" }, - { "bar_inside1", "" }, - { "bar_inside2", "" }, - { "bar_outline", "" }, + { "", "" }, + { "", "" }, + { "", "" }, + { "", "" }, + { "", "" }, + { "", "" }, + { "", "" }, { "sitesniper", "sitesniperm" }, { "siteM16", "siteM16m" }, { "sitelaser", "sitelaserm" }, { "laserdot", "laserdotm" }, { "viewfinder_128", "viewfinder_128m" }, - { "bleeder", "" }, - { "gren_rem", "noMaskNeeded" } + { "bleeder", "" } }; RwTexture *gpSniperSightTex; @@ -215,7 +210,6 @@ RwTexture *gpLaserSightTex; RwTexture *gpLaserDotTex; RwTexture *gpViewFinderTex; -// TODO(LCS): some things were reversed from LCS but not all void CHud::Draw() { RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST); @@ -408,8 +402,6 @@ void CHud::Draw() DrawMoneyCounter */ - RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR); // TODO(LCS): temp filtering fix for money counter, remove later - wchar sPrint[16]; wchar sPrintIcon[16]; char sTemp[16]; @@ -422,8 +414,25 @@ void CHud::Draw() m_LastDisplayScore = CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney; } if (m_DisplayScoreState != FADED_OUT) { + sprintf(sTemp, "$%08d", CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney); + AsciiToUnicode(sTemp, sPrint); + + CFont::SetPropOff(); + CFont::SetBackgroundOff(); + CFont::SetScale(SCREEN_SCALE_X(HUD_TEXT_SCALE_X), SCREEN_SCALE_Y(HUD_TEXT_SCALE_Y)); + CFont::SetCentreOff(); + CFont::SetRightJustifyOn(); + CFont::SetRightJustifyWrap(0.0f); + CFont::SetBackGroundOnlyTextOff(); + CFont::SetFontStyle(FONT_HEADING); + CFont::SetPropOff(); + CFont::SetDropShadowPosition(2); + CFont::SetDropColor(CRGBA(0, 0, 0, alpha)); + MONEY_COLOR.a = alpha; + CFont::SetColor(MONEY_COLOR); + if (FrontEndMenuManager.m_PrefsShowHud) { - DrawCash(); + CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(110.0f), SCREEN_SCALE_Y(43.0f), sPrint); } } @@ -436,23 +445,46 @@ void CHud::Draw() alpha = CHud::DrawFadeState(HUD_WEAPON_FADING, 1); m_LastWeapon = playerPed->GetWeapon()->m_eWeaponType; } - alpha = Min(alpha, m_HudAlpha); if (m_WeaponState != FADED_OUT) { CWeapon *weapon = playerPed->GetWeapon(); + int32 AmmoAmount = CWeaponInfo::GetWeaponInfo((eWeaponType)WeaponType)->m_nAmountofAmmunition; + int32 AmmoInClip = weapon->m_nAmmoInClip; + int32 TotalAmmo = weapon->m_nAmmoTotal; + int32 Ammo, Clip; + + if (AmmoAmount <= 1 || AmmoAmount >= 1000) + sprintf(sTemp, "%d", TotalAmmo); + else { + if (WeaponType == WEAPONTYPE_FLAMETHROWER) { + Clip = AmmoInClip / 10; + + Ammo = Min((TotalAmmo - AmmoInClip) / 10, 9999); + } else { + Clip = AmmoInClip; + + Ammo = Min(TotalAmmo - AmmoInClip, 9999); + } + + sprintf(sTemp, "%d-%d", Ammo, Clip); + } + + AsciiToUnicode(sTemp, sPrint); CWeaponInfo *weaponInfo = CWeaponInfo::GetWeaponInfo((eWeaponType)WeaponType); /* DrawWeaponIcon */ if (FrontEndMenuManager.m_PrefsShowHud) { - float right = FrontEndMenuManager.m_PrefsUseWideScreen ? 468.6f : 470.0f; - float left = right - (FrontEndMenuManager.m_PrefsUseWideScreen ? 48.6f : 54.0f); if (weaponInfo->m_nModelId <= 0) { RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR); if (FrontEndMenuManager.m_PrefsShowHud) Sprites[WeaponType].Draw( - CRect(PSP_SCREEN_SCALE_X(left), PSP_SCREEN_SCALE_Y(16.0f), PSP_SCREEN_SCALE_X(right), PSP_SCREEN_SCALE_Y(60.0f)), - CRGBA(255, 255, 255, alpha)); + CRect(SCREEN_SCALE_FROM_RIGHT(99.0f), SCREEN_SCALE_Y(27.0f), SCREEN_SCALE_FROM_RIGHT(35.0f), SCREEN_SCALE_Y(91.0f)), + CRGBA(255, 255, 255, alpha), + 0.015f, 0.015f, + 1.0f, 0.0f, + 0.015f, 1.0f, + 1.0f, 1.0f); } else { CBaseModelInfo *weaponModel = CModelInfo::GetModelInfo(weaponInfo->m_nModelId); RwTexDictionary *weaponTxd = CTxdStore::GetSlot(weaponModel->GetTxdSlot())->texDict; @@ -472,8 +504,12 @@ void CHud::Draw() static CSprite2d sprite; sprite.m_pTexture = weaponIcon; sprite.Draw( - CRect(PSP_SCREEN_SCALE_X(left), PSP_SCREEN_SCALE_Y(16.0f), PSP_SCREEN_SCALE_X(right), PSP_SCREEN_SCALE_Y(60.0f)), - CRGBA(255, 255, 255, alpha)); + CRect(SCREEN_SCALE_FROM_RIGHT(99.0f), SCREEN_SCALE_Y(27.0f), SCREEN_SCALE_FROM_RIGHT(35.0f), SCREEN_SCALE_Y(91.0f)), + CRGBA(255, 255, 255, alpha), + 0.015f, 0.015f, + 1.0f, 0.0f, + 0.015f, 1.0f, + 1.0f, 1.0f); sprite.m_pTexture = nil; #endif } @@ -481,7 +517,7 @@ void CHud::Draw() } CFont::SetBackgroundOff(); - CFont::SetScale(PSP_SCREEN_SCALE_X(FrontEndMenuManager.m_PrefsUseWideScreen ? 0.18f : 0.2f), PSP_SCREEN_SCALE_Y(0.44f)); + CFont::SetScale(SCREEN_SCALE_X(0.5f), SCREEN_SCALE_Y(0.8f)); CFont::SetJustifyOff(); CFont::SetCentreOn(); CFont::SetCentreSize(SCREEN_STRETCH_X(DEFAULT_SCREEN_WIDTH)); @@ -489,65 +525,13 @@ void CHud::Draw() CFont::SetDropShadowPosition(0); CFont::SetFontStyle(FONT_STANDARD); - int32 AmmoAmount = CWeaponInfo::GetWeaponInfo((eWeaponType)WeaponType)->m_nAmountofAmmunition; - int32 AmmoInClip = weapon->m_nAmmoInClip; - int32 TotalAmmo = weapon->m_nAmmoTotal; - int32 Ammo, Clip; - if (Min(9999, TotalAmmo - AmmoInClip) != 9999 && !CDarkel::FrenzyOnGoing() && weaponInfo->m_nWeaponSlot > 1 && weapon->m_eWeaponType != WEAPONTYPE_DETONATOR) { CFont::SetDropShadowPosition(2); CFont::SetDropColor(CRGBA(0, 0, 0, alpha)); AMMO_COLOR.a = alpha; CFont::SetColor(AMMO_COLOR); - if (FrontEndMenuManager.m_PrefsShowHud) { - - - if (AmmoAmount <= 1 || AmmoAmount >= 1000) - { - sprintf(sTemp, "%d", TotalAmmo); - AsciiToUnicode(sTemp, sPrint); - float pos = 435.0f; -#ifdef FIX_BUGS - if (FrontEndMenuManager.m_PrefsUseWideScreen) - pos = 438.0f; -#endif - CFont::PrintString(PSP_SCREEN_SCALE_FROM_RIGHT(PSP_DEFAULT_SCREEN_WIDTH - pos), PSP_SCREEN_SCALE_Y(42.0f), sPrint); - } - else { - - if (WeaponType == WEAPONTYPE_FLAMETHROWER) { - Clip = AmmoInClip / 10; - - Ammo = Min((TotalAmmo - AmmoInClip) / 10, 9999); - } - else { - Clip = AmmoInClip; - - Ammo = Min(TotalAmmo - AmmoInClip, 9999); - } - - char sMinus[10]; - char sAmmo[20]; - char sClip[20]; - - sprintf(sMinus, "-"); - sprintf(sAmmo, "%d", Ammo); - sprintf(sClip, "%d", Clip); - - CFont::SetCentreOff(); - CFont::SetRightJustifyOn(); - AsciiToUnicode(sAmmo, sPrint); - CFont::PrintString(PSP_SCREEN_SCALE_FROM_RIGHT(PSP_DEFAULT_SCREEN_WIDTH - (FrontEndMenuManager.m_PrefsUseWideScreen ? 438.0f : 435.0f)), PSP_SCREEN_SCALE_Y(42.0f), sPrint); - - CFont::SetRightJustifyOff(); - AsciiToUnicode(sMinus, sPrint); - CFont::PrintString(PSP_SCREEN_SCALE_FROM_RIGHT(PSP_DEFAULT_SCREEN_WIDTH - (FrontEndMenuManager.m_PrefsUseWideScreen ? 439.0f : 436.0f)), PSP_SCREEN_SCALE_Y(42.0f), sPrint); - - AsciiToUnicode(sClip, sPrint); - CFont::PrintString(PSP_SCREEN_SCALE_FROM_RIGHT(PSP_DEFAULT_SCREEN_WIDTH - (FrontEndMenuManager.m_PrefsUseWideScreen ? 441.0f : 439.0f)), PSP_SCREEN_SCALE_Y(42.0f), sPrint); - - } - } + if (FrontEndMenuManager.m_PrefsShowHud) + CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(66.0f), SCREEN_SCALE_Y(90.0f), sPrint); CFont::SetDropShadowPosition(0); } } @@ -581,8 +565,23 @@ void CHud::Draw() && CTimer::GetFrameCounter() & 8) { if (playerPed->m_fHealth >= 10 || playerPed->m_fHealth < 10 && CTimer::GetFrameCounter() & 8) { + + AsciiToUnicode("{", sPrintIcon); +#ifdef FIX_BUGS + sprintf(sTemp, "%03d", int32(playerPed->m_fHealth + 0.5f)); +#else + sprintf(sTemp, "%03d", (int32)playerPed->m_fHealth); +#endif + AsciiToUnicode(sTemp, sPrint); + + CFont::SetColor(HEALTH_COLOR); if (FrontEndMenuManager.m_PrefsShowHud) { - DrawHealthBar(playerPed->m_fHealth); + CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(110.0f), SCREEN_SCALE_Y(65.0f), sPrint); + + if (!CWorld::Players[CWorld::PlayerInFocus].m_nTimeLastHealthLoss || CTimer::GetTimeInMilliseconds() > CWorld::Players[CWorld::PlayerInFocus].m_nTimeLastHealthLoss + 2000 || CTimer::GetFrameCounter() & 4) { + // CFont::SetColor(HEALTH_COLOR); + CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(110.0f + 54.0f), SCREEN_SCALE_Y(65.0f), sPrintIcon); + } } } } @@ -603,7 +602,13 @@ void CHud::Draw() CFont::SetColor(ARMOUR_COLOR); if (FrontEndMenuManager.m_PrefsShowHud) { - DrawArmourBar(playerPed->m_fArmour); + + CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(182.0f), SCREEN_SCALE_Y(65.0f), sPrint); + + if (!CWorld::Players[CWorld::PlayerInFocus].m_nTimeLastArmourLoss || CTimer::GetTimeInMilliseconds() > CWorld::Players[CWorld::PlayerInFocus].m_nTimeLastArmourLoss + 2000 || CTimer::GetFrameCounter() & 4) { + // CFont::SetColor(ARMOUR_COLOR); + CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(182.0f + 52.0f), SCREEN_SCALE_Y(65.0f), sPrintIcon); + } } } } @@ -620,23 +625,36 @@ void CHud::Draw() } if (m_WantedState != FADED_OUT) { - char wantedStar[] = "\x16"; - float starX = 441.0f; + CFont::SetBackgroundOff(); + CFont::SetScale(SCREEN_SCALE_X(HUD_TEXT_SCALE_X), SCREEN_SCALE_Y(HUD_TEXT_SCALE_Y)); + CFont::SetJustifyOff(); + CFont::SetCentreOff(); + CFont::SetRightJustifyOn(); + CFont::SetPropOn(); + CFont::SetFontStyle(FONT_STANDARD); + + AsciiToUnicode(">", sPrintIcon); + for (int i = 0; i < 6; i++) { if (FrontEndMenuManager.m_PrefsShowHud) { if (playerPed->m_pWanted->GetWantedLevel() > i && (CTimer::GetTimeInMilliseconds() > playerPed->m_pWanted->m_nLastWantedLevelChange + 2000 || CTimer::GetFrameCounter() & 4)) { - DrawTimeAndCashNumbers(wantedStar, starX, 63.0f, false); + WANTED_COLOR.a = alpha; + CFont::SetColor(WANTED_COLOR); + CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(110.0f + 23.0f * i), SCREEN_SCALE_Y(87.0f), sPrintIcon); } else if (playerPed->m_pWanted->m_nMinWantedLevel > i && CTimer::GetFrameCounter() & 4) { - DrawTimeAndCashNumbers(wantedStar, starX, 63.0f, true); + WANTED_COLOR_FLASH.a = alpha; + CFont::SetColor(WANTED_COLOR_FLASH); + CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(110.0f + 23.0f * i), SCREEN_SCALE_Y(87.0f), sPrintIcon); + + } else if (playerPed->m_pWanted->GetWantedLevel() <= i) { + NOTWANTED_COLOR.a = alpha; + CFont::SetColor(NOTWANTED_COLOR); + CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(110.0f + 23.0f * i), SCREEN_SCALE_Y(87.0f), sPrintIcon); } - if (FrontEndMenuManager.m_PrefsUseWideScreen) - starX -= 11.0f; - else - starX -= 13.5f; } } } @@ -764,14 +782,14 @@ void CHud::Draw() CFont::SetPropOn(); CFont::SetBackgroundOff(); - if (FrontEndMenuManager.m_PrefsUseWideScreen) - CFont::SetScale(PSP_SCREEN_SCALE_X(0.42768f), PSP_SCREEN_SCALE_Y(0.88f)); + if (FrontEndMenuManager.m_PrefsLanguage == CMenuManager::LANGUAGE_SPANISH) + CFont::SetScale(SCREEN_SCALE_X(1.7f * 0.8f), SCREEN_SCALE_Y(1.8f)); else - CFont::SetScale(PSP_SCREEN_SCALE_X(0.4752f), PSP_SCREEN_SCALE_Y(0.88f)); + CFont::SetScale(SCREEN_SCALE_X(1.7f), SCREEN_SCALE_Y(1.8f)); + + CFont::SetSlantRefPoint(SCREEN_SCALE_FROM_RIGHT(32.0f), SCREEN_SCALE_FROM_BOTTOM(128.0f)); + CFont::SetSlant(0.15f); - //CFont::SetSlantRefPoint(SCREEN_SCALE_FROM_RIGHT(32.0f), SCREEN_SCALE_FROM_BOTTOM(128.0f)); - //CFont::SetSlant(0.15f); - CFont::SetWrapx(SCREEN_WIDTH); CFont::SetRightJustifyOn(); CFont::SetRightJustifyWrap(0.0f); CFont::SetBackGroundOnlyTextOff(); @@ -781,9 +799,9 @@ void CHud::Draw() CFont::SetColor(CRGBA(ZONE_COLOR.r, ZONE_COLOR.g, ZONE_COLOR.b, fZoneAlpha)); if (!CTheScripts::bPlayerIsInTheStatium) - CFont::PrintStringFromBottom(PSP_SCREEN_SCALE_FROM_RIGHT(24.0f), PSP_SCREEN_SCALE_FROM_BOTTOM(16.0f), m_ZoneToPrint); + CFont::PrintStringFromBottom(SCREEN_SCALE_FROM_RIGHT(32.0f), SCREEN_SCALE_FROM_BOTTOM(128.0f), m_ZoneToPrint); - //CFont::SetSlant(0.f); + CFont::SetSlant(0.f); } else { m_ZoneState = 3; } @@ -864,14 +882,13 @@ void CHud::Draw() CFont::SetPropOn(); CFont::SetBackgroundOff(); - if (FrontEndMenuManager.m_PrefsUseWideScreen) - CFont::SetScale(PSP_SCREEN_SCALE_X(0.42768f), PSP_SCREEN_SCALE_Y(0.88f)); + if (FrontEndMenuManager.m_PrefsLanguage != CMenuManager::LANGUAGE_ITALIAN && FrontEndMenuManager.m_PrefsLanguage != CMenuManager::LANGUAGE_SPANISH) + CFont::SetScale(SCREEN_SCALE_X(1.7f), SCREEN_SCALE_Y(1.8f)); else - CFont::SetScale(PSP_SCREEN_SCALE_X(0.4752f), PSP_SCREEN_SCALE_Y(0.88f)); + CFont::SetScale(SCREEN_SCALE_X(1.7f * 0.85f), SCREEN_SCALE_Y(1.8f)); - CFont::SetWrapx(SCREEN_WIDTH); - CFont::SetSlantRefPoint(PSP_SCREEN_SCALE_FROM_RIGHT(24.0f), PSP_SCREEN_SCALE_FROM_BOTTOM(35.6f)); - CFont::SetSlant(0.f); + CFont::SetSlantRefPoint(SCREEN_SCALE_FROM_RIGHT(32.0f), SCREEN_SCALE_FROM_BOTTOM(105.0f)); + CFont::SetSlant(0.15f); CFont::SetRightJustifyOn(); CFont::SetRightJustifyWrap(0.0f); @@ -881,7 +898,7 @@ void CHud::Draw() CFont::SetColor(CRGBA(VEHICLE_COLOR.r, VEHICLE_COLOR.g, VEHICLE_COLOR.b, fVehicleAlpha)); CFont::SetDropColor(CRGBA(0, 0, 0, fVehicleAlpha)); - CFont::PrintStringFromBottom(PSP_SCREEN_SCALE_FROM_RIGHT(24.0f), PSP_SCREEN_SCALE_FROM_BOTTOM(35.6f), m_pVehicleNameToPrint); + CFont::PrintStringFromBottom(SCREEN_SCALE_FROM_RIGHT(32.0f), SCREEN_SCALE_FROM_BOTTOM(105.0f), m_pVehicleNameToPrint); CFont::SetSlant(0.f); } @@ -898,8 +915,24 @@ void CHud::Draw() DrawClock */ if (m_ClockState) { + CFont::SetJustifyOff(); + CFont::SetCentreOff(); + CFont::SetBackgroundOff(); + CFont::SetScale(SCREEN_SCALE_X(HUD_TEXT_SCALE_X), SCREEN_SCALE_Y(HUD_TEXT_SCALE_Y)); + CFont::SetBackGroundOnlyTextOff(); + CFont::SetPropOff(); + CFont::SetFontStyle(FONT_HEADING); + CFont::SetRightJustifyOn(); + CFont::SetRightJustifyWrap(0.0f); + CFont::SetDropShadowPosition(2); + CFont::SetDropColor(CRGBA(0, 0, 0, 255)); + + sprintf(sTemp, "%02d:%02d", CClock::GetHours(), CClock::GetMinutes()); + AsciiToUnicode(sTemp, sPrint); + + CFont::SetColor(CLOCK_COLOR); if (FrontEndMenuManager.m_PrefsShowHud) - DrawTime(); + CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(111.0f), SCREEN_SCALE_Y(22.0f), sPrint); } /* @@ -1166,7 +1199,7 @@ void CHud::Draw() onceItWasWidescreen = false; CFont::DrawFonts(); - CFont::SetDropShadowPosition(0); + CFont::SetDropShadowPosition(2); CFont::SetDropColor(CRGBA(0, 0, 0, 255)); CFont::SetScale(SCREEN_SCALE_X(0.58f), SCREEN_SCALE_Y(1.22f)); @@ -1392,221 +1425,6 @@ void CHud::Draw() } } -int HealthFlashTimer = 50; - -void -CHud::DrawHealthBar(int16 value) -{ - if (m_ItemToFlash == ITEM_HEALTH) { - if (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fHealth > 10.0f) { - if (HealthFlashTimer-- == 0) { - m_ItemToFlash = -1; - HealthFlashTimer = 50; - } - } - } - float fHealth = value; - float fMaxHealth = CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth; - fHealth = clamp(fHealth, 0.0f, fMaxHealth); - float fWidth = (fHealth / fMaxHealth) * 40.0f + 16.0f + 4.0f; - float u = fWidth / 64.0f; - if (value == 0) { - fWidth = 0.0f; - u = 0.0f; - } else if (value == fMaxHealth) { - fWidth = 64.0f; - u = 1.0f; - } - - if (FrontEndMenuManager.m_PrefsUseWideScreen) - fWidth *= 0.68f; - else - fWidth *= 0.85f; - - float fX1 = FrontEndMenuManager.m_PrefsUseWideScreen ? 375.0f : 360.0f; - float fX2 = fWidth + (FrontEndMenuManager.m_PrefsUseWideScreen ? 375.0f : 360.0f); - CRect rect1(PSP_SCREEN_SCALE_X(fX1), PSP_SCREEN_SCALE_Y(40.0f), PSP_SCREEN_SCALE_X(fX2), PSP_SCREEN_SCALE_Y(50.0f)); - CRGBA color1(255, 255, 255, m_HudAlpha); - Sprites[HUD_BAR_INSIDE2].Draw(rect1, color1, 0.0f, 0.0f, u, 0.0f, 0.0f, 1.0f, u, 1.0f); - - fX1 = fWidth + (FrontEndMenuManager.m_PrefsUseWideScreen ? 375.0f : 360.0f); - fX2 = (FrontEndMenuManager.m_PrefsUseWideScreen ? 43.52f : 54.4f) + (FrontEndMenuManager.m_PrefsUseWideScreen ? 375.0f : 360.0f); - CRect rect2(PSP_SCREEN_SCALE_X(fX1), PSP_SCREEN_SCALE_Y(40.0f), PSP_SCREEN_SCALE_X(fX2), PSP_SCREEN_SCALE_Y(50.0f)); - CRGBA color2(255, 255, 255, m_HudAlpha); - Sprites[HUD_BAR_INSIDE2DARK].Draw(rect2, color2, u, 0.0f, 1.0f, 0.0f, u, 1.0f, 1.0f, 1.0f); - - fX1 = FrontEndMenuManager.m_PrefsUseWideScreen ? 375.0f : 360.0f; - fX2 = (FrontEndMenuManager.m_PrefsUseWideScreen ? 43.52f : 54.4f) + (FrontEndMenuManager.m_PrefsUseWideScreen ? 375.0f : 360.0f); - CRect rect3(PSP_SCREEN_SCALE_X(fX1), PSP_SCREEN_SCALE_Y(40.0f), PSP_SCREEN_SCALE_X(fX2), PSP_SCREEN_SCALE_Y(50.0f)); - CRGBA color3(255, 255, 255, m_HudAlpha); - Sprites[HUD_BAR_OUTLINE].Draw(rect3, color3, 0.01f, 0.0f, 1.0f, 0.0f, 0.01f, 1.0f, 1.0f, 1.0f); - - if (fMaxHealth > 100.0f) - { - CFont::SetFontStyle(FONT_STANDARD); - CFont::SetDropShadowPosition(0); - CFont::SetDropColor(CRGBA(0, 0, 0, m_HudAlpha)); - CFont::SetColor(CRGBA(255, 255, 255, m_HudAlpha)); - CFont::SetCentreOn(); - if (fMaxHealth > 125.0f) - CFont::SetScale(FrontEndMenuManager.StretchX(PSP_SCALE_TO_PS2_X(FrontEndMenuManager.m_PrefsUseWideScreen ? 0.3375f : 0.45f)), FrontEndMenuManager.StretchY(PSP_SCALE_TO_PS2_Y(0.75f))); - else - CFont::SetScale(FrontEndMenuManager.StretchX(PSP_SCALE_TO_PS2_X(FrontEndMenuManager.m_PrefsUseWideScreen ? 0.2625f : 0.35f)), FrontEndMenuManager.StretchY(PSP_SCALE_TO_PS2_Y(0.6f))); - - if (FrontEndMenuManager.m_PrefsUseWideScreen) - fX1 = 375.0f + 12.0f; - else - fX1 = 360.0f + 15.0f; - CFont::PrintString(PSP_SCREEN_SCALE_X(fX1), PSP_SCREEN_SCALE_Y(36.0f), (wchar*)L"+"); - } - -} - -int ArmourFlashTimer = 50; - -void -CHud::DrawArmourBar(int16 value) -{ - if (m_ItemToFlash == ITEM_ARMOUR) { - if (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fArmour > 10.0f) { - if (ArmourFlashTimer-- == 0) { - m_ItemToFlash = -1; - ArmourFlashTimer = 50; - } - } - } - float fArmour = value; - float fMaxArmour = CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour; - fArmour = clamp(fArmour, 0.0f, fMaxArmour); - float fWidth = (fArmour / fMaxArmour) * 40.0f + 16.0f + 4.0f; - float u = fWidth / 64.0f; - if (value == 0) { - fWidth = 0.0f; - u = 0.0f; - } else if (value == fMaxArmour) { - fWidth = 64.0f; - u = 1.0f; - } - - if (FrontEndMenuManager.m_PrefsUseWideScreen) - fWidth *= 0.68f; - else - fWidth *= 0.85f; - - float fX1 = FrontEndMenuManager.m_PrefsUseWideScreen ? 375.0f : 360.0f; - float fX2 = fWidth + (FrontEndMenuManager.m_PrefsUseWideScreen ? 375.0f : 360.0f); - CRect rect1(PSP_SCREEN_SCALE_X(fX1), PSP_SCREEN_SCALE_Y(28.0f), PSP_SCREEN_SCALE_X(fX2), PSP_SCREEN_SCALE_Y(38.0f)); - CRGBA color1(255, 255, 255, m_HudAlpha); - Sprites[HUD_BAR_INSIDE1].Draw(rect1, color1, 0.0f, 0.0f, u, 0.0f, 0.0f, 1.0f, u, 1.0f); - - fX1 = fWidth + (FrontEndMenuManager.m_PrefsUseWideScreen ? 375.0f : 360.0f); - fX2 = (FrontEndMenuManager.m_PrefsUseWideScreen ? 43.52f : 54.4f) + (FrontEndMenuManager.m_PrefsUseWideScreen ? 375.0f : 360.0f); - CRect rect2(PSP_SCREEN_SCALE_X(fX1), PSP_SCREEN_SCALE_Y(28.0f), PSP_SCREEN_SCALE_X(fX2), PSP_SCREEN_SCALE_Y(38.0f)); - CRGBA color2(255, 255, 255, m_HudAlpha); - Sprites[HUD_BAR_INSIDE1DARK].Draw(rect2, color2, u, 0.0f, 1.0f, 0.0f, u, 1.0f, 1.0f, 1.0f); - - fX1 = FrontEndMenuManager.m_PrefsUseWideScreen ? 375.0f : 360.0f; - fX2 = (FrontEndMenuManager.m_PrefsUseWideScreen ? 43.52f : 54.4f) + (FrontEndMenuManager.m_PrefsUseWideScreen ? 375.0f : 360.0f); - CRect rect3(PSP_SCREEN_SCALE_X(fX1), PSP_SCREEN_SCALE_Y(28.0f), PSP_SCREEN_SCALE_X(fX2), PSP_SCREEN_SCALE_Y(38.0f)); - CRGBA color3(255, 255, 255, m_HudAlpha); - Sprites[HUD_BAR_OUTLINE].Draw(rect3, color3, 0.01f, 0.0f, 1.0f, 0.0f, 0.01f, 1.0f, 1.0f, 1.0f); - - if (fMaxArmour > 100.0f) { - CFont::SetFontStyle(FONT_STANDARD); - CFont::SetDropShadowPosition(0); - CFont::SetDropColor(CRGBA(0, 0, 0, m_HudAlpha)); - CFont::SetColor(CRGBA(255, 255, 255, m_HudAlpha)); - CFont::SetCentreOn(); - if (fMaxArmour > 125.0f) - CFont::SetScale(FrontEndMenuManager.StretchX(PSP_SCALE_TO_PS2_X(FrontEndMenuManager.m_PrefsUseWideScreen ? 0.3375f : 0.45f)), FrontEndMenuManager.StretchY(PSP_SCALE_TO_PS2_Y(0.75f))); - else - CFont::SetScale(FrontEndMenuManager.StretchX(PSP_SCALE_TO_PS2_X(FrontEndMenuManager.m_PrefsUseWideScreen ? 0.2625f : 0.35f)), FrontEndMenuManager.StretchY(PSP_SCALE_TO_PS2_Y(0.6f))); - - if (FrontEndMenuManager.m_PrefsUseWideScreen) - fX1 = 375.0f + 12.0f; - else - fX1 = 360.0f + 15.0f; - CFont::PrintString(PSP_SCREEN_SCALE_X(fX1), PSP_SCREEN_SCALE_Y(24.0f), (wchar*)L"+"); - } - -} - -void -CHud::DrawTimeAndCashNumbers(char *str, float x, float y, bool secondSet) -{ - CRGBA color(255, 255, 255, m_HudAlpha); - - float width = 11.0f; - if (FrontEndMenuManager.m_PrefsUseWideScreen) - width = 9.0f; - - float height = 10.0f; - while (*str) { - uint8 c = *str; - if (c >= '0' && c <= ':') - { - if (secondSet) c -= '%'; - else c -= '0'; - } else { - if (c == 22) { - if (secondSet) - color = CRGBA(62, 141, 188, m_HudAlpha); - else - color = CRGBA(192, 155, 54, m_HudAlpha); - } else if (!secondSet) - c = 10; - else - c = 21; - } - - int row = c / 8; - int col = c - row * 8; - float width2 = width; - if (c == 22) - width2 += 3.0f; - CRect rect(PSP_SCREEN_SCALE_X(x), PSP_SCREEN_SCALE_Y(y), PSP_SCREEN_SCALE_X(x+ width2), PSP_SCREEN_SCALE_Y(y) + PSP_SCREEN_SCALE_Y(height)); - - float u = col * 0.125f; - // TODO(LCS): some odd calculation with u going on in here if it's < 0, it might be fabs, but maybe not - - float v = row * 0.265625f; - // TODO(LCS): same odd calculation with v as above - - str++; - Sprites[HUD_HUDNUMBERS].Draw(rect, color, u, v, u + 0.125f, v, u, v + 0.265625f, u + 0.125f, v + 0.265625f); - - x += (width - 2.0f); - if (c == 10) - x -= 4.0f; - -#ifdef GTA_PSP - x = Ceil(PSP_SCREEN_SCALE_X(x)) * ((float)PSP_DEFAULT_SCREEN_WIDTH / (float)SCREEN_WIDTH); -#else - // BUG: actually above wasn't PSP only but on higher resolutions things don't look like they were meant to, so we stick with PS2 version here - x = Ceil(PSP_SCALE_TO_PS2_X(x)) * ((float)PSP_DEFAULT_SCREEN_WIDTH / (float)DEFAULT_SCREEN_WIDTH); -#endif - } -} - -void -CHud::DrawCash() -{ - char str[200]; - sprintf(str, "$%08d", CWorld::Players[CWorld::PlayerInFocus].m_nMoney); - DrawTimeAndCashNumbers(str, FrontEndMenuManager.m_PrefsUseWideScreen ? 386.0f : 373.0f, 53.0f, true); -} - -void -CHud::DrawTime() -{ - // TODO(LCS): a lot more code should be here - - char str[24]; - sprintf(str, "%02d:%02d", CClock::ms_nGameClockHours, CClock::ms_nGameClockMinutes); - DrawTimeAndCashNumbers(str, FrontEndMenuManager.m_PrefsUseWideScreen ? 386.0f : 373.0f, 17.0f, false); -} - - void CHud::DrawAfterFade() { RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST); @@ -2262,4 +2080,4 @@ CHud::ResetWastedText(void) BigMessageInUse[0] = 0.0f; m_BigMessage[2][0] = 0; m_BigMessage[0][0] = 0; -} \ No newline at end of file +} diff --git a/src/render/Hud.h b/src/render/Hud.h index 4ae3688..a4b9609 100644 --- a/src/render/Hud.h +++ b/src/render/Hud.h @@ -38,23 +38,15 @@ enum eSprites HUD_FIST, HUD_SITEROCKET = 41, HUD_RADARDISC = 50, - HUD_BAR_INSIDE1DARK = 57, - HUD_BAR_INSIDE2DARK, - HUD_HUDNUMBERS, - HUD_BAR_INSIDE1, - HUD_BAR_INSIDE2, - HUD_BAR_OUTLINE, - HUD_SITESNIPER, + HUD_SITESNIPER = 63, HUD_SITEM16, HUD_SITELASER, HUD_LASERDOT, HUD_VIEWFINDER, HUD_BLEEDER, - NUM_HUD_SPRITES = 70, + NUM_HUD_SPRITES = 69, }; -extern float BigMessageInUse[6]; - class CHud { public: @@ -90,6 +82,7 @@ public: static int32 m_ClockState; // These aren't really in CHud + static float BigMessageInUse[6]; static float BigMessageAlpha[6]; static float BigMessageX[6]; static float OddJob2OffTimer; @@ -124,9 +117,6 @@ public: static uint32 m_LastWeapon; static uint32 m_LastTimeEnergyLost; - static wchar* gLastPrintForeverString; - static uint8 m_HudAlpha; - public: static void Draw(); static void DrawAfterFade(); @@ -146,9 +136,4 @@ public: static void Shutdown(); static float DrawFadeState(DRAW_FADE_STATE, int); static void ResetWastedText(void); - static void DrawHealthBar(int16 value); - static void DrawArmourBar(int16 value); - static void DrawTimeAndCashNumbers(char *str, float x, float y, bool secondSet); - static void DrawCash(); - static void DrawTime(); }; diff --git a/src/render/MBlur.cpp b/src/render/MBlur.cpp index ab77bf9..9f5122d 100644 --- a/src/render/MBlur.cpp +++ b/src/render/MBlur.cpp @@ -6,6 +6,7 @@ #include #endif +#include "main.h" #include "General.h" #include "RwHelper.h" #include "Camera.h" @@ -333,6 +334,7 @@ CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, u #ifdef EXTENDED_COLOURFILTER CPostFX::Render(cam, red, green, blue, blur, type, bluralpha); #else + PUSH_RENDERGROUP("CMBlur::MotionBlurRender"); RwRGBA color = { (RwUInt8)red, (RwUInt8)green, (RwUInt8)blue, (RwUInt8)blur }; #ifdef GTA_PS2 if( pFrontBuffer ) @@ -348,6 +350,7 @@ CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, u RwRasterPopContext(); } #endif + POP_RENDERGROUP(); #endif } @@ -590,8 +593,6 @@ CMBlur::AddRenderFx(RwCamera *cam, RwRect *rect, float z, FxType type) void CMBlur::OverlayRenderFx(RwCamera *cam, RwRaster *frontBuf) { - //TODO(LCS) -#if 0 bool drawWaterDrops = false; RwIm2DVertex verts[4]; int red = (0.75f*CTimeCycle::GetDirectionalRed() + CTimeCycle::GetAmbientRed())*0.55f * 255; @@ -797,5 +798,4 @@ CMBlur::OverlayRenderFx(RwCamera *cam, RwRaster *frontBuf) RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); pBufVertCount = 0; -#endif } diff --git a/src/render/Particle.cpp b/src/render/Particle.cpp index 3ce0063..14b4824 100644 --- a/src/render/Particle.cpp +++ b/src/render/Particle.cpp @@ -1,5 +1,6 @@ #include "common.h" +#include "main.h" #include "General.h" #include "Timer.h" #include "TxdStore.h" @@ -12,7 +13,6 @@ #include "Replay.h" #include "Stats.h" #include "Weather.h" -#include "WaterLevel.h" #include "MBlur.h" #include "main.h" #include "AudioScriptObject.h" @@ -212,6 +212,7 @@ RwRaster *gpRainDropRaster; RwTexture *gpSparkTex; RwTexture *gpNewspaperTex; RwTexture *gpGunSmokeTex; +RwTexture *gpDotTex; RwTexture *gpHeatHazeTex; RwTexture *gpBeastieTex; RwTexture *gpRainDripTex[MAX_RAINDRIP_FILES]; @@ -220,30 +221,34 @@ RwTexture *gpRainDripDarkTex[MAX_RAINDRIP_FILES]; RwRaster *gpSparkRaster; RwRaster *gpNewspaperRaster; RwRaster *gpGunSmokeRaster; +RwRaster *gpDotRaster; RwRaster *gpHeatHazeRaster; RwRaster *gpBeastieRaster; RwRaster *gpRainDripRaster[MAX_RAINDRIP_FILES]; RwRaster *gpRainDripDarkRaster[MAX_RAINDRIP_FILES]; -RwTexture *gpFireHoseTex; -RwRaster *gpFireHoseRaster; - -RwTexture *gpMultiPlayerHitTex; -RwRaster *gpMultiPlayerHitRaster; - float CParticle::ms_afRandTable[CParticle::RAND_TABLE_SIZE]; CParticle *CParticle::m_pUnusedListHead; float CParticle::m_SinTable[CParticle::SIN_COS_TABLE_SIZE]; float CParticle::m_CosTable[CParticle::SIN_COS_TABLE_SIZE]; int32 Randomizer; +int32 nParticleCreationInterval = 1; float PARTICLE_WIND_TEST_SCALE = 0.002f; +float fParticleScaleLimit = 0.5f; + +bool clearWaterDrop; +int32 numWaterDropOnScreen; #ifdef DEBUGMENU SETTWEAKPATH("Particle"); +TWEAKINT32(nParticleCreationInterval, 0, 5, 1); +TWEAKFLOAT(fParticleScaleLimit, 0.0f, 1.0f, 0.1f); TWEAKFUNC(CParticle::ReloadConfig); #endif + + void CParticle::ReloadConfig() { debug("Initialising CParticleMgr..."); @@ -281,6 +286,14 @@ void CParticle::ReloadConfig() gParticleArray[i].m_nFadeAlphaTimer = 0; + gParticleArray[i].m_nCurrentZRotation = 0; + + gParticleArray[i].m_nZRotationTimer = 0; + + gParticleArray[i].m_fCurrentZRadius = 0.0f; + + gParticleArray[i].m_nZRadiusTimer = 0; + gParticleArray[i].m_nCurrentFrame = 0; gParticleArray[i].m_nAnimationSpeedTimer = 0; @@ -305,7 +318,7 @@ void CParticle::Initialise() } for ( int32 i = 0; i < SIN_COS_TABLE_SIZE; i++ ) - { + { float angle = DEGTORAD(float(i) * float(360.0f / SIN_COS_TABLE_SIZE)); m_SinTable[i] = ::Sin(angle); @@ -320,98 +333,83 @@ void CParticle::Initialise() for ( int32 i = 0; i < MAX_SMOKE_FILES; i++ ) { gpSmokeTex[i] = RwTextureRead(SmokeFiles[i], nil); - ASSERT(gpSmokeTex[i] != nil); gpSmokeRaster[i] = RwTextureGetRaster(gpSmokeTex[i]); } gpSmoke2Tex = RwTextureRead("smokeII_3", nil); - ASSERT(gpSmoke2Tex != nil); gpSmoke2Raster = RwTextureGetRaster(gpSmoke2Tex); for ( int32 i = 0; i < MAX_RUBBER_FILES; i++ ) { gpRubberTex[i] = RwTextureRead(RubberFiles[i], nil); - ASSERT(gpRubberTex[i] != nil); gpRubberRaster[i] = RwTextureGetRaster(gpRubberTex[i]); } for ( int32 i = 0; i < MAX_RAINSPLASH_FILES; i++ ) { gpRainSplashTex[i] = RwTextureRead(RainSplashFiles[i], nil); - ASSERT(gpRainSplashTex[i] != nil); gpRainSplashRaster[i] = RwTextureGetRaster(gpRainSplashTex[i]); } for ( int32 i = 0; i < MAX_WATERSPRAY_FILES; i++ ) { gpWatersprayTex[i] = RwTextureRead(WatersprayFiles[i], nil); - ASSERT(gpWatersprayTex[i] != nil); gpWatersprayRaster[i] = RwTextureGetRaster(gpWatersprayTex[i]); } for ( int32 i = 0; i < MAX_EXPLOSIONMEDIUM_FILES; i++ ) { gpExplosionMediumTex[i] = RwTextureRead(ExplosionMediumFiles[i], nil); - ASSERT(gpExplosionMediumTex[i] != nil); gpExplosionMediumRaster[i] = RwTextureGetRaster(gpExplosionMediumTex[i]); } for ( int32 i = 0; i < MAX_GUNFLASH_FILES; i++ ) { gpGunFlashTex[i] = RwTextureRead(GunFlashFiles[i], nil); - ASSERT(gpGunFlashTex[i] != nil); gpGunFlashRaster[i] = RwTextureGetRaster(gpGunFlashTex[i]); } gpRainDropTex = RwTextureRead("raindrop4", nil); - ASSERT(gpRainDropTex != nil); gpRainDropRaster = RwTextureGetRaster(gpRainDropTex); + for ( int32 i = 0; i < MAX_RAINSPLASHUP_FILES; i++ ) { gpRainSplashupTex[i] = RwTextureRead(RainSplashupFiles[i], nil); - ASSERT(gpRainSplashupTex[i] != nil); gpRainSplashupRaster[i] = RwTextureGetRaster(gpRainSplashupTex[i]); } for ( int32 i = 0; i < MAX_BIRDFRONT_FILES; i++ ) { gpBirdfrontTex[i] = RwTextureRead(BirdfrontFiles[i], nil); - ASSERT(gpBirdfrontTex[i] != nil); gpBirdfrontRaster[i] = RwTextureGetRaster(gpBirdfrontTex[i]); } for ( int32 i = 0; i < MAX_BOAT_FILES; i++ ) { gpBoatTex[i] = RwTextureRead(BoatFiles[i], nil); - ASSERT(gpBoatTex[i] != nil); gpBoatRaster[i] = RwTextureGetRaster(gpBoatTex[i]); } for ( int32 i = 0; i < MAX_CARDEBRIS_FILES; i++ ) { gpCarDebrisTex[i] = RwTextureRead(CardebrisFiles[i], nil); - ASSERT(gpCarDebrisTex[i] != nil); gpCarDebrisRaster[i] = RwTextureGetRaster(gpCarDebrisTex[i]); } for ( int32 i = 0; i < MAX_CARSPLASH_FILES; i++ ) { gpCarSplashTex[i] = RwTextureRead(CarsplashFiles[i], nil); - ASSERT(gpCarSplashTex[i] != nil); gpCarSplashRaster[i] = RwTextureGetRaster(gpCarSplashTex[i]); } gpBoatWakeTex = RwTextureRead("boatwake2", nil); - ASSERT(gpBoatWakeTex != nil); gpBoatWakeRaster = RwTextureGetRaster(gpBoatWakeTex); gpFlame1Tex = RwTextureRead("flame1", nil); - ASSERT(gpFlame1Tex != nil); gpFlame1Raster = RwTextureGetRaster(gpFlame1Tex); gpFlame5Tex = RwTextureRead("flame5", nil); - ASSERT(gpFlame5Tex != nil); //#ifdef FIX_BUGS #if 0 @@ -422,92 +420,70 @@ void CParticle::Initialise() #endif gpRainDropSmallTex = RwTextureRead("rainsmall", nil); - ASSERT(gpRainDropSmallTex != nil); gpRainDropSmallRaster = RwTextureGetRaster(gpRainDropSmallTex); gpBloodTex = RwTextureRead("blood", nil); - ASSERT(gpBloodTex != nil); gpBloodRaster = RwTextureGetRaster(gpBloodTex); gpLeafTex[0] = RwTextureRead("gameleaf01_64", nil); - ASSERT(gpLeafTex[0] != nil); gpLeafRaster[0] = RwTextureGetRaster(gpLeafTex[0]); gpLeafTex[1] = RwTextureRead("letter", nil); - ASSERT(gpLeafTex[1] != nil); gpLeafRaster[1] = RwTextureGetRaster(gpLeafTex[1]); gpCloudTex1 = RwTextureRead("cloud3", nil); - ASSERT(gpCloudTex1 != nil); gpCloudRaster1 = RwTextureGetRaster(gpCloudTex1); gpCloudTex4 = RwTextureRead("cloudmasked", nil); - ASSERT(gpCloudTex4 != nil); gpCloudRaster4 = RwTextureGetRaster(gpCloudTex4); gpBloodSmallTex = RwTextureRead("bloodsplat2", nil); - ASSERT(gpBloodSmallTex != nil); gpBloodSmallRaster = RwTextureGetRaster(gpBloodSmallTex); gpGungeTex = RwTextureRead("gunge", nil); - ASSERT(gpGungeTex != nil); gpGungeRaster = RwTextureGetRaster(gpGungeTex); gpCollisionSmokeTex = RwTextureRead("collisionsmoke", nil); - ASSERT(gpCollisionSmokeTex != nil); gpCollisionSmokeRaster = RwTextureGetRaster(gpCollisionSmokeTex); gpBulletHitTex = RwTextureRead("bullethitsmoke", nil); - ASSERT(gpBulletHitTex != nil); gpBulletHitRaster = RwTextureGetRaster(gpBulletHitTex); gpGunShellTex = RwTextureRead("gunshell", nil); - ASSERT(gpGunShellTex != nil); gpGunShellRaster = RwTextureGetRaster(gpGunShellTex); - gpPointlightTex = RwTextureRead("smoke5", nil); - ASSERT(gpPointlightTex != nil); + gpPointlightTex = RwTextureRead("pointlight", nil); gpPointlightRaster = RwTextureGetRaster(gpPointlightTex); gpSparkTex = RwTextureRead("spark", nil); - ASSERT(gpSparkTex != nil); gpSparkRaster = RwTextureGetRaster(gpSparkTex); - gpNewspaperTex = RwTextureRead("ballot_paper", nil); - ASSERT(gpNewspaperTex != nil); + gpNewspaperTex = RwTextureRead("newspaper02_64", nil); gpNewspaperRaster = RwTextureGetRaster(gpNewspaperTex); gpGunSmokeTex = RwTextureRead("gunsmoke3", nil); - ASSERT(gpGunSmokeTex != nil); gpGunSmokeRaster = RwTextureGetRaster(gpGunSmokeTex); + gpDotTex = RwTextureRead("dot", nil); + gpDotRaster = RwTextureGetRaster(gpDotTex); + gpHeatHazeTex = RwTextureRead("heathaze", nil); - ASSERT(gpHeatHazeTex != nil); gpHeatHazeRaster = RwTextureGetRaster(gpHeatHazeTex); gpBeastieTex = RwTextureRead("beastie", nil); - ASSERT(gpBeastieTex != nil); gpBeastieRaster = RwTextureGetRaster(gpBeastieTex); gpRainDripTex[0] = RwTextureRead("raindrip64", nil); - ASSERT(gpRainDripTex[0] != nil); gpRainDripRaster[0] = RwTextureGetRaster(gpRainDripTex[0]); gpRainDripTex[1] = RwTextureRead("raindripb64", nil); - ASSERT(gpRainDripTex[1] != nil); gpRainDripRaster[1] = RwTextureGetRaster(gpRainDripTex[1]); gpRainDripDarkTex[0] = RwTextureRead("raindrip64_d", nil); - ASSERT(gpRainDripDarkTex[0] != nil); gpRainDripDarkRaster[0] = RwTextureGetRaster(gpRainDripDarkTex[0]); - gpMultiPlayerHitTex = RwTextureRead("mphit", nil); - ASSERT(gpMultiPlayerHitTex != nil); - gpMultiPlayerHitRaster = RwTextureGetRaster(gpMultiPlayerHitTex); - - gpFireHoseTex = RwTextureRead("firehose", nil); - ASSERT(gpFireHoseTex != nil); - gpFireHoseRaster = RwTextureGetRaster(gpFireHoseTex); + gpRainDripDarkTex[1] = RwTextureRead("raindripb64_d", nil); + gpRainDripDarkRaster[1] = RwTextureGetRaster(gpRainDripDarkTex[1]); CTxdStore::PopCurrentTxd(); @@ -515,84 +491,98 @@ void CParticle::Initialise() { tParticleSystemData *entry = &mod_ParticleSystemManager.m_aParticles[i]; - switch( i ) + switch ( i ) { case PARTICLE_SPARK: - entry->m_ppRaster = &gpRainDropSmallRaster; - break; - case PARTICLE_SPARK_SMALL: + case PARTICLE_RAINDROP_SMALL: + case PARTICLE_HELI_ATTACK: entry->m_ppRaster = &gpRainDropSmallRaster; break; - + case PARTICLE_WATER_SPARK: entry->m_ppRaster = &gpSparkRaster; break; - + case PARTICLE_WHEEL_DIRT: - entry->m_ppRaster = &gpSmoke2Raster; - break; - case PARTICLE_SAND: + case PARTICLE_STEAM2: + case PARTICLE_STEAM_NY: + case PARTICLE_STEAM_NY_SLOWMOTION: + case PARTICLE_GROUND_STEAM: + case PARTICLE_ENGINE_STEAM: + case PARTICLE_PEDFOOT_DUST: + case PARTICLE_CAR_DUST: + case PARTICLE_EXHAUST_FUMES: entry->m_ppRaster = &gpSmoke2Raster; break; - + case PARTICLE_WHEEL_WATER: + case PARTICLE_WATER: + case PARTICLE_SMOKE: + case PARTICLE_SMOKE_SLOWMOTION: + case PARTICLE_DRY_ICE: + case PARTICLE_GARAGEPAINT_SPRAY: + case PARTICLE_STEAM: + case PARTICLE_WATER_CANNON: + case PARTICLE_EXTINGUISH_STEAM: + case PARTICLE_HELI_DUST: + case PARTICLE_PAINT_SMOKE: + case PARTICLE_BULLETHIT_SMOKE: entry->m_ppRaster = gpSmokeRaster; break; - + case PARTICLE_BLOOD: entry->m_ppRaster = &gpBloodRaster; break; - + case PARTICLE_BLOOD_SMALL: - entry->m_ppRaster = &gpBloodSmallRaster; - break; - case PARTICLE_BLOOD_SPURT: entry->m_ppRaster = &gpBloodSmallRaster; break; - + case PARTICLE_DEBRIS: + case PARTICLE_TREE_LEAVES: entry->m_ppRaster = gpLeafRaster; break; - + case PARTICLE_DEBRIS2: entry->m_ppRaster = &gpGungeRaster; break; - + case PARTICLE_FLYERS: entry->m_ppRaster = &gpNewspaperRaster; break; - - case PARTICLE_WATER: - entry->m_ppRaster = gpSmokeRaster; - break; - + case PARTICLE_FLAME: + case PARTICLE_CARFLAME: entry->m_ppRaster = &gpFlame1Raster; break; - + case PARTICLE_FIREBALL: entry->m_ppRaster = &gpFlame5Raster; break; - + case PARTICLE_GUNFLASH: - entry->m_ppRaster = gpGunFlashRaster; - break; - case PARTICLE_GUNFLASH_NOANIM: entry->m_ppRaster = gpGunFlashRaster; break; - + + case PARTICLE_GUNSMOKE: + case PARTICLE_WATERDROP: + case PARTICLE_BLOODDROP: + case PARTICLE_HEATHAZE: + case PARTICLE_HEATHAZE_IN_DIST: entry->m_ppRaster = nil; break; - + case PARTICLE_GUNSMOKE2: + case PARTICLE_BOAT_THRUSTJET: + case PARTICLE_RUBBER_SMOKE: entry->m_ppRaster = gpRubberRaster; break; - + case PARTICLE_CIGARETTE_SMOKE: entry->m_ppRaster = &gpGunSmokeRaster; break; @@ -600,56 +590,20 @@ void CParticle::Initialise() case PARTICLE_TEARGAS: entry->m_ppRaster = &gpHeatHazeRaster; break; - - case PARTICLE_SMOKE: - case PARTICLE_SMOKE_SLOWMOTION: - case PARTICLE_DRY_ICE: - entry->m_ppRaster = gpSmokeRaster; - break; - case PARTICLE_GARAGEPAINT_SPRAY: - entry->m_ppRaster = gpSmokeRaster; - break; - case PARTICLE_SHARD: + case PARTICLE_RAINDROP: + case PARTICLE_RAINDROP_2D: entry->m_ppRaster = &gpRainDropRaster; break; - + case PARTICLE_SPLASH: + case PARTICLE_PED_SPLASH: + case PARTICLE_CAR_SPLASH: + case PARTICLE_WATER_HYDRANT: entry->m_ppRaster = gpCarSplashRaster; break; - - case PARTICLE_CARFLAME: - entry->m_ppRaster = &gpFlame1Raster; - break; - - case PARTICLE_STEAM: - entry->m_ppRaster = gpSmokeRaster; - break; - - case PARTICLE_STEAM2: - entry->m_ppRaster = &gpSmoke2Raster; - break; - - case PARTICLE_STEAM_NY: - case PARTICLE_STEAM_NY_SLOWMOTION: - case PARTICLE_GROUND_STEAM: - case PARTICLE_HYDRANT_STEAM: - entry->m_ppRaster = &gpSmoke2Raster; - break; - - case PARTICLE_ENGINE_STEAM: - entry->m_ppRaster = &gpSmoke2Raster; - break; - - case PARTICLE_RAINDROP: - entry->m_ppRaster = &gpRainDropRaster; - break; - case PARTICLE_RAINDROP_SMALL: - entry->m_ppRaster = &gpRainDropSmallRaster; - break; - case PARTICLE_RAIN_SPLASH: case PARTICLE_RAIN_SPLASH_BIGGROW: entry->m_ppRaster = gpRainSplashRaster; @@ -663,140 +617,44 @@ void CParticle::Initialise() entry->m_ppRaster = gpWatersprayRaster; break; - case PARTICLE_RAINDROP_2D: - entry->m_ppRaster = &gpRainDropRaster; - break; - case PARTICLE_EXPLOSION_MEDIUM: - entry->m_ppRaster = gpExplosionMediumRaster; - break; - case PARTICLE_EXPLOSION_LARGE: - entry->m_ppRaster = gpExplosionMediumRaster; - break; - case PARTICLE_EXPLOSION_MFAST: - entry->m_ppRaster = gpExplosionMediumRaster; - break; - case PARTICLE_EXPLOSION_LFAST: entry->m_ppRaster = gpExplosionMediumRaster; break; - case PARTICLE_CAR_SPLASH: - entry->m_ppRaster = gpCarSplashRaster; - break; - case PARTICLE_BOAT_SPLASH: entry->m_ppRaster = &gpBoatWakeRaster; break; - case PARTICLE_BOAT_THRUSTJET: - entry->m_ppRaster = gpRubberRaster; - break; - - case PARTICLE_WATER_HYDRANT: - entry->m_ppRaster = gpCarSplashRaster; - break; - - case PARTICLE_WATER_CANNON: - entry->m_ppRaster = gpSmokeRaster; - break; - - case PARTICLE_EXTINGUISH_STEAM: - entry->m_ppRaster = gpSmokeRaster; - break; - - case PARTICLE_PED_SPLASH: - entry->m_ppRaster = gpCarSplashRaster; - break; - - case PARTICLE_PEDFOOT_DUST: - entry->m_ppRaster = &gpSmoke2Raster; - break; - - case PARTICLE_CAR_DUST: - entry->m_ppRaster = &gpSmoke2Raster; - break; - - case PARTICLE_HELI_DUST: - entry->m_ppRaster = gpSmokeRaster; - break; - - case PARTICLE_HELI_ATTACK: - entry->m_ppRaster = &gpRainDropSmallRaster; - break; - case PARTICLE_ENGINE_SMOKE: - entry->m_ppRaster = &gpCloudRaster4; - break; - case PARTICLE_ENGINE_SMOKE2: - case PARTICLE_ROCKET_SMOKE: - entry->m_ppRaster = &gpCloudRaster4; - break; - case PARTICLE_CARFLAME_SMOKE: - entry->m_ppRaster = &gpCloudRaster4; - break; - case PARTICLE_FIREBALL_SMOKE: + case PARTICLE_ROCKET_SMOKE: + case PARTICLE_TEST: entry->m_ppRaster = &gpCloudRaster4; break; - case PARTICLE_PAINT_SMOKE: - entry->m_ppRaster = gpSmokeRaster; - break; - - case PARTICLE_TREE_LEAVES: - entry->m_ppRaster = gpLeafRaster; - break; - case PARTICLE_CARCOLLISION_DUST: - entry->m_ppRaster = &gpCollisionSmokeRaster; - break; - - case PARTICLE_CAR_DEBRIS: - case PARTICLE_BIRD_DEBRIS: - case PARTICLE_HELI_DEBRIS: - entry->m_ppRaster = gpCarDebrisRaster; - break; - - case PARTICLE_EXHAUST_FUMES: - entry->m_ppRaster = &gpSmoke2Raster; - break; - - case PARTICLE_RUBBER_SMOKE: - entry->m_ppRaster = gpRubberRaster; - break; - case PARTICLE_BURNINGRUBBER_SMOKE: entry->m_ppRaster = &gpCollisionSmokeRaster; break; - case PARTICLE_BULLETHIT_SMOKE: - entry->m_ppRaster = gpSmokeRaster; + case PARTICLE_CAR_DEBRIS: + case PARTICLE_HELI_DEBRIS: + case PARTICLE_BIRD_DEBRIS: + entry->m_ppRaster = gpCarDebrisRaster; break; case PARTICLE_GUNSHELL_FIRST: - entry->m_ppRaster = &gpGunShellRaster; - break; - case PARTICLE_GUNSHELL: - entry->m_ppRaster = &gpGunShellRaster; - break; - case PARTICLE_GUNSHELL_BUMP1: - entry->m_ppRaster = &gpGunShellRaster; - break; - case PARTICLE_GUNSHELL_BUMP2: entry->m_ppRaster = &gpGunShellRaster; break; - case PARTICLE_TEST: - entry->m_ppRaster = &gpCloudRaster4; - break; case PARTICLE_BIRD_FRONT: entry->m_ppRaster = gpBirdfrontRaster; @@ -809,14 +667,6 @@ void CParticle::Initialise() case PARTICLE_BEASTIE: entry->m_ppRaster = &gpBeastieRaster; break; - - case PARTICLE_FERRY_CHIM_SMOKE: - entry->m_ppRaster = gpSmokeRaster; - break; - - case PARTICLE_MULTIPLAYER_HIT: - entry->m_ppRaster = &gpMultiPlayerHitRaster; - break; } } @@ -904,13 +754,8 @@ void CParticle::Shutdown() RwTextureDestroy(gpRainDripTex[i]); gpRainDripTex[i] = nil; -#ifdef FIX_BUGS - if (gpRainDripDarkTex[i]) -#endif - { - RwTextureDestroy(gpRainDripDarkTex[i]); - gpRainDripDarkTex[i] = nil; - } + RwTextureDestroy(gpRainDripDarkTex[i]); + gpRainDripDarkTex[i] = nil; } RwTextureDestroy(gpBoatWakeTex); @@ -966,18 +811,14 @@ void CParticle::Shutdown() RwTextureDestroy(gpGunSmokeTex); gpGunSmokeTex = nil; - + + RwTextureDestroy(gpDotTex); + gpDotTex = nil; RwTextureDestroy(gpHeatHazeTex); gpHeatHazeTex = nil; RwTextureDestroy(gpBeastieTex); gpBeastieTex = nil; - - RwTextureDestroy(gpMultiPlayerHitTex); - gpBeastieTex = nil; - - RwTextureDestroy(gpFireHoseTex); - gpFireHoseTex = nil; int32 slot; @@ -1029,12 +870,24 @@ CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVe CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVector const &vecDir, CEntity *pEntity, float fSize, RwRGBA const &color, int32 nRotationSpeed, int32 nRotation, int32 nCurFrame, int32 nLifeSpan) { - if ( CTimer::GetIsPaused() /*TODO: || byte_355C47*/ ) + if ( CTimer::GetIsPaused() ) return nil; -/* + + if ( ( type == PARTICLE_ENGINE_SMOKE + || type == PARTICLE_ENGINE_SMOKE2 + || type == PARTICLE_ENGINE_STEAM + || type == PARTICLE_CARFLAME_SMOKE + || type == PARTICLE_RUBBER_SMOKE + || type == PARTICLE_BURNINGRUBBER_SMOKE + || type == PARTICLE_EXHAUST_FUMES + || type == PARTICLE_CARCOLLISION_DUST ) + && nParticleCreationInterval & CTimer::GetFrameCounter() ) + { + return nil; + } + if ( !CReplay::IsPlayingBack() ) CReplay::RecordParticle(type, vecPos, vecDir, fSize, color); -*/ CParticle *pParticle = m_pUnusedListHead; @@ -1069,15 +922,38 @@ CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVe if ( psystem->m_nFadeAlphaTime ) pParticle->m_nFadeAlphaTimer /= psystem->m_nFadeAlphaTime; + pParticle->m_nCurrentZRotation = psystem->m_nZRotationInitialAngle; + pParticle->m_fCurrentZRadius = psystem->m_fInitialZRadius; + if ( nCurFrame != 0 ) pParticle->m_nCurrentFrame = nCurFrame; else pParticle->m_nCurrentFrame = psystem->m_nStartAnimationFrame; + + pParticle->m_nZRotationTimer = 0; + pParticle->m_nZRadiusTimer = 0; pParticle->m_nAnimationSpeedTimer = 0; pParticle->m_fZGround = 0.0f; - pParticle->m_vecPosition = vecPos; + + if ( type != PARTICLE_HEATHAZE ) + pParticle->m_vecPosition = vecPos; + else + { + CVector screen; + float w, h; + + if ( !CSprite::CalcScreenCoors(vecPos, &screen, &w, &h, true) ) + return nil; + + pParticle->m_vecPosition = screen; + psystem->m_vecTextureStretch.x = w; + psystem->m_vecTextureStretch.y = h; + } + pParticle->m_vecVelocity = vecDir; + + pParticle->m_vecParticleMovementOffset = CVector(0.0f, 0.0f, 0.0f); pParticle->m_nTimeWhenColorWillBeChanged = 0; if ( color.alpha != 0 ) @@ -1214,14 +1090,14 @@ CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVe break; case PARTICLE_EXPLOSION_MEDIUM: - pParticle->m_nColorIntensity -= 2 * 15 * (CGeneral::GetRandomNumber() & 1); // mb "+= -30 * rand" here ? + pParticle->m_nColorIntensity -= 30 * (CGeneral::GetRandomNumber() & 1); // mb "+= -30 * rand" here ? pParticle->m_nAnimationSpeedTimer = CGeneral::GetRandomNumber() & 7; pParticle->m_fSize = CGeneral::GetRandomNumberInRange(0.3f, 0.8f); pParticle->m_vecPosition.z -= CGeneral::GetRandomNumberInRange(-0.1f, 0.1f); break; case PARTICLE_EXPLOSION_LARGE: - pParticle->m_nColorIntensity -= 2 * 15 * (CGeneral::GetRandomNumber() & 1); // mb "+= -30 * rand" here ? + pParticle->m_nColorIntensity -= 30 * (CGeneral::GetRandomNumber() & 1); // mb "+= -30 * rand" here ? pParticle->m_nAnimationSpeedTimer = CGeneral::GetRandomNumber() & 7; pParticle->m_fSize = CGeneral::GetRandomNumberInRange(0.8f, 1.4f); pParticle->m_vecPosition.z -= CGeneral::GetRandomNumberInRange(-0.3f, 0.3f); @@ -1247,7 +1123,7 @@ CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVe void CParticle::Update() { - if ( CTimer::GetIsPaused() /*TODO: || byte_355C47*/ ) + if ( CTimer::GetIsPaused() ) return; CRGBA color(0, 0, 0, 0); @@ -1260,9 +1136,7 @@ void CParticle::Update() float fFricDeccel99 = pow(0.99f, CTimer::GetTimeStep()); CParticleObject::UpdateAll(); - - // no more erectedcocks -#ifndef FIX_BUGS + // ejaculation at 23:00, 23:15, 23:30, 23:45 if ( CClock::ms_nGameClockHours == 23 && ( CClock::ms_nGameClockMinutes == 0 @@ -1281,7 +1155,6 @@ void CParticle::Update() 1, 1000); } -#endif for ( int32 i = 0; i < MAX_PARTICLES; i++ ) { @@ -1301,7 +1174,68 @@ void CParticle::Update() CVector vecMoveStep = particle->m_vecVelocity * CTimer::GetTimeStep(); CVector vecPos = particle->m_vecPosition; - + + if ( numWaterDropOnScreen == 0 ) + clearWaterDrop = false; + + if ( psystem->m_Type == PARTICLE_WATERDROP ) + { + if ( CGame::IsInInterior() || clearWaterDrop == true ) + { + bRemoveParticle = true; + continue; + } + + static uint8 nWaterDropCount; + + if ( nWaterDropCount == 5 ) + { + vecMoveStep = CVector(0.0f, 0.0f, 0.0f); + particle->m_nTimeWhenWillBeDestroyed += 1250; + nWaterDropCount = 0; + } + else + { + if ( TheCamera.m_CameraAverageSpeed > 0.35f ) + { + if ( vecMoveStep.Magnitude() > 0.5f ) + { + if ( vecMoveStep.Magnitude() > 0.4f && vecMoveStep.Magnitude() < 0.8f ) + { + vecMoveStep.x += TheCamera.m_CameraAverageSpeed * 1.5f; + vecMoveStep.y += TheCamera.m_CameraAverageSpeed * 1.5f; + } + else if ( vecMoveStep.Magnitude() != 0.0f ) + { + vecMoveStep.x += CGeneral::GetRandomNumberInRange(0.01f, 0.05f); + vecMoveStep.y += CGeneral::GetRandomNumberInRange(0.01f, 0.05f); + } + } + } + + nWaterDropCount++; + } + + if ( vecPos.z <= 1.5f ) + vecMoveStep.z = 0.0f; + } + + if ( psystem->m_Type == PARTICLE_HEATHAZE || psystem->m_Type == PARTICLE_HEATHAZE_IN_DIST ) + { +#ifdef FIX_BUGS + int32 nSinCosIndex = (int32(DEGTORAD((float)particle->m_nRotation) * float(SIN_COS_TABLE_SIZE) / TWOPI) + SIN_COS_TABLE_SIZE) % SIN_COS_TABLE_SIZE; +#else + int32 nSinCosIndex = int32(DEGTORAD((float)particle->m_nRotation) * float(SIN_COS_TABLE_SIZE) / TWOPI) % SIN_COS_TABLE_SIZE; +#endif + vecMoveStep.x = Sin(nSinCosIndex); + vecMoveStep.y = Sin(nSinCosIndex); + + if ( psystem->m_Type == PARTICLE_HEATHAZE_IN_DIST ) + particle->m_nRotation = int16((float)particle->m_nRotation + 0.75f); + else + particle->m_nRotation = int16((float)particle->m_nRotation + 1.0f); + } + if ( psystem->m_Type == PARTICLE_BEASTIE ) { #ifdef FIX_BUGS @@ -1324,7 +1258,28 @@ void CParticle::Update() } vecPos += vecMoveStep; - + + if ( psystem->m_Type == PARTICLE_FIREBALL ) + { + AddParticle(PARTICLE_HEATHAZE, particle->m_vecPosition, CVector(0.0f, 0.0f, 0.0f), + nil, particle->m_fSize * 5.0f); + } + + if ( psystem->m_Type == PARTICLE_GUNSMOKE2 ) + { + if ( CTimer::GetFrameCounter() & 10 ) + { +#ifdef FIX_BUGS + if ( FindPlayerPed() && FindPlayerPed()->GetWeapon()->m_eWeaponType == WEAPONTYPE_MINIGUN ) +#else + if ( FindPlayerPed()->GetWeapon()->m_eWeaponType == WEAPONTYPE_MINIGUN ) +#endif + { + AddParticle(PARTICLE_HEATHAZE, particle->m_vecPosition, CVector(0.0f, 0.0f, 0.0f)); + } + } + } + if ( CWeather::Wind > 0.0f ) { if ( vecMoveStep.Magnitude() != 0.0f ) @@ -1344,15 +1299,12 @@ void CParticle::Update() || psystem->m_Type == PARTICLE_BOAT_SPLASH || psystem->m_Type == PARTICLE_RAINDROP_2D ) { - //int32 nMaxDrops = int32(6.0f * TheCamera.m_CameraAverageSpeed + 1.0f); + int32 nMaxDrops = int32(6.0f * TheCamera.m_CameraAverageSpeed + 1.0f); float fDistToCam = 0.0f; if ( psystem->m_Type == PARTICLE_BOAT_SPLASH || psystem->m_Type == PARTICLE_CAR_SPLASH ) { - float fWaterLevel = 0.0f; - CWaterLevel::GetWaterLevelNoWaves(vecPos.x, vecPos.y, vecPos.z, &fWaterLevel); - - if ( vecPos.z + particle->m_fSize < fWaterLevel ) + if ( vecPos.z + particle->m_fSize < 5.0f ) { bRemoveParticle = true; continue; @@ -1363,16 +1315,61 @@ void CParticle::Update() case LOOKING_LEFT: case LOOKING_RIGHT: case LOOKING_FORWARD: - //nMaxDrops /= 2; + nMaxDrops /= 2; break; default: - //nMaxDrops = 0; + nMaxDrops = 0; break; } fDistToCam = (TheCamera.GetPosition() - vecPos).Magnitude(); } + + if ( numWaterDropOnScreen < nMaxDrops && numWaterDropOnScreen < 63 + && fDistToCam < 10.0f + && clearWaterDrop == false + && !CGame::IsInInterior() ) + { + CVector vecWaterdropTarget + ( + CGeneral::GetRandomNumberInRange(-0.25f, 0.25f), + CGeneral::GetRandomNumberInRange(0.1f, 0.75f), + -0.01f + ); + + CVector vecWaterdropPos; + + if ( TheCamera.m_CameraAverageSpeed < 0.35f ) + vecWaterdropPos.x = (float)CGeneral::GetRandomNumberInRange(50, int32(SCREEN_WIDTH) - 50); + else + vecWaterdropPos.x = (float)CGeneral::GetRandomNumberInRange(200, int32(SCREEN_WIDTH) - 200); + + if ( psystem->m_Type == PARTICLE_BOAT_SPLASH || psystem->m_Type == PARTICLE_CAR_SPLASH ) + vecWaterdropPos.y = (float)CGeneral::GetRandomNumberInRange(SCREEN_HEIGHT / 2, SCREEN_HEIGHT); + else + { + if ( TheCamera.m_CameraAverageSpeed < 0.35f ) + vecWaterdropPos.y = (float)CGeneral::GetRandomNumberInRange(0, int32(SCREEN_HEIGHT)); + else + vecWaterdropPos.y = (float)CGeneral::GetRandomNumberInRange(150, int32(SCREEN_HEIGHT) - 200); + } + + vecWaterdropPos.z = 2.0f; + + if ( AddParticle(PARTICLE_WATERDROP, + vecWaterdropPos, + vecWaterdropTarget, + nil, + CGeneral::GetRandomNumberInRange(0.1f, 0.15f), + 0, + 0, + CGeneral::GetRandomNumber() & 1, + 0) != nil ) + { + numWaterDropOnScreen++; + } + } } if ( CTimer::GetTimeInMilliseconds() > particle->m_nTimeWhenWillBeDestroyed || particle->m_nAlpha == 0 ) @@ -1435,7 +1432,10 @@ void CParticle::Update() } else size = particle->m_fSize + particle->m_fExpansionRate; - + + if ( psystem->m_Type == PARTICLE_WATERDROP ) + size = (size - Abs(vecMoveStep.x) * 0.000150000007f) + (Abs(vecMoveStep.z) * 0.0500000007f); //TODO: + if ( size < 0.0f ) { bRemoveParticle = true; @@ -1716,6 +1716,28 @@ void CParticle::Update() continue; } } + + if ( psystem->m_nZRotationAngleChangeAmount != 0 ) + { + if ( particle->m_nZRotationTimer >= psystem->m_nZRotationChangeTime ) + { + particle->m_nZRotationTimer = 0; + particle->m_nCurrentZRotation += psystem->m_nZRotationAngleChangeAmount; + } + else + ++particle->m_nZRotationTimer; + } + + if ( psystem->m_fZRadiusChangeAmount != 0.0f ) + { + if ( particle->m_nZRadiusTimer >= psystem->m_nZRadiusChangeTime ) + { + particle->m_nZRadiusTimer = 0; + particle->m_fCurrentZRadius += psystem->m_fZRadiusChangeAmount; + } + else + ++particle->m_nZRadiusTimer; + } if ( psystem->m_nAnimationSpeed != 0 ) { @@ -1742,6 +1764,21 @@ void CParticle::Update() particle->m_nRotation += particle->m_nRotationStep; #endif + if ( particle->m_fCurrentZRadius != 0.0f ) + { + int32 nSinCosIndex = particle->m_nCurrentZRotation % SIN_COS_TABLE_SIZE; + + float fX = (Cos(nSinCosIndex) - Sin(nSinCosIndex)) * particle->m_fCurrentZRadius; + + float fY = (Sin(nSinCosIndex) + Cos(nSinCosIndex)) * particle->m_fCurrentZRadius; + + vecPos -= particle->m_vecParticleMovementOffset; + + vecPos += CVector(fX, fY, 0.0f); + + particle->m_vecParticleMovementOffset = CVector(fX, fY, 0.0f); + } + particle->m_vecPosition = vecPos; } } @@ -1749,6 +1786,8 @@ void CParticle::Update() void CParticle::Render() { + PUSH_RENDERGROUP("CParticle::Render"); + RwRenderStateSet(rwRENDERSTATETEXTUREADDRESS, (void *)rwTEXTUREADDRESSWRAP); RwRenderStateSet(rwRENDERSTATETEXTUREPERSPECTIVE, (void *)TRUE); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void *)FALSE); @@ -1772,8 +1811,6 @@ void CParticle::Render() RwRaster **frames = psystem->m_ppRaster; tParticleType type = psystem->m_Type; - /* - something on ps2 if ( type == PARTICLE_ENGINE_SMOKE || type == PARTICLE_ENGINE_SMOKE2 || type == PARTICLE_ENGINE_STEAM @@ -1785,7 +1822,7 @@ void CParticle::Render() { particleBanned = true; } - */ + if ( particle ) { if ( (flags & DRAW_OPAQUE) != (psystem->Flags & DRAW_OPAQUE) @@ -1830,8 +1867,6 @@ void CParticle::Render() if ( particle->m_nAlpha == 0 ) canDraw = false; - // TODO: psp vert buffer check - if ( canDraw && psystem->m_nFinalAnimationFrame != 0 && frames != nil ) { RwRaster *curFrame = frames[particle->m_nCurrentFrame]; @@ -1845,7 +1880,11 @@ void CParticle::Render() if ( canDraw && psystem->Flags & DRAWTOP2D ) { - float screenZ = CalcScreenZ(particle->m_vecPosition.z); + float screenZ = (particle->m_vecPosition.z - CDraw::GetNearClipZ()) + * (CSprite::GetFarScreenZ() - CSprite::GetNearScreenZ()) + * CDraw::GetFarClipZ() + / ( (CDraw::GetFarClipZ() - CDraw::GetNearClipZ()) * particle->m_vecPosition.z ) + + CSprite::GetNearScreenZ(); float stretchTexW; float stretchTexH; @@ -1860,6 +1899,108 @@ void CParticle::Render() stretchTexW = CGeneral::GetRandomNumberInRange(0.1f, 1.0f) * psystem->m_vecTextureStretch.x + 63.0f; stretchTexH = CGeneral::GetRandomNumberInRange(0.1f, 1.0f) * psystem->m_vecTextureStretch.y + 63.0f; } + + + if ( i == PARTICLE_WATERDROP ) + { + int32 timeLeft = (particle->m_nTimeWhenWillBeDestroyed - CTimer::GetTimeInMilliseconds()) / particle->m_nTimeWhenWillBeDestroyed; + + stretchTexH += (1.0f - (float)timeLeft ) * psystem->m_vecTextureStretch.y; + + RwRect rect; + + rect.x = int32(particle->m_vecPosition.x - SCREEN_STRETCH_X(particle->m_fSize * stretchTexW)); + rect.y = int32(particle->m_vecPosition.y - SCREEN_STRETCH_Y(particle->m_fSize * stretchTexH)); + rect.w = int32(particle->m_vecPosition.x + SCREEN_STRETCH_X(particle->m_fSize * stretchTexW)); + rect.h = int32(particle->m_vecPosition.y + SCREEN_STRETCH_Y(particle->m_fSize * stretchTexH)); + + FxType fxtype; + + if ( particle->m_nCurrentFrame != 0 ) + fxtype = FXTYPE_WATER2; + else + fxtype = FXTYPE_WATER1; + + CMBlur::AddRenderFx(Scene.camera, &rect, screenZ, fxtype); + + canDraw = false; + } + + if ( i == PARTICLE_BLOODDROP ) + { + int32 timeLeft = (particle->m_nTimeWhenWillBeDestroyed - CTimer::GetTimeInMilliseconds()) / particle->m_nTimeWhenWillBeDestroyed; + + stretchTexH += (1.0f + (float)timeLeft) * psystem->m_vecTextureStretch.y; + stretchTexW += (1.0f - (float)timeLeft) * psystem->m_vecTextureStretch.x; + + RwRect rect; + + rect.x = int32(particle->m_vecPosition.x - SCREEN_STRETCH_X(particle->m_fSize * stretchTexW)); + rect.y = int32(particle->m_vecPosition.y - SCREEN_STRETCH_Y(particle->m_fSize * stretchTexH)); + rect.w = int32(particle->m_vecPosition.x + SCREEN_STRETCH_X(particle->m_fSize * stretchTexW)); + rect.h = int32(particle->m_vecPosition.y + SCREEN_STRETCH_Y(particle->m_fSize * stretchTexH)); + + FxType fxtype; + + if ( particle->m_nCurrentFrame ) + fxtype = FXTYPE_BLOOD2; + else + fxtype = FXTYPE_BLOOD1; + + CMBlur::AddRenderFx(Scene.camera, &rect, screenZ, fxtype); + + canDraw = false; + } + + if ( i == PARTICLE_HEATHAZE_IN_DIST ) + { + RwRect rect; + + rect.x = int32(particle->m_vecPosition.x - SCREEN_STRETCH_X(particle->m_fSize * stretchTexW)); + rect.y = int32(particle->m_vecPosition.y - SCREEN_STRETCH_Y(particle->m_fSize * stretchTexH * 0.15f)); + rect.w = int32(particle->m_vecPosition.x + SCREEN_STRETCH_X(particle->m_fSize * stretchTexW)); + rect.h = int32(particle->m_vecPosition.y + SCREEN_STRETCH_Y(particle->m_fSize * stretchTexH * 0.15f)); + + CMBlur::AddRenderFx(Scene.camera, &rect, screenZ, FXTYPE_HEATHAZE); + + canDraw = false; + } + + if ( i == PARTICLE_HEATHAZE ) + { + RwRect rect; + + switch ( TheCamera.GetLookDirection() ) + { + case LOOKING_LEFT: + rect.x = int32(particle->m_vecPosition.x - SCREEN_STRETCH_X(particle->m_fSize * psystem->m_vecTextureStretch.x * 2.0f)); + rect.y = int32(particle->m_vecPosition.y - SCREEN_STRETCH_Y(particle->m_fSize * psystem->m_vecTextureStretch.y)); + rect.w = int32(particle->m_vecPosition.x - SCREEN_STRETCH_X(particle->m_fSize * psystem->m_vecTextureStretch.x)); + rect.h = int32(particle->m_vecPosition.y + SCREEN_STRETCH_Y(particle->m_fSize * psystem->m_vecTextureStretch.y)); + + break; + + case LOOKING_RIGHT: + rect.x = int32(particle->m_vecPosition.x + SCREEN_STRETCH_X(particle->m_fSize * psystem->m_vecTextureStretch.x)); + rect.y = int32(particle->m_vecPosition.y - SCREEN_STRETCH_Y(particle->m_fSize * psystem->m_vecTextureStretch.y)); + rect.w = int32(particle->m_vecPosition.x + SCREEN_STRETCH_X(particle->m_fSize * psystem->m_vecTextureStretch.x * 4.0f)); + rect.h = int32(particle->m_vecPosition.y + SCREEN_STRETCH_Y(particle->m_fSize * psystem->m_vecTextureStretch.y)); + + break; + + default: + rect.x = int32(particle->m_vecPosition.x - SCREEN_STRETCH_X(particle->m_fSize * psystem->m_vecTextureStretch.x)); + rect.y = int32(particle->m_vecPosition.y - SCREEN_STRETCH_Y(particle->m_fSize * psystem->m_vecTextureStretch.y)); + rect.w = int32(particle->m_vecPosition.x + SCREEN_STRETCH_X(particle->m_fSize * psystem->m_vecTextureStretch.x)); + rect.h = int32(particle->m_vecPosition.y + SCREEN_STRETCH_Y(particle->m_fSize * psystem->m_vecTextureStretch.y)); + + break; + } + + CMBlur::AddRenderFx(Scene.camera, &rect, screenZ, FXTYPE_HEATHAZE); + + canDraw = false; + } if ( canDraw ) { @@ -1925,8 +2066,6 @@ void CParticle::Render() } else if ( i == PARTICLE_WATER_HYDRANT ) { - float screenZ = CalcScreenZ(particle->m_vecPosition.z); - int32 timeLeft = (particle->m_nTimeWhenWillBeDestroyed - CTimer::GetTimeInMilliseconds()) / particle->m_nTimeWhenWillBeDestroyed; w += (1.0f - (float)timeLeft) * psystem->m_vecTextureStretch.x; @@ -1946,149 +2085,190 @@ void CParticle::Render() h += CGeneral::GetRandomNumberInRange(0.1f, 1.0f) * psystem->m_vecTextureStretch.y; } - if ( particle->m_nRotation != 0 && i != PARTICLE_BEASTIE ) - { - CSprite::RenderBufferedOneXLUSprite_Rotate_Dimension(coors.x, coors.y, coors.z, - particle->m_fSize * w, particle->m_fSize * h, - particle->m_Color.red, - particle->m_Color.green, - particle->m_Color.blue, - particle->m_nColorIntensity, - 1.0f / coors.z, - DEGTORAD((float)particle->m_nRotation), - particle->m_nAlpha); - } - else if ( psystem->Flags & SCREEN_TRAIL ) + if ( i == PARTICLE_WATER_HYDRANT + || (!particleBanned || SCREEN_WIDTH * fParticleScaleLimit >= w) + && SCREEN_HEIGHT * fParticleScaleLimit >= h ) { - float fRotation; - float fTrailLength; - - if ( particle->m_fZGround == 0.0f ) + if ( i == PARTICLE_WATER_HYDRANT ) { - fTrailLength = 0.0f; - fRotation = 0.0f; + RwRect rect; + + if ( w > 0.0f ) + { + rect.x = int32(coors.x - SCREEN_STRETCH_X(particle->m_fSize * w)); + rect.w = int32(coors.x + SCREEN_STRETCH_X(particle->m_fSize * w)); + } + else + { + rect.w = int32(coors.x - SCREEN_STRETCH_X(particle->m_fSize * w)); + rect.x = int32(coors.x + SCREEN_STRETCH_X(particle->m_fSize * w)); + } + + if ( h > 0.0f ) + { + rect.y = int32(coors.y - SCREEN_STRETCH_Y(particle->m_fSize * h)); + rect.h = int32(coors.y + SCREEN_STRETCH_Y(particle->m_fSize * h)); + } + else + { + rect.h = int32(coors.y - SCREEN_STRETCH_Y(particle->m_fSize * h)); + rect.y = int32(coors.y + SCREEN_STRETCH_Y(particle->m_fSize * h)); + } + + float screenZ = (coors.z - CDraw::GetNearClipZ()) + * (CSprite::GetFarScreenZ() - CSprite::GetNearScreenZ()) * CDraw::GetFarClipZ() + / ( (CDraw::GetFarClipZ() - CDraw::GetNearClipZ()) * coors.z ) + CSprite::GetNearScreenZ(); + + CMBlur::AddRenderFx(Scene.camera, &rect, screenZ, FXTYPE_SPLASH1); } else { - CVector2D vecDist - ( - coors.x - particle->m_fZGround, - coors.y - particle->m_fExpansionRate - ); + if ( particle->m_nRotation != 0 && i != PARTICLE_BEASTIE ) + { + CSprite::RenderBufferedOneXLUSprite_Rotate_Dimension(coors.x, coors.y, coors.z, + particle->m_fSize * w, particle->m_fSize * h, + particle->m_Color.red, + particle->m_Color.green, + particle->m_Color.blue, + particle->m_nColorIntensity, + 1.0f / coors.z, + DEGTORAD((float)particle->m_nRotation), + particle->m_nAlpha); + } + else if ( psystem->Flags & SCREEN_TRAIL ) + { + float fRotation; + float fTrailLength; + + if ( particle->m_fZGround == 0.0f ) + { + fTrailLength = 0.0f; + fRotation = 0.0f; + } + else + { + CVector2D vecDist + ( + coors.x - particle->m_fZGround, + coors.y - particle->m_fExpansionRate + ); - float fDist = vecDist.Magnitude(); + float fDist = vecDist.Magnitude(); - fTrailLength = fDist; - - float fRot = Asin(vecDist.x / fDist); + fTrailLength = fDist; + + float fRot = Asin(vecDist.x / fDist); - fRotation = fRot; + fRotation = fRot; - if ( vecDist.y < 0.0f ) - fRotation = -1.0f * fRot + DEGTORAD(180.0f); - - float fSpeed = particle->m_vecVelocity.Magnitude(); - - float fNewTrailLength = fSpeed * CTimer::GetTimeStep() * w * 2.0f; - - if ( fDist > fNewTrailLength ) - fTrailLength = fNewTrailLength; - } - - CSprite::RenderBufferedOneXLUSprite_Rotate_Dimension(coors.x, coors.y, coors.z, - particle->m_fSize * w, - particle->m_fSize * h + fTrailLength * psystem->m_fTrailLengthMultiplier, - particle->m_Color.red, - particle->m_Color.green, - particle->m_Color.blue, - particle->m_nColorIntensity, - 1.0f / coors.z, - fRotation, - particle->m_nAlpha); + if ( vecDist.y < 0.0f ) + fRotation = -1.0f * fRot + DEGTORAD(180.0f); + + float fSpeed = particle->m_vecVelocity.Magnitude(); + + float fNewTrailLength = fSpeed * CTimer::GetTimeStep() * w * 2.0f; + + if ( fDist > fNewTrailLength ) + fTrailLength = fNewTrailLength; + } + + CSprite::RenderBufferedOneXLUSprite_Rotate_Dimension(coors.x, coors.y, coors.z, + particle->m_fSize * w, + particle->m_fSize * h + fTrailLength * psystem->m_fTrailLengthMultiplier, + particle->m_Color.red, + particle->m_Color.green, + particle->m_Color.blue, + particle->m_nColorIntensity, + 1.0f / coors.z, + fRotation, + particle->m_nAlpha); - particle->m_fZGround = coors.x; // WTF ? - particle->m_fExpansionRate = coors.y; // WTF ? - } - else if ( psystem->Flags & SPEED_TRAIL ) - { - CVector vecPrevPos = particle->m_vecPosition - particle->m_vecVelocity; - float fRotation; - float fTrailLength; - CVector vecScreenPosition; - - if ( CSprite::CalcScreenCoors(vecPrevPos, &vecScreenPosition, &fTrailLength, &fRotation, true) ) - { - CVector2D vecDist - ( - coors.x - vecScreenPosition.x, - coors.y - vecScreenPosition.y - ); - - float fDist = vecDist.Magnitude(); - - fTrailLength = fDist; - - float fRot = Asin(vecDist.x / fDist); - - fRotation = fRot; - - if ( vecDist.y < 0.0f ) - fRotation = -1.0f * fRot + DEGTORAD(180.0f); - } - else - { - fRotation = 0.0f; - fTrailLength = 0.0f; - } - - CSprite::RenderBufferedOneXLUSprite_Rotate_Dimension(coors.x, coors.y, coors.z, - particle->m_fSize * w, - particle->m_fSize * h + fTrailLength * psystem->m_fTrailLengthMultiplier, - particle->m_Color.red, - particle->m_Color.green, - particle->m_Color.blue, - particle->m_nColorIntensity, - 1.0f / coors.z, - fRotation, - particle->m_nAlpha); - } - else if ( psystem->Flags & VERT_TRAIL ) - { - float fTrailLength = Abs(particle->m_vecVelocity.z * 10.0f); + particle->m_fZGround = coors.x; // WTF ? + particle->m_fExpansionRate = coors.y; // WTF ? + } + else if ( psystem->Flags & SPEED_TRAIL ) + { + CVector vecPrevPos = particle->m_vecPosition - particle->m_vecVelocity; + float fRotation; + float fTrailLength; + CVector vecScreenPosition; + + if ( CSprite::CalcScreenCoors(vecPrevPos, &vecScreenPosition, &fTrailLength, &fRotation, true) ) + { + CVector2D vecDist + ( + coors.x - vecScreenPosition.x, + coors.y - vecScreenPosition.y + ); + + float fDist = vecDist.Magnitude(); + + fTrailLength = fDist; + + float fRot = Asin(vecDist.x / fDist); + + fRotation = fRot; + + if ( vecDist.y < 0.0f ) + fRotation = -1.0f * fRot + DEGTORAD(180.0f); + } + else + { + fRotation = 0.0f; + fTrailLength = 0.0f; + } + + CSprite::RenderBufferedOneXLUSprite_Rotate_Dimension(coors.x, coors.y, coors.z, + particle->m_fSize * w, + particle->m_fSize * h + fTrailLength * psystem->m_fTrailLengthMultiplier, + particle->m_Color.red, + particle->m_Color.green, + particle->m_Color.blue, + particle->m_nColorIntensity, + 1.0f / coors.z, + fRotation, + particle->m_nAlpha); + } + else if ( psystem->Flags & VERT_TRAIL ) + { + float fTrailLength = fabsf(particle->m_vecVelocity.z * 10.0f); - CSprite::RenderBufferedOneXLUSprite(coors.x, coors.y, coors.z, - particle->m_fSize * w, - (particle->m_fSize + fTrailLength * psystem->m_fTrailLengthMultiplier) * h, - particle->m_Color.red, - particle->m_Color.green, - particle->m_Color.blue, - particle->m_nColorIntensity, - 1.0f / coors.z, - particle->m_nAlpha); - } - else if ( i == PARTICLE_RAINDROP_SMALL ) - { - CSprite::RenderBufferedOneXLUSprite(coors.x, coors.y, coors.z, - particle->m_fSize * w * 0.05f, - particle->m_fSize * h, - particle->m_Color.red, - particle->m_Color.green, - particle->m_Color.blue, - particle->m_nColorIntensity, - 1.0f / coors.z, - particle->m_nAlpha); - } - else - { - CSprite::RenderBufferedOneXLUSprite(coors.x, coors.y, coors.z, - particle->m_fSize * w, - particle->m_fSize * h, - particle->m_Color.red, - particle->m_Color.green, - particle->m_Color.blue, - particle->m_nColorIntensity, - 1.0f / coors.z, - particle->m_nAlpha); + CSprite::RenderBufferedOneXLUSprite(coors.x, coors.y, coors.z, + particle->m_fSize * w, + (particle->m_fSize + fTrailLength * psystem->m_fTrailLengthMultiplier) * h, + particle->m_Color.red, + particle->m_Color.green, + particle->m_Color.blue, + particle->m_nColorIntensity, + 1.0f / coors.z, + particle->m_nAlpha); + } + else if ( i == PARTICLE_RAINDROP_SMALL ) + { + CSprite::RenderBufferedOneXLUSprite(coors.x, coors.y, coors.z, + particle->m_fSize * w * 0.05f, + particle->m_fSize * h, + particle->m_Color.red, + particle->m_Color.green, + particle->m_Color.blue, + particle->m_nColorIntensity, + 1.0f / coors.z, + particle->m_nAlpha); + } + /*else if ( i == PARTICLE_BOAT_WAKE )*/ + else + { + CSprite::RenderBufferedOneXLUSprite(coors.x, coors.y, coors.z, + particle->m_fSize * w, + particle->m_fSize * h, + particle->m_Color.red, + particle->m_Color.green, + particle->m_Color.blue, + particle->m_nColorIntensity, + 1.0f / coors.z, + particle->m_nAlpha); + } + } } } } @@ -2105,6 +2285,8 @@ void CParticle::Render() RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)TRUE); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA); + + POP_RENDERGROUP(); } void CParticle::RemovePSystem(tParticleType type) @@ -2117,6 +2299,9 @@ void CParticle::RemovePSystem(tParticleType type) void CParticle::RemoveParticle(CParticle *pParticle, CParticle *pPrevParticle, tParticleSystemData *pPSystemData) { + if ( pPSystemData->m_Type == PARTICLE_WATERDROP ) + --numWaterDropOnScreen; + if ( pPrevParticle ) pPrevParticle->m_pNext = pParticle->m_pNext; else @@ -2216,7 +2401,18 @@ void CParticle::CalWindDir(CVector *vecDirIn, CVector *vecDirOut) void CParticle::HandleShipsAtHorizonStuff() { - ; + tParticleSystemData *psystemdata = &mod_ParticleSystemManager.m_aParticles[PARTICLE_SHIP_SIDE]; + + for ( CParticle *particle = psystemdata->m_pParticles; particle; particle = particle->m_pNext ) + { + if ( CTimer::GetTimeInMilliseconds() > particle->m_nTimeWhenWillBeDestroyed - 32000 + && CTimer::GetTimeInMilliseconds() < particle->m_nTimeWhenWillBeDestroyed - 22000 ) + { + particle->m_nAlpha = Min(particle->m_nAlpha + 1, 96); + } + if ( CTimer::GetTimeInMilliseconds() > particle->m_nTimeWhenWillBeDestroyed - 10000 ) + particle->m_nFadeAlphaTimer = 1; + } } void CParticle::HandleShootableBirdsStuff(CEntity *entity, CVector const&camPos) @@ -2256,7 +2452,7 @@ void CParticle::HandleShootableBirdsStuff(CEntity *entity, CVector const&camPos) bRemoveParticle = true; for ( int32 i = 0; i < 8; i++ ) - { + { CParticle *pBirdDerbis = AddParticle(PARTICLE_BIRD_DEBRIS, particle->m_vecPosition, CVector diff --git a/src/render/Particle.h b/src/render/Particle.h index a306f0c..5542dc0 100644 --- a/src/render/Particle.h +++ b/src/render/Particle.h @@ -18,6 +18,11 @@ public: uint32 m_nTimeWhenWillBeDestroyed; uint32 m_nTimeWhenColorWillBeChanged; float m_fZGround; + CVector m_vecParticleMovementOffset; + int16 m_nCurrentZRotation; + uint16 m_nZRotationTimer; + float m_fCurrentZRadius; + uint16 m_nZRadiusTimer; uint8 m_nColorIntensity; uint8 m_nAlpha; float m_fSize; @@ -30,13 +35,12 @@ public: uint8 m_nCurrentFrame; RwRGBA m_Color; CParticle *m_pNext; - int32 field_4C; - + CParticle() { ; } - + ~CParticle() { ; @@ -93,9 +97,12 @@ public: static void HandleShootableBirdsStuff(CEntity *entity, CVector const&camPos); }; +extern bool clearWaterDrop; +extern int32 numWaterDropOnScreen; extern RwRaster *gpCarSplashRaster[]; extern RwRaster *gpHeatHazeRaster; +extern RwRaster *gpDotRaster; extern RwRaster *gpRainDripRaster[]; extern RwRaster *gpRainDripDarkRaster[]; -VALIDATE_SIZE(CParticle, 0x50); +VALIDATE_SIZE(CParticle, 0x58); diff --git a/src/render/ParticleMgr.cpp b/src/render/ParticleMgr.cpp index 04f42c8..f691943 100644 --- a/src/render/ParticleMgr.cpp +++ b/src/render/ParticleMgr.cpp @@ -4,30 +4,18 @@ #include "FileMgr.h" #include "ParticleMgr.h" -// --LCS: File done - cParticleSystemMgr mod_ParticleSystemManager; const char *ParticleFilename = "PARTICLE.CFG"; cParticleSystemMgr::cParticleSystemMgr() { -#ifdef FIX_BUGS - m_aParticles = nil; -#endif + memset(this, 0, sizeof(*this)); } -#ifdef FIX_BUGS -cParticleSystemMgr::~cParticleSystemMgr() -{ - delete [] m_aParticles; -} -#endif - void cParticleSystemMgr::Initialise() { - if ( gMakeResources ) - LoadParticleData(); + LoadParticleData(); for ( int32 i = 0; i < MAX_PARTICLES; i++ ) m_aParticles[i].m_pParticles = nil; @@ -35,30 +23,20 @@ void cParticleSystemMgr::Initialise() void cParticleSystemMgr::LoadParticleData() { -#ifdef FIX_BUGS - delete [] m_aParticles; -#endif - m_aParticles = new tParticleSystemData[MAX_PARTICLES]; - - memset(m_aParticles, 0, sizeof(tParticleSystemData)*MAX_PARTICLES); - - CFileMgr::SetDir("Data"); - ssize_t len = CFileMgr::LoadFile(ParticleFilename, work_buff, ARRAY_SIZE(work_buff), "r"); + CFileMgr::SetDir("DATA"); + CFileMgr::LoadFile(ParticleFilename, work_buff, ARRAY_SIZE(work_buff), "r"); CFileMgr::SetDir(""); - ASSERT(!(len <= 0)); - tParticleSystemData *entry = nil; int32 type = PARTICLE_FIRST; - char *buffEnd = (char *)&work_buff[len]; char *lineStart = (char *)work_buff; char *lineEnd = lineStart + 1; char line[500]; char delims[4]; - while ( lineStart < buffEnd ) + while ( true ) { ASSERT(lineStart != nil); ASSERT(lineEnd != nil); diff --git a/src/render/ParticleMgr.h b/src/render/ParticleMgr.h index 16da2c5..f4afc01 100644 --- a/src/render/ParticleMgr.h +++ b/src/render/ParticleMgr.h @@ -124,18 +124,15 @@ class cParticleSystemMgr }; public: - tParticleSystemData *m_aParticles;//[MAX_PARTICLES]; + tParticleSystemData m_aParticles[MAX_PARTICLES]; cParticleSystemMgr(); -#ifdef FIX_BUGS - ~cParticleSystemMgr(); -#endif void Initialise(); void LoadParticleData(); void RangeCheck(tParticleSystemData *pData) { } }; -VALIDATE_SIZE(cParticleSystemMgr, 0x4); +VALIDATE_SIZE(cParticleSystemMgr, 0x2FFC); extern cParticleSystemMgr mod_ParticleSystemManager; diff --git a/src/render/ParticleType.h b/src/render/ParticleType.h index cb3d53f..9578083 100644 --- a/src/render/ParticleType.h +++ b/src/render/ParticleType.h @@ -42,6 +42,8 @@ enum tParticleType PARTICLE_RAIN_SPLASH_BIGGROW, PARTICLE_RAIN_SPLASHUP, PARTICLE_WATERSPRAY, + PARTICLE_WATERDROP, + PARTICLE_BLOODDROP, PARTICLE_EXPLOSION_MEDIUM, PARTICLE_EXPLOSION_LARGE, PARTICLE_EXPLOSION_MFAST, @@ -81,11 +83,10 @@ enum tParticleType PARTICLE_SHIP_SIDE, PARTICLE_BEASTIE, PARTICLE_RAINDROP_2D, - PARTICLE_FERRY_CHIM_SMOKE, - PARTICLE_MULTIPLAYER_HIT, - PARTICLE_HYDRANT_STEAM, + PARTICLE_HEATHAZE, + PARTICLE_HEATHAZE_IN_DIST, MAX_PARTICLES, PARTICLE_FIRST = PARTICLE_SPARK, - PARTICLE_LAST = PARTICLE_HYDRANT_STEAM + PARTICLE_LAST = PARTICLE_HEATHAZE_IN_DIST }; \ No newline at end of file diff --git a/src/render/PointLights.cpp b/src/render/PointLights.cpp index 3e73c57..1387240 100644 --- a/src/render/PointLights.cpp +++ b/src/render/PointLights.cpp @@ -159,6 +159,8 @@ CPointLights::RenderFogEffect(void) if(CCutsceneMgr::IsRunning()) return; + PUSH_RENDERGROUP("CPointLights::RenderFogEffect"); + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE); @@ -302,6 +304,8 @@ CPointLights::RenderFogEffect(void) } CSprite::FlushSpriteBuffer(); + + POP_RENDERGROUP(); } bool diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index a320748..6b306b6 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -2,7 +2,6 @@ #include "common.h" #include "main.h" -#include "General.h" #include "Lights.h" #include "ModelInfo.h" #include "Treadable.h" @@ -21,7 +20,6 @@ #include "ModelIndices.h" #include "Streaming.h" #include "Shadows.h" -#include "Coronas.h" #include "PointLights.h" #include "Occlusion.h" #include "Renderer.h" @@ -40,8 +38,6 @@ bool gbDontRenderPeds; bool gbDontRenderObjects; bool gbDontRenderVehicles; -bool gbRenderDebugEnvMap; - // unused int16 TestCloseThings; int16 TestBigThings; @@ -134,8 +130,13 @@ CRenderer::RenderOneRoad(CEntity *e) return; if(gbShowCollisionPolys) CCollision::DrawColModel_Coloured(e->GetMatrix(), *CModelInfo::GetModelInfo(e->GetModelIndex())->GetColModel(), e->GetModelIndex()); - else + else{ + PUSH_RENDERGROUP(CModelInfo::GetModelInfo(e->GetModelIndex())->GetModelName()); + e->Render(); + + POP_RENDERGROUP(); + } } void @@ -182,6 +183,8 @@ CRenderer::RenderOneNonRoad(CEntity *e) } #endif + PUSH_RENDERGROUP(CModelInfo::GetModelInfo(e->GetModelIndex())->GetModelName()); + resetLights = e->SetupLighting(); if(e->IsVehicle()){ @@ -210,6 +213,8 @@ CRenderer::RenderOneNonRoad(CEntity *e) } e->RemoveLighting(resetLights); + + POP_RENDERGROUP(); } void @@ -235,6 +240,7 @@ CRenderer::RenderRoads(void) int i; CEntity *e; + PUSH_RENDERGROUP("CRenderer::RenderRoads"); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); SetCullMode(rwCULLMODECULLBACK); @@ -246,6 +252,7 @@ CRenderer::RenderRoads(void) if(IsRoad(e)) RenderOneRoad(e); } + POP_RENDERGROUP(); } inline bool PutIntoSortedVehicleList(CVehicle *veh) @@ -268,6 +275,7 @@ CRenderer::RenderEverythingBarRoads(void) CEntity *e; EntityInfo ei; + PUSH_RENDERGROUP("CRenderer::RenderEverythingBarRoads"); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); SetCullMode(rwCULLMODECULLBACK); @@ -299,6 +307,7 @@ CRenderer::RenderEverythingBarRoads(void) }else RenderOneNonRoad(e); } + POP_RENDERGROUP(); } void @@ -306,6 +315,7 @@ CRenderer::RenderBoats(void) { CLink *node; + PUSH_RENDERGROUP("CRenderer::RenderBoats"); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); SetCullMode(rwCULLMODECULLBACK); @@ -334,6 +344,7 @@ CRenderer::RenderBoats(void) CVehicle *v = (CVehicle*)node->item.ent; RenderOneNonRoad(v); } + POP_RENDERGROUP(); } #ifdef NEW_RENDERER @@ -437,6 +448,7 @@ CRenderer::RenderWorld(int pass) switch(pass){ case 0: // Roads + PUSH_RENDERGROUP("CRenderer::RenderWorld - Roads"); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); for(i = 0; i < ms_nNoOfVisibleBuildings; i++){ e = ms_aVisibleBuildingPtrs[i]; @@ -450,9 +462,11 @@ CRenderer::RenderWorld(int pass) if(e->bIsBIGBuilding || IsRoad(e)) RenderOneBuilding(e, node->item.sort); } + POP_RENDERGROUP(); break; case 1: // Opaque + PUSH_RENDERGROUP("CRenderer::RenderWorld - Opaque"); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); for(i = 0; i < ms_nNoOfVisibleBuildings; i++){ e = ms_aVisibleBuildingPtrs[i]; @@ -473,14 +487,17 @@ CRenderer::RenderWorld(int pass) RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, FALSE); WorldRender::RenderBlendPass(PASS_NOZ); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); + POP_RENDERGROUP(); break; case 2: // Transparent + PUSH_RENDERGROUP("CRenderer::RenderWorld - Transparent"); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE); WorldRender::RenderBlendPass(PASS_ADD); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); WorldRender::RenderBlendPass(PASS_BLEND); + POP_RENDERGROUP(); break; } } @@ -491,11 +508,13 @@ CRenderer::RenderPeds(void) int i; CEntity *e; + PUSH_RENDERGROUP("CRenderer::RenderPeds"); for(i = 0; i < ms_nNoOfVisibleVehicles; i++){ e = ms_aVisibleVehiclePtrs[i]; if(e->IsPed()) RenderOneNonRoad(e); } + POP_RENDERGROUP(); } void @@ -506,6 +525,7 @@ CRenderer::RenderVehicles(void) EntityInfo ei; CLink *node; + PUSH_RENDERGROUP("CRenderer::RenderVehicles"); // not the real thing for(i = 0; i < ms_nNoOfVisibleVehicles; i++){ e = ms_aVisibleVehiclePtrs[i]; @@ -522,6 +542,7 @@ CRenderer::RenderVehicles(void) node != &gSortedVehiclesAndPeds.head; node = node->prev) RenderOneNonRoad(node->item.ent); + POP_RENDERGROUP(); } void @@ -530,6 +551,7 @@ CRenderer::RenderTransparentWater(void) int i; CEntity *e; + PUSH_RENDERGROUP("CRenderer::RenderTransparentWater"); RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); @@ -553,6 +575,7 @@ CRenderer::RenderTransparentWater(void) CWaterLevel::RenderTransparentWater(); SetStencilState(0); + POP_RENDERGROUP(); } void @@ -573,20 +596,24 @@ CRenderer::ClearForFrame(void) void CRenderer::RenderFadingInEntities(void) { + PUSH_RENDERGROUP("CRenderer::RenderFadingInEntities"); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); SetCullMode(rwCULLMODECULLBACK); DeActivateDirectional(); SetAmbientColours(); CVisibilityPlugins::RenderFadingEntities(); + POP_RENDERGROUP(); } void CRenderer::RenderFadingInUnderwaterEntities(void) { + PUSH_RENDERGROUP("CRenderer::RenderFadingInUnderwaterEntities"); DeActivateDirectional(); SetAmbientColours(); CVisibilityPlugins::RenderFadingUnderwaterEntities(); + POP_RENDERGROUP(); } void @@ -1646,186 +1673,3 @@ CRenderer::RemoveVehiclePedLights(CEntity *ent, bool reset) SetAmbientColours(); DeActivateDirectional(); } - - -#include "postfx.h" - -static RwIm2DVertex Screen2EnvQuad[4]; -static RwImVertexIndex EnvQuadIndices[6] = { 0, 1, 2, 0, 2, 3 }; - -static void -SetQuadVertices(RwRaster *env, RwRaster *screen, float z) -{ - uint32 width = RwRasterGetWidth(env); - uint32 height = RwRasterGetHeight(env); - - float zero, xmax, ymax; - - zero = -HALFPX; - xmax = width - HALFPX; - ymax = height - HALFPX; - - float recipz = 1.0f/z; - float umax = (float)SCREEN_WIDTH/RwRasterGetWidth(screen); - float vmax = (float)SCREEN_HEIGHT/RwRasterGetHeight(screen); - - RwIm2DVertexSetScreenX(&Screen2EnvQuad[0], zero); - RwIm2DVertexSetScreenY(&Screen2EnvQuad[0], zero); - RwIm2DVertexSetScreenZ(&Screen2EnvQuad[0], RwIm2DGetNearScreenZ()); - RwIm2DVertexSetCameraZ(&Screen2EnvQuad[0], z); - RwIm2DVertexSetRecipCameraZ(&Screen2EnvQuad[0], recipz); - RwIm2DVertexSetU(&Screen2EnvQuad[0], 0.0f, recipz); - RwIm2DVertexSetV(&Screen2EnvQuad[0], 0.0f, recipz); - RwIm2DVertexSetIntRGBA(&Screen2EnvQuad[0], 255, 255, 255, 255); - - RwIm2DVertexSetScreenX(&Screen2EnvQuad[1], zero); - RwIm2DVertexSetScreenY(&Screen2EnvQuad[1], ymax); - RwIm2DVertexSetScreenZ(&Screen2EnvQuad[1], RwIm2DGetNearScreenZ()); - RwIm2DVertexSetCameraZ(&Screen2EnvQuad[1], z); - RwIm2DVertexSetRecipCameraZ(&Screen2EnvQuad[1], recipz); - RwIm2DVertexSetU(&Screen2EnvQuad[1], 0.0f, recipz); - RwIm2DVertexSetV(&Screen2EnvQuad[1], vmax, recipz); - RwIm2DVertexSetIntRGBA(&Screen2EnvQuad[1], 255, 255, 255, 255); - - RwIm2DVertexSetScreenX(&Screen2EnvQuad[2], xmax); - RwIm2DVertexSetScreenY(&Screen2EnvQuad[2], ymax); - RwIm2DVertexSetScreenZ(&Screen2EnvQuad[2], RwIm2DGetNearScreenZ()); - RwIm2DVertexSetCameraZ(&Screen2EnvQuad[2], z); - RwIm2DVertexSetRecipCameraZ(&Screen2EnvQuad[2], recipz); - RwIm2DVertexSetU(&Screen2EnvQuad[2], umax, recipz); - RwIm2DVertexSetV(&Screen2EnvQuad[2], vmax, recipz); - RwIm2DVertexSetIntRGBA(&Screen2EnvQuad[2], 255, 255, 255, 255); - - RwIm2DVertexSetScreenX(&Screen2EnvQuad[3], xmax); - RwIm2DVertexSetScreenY(&Screen2EnvQuad[3], zero); - RwIm2DVertexSetScreenZ(&Screen2EnvQuad[3], RwIm2DGetNearScreenZ()); - RwIm2DVertexSetCameraZ(&Screen2EnvQuad[3], z); - RwIm2DVertexSetRecipCameraZ(&Screen2EnvQuad[3], recipz); - RwIm2DVertexSetU(&Screen2EnvQuad[3], umax, recipz); - RwIm2DVertexSetV(&Screen2EnvQuad[3], 0.0f, recipz); - RwIm2DVertexSetIntRGBA(&Screen2EnvQuad[3], 255, 255, 255, 255); -} - -static RwIm2DVertex coronaVerts[4*4]; -static RwImVertexIndex coronaIndices[6*4]; -static int numCoronaVerts, numCoronaIndices; - -static void -AddCorona(float x, float y, float sz) -{ - float nearz, recipz; - RwIm2DVertex *v; - nearz = RwIm2DGetNearScreenZ(); - float z = RwCameraGetNearClipPlane(RwCameraGetCurrentCamera()); - recipz = 1.0f/z; - - v = &coronaVerts[numCoronaVerts]; - RwIm2DVertexSetScreenX(&v[0], x); - RwIm2DVertexSetScreenY(&v[0], y); - RwIm2DVertexSetScreenZ(&v[0], z); - RwIm2DVertexSetScreenZ(&v[0], nearz); - RwIm2DVertexSetRecipCameraZ(&v[0], recipz); - RwIm2DVertexSetU(&v[0], 0.0f, recipz); - RwIm2DVertexSetV(&v[0], 0.0f, recipz); - RwIm2DVertexSetIntRGBA(&v[0], 255, 255, 255, 255); - - RwIm2DVertexSetScreenX(&v[1], x); - RwIm2DVertexSetScreenY(&v[1], y + sz); - RwIm2DVertexSetScreenZ(&v[1], z); - RwIm2DVertexSetScreenZ(&v[1], nearz); - RwIm2DVertexSetRecipCameraZ(&v[1], recipz); - RwIm2DVertexSetU(&v[1], 0.0f, recipz); - RwIm2DVertexSetV(&v[1], 1.0f, recipz); - RwIm2DVertexSetIntRGBA(&v[1], 255, 255, 255, 255); - - RwIm2DVertexSetScreenX(&v[2], x + sz); - RwIm2DVertexSetScreenY(&v[2], y + sz); - RwIm2DVertexSetScreenZ(&v[2], z); - RwIm2DVertexSetScreenZ(&v[2], nearz); - RwIm2DVertexSetRecipCameraZ(&v[2], recipz); - RwIm2DVertexSetU(&v[2], 1.0f, recipz); - RwIm2DVertexSetV(&v[2], 1.0f, recipz); - RwIm2DVertexSetIntRGBA(&v[2], 255, 255, 255, 255); - - RwIm2DVertexSetScreenX(&v[3], x + sz); - RwIm2DVertexSetScreenY(&v[3], y); - RwIm2DVertexSetScreenZ(&v[3], z); - RwIm2DVertexSetScreenZ(&v[3], nearz); - RwIm2DVertexSetRecipCameraZ(&v[3], recipz); - RwIm2DVertexSetU(&v[3], 1.0f, recipz); - RwIm2DVertexSetV(&v[3], 0.0f, recipz); - RwIm2DVertexSetIntRGBA(&v[3], 255, 255, 255, 255); - - - coronaIndices[numCoronaIndices++] = numCoronaVerts; - coronaIndices[numCoronaIndices++] = numCoronaVerts + 1; - coronaIndices[numCoronaIndices++] = numCoronaVerts + 2; - coronaIndices[numCoronaIndices++] = numCoronaVerts; - coronaIndices[numCoronaIndices++] = numCoronaVerts + 2; - coronaIndices[numCoronaIndices++] = numCoronaVerts + 3; - numCoronaVerts += 4; -} -#include "Debug.h" - -static void -DrawEnvMapCoronas(float heading) -{ - RwRaster *rt = RwTextureGetRaster(CustomPipes::EnvMapTex); - const float BIG = 89.0f * RwRasterGetWidth(rt)/128.0f; - const float SMALL = 38.0f * RwRasterGetHeight(rt)/128.0f; - - float x; - numCoronaVerts = 0; - numCoronaIndices = 0; - x = (heading - PI)/TWOPI;// - 1.0f; - x *= BIG+SMALL; - AddCorona(x, 0.0f, BIG); x += BIG; - AddCorona(x, 12.0f, SMALL); x += SMALL; - AddCorona(x, 0.0f, BIG); x += BIG; - AddCorona(x, 12.0f, SMALL); x += SMALL; - - RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE); - RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE); - RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); - RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpCoronaTexture[CCoronas::TYPE_STAR])); - RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, coronaVerts, numCoronaVerts, coronaIndices, numCoronaIndices); - RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); - RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); - RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); -} - -void -CRenderer::GenerateEnvironmentMap(void) -{ - // We'll probably do this differently eventually - // re-using all sorts of stuff here... - - CPostFX::GetBackBuffer(Scene.camera); - - RwCameraBeginUpdate(CustomPipes::EnvMapCam); - - // get current scene - SetQuadVertices(RwTextureGetRaster(CustomPipes::EnvMapTex), CPostFX::pBackBuffer, RwCameraGetNearClipPlane(RwCameraGetCurrentCamera())); - RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); - RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); - RwRenderStateSet(rwRENDERSTATETEXTURERASTER, CPostFX::pBackBuffer); - RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR); - RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); - RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Screen2EnvQuad, 4, EnvQuadIndices, 6); - RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE); - RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); - - // Draw coronas - if(CustomPipes::VehiclePipeSwitch != CustomPipes::VEHICLEPIPE_MOBILE) - DrawEnvMapCoronas(TheCamera.GetForward().Heading()); - - RwCameraEndUpdate(CustomPipes::EnvMapCam); - - - RwCameraBeginUpdate(Scene.camera); - - if(gbRenderDebugEnvMap){ - RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(CustomPipes::EnvMapTex)); - RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, CustomPipes::EnvScreenQuad, 4, (RwImVertexIndex*)CustomPipes::QuadIndices, 6); - } -} diff --git a/src/render/Renderer.h b/src/render/Renderer.h index a4b6b0b..9b20209 100644 --- a/src/render/Renderer.h +++ b/src/render/Renderer.h @@ -102,6 +102,4 @@ public: static void RenderTransparentWater(void); // keep-out polys and transparent water #endif static void InsertEntityIntoList(CEntity *ent); - - static void GenerateEnvironmentMap(void); }; diff --git a/src/render/Rubbish.cpp b/src/render/Rubbish.cpp index bd69f87..147c97b 100644 --- a/src/render/Rubbish.cpp +++ b/src/render/Rubbish.cpp @@ -54,6 +54,8 @@ CRubbish::Render(void) if(RubbishVisibility == 0) return; + PUSH_RENDERGROUP("CRubbish::Render"); + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); @@ -150,6 +152,8 @@ CRubbish::Render(void) RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); + + POP_RENDERGROUP(); } void diff --git a/src/render/Shadows.cpp b/src/render/Shadows.cpp index d4f75a2..ae07982 100644 --- a/src/render/Shadows.cpp +++ b/src/render/Shadows.cpp @@ -76,14 +76,14 @@ CShadows::Init(void) gpShadowBikeTex = RwTextureRead("shad_bike", nil); gpShadowBaronTex = RwTextureRead("shad_rcbaron", nil); gpShadowExplosionTex = RwTextureRead("shad_exp", nil); - gpShadowHeadLightsTex = RwTextureRead("headlight_single", nil); + gpShadowHeadLightsTex = RwTextureRead("headlight", nil); gpOutline1Tex = RwTextureRead("outline_64", nil); gpOutline2Tex = RwTextureRead("outline2_64", nil); gpOutline3Tex = RwTextureRead("outline3_64", nil); gpBloodPoolTex = RwTextureRead("bloodpool_64", nil); - //gpReflectionTex = RwTextureRead("reflection01", nil); + gpReflectionTex = RwTextureRead("reflection01", nil); gpWalkDontTex = RwTextureRead("walk_dont", nil); - //gpCrackedGlassTex = RwTextureRead("wincrack_32", nil); + gpCrackedGlassTex = RwTextureRead("wincrack_32", nil); gpPostShadowTex = RwTextureRead("lamp_shad_64", nil); CTxdStore::PopCurrentTxd(); @@ -99,9 +99,9 @@ CShadows::Init(void) ASSERT(gpOutline2Tex != nil); ASSERT(gpOutline3Tex != nil); ASSERT(gpBloodPoolTex != nil); - //ASSERT(gpReflectionTex != nil); + ASSERT(gpReflectionTex != nil); ASSERT(gpWalkDontTex != nil); - //ASSERT(gpCrackedGlassTex != nil); + ASSERT(gpCrackedGlassTex != nil); ASSERT(gpPostShadowTex != nil); @@ -178,9 +178,9 @@ CShadows::Shutdown(void) ASSERT(gpOutline2Tex != nil); ASSERT(gpOutline3Tex != nil); ASSERT(gpBloodPoolTex != nil); - //ASSERT(gpReflectionTex != nil); + ASSERT(gpReflectionTex != nil); ASSERT(gpWalkDontTex != nil); - //ASSERT(gpCrackedGlassTex != nil); + ASSERT(gpCrackedGlassTex != nil); ASSERT(gpPostShadowTex != nil); RwTextureDestroy(gpShadowCarTex); @@ -194,9 +194,9 @@ CShadows::Shutdown(void) RwTextureDestroy(gpOutline2Tex); RwTextureDestroy(gpOutline3Tex); RwTextureDestroy(gpBloodPoolTex); - //RwTextureDestroy(gpReflectionTex); + RwTextureDestroy(gpReflectionTex); RwTextureDestroy(gpWalkDontTex); - //RwTextureDestroy(gpCrackedGlassTex); + RwTextureDestroy(gpCrackedGlassTex); RwTextureDestroy(gpPostShadowTex); } @@ -1068,6 +1068,8 @@ CShadows::SetRenderModeForShadowType(uint8 ShadowType) void CShadows::RenderStoredShadows(void) { + PUSH_RENDERGROUP("CShadows::RenderStoredShadows"); + RenderBuffer::ClearRenderBuffer(); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void *)FALSE); @@ -1241,12 +1243,16 @@ CShadows::RenderStoredShadows(void) RwRenderStateSet(rwRENDERSTATETEXTUREADDRESS, (void *)rwTEXTUREADDRESSWRAP); ShadowsStoredToBeRendered = 0; + + POP_RENDERGROUP(); } void CShadows::RenderStaticShadows(void) { + PUSH_RENDERGROUP("CShadows::RenderStaticShadows"); + RenderBuffer::ClearRenderBuffer(); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void *)FALSE); @@ -1313,6 +1319,8 @@ CShadows::RenderStaticShadows(void) RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void *)TRUE); + + POP_RENDERGROUP(); } diff --git a/src/render/Skidmarks.cpp b/src/render/Skidmarks.cpp index 07039c1..08df330 100644 --- a/src/render/Skidmarks.cpp +++ b/src/render/Skidmarks.cpp @@ -96,6 +96,8 @@ CSkidmarks::Render(void) { int i, j; + PUSH_RENDERGROUP("CSkidmarks::Render"); + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); @@ -152,6 +154,8 @@ CSkidmarks::Render(void) RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE); + + POP_RENDERGROUP(); } void diff --git a/src/render/SpecialFX.cpp b/src/render/SpecialFX.cpp index 161bf16..b44848f 100644 --- a/src/render/SpecialFX.cpp +++ b/src/render/SpecialFX.cpp @@ -164,6 +164,7 @@ CSpecialFX::Shutdown(void) void CSpecialFX::Render(void) { + PUSH_RENDERGROUP("CSpecialFX::Render"); CMotionBlurStreaks::Render(); CBulletTraces::Render(); CBrightLights::Render(); @@ -173,6 +174,7 @@ CSpecialFX::Render(void) if(!(gbNewRenderer && FredIsInFirstPersonCam())) #endif C3dMarkers::Render(); + POP_RENDERGROUP(); } void @@ -877,7 +879,7 @@ C3dMarkers::PlaceMarker(uint32 identifier, uint16 type, CVector &pos, float size pMarker->m_Matrix.GetPosition() = pos; if (pMarker->m_bFindZOnNextPlacement) { - if ((playerPos - pos).MagnitudeSqr() < sq(100.f) && CColStore::HasCollisionLoaded(pos)) { + 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; @@ -893,7 +895,7 @@ 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) { - if ((playerPos - pos).MagnitudeSqr() < sq(100.f) && CColStore::HasCollisionLoaded(pos)) { + 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; diff --git a/src/render/Sprite.cpp b/src/render/Sprite.cpp index 0e4d4fc..ba6ab29 100644 --- a/src/render/Sprite.cpp +++ b/src/render/Sprite.cpp @@ -10,19 +10,6 @@ float CSprite::m_f2DFarScreenZ; float CSprite::m_fRecipNearClipPlane; int32 CSprite::m_bFlushSpriteBufferSwitchZTest; -float CalcScreenZ(float z) -{ - // LCS TODO: check - - if ( z == 0.0f ) - return CSprite::GetNearScreenZ(); - - return (z - CDraw::GetNearClipZ()) - * (CSprite::GetFarScreenZ() - CSprite::GetNearScreenZ()) * CDraw::GetFarClipZ() - / ( (CDraw::GetFarClipZ() - CDraw::GetNearClipZ()) * z ) - + CSprite::GetNearScreenZ(); -} - float CSprite::CalcHorizonCoors(void) { diff --git a/src/render/Sprite.h b/src/render/Sprite.h index 952837a..fae6684 100644 --- a/src/render/Sprite.h +++ b/src/render/Sprite.h @@ -29,5 +29,3 @@ public: static void RenderBufferedOneXLUSprite2D_Rotate_Dimension(float x, float y, float w, float h, const RwRGBA &colour, int16 intens, float rotation, uint8 alpha); }; - -extern float CalcScreenZ(float z); \ No newline at end of file diff --git a/src/render/Timecycle.cpp b/src/render/Timecycle.cpp index 8a3efd8..95d9fe3 100644 --- a/src/render/Timecycle.cpp +++ b/src/render/Timecycle.cpp @@ -134,61 +134,6 @@ float CTimeCycle::m_fShadowSideY[16]; float CTimeCycle::m_fShadowDisplacementX[16]; float CTimeCycle::m_fShadowDisplacementY[16]; - - -static float tmp_nAmbientRed[NUMHOURS][NUMWEATHERS]; -static float tmp_nAmbientGreen[NUMHOURS][NUMWEATHERS]; -static float tmp_nAmbientBlue[NUMHOURS][NUMWEATHERS]; -static float tmp_nAmbientRed_Obj[NUMHOURS][NUMWEATHERS]; -static float tmp_nAmbientGreen_Obj[NUMHOURS][NUMWEATHERS]; -static float tmp_nAmbientBlue_Obj[NUMHOURS][NUMWEATHERS]; -static float tmp_nAmbientRed_Bl[NUMHOURS][NUMWEATHERS]; -static float tmp_nAmbientGreen_Bl[NUMHOURS][NUMWEATHERS]; -static float tmp_nAmbientBlue_Bl[NUMHOURS][NUMWEATHERS]; -static float tmp_nAmbientRed_Obj_Bl[NUMHOURS][NUMWEATHERS]; -static float tmp_nAmbientGreen_Obj_Bl[NUMHOURS][NUMWEATHERS]; -static float tmp_nAmbientBlue_Obj_Bl[NUMHOURS][NUMWEATHERS]; -static float tmp_nDirectionalRed[NUMHOURS][NUMWEATHERS]; -static float tmp_nDirectionalGreen[NUMHOURS][NUMWEATHERS]; -static float tmp_nDirectionalBlue[NUMHOURS][NUMWEATHERS]; -static float tmp_nSkyTopRed[NUMHOURS][NUMWEATHERS]; -static float tmp_nSkyTopGreen[NUMHOURS][NUMWEATHERS]; -static float tmp_nSkyTopBlue[NUMHOURS][NUMWEATHERS]; -static float tmp_nSkyBottomRed[NUMHOURS][NUMWEATHERS]; -static float tmp_nSkyBottomGreen[NUMHOURS][NUMWEATHERS]; -static float tmp_nSkyBottomBlue[NUMHOURS][NUMWEATHERS]; -static float tmp_nSunCoreRed[NUMHOURS][NUMWEATHERS]; -static float tmp_nSunCoreGreen[NUMHOURS][NUMWEATHERS]; -static float tmp_nSunCoreBlue[NUMHOURS][NUMWEATHERS]; -static float tmp_nSunCoronaRed[NUMHOURS][NUMWEATHERS]; -static float tmp_nSunCoronaGreen[NUMHOURS][NUMWEATHERS]; -static float tmp_nSunCoronaBlue[NUMHOURS][NUMWEATHERS]; -static float tmp_fSunSize[NUMHOURS][NUMWEATHERS]; -static float tmp_fSpriteSize[NUMHOURS][NUMWEATHERS]; -static float tmp_fSpriteBrightness[NUMHOURS][NUMWEATHERS]; -static float tmp_nShadowStrength[NUMHOURS][NUMWEATHERS]; -static float tmp_nLightShadowStrength[NUMHOURS][NUMWEATHERS]; -static float tmp_nPoleShadowStrength[NUMHOURS][NUMWEATHERS]; -static float tmp_fFogStart[NUMHOURS][NUMWEATHERS]; -static float tmp_fFarClip[NUMHOURS][NUMWEATHERS]; -static float tmp_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS]; -static float tmp_nLowCloudsRed[NUMHOURS][NUMWEATHERS]; -static float tmp_nLowCloudsGreen[NUMHOURS][NUMWEATHERS]; -static float tmp_nLowCloudsBlue[NUMHOURS][NUMWEATHERS]; -static float tmp_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS]; -static float tmp_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS]; -static float tmp_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS]; -static float tmp_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS]; -static float tmp_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS]; -static float tmp_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS]; -static float tmp_fBlurRed[NUMHOURS][NUMWEATHERS]; -static float tmp_fBlurGreen[NUMHOURS][NUMWEATHERS]; -static float tmp_fBlurBlue[NUMHOURS][NUMWEATHERS]; -static float tmp_fWaterRed[NUMHOURS][NUMWEATHERS]; -static float tmp_fWaterGreen[NUMHOURS][NUMWEATHERS]; -static float tmp_fWaterBlue[NUMHOURS][NUMWEATHERS]; -static float tmp_fWaterAlpha[NUMHOURS][NUMWEATHERS]; - void CTimeCycle::Initialise(void) { @@ -226,7 +171,7 @@ CTimeCycle::Initialise(void) for(h = 0; h < NUMHOURS; h++){ li = 0; while(work_buff[bi] == '/' || work_buff[bi] == '\n' || - work_buff[bi] == '\0' || work_buff[bi] == '\r'){ + work_buff[bi] == '\0' || work_buff[bi] == ' ' || work_buff[bi] == '\r'){ while(work_buff[bi] != '\n' && work_buff[bi] != '\0' && work_buff[bi] != '\r') bi++; bi++; @@ -262,180 +207,65 @@ CTimeCycle::Initialise(void) &blurR, &blurG, &blurB, &waterR, &waterG, &waterB, &waterA); - tmp_nAmbientRed[h][w] = ambR; - tmp_nAmbientGreen[h][w] = ambG; - tmp_nAmbientBlue[h][w] = ambB; - tmp_nAmbientRed_Obj[h][w] = ambobjR; - tmp_nAmbientGreen_Obj[h][w] = ambobjG; - tmp_nAmbientBlue_Obj[h][w] = ambobjB; - tmp_nAmbientRed_Bl[h][w] = ambblR; - tmp_nAmbientGreen_Bl[h][w] = ambblG; - tmp_nAmbientBlue_Bl[h][w] = ambblB; - tmp_nAmbientRed_Obj_Bl[h][w] = ambobjblR; - tmp_nAmbientGreen_Obj_Bl[h][w] = ambobjblG; - tmp_nAmbientBlue_Obj_Bl[h][w] = ambobjblB; - tmp_nDirectionalRed[h][w] = dirR; - tmp_nDirectionalGreen[h][w] = dirG; - tmp_nDirectionalBlue[h][w] = dirB; - tmp_nSkyTopRed[h][w] = skyTopR; - tmp_nSkyTopGreen[h][w] = skyTopG; - tmp_nSkyTopBlue[h][w] = skyTopB; - tmp_nSkyBottomRed[h][w] = skyBotR; - tmp_nSkyBottomGreen[h][w] = skyBotG; - tmp_nSkyBottomBlue[h][w] = skyBotB; - tmp_nSunCoreRed[h][w] = sunCoreR; - tmp_nSunCoreGreen[h][w] = sunCoreG; - tmp_nSunCoreBlue[h][w] = sunCoreB; - tmp_nSunCoronaRed[h][w] = sunCoronaR; - tmp_nSunCoronaGreen[h][w] = sunCoronaG; - tmp_nSunCoronaBlue[h][w] = sunCoronaB; - if(sunSz == -1) - tmp_fSunSize[h][w] = -1; - else - tmp_fSunSize[h][w] = sunSz * 10.0f; - if(sprSz == -1) - tmp_fSpriteSize[h][w] = -1; - else - tmp_fSpriteSize[h][w] = sprSz * 10.0f; - if(sprBght == -1) - tmp_fSpriteBrightness[h][w] = -1; - else - tmp_fSpriteBrightness[h][w] = sprBght * 10.0f; - tmp_nShadowStrength[h][w] = shad; - tmp_nLightShadowStrength[h][w] = lightShad; - tmp_nPoleShadowStrength[h][w] = poleShad; - tmp_fFarClip[h][w] = farClp; - tmp_fFogStart[h][w] = fogSt; - if(lightGnd == -1) - tmp_fLightsOnGroundBrightness[h][w] = -1; - else - tmp_fLightsOnGroundBrightness[h][w] = lightGnd * 10.0f; - tmp_nLowCloudsRed[h][w] = cloudR; - tmp_nLowCloudsGreen[h][w] = cloudG; - tmp_nLowCloudsBlue[h][w] = cloudB; - tmp_nFluffyCloudsTopRed[h][w] = fluffyTopR; - tmp_nFluffyCloudsTopGreen[h][w] = fluffyTopG; - tmp_nFluffyCloudsTopBlue[h][w] = fluffyTopB; - tmp_nFluffyCloudsBottomRed[h][w] = fluffyBotR; - tmp_nFluffyCloudsBottomGreen[h][w] = fluffyBotG; - tmp_nFluffyCloudsBottomBlue[h][w] = fluffyBotB; - tmp_fBlurRed[h][w] = blurR; - tmp_fBlurGreen[h][w] = blurG; - tmp_fBlurBlue[h][w] = blurB; - tmp_fWaterRed[h][w] = waterR; - tmp_fWaterGreen[h][w] = waterG; - tmp_fWaterBlue[h][w] = waterB; - tmp_fWaterAlpha[h][w] = waterA; + m_nAmbientRed[h][w] = ambR; + m_nAmbientGreen[h][w] = ambG; + m_nAmbientBlue[h][w] = ambB; + m_nAmbientRed_Obj[h][w] = ambobjR; + m_nAmbientGreen_Obj[h][w] = ambobjG; + m_nAmbientBlue_Obj[h][w] = ambobjB; + m_nAmbientRed_Bl[h][w] = ambblR; + m_nAmbientGreen_Bl[h][w] = ambblG; + m_nAmbientBlue_Bl[h][w] = ambblB; + m_nAmbientRed_Obj_Bl[h][w] = ambobjblR; + m_nAmbientGreen_Obj_Bl[h][w] = ambobjblG; + m_nAmbientBlue_Obj_Bl[h][w] = ambobjblB; + m_nDirectionalRed[h][w] = dirR; + m_nDirectionalGreen[h][w] = dirG; + m_nDirectionalBlue[h][w] = dirB; + m_nSkyTopRed[h][w] = skyTopR; + m_nSkyTopGreen[h][w] = skyTopG; + m_nSkyTopBlue[h][w] = skyTopB; + m_nSkyBottomRed[h][w] = skyBotR; + m_nSkyBottomGreen[h][w] = skyBotG; + m_nSkyBottomBlue[h][w] = skyBotB; + m_nSunCoreRed[h][w] = sunCoreR; + m_nSunCoreGreen[h][w] = sunCoreG; + m_nSunCoreBlue[h][w] = sunCoreB; + m_nSunCoronaRed[h][w] = sunCoronaR; + m_nSunCoronaGreen[h][w] = sunCoronaG; + m_nSunCoronaBlue[h][w] = sunCoronaB; + 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 * 10.0f; + m_nLowCloudsRed[h][w] = cloudR; + m_nLowCloudsGreen[h][w] = cloudG; + m_nLowCloudsBlue[h][w] = cloudB; + m_nFluffyCloudsTopRed[h][w] = fluffyTopR; + m_nFluffyCloudsTopGreen[h][w] = fluffyTopG; + m_nFluffyCloudsTopBlue[h][w] = fluffyTopB; + m_nFluffyCloudsBottomRed[h][w] = fluffyBotR; + m_nFluffyCloudsBottomGreen[h][w] = fluffyBotG; + m_nFluffyCloudsBottomBlue[h][w] = fluffyBotB; + m_fBlurRed[h][w] = blurR; + m_fBlurGreen[h][w] = blurG; + m_fBlurBlue[h][w] = blurB; + m_fWaterRed[h][w] = waterR; + m_fWaterGreen[h][w] = waterG; + m_fWaterBlue[h][w] = waterB; + m_fWaterAlpha[h][w] = waterA; } - UpdateArrays(); - m_FogReduction = 0; debug("CTimeCycle ready\n"); } -template void -FillGaps(T (*out)[NUMWEATHERS], float (*in)[NUMWEATHERS]) -{ - int w; - for(w = 0; w < NUMWEATHERS; w++){ - for(int h = 0; h < NUMHOURS; h++) - out[h][w] = in[h][w]; - -#define NEXT(h) (((h)+1)%NUMHOURS) -#define PREV(h) (((h)+NUMHOURS-1)%NUMHOURS) - int hend, h1, h2; - for(hend = 0; hend < NUMHOURS; hend++) - if(in[hend][w] != -1.0f) - goto foundstart; - return; // this should never happen -foundstart: - // Found the start of a block of filled in entries - for(h1 = NEXT(hend); h1 != hend; h1 = h2){ - // Skip filled in entries - for(; h1 != hend; h1 = NEXT(h1)) - if(in[h1][w] == -1.0f) - goto foundfirst; - break; // all filled in already -foundfirst: - // h1 is now the first -1 after n filled in values - for(h2 = NEXT(h1); ; h2 = NEXT(h2)) - if(in[h2][w] != -1.0f) - goto foundlast; - break; -foundlast: - // h2 is now the first entry after a row of -1s - h1 = PREV(h1); // make h1 the first before a row of -1s - int n = (h2-h1 + NUMHOURS) % NUMHOURS; - if(n == 0) n = NUMHOURS; // can't happen - float step = (in[h2][w] - in[h1][w])/n; - - for(int i = 1; i < n; i++){ - float f = (float)i/n; - out[(h1+i)%NUMHOURS][w] = in[h2][w]*f + in[h1][w]*(1.0f-f); - } - } - } -} - -void -CTimeCycle::UpdateArrays(void) -{ - FillGaps(m_nAmbientRed, tmp_nAmbientRed); - FillGaps(m_nAmbientGreen, tmp_nAmbientGreen); - FillGaps(m_nAmbientBlue, tmp_nAmbientBlue); - FillGaps(m_nAmbientRed_Obj, tmp_nAmbientRed_Obj); - FillGaps(m_nAmbientGreen_Obj, tmp_nAmbientGreen_Obj); - FillGaps(m_nAmbientBlue_Obj, tmp_nAmbientBlue_Obj); - FillGaps(m_nAmbientRed_Bl, tmp_nAmbientRed_Bl); - FillGaps(m_nAmbientGreen_Bl, tmp_nAmbientGreen_Bl); - FillGaps(m_nAmbientBlue_Bl, tmp_nAmbientBlue_Bl); - FillGaps(m_nAmbientRed_Obj_Bl, tmp_nAmbientRed_Obj_Bl); - FillGaps(m_nAmbientGreen_Obj_Bl, tmp_nAmbientGreen_Obj_Bl); - FillGaps(m_nAmbientBlue_Obj_Bl, tmp_nAmbientBlue_Obj_Bl); - FillGaps(m_nDirectionalRed, tmp_nDirectionalRed); - FillGaps(m_nDirectionalGreen, tmp_nDirectionalGreen); - FillGaps(m_nDirectionalBlue, tmp_nDirectionalBlue); - FillGaps(m_nSkyTopRed, tmp_nSkyTopRed); - FillGaps(m_nSkyTopGreen, tmp_nSkyTopGreen); - FillGaps(m_nSkyTopBlue, tmp_nSkyTopBlue); - FillGaps(m_nSkyBottomRed, tmp_nSkyBottomRed); - FillGaps(m_nSkyBottomGreen, tmp_nSkyBottomGreen); - FillGaps(m_nSkyBottomBlue, tmp_nSkyBottomBlue); - FillGaps(m_nSunCoreRed, tmp_nSunCoreRed); - FillGaps(m_nSunCoreGreen, tmp_nSunCoreGreen); - FillGaps(m_nSunCoreBlue, tmp_nSunCoreBlue); - FillGaps(m_nSunCoronaRed, tmp_nSunCoronaRed); - FillGaps(m_nSunCoronaGreen, tmp_nSunCoronaGreen); - FillGaps(m_nSunCoronaBlue, tmp_nSunCoronaBlue); - FillGaps(m_fSunSize, tmp_fSunSize); - FillGaps(m_fSpriteSize, tmp_fSpriteSize); - FillGaps(m_fSpriteBrightness, tmp_fSpriteBrightness); - FillGaps(m_nShadowStrength, tmp_nShadowStrength); - FillGaps(m_nLightShadowStrength, tmp_nLightShadowStrength); - FillGaps(m_nPoleShadowStrength, tmp_nPoleShadowStrength); - FillGaps(m_fFogStart, tmp_fFogStart); - FillGaps(m_fFarClip, tmp_fFarClip); - FillGaps(m_fLightsOnGroundBrightness, tmp_fLightsOnGroundBrightness); - FillGaps(m_nLowCloudsRed, tmp_nLowCloudsRed); - FillGaps(m_nLowCloudsGreen, tmp_nLowCloudsGreen); - FillGaps(m_nLowCloudsBlue, tmp_nLowCloudsBlue); - FillGaps(m_nFluffyCloudsTopRed, tmp_nFluffyCloudsTopRed); - FillGaps(m_nFluffyCloudsTopGreen, tmp_nFluffyCloudsTopGreen); - FillGaps(m_nFluffyCloudsTopBlue, tmp_nFluffyCloudsTopBlue); - FillGaps(m_nFluffyCloudsBottomRed, tmp_nFluffyCloudsBottomRed); - FillGaps(m_nFluffyCloudsBottomGreen, tmp_nFluffyCloudsBottomGreen); - FillGaps(m_nFluffyCloudsBottomBlue, tmp_nFluffyCloudsBottomBlue); - FillGaps(m_fBlurRed, tmp_fBlurRed); - FillGaps(m_fBlurGreen, tmp_fBlurGreen); - FillGaps(m_fBlurBlue, tmp_fBlurBlue); - FillGaps(m_fWaterRed, tmp_fWaterRed); - FillGaps(m_fWaterGreen, tmp_fWaterGreen); - FillGaps(m_fWaterBlue, tmp_fWaterBlue); - FillGaps(m_fWaterAlpha, tmp_fWaterAlpha); -} - static float interp_c0, interp_c1, interp_c2, interp_c3; float CTimeCycle::Interpolate(int8 *a, int8 *b) diff --git a/src/render/Timecycle.h b/src/render/Timecycle.h index d8c333f..da911b7 100644 --- a/src/render/Timecycle.h +++ b/src/render/Timecycle.h @@ -185,7 +185,6 @@ public: static int32 GetWaterAlpha(void) { return m_fCurrentWaterAlpha; } static void Initialise(void); - static void UpdateArrays(void); static void Update(void); static float Interpolate(int8 *a, int8 *b); static float Interpolate(uint8 *a, uint8 *b); diff --git a/src/render/WaterCannon.cpp b/src/render/WaterCannon.cpp index 74fd7be..4976f8a 100644 --- a/src/render/WaterCannon.cpp +++ b/src/render/WaterCannon.cpp @@ -13,16 +13,6 @@ #include "Camera.h" #include "Particle.h" -// --LCS: file done - -#ifdef PSP_WATERCANNON - //PSP: - #define WATER_COLOR 255 -#else - //PS2: - #define WATER_COLOR 127 -#endif - #define WATERCANNONVERTS 4 #define WATERCANNONINDEXES 12 @@ -125,33 +115,23 @@ void CWaterCannon::Update_NewInput(CVector *pos, CVector *dir) m_abUsed[m_nCur] = true; } -static float fWaterCannonU = 0.0f; void CWaterCannon::Render(void) { - extern RwRaster *gpFireHoseRaster; - RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void *)FALSE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void *)TRUE); - RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)gpFireHoseRaster); + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)gpWaterRaster); - fWaterCannonU += CTimer::GetTimeStepInSeconds() * 6.0f; + float v = float(CGeneral::GetRandomNumber() & 255) / 256; + + RwIm3DVertexSetV(&WaterCannonVertices[0], v); + RwIm3DVertexSetV(&WaterCannonVertices[1], v); + RwIm3DVertexSetV(&WaterCannonVertices[2], v); + RwIm3DVertexSetV(&WaterCannonVertices[3], v); - while ( fWaterCannonU >= 1.0f ) - fWaterCannonU -= 1.0f; - - RwIm3DVertexSetU(&WaterCannonVertices[0], -fWaterCannonU); - RwIm3DVertexSetV(&WaterCannonVertices[0], 0.0f); - RwIm3DVertexSetU(&WaterCannonVertices[1], -fWaterCannonU); - RwIm3DVertexSetV(&WaterCannonVertices[1], 1.0f); - RwIm3DVertexSetU(&WaterCannonVertices[2], 1.0f - fWaterCannonU); - RwIm3DVertexSetV(&WaterCannonVertices[2], 0.0f); - RwIm3DVertexSetU(&WaterCannonVertices[3], 1.0f - fWaterCannonU); - RwIm3DVertexSetV(&WaterCannonVertices[3], 1.0f); - int16 pointA = m_nCur % NUM_SEGMENTPOINTS; + int16 pointB = pointA - 1; - int16 pointC = pointA; if ( pointB < 0 ) pointB += NUM_SEGMENTPOINTS; @@ -162,10 +142,6 @@ void CWaterCannon::Render(void) { if ( m_abUsed[pointA] && m_abUsed[pointB] ) { - bool bFirst = false; - if ( i == 0 || m_abUsed[pointA] && !m_abUsed[pointC] ) - bFirst = true; - if ( !bInit ) { CVector cp = CrossProduct(m_avecPos[pointB] - m_avecPos[pointA], TheCamera.GetForward()); @@ -173,25 +149,26 @@ void CWaterCannon::Render(void) bInit = true; } + float dist = float(i*i*i) / 300.0f + 1.0f; float brightness = float(i) / NUM_SEGMENTPOINTS; + int32 color = (int32)((1.0f - brightness*brightness) * 255.0f); + CVector offset = dist * norm; - CVector offset = (float(i)+1.0f) * norm; - - RwIm3DVertexSetRGBA(&WaterCannonVertices[0], WATER_COLOR, WATER_COLOR, WATER_COLOR, bFirst ? 0 : color); + RwIm3DVertexSetRGBA(&WaterCannonVertices[0], color, color, color, color); RwIm3DVertexSetPos (&WaterCannonVertices[0], m_avecPos[pointA].x - offset.x, m_avecPos[pointA].y - offset.y, m_avecPos[pointA].z - offset.z); - RwIm3DVertexSetRGBA(&WaterCannonVertices[1], WATER_COLOR, WATER_COLOR, WATER_COLOR, bFirst ? 0 : color); + RwIm3DVertexSetRGBA(&WaterCannonVertices[1], color, color, color, color); RwIm3DVertexSetPos (&WaterCannonVertices[1], m_avecPos[pointA].x + offset.x, m_avecPos[pointA].y + offset.y, m_avecPos[pointA].z + offset.z); - offset = (float(i+1)+1.0f) * norm; - - RwIm3DVertexSetRGBA(&WaterCannonVertices[2], WATER_COLOR, WATER_COLOR, WATER_COLOR, color); + RwIm3DVertexSetRGBA(&WaterCannonVertices[2], color, color, color, color); RwIm3DVertexSetPos (&WaterCannonVertices[2], m_avecPos[pointB].x - offset.x, m_avecPos[pointB].y - offset.y, m_avecPos[pointB].z - offset.z); - RwIm3DVertexSetRGBA(&WaterCannonVertices[3], WATER_COLOR, WATER_COLOR, WATER_COLOR, color); + RwIm3DVertexSetRGBA(&WaterCannonVertices[3], color, color, color, color); RwIm3DVertexSetPos (&WaterCannonVertices[3], m_avecPos[pointB].x + offset.x, m_avecPos[pointB].y + offset.y, m_avecPos[pointB].z + offset.z); + LittleTest(); + if ( RwIm3DTransform(WaterCannonVertices, WATERCANNONVERTS, NULL, rwIM3D_VERTEXUV) ) { RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, WaterCannonIndexList, WATERCANNONINDEXES); @@ -199,7 +176,6 @@ void CWaterCannon::Render(void) } } - pointC = pointA; pointA = pointB--; if ( pointB < 0 ) pointB += NUM_SEGMENTPOINTS; @@ -331,9 +307,11 @@ void CWaterCannons::Update(void) void CWaterCannons::Render(void) { + PUSH_RENDERGROUP("CWaterCannons::Render"); for ( int32 i = 0; i < NUM_WATERCANNONS; i++ ) { if ( aCannons[i].m_nId != 0 ) aCannons[i].Render(); } + POP_RENDERGROUP(); } diff --git a/src/render/WaterCannon.h b/src/render/WaterCannon.h index 5b60639..a37bdd1 100644 --- a/src/render/WaterCannon.h +++ b/src/render/WaterCannon.h @@ -14,7 +14,6 @@ public: int32 m_nId; int16 m_nCur; uint32 m_nTimeCreated; - int32 field_C; CVector m_avecPos[NUM_SEGMENTPOINTS]; CVector m_avecVelocity[NUM_SEGMENTPOINTS]; bool m_abUsed[NUM_SEGMENTPOINTS]; @@ -26,7 +25,7 @@ public: void PushPeds(void); }; -VALIDATE_SIZE(CWaterCannon, 0x1A0); +VALIDATE_SIZE(CWaterCannon, 412); class CWaterCannons { diff --git a/src/render/WaterCreatures.cpp b/src/render/WaterCreatures.cpp index 4c6c92a..92fb74e 100644 --- a/src/render/WaterCreatures.cpp +++ b/src/render/WaterCreatures.cpp @@ -8,7 +8,6 @@ #include "General.h" #include "Object.h" -/* int CWaterCreatures::nNumActiveSeaLifeForms; CWaterCreature CWaterCreatures::aWaterCreatures[NUM_WATER_CREATURES]; @@ -273,5 +272,4 @@ void CWaterCreatures::RemoveAll() { nNumActiveSeaLifeForms--; } } -} -*/ \ No newline at end of file +} \ No newline at end of file diff --git a/src/render/WaterCreatures.h b/src/render/WaterCreatures.h index 099cc1a..32754a1 100644 --- a/src/render/WaterCreatures.h +++ b/src/render/WaterCreatures.h @@ -2,7 +2,6 @@ class CObject; -/* enum eFishSlotState { WATER_CREATURE_INIT = 0, WATER_CREATURE_ACTIVE, @@ -47,4 +46,4 @@ struct WaterCreatureProperties { float fLevel; float fUnknown; //unused float fWaterDepth; -};*/ \ No newline at end of file +}; \ No newline at end of file diff --git a/src/render/WaterLevel.cpp b/src/render/WaterLevel.cpp index 6bd89ad..0d114db 100644 --- a/src/render/WaterLevel.cpp +++ b/src/render/WaterLevel.cpp @@ -611,14 +611,14 @@ CWaterLevel::TestVisibilityForFineWaterBlocks(const CVector &worldPos) if ((lineEnd.x > WORLD_MIN_X && lineEnd.x < WORLD_MAX_X) && (lineEnd.y > WORLD_MIN_Y && lineEnd.y < WORLD_MAX_Y)) { - if (!CWorld::ProcessLineOfSight(lineStart, lineEnd, col, entity, true, false, false, false, true, false, nil)) + if (!CWorld::ProcessLineOfSight(lineStart, lineEnd, col, entity, true, false, false, false, true, false)) { lineStart.x += 0.4f; lineStart.y += 0.4f; lineEnd.x += 0.4f; lineEnd.y += 0.4f; - if (!CWorld::ProcessLineOfSight(lineStart, lineEnd, col, entity, true, false, false, false, true, false, nil)) + if (!CWorld::ProcessLineOfSight(lineStart, lineEnd, col, entity, true, false, false, false, true, false)) { return false; } @@ -1176,13 +1176,13 @@ CWaterLevel::RenderWater() if ( WavesCalculatedThisFrame ) { RenderSeaBirds(); - //RenderShipsOnHorizon(); - //CParticle::HandleShipsAtHorizonStuff(); - //HandleBeachToysStuff(); + RenderShipsOnHorizon(); + CParticle::HandleShipsAtHorizonStuff(); + HandleBeachToysStuff(); } - //if ( _bSeaLife ) - // HandleSeaLifeForms(); + if ( _bSeaLife ) + HandleSeaLifeForms(); DefinedState(); } @@ -1202,6 +1202,8 @@ CWaterLevel::RenderTransparentWater(void) if ( !CGame::CanSeeWaterFromCurrArea() ) return; + PUSH_RENDERGROUP("CWaterLevel::RenderTransparentWater"); + float fWaterDrawDist = _GetWavyDrawDist(); float fWaterDrawDistLarge = fWaterDrawDist + 90.0f; float fWavySectorMaxRenderDistSqr = SQR(fWaterDrawDist); @@ -1485,6 +1487,8 @@ CWaterLevel::RenderTransparentWater(void) DefinedState(); #endif + + POP_RENDERGROUP(); } void CWaterLevel::RenderOneFlatSmallWaterPoly(float fX, float fY, float fZ, RwRGBA const &color) @@ -3106,7 +3110,6 @@ CWaterLevel::RenderShipsOnHorizon() } } -/* void CWaterLevel::HandleSeaLifeForms() { @@ -3147,7 +3150,7 @@ CWaterLevel::HandleSeaLifeForms() } CWaterCreatures::UpdateAll(); -}*/ +} void CWaterLevel::HandleBeachToysStuff(void) diff --git a/src/render/WaterLevel.h b/src/render/WaterLevel.h index d12fb9f..6d6614d 100644 --- a/src/render/WaterLevel.h +++ b/src/render/WaterLevel.h @@ -1,6 +1,6 @@ #pragma once -#define WATER_X_OFFSET (0.0f) +#define WATER_X_OFFSET (400.0f) #define WATER_Z_OFFSET (0.5f) diff --git a/src/render/Weather.cpp b/src/render/Weather.cpp index 65343a6..ffbd7e8 100644 --- a/src/render/Weather.cpp +++ b/src/render/Weather.cpp @@ -49,11 +49,6 @@ float CWeather::WindClipped; float CWeather::TrafficLightBrightness; bool CWeather::bScriptsForceRain; -bool CWeather::Stored_StateStored; -float CWeather::Stored_InterpolationValue; -int16 CWeather::Stored_OldWeatherType; -int16 CWeather::Stored_NewWeatherType; -float CWeather::Stored_Rain; tRainStreak Streaks[NUM_RAIN_STREAKS]; @@ -328,7 +323,6 @@ void CWeather::Update(void) void CWeather::AddHeatHaze() { - /* if(TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOPDOWN || TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOP_DOWN_PED) return; @@ -340,7 +334,6 @@ void CWeather::AddHeatHaze() 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() @@ -653,26 +646,6 @@ void CWeather::RenderRainStreaks(void) TempBufferIndicesStored = 0; } -void CWeather::StoreWeatherState() -{ - Stored_StateStored = true; - Stored_InterpolationValue = InterpolationValue; - Stored_Rain = Rain; - Stored_NewWeatherType = NewWeatherType; - Stored_OldWeatherType = OldWeatherType; -} - -void CWeather::RestoreWeatherState() -{ -#ifdef FIX_BUGS // it's not used anyway though - Stored_StateStored = false; -#endif - InterpolationValue = Stored_InterpolationValue; - Rain = Stored_Rain; - NewWeatherType = Stored_NewWeatherType; - OldWeatherType = Stored_OldWeatherType; -} - #ifdef SECUROM void CWeather::ForceHurricaneWeather() { diff --git a/src/render/Weather.h b/src/render/Weather.h index 0e7cf9b..bda57d5 100644 --- a/src/render/Weather.h +++ b/src/render/Weather.h @@ -42,11 +42,6 @@ public: static float TrafficLightBrightness; static bool bScriptsForceRain; - static bool Stored_StateStored; - static float Stored_InterpolationValue; - static int16 Stored_OldWeatherType; - static int16 Stored_NewWeatherType; - static float Stored_Rain; static void RenderRainStreaks(void); static void Update(void); @@ -62,8 +57,6 @@ public: static void AddBeastie(); static void ForceHurricaneWeather(); - static void StoreWeatherState(); - static void RestoreWeatherState(); }; enum { diff --git a/src/rw/Lights.cpp b/src/rw/Lights.cpp index 5f8ba82..772e196 100644 --- a/src/rw/Lights.cpp +++ b/src/rw/Lights.cpp @@ -24,7 +24,12 @@ RwRGBAReal DirectionalLightColourForFrame; RwRGBAReal AmbientLightColour; RwRGBAReal DirectionalLightColour; -#define USEBLURCOLORS true // actually CMBlur::BlurOn, but that's always supposed to be on +#ifdef EXTENDED_COLOURFILTER +#include "postfx.h" +#define USEBLURCOLORS CPostFX::UseBlurColours() +#else +#define USEBLURCOLORS CMBlur::BlurOn +#endif void SetLightsWithTimeOfDayColour(RpWorld *) diff --git a/src/rw/RwHelper.cpp b/src/rw/RwHelper.cpp index 186ed87..9b0ba13 100644 --- a/src/rw/RwHelper.cpp +++ b/src/rw/RwHelper.cpp @@ -9,6 +9,7 @@ #endif #ifndef FINAL RtCharset *debugCharset; +bool bDebugRenderGroups; #endif #ifdef PS2_ALPHA_TEST @@ -16,7 +17,7 @@ bool gPS2alphaTest = true; #else bool gPS2alphaTest = false; #endif -bool gBackfaceCulling = false; // can we ever enable this in LCS even? +bool gBackfaceCulling = true; #if !defined(FINAL) || defined(DEBUGMENU) static bool charsetOpen; @@ -102,6 +103,36 @@ SetCullMode(uint32 mode) RwRenderStateSet(rwRENDERSTATECULLMODE, (void*)rwCULLMODECULLNONE); } +#ifndef FINAL +void +PushRendergroup(const char *name) +{ + if(!bDebugRenderGroups) + return; +#if defined(RW_OPENGL) + if(GLAD_GL_KHR_debug) + glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, name); +#elif defined(RW_D3D9) + static WCHAR tmp[256]; + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, tmp, sizeof(tmp)); + D3DPERF_BeginEvent(0xFFFFFFFF, tmp); +#endif +} + +void +PopRendergroup(void) +{ + if(!bDebugRenderGroups) + return; +#if defined(RW_OPENGL) + if(GLAD_GL_KHR_debug) + glPopDebugGroup(); +#elif defined(RW_D3D9) + D3DPERF_EndEvent(); +#endif +} +#endif + RwFrame* GetFirstFrameCallback(RwFrame *child, void *data) { diff --git a/src/rw/RwHelper.h b/src/rw/RwHelper.h index 9352d1f..a3a1928 100644 --- a/src/rw/RwHelper.h +++ b/src/rw/RwHelper.h @@ -1,5 +1,6 @@ #pragma once +extern bool bDebugRenderGroups; extern bool gPS2alphaTest; extern bool gBackfaceCulling; diff --git a/src/rw/TxdStore.cpp b/src/rw/TxdStore.cpp index b7936bc..0bd2971 100644 --- a/src/rw/TxdStore.cpp +++ b/src/rw/TxdStore.cpp @@ -1,7 +1,5 @@ #include "common.h" -#include "main.h" -#include "smallHeap.h" #include "templates.h" #include "General.h" #include "Streaming.h" @@ -11,19 +9,13 @@ CPool *CTxdStore::ms_pTxdPool; RwTexDictionary *CTxdStore::ms_pStoredTxd; -// LCS: file done except unused: -// CTexListStore::RemoveTexListChunk(int) -// CTexListStore::validateRefs(void) -// CTexListStore::Write(base::cRelocatableChunkWriter &) - void CTxdStore::Initialise(void) { - if(gMakeResources && ms_pTxdPool == nil) + if(ms_pTxdPool == nil) ms_pTxdPool = new CPool(TXDSTORESIZE, "TexDictionary"); } -// removed in LCS but we should probably keep it void CTxdStore::Shutdown(void) { @@ -31,7 +23,6 @@ CTxdStore::Shutdown(void) delete ms_pTxdPool; } -// removed in LCS but we should probably keep it void CTxdStore::GameShutdown(void) { @@ -51,7 +42,6 @@ CTxdStore::AddTxdSlot(const char *name) assert(def); def->texDict = nil; def->refCount = 0; - def->refCountGu = 0; strcpy(def->name, name); return ms_pTxdPool->GetJustIndex(def); } @@ -105,11 +95,7 @@ CTxdStore::SetCurrentTxd(int slot) void CTxdStore::Create(int slot) { - TxdDef *def = GetSlot(slot); - def->texDict = RwTexDictionaryCreate(); - // LCS: mobile sets the txd name here, but txds don't really have names - def->refCount = 0; - def->refCountGu = 0; + GetSlot(slot)->texDict = RwTexDictionaryCreate(); } int @@ -124,20 +110,6 @@ CTxdStore::AddRef(int slot) GetSlot(slot)->refCount++; } -void -CTxdStore::AddRefEvenIfNotInMemory(int slot) -{ - GetSlot(slot)->refCount++; -} - -void -CTxdStore::AddRefGu(int slot) -{ - TxdDef *def = GetSlot(slot); - def->refCount++; - def->refCountGu++; -} - void CTxdStore::RemoveRef(int slot) { @@ -145,15 +117,6 @@ CTxdStore::RemoveRef(int slot) CStreaming::RemoveTxd(slot); } -void -CTxdStore::RemoveRefGu(int slot) -{ - TxdDef *def = GetSlot(slot); - def->refCount--; - if(gUseChunkFiles) - def->refCountGu--; -} - void CTxdStore::RemoveRefWithoutDelete(int slot) { @@ -165,31 +128,14 @@ CTxdStore::LoadTxd(int slot, RwStream *stream) { TxdDef *def = GetSlot(slot); - if(stream){ - if(RwStreamFindChunk(stream, rwID_TEXDICTIONARY, nil, nil)){ - def->texDict = RwTexDictionaryGtaStreamRead(stream); - return def->texDict != nil; - } - }else{ - // TODO(LCS)? fall back reading from file + if(RwStreamFindChunk(stream, rwID_TEXDICTIONARY, nil, nil)){ + def->texDict = RwTexDictionaryGtaStreamRead(stream); + return def->texDict != nil; } printf("Failed to load TXD\n"); return false; } -bool -CTxdStore::LoadTxd(int slot, void *data, void *chunk) -{ - TxdDef *def = GetSlot(slot); - def->texDict = (RwTexDictionary*)data; - if(strncasecmp(def->name, "radar", 5) == 0){ - def->refCount = 0; - def->refCountGu = 0; - } - CStreaming::RegisterPointer(&def->texDict, 3, true); - return def->texDict != nil; -} - bool CTxdStore::LoadTxd(int slot, const char *filename) { @@ -206,7 +152,6 @@ CTxdStore::LoadTxd(int slot, const char *filename) return ret; } -// removed in LCS but we should probably keep it bool CTxdStore::StartLoadTxd(int slot, RwStream *stream) { @@ -220,7 +165,6 @@ CTxdStore::StartLoadTxd(int slot, RwStream *stream) } } -// removed in LCS but we should probably keep it bool CTxdStore::FinishLoadTxd(int slot, RwStream *stream) { @@ -230,31 +174,10 @@ CTxdStore::FinishLoadTxd(int slot, RwStream *stream) } void -CTxdStore::RemoveTxd(int slot, bool notChunk) +CTxdStore::RemoveTxd(int slot) { TxdDef *def = GetSlot(slot); - if(def->texDict){ - if(!gUseChunkFiles || notChunk) - RwTexDictionaryDestroy(def->texDict); - else{ - // TODO? Rsl3D specific: RslTextureDestroyDispList for all textures - CStreaming::UnregisterPointer(&def->texDict, 3); - cSmallHeap::msInstance.Free(def->texDict); - } - } + if(def->texDict) + RwTexDictionaryDestroy(def->texDict); def->texDict = nil; - def->refCount = 0; - def->refCountGu = 0; -} - -void -CTxdStore::Load(RwTexDictionary *stored, CPool *pool) -{ - ms_pTxdPool = pool; - ms_pStoredTxd = stored; - for(int i = 0; i < TXDSTORESIZE; i++){ - TxdDef *def = GetSlot(i); - if(def) - def->refCount = def->texDict != nil; - } } diff --git a/src/rw/TxdStore.h b/src/rw/TxdStore.h index 31fcf87..937fd1b 100644 --- a/src/rw/TxdStore.h +++ b/src/rw/TxdStore.h @@ -4,8 +4,7 @@ struct TxdDef { RwTexDictionary *texDict; - int16 refCount; - int16 refCountGu; + int refCount; char name[20]; }; @@ -27,19 +26,13 @@ public: static void Create(int slot); static int GetNumRefs(int slot); static void AddRef(int slot); - static void AddRefEvenIfNotInMemory(int slot); - static void AddRefGu(int slot); static void RemoveRef(int slot); - static void RemoveRefGu(int slot); static void RemoveRefWithoutDelete(int slot); static bool LoadTxd(int slot, RwStream *stream); - static bool LoadTxd(int slot, void *data, void *chunk); static bool LoadTxd(int slot, const char *filename); static bool StartLoadTxd(int slot, RwStream *stream); static bool FinishLoadTxd(int slot, RwStream *stream); - static void RemoveTxd(int slot, bool notChunk = false); - - static void Load(RwTexDictionary *stored, CPool *pool); + static void RemoveTxd(int slot); static TxdDef *GetSlot(int slot) { assert(slot >= 0); diff --git a/src/rw/VisibilityPlugins.cpp b/src/rw/VisibilityPlugins.cpp index 69e30c1..01db546 100644 --- a/src/rw/VisibilityPlugins.cpp +++ b/src/rw/VisibilityPlugins.cpp @@ -233,7 +233,9 @@ CVisibilityPlugins::RenderFadingEntities(CLinkList &list) DeActivateDirectional(); SetAmbientColours(); e->bImBeingRendered = true; + PUSH_RENDERGROUP(mi->GetModelName()); RenderFadingAtomic((RpAtomic*)e->m_rwObject, node->item.sort); + POP_RENDERGROUP(); e->bImBeingRendered = false; }else CRenderer::RenderOneNonRoad(e); @@ -265,7 +267,6 @@ CVisibilityPlugins::RenderWheelAtomicCB(RpAtomic *atomic) mi = GetAtomicModelInfo(atomic); len = Sqrt(DistToCameraSq); - len *= 0.5f; // HACK HACK, LOD wheels look shite lodatm = mi->GetAtomicFromDistance(len * TheCamera.LODDistMultiplier / VEHICLE_LODDIST_MULTIPLIER); if(lodatm){ if(RpAtomicGetGeometry(lodatm) != RpAtomicGetGeometry(atomic)) @@ -464,14 +465,6 @@ CVisibilityPlugins::RenderVehicleHiDetailCB_Boat(RpAtomic *atomic) return atomic; } -RpAtomic* -CVisibilityPlugins::RenderVehicleHiDetailCB_Boat_Far(RpAtomic *atomic) -{ - if(DistToCameraSq < ms_bigVehicleLod1Dist) - RENDERCALLBACK(atomic); - return atomic; -} - RpAtomic* CVisibilityPlugins::RenderVehicleHiDetailAlphaCB_Boat(RpAtomic *atomic) { @@ -502,23 +495,6 @@ CVisibilityPlugins::RenderVehicleLoDetailCB_Boat(RpAtomic *atomic) return atomic; } -RpAtomic* -CVisibilityPlugins::RenderVehicleLoDetailCB_Boat_Far(RpAtomic *atomic) -{ - RpClump *clump; - int32 alpha; - - clump = RpAtomicGetClump(atomic); - if(DistToCameraSq >= ms_bigVehicleLod1Dist){ - alpha = GetClumpAlpha(clump); - if(alpha == 255) - RENDERCALLBACK(atomic); - else - RenderAlphaAtomic(atomic, alpha); - } - return atomic; -} - RpAtomic* CVisibilityPlugins::RenderVehicleLowDetailCB_BigVehicle(RpAtomic *atomic) { @@ -677,9 +653,8 @@ CVisibilityPlugins::RenderVehicleTailRotorAlphaCB(RpAtomic *atomic) RpAtomic* CVisibilityPlugins::RenderPlayerCB(RpAtomic *atomic) { -// LCS: removed -// if(CWorld::Players[0].m_pSkinTexture) -// RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), SetTextureCB, CWorld::Players[0].m_pSkinTexture); + if(CWorld::Players[0].m_pSkinTexture) + RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), SetTextureCB, CWorld::Players[0].m_pSkinTexture); RENDERCALLBACK(atomic); return atomic; } diff --git a/src/rw/VisibilityPlugins.h b/src/rw/VisibilityPlugins.h index f188096..9cdbc0c 100644 --- a/src/rw/VisibilityPlugins.h +++ b/src/rw/VisibilityPlugins.h @@ -61,9 +61,7 @@ public: static RpAtomic *RenderVehicleHiDetailAlphaCB_BigVehicle(RpAtomic *atomic); static RpAtomic *RenderVehicleHiDetailCB_Boat(RpAtomic *atomic); static RpAtomic *RenderVehicleHiDetailAlphaCB_Boat(RpAtomic *atomic); - static RpAtomic *RenderVehicleHiDetailCB_Boat_Far(RpAtomic *atomic); static RpAtomic *RenderVehicleLoDetailCB_Boat(RpAtomic *atomic); - static RpAtomic *RenderVehicleLoDetailCB_Boat_Far(RpAtomic *atomic); static RpAtomic *RenderVehicleLowDetailCB_BigVehicle(RpAtomic *atomic); static RpAtomic *RenderVehicleLowDetailAlphaCB_BigVehicle(RpAtomic *atomic); static RpAtomic *RenderVehicleReallyLowDetailCB(RpAtomic *atomic); diff --git a/src/save/GenericGameStorage.cpp b/src/save/GenericGameStorage.cpp index 0bab543..a97e9af 100644 --- a/src/save/GenericGameStorage.cpp +++ b/src/save/GenericGameStorage.cpp @@ -42,7 +42,7 @@ #include "Fluff.h" #define BLOCK_COUNT 22 -#define SIZE_OF_SIMPLEVARS 0xE8 +#define SIZE_OF_SIMPLEVARS 0xE4 const uint32 SIZE_OF_ONE_GAME_IN_BYTES = 201729; @@ -228,7 +228,7 @@ GenericSave(int file) totalSize = buf - work_buff; // Save the rest - //WriteSaveDataBlock(CPools::SavePedPool, "PedPoolSize"); + WriteSaveDataBlock(CPools::SavePedPool, "PedPoolSize"); WriteSaveDataBlock(CGarages::Save, "GaragesSize"); WriteSaveDataBlock(CGameLogic::Save, "GameLogicSize"); WriteSaveDataBlock(CPools::SaveVehiclePool, "VehPoolSize"); @@ -363,8 +363,8 @@ GenericLoad() ReadDataFromBlock("Loading Scripts \n", CTheScripts::LoadAllScripts); // Load the rest - //LoadSaveDataBlock(); - //ReadDataFromBlock("Loading PedPool \n", CPools::LoadPedPool); + LoadSaveDataBlock(); + ReadDataFromBlock("Loading PedPool \n", CPools::LoadPedPool); LoadSaveDataBlock(); ReadDataFromBlock("Loading Garages \n", CGarages::Load); LoadSaveDataBlock(); diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index a703ed5..f5195b8 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -50,16 +50,30 @@ long _dwOperatingSystemVersion; #include "Font.h" #include "MemoryMgr.h" -#define MAX_SUBSYSTEMS (16) +// We found out that GLFW's keyboard input handling is still pretty delayed/not stable, so now we fetch input from X11 directly on Linux. +#if !defined _WIN32 && !defined __APPLE__ && !defined __SWITCH__ // && !defined WAYLAND +#define GET_KEYBOARD_INPUT_FROM_X11 +#endif + +#ifdef GET_KEYBOARD_INPUT_FROM_X11 +#include +#include +#define GLFW_EXPOSE_NATIVE_X11 +#include +#endif #ifdef _WIN32 #define GLFW_EXPOSE_NATIVE_WIN32 #include #endif +#define MAX_SUBSYSTEMS (16) + rw::EngineOpenParams openParams; static RwBool ForegroundApp = TRUE; +static RwBool WindowIconified = FALSE; +static RwBool WindowFocused = TRUE; static RwBool RwInitialised = FALSE; @@ -325,7 +339,9 @@ psInitialize(void) RsGlobal.ps = &PsGlobal; PsGlobal.fullScreen = FALSE; - PsGlobal.cursorIsInWindow = TRUE; + PsGlobal.cursorIsInWindow = FALSE; + WindowFocused = TRUE; + WindowIconified = FALSE; PsGlobal.joy1id = -1; PsGlobal.joy2id = -1; @@ -849,11 +865,15 @@ psSelectDevice() return TRUE; } +#ifndef GET_KEYBOARD_INPUT_FROM_X11 void keypressCB(GLFWwindow* window, int key, int scancode, int action, int mods); +#endif void resizeCB(GLFWwindow* window, int width, int height); void scrollCB(GLFWwindow* window, double xoffset, double yoffset); void cursorCB(GLFWwindow* window, double xpos, double ypos); void cursorEnterCB(GLFWwindow* window, int entered); +void windowFocusCB(GLFWwindow* window, int focused); +void windowIconifyCB(GLFWwindow* window, int iconified); void joysChangeCB(int jid, int event); bool IsThisJoystickBlacklisted(int i) @@ -962,11 +982,15 @@ void psPostRWinit(void) RwVideoMode vm; RwEngineGetVideoModeInfo(&vm, GcurSelVM); +#ifndef GET_KEYBOARD_INPUT_FROM_X11 glfwSetKeyCallback(PSGLOBAL(window), keypressCB); +#endif glfwSetFramebufferSizeCallback(PSGLOBAL(window), resizeCB); glfwSetScrollCallback(PSGLOBAL(window), scrollCB); glfwSetCursorPosCallback(PSGLOBAL(window), cursorCB); glfwSetCursorEnterCallback(PSGLOBAL(window), cursorEnterCB); + glfwSetWindowIconifyCallback(PSGLOBAL(window), windowIconifyCB); + glfwSetWindowFocusCallback(PSGLOBAL(window), windowFocusCB); glfwSetJoystickCallback(joysChangeCB); _InputInitialiseJoys(); @@ -1318,6 +1342,10 @@ void scrollCB(GLFWwindow* window, double xoffset, double yoffset) { PSGLOBAL(mouseWheel) = yoffset; } +bool lshiftStatus = false; +bool rshiftStatus = false; + +#ifndef GET_KEYBOARD_INPUT_FROM_X11 int keymap[GLFW_KEY_LAST + 1]; static void @@ -1448,9 +1476,6 @@ initkeymap(void) keymap[GLFW_KEY_MENU] = rsNULL; } -bool lshiftStatus = false; -bool rshiftStatus = false; - void keypressCB(GLFWwindow* window, int key, int scancode, int action, int mods) { @@ -1468,6 +1493,266 @@ keypressCB(GLFWwindow* window, int key, int scancode, int action, int mods) } } +#else + +uint32 keymap[512]; // 256 ascii + 256 KeySyms between 0xff00 - 0xffff +bool keyStates[512]; +uint32 keyCodeToKeymapIndex[256]; // cache for physical keys + +#define KEY_MAP_OFFSET (0xff00 - 256) +static void +initkeymap(void) +{ + Display *display = glfwGetX11Display(); + int i; + + for (i = 0; i < ARRAY_SIZE(keymap); i++) + keymap[i] = rsNULL; + + // You can add new ASCII mappings to here freely (but beware that if right hand side of assignment isn't supported on CFont, it'll be blank/won't work on binding screen) + // Right hand side of assigments should always be uppercase counterpart of character + keymap[XK_space] = ' '; + keymap[XK_apostrophe] = '\''; + keymap[XK_ampersand] = '&'; + keymap[XK_percent] = '%'; + keymap[XK_dollar] = '$'; + keymap[XK_comma] = ','; + keymap[XK_minus] = '-'; + keymap[XK_period] = '.'; + keymap[XK_slash] = '/'; + keymap[XK_question] = '?'; + keymap[XK_exclam] = '!'; + keymap[XK_quotedbl] = '"'; + keymap[XK_colon] = ':'; + keymap[XK_semicolon] = ';'; + keymap[XK_equal] = '='; + keymap[XK_bracketleft] = '['; + keymap[XK_backslash] = '\\'; + keymap[XK_bracketright] = ']'; + keymap[XK_grave] = '`'; + keymap[XK_0] = '0'; + keymap[XK_1] = '1'; + keymap[XK_2] = '2'; + keymap[XK_3] = '3'; + keymap[XK_4] = '4'; + keymap[XK_5] = '5'; + keymap[XK_6] = '6'; + keymap[XK_7] = '7'; + keymap[XK_8] = '8'; + keymap[XK_9] = '9'; + keymap[XK_a] = 'A'; + keymap[XK_b] = 'B'; + keymap[XK_c] = 'C'; + keymap[XK_d] = 'D'; + keymap[XK_e] = 'E'; + keymap[XK_f] = 'F'; + keymap[XK_g] = 'G'; + keymap[XK_h] = 'H'; + keymap[XK_i] = 'I'; + keymap[XK_I] = 'I'; // Turkish I problem + keymap[XK_j] = 'J'; + keymap[XK_k] = 'K'; + keymap[XK_l] = 'L'; + keymap[XK_m] = 'M'; + keymap[XK_n] = 'N'; + keymap[XK_o] = 'O'; + keymap[XK_p] = 'P'; + keymap[XK_q] = 'Q'; + keymap[XK_r] = 'R'; + keymap[XK_s] = 'S'; + keymap[XK_t] = 'T'; + keymap[XK_u] = 'U'; + keymap[XK_v] = 'V'; + keymap[XK_w] = 'W'; + keymap[XK_x] = 'X'; + keymap[XK_y] = 'Y'; + keymap[XK_z] = 'Z'; + + // Some of regional but ASCII characters that GTA supports + keymap[XK_agrave] = 0x00c0; + keymap[XK_aacute] = 0x00c1; + keymap[XK_acircumflex] = 0x00c2; + keymap[XK_adiaeresis] = 0x00c4; + + keymap[XK_ae] = 0x00c6; + + keymap[XK_egrave] = 0x00c8; + keymap[XK_eacute] = 0x00c9; + keymap[XK_ecircumflex] = 0x00ca; + keymap[XK_ediaeresis] = 0x00cb; + + keymap[XK_igrave] = 0x00cc; + keymap[XK_iacute] = 0x00cd; + keymap[XK_icircumflex] = 0x00ce; + keymap[XK_idiaeresis] = 0x00cf; + + keymap[XK_ccedilla] = 0x00c7; + keymap[XK_odiaeresis] = 0x00d6; + keymap[XK_udiaeresis] = 0x00dc; + + // These are 0xff00 - 0xffff range of KeySym's, and subtracting KEY_MAP_OFFSET is needed + keymap[XK_Escape - KEY_MAP_OFFSET] = rsESC; + keymap[XK_Return - KEY_MAP_OFFSET] = rsENTER; + keymap[XK_Tab - KEY_MAP_OFFSET] = rsTAB; + keymap[XK_BackSpace - KEY_MAP_OFFSET] = rsBACKSP; + keymap[XK_Insert - KEY_MAP_OFFSET] = rsINS; + keymap[XK_Delete - KEY_MAP_OFFSET] = rsDEL; + keymap[XK_Right - KEY_MAP_OFFSET] = rsRIGHT; + keymap[XK_Left - KEY_MAP_OFFSET] = rsLEFT; + keymap[XK_Down - KEY_MAP_OFFSET] = rsDOWN; + keymap[XK_Up - KEY_MAP_OFFSET] = rsUP; + keymap[XK_Page_Up - KEY_MAP_OFFSET] = rsPGUP; + keymap[XK_Page_Down - KEY_MAP_OFFSET] = rsPGDN; + keymap[XK_Home - KEY_MAP_OFFSET] = rsHOME; + keymap[XK_End - KEY_MAP_OFFSET] = rsEND; + keymap[XK_Caps_Lock - KEY_MAP_OFFSET] = rsCAPSLK; + keymap[XK_Scroll_Lock - KEY_MAP_OFFSET] = rsSCROLL; + keymap[XK_Num_Lock - KEY_MAP_OFFSET] = rsNUMLOCK; + keymap[XK_Pause - KEY_MAP_OFFSET] = rsPAUSE; + + keymap[XK_F1 - KEY_MAP_OFFSET] = rsF1; + keymap[XK_F2 - KEY_MAP_OFFSET] = rsF2; + keymap[XK_F3 - KEY_MAP_OFFSET] = rsF3; + keymap[XK_F4 - KEY_MAP_OFFSET] = rsF4; + keymap[XK_F5 - KEY_MAP_OFFSET] = rsF5; + keymap[XK_F6 - KEY_MAP_OFFSET] = rsF6; + keymap[XK_F7 - KEY_MAP_OFFSET] = rsF7; + keymap[XK_F8 - KEY_MAP_OFFSET] = rsF8; + keymap[XK_F9 - KEY_MAP_OFFSET] = rsF9; + keymap[XK_F10 - KEY_MAP_OFFSET] = rsF10; + keymap[XK_F11 - KEY_MAP_OFFSET] = rsF11; + keymap[XK_F12 - KEY_MAP_OFFSET] = rsF12; + keymap[XK_F13 - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_F14 - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_F15 - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_F16 - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_F17 - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_F18 - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_F19 - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_F20 - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_F21 - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_F22 - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_F23 - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_F24 - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_F25 - KEY_MAP_OFFSET] = rsNULL; + + keymap[XK_KP_0 - KEY_MAP_OFFSET] = rsPADINS; + keymap[XK_KP_1 - KEY_MAP_OFFSET] = rsPADEND; + keymap[XK_KP_2 - KEY_MAP_OFFSET] = rsPADDOWN; + keymap[XK_KP_3 - KEY_MAP_OFFSET] = rsPADPGDN; + keymap[XK_KP_4 - KEY_MAP_OFFSET] = rsPADLEFT; + keymap[XK_KP_5 - KEY_MAP_OFFSET] = rsPAD5; + keymap[XK_KP_6 - KEY_MAP_OFFSET] = rsPADRIGHT; + keymap[XK_KP_7 - KEY_MAP_OFFSET] = rsPADHOME; + keymap[XK_KP_8 - KEY_MAP_OFFSET] = rsPADUP; + keymap[XK_KP_9 - KEY_MAP_OFFSET] = rsPADPGUP; + keymap[XK_KP_Insert - KEY_MAP_OFFSET] = rsPADINS; + keymap[XK_KP_End - KEY_MAP_OFFSET] = rsPADEND; + keymap[XK_KP_Down - KEY_MAP_OFFSET] = rsPADDOWN; + keymap[XK_KP_Page_Down - KEY_MAP_OFFSET] = rsPADPGDN; + keymap[XK_KP_Left - KEY_MAP_OFFSET] = rsPADLEFT; + keymap[XK_KP_Begin - KEY_MAP_OFFSET] = rsPAD5; + keymap[XK_KP_Right - KEY_MAP_OFFSET] = rsPADRIGHT; + keymap[XK_KP_Home - KEY_MAP_OFFSET] = rsPADHOME; + keymap[XK_KP_Up - KEY_MAP_OFFSET] = rsPADUP; + keymap[XK_KP_Page_Up - KEY_MAP_OFFSET] = rsPADPGUP; + + keymap[XK_KP_Decimal - KEY_MAP_OFFSET] = rsPADDEL; + keymap[XK_KP_Divide - KEY_MAP_OFFSET] = rsDIVIDE; + keymap[XK_KP_Multiply - KEY_MAP_OFFSET] = rsTIMES; + keymap[XK_KP_Subtract - KEY_MAP_OFFSET] = rsMINUS; + keymap[XK_KP_Add - KEY_MAP_OFFSET] = rsPLUS; + keymap[XK_KP_Enter - KEY_MAP_OFFSET] = rsPADENTER; + keymap[XK_KP_Equal - KEY_MAP_OFFSET] = rsNULL; + keymap[XK_Shift_L - KEY_MAP_OFFSET] = rsLSHIFT; + keymap[XK_Control_L - KEY_MAP_OFFSET] = rsLCTRL; + keymap[XK_Alt_L - KEY_MAP_OFFSET] = rsLALT; + keymap[XK_Super_L - KEY_MAP_OFFSET] = rsLWIN; + keymap[XK_Shift_R - KEY_MAP_OFFSET] = rsRSHIFT; + keymap[XK_Control_R - KEY_MAP_OFFSET] = rsRCTRL; + keymap[XK_Alt_R - KEY_MAP_OFFSET] = rsRALT; + keymap[XK_Super_R - KEY_MAP_OFFSET] = rsRWIN; + keymap[XK_Menu - KEY_MAP_OFFSET] = rsNULL; + + // Cache the key codes' key symbol equivelants, otherwise we will have to do it on each frame + // KeyCode is always in [0,255], and represents a physical key + + int min_keycode, max_keycode, keysyms_per_keycode; + KeySym *keymap, *origkeymap; + + char *keyboardLang = setlocale (LC_CTYPE, NULL); + setlocale(LC_CTYPE, ""); + + XDisplayKeycodes(display, &min_keycode, &max_keycode); + origkeymap = XGetKeyboardMapping(display, min_keycode, (max_keycode - min_keycode + 1), &keysyms_per_keycode); + keymap = origkeymap; + for (int i = min_keycode; i <= max_keycode; i++) { + int j, lastKeysym; + + lastKeysym = keysyms_per_keycode - 1; + while ((lastKeysym >= 0) && (keymap[lastKeysym] == NoSymbol)) + lastKeysym--; + + for (j = 0; j <= lastKeysym; j++) { + KeySym ks = keymap[j]; + + if (ks == NoSymbol) + continue; + + if (ks < 256) { + keyCodeToKeymapIndex[i] = ks; + break; + } else if (ks >= 0xff00 && ks < 0xffff) { + keyCodeToKeymapIndex[i] = ks - KEY_MAP_OFFSET; + break; + } + } + keymap += keysyms_per_keycode; + } + XFree(origkeymap); + + setlocale(LC_CTYPE, keyboardLang); +} +#undef KEY_MAP_OFFSET + +void checkKeyPresses() +{ + Display *display = glfwGetX11Display(); + char keys[32]; + XQueryKeymap(display, keys); + for (int i = 0; i < sizeof(keys); i++) { + for (int j = 0; j < 8; j++) { + KeyCode keycode = 8 * i + j; + uint32 keymapIndex = keyCodeToKeymapIndex[keycode]; + if (keymapIndex != 0) { + int rsCode = keymap[keymapIndex]; + if (rsCode == rsNULL) + continue; + + bool pressed = WindowFocused && !!(keys[i] & (1 << j)); + + // idk why R* does that + if (rsCode == rsLSHIFT) + lshiftStatus = pressed; + else if (rsCode == rsRSHIFT) + rshiftStatus = pressed; + + if (keyStates[keymapIndex] != pressed) { + if (pressed) { + RsKeyboardEventHandler(rsKEYDOWN, &rsCode); + } else { + RsKeyboardEventHandler(rsKEYUP, &rsCode); + } + } + + keyStates[keymapIndex] = pressed; + } + } + } + +} +#endif + // R* calls that in ControllerConfig, idk why void _InputTranslateShiftKeyUpDown(RsKeyCodes *rs) { @@ -1492,6 +1777,16 @@ cursorEnterCB(GLFWwindow* window, int entered) { PSGLOBAL(cursorIsInWindow) = !!entered; } +void +windowFocusCB(GLFWwindow* window, int focused) { + WindowFocused = !!focused; +} + +void +windowIconifyCB(GLFWwindow* window, int iconified) { + WindowIconified = !!iconified; +} + /* ***************************************************************************** */ @@ -1744,6 +2039,9 @@ main(int argc, char *argv[]) #endif { glfwPollEvents(); +#ifdef GET_KEYBOARD_INPUT_FROM_X11 + checkKeyPresses(); +#endif #ifndef MASTER if (gbModelViewer) { // This is TheModelViewerCore in LCS @@ -1844,8 +2142,8 @@ main(int argc, char *argv[]) printf("Into TheGame!!!\n"); #else - LoadingScreen(nil, nil, "sceelee"); - // LoadingScreen(nil, nil, "sceelee"); // duplicate + LoadingScreen(nil, nil, "loadsc0"); + // LoadingScreen(nil, nil, "loadsc0"); // duplicate #endif if ( !CGame::InitialiseOnceAfterRW() ) RsGlobal.quit = TRUE; @@ -1861,8 +2159,8 @@ main(int argc, char *argv[]) #ifndef PS2_MENU case GS_INIT_FRONTEND: { - LoadingScreen(nil, nil, "sceelee"); - // LoadingScreen(nil, nil, "sceelee"); // duplicate + LoadingScreen(nil, nil, "loadsc0"); + // LoadingScreen(nil, nil, "loadsc0"); // duplicate FrontEndMenuManager.m_bGameNotLoaded = true; @@ -1882,7 +2180,7 @@ main(int argc, char *argv[]) case GS_FRONTEND: { - if(!glfwGetWindowAttrib(PSGLOBAL(window), GLFW_ICONIFIED)) + if(!WindowIconified) RsEventHandler(rsFRONTENDIDLE, nil); #ifdef PS2_MENU diff --git a/src/skel/skeleton.cpp b/src/skel/skeleton.cpp index d580568..2bb2346 100644 --- a/src/skel/skeleton.cpp +++ b/src/skel/skeleton.cpp @@ -397,7 +397,7 @@ RsInitialize(void) */ RwBool result; - RsGlobal.appName = RWSTRING("GTA: Liberty City Stories"); + RsGlobal.appName = RWSTRING("GTA: Vice City"); RsGlobal.maximumWidth = DEFAULT_SCREEN_WIDTH; RsGlobal.maximumHeight = DEFAULT_SCREEN_HEIGHT; RsGlobal.width = DEFAULT_SCREEN_WIDTH; diff --git a/src/skel/win/gtalcs.ico b/src/skel/win/gtalcs.ico deleted file mode 100644 index c4b5343..0000000 Binary files a/src/skel/win/gtalcs.ico and /dev/null differ diff --git a/src/skel/win/gtavc.ico b/src/skel/win/gtavc.ico new file mode 100644 index 0000000..7bfcc5a Binary files /dev/null and b/src/skel/win/gtavc.ico differ diff --git a/src/skel/win/win.cpp b/src/skel/win/win.cpp index 9fdfb1e..21bd0eb 100644 --- a/src/skel/win/win.cpp +++ b/src/skel/win/win.cpp @@ -2273,7 +2273,7 @@ WinMain(HINSTANCE instance, case GS_START_UP: { #ifdef NO_MOVIES - gGameState = GS_INIT_ONCE; + gGameState = gbNoMovies ? GS_INIT_ONCE : GS_INIT_LOGO_MPEG; #else gGameState = GS_INIT_LOGO_MPEG; #endif @@ -2314,8 +2314,11 @@ WinMain(HINSTANCE instance, case GS_INIT_INTRO_MPEG: { -#ifndef NO_MOVIES +#ifdef NO_MOVIES + if (!gbNoMovies) +#endif CloseClip(); +#ifndef FIX_BUGS CoUninitialize(); #endif @@ -2353,8 +2356,11 @@ WinMain(HINSTANCE instance, case GS_INIT_ONCE: { -#ifndef NO_MOVIES +#ifdef NO_MOVIES + if (!gbNoMovies) +#endif CloseClip(); +#ifndef FIX_BUGS CoUninitialize(); #endif @@ -2372,8 +2378,8 @@ WinMain(HINSTANCE instance, printf("Into TheGame!!!\n"); #else - LoadingScreen(nil, nil, "sceelee"); - // LoadingScreen(nil, nil, "sceelee"); // duplicate + LoadingScreen(nil, nil, "loadsc0"); + // LoadingScreen(nil, nil, "loadsc0"); // duplicate #endif if ( !CGame::InitialiseOnceAfterRW() ) RsGlobal.quit = TRUE; @@ -2390,8 +2396,8 @@ WinMain(HINSTANCE instance, #ifndef PS2_MENU case GS_INIT_FRONTEND: { - LoadingScreen(nil, nil, "sceelee"); - // LoadingScreen(nil, nil, "sceelee"); // duplicate + LoadingScreen(nil, nil, "loadsc0"); + // LoadingScreen(nil, nil, "loadsc0"); // duplicate FrontEndMenuManager.m_bGameNotLoaded = true; diff --git a/src/skel/win/win.rc b/src/skel/win/win.rc index 702c3de..9b5aa30 100644 --- a/src/skel/win/win.rc +++ b/src/skel/win/win.rc @@ -42,6 +42,6 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_MAIN_ICON ICON DISCARDABLE "gtalcs.ico" +IDI_MAIN_ICON ICON DISCARDABLE "gtavc.ico" ///////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/src/text/Messages.cpp b/src/text/Messages.cpp index f55e6bd..81339ae 100644 --- a/src/text/Messages.cpp +++ b/src/text/Messages.cpp @@ -11,8 +11,6 @@ #include "Font.h" -#include "Pad.h" - tMessage CMessages::BriefMessages[NUMBRIEFMESSAGES]; tPreviousBrief CMessages::PreviousBriefs[NUMPREVIOUSBRIEFS]; tBigMessage CMessages::BIGMessages[NUMBIGMESSAGES]; @@ -443,64 +441,6 @@ CMessages::InsertStringInString(wchar *str1, wchar *str2) str1[i++] = '\0'; } -int -CMessages::GetTokenPadKeyString(const wchar *in, wchar *out) -{ - wchar str[256]; - memset(str, 0, sizeof(str)); - str[0] = 'C'; - - // TODO: there was a switch here but that's stupid - str[1] = CPad::GetPad(0)->Mode + 48; - - while (*in != '~') in++; - in++; - - int i = 1; - while (*in != '~') - str[1+i++] = *(in++); - - wchar *text = TheText.Get(UnicodeToAscii(str)); - if (!text) return i; - while (text[0] != '\0') - { - if (text[0] == '~') - { - switch (text[1]) - { - case 'L': - *(out++) = 'M'; - break; - case 'N': - *(out++) = 'O'; - break; - case 'O': - *(out++) = 227; - break; - case 'R': - *(out++) = 'S'; - break; - case 'S': - *(out++) = 225; - break; - case 'T': - *(out++) = 224; - break; - case 'X': - *(out++) = 226; - break; - default: - break; - } - text += 3; - } - else { - *(out++) = *(text++); - } - } - return i; -} - void CMessages::InsertPlayerControlKeysInString(wchar *str) { @@ -510,7 +450,7 @@ CMessages::InsertPlayerControlKeysInString(wchar *str) if (!str) return; uint16 strSize = GetWideStringLength(str); - memset(keybuf, 0, 256*sizeof(wchar)); // not memset? :O + memset(keybuf, 0, 256*sizeof(wchar)); wchar *_outstr = outstr; for (i = 0; i < strSize;) { @@ -520,16 +460,9 @@ CMessages::InsertPlayerControlKeysInString(wchar *str) #else if (str[i] == '~' && str[i + 1] == 'k' && str[i + 2] == '~') { #endif - memset(keybuf, 0, 256 * sizeof(wchar)); i += 4; - i += GetTokenPadKeyString(&str[i], keybuf) + 1; - uint16 keybuf_size = GetWideStringLength(keybuf); - for (uint16 j = 0; j < keybuf_size; j++) { - *(_outstr++) = keybuf[j]; - keybuf[j] = '\0'; - } - - /*for (int32 cont = 0; cont < MAX_CONTROLLERACTIONS && !done; cont++) { + bool done = false; + for (int32 cont = 0; cont < MAX_CONTROLLERACTIONS && !done; cont++) { uint16 contSize = GetWideStringLength(ControlsManager.m_aActionNames[cont]); if (contSize != 0) { if (WideStringCompare(&str[i], ControlsManager.m_aActionNames[cont], contSize)) { @@ -543,7 +476,7 @@ CMessages::InsertPlayerControlKeysInString(wchar *str) i += contSize + 1; } } - }*/ + } } else { *(_outstr++) = str[i++]; } @@ -880,13 +813,3 @@ CMessages::ClearAllMessagesDisplayedByGame() CHud::GetRidOfAllHudMessages(); CUserDisplay::Pager.ClearMessages(); } - -void -CMessages::ClearThisBigPrintNow(uint32 id) -{ - if (BIGMessages[id].m_Stack[0].m_pText) - ClearThisBigPrint(BIGMessages[id].m_Stack[0].m_pText); - CHud::m_BigMessage[id][0] = '\0'; - BigMessageInUse[id] = 0.0f; -} - diff --git a/src/text/Messages.h b/src/text/Messages.h index 5111290..e8ba1bf 100644 --- a/src/text/Messages.h +++ b/src/text/Messages.h @@ -61,8 +61,6 @@ public: static void ClearThisPrint(wchar *str); static void ClearThisBigPrint(wchar *str); static void ClearAllMessagesDisplayedByGame(void); - static void ClearThisBigPrintNow(uint32 id); - static int GetTokenPadKeyString(const wchar *in, wchar *out); // unused or cut //static void AddMessageSoonWithString(wchar*, uint32, uint16, wchar*); diff --git a/src/text/Text.cpp b/src/text/Text.cpp index ad51210..1369d1d 100644 --- a/src/text/Text.cpp +++ b/src/text/Text.cpp @@ -11,7 +11,7 @@ wchar WideErrorString[25]; -CText *CText::msInstance = nil; +CText TheText; CText::CText(void) { @@ -39,7 +39,7 @@ CText::Load(void) CFileMgr::SetDir("TEXT"); switch(FrontEndMenuManager.m_PrefsLanguage){ case CMenuManager::LANGUAGE_AMERICAN: - sprintf(filename, "ENGLISH.GXT"); + sprintf(filename, "AMERICAN.GXT"); break; case CMenuManager::LANGUAGE_FRENCH: sprintf(filename, "FRENCH.GXT"); @@ -91,13 +91,11 @@ CText::Load(void) keyArray.Update(data.chars); CFileMgr::CloseFile(file); CFileMgr::SetDir(""); - bIsLoaded = true; } void CText::Unload(void) { - bIsLoaded = false; CMessages::ClearAllMessagesDisplayedByGame(); keyArray.Unload(); data.Unload(); @@ -245,7 +243,7 @@ CText::LoadMissionText(char *MissionTableName) CFileMgr::SetDir("TEXT"); switch (FrontEndMenuManager.m_PrefsLanguage) { case CMenuManager::LANGUAGE_AMERICAN: - sprintf(filename, "ENGLISH.GXT"); + sprintf(filename, "AMERICAN.GXT"); break; case CMenuManager::LANGUAGE_FRENCH: sprintf(filename, "FRENCH.GXT"); @@ -260,13 +258,13 @@ CText::LoadMissionText(char *MissionTableName) sprintf(filename, "SPANISH.GXT"); break; #ifdef MORE_LANGUAGES - case LANGUAGE_POLISH: + case CMenuManager::LANGUAGE_POLISH: sprintf(filename, "POLISH.GXT"); break; - case LANGUAGE_RUSSIAN: + case CMenuManager::LANGUAGE_RUSSIAN: sprintf(filename, "RUSSIAN.GXT"); break; - case LANGUAGE_JAPANESE: + case CMenuManager::LANGUAGE_JAPANESE: sprintf(filename, "JAPANESE.GXT"); break; #endif @@ -307,11 +305,6 @@ CText::LoadMissionText(char *MissionTableName) bIsMissionTextLoaded = true; } -bool -CText::IsLoaded() -{ - return bIsLoaded; -} void CKeyArray::Load(size_t length, int file, size_t* offset) diff --git a/src/text/Text.h b/src/text/Text.h index 0538734..1174216 100644 --- a/src/text/Text.h +++ b/src/text/Text.h @@ -58,7 +58,7 @@ public: uint32 offset; }; - enum {MAX_MISSION_TEXTS = 200}; + enum {MAX_MISSION_TEXTS = 90}; // beware that LCS has more Entry data[MAX_MISSION_TEXTS]; uint16 size; // You can make this size_t if you want to exceed 32-bit boundaries, everything else should be ready. @@ -84,9 +84,6 @@ class CText bool bIsMissionTextLoaded; char szMissionTableName[8]; CMissionTextOffsets MissionTextOffsets; - bool bIsLoaded; - - static CText *msInstance; public: CText(void); void Load(void); @@ -97,15 +94,6 @@ public: void GetNameOfLoadedMissionText(char *outName); void ReadChunkHeader(ChunkHeader *buf, int32 file, size_t *bytes_read); void LoadMissionText(char *MissionTableName); - bool IsLoaded(); - void GetUTF8(const char*, char*, int); // TODO but unused - - static CText &Instance() - { - if (!msInstance) - msInstance = new CText; - return *msInstance; - } }; -#define TheText CText::Instance() +extern CText TheText; diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index 0d14fef..06dc1b5 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -102,8 +102,6 @@ CAutomobile::CAutomobile(int32 id, uint8 CreatedBy) pHandling = mod_HandlingManager.GetHandlingData((tVehicleType)mi->m_handlingId); pFlyingHandling = mod_HandlingManager.GetFlyingPointer((tVehicleType)mi->m_handlingId); - m_fEngineInertiaVar1 = 0.0f; - m_fEngineInertiaVar2 = 0.0f; m_auto_unused1 = 20.0f; m_auto_unused2 = 0; @@ -152,7 +150,7 @@ CAutomobile::CAutomobile(int32 id, uint8 CreatedBy) m_fMass = pHandling->fMass; m_fTurnMass = pHandling->fTurnMass; m_vecCentreOfMass = pHandling->CentreOfMass; - m_fAirResistance = pHandling->fDragMult > 0.01f ? pHandling->fDragMult*0.0005f : pHandling->fDragMult; + m_fAirResistance = pHandling->Dimension.x*pHandling->Dimension.z/m_fMass; m_fElasticity = 0.05f; m_fBuoyancy = pHandling->fBuoyancy; @@ -193,6 +191,12 @@ CAutomobile::CAutomobile(int32 id, uint8 CreatedBy) m_fTraction = 1.0f; m_fTireTemperature = 1.0f; + CColModel *colModel = mi->GetColModel(); + if(colModel->lines == nil){ + colModel->lines = (CColLine*)RwMalloc(4*sizeof(CColLine)); + colModel->numLines = 4; + } + SetupSuspensionLines(); SetStatus(STATUS_SIMPLE); @@ -252,10 +256,6 @@ CVector vecDAMAGE_ENGINE_POS_BIG(-0.5f, -0.3f, 0.0f); void CAutomobile::ProcessControl(void) { - // TODO(LCS): - // TheCamera can remove service vehicles - // some audio (?) stuff - int i; float wheelRot; CColModel *colModel; @@ -310,7 +310,7 @@ CAutomobile::ProcessControl(void) if(GetStatus() != STATUS_ABANDONED && GetStatus() != STATUS_WRECKED && GetStatus() != STATUS_PLAYER && GetStatus() != STATUS_PLAYER_REMOTE && GetStatus() != STATUS_PLAYER_DISABLED){ switch(GetModelIndex()) - case MI_FBICAR: + case MI_FBIRANCH: case MI_POLICE: case MI_ENFORCER: case MI_SECURICA: @@ -319,18 +319,16 @@ CAutomobile::ProcessControl(void) ScanForCrimes(); } - // TODO(LCS): the fields used by this function are weird - ActivateBombWhenEntered(); - // Process driver - if(pDriver){ + if(pDriver) if(IsUpsideDown() && CanPedEnterCar()){ if(!pDriver->IsPlayer() && !(pDriver->m_leader && pDriver->m_leader->bInVehicle) && pDriver->CharCreatedBy != MISSION_CHAR) pDriver->SetObjective(OBJECTIVE_LEAVE_CAR, this); } - } + + ActivateBombWhenEntered(); // Process passengers if(m_nNumPassengers != 0 && IsUpsideDown() && CanPedEnterCar()){ @@ -353,7 +351,7 @@ CAutomobile::ProcessControl(void) if(strongGrip1 || bCheat3) m_vecCentreOfMass.z = 0.3f*m_aSuspensionSpringLength[0] + -1.0f*m_fHeightAboveRoad; else if(pHandling->Flags & HANDLING_NONPLAYER_STABILISER && GetStatus() == STATUS_PHYSICS) - m_vecCentreOfMass.z = pHandling->CentreOfMass.z + (colModel->boundingBox.min.z - pHandling->CentreOfMass.z)*0.4f; + m_vecCentreOfMass.z = pHandling->CentreOfMass.z - 0.2f*pHandling->Dimension.z; else m_vecCentreOfMass = pHandling->CentreOfMass; @@ -373,7 +371,11 @@ CAutomobile::ProcessControl(void) bool playerRemote = false; switch(GetStatus()){ case STATUS_PLAYER_REMOTE: +#ifdef FIX_BUGS if(CPad::GetPad(0)->CarGunJustDown() && !bDisableRemoteDetonation){ +#else + if(CPad::GetPad(0)->WeaponJustDown() && !bDisableRemoteDetonation){ +#endif BlowUpCar(FindPlayerPed()); CRemote::TakeRemoteControlledCarFromPlayer(); } @@ -392,7 +394,6 @@ CAutomobile::ProcessControl(void) // fall through case STATUS_PLAYER: if(playerRemote || - // TODO(LCS): ped state 64 pDriver && pDriver->GetPedState() != PED_EXIT_CAR && pDriver->GetPedState() != PED_DRAG_FROM_CAR && pDriver->GetPedState() != PED_ARRESTED){ // process control input if controlled by player if(playerRemote || pDriver->m_nPedType == PEDTYPE_PLAYER1) @@ -418,8 +419,6 @@ CAutomobile::ProcessControl(void) }else m_vecCentreOfMass.z = pHandling->CentreOfMass.z; - // TODO(LCS): some in air handling? - if(bHoverCheat) DoHoverSuspensionRatios(); @@ -455,6 +454,8 @@ CAutomobile::ProcessControl(void) m_fBrakePedal = 1.0f; m_fGasPedal = 0.0f; } + if(CPad::GetPad(0)->CarGunJustDown()) + ActivateBomb(); break; case STATUS_SIMPLE: @@ -494,7 +495,7 @@ CAutomobile::ProcessControl(void) m_aSuspensionSpringRatio[1] < 1.0f && CSurfaceTable::GetAdhesionGroup(m_aWheelColPoints[1].surfaceB) == ADHESIVE_SAND || m_aSuspensionSpringRatio[2] < 1.0f && CSurfaceTable::GetAdhesionGroup(m_aWheelColPoints[2].surfaceB) == ADHESIVE_SAND || m_aSuspensionSpringRatio[3] < 1.0f && CSurfaceTable::GetAdhesionGroup(m_aWheelColPoints[3].surfaceB) == ADHESIVE_SAND){ - if(GetModelIndex() != MI_RCBANDIT /*&& GetModelIndex() != MI_SANDKING*/ && GetModelIndex() != MI_BFINJECT){ + if(GetModelIndex() != MI_RCBANDIT && GetModelIndex() != MI_SANDKING && GetModelIndex() != MI_BFINJECT){ bStuckInSand = true; if(CWeather::WetRoads > 0.0f) ApplyMoveForce(m_vecMoveSpeed * -CTimer::GetTimeStep()*SAND_SLOWDOWN*m_fMass * (1.0f-CWeather::WetRoads)); @@ -529,10 +530,8 @@ CAutomobile::ProcessControl(void) m_fSteerAngle = 0.0f; m_fGasPedal = 0.0f; - m_nCarHornTimer = 0; - // TODO(LCS): - // CWeapon::::RemovePlayersRemoteDetonatorForThisVehicle - m_pBombRigger = nil; + if(!IsAlarmOn()) + m_nCarHornTimer = 0; break; case STATUS_PLAYER_DISABLED: @@ -626,13 +625,14 @@ CAutomobile::ProcessControl(void) // special control switch(GetModelIndex()){ - // FireTruckControl in PreRender now + case MI_FIRETRUCK: + FireTruckControl(); + break; case MI_RHINO: TankControl(); BlowUpCarsInPath(); break; - // LCS: this is gone but i'm keeping it! - case MI_YARDIE: + case MI_VOODOO: HydraulicControl(); break; default: @@ -722,7 +722,7 @@ CAutomobile::ProcessControl(void) ApplyTurnSpeed(); } bIsInSafePosition = true; - bIsStuck = false; + bIsStuck = false; } CPhysical::ProcessControl(); @@ -741,7 +741,6 @@ CAutomobile::ProcessControl(void) CVector contactPoints[4]; // relative to model CVector contactSpeeds[4]; // speed at contact points CVector springDirections[4]; // normalized, in world space - float springForces[4]; for(i = 0; i < 4; i++){ // Set spring under certain circumstances @@ -765,13 +764,10 @@ CAutomobile::ProcessControl(void) } // get points and directions if spring is compressed - springDirections[i] = -GetUp(); // springs are always pointing down anyway if(m_aSuspensionSpringRatio[i] < 1.0f){ contactPoints[i] = m_aWheelColPoints[i].point - GetPosition(); -// springDirections[i] = Multiply3x3(GetMatrix(), colModel->lines[i].p1 - colModel->lines[i].p0); -// springDirections[i].Normalise(); - }else{ - contactPoints[i] = CVector(0.0f, 0.0f, 0.0f); + springDirections[i] = Multiply3x3(GetMatrix(), colModel->lines[i].p1 - colModel->lines[i].p0); + springDirections[i].Normalise(); } } @@ -784,7 +780,7 @@ CAutomobile::ProcessControl(void) ApplySpringCollisionAlt(pHandling->fSuspensionForceLevel, springDirections[i], contactPoints[i], - m_aSuspensionSpringRatio[i], bias, m_aWheelColPoints[i].normal, springForces[i]); + m_aSuspensionSpringRatio[i], bias, m_aWheelColPoints[i].normal); m_aWheelSkidmarkUnk[i] = false; if(m_aWheelColPoints[i].surfaceB == SURFACE_GRASS || @@ -796,8 +792,8 @@ CAutomobile::ProcessControl(void) m_aWheelSkidmarkUnk[i] = true; }else m_aWheelSkidmarkType[i] = SKIDMARK_NORMAL; -// }else{ -// contactPoints[i] = Multiply3x3(GetMatrix(), colModel->lines[i].p1); + }else{ + contactPoints[i] = Multiply3x3(GetMatrix(), colModel->lines[i].p1); } } @@ -819,7 +815,7 @@ CAutomobile::ProcessControl(void) // dampen springs for(i = 0; i < 4; i++) if(m_aSuspensionSpringRatio[i] < 0.99999f) - ApplySpringDampening(pHandling->fSuspensionDampingLevel, springForces[i], + ApplySpringDampening(pHandling->fSuspensionDampingLevel, springDirections[i], contactPoints[i], contactSpeeds[i]); // Get speed at contact points again @@ -832,6 +828,42 @@ CAutomobile::ProcessControl(void) } } + bool gripCheat = true; + fwdSpeed = DotProduct(m_vecMoveSpeed, GetForward()); + if(!strongGrip1 && !CVehicle::bCheat3) + gripCheat = false; + float acceleration = pHandling->Transmission.CalculateDriveAcceleration(m_fGasPedal, m_nCurrentGear, m_fChangeGearTime, fwdSpeed, gripCheat); + acceleration /= m_fForceMultiplier; + + if(IsRealHeli() || IsRealPlane()) + acceleration = 0.0f; + + if(bAudioChangingGear && m_fGasPedal > 0.4f && m_fBrakePedal < 0.1f && fwdSpeed > 0.15f && + this == FindPlayerVehicle() && TheCamera.Cams[TheCamera.ActiveCam].Mode != CCam::MODE_1STPERSON){ + if(GetStatus() == STATUS_PLAYER && !(pHandling->Flags & HANDLING_IS_BUS)){ + if(m_nBusDoorTimerEnd == 0) + m_nBusDoorTimerEnd = 1000; + else { + uint32 timeStepInMs = CTimer::GetTimeStepInMilliseconds(); + if(m_nBusDoorTimerEnd > timeStepInMs) + m_nBusDoorTimerEnd -= timeStepInMs; + else + m_nBusDoorTimerEnd = 0; + } + } + + if((m_aSuspensionSpringRatio[0] < 1.0f || m_aSuspensionSpringRatio[2] < 1.0f) && + (m_aSuspensionSpringRatio[1] < 1.0f || m_aSuspensionSpringRatio[3] < 1.0f)) + ApplyTurnForce(-GRAVITY*Min(m_fTurnMass, 2500.0f)*GetUp(), -1.0f*GetForward()); + } + + brake = m_fBrakePedal * pHandling->fBrakeDeceleration * CTimer::GetTimeStep(); + bool neutralHandling = GetStatus() != STATUS_PLAYER && GetStatus() != STATUS_PLAYER_REMOTE && (pHandling->Flags & HANDLING_NEUTRALHANDLING); + float brakeBiasFront = neutralHandling ? 1.0f : 2.0f*pHandling->fBrakeBias; + float brakeBiasRear = neutralHandling ? 1.0f : 2.0f-pHandling->fBrakeBias; // looks like a bug, but it was correct in III... + float tractionBiasFront = neutralHandling ? 1.0f : 2.0f*pHandling->fTractionBias; + float tractionBiasRear = neutralHandling ? 1.0f : 2.0f-tractionBiasFront; + // Count how many wheels are touching the ground m_nWheelsOnGround = 0; @@ -862,36 +894,16 @@ CAutomobile::ProcessControl(void) } } - bool gripCheat = true; - fwdSpeed = DotProduct(m_vecMoveSpeed, GetForward()); - if(!strongGrip1 && !CVehicle::bCheat3) - gripCheat = false; - float acceleration = pHandling->Transmission.CalculateDriveAcceleration(m_fGasPedal, m_nCurrentGear, m_fChangeGearTime, fwdSpeed, - &m_fEngineInertiaVar1, &m_fEngineInertiaVar2, m_nDriveWheelsOnGround, gripCheat); - acceleration /= m_fForceMultiplier; - - if(IsRealHeli() || IsRealPlane()) - acceleration = 0.0f; - - if(Abs(acceleration) > 0.0f) - m_fEngineEnergy += Abs(acceleration); - else - m_fEngineEnergy = 0.0f; - float traction; if(GetStatus() == STATUS_PHYSICS) traction = 0.004f * m_fTraction; else traction = 0.004f; - traction *= pHandling->GetTractionMultiplier() / 4.0f; + traction *= pHandling->fTractionMultiplier / 4.0f; traction /= m_fForceMultiplier; if(CVehicle::bCheat3) traction *= 4.0f; - if(FindPlayerVehicle() && FindPlayerVehicle() == this) - if(CPad::GetPad(0)->CarGunJustDown()) - ActivateBomb(); - if(FindPlayerVehicle() != this && (strongGrip1 || CVehicle::bCheat3)){ traction *= 1.2f; acceleration *= 1.4f; @@ -901,73 +913,448 @@ CAutomobile::ProcessControl(void) } } - // TODO(LCS): where did this go? -/* - if(bAudioChangingGear && m_fGasPedal > 0.4f && m_fBrakePedal < 0.1f && fwdSpeed > 0.15f && - this == FindPlayerVehicle() && TheCamera.Cams[TheCamera.ActiveCam].Mode != CCam::MODE_1STPERSON){ - if(GetStatus() == STATUS_PLAYER && !(pHandling->Flags & HANDLING_IS_BUS)){ - if(m_nBusDoorTimerEnd == 0) - m_nBusDoorTimerEnd = 1000; - else { - uint32 timeStepInMs = CTimer::GetTimeStepInMilliseconds(); - if(m_nBusDoorTimerEnd > timeStepInMs) - m_nBusDoorTimerEnd -= timeStepInMs; - else - m_nBusDoorTimerEnd = 0; - } + static float fThrust; + static tWheelState WheelState[4]; + + bool rearWheelsFirst = !!(pHandling->Flags & HANDLING_REARWHEEL_1ST); + + // Process front wheels on ground - first try + + if(!rearWheelsFirst){ + if(m_aWheelTimer[CARWHEEL_FRONT_LEFT] > 0.0f || m_aWheelTimer[CARWHEEL_FRONT_RIGHT] > 0.0f){ + float s = Sin(m_fSteerAngle); + float c = Cos(m_fSteerAngle); + + CVector wheelFwd, wheelRight, tmp; + + if(m_aWheelTimer[CARWHEEL_FRONT_LEFT] > 0.0f){ + if(mod_HandlingManager.HasFrontWheelDrive(pHandling->nIdentifier)) + fThrust = acceleration; + else + fThrust = 0.0f; + + wheelFwd = GetForward(); + wheelFwd -= DotProduct(wheelFwd, m_aWheelColPoints[CARWHEEL_FRONT_LEFT].normal)*m_aWheelColPoints[CARWHEEL_FRONT_LEFT].normal; + wheelFwd.Normalise(); + wheelRight = CrossProduct(wheelFwd, m_aWheelColPoints[CARWHEEL_FRONT_LEFT].normal); + wheelRight.Normalise(); + tmp = c*wheelFwd - s*wheelRight; + wheelRight = s*wheelFwd + c*wheelRight; + wheelFwd = tmp; + + m_aWheelColPoints[CARWHEEL_FRONT_LEFT].surfaceA = SURFACE_WHEELBASE; + float adhesion = CSurfaceTable::GetAdhesiveLimit(m_aWheelColPoints[CARWHEEL_FRONT_LEFT])*traction; + if(GetStatus() == STATUS_PLAYER) + adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_FRONT_LEFT].surfaceB); + WheelState[CARWHEEL_FRONT_LEFT] = m_aWheelState[CARWHEEL_FRONT_LEFT]; + + if(Damage.GetWheelStatus(CARWHEEL_FRONT_LEFT) == WHEEL_STATUS_BURST) + ProcessWheel(wheelFwd, wheelRight, + contactSpeeds[CARWHEEL_FRONT_LEFT], contactPoints[CARWHEEL_FRONT_LEFT], + m_nWheelsOnGround, fThrust, + brake*brakeBiasFront, + adhesion*tractionBiasFront*Damage.m_fWheelDamageEffect, + CARWHEEL_FRONT_LEFT, + &m_aWheelSpeed[CARWHEEL_FRONT_LEFT], + &WheelState[CARWHEEL_FRONT_LEFT], + WHEEL_STATUS_BURST); + else + ProcessWheel(wheelFwd, wheelRight, + contactSpeeds[CARWHEEL_FRONT_LEFT], contactPoints[CARWHEEL_FRONT_LEFT], + m_nWheelsOnGround, fThrust, + brake*brakeBiasFront, + adhesion*tractionBiasFront, + CARWHEEL_FRONT_LEFT, + &m_aWheelSpeed[CARWHEEL_FRONT_LEFT], + &WheelState[CARWHEEL_FRONT_LEFT], + WHEEL_STATUS_OK); } - if((m_aSuspensionSpringRatio[0] < 1.0f || m_aSuspensionSpringRatio[2] < 1.0f) && - (m_aSuspensionSpringRatio[1] < 1.0f || m_aSuspensionSpringRatio[3] < 1.0f)) - ApplyTurnForce(-GRAVITY*Min(m_fTurnMass, 2500.0f)*GetUp(), -1.0f*GetForward()); + if(m_aWheelTimer[CARWHEEL_FRONT_RIGHT] > 0.0f){ + if(mod_HandlingManager.HasFrontWheelDrive(pHandling->nIdentifier)) + fThrust = acceleration; + else + fThrust = 0.0f; + + wheelFwd = GetForward(); + wheelFwd -= DotProduct(wheelFwd, m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].normal)*m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].normal; + wheelFwd.Normalise(); + wheelRight = CrossProduct(wheelFwd, m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].normal); + wheelRight.Normalise(); + tmp = c*wheelFwd - s*wheelRight; + wheelRight = s*wheelFwd + c*wheelRight; + wheelFwd = tmp; + + m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].surfaceA = SURFACE_WHEELBASE; + float adhesion = CSurfaceTable::GetAdhesiveLimit(m_aWheelColPoints[CARWHEEL_FRONT_RIGHT])*traction; + if(GetStatus() == STATUS_PLAYER) + adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].surfaceB); + WheelState[CARWHEEL_FRONT_RIGHT] = m_aWheelState[CARWHEEL_FRONT_RIGHT]; + + if(Damage.GetWheelStatus(CARWHEEL_FRONT_RIGHT) == WHEEL_STATUS_BURST) + ProcessWheel(wheelFwd, wheelRight, + contactSpeeds[CARWHEEL_FRONT_RIGHT], contactPoints[CARWHEEL_FRONT_RIGHT], + m_nWheelsOnGround, fThrust, + brake*brakeBiasFront, + adhesion*tractionBiasFront*Damage.m_fWheelDamageEffect, + CARWHEEL_FRONT_RIGHT, + &m_aWheelSpeed[CARWHEEL_FRONT_RIGHT], + &WheelState[CARWHEEL_FRONT_RIGHT], + WHEEL_STATUS_BURST); + else + ProcessWheel(wheelFwd, wheelRight, + contactSpeeds[CARWHEEL_FRONT_RIGHT], contactPoints[CARWHEEL_FRONT_RIGHT], + m_nWheelsOnGround, fThrust, + brake*brakeBiasFront, + adhesion*tractionBiasFront, + CARWHEEL_FRONT_RIGHT, + &m_aWheelSpeed[CARWHEEL_FRONT_RIGHT], + &WheelState[CARWHEEL_FRONT_RIGHT], + WHEEL_STATUS_OK); + } } -*/ - float steerRange; - if(fwdSpeed > 0.01f && m_aWheelTimer[CARWHEEL_FRONT_LEFT] > 0.0f && m_aWheelTimer[CARWHEEL_FRONT_RIGHT] > 0.0f && GetStatus() == STATUS_PLAYER){ - CColPoint point; - point.surfaceA = SURFACE_WHEELBASE; - point.surfaceB = SURFACE_TARMAC; - float rightSpeed = DotProduct(m_vecMoveSpeed, GetRight()); - float adhesion = CSurfaceTable::GetAdhesiveLimit(point); - // i have no idea what's going on here - float magic = traction * adhesion * 16.0f / SQR(fwdSpeed); - magic = clamp(magic, -1.0f, 1.0f); - magic = Asin(magic); - if(m_fSteerAngle < 0.0f && rightSpeed > 0.05f || - m_fSteerAngle > 0.0f && rightSpeed < -0.05f || - bIsHandbrakeOn) - steerRange = 1.0f; - else - steerRange = Min(magic/DEGTORAD(pHandling->fSteeringLock), 1.0f); - - }else - steerRange = 1.0f; - m_fSteerAngle *= steerRange; + // Process front wheels off ground - brake = m_fBrakePedal * pHandling->fBrakeDeceleration * CTimer::GetTimeStep(); + if(!IsRealHeli()){ + if(m_aWheelTimer[CARWHEEL_FRONT_LEFT] <= 0.0f){ + if(mod_HandlingManager.HasFrontWheelDrive(pHandling->nIdentifier) && acceleration != 0.0f){ + if(acceleration > 0.0f){ + if(m_aWheelSpeed[CARWHEEL_FRONT_LEFT] < 2.0f) + m_aWheelSpeed[CARWHEEL_FRONT_LEFT] -= 0.2f; + }else{ + if(m_aWheelSpeed[CARWHEEL_FRONT_LEFT] > -2.0f) + m_aWheelSpeed[CARWHEEL_FRONT_LEFT] += 0.1f; + } + }else{ + m_aWheelSpeed[CARWHEEL_FRONT_LEFT] *= 0.95f; + } + m_aWheelRotation[CARWHEEL_FRONT_LEFT] += m_aWheelSpeed[CARWHEEL_FRONT_LEFT]; + } + if(m_aWheelTimer[CARWHEEL_FRONT_RIGHT] <= 0.0f){ + if(mod_HandlingManager.HasFrontWheelDrive(pHandling->nIdentifier) && acceleration != 0.0f){ + if(acceleration > 0.0f){ + if(m_aWheelSpeed[CARWHEEL_FRONT_RIGHT] < 2.0f) + m_aWheelSpeed[CARWHEEL_FRONT_RIGHT] -= 0.2f; + }else{ + if(m_aWheelSpeed[CARWHEEL_FRONT_RIGHT] > -2.0f) + m_aWheelSpeed[CARWHEEL_FRONT_RIGHT] += 0.1f; + } + }else{ + m_aWheelSpeed[CARWHEEL_FRONT_RIGHT] *= 0.95f; + } + m_aWheelRotation[CARWHEEL_FRONT_RIGHT] += m_aWheelSpeed[CARWHEEL_FRONT_RIGHT]; + } + } + } - if(pHandling->Flags & HANDLING_REARWHEEL_1ST){ - ProcessCarWheelPair(CARWHEEL_REAR_LEFT, CARWHEEL_REAR_RIGHT, -999.0f, contactSpeeds, contactPoints, - traction, acceleration, brake, false); - ProcessCarWheelPair(CARWHEEL_FRONT_LEFT, CARWHEEL_FRONT_RIGHT, m_fSteerAngle, contactSpeeds, contactPoints, - traction, acceleration, brake, true); - }else{ - ProcessCarWheelPair(CARWHEEL_FRONT_LEFT, CARWHEEL_FRONT_RIGHT, m_fSteerAngle, contactSpeeds, contactPoints, - traction, acceleration, brake, true); - ProcessCarWheelPair(CARWHEEL_REAR_LEFT, CARWHEEL_REAR_RIGHT, -999.0f, contactSpeeds, contactPoints, - traction, acceleration, brake, false); + // Process rear wheels + + if(m_aWheelTimer[CARWHEEL_REAR_LEFT] > 0.0f || m_aWheelTimer[CARWHEEL_REAR_RIGHT] > 0.0f){ + CVector wheelFwd = GetForward(); + CVector wheelRight = GetRight(); // overwritten for resp. wheel + + float rearBrake = brake; + float rearTraction = traction; + if(bIsHandbrakeOn){ +#ifdef FIX_BUGS + // Not sure if this is needed, but brake usually has timestep as a factor + rearBrake = 20000.0f * CTimer::GetTimeStepFix(); +#else + rearBrake = 20000.0f; +#endif + if(fwdSpeed > 0.1f && pHandling->Flags & HANDLING_HANDBRAKE_TYRE){ + m_fTireTemperature += 0.005*CTimer::GetTimeStep(); + if(m_fTireTemperature > 2.0f) + m_fTireTemperature = 2.0f; + } + }else if(m_doingBurnout && mod_HandlingManager.HasRearWheelDrive(pHandling->nIdentifier)){ + rearBrake = 0.0f; + rearTraction = 0.0f; + // BUG: missing timestep + ApplyTurnForce(contactPoints[CARWHEEL_REAR_LEFT], -0.001f*m_fTurnMass*m_fSteerAngle*GetRight()); + }else if(m_fTireTemperature > 1.0f){ + rearTraction *= m_fTireTemperature; + } + + if(m_aWheelTimer[CARWHEEL_REAR_LEFT] > 0.0f){ + if(mod_HandlingManager.HasRearWheelDrive(pHandling->nIdentifier)) + fThrust = acceleration; + else + fThrust = 0.0f; + + wheelFwd -= DotProduct(wheelFwd, m_aWheelColPoints[CARWHEEL_REAR_LEFT].normal)*m_aWheelColPoints[CARWHEEL_REAR_LEFT].normal; + wheelFwd.Normalise(); + wheelRight = CrossProduct(wheelFwd, m_aWheelColPoints[CARWHEEL_REAR_LEFT].normal); + wheelRight.Normalise(); + + m_aWheelColPoints[CARWHEEL_REAR_LEFT].surfaceA = SURFACE_WHEELBASE; + float adhesion = CSurfaceTable::GetAdhesiveLimit(m_aWheelColPoints[CARWHEEL_REAR_LEFT])*rearTraction; + if(GetStatus() == STATUS_PLAYER) + adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_REAR_LEFT].surfaceB); + WheelState[CARWHEEL_REAR_LEFT] = m_aWheelState[CARWHEEL_REAR_LEFT]; + + if(Damage.GetWheelStatus(CARWHEEL_REAR_LEFT) == WHEEL_STATUS_BURST) + ProcessWheel(wheelFwd, wheelRight, + contactSpeeds[CARWHEEL_REAR_LEFT], contactPoints[CARWHEEL_REAR_LEFT], + m_nWheelsOnGround, fThrust, + rearBrake*brakeBiasRear, + adhesion*tractionBiasRear*Damage.m_fWheelDamageEffect, + CARWHEEL_REAR_LEFT, + &m_aWheelSpeed[CARWHEEL_REAR_LEFT], + &WheelState[CARWHEEL_REAR_LEFT], + WHEEL_STATUS_BURST); + else + ProcessWheel(wheelFwd, wheelRight, + contactSpeeds[CARWHEEL_REAR_LEFT], contactPoints[CARWHEEL_REAR_LEFT], + m_nWheelsOnGround, fThrust, + rearBrake*brakeBiasRear, + adhesion*tractionBiasRear, + CARWHEEL_REAR_LEFT, + &m_aWheelSpeed[CARWHEEL_REAR_LEFT], + &WheelState[CARWHEEL_REAR_LEFT], + WHEEL_STATUS_OK); + } + +#ifdef FIX_BUGS + // Shouldn't we reset these after the left wheel? + wheelFwd = GetForward(); + wheelRight = GetRight(); // actually useless +#endif + + if(m_aWheelTimer[CARWHEEL_REAR_RIGHT] > 0.0f){ + if(mod_HandlingManager.HasRearWheelDrive(pHandling->nIdentifier)) + fThrust = acceleration; + else + fThrust = 0.0f; + + wheelFwd -= DotProduct(wheelFwd, m_aWheelColPoints[CARWHEEL_REAR_RIGHT].normal)*m_aWheelColPoints[CARWHEEL_REAR_RIGHT].normal; + wheelFwd.Normalise(); + wheelRight = CrossProduct(wheelFwd, m_aWheelColPoints[CARWHEEL_REAR_RIGHT].normal); + wheelRight.Normalise(); + + m_aWheelColPoints[CARWHEEL_REAR_RIGHT].surfaceA = SURFACE_WHEELBASE; + float adhesion = CSurfaceTable::GetAdhesiveLimit(m_aWheelColPoints[CARWHEEL_REAR_RIGHT])*rearTraction; + if(GetStatus() == STATUS_PLAYER) + adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_REAR_RIGHT].surfaceB); + WheelState[CARWHEEL_REAR_RIGHT] = m_aWheelState[CARWHEEL_REAR_RIGHT]; + + if(Damage.GetWheelStatus(CARWHEEL_REAR_RIGHT) == WHEEL_STATUS_BURST) + ProcessWheel(wheelFwd, wheelRight, + contactSpeeds[CARWHEEL_REAR_RIGHT], contactPoints[CARWHEEL_REAR_RIGHT], + m_nWheelsOnGround, fThrust, + rearBrake*brakeBiasRear, + adhesion*tractionBiasRear*Damage.m_fWheelDamageEffect, + CARWHEEL_REAR_RIGHT, + &m_aWheelSpeed[CARWHEEL_REAR_RIGHT], + &WheelState[CARWHEEL_REAR_RIGHT], + WHEEL_STATUS_BURST); + else + ProcessWheel(wheelFwd, wheelRight, + contactSpeeds[CARWHEEL_REAR_RIGHT], contactPoints[CARWHEEL_REAR_RIGHT], + m_nWheelsOnGround, fThrust, + rearBrake*brakeBiasRear, + adhesion*tractionBiasRear, + CARWHEEL_REAR_RIGHT, + &m_aWheelSpeed[CARWHEEL_REAR_RIGHT], + &WheelState[CARWHEEL_REAR_RIGHT], + WHEEL_STATUS_OK); + } + } + + if(m_doingBurnout && mod_HandlingManager.HasRearWheelDrive(pHandling->nIdentifier) && + (m_aWheelState[CARWHEEL_REAR_LEFT] == WHEEL_STATE_SPINNING || m_aWheelState[CARWHEEL_REAR_RIGHT] == WHEEL_STATE_SPINNING)){ + m_fTireTemperature += 0.001f*CTimer::GetTimeStep(); + if(m_fTireTemperature > 3.0f) + m_fTireTemperature = 3.0f; + }else if(m_fTireTemperature > 1.0f){ + m_fTireTemperature = (m_fTireTemperature - 1.0f)*Pow(0.995f, CTimer::GetTimeStep()) + 1.0f; + } + + // Process rear wheels off ground + + if(!IsRealHeli()){ + if(m_aWheelTimer[CARWHEEL_REAR_LEFT] <= 0.0f){ + if(bIsHandbrakeOn) + m_aWheelSpeed[CARWHEEL_REAR_LEFT] = 0.0f; + else if(mod_HandlingManager.HasRearWheelDrive(pHandling->nIdentifier) && acceleration != 0.0f){ + if(acceleration > 0.0f){ + if(m_aWheelSpeed[CARWHEEL_REAR_LEFT] < 2.0f) + m_aWheelSpeed[CARWHEEL_REAR_LEFT] -= 0.2f; + }else{ + if(m_aWheelSpeed[CARWHEEL_REAR_LEFT] > -2.0f) + m_aWheelSpeed[CARWHEEL_REAR_LEFT] += 0.1f; + } + }else{ + m_aWheelSpeed[CARWHEEL_REAR_LEFT] *= 0.95f; + } + m_aWheelRotation[CARWHEEL_REAR_LEFT] += m_aWheelSpeed[CARWHEEL_REAR_LEFT]; + } + if(m_aWheelTimer[CARWHEEL_REAR_RIGHT] <= 0.0f){ + if(bIsHandbrakeOn) + m_aWheelSpeed[CARWHEEL_REAR_RIGHT] = 0.0f; + else if(mod_HandlingManager.HasRearWheelDrive(pHandling->nIdentifier) && acceleration != 0.0f){ + if(acceleration > 0.0f){ + if(m_aWheelSpeed[CARWHEEL_REAR_RIGHT] < 2.0f) + m_aWheelSpeed[CARWHEEL_REAR_RIGHT] -= 0.2f; + }else{ + if(m_aWheelSpeed[CARWHEEL_REAR_RIGHT] > -2.0f) + m_aWheelSpeed[CARWHEEL_REAR_RIGHT] += 0.1f; + } + }else{ + m_aWheelSpeed[CARWHEEL_REAR_RIGHT] *= 0.95f; + } + m_aWheelRotation[CARWHEEL_REAR_RIGHT] += m_aWheelSpeed[CARWHEEL_REAR_RIGHT]; + } + } + + // Process front wheels on ground - second try + + if(rearWheelsFirst){ + if(m_aWheelTimer[CARWHEEL_FRONT_LEFT] > 0.0f || m_aWheelTimer[CARWHEEL_FRONT_RIGHT] > 0.0f){ + float s = Sin(m_fSteerAngle); + float c = Cos(m_fSteerAngle); + + CVector wheelFwd, wheelRight, tmp; + + if(m_aWheelTimer[CARWHEEL_FRONT_LEFT] > 0.0f){ + if(mod_HandlingManager.HasFrontWheelDrive(pHandling->nIdentifier)) + fThrust = acceleration; + else + fThrust = 0.0f; + + wheelFwd = GetForward(); + wheelFwd -= DotProduct(wheelFwd, m_aWheelColPoints[CARWHEEL_FRONT_LEFT].normal)*m_aWheelColPoints[CARWHEEL_FRONT_LEFT].normal; + wheelFwd.Normalise(); + wheelRight = CrossProduct(wheelFwd, m_aWheelColPoints[CARWHEEL_FRONT_LEFT].normal); + wheelRight.Normalise(); + tmp = c*wheelFwd - s*wheelRight; + wheelRight = s*wheelFwd + c*wheelRight; + wheelFwd = tmp; + + m_aWheelColPoints[CARWHEEL_FRONT_LEFT].surfaceA = SURFACE_WHEELBASE; + float adhesion = CSurfaceTable::GetAdhesiveLimit(m_aWheelColPoints[CARWHEEL_FRONT_LEFT])*traction; + if(GetStatus() == STATUS_PLAYER) + adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_FRONT_LEFT].surfaceB); + WheelState[CARWHEEL_FRONT_LEFT] = m_aWheelState[CARWHEEL_FRONT_LEFT]; + + if(Damage.GetWheelStatus(CARWHEEL_FRONT_LEFT) == WHEEL_STATUS_BURST) + ProcessWheel(wheelFwd, wheelRight, + contactSpeeds[CARWHEEL_FRONT_LEFT], contactPoints[CARWHEEL_FRONT_LEFT], + m_nWheelsOnGround, fThrust, + brake*brakeBiasFront, + adhesion*tractionBiasFront*Damage.m_fWheelDamageEffect, + CARWHEEL_FRONT_LEFT, + &m_aWheelSpeed[CARWHEEL_FRONT_LEFT], + &WheelState[CARWHEEL_FRONT_LEFT], + WHEEL_STATUS_BURST); + else + ProcessWheel(wheelFwd, wheelRight, + contactSpeeds[CARWHEEL_FRONT_LEFT], contactPoints[CARWHEEL_FRONT_LEFT], + m_nWheelsOnGround, fThrust, + brake*brakeBiasFront, + adhesion*tractionBiasFront, + CARWHEEL_FRONT_LEFT, + &m_aWheelSpeed[CARWHEEL_FRONT_LEFT], + &WheelState[CARWHEEL_FRONT_LEFT], + WHEEL_STATUS_OK); + } + + if(m_aWheelTimer[CARWHEEL_FRONT_RIGHT] > 0.0f){ + if(mod_HandlingManager.HasFrontWheelDrive(pHandling->nIdentifier)) + fThrust = acceleration; + else + fThrust = 0.0f; + + wheelFwd = GetForward(); + wheelFwd -= DotProduct(wheelFwd, m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].normal)*m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].normal; + wheelFwd.Normalise(); + wheelRight = CrossProduct(wheelFwd, m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].normal); + wheelRight.Normalise(); + tmp = c*wheelFwd - s*wheelRight; + wheelRight = s*wheelFwd + c*wheelRight; + wheelFwd = tmp; + + m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].surfaceA = SURFACE_WHEELBASE; + float adhesion = CSurfaceTable::GetAdhesiveLimit(m_aWheelColPoints[CARWHEEL_FRONT_RIGHT])*traction; + if(GetStatus() == STATUS_PLAYER) + adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].surfaceB); + WheelState[CARWHEEL_FRONT_RIGHT] = m_aWheelState[CARWHEEL_FRONT_RIGHT]; + + if(Damage.GetWheelStatus(CARWHEEL_FRONT_RIGHT) == WHEEL_STATUS_BURST) + ProcessWheel(wheelFwd, wheelRight, + contactSpeeds[CARWHEEL_FRONT_RIGHT], contactPoints[CARWHEEL_FRONT_RIGHT], + m_nWheelsOnGround, fThrust, + brake*brakeBiasFront, + adhesion*tractionBiasFront*Damage.m_fWheelDamageEffect, + CARWHEEL_FRONT_RIGHT, + &m_aWheelSpeed[CARWHEEL_FRONT_RIGHT], + &WheelState[CARWHEEL_FRONT_RIGHT], + WHEEL_STATUS_BURST); + else + ProcessWheel(wheelFwd, wheelRight, + contactSpeeds[CARWHEEL_FRONT_RIGHT], contactPoints[CARWHEEL_FRONT_RIGHT], + m_nWheelsOnGround, fThrust, + brake*brakeBiasFront, + adhesion*tractionBiasFront, + CARWHEEL_FRONT_RIGHT, + &m_aWheelSpeed[CARWHEEL_FRONT_RIGHT], + &WheelState[CARWHEEL_FRONT_RIGHT], + WHEEL_STATUS_OK); + } + } + + // Process front wheels off ground + + if (!IsRealHeli()) { + if(m_aWheelTimer[CARWHEEL_FRONT_LEFT] <= 0.0f){ + if(mod_HandlingManager.HasFrontWheelDrive(pHandling->nIdentifier) && acceleration != 0.0f){ + if(acceleration > 0.0f){ + if(m_aWheelSpeed[CARWHEEL_FRONT_LEFT] < 2.0f) + m_aWheelSpeed[CARWHEEL_FRONT_LEFT] -= 0.2f; + }else{ + if(m_aWheelSpeed[CARWHEEL_FRONT_LEFT] > -2.0f) + m_aWheelSpeed[CARWHEEL_FRONT_LEFT] += 0.1f; + } + }else{ + m_aWheelSpeed[CARWHEEL_FRONT_LEFT] *= 0.95f; + } + m_aWheelRotation[CARWHEEL_FRONT_LEFT] += m_aWheelSpeed[CARWHEEL_FRONT_LEFT]; + } + if(m_aWheelTimer[CARWHEEL_FRONT_RIGHT] <= 0.0f){ + if(mod_HandlingManager.HasFrontWheelDrive(pHandling->nIdentifier) && acceleration != 0.0f){ + if(acceleration > 0.0f){ + if(m_aWheelSpeed[CARWHEEL_FRONT_RIGHT] < 2.0f) + m_aWheelSpeed[CARWHEEL_FRONT_RIGHT] -= 0.2f; + }else{ + if(m_aWheelSpeed[CARWHEEL_FRONT_RIGHT] > -2.0f) + m_aWheelSpeed[CARWHEEL_FRONT_RIGHT] += 0.1f; + } + }else{ + m_aWheelSpeed[CARWHEEL_FRONT_RIGHT] *= 0.95f; + } + m_aWheelRotation[CARWHEEL_FRONT_RIGHT] += m_aWheelSpeed[CARWHEEL_FRONT_RIGHT]; + } + } } for(i = 0; i < 4; i++){ float wheelPos = colModel->lines[i].p0.z; if(m_aSuspensionSpringRatio[i] > 0.0f) wheelPos -= m_aSuspensionSpringRatio[i]*m_aSuspensionSpringLength[i]; - if(GetModelIndex() == MI_YARDIE && bUsingSpecialColModel) // not original LCS + if(GetModelIndex() == MI_VOODOO && bUsingSpecialColModel) m_aWheelPosition[i] = wheelPos; else m_aWheelPosition[i] += (wheelPos - m_aWheelPosition[i])*0.75f; } + for(i = 0; i < 4; i++) + m_aWheelState[i] = WheelState[i]; + if(m_fGasPedal < 0.0f){ + if(m_aWheelState[CARWHEEL_REAR_LEFT] == WHEEL_STATE_SPINNING) + m_aWheelState[CARWHEEL_REAR_LEFT] = WHEEL_STATE_NORMAL; + if(m_aWheelState[CARWHEEL_REAR_RIGHT] == WHEEL_STATE_SPINNING) + m_aWheelState[CARWHEEL_REAR_RIGHT] = WHEEL_STATE_NORMAL; + } // Process horn @@ -1262,13 +1649,13 @@ CAutomobile::ProcessControl(void) // TODO: make the numbers defines float heading; - if(GetPosition().x > 1950.0f){ + if(GetPosition().x > 1950.0f-400.0f){ if(m_vecMoveSpeed.x > 0.0f) m_vecMoveSpeed.x *= -1.0f; heading = GetForward().Heading(); if(heading > 0.0f) // going west SetHeading(-heading); - }else if(GetPosition().x < -1950.0f){ + }else if(GetPosition().x < -1950.0f-400.0f){ if(m_vecMoveSpeed.x < 0.0f) m_vecMoveSpeed.x *= -1.0f; heading = GetForward().Heading(); @@ -1331,207 +1718,6 @@ CAutomobile::ProcessControl(void) #pragma optimize("", on) -//--LCS: done -void -CAutomobile::ProcessCarWheelPair(int leftWheel, int rightWheel, float steerAngle, CVector *contactSpeeds, CVector *contactPoints, float traction, float acceleration, float brake, bool bFront) -{ - bool driveWheels; - float suspensionBias; - - if(bFront){ - driveWheels = mod_HandlingManager.HasFrontWheelDrive(pHandling->nIdentifier); - suspensionBias = 2.0f*pHandling->fSuspensionBias; - }else{ - driveWheels = mod_HandlingManager.HasRearWheelDrive(pHandling->nIdentifier); - suspensionBias = 2.0f*(1.0f-pHandling->fSuspensionBias); - - float fwdSpeed = DotProduct(m_vecMoveSpeed, GetForward()); - if(bIsHandbrakeOn && Abs(fwdSpeed) > 0.01f){ -#ifdef FIX_BUGS - // Not sure if this is needed, but brake usually has timestep as a factor - brake = 20000.0f * CTimer::GetTimeStepFix(); -#else - brake = 20000.0f; -#endif -/* - if(fwdSpeed > 0.1f && pHandling->Flags & HANDLING_HANDBRAKE_TYRE){ - m_fTireTemperature += 0.005*CTimer::GetTimeStep(); - if(m_fTireTemperature > 2.0f) - m_fTireTemperature = 2.0f; - } -*/ - }else if(driveWheels && m_doingBurnout){ - brake = 0.0f; - traction = 0.0f; - // BUG: missing timestep - ApplyTurnForce(contactPoints[leftWheel], -0.003f*m_fTurnMass*Min(3000.0f/m_fTurnMass, 1.0f)*m_fSteerAngle*GetRight()); - }else if(mod_HandlingManager.HasRearWheelDrive(pHandling->nIdentifier)){ - traction *= m_fTireTemperature; - } - } - - // Wheels on ground - if(m_aWheelTimer[leftWheel] > 0.0f || m_aWheelTimer[rightWheel] > 0.0f){ - CVector wheelFwd, wheelRight; - float s, c; - bool canSteer = steerAngle > -100.0f; - if(canSteer){ - s = Sin(steerAngle); - c = Cos(steerAngle); - } - - bool neutralHandling = GetStatus() != STATUS_PLAYER && GetStatus() != STATUS_PLAYER_REMOTE && (pHandling->Flags & HANDLING_NEUTRALHANDLING); - float brakeBias, tractionBias; - if(bFront){ - brakeBias = neutralHandling ? 1.0f : 2.0f*pHandling->fBrakeBias; - tractionBias = neutralHandling ? 1.0f : 2.0f*pHandling->fTractionBias; - }else{ - brakeBias = neutralHandling ? 1.0f : 2.0f*(1.0f-pHandling->fBrakeBias); - tractionBias = neutralHandling ? 1.0f : 2.0f*(1.0f-pHandling->fTractionBias); - } - - if(m_aWheelTimer[leftWheel] > 0.0f){ - float fThrust = driveWheels ? acceleration : 0.0f; - - wheelFwd = GetForward(); - wheelFwd -= DotProduct(wheelFwd, m_aWheelColPoints[leftWheel].normal)*m_aWheelColPoints[leftWheel].normal; - wheelFwd.Normalise(); - wheelRight = CrossProduct(wheelFwd, m_aWheelColPoints[leftWheel].normal); - wheelRight.Normalise(); - if(canSteer){ - CVector tmp = c*wheelFwd - s*wheelRight; - wheelRight = s*wheelFwd + c*wheelRight; - wheelFwd = tmp; - } - - m_aWheelColPoints[leftWheel].surfaceA = SURFACE_WHEELBASE; - float adhesion = CSurfaceTable::GetAdhesiveLimit(m_aWheelColPoints[leftWheel])*traction; - if(GetStatus() == STATUS_PLAYER){ - adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[leftWheel].surfaceB); - adhesion *= Min(suspensionBias*pHandling->fSuspensionForceLevel*4.0f*(1.0f-m_aSuspensionSpringRatio[leftWheel]), 2.0f); - } - tWheelState WheelState = m_aWheelState[leftWheel]; - if(Damage.GetWheelStatus(leftWheel) == WHEEL_STATUS_BURST) - ProcessWheel(wheelFwd, wheelRight, - contactSpeeds[leftWheel], contactPoints[leftWheel], - m_nWheelsOnGround, fThrust, - brake*brakeBias, - adhesion*tractionBias*Damage.m_fWheelDamageEffect, - leftWheel, - &m_aWheelRotation[leftWheel], - &WheelState, - WHEEL_STATUS_BURST); - else - ProcessWheel(wheelFwd, wheelRight, - contactSpeeds[leftWheel], contactPoints[leftWheel], - m_nWheelsOnGround, fThrust, - brake*brakeBias, - adhesion*tractionBias, - leftWheel, - &m_aWheelRotation[leftWheel], - &WheelState, - WHEEL_STATUS_OK); - - if(driveWheels && m_fGasPedal < 0.0f && WheelState == WHEEL_STATE_SPINNING) - m_aWheelState[leftWheel] = WHEEL_STATE_NORMAL; - else - m_aWheelState[leftWheel] = WheelState; - } - - if(m_aWheelTimer[rightWheel] > 0.0f){ - float fThrust = driveWheels ? acceleration : 0.0f; - - wheelFwd = GetForward(); - wheelFwd -= DotProduct(wheelFwd, m_aWheelColPoints[rightWheel].normal)*m_aWheelColPoints[rightWheel].normal; - wheelFwd.Normalise(); - wheelRight = CrossProduct(wheelFwd, m_aWheelColPoints[rightWheel].normal); - wheelRight.Normalise(); - if(canSteer){ - CVector tmp = c*wheelFwd - s*wheelRight; - wheelRight = s*wheelFwd + c*wheelRight; - wheelFwd = tmp; - } - - m_aWheelColPoints[rightWheel].surfaceA = SURFACE_WHEELBASE; - float adhesion = CSurfaceTable::GetAdhesiveLimit(m_aWheelColPoints[rightWheel])*traction; - if(GetStatus() == STATUS_PLAYER){ - adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[rightWheel].surfaceB); - adhesion *= Min(suspensionBias*pHandling->fSuspensionForceLevel*4.0f*(1.0f-m_aSuspensionSpringRatio[rightWheel]), 2.0f); - } - tWheelState WheelState = m_aWheelState[rightWheel]; - if(Damage.GetWheelStatus(rightWheel) == WHEEL_STATUS_BURST) - ProcessWheel(wheelFwd, wheelRight, - contactSpeeds[rightWheel], contactPoints[rightWheel], - m_nWheelsOnGround, fThrust, - brake*brakeBias, - adhesion*tractionBias*Damage.m_fWheelDamageEffect, - rightWheel, - &m_aWheelRotation[rightWheel], - &WheelState, - WHEEL_STATUS_BURST); - else - ProcessWheel(wheelFwd, wheelRight, - contactSpeeds[rightWheel], contactPoints[rightWheel], - m_nWheelsOnGround, fThrust, - brake*brakeBias, - adhesion*tractionBias, - rightWheel, - &m_aWheelRotation[rightWheel], - &WheelState, - WHEEL_STATUS_OK); - - if(driveWheels && m_fGasPedal < 0.0f && WheelState == WHEEL_STATE_SPINNING) - m_aWheelState[rightWheel] = WHEEL_STATE_NORMAL; - else - m_aWheelState[rightWheel] = WheelState; - } - } - - if(!bFront){ - if(m_doingBurnout && driveWheels && - (m_aWheelState[CARWHEEL_REAR_LEFT] == WHEEL_STATE_SPINNING || m_aWheelState[CARWHEEL_REAR_RIGHT] == WHEEL_STATE_SPINNING)){ - m_fTireTemperature += 0.001f*CTimer::GetTimeStep(); - if(m_fTireTemperature > 3.0f) - m_fTireTemperature = 3.0f; - }else if(m_fTireTemperature > 1.0f){ - m_fTireTemperature = (m_fTireTemperature - 1.0f)*Pow(0.995f, CTimer::GetTimeStep()) + 1.0f; - } - } - - // Process wheels off ground - - if(!IsRealHeli()){ - if(m_aWheelTimer[leftWheel] <= 0.0f){ - if(driveWheels && acceleration != 0.0f){ - if(acceleration > 0.0f){ - if(m_aWheelSpeed[leftWheel] < 1.0f) - m_aWheelSpeed[leftWheel] -= 0.1f; - }else{ - if(m_aWheelSpeed[leftWheel] > -1.0f) - m_aWheelSpeed[leftWheel] += 0.05f; - } - }else{ - m_aWheelSpeed[leftWheel] *= 0.95f; - } - m_aWheelRotation[leftWheel] += m_aWheelSpeed[leftWheel]*CTimer::GetTimeStep(); - } - if(m_aWheelTimer[rightWheel] <= 0.0f){ - if(driveWheels && acceleration != 0.0f){ - if(acceleration > 0.0f){ - if(m_aWheelSpeed[rightWheel] < 1.0f) - m_aWheelSpeed[rightWheel] -= 0.1f; - }else{ - if(m_aWheelSpeed[rightWheel] > -1.0f) - m_aWheelSpeed[rightWheel] += 0.05f; - } - }else{ - m_aWheelSpeed[rightWheel] *= 0.95f; - } - m_aWheelRotation[rightWheel] += m_aWheelSpeed[rightWheel]*CTimer::GetTimeStep(); - } - } -} - void CAutomobile::Teleport(CVector pos) { @@ -1553,11 +1739,6 @@ CAutomobile::PreRender(void) int i, j, n; CVehicleModelInfo *mi = (CVehicleModelInfo*)CModelInfo::GetModelInfo(GetModelIndex()); - if(GetModelIndex() == MI_FIRETRUCK) - FireTruckControl(); - - CVehicle::PreRender(); - if(GetModelIndex() == MI_RHINO && m_aCarNodes[CAR_WINDSCREEN]){ // Rotate Rhino turret CMatrix m; @@ -1864,7 +2045,6 @@ CAutomobile::PreRender(void) if(DotProduct(GetForward(), camDist) > 0.0f || TheCamera.GetLookDirection() == LOOKING_LEFT || TheCamera.GetLookDirection() == LOOKING_RIGHT){ - /* CParticle::AddParticle(PARTICLE_HEATHAZE, pos1, CVector(0.0f, 0.0f, 0.0f)); if(pHandling->Flags & HANDLING_DBL_EXHAUST) CParticle::AddParticle(PARTICLE_HEATHAZE, pos2, CVector(0.0f, 0.0f, 0.0f)); @@ -1872,7 +2052,6 @@ CAutomobile::PreRender(void) CParticle::AddParticle(PARTICLE_HEATHAZE, pos1, CVector(0.0f, 0.0f, 0.0f)); if(pHandling->Flags & HANDLING_DBL_EXHAUST) CParticle::AddParticle(PARTICLE_HEATHAZE, pos2, CVector(0.0f, 0.0f, 0.0f)); - */ } } @@ -2022,7 +2201,8 @@ CAutomobile::PreRender(void) case MI_TAXI: case MI_CABBIE: - case MI_BORGNINE: + case MI_ZEBRA: + case MI_KAUFMAN: if(bTaxiLight){ CVector pos = GetPosition() + GetUp()*0.95f; CCoronas::RegisterCorona((uintptr)this + 21, @@ -2838,7 +3018,6 @@ CAutomobile::Render(void) CEntity::Render(); } -//--LCS: done int32 CAutomobile::ProcessEntityCollision(CEntity *ent, CColPoint *colpoints) { @@ -2910,13 +3089,9 @@ static float fMouseCentreRange = 0.35f; static float fMouseSteerSens = -0.0035f; static float fMouseCentreMult = 0.975f; -//--LCS: done except TODO void CAutomobile::ProcessControlInputs(uint8 pad) { - if(this == FindPlayerVehicle() && CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle) - return; - float speed = DotProduct(m_vecMoveSpeed, GetForward()); if(!CPad::GetPad(pad)->GetExitVehicle() || @@ -2927,7 +3102,6 @@ CAutomobile::ProcessControlInputs(uint8 pad) bIsHandbrakeOn = true; // Steer left/right -#if 0 // LCS: removed, need mouse for free cam if(CCamera::m_bUseMouse3rdPerson && !CVehicle::m_bDisableMouseSteering){ if(CPad::GetPad(pad)->GetMouseX() != 0.0f){ m_fSteerInput += fMouseSteerSens*CPad::GetPad(pad)->GetMouseX(); @@ -2940,9 +3114,7 @@ CAutomobile::ProcessControlInputs(uint8 pad) 0.2f*CTimer::GetTimeStep(); nLastControlInput = 0; } - }else -#endif - { + }else{ m_fSteerInput += (-CPad::GetPad(pad)->GetSteeringLeftRight()/128.0f - m_fSteerInput)* 0.2f*CTimer::GetTimeStep(); nLastControlInput = 0; @@ -3035,7 +3207,6 @@ CAutomobile::ProcessControlInputs(uint8 pad) // Brake if player isn't in control // BUG: game always uses pad 0 here - // TODO(LCS): more conditions here #ifdef FIX_BUGS if(CPad::GetPad(pad)->ArePlayerControlsDisabled()){ #else @@ -3758,7 +3929,6 @@ CAutomobile::DoDriveByShootings(void) } } -//--LCS: done void CAutomobile::DoHoverSuspensionRatios(void) { @@ -4174,7 +4344,7 @@ CAutomobile::dmgDrawCarCollidingParticles(const CVector &pos, float amount) CGeneral::GetRandomNumberInRange(0.1f, 0.25f)), nil, CGeneral::GetRandomNumberInRange(0.02f, 0.08f), - CVehicleModelInfo::mspInfo->ms_vehicleColourTable[m_currentColour1], + CVehicleModelInfo::ms_vehicleColourTable[m_currentColour1], CGeneral::GetRandomNumberInRange(-40.0f, 40.0f), 0, CGeneral::GetRandomNumberInRange(0.0f, 4.0f)); @@ -4855,7 +5025,6 @@ CAutomobile::ResetSuspension(void) } } -//--LCS: done void CAutomobile::SetupSuspensionLines(void) { @@ -4864,14 +5033,6 @@ CAutomobile::SetupSuspensionLines(void) CVehicleModelInfo *mi = (CVehicleModelInfo*)CModelInfo::GetModelInfo(GetModelIndex()); CColModel *colModel = mi->GetColModel(); - bool adjustColModel; - if(colModel->lines == nil){ - adjustColModel = true; - colModel->lines = new CColLine[4]; - colModel->numLines = 4; - }else - adjustColModel = false; - // Each suspension line starts at the uppermost wheel position // and extends down to the lowermost point on the tyre for(i = 0; i < 4; i++){ @@ -4911,21 +5072,6 @@ CAutomobile::SetupSuspensionLines(void) for(i = 0; i < colModel->numSpheres; i++) colModel->spheres[i].radius = 0.3f; } - - if(pHandling->Flags & HANDLING_FORCE_GRND_CLR && adjustColModel){ - // 0.25 is the min distance between ground and col spheres, everything above it is safe - float safePos = 0.25f - m_fHeightAboveRoad; - for(i = 0; i < colModel->numSpheres; i++){ - CColSphere *sph = &colModel->spheres[i]; - if(sph->center.z - sph->radius < safePos){ - // sphere extends too far down, so move it up - // or decrease the radius for bigger spheres - if(radius > 0.4f) - sph->radius = Max(sph->center.z - safePos, 0.4f); - sph->center.z = safePos + sph->radius; - } - } - } } // called on police cars diff --git a/src/vehicles/Automobile.h b/src/vehicles/Automobile.h index 4f4ab50..16d8691 100644 --- a/src/vehicles/Automobile.h +++ b/src/vehicles/Automobile.h @@ -26,8 +26,6 @@ public: float m_aSuspensionSpringRatioPrev[4]; float m_aWheelTimer[4]; // set to 4.0 when wheel is touching ground, then decremented float m_auto_unused1; - float m_fEngineInertiaVar1; - float m_fEngineInertiaVar2; eSkidmarkType m_aWheelSkidmarkType[4]; bool m_aWheelSkidmarkBloody[4]; bool m_aWheelSkidmarkUnk[4]; @@ -116,7 +114,6 @@ public: float GetHeightAboveRoad(void); void PlayCarHorn(void); - void ProcessCarWheelPair(int leftWheel, int rightWheel, float steerAngle, CVector *contactSpeeds, CVector *contactPoints, float traction, float acceleration, float brake, bool bFront); void FireTruckControl(void); void TankControl(void); void HydraulicControl(void); diff --git a/src/vehicles/Bike.cpp b/src/vehicles/Bike.cpp index 761ea93..3e4c3a3 100644 --- a/src/vehicles/Bike.cpp +++ b/src/vehicles/Bike.cpp @@ -79,10 +79,9 @@ CBike::CBike(int32 id, uint8 CreatedBy) m_bikeAnimType = ASSOCGRP_BIKE_STANDARD; break; case MI_SANCHEZ: - case MI_SANCHEZ2: m_bikeAnimType = ASSOCGRP_BIKE_DIRT; break; - default: m_bikeAnimType = ASSOCGRP_BIKE_STANDARD; //assert(0 && "invalid bike model ID"); // TODO + default: assert(0 && "invalid bike model ID"); } m_vehType = VEHICLE_TYPE_BIKE; @@ -110,7 +109,7 @@ CBike::CBike(int32 id, uint8 CreatedBy) m_fTurnMass = pHandling->fTurnMass; m_vecCentreOfMass = pHandling->CentreOfMass; m_vecCentreOfMass.z = 0.1f; - m_fAirResistance = pHandling->fDragMult > 0.01f ? pHandling->fDragMult*0.0005f : pHandling->fDragMult; + m_fAirResistance = pHandling->Dimension.x*pHandling->Dimension.z/m_fMass; m_fElasticity = 0.05f; m_fBuoyancy = pHandling->fBuoyancy; @@ -134,8 +133,6 @@ CBike::CBike(int32 id, uint8 CreatedBy) bIsOnFire = false; bWheelieCam = false; - bFixedColour = false; // <- figure out actual place (TODO) - m_fTireTemperature = 1.0f; m_fBrakeDestabilization = 0.0f; m_fVelocityChangeForAudio = 0; @@ -1725,7 +1722,7 @@ CBike::PreRender(void) TheCamera.GetLookDirection() == LOOKING_RIGHT) pos1 -= 0.2f*GetForward(); - //CParticle::AddParticle(PARTICLE_HEATHAZE, pos1, CVector(0.0f, 0.0f, 0.0f)); + CParticle::AddParticle(PARTICLE_HEATHAZE, pos1, CVector(0.0f, 0.0f, 0.0f)); } } } diff --git a/src/vehicles/Bike.h b/src/vehicles/Bike.h index 611cd11..219d887 100644 --- a/src/vehicles/Bike.h +++ b/src/vehicles/Bike.h @@ -75,7 +75,6 @@ public: uint8 bExtraSpeed : 1; // leaning forward uint8 bIsOnFire : 1; uint8 bWheelieCam : 1; - uint8 bFixedColour : 1; // <- figure out its actual place (TODO) int16 m_doingBurnout; float m_fTireTemperature; float m_fBrakeDestabilization; diff --git a/src/vehicles/Boat.cpp b/src/vehicles/Boat.cpp index 3b9290e..0bc653c 100644 --- a/src/vehicles/Boat.cpp +++ b/src/vehicles/Boat.cpp @@ -71,7 +71,7 @@ CBoat::CBoat(int mi, uint8 owner) : CVehicle(owner) m_fMass = pHandling->fMass; m_fTurnMass = pHandling->fTurnMass / 2.0f; m_vecCentreOfMass = pHandling->CentreOfMass; - m_fAirResistance = pHandling->fDragMult > 0.01f ? pHandling->fDragMult*0.0005f : pHandling->fDragMult; + m_fAirResistance = pHandling->Dimension.x * pHandling->Dimension.z / m_fMass; m_fElasticity = 0.1f; m_fBuoyancy = pHandling->fBuoyancy; m_fSteerAngle = 0.0f; @@ -681,7 +681,6 @@ CBoat::ProcessControl(void) } // Spray waterdrops on screen - /* if(TheCamera.GetLookingForwardFirstPerson() && FindPlayerVehicle() && FindPlayerVehicle()->IsBoat() && m_nDeltaVolumeUnderWater > 0 && numWaterDropOnScreen < 20){ CVector dropPos; @@ -712,7 +711,7 @@ CBoat::ProcessControl(void) if(CParticle::AddParticle(PARTICLE_WATERDROP, dropPos, dropDir, nil, CGeneral::GetRandomNumberInRange(0.1f, 0.15f), dropColor, 0, 0, frm)) numWaterDropOnScreen++; - }*/ + } if(m_fPrevVolumeUnderWater == 0.0f && m_fVolumeUnderWater > 0.0f && GetModelIndex() == MI_SKIMMER){ CVector splashDir(0.0f, 0.0f, 0.25f*speed); diff --git a/src/vehicles/Cranes.cpp b/src/vehicles/Cranes.cpp index a675fe4..b592686 100644 --- a/src/vehicles/Cranes.cpp +++ b/src/vehicles/Cranes.cpp @@ -12,7 +12,7 @@ #include "Object.h" #include "World.h" -#define MAX_DISTANCE_TO_FIND_CRANE (100.0f) +#define MAX_DISTANCE_TO_FIND_CRANE (10.0f) #define CRANE_UPDATE_RADIUS (300.0f) #define CRANE_MOVEMENT_PROCESSING_RADIUS (150.0f) #define CRUSHER_Z (-0.951f) @@ -60,8 +60,7 @@ void CCranes::InitCranes(void) } } } - // TODO(LCS) - for (CPtrNode* pNode = CWorld::GetBigBuildingList(LEVEL_INDUSTRIAL).first; pNode; pNode = pNode->next) { + for (CPtrNode* pNode = CWorld::GetBigBuildingList(LEVEL_MAINLAND).first; pNode; pNode = pNode->next) { CEntity* pEntity = (CEntity*)pNode->item; if (MODELID_CRANE_1 == pEntity->GetModelIndex() || MODELID_CRANE_2 == pEntity->GetModelIndex() || @@ -71,7 +70,6 @@ void CCranes::InitCranes(void) MODELID_CRANE_6 == pEntity->GetModelIndex()) AddThisOneCrane(pEntity); } - } void CCranes::AddThisOneCrane(CEntity* pEntity) @@ -464,7 +462,7 @@ bool CCranes::DoesMilitaryCraneHaveThisOneAlready(uint32 mi) case MI_FIRETRUCK: return (CarsCollectedMilitaryCrane & 1); case MI_AMBULAN: return (CarsCollectedMilitaryCrane & 2); case MI_ENFORCER: return (CarsCollectedMilitaryCrane & 4); - case (uint32)MI_FBIRANCH: return (CarsCollectedMilitaryCrane & 8); + case MI_FBIRANCH: return (CarsCollectedMilitaryCrane & 8); case MI_RHINO: return (CarsCollectedMilitaryCrane & 0x10); case MI_BARRACKS: return (CarsCollectedMilitaryCrane & 0x20); case MI_POLICE: return (CarsCollectedMilitaryCrane & 0x40); @@ -479,7 +477,7 @@ void CCranes::RegisterCarForMilitaryCrane(uint32 mi) case MI_FIRETRUCK: CarsCollectedMilitaryCrane |= 1; break; case MI_AMBULAN: CarsCollectedMilitaryCrane |= 2; break; case MI_ENFORCER: CarsCollectedMilitaryCrane |= 4; break; - case (uint32)MI_FBIRANCH: CarsCollectedMilitaryCrane |= 8; break; + case MI_FBIRANCH: CarsCollectedMilitaryCrane |= 8; break; case MI_RHINO: CarsCollectedMilitaryCrane |= 0x10; break; case MI_BARRACKS: CarsCollectedMilitaryCrane |= 0x20; break; case MI_POLICE: CarsCollectedMilitaryCrane |= 0x40; break; diff --git a/src/vehicles/DamageManager.cpp b/src/vehicles/DamageManager.cpp index b74e708..8ba235b 100644 --- a/src/vehicles/DamageManager.cpp +++ b/src/vehicles/DamageManager.cpp @@ -10,8 +10,7 @@ float G_aComponentDamage[] = { 2.5f, 1.25f, 3.2f, 1.4f, 2.5f, 2.8f, 0.5f }; CDamageManager::CDamageManager(void) { ResetDamageStatus(); - m_fWheelDamageEffect = 0.65f; - m_bSmashedDoorDoesntClose = false; + m_fWheelDamageEffect = 0.5f; field_18 = 1; } @@ -137,8 +136,6 @@ void CDamageManager::SetDoorStatus(int32 door, uint32 status) { m_doorStatus[door] = status; - if(m_bSmashedDoorDoesntClose && door != DOOR_BONNET && status == DOOR_STATUS_SMASHED) - m_doorStatus[door] = DOOR_STATUS_SWINGING; } int32 diff --git a/src/vehicles/DamageManager.h b/src/vehicles/DamageManager.h index 1f83642..312006e 100644 --- a/src/vehicles/DamageManager.h +++ b/src/vehicles/DamageManager.h @@ -81,7 +81,6 @@ class CDamageManager public: float m_fWheelDamageEffect; - bool m_bSmashedDoorDoesntClose; uint8 m_engineStatus; uint8 m_wheelStatus[4]; uint8 m_doorStatus[6]; diff --git a/src/vehicles/Door.cpp b/src/vehicles/Door.cpp index 72a3033..c80965a 100644 --- a/src/vehicles/Door.cpp +++ b/src/vehicles/Door.cpp @@ -168,58 +168,3 @@ CTrainDoor::IsClosed(void) { return m_fPosn == RetTranslationWhenClosed(); } - -bool -CFerryDoor::IsInUse(void) -{ - float translationDifference = m_fPrevPosn - m_fPosn; - m_fPrevPosn = m_fPosn; - return Abs(translationDifference) > 0.002f; -} - -float -CFerryDoor::RetTranslationWhenClosed(void) -{ - if(Abs(m_fClosedPosn) < Abs(m_fOpenPosn)) - return m_fClosedPosn; - else - return m_fOpenPosn; -} - -bool -CFerryDoor::IsClosed(void) -{ - return m_fPosn == RetTranslationWhenClosed(); -} - -float -CFerryDoor::RetTranslationWhenOpen(void) -{ - if(Abs(m_fClosedPosn) < Abs(m_fOpenPosn)) - return m_fOpenPosn; - else - return m_fClosedPosn; -} - -bool -CFerryDoor::IsFullyOpen(void) -{ - if(Abs(m_fPosn) < Abs(RetTranslationWhenOpen()) - 0.5f) - return false; - return true; -} - -void -CFerryDoor::Open(float ratio) -{ - float open; - - m_fPrevPosn = m_fPosn; - open = RetTranslationWhenOpen(); - if(ratio < 1.0f){ - m_fPosn = open*ratio; - }else{ - m_nDoorState = DOORST_OPEN; - m_fPosn = open; - } -} \ No newline at end of file diff --git a/src/vehicles/Door.h b/src/vehicles/Door.h index da5a3de..567d326 100644 --- a/src/vehicles/Door.h +++ b/src/vehicles/Door.h @@ -67,22 +67,3 @@ public: float RetTranslationWhenOpen(void); void Open(float ratio); }; - - -class CFerryDoor { -private: - float m_fClosedPosn; - float m_fOpenPosn; - int8 m_nDirn; - int8 m_nAxis; - int8 m_nDoorState; - float m_fPosn; - float m_fPrevPosn; -public: - bool IsInUse(void); - float RetTranslationWhenClosed(void); - float RetTranslationWhenOpen(void); - bool IsClosed(void); - bool IsFullyOpen(void); - void Open(float ratio); -}; \ No newline at end of file diff --git a/src/vehicles/Ferry.h b/src/vehicles/Ferry.h deleted file mode 100644 index 375dfce..0000000 --- a/src/vehicles/Ferry.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "Vehicle.h" -#include "Door.h" - -enum eFerryNodes -{ - FERRY_DOOR_FRONT = 1, - FERRY_RAMP_FRONT, - FERRY_DOOR_BACK, - FERRY_RAMP_BACK, - NUM_FERRY_NODES -}; diff --git a/src/vehicles/HandlingMgr.cpp b/src/vehicles/HandlingMgr.cpp index b5dc765..8438c5c 100644 --- a/src/vehicles/HandlingMgr.cpp +++ b/src/vehicles/HandlingMgr.cpp @@ -42,7 +42,6 @@ const char VehicleNames[NUMHANDLINGS][14] = { "RHINO", "BARRACKS", "TRAIN", - "FERRY", "HELI", "DODO", "COACH", @@ -55,40 +54,66 @@ const char VehicleNames[NUMHANDLINGS][14] = { "DEADDODO", "FLATBED", "YANKEE", - "BLISTA", - "BELLYUP", - "MRWONGS", - "YARDIE", - "YAKUZA", - "DIABLOS", - "COLUMB", - "HOODS", - "PANLANT", - "BORGNINE", - "CAMPVAN", - "BALLOT", - "SPIDER", - "SHELBY", - "PONTIAC", - "ESPRIT", - "MINI", - "HOTROD", - "SINDACCO", - "FORELLI", + "GOLFCART", + "VOODOO", + "WASHING", + "CUBAN", + "ROMERO", + "PACKER", + "ADMIRAL", + "GANGBUR", + "ZEBRA", + "TOPFUN", + "GLENDALE", + "OCEANIC", + "HERMES", + "SABRE1", + "SABRETUR", + "PHEONIX", + "WALTON", + "REGINA", + "COMET", + "DELUXO", + "BURRITO", + "SPAND", + "BAGGAGE", + "KAUFMAN", + "RANCHER", + "FBIRANCH", + "VIRGO", + "GREENWOO", + "HOTRING", + "SANDKING", + "BLISTAC", + "BOXVILLE", + "BENSON", + "DESPERAD", + "LOVEFIST", + "BLOODRA", + "BLOODRB", "BIKE", "MOPED", "DIRTBIKE", "ANGEL", - "DIRTBIK2", - "ANGE2", "FREEWAY", "PREDATOR", "SPEEDER", "REEFER", + "RIO", + "SQUALO", + "TROPIC", + "COASTGRD", + "DINGHY", + "MARQUIS", + "CUPBOAT", + "SEAPLANE", + "SPARROW", + "SEASPAR", "MAVERICK", "COASTMAV", "POLMAV", "HUNTER", + "RCBARON", "RCGOBLIN", "RCCOPTER" }; @@ -113,17 +138,18 @@ void cHandlingDataMgr::LoadHandlingData(void) { char *start, *end; - char line[300]; + char line[201]; // weird value char delim[4]; // not sure char *word; int field, handlingId; + int keepGoing; tHandlingData *handling; tFlyingHandlingData *flyingHandling; tBoatHandlingData *boatHandling; tBikeHandlingData *bikeHandling; CFileMgr::SetDir("DATA"); - ssize_t filesz = CFileMgr::LoadFile(HandlingFilename, work_buff, sizeof(work_buff), "r"); + CFileMgr::LoadFile(HandlingFilename, work_buff, sizeof(work_buff), "r"); CFileMgr::SetDir(""); start = (char*)work_buff; @@ -132,18 +158,21 @@ cHandlingDataMgr::LoadHandlingData(void) flyingHandling = nil; boatHandling = nil; bikeHandling = nil; + keepGoing = 1; - while(start < (char*)&work_buff[filesz]){ + while(keepGoing){ // find end of line while(*end != '\n') end++; // get line strncpy(line, start, end - start); line[end - start] = '\0'; + start = end+1; + end = start+1; // yeah, this is kinda crappy if(strcmp(line, ";the end") == 0) - break; + keepGoing = 0; else if(line[0] != ';'){ if(line[0] == '!'){ // Bike data @@ -257,19 +286,19 @@ cHandlingDataMgr::LoadHandlingData(void) handling->nIdentifier = (tVehicleType)handlingId; break; case 1: handling->fMass = atof(word); break; - case 2: handling->fTurnMass = atof(word); break; - case 3: handling->fDragMult = atof(word); break; - case 4: handling->CentreOfMass.x = atof(word); break; - case 5: handling->CentreOfMass.y = atof(word); break; - case 6: handling->CentreOfMass.z = atof(word); break; - case 7: handling->nPercentSubmerged = atoi(word); break; - case 8: handling->fTractionMultiplier = atof(word); break; - case 9: handling->fTractionLoss = atof(word); break; - case 10: handling->fTractionBias = atof(word); break; - case 11: handling->Transmission.nNumberOfGears = atoi(word); break; - case 12: handling->Transmission.fMaxVelocity = atof(word); break; - case 13: handling->Transmission.fEngineAcceleration = atof(word) * 0.4; break; - case 14: handling->Transmission.fEngineInertia = atof(word); break; + case 2: handling->Dimension.x = atof(word); break; + case 3: handling->Dimension.y = atof(word); break; + case 4: handling->Dimension.z = atof(word); break; + case 5: handling->CentreOfMass.x = atof(word); break; + case 6: handling->CentreOfMass.y = atof(word); break; + case 7: handling->CentreOfMass.z = atof(word); break; + case 8: handling->nPercentSubmerged = atoi(word); break; + case 9: handling->fTractionMultiplier = atof(word); break; + case 10: handling->fTractionLoss = atof(word); break; + case 11: handling->fTractionBias = atof(word); break; + case 12: handling->Transmission.nNumberOfGears = atoi(word); break; + case 13: handling->Transmission.fMaxVelocity = atof(word); break; + case 14: handling->Transmission.fEngineAcceleration = atof(word) * 0.4; break; case 15: handling->Transmission.nDriveType = word[0]; break; case 16: handling->Transmission.nEngineType = word[0]; break; case 17: handling->fBrakeDeceleration = atof(word); break; @@ -278,28 +307,25 @@ cHandlingDataMgr::LoadHandlingData(void) case 20: handling->fSteeringLock = atof(word); break; case 21: handling->fSuspensionForceLevel = atof(word); break; case 22: handling->fSuspensionDampingLevel = atof(word); break; - // case 23: // fSuspensionHighSpdComDamp unused - case 24: handling->fSuspensionUpperLimit = atof(word); break; - case 25: handling->fSuspensionLowerLimit = atof(word); break; - case 26: handling->fSuspensionBias = atof(word); break; - case 27: handling->fSuspensionAntidiveMultiplier = atof(word); break; - case 28: handling->fSeatOffsetDistance = atof(word); break; - case 29: handling->fCollisionDamageMultiplier = atof(word); break; - case 30: handling->nMonetaryValue = atoi(word); break; - case 31: + case 23: handling->fSeatOffsetDistance = atof(word); break; + case 24: handling->fCollisionDamageMultiplier = atof(word); break; + case 25: handling->nMonetaryValue = atoi(word); break; + case 26: handling->fSuspensionUpperLimit = atof(word); break; + case 27: handling->fSuspensionLowerLimit = atof(word); break; + case 28: handling->fSuspensionBias = atof(word); break; + case 29: handling->fSuspensionAntidiveMultiplier = atof(word); break; + case 30: sscanf(word, "%x", &handling->Flags); - // handling->Transmission.Flags = handling->Flags; + handling->Transmission.Flags = handling->Flags; break; - case 32: handling->FrontLights = atoi(word); break; - case 33: handling->RearLights = atoi(word); break; + case 31: handling->FrontLights = atoi(word); break; + case 32: handling->RearLights = atoi(word); break; } field++; } ConvertDataToGameUnits(handling); } } - start = end+1; - end = start+1; } } @@ -327,9 +353,12 @@ cHandlingDataMgr::ConvertDataToGameUnits(tHandlingData *handling) handling->Transmission.fEngineAcceleration *= 1.0f/(50.0f*50.0f); handling->Transmission.fMaxVelocity *= 1000.0f/(60.0f*60.0f * 50.0f); handling->fBrakeDeceleration *= 1.0f/(50.0f*50.0f); - handling->fInvMass = 1.0f/handling->GetMass(); - handling->fCollisionDamageMultiplier = handling->GetCollisionDamageMultiplier() * 2000.0f/handling->GetMass(); - handling->fBuoyancy = 100.0f/handling->nPercentSubmerged * GRAVITY*handling->GetMass(); + handling->fTurnMass = (sq(handling->Dimension.x) + sq(handling->Dimension.y)) * handling->fMass / 12.0f; + if(handling->fTurnMass < 10.0f) + handling->fTurnMass *= 5.0f; + handling->fInvMass = 1.0f/handling->fMass; + handling->fCollisionDamageMultiplier *= 2000.0f/handling->fMass; + handling->fBuoyancy = 100.0f/handling->nPercentSubmerged * GRAVITY*handling->fMass; // Don't quite understand this. What seems to be going on is that // we calculate a drag (air resistance) deceleration for a given velocity and @@ -342,13 +371,10 @@ cHandlingDataMgr::ConvertDataToGameUnits(tHandlingData *handling) velocity -= 0.01f; // what's the 1/6? a = handling->Transmission.fEngineAcceleration/6.0f; - // no idea what's happening here - float drag; - if(handling->fDragMult < 0.01f) - drag = 1.0f - 1.0f/(SQR(velocity)*handling->fDragMult + 1.0f); - else - drag = 0.0005f*handling->fDragMult * velocity; - b = velocity * drag; + // no density or drag coefficient here... + float a_drag = 0.5f*SQR(velocity) * handling->Dimension.x*handling->Dimension.z / handling->fMass; + // can't make sense of this... maybe v - v/(drag + 1) ? but that doesn't make so much sense either + b = -velocity * (1.0f/(a_drag + 1.0f) - 1.0f); } if(handling->nIdentifier == HANDLING_RCBANDIT){ @@ -394,15 +420,15 @@ cHandlingDataMgr::GetHandlingId(const char *name) tFlyingHandlingData* cHandlingDataMgr::GetFlyingPointer(uint8 id) { - if(id >= HANDLING_MAVERICK && id <= HANDLING_RCCOPTER) - return &FlyingHandlingData[id-HANDLING_MAVERICK]; + if(id >= HANDLING_SEAPLANE && id <= HANDLING_RCCOPTER) + return &FlyingHandlingData[id-HANDLING_SEAPLANE]; return &FlyingHandlingData[0]; } tBoatHandlingData* cHandlingDataMgr::GetBoatPointer(uint8 id) { - if(id >= HANDLING_PREDATOR && id <= HANDLING_MAVERICK) + if(id >= HANDLING_PREDATOR && id <= HANDLING_SEAPLANE) return &BoatHandlingData[id-HANDLING_PREDATOR]; return &BoatHandlingData[0]; } diff --git a/src/vehicles/HandlingMgr.h b/src/vehicles/HandlingMgr.h index 2d49761..8d290f7 100644 --- a/src/vehicles/HandlingMgr.h +++ b/src/vehicles/HandlingMgr.h @@ -36,7 +36,6 @@ enum tVehicleType HANDLING_RHINO, HANDLING_BARRACKS, HANDLING_TRAIN, - HANDLING_FERRY, HANDLING_HELI, HANDLING_DODO, HANDLING_COACH, @@ -49,51 +48,76 @@ enum tVehicleType HANDLING_DEADDODO, HANDLING_FLATBED, HANDLING_YANKEE, - HANDLING_BLISTA, - HANDLING_BELLYUP, - HANDLING_MRWONGS, - HANDLING_YARDIE, - HANDLING_YAKUZA, - HANDLING_DIABLOS, - HANDLING_COLUMB, - HANDLING_HOODS, - HANDLING_PANLANT, - HANDLING_BORGNINE, - HANDLING_CAMPVAN, - HANDLING_BALLOT, - HANDLING_SPIDER, - HANDLING_SHELBY, - HANDLING_PONTIAC, - HANDLING_ESPRIT, - HANDLING_MINI, - HANDLING_HOTROD, - HANDLING_SINDACCO, - HANDLING_FORELLI, + HANDLING_GOLFCART, + HANDLING_VOODOO, + HANDLING_WASHING, + HANDLING_CUBAN, + HANDLING_ROMERO, + HANDLING_PACKER, + HANDLING_ADMIRAL, + HANDLING_GANGBUR, + HANDLING_ZEBRA, + HANDLING_TOPFUN, + HANDLING_GLENDALE, + HANDLING_OCEANIC, + HANDLING_HERMES, + HANDLING_SABRE1, + HANDLING_SABRETUR, + HANDLING_PHEONIX, + HANDLING_WALTON, + HANDLING_REGINA, + HANDLING_COMET, + HANDLING_DELUXO, + HANDLING_BURRITO, + HANDLING_SPAND, + HANDLING_BAGGAGE, + HANDLING_KAUFMAN, + HANDLING_RANCHER, + HANDLING_FBIRANCH, + HANDLING_VIRGO, + HANDLING_GREENWOO, + HANDLING_HOTRING, + HANDLING_SANDKING, + HANDLING_BLISTAC, + HANDLING_BOXVILLE, + HANDLING_BENSON, + HANDLING_DESPERAD, + HANDLING_LOVEFIST, + HANDLING_BLOODRA, + HANDLING_BLOODRB, HANDLING_BIKE, HANDLING_MOPED, HANDLING_DIRTBIKE, HANDLING_ANGEL, - HANDLING_DIRTBIK2, - HANDLING_ANGE2, HANDLING_FREEWAY, HANDLING_PREDATOR, HANDLING_SPEEDER, HANDLING_REEFER, - + HANDLING_RIO, + HANDLING_SQUALO, + HANDLING_TROPIC, + HANDLING_COASTGRD, + HANDLING_DINGHY, + HANDLING_MARQUIS, + HANDLING_CUPBOAT, + HANDLING_SEAPLANE, // both boat and plane! + HANDLING_SPARROW, + HANDLING_SEASPAR, HANDLING_MAVERICK, HANDLING_COASTMAV, HANDLING_POLMAV, HANDLING_HUNTER, + HANDLING_RCBARON, HANDLING_RCGOBLIN, HANDLING_RCCOPTER, NUMHANDLINGS, NUMBIKEHANDLINGS = HANDLING_FREEWAY+1 - HANDLING_BIKE, - NUMFLYINGHANDLINGS = HANDLING_RCCOPTER+1 - HANDLING_MAVERICK, - NUMBOATHANDLINGS = HANDLING_REEFER+1 - HANDLING_PREDATOR, + NUMFLYINGHANDLINGS = HANDLING_RCCOPTER+1 - HANDLING_SEAPLANE, + NUMBOATHANDLINGS = HANDLING_SEAPLANE+1 - HANDLING_PREDATOR, }; enum tField // most likely a handling field enum, never used so :shrug: @@ -131,21 +155,19 @@ enum HANDLING_NARROW_FRONTW = 0x2000000, HANDLING_GOOD_INSAND = 0x4000000, HANDLING_UNKNOWN = 0x8000000, // something for helis and planes - HANDLING_FORCE_GRND_CLR = 0x10000000 }; struct tHandlingData { - float fMass; - float fTurnMass; - float fTractionMultiplier; - float fCollisionDamageMultiplier; tVehicleType nIdentifier; + float fMass; float fInvMass; - float fDragMult; + float fTurnMass; + CVector Dimension; CVector CentreOfMass; int8 nPercentSubmerged; float fBuoyancy; + float fTractionMultiplier; cTransmission Transmission; float fBrakeDeceleration; float fBrakeBias; @@ -160,17 +182,12 @@ struct tHandlingData float fSuspensionLowerLimit; float fSuspensionBias; float fSuspensionAntidiveMultiplier; + float fCollisionDamageMultiplier; uint32 Flags; float fSeatOffsetDistance; int32 nMonetaryValue; int8 FrontLights; int8 RearLights; - int unk[4]; - - float GetMass(void) const { return fMass; } - float GetTurnMass(void) const { return fTurnMass; } - float GetTractionMultiplier(void) const { return fTractionMultiplier; } - float GetCollisionDamageMultiplier(void) const { return fCollisionDamageMultiplier; } }; struct tBikeHandlingData diff --git a/src/vehicles/Heli.cpp b/src/vehicles/Heli.cpp index 3f01ff4..bf14416 100644 --- a/src/vehicles/Heli.cpp +++ b/src/vehicles/Heli.cpp @@ -756,7 +756,7 @@ CHeli::InitHelis(void) for(i = 0; i < NUM_HELIS; i++) pHelis[i] = nil; - ((CVehicleModelInfo*)CModelInfo::GetModelInfo(MI_CHOPPER))->SetColModel(&gpTempColModels->ms_colModelPed1); + ((CVehicleModelInfo*)CModelInfo::GetModelInfo(MI_CHOPPER))->SetColModel(&CTempColModels::ms_colModelPed1); } CHeli* diff --git a/src/vehicles/Train.cpp b/src/vehicles/Train.cpp index 55be4a2..5f0cf36 100644 --- a/src/vehicles/Train.cpp +++ b/src/vehicles/Train.cpp @@ -459,11 +459,11 @@ CTrain::InitTrains(void) CStreaming::LoadAllRequestedModels(false); // El-Train wagons - float wagonPositions[] = { 0.0f, 20.0f, 0.0f, 20.0f }; - int8 firstWagon[] = { 1, 0, 1, 0 }; - int8 lastWagon[] = { 0, 1, 0, 1 }; - int16 wagonGroup[] = { 0, 0, 1, 1 }; - for(i = 0; i < 4; i++){ + float wagonPositions[] = { 0.0f, 20.0f, 40.0f, 0.0f, 20.0f }; + int8 firstWagon[] = { 1, 0, 0, 1, 0 }; + int8 lastWagon[] = { 0, 0, 1, 0, 1 }; + int16 wagonGroup[] = { 0, 0, 0, 1, 1 }; + for(i = 0; i < 5; i++){ train = new CTrain(MI_TRAIN, PERMANENT_VEHICLE); train->GetMatrix().SetTranslate(0.0f, 0.0f, 0.0f); train->SetStatus(STATUS_ABANDONED); @@ -649,6 +649,52 @@ CTrain::ReadAndInterpretTrackFile(Const char *filename, CTrainNode **nodes, int1 #endif } +void +PlayAnnouncement(uint8 sound, uint8 station) +{ + // this was gone in a PC version but inlined on PS2 + cAudioScriptObject *obj = new cAudioScriptObject; + obj->AudioId = sound; + obj->Posn = CTrain::aStationCoors[station]; + obj->AudioEntity = AEHANDLE_NONE; + DMAudio.CreateOneShotScriptObject(obj); +} + +void +ProcessTrainAnnouncements(void) +{ +#ifdef GTA_TRAIN + for (int i = 0; i < ARRAY_SIZE(StationDist); i++) { + for (int j = 0; j < ARRAY_SIZE(EngineTrackPosition); j++) { + if (!bTrainArrivalAnnounced[i]) { + float preDist = StationDist[i] - 100.0f; + if (preDist < 0.0f) + preDist += TotalLengthOfTrack; + if (EngineTrackPosition[j] > preDist && EngineTrackPosition[j] < StationDist[i]) { + bTrainArrivalAnnounced[i] = true; + PlayAnnouncement(SCRIPT_SOUND_TRAIN_ANNOUNCEMENT_1, i); + break; + } + } else { + float postDist = StationDist[i] + 10.0f; +#ifdef FIX_BUGS + if (postDist > TotalLengthOfTrack) + postDist -= TotalLengthOfTrack; +#else + if (postDist < 0.0f) // does this even make sense here? + postDist += TotalLengthOfTrack; +#endif + if (EngineTrackPosition[j] > StationDist[i] && EngineTrackPosition[j] < postDist) { + bTrainArrivalAnnounced[i] = false; + PlayAnnouncement(SCRIPT_SOUND_TRAIN_ANNOUNCEMENT_2, i); + break; + } + } + } + } +#endif +} + void CTrain::UpdateTrains(void) { @@ -686,6 +732,8 @@ CTrain::UpdateTrains(void) // time offset for each train time += 0x20000/2; } + + ProcessTrainAnnouncements(); } // Update Subway diff --git a/src/vehicles/Transmission.cpp b/src/vehicles/Transmission.cpp index f7851f4..1aeabfe 100644 --- a/src/vehicles/Transmission.cpp +++ b/src/vehicles/Transmission.cpp @@ -4,7 +4,6 @@ #include "HandlingMgr.h" #include "Transmission.h" -//--LCS: file done void cTransmission::InitGearRatios(void) { @@ -15,14 +14,11 @@ cTransmission::InitGearRatios(void) memset(Gears, 0, sizeof(Gears)); - float baseVelocity = 0.5f*fMaxVelocity / nNumberOfGears; - float step = (fMaxVelocity - baseVelocity) / nNumberOfGears; - for(i = 1; i <= nNumberOfGears; i++){ pGearRatio0 = &Gears[i-1]; pGearRatio1 = &Gears[i]; - pGearRatio1->fMaxVelocity = baseVelocity + i*step; + pGearRatio1->fMaxVelocity = (float)i / nNumberOfGears * fMaxVelocity; velocityDiff = pGearRatio1->fMaxVelocity - pGearRatio0->fMaxVelocity; @@ -49,12 +45,9 @@ cTransmission::CalculateGearForSimpleCar(float speed, uint8 &gear) pGearRatio = &Gears[gear]; fCurVelocity = speed; - if(speed > pGearRatio->fShiftUpVelocity){ - if(gear + 1 > nNumberOfGears) - gear = nNumberOfGears; - else - gear++; - }else if(speed < pGearRatio->fShiftDownVelocity){ + if(speed > pGearRatio->fShiftUpVelocity) + gear++; + else if(speed < pGearRatio->fShiftDownVelocity){ if(gear - 1 < 0) gear = 0; else @@ -62,110 +55,6 @@ cTransmission::CalculateGearForSimpleCar(float speed, uint8 &gear) } } -float TRANSMISSION_NITROS_INERTIA_MULT = 0.5f; -float TRANSMISSION_AI_CHEAT_INERTIA_MULT = 0.75f; -float TRANSMISSION_NITROS_MULT = 2.0f; -float TRANSMISSION_AI_CHEAT_MULT = 1.2f; -float TRANSMISSION_SMOOTHER_FRAC = 0.85f; -float TRANSMISSION_FREE_ACCELERATION = 0.1f; - -//--LCS: done -float -cTransmission::CalculateDriveAcceleration(const float &gasPedal, uint8 &gear, float &time, const float &velocity, float *inertiaVar1, float *inertiaVar2, uint8 nDriveWheels, uint8 cheat) -{ - static float fAcceleration = 0.0f; - static float fVelocity; - static float fCheat; - static tGear *pGearRatio; - - fVelocity = velocity; - if(fVelocity < fMaxReverseVelocity) - return 0.0f; - if(fVelocity > fMaxVelocity) - return 0.0f; - fCurVelocity = fVelocity; - - assert(gear <= nNumberOfGears); - - pGearRatio = &Gears[gear]; - if(fVelocity > pGearRatio->fShiftUpVelocity){ - if(gear != 0 || gasPedal > 0.0f){ - gear++; - return CalculateDriveAcceleration(gasPedal, gear, time, fVelocity, nil, nil, 0, false); - } - }else if(fVelocity < pGearRatio->fShiftDownVelocity && gear != 0){ - if(gear != 1 || gasPedal < 0.0f){ - gear--; - return CalculateDriveAcceleration(gasPedal, gear, time, fVelocity, nil, nil, 0, false); - } - } - - float accelMul; - - if(nNumberOfGears == 1){ - accelMul = 1.0f; - }else if(gear == 0){ - accelMul = 4.5f; - }else{ - float f = 1.0f - (gear-1.0f)/(nNumberOfGears-1.0f); - if(Flags & HANDLING_1G_BOOST) - accelMul = SQR(f)*5.0f + 1.0f; - else if(Flags & HANDLING_2G_BOOST) - accelMul = SQR(f)*4.0f + 1.0f; - else - accelMul = SQR(f)*3.0f + 1.0f; - } - - fCheat = 1.0f; - float nitroMult = 1.0f; - if(cheat == 1) - fCheat = TRANSMISSION_AI_CHEAT_MULT; - else if(cheat == 2) - nitroMult = TRANSMISSION_NITROS_MULT; - - fAcceleration = fEngineAcceleration*CTimer::GetTimeStep()*0.4f*accelMul*gasPedal*fCheat*nitroMult; - - if(inertiaVar1 != nil && inertiaVar2 != nil){ - if(nDriveWheels == 0){ - float f = TRANSMISSION_FREE_ACCELERATION*CTimer::GetTimeStep()*Abs(gasPedal)/fEngineInertia; - *inertiaVar1 = Min(*inertiaVar1 + f, 1.0f); - *inertiaVar2 = 0.1f; - }else{ - float var1; - // What is being calculated here? - // TODO: find better names for the inertia vars - if(gear == 0){ - var1 = ((fMaxVelocity/nNumberOfGears)*(1.0f-0.6667f) - fVelocity) / - ((fMaxVelocity/nNumberOfGears)*(1.0f-0.6667f) - Gears[gear].fShiftDownVelocity); - }else if(gear == 1){ - var1 = ((fMaxVelocity/nNumberOfGears)*(1.0f-0.6667f) + fVelocity) / - ((fMaxVelocity/nNumberOfGears)*(1.0f-0.6667f) + Gears[gear].fShiftUpVelocity); - }else{ - var1 = (fVelocity - Gears[gear].fShiftDownVelocity) / - (Gears[gear].fShiftUpVelocity - Gears[gear].fShiftDownVelocity); - } - float inertiaMult = var1 - *inertiaVar1; - if(cheat == 1) - inertiaMult *= TRANSMISSION_AI_CHEAT_INERTIA_MULT; - else if(cheat == 2) - inertiaMult *= TRANSMISSION_NITROS_INERTIA_MULT; - float var2target = 1.0f - inertiaMult*fEngineInertia; - var2target = clamp(var2target, 0.1f, 1.0f); - *inertiaVar2 = (1.0f-TRANSMISSION_SMOOTHER_FRAC)*var2target + TRANSMISSION_SMOOTHER_FRAC*(*inertiaVar2); - *inertiaVar1 = var1; - fAcceleration *= *inertiaVar2; - } - } - - float targetVelocity = Gears[gear].fMaxVelocity*fCheat; - if(Gears[gear].fMaxVelocity < 0.0f && targetVelocity > fVelocity) - fAcceleration *= 1.0f - Min((targetVelocity - fVelocity)/0.05f, 1.0f); - else if(Gears[gear].fMaxVelocity > 0.0f && targetVelocity < fVelocity) - fAcceleration *= 1.0f - Min((fVelocity - targetVelocity)/0.05f, 1.0f); - return fAcceleration; -} - -// TEMP old VC code until we have bikes float cTransmission::CalculateDriveAcceleration(const float &gasPedal, uint8 &gear, float &time, const float &velocity, bool cheat) { diff --git a/src/vehicles/Transmission.h b/src/vehicles/Transmission.h index 8aea7b0..a3d1551 100644 --- a/src/vehicles/Transmission.h +++ b/src/vehicles/Transmission.h @@ -17,7 +17,6 @@ public: int8 nNumberOfGears; uint8 Flags; float fEngineAcceleration; - float fEngineInertia; float fMaxVelocity; float fMaxCruiseVelocity; float fMaxReverseVelocity; @@ -25,6 +24,5 @@ public: void InitGearRatios(void); void CalculateGearForSimpleCar(float speed, uint8 &gear); - float CalculateDriveAcceleration(const float &gasPedal, uint8 &gear, float &time, const float &velocity, float *inertiaVar1, float *inertiaVar2, uint8 nDriveWheels, uint8 cheat); float CalculateDriveAcceleration(const float &gasPedal, uint8 &gear, float &time, const float &velocity, bool cheat); }; diff --git a/src/vehicles/Vehicle.cpp b/src/vehicles/Vehicle.cpp index a05a32a..4e6c24e 100644 --- a/src/vehicles/Vehicle.cpp +++ b/src/vehicles/Vehicle.cpp @@ -133,7 +133,6 @@ CVehicle::CVehicle(uint8 CreatedBy) bCreatedAsPoliceVehicle = false; bRestingOnPhysical = false; bParking = false; - m_bGarageTurnedLightsOff = false; bCanPark = CGeneral::GetRandomNumberInRange(0.0f, 1.0f) < 0.0f; // never true. probably doesn't work very well bIsVan = false; bIsBus = false; @@ -218,8 +217,8 @@ void CVehicle::SetModelIndex(uint32 id) { CEntity::SetModelIndex(id); - m_aExtras[0] = CVehicleModelInfo::mspInfo->ms_compsUsed[0]; - m_aExtras[1] = CVehicleModelInfo::mspInfo->ms_compsUsed[1]; + m_aExtras[0] = CVehicleModelInfo::ms_compsUsed[0]; + m_aExtras[1] = CVehicleModelInfo::ms_compsUsed[1]; m_nNumMaxPassengers = CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors(id); } @@ -772,9 +771,7 @@ CVehicle::BladeColSectorList(CPtrList &list, CColModel &rotorColModel, CMatrix & } -float WS_ALREADY_SPINNING_LOSS = 0.2f; -float WS_TRAC_FRAC_LIMIT = 0.3f; -float fBurstSpeedMax = 0.2f; +float fBurstSpeedMax = 0.3f; float fBurstTyreMod = 0.13f; void @@ -802,15 +799,13 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon float contactSpeedFwd = DotProduct(wheelContactSpeed, wheelFwd); float contactSpeedRight = DotProduct(wheelContactSpeed, wheelRight); - adhesion *= CTimer::GetTimeStep(); - if(*wheelState != WHEEL_STATE_NORMAL){ + if(*wheelState != WHEEL_STATE_NORMAL) bAlreadySkidding = true; - adhesion *= pHandling->fTractionLoss; - if(*wheelState == WHEEL_STATE_SPINNING && (GetStatus() == STATUS_PLAYER || GetStatus() == STATUS_PLAYER_REMOTE)) - adhesion *= 1.0f - Abs(m_fGasPedal) * WS_ALREADY_SPINNING_LOSS; - } *wheelState = WHEEL_STATE_NORMAL; + adhesion *= CTimer::GetTimeStep(); + if(bAlreadySkidding) + adhesion *= pHandling->fTractionLoss; // moving sideways if(contactSpeedRight != 0.0f){ @@ -850,15 +845,13 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon if(!bBraking){ if(m_fGasPedal < 0.01f){ if(IsBike()) - brake = 0.6f * mod_HandlingManager.fWheelFriction / (pHandling->GetMass() + 200.0f); - else if(IsPlane()) - brake = 0.0f; - else if(pHandling->GetMass() < 500.0f) - brake = 0.1f * mod_HandlingManager.fWheelFriction / pHandling->GetMass(); + brake = 0.6f * mod_HandlingManager.fWheelFriction / (pHandling->fMass + 200.0f); + else if(pHandling->fMass < 500.0f) + brake = 0.2f * mod_HandlingManager.fWheelFriction / pHandling->fMass; else if(GetModelIndex() == MI_RCBANDIT) - brake = 0.2f * mod_HandlingManager.fWheelFriction / pHandling->GetMass(); + brake = 0.2f * mod_HandlingManager.fWheelFriction / pHandling->fMass; else - brake = mod_HandlingManager.fWheelFriction / pHandling->GetMass(); + brake = mod_HandlingManager.fWheelFriction / pHandling->fMass; #ifdef FIX_BUGS brake *= CTimer::GetTimeStepFix(); #endif @@ -882,10 +875,7 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon float speedSq = sq(right) + sq(fwd); if(sq(adhesion) < speedSq){ if(*wheelState != WHEEL_STATE_FIXED){ - float tractionLimit = WS_TRAC_FRAC_LIMIT; - if(contactSpeedFwd > 0.15f && (wheelId == CARWHEEL_FRONT_LEFT || wheelId == CARWHEEL_FRONT_RIGHT)) - tractionLimit *= 2.0f; - if(bDriving && tractionLimit*adhesion < Abs(fwd)) + if(bDriving && contactSpeedFwd < 0.2f) *wheelState = WHEEL_STATE_SPINNING; else *wheelState = WHEEL_STATE_SKIDDING; @@ -893,8 +883,6 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon float l = Sqrt(speedSq); float tractionLoss = bAlreadySkidding ? 1.0f : pHandling->fTractionLoss; - if(*wheelState == WHEEL_STATE_SPINNING && (GetStatus() == STATUS_PLAYER || GetStatus() == STATUS_PLAYER_REMOTE)) - tractionLoss *= 1.0f - Abs(m_fGasPedal) * WS_ALREADY_SPINNING_LOSS; right *= adhesion * tractionLoss / l; fwd *= adhesion * tractionLoss / l; } @@ -903,7 +891,7 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon CVector totalSpeed = fwd*wheelFwd + right*wheelRight; CVector turnDirection = totalSpeed; - bool separateTurnForce = false; + bool separateTurnForce = false; // BUG: not initialized on PC if(pHandling->fSuspensionAntidiveMultiplier > 0.0f){ if(bBraking){ separateTurnForce = true; @@ -940,7 +928,6 @@ float fBurstBikeSpeedMax = 0.12f; float fBurstBikeTyreMod = 0.05f; float fTweakBikeWheelTurnForce = 2.0f; -//--LCS: done void CVehicle::ProcessBikeWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelContactSpeed, CVector &wheelContactPoint, int32 wheelsOnGround, float thrust, float brake, float adhesion, float destabTraction, int8 wheelId, float *wheelSpeed, tWheelState *wheelState, eBikeWheelSpecial special, uint16 wheelStatus) @@ -1861,7 +1848,8 @@ CVehicle::SetDriver(CPed *driver) case MI_TAXI: case MI_CABBIE: - case MI_BORGNINE: + case MI_ZEBRA: + case MI_KAUFMAN: CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 12; break; diff --git a/src/vehicles/Vehicle.h b/src/vehicles/Vehicle.h index db4c598..2fb2caf 100644 --- a/src/vehicles/Vehicle.h +++ b/src/vehicles/Vehicle.h @@ -240,19 +240,16 @@ public: uint8 bRestingOnPhysical : 1; // Dont go static cause car is sitting on a physical object that might get removed uint8 bParking : 1; uint8 bCanPark : 1; -#if (!defined GTA_PS2 || defined FIX_BUGS) // <- I think this can be moved back to CAutomobile? +#if (!defined GTA_PS2 || defined FIX_BUGS) uint8 m_bombType : 3; #endif uint8 bDriverLastFrame : 1; - uint8 bRewardVehicle : 1; // 25B_40 int8 m_numPedsUseItAsCover; uint8 m_nAmmoInClip; // Used to make the guns on boat do a reload (20 by default) int8 m_nPacManPickupsCarried; uint8 m_nRoadblockType; - bool m_bGarageTurnedLightsOff; float m_fHealth; // 1000.0f = full health. 250.0f = fire. 0 -> explode - float m_fEngineEnergy; // TODO(LCS): better name. it adds up acceleration force, so possibly kinetic energy?? uint8 m_nCurrentGear; float m_fChangeGearTime; #if (!defined GTA_PS2 || defined FIX_BUGS) @@ -291,7 +288,6 @@ public: ~CVehicle(void); // from CEntity void SetModelIndex(uint32 id); - void PreRender(void) {} bool SetupLighting(void); void RemoveLighting(bool); void FlagToDestroyWhenNextProcessed(void) {} @@ -388,8 +384,8 @@ public: bool IsAlarmOn(void) { return m_nAlarmState != 0 && m_nAlarmState != -1 && GetStatus() != STATUS_WRECKED; } CVehicleModelInfo* GetModelInfo() { return (CVehicleModelInfo*)CModelInfo::GetModelInfo(GetModelIndex()); } - bool IsTaxi(void) { return GetModelIndex() == MI_TAXI || GetModelIndex() == MI_CABBIE || GetModelIndex() == MI_BORGNINE; } - bool IsLimo(void) { return GetModelIndex() == MI_STRETCH; } + bool IsTaxi(void) { return GetModelIndex() == MI_TAXI || GetModelIndex() == MI_CABBIE || GetModelIndex() == MI_ZEBRA || GetModelIndex() == MI_KAUFMAN; } + bool IsLimo(void) { return GetModelIndex() == MI_STRETCH || GetModelIndex() == MI_LOVEFIST; } bool IsRealHeli(void) { return !!(pHandling->Flags & HANDLING_IS_HELI); } bool IsRealPlane(void) { return !!(pHandling->Flags & HANDLING_IS_PLANE); } diff --git a/src/weapons/Weapon.cpp b/src/weapons/Weapon.cpp index 49102fc..7a54941 100644 --- a/src/weapons/Weapon.cpp +++ b/src/weapons/Weapon.cpp @@ -513,7 +513,7 @@ CWeapon::FireMelee(CEntity *shooter, CVector &fireSource) if ( SQR(victimPedRadius) > (victimPedPos-fireSource).MagnitudeSqr() ) { CVector collisionDist; - CColModel* victimPedCol = &gpTempColModels->ms_colModelPed1; + CColModel* victimPedCol = &CTempColModels::ms_colModelPed1; bool useLocalPos = false; if (victimPed->m_nPedState == PED_FALL || victimPed->m_nPedState == PED_DIE && victimPed->bIsPedDieAnimPlaying @@ -649,9 +649,9 @@ CWeapon::FireMelee(CEntity *shooter, CVector &fireSource) CVector dropDir(CGeneral::GetRandomNumberInRange(-0.15f, 0.15f), CGeneral::GetRandomNumberInRange(0.1f, 0.35f), 0.f); CVector dropPos(CGeneral::GetRandomNumberInRange(SCREEN_STRETCH_X(50.0f), SCREEN_STRETCH_FROM_RIGHT(50.0f)), CGeneral::GetRandomNumberInRange(SCREEN_STRETCH_Y(50.0f), SCREEN_STRETCH_FROM_BOTTOM(50.0f)), 1.f); - /*CParticle::AddParticle(PARTICLE_BLOODDROP, dropPos, dropDir, nil, CGeneral::GetRandomNumberInRange(0.1f, 0.15f), + CParticle::AddParticle(PARTICLE_BLOODDROP, dropPos, dropDir, nil, CGeneral::GetRandomNumberInRange(0.1f, 0.15f), CRGBA(0, 0, 0, 0), 0, 0, CGeneral::GetRandomNumber() & 1, 0); - */ + } if (info->m_AnimToPlay == ASSOCGRP_KNIFE) { @@ -741,7 +741,7 @@ CWeapon::FireMelee(CEntity *shooter, CVector &fireSource) { nearCar->VehicleDamage(info->m_nDamage * (0.00075f * nearCar->pHandling->fMass), gaTempSphereColPoints[0].pieceB); - //CParticle::AddParticle(PARTICLE_HEATHAZE, gaTempSphereColPoints[0].point, CVector(0.0f, 0.0f, 0.0f), 0, 0.0f, 0, 0, 0, 0); + CParticle::AddParticle(PARTICLE_HEATHAZE, gaTempSphereColPoints[0].point, CVector(0.0f, 0.0f, 0.0f), 0, 0.0f, 0, 0, 0, 0); } else { @@ -818,7 +818,7 @@ CWeapon::FireMelee(CEntity *shooter, CVector &fireSource) CParticle::AddParticle(PARTICLE_SPARK, gaTempSphereColPoints[0].point, 0.1f * gaTempSphereColPoints[0].normal, 0, 0.0f, 0, 0, 0, 0); } - //CParticle::AddParticle(PARTICLE_HEATHAZE, gaTempSphereColPoints[0].point, CVector(0.0f, 0.0f, 0.0f), 0, 0.0f, 0, 0, 0, 0); + CParticle::AddParticle(PARTICLE_HEATHAZE, gaTempSphereColPoints[0].point, CVector(0.0f, 0.0f, 0.0f), 0, 0.0f, 0, 0, 0, 0); if (!damageEntityRegistered) { diff --git a/src/weapons/WeaponEffects.cpp b/src/weapons/WeaponEffects.cpp index b0df610..bb95ea8 100644 --- a/src/weapons/WeaponEffects.cpp +++ b/src/weapons/WeaponEffects.cpp @@ -1,5 +1,6 @@ #include "common.h" +#include "main.h" #include "WeaponEffects.h" #include "TxdStore.h" #include "Sprite.h" @@ -103,6 +104,8 @@ CWeaponEffects::Render(void) float w, h; if ( CSprite::CalcScreenCoors(gCrossHair.m_vecPos, &pos, &w, &h, true) ) { + PUSH_RENDERGROUP("CWeaponEffects::Render"); + float recipz = 1.0f / pos.z; CSprite::RenderOneXLUSprite_Rotate_Aspect(pos.x, pos.y, pos.z, w, h, @@ -119,6 +122,8 @@ CWeaponEffects::Render(void) gCrossHair.m_fRotation += 0.02f; if ( gCrossHair.m_fRotation > TWOPI ) gCrossHair.m_fRotation = 0.0; + + POP_RENDERGROUP(); } RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)FALSE); diff --git a/utils/gxt/ENGLISH.txt b/utils/gxt/ENGLISH.txt deleted file mode 100644 index 5a18faf..0000000 --- a/utils/gxt/ENGLISH.txt +++ /dev/null @@ -1,18230 +0,0 @@ -[LETTER1] -abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"$,.'-?!!SDBF - -[DEFNAM] -Claude---------------------- - -[IN_VEH] -~w~Hey! Get back in the ~b~vehicle! - -[IN_VEH2] -~w~You need some wheels for this job! - -[IN_BOAT] -~w~You need a boat for this job! - -[HEY] -~w~Don't go solo, keep your posse together! - -[HEY2] -~w~Don't split up, keep the group together! - -[HEY3] -~w~You've dropped your main man, go back and get 8-Ball! - -[HEY6] -~w~You left your honor with the Yakuza Kanbu. You must protect him! - -[HEY7] -~w~An extra gun could be useful. Go back and pick up your contact! - -[HEY9] -~w~You want the word on the street? Go see the contact! - -[GATE_1] -~w~The Sindaccos will only open the gates for Sindacco cars. - -[HELPA] -~w~This is your ~h~Safe House. - -[HELPB] -~w~While not on a mission you can save your progress by collecting the ~h~Save Icon~w~ - time will advance by 6 hours. - -[HELPC] -~w~Vehicles left in the ~h~garage next door~w~ will be stored when you save the game. - -[HELPD] -To exit the Safe House, walk into the ~h~marker. - -[HELP0] -~w~Press~h~ ~k~ ~VEEE~ ~w~to enter or exit a vehicle. - -[HELP1] -~w~Stop in the center of the ~h~yellow marker. - -[HELP3] -~w~You can only sprint for a short time before tiring. - -[HELP4] -~w~Press~h~ ~k~ ~VEACC~ ~w~to ~h~accelerate,~h~ ~k~ ~VESTR~ ~w~to steer. - -[HELP5] -~w~Press~h~ ~k~ ~VEBRK~ ~w~to ~h~brake~w~, or to ~h~reverse~w~ if the vehicle has stopped. - -[HELP6] -~w~Press~h~ ~k~ ~VEHB~ ~w~to use the vehicle's ~h~handbrake. - -[HELP7] -~w~Hold~h~ ~k~ ~PDLT~ ~w~to target with a sniper rifle. - -[HELP8] -~w~Use~h~ ~k~ ~SNZI~ ~w~and~h~ ~k~ ~SNZO~ ~w~to ~h~zoom in and out~w~ when targeting. - -[HELP10] -~w~The ~h~yellow badge~w~ indicates you are a ~h~wanted man~w~ - police officers will try to arrest you. - -[HELP11] -~w~As more badges are displayed the Law will try harder to stop you. - -[HELP12] -~w~Walk into the ~h~yellow marker~w~ to initiate a mission. - -[HELP13] -~w~Look out for pathways not shown on the ~h~radar,~w~ and use them to your advantage! - -[HELP14] -~w~Use the ~h~Radar~w~ to find your way around the city - follow the ~h~yellow blip~w~ to find the ~h~Safe House. - -[HELP16] -~w~Use~h~ ~k~ ~VESTR~ ~w~to steer. - -[HELP17] -~w~Phil Cassidy's - for a higher caliber of merchandise: New stock coming soon! - -[HELP18] -~w~New stock has been delivered to Phil Cassidy's Fully Cocked Gun Shop! - -[HELP18B] -~w~Phil Cassidy's now has the ~h~Minigun~w~ in stock! - -[HELP19A] -~w~To perform a ~h~drive-by~w~, hold~h~ ~k~ ~VELL~ ~w~or~h~ ~k~ ~VELR~ ~w~and fire using~h~ ~k~ ~VEWEP~. - -[HELP19C] -~w~You can only do a drive-by if you have a ~h~sub-machine gun. - -[HELP19D] -~h~Motorbikes ~w~allow you to ~h~shoot forwards~w~ by pressing~h~ ~k~ ~VEWEP~. - -[HELP19F] -~w~You can only shoot forwards if you have a ~h~sub-machine gun. - -[HELP20] -~w~You found a ~h~police bribe!~w~ Collecting them reduces your ~h~wanted level~w~ by one star! - -[HELP21] -~w~Use~h~ ~k~ ~PDCWE~ ~w~to change weapons when on foot. - -[HELP22] -~w~To find ~h~Vincenzo's warehouse~w~, follow the ~h~V blip~w~ on the radar. - -[HELP23] -~w~The blip is a ~h~triangle pointing down~w~, this shows that the ~h~target is lower down~w~ than you are. - -[HELP24] -~w~Hold~h~ ~k~ ~VELL~ ~w~or~h~ ~k~ ~VELR~ ~w~to look ~h~left or right~w~ in a vehicle. Hold both to look ~h~behind. - -[HELP25] -~w~Press~h~ ~k~ ~CVEIW~ ~w~to change ~h~camera modes. - -[HELP26] -~w~Jump into a boat and press~h~ ~k~ ~VEEE~ ~w~to get in. - -[HELP27] -~w~If you are near a boat press~h~ ~k~ ~VEEE~ ~w~to board it. - -[HELP29] -~w~Press~h~ ~k~ ~VEHN~ ~w~to sound the vehicle's ~h~horn. - -[HELP30] -~w~Use~h~ ~k~ ~VECRS~ ~w~to select different ~h~radio stations. - -[HELP33] -~w~Now the hitmen have been paid they'll see the job through, no matter how long it takes. - -[HELP34] -~w~Hold~h~ ~k~ ~VELB~ ~w~to look behind you when in a car. - -[HELP38] -~w~If you kill someone who has a weapon, they will drop it. - -[HELP40] -~w~When on foot use~h~ ~k~ ~PDLOO~ ~w~to look around. - -[HELP58] -~w~Hold~h~ ~k~ ~PDLT~ ~w~to ~h~lock on to a target~w~, and press~h~ ~k~ ~PDFW~ ~w~to fire! - -[HELP59] -~w~While locked on, press~h~ ~k~ ~PDCTL~ ~w~to change targets. - -[HELP60] -~w~Some barrels will explode if you shoot them - but remember to keep your distance! - -[TANK] -~w~Use~h~ ~k~ ~VEWEA~ ~w~to aim the Rhino's cannon, and~h~ ~k~ ~VEWEP~ ~w~to fire. - -[ANSWER] -~w~Press~h~ ~k~ ~ANS~ ~w~to answer your cell phone and~h~ ~k~ ~VEEE~ ~w~to hang up. - -[BOMB] -~w~If you drive a car into the bomb shop 8-Ball will charge you ~h~$500~w~ to attach a ~h~bomb~w~. - -[BRIDGE1] -~w~Callahan Bridge: Under construction. Expected completion date: May 1998 - -[STRIK_1] -~w~You will be able to ride the ~h~ferry~w~ over to Staunton Island, once the strike is over. - -[SPRAY] -~w~Driving your vehicle into ~h~Pay 'n' Spray~w~ will clear your ~h~wanted level~w~ and ~h~repair ~w~and ~h~respray ~w~your vehicle for ~h~$100. - -[S_TRN_1] -~w~You can use the ~h~subway trains~w~ to travel around Liberty City. Press~h~ ~k~ ~VEEE~ ~w~to ~h~enter ~w~or ~h~exit~w~ a train. - -[TUBE1] -~w~When the station opens you will be able to catch a ~h~subway train~w~ to Staunton Island. - -[TUBE2] -~w~You will be able to reach ~h~Francis International Airport ~w~once this station opens. - -[TUBE_2] -~w~To get on a ~h~subway train~w~, press~h~ ~k~ ~VEEE~. - -[SPRAY1] -~w~Parking in the ~h~Pay 'n' Spray~w~ will clear your ~h~wanted level~w~, and ~h~repair ~w~and ~h~respray ~w~your vehicle. The charge is usually ~h~$100~w~ but this time it's free. - -[HELPE31] -~w~New outfits become available to the player during the game, and must be collected from Mr. Benz. - -[HELPE32] -~w~During the game the player will have the opportunity to buy more powerful weapons from Ammu-Nation. - -[HELPCOM] -~w~New outfits unlocked at safehouse! - -[HELP41] -~w~Park in the ~h~Pay 'n' Spray~w~ to respray and repair your car. Follow the ~h~Spray Can blip~w~ on the radar to find the ~h~Pay 'n' Spray. - -[PAGEB1] -~w~The ~h~Pistol~w~ is now available at your safehouse! - -[PAGEB10] -~w~You found all of the hidden packages! Have a ~h~$50,000 cash bonus! - -[EXPO_W] -~w~Love Media need one of these! - -[FERRY_2] -~w~Come back when a ferry is docked. - -[FERRY_3] -~w~Your vehicle won't fit on the ferry! - -[FERRY_4] -~w~Wanted criminals are not allowed on the ferry! - -[FERRY_5] -~w~You need ~h~$25~w~ for a ferry ticket. Come back when you have enough money! - -[FERRY_6] -~w~You can't use a ferry whilst on a mission. - -[FERR_SK] -~w~Press~h~ ~k~ ~TRSK~ ~w~to skip to the end of the trip. - -[FERR_C1] -~w~Ferry to Staunton. Cost: ~h~$25~w~. Press~h~ ~k~ ~TGSUB~ ~w~to buy a ticket. - -[FERR_C2] -~w~Ferry to Portland. Cost: ~h~$25~w~. Press~h~ ~k~ ~TGSUB~ ~w~to buy a ticket. - -[A_H1] -~w~~k~ ~AMBUY~ ~w~to buy. ~n~~k~ ~AMEXI~ ~w~to exit. - -[A_UZI_A] -~w~Ammu-Nation now stock Micro SMGs! - -[AMMU] -~w~Weapons will be available at ~h~Ammu-Nation~w~ once new stock arrives. Sorry for any inconvenience. - -[WANT_A] -~w~When you get ~h~'busted'~w~ you are taken to the nearest police station. - -[WANT_B] -~w~Any mission you were on will be failed, and the cops will take all your weapons and a cash bribe. - -[WANT_C] -~w~You will only be ~h~'busted'~w~ if you have a ~h~wanted level~w~ - represented by a row of stars in the top corner of the screen. - -[WANT_D] -~w~The more stars you have, the harder the Law will try to take you down. - -[WANT_E] -~w~There are ways of reducing your wanted level - keep your eyes open for them. - -[WANT_F] -~w~While driving a vehicle, call in at a ~h~Pay 'n' Spray~w~ to clear your wanted level. - -[HEAL_A] -~w~When you get ~h~'wasted'~w~ you will be taken to the nearest hospital. - -[HEAL_B] -~w~You will lose all your weapons and fail any mission you were on. You will also be charged for health care. - -[HEAL_C] -~w~Your ~h~health~w~ is represented by the red bar in the top right of the screen. - -[HEAL_D] -~w~There are ways of healing or protecting yourself - keep your eyes open for them. - -[H_WE_01] -~w~Walk over weapons to pick them up. They can only be collected when you're on foot. - -[H_WE_02] -~w~If you already have a weapon of that type press~h~ ~k~ ~PUCF~ ~w~to replace your weapon with the new one. - -[PU_CF] -~w~Press~h~ ~k~ ~PUCF~ ~w~to take this weapon. Any weapon of the same type will be lost. - -[CLOTHA] -~h~~k~ ~AMMOV~ ~w~to view outfits. ~h~~k~ ~AMBUY~ ~w~to change into outfit. ~h~~k~ ~AMEXI~ ~w~to cancel. - -[CLOTHB] -~w~You can change clothes here at any time. - -[SIREN_1] -~w~To toggle an ~h~emergency vehicle's sirens~w~ on or off tap~h~ ~k~ ~VEHN~. - -[FHOSE_1] -~w~Hold~h~ ~k~ ~VEWEP~ ~w~to use the water cannon. - -[PHOTO1] -~w~Hold~h~ ~k~ ~PDLT~ ~w~to target with the camera. - -[PHOTO2] -~w~While targeting with the camera, use~h~ ~k~ ~SNZI~ ~w~and~h~ ~k~ ~SNZO~ ~w~to ~h~zoom~w~ in and out. - -[PHOTO3] -~w~Press~h~ ~k~ ~PDFW~ ~w~to take a picture while targeting with the camera. - -[BENZ_H1] -~w~Follow the ~h~Shirt blip~w~ on the radar to find ~h~Mr. Benz clothes shop. - -[BENZ_LE] -~w~The ~h~Leone suit~w~ is now available at the safehouse. - -[BENZ_GU] -~w~The ~h~Avenging Angel outfit~w~ is now available at the safehouse. - -[BENZ_CH] -~w~The ~h~Chauffeur outfit~w~ is now available at the safehouse. - -[BENZ_TU] -~w~The ~h~Tuxedo~w~ is now available at the safehouse. - -[ATUTOR] -~w~Paramedic missions can be toggled on or off by pressing~h~ ~k~ ~TGSUB~. - -[CTUTOR] -~w~Vigilante missions can be toggled on or off by pressing~h~ ~k~ ~TGSUB~. - -[FTUTOR] -~w~Firefighter missions can be toggled on or off by pressing~h~ ~k~ ~TGSUB~. - -[TRATUT1] -~w~Trash Dash missions can be toggled on or off by pressing~h~ ~k~ ~TGSUB~. - -[TTUTOR] -~w~Taxi Driver missions can be toggled on or off by pressing~h~ ~k~ ~TGSUB~. - -[A_COMP2] -~w~Paramedic mission: level 12 complete! Running will never tire you! - -[FIREPRO] -~w~Firefighter mission: level 12 complete! You're now flame retardant! - -[RCHELP] -~w~To ~h~detonate~w~ your RC Car press~h~ ~k~ ~VEWEP~. - -[TAXIH1] -~w~Stop near a ~h~highlighted pedestrian~w~ to pick them up, then drive them to their destination quickly. - -[TIPHLP] -~w~The ~h~tip bar~w~ decreases over ~h~time~w~, and when your taxi gets ~h~damaged. - -[ANG_E3] -~w~Go and look for other Avenging Angels in Chinatown. - -[ANGOUT] -~w~Come back when you're wearing an ~h~Avenging Angel ~w~outfit. - -[ANGCOM2] -~w~Avenging Angel missions Staunton: level 15 complete! Now you won't lose any money if you get busted! - -[ANGCOM3] -~w~Avenging Angel missions Shoreside: level 15 complete! You get a 'special' vehicle at your safehouse! - -[TVOHELP] -~w~Try returning when you're wearing the ~h~Hockey Mask. - -[TIMER] -This is a timed mission, you must complete it before the timer counts down to zero. - -[GARAGE] -Drive the vehicle into the garage, then walk outside. - -[TRASH] -~g~You've junked your wheels real bad! Get your vehicle repaired! - -[WRECKED] -~r~The vehicle is wrecked! - -[SPOOK] -SPOOKOMETER - -[SPOTTED] -~r~They're on to you! - -[REWARD] -~w~Reward: $~1~ - -[GAMEOVR] -GAME OVER - -[Z] -Z-axis value: ~1~ - -[DEAD] -WASTED! - -[BUSTED] -BUSTED! - -[GOODBOY] -~w~$50 Good Citizen Bonus! - -[NUMBER] -~1~ - -[SCORE] -$~1~ - -[LOADCAR] -LOADING VEHICLE... (PRESS L button TO CANCEL) - -[CARSOFF] -Cars turned off. - -[CARS_ON] -Cars turned on. - -[TEXTXYZ] -Writing coordinates to file... - -[CHEATON] -Cheat mode ON - -[CHEATOF] -Cheat mode OFF - -[IMPORT1] -Go outside and wait for your vehicle. - -[KE_PLYR] -Player - -[KE_CTCS] -Contacts - -[KE_WEPS] -Weapons - -[KE_ADR] -Adrenaline - -[KE_BRIB] -Bribe - -[KE_HLTH] -Health - -[KE_KILF] -Kill Frenzy - -[KE_ARM] -Armor - -[KE_USJ] -USJ - -[KE_PKG] -Hidden Package - -[KE_INFO] -Information - -[DAM] -Damage - -[KILLS] -Kills - -[TIME] -Timer - -[STOPS] -Stops - -[BULL] -Bullion - -[EVID] -Evidence - -[HEALTH] -Car Health - -[COLLECT] -Collected - -[LEVEL] -Level - -[SALES] -Sales - -[CITYZON] -Liberty City - -[VICE_C] -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 - -[STADIU2] -Aspatria - -[STADIU3] -Aspatria - -[HOSPI_2] -Rockford - -[UNIVERS] -Liberty Campus - -[CONSTRU] -Fort Staunton - -[PARK] -Belleville Park - -[COM_EAS] -Newport - -[SHOPING] -Bedford Point - -[SHOP2] -Bedford Point - -[SHOP3] -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] -FBI Cruiser - -[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 - -[SINDACO] -Sindacco Argento - -[HEARSE] -Hearse - -[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 Cruiser - -[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 - -[BARRACK] -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] -Leone 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] -Bickle'76 - -[TOYZ] -TOYZ - -[MCLARN] -Lancer MF1 - -[SHELBY] -Hellenbach GT - -[SUBARU] -Impreza WRX - -[SUPRA] -Supra - -[SKYLINE] -Skoiloine - -[CYCLONE] -Cyclone GT - -[ESPRIT] -V8 Ghost - -[MINI] -Tommy - -[HOTROD] -Thunder-Rodd - -[CAMPVAN] -Campaign Rumpo - -[BALLOT] -Ballot Van - -[GHOST] -Ghost - -[ANGEL] -Angel - -[ANGEL2] -Avenger - -[PIZZABO] -Pizzaboy - -[NOODLBO] -Noodleboy - -[FAGGIO] -Faggio - -[FREEWAY] -Freeway - -[SANCHEZ] -Sanchez - -[SANCH2] -Manchez - -[F_PASS1] -~w~Fire extinguished! Reward $~1~ - -[F_RANGE] -~r~The fire truck radio is out of range, get closer to a fire station! - -[C0TGSUB] -R3 button - -[C0VESTR] -left analog stick, or left and right directional buttons - -[C1VESTR] -left analog stick - -[C2VESTR] -left analog stick, or left and right directional buttons - -[C3VESTR] -left analog stick - -[C2VEHB] -~T~ - -[C3VEHB] -L1 button - -[C0VEHN] -L3 button - -[C0VELL] -L2 button - -[C1VELL] -L2 button - -[C2VELL] -L2 button - -[C3VELL] -L2 button - -[C0VELR] -R2 button - -[C1VELR] -R2 button - -[C2VELR] -R2 button - -[C3VELR] -R2 button - -[C0VELB] -L2 button + R2 button - -[C1VELB] -L2 button + R2 button - -[C2VELB] -L2 button + R2 button - -[C3VELB] -L2 button + R2 button - -[C0VECRS] -L1 button - -[C1VECRS] -SELECT button - -[C0VEWEI] -left analog stick up and down, or up and down directional buttons - -[C1VEWEI] -left analog stick up and down - -[C2VEWEI] -left analog stick up and down, or up and down directional buttons - -[C3VEWEI] -left analog stick up and down - -[C0PDCWE] -L2 and R2 buttons - -[C1PDCWE] -L2 and R2 buttons - -[C0PUCF] -L1 button - -[C1PUCF] -L1 button - -[C2PUCF] -~T~ - -[C3PUCF] -~O~ - -[C0PDLT] -R1 button - -[C1PDLT] -R1 button - -[C2PDLT] -R1 button - -[C3PDLT] -L1 button - -[C0PDCTL] -L2 and R2 buttons - -[C1PDCTL] -L2 and R2 buttons - -[C2PDCTL] -L2 and R2 buttons - -[C3PDCTL] -L2 and R2 buttons - -[C0CVEIW] -SELECT button - -[C1CVEIW] -up and down directional buttons - -[C2CVEIW] -SELECT button - -[C3CVEIW] -SELECT button - -[C0PDBAK] -R3 button - -[C1PDBAK] -R3 button - -[C2PDBAK] -R3 button - -[C3PDBAK] -R3 button - -[C0PDLO1] -L button - -[C1PDLO1] -L button - -[C2PDLO1] -L button - -[C3PDLO1] -L button - -[C0PDLO2] -analog stick - -[C2PDLO2] -analog stick - -[C0ANS] -L1 button - -[C1ANS] -L1 button - -[C2ANS] -L1 button - -[C3ANS] -L1 button - -[WEATHER] -FORCE WEATHER - -[WEATHE2] -WEATHER NORMAL - -[GA_4] -~w~Car bombs are $500 each - -[GA_5] -~w~Your vehicle is already fitted with a bomb. - -[GA_6] -~w~Park it, prime it by pressing~h~ ~k~ ~PED_FIREWEAPON~ ~w~and LEG IT! - -[GA_7] -~w~Arm with ~h~ ~k~ ~PED_FIREWEAPON~ button~w~. Bomb will go off when engine is started. - -[GA_8] -~w~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] -~w~Hope you like the new color. - -[GA_17] -~w~New engine and paint job! - -[GA_19] -We're not interested in that model. - -[GA_20] -We got more of these than we can shift. Sorry man, no deal. - -[GA_22] -~w~You cannot fit a bomb to a bike. - -[GA_23] -~w~Car bomb fitted - parts and labor: $500 - -[GA_24] -~w~Car bomb fitted - this one's on the house! - -[CR_1] -~w~The crane cannot lift this vehicle. - -[PU_MONY] -~w~You don't have enough cash. - -[PAUSED] -GAME PAUSED - -[FEB_STA] -Stats - -[FEB_MAP] -Map - -[FEB_BRI] -Briefs - -[FEB_CON] -Controls - -[FEB_AUD] -Audio - -[FEB_DIS] -Display - -[FEB_LAN] -Language - -[FEP_MAP] -MAP - -[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_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 - -[FEI_SEL] -Select - -[FEI_TAR] -Target On/Off - -[FEI_BAC] -Back - -[FEI_RES] -Resume - -[FEI_NAV] -Move - -[FEI_BTX] -/ - -[FEI_BTT] -" - -[FEI_STA] -START - -[FEI_BTD] -analog - -[FEI_BTU] -;= - -[FEI_R1B] -L \ R - -[FEI_SCR] -Scroll - -[FEI_ZOO] -Zoom - -[FEH_CON] -CONTROLS - -[FEH_AUD] -AUDIO - -[FEH_LAN] -LANGUAGE - -[FET_SG] -SAVE GAME - -[FEH_DIS] -DISPLAY - -[FEM_OK] -OK - -[FEC_CRO] -Crouch - -[FE_MLG] -MAP LEGEND - -[MAP_LEG] -LEGEND: - -[LG_01] -Player position - -[LG_13] -Ammu-Nation - -[LG_16] -Safe House - -[LG_22] -Pay 'n' Spray - -[LG_23] -Mr. Benz - -[LG_25] -Telephone - -[LG_26] -Wildstyle Radio Station - -[LG_27] -Flash FM Radio Station - -[LG_28] -KChat Radio Station - -[LG_29] -Fever 105 Radio Station - -[LG_30] -VROck Radio Station - -[LG_31] -VCPR Radio Station - -[LG_32] -Espantoso Radio Station - -[LG_33] -Emotion 98.3 Radio Station - -[LG_34] -Wave 103 Radio Station - -[LG_35] -Destination - -[LG_36] -Sun Yard - -[LG_37] -Strip Club - -[LG_38] -EightBall - -[LG_39] -Church Confessional - -[LG_40] -Ma Cipriani - -[LG_41] -Donald Love - -[LG_42] -JD O'Toole - -[LG_43] -Salvatore Leone - -[LG_44] -Maria - -[LG_45] -McAffrey - -[LG_46] -Toshiko Kasen - -[LG_47] -Vincenzo Cilli - -[LG_48] -Bomb Shop - -[LG_49] -Clothes Shop - -[LG_50] -Phil Cassidy's - -[LG_51] -Threat - -[LG_52] -Friend - -[LG_53] -Pick up - -[LG_54] -Player Target - -[FEO_CON] -Controller Setup - -[FEO_AUD] -Audio Setup - -[FEO_DIS] -Display Setup - -[FEO_LAN] -Language Setup - -[FEO_PLA] -Player Setup - -[FEB_PMB] -Previous Mission Briefs: - -[FEC_NA] -NA - -[FEC_CWL] -Cycle Weapon left - -[FEC_CWR] -Cycle Weapon right - -[FEC_CW] -Cycle Weapons - -[FEC_CT] -Cycle Targets - -[FEC_TAR] -Target - -[FEC_MOV] -Movement - -[FEC_CAM] -Camera modes - -[FEC_PAU] -Pause - -[FEC_ENV] -Enter vehicle - -[FEC_JUM] -Jump - -[FEC_ATT] -Attack/Fire weapon - -[FEC_RUN] -Run - -[FEC_FPC] -Look - -[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 - -[FEC_CCF] -CONFIGURATION: - -[FEC_CF1] -SETUP 1 - -[FEC_CF2] -SETUP 2 - -[FEC_CF3] -SETUP 3 - -[FEC_CF4] -SETUP 4 - -[FEC_CDP] -TYPE: - -[FEC_ONF] -ON FOOT - -[FEC_INC] -IN CAR - -[FEC_VIB] -VIBRATION: - -[FEC_ILU] -INVERT LOOK: - -[FEC_SWP] -PLAYER MOVEMENT: - -[FEC_AS] -analog stick - -[FEC_DP] -directional buttons - -[FEA_SFX] -SFX VOLUME: - -[FEA_OUT] -Output: - -[FEA_ST] -Stereo - -[FEA_MNO] -Mono - -[FEA_CTD] -Warning! This feature requires DTS compatible hardware to be connected. Proceed? - -[FEA_DTS] -DTS - -[FEA_RSS] -RADIO STATION: - -[FEA_NON] -Radio Off - -[FED_BRI] -BRIGHTNESS: - -[FED_TRA] -TRAILS: - -[FED_RDR] -RADAR MODE: - -[FED_HUD] -HUD MODE: - -[FED_RDM] -MAP & BLIPS - -[FED_RDB] -BLIPS ONLY - -[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] -Save File 1 Not Present - -[FEM_SL2] -Save File 2 Not Present - -[FEM_SL3] -Save File 3 Not Present - -[FEM_SL4] -Save File 4 Not Present - -[FEM_SL5] -Save File 5 Not Present - -[FEM_SL6] -Save File 6 Not Present - -[FEM_SL7] -Save File 7 Not Present - -[ST_TIME] -Current playing time - -[ST_OVTI] -Total playing time - -[NUMSHV] -Number of saves - -[PL_STAT] -Player stats - -[PE_WAST] -People you've wasted - -[PE_WSOT] -People wasted by others - -[CAR_EXP] -Cars exploded - -[BOA_EXP] -Boats destroyed - -[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 - -[ST_HEAD] -Number of headshots - -[BUL_FIR] -Bullets fired - -[BUL_HIT] -Bullets that hit - -[SPRAYIN] -Sprayings - -[TM_DED] -Hospital visits - -[ST_GANG] -Least favorite gang - -[ST_GNG1] -Leones - -[ST_GNG2] -Triads - -[ST_GNG3] -Diablos - -[ST_GNG4] -Yakuza - -[ST_GNG5] -Yardies - -[ST_GNG6] -Colombians - -[ST_GNG7] -Hoods - -[ST_GNG8] -Forellis - -[ST_GNG9] -Sindaccos - -[DAYSPS] -Days passed in game - -[MMRAIN] -Mm rain fallen - -[ST_STAR] -Total number of wanted stars attained - -[ST_STGN] -Total number of wanted stars evaded - -[TOT_DIS] -Total distance travelled (miles) - -[TOTDISM] -Total distance travelled (m) - -[DISTBIK] -Dist. travelled by bike (miles) - -[DISTBIM] -Distance travelled by bike (m) - -[DISTHEL] -Dist. travelled by helicopter (miles) - -[DISTHEM] -Distance travelled by helicopter (m) - -[DISTBOA] -Dist. travelled by boat (miles) - -[DISTBOM] -Distance travelled by boat (m) - -[ST_WHEE] -Longest wheelie time (secs) - -[ST_STOP] -Longest stoppie time (secs) - -[ST_2WHE] -Longest 2 wheels time (secs) - -[ST_WHED] -Longest wheelie distance (m) - -[ST_STOD] -Longest stoppie distance (m) - -[ST_2WHD] -Longest 2 wheels distance (m) - -[ST_FAPD] -Longest face plant distance (m) - -[FEST_HV] -Highest 'Vigilante' level - -[FIRELVL] -Highest 'Firefighter' level - -[ST_STOR] -Stores knocked off - -[ST_ASSI] -Assassination contracts completed - -[ST_FTIM] -Flight hours - -[ST_FASH] -Fashion budget - -[ST_WEAP] -Weapon budget - -[ST_PROP] -Property budget - -[ST_DAMA] -Property destroyed - -[ST_AUTO] -Auto repair and painting budget - -[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 - -[FST_MFR] -Most favorite radio station - -[FST_LFR] -Least favorite radio station - -[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 - -[CARSLD] -Cars sold - -[MONCAR] -Cash made selling cars - -[BIKESLD] -Bikes sold - -[MONBIKE] -Cash made selling bikes - -[CARSEXP] -Cars found for 'Love Media' - -[SLTVLVL] -Highest 'Slash TV' level - -[SLTVKIL] -Opponents killed in 'Slash TV' - -[MONTRS] -Cash made collecting trash - -[HTMKLD] -Hitmen wasted - -[GDAMSP] -Number of 'Avenging Angel' missions passed - -[HGAJD] -Total 'Avenging Angel' justice dished out - -[BNDRACE] -RC Races - -[FSTTRT] -Most time left on 'Wong Side of the Track' - -[HGHTRC] -Most cash on 'Wong Side of the Track' - -[FSTHRT] -Fastest helicopter race time - -[BHLPOS] -Best helicopter race position - -[TMSOUT] -Outfit changes - -[BSRPS0] -'Low Rider Rumble' - -[BSRPS1] -'Deimos Dash' - -[BSRPS2] -'Wi-Cheetah Run' - -[BSRPS3] -'Red Light Racing' - -[BSRPS4] -'Torrington TT' - -[BSRPS5] -'Gangsta GP' - -[DBIKE0] -Course 1 - -[DBIKE1] -Course 2 - -[DBIKE2] -Course 3 - -[DBIKE3] -Course 4 - -[DBIKE4] -Course 5 - -[DBIKE5] -Course 6 - -[DBIKE6] -Course 7 - -[DBIKE7] -Course 8 - -[DBIKE8] -Course 9 - -[DBIKE9] -Course 10 - -[DBIKEHE] -'Bump & Grinds' - -[DBIKEBP] -Best position - -[DBIKEFL] -Fastest lap - -[DBIKEFT] -Fastest time - -[ST_PHOT] -Photos taken - -[ST_PIZZ] -Pizzas delivered - -[ST_NOOD] -Noodles delivered - -[MO_TOUR] -Cash made from tourists - -[TA_TOUR] -Tourists taken to tourist spots - -[SC_SCRA] -Highest score in 'Scrapyard Challenge' - -[SC_9MM] -Highest score in '9mm Mayhem' - -[SC_SCOO] -Highest score in 'Scooter Shooter' - -[DAYPLC] -Daily police spending - -[SEAGULL] -Seagulls sniped - -[CRIMRA] -CRIMINAL RATING - -[CHASE] -Highest media attention - -[CHASE1] -Ignored - -[CHASE2] -Boring - -[CHASE3] -Vaguely interesting - -[CHASE4] -Local paper Page 7 - -[CHASE5] -Front page of local paper - -[CHASE8] -Local TV 3am - -[CHASE9] -Local TV news - -[CHASE10] -Local TV Live coverage - -[CHASE11] -UFA Today page 12 - -[CHASE12] -UFA Today page 4 - -[CHASE13] -Picture in UFA Today - -[CHASE14] -National TV 4am - -[CHASE15] -National TV news - -[CHASE16] -National TV live coverage - -[CHASE17] -International news - -[CHASE18] -National crisis - -[CHASE19] -International crisis - -[CHASE20] -World event - -[CHASE21] -Stuff of legends - -[WHEEL01] -~w~TWO WHEELS BONUS: $~1~ Distance: ~1~.~1~m Time: ~1~ seconds - -[WHEEL02] -~w~TWO WHEELS BONUS: $~1~ Distance: ~1~ feet Time: ~1~ seconds - -[WHEEL06] -~w~WHEELIE BONUS: $~1~ Distance: ~1~.~1~m Time: ~1~ seconds - -[WHEEL07] -~w~WHEELIE BONUS: $~1~ Distance: ~1~ feet Time: ~1~ seconds - -[WHEEL11] -~w~STOPPIE BONUS: $~1~ Distance: ~1~.~1~m Time: ~1~ seconds - -[WHEEL12] -~w~STOPPIE BONUS: $~1~ Distance: ~1~ feet Time: ~1~ seconds - -[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 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. - -[GS_STYL] -GAME STYLE: - -[GS_FFAL] -FREE FOR ALL - -[GS_LOC] -GAME LOCATION: - -[GS_SLMT] -SCORE LIMIT: - -[GS_KLMT] -KILL LIMIT: - -[GS_TLMT] -TIME LIMIT: - -[GS_ULMT] -UNLIMITED - -[GS_PRUP] -POWERUPS: - -[GS_RACE] -RACE: - -[GS_LAPS] -LAPS: - -[GS_OK] -OK - -[FEH_MP] -MULTIPLAYER - -[FEMP_J] -Join - -[FEMP_CS] -CHARACTER: - -[FEMP_PS] -PLAYER SETTINGS - -[FEMP_GS] -GAME SELECT - -[FEMP_NG] -START A NEW GAME - -[SVRLIST] -HOST LIST - -[SVRINFO] -HOST DETAILS - -[SVRNAME] -NAME: - -[NO_SVRS] -LOOKING FOR HOSTS - -[NO_PLRS] -LOOKING FOR PLAYERS - -[NO_NAME] -NO NAME - -[NO_WIFI] -In order to play the multiplayer games you must first set the WLAN switch to ON. - -[FEMP_SG] -START GAME - -[FEMP_S] -Start - -[FEMP_WS] -Waiting for host to start game... - -[SVRLOST] -Communication with the host machine has been lost. - -[NOSVRS] -A host machine could not be found. - -[MP_WARN] -Starting a multiplayer game will cause all progress since the last save game to be lost. - -[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) - -[FIRST] -~g~1st - -[SECOND] -~g~2nd - -[THIRD] -~g~3rd - -[FOURTH] -~g~4th - -[NOCONTE] -Please connect an analog controller (DUALSHOCK®) or analog controller (DUALSHOCK®2) to controller port 1 to continue. - -[WRCONT] -The controller connected to controller port 1 is an unsupported controller. GTA: Liberty City Stories requires an analog controller (DUALSHOCK®) or analog controller (DUALSHOCK®2). - -[WRCONTE] -The controller connected to controller port 1 is an unsupported controller. GTA: Liberty City Stories requires an analog controller (DUALSHOCK®) or analog controller (DUALSHOCK®2). - -[WRONGCD] -Incorrect disc. Please insert the GTA:Liberty City Stories disc. - -[NOCD] -The disc tray is empty. Please insert the GTA:Liberty City Stories disc. - -[OPENCD] -The disc tray is open. Please close the disc tray. - -[RESTART] -Starting new game. - -[GA_3] -~w~$100 to respray! - -[GA_1A] -~w~Come back when you're not so busy... - -[AWAY] -~r~He's clean out of here! - -[GA_6B] -~w~Park it, prime it by pressing~h~ ~k~ ~PDFW~ ~w~and LEG IT! - -[GA_7B] -~w~Arm with~h~ ~k~ ~PDFW~~w~. Bomb will go off when engine is started. - -[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 SAVE DATA - -[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_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_F] -~r~You bailed! Too tough for you?! - -[UPSIDE] -~r~You flipped your wheels! - -[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_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_CN] -Most time left in 'Karmageddon' - -[FEST_TR] -Most kills in 'RC Triad Take-Down' - -[FEST_MP] -Missions passed - -[FEST_H0] -Most checkpoints - -[FEST_GC] -Gang Cars Totalled: - -[USJ] -~w~UNIQUE STUNT BONUS! - -[USJ_FAL] -~w~UNIQUE STUNT FAILED! - -[HM1_1] -~g~Ice 20 Purple Nines in 2 minutes 30 seconds. - -[KM1_8A] -Press the~h~ ~k~ ~PDFW~ ~w~to ~h~activate the bomb,~w~ remember to get out of the way. - -[KM1_8D] -Press the~h~ ~k~ ~PDFW~ ~w~to ~h~activate the bomb,~w~ remember to get out of the way. - -[RATNG1] -UPSTANDING CITIZEN - -[RATNG2] -NOBODY SPECIAL - -[RATNG3] -LITTERER - -[RATNG4] -SHOPLIFTER - -[RATNG5] -VANDAL - -[RATNG6] -DO BOY - -[RATNG7] -PICKPOCKET - -[RATNG8] -KLEPTO - -[RATNG9] -SNITCH - -[RATNG10] -RAT - -[RATNG12] -SCAM ARTIST - -[RATNG13] -TRICKSTER - -[RATNG14] -NUMBERS RUNNER - -[RATNG15] -HUSTLER - -[RATNG16] -BULLY - -[RATNG17] -RIFF-RAFF - -[RATNG18] -SCALAWAG - -[RATNG19] -RUFFIAN - -[RATNG20] -OUTLAW - -[RATNG21] -THUG - -[RATNG22] -DROP MAN - -[RATNG23] -SA GOON - -[RATNG24] -GOON - -[RATNG25] -JAILBIRD - -[RATNG26] -EX-CON - -[RATNG27] -FELON - -[RATNG28] -BAG MAN - -[RATNG29] -WISEGUY - -[RATNG30] -WHEELMAN - -[RATNG31] -HIRED MUSCLE - -[RATNG32] -HATCHETMAN - -[RATNG33] -HEADHUNTER - -[RATNG34] -ENFORCER - -[RATNG35] -RONIN - -[RATNG36] -FIXER - -[RATNG37] -HITMAN - -[RATNG38] -ASSOCIATE - -[RATNG39] -BUTCHER - -[RATNG40] -CLEANER - -[RATNG41] -ASSASSIN - -[RATNG42] -CONSIGLIERE - -[RATNG43] -MADE MAN - -[RATNG44] -RIGHT-HAND MAN - -[RATNG45] -EXECUTIONER - -[RATNG46] -LIEUTENANT - -[RATNG47] -UNDERBOSS - -[RATNG48] -CAPO - -[RATNG49] -BOSS - -[RATNG50] -KINGPIN - -[RATNG51] -DON - -[RATNG52] -GODFATHER - -[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 - -[DETON] -DETONATION - -[RCBOMB1] -RC Triad Take-Down - -[RECORD] -~w~New record - ~1~ kills! - -[NRECORD] -~r~You didn't beat the previous record of ~1~ kills! - -[RCBOMBF] -~r~You got out of the van! - -[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! - -[RAMPKA] -~w~You need a vehicle for this rampage. - -[PAGE_00] -. - -[TURTXT] -Mobile Massacre! - -[TURPASS] -~w~Massacre Passed! - -[TUR3D] -~w~Car Health - -[FTFRENZ] -Firetruck Frenzy - -[WELCOME] -WELCOME TO - -[TSCORE] -~w~TOTAL EARNINGS: $~1~ - -[PBOAT_1] -Press~h~ ~k~ ~VEWEP~ ~w~to fire the boat cannons. - -[HM2_1] -Use the RC buggies to destroy the armored cars. Press~h~ ~k~ ~VEWEP~ ~w~to detonate. - -[HM2_1A] -Use the RC buggies to destroy the armored cars. Press~h~ ~k~ ~VEWEP~ ~w~to detonate. - -[HM2_2] -~r~You failed to destroy all the armored cars! - -[HM2_6] -~g~Armored Car destroyed! - -[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 - -[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. - -[BIFP_1] -~w~Ouch! Face plant distance: ~1~.~1~m - -[BIFP_1F] -~w~Ouch! Face plant distance: ~1~ft - -[DIAB1_5] -RACE TIME: - -[F_FAIL1] -~r~Firefighter mission ended. - -[F_CANC] -~r~Firefighter mission cancelled! - -[F_FAIL3] -~r~You're too late! - -[F_FAIL4] -~r~One of the passengers has died! - -[F_FAIL5] -~r~One of the cars has been destroyed! - -[F_FAIL6] -~r~The car has been destroyed! - -[F_EXTIN] -Fires - -[A_CANC] -~r~Paramedic mission cancelled! - -[ALEVEL] -~w~Paramedic Mission Level ~1~ - -[A_FAIL1] -~r~Paramedic mission ended. - -[FEST_HA] -Highest 'Paramedic' level - -[A_SAVES] -~w~PEOPLE SAVED: ~1~ - -[C_KILLS] -~w~CRIMINALS KILLED: ~1~ - -[F_START] -~b~Burning vehicle ~w~reported in the ~a~ area. Go and extinguish the fire. - -[F_STAR1] -~b~Burning vehicles ~w~reported in the ~a~ area. Go and extinguish the fires. - -[F_REWAR] -~w~FIRE EXTINGUISHED! Level ~1~ completed! Reward: $~1~ - -[CINCAM] -Cinematic Camera - -[FEDS_AM] -<>-CHANGE MENU - -[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 - -[GA_2] -~w~New engine and paint job: $100 - -[PERPIC] -Hidden Packages found - -[GA_21] -~w~You cannot store any more vehicles 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 - -[FEDS_BA] -" button - BACK - -[FED_WIS] -WIDE SCREEN: - -[USJ_ALL] -~w~ALL UNIQUE STUNTS COMPLETED! - -[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] ---:---:---- --:--:-- - -[BONUS] -~g~BONUS $~1~ - -[TAXI_M] -'Taxi Driver' - -[COP_M] -'Vigilante' - -[FIRE_M] -'Firefighter' - -[AMBUL_M] -'Paramedic' - -[HJ_IS] -~w~INSANE STUNT BONUS: $~1~ - -[HJ_PIS] -~w~PERFECT INSANE STUNT BONUS: $~1~ - -[HJ_DIS] -~w~DOUBLE INSANE STUNT BONUS: $~1~ - -[HJ_PDIS] -~w~PERFECT DOUBLE INSANE STUNT BONUS: $~1~ - -[HJ_TIS] -~w~TRIPLE INSANE STUNT BONUS: $~1~ - -[HJ_PTIS] -~w~PERFECT TRIPLE INSANE STUNT BONUS: $~1~ - -[HJ_QIS] -~w~QUADRUPLE INSANE STUNT BONUS: $~1~ - -[HJ_PQIS] -~w~PERFECT QUADRUPLE INSANE STUNT BONUS: $~1~ - -[HJBAD] -~w~Terrible landing - you almost won $~1~! - -[HJUP] -Takeoff health: ~1~ - -[HJDOWN] -Landing health: ~1~ - -[FESZ_LS] -Load Successful. - -[CEDBUG1] -!!Debug Event!! - -[CEDBUG2] -!!Player is dead or not playing!! - -[CEDBUG3] -!!Player is in INDUSTRIAL level!! - -[CEDBUG4] -Trying to make COLLECTIVE with ~1~ - -[CEDBUG5] -Debug Value: ~1~ - -[CEDBUG6] -Debug Values: A: ~1~ B: ~1~ - -[CEDBUG7] -Debug Values: A: ~1~ B: ~1~ C: ~1~ - -[LINE] -This is Line ~1~ - -[MRACE08] -~w~Come back when you've got some wheels! - -[MRACE01] -~w~Wait for some rivals and then sound your horn to start the race! - -[MRACE02] -~w~The race will start when the first player toots his horn - -[MRACE05] -~r~YOU LOSE! - -[MRACE07] -~r~You're dead! You loser! - -[MRACE06] -~r~You wimp! You retired! - -[MRACE09] -~w~Get back in the race! - -[MRACE10] -~w~You've won (a one horse race)! - -[MRACEPO] -Position - -[MRCPU03] -YOU SET EVERYONE ON FIRE! - -[MRCPU04] -YOU ARE ON FIRE! - -[TRASH1] -Trash Dash - -[TRASH1A] -~w~Collect the dumpsters and get the trash back to the junk yard. - -[TRASH1C] -~w~The timer will start when you collect a dumpster. You may collect them in ANY ORDER. - -[TRASH1G] -~r~Too tough for you? You're garbage! - -[TRASH1H] -~r~You've run out of time! - -[TRASH1J] -~r~You've strayed too far from your route! - -[TRASH1K] -~w~Collect the ~g~dumpsters! - -[TRASH1L] -~w~Get back to the ~y~junk yard! - -[TRASH1M] -~w~Trash collected! +~1~ seconds - -[PCJINFO] -~w~Hit all 25 ~y~Checkpoints~w~ within ~1~ seconds. - -[PCJFAIL] -~r~You Failed to beat the time of ~1~ seconds! - -[PCJPROM] -~w~You have ~1~ seconds to get back on the ~b~bike! - -[PCJPRO1] -~w~You have ~1~ second to get back on the ~b~bike! - -[PCJDEST] -~r~Bike destroyed! - -[PCJRET] -~r~You failed to return to your bike. - -[PCJTIME] -~r~You ran out of time! - -[PCJCHEC] -~w~Checkpoint ~1~ out of ~1~ - -[TRRACE1] -~w~Get a time extension for each checkpoint you pass through... - -[TRRACE3] -~w~You finished with ~1~ seconds to spare! - -[TRRACE4] -~w~You reached ~1~ checkpoints out of ~1~ checkpoints first. - -[TRRACE5] -~w~That gives you $~1~! - -[TRRACE6] -~w~WELL DONE! You hit all checkpoints first! You get a bonus $1000! - -[TRRACE7] -~r~You've left the track! - -[TRRACE8] -~r~Your bike was destroyed! - -[TRRACE9] -~r~You failed to return to your bike in time! - -[TRRAC10] -~r~You lost your bike! - -[TRRAC11] -~r~You ran out of time! - -[ANG] -Avenging Angels - -[ANG_1] -~w~Hey, friend! We're gonna clean up crime in this city! - -[ANG_2A] -Press~h~ ~k~ ~TGSUB~ ~w~to join the Avenging Angels. - -[ANG_3] -~w~You and I could take this town apart on our own. But, er... let's get some help, just in case. - -[ANG_3A] -~w~Stop near other Avenging Angels to have them join your gang. - -[ANG_4] -~w~Yo! I joined this chicken shit outfit to kick ass. So let's go! - -[ANG_5] -~w~I'm your man... - -[ANG_6] -~w~Let's burn down some scum! - -[ANG_7] -~w~Kicking ass rocks! - -[ANG_7A] -~w~Can you dig it? - -[ANG_7B] -~w~We don't want no bully-boy gangs on our streets! - -[ANG_7C] -~w~Not in my backyard! - -[ANG_7D] -~w~It's time we fought back! - -[ANG_7E] -~w~We're the law in this town! - -[ANG_8] -Time Remaining - -[ANG_9] -~w~Time Extended! - -[ANG_10] -~r~You ran out of time! - -[ANG_11] -~w~There's a group of 'undesirables', loitering nearby... let's teach 'em a lesson. - -[ANG_12] -~w~There's a lynch mob raising hell in the streets. Let's pacify these idiots! - -[ANG_13] -~w~What's this city coming to? People think they have a right to free assembly? We'll show them! - -[ANG_13A] -~w~A nasty looking gang have been spotted bullying people in the streets... - -[ANG_14] -~w~Another crime's been reported... let's roll! - -[ANG_16] -~w~Some people have been spotted parking illegally. COME ON! - -[ANG_16A] -~w~There's some guys I know, who're always up to no good. It's about time we gave them a whipping. - -[ANG_OBJ] -~w~Take out the troublesome ~r~gang. - -[ANG_17] -~w~Good work, friend! Thanks to you, this neighborhood is crime free. At least for now... - -[ANG_18] -~w~They're bailing out! - -[ANG_19] -~w~Find an Avenging Angel and stop near them to get your next mission. - -[ANG_20] -~w~They're making a run for it! - -[ANG_21] -~w~Don't let them get away! - -[VIC1] -Home Sweet Home - -[VIC2] -Slacker - -[VIC3] -Dealing Revenge - -[VIC4] -Snuff - -[VIC5] -Smash and Grab - -[VIC6] -Hot Wheels - -[VIC7] -The Portland Chainsaw Masquerade - -[MAR1] -Shop 'til you Strop - -[MAR2] -Taken for a Ride - -[MAR3] -Booby Prize - -[MAR4] -Biker Heat - -[MAR5] -Overdose of Trouble - -[SAL1] -The Offer - -[SAL2] -Ho Selecta! - -[SAL3] -Frighteners - -[SAL4] -Rollercoaster Ride - -[SAL5] -Contra-Banned - -[SAL6] -Sindacco Sabotage - -[SAL7] -The Trouble with Triads - -[SAL8] -Driving Mr Leone - -[JDT1] -Bone Voyeur! - -[JDT2] -Don in 60 Seconds - -[JDT3] -A Volatile Situation - -[JDT4] -Blow up 'Dolls' - -[JDT5] -Salvatore's Salvation - -[JDT6] -The Guns of Leone - -[JDT7] -Calm before the Storm - -[JDT8] -The Made Man - -[MAC1] -Snappy Dresser - -[MAC2] -Big Rumble in Little China - -[MAC3] -Grease Sucho - -[MAC4] -Dead Meat - -[MAC4_0] -Casa - -[MAC5] -No Son of Mine - -[SALH1] -Rough Justice - -[SALH2] -Dead Reckoning - -[SALH3] -Shogun Showdown - -[SALH4] -The Shoreside Redemption - -[SALH4_V] -~r~v1.1 - -[SALH5] -The Sicilian Gambit - -[SALH5_V] -~r~v1.1 - -[DONH1] -Panlantic Land Grab - -[DONH2] -Stop the Press - -[DONH3] -Morgue Party Resurrection - -[DONH4] -No Money, Mo' Problems - -[DONH5] -Bringing the House Down - -[DONH6] -Love on the Run - -[TOSH1] -More Deadly than the Male - -[TOSH2] -Cash Clash - -[TOSH2F0] -~r~A van reached the Yakuza compound! - -[TOSH2F1] -~r~The convoy reached the Yakuza compound! - -[TOSH2F2] -~r~You didn't destroy the security vans! - -[TOSH2M0] -~w~That's one down! - -[TOSH2M1] -~w~Another one down! - -[TOSH3] -A Date with Death - -[TOSH4] -Cash in Kazuki's Chips - -[PO_MOB1] -~w~Toni? It's your Ma! - -[POMOB1A] -~w~How long have you been back in town? - -[POMOB1B] -~w~How come you don't come and see me? - -[POMOB1C] -~w~What's wrong with you? - -[POMOB1D] -~w~I'm your mother for her holiness'-sake! Come on. - -[PO_MOB2] -~w~Hello fido! It's Maria. - -[PO_MOB3] -~w~Hey Toni! It's JD. - -[POMOB3A] -~w~I hear it all over: you're headed for big things. - -[POMOB3B] -~w~I just hope you don't go forgetting your old pal JD when you get to the top. Right? - -[POMOB4A] -~w~What the hell do you want? - -[POMOB4B] -~w~Someone to pick up your laundry? Or wipe your ass? - -[POMOB4C] -~w~Don't be like that. Listen, I feel bad about everything... - -[POMOB4F] -~w~A nice slice of arsenic pie? - -[POMOB4G] -~w~Forget about it. - -[POMOB4I] -~w~Salvatore heard about it, and told me we both need to grow up. - -[POMOB4J] -~w~This is me growing up. I'm sorry. Come on. - -[PO_MOB5] -~w~Toni? It's Salvatore. - -[POMOB5A] -~w~We've got big trouble! Get your ass over here pronto! - -[PO_MOB6] -~w~Anthony? It's Salvatore. - -[POMOB6A] -~w~Have you seen Maria? - -[ST_MOB8] -~w~Yep? - -[STMOB8A] -~w~Toni? It's Sal. - -[STMOB8B] -~w~I need to talk. But I don't trust these cell phones for shit. - -[STMOB8C] -~w~I'll call you on the public phone outside the Court House. - -[ST_MOB1] -~w~Toni. It's Donald. - -[STMOB1A] -~w~I have rather a pressing matter that requires your... particular skills. - -[STMOB1B] -~w~Please call at my office as soon as you can. - -[ST_MOB2] -~w~Yeah? - -[STMOB2A] -~w~Cipriani? It's me, McAffrey. - -[STMOB2B] -~w~I've got some news that Salvatore might appreciate. - -[STMOB2C] -~w~Come and see me up at the usual place. - -[ST_MOB3] -~w~Yeah? - -[STMOB3A] -~w~It's Sal. - -[STMOB3B] -~w~Listen, the Forellis had Mayor Hole in their pocket. - -[STMOB3D] -~w~I know a big shot businessman who'd do anything to get into office. - -[STMOB3E] -~w~He's a complete asshole, so he's qualified for the position. - -[STMOB3F] -~w~I told him you'd make sure he wins the election... for us! - -[ST_MOB4] -~w~Hello. - -[STMOB4A] -~w~Toni. It's me, Sal. - -[STMOB4B] -~w~I can smell those Forellis behind all this shit I'm in. - -[STMOB4C] -~w~What I wanna know is: Why'd they get the mayor to light a fire under my ass? - -[STMOB4D] -~w~Listen, meet me down at the jetty. - -[STMOB4E] -~w~We're gonna do a little fact finding. - -[ST_MOB5] -~w~Yo! - -[STMOB5B] -~w~Head over to the public phone booth in Torrington. - -[STMOB5C] -~w~I need to talk. - -[STMOB5D] -~w~On the way, I want you to see an associate of mine in Aspatria. - -[STMOB5E] -~w~He's gonna help us pile the pressure on the Sindaccos and Forellis. - -[ST_MOB6] -~w~Yep? - -[STMOB6A] -~w~Toni? It's Sal. - -[STMOB6B] -~w~Get to the public phone booth at the Liberty Campus. - -[STMOB6C] -~w~This is important. - -[ST_MOB7] -~w~Yeah? - -[STMOB7A] -~w~Toni? Sal here. - -[STMOB7B] -~w~Get over to Belleville and find the public phone booth. - -[STMOB7C] -~w~I got something urgent needs doing. - -[ST_MOB9] -~w~Toni Cipriani here. - -[STMOB9A] -~w~Toni? It's your Ma. - -[STMOB9B] -~w~I just heard, you've been Made! - -[STMOB9C] -~w~...I never doubted you for a second, son! - -[STMOB9D] -~w~...and seeing as how you've finally proven yourself, - -[STMOB9E] -~w~I'm calling off that contract I put on you. - -[STMOB9F] -~w~Let's just put it behind us. - -[STMOB9G] -~w~After all, I only did it with your best interests at heart. - -[STMOB9H] -~w~Ah, what kind of a son makes his Ma go to such lengths? - -[STMOB9I] -~w~See you soon, son. Don't forget about your old Ma. - -[STMO10] -~w~Yeah? - -[STMO10A] -~w~Hey tough guy. It's McAffrey. - -[STMO10B] -~w~The Feds have caught up with your boss, Salvatore. - -[STMO10C] -~w~And they're real pissed. - -[STMO10D] -~w~He's gonna take the heat for every crime in this city. - -[STMO10E] -~w~So, we never met. Understood? - -[SH_MOB1] -~w~Toni...? - -[SHMOB1A] -~w~Sal? Is that you? - -[SHMOB1B] -~w~Ay, shut up! I'm speaking to my lawyer here! - -[SHMOB1C] -~w~Toni? ...I mean er ...Lionel? - -[SHMOB1D] -~w~Listen. They got me. Can you believe it? - -[SHMOB1E] -~w~I'm up shit creek without a paddle. - -[SHMOB1F] -~w~So get your ass over here, there's stuff I need you to take care of. - -[SHMOB1G] -~w~...Lionel? - -[SH_MOB2] -~w~Yeah? - -[SHMOB2A] -~w~Toni? It's Donald. - -[SHMOB2B] -~w~No wait, don't hang up! - -[SHMOB2C] -~w~I've got a very exciting proposition for you... - -[SHMOB2D] -~w~please call round at my current... um... residence, and I'll fill you in. - -[SHMOB2E] -~w~Toni...? - -[SHMOB2F] -~w~Please, Toni, have a heart. I'm calling you with my last di... - -[SH_MOB3] -~w~Is this Mr. Cipriani? - -[SHMOB3A] -~w~Who's this? How'd you get my number? - -[SHMOB3B] -~w~If one puts their mind to it, one can achieve much. - -[SHMOB3C] -~w~I shouldn't have to tell you that, Mr. Cipriani. - -[SHMOB3D] -~w~I need your help in a delicate matter. - -[SHMOB3E] -~w~For this help you will be richly rewarded. - -[SHMOB3F] -~w~I will explain when you arrive at my apartment in Torrington. - -[SH_MOB4] -~w~Toni! This is Sal! - -[SHMOB4A] -~w~You did it! I can hardly believe it kid! - -[SHMOB4B] -~w~We're nearly home free! - -[SHMOB4C] -~w~Come and see me. We just got a few loose ends to tie up. - -[SH_MOB5] -~w~Toni? Donald here. - -[SHMOB5A] -~w~If the Panlantic deal is to come to fruition we're going to need to, um... - -[SHMOB5B] -~w~how can I put this delicately... - -[SHMOB5C] -~w~'clear' a small section of land in Fort Staunton. - -[SHMOB5D] -~w~When you say 'we', you mean 'me' right? - -[SHMOB5E] -~w~Toni, you see right through me. - -[SHMOB5F] -~w~Go and see 8-Ball. I'm sure he can provide us with the necessary hardware. - -[SHMOB5G] -~w~I'm sure he can provide us with the necessary hardware. - -[SH_MOB6] -~w~My man? This is 8-Ball. - -[SHMOB6A] -~w~Your hardware is ready to ship out. - -[AHIT_H0] -~w~Is that all you've got, asshead! - -[AHIT_H1] -~w~For crying out loud! When will these morons give up? - -[AHIT_H2] -~w~Kiss my ass, dickhead! - -[AHIT_H3] -~w~You guys are starting to piss me off! - -[AHIT_BI] -~w~Keep your wits about you! One of Ma's hitmen is close by! - -[AHIT_TA] -~w~Keep your eyes peeled! One of Ma's hired guns is nearby! - -[AHIT_BU] -~w~Look out! One of Ma's hitmen is coming for you! - -[AHIT_AM] -~w~Watch out! One of Ma's hired killers has seen you! - -[AHIT_VA] -~w~Stay alert! One of Ma's paid killers is in the area! - -[AHIT_PO] -~w~Stay sharp! One of Ma's hitmen is moving in for the kill! - -[AHIT_CA] -~w~Look out! One of Ma's assassins is closing on you! - -[K_TKT] -Scrapyard Challenge - -[K_TK2] -~w~Ride through the coronas to score points. - -[K_TK4] -~w~Score as many points as you can before the time runs out! - -[K_CD] -~w~You have ~1~ seconds to return to your ~b~bike! - -[K_TKP1] -~w~1 point! - -[K_TKP2] -~w~2 points! - -[K_TKP3] -~W~3 points! - -[K_SC] -Score - -[K_SCX] -~w~You scored ~1~ points! - -[K_SCX1] -~w~You scored 1 point! - -[K_HSC1] -~w~New high score of ~1~ points! - -[K_HSC2] -~r~You failed to beat the high score of ~1~ points. - -[KRUSH] -You now get four times as much cash for using the car crusher! - -[KRUSH2] -You now get eight times as much cash for using the car crusher! - -[TURFAIL] -~r~ODDJOB OVER! - -[TKR1] -9mm Mayhem - -[TKR2] -Scooter Shooter - -[TCKILL] -Kills - -[TCHEAL] -Damage - -[TC2_1] -~r~You killed your driver! - -[TC2_2] -~r~Vehicle destroyed! - -[TC2_3] -~r~Out of time! - -[TC_T_E] -~w~Target Eliminated! $~1~ - -[TUP_BR] -~w~Eliminate as many ~r~targets ~w~as you can within the time limit. - -[TUP_BR2] -~w~Eliminate more than ~1~ ~r~targets ~w~for a new high score! - -[TUP_AD] -~w~You have 3 adrenaline pills, Press R1 button to use one. - -[TUPSC1] -~w~New high score of ~1~ kills! - -[TUPSC2] -~r~You failed to beat the high score of ~1~ kills. - -[MPWCS1] -The Wedding List - -[MPWCS2] -Hey, how ya been? - -[MPWCS3] -Listen, my son Joey's getting hitched! - -[MPWCS4] -I found him this real classy girl, just like my Maria... I can't wait to get them together! - -[MPWCS5] -Only, I don't want her seeing him driving one of those junk-heaps he's fixing up in his shop. - -[MPWCS6] -So, you're gonna scour this town for some decent wheels. - -[MPWCS7] -I'll make sure it's worth your while. - -[MPTCS1] -Tanks for the Memories - -[MPTCS2] -It's Sal. I need some heat diverting and you're gonna help me out. - -[MPTCS3] -I got a tank parked across town. Take it and wreak havoc! Don't pull no punches! - -[MPTCS4] -I want people thinking they must've pissed on Patton's grave. - -[MPTCS5] -Listen, this diversion's real important, so I've got other wise-guys showing up looking to take a ride. - -[MPTCS6] -...And, I'm only gonna pay the one that sits behind the wheel the longest - -[MPRCS1] -Street Rage - -[MPRCS2] -This is Salvatore Leone! Your dedicated public benefactor. - -[MPRCS3] -...don't listen to what the Attorney General says! - -[MPRCS4] -I am a good and generous friend of Liberty City. That's why I'm sponsoring this great race today. - -[MPRCS5] -How much is this shit costing me? - -[MPRCS6] -WHAT?! Get me to the E.R. My chest feels tight! - -[MPHPCS2] -It's Sal... the feds are tapping my phone so I'll be subtle. - -[MPHPCS3] -There's a briefcase full of Benjamin's under the phone, and a list of names. Guess what I want... - -[MPHPCS4] -...wait! It ain't to share this money with those fucks. - -[MPHPCS5] -You know... take them out. - -[MPHPCS6] -Wait. I don't mean 'Take them out - for a good time'. I mean... um... - -[MPHPCS7] -Look, just kill the fucks on the list will ya! - -[DEB0] -DEBUG 0 - -[DEB1] -DEBUG 1 - -[DEB2] -DEBUG 2 - -[DEB3] -DEBUG 3 - -[DEB4] -DEBUG 4 - -[NUM0] -DEBUG 0 (~1~) - -[NUM1] -DEBUG 1 (~1~) - -[NUM2] -DEBUG 2 (~1~) - -[NUM3] -DEBUG 3 (~1~) - -[NUM4] -DEBUG 4 (~1~) - -[CARS] -'Car Salesman' - -[BIKE] -'Bike Salesman' - -[RACE_0] -Position - -[RACE_FL] -~w~FINAL LAP - -[RACE_X0] -~w~Get a car and head for the ~y~start line! - -[RACE_X1] -~w~Get a bike and head for the ~y~start line! - -[RACE_X2] -~w~You need a car to be in this race! - -[RACE_X3] -~w~You need a bike to be in this race! - -[RACE_X4] -~w~You have ~1~ seconds to find a car. - -[RACE_X5] -~w~You have ~1~ seconds to find a bike. - -[RACE_X6] -~w~You have 1 second to find a car. - -[RACE_X7] -~w~You have 1 second to find a bike. - -[RACE_T0] -~r~You didn't come first! - -[RACE_T1] -~r~You have been disqualified for leaving your car. - -[RACE_T2] -~r~One of the racers has died - the race has been called off! - -[RACE_T3] -~r~You have been disqualified for leaving your bike. - -[RACE_Y3] -~w~3 - -[RACE_Y2] -~w~2 - -[RACE_Y1] -~w~1 - -[RACE_Y] -~w~GO! - -[RACE_Z1] -~w~1ST PLACE! - -[RACE_Z2] -~w~2ND PLACE! - -[RACE_Z3] -~w~3RD PLACE! - -[RACE_Z4] -~w~LAST PLACE! - -[RACE_R1] -~w~RECORD: ~1~:~1~~1~ NEW RECORD! - -[RACE_R2] -~w~NEW RECORD! - -[RACE_S0] -~w~TIME: ~1~:~1~~1~ - -[RACE_S1] -~w~BEST LAP: ~1~:~1~~1~ - -[RAC1] -Low-Rider Rumble - -[RAC2] -Deimos Dash - -[RAC3] -Wi-Cheetah Run - -[BIK1] -Red Light Racing - -[BIK2] -Torrington TT - -[BIK3] -Gangsta GP - -[TT1] -'Bumps & Grinds' - -[TT1_A1] -~w~< COURSE ~1~ > - -[TT1_B1] -~w~Course Target: ~1~:~1~ - -[TT1_B1A] -~w~Course Target: ~1~:0~1~ - -[TT1_B2] -~w~Best Course Time: ~1~:~1~ - -[TT1_B2A] -~w~Best Course Time: ~1~:0~1~ - -[TT1_B3] -~w~Best Lap Time: ~1~:~1~ - -[TT1_B3A] -~w~Best Lap Time: ~1~:0~1~ - -[TT1_B4] -~w~~1~:~1~ - -[TT1_B4A] -~w~~1~:0~1~ - -[TT1_B5] -~w~New Course Record! ~1~:~1~ - -[TT1_B5A] -~w~New Course Record! ~1~:0~1~ - -[TT1_L] -~r~ Locked. - -[A_PISTO] -~w~< Pistol > - -[A_UZI] -~w~< Micro SMG > - -[A_AK] -~w~< AK > - -[A_SNIPE] -~w~< Sniper Rifle > - -[A_GRENA] -~w~< Grenades > - -[A_ARMOU] -~w~< Body Armor > - -[A_ROCKE] -~w~< Rocket Launcher > - -[A_SHOTG] -~w~< Shotgun > - -[A_M4] -~w~< M4 > - -[A_FLAME] -~w~< Flame-Thrower > - -[A_MINIG] -~w~< Minigun > - -[A_COST] -~w~Cost: ~h~$~1~ - -[A_COST2] -~w~Cost: ~h~$~1~ ~n~ ~r~This will replace your current weapon. - -[A_COST3] -~w~Cost: ~h~$~1~ ~n~ ~r~Your Body Armor is in good condition. - -[A_COST4] -~w~Cost: ~h~$~1~ ~n~ ~r~You cannot afford this. - -[A_STOCK] -~r~Out of stock. - -[A_VIC4] -~w~A pistol usually costs $240, but this one's on Vincenzo. - -[A_DONS4] -~w~Donald Love's already paid for this. - -[A_NEDS4] -~w~Some church guy reserved one of these for you. - -[A_TALK1] -~w~I got all your home defense needs. - -[A_TALK2] -~w~You want a license too? - -[A_TALK3] -~w~I don't need to see any I.D. you look trustworthy. - -[A_TALK4] -~w~You're welcome to try out the range round the back. - -[BENZ_GO] -~w~Get a change of outfit! - -[PIZ_B01] -~w~You have ~1~ second to get back on the Pizza ~b~bike! - -[PIZ_B02] -~w~You have ~1~ seconds to get back on the Pizza ~b~bike! - -[PIZ_F04] -~r~You failed to return to the Pizza bike! - -[NDL_B01] -~w~You have ~1~ second to get back on the Noodle ~b~bike! - -[NDL_B02] -~w~You have ~1~ seconds to get back on the Noodle ~b~bike! - -[NDL_F04] -~r~You failed to return to the Noodle bike! - -[EXPO_D] -~w~Here's a finder's fee: $~1~! Finish the list for a bonus! - -[PUPSPN] -~w~POWERUP SPAWNED! - -[PUPMEGA] -~y~MEGA DAMAGE! - -[PUPREGN] -~y~HEALTH BOOST! - -[PUPINVS] -~y~INVISIBILITY! - -[PUPFREZ] -~y~FRENZY! - -[MPK] -killed - -[MPKHEAD] -with a headshot! - -[MPNEED] -only needs - -[MPNAME] -Name - -[MPSCORE] -Score - -[MPPING] -Ping - -[MPCPS] -Checkpoints - -[MPTIME] -Time - -[MPBONUS] -Bonus - -[MPQG] -Quit Game? - -[MPQUIT] -Quit - -[MPCONT] -Continue - -[MPHIGH] -Highest Time - -[MPBY] -by - -[MPOVER] -Game Over - -[MPFIRST] -finished first - -[MPWITH] -wins with $ - -[MPHP05] -~w~5 seconds until next target. - -[MPHP04] -~w~4 seconds until next target. - -[MPHP03] -~w~3 seconds until next target. - -[MPHP02] -~w~2 seconds until next target. - -[MPHP01] -~w~1 second until next target. - -[RCRANGE] -~w~Out of range! - -[CAD5_AA] -Sal here. - -[CAD5_AB] -These Forelli's have got me pissed! So they're gonna pay! - -[CAD5_AC] -I want you to take their classiest cars... - -[CAD5_AD] -...and run them over to their main competitors at the Sindacco auto yard. - -[CAD5_AE] -Just make sure the Forellis don't steal any Sindacco cars in retaliation. - -[CAD5_AF] -Capiche? - -[CAD4_AA] -It's me, Sal. - -[CAD4_AB] -I owe Franco Forelli, and you're gonna help me pay. - -[CAD4_AC] -Down at the Sindacco auto yard they've got some real classy cars. - -[CAD4_AD] -I want you to grab them all and take them to the Forelli car lot. - -[CAD4_AE] -Make sure that no Forelli vehicles get stolen while you're down there. - -[CAD4_AF] -Hey, don't screw this up. - -[MPC_000] -Toni - -[MPC_001] -'Lionel' - -[MPC_002] -Cipriani - -[MPC_003] -Chauffeur - -[MPC_004] -13th - -[MPC_005] -Toni the Tux - -[MPC_006] -Fury - -[MPC_007] -The King - -[MPC_008] -Cocks - -[MPC_009] -Streak - -[MPC_010] -'T' - -[MPC_011] -Dragon - -[MPC_012] -JD - -[MPC_013] -The Gimp - -[MPC_014] -Avery - -[MPC_015] -Choc-Choc - -[MPC_016] -8-Ball - -[MPC_017] -Maria - -[MPC_018] -'Hamfists' - -[MPC_021] -No.1 - -[MPC_023] -Hung Lo - -[MPC_025] -Yamazaki - -[MPC_031] -Officer '69' - -[MPC_032] -The Specialist - -[MPC_034] -G.I. Jones - -[MPC_035] -Sam - -[FEA_FM0] -HEAD RADIO - -[FEA_FM1] -DOUBLE CLEF FM - -[FEA_FM2] -K-JAH - -[FEA_FM3] -RISE FM - -[FEA_FM4] -LIPS 106 - -[FEA_FM5] -RADIO DEL MUNDO - -[FEA_FM6] -MSX 98 - -[FEA_FM7] -FLASHBACK FM - -[FEA_FM8] -THE LIBERTY JAM - -[FEA_FM9] -LCFR - -[MRACELA] -Lap - -[DTB_01] -~w~Defend your base against enemy attackers. - -[DTB_02] -~w~Protect your cars at all costs. - -[CAD2_AB] -~w~Good news, the Forellis and Sindaccos are at each other's throats again. - -[CAD2_AC] -~w~They both want ownership of all the car dealers in Liberty. - -[CAD2_AD] -~w~Seeing as we 'assisted' the Forellis last week... - -[CAD2_AE] -~w~...it's time to even the balance. - -[CAD2_AF] -~w~Help the Sindaccos cream the Forelli car lot. - -[POMOB6B] -~w~I swear I can only find that bitch when she needs money! - -[POMOB2A] -~w~Salvatore gave me your number... well I found it in his address book. But, whatever! - -[POMOB2B] -~w~You're his new doggy, right? Well, I want to go walkies. - -[POMOB2C] -~w~I'll expect you over soon. - -[GS_RGUN] -START WITH GUNS: - -[TUSHTK] -AWOL Angel - -[SC_WICH] -Highest score in 'AWOL Angel' - -[NE_WIFI] -A network error occurred. The WLAN switch is OFF. Please turn the WLAN switch ON to play the multiplayer games. - -[BNDRAC0] -Thrashin' RC - -[BNDRAC1] -Ragin' RC - -[BNDRAC2] -Chasin' RC - -[GS_G1] -LIBERTY CITY SURVIVOR - -[GS_G2] -STREET RAGE - -[GS_G3] -PROTECTION RACKET - -[GS_G4] -GET STRETCH - -[GS_G5] -TANKS FOR THE MEMORIES - -[GS_G6] -THE HIT LIST - -[GS_G7] -THE WEDDING LIST - -[TRCR1] -~w~1 - -[TRCR2] -~w~2 - -[TRCR3] -~w~3 - -[TRCRGO] -~w~GO! - -[GA_16] -~w~Respray is complimentary. - -[NEW_TAX] -~w~Taxi Driver mission complete! Mean Street Taxis have taken delivery of a new vehicle at their Trenton depot! - -[EXPO_2] -~w~If you supply them with the vehicles they need in good condition, you'll be well rewarded. - -[FEMP_NC] -Establishing network connections...Please Wait - -[C1TGSUB] -R3 button - -[C2TGSUB] -R3 button - -[C3TGSUB] -~S~ - -[C2VEHN] -R1 button - -[C2VECRS] -L3 button - -[C3VECRS] -~O~ - -[C2PDCWE] -L2 and R2 buttons - -[C3PDCWE] -L2 and R2 buttons - -[BENZ_LA] -~w~The ~h~Lawyer's outfit~w~ is now available at the safehouse. - -[BENZ_TR] -~w~Your ~h~Casual clothes~w~ are now available at the safehouse. - -[SLH1_OU] -~w~You'll need a ~h~lawyer's outfit~w~ to get in to see Sal. - -[SLH1_OR] -~w~You need to be in a lawyer's outfit to see Sal. - -[L_TRN_1] -~w~You can use the ~h~El-train~w~ to travel around Portland. Press~h~ ~k~ ~VEEE~ ~w~to enter or exit the train. - -[HELP2] -~w~Press~h~ ~k~ ~PDSPR~ ~w~while running to ~h~start sprinting. - -[STMOB5A] -~w~Toni, Sal. - -[SCH_TK7] -~r~You left the junkyard. - -[STMOB3C] -~w~But, we're gonna take control of City Hall. - -[SALH3A] -~w~Get some transport for Donald. - -[MPCASH] -Cash - -[MPCARS] -Cars - -[CRUSHED] -Junk value $~1~ - -[BENZ_BO] -~w~Pick up a change of ~h~underwear~w~ from the safehouse. - -[BENZ_EL] -~w~The ~h~King jumpsuit~w~ is now available at the safehouse. - -[BENZ_CO] -~w~A ~h~Cox mascot suit~w~ is now available at the safehouse. - -[BENZ_HE] -~w~Avenging Angel mission: Shoreside - level 15 complete! The ~h~Hero costume~w~ is now available at the safehouse. - -[BENZ_DR] -~w~The ~h~Dragon outfit~w~ is now available at the safehouse. - -[TRTIT] -Wong Side Of The Tracks - -[TRRACE2] -~w~Watch out! The Wong Brothers look mean... - -[MPTOTAL] -Total Time - -[TOUR_W6] -~w~Exclusive Armored Landstalker delivered to your safehouse. Keep it safe in your garage! - -[OUTFITS] -Unlocked Costumes - -[MPHPMAR] -has been marked for death. - -[FEC_CWT] -Cycle Weapons\Targets - -[EXPO_1] -~w~Love Media need prizes to give away in their 'Car-razy Car Give Away' competitions! - -[PCJLAP] -~w~New Lap Record of ~1~ seconds! - -[MPBLCAR] -Blue Car: - -[MPRDCAR] -Red Car: - -[RAMP_A] -~w~ALL RAMPAGES COMPLETED! $~1~ - -[FET_SAV] -Save Game - -[FET_WRN] -Warning! One or more cheats have been activated. This may affect your save game. It is recommended that you do not save this game. - -[HELP39] -~w~Use~h~ ~k~ ~VEWEI~ ~w~to shift your weight while on a bike. - -[FEC_EXV] -Exit vehicle - -[MPCOLL] -CARS TO COLLECT: - -[FEMP_HG] -HOST GAME - -[FEMP_JG] -JOIN GAME - -[K_TK3] -~w~1 point for ~g~green~w~, 2 points for ~y~amber~w~, and 3 points for ~r~red. - -[FEMP_GJ] -SELECT GAME TO JOIN - -[FEMP_H] -HOST: - -[FEMP_P] -PLAYERS: - -[FEMP_HN] -HOST A NEW GAME - -[PO_MOB4] -~w~Hey, it's me, Vincenzo. - -[POMOB4D] -~w~Come on. Drop by my place, I've got something for you. - -[POMOB4E] -~w~Yeah? What's that? A pair of concrete boots? - -[POMOB4H] -~w~No. Come on, Toni, I feel bad about what went down. - -[FEMP_F] -FULL - -[FEMP_R] -RESET TO DEFAULTS - -[YOU] -YOU - -[NE_POW] -A network error occurred. The power/hold switch was turned OFF. - -[FEMP_SQ] -Are you sure you want to start a multiplayer game? - -[BIKETXT] -~w~Hogs & Cogs is only open between the hours of 08:00 and 18:00. Come back then! - -[RACE_2] -Time - -[FEF_CO2] -Choose the best controller set-up for your playing style - -[TYREPOP] -Tires popped with gunfire - -[FE_INIP] -Initializing and loading Pause Menu... Please wait. - -[DON4EX3] -~w~You take a check? - -[CRUSH] -~w~Earn money from junk! Certain types of vehicle will be crushed if left in the area marked by tires. - -[ANG_15] -~w~A group of idiots just stole some poor guy's car... let's take 'em down! - -[CDERROR] -Please wait... - -[FEC_LOF] -Look Forward - -[FEC_LFA] -Look\Fine Aim - -[MPHELP] -HELP - -[C1VEHN] -L1 button - -[C3VEHN] -L3 button - -[MPOBJ] -OBJECTIVE: - -[MPLEG] -RADAR LEGEND: - -[GS_O1] -Every man for themselves! Kill the other players! - -[GS_O2] -Drive through the checkpoints to reach the finish line first. - -[GS_OD3] -Defend the four limos at your base from incoming attackers. - -[GS_O6] -Kill the 'Marked' player as quickly as possible. But, if you are the 'Mark' survive as long as you can. - -[GS_O7] -Collect cars scattered around the city, then drive them into the waiting containers. - -[FHOSE_2] -~h~~k~ ~VEWEA~ ~w~will adjust the cannon's aim. - -[MPI01] -POWERUP - -[MPI02] -HEALTH - -[MPI03] -ARMOUR - -[MPI04] -WEAPON - -[SPIDER] -Deimos SP - -[PONTIAC] -Phobos Vt - -[FORELLI] -Forelli ExSess - -[AHIT_LO] -You may have lost him for now, but he'll be back to finish the job. - -[FEM_ROF] -Radio Off - -[GA_1] -~w~You gotta be kiddin'! I ain't touchin' that! - -[TRA_NEX] -Next Stop: - -[TRA_CUR] -Current Stop: - -[PAGEB2] -~w~The ~h~Shotgun~w~ is now available at your safehouse! - -[PAGEB3] -~h~Body Armor~w~ is now available at your safehouse! - -[PAGEB4] -~w~The ~h~SMG~w~ is now available at your safehouse! - -[PAGEB5] -~w~The ~h~.357~w~ is now available at your safehouse! - -[PAGEB6] -~w~The ~h~M4~w~ is now available at your safehouse! - -[PAGEB7] -~w~The ~h~Laser Sighted Sniper Rifle~w~ is now available at your safehouse! - -[PAGEB8] -~w~The ~h~Flame-Thrower~w~ is now available at your safehouse! - -[PAGEB9] -~w~The ~h~Rocket Launcher~w~ is now available at your safehouse! - -[PAGE_01] -Gun down ~1~ Triads in 2 minutes! - -[PAGE_02] -Blow up ~1~ vehicles in 2 minutes! - -[PAGE_03] -Incinerate ~1~ Diablos in 2 minutes! - -[PAGE_04] -Kill ~1~ Leone mafia in 2 minutes! - -[PAGE_05] -Burn ~1~ vehicles in 2 minutes! - -[PAGE_06] -Run over ~1~ pedestrians in 2 minutes! - -[PAGE_07] -Destroy ~1~ vehicles in 2 minutes! - -[PAGE_08] -Massacre ~1~ pedestrians in 2 minutes! - -[PAGE_09] -Burn ~1~ Yakuza in 2 minutes! - -[PAGE_10] -Assassinate ~1~ Forellis in 2 minutes! - -[PAGE_11] -Run over ~1~ pedestrians in 2 minutes! - -[PAGE_12] -Murder ~1~ pedestrians in 2 minutes! - -[PAGE_13] -Kill ~1~ Yakuza in 2 minutes! - -[PAGE_15] -Massacre ~1~ pedestrians in 2 minutes! - -[PAGE_16] -Destroy ~1~ vehicles in 2 minutes! - -[PAGE_17] -Snipe ~1~ pedestrians in 2 minutes! - -[PAGE_18] -Destroy ~1~ vehicles in 2 minutes! - -[PAGE_20] -Burn ~1~ pedestrians in 2 minutes! - -[MPI05] -ENEMY - -[MPI07] -CHECKPOINT - -[MPI08] -NEXT - -[MPI09] -FINISH LINE - -[MPI10] -RACER - -[MPI11] -BASE - -[MPI12] -ENEMY BASE - -[MPI13] -TANK - -[MPI14] -THE MARK - -[MPI15] -CAR - -[MPI16] -CONTAINER - -[FEI_LEG] -Legend On\Off - -[SR_ON] -Now you've made a name for yourself on the street racing circuit, look out for challengers trying to contact you. - -[FEC_FRA] -Free Aim - -[KAR_ON] -Return to the firetruck whenever you want to try and beat your best time! - -[DON2EX5] -~w~8-ball won't budge unless you pay him $20000 - -[PCJTIT] -GO GO Faggio - -[FEA_MUS] -RADIO VOLUME: - -[FEST_GO] -Best time for Go Go Faggio - -[RC_1] -~w~Kill more than ~1~ Triads - each kill awards a time bonus! - -[EXPO_C] -~w~Thanks! That's all of them! We've left a cool bonus waiting outside your Newport apartment! - -[TRRACE0] -~w~Race through the ~y~checkpoints~w~ and reach the end of the course alive! - -[RACE_P1] -~w~1st - -[RACE_P2] -~w~2nd - -[RACE_P3] -~w~3rd - -[RACE_P4] -~w~4th - -[OUTF_00] -~w~Casual clothes - -[OUTF_01] -~w~Leone's suit - -[OUTF_03] -~w~Avenging Angel's fatigues - -[OUTF_04] -~w~Chauffeur's clothes - -[OUTF_05] -~w~Lawyer's suit - -[OUTF_06] -~w~Tuxedo - -[OUTF_07] -~w~'The King' jumpsuit - -[OUTF_08] -~w~Cox Mascot suit - -[OUTF_09] -~w~Underwear - -[OUTF_10] -~w~Hero garb - -[OUTF_11] -~w~'Dragon' jumpsuit - -[SLTVMON] -Total Cash made on 'Slash TV' - -[DBIKEAI] -Most air achieved (m) - -[MPC_039] -Vincenzo - -[MPC_040] -Salvatore - -[MPC_041] -Toshi - -[MPC_042] -Toshiko - -[MPC_043] -Ophelia Lardaz - -[MPC_044] -Ed Banger - -[MPC_045] -Robin Emblind - -[MPC_046] -Mrs. Menalot - -[MPC_047] -Hugh Jazz - -[MPC_048] -Wayne - -[MPC_049] -Paulie - -[MPC_050] -Anne Job - -[MPC_051] -Randy Boner - -[MPC_052] -Owen Monie - -[MPC_053] -Ekant Sing - -[MPC_054] -M.T.Head - -[MPC_055] -Rick O'Shea - -[MPC_056] -Arden Long - -[MPC_057] -Ann Thrax - -[MPC_058] -Fay Slift - -[MPC_059] -Mona Lott - -[C0VEACC] -~X~ - -[C1VEACC] -~X~ - -[C2VEACC] -~X~ - -[C3VEACC] -right analog stick up - -[C0VEBRK] -~S~ - -[C1VEBRK] -~S~ - -[C2VEBRK] -~S~ - -[C3VEBRK] -right analog stick down - -[C0VEHB] -R1 button - -[C1VEHB] -R1 button - -[C0VEEE] -~T~ - -[C1VEEE] -~T~ - -[C2VEEE] -L1 button - -[C3VEEE] -~T~ - -[C0VEWEP] -~O~ - -[C1VEWEP] -~O~ - -[C2VEWEP] -~O~ - -[C3VEWEP] -R1 button - -[C0PDSPR] -~X~ - -[C1PDSPR] -~X~ - -[C0SNZI] -~S~ - -[C1SNZI] -~S~ - -[C0SNZO] -~X~ - -[C1SNZO] -~X~ - -[C0PDFW] -~O~ - -[C1PDFW] -~O~ - -[C0TRSK] -~X~ - -[C1TRSK] -~X~ - -[C2TRSK] -~X~ - -[C3TRSK] -~X~ - -[C0AMBUY] -~X~ - -[C1AMBUY] -~X~ - -[C2AMBUY] -~X~ - -[C3AMBUY] -~X~ - -[C0AMEXI] -~T~ - -[C1AMEXI] -~T~ - -[C2AMEXI] -~T~ - -[C3AMEXI] -~T~ - -[C2PDSPR] -~O~ - -[C3PDSPR] -~X~ - -[C2SNZI] -~T~ - -[C3SNZI] -~S~ - -[C2SNZO] -~S~ - -[C3SNZO] -~X~ - -[C2PDFW] -~X~ - -[C3PDFW] -R1 button - -[MPC_020] -Rico Garlik - -[MPC_022] -Lou Scannon - -[MPC_024] -Cruz Vormen - -[MPC_026] -Busta Moves - -[MPC_027] -Juan Kerr - -[MPC_028] -Nick Yakar - -[MPC_029] -Lou Bricant - -[MPC_030] -Lance Urwell - -[MPC_033] -Agent Ochre - -[MPC_036] -Papi Love - -[MPC_037] -Lucy Lastic - -[MPC_038] -Bill Durzbum - -[MPISCOL] -Pickup Collected - -[MPSTART] -Starting game... - -[MRACEC1] -~w~1... - -[MRACEC2] -~w~2... - -[MRACEC3] -~w~3... - -[MPC_019] -Phil DeGirth - -[GDA_HL] -Highest 'Avenging Angel' level - -[MP_SNEW] -Please load or start a new single player or multiplayer game. - -[DON2EX9] -~r~Ned's~w~ getting away! Don't lose him! - -[FEI_CHA] -Change Team - -[FES_RES] -RESET GAME SETTINGS - -[FESZ_QT] -Are you sure you want to reset all settings for controls, audio and the display? Proceed? - -[FEH_LOA] -GAME - -[MPEMPTY] -Vacant - -[FEMP_SN] -START GAME (2 or more players required) - -[JD_SUIT] -~w~JD can't give you work when you're dressed as a Leone! - -[SAVD_SH] -safehouse. - -[SAVD_DY] -Day - -[SAVD_CO] -complete. - -[SAVD_AL] -Portland safehouse. Day 71, $57640. 17% complete. - -[SAV_SLT] -New Save - -[POMOB6C] -~w~Come over and see me soon. I got some work for you. - -[ANG_2] -~w~Press~h~ ~k~ ~TGSUB~ ~w~to toggle Avenging Angels missions on or off. - -[TVHELP] -~w~Press~h~ ~k~ ~TGSUB~ ~w~to toggle SLASH TV missions on or off. - -[PAGERA] -~w~The ~h~M60~w~ is now available at your safehouse! - -[CO_ALL] -~w~All Hidden Packages collected! - -[CO_ONE] -~w~Hidden Package ~1~ of ~1~ collected! - -[PAGE_14] -Blow away ~1~ Colombian gangsters in 2 minutes! - -[PAGE_19] -Run over ~1~ Colombian gang bangers in 2 minutes! - -[ANG_22] -~r~Avenging Angel missions cancelled. - -[SLATVQO] -~r~SlashTV mission cancelled. - -[C0FREE1] -L3 button - -[C1FREE1] -L3 button - -[C2FREE1] -L3 button - -[C3FREE1] -L3 button - -[C0FREE2] -left analog stick - -[C2FREE2] -left analog stick - -[ANGCOM1] -~w~Avenging Angel mission: Portland - level 15 complete! The unique 'Avenger' motorcycle has been delivered to your safehouse! - -[K_CE] -~w~You have ~1~ second to return to your ~b~bike! - -[HELP31] -~w~If you are ~h~'busted'~w~ or ~h~'wasted'~w~ while on a mission, this ~h~Taxi~w~ will appear. - -[LOSER] -~y~LOSER! - -[RCRHELP] -~w~Press~h~ ~k~ ~TGSUB~ ~w~to ~h~quit the race~w~.~h~ ~k~ ~VEWEP~ ~w~to reset your RC Car to the last checkpoint. - -[SRC_ON] -Now that you've made a name for yourself on the underground car-racing circuit, challengers will try to contact you. - -[SRB_ON] -Now that you've made a name for yourself on the underground bike-racing circuit, challengers will try to contact you. - -[RACE_R0] -~w~PREVIOUS RECORD: ~1~:~1~~1~ - -[POMOB3C] -~w~Hey, drop by some time okay buddy. - -[MPHPCS1] -The Hit List - -[MPWLGOC] -Get out of the car. - -[MPWLLTC] -Leave the crate. - -[MPWLDTC] -Deliver the car. - -[MPWLCD] -Car delivered. - -[MPWLNGC] -Now grab the cars. - -[MPAUTO] -PLAY ONCE - -[MRACEGO] -~w~GO - -[MRACE04] -YOU'RE THE WINNER - -[MRACEWI] -has won the race - -[MRCPU01] -~y~INSTANT REPAIR - -[DTB01] -defend the cars - -[DTB02] -destroy the cars - -[DTB03] -lost a car - -[DTB04] -destroyed a car - -[MPWIN] -wins - -[MPKSELF] -was killed - -[MPMORE] -more kills - -[MP1MORE] -more kill - -[MPSTRT] -Started - -[MPTANK] -has the tank - -[MPONE] -only has one car to get - -[MPDEL] -has delivered a car - -[MPGOCAR] -Go find the car - -[MPGOGAR] -Deliver the car - -[MPDEST] -Target vehicle destroyed - -[MPLEFT] -left the game - -[MPHPGO2] -~w~You have been marked for death - -[MPHPKI] -~w~You killed an assassin - -[LOCKON] -Lock On - -[MPHPGO] -~w~Eliminate the mark - -[MPTNK] -Get The Tank - -[MRCPU02] -YOU POPPED EVERYONE'S TIRES - -[MRCPU05] -YOUR TIRES ARE POPPED - -[MRCPU06] -~y~Sticky Tires - -[WINNER] -~Y~WINNER - -[MPDRAW] -~w~DRAW - -[MPDADDY] -YOU'RE THE DADDY NOW. - -[MPRUN] -RUN THIS TOWN NOW. - -[MPBITCH] -WHO'S YOUR DADDY NOW, BITCH? - -[FEMP_SM] -Play Grand Theft Auto with friends or creepy strangers standing nearby. - -[MPYL] -YOU LOSER! - -[MPTMWIN] -ARE THE TOP DOGS - -[GS_SCAR] -VEHICLE: - -[GS_MIN] -minute - -[GS_MINS] -minutes - -[MPTNKGA] -You got the tank, tough guy. - -[MPTNKGB] -Now keep it. - -[GS_TYPE] -SCENARIO: - -[CLILOST] -Communication with other players has been lost. - -[ONEHPC] -100 percent completed! There's a little present waiting for you in Fort Staunton. - -[MPBLTM] -sindaccos - -[MPRDTM] -forellis - -[MTN_1] -Sindaccos - -[MTN_2] -Forellis - -[MPRDCAP] -car has been captured - -[MPBLCAP] -car has been captured - -[MPRDST] -car has been stolen - -[MPBLST] -car has been stolen - -[MPBLEST] -car has been stolen - -[MPRDRET] -car has been returned - -[MPBLRET] -car has been returned - -[MPRDPOS] -car is out of position - -[MPBLPOS] -car is out of position - -[GS_TEAM] -JOIN GANG: - -[FEMP_TS] -JOIN GANG: - -[MPTEAM] -Gang - -[GS_OA3] -Destroy four limos at the rival gang's base. - -[GS_O4] -Steal the rival gang's car and return it to your base. Simultaneously, protect your gang's car. - -[MPI06] -GANG MEMBER - -[FEMP_ST] -START GAME (1 or more players per gang required) - -[HELP32] -~w~For a small fee (or free if you have no cash) it will transport you to the ~h~contact location~w~ of your last mission. - -[BENZ_HO] -~h~Overalls~w~ are now available at the safehouse. Come back here at night wearing them to play SlashTV. - -[SLATXT] -~w~Come back here dressed in the 'Overalls' between the hours of 18:00 and 05:00 to play SlashTV. - -[OUTF_02] -~w~Overalls - -[CAN_CON] -~w~Press~h~ ~k~ ~TGSUB~ ~w~again to cancel the mission. - -[GNG1] -LEONES - -[GNG2] -TRIADS - -[GNG3] -DIABLOS - -[GNG4] -YAKUZA - -[GNG5] -YARDIES - -[GNG6] -COLOMBIANS - -[GNG7] -HOODS - -[GNG8] -SINDACCOS - -[GNG9] -FORELLIS - -[GNG0] -SICILIANS - -[MP_GNG1] -SELECTED GANG 1: - -[MP_GNG2] -SELECTED GANG 2: - -[GS_TEMS] -GANG WAR - -[CARS_O] -~w~Capital Autos in Harwood is looking for new salesmen, if you want to make some extra money. - -[CARTXT] -~w~Capital Autos is only open between the hours of 08:00 and 18:00. Come back then! - -[GS_TO1] -Kill the rival gang! - -[MPTNEED] -only need - -[MPTWIN] -win - -[BADTEAM] -One of the gangs had no players left. - -[RACELAP] -Lap - -[GS_D1] -RE-LIVE THE CLASSIC GAME SHOW! URBAN DARWINISM IS BACK. - -[GS_D2] -WHO’S THE BEST AT DRIVING (OR CHEATING)? - -[GS_D3] -PROTECT YOUR CARS FROM SCUMBAGS AND VANDALS. - -[GS_D4] -STEAL THE ENEMY GANG’S CAR. LAUGH AT THEM. - -[GS_D5] -WHO WANTS THAT TANK THE MOST? - -[GS_D6] -THE MARKED MAN MUST BE WHACKED. - -[GS_D7] -DEAL CARS FOR CASH. - -[HELP61] -~w~When the ~h~triangular blip points up~w~ the ~h~target is above you~w~. A ~h~square blip~w~ indicates the ~h~target is level with you. - -[ST_DRWN] -Fish fed - -[RACE_T4] -~r~You have been disqualified for failing to find a car. - -[RACE_T5] -~r~You have been disqualified for failing to find a bike. - -[PCJ600] -PCJ-600 - -[FEC_HBB] -Hand brake~h~ ~k~ ~VEACC~ ~w~and~h~ ~k~ ~VEBRK~ - -[HJSTAT] -~w~Distance: ~1~.~1~m Height: ~1~.~1~m Flips: ~1~ Rotation: ~1~° - -[HJSTATW] -~w~Distance: ~1~.~1~m Height: ~1~.~1~m Flips: ~1~ Rotation: ~1~° And what a great landing! - -[HJSTATF] -~w~Distance: ~1~ft Height: ~1~ft Flips: ~1~ Rotation: ~1~° - -[HJSTAWF] -~w~Distance: ~1~ft Height: ~1~ft Flips: ~1~ Rotation: ~1~° And what a great landing! - -[MPUNLK] -New multiplayer content unlocked. Shame other players with all the stuff you've unlocked! - -[MPUNLKA] -All multiplayer content unlocked. Shame other players with all the stuff you've unlocked! - -[TOUR] -See the Sight Before your Flight - -[NDL1_A] -Noodle Punk - -[PIZ1_A] -Well Snacked Pizza - -[GS_SCUT] -PLAY CUTSCENE: - -[TR_00] -RACE ONE - -[TR_01] -RACE TWO - -[TR_02] -RACE THREE - -[TR_03] -RACE FOUR - -[TR_04] -RACE FIVE - -[TR_05] -RACE SIX - -[TR_06] -RACE SEVEN - -[TR_07] -RACE EIGHT - -[CHSE] -CHASE - -[NOCHANG] -You can't change outfits while on this mission. - -[OUTF_12] -Antonio - -[OUTF_13] -Sweats - -[OUTF_14] -Goodfella - -[OUTF_15] -Wiseguy - -[BENZ_AN] -~w~The ~h~Antonio outfit~w~ is now available at the safehouse. - -[BENZ_SW] -~w~The ~h~Sweats outfit~w~ is now available at the safehouse. - -[BENZ_GD] -~w~The ~h~Goodfella outfit~w~ is now available at the safehouse. - -[BENZ_WI] -~w~The ~h~Wiseguy outfit~w~ is now available at the safehouse. - -[RAMPAGE] -RAMPAGE - -[GS_TTGT] -TANK TIME: - -[GS_O5] -Survive the longest while in the Tank to win. Damage the Tank to steal it from another player. - -[HELP28] -~w~To throw an ~h~explosive weapon~w~ press~h~ ~k~ ~PDFW~. ~w~The longer you hold~h~ ~k~ ~PDFW~ ~w~the further the weapon will go. - -[RATNG53] -Dishonorable - -[RATNG54] -Cheating Rat - -[RATNG55] -Shark - -[RATNG56] -Con Artist - -[RATNG57] -The Don of all Liars - -[RATNG11] -LEECH - -[CHASE6] -Liberty Tree Page 2 - -[CHASE7] -Liberty Tree Front page - -[AUTOLD] -Loading from Memory Stick™, do not remove Memory Stick™ or switch off the power. - -[LDFAIL] -Load failed. Save data is corrupted. - -[MEMCHKA] -Memory Stick™ is not found. At least - -[MEMCHKB] -is needed to save this game data. - -[MEMCHKC] -There is insufficient space on the Memory Stick™. At least - -[MEMCHKD] -is needed to save this game data. - -[M_FAIL] -MISSION FAILED! - -[M_OVER] -MISSION OVER! - -[M_PASS] -~Y~MISSION PASSED! ~n~$~1~ - -[M_PASSN] -~Y~MISSION PASSED! - -[MRACE11] -~w~Get back in a vehicle to finish the race - -[FEI_LE1] -Legend On - -[FEI_LE2] -Legend Off - -[FEI_TA1] -Target On - -[FEI_TA2] -Target Off - -[C1FREE2] -left analog stick - -[C3FREE2] -left analog stick - -[FEA_MP3] -CUSTOM TRACKS: - -[FEA_NA] -UNAVAILABLE - -[MPC_060] -Antonio - -[MPC_061] -Sweats - -[MPC_062] -Goodfella - -[MPC_063] -Wiseguy - -[MPC_064] -Kazuki - -[NUMDBL1] -DEBUG 1 (~1~) (~1~) - -[SVRMBRS] -PLAYER LIST: - -[RAMP_P] -RAMPAGE PASSED! - -[RAMP_F] -RAMPAGE FAILED! - -[MPWLPAC] -picked up a target car. - -[MPWLDAC] -delivered a target car. - -[LDWAIT] -Press ~X~ to continue. - -[LOADING] -Loading... Please wait - -[RACEP1] -1st - -[RACEP2] -2nd - -[RACEP3] -3rd - -[RACEP4] -4th - -[RACEP5] -5th - -[RACEP6] -6th - -[FEA_UT] -UNKNOWN TRACK - -[LOADIN2] -Loading... - -[DNH5_X2] -~r~You didn't set all the bombs. - -[MRACE12] -YOU HAVE - -[MRACE13] -SECONDS TO FIND SOME WHEELS - -[MRACE14] -SECOND TO FIND SOME WHEELS - -[DTB_03] -~w~The team who defends their cars the longest, wins. - -[PUPCOL] -collected a powerup - -[TNKCSE] -Damage the Tank to steal it from another player. - -[TNKTM] -Stay alive the longest in the Tank to win. - -[MPFAIL] -FAILED - -[GS_LOC2] -LOCATION: - -[DTBSWPA] -You held off the Sindaccos for - -[DTBSWPB] -Now trash their cars in less time. - -[DTBSWPC] -You trashed the Forelli cars in - -[DTBSWPD] -Now protect your cars for longer. - -[CHANOP] -Change Option - -[MPSSCT] -CASH TARGET: - -[F_RANG2] -~r~The fire truck radio doesn't work in the subway! - -[T_RANG2] -~r~There's no trash to collect in the subway! - -[T_RANGE] -~r~There's no trash to collect here! - -[FEU_YES] -YES - -[FEU_NO] -NO - -[HELP43] -~w~Using the handbrake will allow you to turn the boat more quickly. - -[RACE_T6] -~r~One of the cars was wrecked - the race has been called off! - -[FED_POS] -SCREEN POSITION - -[FES_DSS] -Select save game to delete: - -[FES_LSS] -Select save game to load: - -[FES_DSC] -Delete Successful. Select OK to continue. - -[FES_DEL] -Delete game - -[FES_DGM] -DELETE GAME - -[ITBEG] -In the beginning... - -[FET_LG] -LOAD GAME - -[FES_SCG] -Save the current game? - -[FESZ_QZ] -Are you sure you want to save this game? - -[FES_SSC] -Save Successful. Select OK to continue. - -[FEM_NTF] -The memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 is unformatted. - -[FES_CFM] -Formatting memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1. Do not remove memory card (8MB)(for PlayStation®2), controller, or reset/switch off the console. - -[FES_LOQ] -Load failed! The save game on the memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 is not compatible with the game. Please try loading a different save game. Now restarting game. - -[FEM_NTH] -No memory card (8MB)(for PlayStation®2) inserted in MEMORY CARD slot 1. - -[FES_CMP] -Save failed! Check the memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 and please try again. - -[FESZ_FO] -The memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 is unformatted. Do you wish to format it now? - -[FES_NOC] -No memory card (8MB)(for PlayStation®2) inserted in MEMORY CARD slot 1. - -[FES_LOE] -Load failed! Check memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 and please try again. Now restarting game. - -[FES_DEE] -Delete failed! Please check memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 and try again. - -[SLONFM] -Format failed! Please check memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 and try again. - -[SLONDR] -Insufficient free space on memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1. Please insert a memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 with at least 330KB of free space in order to save this game data. - -[SLNSP] -Insufficient free space on memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1. At least an additional 101KB of free space is needed on the memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 to save this game data. - -[SLONNF] -The memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 is unformatted. Do you wish to format it now? - -[FESZ_FF] -Format failed! Please check memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 and try again. - -[MCDNSP] -No memory card (8MB)(for PlayStation®2) inserted in MEMORY CARD slot 1. If you wish to save your game data, insert a memory card (8MB)(for PlayStation®2) with at least 330KB of free space. Do you wish to start the game anyway? - -[MCGNDP] -There is insufficient free space on the memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1. At least 330KB of free space is needed to save this game data. Do you wish to start the game anyway? - -[MCGNSP] -There is insufficient free space on the memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1. At least an additional 101KB of free space is needed on the memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 to save this game data. Do you wish to start the game anyway? - -[FESZ_WR] -Saving data. Do not remove memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1, controller, or reset/switch off the console. - -[FELD_WR] -Loading data. Do not remove memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1, controller, or reset/switch off the console. - -[FEDL_WR] -Deleting data. Do not remove memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1, controller, or reset/switch off the console. - -[C0VEWEA] -right analog stick - -[C1VEWEA] -right analog stick - -[C2VEWEA] -right analog stick - -[C3VEWEA] -directional buttons - -[C0PDLOO] -right analog stick - -[C1PDLOO] -right analog stick - -[C2PDLOO] -right analog stick - -[C3PDLOO] -right analog stick - -[C0AMMOV] -left analog stick, or directional buttons - -[C1AMMOV] -left analog stick, or directional buttons - -[C2AMMOV] -left analog stick, or directional buttons - -[C3AMMOV] -left analog stick, or directional buttons - -[FEC_ACB] -Accelerate/Brake - -[FEM_SL8] -Save File 8 Not Present - -[FES_SAV] -SAVE GAME - -[FES_FMS] -Format Successful. - -[MCDNCK] -Checking Memory Card (8MB)(for PlayStation®2) in MEMORY CARD slot 1. Do not remove memory card (8MB)(for PlayStation®2), controller, or reset/switch off the console. - -[FESZ_QC] -Proceed with overwriting this corrupted save game? - -[NOCONT] -Please connect a DUALSHOCK® analog controller or DUALSHOCK®2 analog controller to controller port 1 to continue. - -[FES_LCF] -Load failed! Check memory card (8MB)(for PlayStation®2) in MEMORY CARD slot 1 and please try again. - -[DBGHELP] -~h~DEBUG MENU~w~ Select Item with ~h~left button & right button. ~w~Press ~h~X button ~w~to launch. Press ~h~TRIANGLE button ~w~to quit menu. - -[DBGSEL1] -Level Skip Menu - -[DBGSEL2] -Car Viewer - -[DBGSEL3] -Character Viewer - -[DBGSEL4] -Building Viewer - -[DBGSEL5] -Weapon Cheat - -[DBGSEL6] -Player Cheat - -[DBGSEL7] -Weather and Time Changer - -[DBGSEL8] -Marketing Camera - -[DBGSEL9] -MoCap Menu - -[DBGSE10] -USJ Editor - -[DBGSE11] -Toggle Player Coordinates - -[DBGFIL0] -Ped Selector - -[DBGFIL1] -Car Selector - -[PLCHLD] -Placeholder: mission will complete in 5 seconds - -[PLCHLD2] -Placeholder Cutscene - -[PLCHLD3] -Placeholder (MOCAP) Cutscene - -[LS_MAC] -Ma Cipriani stream - -[LS_JDT] -J.D. O'Toole stream - -[LS_SAL] -Salvatore stream - -[LS_COMP] -Completed all Missions in this stream - -[TEMP1] -Number: ~1~ - -[LS2_H1] -Use ~h~analog up & down ~w~to select story stream. Use ~h~analog left & right ~w~to select mission. Use ~h~L button & R button ~w~to select an island. Press ~h~X button ~w~to start mission. Press ~h~TRIANGLE button ~w~to exit. - -[LS2_H2] -You cannot use levelskip when you are ~h~on a mission. - -[LS2_VIC] -~y~Vincenzo Cilli -~g~ ~a~ - -[LS2_MAC] -~y~Ma Cipriani -~g~ ~a~ - -[LS2_JDT] -~y~J.D. O'Toole -~g~ ~a~ - -[LS2_SAL] -~y~Salvatore -~g~ ~a~ - -[LS2_MAR] -~y~Maria -~g~ ~a~ - -[LS2_NED] -~y~Ned Burner -~g~ ~a~ - -[LS2_DON] -~y~Donald Love -~g~ ~a~ - -[LS2_RAY] -~y~Ray Machowski -~g~ ~a~ - -[LS2_TOS] -~y~Toshiko Kasen -~g~ ~a~ - -[FREEON] -Time Frozen - -[FREEOFF] -Time Unfrozen - -[WTC_INS] -Use ~h~analog up & down ~w~to change weather. Use ~h~analog left & right ~w~to change hour. Press ~h~TRIANGLE button ~w~to exit. Press ~h~SQUARE button ~w~to freeze time. - -[WTC_TIM] -TIME: ~1~:00 - -[WTC_WE0] -WEATHER: CLOUDY - -[WTC_WE1] -WEATHER: EXTRA COLOURS - -[WTC_WE2] -WEATHER: EXTRA SUNNY - -[WTC_WE3] -WEATHER: FOGGY - -[WTC_WE4] -WEATHER: HURRICANE - -[WTC_WE5] -WEATHER: RAINY - -[WTC_WE6] -WEATHER: SNOW - -[WTC_WE7] -WEATHER: SUNNY - -[CVHELP] -Use ~h~up button and down button ~w~to change character. Use ~h~left button and right button ~w~to rotate camera. HOLD ~h~SQUARE ~w~to zoom in (toggles upper and lower body). Press ~h~TRIANGLE ~w~to quit character viewer. - -[VMENU1] ---------- Select a Viewer --------- --- ~h~Car~w~ - Character - Building -- - -[VMENU2] ---------- Select a Viewer --------- --- Car - ~h~Character~w~ - Building -- - -[VMENU3] ---------- Select a Viewer --------- --- Car - Character - ~h~Building~w~ -- - -[CV_C] -COMPARISON MODEL - -[CV_0] -ROW: -- MODEL: player - -[CV_1] -ROW: 114 MODEL: cop - -[CV_2] -ROW: 115 MODEL: swat - -[CV_3] -ROW: 116 MODEL: fbi - -[CV_4] -ROW: 117 MODEL: army - -[CV_5] -ROW: 118 MODEL: medic - -[CV_6] -ROW: 119 MODEL: fireman - -[CV_7] -ROW: 71 MODEL: male01 - -[CV_9] -ROW: 120 MODEL: taxi_d - -[CV_10] -ROW: 2 MODEL: pimp - -[CV_11] -ROW: 13 MODEL: criminal01 - -[CV_12] -ROW: 14 MODEL: criminal02 - -[CV_13] -ROW: 15 MODEL: male02 - -[CV_14] -ROW: 16 MODEL: male03 - -[CV_15] -ROW: 121 MODEL: fatmale01 - -[CV_16] -ROW: 17 MODEL: fatmale02 - -[CV_17] -ROW: 18 MODEL: female01 - -[CV_18] -ROW: 19 MODEL: female02 - -[CV_19] -ROW: 20 MODEL: female03 - -[CV_20] -ROW: 21 MODEL: fatfemale01 - -[CV_21] -ROW: 22 MODEL: fatfemale02 - -[CV_22] -ROW: 23 MODEL: prostitute - -[CV_23] -ROW: 24 MODEL: prostitute2 - -[CV_24] -ROW: 25 MODEL: p_man1 - -[CV_25] -ROW: 26 MODEL: p_man2 - -[CV_26] -ROW: 27 MODEL: p_wom1 - -[CV_27] -ROW: 28 MODEL: p_wom2 - -[CV_28] -ROW: 29 MODEL: ct_man1 - -[CV_29] -ROW: 30 MODEL: ct_man2 - -[CV_30] -ROW: 31 MODEL: ct_wom1 - -[CV_31] -ROW: 32 MODEL: ct_wom2 - -[CV_32] -ROW: 33 MODEL: li_man1 - -[CV_33] -ROW: 34 MODEL: li_man2 - -[CV_34] -ROW: 35 MODEL: li_wom1 - -[CV_35] -ROW: 36 MODEL: li_wom2 - -[CV_36] -ROW: 37 MODEL: docker1 - -[CV_37] -ROW: 38 MODEL: docker2 - -[CV_38] -ROW: 39 MODEL: scum_man - -[CV_39] -ROW: 40 MODEL: scum_wom - -[CV_40] -ROW: 41 MODEL: worker1 - -[CV_41] -ROW: 42 MODEL: worker2 - -[CV_42] -ROW: 43 MODEL: b_man1 - -[CV_43] -ROW: 44 MODEL: b_man2 - -[CV_44] -ROW: 67 MODEL: b_man3 - -[CV_45] -ROW: 45 MODEL: b_wom1 - -[CV_46] -ROW: 46 MODEL: b_wom2 - -[CV_47] -ROW: 70 MODEL: b_wom3 - -[CV_48] -ROW: 47 MODEL: mod_man - -[CV_49] -ROW: 48 MODEL: mod_wom - -[CV_50] -ROW: 49 MODEL: st_man - -[CV_51] -ROW: 50 MODEL: st_wom - -[CV_52] -ROW: 51 MODEL: fan_man1 - -[CV_53] -ROW: 52 MODEL: fan_man2 - -[CV_54] -ROW: 53 MODEL: fan_wom - -[CV_55] -ROW: 54 MODEL: hos_man - -[CV_56] -ROW: 55 MODEL: hos_wom - -[CV_57] -ROW: 56 MODEL: const1 - -[CV_58] -ROW: 57 MODEL: const2 - -[CV_59] -ROW: 58 MODEL: shopper1 - -[CV_60] -ROW: 59 MODEL: shopper2 - -[CV_61] -ROW: 60 MODEL: shopper3 - -[CV_62] -ROW: 61 MODEL: stud_man - -[CV_63] -ROW: 62 MODEL: stud_wom - -[CV_64] -ROW: 63 MODEL: cas_man - -[CV_65] -ROW: 64 MODEL: cas_wom - -[CV_79] -ROW: 123 MODEL: gang01 LEONE_A - -[CV_80] -ROW: 124 MODEL: gang02 LEONE_B - -[CV_81] -ROW: 69 MODEL: gang03 TRIAD_A - -[CV_82] -ROW: 3 MODEL: gang04 TRIAD_B - -[CV_83] -ROW: 4 MODEL: gang05 DIABLO_A - -[CV_84] -ROW: 5 MODEL: gang06 DIABLO_B - -[CV_85] -ROW: 68 MODEL: gang07 YAKUZA_A - -[CV_86] -ROW: 6 MODEL: gang08 YAKUZA_B - -[CV_87] -ROW: 7 MODEL: gang09 YARDIE_A - -[CV_88] -ROW: 8 MODEL: gang10 YARDIE_B - -[CV_89] -ROW: 9 MODEL: gang11 COLOMBIAN_A - -[CV_90] -ROW: 10 MODEL: gang12 COLOMBIAN_B - -[CV_91] -ROW: 11 MODEL: gang13 HOOD_A - -[CV_92] -ROW: 12 MODEL: gang14 HOOD_B - -[CV_93] -ROW: 89 MODEL: gang15 Forelli thug1 - -[CV_94] -ROW: 90 MODEL: gang16 Forelli thug2 - -[CV_95] -ROW: 88 MODEL: gang17 Sindacco thug1 - -[CV_96] -ROW: 89 MODEL: gang18 Sindacco thug2 - -[CV_109] -ROW: 65 MODEL: SAL_01 Salvatore (Mob Don) - -[CV_110] -ROW: 66 MODEL: RAY_01 Ray (Bad Cop) - -[CV_111] -ROW: 72 MODEL: VINC_01 Vincenzo Cilli - -[CV_112] -ROW: 73 MODEL: GRDANG1 Avenging Angel - -[CV_113] -ROW: 74 MODEL: NED_01 Ned Burner (Reporter) - -[CV_114] -ROW: 75 MODEL: MASTOR Massimo Torrini (Assassin) - -[CV_115] -ROW: 76 MODEL: TOOL_01 JD O'Toole - -[CV_116] -ROW: 77 MODEL: Not used Fthr Kenny - -[CV_117] -ROW: 78 MODEL: GRDANG2 Avenging Angel 2 - -[CV_118] -ROW: 79 MODEL: M_HOLE Mayor RC Hole - -[CV_119] -ROW: 80 MODEL: FRANFOR Franco Forelli - -[CV_120] -ROW: 81 MODEL: KAZUKI Kazuki Kasen - -[CV_121] -ROW: 82 MODEL: PAULIE Paulie Sindacco - -[CV_122] -ROW: 83 MODEL: HOPPER Jane Hopper - -[CV_123] -ROW: 84 MODEL: AVERY Avery Carrington - -[CV_124] -ROW: 85 MODEL: CASA Giovanni Casa - -[CV_125] -ROW: 86 MODEL: BABY Giovanni Casa (baby) - -[CV_126] -ROW: 87 MODEL: MCAFFRY Det. Leon McAffrey - -[CV_127] -ROW: 92 MODEL: EIGHT 8Ball - -[CV_128] -ROW: 93 MODEL: MAR_01 Maria - -[CV_129] -ROW: 94 MODEL: LOVE_01 Donald Love - -[CV_130] -ROW: 95 MODEL: MICKEYH Mickey H - -[CV_131] -ROW: 96 MODEL: WAYNE Wayne (Biker Dude) - -[CV_132] -ROW: 97 MODEL: BIKER1 Biker Dude 1 - -[CV_133] -ROW: 98 MODEL: BIKER2 Biker Dude 2 - -[CV_134] -ROW: 99 MODEL: DONOVAN O'Donovan - -[CV_135] -ROW: 100 MODEL: KAS_01 Toshiko Kasen (kimono) - -[CV_136] -ROW: 101 MODEL: WKAS_01 Toshiko Kasen (western) - -[CV_137] -ROW: 104 MODEL: JDMADE JD O'Toole - Made Man - -[CV_138] -ROW: 106 MODEL: THUG_01 Sicilian Thug 1 - -[CV_139] -ROW: 107 MODEL: THUG_02 Sicilian Thug 2 - -[CV_140] -ROW: 109 MODEL: CAMP_MAN Campaign Worker - -[CV_141] -ROW: 110 MODEL: CAMP_WOM Campaign Worker 2 - -[CV_142] -ROW: 111 MODEL: MIGUEL Miguel - -[CV_143] -ROW: 112 MODEL: DELIASS Deli Assistant - -[CV_144] -ROW: 113 MODEL: HOBO_01 Donald Love 2 - -[CV_68] -ROW: 122 MODEL: HITMAN Hitman - -[CV_146] -ROW: 125 MODEL: HOLEJOG Mayor RC Hole (Jogging outfit) - -[CV_147] -ROW: 126 MODEL: Chauff Chauffeur - -[CV_148] -ROW: 128 MODEL: plr2 (Lawyer) - -[CV_149] -ROW: 129 MODEL: plr3 (Travel clothes) - -[CV_150] -ROW: 130 MODEL: plr4 (Chauffeur) - -[CV_151] -ROW: 131 MODEL: plr5 (Hockey mask) - -[CV_152] -ROW: 132 MODEL: plr6 (Tuxedo) - -[CV_153] -ROW: 133 MODEL: plr7 (Avenging Angel) - -[CV_154] -ROW: 134 MODEL: plr8 (The King of Rock'n Roll) - -[CV_155] -ROW: 135 MODEL: plr9 (Cock's Mascot) - -[CV_156] -ROW: 136 MODEL: plr10 (Boxer Shorts) - -[CV_157] -ROW: 137 MODEL: plr11 (Bad Super Hero) - -[CV_158] -ROW: 138 MODEL: plr12 (Dragon) - -[CV_159] -ROW: 139 MODEL: PHILC Phil Cassidy - -[CV_160] -ROW: 140 MODEL: GREASE Grease Zuko - -[CV_161] -ROW: 141 MODEL: GUN_ASS Gun assistant - -[CV_162] -ROW: -- MODEL: JD_shot JD shot dead - -[CV_163] -ROW: -- MODEL: BODYBAG bodybag - -[CV_164] -ROW: 142 MODEL: SAL_CON Sal Convict - -[VV_131] -ID:131 MODEL: Landstalker (TBC) - -[VV_135] -ID:135 MODEL: Perenial (TBC) - -[VV_138] -ID:138 MODEL: Firetruck - -[VV_141] -ID:141 MODEL: Manana (TBC) - -[VV_148] -ID:148 MODEL: FBI Car (TBC) - -[VV_152] -ID:152 MODEL: Kuruma (TBC) - -[VV_164] -ID:164 MODEL: Dodo (TBC) - -[VV_169] -ID:169 MODELL: Rc Bandit - -[VV_170] -ID:170 MODEL: BellyUp (Triad) (TBC) - -[VV_172] -ID:172 MODEL: Leone Sentinel (TBC) - -[VV_174] -ID: 174 MODEL: Yakuza (TBC) - -[VV_179] -ID:179 MODEL: Flatbed (TBC) - -[VV_181] -ID:181 MODEL: Borgnine Taxi (TBC) - -[VV_188] -ID: 188 MODEL: Sindacco Argento (TBC) - -[VV_189] -ID: 189 MODEL: Forelli Lexcess (TBC) - -[VV_192] -ID:192 MODEL: Speeder (TBC) - -[BV_H1] -Press CIRCLE to swap building model. - -[BV_0A] -ROW: 2 - Portland. Safehouse Exterior. Press CIRCLE to swap. - -[BV_0B] -ROW:24 - Portland. Safehouse Interior. Press CIRCLE to swap. - -[BV_1] -ROW: 3 - Portland. Ferry Terminal. - -[BV_2A] -ROW: 4 - Portland. Callahan Bridge 1. Press CIRCLE to swap. - -[BV_2B] -ROW: 4 - Portland. Callahan Bridge 2. Press CIRCLE to swap. - -[BV_3] -ROW: 5 - Portland. Les Cargo Freighter. - -[BV_4A] -ROW: 6 - Portland. Doll's House Brothel 1. Press CIRCLE to swap. - -[BV_4B] -ROW: 6 - Portland. Doll's House Brothel 2. Press CIRCLE to swap. - -[BV_5] -ROW: 7 - Portland. Tower Block. - -[BV_6] -ROW: 8 - Portland. Eddie's Garage. - -[BV_7] -ROW: 9 - Portland. Bowler's Fist Pub. - -[BV_8] -ROW:10 - Portland. Hepburn Heights. - -[BV_9] -ROW:11 - Portland. Short Stay Hotel. - -[BV_10] -ROW:12 - Portland. Car Dealership. - -[BV_11] -ROW:13 - Portland. Bus Graveyard. - -[BV_12A] -ROW:14 - Portland. Drugs Warehouse 1 (awaiting approval). Press CIRCLE to swap. - -[BV_12B] -ROW:14 - Portland. Drugs Warehouse 2 (awaiting approval). Press CIRCLE to swap. - -[BV_13] -ROW:15 - Portland. Ma Cipriani's Restaurant. - -[BV_14] -ROW:17 - Portland. Basketball Court, Callahan. - -[BV_15] -ROW:18 - Portland. Bike Shop. - -[BV_16] -ROW:19 - Portland. Building near Basketball Court. - -[BV_17A] -ROW:20 - Portland. Luigi's Nightclub 1. - -[BV_17B] -ROW:20 - Portland. Luigi's Nightclub 2. - -[BV_17C] -ROW:20 - Portland. Luigi's Nightclub 3. - -[BV_18] -ROW:21 - Portland. Casa's Gourmet Deli. - -[BV_19] -ROW:22 - Portland. Rusty Ship. - -[BV_20] -ROW:23 - Portland. Door for Shopfront. - -[BV_21] -ROW:25 - Staunton. Casino. - -[BV_22] -ROW:26 - Staunton. Phil Cassidy's Store. - -[BV_23] -ROW:27 - Staunton. Zip store. - -[BV_24] -ROW:28 - Staunton. Container Park. - -[BV_25] -ROW:29 - Staunton. Ferry Terminal. - -[BV_26A] -ROW:30 - Staunton. Fort Staunton 1 NORTH. - -[BV_26B] -ROW:30 - Staunton. Fort Staunton 2 NORTH. - -[BV_27A] -ROW:30 - Staunton. Fort Staunton 1 SOUTH. - -[BV_27B] -ROW:30 - Staunton. Fort Staunton 2 SOUTH. - -[BV_28] -ROW:31 - Ferry - Not Visible At Present. - -[BV_29A] -ROW:32 - Staunton. Safehouse Exterior (unchanged). Press CIRCLE to swap. - -[BV_29B] -ROW:32 - Staunton. Safehouse Interior. Press CIRCLE to swap. - -[BV_30] -ROW:33 - Staunton. Steps Added To Building. - -[BV_31] -ROW:34 - Portland. Outbuilding. - -[BV_32A] -ROW:34 - Shoreside. Safehouse Exterior (unchanged). Press CIRCLE to swap. - -[BV_32B] -ROW:34 - Shoreside. Safehouse Interior. Press CIRCLE to swap. - -[BV_33] -Not in Doc - Staunton - Warehouse Interior (not internally approved). - -[BV_34A] -Not in Doc - Staunton - Church Exterior. Press CIRCLE to swap. - -[BV_34B] -Not in Doc - Staunton - Church Interior for scripted cutscene. Press CIRCLE to swap. - -[MODWOR] -Modify World Speed - -[MODTIT] -Changing World Speed - -[NEDS2] -The Passion Of The Heist - -[NEDS3] -Karmageddon - -[NEDS4] -False Idols - -[DONS1] -The Morgue Party Candidate - -[GAR_WIL] -Drive the car into the garage. - -[DONS2] -Steering The Vote - -[DONS3] -Cam-Pain - -[DONS4] -Friggin' The Riggin' - -[DONS5] -Love & Bullets - -[DONS6] -Counterfeit Count - -[DONS7] -Love On The Rocks - -[DONS7AA] -Toni, you gotta help me! - -[DONS7AB] -O'Donovan's got evidence linking me to Salvatore, we're sunk! - -[DONS7AC] -Calm down, evidence goes missing every day. - -[DONS7AD] -Not to mention judges, witnesses, jurors... - -[DONS7AE] -I'd hoped you'd see it that way. - -[DONS7AF] -One of my men has been following the guy with the evidence. - -[DONS7AG] -He'll meet you under the overpass in Newport. - -[SALS1] -A Walk In The Park - -[SALS2] -Making Toni - -[SALS3] -Caught In The Act - -[SALS4] -Search And Rescue - -[SALS5] -Taking The Peace - -[SALS6] -Shoot The Messenger - -[RAYS1] -Sayonara Sindaccos - -[RAYS2] -The Whole 9 Yardies - -[RAYS3] -Crazy '69' - -[RAYS4] -Night Of The Livid Dreads - -[RAYS5] -Munitions Dump - -[MC_01] -MOCAP Scenes - -[MC_02] -You cannot be on a mission when using the cutscene selector. - -[MC_04] -Select the scene you want and press CROSS. Press TRIANGLE to exit. - -[MC_03] -~g~scene name - script name~w~ - -[MC_S01] -1. Biker - mar4 - -[MC_S02] -2. Bonevoy - jdt1 - -[MC_S03] -3. Campain - dons3 - -[MC_S04] -4. Cashchp - tosh4 - -[MC_S05] -5. Contban - sal5 - -[MC_S06] -6. Crazy69 - rays3 - -[MC_S07] -7. Cuttest - none - -[MC_S08] -8. Deadly - tosh1 - -[MC_S09] -9. Donprob - donh6 - -[MC_S10] -10. Drivnmr - sal8 - -[MC_S11] -11. Electon - dons7 - -[MC_S12] -12. Homswet - vic1 - -[MC_S13] -13. Hotwhel - vic6 - -[MC_S14] -14. Kidnapp - jdt5 - -[MC_S15] -15. Landgrb - donh1 - -[MC_S16] -16. Morgue - dons1 - -[MC_S17] -17. Overdos - mar5 - -[MC_S18] -18. Rufjust - salh1 - -[MC_S19] -19. Sayonar - rays1 - -[MC_S20] -20. sicilan - salh5 - -[MC_S21] -21. Theofer - sal1 - -[MC_S22] -22. Intro - -[MC_S23] -23. Final - -[MC_S24] -24. Final_2 - -[NEDS1] -L.C. Confidential - -[WILGAR2] -Leave the car and get outside. - -{=================================== MISSION TABLE SAL1 ===================================} - -[SAL1_M1:SAL1] -~w~Salvatore wants to talk. - -[SAL1_M2:SAL1] -~w~I'm not playing Salvatore's game. - -[SAL1_M3:SAL1] -~w~Thanks for the donation, kid... see you around. - -[SAL1_M5:SAL1] -~w~Hey! - -[SAL1_D1:SAL1] -~w~Hey! Strike breaker! - -[SAL1_D2:SAL1] -~w~Get him! - -[SAL1_D3:SAL1] -~w~There he is! - -[SAL1_D4:SAL1] -~w~He's over there! - -[SAL1_E1:SAL1] -~w~Escape from the docks! - -[SAL1_A1:SAL1] -~w~Meet the Union boss, Jane Hopper, at ~y~Portland Docks. - -[THEO_01:SAL1] -Eh, boss, you okay? - -[THEO_02:SAL1] -Do I look okay? - -[THEO_03:SAL1] -No. - -[THEO_04:SAL1] -Then what are you? A fuckin' moron? - -[THEO_05:SAL1] -You're always saying the obvious. - -[THEO_06:SAL1] -I can't believe I'm surrounded by people like you. - -[THEO_07:SAL1] -Sorry. - -[THEO_08:SAL1] -Listen, I'm sorry. Toni, you're one of my most trusted allies. - -[THEO_09:SAL1] -After what you did, you're like a son to me - better than my son, - -[THEO_10:SAL1] -better than any son. - -[THEO_11:SAL1] -Your mother's a lucky woman. - -[THEO_12:SAL1] -So I hear. - -[THEO_13:SAL1] -Anthony, its over for guys like us. - -[THEO_14:SAL1] -We're dinosaurs. Or dodos. Or dildos. Or something. - -[THEO_15:SAL1] -I tell you, even in my own family I feel like Jesus surrounded by twelve Judases. - -[THEO_16:SAL1] -I mean, listen to this; - -[THEO_17:SAL1] -I got a union boss - a broad no less - that I need to do me a favor, - -[THEO_18:SAL1] -and she asks me for money? - -[THEO_19:SAL1] -All I wanted was 24 hour access to the docks, while the strike was going on, - -[THEO_20:SAL1] -strikes that I helped organize, so my boys could offload some drugs, - -[THEO_21:SAL1] -and now I get this horse shit! - -[THEO_22:SAL1] -I mean these are people that I personally fought for, - -[THEO_23:SAL1] -people I've killed for, honest people. - -[THEO_26:SAL1] -It's a disgrace. We're finished, men of honor like you and me. - -[THEO_27:SAL1] -Listen, Toni, I want you to take something to her. - -[THEO_28:SAL1] -You're gonna take this crap off a broad? - -[THEO_29:SAL1] -For now what choice do I have? - -[THEO_30:SAL1] -Look, go down there, pay her off - and tell her I'd like to have a word with her. - -[THEO_31:SAL1] -Go. - -[THEO_24:SAL1] -- And this is how they repay me? ~n~ - It's insulting. - -{=================================== MISSION TABLE SAL2 ===================================} - -[SAL2_N:SAL2] -Girls - -[SAL2_A0:SAL2] -~w~Is this one of your new doggies, Sal? - -[SAL2_A1:SAL2] -~w~Mr. Leone? - -[SAL2_A2:SAL2] -~w~Toni! Come sta? - -[SAL2_A3:SAL2] -~w~I'm glad you showed up. I want you to do something for me... - -[SAL2_A4:SAL2] -~w~If I can't get that bitch of a union boss on my side, I can sure as shit get her guys to play along. You capiche? - -[SAL2_A:SAL2] -~w~Collect six ~b~hookers~w~ and take them to the picket line at Portland Docks. - -[SAL2_B0:SAL2] -~w~Honey! I don't dig on that two girl - one guy shit! - -[SAL2_B1:SAL2] -~w~When you get more room, we'll get a room! I ain't traveling on no roof rack, Sugar! - -[SAL2_D0:SAL2] -~w~Are you all alone, Sweetie? - -[SAL2_D1:SAL2] -~w~Hey, good-lookin'! You wanna have some fun? - -[SAL2_D2:SAL2] -~w~Honey... you and me are gonna party! - -[SAL2_D3:SAL2] -~w~So, where's the party, Sugar? - -[SAL2_D4:SAL2] -~w~Hey, baby! Looking for a good time? - -[SAL2_D5:SAL2] -~w~Hi, Sugar! ...I'm Candy! - -[SAL2_F0:SAL2] -~w~Hey! I'm coming too! - -[SAL2_F1:SAL2] -~w~So it's just you and me now huh? - -[SAL2_F2:SAL2] -~w~Are we gonna get it on or what? - -[SAL2_F3:SAL2] -~w~So, where's the party? - -[SAL2_F4:SAL2] -~w~Aw, gee! Don't be like that. - -[SAL2_F5:SAL2] -~w~I just wanna party with ya! - -[SAL2_G0:SAL2] -~w~Take her to the ~y~picket line! - -[SAL2_G1:SAL2] -~w~Take the girls to the ~y~picket line! - -[SAL2_G2:SAL2] -~w~Deal with the ~r~client! - -[SAL2_G3:SAL2] -~w~Deal with the ~r~clients! - -[SAL2_G4:SAL2] -~w~Pick up more ~b~girls! - -[SAL2_H:SAL2] -~w~So, where's the party, Sugar? - -[SAL2_P:SAL2] -~w~Have fun guys! Compliments of Salvatore Leone! - -[SAL2_I0:SAL2] -~w~Get your own girl! Butt-head! This one's mine! - -[SAL2_I1:SAL2] -~w~Hey! What are you, some kind of peeping tom! - -[SAL2_I3:SAL2] -~w~Hey! Who the Hell is that! Let's get him! - -[SAL2_I5:SAL2] -~w~Hey, Buddy! Get in line! We were here first. - -[SAL2_I7:SAL2] -~w~You're the best! Don't stop... oh yeah, daddy! - -[SAL2_I9:SAL2] -~w~So get busy... - -[SAL2_K0:SAL2] -~w~Never mess with Toni Cipriani! - -[SAL2_K1:SAL2] -~w~Come on! Let's go! - -[SAL2_K2:SAL2] -~w~Let's go girl! Move your ass! - -[SAL2_C0:SAL2] -~w~Hey! Come back, Baby! ...I ain't gonna bite! - -[SAL2_C1:SAL2] -~w~Hey! Baby! Where you goin'? - -[SAL2_L0:SAL2] -~w~I ain't waiting around here all day asshole! - -[SAL2_L1:SAL2] -~w~Honey, I'm running a meter here! - -[SAL2_X0:SAL2] -~r~Out of time! - -[SAL2_X1:SAL2] -~r~You've killed too many hookers! - -[SAL2_X2:SAL2] -~r~You attacked the dockers. They'll never trust you now! - -[SAL2_X3:SAL2] -~r~You attacked the dockers' girls. They'll never trust you now! - -[SAL2_G5:SAL2] -~w~Looks like you've got an admirer. - -[SAL2_I8:SAL2] -~w~Honey, you don't want to go to jail do you? - -[SAL2_I6:SAL2] -~w~Yes! Yes! ... - -[SAL2_M:SAL2] -~w~Try not to kill them! Find another ~b~girl. - -[SAL2_W1:SAL2] -~w~You only have until 0~1~:~1~ before the picket line changes shift! - -[SAL2_W2:SAL2] -~w~You only have until ~1~:~1~ before the picket line changes shift! - -[SAL2_G6:SAL2] -~w~Stop in the ~y~yellow marker~w~ to drop the girls off. - -[SAL2_G7:SAL2] -~w~Disturb the client to get the ~b~girl~w~ out of the car. - -[SAL2_B:SAL2] -~w~You can't fit any more girls in your car. - -{=================================== MISSION TABLE SAL3 ===================================} - -[SAL3_A0:SAL3] -~w~Toni! How are you my boy? - -[SAL3_A1:SAL3] -~w~You look a little thin. Isn't your mamma feeding you right? - -[SAL3_A2:SAL3] -~w~I'm good Mr. Leone. - -[SAL3_A3:SAL3] -~w~Listen, these union guys - they're getting me pissed. - -[SAL3_A5:SAL3] -~w~...but we just need to turn up the heat on some of the 'less than receptive' union big shots. - -[SAL3_B0:SAL3] -~w~Scare the ~r~union big shots.~w~ Make sure they get the picture! - -[SAL3_B3:SAL3] -~w~They should do as they're told from now on. - -[SAL3_BA:SAL3] -~w~You're crazy man! I don't want no more trouble! - -[SAL3_CA:SAL3] -~w~What are you doing? Are you crazy?! - -[SAL3_DA:SAL3] -~w~I only had two more payments on that car! You son of a bitch! - -[SAL3_BB:SAL3] -~w~From now on you do as you're told! - -[SAL3_CB:SAL3] -~w~Stay out of Leone business! - -[SAL3_A4:SAL3] -~w~It looks like some of them are starting to see things my way - -[SAL3_A6:SAL3] -~w~You know what I'm talking about? - -[SAL3_B1:SAL3] -~w~You can't make your point if they're all dead. Don't kill any more ~r~union bosses! - -[SAL3_B2:SAL3] -~r~You're supposed to scare 'em, not kill 'em! - -[SAL3_B4:SAL3] -~w~Find another ~r~union boss~w~ to set straight. - -{=================================== MISSION TABLE SAL5 ===================================} - -[SAL5_D3:SAL5] -~w~Drive the ~h~vehicle ~w~into the garage. - -[SAL5_D4:SAL5] -~w~Get out of the vehicle and leave the ~h~garage. - -[SAL5_B:SAL5] -~w~Get a vehicle with four seats and pick up some ~b~backup. - -[SAL5_C:SAL5] -~w~You'll need a vehicle with four seats. - -[SAL5_C0:SAL5] -~w~Pick up your ~b~backup. - -[SAL5_C1:SAL5] -~w~You will need a vehicle with more seats to carry more ~b~backup. - -[SAL5_C2:SAL5] -~w~Head down to ~y~Portland Docks. - -[SAL5_AA:SAL5] -~w~Heeey... Ese... you were supposed to be here hours ago! - -[SAL5_AB:SAL5] -~w~Quit whining Miguel. You got the stuff? - -[SAL5_AG:SAL5] -~w~...you got our money? - -[SAL5_AH:SAL5] -~w~Sure... - -[SAL5_AI:SAL5] -~w~What? - -[SAL5_AJ:SAL5] -~w~You greaseball fuck! - -[SAL5_C8:SAL5] -~w~Get in the drugs ~b~vehicle~w~ and get the hell out of there! - -[SAL5_C9:SAL5] -~w~Take the vehicle to ~y~Salvatore's lockup. - -[SAL5_D1:SAL5] -~w~Get back into the ~b~vehicle! - -[SAL5_D2:SAL5] -~r~The drugs were destroyed! - -[SAL5_AF:SAL5] -~w~Heh heh ha! I like you Toni. You got big balls - like a bull! - -[SAL5_C3:SAL5] -~w~Lose the cops! - -[SAL5_D5:SAL5] -~r~The drugs have been seized! - -[SAL5_AD:SAL5] -~w~Hey, I'm a busy man Toni. Next time I'll find another buyer! - -[SAL5_AE:SAL5] -~w~Yeah, I doubt you'd find anyone else who pays what we do. - -[SAL5_D6:SAL5] -~w~Take out the ~r~drug dealers. - -[CONT_01:SAL5] -Shut up, you ungrateful bitch. - -[CONT_06:SAL5] -That's the only time you touch me these days. - -[CONT_07:SAL5] -Why the fuck would I wanna touch you? - -[CONT_08:SAL5] -I don't like used goods. - -[CONT_09:SAL5] -You revolt me. - -[CONT_12:SAL5] -Oh please. You know what? - -[CONT_15:SAL5] -Hi, Toni... - -[CONT_16:SAL5] -I want my money, old man! - -[CONT_17:SAL5] -Get outta here, you tramp. - -[CONT_18:SAL5] -Hey, Anthony, you're an angel of mercy. - -[CONT_19:SAL5] -Women, what are you gonna do about them, huh? - -[CONT_20:SAL5] -Luckily, I can trust someone in my life - you, Toni. - -[CONT_21:SAL5] -You're very important to me. Did I ever tell you that? - -[CONT_22:SAL5] -You can't even get it up you old bastard. - -[CONT_23:SAL5] -Not for you. I don't like using public toilets, you slut! - -[CONT_24:SAL5] -Very important. So listen - it's you and me now. We're in charge. - -[CONT_25:SAL5] -We've got those fools on the run. - -[CONT_26:SAL5] -How would you know? You're more interested in hanging out with men! - -[CONT_27:SAL5] -And you're only happy when you've got your drawers around your ankles - -[CONT_28:SAL5] -and your back against a wall! - -[CONT_29:SAL5] -Christ - I've met rabbits who like to fuck less than you! - -[CONT_33:SAL5] -Anyway, I got a shipment of you know what coming in. - -[CONT_34:SAL5] -This is going to put us - you and me - on the map big time. - -[CONT_35:SAL5] -Everything should run smooth. - -[CONT_36:SAL5] -I just need someone - someone I trust - to take care of things for me. - -[CONT_37:SAL5] -Alright Toni, I'll talk to you later. - -[CONT_38:SAL5] -And another thing - I never met a girl with hydraulic underwear. - -[CONT_39:SAL5] -It amazes me! Christ! Why did I marry her? - -[CONT_40:SAL5] -I was looking for a tramp, I married a slut! - -[CONT_41:SAL5] -I must have really pissed someone off in my past life, - -[CONT_42:SAL5] -I'll tell you that much. - -[CONT_02:SAL5] -- I'll knock you into next week if I hear another word from you. ~n~ - Oh, that's right, big dick. - -[CONT_04:SAL5] -- What are you gonna do? Hit me? ~n~ - Why I oughta... - -[CONT_10:SAL5] -- Me? Revolt you? What? ~n~ - Yeah! Revolt! - -[CONT_13:SAL5] -- My daddy was right when he said you were nothing but a fat slob... ~n~ - Yeah yeah yeah yeah... - -[CONT_43:SAL5] -- So listen, this is important... ~n~ - Fuck you, Salvatore Leone, - -[CONT_31:SAL5] -- you no dick bullying wife beating piece of Italian shit. ~n~ - Fuck me? Fuck you! In fact, everyone has! - -{=================================== MISSION TABLE SAL4 ===================================} - -[SAL4_I1:SAL4] -~w~This strike will continue until I get some assurances from this city! - -[SAL4_I2:SAL4] -~w~Mafiosi, thinking they can run the union, can think again! - -[SAL4_I3:SAL4] -~w~They don't scare me! - -[SAL4_I4:SAL4] -~w~I've got bigger balls than all of them! - -[SAL4_I5:SAL4] -~w~Listen to this shit. - -[SAL4_I6:SAL4] -~w~I should call a hit on this bitch. She's taking me for a ride! - -[SAL4_I7:SAL4] -~w~...well two can play at that game. - -[SAL4_I8:SAL4] -~w~Toni, you're gonna deliver a message for me! - -[SAL4_A2:SAL4] -~w~Now remove the ~r~Chauffeur~w~ from the equation. - -[SAL4_A3:SAL4] -~w~Hey! - -[SAL4_A4:SAL4] -~w~Get in the ~b~Limo. - -[SAL4_A5:SAL4] -~w~Get the Limo back to the ~y~Radio Station! - -[SAL4_A6:SAL4] -~w~Now, wait for Hopper. - -[SAL4_A7:SAL4] -~w~Put the Limo back in the correct position. Hopper must not suspect anything is wrong. - -[SAL4_B1:SAL4] -~w~Harwood Ferry Station, and step on it! - -[SAL4_B2:SAL4] -~w~You said it! - -[SAL4_C1:SAL4] -~w~Scare the hell out of Hopper! - -[SAL4_C2:SAL4] -Scare - -[SAL4S1:SAL4] -~w~Hey, take it easy, we're not in a race! - -[SAL4S2:SAL4] -~w~Are we going the right way? - -[SAL4S3:SAL4] -~w~Hey, you're not my regular driver! - -[SAL4S4:SAL4] -~w~Who the hell are you?! - -[SAL4S5:SAL4] -~w~Shut up! - -[SAL4S6:SAL4] -~w~From now on you do exactly what Salvatore Leone tells you to! - -[SAL4S7:SAL4] -~w~Capiche? - -[SAL4S8:SAL4] -~w~I... I refuse to be scared by this! - -[SAL4S9:SAL4] -~w~We'll see! - -[SAL4S10:SAL4] -~w~Let me out right now! - -[SAL4S11:SAL4] -~w~Please! You'll kill us both! - -[SAL4S12:SAL4] -~w~Noooooo! - -[SAL4S13:SAL4] -~w~What did I do to deserve this? - -[SAL4_F1:SAL4] -~w~Where's my limo? - -[SAL4_F2:SAL4] -~w~You're not my driver, I'm calling the police! - -[SAL4_F3:SAL4] -~r~Too late, Hopper is on to you! - -[SAL4_F4:SAL4] -~w~Salvatore can get screwed! - -[SAL4_F5:SAL4] -~r~The Limo's been destroyed! - -[SAL4_F6:SAL4] -~r~Hopper is dead! - -[SAL4_F7:SAL4] -~r~Hopper got away! - -[SAL4_F8:SAL4] -~r~The beat up Limo spooked Hopper. - -[SAL4_F9:SAL4] -~r~Hopper was spooked. - -[SAL4_P1:SAL4] -~w~OK! OK! I've had enough! - -[SAL4P1A:SAL4] -~w~I'll do whatever you want. - -[SAL4_P2:SAL4] -~w~Take Hopper to the ~y~ferry station picket line. - -[SAL4_P3:SAL4] -~w~And don't forget our little agreement, Lady! - -[SAL4_H1:SAL4] -~w~A variety of speed, collisions, and stunt jumps should scare Hopper into submission. - -[SAL4_F0:SAL4] -~r~Too late! Hopper has left the radio station! - -[SAL4_A:SAL4] -~w~Make it to the ~y~Radio Station~w~ before Hopper leaves at 0~1~:00. - -[SAL4_A1:SAL4] -~w~Make it to the ~y~Radio Station~w~ before Hopper leaves at ~1~:00. - -{=================================== MISSION TABLE SAL6 ===================================} - -[SAL6_A0:SAL6] -~w~Toni, we got trouble. Big trouble! - -[SAL6_A1:SAL6] -~w~What is it Sal? - -[SAL6_A3:SAL6] -~w~They're kicking our asses! - -[SAL6_A4:SAL6] -~w~We just finish one God-damn war and BANG! We're right in the middle of another! - -[SAL6_A5:SAL6] -~w~I swear - just when things were looking up - I'm cursed! I'm fucking cursed! - -[SAL6_A6:SAL6] -~w~Hey! Don't worry about a thing boss! I'll deal with this. - -[SAL6_AA:SAL6] -~w~Sal has left the weapons you'll need in the garage. - -[SAL6_B:SAL6] -~w~Stop the ~r~Diablo~w~ onslaught before all the Leone wise-guys are killed! - -[SAL6_1:SAL6] -~w~Only ~1~ Leones are left alive! - -[SAL6_2:SAL6] -~w~Only 1 Leone is left alive! - -[SAL6_C1:SAL6] -~w~We're getting massacred here, Toni! - -[SAL6_C2:SAL6] -~w~I don't get paid enough for this shit, man! - -[SAL6_C3:SAL6] -~w~You're crazy Toni! We're all gonna die! - -[SAL6_E1:SAL6] -~w~Sal? - -[SAL6_E2:SAL6] -~w~Toni! Is it over? How'd it go? - -[SAL6_E3:SAL6] -~w~It's not good Sal. - -[SAL6_E4:SAL6] -~w~I saved a few guys, but we'd lost too many before I got here. - -[SAL6_E5:SAL6] -~w~I think we're gonna lose this part of town. - -[SAL6_E6:SAL6] -~w~Over my dead body! This ain't done yet! - -[SAL6_E7:SAL6] -~w~I ain't losing shit! The Leones don't retreat from nothing! - -[SAL6_E8:SAL6] -~w~Are you hearing me, Toni? - -[SAL6_E9:SAL6] -~w~You said it Sal. - -[SAL6_G0:SAL6] -~r~All of the Leone men are dead. - -[SAL6_Z1:SAL6] -Leones - -[SAL6_Z2:SAL6] -Diablos - -[SAL6_X0:SAL6] -Got threat - -[SAL6_X1:SAL6] -Had threat - -[SAL6_X2:SAL6] -Find threat - -[SAL6_X3:SAL6] -Complain - -[SAL6_C0:SAL6] -~w~Screw them! Let's get the fuck outta here! - -[SAL6_A2:SAL6] -~w~What's the world coming to? We got the Diablos crawling all over us in Hepburn! - -{=================================== MISSION TABLE SAL7 ===================================} - -[SAL7_01:SAL7] -~w~Hey, Sal! - -[SAL7_02:SAL7] -~w~Toni! What do you think of the new car? - -[SAL7_05:SAL7] -~w~She's a beauty, huh? Fully loaded, top of the line. - -[SAL7_A6:SAL7] -~w~...oh, yeah, Mid-Life Crisis! - -[SAL7_07:SAL7] -~w~Shut up! Toni listen. - -[SAL7_08:SAL7] -~w~I got a shit load of money that needs to be picked up from my warehouse down at Callahan Point. - -[SAL7_10:SAL7] -~w~I don't trust anyone else to do this. - -[SAL7_11:SAL7] -~w~Are you girls gonna talk all day, or are we driving? - -[SAL7_12:SAL7] -~w~God-damn it woman! Did I tell you you could speak? - -[SAL7_20:SAL7] -~w~Come on! Hurry up! - -[SAL7_21:SAL7] -~w~Okay... - -[SAL7_22:SAL7] -~w~Let's go! - -[SAL7_23:SAL7] -~w~Hey, Toni! Come sta? - -[SAL7_30:SAL7] -~w~Go to the ~y~warehouse. - -[SAL7_40:SAL7] -~w~Collect all of Salvatore's money before it goes up in flames! - -[SAL7_50:SAL7] -~w~Take the loot back to ~y~Salvatore's. - -[SAL7_NM:SAL7] -~w~Get back in there! You haven't got all of the ~g~money. - -[SAL7_E1:SAL7] -~w~Kill him! - -[SAL7_E2:SAL7] -~w~Die! - -[SAL7_E3:SAL7] -~w~There's one! - -[SAL7_E4:SAL7] -~w~I can see him! - -[SAL7_T1:SAL7] -~w~Back off! - -[SAL7_T2:SAL7] -~w~How you feeling now! - -[SAL7_T3:SAL7] -~w~Come on! - -[SAL7_T4:SAL7] -~w~Eat this! - -[SAL7_F1:SAL7] -~r~You didn't collect Salvatore's money in time! - -[SAL7_06:SAL7] -~w~What's that smell? - -[SAL7_42:SAL7] -~w~Collect the ~g~money~w~ before it goes up in flames! - -{=================================== MISSION TABLE SAL8 ===================================} - -[SAL8_VE:SAL8] -~r~v1.2 - -[SAL8_11:SAL8] -~w~Get a car Toni and let's get moving... - -[SAL8_12:SAL8] -~w~Head towards the ferry terminal. - -[SAL812A:SAL8] -~w~But the strike's still on... there won't be any ferries. - -[SAL812B:SAL8] -~w~Just drive. I'll do the thinking. - -[SAL8_14:SAL8] -~w~Jesus Christ! The cops are crawling all over this place! Get us the fuck out of here! - -[SAL8_15:SAL8] -~w~Where're we going? - -[SAL8_16:SAL8] -~w~Callahan Bridge! - -[SAL816A:SAL8] -~w~...Callahan Bridge ain't finished yet! - -[SAL816B:SAL8] -~w~We're both gonna be finished if you don't drive! Now move it! - -[SAL816C:SAL8] -~w~Head for ~y~Callahan Bridge. - -[SAL8_17:SAL8] -~w~What the Hell are you doing? - -[SAL8_18:SAL8] -~w~Toni! We're gonna need a car! - -[SAL818A:SAL8] -~w~I ain't planning on walking outta here! - -[SAL8_19:SAL8] -~w~You left ~b~Salvatore~w~ behind. Go back and get him! - -[SAL8_20:SAL8] -~w~Get us out of here! - -[SAL8_22:SAL8] -~w~Toni, you did it! I knew I could trust you! - -[SAL822B:SAL8] -Now listen, I know a safe place where we can both lie low for a while. - -[SAL822C:SAL8] -Come on let's go. - -[SAL8_25:SAL8] -~w~We're gonna need everything this piece of shit's got! Punch it Toni! - -[SAL825A:SAL8] -~w~OH, SHIIIIIIIIIIIIIT! - -[SAL8_26:SAL8] -Jump Speed - -[SAL8_27:SAL8] -~w~Yeah. This is the place. - -[SAL8_28:SAL8] -~w~I'm gonna take a look around. See what's what. - -[SAL828A:SAL8] -~w~I might see you here later. - -[SAL8_29:SAL8] -~r~Sal was killed! - -[SAL829A:SAL8] -~w~The cops have spotted you! - -[SAL831:SAL8] -~w~Staunton safehouse now available! - -[SAL833:SAL8] -~w~Get away from the cops! - -[SAL823A:SAL8] -~w~Or has it? - -[SAL8_24:SAL8] -~w~Although all the Subway and Ferry routes are now officially open, - -[SAL824A:SAL8] -~w~militant workers are continuing with their blockade in parts of the city. - -[SAL824B:SAL8] -~w~The Elevator Bridge connecting Staunton Island and Shoreside Vale has been shut down. - -[SAL824C:SAL8] -~w~The strikers refuse to believe assurances made by city officials over the future of the ferries. - -[SAL824D:SAL8] -~w~On a more positive note, the new Callahan bridge is nearing completion. - -[SAL824E:SAL8] -~w~But, this Liberty City commuter couldn't face further delays. - -[SAL8_23:SAL8] -~w~The industrial action that had cut off Portland from the rest of the city has finally come to an end. - -[SAL812C:SAL8] -~w~Get to the ~y~ferry terminal. - -[SAL8WAN:SAL8] -The cops REALLY want Salvatore! Re-spraying the vehicle will only put them off the scent for a short time. - -[SAL8_21:SAL8] -~w~Head for the ~y~Bridge! - -[SAL830:SAL8] -~w~Head over to the ~y~Safe House. - -[SAL822A:SAL8] -~w~I could kiss you if you'd shaved! - -[SAL832:SAL8] -~w~You need to get some wheels! - -[DRIV_01:SAL8] -Well? - -[DRIV_02:SAL8] -Well what? - -[DRIV_03:SAL8] -Don't play dumb with me, kid. - -[DRIV_06:SAL8] -I know what you've been saying about me. - -[DRIV_07:SAL8] -You think I'm an idiot? Huh? - -[DRIV_08:SAL8] -Is that what you think? - -[DRIV_09:SAL8] -Boss, I ain't been saying nothin' about you. - -[DRIV_10:SAL8] -What the fuck. I don't know what's happening to me. - -[DRIV_11:SAL8] -Jesus. - -[DRIV_12:SAL8] -I'm getting paranoid Toni. Really fucking paranoid. - -[DRIV_13:SAL8] -Just because I think everyone hates me doesn't mean they don't, know what I mean? - -[DRIV_14:SAL8] -Someone is out to get me. It's that fucking mayor! - -[DRIV_15:SAL8] -He's gonna blame me for all the shit that's been going down in the neighborhood. - -[DRIV_16:SAL8] -All of it! Not just the crap that I did but all of it. - -[DRIV_17:SAL8] -Come on, let's go take care of this. - -[DRIV_04:SAL8] -- I was playing dumb when your mother was still turning tricks. ~n~ - What's your problem? - -{=================================== MISSION TABLE JDT1 ===================================} - -[JDT1_CA:JDT1] -~w~I'm sure the girls are ripping me off. - -[JDT1_CB:JDT1] -~w~We'd better trawl the neighborhood and see what's up. - -[JDT1_DA:JDT1] -~w~That's one of my girls! - -[JDT1_DB:JDT1] -~w~Hey! I recognize that girl. - -[JDT1_DC:JDT1] -~w~She's one of my girls. - -[JDT1_DD:JDT1] -~w~That girl's one of ours. - -[JDT1_DE:JDT1] -~w~That girl right there... - -[JDT1_DF:JDT1] -~w~Stop near her. - -[JDT1_DG:JDT1] -~w~Pull up next to her. - -[JDT1_DH:JDT1] -~w~Let's pick her up. - -[JDT1_DI:JDT1] -~w~Park right by her. - -[JDT1_DJ:JDT1] -~w~Drive over to her. - -[JDT1_MA:JDT1] -~w~Hi JD. I was just about to bring this to you, honest! - -[JDT1_MB:JDT1] -~w~Jeez! Don't you trust me no-more JD? - -[JDT1_MC:JDT1] -~w~Hey JD. It's been a slow day... this is all I got. - -[JDT1_MD:JDT1] -~w~Talk about big brother! Here's your stinking money! - -[JDT1_ME:JDT1] -~w~Hey JD. I got your money right here. - -[JDT1_MF:JDT1] -~w~Did you think I wasn't gonna bring this to you or something? - -[JDT1_MG:JDT1] -~w~Are you checking up on us girls JD. - -[JDT1_MH:JDT1] -~w~It's all there... count it if you want! - -[JDT1_EA:JDT1] -~w~Hey! That pimp is ripping off one of my girls! - -[JDT1_EB:JDT1] -~w~Get the money back Toni! - -[JDT1_EC:JDT1] -~w~What the hell is that pimp doing? - -[JDT1_ED:JDT1] -~w~He's taking my money! - -[JDT1_EE:JDT1] -~w~Get him Toni! - -[JDT1_45:JDT1] -~w~Get the pimp's ~g~money. - -[JDT1_46:JDT1] -~w~The pimp got away! - -[JDT1_FA:JDT1] -~w~That's one of my girls in that car! - -[JDT1_FB:JDT1] -~w~Reverse up to the ~b~car~w~, nice and close so I can get a look-see. - -[JDT1_FC:JDT1] -~w~...nice and easy now, we don't want to disturb them! - -[JDT1_FD:JDT1] -~w~Closer... - -[JDT1_FE:JDT1] -~w~Closer... - -[JDT1_FF:JDT1] -~w~Easy... - -[JDT1_IA:JDT1] -~w~For crying out loud, Toni! You scared 'em off! - -[JDT1_GA:JDT1] -~w~Jeez Toni! I can't see a God-damn thing! - -[JDT1_75:JDT1] -~w~Wait for the ~b~girl~w~ to give JD her money! - -[JDT1_HA:JDT1] -~w~...oh yeah! - -[JDT1_HB:JDT1] -~w~Go on baby! - -[JDT1_HC:JDT1] -~w~That's it. That's it. - -[JDT1_HD:JDT1] -~w~...oh YEAH! - -[JDT1_HE:JDT1] -~w~This is just beautiful! - -[JDT1_HF:JDT1] -~w~Are we done here yet? - -[JDT1_JA:JDT1] -~w~Nice work Toni! - -[JDT1_JB:JDT1] -~w~I don't think the girls are gonna give me any more trouble on this shift. - -[JDT1_LA:JDT1] -~w~Toni! You screwed this up big time! - -[JDT1_LB:JDT1] -~w~I'm going back to the club! - -[JDT1_ML:JDT1] -~w~$~1~ left to collect! - -[JDT1O01:JDT1] -~w~Get in JD's ~b~van. - -[JDT1O02:JDT1] -~w~You've left ~b~JD~w~ behind. Go back and get him! - -[JDT1O03:JDT1] -~w~Wait for ~b~JD~w~ to get in. - -[JDT1O04:JDT1] -~w~Search for JD's girls in the Red Light District. - -[JDT1O05:JDT1] -~w~Go back to ~y~JD's club. - -[JDT1O07:JDT1] -~w~Stop near the ~b~girl. - -[JDT1O08:JDT1] -~w~Kill the ~r~pimp. - -[JDT1O09:JDT1] -~w~Collect money from one of JD's ~b~girls. - -[JDT1_F1:JDT1] -~r~JD's van has been destroyed! - -[JDT1_F2:JDT1] -~r~JD's dead! - -[JDT1_F3:JDT1] -~r~You didn't collect enough money during the shift! - -[JDT1_D1:JDT1] -~w~JD's girls work in the ~y~Red Light District.~w~ Get back there! - -[JDT1_F4:JDT1] -~r~Too many of JD's girls died! - -[JDT1_KA:JDT1] -~w~What the hell was that? - -[JDT1_KB:JDT1] -~w~Did we hit something? - -[JDT1_KC:JDT1] -~w~Careful with the ride, Toni! - -[JDT1_81:JDT1] -~w~You scared the John! He doesn't want an audience! - -[JDT1O10:JDT1] -~w~Approach the ~b~car~w~ in the alleyway. - -[JDT1O11:JDT1] -~w~Honk your horn to get their attention! - -[JDT1O12:JDT1] -~w~The longer you leave the girl working, the more money she will make. - -[JDT1_MO:JDT1] -Owed - -[JDT1_H1:JDT1] -~w~Use the ~k~ ~VEHN~ to honk your horn. - -[JDT1_WA:JDT1] -~w~Hurry up!~b~The girls'~w~ shift finishes at ~1~:~1~! - -[JDT1_WB:JDT1] -~w~Hurry up! The girls' shift finishes at ~1~:~1~! - -[JDT1O06:JDT1] -~w~Collect JD's money from his hookers. Be quick, their shift finishes at ~1~:~1~. - -[JDT1_WC:JDT1] -~w~Hurry up!~b~The girls'~w~ shift finishes at ~1~:0~1~! - -[JDT1_WD:JDT1] -~w~Hurry up! The girls' shift finishes at ~1~:0~1~! - -[JDT1P06:JDT1] -~w~Collect JD's money from his hookers. Be quick, their shift finishes at ~1~:0~1~. - -[BONE_01:JDT1] -Hey! JD get out here! - -[BONE_02:JDT1] -Hey JD, you little sicko, get the fuck out here, - -[BONE_03:JDT1] -before I come in there and break your legs! - -[BONE_04:JDT1] -I'm coming... but not like that, ha ha ha! - -[BONE_05:JDT1] -Hey, Toni, que pasa? Give us a hug. - -[BONE_06:JDT1] -Woah, you're sticky! - -[BONE_07:JDT1] -Oh, it's the stripper stuff they put all over me, you know. - -[BONE_08:JDT1] -They like it, you know. They put it anywhere and uh... so, how you doing? - -[BONE_09:JDT1] -What the fuck are you wearing? - -[BONE_10:JDT1] -What, this? I'm an adventurous lover. - -[BONE_11:JDT1] -You know I like... an experimental side, y'know? - -[BONE_16:JDT1] -See, that's the problem. We are getting ripped off. - -[BONE_17:JDT1] -Alright, now you wait here. - -[BONE_18:JDT1] -I gotta go change out of, uh... this thing, you know. - -[BONE_19:JDT1] -Hey Raven - time to put away the double ender. - -[BONE_20:JDT1] -Hey Toni, let's you and me go for a drive. - -[BONE_21:JDT1] -We got some things we gotta check out... Okay! Okay! - -[BONE_12:JDT1] -- Nothing wrong with that, huh? You can watch if you like. ~n~- Oh, you're sick. You better shut the fuck up, right now. - -[BONE_14:JDT1] -- Okay, relax Toni... ~n~ - Where's my money? - -{=================================== MISSION TABLE JDT2 ===================================} - -[JDT2_I1:JDT2] -~w~Thank God you're here Toni! - -[JDT2_I2:JDT2] -~w~I just had a tip off that the cops are gonna raid us! - -[JDT2_I3:JDT2] -~w~So? You've got a license. - -[JDT2_I4:JDT2] -~w~Not for some of the shit that goes on here! - -[JDT2_I5:JDT2] -~w~Salvatore is here, paying my girls a... 'Special' visit... you know? - -[JDT2_I6:JDT2] -~w~We gotta get him out of here before the cops arrive! - -[JDT2_I7:JDT2] -~w~Meet him out front! - -[JDT2_I8:JDT2] -~w~Never a dull moment. - -[JDT2_05:JDT2] -~w~Get me the hell out of here! - -[JDT2_06:JDT2] -~w~Toni? Lose the cops! I ain't taking these idiots home with me! - -[JDT2_A1:JDT2] -~w~Get in the ~b~car. - -[JDT2_A2:JDT2] -~w~Don't lose ~b~Salvatore!~w~ Go back and get him! - -[JDT2_A3:JDT2] -~w~Take Salvatore ~y~home. - -[JDT2_A5:JDT2] -~r~Salvatore is dead! - -[JDT2_C1:JDT2] -~w~You did well today son. I like your style. I always have. - -[JDT2_C2:JDT2] -~w~Thank you Mr. Leone. - -[JDT2_C3:JDT2] -~w~You know, I think Vincenzo is taking up too much of your time. - -[JDT2_C4:JDT2] -~w~I could use a good fella like you. - -[JDT2_C5:JDT2] -~w~Gimme a call some time. Uncle Sal will take care of you. - -[JDT2_A9:JDT2] -~r~Salvatore got busted! - -[JDT2_B2:JDT2] -~w~Lose the cops! - -[JDT2_A6:JDT2] -~w~Return to Salvatore's ~b~car~w~ before the cops bust him! - -[JDT2_F1:JDT2] -~r~You lost Salvatore! - -[JDT2_A4:JDT2] -~w~Drive Salvatore away from the club and lose the cops! - -{=================================== MISSION TABLE JDT3 ===================================} - -[JDT3_AA:JDT3] -~w~Hey Toni, I can't come out right now, I'm busy... you know? - -[JDT3_AB:JDT3] -~w~Why? What's going on in there? ...and what the hell is that smell? - -[JDT3_AC:JDT3] -~w~Look, Toni, we're catering for some real ah... specialists today. - -[JDT3_AD:JDT3] -~w~This stuff is internet gold-dust! - -[JDT3_AE:JDT3] -~w~What you should be concerning yourself with is that Leone gaming house, up in Saint Mark's. - -[JDT3_AG:JDT3] -~w~The Sindaccos are going nuts about it. - -[JDT3_AH:JDT3] -~w~I heard they're gonna blow the place off the map. - -[JDT3_B:JDT3] -~w~Take out the ~r~Sindacco saboteurs! - -[JDT3_C:JDT3] -~r~They've~w~ planted a bomb outside the ~y~casino! - -[JDT3_D:JDT3] -Bomb Explodes - -[JDT3_E:JDT3] -~w~Another couple like that and the ~y~Casino's~w~ out of business! - -[JDT3_F:JDT3] -~w~One more and the ~y~Casino's~w~ gone! - -[JDT3_H:JDT3] -~w~More ~r~Sindaccos~w~ are on the way! Stop them! - -[JDT3_I:JDT3] -~w~The truck-bomb's armed! - -[JDT3_J:JDT3] -~w~The ~y~Casino~w~ is safe. Get out of there! - -[JDT3_K:JDT3] -~w~They must have crippled the truck - it's stuck in low gear! - -[JDT3_L:JDT3] -~r~Sindacco reinforcements~w~ are heading for the ~y~Casino! - -[JDT3_M:JDT3] -~w~The ~r~Sindaccos~w~ haven't given up yet, more on the way! - -[JDT3_N:JDT3] -~w~They're getting out. Don't let any ~r~Sindaccos~w~ escape! - -[JDT3_O:JDT3] -Safe Distance - -[JDT3_P:JDT3] -~w~The Sindaccos have rigged a huge truck bomb! They're going to take out the Casino in one go! - -[JDT3_Q:JDT3] -~w~Defend the ~y~Casino. - -[JDT3_R:JDT3] -~w~Check out the ~y~Casino. - -[JDT3_S:JDT3] -~w~Stop the ~r~truck-bomb~w~ destroying the ~y~Casino! - -[JDT3_T:JDT3] -~w~Get the ~r~truck~w~ away from the ~y~Casino~w~ before it blows! - -[JDT3_BA:JDT3] -~w~Toni? It's JD. - -[JDT3_BB:JDT3] -~w~Look, I just heard there's a bunch of Sindacco goons coming your way. - -[JDT3_BC:JDT3] -~w~And they're packing, big-time! - -[JDT3_BD:JDT3] -~w~Watch yourself! - -[JDT3_BE:JDT3] -~w~Thanks JD! - -[JDT3_BF:JDT3] -~w~Appreciate it. - -[JDT3_G:JDT3] -~r~The Casino was destroyed! - -{=================================== MISSION TABLE JDT4 ===================================} - -[JDT4_3:JDT4] -~w~The Sindaccos guarding the Doll's House will only trust ~h~Sindacco cars. - -[JDT4_A1:JDT4] -~w~Classy, so you might lose at the tables, but you can bank on the ass! - -[JDT4_B0:JDT4] -~w~Get a suitable vehicle and fit it with a bomb. - -[JDT4_B1:JDT4] -~w~Get back in the ~b~vehicle~w~ with the bomb. - -[JDT4_B3:JDT4] -~w~Now, leave the vehicle and get out of there. - -[JDT4_B4:JDT4] -~w~Detonate the bomb! - -[JDT4_B5:JDT4] -~w~Take the vehicle to the ~h~Bomb Shop~w~ and have it fitted with a bomb. - -[JDT4_B6:JDT4] -~w~Don't get too close! - -[JDT4_C0:JDT4] -~r~You were too close to the explosion. - -[JDT4_C1:JDT4] -~w~This one is on JD! - -[JDT4_D0:JDT4] -~w~Who is that? - -[JDT4_D2:JDT4] -~w~Must be a new guy. - -[JDT4_0:JDT4] -COUNTDOWN - -[JDT4_1:JDT4] -~w~You can't fit a bomb to that! - -[JDT4_2:JDT4] -~w~Follow the ~h~Bomb blip~w~ on the radar to find ~h~8-Ball's Bomb Shop. - -[JDT4_A0:JDT4] -~w~So Toni, the Sindaccos' got this place - 'The Dolls House'. - -[JDT4_AA:JDT4] -~w~It's a casino AND bordello in one. - -[JDT4_A2:JDT4] -~w~Heh heh! Well, the place is key to their setup over here. - -[JDT4_A3:JDT4] -~w~If you were to, uh... put it out of business, you know, uh... blow it up or something. - -[JDT4_A4:JDT4] -~w~I'm telling you, we'll be golden with Salvatore! - -[JDT4_D1:JDT4] -~w~I don't recognize him... - -[JDT4_B2:JDT4] -~w~Take the vehicle and park it in the ~y~garage~w~ at 'The Doll's House'. - -[JDT4_B7:JDT4] -~w~Drive carefully, if it gets too damaged it will explode! - -[JDT4_B8:JDT4] -~w~Park the vehicle in the 'The Doll's House' ~y~garage. - -[JDT4_4:JDT4] -~w~Press~h~ ~k~ ~PDFW~ ~w~to ~h~detonate~w~ the bomb. - -[JDT4_B9:JDT4] -~w~The Sindaccos have defused the bomb! - -{=================================== MISSION TABLE JDT5 ===================================} - -[JDT5_B0:JDT5] -~w~That's one of the guys that took Salvatore! - -[JDT5_D0:JDT5] -~w~Where is he? In the trunk? - -[JDT5_D1:JDT5] -~w~Good. We're taking him to the crusher. The boss wants him flatter than pizza. - -[JDT5_E0:JDT5] -~w~They're onto you! - -[JDT5_E1:JDT5] -~w~The ~b~car~w~ is unattended! Take it! - -[JDT5_E2:JDT5] -~w~Take the car to ~y~Salvatore's. - -[JDT5_E3:JDT5] -~w~Get back in the ~b~car. - -[JDT5_F0:JDT5] -~w~Mmmphhh - mmmphhh - mpphh - -[JDT5_F3:JDT5] -~w~Mmpphh - arrgghh - mmpphh - -[JDT5_F4:JDT5] -~w~Mmpphh - arrgghh - arrggghh - arrg - -[JDT5_F5:JDT5] -~w~Yarrgghh - yarragh - mmpphh - -[JDT5_G0:JDT5] -~w~What kind of driving was that? You trying to kill me? - -[JDT5_G1:JDT5] -~w~Mr. Leone. Boss. I'm sorry. - -[JDT5_G2:JDT5] -~w~What can I tell ya? - -[JDT5_G4:JDT5] -~w~I'll tear their fucking hearts out! This doesn't end here! - -[JDT5_G5:JDT5] -~w~...for Christ sake Toni - you saved my ass - call me Sal! - -[JDT5_X0:JDT5] -~r~It's hard to follow a dead man. - -[JDT5_X1:JDT5] -~r~You lost him! - -[JDT5_F1:JDT5] -~w~Is that you Mr. Leone? It's me, Toni. - -[JDT5_F2:JDT5] -~w~Don't worry about a thing. I'm getting you out of there! - -[JDT5_G3:JDT5] -~w~Sons of Bitches! They think they can do that to me! - -[JDT5_X2:JDT5] -~r~Sal didn't make it! - -[JDT5_X4:JDT5] -~r~He's onto you. You'll never find Sal now! - -[JDT5_X3:JDT5] -~r~Salvatore was crushed! - -[JDT5_C:JDT5] -~w~Follow the ~r~car~w~, but keep a low profile. - -[JDT5_E:JDT5] -~w~Rescue Salvatore from the ~b~car~w~ before they crush it! - -[JDT5_0:JDT5] -~w~If you shoot at the car you might hit Salvatore! - -[JDT5_H0:JDT5] -~w~Follow the ~r~car,~w~ but don't get too close. - -[JDT5_H1:JDT5] -~w~You're too close! - -[JDT5_H2:JDT5] -~w~Don't get too far away and lose the ~r~car. - -[JDT5_H3:JDT5] -~w~You're too far behind! - -[KIDN_01:JDT5] -JD! - -[KIDN_02:JDT5] -Toni, thank god you're here. - -[KIDN_03:JDT5] -I'm sweating like my uncle in a school yard - my mind's going crazy. - -[KIDN_06:JDT5] -Oh God I can't believe it, he is gonna cut my balls off. - -[KIDN_07:JDT5] -He's gonna put them in a vice! Not necessarily in that order. - -[KIDN_08:JDT5] -Oh God! I feel like the day the FBI searched my hard drive! - -[KIDN_13:JDT5] -Oh God I can't believe this... - -[KIDN_14:JDT5] -Why am I to blame?! It's not my fault. - -[KIDN_15:JDT5] -But you know Salvatore, he's gonna get the vice squad on my ass. - -[KIDN_16:JDT5] -Oh my God, it's gonna be like those statutory rape charges. - -[KIDN_17:JDT5] -Have you ever been in prison on statutory rape charges, man? - -[KIDN_18:JDT5] -They come in at you at the showers! - -[KIDN_19:JDT5] -Oh God, and she was 18! Oh my God! This is gonna be worse! - -[KIDN_20:JDT5] -Listen you babbling cock sucker. What in god's name is wrong? - -[KIDN_04:JDT5] -- What are we gonna do? ~n~ - About what? - -[KIDN_11:JDT5] -- No, no... See I got too many of those... ~n~ - What's going on? - -[KIDN_09:JDT5] -Oh, my heart's racing. Have you got any vallion? - -[KIDN_10:JDT5] -Or rohapnin? What about... - -[KIDN_21:JDT5] -It's Salvatore. He was kidnapped while leaving the club. - -[KIDN_23:JDT5] -Well why didn't you say so? Instead of making me listen to that crap. Come on. - -{=================================== MISSION TABLE JDT6 ===================================} - -[JDT6_A0:JDT6] -~w~Thank God! Toni. - -[JDT6_A1:JDT6] -~w~JD? Hey, I'm at the back of... - -[JDT6_A2:JDT6] -~w~I know. I saw you go in. I've been praying you'd turn up! - -[JDT6_A3:JDT6] -~w~Salvatore's gone ape-shit! - -[JDT6_A6:JDT6] -~w~Make sure no harm comes to Salvatore. - -[JDT6_0:JDT6] -Sal's Health - -[JDT6_1:JDT6] -~r~Salvatore didn't make it. - -[JDT6_3:JDT6] -~w~Salvatore will be here in ~1~ seconds. - -[JDT6_5:JDT6] -~w~Protect ~b~Salvatore~w~ from the ~r~Sindaccos. - -[JDT6_6:JDT6] -~w~One of ~b~Salvatore's guards~w~ is dead! - -[JDT6_7:JDT6] -~w~Both of ~b~Salvatore's guards~w~ have been killed! - -[JDT6_8:JDT6] -~w~It's the cops! - -[JDT6_10:JDT6] -~w~Find a good vantage point before Salvatore gets here. - -[JDT6_11:JDT6] -~w~Where are you going? Salvatore needs protection in the Red Light District. - -[JDT6_12:JDT6] -Salvatore arrives - -[JDT6_D1:JDT6] -~w~Hey... - -[JDT6_D4:JDT6] -~w~Someone dropped a dollar! - -[JDT6_C0:JDT6] -~w~Is that the best you got? - -[JDT6_C1:JDT6] -~w~Come on! - -[JDT6_C2:JDT6] -~w~You fight like pussies! - -[JDT6_C3:JDT6] -~w~Oh, you want some! - -[JDT6_C4:JDT6] -~w~Eat this! - -[JDT6_C5:JDT6] -~w~You dirty rat bastards! - -[JDT6_C6:JDT6] -~w~Top of the world Ma! - -[JDT6_A4:JDT6] -~w~He's coming down here personally, to kill every Sindacco he can find... - -[JDT6_A5:JDT6] -~w~...so I took a hike. Look, I've put a rifle on the roof across the street. - -[JDT6_9:JDT6] -~w~Collect the ~g~sniper rifle~w~ on the roof. - -{=================================== MISSION TABLE JDT7 ===================================} - -[JDT7_VE:JDT7] -~r~v1.00 - -[JDT7_02:JDT7] -~w~So, Salvatore cleaned house, huh... and now he's fixing up yours! - -[JDT7_03:JDT7] -~w~It's all mine now, Toni! - -[JDT703A:JDT7] -~w~Those cock-sucking Sindaccos all been kicked out. - -[JDT7_04:JDT7] -~w~Listen, I hear the Sicilians are trying to broker peace between the families. - -[JDT7_4A:JDT7] -~w~Sal's got some heavy up at his place right now. - -[JDT7_4B:JDT7] -~w~The thing is; he smells a rat. - -[JDT7_4C:JDT7] -~w~He wants someone to get up there and follow this guy, see where he goes. - -[JDT7_06:JDT7] -~r~You failed to reach the helicopter in time, Massimo's already left! - -[JDT7_07:JDT7] -~w~Follow ~r~Massimo.~w~ Don't lose him! - -[JDT7_08:JDT7] -~r~He's~w~ going to get away! - -[JDT7_09:JDT7] -~r~You let Massimo get away! - -[JDT7_10:JDT7] -~w~The helicopter appears to be landing - don't get too close or you'll spook them.. - -[JDT7_11:JDT7] -~r~You got too close. You've been spotted! - -[JDT7_14:JDT7] -~r~He's~w~ moving off... follow ~r~him~w~ again... - -[JDT7_15:JDT7] -~w~Massimo~w~ looks to be landing up there... - -[JDT7_16:JDT7] -~w~You'll need to get in ~y~closer... - -[JDT7_17:JDT7] -~r~You've blown your cover! - -[JDT7_21:JDT7] -~w~You've been spotted! Take out the ~r~Triads! - -[JDT7_12:JDT7] -~w~Come siamo rimasti d'accordo, - -[JDT712A:JDT7] -~w~if you do my associates work for them, you'll be well rewarded. - -[JDT7_13:JDT7] -~w~...Hepburn Heights will belong to the Diablos. - -[JDT7_18:JDT7] -~w~...so, keep quei bastardi dei Leone tied down in Portland, - -[JDT718A:JDT7] -and when my associates control this city, you'll be taken care of. - -[JDT718B:JDT7] -Ci pensiamo noi. - -[JDT7_20:JDT7] -~w~Over there! It's a Leone! - -[JDT7_22:JDT7] -Distance - -[JD_FIN:JDT7] -~w~Finish off the ~r~Triads! - -[JDT7_05:JDT7] -~w~Reach ~y~Salvatore's mansion~w~ before Massimo leaves! - -[JDT7O07:JDT7] -~w~Reach ~y~Salvatore's mansion.~w~ Massimo is leaving at ~1~:~1~. - -[JDT7O08:JDT7] -~w~It's nearly ~1~:~1~. Massimo is about leave! - -{=================================== MISSION TABLE JDT8 ===================================} - -[JDT8_A0:JDT8] -~w~Toni... it's all happening today! I'm gonna be a 'Made Man', me! - -[JDT8_A1:JDT8] -~w~JD the untouchable? God help us all! - -[JDT8_A2:JDT8] -~w~I've waited a long time for this... it never woulda' happened without you Toni. - -[JDT8_A3:JDT8] -~w~Hey! I'm crying over here! Come on! - -[JDT8_A4:JDT8] -~w~Hey Mickey! How you doing? - -[JDT8_A5:JDT8] -~w~I'm getting in the back... okay. - -[JDT8_C:JDT8] -~w~Get in the ~b~car~w~ and drive JD to be 'Made'. - -[JDT8_C2:JDT8] -~w~Get back in the ~b~car. - -[JDT8_C3:JDT8] -~w~Drive to the ~y~ceremony. - -[JDT8_B0:JDT8] -~w~Ah, Toni, I tell ya! I can't believe this is happening. - -[JDT8_B1:JDT8] -~w~I've waited so long. - -[JDT8_B2:JDT8] -~w~I slaved for the Sindaccos for years and nothing! - -[JDT8_B3:JDT8] -~w~Those bastards kept me down - -[JDT8_B5:JDT8] -~w~But Salvatore, god bless him, he don't let a little thing like that get in the way. - -[JDT8_B6:JDT8] -~w~I tell ya! - -[JDT8_B7:JDT8] -~w~This is great! - -[JDT8_B8:JDT8] -~w~Toni, I'm so excited! - -[JDT8_B9:JDT8] -~w~Toni, I don't even know what do to with myself I'm so excited! - -[JDT8_BA:JDT8] -~w~Look at me, I can't believe this is happening! - -[JDT8_BB:JDT8] -~w~Finally, huh Toni? To be a 'made man'! - -[JDT8_D1:JDT8] -~w~Where's Salvatore? - -[JDT8_D2:JDT8] -~w~Toni, the first drink's on me... - -[JDT8_D3:JDT8] -~w~(PLACEHOLDER SFX) BANG! - -[JDT8_H0:JDT8] -~w~Hey, the guy was a fucking rat. - -[JDT8_H1:JDT8] -~w~He screwed over his own boss! Disgrazia'. - -[JDT8_H2:JDT8] -~w~Salvatore could never have trusted that mother fucker. - -[JDT8_H3:JDT8] -~w~Dump the fucking car in the river. - -[JDT8_H4:JDT8] -~w~You can drop me off on the way. - -[JDT8_J:JDT8] -~w~Get in the ~b~car~w~ and drive Mickey home. - -[JDT8_J1:JDT8] -~w~The cops have spotted you with the car! - -[JDT8_J2:JDT8] -~w~The cops have spotted you with the ~b~car! - -[JDT8_J3:JDT8] -~w~Get back in the ~b~car! - -[JDT8_J4:JDT8] -~w~Drop Mickey back at his ~y~place. - -[JDT8_K0:JDT8] -~w~I'm getting the hell outta here! - -[JDT8_K1:JDT8] -~w~Remember. Dump the car in the river. - -[JDT8_F:JDT8] -~w~Dump the car in the river. - -[JDT8_F1:JDT8] -~w~Dump the ~b~car~w~ in the river. - -[JDT8_G5:JDT8] -~r~JD's dead! - -[JDT8_G6:JDT8] -~r~Mickey's dead! - -[JDT8_G8:JDT8] -~r~You were supposed to drive the car into the river. - -[JDT8_X0:JDT8] -~w~Where are you going Toni? - -[JDT8_X3:JDT8] -~w~We're gonna be late. - -[JDT8_X1:JDT8] -~w~If the cops see the car like this, they'll pull us over for sure! - -[JDT8_X2:JDT8] -~w~The ceremony's in Harwood. - -[JDT8_A6:JDT8] -~w~Toni... it's all happening today! - -[JDT8_A7:JDT8] -~w~I'm gonna be a 'Made Man', me! - -[JDT8_A8:JDT8] -~w~JD the untouchable? - -[JDT8__1:JDT8] -~w~I've waited a long time for this... - -[JDT8__2:JDT8] -~w~It never woulda' happened without you Toni. - -[JDT8_A9:JDT8] -~w~God help us all! - -[JDT8_D0:JDT8] -~w~Hey, are we there? - -[JDT8_B4:JDT8] -~w~just 'cause of a little Irish blood in my veins. - -[JDT8_G7:JDT8] -~r~Your passengers are dead! - -[JDT8_C4:JDT8] -~w~Take out the ~r~Sindacco hitmen~w~ before they whack JD! - -[JDT8_0:JDT8] -~w~Re-spraying the car will buy you some time, but as soon as the cops see the stiff in the passenger seat, they'll be back on your tail. - -[JDT8_K:JDT8] -~w~Oh daddy, no! - -[JDT8_BC:JDT8] -~w~Toni, man, you've got to chill out. - -[JDT8_C5:JDT8] -~w~Finish off the ~r~Sindacco hitmen. - -{=================================== MISSION TABLE MAC1 ===================================} - -[MAC1_AA:MAC1] -~w~Ma? - -[MAC1_AB:MAC1] -~w~It's me! I'm back! - -[MAC1_AC:MAC1] -~w~Toni?... Where the hell have you been? - -[MAC1_AM:MAC1] -~w~Not one phone call all the time you were away! - -[MAC1_AD:MAC1] -~w~They don't have phones where you were? - -[MAC1_AE:MAC1] -~w~Aw! Come on Ma! You know I couldn't call! - -[MAC1_AF:MAC1] -~w~A real man would have called his mother. - -[MAC1_AG:MAC1] -~w~You could learn a thing or two from Giovanni Casa. - -[MAC1_AN:MAC1] -~w~He calls his mother every day, - -[MAC1_AH:MAC1] -~w~Now, he's a good man. - -[MAC1_AO:MAC1] -~w~and his Sicilian sausage is the best in town! - -[MAC1_AI:MAC1] -~w~Casa! But Ma, Casa ain't no good man. He's a pervert! - -[MAC1_AJ:MAC1] -~w~That's just a foul mouthed rumor! What kind of man are you, Toni? - -[MAC1_AK:MAC1] -~w~Alright Ma, whatever you say. - -[MAC1_AL:MAC1] -~w~Maybe I'll go give Giovanni a call... see what he's up to. - -[MAC1_HA:MAC1] -~w~I think I'm in the mood for some luvin' - -[MAC1_17:MAC1] -~w~Prove to your Ma that Giovanni Casa is no damn good! - -[MAC1_B:MAC1] -~w~Head for your ~y~apartment ~w~to pick up your camera. - -[MAC1_B0:MAC1] -~w~Go to ~y~Casa's deli. - -[MAC1B2:MAC1] -~w~Nice shot! Now take the photo to ~y~Ma's place. - -[MAC1_B3:MAC1] -~w~Sneak-up on ~r~Casa, ~w~then take the photo that will shame him! - -[MAC1_B5:MAC1] -~w~Don't spook ~r~him. - -[MAC1_B6:MAC1] -~r~You ran out of film! You didn't even get the shameful photo of Casa to take back to your Ma. - -[MAC1_B7:MAC1] -~w~Pick up your ~g~camera. - -[MAC1_C0:MAC1] -~w~Don't get too close or ~r~Casa~w~ will suspect something! - -[MAC1_C1:MAC1] -~r~You've spooked him! Now you'll never get that photo! - -[MAC1_C2:MAC1] -~r~Something's spooked Casa! - -[MAC1_C3:MAC1] -~r~You've lost Casa! - -[MAC1_C4:MAC1] -~r~Casa got wasted! - -[MAC1_C5:MAC1] -~w~You're too close to ~r~Casa! - -[MAC1_C6:MAC1] -~w~Don't lose ~r~Casa! - -[MAC1_D0:MAC1] -~w~Looks like Casa's found some action. - -[MAC1_JA:MAC1] -~w~Okay ladies! It's milk time! - -[MAC1_JB:MAC1] -~w~Who's gonna be momma? - -[MAC1_JC:MAC1] -~w~Oh my! - -[MAC1_IA:MAC1] -~w~Okay ladies. Give me a minute here will ya. - -[MAC1_IB:MAC1] -~w~I'm gonna change into something that's a little more... me. - -[MAC1_CA:MAC1] -~w~Baby needs hug! - -[MAC1_CB:MAC1] -~w~I made choc-choc! - -[MAC1_DA:MAC1] -~w~Suck my dummy! Suck it! - -[MAC1_EA:MAC1] -~w~Aw, come on girls! Get with the program! - -[MAC1_FA:MAC1] -~w~SHIT! Someone's here! - -[MAC1_FB:MAC1] -~w~Quick! Get in the van! - -[MAC1_GA:MAC1] -~w~Oh God! Oh God! - -[MAC1_GB:MAC1] -~w~DON'T - LOOK - AT - ME! - -[MAC1_BA:MAC1] -~w~Hey Ma! - -[MAC1_BB:MAC1] -~w~Take a look at my photo! It's of your 'good man' Giovanni Casa... wearing a goddamn diaper! - -[MAC1_BC:MAC1] -~w~Is this how you spend your time? - -[MAC1_BD:MAC1] -~w~Sneaking around in the woods taking pictures of men? - -[MAC1_BE:MAC1] -~w~What's wrong with you Antonio? You shame me! - -[MAC1_BF:MAC1] -~w~But! - -[MAC1_BG:MAC1] -~w~And, diaper or no diaper, he's still a better man than you! - -[MAC1_B8:MAC1] -~w~Now head outside. - -[MAC1_B1:MAC1] -~w~Tail ~r~Casa~w~, but don't get too close. - -[MAC1_C7:MAC1] -~w~Zoom in on ~r~Casa ~w~to take the photograph that will shame ~r~him. - -[MAC1_D1:MAC1] -~w~Stay on ~r~Casa's~w~ tail. This could be a great photo opportunity. - -{=================================== MISSION TABLE MAC2 ===================================} - -[MAC2_AA:MAC2] -~w~Ma!... Ma!... come on Ma... speak to me. - -[MAC2_AB:MAC2] -~w~There's no 'Ma' here for you no more, you coward! - -[MAC2_AC:MAC2] -~w~You can't fool me... I know why you don't move back in here. - -[MAC2_AD:MAC2] -~w~You're running scared of some Triads! - -[MAC2_AE:MAC2] -~w~Your father, God rest his soul, wouldn't let no one run him out of his own home. - -[MAC2_AF:MAC2] -~w~But Ma! - -[MAC2_AG:MAC2] -~w~But unlike you, your father wasn't yellow! - -[MAC2_AH:MAC2] -~w~Until the Triads show you some respect, you're no son of mine! - -[MAC2_AI:MAC2] -~w~A daughter maybe, but not a son. - -[MAC2_B1:MAC2] -~w~Show Ma you're not scared of the Triads. Deal with the ~r~two Triad gangs~w~ in Chinatown! - -[MAC2_I1:MAC2] -~w~A Triad gang leader's in that bulletproof ~r~fish van.~w~ Ram him off the road! - -[MAC2_I2:MAC2] -~w~The ~r~van's ~w~running - and shedding its load! Watch out! - -[MAC2_I3:MAC2] -~w~They're getting out! Take down the ~r~Triad ~w~scum! - -[MAC2_I4:MAC2] -~w~You've been spotted! Waste all the ~r~Triad gang members! - -[MAC2_I5:MAC2] -~w~You're in ~r~Triad~w~ territory. Be careful! - -[MAC2_I6:MAC2] -~w~One down, one more to go. Take out the other ~r~gang! - -[MAC2_BA:MAC2] -~w~Yeah! Are you watchin' Ma! - -[MAC2_BB:MAC2] -~w~This is Toni Cipriani kicking your asses! - -[MAC2_BC:MAC2] -~w~Remember that name fish heads! - -{=================================== MISSION TABLE MAC3 ===================================} - -[MAC3_A0:MAC3] -~w~Ma? I'm back... - -[MAC3_A1:MAC3] -~w~Look at you! You look so thin! - -[MAC3_A2:MAC3] -~w~If you were still living here, with your mother, like a son should, you'd be eating right! - -[MAC3_A3:MAC3] -~w~And look at those cars you drive! - -[MAC3_A4:MAC3] -~w~You shame me, Antonio, really you do. - -[MAC3_A5:MAC3] -~w~People will think I brought you up wrong! - -[MAC3_A6:MAC3] -~w~What can I do Ma? You know I'd do anything for you. - -[MAC3_A7:MAC3] -~w~That Sucho boy's racing downtown today. - -[MAC3_A8:MAC3] -~w~If only you were more like him! - -[MAC3_A9:MAC3] -~w~He treats his mother with real respect. - -[MAC3_AA:MAC3] -~w~Of course, if your father was here, he'd win the race, - -[MAC3_AB:MAC3] -~w~AND take the smug grin off that Sucho boy's face! - -[MAC3_AC:MAC3] -~w~Yeah, he'd make him eat lead! - -[MAC3_AD:MAC3] -~w~Ah! Your father was a real man! Big balls! - -[MAC3_B0:MAC3] -~w~Prove you're more than a match for Sucho. Win the race, then take him out. - -[MAC3_C0:MAC3] -~w~You beat ~r~Sucho~w~, now take him out! - -[MAC3_C1:MAC3] -~r~He's~w~ making a run for it! - -[MAC3_X0:MAC3] -~r~You let Sucho get away! - -[MAC3_C2:MAC3] -~r~Sucho's~w~ getting away! - -{=================================== MISSION TABLE MAC4 ===================================} - -[MAC4_A0:MAC4] -~w~Ma!... Ma!... are you there? - -[MAC4_A1:MAC4] -~w~I ain't talking to you no more, Toni! - -[MAC4_A2:MAC4] -~w~You shame your Sicilian roots! - -[MAC4_A3:MAC4] -~w~After you took that photo of Casa, he stopped paying his protection money. - -[MAC4_A4:MAC4] -~w~And what are you doing about it? - -[MAC4_A5:MAC4] -~w~NOTHING! - -[MAC4_A6:MAC4] -~w~Your father would have turned him into meatballs by now! - -[MAC4_A8:MAC4] -~w~but it takes guts to snub a Cipriani! - -[MAC4_A9:MAC4] -~w~I only wish you had his guts! - -[MAC4_AA:MAC4] -~w~You wish I had Casa's guts? - -[MAC4_AB:MAC4] -~w~Okay, Ma! You asked for 'em! - -[MAC4_B:MAC4] -~w~Swing by ~y~Giovanni Casa's deli~w~ and 'persuade' him to take a little road trip with you. - -[MAC4_B0:MAC4] -~w~Hi, Toni... how you doing? - -[MAC4_B1:MAC4] -~w~What's up? - -[MAC4_B2:MAC4] -~w~Cat got your tongue? - -[MAC4_B3:MAC4] -~w~You and me are gonna talk, Casa... - -[MAC4_B4:MAC4] -~w~Just somewhere more private. - -[MAC4_C:MAC4] -~w~Don't let ~r~Casa~w~ get out alive. - -[MAC4_C1:MAC4] -~w~I'll pay the protection money, Toni! I swear I will! - -[MAC4_C2:MAC4] -~w~Aw! Come on, Toni! I'll give you anything you want! - -[MAC4_C3:MAC4] -~w~I'll do anything Toni! Anything! Just don't hurt me! - -[MAC4_D1:MAC4] -~w~Okay! Okay! You got me! - -[MAC4_D2:MAC4] -~w~Okay! Okay! I give! I give! Just don't hurt me no more! - -[MAC4_D3:MAC4] -~w~Come with me, ass-Head! - -[MAC4_E0:MAC4] -~w~Take Casa to the ~y~sawmill. - -[MAC4_E1:MAC4] -~w~Don't leave ~b~Casa! - -[MAC4_F0:MAC4] -~w~So... er... where are we going? - -[MAC4_F1:MAC4] -~w~We're still cool ain't we, Toni? - -[MAC4_F2:MAC4] -~w~...I'll get you the money I owe... honest! - -[MAC4_F3:MAC4] -I just need some time! - -[MAC4_F4:MAC4] -~w~Does your Ma still like a spicy sausage? - -[MAC4_F5:MAC4] -I can get her some, no problem! - -[MAC4_G0:MAC4] -~w~So... erm... what do you wanna talk about, Toni? - -[MAC4_G1:MAC4] -~w~Is it the protection money? - -[MAC4_G2:MAC4] -~w~It is isn't it? - -[MAC4_G3:MAC4] -~w~...Toni? - -[MAC4_G4:MAC4] -~w~We can talk about this. Right, Toni? - -[MAC4_G6:MAC4] -~w~People just don't talk enough these days, Toni. - -[MAC4_G7:MAC4] -~w~Stand there and shut your yap, Casa. - -[MAC4_G8:MAC4] -~w~Okay Toni! But I... I... don't feel comfortable. - -[MAC4_G9:MAC4] -~w~Hey! Easy with that Toni! It's the on switch for the... - -[MAC4_GA:MAC4] -~w~AAARRRGGGHHHHHHHH! - -[MAC4_GB:MAC4] -~w~Get the hell out of here! - -[MAC4_H:MAC4] -~w~Sicilian style 'Sausage meat a la Casa' is in the ~b~van~w~ waiting to be delivered back to Casa's own deli. - -[MAC4_H1:MAC4] -~w~Take the delivery to ~y~Casa's deli. - -[MAC4_H2:MAC4] -~w~Don't leave the ~b~van~w~ there! - -[MAC4_H3:MAC4] -~w~Lose the cops! - -[MAC4_I0:MAC4] -~w~Special sausage meat delivery? - -[MAC4_I1:MAC4] -~w~No one told me about this! - -[MAC4_I2:MAC4] -~w~Woah! Which zoo did we knock-off this time? - -[MAC4_I3:MAC4] -~w~There's loads of meat back here! - -[MAC4_I4:MAC4] -~w~...Mmmm! Tasty! Okay, I'll take them. - -[MAC4_I6:MAC4] -~w~If he finds out about this, he'll go crazy! - -[MAC4_I7:MAC4] -~w~Then I'd be screwed! - -[MAC4_X0:MAC4] -~r~That was too quick and painless to be a Sicilian hit! - -[MAC4_X1:MAC4] -~r~You were supposed to deliver the van! - -[MAC4_X2:MAC4] -~r~You lost Casa! - -[MAC4_E2:MAC4] -~w~Don't leave the ~y~sawmill! - -[MAC4_I5:MAC4] -~w~It's a good thing Casa ain't here. - -[MAC4_G5:MAC4] -~w~Yeah! Yeah! Talking is good. - -[MAC4_CN:MAC4] -~w~Call the cops! - -[MAC4_CO:MAC4] -~w~Get help! - -[MAC4_CP:MAC4] -~w~Someone get help! - -[MAC4_CQ:MAC4] -~w~Help! - -[MAC4_CR:MAC4] -~w~Someone help me! - -[MAC4_CS:MAC4] -~w~Get me outta here! - -[MAC4_A7:MAC4] -~w~Casa might be a bit funny, - -[MAC4_C0:MAC4] -~w~Can't we be civilized about this, Toni? - -[MAC4_1:MAC4] -~w~Get closer to ~r~Casa ~w~by sneaking up behind ~r~him. - -{=================================== MISSION TABLE MAC5 ===================================} - -[MAC5_AA:MAC5] -~w~Ma? You there? - -[MAC5_AB:MAC5] -~w~Toni? ...I'm just on the phone... - -[MAC5_AC:MAC5] -~w~...yeah he's here now... ok... ok... I'll stall him... bye. - -[MAC5_AD:MAC5] -~w~Toni? Come to upset your mother again, huh? - -[MAC5_AE:MAC5] -~w~You spend all day playing the tough guy. - -[MAC5_AF:MAC5] -~w~You never come see me, or bring home any nice girls. - -[MAC5_AG:MAC5] -~w~But, who'd want you anyway? You look so pasty and thin! - -[MAC5_AH:MAC5] -~w~You're trying to kill me with the shame and the worry. ~w~Well no more. - -[MAC5_AI:MAC5] -~w~From this point on... we're through. - -[MAC5_AJ:MAC5] -~w~I've called a hit on you. It's really the only way, Antonio... - -[MAC5_AK:MAC5] -~w~...you were always a disobedient boy. - -[MAC5_AL:MAC5] -~w~What!? Ma! - -[MAC5_AM:MAC5] -~w~It's for the best son... at least try to die like a real man! - -[MAC5_AN:MAC5] -~w~Try to stop shaming me! - -[MAC5_B1:MAC5] -~w~Ma's hitmen are here! - -[MAC5_B2:MAC5] -~w~Show Ma you're more than a match for her ~r~hitmen.~w~ Kill them all! - -[MAC5_B3:MAC5] -~w~They're really mad now! Eliminate ~r~them. - -[MAC5_B4:MAC5] -~w~The ~r~hitmen~w~ know you're here. You must get far away from Saint Mark's! - -[MAC4_B6:MAC5] -~w~More ~r~hitmen~w~ incoming! Get away from Saint Mark's. They know where you are! - -[MAC4_B7:MAC5] -~w~GRENADE! RUN! - -[MAC5_C1:MAC5] -~w~That's got rid of them... but now they've been paid, they'll see the job through, no matter how long it takes. - -[MAC5_C2:MAC5] -~w~Be warned... they WILL be back! - -[HM1:MAC5] -~w~They're not giving up! More ~r~hitmen~w~ are heading your way. Wipe them out! - -[HM2:MAC5] -~w~Look out! ~r~Hitmen~w~ are closing on you. Waste them! - -[HM3:MAC5] -~w~More ~r~hitmen~w~ are approaching. Blow them away! - -[HM4:MAC5] -~w~More ~r~hitmen~w~ are on the way! Take them out! - -[MAC5_B5:MAC5] -~w~Deal with the remaining ~r~hitmen~w~, but stay out of Saint Mark's! - -{=================================== MISSION TABLE MAR1 ===================================} - -[MAR1M1:MAR1] -~w~You're late! Typical man. - -[MAR1M2:MAR1] -~w~I want to go shopping, and you're driving. - -[MAR1M3:MAR1] -~w~So help me, I'm gonna have some fun today. Even if it kills you! - -[MAR1M4:MAR1] -~w~I just need to finish getting ready. - -[MAR1M5:MAR1] -~w~Ah screw it! I'm gorgeous. Come on Toni! - -[MAR1_B:MAR1] -~w~Take Maria to the ~y~shop. - -[MAR1_D:MAR1] -~w~Wait here sexy, I won't be long... - -[MAR1_D2:MAR1] -~w~But I just wanted to see what it looked like in the daylight! - -[MAR1_E:MAR1] -~w~Let's get out of here! - -[MAR1_E3:MAR1] -~w~Go back and get ~b~Maria. - -[MAR1_F:MAR1] -~W~That was fun! But, I'm gonna need to pick up some more stuff. - -[MAR1_G:MAR1] -~w~Keep the engine running... - -[MAR1_GB:MAR1] -~w~Come on Maria! No more stealing! - -[MAR1_GC:MAR1] -~w~Aw, hush Toni baby! That was all a misunderstanding back there! - -[MAR1_G2:MAR1] -~w~I'm telling you, I don't have anything hidden up there! - -[MAR1_H:MAR1] -~w~Get me back to my place! - -[MAR1_I:MAR1] -~w~If you leave me here, I'll have Salvatore cut your balls off! - -[MAR1_J:MAR1] -~r~Maria's dead! Oh, the humanity! - -[MAR1_K:MAR1] -~w~Toni, honey, I had a great time today. - -[MAR1_K2:MAR1] -~w~Maybe you can drop by later and we can have some more fun. - -[MAR1_K3:MAR1] -~w~See ya later handsome! - -[MAR1_L:MAR1] -~w~The cops are onto us! You'd better lose them! - -[MAR1_L2:MAR1] -~w~I think you lost them! Lets go shopping! - -[MAR1_M:MAR1] -~w~STOP THIEF! - -[MAR1EXT:MAR1] -~w~Take Maria back to her ~y~apartment. - -[MAR1_1:MAR1] -NONE - -[MAR1_D3:MAR1] -~w~Take your God-damn hands off me! - -[MAR1_G3:MAR1] -~w~Get the hell off me! - -[MAR1_E2:MAR1] -~w~Lose the heat! - -{=================================== MISSION TABLE MAR2 ===================================} - -[MAR2_AA:MAR2] -~w~Stop it! One of Salvatore's dogs is bringing me right over... - -[MAR2_AB:MAR2] -~w~...oh, he's a charmer - -[MAR2_AC:MAR2] -~w~Maybe too thin though. - -[MAR2_AE:MAR2] -~w~So, listen, I wanna party, but the cupboard is bare. - -[MAR2_AF:MAR2] -~w~You got some sugar? Pure cane huh? - -[MAR2_AG:MAR2] -~w~Great. Ciao! - -[MAR2_AH:MAR2] -~w~Come on Toni. I've got places I need to be. - -[MAR2_BA:MAR2] -~w~Don't you have any wheels? - -[MAR2_BB:MAR2] -~w~Let's move it. My dealer won't hang around all day. - -[MAR2_3F:MAR2] -~w~Take Maria to see her ~y~dealer. - -[MAR2_BC:MAR2] -~w~There they are. Just pull in behind them, there's a good boy. - -[MAR2_GA:MAR2] -~w~You just wait here. - -[MAR2_GB:MAR2] -~w~I'm not sure I like this. - -[MAR2_GC:MAR2] -~w~It's sweet you're worried. But, I'm Salvatore's girl, I'll be fine. - -[MAR2_GE:MAR2] -~w~I ain't going anywhere with you! Who the hell do you think you are? - -[MAR2_GF:MAR2] -~w~Drive! - -[MAR2_GG:MAR2] -~w~Toni! - -[MAR2_GH:MAR2] -~w~Oh shit! - -[MAR2_19:MAR2] -~w~Kill the ~r~Sindaccos! - -[MAR2_EA:MAR2] -~w~Happy now? - -[MAR2_EB:MAR2] -~w~Toni Cipriani. My Hero! - -[MAR2_EC:MAR2] -~w~You know what? I'm all partied out. Take me home stud. - -[MAR2_HA:MAR2] -~w~So uh, you wanna come up... for a... uh... coffee or somethin'? - -[MAR2_HB:MAR2] -~w~I'll pass. - -[MAR2_HC:MAR2] -~w~You sure? Well, call me. - -[MAR2_O2:MAR2] -~w~Take Maria back to her ~y~apartment. - -[MAR2_CA:MAR2] -~w~Come on, Toni! - -[MAR2_CB:MAR2] -~w~For Christ-sake Toni, come on! - -[MAR2_CC:MAR2] -~w~Save me, Toni! - -[MAR2_CD:MAR2] -~w~Help! - -[MAR2_CE:MAR2] -~w~Come ooonnnnnnn! - -[MAR2_FA:MAR2] -~w~Who am I supposed to get my shit from now? - -[MAR2_FB:MAR2] -~w~You suck, Toni! - -[MAR2_LM:MAR2] -~w~You left ~b~Maria~w~ behind. Go back for her. - -[MAR2_MD:MAR2] -~r~Maria died. - -[MAR2_WA:MAR2] -~w~The ~r~dealers~w~ are getting away! - -[MAR2_DM:MAR2] -~r~You lost the dealers! - -[MAR2_DA:MAR2] -~w~Some hero you are! - -[MAR2_DF:MAR2] -~r~You scared off Maria's dealers! - -[MAR2_18:MAR2] -~w~Ram the ~r~Sindacco car~w~ to rescue Maria! - -[MAR2_AD:MAR2] -~w~...yeah. - -{=================================== MISSION TABLE MAR3 ===================================} - -[MAR3_A0:MAR3] -~w~Dear Toni, I've put myself up as the first prize in a street-race. - -[MAR3_A1:MAR3] -~w~If Salvatore finds out about this we're both going to be in big trouble. - -[MAR3_A2:MAR3] -~w~So you'd better come and save my ass... then maybe it'll belong to you! - -[MAR3_A3:MAR3] -~w~Forever yours, Maria. - -[MAR3_E0:MAR3] -~w~Come on Maria. Let's go. - -[MAR3_E1:MAR3] -~w~Well, finally! Mr. Tough guy makes his move. - -[MAR3_E2:MAR3] -~w~Look Maria. You're Salvatore's girl... - -[MAR3_E3:MAR3] -~w~I'm my own girl! - -[MAR3_E4:MAR3] -~w~...you're such a God-damn square! - -[MAR3_E5:MAR3] -~w~Come on Wayne! Let's party! - -{=================================== MISSION TABLE MAR4 ===================================} - -[MAR4_B1:MAR4] -~w~Wayne can be found with his gang in ~y~Chinatown. - -[MAR4_B2:MAR4] -~w~Get over there and rub him out! - -[MAR4_C1:MAR4] -~r~Wayne's~w~ escaping! Grab a bike and kill him! - -[MAR4_C3:MAR4] -~w~You're losing him! Don't let ~r~Wayne ~w~get away! - -[MAR4_D1:MAR4] -~w~Are you Wayne? - -[MAR4_D2:MAR4] -~w~Who wants to know? - -[MAR4_D3:MAR4] -~w~I'm a friend of Maria's. - -[MAR4_D4:MAR4] -~w~...beating up on women get your motor running, huh? - -[MAR4_D5:MAR4] -~w~That bitch had it coming! - -[MAR4_D6:MAR4] -~w~Yeah? Well, now so do you! - -[MAR4_D7:MAR4] -~w~Get him! - -[MAR4_T1:MAR4] -~w~Come on tough guy! - -[MAR4_T2:MAR4] -~w~You ain't got nothin'! - -[MAR4_T3:MAR4] -~w~You can't ride a bike for shit! - -[MAR4_T4:MAR4] -~w~If you ride close enough, you can kiss my ass! - -[MAR4_F1:MAR4] -~r~You let Wayne get away! - -[MAR4_P1:MAR4] -~w~You got the deadbeat! - -[MAR4_H1:MAR4] -Wayne's Health - -[MAR4_C4:MAR4] -~w~Don't lose ~r~Wayne. ~w~Chase him down and waste him! - -[BIK_01:MAR4] -What have you taken now? - -[BIK_02:MAR4] -Nothing. - -[BIK_03:MAR4] -What was it this time, huh? - -[BIK_04:MAR4] -Smack? Downers? Ludes? A little too much trumpet? - -[BIK_08:MAR4] -Who did this to you? - -[BIK_09:MAR4] -No one. - -[BIK_10:MAR4] -Who was it? - -[BIK_11:MAR4] -This guy I'm seeing, Wayne. - -[BIK_12:MAR4] -Some guy you're seeing, you're my boss's girl! - -[BIK_13:MAR4] -C'mon Toni, don't be so square, besides, he gets me this great speed, you know? - -[BIK_14:MAR4] -A girl needs a lift. - -[BIK_15:MAR4] -Plus it makes you really wild in bed. - -[BIK_16:MAR4] -Shut up. Why did he do this to you, - -[BIK_17:MAR4] -this dead prick Wayne? - -[BIK_18:MAR4] -I told him I was in love with somebody else. - -[BIK_19:MAR4] -I told him about me and you, Toni. - -[BIK_22:MAR4] -Where is this Wayne? - -[BIK_23:MAR4] -He deals at a bar down in Chinatown. - -[BIK_24:MAR4] -I love you, Toni Cipriani. - -[BIK_06:MAR4] -- A little too much sideways not enough up? ~n~ - Shut up Toni! - -[BIK_05:MAR4] -Not enough Diceypam? - -[BIK_20:MAR4] -- And then he hit me! ~n~ - There is no you and me! Christ, you're killing me. - -{=================================== MISSION TABLE MAR5 ===================================} - -[MAR5_EA:MAR5] -~w~Why have you brought me here? - -[MAR5_EB:MAR5] -~w~My stuff isn't here... this is where Wayne used to hang out. - -[MAR5_EC:MAR5] -~w~... I remember! I've got some zap stashed in Hepburn Heights! - -[MAR5_ED:MAR5] -~w~Hey, it's that bitch Maria! And that's the fuck who killed Wayne! - -[MAR5_AA:MAR5] -~w~I hid the zap behind the trashcan! - -[MAR5_AB:MAR5] -~w~Shit! The trash's been taken! - -[MAR5_AC:MAR5] -~w~Wait! I remember! I've still got a stash at my apartment! - -[MAR5_AD:MAR5] -~w~You're sure this time? - -[MAR5_AE:MAR5] -~w~Of course I'm sure! - -[MAR5_BA:MAR5] -~w~I meant Salvatore's place! I meant Salvatore's! - -[MAR5_BB:MAR5] -~w~For crying out loud, Maria! - -[MAR5_FA:MAR5] -~w~What kind of driver are you? That took ages! I could have OD'ed! - -[MAR5_FB:MAR5] -~w~I'm a mess! I'm gonna need a new wardrobe, a little nip-and-tuck, the works! - -[MAR5_FC:MAR5] -~w~Honey ...have you got some money? - -[MAR5_FD:MAR5] -~w~Er... not really... - -[MAR5_FE:MAR5] -~w~Well, what the hell have you been coming onto me for? I'm Salvatore's girl! - -[MAR5_FF:MAR5] -~w~He's loaded! Don't you ever hit on me again! - -[MAR5_CA:MAR5] -~w~(groan) - -[MAR5_CB:MAR5] -~w~Oh shit, I think I'm gonna puke. - -[MAR5_CC:MAR5] -~w~I'm really fucking high, Toni! - -[MAR5_CD:MAR5] -~w~I don't feel too good. - -[MAR5_CE:MAR5] -~w~You're driving too fast! And too slow! - -[MAR5_NC:MAR5] -~b~Maria~w~ can barely walk. Get a ride! - -[MAR5_ND:MAR5] -~w~Maria can barely walk. Get a ride! - -[MAR5_DA:MAR5] -~w~We'll fuckin' kill you man! - -[MAR5_DB:MAR5] -~w~You and the bitch die tonight! - -[MAR5_DC:MAR5] -~w~You made a big mistake screwing with us! - -[MAR5_LM:MAR5] -~w~You left ~b~Maria~w~ behind. Go back for her. - -[MAR5_O1:MAR5] -~w~Take Maria to the diner at ~y~Callahan Point. - -[MAR5_O2:MAR5] -~w~Take Maria to ~y~Hepburn Heights. - -[MAR5_O3:MAR5] -~w~Take Maria to ~y~her apartment. - -[MAR5_O4:MAR5] -~w~Take Maria to ~y~Salvatore's mansion. - -[MAR5_O5:MAR5] -~w~Go back for ~b~Maria. - -[MAR5_MD:MAR5] -~r~Maria died! - -[MAR5_O6:MAR5] -~w~Pick ~b~Maria~w~ up. - -[OVER_01:MAR5] -Oh hey baby... Oh I thought you'd never make it. - -[OVER_02:MAR5] -What is wrong with you? - -[OVER_03:MAR5] -Oops! Nothing, baby it's all good. - -[OVER_04:MAR5] -Get up you crazy bitch. What have you taken now? - -[OVER_05:MAR5] -Taken now? Nothing much. - -[OVER_06:MAR5] -You know, a couple of, a couple of greens, a couple of heavy reds. - -[OVER_07:MAR5] -Oh and these great pills I'm getting from Holland now. - -[OVER_08:MAR5] -Pure as hell! I feel great. - -[OVER_09:MAR5] -No, I don't. - -[OVER_10:MAR5] -I need a zap, and I'll be fine! - -[OVER_11:MAR5] -They're here somewhere. - -[OVER_12:MAR5] -What's a zap? - -[OVER_13:MAR5] -A zap? You don't know what a zap is? - -[OVER_14:MAR5] -Ah, Toni, you are so square! - -[OVER_17:MAR5] -I need a zap Toni! I'm gonna die! - -[OVER_18:MAR5] -I felt like this before, I've OD'd. - -[OVER_19:MAR5] -Get me a zap, Toni! - -[OVER_20:MAR5] -I left them at the diner at Callahan Point. - -[OVER_21:MAR5] -Don't just sit there then come on! - -[OVER_15:MAR5] -- Toni, I love you. ~n~ - Come on, make sense. - -{=================================== MISSION TABLE VIC1 ===================================} - -[VIC1I11:VIC1] -~w~I've got you a nice little place to stay, Toni. - -[VIC1I12:VIC1] -~w~It's got you written all over it. - -[VIC1I13:VIC1] -~w~We'll head there first. - -[VIC1I14:VIC1] -~w~You're all heart. - -[VIC1_3:VIC1] -~w~Drive Vincenzo to his ~y~warehouse. - -[VIC1_4:VIC1] -~w~Get back in the ~b~car. - -[VIC1_5:VIC1] -~w~Drive Vincenzo to the ~y~safehouse. - -[VIC1_6:VIC1] -~w~Walk into the yellow marker in the ~y~doorway. - -[VIC1_7:VIC1] -~w~Walk into the clothes icon to get a change of clothes. - -[VIC1_8:VIC1] -~w~Rejoin Vincenzo outside. - -[VIC1_9:VIC1] -~w~Take Vincenzo to ~y~Atlantic Quays. - -[VIC1_9A:VIC1] -~w~Now take me to my place. - -[VIC1_10:VIC1] -~w~Get in the ~b~car. - -[VIC1_D1:VIC1] -~w~Jeezus Toni! You drive like a bitch! - -[VIC1_D2:VIC1] -~w~Watch the God damn car! - -[VIC1_D3:VIC1] -~w~Toni, stop disrespecting me, and drive like a man, marron! - -[VIC1_C1:VIC1] -~w~This is it, Toni. 'Home sweet home'. Beautiful, ain't she? - -[VIC1_C2:VIC1] -~w~This shit hole is supposed to be my home? - -[VIC1_C3:VIC1] -~w~Oh! I think it's very you. - -[VIC1_C4:VIC1] -~w~Now you're disrespecting old Vincenzo. - -[VIC1_C5:VIC1] -~w~Now, tough guy, get your ass upstairs and go put on some decent clothes. - -[VIC1_C6:VIC1] -~w~ I don't got all day, so move. - -[VIC1_C7:VIC1] -~w~Hey, apartments cost money Toni. - -[VIC1_C8:VIC1] -~w~Just you remember who pays the bills around here. - -[VIC1_C9:VIC1] -~w~ME! Daddy Vincenzo over here. - -[VIC1C10:VIC1] -~w~So, from now on, you work for me. - -[VIC1C11:VIC1] -~w~So, I better see you back here real soon. - -[VIC1_F:VIC1] -~r~Vincenzo is dead. - -[HOMS_01:VIC1] -Hey... so there he is, huh? - -[HOMS_02:VIC1] -So listen, Toni, I know you did a good thing for us, - -[HOMS_03:VIC1] -and I know you've been lying low for a long time, - -[HOMS_04:VIC1] -so I want you to take it easy for a while, huh? - -[HOMS_05:VIC1] -Vincenzo will look after you. - -[HOMS_06:VIC1] -You need some money, ask him. - -[HOMS_07:VIC1] -You need a job - Lucky'll take care of you. - -[HOMS_08:VIC1] -What more could a family guy ask for? - -[HOMS_09:VIC1] -Even my son don't got it so good. - -[HOMS_10:VIC1] -But, Mr. Leone, I thought we got history, - -[HOMS_11:VIC1] -I mean I've done a lot for this family. - -[HOMS_12:VIC1] -And now, you're expecting me to take orders from this... this... this... - -[HOMS_13:VIC1] -Well it just doesn't seem... right. - -[HOMS_14:VIC1] -Toni, I know what you did, and no one is more grateful than me, honestly, - -[HOMS_15:VIC1] -but the idea that you walk in here - -[HOMS_16:VIC1] -and start to question my leadership right away is, quite frankly, - -[HOMS_17:VIC1] -out of order. Capiche? - -[HOMS_18:VIC1] -I understand, boss. - -[HOMS_19:VIC1] -So, when you need something, give Vincenzo a call down at Atlantic Quay. - -[HOMS_20:VIC1] -He'll take care of you. Won't you, Lucky? - -[HOMS_21:VIC1] -Of course, boss. Anything you say. - -[HOMS_22:VIC1] -Tell you what; we can go there now. - -{=================================== MISSION TABLE VIC2 ===================================} - -[VIC2M2:VIC2] -The lazy bastard ain't brought any cash in, in days. - -[VIC2M3:VIC2] -Maybe he needs some encouragement to get off his ass and do some work. - -[VIC2M4:VIC2] -Acting like a bitch... he kinda reminds me of you. - -[VIC2M5:VIC2] -~w~What are you trying to say? - -[VIC2M6:VIC2] -I ain't TRYING to say nothing! - -[VIC2M7:VIC2] -I'm telling you to get over there and make sure this asshole starts bringing in some god damn money! - -[VIC2_B:VIC2] -~W~Get some wheels. - -[VIC2OB1:VIC2] -~w~Take the dealer to ~y~work. - -[VIC2_C:VIC2] -~w~You're going to need wheels to get him to his regular patch! - -[VIC2_D:VIC2] -~w~Pick up Vincenzo's dealer from ~y~St. Mark's district. - -[VIC2_E:VIC2] -~w~So, Vincenzo tells me you're too chicken-shit to work your patch? - -[VIC2_E2:VIC2] -~w~Hey man! I'm no chicken-shit! - -[VIC2_EX:VIC2] -~w~I... er... I've been ill is all! - -[VIC2_E3:VIC2] -~w~I'll go back to work tomorrow... or, maybe, the day after. - -[VIC2_E4:VIC2] -~w~Oh, I think you're going to work today... like it or not! - -[VIC2_F:VIC2] -~w~Hey! Don't leave me here! This is a bad neighborhood dude! - -[VIC2_F2:VIC2] -~w~You left ~b~Vincenzo's dealer ~w~behind, go back and get him. - -[VIC2_G:VIC2] -~w~Listen man! I told Vinnie already... Chinatown's no go for the Leones now! - -[VIC2_G2:VIC2] -~w~The Sindaccos are moving in! If I go back there, I'm a dead man! - -[VIC2_G3:VIC2] -~w~Sure... sure... - -[VIC2_G4:VIC2] -~w~I'm telling you man! The Sindaccos are dealing. - -[VIC2_G5:VIC2] -~w~I don't feel too good... I think I might have a fever or something. - -[VIC2_H:VIC2] -~w~Stop near ~b~the dealer. - -[VIC2_I:VIC2] -~w~Oh, man... - -[VIC2_J:VIC2] -~r~Vincenzo's dealer got wasted! - -[VIC2_K:VIC2] -~w~Take Vincenzo's dealer to ~y~Chinatown. - -[VIC2_1:VIC2] -NONE - -[VIC2M1:VIC2] -We've got a dealer, working our North Chinatown patch. - -{=================================== MISSION TABLE VIC3 ===================================} - -[VIC3_H1:VIC3] -~w~Hold~h~ ~k~ ~PDLT~ ~w~to ~h~lock on to a target~w~, and press~h~ ~k~ ~PDFW~ ~w~to attack! - -[VIC3_H2:VIC3] -~w~Press~h~ ~k~ ~PDFW~ ~w~to attack the ~h~dealer. - -[VIC3O2:VIC3] -~w~Head over to ~y~Chinatown. - -[VIC3O3:VIC3] -~w~Take out the ~r~dealer. - -[VIC3_1:VIC3] -~w~Vincenzo's left you a present that might help. - -[VIC3_BA:VIC3] -~w~Stay off Leone turf asshole! - -[VIC3_BB:VIC3] -~w~You want some more, ass-head? - -[VIC3_BC:VIC3] -~w~The Leone's deal in this city! Nobody else! You hear me, you Sindacco fucks? - -[VIC3_6:VIC3] -~w~Sindaccos are dealing all over Chinatown. - -[VIC3_AA:VIC3] -~w~Vinnie? - -[VIC3_AB:VIC3] -~w~For crying out loud, Toni! Don't I get any peace? - -[VIC3_AD:VIC3] -~w~I'm already all blocked up, last thing I need is you on my case - -[VIC3_AE:VIC3] -~w~but as you're still here, you know, I'm still not seeing any money - -[VIC3_AF:VIC3] -~w~coming in from that dealer. You know why? - -[VIC3_AG:VIC3] -~w~Enlighten me. - -[VIC3_AJ:VIC3] -~w~The Sindaccos have started dealing, and on Leone turf too! - -[VIC3_AK:VIC3] -~w~You gonna accept that Toni? - -[VIC3_AL:VIC3] -~w~I want you to get over to Chinatown! - -[VIC3_AM:VIC3] -~w~Alright, 'Boss', I'm on it. - -[VIC3_AN:VIC3] -~w~Aw God! Why's there never any God-damn paper in here? - -[VIC3_AH:VIC3] -~w~'Cause he's dead, Idiot! Some chump whacked him. - -[VIC3O4:VIC3] -~r~Sindaccos~w~ are dealing all over Chinatown. Teach them a lesson they won't forget! - -{=================================== MISSION TABLE VIC4 ===================================} - -[VIC4_H2:VIC4] -~w~Follow the ~h~Spray Can blip~w~ on the radar to find the ~h~Pay 'n' Spray. - -[VIC4_A2:VIC4] -~w~Stand in the ~h~marker~w~ to view the available weapons. - -[VIC4_A3:VIC4] -~w~Select different weapons by using~h~ ~k~ ~AMMOV~. - -[VIC4_A4:VIC4] -~w~Buy the current weapon by pressing~h~ ~k~ ~AMBUY~ ~w~- but only if you have enough cash! - -[VIC4_A6:VIC4] -~w~There are eight types of weapon that you can use. - -[VIC4_A7:VIC4] -~w~You can only carry one of each type at a time: one type of pistol, one type of shotgun, etc. - -[VIC4_H1:VIC4] -~w~Follow the ~h~Gun blip~w~ on the radar to find ~h~Ammu-Nation. - -[VIC4_H3:VIC4] -~w~Follow the ~h~Gun blip~w~ on the radar to find ~h~Ammu-Nation~w~ again. - -[VIC4_AB:VIC4] -~w~Difficult to forget... - -[VIC4_AD:VIC4] -~w~The interesting thing is, he wants to be a Leone now. - -[VIC4_AE:VIC4] -~w~Fuck him! He made his choice. - -[VIC4_AG:VIC4] -~w~Hello Brain-cell! Jeez, Toni, Sal said you was dumb muscle, - -[VIC4_AH:VIC4] -~w~but I didn't think anyone was that dumb. - -[VIC4_AJ:VIC4] -~w~He's gonna be our boy on the inside. - -[VIC4_AK:VIC4] -~w~There's just one thing. - -[VIC4_AL:VIC4] -~w~He's being sat on by some Sindacco ape. - -[VIC4_AM:VIC4] -~w~I want you to remove this little obstacle - -[VIC4_AN:VIC4] -~w~and get JD on our side. Capiche? - -[VIC4_2:VIC4] -~w~Take the ~g~cell phone~w~ as proof you've done the job. - -[VIC4_BA:VIC4] -~w~Toni... oh you just gave me some great snuff footage! - -[VIC4_BB:VIC4] -~w~JD? You saw that? YOU'RE FILMING ME?! - -[VIC4_BC:VIC4] -~w~Aw, I was just... it's for my own use! - -[VIC4_BD:VIC4] -~w~I can't wait 'till we're on the same team! - -[VIC4_BE:VIC4] -~w~Don't get too excited. You still owe me money. - -[VIC4_BF:VIC4] -~w~Take that Sindacco chump's car as a deposit, uh? - -[VIC4_BG:VIC4] -~w~Just re-spray it so no one recognizes it. - -[VIC4_BH:VIC4] -~w~I'll take care of his body. - -[VIC4_CA:VIC4] -~w~Hey! Get outta here! - -[VIC4_CB:VIC4] -~w~You ain't got no business here! - -[VIC4_61:VIC4] -~w~Get in the ~b~car. - -[VIC4_62:VIC4] -~w~Drive to the Pay 'n' Spray. - -[VIC4_DC:VIC4] -~r~JD told you to have the car resprayed! - -[VIC4_PR:VIC4] ---ring ring-- - -[VIC4O1A:VIC4] -~w~Go ~y~inside. - -[VIC4_O2:VIC4] -~w~Buy a pistol. - -[VIC4_O4:VIC4] -~w~Kill the ~r~Sindacco ape. - -[VIC4_FA:VIC4] -~r~He isn't going to sell you a gun now! - -[VIC4_O3:VIC4] -~w~Head for the ~y~construction site. - -[VIC4_AC:VIC4] -~w~He's currently running a Sindacco-controlled titty-bar, I mean gentleman's club. - -[VIC4_AA:VIC4] -~w~Hey, remember JD O'Toole? - -[VIC4_AI:VIC4] -~w~We can use JD to get the drop on Sindacco plans. - -[HELP42:VIC4] -~w~While targeting, tap~h~ ~k~ ~FREE1~ ~w~to enter ~h~Free Aim mode~w~, then use the~h~ ~k~ ~FREE2~ ~w~to adjust your aim. - -[VIC4_A1:VIC4] -~w~Go to the local ~y~Ammu-Nation~w~ to get a gun. - -[VIC4_O1:VIC4] -~w~Go back to ~y~Ammu-Nation~w~ and get a gun. - -[VIC4_1:VIC4] -~w~The ~r~Sindacco heavy~w~ is at the rear of the construction site. Kill him! - -{=================================== MISSION TABLE VIC5 ===================================} - -[VIC5_H:VIC5] -Leone - -[VIC5_I0:VIC5] -~w~Oh, it's you. - -[VIC5_I1:VIC5] -~w~Yeah, how 'bout that. It's me. What-do-ya-know! - -[VIC5_I2:VIC5] -~w~I'll tell you what I know tough guy. - -[VIC5_I3:VIC5] -~w~Some of our boys have screwed up a simple, no brain, fucking job. - -[VIC5_I4:VIC5] -~w~Lousy bastards can't even pull off a simple raid. - -[VIC5_I5:VIC5] -~w~Now the cops have got them pinned down in Chinatown. - -[VIC5_I6:VIC5] -~w~Marron! Why am I surrounded by so many fucking idiots? - -[VIC5_I7:VIC5] -~w~I don't know... 'birds of a feather'? - -[VIC5_I8:VIC5] -~w~Oh, you're a fucking comedian! - -[VIC5_I9:VIC5] -~w~Well laugh this off wise-guy. - -[VIC5I10:VIC5] -~w~You're the one who's gonna clean this shit up for me! - -[VIC5I11:VIC5] -~w~Now, get over there and drag those morons back here! - -[VIC5_F1:VIC5] -~r~One of the gang is dead. - -[VIC5_G0:VIC5] -~w~Get a four seater car. - -[VIC5_O1:VIC5] -~w~Go and rescue ~b~Vincenzo's men. - -[VIC5_O2:VIC5] -~w~Get ~b~the gang~w~ out of there! - -[VIC5_O3:VIC5] -~w~Lose the cops! - -[VIC5_O4:VIC5] -~w~Take the gang to ~y~Vincenzo's. - -[VIC5_O5:VIC5] -~w~Keep ~b~the gang~w~ together! - -[VIC5_O6:VIC5] -~w~You need a vehicle with more room! - -[VIC5_G1:VIC5] -~w~What are we gonna do? - -[VIC5_G2:VIC5] -~w~We're screwed! - -[VIC5_G3:VIC5] -~w~I ain't doing time for that bastard Vincenzo! - -[VIC5_G4:VIC5] -~w~Let's get the fuck out of here! - -[VIC5_G5:VIC5] -~w~Wait for me! - -[VIC5_G6:VIC5] -~w~Floor it Toni! - -[VIC5_E1:VIC5] -~w~So, did you get the money? - -[VIC5_E2:VIC5] -~w~We got it all boss... - -[VIC5_E3:VIC5] -~w~Hey, listen, there was nothing we could do... - -[VIC5_E4:VIC5] -~w~...there was nothing you could do. - -[VIC5_E5:VIC5] -~w~Things got fucked up... it couldn't have been worse. - -[VIC5_E6:VIC5] -~w~What do you think... are things better now, or worse? - -[VIC5_E7:VIC5] -~w~If you fuck it up for me, ever again, things will get worse for you too! - -[VIC5_E8:VIC5] -~w~Now clear that shit up, and get outta my sight. - -[VIC5_E9:VIC5] -~w~I've got a call to make. - -[VIC5E10:VIC5] -~w~I swear to God Toni, the day you came back my luck turned to shit. - -[VIC5E11:VIC5] -~w~You're like a bad fucking penny. - -{=================================== MISSION TABLE VIC6 ===================================} - -[VIC6_BA:VIC6] -~w~Freeze! - -[VIC6_BB:VIC6] -~w~Don't move asshole! - -[VIC6_P0:VIC6] -~w~Collect Vincenzo's ~b~car. - -[VIC6_P1:VIC6] -~w~It's a police trap! Get the car out of there! - -[VIC6_P2:VIC6] -~w~Lose the cops! - -[VIC6_P3:VIC6] -~w~You lost the cops! Now ~w~deliver the car to Vincenzo's ~y~lock-up. - -[VIC6_P4:VIC6] -~w~Teach Vincenzo never to mess around with you again - crush his ~b~car! - -[VIC6_P5:VIC6] -~w~Get back in Vincenzo's ~b~car! - -[VIC6_P6:VIC6] -~w~Deliver the car to Vincenzo's ~y~lock-up. - -[VIC6_PA:VIC6] -~r~You destroyed the car! - -[VIC6_D1:VIC6] -~w~Get in the ~b~car. - -[VIC6_D3:VIC6] -~w~Drive to the ~y~car crusher. - -[VIC6_D4:VIC6] -~w~Get out and wait for the crusher to do its thing. - -[VIC6_D5:VIC6] -~r~You should have crushed the car! - -[VIC6_AA:VIC6] -~w~Hey! Toni, how's the car? - -[VIC6_AB:VIC6] -~w~You son of a bitch, Vinnie! You set me up! - -[VIC6_AC:VIC6] -~w~Set you up? SET YOU UP? - -[VIC6_AD:VIC6] -~w~When you came back to the city you had nothing! NOTHING! - -[VIC6_AE:VIC6] -~w~I set you up alright, you ungrateful bastard! - -[VIC6_AF:VIC6] -~w~With an apartment and a job! - -[VIC6_AG:VIC6] -~w~And for that generosity I expect you to take a few risks now and then. - -[VIC6_AH:VIC6] -~w~I ain't a charity, pal, okay? And I ain't your sugar daddy. - -[VIC6_AI:VIC6] -~w~So the police were watching the car! Screw the police! - -[VIC6_AJ:VIC6] -~w~When I tell you to do something, you do it. Capiche? - -[VIC6_AK:VIC6] -~w~Oh, yeah, I understand Vinnie. - -[VIC6_AL:VIC6] -~w~I understand that as long as I work for you, I get treated like a bitch. - -[VIC6_AM:VIC6] -~w~I was making scores while you were looking up girl's skirts. - -[VIC6_AN:VIC6] -~w~Have your bitch job back, 'boss'. I quit. - -[VIC6_AO:VIC6] -~w~Toni, you're making a big... - -[VIC6_D2:VIC6] -~w~Stop in the ~y~marker. - -[HOTW_01:VIC6] -Sure, momma. I'll call you later. - -[HOTW_28:VIC6] -Vincenzo! - -[HOTW_02:VIC6] -Yeah of course, of course I'm being a good boy. - -[HOTW_03:VIC6] -Love you. - -[HOTW_04:VIC6] -Hey, Cheryl, hey sweetheart, give it a rest now. - -[HOTW_05:VIC6] -Here now get out of here. - -[HOTW_06:VIC6] -A little trumpetto for you. - -[HOTW_11:VIC6] -You're disgusting. Where's your respect? - -[HOTW_12:VIC6] -Respect? I call it multi tasking, Antonio. - -[HOTW_15:VIC6] -Cause if it's a problem, I can get Ray to help you out. - -[HOTW_16:VIC6] -Fuck you. - -[HOTW_17:VIC6] -I'm just busting your balls, relax. - -[HOTW_18:VIC6] -Listen, tough guy - I need you to do me a favor. - -[HOTW_19:VIC6] -I got girls crazy for blow; I got a car full of it parked in Trenton. - -[HOTW_20:VIC6] -Go pick it up... give me a call. - -[HOTW_21:VIC6] -What am I? Your driver? Screw you. - -[HOTW_22:VIC6] -Listen, listen, listen, listen.... - -[HOTW_23:VIC6] -I'd do it myself, but I'm being watched by the feds. - -[HOTW_24:VIC6] -You know I'll look out for you. Trust me. - -[HOTW_25:VIC6] -Besides, remember there's a hierarchy here, Capiche? Now be a good kid! - -[HOTW_07:VIC6] -- Hey who loves you, angel? ~n~ - You do, Vinnie. - -[HOTW_09:VIC6] -- Was that your mother on the phone? ~n~ - Sure. - -[HOTW_13:VIC6] -- What, don't you like getting a hot broad to suck you off? ~n~ - What? - -{=================================== MISSION TABLE VIC7 ===================================} - -[VIC7_VE:VIC7] -~r~v1.01 - -[VIC7_1:VIC7] -~w~Vinnie, I'm here! Where the hell are you? What is this? - -[VIC7_2:VIC7] -~w~Toni? Com esta? ....I knew you'd call. - -[VIC7_3:VIC7] -~w~Listen, I'm down at the Portland docks - -[VIC7_3A:VIC7] -~w~We got a big shipment just come in. Get yourself down here. I'm onboard the big freighter. - -[VIC7_3B:VIC7] -~w~I don't know Vinnie... I got stuff to do. - -[VIC7_3D:VIC7] -~w~But, from now on we'll be like partners.. okay. Better than partners... brothers! - -[VIC7_3E:VIC7] -~w~So, come on. What do you say? It's what Salvatore wants. - -[VIC7_3F:VIC7] -~w~Okay. For Salvatore. - -[VIC7_3G:VIC7] -~w~But if you pull any of that daddy bullshit, you're a dead man. - -[VIC7_4:VIC7] -~w~Wahaahha! I'm gonna cut you up little man! - -[VIC7_4A:VIC7] -~w~Meet Vincenzo at the ~y~Freighter. - -[VIC7_5:VIC7] -~w~Diiiiiiiiieee! - -[VIC7_6:VIC7] -~w~Hahahahahaha! - -[VIC7_7:VIC7] -~w~Is that dumb-ass gimp dead yet? - -[VIC7_8:VIC7] -~w~Hate to disappoint you Vinnie. - -[VIC7_9:VIC7] -~w~You son of a bitch! Why can't you just die already? - -[VIC7_10:VIC7] -~w~You should have never come back Toni. - -[VIC710A:VIC7] -~w~I've worked my fingers to the bone for Salvatore. - -[VIC710B:VIC7] -~w~And you just come wandering back to town and he's all, Toni this, and Toni that! - -[VIC7_11:VIC7] -~w~This is my town Toni! MY TOWN! - -[VIC711A:VIC7] -~w~You ain't taking it away from me! - -[VIC7_12:VIC7] -~w~I'm gonna enjoy this. - -[VIC7_4B:VIC7] -~w~The place looks deserted. Board the ~y~ship. - -[VIC7_13:VIC7] -~w~Head for the ~y~exit. - -[VIC7_3C:VIC7] -~w~Look, I know I've been an asshole to you Toni. And for that, I'm truly sorry. - -[VIC7HUL:VIC7] -~w~Head down to the ~y~hull. - -{=================================== MISSION TABLE SALS1 ===================================} - -[SALS1_1:SALS1] -NONE - -[SALS1_6:SALS1] -Kill ~r~Mayor R.C. Hole! - -[SALS1_7:SALS1] -Retrieve the mayor's ~g~mobile phone! - -[SALS1_8:SALS1] -~r~The mayor has finished his run. - -[SALS1_9:SALS1] -~r~The mayor has escaped. - -[SALS110:SALS1] -Take the phone to ~y~Salvatore. - -[SALS111:SALS1] -Drop the weapon or I'll shoot! - -[SALS112:SALS1] -They're on to you! The ~r~mayor~w~ is making a run for it! - -[SS1_AA:SALS1] -Yeah, its Toni. - -[SS1_AB:SALS1] -That bastard mayor is screwing with me and I don't take that kinda shit! - -[SS1_AC:SALS1] -Calm down, Sal. I'll see if I can take him out of the equation for you. - -[SS1_AD:SALS1] -You're a good boy, Toni, you do your father's memory proud. - -[SS1_AE:SALS1] -Listen, that fat fuck mayor should be taking his daily run in the park. - -[SS1_AF:SALS1] -You make sure he's out of breath... permanently! - -[SS1_AG:SALS1] -And get his phone! - -[SS1_AH:SALS1] -We can see who he's been talking to - -[SALS1AA:SALS1] -Yeah, it's Toni - -[SALS1AB:SALS1] -That bastard mayor is fucking with me. - -[SALS1AC:SALS1] -I don't take that shit! - -[SALS1AD:SALS1] -Relax. I'll take him out of the equation. - -[SALS1AE:SALS1] -You're a good boy, Toni. - -[SALS1AF:SALS1] -That fat fuck should be taking his daily run in the park. - -[SALS1AG:SALS1] -Make sure he's out of breath. Permanently! - -[SALS1AH:SALS1] -Oh yeah, get his phone! - -[SALS1AI:SALS1] -We can see who he's been talking to... - -[SALS1C1:SALS1] -Put down the weapon, sir! - -[SALS1C2:SALS1] -Stop or I'll shoot! - -[SALS1C3:SALS1] -Freeze! - -[SALS1C4:SALS1] -Don't be a fool! - -[SALS113:SALS1] -~r~The mayor's phone has been destroyed. - -[SALS114:SALS1] -Watch out! They'll shoot you if you enter the park armed. - -{=================================== MISSION TABLE SALS2 ===================================} - -[SALS2_1:SALS2] -~w~Get to the ~b~car. - -[SALS2_2:SALS2] -~w~Drive to the ~y~meeting place. - -[SALS2_3:SALS2] -~w~Get back in the ~b~car. - -[SALS2_4:SALS2] -~r~Mickey has been killed! - -[SALS2_5:SALS2] -~r~One of Salvatore's men has been killed! - -[SALS2AA:SALS2] -Toni, - -[SALS2AB:SALS2] -A few of the guys will be calling you later. - -[SALS2AC:SALS2] -Make sure you're around when they arrive. - -[SALS2AD:SALS2] -Ciao, Salvatore. - -[SALS2CA:SALS2] -Hey Toni? - -[SALS2CC:SALS2] -C'mon, get in, you're driving. - -[SALS2CD:SALS2] -Mickey, what, eerr, what's up? - -[SALS2CE:SALS2] -C'mon, Cipriani, what, you think I'm here to whack you? - -[SALS2BA:SALS2] -Salvatore's just down there... - -[SALS2BC:SALS2] -Toni, my boy, - -[SALS2BD:SALS2] -today's the day you're being made! - -[SALS2BE:SALS2] -Oh, Salvatore. Mr. Leone. - -[SALS2BF:SALS2] -Momma has been waiting for this day. - -[SALS2CB:SALS2] -Get in, c'mon we're going for a ride. - -[SALS2BB:SALS2] -Madonn' mia, what are you waiting for? - -[SALS2AF:SALS2] -Hey Toni thanks, I'll be in touch. - -{=================================== MISSION TABLE SALS3 ===================================} - -[SALS3_1:SALS3] -NONE - -[SALS3_2:SALS3] -Damage - -[SALS313:SALS3] -~r~The mayor's advisor is history! - -[SALS314:SALS3] -~r~Salvatore is history! - -[SALS3AA:SALS3] -Toni, hop in! - -[SALS3AB:SALS3] -Where we going? - -[SALS3AC:SALS3] -We're going to have a little chat with the mayor's assistant about Franco Forelli. - -[SALS3BA:SALS3] -Hey, get off my boat! - -[SALS3BB:SALS3] -You're coming with me. - -[SALS3BC:SALS3] -You can't do this! - -[SALS3BD:SALS3] -Hurry it up, the secret service will be watching! - -[SALS3CA:SALS3] -Toni, look out, gun men on those rocks! - -[SALS3CB:SALS3] -Gunmen up ahead! - -[SALS3CC:SALS3] -Watch the right, Toni! - -[SALS3CD:SALS3] -On the left, Toni, left! - -[SALS3CE:SALS3] -Gunmen on that jetty! - -[SALS3CF:SALS3] -Holy shit, secret service coming in by helicopter! - -[SALS3DA:SALS3] -The mayor wouldn't take a shit without Franco's say so! - -[SALS3DB:SALS3] -Nobody owned the mayor! - -[SALS3DC:SALS3] -Aargh! Wait, wait, you're right! - -[SALS3DE:SALS3] -The Sicilians? Why? - -[SALS3DF:SALS3] -They own Franco and they want a war between the Liberty Families. - -[SALS3DG:SALS3] -When the dust settles they're coming to take over. - -[SALS3DH:SALS3] -Toni, I'll call you later. - -[SALS3DI:SALS3] -Right now, I'm gonna flush this turd into the bay! - -[SALS3DD:SALS3] -It's those Sicilians... they pushed Franco into it. - -{=================================== MISSION TABLE SALS4 ===================================} - -[SALS4_1:SALS4] -NONE - -[SALS4BA:SALS4] -Yeah. - -[SALS4BB:SALS4] -Thank God you picked up! - -[SALS4BC:SALS4] -What's up, Sal? - -[SALS4BD:SALS4] -I went spying on the Forellis in Fort Staunton when all hell broke loose! - -[SALS4BE:SALS4] -The Sindaccos have gone to war with the Forellis, - -[SALS4BF:SALS4] -and I'm stuck here in the middle of a hit! - -[SALS4BG:SALS4] -I'll be right there. - -[SALS4BH:SALS4] -Bring my limo, it's bullet proof. We're gonna need it! - -[SALS4AA:SALS4] -Toni, let's get outta here! - -[SALS4AB:SALS4] -Get me back to the limo! - -[SALS4AE:SALS4] -OK, I got a place in Newport. Take me there! - -[SALS4AF:SALS4] -Hey Toni thanks, I'll be in touch. - -[SAL4_1:SALS4] -Go and pick up Mr. Leone's ~b~limo. - -[SAL4_2:SALS4] -~r~You have destroyed the car! - -[SAL4_3:SALS4] -Take the car to ~y~Fort Staunton. - -[SAL4_4:SALS4] -~r~You let Salvatore die! - -[SAL4_6:SALS4] -~b~Salvatore~w~ is down the alleyway. - -[SAL4_9:SALS4] -Get to the ~y~garage. - -[SAL4_11:SALS4] -You have left ~b~Salvatore ~w~behind! - -[SAL4_12:SALS4] -It's blocked, leave the limo here and go in on foot. - -[SAL4_13:SALS4] -Get back in the ~b~limo. - -[SAL4_14:SALS4] -Take Salvatore and the limo to the ~y~garage~w~ in Newport. - -[SAL4_15:SALS4] -Find ~b~Salvatore! - -[SAL4_16:SALS4] -Get Salvatore to the ~b~limo. - -[SAL4_17:SALS4] -Wait for ~b~Salvatore~w~ to get in the limo! - -{=================================== MISSION TABLE SALS5 ===================================} - -[SALS5_1:SALS5] -~w~Press~h~ ~k~ ~VEACC~ ~w~to take control of Paul Sindacco's car. - -[SALS5_2:SALS5] -~w~Take out the ~r~Forellis~w~ at the meet before Sindacco finds the control system. - -[SALS5_3:SALS5] -~r~Paul Sindacco has been killed! - -[SALS5_4:SALS5] -~r~Salvatore's van has been destroyed! - -[SALS5_5:SALS5] -~r~Sindacco has reached the meet! - -[SALS5_6:SALS5] -~w~Get to the ~b~van. - -[SALS5_7:SALS5] -~w~Time Left - -[SALS5_8:SALS5] -~r~Sindacco found the control system! - -[SALS5_9:SALS5] -~w~The satellite controls for Sindacco's car will be slow to respond to you. - -[SALS510:SALS5] -Damage - -[SALS5AA:SALS5] -Hey! - -[SALS5AB:SALS5] -Toni, it's me, I got something for you - - -[SALS5AC:SALS5] -You're gonna love it, it should be fun. - -[SALS5AD:SALS5] -What do you want done, Sal? - -[SALS5AE:SALS5] -There's a van nearby. - -[SALS5AF:SALS5] -Gimme a call when you find it. - -[SALS5BA:SALS5] -Ok Sal, I'm in the van. - -[SALS5BB:SALS5] -Good. We've messed around with Paulie Sindacco's car. - -[SALS5BC:SALS5] -So what do you want me to do? - -[SALS5BD:SALS5] -Paulie's going to a meet with the Forellis - - -[SALS5BE:SALS5] -he's trying to broker a truce. - -[SALS5BF:SALS5] -Use the gear in the van to take control of Paulie's car. - -[SALS5BG:SALS5] -and mess up the meet. - -[SALS5CA:SALS5] -What the-? - -[SALS5CC:SALS5] -Oh god, help! - -[SALS5CD:SALS5] -Get out of the way! - -[SALS5CF:SALS5] -Somebody help me! - -[SALS5CG:SALS5] -My car's possessed! - -[SALS5CE:SALS5] -This car's trying to kill me! - -[SALS5CB:SALS5] -Hey, what's happening here? - -{=================================== MISSION TABLE SALS6 ===================================} - -[SALS601:SALS6] -~w~Sal has left you a ~b~boat ~w~at the south west pier, stop the wise-guy. - -[SALS602:SALS6] -~w~He's heading along the coast. Go get ~r~him! - -[SALS603:SALS6] -~r~He's ~w~heading back to Franco Forelli! - -[SALS604:SALS6] -~r~The wise-guy made it back to Fort Staunton. - -[SALS605:SALS6] -~r~He got away! - -[SALS606:SALS6] -~r~He's ~w~getting away on foot! - -[SALS607:SALS6] -~w~He's getting away in a ~r~stolen car! - -[SALS608:SALS6] -~r~You can't chase him if you don't have a boat! - -[SALS6AA:SALS6] -Hello. - -[SALS6AC:SALS6] -Forelli-Sindacco feud. - -[SALS6AD:SALS6] -He's headed over to meet Franco Forelli right now. - -[SALS6AE:SALS6] -It works very much to our advantage that Franco knows nothing, - -[SALS6AF:SALS6] -and this war keeps on going. - -[SALS6AG:SALS6] -Take that blabbermouth out. - -[SALS6AH:SALS6] -You got it, Sal. - -[SALS6AB:SALS6] -Toni, some wiseguy's found out that the Sicilian Mob are behind the Forelli-Sindacco feud. - -[SLS6_20:SALS6] -~w~He's heading back to Franco Forelli, take ~r~him ~w~out! - -[SLS6_21:SALS6] -~w~Take ~r~him ~w~out! - -{=================================== MISSION TABLE NEDS1 ===================================} - -[NEDS1_1:NEDS1] -The FBI are on their way to pick up a corrupt report concerning today's sports stars. - -[NEDS1_2:NEDS1] -If the report is delivered to the FBI, innocent people will get prosecuted. - -[NEDS1_3:NEDS1] -I want you to intercept this report and deliver it to me, and I'll keep it safe. - -[NEDS1_4:NEDS1] -You will need an FBI vehicle. - -[NEDS1_5:NEDS1] -There was a botched armed robbery on the highway. The FBI are at the crime scene. - -[NEDS1_6:NEDS1] -Steal their car and get to the meeting place before it's too late. - -[NEDS1_8:NEDS1] -Get back in the ~b~FBI car! - -[NEDS1_9:NEDS1] -Go to the ~y~meeting place. - -[NEDS111:NEDS1] -Lose the cops! - -[NEDS113:NEDS1] -I have the report I promised here... - -[NEDS114:NEDS1] -What the... There's already an agent here!? - -[NEDS115:NEDS1] -Another FBI car? Wait! You're an impostor! - -[NEDS116:NEDS1] -Stop the ~r~informant! - -[NEDS117:NEDS1] -Retrieve the ~g~report. - -[NEDS118:NEDS1] -Deliver the report to ~y~Liberty Tree. - -[NEDS119:NEDS1] -~r~The FBI car you needed is history. - -[NEDS120:NEDS1] -~r~You were too late! The informant has delivered the report to the FBI! - -[NEDS121:NEDS1] -Good job Toni, God will be very happy with you. - -[NEDS122:NEDS1] -I'll make sure this stays in safe hands. - -[NEDS123:NEDS1] -Cheerio. - -[NEDS124:NEDS1] -~r~The report is ruined! - -[NEDS1AA:NEDS1] -Forgive me, Father, for I have sinned... - -[NEDS1AB:NEDS1] -Shit, the Devil's hit pay dirt with you, Antonio. - -[NEDS1AE:NEDS1] -Some poor sinner confessed to fabricating a report on doping our country's finest athletes. - -[NEDS1AF:NEDS1] -If you were to stop him giving this to the FBI, innocent careers would be saved. - -[NEDS1AG:NEDS1] -Consider it done, Father. - -[NEDS1BA:NEDS1] -You're early. - -[NEDS1BB:NEDS1] -Hey, I don't know you, where's John-O? - -[NEDS1BC:NEDS1] -John-O? He couldn't make it. - -[NEDS1BD:NEDS1] -Hey, that's John-O! - -[NEDS1BE:NEDS1] -Gimme that! - -[NEDS1BF:NEDS1] -Screw this! - -[NEDS1AD:NEDS1] -Ah, the second option's more my bag... - -[NEDS1AC:NEDS1] -Now either you can go off and say Hail Marys, or you can do the Lord's dirty work. - -[NEDS1_7:NEDS1] -Go to the crime scene and steal an ~b~FBI car~w~, then get to the meeting point before ~1~:~1~ hours. - -[NEDS125:NEDS1] -Go to the crime scene and steal an ~b~FBI car~w~, then get to the meeting point before 0~1~:~1~ hours. - -[NEDS126:NEDS1] -Go to the crime scene and steal an ~b~FBI car~w~, then get to the meeting point before 0~1~:0~1~ hours. - -[NEDS127:NEDS1] -Go to the crime scene and steal an ~b~FBI car~w~, then get to the meeting point before ~1~:0~1~ hours. - -{=================================== MISSION TABLE NEDS2 ===================================} - -[NEDS2_1:NEDS2] -NONE - -[NEDS2AA:NEDS2] -Forgive me, Father, for I have sinned... - -[NEDS2AB:NEDS2] -Holy crap Toni, what have you done now? - -[NEDS2AC:NEDS2] -Whoa! Language, Father. - -[NEDS2AD:NEDS2] -Oh yeah, Hail Mary full of whatever. - -[NEDS2AE:NEDS2] -A wayward soul has confessed to fencing diamonds. - -[NEDS2AF:NEDS2] -Help this pilgrim on the path to redemption, take the loot and I'll see the diamonds are returned... - -[NB2_2:NEDS2] -Get the ~g~briefcase~w~ and kill all the gang members. - -[NB2_3:NEDS2] -Take the case to the ~y~Liberty Tree offices. - -[NB2_4:NEDS2] -Get the ~g~briefcase! - -[NB2_1:NEDS2] -This is a setup! - -[NB2_6:NEDS2] -Kill all of the ~r~guards! - -[NB2_7:NEDS2] -Destroy the ~r~helicopter! - -[NB2_5:NEDS2] -Take out the ~r~helicopter~w~, the ~r~guards~w~ and get the ~g~briefcase. - -{=================================== MISSION TABLE NEDS3 ===================================} - -[NEDS3AA:NEDS3] -Forgive me, Father, for I have sinned... - -[NEDS3AB:NEDS3] -Toni, my son, compared to the degenerates in this town you're a saint! - -[NEDS3AC:NEDS3] -Their cars pump the Devil's bum gas into our children's lungs! They are defiling Eden! - -[NEDS3AD:NEDS3] -Go and show these sinners the error of their ways! - -[NEDS3_1:NEDS3] -Drive the firetruck around town causing as many pile-ups, crashes and acts of mayhem as possible. - -[NEDS3_2:NEDS3] -~w~Steal the ~b~Firetruck. - -[NEDS3_3:NEDS3] -~w~You have ~1~ seconds to return to the ~b~Firetruck. - -[NEDS3_4:NEDS3] -Rating - -[NEDS3_5:NEDS3] -Now go and cause as many pile-ups, crashes and as much general mayhem as possible! - -[NEDS3_6:NEDS3] -Pedestrian Splatted! - -[NEDS3_7:NEDS3] -Vehicle Sunk! - -[NEDS3_8:NEDS3] -Vehicle Destroyed! - -[NEDS3_9:NEDS3] -Vehicle Flipped! - -[NEDS310:NEDS3] -~r~The Firetruck has been destroyed. - -[NEDS311:NEDS3] -360° Spin Out! - -[NEDS312:NEDS3] -720° Spin Out! - -[NEDS313:NEDS3] -1080° Spin Out! - -[NEDS314:NEDS3] -~r~You left the Firetruck. - -[NEDS315:NEDS3] -Rolled Vehicle! - -[NEDS316:NEDS3] -Three smashes in a row! - -[NEDS317:NEDS3] -Four smashes in a row! - -[NEDS318:NEDS3] -Five smashes in a row! - -[NEDS319:NEDS3] -Massive pileup bonus! - -[NEDS320:NEDS3] -~r~You didn't get a high enough rating in time. - -[NEDS321:NEDS3] -Dismount Bonus! - -[NEDS322:NEDS3] -Dismount & Splat Bonus! - -[NEDS323:NEDS3] -Highflier Bonus! - -[NEDS324:NEDS3] -Massive Highflier Bonus! - -[NEDS325:NEDS3] -~w~You have less than 1 second to return to the ~b~Firetruck. - -[NEDS326:NEDS3] -Congratulations! You did it with ~1~ seconds left. - -[NEDS327:NEDS3] -~w~Now destroy the ~r~Firetruck.~w~ Don't leave any evidence. - -[NEDS328:NEDS3] -Bonus points are awarded for causing spectacular crashes, spinning, flipping or destroying vehicles. - -[NEDS329:NEDS3] -Flipped Vehicle x ~1~ - -[NEDS330:NEDS3] -Rolled Vehicle x ~1~ - -[NEDS332:NEDS3] -~w~You have 1 second to return to the ~b~Firetruck. - -[NEDS333:NEDS3] -Congratulations! NEW BEST TIME with ~1~ seconds left. - -[NEDS334:NEDS3] -~w~Now destroy the Firetruck. Don't leave any evidence. - -[NEDS335:NEDS3] -180° Spin Out! - -[NEDS337:NEDS3] -Drive the firetruck around town causing as many pile-ups, crashes and acts of mayhem as possible before ~1~:~1~ - -[NEDS338:NEDS3] -Drive the firetruck around town causing as many pile-ups, crashes and acts of mayhem as possible before ~1~:0~1~ - -[NEDS339:NEDS3] -Drive the firetruck around town causing as many pile-ups, crashes and acts of mayhem as possible before 0~1~:~1~ - -[NEDS340:NEDS3] -Drive the firetruck around town causing as many pile-ups, crashes and acts of mayhem as possible before 0~1~:0~1~ - -[NEDS341:NEDS3] -Cause as many pile-ups, crashes and acts of mayhem as possible before ~1~:~1~ - -[NEDS342:NEDS3] -Cause as many pile-ups, crashes and acts of mayhem as possible before ~1~:0~1~ - -[NEDS343:NEDS3] -Cause as many pile-ups, crashes and acts of mayhem as possible before 0~1~:~1~ - -[NEDS344:NEDS3] -Cause as many pile-ups, crashes and acts of mayhem as possible before 0~1~:0~1~ - -[NEDS331:NEDS3] -Cause as many pile-ups, crashes and acts of mayhem as possible! - -{=================================== MISSION TABLE NEDS4 ===================================} - -[NEDS4_1:NEDS4] -NONE - -[NEDS4_2:NEDS4] -~w~The three celebrities are heading to a radio station downtown for an interview before tonight's premiere. - -[NEDS4_3:NEDS4] -~w~The actress, Faith W, is flying in from Francis Airport in her private helicopter. - -[NEDS4_4:NEDS4] -~w~The gangster turned actor, DB-P, is coming by boat from Portland. - -[NEDS4_5:NEDS4] -~w~The aging alcoholic actor, Black Lightman, will be checking out from rehab and arriving in a limo. - -[NEDS4_8:NEDS4] -~w~Faith is down. - -[NEDS4_9:NEDS4] -~w~DB-P is down. - -[NEDS410:NEDS4] -~w~Black Lightman is down. - -[NEDS411:NEDS4] -~w~All three celebrities have been taken out. Get back to the ~y~church~w~ and let Father know. - -[NEDS412:NEDS4] -~r~Faith has arrived at the radio station! - -[NEDS413:NEDS4] -~r~DB-P has arrived at the radio station! - -[NEDS414:NEDS4] -~r~Black Lightman has arrived at the radio station! - -[NEDS415:NEDS4] -~w~He will switch to a bullet-proof patriot. - -[NEDS417:NEDS4] -~w~The patriot is bullet-proof. - -[NEDS418:NEDS4] -~w~Watch for the shooter. - -[NEDS421:NEDS4] -~w~Phil Cassidy's gun shop is represented by a flag icon on the radar. - -[NEDS4AA:NEDS4] -Forgive me, Father, for I have sinned again. - -[NEDS4AB:NEDS4] -And you shall be redeemed once more, my son. - -[NEDS4AC:NEDS4] -The cult of celebrity has gone too far! - -[NEDS4AD:NEDS4] -What kind of whore gives a radio interview instead of giving a hardworking newspaper journalist an exclusive? - -[NEDS4AF:NEDS4] -Destroy these false idols! - -[NEDS4BA:NEDS4] -I have done what you asked, father. - -[NEDS4BB:NEDS4] -Great! The paper's circulation has tripled since you found your soul. - -[NEDS4BC:NEDS4] -What? - -[NEDS4BD:NEDS4] -Thanks again for all your help, Toni! - -[NEDS4BE:NEDS4] -Hey, what the fuck? - -[NEDS4BF:NEDS4] -WHO ARE YOU? - -[NEDS422:NEDS4] -Get a Rocket Launcher from Phil Cassidy's Fully Cocked Gun Shop. - -[NEDS4_7:NEDS4] -~w~Don't allow any of the ~r~celebrities~w~ to reach the LCFR radio station! - -[NEDS416:NEDS4] -~w~Don't allow any of the ~r~celebrities~w~ to reach the LCFR radio station! - -[NEDS419:NEDS4] -~w~You will find heavy weaponry at Phil Cassidy's Fully Cocked Gun Shop. - -[NEDS420:NEDS4] -~w~Father Ned has paid for a Rocket Launcher. Pick it up at Phil Cassidy's gun shop. - -[NEDS4_6:NEDS4] -~w~If you need heavy weapons, get over to Phil Cassidy's gun shop. - -{=================================== MISSION TABLE DONS1 ===================================} - -[MORG_01:DONS1] -2-2-3, 3-2-3, 4-2-3, 5-2-3-... - -[MORG_02:DONS1] -Antonio! How wonderful to see you! - -[MORG_03:DONS1] -What's going on? - -[MORG_04:DONS1] -We're having a party, dear boy, a party. - -[MORG_05:DONS1] -Yes, a morgue party! - -[MORG_08:DONS1] -What the fuck you talking about, a morgue party? - -[MORG_09:DONS1] -We're going have quite a night tonight. - -[MORG_10:DONS1] -But first, we need to go and pick up the guests... - -[MORG_11:DONS1] -Come, before our guests get bored to death. - -[MORG_12:DONS1] -No pun intended! - -[MORG_13:DONS1] -'Cuz they're dead, you know... - -[MORG_14:DONS1] -Our guest of honor is taking a little trip to the pathology labs. - -[MORG_15:DONS1] -Let's not keep him waiting. - -[MORG_06:DONS1] -- The first of the season! ~n~ - Woah, woah, woah, woah... - -[DONS1_1:DONS1] -None - -[DL1_A:DONS1] -I am holding a morgue party and I want you to collect the 'guests'. - -[DL1_2:DONS1] -~r~You destroyed the car. - -[DL1_3:DONS1] -The cops have been alerted, lose your wanted level! - -[DL1_4:DONS1] -Take the car to Donald's ~y~garage. - -[DL1_6:DONS1] -~r~The hearse made it to the police station. - -[DL1_9:DONS1] -Drive the car into the respray shop. - -[DL1_5:DONS1] -Steal the ~b~hearse~w~ before it reaches it's destination. - -{=================================== MISSION TABLE DONS2 ===================================} - -[DONS2AA:DONS2] -DL? - -[DONS2AB:DONS2] -Toni! - -[DONS2AC:DONS2] -How's the campaign? - -[DONS2AD:DONS2] -It's down to the wire and every last vote's gonna count! - -[DONS2AE:DONS2] -O'Donovan's campaigners are working those marginal seats hard. - -[DONS2AF:DONS2] -Well we've got our own bandwagon, so get out there and spread the word! - -[DONS2BA:DONS2] -Vote O'Donovan for mayor! - -[DONS2BB:DONS2] -Vote O'Donovan for an end to corruption! - -[DONS2BC:DONS2] -Put your trust in O'Donovan as mayor! - -[DONS2BD:DONS2] -An end to crime! Vote O'Donovan! - -[DONS2BE:DONS2] -Vote for justice! Vote O'Donovan! - -[DONS2CA:DONS2] -O'Donovan has three wives! - -[DONS2CB:DONS2] -Who ate all the pies? O'Donovan! - -[DONS2CC:DONS2] -O'Donovan is a junky! - -[DONS2CD:DONS2] -O'Donovan believes in compulsory buggery! - -[DONS2CE:DONS2] -O'Donovan's a Communist! - -[DONS2CF:DONS2] -O'Donovan dresses in his daughter's underwear! - -[DONS2CG:DONS2] -O'Donovan gets naked with hogs! - -[DONS2CH:DONS2] -O'Donovan hates America! - -[DONS2CI:DONS2] -Love won't tax the wealthy! - -[DONS2CJ:DONS2] -Vote Love for pathology classes in schools! - -[DONS2CK:DONS2] -Donald Love believes in morgue access for all! - -[DONS2CL:DONS2] -Donald Love is a war hero! - -[DONS2CM:DONS2] -A vote for Love is a vote for happiness! - -[DONS2CN:DONS2] -Donald Love: tough on vegetarians! - -[DONS2_1:DONS2] -~w~Get in the ~b~van. - -[DONS2_3:DONS2] -~w~O'Donovan has put his ~r~vans~w~ out to win back the votes! - -[DONS2_4:DONS2] -~r~You failed to win enough votes! - -[DONS2_6:DONS2] -~w~Time Left - -[DONS2_7:DONS2] -~w~Get back in the ~b~van~w~ and continue with the mission. - -[DONS2_9:DONS2] -~w~O'Donovan has put another ~r~van~w~ out! - -[DONS210:DONS2] -~w~Areas Held - -[DONS211:DONS2] -~r~You lost all the voting areas! - -[DONS212:DONS2] -~r~You failed to take out the opposition! - -[DONS2_2:DONS2] -~w~Drive through the ~y~marginal voting area checkpoints~w~ to win their vote. - -[DONS215:DONS2] -~w~You lost an ~y~area~w~ to O'Donovan! - -[DONS216:DONS2] -~w~Don't let O'Donovan get all the ~y~areas~w~ back! - -[DONS213:DONS2] -~w~Now you have enough areas, take out the ~r~opposition vans~w~ to stop O'Donovan getting any more. - -[DONS2_8:DONS2] -~w~Get at least 5 of the ~y~voting areas. - -[DONS214:DONS2] -~w~You have less than 5 ~y~areas~w~, get them back! - -[DONS217:DONS2] -~w~Take extra areas to increase your completion bonus. - -[DONS2_5:DONS2] -~r~The Public Address Van has been destroyed. - -[DONS218:DONS2] -~w~Get at least 5 of the ~y~voting areas~w~ before ~1~:~1~ hours. - -[DONS219:DONS2] -~w~Get at least 5 of the ~y~voting areas~w~ before 0~1~:~1~ hours. - -[DONS220:DONS2] -~w~Get at least 5 of the ~y~voting areas~w~ before 0~1~:0~1~ hours. - -[DONS221:DONS2] -~w~Get at least 5 of the ~y~voting areas~w~ before ~1~:0~1~ hours. - -[DONS230:DONS2] -~w~Now you have enough areas, take out the ~r~opposition van~w~ to stop O'Donovan getting any more. - -{=================================== MISSION TABLE DONS3 ===================================} - -[CAMP_01:DONS3] -Antonio! Que pasa, amigo? - -[CAMP_02:DONS3] -You do know I'm Italian, don't you, Don, not Spanish. - -[CAMP_03:DONS3] -Of course, how silly of me - I just love all the romance languages. - -[CAMP_04:DONS3] -My God, this is good. - -[CAMP_05:DONS3] -It tastes just like chicken, but some how, more, err, sentient. - -[CAMP_06:DONS3] -You want some? - -[CAMP_07:DONS3] -I already ate, thanks. - -[CAMP_08:DONS3] -Too bad. It's fantastic. - -[CAMP_09:DONS3] -I have some more delicacies about to be served... - -[CAMP_10:DONS3] -the liberals would have a field day, of course, - -[CAMP_11:DONS3] -but how little they know of life's real pleasures! - -[CAMP_12:DONS3] -Sophistication and democracy have always been such uneasy bedfellows. - -[CAMP_13:DONS3] -Listen, Don, we need to win this election. - -[CAMP_14:DONS3] -Okay, we need to make sure that there's no skeletons in the closet, - -[CAMP_15:DONS3] -if you know what I mean... - -[CAMP_16:DONS3] -Right. - -[CAMP_17:DONS3] -What I mean is... - -[CAMP_18:DONS3] -how do we take care of this O'Donovan guy who is covering for... - -[CAMP_19:DONS3] -standing in for the Forelli's? - -[CAMP_20:DONS3] -The guy has a lot of people canvassing for him, - -[CAMP_21:DONS3] -all kinds of deluded 'people' people, if you know what I mean. - -[CAMP_22:DONS3] -I think we need to have their faith in democracy shaken, if you understand me. - -[CAMP_23:DONS3] -What you mean is that I gotta go beat the crap out of them? - -[CAMP_24:DONS3] -Oh, your passion, Antonio, it's it's... magnificent. - -[CAMP_25:DONS3] -It's so um... um...um... Wagnerian! You know?! Arriverdici, amigo. - -[CAMP_26:DONS3] -Humphries, bring out the offal! - -[DONS3_1:DONS3] -Toni must get rid of the opposition's campaign workers, thereby weakening the Forelli candidate, O'Donovan's, electoral campaign efficiency. - -[DONS3_2:DONS3] -~w~Kill the opposition's ~r~campaign workers. - -[DONS3_3:DONS3] -~r~You have run out of time. - -[DONS3_4:DONS3] -These ~r~campaigners ~w~are dealt with. Take out the next set. - -[DONS3_5:DONS3] -~w~Kill the opposition's ~r~campaign workers ~w~before ~1~:~1~ - -[DONS3_6:DONS3] -~w~Kill the opposition's ~r~campaign workers ~w~before ~1~:0~1~ - -[DONS3_7:DONS3] -~w~Kill the opposition's ~r~campaign workers ~w~before 0~1~:~1~ - -[DONS3_8:DONS3] -~w~Kill the opposition's ~r~campaign workers ~w~before 0~1~:0~1~ - -{=================================== MISSION TABLE DONS4 ===================================} - -[DONS410:DONS4] -Go to the ~y~Forelli Warehouse~w~ and torch their ballot papers! - -[DONS411:DONS4] -Torch the ~r~ballot papers~w~ and destroy the ~r~printing machines! - -[DONS412:DONS4] -Destroy the ~r~printing machine! - -[DONS413:DONS4] -Torch ALL the ~r~ballot papers! - -[DONS414:DONS4] -Destroy the remaining ~r~Forelli vans! - -[DONS416:DONS4] -~r~You lost a Forelli van! The Forellis can now rig the election! - -[DONS418:DONS4] -There are ~r~~1~ pallets~w~ of fake ballots remaining. - -[DONS419:DONS4] -There is only ~r~1 pallet~w~ of fake ballots remaining. - -[DONS420:DONS4] -Destroy the remaining ~r~Forelli van! - -[DONS421:DONS4] -The printing machine is destroyed! Now destroy the other ~r~printing machine! - -[DONS422:DONS4] -The printing machine is destroyed! - -[DONS423:DONS4] -Now get out of here! - -[DONS424:DONS4] -Destroy the ~r~printing machines! - -[DS4_AA:DONS4] -So many people, so much money, just waiting to be taken. - -[DS4_AB:DONS4] -I don't pretend to understand politics. - -[DS4_AC:DONS4] -Nobody really does. It's all bluff and corruption. - -[DS4_AD:DONS4] -The Forellis own a silent share of the company making the new voting machines. - -[DS4_AE:DONS4] -That's bad, right? - -[DS4_AF:DONS4] -Well, we certainly can't trust them. - -[DS4_AG:DONS4] -No, it's best if they all have a MAJOR malfunction, if you catch my drift. - -[DONS4H1:DONS4] -You will find heavy weaponry at Phil Cassidy's Fully Cocked Gun Shop. - -[DONS4AA:DONS4] -Antonio, good to see you! - -[DONS4AB:DONS4] -Now, I'm no Democrat, but even I draw the line at vote rigging. - -[DONS4AC:DONS4] -Did you know the Forellis own a silent share in a company making the new voting machines? - -[DONS4AD:DONS4] -That's bad, right? - -[DONS4AE:DONS4] -Well, we certainly can't trust them. - -[DONS4AF:DONS4] -No, it's best if they all have a MAJOR malfunction, if you catch my drift. - -[DONS4_8:DONS4] -Go to Phil Cassidy's Fully Cocked Gun Shop. - -[DONS4H2:DONS4] -Phil Cassidy's Fully Cocked Gun Shop is represented by a flag icon on the radar. - -[DONS427:DONS4] -Now get out of Fort Staunton! - -[DONS4_9:DONS4] -Phil Cassidy's gun shop will provide you with equipment to disrupt the Forelli campaign. - -[DONS417:DONS4] -There is another flamethrower at Phil Cassidy's gun shop. - -[DONS425:DONS4] -Get the flamethrower from Phil Cassidy's gun shop. - -[DONS426:DONS4] -~r~The shop worker is history! - -[DONS4H3:DONS4] -Donald Love has paid for a flamethrower. Go to the counter to pick it up. - -{=================================== MISSION TABLE DONS5 ===================================} - -[DONS5_7:DONS5] -Protect Donald's Limo! - -[DONS5_9:DONS5] -~r~Donald Love is history! - -[DONS513:DONS5] -Limo Damage - -[DONS516:DONS5] -Get in the ~b~Limo. - -[DONS517:DONS5] -You've left ~b~Donald Love~w~ behind! - -[DONS519:DONS5] -Get Donald to the ~y~safe house! - -[DONS520:DONS5] -Kill the ~r~attackers! - -[DONS521:DONS5] -Get in the ~b~limo! - -[DS5_AA:DONS5] -How I hate publicity, but its all part of the game, right? - -[DS5_AB:DONS5] -'Fraid so. - -[DS5_AC:DONS5] -The Forellis are going to try and take me out, aren't they? - -[DS5_AD:DONS5] -Don't worry, I'm going to be riding shotgun. - -[DS5_AE:DONS5] -Oh well, here goes everything. - -[DS5_BA:DONS5] -Shit! This is ridiculous! - -[DS5_BB:DONS5] -Don't panic, I'll deal with these assholes! - -[DS5_BC:DONS5] -There's a rifle in the trunk! - -[DS5_BD:DONS5] -Lock the doors - this won't take long! - -[DS5_CA:DONS5] -Ok, we're good to go. - -[DS5_CB:DONS5] -There's another hitman after us! - -[DS5_DA:DONS5] -I can't fight an election as a virtual recluse. - -[DS5_DB:DONS5] -We'll have to think about using different tactics. - -[DONS522:DONS5] -Take Donald back to his ~y~building! - -{=================================== MISSION TABLE DONS6 ===================================} - -[DONS6_1:DONS6] -NONE - -[DS6_00:DONS6] -Go and follow the ~b~ballot van. - -[DS6_01:DONS6] -Wait until the ~b~courier ~w~makes the exchange. - -[DS6_02:DONS6] -Get the ballots from the ~r~courier. - -[DS6_03:DONS6] -Kill the ~r~courier. - -[DS6_04:DONS6] -Take the ~g~package. - -[DS6_05:DONS6] -Go and follow the ~b~ballot van~w~ again. - -[DS6_06:DONS6] -~r~You killed a courier before the exchange! - -[DS6_07:DONS6] -You've missed one of the exchanges, you can't miss another! - -[DS6_08:DONS6] -~r~You missed two exchanges, the vote can't be fixed! - -[DS6_09:DONS6] -~r~You spooked him! - -[DS6_10:DONS6] -~r~The van was destroyed! - -[DS6_11:DONS6] -You ran out of time! - -[DS6_12:DONS6] -~r~You didn't catch the van! - -[DS6_13:DONS6] -~r~The van can't run without its driver! - -[DS6_15:DONS6] -~r~You've spooked the driver, you'll never catch him now! - -[DS6_16:DONS6] -~1~ - -[DS6_17:DONS6] -~w~The chase driver is dead, take the van to ~y~Donald's garage. - -[DONS6AA:DONS6] -Bad news Toni! - -[DONS6AB:DONS6] -What? - -[DONS6AC:DONS6] -The exit polls are neck and neck. - -[DONS6AD:DONS6] -Time for plan B. - -[DONS6AE:DONS6] -We steal some of the uncounted votes, and replace them with some of our own. - -[DONS6AF:DONS6] -What was that you said about vote rigging? - -[DONS6AG:DONS6] -Oh, shut up! - -[DS6_14:DONS6] -Go back for the ~g~ballots~w~, you can't leave them behind! - -[DS6_66:DONS6] -~r~You destroyed a courier's car before the exchange! - -[DS6_18:DONS6] -You killed a courier before the exchange! Don’t kill any more! - -[DS6_21:DONS6] -Hurry! There is another exchange taking place! - -[DS6_22:DONS6] -You missed the first exchange, you can't miss another! - -[DS6_23:DONS6] -You missed the second exchange, you can't miss another! - -[DS6_24:DONS6] -You missed the third exchange, you can't miss another! - -[DS6_25:DONS6] -You missed the fourth exchange, you can't miss another! - -[DS6_26:DONS6] -You scared off a courier before the exchange! Don’t scare off any more! - -[DS6_28:DONS6] -~r~You messed up! The vote can no longer be fixed! - -{=================================== MISSION TABLE DONS7 ===================================} - -[ELEC_01:DONS7] -Hey Don - I took care of that mess for you. - -[ELEC_02:DONS7] -Everything should be cool now. - -[ELEC_03:DONS7] -Really. - -[ELEC_04:DONS7] -You got no more links to organized crime. - -[ELEC_05:DONS7] -You're whiter than white. You could be the pope. - -[ELEC_07:DONS7] -Although no links can be proved between Donald Love - -[ELEC_08:DONS7] -and Liberty City's organized crime, - -[ELEC_09:DONS7] -it seems his friendship with mobsters including Toni Cipriani, - -[ELEC_11:DONS7] -have counted heavily against him in voters' eyes. - -[ELEC_12:DONS7] -The past few hours have seen his popularity plummet. - -[ELEC_13:DONS7] -He is deemed, it seems, unfit for office... - -[ELEC_14:DONS7] -Unfit! Because of you... - -[ELEC_15:DONS7] -Yeah. And it's all your fault. - -[ELEC_16:DONS7] -My fault? - -[ELEC_17:DONS7] -Oh yeah. - -[ELEC_18:DONS7] -My fault? - -[ELEC_19:DONS7] -I can't believe the sacrifices I've made for this town, - -[ELEC_20:DONS7] -and do you know what my weakness has been the entire time...? - -[ELEC_21:DONS7] -Humility! And now I'm ruined. - -[ELEC_22:DONS7] -BANKRUPT! $20 million in the hole. - -[ELEC_23:DONS7] -Gone... bankrupt... done... Arriverderci! BANKRUPT! - -[ELEC_06:DONS7] -The Pope! watch this. - -[DONS7_1:DONS7] -O'Donovan links Donald Love to Salvatore Leone. Donald Love's political career stands on a knife's edge. Toni must destroy the evidence. - -[DONS7_2:DONS7] -~w~Go and steal the ~b~van~w~ containing the evidence. - -[DONS7_3:DONS7] -~r~You killed the contact. - -[DONS7_4:DONS7] -~w~Take the van to the ~y~drop off point. - -[DONS7_5:DONS7] -~w~Get back into the ~b~van. - -[DONS7_7:DONS7] -Get into the ~b~contact's car. - -[DONS7CA:DONS7] -Ah, Toni. - -[DONS7CB:DONS7] -The evidence is in that van up ahead. - -[DONS7CC:DONS7] -You'll have to fight your way in. - -[DONS7CD:DONS7] -Get the van back to DL's. - -[DONS7CE:DONS7] -Good luck! - -[DONS713:DONS7] -~w~Park the van inside the ~y~garage. - -[DONS714:DONS7] -~r~You destroyed the van! - -[RMN_AA:DONS7] -There'll be much celebrating tonight as the industrial action that brought Liberty City to a stand-still, - -[RMN_AB:DONS7] -has finally come to a close. - -[RMN_AC:DONS7] -Normal service has been resumed on all subway and ferry routes. - -[RMN_AD:DONS7] -Even the Elevator Bridge linking Staunton Island to Shoreside Vale has reopened for business. - -[RMN_AE:DONS7] -Militant strikers have finally dropped their placards and taken up their usual posts of employment - -[RMN_AF:DONS7] -after the freshly inaugurated Mayor O'Donovan made them this promise at a local rally. - -[RMN_AG:DONS7] -As your mayor I can guarantee there will ALWAYS be a ferry service in Liberty City. - -[RMN_AH:DONS7] -But, some may find his promise has a somewhat hollow ring, - -[RMN_AI:DONS7] -as work on the new Porter Road Tunnel continues unabated. - -[DONS7_6:DONS7] -~w~Meet Donald Love's ~b~man ~w~under the overpass in Newport. - -{=================================== MISSION TABLE RAYS1 ===================================} - -[SAYO_01:RAYS1] -So you're the pain in the neck, huh? - -[SAYO_02:RAYS1] -Excuse me? - -[SAYO_03:RAYS1] -Got all kinds of important people very pissed off at you. - -[SAYO_04:RAYS1] -Leon McAffrey, LCPD. - -[SAYO_05:RAYS1] -I don't know what you're talking about. - -[SAYO_06:RAYS1] -I'm in the restaurant business. - -[SAYO_07:RAYS1] -Whatever you say tough guy. - -[SAYO_08:RAYS1] -You greaseballs wanna put holes in each other, I don't give a shit. - -[SAYO_09:RAYS1] -All I care about is my cut. - -[SAYO_12:RAYS1] -My cut! Where is it? - -[SAYO_13:RAYS1] -Up your ass, buddy. Don't make me laugh. - -[SAYO_14:RAYS1] -You keep fucking with me, I'll put you, your friends, your friend's families, - -[SAYO_15:RAYS1] -your whole fucking home town under the sword. - -[SAYO_16:RAYS1] -Relax. Go get laid or something. - -[SAYO_17:RAYS1] -This is business - a partnership - equals. - -[SAYO_18:RAYS1] -I keep the law off your back - the feds, Rico - - -[SAYO_19:RAYS1] -and you keep me in the shit that I like. - -[SAYO_20:RAYS1] -Well how do I know I ain't about to be shaken down - -[SAYO_21:RAYS1] -by every dirty cop from here to Vice City? - -[SAYO_22:RAYS1] -I'm gonna help you take over this town. - -[SAYO_23:RAYS1] -In return I want some cash and a few favors. - -[SAYO_24:RAYS1] -Now c'mon, Toni, take a drive with me... - -[SAYO_25:RAYS1] -we're gonna meet your old friends, the Sindaccos. - -[SAYO_10:RAYS1] -- I love a man of principle. ~n~ - Well me too. I go to all their memorial services in fast cars with hot broads. - -[RS1_YK:RAYS1] -Damage - -[RS1_01:RAYS1] -Wipe out the ~r~Sindaccos. - -[RS1_02:RAYS1] -~r~The car was destroyed! - -[RS1_03:RAYS1] -~r~The Yakuza were massacred! - -[RS1_04:RAYS1] -~w~Kill some ~r~Sindaccos ~w~to get their attention. - -[RS1_05:RAYS1] -~w~Get in Leon's ~b~car. - -[RS1_06:RAYS1] -~w~Head out to ~y~Sindacco territory. - -[RS1_07:RAYS1] -~w~Head back to the ~b~car. - -[RS1_10:RAYS1] -~r~You killed Leon! - -[RAYS1AA:RAYS1] -Okay, I'll take the wheel, you start blasting! - -[RAYS1AB:RAYS1] -I thought you said Yakuza would do the heavy work! - -[RAYS1AC:RAYS1] -Adapt and survive, Cipriani. Adapt and survive. - -[RAYS1BA:RAYS1] -Shit, this is getting too high profile. - -[RAYS1BB:RAYS1] -I gotta make myself scarce, see you around Toni. - -[RAYS1CA:RAYS1] -Eyes front, Toni! - -[RAYS1CB:RAYS1] -Behind us Toni, behind us! - -[RAYS1CC:RAYS1] -Watch out on the left! - -[RAYS1CD:RAYS1] -On the right, Toni, the right! - -[RAYS1CE:RAYS1] -Get back in the car! - -[RAYS1CF:RAYS1] -Watch what you're doing! - -[RAYS1OS:RAYS1] -Oh shit! - -{=================================== MISSION TABLE RAYS2 ===================================} - -[RS2_02:RAYS2] -~w~Quickly, get on a ~b~bike! - -[RS2_03:RAYS2] -~w~Lure the bikers to the ~y~kill zone! - -[RS2_04:RAYS2] -~w~Go back, you can't leave any ~r~Forellis ~w~behind! - -[RS2_05:RAYS2] -~w~Get back on the ~b~bike! - -[RS2_06:RAYS2] -~r~You need a bike to lure the Forellis. - -[RS2_07:RAYS2] -~r~The Yardies want to spill Forelli blood themselves. - -[RS2_08:RAYS2] -~r~None of the Yardies survived! - -[RS2_09:RAYS2] -~1~ - -[RS2_10:RAYS2] -~r~They can't chase you if they don't have any bikes! - -[RAYS2AA:RAYS2] -You took your time, Toni. - -[RAYS2AB:RAYS2] -You say jump, I say screw you. - -[RAYS2AD:RAYS2] -Cute. Now listen. - -[RAYS2AE:RAYS2] -The Yardies have their greedy eyes on Forelli turf in Newport. - -[RAYS2AF:RAYS2] -Get over there and lure the Forelli soldiers down to the hospital in Rockford. - -[RAYS2AG:RAYS2] -The Yardies will be waiting for them. - -[RAYS2AH:RAYS2] -What's in this for you? - -[RAYS2AI:RAYS2] -I owe them. Catch you later. - -[RS2_11:RAYS2] -Don't kill any of the Forellis! - -[RS2_12:RAYS2] -Take ~r~them ~w~out! - -[RS2_01:RAYS2] -~w~Go and steal one of the Forellis' ~b~bikes~w~, but don't kill any of them. - -[RAYS2DB:RAYS2] -Yeah. C'mon, let's take it to 'em! - -[RS2_13:RAYS2] -~r~Too many Yardies were killed! - -{=================================== MISSION TABLE RAYS3 ===================================} - -[CRAZ_01:RAYS3] -I don't know what I did wrong in my past life to deserve you. - -[CRAZ_02:RAYS3] -Ray, you're 40 years old, and you have no idea what's really going on. - -[CRAZ_03:RAYS3] -I don't know how you've gotten this far. - -[CRAZ_04:RAYS3] -I don't know how somebody hasn't put a bullet in your mother Theresa head yet. - -[CRAZ_05:RAYS3] -Hey watch your mouth, Leon. - -[CRAZ_06:RAYS3] -I can't believe we're having this fucking conversation. - -[CRAZ_07:RAYS3] -What, are you gonna run to mommy? - -[CRAZ_08:RAYS3] -Are you gonna jump on daddy's knee? - -[CRAZ_09:RAYS3] -Ask for a wet kiss? - -[CRAZ_10:RAYS3] -Hey Toni! - -[CRAZ_14:RAYS3] -He's gonna make sure I do everything by the book! - -[CRAZ_15:RAYS3] -Toni Cipriani, Ray Machowski. - -[CRAZ_16:RAYS3] -He's with us. Hey we're gonna go fight organized crime now. - -[CRAZ_17:RAYS3] -You run along to the precinct, fill out a report. - -[CRAZ_18:RAYS3] -You're a good kid... Let's go, Toni. - -[CRAZ_19:RAYS3] -You piece of shit, Leon. - -[CRAZ_11:RAYS3] -- Freeze, asshole. ~n~ - WOAH! Woah! Woah! Easy! Meet my new partner. Mr. Hip! - -[RAYS3_1:RAYS3] -Help the Yakuza take over the Forelli held territory of Belleville Park. The player must kill ~1~ Forellis using only a katana. - -[RAYS3_2:RAYS3] -~w~Kill ~1~ ~r~Forellis~w~ using only the supplied katana. - -[RAYS3_3:RAYS3] -Kills - -[RAYS3_4:RAYS3] -~w~You have to kill the ~r~Forellis~w~ using the katana. - -[RAYS3_5:RAYS3] -~w~You don't have a katana. Collect a ~g~replacement. - -[RAYS3_6:RAYS3] -~r~You ran out of time. - -[RAYS3_7:RAYS3] -~w~Kill ~1~ ~r~Forellis~w~ using only the supplied katana before ~1~:~1~ - -[RAYS3_8:RAYS3] -~w~Kill ~1~ ~r~Forellis~w~ using only the supplied katana before ~1~:0~1~ - -[RAYS3_9:RAYS3] -~w~Kill ~1~ ~r~Forellis~w~ using only the supplied katana before 0~1~:~1~ - -[RAYS310:RAYS3] -~w~Kill ~1~ ~r~Forellis~w~ using only the supplied katana before 0~1~:0~1~ - -{=================================== MISSION TABLE RAYS4 ===================================} - -[RAYS4_1:RAYS4] -~w~The Yardies are under attack in Newport. Take out the attacking ~r~Sindaccos. - -[RAYS4_2:RAYS4] -~w~Go speak to the ~b~Yardie Gang Leader. - -[RAYS4_3:RAYS4] -~w~Follow the ~b~Yardie Gang Leader. - -[RAYS4_4:RAYS4] -~r~One of the Yardies has been killed! - -[RAYS4_5:RAYS4] -~w~Protect the Yardies until the ambulance arrives. - -[RAYS4_6:RAYS4] -~w~Get back and protect the Yardies. - -[RAYS4_7:RAYS4] -~w~Clear a path for the Yardies to reach the ambulance. - -[RAYS4_8:RAYS4] -~w~Go and meet the ~y~ambulance. - -[RAYS4AA:RAYS4] -Cipriani, we must stop meeting like this. - -[RAYS4AB:RAYS4] -Fine by me. - -[RAYS4AC:RAYS4] -C'mon, lighten up a little. - -[RAYS4AD:RAYS4] -What you got for me, McAffrey? - -[RAYS4AE:RAYS4] -Those Yardie boys are having a little trouble holding onto their newly acquired turf in Newport. - -[RAYS4AF:RAYS4] -Seems now the Sindaccos want it back. - -[RAYS4BA:RAYS4] -Me Boy Rudyard got himsel' capped! - -[RAYS4BB:RAYS4] -Come on, we got to get him a bone wagon! - -[RAYS4BC:RAYS4] -Shit, more Sindacco boo boos! - -[RAYS4BD:RAYS4] -I'll get the ambulance, you go help my boys! - -[RAYS4BE:RAYS4] -Let's get out of here! - -[RAYS4BF:RAYS4] -Here comes the ambulance! - -[RAYS4BG:RAYS4] -Thanks, Mr. Cipriani, we owe you one! - -{=================================== MISSION TABLE RAYS5 ===================================} - -[RAYS5_1:RAYS5] -NONE - -[RAYS5AA:RAYS5] -What, no flowers? - -[RAYS5AB:RAYS5] -I didn't know it was your funeral. - -[RAYS5AC:RAYS5] -You're a regular comedian, Toni, real funny guy. - -[RAYS5AD:RAYS5] -The Forellis are getting serious. - -[RAYS5AE:RAYS5] -They're running arms and taking a cut of the merchandise themselves, - -[RAYS5AF:RAYS5] -tooling up for trouble. - -[RAYS5AG:RAYS5] -They're moving the guns to Fort Staunton in trucks. - -[RAYS5AH:RAYS5] -It's been a gas. - -[RAYS5AI:RAYS5] -Likewise. - -[RAY5_2:RAYS5] -They've called in backup. - -[RAY5_3:RAYS5] -~r~The Forellis got the munitions! - -[RAY5_4:RAYS5] -Hey, it's Cipriani! - -[RAY5_5:RAYS5] -Waste him! - -[RAY5_6:RAYS5] -That's one down, now destroy the other ~r~truck. - -[RAY5_1:RAYS5] -Destroy the ~r~trucks~w~ before they reach their destination! - -[RAY5_7:RAYS5] -Destroy the ~r~truck~w~ before they get enough ammo from it. - -[RAY5_8:RAYS5] -~r~You did not destroy the truck in time! - -{=================================== MISSION TABLE SALH1 ===================================} - -[SLH1_F1:SALH1] -~r~You killed one of the Hoods. - -[SLH1_F2:SALH1] -~w~Lure out the Forellis by smashing up their ~r~cars. - -[SLH1_F3:SALH1] -~w~Exact revenge on the ~r~Forellis. - -[SLH1_F4:SALH1] -~w~Lure out more Forellis by smashing up another ~r~car. - -[SLH1_F5:SALH1] -~w~Don't leave the ~b~Hoods~w~ behind. - -[SLH1_B0:SALH1] -~w~Ok, Cuz. Let's smoke this town. - -[SLH1_B1:SALH1] -~w~Hey! Get back here, fool! - -[SLH1_B2:SALH1] -~w~Come on, you cracker! I ain't never gonna fit my ass in there! - -[SLH1_B3:SALH1] -~w~Damn right! You don't wanna go nowhere without me. - -[SLH1_B4:SALH1] -~w~Damn! That was intense, man! - -[SLH1_B6:SALH1] -~w~...no offence Toni. - -[SLH1_B7:SALH1] -~w~It's time for Hoods to rise up and do the right thing! - -[SLH1_B8:SALH1] -~w~Come on! Let's smoke 'em! - -[SLH1_C0:SALH1] -~w~My brother! - -[SLH1_C1:SALH1] -~w~Yo! Fool! Where you goin'? - -[SLH1_C2:SALH1] -~w~Just where in the hell am I supposed to sit my ass? - -[SLH1_C3:SALH1] -~w~Damn right! You don't wanna go nowhere without me. - -[SLH1_C4:SALH1] -~w~Sheee-it! I seen some shit right there! - -[SLH1_D0:SALH1] -~w~Hey! That's my car! - -[SLH1_D1:SALH1] -~w~I like it better this way! - -[SLH1_E0:SALH1] -~w~What the hell's going on? - -[SLH1_E1:SALH1] -~w~We're kicking your asses outta here! That's what's going on! - -[SLH1_X0:SALH1] -Got threat - -[SLH1_X1:SALH1] -Had threat - -[SLH1_X2:SALH1] -Find threat - -[SLH1_F0:SALH1] -~w~Pick up the ~b~Hoods~w~ then get the ~r~Forellis~w~ attention. - -[RUFJ_01:SALH1] -Here's your lawyer, Mr. Leone. - -[RUFJ_02:SALH1] -I know who the hell he is, pal... - -[RUFJ_03:SALH1] -Come on, gimme a break here. - -[RUFJ_04:SALH1] -Go on, kid, run along, and say hello to your mother for me, capiche? - -[RUFJ_05:SALH1] -Alright... You got five minutes. - -[RUFJ_06:SALH1] -Listen, uh, Lionel, you're looking good. - -[RUFJ_07:SALH1] -Look at me! - -[RUFJ_08:SALH1] -A fine member of the community, and suddenly I'm banged up. - -[RUFJ_09:SALH1] -It really challenges my philanthropic nature! - -[RUFJ_10:SALH1] -Of course, Mr. Leone. - -[RUFJ_11:SALH1] -We're doing everything we can to get you out of here and uh... - -[RUFJ_12:SALH1] -back to helping your community as soon as possible. - -[RUFJ_13:SALH1] -Of course. - -[RUFJ_14:SALH1] -I hope we can sue someone for this outrage. - -[RUFJ_15:SALH1] -Those cunts the Sindaccos, or those cocksuckers, the Forellis - who was it? - -[RUFJ_16:SALH1] -Who ratted me out? - -[RUFJ_18:SALH1] -Let's hit 'em both hard. - -[RUFJ_19:SALH1] -Way I see it, they both could use a good beating for this outrage. - -[RUFJ_22:SALH1] -Thank you - Toni - you really mean a lot to me, - you know that. - -[RUFJ_23:SALH1] -Listen, you might need some back up. - -[RUFJ_24:SALH1] -Use the hoods. Okay? - -[RUFJ_25:SALH1] -Whatever you think is best, Mr. Leone. - -[RUFJ_26:SALH1] -Alright... Get outta here... Lionel. - -[RUFJ_20:SALH1] -- Motherfuckers. ~n~ - It will be my pleasure. - -{=================================== MISSION TABLE SALH2 ===================================} - -[SALH2AA:SALH2] -~w~Hey Sal! It's me... Toni. - -[SALH2AB:SALH2] -~w~Toni! It's good to hear your voice kid. - -[SALH2AC:SALH2] -~w~These chumps won't let me see nobody! - -[SALH2AD:SALH2] -~w~Listen, I got plenty of business to take care of. - -[SALH2AE:SALH2] -~w~Take Paulie Sindacco. His family's finished in this town. - -[SALH2AF:SALH2] -~w~But he thinks he can just run away, like he's got no dues to pay. - -[SALH2AG:SALH2] -~w~I'm in jail because of that bastard! - -[SALH2AH:SALH2] -~w~Make that son of a bitch pay. - -[SALH2O1:SALH2] -~w~Intercept Paulie Sindacco at the ~y~Cochrane Dam Power House. - -[SALH2F1:SALH2] -~r~He got away! Salvatore will not be happy! - -[SALH2CA:SALH2] -~w~You idiots! That's Toni Cipriani! Get him! - -[SALH2BA:SALH2] -~w~Hey Toni! Why don't you swim over here and kiss my ass! - -[SALH2BB:SALH2] -~w~Hey over here, asshole! - -[SALH2BI:SALH2] -~w~Give my regards to Salvatore. I'll send him a postcard! - -[SALH2BC:SALH2] -~w~What you gonna do now jerk? - -[SALH2BE:SALH2] -~w~You're dead meat! - -[SALH2BF:SALH2] -~w~You ain't nothing! - -[SALH2BG:SALH2] -~w~Surprise! Dirtbag! - -[SALH2BH:SALH2] -~w~Ladies and gentlemen, Paulie Sindacco has left the building! - -[SALH2BD:SALH2] -~w~You ain't got a chance of catching me, asshead! - -[SALH2O2:SALH2] -~w~Kill ~r~Paulie Sindacco~w~. Don't let him get away! - -[SALH2O3:SALH2] -Get some wheels and ambush ~r~Paulie~w~ from the shore. - -{=================================== MISSION TABLE SALH3 ===================================} - -[SALH3_1:SALH3] -~w~Sal? How's it going? - -[SALH3_2:SALH3] -~w~Fuckin' bene! Just great! - -[SALH3_3:SALH3] -~w~Number one, the new mayor is fixing it so I don't get bail. - -[SALH3_4:SALH3] -~w~Number two, we're stuck fighting the God-damn Triads and Diablos. - -[SALH3_5:SALH3] -~w~Number three, I hear that the fuckin' Yakuza are gonna make a play to take over the city. - -[SALH3_6:SALH3] -~w~Other than that, everything is just peachy! - -[SALH3_7:SALH3] -~w~After all these years of mob control, we've finally flushed it all down the crapper! - -[SALH38:SALH3] -~w~Boss, I can take care of everything. - -[SALH39:SALH3] -~w~The Yakuza have got a load of weapons in Aspatria. - -[SALH310:SALH3] -~w~Nothing can stop them now! - -[SALH311:SALH3] -~w~We'll see about that. - -[SALH3_A:SALH3] -~w~Check out the ~y~Yakuza Compound. - -[SALH3C1:SALH3] -~w~Find a way inside the ~y~Compound. - -[SALH3C2:SALH3] -~w~Holy Shit! I don't fucking believe it! - -[SALH3C3:SALH3] -~w~Destroy the ~r~Tank! - -[SALH3C4:SALH3] -~w~What the fuck?! - -[SALH3C5:SALH3] -~w~Kill him! - -[SALH3C6:SALH3] -~w~The ~r~Tank ~w~is well armored. Normal weapons won't wreck this heavy piece of hardware! - -[SALH3G1:SALH3] -~w~Hey 'buddy', there is nothing in there for you! - -[SALH3G2:SALH3] -~w~Seems like this yard is for Yakuza only. - -[SALH3G3:SALH3] -~w~Move your ass away from there! - -[SALH3_B:SALH3] -~w~The Yakuza car fooled them! - -[SALH3_C:SALH3] -~w~Drive into the ~y~Compound~w~ and take a look around. - -{=================================== MISSION TABLE SALH4 ===================================} - -[SALH4_1:SALH4] -~w~Sal? You there? - -[SALH4_2:SALH4] -~w~Anthony! I'm getting out! - -[SALH42A:SALH4] -~w~My arraignment's today! - -[SALH4_3:SALH4] -~w~Great! - -[SALH44C:SALH4] -~w~Yeah, Toni. Whatever. - -[SALH44E:SALH4] -~w~Hey, the guards are coming now... I'll see you round the front. - -[SALH4_5:SALH4] -~w~Go get a police car! - -[SALH45A:SALH4] -~w~You need a cop car or you'll spook the convoy! - -[SALH4_6:SALH4] -~w~Get into position at the ~y~station. - -[SALH4_7:SALH4] -~w~Holy Shit! - -[SALH4_8:SALH4] -~w~Protect the ~b~transport van~w~ and make sure it arrives in one piece! - -[SALH4_9:SALH4] -~w~Don't get too far from the ~b~transport van! - -[SALH410:SALH4] -~w~You're going to lose the ~b~transport van! - -[SALH411:SALH4] -~r~You lost the transport van! Sal has been executed! - -[SALH412:SALH4] -~r~The transport van was destroyed! - -[SALH413:SALH4] -~w~Don't piss the cops off - you'll ruin Sal's plans for bail! - -[SALH416:SALH4] -~w~Escort the ~b~convoy~w~ to its destination. - -[SALH417:SALH4] -~r~You blew it! The cops have called off the court hearing! - -[SALH420:SALH4] -~r~Sal was killed! - -[SALH421:SALH4] -~r~You lost the transport van! - -[SALH422:SALH4] -~w~Lose the heat or you'll draw too much attention to the convoy! - -[SALH424:SALH4] -~w~Take out the ~y~blockade! - -[SALH415:SALH4] -~w~It's good to be a free man again. - -[SALH418:SALH4] -~w~But listen. I'm gonna head up to the house and get out of these stinking rags, okay? - -[SALH419:SALH4] -~w~I'll meet you up there. - -[SALH414:SALH4] -~w~Illegal roadblock reported in the area... - -[SALH44A:SALH4] -~w~With me in here, who's stopping them from taking over? - -[SALH4_4:SALH4] -~w~Yeah, but I got this notion that the Sicilians don't want me to make it to court. - -[SALH44B:SALH4] -~w~Hey, they'd have to get by me first Sal. - -[SALH44D:SALH4] -~w~Just make sure I get my day in court! - -{=================================== MISSION TABLE SALH5 ===================================} - -[SALH51A:SALH5] -~w~Step on it, Toni. - -[SALH51B:SALH5] -~w~If I'm right, then the Sicilians will be going after the mayor. - -[SALH51C:SALH5] -~w~We gotta get to him before they do. - -[SALH511:SALH5] -~w~This don't look good. - -[SALH554:SALH5] -~w~Step on it Toni! - -[SALH512:SALH5] -~w~You left ~b~Sal~w~ behind - go back and get him. - -[SALH513:SALH5] -~w~God-damnit! They're here already! - -[SALH560:SALH5] -~w~Burn 'em down Toni! - -[SALH561:SALH5] -~w~I'm gonna get the mayor! - -[SALH514:SALH5] -~w~Lousy bastards have taken him already! - -[SALH555:SALH5] -~w~Come on Toni! This way! - -[SALH515:SALH5] -~w~There they are! - -[SALH517:SALH5] -~w~Where did those bastards come from? - -[SALH556:SALH5] -~w~Behind us Toni! - -[SALH562:SALH5] -~w~Toni, up ahead! - -[SALH519:SALH5] -~w~Toni! Take out the chopper! - -[SALH522:SALH5] -~w~They think they can hide at the lighthouse! - -[SALH557:SALH5] -~w~Take those bastards out! - -[SALH558:SALH5] -~w~Great shooting Toni! - -[SALH559:SALH5] -~w~Now let's put this thing to bed. - -[SALH526:SALH5] -~w~I'll drive! You keep us covered! - -[SALH527:SALH5] -~w~Okay Toni... this is it. - -[SALH528:SALH5] -~w~How many bastards are on this rock? - -[SALH553:SALH5] -~w~Shoot one bastard, and another one bites you on the ass! - -[SALH523:SALH5] -~r~You left Salvatore to be murdered by the Sicilians! - -[SALH524:SALH5] -~r~Salvatore was killed! - -[SALH552:SALH5] -~r~The mayor was killed! - -[SALH573:SALH5] -~r~You destroyed your boat! You lost them! - -[SALH516:SALH5] -~w~Take out the guards and then let's get after them in that boat! - -[SALH518:SALH5] -~w~Another ~r~boat~w~ incoming... - -[SALH525:SALH5] -~w~Ha! They've left a rocket launcher on this thing! - -[SALH520:SALH5] -~y~I'll move closer to shore so we're more protected... Take it down! - -[SALH521:SALH5] -~w~Good work! Let's move out! - -[SALH53A:SALH5] -~w~Torini... it figures. - -[SALH53B:SALH5] -~w~Give him up! - -[SALH53C:SALH5] -~w~The mayor is mine! - -[SALH53D:SALH5] -~w~THIS CITY is mine! - -[SALH53E:SALH5] -~w~Salvatore... - -[SALH53F:SALH5] -~w~Sicily never wanted questo schifo di citta. - -[SALH53G:SALH5] -~w~But, when tribute dried up, what could we do...? - -[SALH53H:SALH5] -~w~It was nothing personal. - -[SALH53I:SALH5] -~w~Nothing personal? - -[SALH53J:SALH5] -~w~After what you put me through! - -[SALH53K:SALH5] -~w~I'm gonna tear your fuckin' heart out! - -[SALH5TD:SALH5] -~w~Take down ~r~Massimo's helicopter! - -[SALH5MO:SALH5] -~r~Massimo~w~ is moving off! - -[SALH5GO:SALH5] -~r~Massimo got away! - -[SALH571:SALH5] -~w~Head for the ~y~Pier. - -[SALH570:SALH5] -~w~Take out those ~r~Sicilian mobsters! - -[SALH572:SALH5] -~w~Take out that ~r~Sicilian wise guy! - -[SALH510:SALH5] -~w~Head over to ~y~City Hall.~w~ Watch out for any Sicilian wise guys! - -[SICI_01:SALH5] -No, I'll talk to you later... - -[SICI_04:SALH5] -Hey we're both back. You and me! - -[SICI_05:SALH5] -We did it, huh? - -[SICI_06:SALH5] -You know it. - -[SICI_07:SALH5] -We cleaned it up with the Forellis. - -[SICI_08:SALH5] -The Sindaccos we sent into the fucking sea. - -[SICI_09:SALH5] -Now, I got the Sicilians on the phone, wanting peace. - -[SICI_10:SALH5] -We all want peace! But my peace, not their fucking peace. - -[SICI_11:SALH5] -I'm the big man now. - -[SICI_12:SALH5] -No chump from the old country is gonna tell me what to do. - -[SICI_13:SALH5] -I told them to go fuck themselves. - -[SICI_14:SALH5] -You did? Was that wise? - -[SICI_15:SALH5] -Hey, I'm the boss now. ME! - -[SICI_16:SALH5] -Now let's go see the mayor about getting my charges dropped... - -[FIN1_01:SALH5] -Hey! Mr. Mayor! - -[FIN1_03:SALH5] -Yeah, thanks. - -[FIN1_04:SALH5] -And that means... - -[FIN1_05:SALH5] -Uh... the city is grateful to you? - -[FIN1_06:SALH5] -Try again. - -[FIN1_07:SALH5] -That you work for me, right? - -[FIN1_08:SALH5] -Oh yeah, that I work for you. - -[FIN1_09:SALH5] -Good. Now, don't call us. We'll call you. - -[FIN1_10:SALH5] -Get outta here, prick. - -[FIN1_11:SALH5] -Thank you, Mr. Leone. - -[FIN1_12:SALH5] -Toni. We did it. We run things now. You and me. - -[FIN1_13:SALH5] -We're a team, huh? - -[FIN1_14:SALH5] -Now, I just need you to do one small thing for me; - -[FIN1_15:SALH5] -I got some problems that I been dealing with... - -[FIN2_01:SALH5] -Hey Uncle! How ya doin' huh? - -[FIN2_02:SALH5] -You look good. - -[FIN2_03:SALH5] -Ahhhh Salvatore, all we really wanted was clarity. - -[FIN2_04:SALH5] -Yes, uncle. I appreciate that. - -[FIN2_07:SALH5] -Good, very good. - -[FIN2_08:SALH5] -Sneaky little bastard. - -[FIN2_09:SALH5] -I wouldn't trust him a fucking inch. - -[FIN2_23:SALH5] -Every dog has his day... - -[FIN2_10:SALH5] -Yeah, but we did it. - -[FIN2_11:SALH5] -Yeah. We cleaned up. You did good, Toni. You did real good. - -[FIN2_12:SALH5] -I always knew you was a good kid. You saved my ass a few times. - -[FIN2_13:SALH5] -And I appreciate that kind of loyalty. - -[FIN2_14:SALH5] -Thank you. - -[FIN2_15:SALH5] -A good worker. I like that. Respectful. - -[FIN2_19:SALH5] -You can put a price on friendship? - -[FIN2_20:SALH5] -The kind of friendship you and me have? - -[FIN2_21:SALH5] -Shame on you! Come here. - -[FIN2_22:SALH5] -You're a good kid, but shame on you. - -[SICI_02:SALH5] -- Hey Toni! ~n~ - Sal! You're back where you belong. - -[FIN2_05:SALH5] -- So, we are at peace now - you and the old country? ~n~ - Of course. Me and all my people. - -[FIN2_16:SALH5] -- So I got you that half million I promised you. ~n~ - Half? Woah! I thought you, uh, said a couple? - -[FIN2_18:SALH5] -I said one million dollars! But what? - -[FIN1_02:SALH5] -We just saved you from that bunch of crazed Sicilians. - -{=================================== MISSION TABLE DONH1 ===================================} - -[DONH1JA:DONH1] -~w~Toni, my ex-mentor, Avery Carrington, is flying into town today... - -[DONH1JB:DONH1] -~w~It's come to my attention that he's working for the Panlantic Corporation. - -[DONH1JC:DONH1] -~w~They'll do anything to get prime real estate. - -[DONH1JD:DONH1] -~w~We HAVE to get hold of his plans to acquire land. - -[DONH1JE:DONH1] -~w~Come on Toni! Get after him! - -[DONH1CA:DONH1] -~w~Uh Toni, transportation would be a boon. - -[DONH1DA:DONH1] -~w~Head for the Airport, Toni. - -[DONH1DB:DONH1] -~w~We don't have a minute to lose. - -[DONH1EA:DONH1] -~w~Oh yes. This is one of my better plans, for sure... - -[DONH1EB:DONH1] -~w~I never knew I had it in me... - -[DONH1EC:DONH1] -~w~This is going to make me a fortune... - -[DONH1ED:DONH1] -~w~Yes sir, a fortune... - -[DONH1EE:DONH1] -~w~Even Avery would be proud. - -[DONH1GA:DONH1] -~w~There he is! - -[DONH1GB:DONH1] -~w~Kill him Toni! - -[DONH1GC:DONH1] -~w~I need those plans! - -[DONH1HA:DONH1] -~w~Please, Toni... he's getting away! - -[DONH1IA:DONH1] -~w~Oh, capital, Toni! ...quite literally! - -[DONH1IB:DONH1] -~w~Now lets get this back to the safety of my, erm, 'place of abode'. - -[DONH1O0:DONH1] -~w~Take Donald Love to the ~y~Airport. - -[DONH1O1:DONH1] -~w~Kill ~r~Avery Carrington~w~ and get his plans! - -[DONH1O2:DONH1] -~r~Avery~w~ is making a run for it! Stop him! - -[DONH1O3:DONH1] -~r~Avery~w~ has got another ride. Don't let him get away! - -[DONH1O4:DONH1] -~r~Avery~w~ is making a run for it! Get him! - -[DONH1O5:DONH1] -~w~Pick up ~b~Donald Love. - -[DONH1O6:DONH1] -~w~Good job! Pick up the ~g~plans. - -[DONH1O7:DONH1] -~w~Take Donald and the plans back to the ~y~Flop-House. - -[DONH1O8:DONH1] -~w~You've dropped the ~g~plans~w~! Go back and pick them up. - -[DONH1OA:DONH1] -~w~They're on to you! ~r~Avery's~w~ making a run for it! Kill him! - -[DONH1OB:DONH1] -~w~You need a vehicle. - -[DONH1OC:DONH1] -~w~Don't lose ~b~Donald! - -[DONH1OD:DONH1] -~w~Be careful! The plans will be lost if ~r~Avery's car~w~ is destroyed while he's in it! - -[DONH1OE:DONH1] -~r~Avery Carrington~w~ is escaping. Get after him! - -[DONH1F0:DONH1] -~r~The plans were destroyed! - -[DONH1F1:DONH1] -~r~Avery Carrington escaped! - -[DONH1F2:DONH1] -~r~Donald was killed! - -[DONH1OF:DONH1] -~r~Avery Carrington~w~ is nearly at his destination. Stop him! - -[DONH1O9:DONH1] -~w~Don't leave ~b~Donald~w~ behind! Those Colombians will kill him! - -[DONH1FA:DONH1] -~w~Hmmm, Panlantic must have employed the Cartel to protect Avery. - -[LAND_01:DONH1] -I know what you're thinking, Toni - how the mighty have fallen, - -[LAND_02:DONH1] -but this is just a temporary blip, my man. - -[LAND_03:DONH1] -Okay. - -[LAND_04:DONH1] -Oh, don't be all touchy. - -[LAND_05:DONH1] -I know I said some nasty things about this being your fault and all, - -[LAND_06:DONH1] -but hubris is a nasty, nasty bedfellow - almost as nasty as termites. - -[LAND_07:DONH1] -And trust me I've tried both recently. - -[LAND_08:DONH1] -Wait, you and me... are on our way back! - -[LAND_09:DONH1] -I never went away... - -[LAND_10:DONH1] -We're in this together, amigo. - -[LAND_11:DONH1] -No, we're not. - -[LAND_12:DONH1] -Please! - -[LAND_13:DONH1] -Please... please - forget about it, buddy. - -[LAND_18:DONH1] -Come - I'll tell you about it on the drive. - -[LAND_19:DONH1] -I hope you have your car. Mine's in the, err, shop... Yeah! - -[LAND_16:DONH1] -- 10% of what? This? Oh you're too kind. ~n~ - Not of this... of something really big. - -[LAND_14:DONH1] -- 'It's all your fault.' Pathetic. ~n~ - 10%? - -{=================================== MISSION TABLE DONH2 ===================================} - -[DONH2_1:DONH2] -~w~Go to the ~y~church~w~ on Staunton Island. - -[DONH2_2:DONH2] -~w~Beat up the ~r~reporter ~w~or target him with a gun to make him give you the photos. - -[DONH2_3:DONH2] -~w~You got some photos of me. Where are they? - -[DONH2_4:DONH2] -~w~Don't hurt me! - -[DONH2_5:DONH2] -~w~Where are the God-damn photos? - -[DONH2_6:DONH2] -~w~I don't know what you're talking about! - -[DONH2_7:DONH2] -~w~Where are they? - -[DONH2_8:DONH2] -~w~Please, no! - -[DONH2_9:DONH2] -~w~Come on you little pussy! Give 'em up! - -[DONH210:DONH2] -~w~Okay! Okay! - -[DONH2EX:DONH2] -~w~I'll get you the photos! - -[DONH211:DONH2] -~w~...I stashed the film in my lock-up! - -[DONH212:DONH2] -~w~Go to the ~y~reporter's lock-up. - -[DONH213:DONH2] -~w~Help! Help! I'm being kidnapped! - -[DONH214:DONH2] -~w~Help! He's going to kill me! - -[DONH215:DONH2] -~w~...I'm too gifted to die! - -[DONH216:DONH2] -~w~...I can't die, I'm still working on my novel! - -[DONH217:DONH2] -~w~My editor never said anything about this shit! - -[DONH218:DONH2] -~w~Don't move a muscle, assweed! - -[DONH219:DONH2] -~w~Stop right there, dickhead! - -[DONH220:DONH2] -~w~For crying out loud, will you stop running away! - -[DONH221:DONH2] -~w~Toni! At last! - -[DONH222:DONH2] -~w~A reporter witnessed us killing Avery! - -[DONH223:DONH2] -~w~He has photos! Oh, God! I'm finished! - -[DONH224:DONH2] -~w~Calm down will you! Where is this reporter? - -[DONH225:DONH2] -~w~Oh, Toni, you're wonderful! - -[DONH226:DONH2] -~w~Apparently he's been working on an undercover job at the church on Staunton Island. - -[DONH227:DONH2] -~w~Get the photos and bury him! - -[DONH228:DONH2] -~r~Ned escaped! - -[DONH230:DONH2] -~w~Kill ~r~Ned Burner. - -[DONH231:DONH2] -~r~Ned died before you got the photos! - -[DONH229:DONH2] -BULLSHIT - -[DONCUTA:DONH2] -~w~Here they are... take them! I didn't get them processed yet. - -[DONCUTB:DONH2] -~w~You piece of shit! - -[DONH2SM:DONH2] -Scare - -[DONH233:DONH2] -Keep intimidating the reporter. If his scare meter gets too low, he may try to escape. - -[DONH2LB:DONH2] -~w~You left ~b~the reporter ~w~behind. Go back and get him. - -[DONH2LC:DONH2] -~r~You lost the reporter. - -{=================================== MISSION TABLE DONH3 ===================================} - -[DONH3I1:DONH3] -~w~I'm back! - -[DONH3I2:DONH3] -~w~Back from the dead, Toni! Risen anew, like a phoenix from the ashes. - -[DONH3I3:DONH3] -~w~Like Lazarus... yes... Lazarus Love! - -[DONH3I4:DONH3] -~w~Ah, I'm going to be rich again! - -[DONH3I5:DONH3] -~w~Panlantic are going to pay me a fortune to see this deal through! - -[DONH3I6:DONH3] -~w~We did it Toni! - -[DONH3I7:DONH3] -~w~Whatever. - -[DONH3I8:DONH3] -~w~It's time for a little soiree with a very exclusive guest list. - -[DONH3I9:DONH3] -~w~Come on! - -[DONH3C1:DONH3] -~w~We're going to need some transportation, Toni. We don't have much time. - -[DONH3L1:DONH3] -~w~You need ~b~Donald.~w~ Go back and get him! - -[DONH3L2:DONH3] -~w~Come on Toni! We haven't got long! - -[DONH3L3:DONH3] -~w~Put the corpse back! - -[DONH3_5:DONH3] -~w~Toni, I've been dying for this party. - -[DONH35D:DONH3] -~w~Just like my guests. - -[DONH35A:DONH3] -~w~Find a ~b~corpse. - -[DONH35B:DONH3] -~w~Get ~b~Avery's corpse. - -[DONH35C:DONH3] -~w~Get ~b~Ned's corpse. - -[DONH3_6:DONH3] -~w~Take Donald and Avery to the ~y~Airport. - -[DONH36A:DONH3] -~w~Hey! Bring that ambulance back! - -[DONH36B:DONH3] -~w~Avery. - -[DONH36C:DONH3] -~w~Oh, Avery! How you've aged since we last met. - -[DONH36D:DONH3] -~w~...you used to feed me such pearls of wisdom. - -[DONH36E:DONH3] -~w~...and soon I shall dine again! - -[DONH36F:DONH3] -~w~...My God! He's wearing a wig! - -[DONH36G:DONH3] -~w~Toni. Take me and Avery over to his private jet at the airport. - -[DONH3_7:DONH3] -~w~Take Donald and Ned to the ~y~Airport. - -[DONH37F:DONH3] -~w~Toni. Take me and Ned here to the Airport. - -[DONH37A:DONH3] -~w~Hey! That guy's stealing the stiff! - -[DONH37B:DONH3] -~w~Ah, Ned Burner, ace reporter. - -[DONH37C:DONH3] -~w~Ah, Ned. I'm going to give you exclusive rights to - -[DONH37D:DONH3] -~w~cover my wonderful party. - -[DONH37E:DONH3] -~w~I wouldn't invite just anyone to my little bash you know. - -[DONH37G:DONH3] -~w~Invitations are to die for. - -[DONH3_8:DONH3] -~w~Take Avery's body to the ~y~Airport. - -[DONH3_9:DONH3] -~w~Take Ned's body to the ~y~Airport. - -[DONH3A1:DONH3] -~w~Be sure to get Avery's gamey old remains here before security discovers us. - -[DONH3A2:DONH3] -~w~His autopsy is scheduled anytime now. - -[DONH3N1:DONH3] -~w~Be sure to get Ned Burner's corpse here before security discover us. They'll be interring him anytime now. - -[DONH3F1:DONH3] -~r~Love is dead. - -[DONH3F2:DONH3] -~r~You lost Avery's body! - -[DONH3F3:DONH3] -~r~You lost Ned's body! - -[DONH3C2:DONH3] -~w~Airport Security will lock Avery Carrington's Hangar at 22:00. - -[DONH3F4:DONH3] -~r~Too late - airport security have locked the hanger! - -[DONH3F5:DONH3] -~r~Too late - airport security have found Donald with Avery's corpse! - -[DONH3W1:DONH3] -~w~Hurry up! Airport Security will lock Avery Carrington's Hangar at 22:00. - -[DONH3F6:DONH3] -~r~Too late - airport security have found Donald with Ned's corpse! - -{=================================== MISSION TABLE DONH4 ===================================} - -[DONH4A:DONH4] -~w~Donald sent me to pick up some... er... hardware. - -[DONH4B:DONH4] -~w~A'ight. - -[DON4EX1:DONH4] -~w~I got what you boys need. But it's gonna cost. - -[DON4EX2:DONH4] -~w~Don said you'd pay me up front and he'd 'reimburse' you later. - -[DONH4C:DONH4] -~w~...I bet he did. - -[DONH4D:DONH4] -~w~Yeah, yeah right! Why don't you make it out to, 'Kiss My Ass'? - -[DONH4E:DONH4] -~w~Now, where's the hardware? - -[DONH4F:DONH4] -~w~Shit son! Hardware like this takes time to put together. - -[DON4EX4:DONH4] -~w~I'll be in touch. - -[DONH4G:DONH4] -Mission Passed! - -[DONH4_1:DONH4] -NONE - -[DONH4PS:DONH4] -~w~8-ball will let you know when the hardware is ready. - -{=================================== MISSION TABLE DONH5 ===================================} - -[DONH5_0:DONH5] -Van - -[DNH5_A0:DONH5] -~w~Look man, this truck is loaded. Know what I'm saying? Drive cool. - -[DNH5_A1:DONH5] -~w~Yeah? It's all good. - -[DNH5_A2:DONH5] -~w~Sure. I'll put him on. - -[DNH5_A3:DONH5] -~w~Toni, we're one little job away from being fabulously rich. - -[DNH5_A4:DONH5] -~w~We've scoured plans of Fort Staunton. Its weakest points are along the old subway that runs underneath the area. - -[DNH5_A5:DONH5] -~w~Great Don! All I gotta do is dodge a hundred wacko Italians. - -[DNH5_A6:DONH5] -~w~Just head along the Porter Tunnel and you'll find your way in just fine. - -[DNH5_B0:DONH5] -~w~Hey! You're not supposed to be down here! - -[DNH5_B1:DONH5] -~w~Get the hell out of here! - -[DNH5_C0:DONH5] -~w~Get in the ~b~van. - -[DNH5_C4:DONH5] -~w~Place the ~y~explosives! - -[DNH5_C5:DONH5] -~w~Place the remaining ~y~explosives! - -[DNH5_C6:DONH5] -~w~Escape through the ~y~subway entrance! - -[DNH5_D0:DONH5] -~w~The Forellis? What are they doing here? - -[DNH5_D1:DONH5] -~w~Don't let the Forellis wreck the van! - -[DNH5_1:DONH5] -~w~Use a vehicle to smash through the gates - -[DONH5_2:DONH5] -~w~Ram the gates harder! - -[DNH5_X0:DONH5] -~r~You wrecked the van! - -[DNH5_C1:DONH5] -~w~Get back in the ~b~van. - -[DNH5_C2:DONH5] -~w~Head for one of the Porter Road Tunnel ~y~entrances. - -[DNH5_C3:DONH5] -~w~Follow the ~y~tunnel. - -[DNH5_E0:DONH5] -~w~Kill those ~r~construction workers. - -[DNH5_E1:DONH5] -~w~Kill that ~r~construction worker. - -[DNH5_E2:DONH5] -~w~The Forellis have blocked the way back. Find another ~y~exit. - -[DNH5_E3:DONH5] -~w~Use a vehicle to smash through the gates and reach the ~y~exit. - -[DNH5_X1:DONH5] -~r~The Forellis wrecked the van! - -[DNH5_W1:DONH5] -~w~Don't get too far from the ~b~van! - -[DNH5_E4:DONH5] -~w~Don't leave any ~r~witnesses. - -{=================================== MISSION TABLE DONH6 ===================================} - -[DONH6_V:DONH6] -~r~v1.00 - -[DONH6_1:DONH6] -~w~Head up to the ~y~house. - -[DONH6_5:DONH6] -~w~Oh, my God! Toni! Do something! - -[DONH6_6:DONH6] -~w~You have ~1~ seconds to return to the grounds! - -[DONH6_7:DONH6] -Return Time - -[DONH6_8:DONH6] -~r~You failed to return to the mansion... Donald has been executed! - -[DONH610:DONH6] -~w~Get a car! - -[DONH611:DONH6] -~w~Oh good lord! There's more of them! - -[DONH624:DONH6] -~W~Floor it Toni! - -[DONH612:DONH6] -~w~We made it! - -[DONH623:DONH6] -~w~Take me to Avery's jet. He and Ned are still onboard, so I won't be travelling alone. - -[DONH622:DONH6] -~w~Head to ~y~Avery's jet. - -[DONH613:DONH6] -~w~Let's get to the airport. - -[DONH625:DONH6] -~w~Head to the ~y~airport. - -[DONH615:DONH6] -~w~You left ~b~Donald~w~ behind! Go back and get him! - -[DONH619:DONH6] -~r~Donald was killed! - -[DONH6_9:DONH6] -~w~D? Come on! Let's go! - -[DONH614:DONH6] -~w~Are you sure it's safe, Toni? - -[DONH616:DONH6] -~w~Oh... my... GARDEN! - -[DOH616A:DONH6] -~w~Look what you've done to my beautiful garden! - -[DONH617:DONH6] -~w~D... we can do some landscaping or escaping. It's up to you. - -[DONH618:DONH6] -~w~Get me to the airport! - -[DONH620:DONH6] -~w~I do so hate goodbyes my friend. - -[DOH620A:DONH6] -~w~Let's just say 'adieu'. - -[DONH621:DONH6] -~w~D... it's been an education. - -[DONH66S:DONH6] -~w~You have ~1~ second to return to the grounds! - -[DONH66A:DONH6] -~w~Take out those ~r~Colombian gangsters! - -[DONP_01:DONH6] -Caterpillars... cater... cater... cater... cat... No that's no good. - -[DONP_02:DONH6] -Ohmmmmmmmm. Dammit. - -[DONP_03:DONH6] -It's just so... Oh, shit if I just had something cold to cuddle up to, - -[DONP_06:DONH6] -Antonio! Oh, I'm just seeking spiritual enlightenment, - -[DONP_07:DONH6] -if you must ask, but not today. - -[DONP_08:DONH6] -Maybe tomorrow. - -[DONP_09:DONH6] -Your message seemed kinda anxious. - -[DONP_10:DONH6] -Anxious? I'm meditating. Anxious, moi? - -[DONP_11:DONH6] -I'm at one with the universe. That's just impossible. - -[DONP_12:DONH6] -Oh, shit, that's right. - -[DONP_13:DONH6] -Um, there is a load of Colombians coming up here - -[DONP_14:DONH6] -to potentially kill me if I don't keep my mouth shut and pay them all off. - -[DONP_15:DONH6] -Oh! I guess that would explain all the Colombians hovering around outside. - -[DONP_16:DONH6] -Oh shit! Please, Antonio, you have to get me out of here! - -[DONP_17:DONH6] -I don't want to... Please! I don't wanna die! I don't... - -[DONP_18:DONH6] -So much for being at one with the universe, huh? - -[DONP_19:DONH6] -Thank you, Toni! I'll make it... I'll make it worth your while, I promise. - -[DONP_04:DONH6] -- it'd be so easy... ~n~ - What's going on, D? - -{=================================== MISSION TABLE TOSH1 ===================================} - -[TOSH1AB:TOSH1] -~w~Stop him! - -[TOSH1AC:TOSH1] -~w~Get him! - -[TOSH1AD:TOSH1] -~w~Shoot him! - -[TOSH1AA:TOSH1] -~w~There he is! - -[TOSH120:TOSH1] -~w~Steal the Yakuza ~b~arms shipment~w~ from Bedford Point. - -[TOSH121:TOSH1] -~w~You'll have to get past the ~r~Yakuza guards. - -[TOSH122:TOSH1] -~w~Look out for more ~r~Yakuza boats. - -[TOSH130:TOSH1] -~w~Take the weapons to ~y~Toshiko's contact. - -[TOSH131:TOSH1] -~w~Get back to the ~b~arms shipment. - -[TOSH1BA:TOSH1] -~w~That's some damn fine artillery you've got there boy! - -[TOSH1BB:TOSH1] -~w~You know, I do so much business at these docks I should've set myself up here, - -[TOSH1BC:TOSH1] -~w~not half way down the God-damn island! - -[TOSH1BD:TOSH1] -~w~Well, it's been a blast! - -[TOSH1DB:TOSH1] -~r~The weapons have been destroyed! - -[TOSH1PH:TOSH1] -~w~The Yakuza will be guarding their shipment. You may need to call in at Phil Cassidy's on the way. - -[DEAD_01:TOSH1] -So this is the big tough gangster? - -[DEAD_02:TOSH1] -You don't look so tough. - -[DEAD_03:TOSH1] -... Thanks. - -[DEAD_04:TOSH1] -Do you know what it is to live without love, Mr Toni? - -[DEAD_05:TOSH1] -It is to live with hate... - -[DEAD_06:TOSH1] -I'll take your word for it. - -[DEAD_07:TOSH1] -It is my earnest wish to destroy a man, Mr. Cipriani. - -[DEAD_08:TOSH1] -Destroy... not merely kill. - -[DEAD_09:TOSH1] -I want him, and his whole organization, weakened and humiliated before he dies. - -[DEAD_10:TOSH1] -I want him to suffer. - -[DEAD_11:TOSH1] -Okay. - -[DEAD_12:TOSH1] -This man I want you to destroy is my husband: Kazuki Kasen. - -[DEAD_13:TOSH1] -Don't worry. - -[DEAD_14:TOSH1] -For your services you will be handsomely rewarded. - -[DEAD_15:TOSH1] -Well what if I say no? - -[DEAD_16:TOSH1] -You won't... because while I merely want him dead, you need him dead. - -[DEAD_17:TOSH1] -In truth, you have already dealt him a severe blow, Mr. Cipriani. - -[DEAD_18:TOSH1] -However, he is taking delivery of more munitions today. - -[DEAD_19:TOSH1] -I want you to steal those weapons from right under his ignorant nose. - -{=================================== MISSION TABLE TOSH2 ===================================} - -[TOSH2AA:TOSH2] -~w~Mr. Toni. - -[TOSH2AL:TOSH2] -~w~My husband was greatly infuriated by your actions. - -[TOSH2AB:TOSH2] -~w~You have made him, and his men, - -[TOSH2AM:TOSH2] -~w~look like the fools they are. - -[TOSH2AC:TOSH2] -~w~I aim to please. What's next princess? - -[TOSH2AE:TOSH2] -~w~My husband is moving a great quantity of cash from his Casino. - -[TOSH2AF:TOSH2] -~w~I want you to destroy all of that money. - -[TOSH2AG:TOSH2] -~w~I can find a damn good use for that money, sweetheart. - -[TOSH2AH:TOSH2] -~w~I want his money burning in the street for all to see. - -[TOSH2AI:TOSH2] -~w~Okay... okay... when's this move gonna happen? - -[TOSH2AJ:TOSH2] -~w~It has already begun. - -[TOSH2AK:TOSH2] -~w~They're leaving the casino right now, so please, you don't have much time. - -[TOSH2O0:TOSH2] -~w~Destroy ALL the ~r~security vans.~w~ Don't let any reach the ~y~Yakuza compound! - -[TOSH2O1:TOSH2] -~w~They're running! Don't let any ~r~vans~w~ escape! - -[TOSH2O2:TOSH2] -~w~You've spooked them! Don't let the ~r~vans ~w~escape! - -[TOSH2E1:TOSH2] -~w~The ~r~convoy~w~ is getting near the ~y~Yakuza compound! - -[TOSH2E2:TOSH2] -~w~A ~r~van~w~ is nearly at the ~y~Yakuza compound! - -{=================================== MISSION TABLE TOSH3 ===================================} - -[TOSH3M1:TOSH3] -~w~Anyone home? - -[TOSH3M2:TOSH3] -~w~Mr. Toni? A moment please... - -[TOSH3M3:TOSH3] -~w~My husband is furious. - -[TOSH3EA:TOSH3] -~w~He wonders how you come to know when and where to attack him so precisely. - -[TOSH3M4:TOSH3] -~w~Unless he's a fool, he'll work it out soon enough. - -[TOSH3M5:TOSH3] -~w~Perhaps, we should help him. His men gossip like old women. - -[TOSH3EB:TOSH3] -~w~Let's give them something to talk about. - -[TOSH3M6:TOSH3] -~w~Where are we going? - -[TOSH3M7:TOSH3] -~w~The opera. - -[TOSH3M8:TOSH3] -~w~The opera? Me? You kidding? - -[TOSH3M9:TOSH3] -~w~Don't be ridiculous Mr. Toni. Everyone loves the opera. - -[TOSH3A:TOSH3] -~w~If you bring my car around we can collect your tuxedo. - -[TOSH3EC:TOSH3] -~w~We don't have long, the show starts very soon. - -[TOSH3B:TOSH3] -~w~Bring ~b~Toshiko's car~w~ round. - -[TOSH3C:TOSH3] -~w~Pick up ~b~Toshiko. - -[TOSH3C2:TOSH3] -~w~Get a Tuxedo from ~y~Mr. Benz. - -[TOSH3B3:TOSH3] -~w~Take Toshiko back to her ~y~apartment. - -[TOSH3B4:TOSH3] -~r~You left Toshiko behind. - -[TOSH3B2:TOSH3] -Get back in ~b~Toshiko's car. - -[TOSH3C3:TOSH3] -~w~Go to the ~y~Opera. - -[TOSH3D:TOSH3] -~w~Where are you going? We're going to be late! - -[TOSH3D2:TOSH3] -~w~Please don't leave me here Toni san! - -[TOSH3Z1:TOSH3] -~w~Do you think I am a bad person Mr. Toni? - -[TOSH3Z2:TOSH3] -~w~Well, princess, I ain't exactly a saint. - -[TOSH3Z3:TOSH3] -~w~No... A saint wouldn't be much use to me. - -[TOSH3Z4:TOSH3] -~w~My husband is Samurai, Mr. Toni. - -[TOSH3Z5:TOSH3] -~w~He is very strong... but very, very bad. - -[TOSH3Z6:TOSH3] -~w~He only married me to become waka-gashira in Liberty City. - -[TOSH3Z7:TOSH3] -~w~He has never loved me... he prefers the company of his men. - -[TOSH3Z8:TOSH3] -~w~Do you understand? - -[TOSH3Z9:TOSH3] -~w~When he finds out what you're doing, you know he's going to kill you. - -[TOSH3Z0:TOSH3] -~w~I do not care for life or death anymore, only freedom. - -[TOSH3ZB:TOSH3] -~w~What a relaxing world view. - -[TOSH3E:TOSH3] -~w~Italian blood don't mix with no Japo blood. - -[TOSH3F:TOSH3] -~w~But, it'll mix just fine on the sidewalk! - -[TOSH3G:TOSH3] -~w~Protect Toshiko and escape in ~b~her car. - -[TOSH3H:TOSH3] -~w~Protect ~b~Toshiko~w~ and take her back to her ~y~apartment. - -[TOSH3S1:TOSH3] -~w~My car! - -[TOSH3S2:TOSH3] -~w~Save us Toni! - -[TOSH3S3:TOSH3] -~w~Come on Toni! - -[TOSH3S4:TOSH3] -~w~Get us out of here! - -[TOSH3S5:TOSH3] -~w~SAVE ME! - -[TOSH3S6:TOSH3] -~w~HELP! - -[TOSH3S7:TOSH3] -~w~We're not going to make it! - -[TOSH3S8:TOSH3] -~w~HELP! - -[TOSH3S9:TOSH3] -~r~Toshiko is dead! - -[TOSH310:TOSH3] -~r~Toshiko's car has been destroyed! - -[TOSH311:TOSH3] -~r~You ran out of time! - -[TOSH3_1:TOSH3] -NONE - -[TOS3NE1:TOSH3] -~w~Protect Toshiko and kill the ~r~Forelli gangsters. - -[TOS3NE2:TOSH3] -~w~Escape in ~b~Toshiko's car. - -[TOSH3EI:TOSH3] -~w~The opera begins at 20:00. Don't be late! - -{=================================== MISSION TABLE TOSH4 ===================================} - -[TOSH4O2:TOSH4] -~w~Kazuki's chopper is heading for the ~y~Casino! - -[TOSH4O4:TOSH4] -~w~Kill ~r~Kazuki! - -[TOSH4O5:TOSH4] -~w~Go to ~y~Toshiko's apartment. - -[TOSH4_3:TOSH4] -~w~Kazuki is arriving in that chopper! Make your way to the helipad and kill him. - -[TOSH4Y1:TOSH4] -~w~Get him! - -[TOSH4Y2:TOSH4] -~w~Kill him! - -[TOSH4CA:TOSH4] -~w~My men dishonor me... - -[TOSH4CB:TOSH4] -~w~but it is fitting that I kill you myself. - -[TOSH4CC:TOSH4] -~w~You two! Leave us! - -[TOSH4CD:TOSH4] -~w~I am going to enjoy thrusting my sword into you. - -[TOSH4CE:TOSH4] -~w~Yeah, I heard that about you. - -[TOSH4K1:TOSH4] -~w~Shoot him! - -[TOSH4K2:TOSH4] -~w~Kill him! - -[TOSH4_7:TOSH4] -~w~Take Kazuki's sword to Toshiko as proof that he is dead. - -[TOSH4_8:TOSH4] -~w~You spooked Kazuki! He's escaping! ...you've lost your chance to kill him! - -[TOSH4_C:TOSH4] -Kazuki - -[TOSH4AA:TOSH4] -~w~Hello? - -[TOSH4AB:TOSH4] -~w~I'm bathing, Toni san. - -[TOSH4AC:TOSH4] -~w~We have little time left. - -[TOSH4AD:TOSH4] -~w~My husband knows now who is truly behind his losses. - -[TOSH4AE:TOSH4] -~w~He's coming to kill me... and you. - -[TOSH4AF:TOSH4] -~w~Well, I ain't waiting here for him. Where is he? - -[TOSH4AG:TOSH4] -~w~He's in Belleville, gathering his men. - -[TOSH4AJ:TOSH4] -~w~But soon, he will come here. - -[TOSH4AH:TOSH4] -~w~Sayonara, sweetheart. - -[TOSH4AI:TOSH4] -~w~My prayers go with you, Toni san. Good luck. - -[TOSH4F1:TOSH4] -~r~Kazuki is laughing at you! - -[TOSH4OA:TOSH4] -~w~Kill Kazuki's ~r~Guards! - -[TOSH4OB:TOSH4] -~w~Get back to ~y~Kazuki's! - -[TOSH4OC:TOSH4] -~w~Look out - here come more ~r~Yakuza! - -[TOSH4DA:TOSH4] -~w~Shoot him! - -[TOSH4DB:TOSH4] -~w~Kill him! - -[TOSH4DC:TOSH4] -~w~Kill him, you assholes! - -[TOSH4O1:TOSH4] -~w~Head over to ~y~Kazuki's place~w~ and kill him! - -[TOSH4O3:TOSH4] -~w~Head for the ~y~helipad! - -[CASH_01:TOSH4] -So, uh... Toshiko. It's over now. - -[CASH_02:TOSH4] -Yes, yes, I knew that... hello, Mister Toni. - -[CASH_03:TOSH4] -Hey. So, uuuh... you won. - -[CASH_04:TOSH4] -You got what you wanted. Everything worked out great. - -[CASH_06:TOSH4] -Great, yes, great. Really great. - -[CASH_07:TOSH4] -So... its payment time sweetheart... - -[CASH_08:TOSH4] -We're both of us fools and killers, Mister Toni. - -[CASH_09:TOSH4] -I guess we are. - -[CASH_10:TOSH4] -The world takes such a terrible toll on your spirit wouldn't you agree, Mister Toni? - -[CASH_11:TOSH4] -I guess. - -[CASH_12:TOSH4] -But you're free now. I mean you can go to Costa Rica, or Aruba or some-shit. - -[CASH_13:TOSH4] -Start over new, that's what you always wanted. - -[CASH_14:TOSH4] -I don't think I'm ready for a beach holiday, Mister Toni. - -[CASH_15:TOSH4] -I've lost everything, and I have done so deliberately. - -[CASH_16:TOSH4] -I've been granted everything I asked for. - -[CASH_17:TOSH4] -Now, I just ask to be truly free. - -[CASH_18:TOSH4] -Good bye, Toni-san. - -{=================================== MISSION TABLE COPCAR ===================================} - -[C_COMP1:COPCAR] -~w~Vigilante mission: level 12 complete! Body Armor gives increased protection! - -[C_BREIF:COPCAR] -~r~Suspect~w~ last seen in the ~a~ area. - -[C_BREIG:COPCAR] -~r~Suspects~w~ last seen in the ~a~ area. - -[C_RANGE:COPCAR] -~r~The police radio is out of range, get closer to a police station! - -[C_TIMEA:COPCAR] -~w~Time bonus! +~1~ seconds - -[COPCART:COPCAR] -~w~You have ~1~ seconds to return to a police vehicle before the mission ends. - -[COPCARU:COPCAR] -~w~You have ~1~ second to return to a police vehicle before the mission ends. - -[C_CANC:COPCAR] -~r~Vigilante mission cancelled! - -[C_TIME:COPCAR] -~r~Your time as a law enforcer is over! - -[C_PASS3:COPCAR] -~w~THREAT ELIMINATED! Reward: $~1~ - -[C_LEVEL:COPCAR] -~r~You let the criminals get away! - -[C_RANG2:COPCAR] -~r~The police radio doesn't work in the subway! - -{=================================== MISSION TABLE CARS ===================================} - -[CARS_10:CARS] -~w~Step into a car to start the test drive, or leave the lot to cancel the mission. - -[CARS_12:CARS] -~w~If you leave the car you will fail the mission. - -[CARS_1:CARS] -~w~Take one of the customers on a test drive. - -[CARS_2:CARS] -~w~You'll have to work out what each customer is looking for in car performance. - -[CARS_3:CARS] -~w~Then, use your driving skills to show them that the car delivers exactly what they want. - -[CARS_5:CARS] -~w~Impress the customer. - -[CARS_6:CARS] -~w~Customer down! Choose a different car! - -[CARS_30:CARS] -~w~Get back to the ~y~car lot~w~ to close the deal! - -[CARS_C1:CARS] -~w~Alright man, you're shaking the cops huh? - -[CARS_C2:CARS] -~w~Yeah! That punk was asking for it! - -[CARS_P1:CARS] -~w~Woah! This ride is supersonic! - -[CARS_P2:CARS] -~w~Woohoo! - -[CARS_P3:CARS] -~w~My aunt drives this speed! - -[CARS_P4:CARS] -~w~Does this thing have airbags? - -[CARS_M1:CARS] -~w~Ah, a nice relaxing drive. - -[CARS_M2:CARS] -~w~Do you know what the speed limit is here? - -[CARS_M3:CARS] -~w~Oh my God! You're going to kill us! - -[CARS_O1:CARS] -~w~Oh yeah! No asphalt to contain us! - -[CARS_O2:CARS] -~w~Reach for the sky, dude! - -[CARS_O3:CARS] -~w~Radical flip, man! - -[CARS_SC:CARS] -~w~Sale completed. Commission: $~1~ Time bonus: ~1~ seconds. - -[CARS_SD:CARS] -~w~Level ~1~ completed. Commission: $~1~ Time bonus: ~1~ seconds. - -[CARS_IR:CARS] -~1~ IN A ROW! Bonus! $~1~. - -[CARS_RE:CARS] -~w~A little perk for our top salesman! - -[CARSIC1:CARS] -~w~I need something that's tough to chase, man. - -[CARSIC2:CARS] -~w~I need a ride that takes it to those sidewalk suckers. - -[CARSIP1:CARS] -~w~This baby looks fast! - -[CARSIP2:CARS] -~w~Oh man! I bet this bad-boy can fly! - -[CARSIM1:CARS] -~w~I heard these things give a nice steady ride. - -[CARSIM2:CARS] -~w~Ever since my operation I need a slower car. - -[CARSIO1:CARS] -~w~It's gripped! Let's offroad! - -[CARSIO2:CARS] -~w~My buddy can do gnarly rolls in his ride - I love that shit! - -[CARS_N1:CARS] -~w~I ain't buying this trash! - -[CARS_N2:CARS] -~w~I can't believe you thought I'd buy this wreck! - -[CARS_N3:CARS] -~w~You used car salesmen are all the same! - -[CARS_Y1:CARS] -~w~I'll take it! - -[CARS_Y2:CARS] -~w~This is the perfect car for me! - -[CARS_Y3:CARS] -~w~You've got yourself a deal! - -[CARS_R1:CARS] -~w~I like the car, but I don't like the color. - -[CARS_R2:CARS] -~w~Get the car resprayed! - -[CARS_D1:CARS] -~w~I like it, but it's pretty beaten up! - -[CARS_D2:CARS] -~w~Get the car repaired! - -[CARS_F1:CARS] -~r~You destroyed the car! - -[CARS_F2:CARS] -~r~You killed the customer! - -[CARS_F3:CARS] -~r~You took too long! The customer got bored! - -[CARS_F4:CARS] -~r~The customer hates the car! - -[CARS_F5:CARS] -~r~Your time as a car salesman is over. - -[CARS_F6:CARS] -~r~The customer hates the car - you crashed it! - -[CARS_F7:CARS] -~r~The customer hates the car - you went too fast! - -[CARS_F8:CARS] -~r~The customer hates the car - you went too slow! - -[CARS_SA:CARS] -Sale - -[CARS_7:CARS] -~w~Get into a ~b~car! - -[CARS_RF:CARS] -~w~Capital Autos is now under your 'protection'. Make sure you collect their payments regularly. - -{=================================== MISSION TABLE BIKE ===================================} - -[BIKE_10:BIKE] -~w~Get onto a bike to start the test ride, or leave the alley to cancel the mission. - -[BIKE_12:BIKE] -~w~If you leave the bike you will fail the mission. - -[BIKE_1:BIKE] -~w~Take one of the customers on a test ride. - -[BIKE_2:BIKE] -~w~You'll have to work out what each customer is looking for in bike performance. - -[BIKE_3:BIKE] -~w~Then, use your riding skills to show them that the bike delivers exactly what they want. - -[BIKE_5:BIKE] -~w~Impress the customer. - -[BIKE_30:BIKE] -~w~Get back to the ~y~bike shop~w~ to close the deal! - -[BIKE_C1:BIKE] -~w~Alright man, you're shaking the cops huh? - -[BIKE_C2:BIKE] -~w~Yeah! That punk was asking for it! - -[BIKE_P1:BIKE] -~w~Yes! This bike is amazing! - -[BIKE_P2:BIKE] -~w~Alright! - -[BIKE_P3:BIKE] -~w~Come on, can't you go faster than this? - -[BIKE_P4:BIKE] -~w~Look out! - -[BIKE_M1:BIKE] -~w~Ah, a nice relaxing ride. - -[BIKE_M2:BIKE] -~w~Do you know what the speed limit is here? - -[BIKE_M3:BIKE] -~w~Oh my God! You're going to kill us! - -[BIKE_O1:BIKE] -~w~Oh yeah! No asphalt to contain us! - -[BIKE_O2:BIKE] -~w~Reach for the sky, dude! - -[BIKE_O3:BIKE] -~w~Wicked stunts, dude! - -[BIKE_SC:BIKE] -~w~Sale completed. Commission: $~1~ Time bonus: ~1~ seconds. - -[BIKE_IR:BIKE] -~1~ IN A ROW! Bonus! $~1~. - -[BIKE_RE:BIKE] -~w~A little perk for our top salesman! - -[BIKE_RF:BIKE] -~w~Hogs & Cogs is now under your 'protection'. Make sure you collect their payments regularly. - -[BIKEIC1:BIKE] -~w~I need something that's tough to chase, man. - -[BIKEIC2:BIKE] -~w~I need a ride that takes it to those sidewalk suckers. - -[BIKEIP1:BIKE] -~w~This crotch-rocket looks fast! - -[BIKEIP2:BIKE] -~w~I want something that'll impress the chicks! - -[BIKEIM1:BIKE] -~w~I heard these things give a nice steady ride. - -[BIKEIM2:BIKE] -~w~I'm still a bit wobbly, so I need a slower bike. - -[BIKEIO1:BIKE] -~w~It's gripped! Let's offroad! - -[BIKEIO2:BIKE] -~w~These things can do cool stunts, right? - -[BIKE_N1:BIKE] -~w~I ain't buying this trash! - -[BIKE_N2:BIKE] -~w~I can't believe you thought I'd buy this wreck! - -[BIKE_N3:BIKE] -~w~You used bike salesmen are all the same! - -[BIKE_Y1:BIKE] -~w~I'll take it! - -[BIKE_Y2:BIKE] -~w~This is the perfect bike for me! - -[BIKE_Y3:BIKE] -~w~You've got yourself a deal! - -[BIKE_R1:BIKE] -~w~I like the bike, but I don't like the color. - -[BIKE_R2:BIKE] -~w~Get the bike resprayed! - -[BIKE_D1:BIKE] -~w~I like it, but it's pretty beaten up! - -[BIKE_D2:BIKE] -~w~Get the bike repaired! - -[BIKE_F1:BIKE] -~r~You destroyed the bike! - -[BIKE_F2:BIKE] -~r~You killed the customer! - -[BIKE_F3:BIKE] -~r~You took too long! The customer got bored! - -[BIKE_F4:BIKE] -~r~The customer hates the bike! - -[BIKE_F5:BIKE] -~r~Your time as a bike salesman is over. - -[BIKE_F6:BIKE] -~r~The customer hates the bike - you crashed it! - -[BIKE_F7:BIKE] -~r~The customer hates the bike - you went too fast! - -[BIKE_F8:BIKE] -~r~The customer hates the bike - you went too slow! - -[BIKE_B1:BIKE] -~w~You have ~1~ seconds to get back on the ~b~bike! - -[BIKE_B2:BIKE] -~w~Get the ~b~customer~w~ back on the bike! - -[BIKE_B3:BIKE] -~w~Let the ~b~customer~w~ get on the bike! - -[BIKE_SA:BIKE] -Sale - -[BIKE_7:BIKE] -~w~Get onto a ~b~bike! - -[BIKE_S1:BIKE] -~w~You've sold every Freeway we have in stock! - -[BIKE_S2:BIKE] -~w~You've sold every PCJ 600 we have in stock! - -[BIKE_S3:BIKE] -~w~You've sold every Faggio we have in stock! - -[BIKE_S4:BIKE] -~w~You've sold every Sanchez we have in stock! - -[BIKE_SN:BIKE] -~w~New stock has been delivered! - -{=================================== MISSION TABLE RAC1 ===================================} - -[RAC1_A0:RAC1] -~w~If you wanna prove your ride ain't no bitch, get down the start line of the next street race. - -{=================================== MISSION TABLE RAC2 ===================================} - -[RAC2_A0:RAC2] -~w~Hey, words out, there's gonna be a street race. Get your wheels over to the start line. - -{=================================== MISSION TABLE RAC3 ===================================} - -[RAC3_A0:RAC3] -~w~Ain't no car faster. Ain't no driver sharper. - -[RAC3_A1:RAC3] -~w~I'll see you at the next street race... in my rear view mirror. - -{=================================== MISSION TABLE BIK1 ===================================} - -[BIK1_A0:BIK1] -~w~Think you can out ride me? I own your ass! - -[BIK1_A1:BIK1] -~w~Bring your bike to the starting grid and let's get it on! - -{=================================== MISSION TABLE BIK2 ===================================} - -[BIK2_A0:BIK2] -~w~If you think you can take me in a race, let your wheels do the talking! - -[BIK2_A1:BIK2] -~w~I'll see you at the start line. - -{=================================== MISSION TABLE BIK3 ===================================} - -[BIK3_A0:BIK3] -~w~It's this simple. On two wheels, I can't be beat. Let's take it to the street. - -{=================================== MISSION TABLE TT1 ===================================} - -[TT1_A0:TT1] -~w~~k~ ~AMBUY~ ~w~to race. ~n~~k~ ~AMEXI~ ~w~to exit. - -[TT1_0:TT1] -Time - -[TT1_1:TT1] -~w~New Lap Record: ~1~:~1~ - -[TT1_1A:TT1] -~w~New Lap Record: ~1~:0~1~ - -[TT1_C1:TT1] -~w~3 - -[TT1_C2:TT1] -~w~2 - -[TT1_C3:TT1] -~w~1 - -[TT1_C4:TT1] -~w~GO! - -[TT1_D1A:TT1] -~w~Air: ~1~ Feet - -[TT1_D2:TT1] -~w~Lap ~1~ Time ~1~:~1~ - -[TT1_D3:TT1] -~w~Lap ~1~ Time ~1~:0~1~ - -[TT1_D4:TT1] -~w~Lap - -[TT1_F2:TT1] -~r~You left the course! - -[TT1_F3:TT1] -~r~You destroyed the bike! - -[TT1_D5A:TT1] -~w~Air: ~1~ Feet - $10 bonus! - -[TT1_D1:TT1] -~w~Air: ~1~ Meters - -[TT1_D5:TT1] -~w~Air: ~1~ Meters - $10 bonus! - -[TT1_2:TT1] -~w~You beat the target time! Next course unlocked - $100 bonus! - -[TT1_3:TT1] -~w~You beat the target time - $100 bonus! - -[TTDONE:TT1] -~w~All courses completed! You have unlocked the 'Manchez'. - -[TT1_2A:TT1] -~r~You failed to beat the target time. - -[TT1_2B:TT1] -~r~You failed to beat the Course Record. - -{=================================== MISSION TABLE RCR ===================================} - -[RCRACE3:RCR] -~w~Beat the other RC vehicles in a ~1~ lap race around the park! - -[RCRACE4:RCR] -~w~Beat the other RC vehicles in a ~1~ lap race around the airport! - -[RCRACE7:RCR] -~w~Get ready... - -[RCRLAP5:RCR] -~w~New Lap Record of ~1~ seconds! - -[RCRLAP6:RCR] -~w~~1~ laps to go! - -[RCRLAP7:RCR] -~w~Final lap! - -[RCRLTME:RCR] -Lap Time - -[RCRLOSE:RCR] -~r~You lost! You'll always be small-time! - -[RCRLOS2:RCR] -~r~You'll never win a race if you can't keep to the course! - -[RCRTIME:RCR] -~w~You have ~h~~1~ ~w~seconds to return to the course! - -[RCRWIN1:RCR] -~w~Congratulations you WON! But you did not beat the lap record. - -[RCRWIN2:RCR] -~w~Your next race will be ~1~ laps! - -[RCRWIN3:RCR] -~w~RC Race in Belleville Park, Staunton is now available. - -[RCRWIN4:RCR] -~w~RC Race in Shoreside Airport is now available. - -[RCRWIN5:RCR] -~w~You have beaten all the levels! Now go back and beat your best lap times! - -[RCR1:RCR] -~w~1 - -[RCR2:RCR] -~w~2 - -[RCR3:RCR] -~w~3 - -[RCRGO:RCR] -~w~GO! - -[RCBLAP:RCR] -Best lap time so far is ~1~:~1~ - -[RCBLAP1:RCR] -Best lap time so far ~1~:0~1~ - -[RCBLA2:RCR] -Record Lap Time of ~1~:~1~ - -[RCBLA3:RCR] -Record Lap Time of ~1~:0~1~ - -[RCRRLA1:RCR] -~w~New Lap Record of ~1~:~1~ - -[RCRRLA2:RCR] -~w~New Lap Record of ~1~:0~1~ - -[RCRACEA:RCR] -Thrashin' RC - -[RCRACEB:RCR] -Ragin' RC - -[RCRACEC:RCR] -Chasin' RC - -[RCLE11:RCR] -Thrashin' RC LEVEL ONE - -[RCLE12:RCR] -Thrashin' RC LEVEL TWO - -[RCLE13:RCR] -Thrashin' RC LEVEL THREE - -[RCLE21:RCR] -Ragin' RC LEVEL ONE - -[RCLE22:RCR] -Ragin' RC LEVEL TWO - -[RCLE23:RCR] -Ragin' RC LEVEL THREE - -[RCLE31:RCR] -Chasin' RC LEVEL ONE - -[RCLE32:RCR] -Chasin' RC LEVEL TWO - -[RCLE33:RCR] -Chasin' RC LEVEL THREE - -[RCRACE2:RCR] -~w~Beat the other RC vehicles in a ~1~ lap race around the construction site! - -[RCRWIN6:RCR] -~w~Race again to try and beat your best lap time! - -[RCQUIT:RCR] -~r~Batteries running low? - -[RCRFAIL:RCR] -~r~You failed to come first! - -[RCRLAP1:RCR] -~c~1ST ~w~LAP - -[RCRLAP2:RCR] -~c~2ND ~w~- LAP - -[RCRLAP3:RCR] -~c~3RD ~w~LAP - -[RCRLAP4:RCR] -~c~4TH ~w~LAP - -[RCRWIN:RCR] -~w~Congratulations you WON with a best lap time of ~1~:~1~! $500 Bonus! - -[RCRWINB:RCR] -~w~Congratulations you WON with a best lap time of ~1~:0~1~! $500 Bonus! - -{=================================== MISSION TABLE TOUR ===================================} - -[TOUR_H1:TOUR] -~w~Photo Tips: stand ~h~in front~w~ of the tourist, ~h~not too far away.~w~ Make sure both the ~h~tourist and background scenery~w~ are in the picture. - -[TOUR_I2:TOUR] -~w~Extra cash bonuses are awarded for high quality photos! - -[TOUR_S0:TOUR] -~w~You have ~h~~1~~w~ shots remaining. - -[TOUR_S1:TOUR] -~w~You only have one shot left. Make sure it's a good one! - -[TOUR_S2:TOUR] -~w~Don't waste your shots! You have ~h~~1~~w~ shots remaining. - -[TOUR_S4:TOUR] -~w~You must frame the ~b~tourist~w~ properly in the picture! You have ~h~~1~~w~ shots remaining. - -[TOUR_F1:TOUR] -~r~The tourist is dead! - -[TOUR_F2:TOUR] -~r~You lost the tourist! - -[TOUR_F3:TOUR] -~r~You didn't get a photo of the tourist! - -[TOUR_F4:TOUR] -~r~You ran out of time! - -[TOUR_F5:TOUR] -~r~Tourist mission cancelled. - -[TOUR_F6:TOUR] -~r~The mugger got away with the tourist's camera! - -[TOUR_O1:TOUR] -~w~Take the tourist to the ~y~tourist spot. - -[TOUR_O2:TOUR] -~w~Don't leave the ~b~tourist~w~ behind! - -[TOUR_O3:TOUR] -~w~Follow the ~b~tourist~w~ on foot to the photo location. - -[TOUR_O4:TOUR] -~w~Use the ~b~tourist's~w~ own camera to take the photo. - -[TOUR_O5:TOUR] -~w~Take the tourist back to the ~y~airport. - -[TOUR_O6:TOUR] -~w~Quickly! Time is running out! - -[TOUR_O7:TOUR] -~w~Pick up the ~b~tourist. - -[TOUR_O8:TOUR] -~w~Pick up the next ~b~tourist~w~ before the time expires. - -[TOUR_O9:TOUR] -~w~You really should be following the ~b~tourist!~w~ You're wasting time. - -[TOUR_OA:TOUR] -~w~The ~b~tourist~w~ is waiting for you to take a photo. Get a move on, time is running out! - -[TOUR_W1:TOUR] -~w~Fee awarded: ~h~$~1~~w~ Sorry, No bonus this time. - -[TOUR_W2:TOUR] -~w~Fee awarded: ~h~$~1~~w~ plus ~h~$~1~~w~ bonus for a good photo! - -[TOUR_W3:TOUR] -~w~Fee awarded: ~h~$~1~~w~ plus ~h~$~1~~w~ bonus for a great photo! - -[TOUR_W4:TOUR] -~w~Fee awarded: ~h~$~1~~w~ plus ~h~$~1~~w~ bonus for an excellent photo! - -[TOUR_W5:TOUR] -~w~Well done! All 'Sights before Flights' missions completed. $~1~ completion bonus awarded! - -[TOURDAM:TOUR] -~w~SIGHT ~1~: ~w~Take this tourist to the Cochrane Dam and take a photo to prove he's been there! - -[TOURBRI:TOUR] -~w~SIGHT ~1~: ~w~This lady wants to see the Callahan Bridge, from the Portland side. - -[TOURDRK:TOUR] -~w~SIGHT ~1~: ~w~Take a picture of this film fan outside, the actor, Black Lightman's House, on Cedar Grove, Shoreside Vale. - -[TOURSTA:TOUR] -~w~SIGHT ~1~: ~w~Take a photo of this sports fanatic outside the Liberty Memorial Coliseum on Staunton. - -[TOURCHU:TOUR] -~w~SIGHT ~1~: ~w~Shepherd this pilgrim to historic Liberty Cathedral on Staunton. - -[TOURBCH:TOUR] -~w~SIGHT ~1~: ~w~Show this tourist the beautiful view of Portland Rock and Lighthouse, from Portland beach. - -[TOURCHI:TOUR] -~w~SIGHT ~1~: ~w~The oriental ambience of Chinatown Plaza in Portland is the exotic destination for this tourist. - -[TOURSHO:TOUR] -~w~SIGHT ~1~: ~w~This tourist wants her friends to think she shopped at the exclusive Staunton Shopping Mall. Take her there and snap her picture. - -[TOURCAS:TOUR] -~w~SIGHT ~1~: ~w~Here's a gambler who wants his photo taken outside the world famous Casino in Staunton. - -[TOURMUS:TOUR] -~w~SIGHT ~1~: ~w~This scholar wants to visit the Liberty City Museum on Staunton and get a photo that shows the impressive scale of the building. - -[TOURHAL:TOUR] -~w~SIGHT ~1~: ~w~This tourist wants to visit City Hall on Staunton, one more time before he leaves. - -[TOURRED:TOUR] -~w~SIGHT ~1~: ~w~This guy's friends say he isn't man enough to visit a Strip Club in Portland's Red Light district. Show them otherwise! - -[TOURMU0:TOUR] -~w~The ~r~mugger~w~ stole the tourist's camera! Get it back! - -[TOURMU1:TOUR] -~w~That's one less criminal to worry about! Pick up the ~g~camera. - -[TOUR00:TOUR] -~w~Take the tourist to the ~y~Cochrane Dam~w~ in Shoreside Vale. - -[TOUR01:TOUR] -~w~Take the tourist to the ~y~Liberty Memorial Coliseum~w~ on Staunton. - -[TOUR02:TOUR] -~w~Take the tourist to ~y~Chinatown Plaza~w~ in Portland. - -[TOUR03:TOUR] -~w~Take the tourist to ~y~Liberty Cathedral~w~ on Staunton. - -[TOUR06:TOUR] -~w~Take the tourist to the ~y~Strip Club~w~ in Portland's Red Light district. - -[TOUR07:TOUR] -~w~Take the tourist to the ~y~Liberty City Museum~w~ on Staunton. - -[TOUR08:TOUR] -~w~Take the tourist to the ~y~Casino~w~ on Staunton. - -[TOUR10:TOUR] -~w~Take the tourist to the ~y~City Hall~w~ on Staunton. - -[TOUR11:TOUR] -~w~Take the tourist to ~y~Portland beach. - -[TOUR04:TOUR] -~w~Take the tourist to the ~y~Callahan Bridge~w~, Portland side. - -[TOUR09:TOUR] -~w~Take the tourist to the actor, ~y~Black Lightman's House~w~, on Cedar Grove, Shoreside Vale. - -[TOUR_I1:TOUR] -~w~Escort tourists to famous Liberty City Landmarks. - -[TOUR_IA:TOUR] -~w~Take souvenir photographs of them when you get there. - -[TOUR_IB:TOUR] -~w~Then bring them back before their plane departs. - -[TOURMEM:TOUR] -~w~SIGHT ~1~: ~w~This veteran wants to pay homage to his lost comrades at the Liberty City War Memorial in Belleville Park, Staunton. - -[TOUR05:TOUR] -~w~Take the tourist to the ~y~Liberty City War Memorial~w~ in Belleville Park, Staunton. - -{=================================== MISSION TABLE PIZZA ===================================} - -[PIZ1_06:PIZZA] -~w~Press~h~ ~k~ ~TGSUB~ ~w~when on the bike to cancel the mission. - -[PIZ1_02:PIZZA] -~w~You're out of pizza! Return to ~y~Joe's Pizza Restaurant~w~ to get some more. - -[PIZ1_07:PIZZA] -~r~You killed the customer! You're fired! - -[PIZ1_08:PIZZA] -~r~You're out of time and out of a job! - -[PIZ1_09:PIZZA] -~r~You wrecked our bike! Get out of here! - -[PIZ1_11:PIZZA] -~w~You need the Pizza ~b~bike~w~ to deliver the orders! - -[PIZ1_12:PIZZA] -Pizzas - -[PIZ1_13:PIZZA] -~w~Pizza! Hot and ready to go! I love 'em! - -[PIZ1_14:PIZZA] -~w~These are to go! ...So go! - -[PIZ1_15:PIZZA] -~w~This one's extra spicy! - -[PIZ1_16:PIZZA] -~w~Get your finger out of your ass and deliver these, pronto! - -[PIZ1_17:PIZZA] -~w~These pizzas need delivering today, not next year! - -[PIZ1_18:PIZZA] -~w~Pizza delivery beneath you? Well, excuse me professor! - -[PIZ1_19:PIZZA] -~w~Are you gonna drop these off or what? - -[PIZ1_20:PIZZA] -~w~You're fired! ...only joking. But I won't be if these aren't delivered on time! - -[PIZ1_21:PIZZA] -~w~Pizzas! Come on! We got fat people waiting! - -[PIZ1_22:PIZZA] -~w~Have you been spitting on the pizzas? ...you should! It all adds to the taste! - -[PIZ1_23:PIZZA] -~w~Do you think these are gonna deliver themselves? - -[PIZ1_24:PIZZA] -~w~If these are cold when you drop them off, there'll be hell to pay! - -[PIZ1_25:PIZZA] -~w~Move your ass this time! - -[PIZ1_26:PIZZA] -~w~Hey, get these delivered! - -[PIZ1_27:PIZZA] -~w~Okay, drop these off and come back for some more. - -[PIZ1_28:PIZZA] -~w~Our pizzas kick ass! Drop these off on time or I'll kick yours! - -[PIZ1_29:PIZZA] -~w~Back for more? I'm fresh out of abuse for you buddy. - -[PIZ1_30:PIZZA] -~w~I think I sneezed on one of those! But never mind. Take 'em anyway! - -[PIZ1_31:PIZZA] -~w~I hate this job! But, at least I get to push you around. - -[PIZ1_3A:PIZZA] -~w~If these don't make it on time, pizza dough's the only dough you'll see today! - -[PIZ1_32:PIZZA] -~r~Can't stomach our pizzas? - -[PIZ1_33:PIZZA] -~w~Go back to ~y~Joe's Pizza Restaurant~w~ for fresh orders. - -[PIZ1_34:PIZZA] -~w~Delivery made, money paid! - -[PIZ_WON:PIZZA] -~w~Pizza odd-job completed, well done! Your maximum health has been increased! - -[PIZ_WO1:PIZZA] -~w~Joe's Pizza Restaurant is now under your 'protection'. Make sure you collect their payments regularly. - -[PIZ1_01:PIZZA] -~w~Deliver these pizzas to our ~b~customers~w~ as quick as you can. - -[PIZ1_05:PIZZA] -~w~Perform a drive-by to toss the pizza to a customer. - -{=================================== MISSION TABLE TAXI ===================================} - -[TAXI1:TAXI] -~w~Look for a ~b~fare. - -[TAXI1A:TAXI] -~w~There aren't any fares around here - keep looking! - -[TAXI2:TAXI] -~r~You're out of time! - -[TAXI3:TAXI] -~w~Your passenger fled in terror! - -[TAXI4:TAXI] -~w~Fare complete: $~1~ - -[TAXI4A:TAXI] -~w~Fare complete: $~1~ + ~1~ IN A ROW bonus! $~1~ - -[TAXI5:TAXI] -~w~SPEED BONUS: $~1~ - -[TAXI5A:TAXI] -~w~SPEED BONUS: $~1~ + ~1~ IN A ROW bonus! $~1~ - -[TAXI7:TAXI] -~w~Your car is trashed, get it repaired! - -[TAXI8:TAXI] -~r~Taxi mission cancelled. - -[TAXI9:TAXI] -~r~Your taxi has been destroyed! - -[FARES:TAXI] -Fares - -[TIP:TAXI] -Tip - -[FARE9:TAXI] -~w~Destination ~y~'Portland docks'. - -[FARE20:TAXI] -~w~Destination ~y~'The Park' ~w~in Belleville. - -[FARE22:TAXI] -~w~Destination ~y~'Cochrane Dam'. - -[FARE2:TAXI] -~w~Destination ~y~'Head Radio'~w~, Harwood. - -[FARE3:TAXI] -~w~Destination ~y~'The Ferry Port'~w~, Harwood. - -[FARE4:TAXI] -~w~Destination ~y~'The Hospital'~w~, Portland View. - -[FARE7:TAXI] -~w~Destination ~y~'The Construction Site'~w~, Hepburn Heights. - -[FARE8:TAXI] -~w~Destination ~y~'Cipriani Restaurant'~w~, Saint Mark's. - -[FARE10:TAXI] -~w~Destination ~y~'Punk Noodles'~w~, Chinatown. - -[FARE12:TAXI] -~w~Destination ~y~'The Ferry Port'~w~, Rockford. - -[FARE13:TAXI] -~w~Destination ~y~'The Church'~w~, Bedford Point. - -[FARE14:TAXI] -~w~Destination ~y~'Liberty Tree Offices'~w~, Bedford Point. - -[FARE15:TAXI] -~w~Destination ~y~'Liberty University'~w~, Liberty Campus. - -[FARE16:TAXI] -~w~Destination ~y~'Hogs 'n' Cogs'~w~, Belleville Park Area. - -[FARE17:TAXI] -~w~Destination ~y~'Courthouse'~w~, Belleville Park Area. - -[FARE18:TAXI] -~w~Destination ~y~'Mr. Benz'~w~, Bedford Point. - -[FARE19:TAXI] -~w~Destination ~y~'Joe's Pizza'~w~, Bedford Point. - -[FARE21:TAXI] -~w~Destination ~y~'Terminal A'~w~, Francis International Airport. - -[FARE23:TAXI] -~w~Destination ~y~'The Mansion'~w~, Cedar Grove. - -[FARE24:TAXI] -~w~Destination ~y~'The Hospital'~w~, Pike Creek. - -[FARE25:TAXI] -~w~Destination ~y~'The Park'~w~, Shoreside Vale. - -[FARE26:TAXI] -~w~Destination ~y~'North West Towers'~w~, Wichita Gardens. - -[FARE27:TAXI] -~w~Destination ~y~'The Coach Depot'~w~, Trenton. - -[FARE28:TAXI] -~w~Destination ~y~'Mr. Benz'~w~, Chinatown. - -[FARE29:TAXI] -~w~Destination ~y~'Mr. Benz'~w~, Pike Creek. - -[FARE30:TAXI] -~w~Destination ~y~'Terminal C'~w~, Francis International Airport. - -[FARE31:TAXI] -~w~Destination ~y~'AM Petroleum'~w~, Pike Creek. - -[FARE32:TAXI] -~w~Destination ~y~'Liberty Pharmaceuticals'~w~, Pike Creek. - -[FARE11:TAXI] -~w~Destination ~y~'Phil Cassidy's Fully Cocked Gun Shop'~w~, Bedford Point. - -[FARE1A:TAXI] -~w~Destination ~y~'Paulie's Revue Bar'~w~, Red Light District. - -[FARE1C:TAXI] -~w~Destination ~y~'Sex Club Seven'~w~, Red Light District. - -[FARE5:TAXI] -~w~Destination ~y~'Ammu-Nation'~w~, Red Light District. - -[FARE6:TAXI] -~w~Destination ~y~'Capital Autos'~w~, Saint Mark's. - -{=================================== MISSION TABLE AMBU ===================================} - -[A_FAIL2:AMBU] -~r~Your lack of urgency has been fatal to the patient! - -[A_FAIL3:AMBU] -~r~The patient is dead! - -[ATUTOR4:AMBU] -~w~Each bump reduces the chances of patient survival! - -[A_TIME:AMBU] -~w~Pickup! +~1~ seconds - -[A_TIME2:AMBU] -~w~Bonus! +~1~ seconds - -[AREWARD:AMBU] -~w~Level ~1~ completed! Reward: $~1~ - -[A_RANGE:AMBU] -~r~The ambulance radio is out of range, get closer to a hospital! - -[ATUTOR5:AMBU] -~w~Pick up a ~b~patient. - -[ATUTOR6:AMBU] -~w~Take them to the ~y~hospital! - -[ATUTOR7:AMBU] -~w~Pick up more ~b~patients~w~, or take this one to the ~y~hospital. - -[A_FULL:AMBU] -~w~Your ambulance is full! Drop your patients off at the ~y~hospital. - -[A_RANG2:AMBU] -~r~The ambulance radio doesn't work in the subway! - -{=================================== MISSION TABLE TV ===================================} - -[TV_01:TV] -Slash TV - -[TV_02:TV] -~w~Kill all the deranged psychopaths... they just keep on coming! - -[TV_03:TV] -~w~Each level gets harder with more enemies to dispatch... and more prizes to be won! - -[TV_04:TV] -~w~LEVEL ~1~ - -[TV_10:TV] -~w~You won an extra prize! - -[TV_09:TV] -Total prize money won this game: $~1~! - -[TV_05:TV] -~w~LEVEL CLEAR! - -[TV_06:TV] -~w~You won $~1~ in prize money! - -[TV_07:TV] -~w~GET READY... - -[TV_08:TV] -~w~GO! - -{=================================== MISSION TABLE NOODLE ===================================} - -[NDL1_02:NOODLE] -~w~Uh-oh - no more noodles! Go back to ~y~Punk Noodles~w~ and get some more. - -[NDL1_06:NOODLE] -~w~Press~h~ ~k~ ~TGSUB~ ~w~when on the bike to cancel the mission. - -[NDL1_07:NOODLE] -~r~You killed the customer! You're fired! - -[NDL1_08:NOODLE] -~r~You ran out of time. You're fired! - -[NDL1_09:NOODLE] -~r~You wrecked our moped! You're fired! - -[NDL1_11:NOODLE] -~w~Get back on the ~b~bike! - -[NDL1_12:NOODLE] -Noodles - -[NDL1_13:NOODLE] -~w~Noodles! Kaboodles of noodles for delivery! - -[NDL1_14:NOODLE] -~w~Our customers can't get enough of my noodles. - -[NDL1_15:NOODLE] -~w~I got noodles need delivering! - -[NDL1_16:NOODLE] -~w~Let's try to get these noodles delivered on time! - -[NDL1_17:NOODLE] -~w~Hey punk! These noodles are to go! - -[NDL1_18:NOODLE] -~w~Get these noodles delivered, chop-chop! - -[NDL1_19:NOODLE] -~w~Our customers want hot noodles, not cold noodles! - -[NDL1_20:NOODLE] -~w~Can't stand heat in the kitchen? Confucius say - turn down cooker. - -[NDL1_21:NOODLE] -~w~Drop these noodles off will you? - -[NDL1_22:NOODLE] -~w~More noodles for delivery. - -[NDL1_23:NOODLE] -~w~Noodles, noodles, noodles! Ship 'em out good and hot! - -[NDL1_24:NOODLE] -~w~We have people waiting! ...Oh the humanity! - -[NDL1_25:NOODLE] -~w~Hasn't this order been taken out already? - -[NDL1_26:NOODLE] -~w~What are you waiting for? Chinese New Year? - -[NDL1_27:NOODLE] -~w~These noodles are getting cold. Hurry it up! - -[NDL1_28:NOODLE] -~w~I wanted to be an astronaut. But my dad owns this place, so what could I do? - -[NDL1_29:NOODLE] -~w~If you want to keep your job, move your butt and deliver these. - -[NDL1_30:NOODLE] -~w~Crispy fried noodles... I don't understand 'em, but I love 'em. - -[NDL1_31:NOODLE] -~w~I'd have thought delivering pizza was more your style. - -[NDL1_3A:NOODLE] -~w~They always want more. So come back when you're done. - -[NDL1_32:NOODLE] -~r~What's the matter? Don't you like noodles? - -[NDL1_33:NOODLE] -~w~Return to ~y~Punk Noodles~w~ for more orders. - -[NDL1_34:NOODLE] -~w~Noodles delivered, cash paid! - -[NDL_WON:NOODLE] -~w~Congratulations, Noodle odd-job completed! Your maximum health has been increased! - -[NDL_WO1:NOODLE] -~w~Punk Noodles is now under your 'protection'. Make sure you collect their payments regularly. - -[NDL1_01:NOODLE] -~w~Deliver these noodles to our ~b~customers~w~ - chop-chop! - -[NDL1_05:NOODLE] -~w~Perform a drive-by to toss the noodles to a customer. - -{=================================== MISSION TABLE MPSURV ===================================} - -[SAL01:MPSURV] -~w~Maria, I'm going up to the hospital to get 'you-know-what' fixed. - -[SAL02:MPSURV] -~w~When I get out, the pork stallion will be galloping just like it used to... - -[SAL04:MPSURV] -~w~PS: Get ready to saddle up when I get out, baby! - -[SAL05:MPSURV] -~w~PPS: ...Don't leave this note just lying around! - -[SAL03:MPSURV] -~w~You just stay out of trouble while I'm in 'cause there's gonna be wise-guys dying to take over. - -[SAL03A:MPSURV] -~w~Literally! - -{=================================== MISSION TABLE JDREF ===================================} - -[JDT1_BA:JDREF] -~w~I ain't got no work for no Leone! - -[JDT1_BB:JDREF] -~w~...hey Toni, come back when you're less conspicuous. - -[CHNGOUT:JDREF] -~w~Change out of your Leone suit. JD can't be seen speaking to you otherwise. - -{=================================== MISSION TABLE CRED01 ===================================} - -[CR01_01:CRED01] -~n~ ~n~ ~n~ ~n~CREDITS - -[CR01_02:CRED01] -~n~ ~n~ ~n~ ~n~ROCKSTAR NORTH - -[CR01_03:CRED01] -~n~ ~n~ ~n~ ~n~Producer ~n~Leslie Benzies - -[CR01_04:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Aaron Garbut - -[CR01_05:CRED01] -~n~ ~n~ ~n~ ~n~Technical Direction ~n~Obbe Vermeij, Adam Fowler - -[CR01_06:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~Written By ~n~Dan Houser, James Worrall ~n~ & David Bland - -[CR01_07:CRED01] -~n~ ~n~ ~n~ ~n~Programming ~n~Alexander Roger, Alexander Illes, ~n~Andrzej Madajczyk, Barane Chan, ~n~Derek Payne, Derek Ward, - -[CR01_08:CRED01] -~n~ ~n~Gordon Yeoman, Graeme Williamson, ~n~Greg Smith, James Broad, ~n~John Gurney, John Whyte, - -[CR01_09:CRED01] -~n~ ~n~Keith McLeman, Mark Nicholson, ~n~Shaun McKillop - -[CR01_10:CRED01] -~n~ ~n~ ~n~ ~n~Audio Programmer ~n~Matthew Smith - -[CR01_11:CRED01] -~n~ ~n~ ~n~ ~n~Sound Design and Mastering ~n~Allan Walker - -[CR01_12:CRED01] -~n~ ~n~ ~n~ ~n~Lead Cut Scene Animator ~n~Mondo Ghulam - -[CR01_13:CRED01] -~n~ ~n~ ~n~ ~n~Cut Scene Animator ~n~Dermot Bailie - -[CR01_14:CRED01] -~n~ ~n~ ~n~ ~n~Character Animator ~n~Felipe Busquets - -[CR01_15:CRED01] -~n~ ~n~ ~n~ ~n~In-Game Animation ~n~Gus Braid, Terry Kenny - -[CR01_16:CRED01] -~n~ ~n~ ~n~ ~n~Characters Artist ~n~Ian McQue - -[CR01_17:CRED01] -~n~ ~n~ ~n~ ~n~Vehicle Artist ~n~Joylon Orme - -[CR01_18:CRED01] -~n~ ~n~ ~n~ ~n~Additional Art ~n~Rick Stirling, Alisdair Wood - -[CR01_19:CRED01] -~n~ ~n~ ~n~ ~n~Music Producer ~n~Craig Conner - -[CR01_20:CRED01] -~n~ ~n~ ~n~ ~n~Audio Design and Dialogue Editor ~n~Will Morton - -[CR01_21:CRED01] -~n~ ~n~ ~n~ ~n~Additional Dialogue Editor ~n~Jon McCavish - -[CR01_22:CRED01] -~n~ ~n~ ~n~ ~n~Development Support ~n~Milly Cottam - -[CR01_23:CRED01] -~n~ ~n~ ~n~ ~n~Graphic Designers ~n~Stuart Petri, Steve Walsh - -[CR01_24:CRED01] -~n~ ~n~ ~n~ ~n~Lead Level Design ~n~William Mills - -[CR01_25:CRED01] -~n~ ~n~ ~n~ ~n~Level Design ~n~Chris Rothwell, Andy Duthie, ~n~Chris McMahon, Neil Ferguson - -[CR01_26:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Craig Arbuthnott - -[CR01_27:CRED01] -~n~ ~n~ ~n~ ~n~Senior Lead Test ~n~Neil Corbett - -[CR01_28:CRED01] -~n~ ~n~ ~n~ ~n~Lead Test ~n~David Murdoch, Neil Meikle, ~n~Alex Bazlinton, Brenda Carey - -[CR01_29:CRED01] -~n~ ~n~ ~n~ ~n~Build Engineer / Lead Test ~n~Neil Walker - -[CR01_30:CRED01] -~n~ ~n~ ~n~ ~n~Audio Test ~n~George Williamson - -[CR01_31:CRED01] -~n~ ~n~ ~n~ ~n~Test ~n~Brian Kelly, Lindsay Robertson, ~n~Sundram Soosay, Eugene Kuczerepa, ~n~Christopher Soosay, Ben Abbott, - -[CR01_32:CRED01] -~n~ ~n~Oliver Elliott, Louis Dinan, ~n~Bobby Wright, Thomas Philips, ~n~Nick Rees, Ivor Williams - -[CR01_33:CRED01] -~n~ ~n~ ~n~ ~n~Test Tools Programming ~n~James Whitcroft, Alex Carter - -[CR01_34:CRED01] -~n~ ~n~ ~n~ ~n~IT Manager ~n~Lorraine Roy - -[CR01_35:CRED01] -~n~ ~n~ ~n~ ~n~IT Support ~n~Christine Chalmers, Dave Bruce - -[CR01_36:CRED01] -~n~ ~n~ ~n~ ~n~Studio Director ~n~Andrew Semple - -[CR01_37:CRED01] -~n~ ~n~ ~n~ ~n~Office Administration ~n~Kim Gurney - -[CR01_38:CRED01] -~n~ ~n~ ~n~ ~n~Administration Support ~n~Charlene Maguire, Kim Wilson - -[CR02_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LEEDS - -[CR02_02:CRED01] -~n~ ~n~ ~n~ ~n~Studio Director ~n~Gordon Hall - -[CR02_03:CRED01] -~n~ ~n~ ~n~ ~n~Head of Development ~n~David Box - -[CR02_04:CRED01] -~n~ ~n~ ~n~ ~n~Lead Programming ~n~Andrew Greensmith, Matthew Shepcar ~n~ ~n~ ~n~ ~n~Console Programming ~n~Nigel Conroy, Richard Frankish, ~n~Andrew Greensmith, Robin Mangham, ~n~Damian McKenna, Finlay Munro, ~n~Stuart Roskell, Matthew Shepcar - -[CR02_05:CRED01] -~n~ ~n~ ~n~ ~n~Programming ~n~Jon Bellamy, Ross Childs, ~n~Nigel Conroy, Neil Dodwell, ~n~Alastair Dukes, David Huebner, - -[CR02_06:CRED01] -~n~ ~n~Robin Mangham, Jason McGann, ~n~Warren Merrifield, Stephen McGreal - -[CR02_07:CRED01] -~n~ ~n~ ~n~ ~n~Sound Programming ~n~Finlay Munro, Charles Waddington - -[CR02_08:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Ian Bowden - -[CR02_09:CRED01] -~n~ ~n~ ~n~ ~n~Art Department Director ~n~Chris Smart - -[CR02_10:CRED01] -~n~ ~n~ ~n~ ~n~Lead Character Artist ~n~Paul Smith - -[CR02_11:CRED01] -~n~ ~n~ ~n~ ~n~Character Artist ~n~Chris Allison - -[CR02_12:CRED01] -~n~ ~n~ ~n~ ~n~Lead City Artist ~n~Dan Roberts - -[CR02_13:CRED01] -~n~ ~n~ ~n~ ~n~City Artists ~n~Paul McKee, James McHale, ~n~Siu Lee - -[CR02_14:CRED01] -~n~ ~n~ ~n~ ~n~Cutscene Interiors ~n~Izzy Stewart - -[CR02_15:CRED01] -~n~ ~n~ ~n~ ~n~Concept Artist ~n~John Wigley - -[CR02_16:CRED01] -~n~ ~n~ ~n~ ~n~Additional Character Animation ~n~Alan Bowker - -[CR02_17:CRED01] -~n~ ~n~ ~n~ ~n~Additional Artists ~n~Andy Walker, Jason Gee, ~n~Chris Edwards, Lee Clark - -[CR02_18:CRED01] -~n~ ~n~ ~n~ ~n~Design Director ~n~David Bland - -[CR02_19:CRED01] -~n~ ~n~ ~n~ ~n~Lead Level Design ~n~John Li - -[CR02_20:CRED01] -~n~ ~n~ ~n~ ~n~Senior Level Design ~n~Tony Gowland, Martyn Bramall - -[CR02_21:CRED01] -~n~ ~n~ ~n~ ~n~Level Design ~n~Sam Hackett, Stephen Robertson, ~n~Tom Kingsley, Chris Edwards, ~n~Kris Gormley - -[CR02_22:CRED01] -~n~ ~n~ ~n~ ~n~Associate Designer ~n~Mark McGinley - -[CR02_23:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Paul Colls - -[CR02_24:CRED01] -~n~ ~n~ ~n~ ~n~QA ~n~Jody Cobb, ~n~ ~n~Luke Brown, Nick Robey, ~n~Matthew Haven - -[CR02_25:CRED01] -~n~ ~n~ ~n~ ~n~Company Secretary ~n~Naomi Martin - -[CR02_26:CRED01] -~n~ ~n~ ~n~ ~n~IT Manager ~n~Chris Waring - -[CR03_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR NYC - -[CR03_02:CRED01] -~n~ ~n~ ~n~ ~n~Executive Producer ~n~Sam Houser - -[CR03_03:CRED01] -~n~ ~n~ ~n~ ~n~VP of Creative ~n~Dan Houser - -[CR03_04:CRED01] -~n~ ~n~ ~n~ ~n~VP of Development ~n~Jamie King - -[CR03_05:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Alex Horton - -[CR03_06:CRED01] -~n~ ~n~ ~n~ ~n~Chief Technology Officer ~n~Gary J. Foreman - -[CR03_07:CRED01] -~n~ ~n~ ~n~ ~n~Associate Producer ~n~Rich Rosado - -[CR03_08:CRED01] -~n~ ~n~ ~n~ ~n~Director of Quality Assurance ~n~Jeff Rosa - -[CR03_09:CRED01] -~n~ ~n~ ~n~ ~n~Senior Lead Analyst ~n~Lance Williams - -[CR03_10:CRED01] -~n~ ~n~ ~n~ ~n~Project Lead ~n~Jameel Vega - -[CR03_11:CRED01] -~n~ ~n~ ~n~ ~n~Rockstar Test Team ~n~Ethan Abeles, William Rompf, ~n~Christopher Mansfield, Chris Choi, ~n~Mike Hong, Tamara Carrion, - -[CR03_12:CRED01] -~n~ ~n~Rich Huie, Mike Nathan, ~n~Vance Wallace, Marc Rodriguez, ~n~Adam Tetzloff - -[CR03_13:CRED01] -~n~ ~n~ ~n~ ~n~Business Development Director ~n~Sean Macaluso - -[CR03_14:CRED01] -~n~ ~n~ ~n~ ~n~Soundtrack Supervision ~n~Heinz Henn, Ivan Pavlovich, ~n~Tim Sweeney - -[CR04_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~CUT SCENES & DIALOGUE - -[CR04_02:CRED01] -~n~ ~n~ ~n~ ~n~Motion Capture Director ~n~Navid Khonsari - -[CR04_03:CRED01] -~n~ ~n~ ~n~ ~n~Motion Capture Performed by ~n~Danny Mastrogiorgio, Jeffrey C. Hawkins, ~n~Bruce MacVittie, David Zayas, ~n~Peter Appel, Hannah Moon, ~n~Alyssa Truppelli, Joe Lotruglio - -[CR04_04:CRED01] -~n~ ~n~ ~n~ ~n~Voices Performed by ~n~Salvatore Leone - Frank Vincent ~n~Toni Cipriani - Danny Mastrogiorgio ~n~Donald Love - Will Janowitz - -[CR04_05:CRED01] -~n~ ~n~ Vincenzo Cilli - Joe Lotruglio ~n~Maria Latore - Fiona Gallagher ~n~JD O'Toole - Greg Wilson - -[CR04_06:CRED01] -~n~ ~n~Leon McAffrey - Ron Orbach ~n~Ray Machowski - Peter Appel ~n~Toshiko Kasen - Hannah Moon - -[CR04_07:CRED01] -~n~ ~n~ Ned Burner - Peter Bradbury ~n~Ma Cipriani - Sondra James ~n~Giovanni Casa - Joel Jones - -[CR04_08:CRED01] -~n~ ~n~Kazuki Kasen - Keenan Shimizu, ~n~Massimo Torini - Duccio Faggella ~n~Mickey Hamfists - Chris Tardio - -[CR04_09:CRED01] -~n~ ~n~Jane Hopper - Gordana Rashovich ~n~Mayor O'Donovan - John Braden ~n~8 Ball - Guru - -[CR04_10:CRED01] -~n~ ~n~Radio Newscaster - Sharon Washington ~n~TV Reporter - Brooke Alexander - -[CR04_11:CRED01] -~n~ ~n~ ~n~ ~n~Pedestrian Dialogue ~n~Una Cruickshank, Gregory Johnson, ~n~Sanford Santacroce, Ayana Osada - -[CR04_12:CRED01] -~n~ ~n~ ~n~ ~n~Pedestrian Voices ~n~Jamie Hector, Jackson Loo, ~n~Bruce MacVittie, Jeff Gurner, ~n~Jamie Hector, Andrea Kessler, - -[CR04_13:CRED01] -~n~ ~n~Lynne Horton, Phil Mikkelson, ~n~Koji Nonoyama, Devin Bennett, ~n~Jay Capozello, Mike Nathan, - -[CR04_14:CRED01] -~n~ ~n~Ethan Abeles, Lance Williams, ~n~Natalya Wilson, Jay Gladstone, ~n~Craig Blair, Dave Edwards, - -[CR04_15:CRED01] -~n~ ~n~Gregory Johnson, John Zurhellen, ~n~Blair Sadler, Georgia Sadler, ~n~Nicole Sadler, Judy Henderson, - -[CR04_16:CRED01] -~n~ ~n~Kim Graham, Kerry Shaw, ~n~Tamara Carrion, Franceska Clemens, ~n~Navid Khonsari, Noelle Sadler, - -[CR04_17:CRED01] -~n~ ~n~Nicholas Mongomery, Anthony Macbain, ~n~Ryan Rayhill, Josh Slater, ~n~Carmelo Gaeta, Hikari Yokoyama, - -[CR04_18:CRED01] -~n~ ~n~Chris Jobin, Michael Rothstein, ~n~Stacey Rachels, Jennifer Koontz, ~n~Dan Merrill, Ali Khonsari, - -[CR04_19:CRED01] -~n~ ~n~Ellen Rose, Chris Standal, ~n~Lorie Goodman, Neal Johnston, ~n~Son Garth, James Larsen, - -[CR04_20:CRED01] -~n~ ~n~Karl Weibel, Ramin Khonsari, ~n~Ed. Thomas Jr., Stanton Sargent, ~n~Oswald Greene, Audrey Amey, - -[CR04_21:CRED01] -~n~ ~n~Sanford Santacroce, Jeff Madrick, ~n~Ben Weaver, Andrea Kessler, ~n~CS Lee, Yoshi Amao, - -[CR04_22:CRED01] -~n~ ~n~ Jackson Loo, Martha Morrison, ~n~Sarah Bloodsworth, Adam Deher, ~n~Billy Gonzalez - -[CR04_23:CRED01] -~n~ ~n~ ~n~ ~n~Additional Motion Graphics ~n~Maryam Parwana - -[CR04_24:CRED01] -~n~ ~n~ ~n~ ~n~Dialogue Recording & Mixing ~n~Nicholas Montgomery - -[CR04_25:CRED01] -~n~ ~n~ ~n~ ~n~Foley Recording ~n~Bryan Scibinico - -[CR04_26:CRED01] -~n~ ~n~ ~n~ ~n~Foley recorded at Dig It Studios - -[CR04_27:CRED01] -~n~ ~n~ ~n~ ~n~Production Team ~n~Noelle Sadler, Eli Weissman, ~n~Kerry Shaw, John Zurhellen, ~n~Peter Adler, Anthony Carvalho, - -[CR04_28:CRED01] -~n~ ~n~Phil Poli, Jaesun Celebre, ~n~Franceska Clemens, Anthony Litton - -[CR04_29:CRED01] -~n~ ~n~ ~n~ ~n~Casting ~n~Judy Henderson and Associates - -[CR04_30:CRED01] -~n~Motion Capture recorded at Perspective Studios - -[CR05_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RADIO - -[CR05_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ Banter, Talk Radio, Commercials and Imaging written by ~n~Dan Houser and Lazlow - -[CR05_03:CRED01] -~n~ ~n~ ~n~ ~n~Production by ~n~Lazlow - -[CR05_04:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~LCFR - -[CR05_05:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Smith Harrison, Karen Saltus - -[CR05_06:CRED01] -~n~ ~n~ ~n~ ~n~Heartland Values with Nurse Bob ~n~Nurse Bob - Chuck Montgomery - -[CR05_07:CRED01] -~n~ ~n~ ~n~ ~n~Guests and Callers ~n~Ayana Osada, Nick Montgomery, ~n~Russell Lewis, Nick Born, ~n~Sean Macaluso, Kerry Shaw, - -[CR05_08:CRED01] -~n~ ~n~Chad Johnson, Craig Conner, ~n~Mary Elizabeth, Rob Cross, ~n~Josh Bitney - -[CR05_09:CRED01] -~n~ ~n~ ~n~ ~n~Electron Zone ~n~Steve - Ptolemy Slocum ~n~Bill - Michael Urichek - -[CR05_10:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Alice Saltzman, Jeremy Wheaton, ~n~Ryan Rayhill, Maine Anderson, ~n~Patton Oswalt, Wil Wheaton, ~n~Anthony Cumia, Madena Parwana - -[CR05_11:CRED01] -~n~ ~n~ ~n~ ~n~Breathing World ~n~Lee Chowder - Ashley Albert ~n~Crow - Gregg Martin - -[CR05_12:CRED01] -~n~ ~n~ ~n~ ~n~Coq 'O' Vin ~n~Richard Goblin - Mike Shapiro - -[CR05_13:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Ben Krech - -[CR05_14:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Franceska Clemins, Sarah Bloodsworth, ~n~Adam Deher, Martha Morrison, ~n~Carmelo Gaeta - -[CR05_15:CRED01] -~n~ ~n~ ~n~ ~n~Chatterbox ~n~Lazlow as himself - -[CR05_16:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Susan Lewis, Ben Weaver, ~n~Jacky Bam Bam, Ben Sparks, ~n~Deanna Moyer, Liezl Jacinto, - -[CR05_17:CRED01] -~n~ ~n~Joshua Batista, Gregg Opie Hughes, ~n~Sondra James, Elizabeth Satterwhite - -[CR06_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~HEAD RADIO - -[CR06_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Michael Hunt - Russ Mottla - -[CR06_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Jeff Berlin, Katelyn Hutchinson - -[CR06_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jeff Berlin - -[CR06_05:CRED01] -~n~ ~n~ ~n~ ~n~"Train" ~n~Conor & Jay ~n~Written by Craig Conner & Julie Wemyss ~n~Produced by Craig Conner ~n~Guitars by Jon McCavish ~n~Vocals by Julie Wemyss and Craig Conner - -[CR06_06:CRED01] -~n~ ~n~ ~n~ ~n~"The One For Me" ~n~Cloud Nineteen ~n~Written & Produced by ~n~Will Morton ~n~Additional Lyrics by Paul Mackie ~n~Guitars by Allan Walker & Chris Morton ~n~Lead Vocals by Raff ~n~Backing Vocals by Paul Mackie & Raff - -[CR06_07:CRED01] -~n~ ~n~ ~n~ ~n~"Take The Pain" ~n~Purser ~n~Written & Produced by ~n~Will Morton, Chris Morton ~n~Additional Lyrics by Paul Mackie ~n~Lead Vocals by Paul Mackie ~n~Additional Vocals by Will Morton - -[CR06_08:CRED01] -~n~ ~n~ ~n~ ~n~"Free Yourself" ~n~L-Marie featuring Raff ~n~Written & Produced by Craig Conner ~n~Vocals by L-Marie and Raff ~n~Backing Vocals by Craig Conner - -[CR06_09:CRED01] -~n~ ~n~ ~n~ ~n~"Drive" ~n~15 Ways ~n~Written & Produced by Colin Entwistle ~n~Vocals by Paul Mackie - -[CR06_10:CRED01] -~n~ ~n~ ~n~ ~n~"Welcome To The Real World" ~n~Rosco Stow ~n~Written & Produced by Craig Conner ~n~Guitars Written, Produced and Performed by Allan Walker ~n~Lead Vocals by Andy Dorrat ~n~Backing Vocals by Craig Conner, ~n~Anna Stuart and Kim Gurney - -[CR06_11:CRED01] -~n~ ~n~ ~n~ ~n~"Keep Dreaming" ~n~Vanilla Smoothie ~n~Written & Produced by ~n~Alastair MacGregor ~n~Guitars by Allan Walker ~n~Vocals by Fiona Stoddart - -[CR07_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~LIPS 106 - -[CR07_02:CRED01] -~n~ ~n~ ~n~ ~n~DJs ~n~Cliff - Ed McMann ~n~Andee - Shelley Miller - -[CR07_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Jonathan Hanst - -[CR07_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jonathan Hanst - -[CR07_05:CRED01] -~n~ ~n~ ~n~ ~n~"Funk In Time" ~n~Rudy La Fontaine ~n~Written & Produced by Jon McCavish ~n~Guitars by Julian Pais ~n~Vocals by Julian Pais - -[CR07_06:CRED01] -~n~ ~n~ ~n~ ~n~"Love Is The Feeling" ~n~Sawarr ~n~Written by Craig Conner & Julie Wemyss ~n~Produced by Craig Conner ~n~Vocals by Julie Wemyss - -[CR07_07:CRED01] -~n~ ~n~ ~n~ ~n~"Mine Until Monday" ~n~Sunshine Shine ~n~Written & Produced by Will Morton ~n~Additional Lyrics by Paul Mackie ~n~Vocals by Paul Mackie & Raff - -[CR07_08:CRED01] -~n~ ~n~ ~n~ ~n~"Get Down" ~n~Credit Check ~n~Written & Produced by ~n~Alastair MacGregor ~n~Guitars by Martyn Livingstone ~n~Bass by Andy Wilson ~n~Vocals by Louise Ferrier - -[CR07_09:CRED01] -~n~ ~n~ ~n~ ~n~"Tonight" ~n~Cool Timers ~n~Written & Produced by Craig Conner ~n~Vocals by Julie Wemyss - -[CR07_10:CRED01] -~n~ ~n~ ~n~ ~n~"Bassmatic" ~n~Nina Barry ~n~Written & Produced by Jon McCavish ~n~Vocals by Riz Maslen - -[CR07_11:CRED01] -~n~ ~n~ ~n~ ~n~"Into Something (C'mon Get Down)" ~n~The Jackstars ~n~Written & Produced By ~n~Craig Conner ~n~Vocals by Lucie Danti-Juan ~n~Backing vocals by ~n~Kevin Stacey & Craig Conner - -[CR08_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~DOUBLE CLEF FM - -[CR08_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Sergio Boccino - Robert Blumenfeld - -[CR08_03:CRED01] -~n~ ~n~ ~n~ ~n~Caller ~n~Gerald Cosgrove - -[CR08_04:CRED01] -~n~ ~n~ ~n~ ~n~"Il Trovatore: Anvil Chorus" ~n~Composed by Giuseppe Verdi ~n~Performed by ~n~Nuremberg Symphonic Orchestra ~n~& Munich State Opera Choir ~n~Courtesy of Point Classics, LLC - -[CR08_05:CRED01] -~n~ ~n~ ~n~ ~n~"Il Trovatore: Tacea la notte placida" ~n~Composed by Giuseppe Verdi ~n~Performed by ~n~Nuremberg Symphonic Orchestra & ~n~Munich State Opera Choir ~n~(Eva Illes, Soprano) ~n~Courtesy of Point Classics, LLC - -[CR08_06:CRED01] -~n~ ~n~ ~n~ ~n~"Nabucco: Chorus of the Hebrew Slaves" ~n~Composed by Giuseppe Verdi ~n~Performed by Philharmonia Slavonica ~n~Courtesy of Point Classics, LLC - -[CR08_07:CRED01] -~n~ ~n~ ~n~ ~n~"Così fan tutte: È amore un ladroncello" ~n~Composed by Wolfgang Amadeus Mozart ~n~Performed by ~n~Bratislava Opera Soloists, ~n~Choir and Orchestra ~n~(Ida Kirilova "Dorabella") ~n~Courtesy of Point Classics, LLC - -[CR08_08:CRED01] -~n~ ~n~ ~n~ ~n~"Marriage of Figaro: Overture" ~n~Composed by Wolfgang Amadeus Mozart ~n~Performed by ~n~London Philharmonic Orchestra ~n~Courtesy of Point Classics, LLC - -[CR08_09:CRED01] -~n~ ~n~ ~n~ ~n~"I Pagliacci: Vesti la giubba" ~n~Composed by Ruggiero Leoncavallo ~n~Performed by ~n~Nuremberg Symphonic Orchestra ~n~(José Maria Perez, Tenor) ~n~Courtesy of Point Classics, LLC - -[CR09_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RISE FM - -[CR09_02:CRED01] -~n~ ~n~ ~n~ ~n~Engineered by Mike Callaghan - -[CR09_03:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Boy Sanchez - Oliver Vaquer - -[CR09_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~DJ Andre, Lupus Thunder, ~n~Andi Hanley, Mat Ckillz, ~n~Couzin Ed, Lazlow, - -[CR09_05:CRED01] -~n~ ~n~Terry Donovan, Bill Brissette, ~n~Juan Aller, Ed Andrews, ~n~Xeni Jardin, Matthew Orr, ~n~Jeff Berlin - -[CR09_06:CRED01] -~n~ ~n~ ~n~ ~n~"Sing It Back ~n~(Boris Musical Mix)" ~n~Moloko ~n~Written by M. Brydon, R. Murphy ~n~Published by Chrysalis Music (ASCAP) ~n~Remix and Additional Production by ~n~Boris Dlugosch ~n~(p) + © 1998 The Echo Label ~n~Courtesy of Chrysalis Music Limited - -[CR09_07:CRED01] -~n~ ~n~ ~n~ ~n~"Free" ~n~Ultra Nate ~n~Written by U. Nate, L. Springsteen, ~n~J. Ciafone ~n~Published by Warner/ Chappell Music/ BMG Music ~n~(p) + © 1997 Strictly Rhythm Records LLC ~n~Courtesy of Warner Strategic Marketing - -[CR09_08:CRED01] -~n~ ~n~ ~n~ ~n~"I Believe" ~n~Happy Clappers ~n~Written by C. Scott, G. Ripley, M. Knotts, M. Topham ~n~Published by All Boys Music Ltd ~n~(p) + © 1994 C J Scott Productions ~n~Courtesy of C J Scott Productions - -[CR09_09:CRED01] -~n~ ~n~ ~n~ ~n~"House Music" ~n~Eddie Amador ~n~Written by Eddie Amador ~n~Published by ~n~Deep Dish Music ~n~(p) + © 1998 Yoshitoshi Records ~n~Courtesy of ~n~Deep Dish Recordings, Inc. ~n~by arrangement with ~n~Nasseri Music Business Solutions - -[CR09_10:CRED01] -~n~ ~n~ ~n~ ~n~"Feel What You Want" ~n~Kristine W ~n~Written by R. Dougan, R. Armstrong, ~n~K. Weitz ~n~Published by BMG Music/Weitz House Publishing (ASCAP)/ EMI Music Publishing ~n~(p) + © 1996 RCA/ BMG ~n~Courtesy of Sony BMG Entertainment - -[CR09_11:CRED01] -~n~ ~n~ ~n~ ~n~"Hideaway ~n~(Deep Dish Vocal Remix)" ~n~De'Lacy ~n~Written by K. Hedge, J. Milan ~n~Published by ~n~Warner-Tamerlane Publishing Corp ~n~Remix and Additional Production by ~n~Deep Dish ~n~(p) 1995 Easy Street Recordings Inc ~n~© 1998 Kickin Music Ltd ~n~Courtesy of Easy Street Recordings Inc. and Slip n' Slide Records - -[CR09_12:CRED01] -~n~ ~n~ ~n~ ~n~"Spin Spin Sugar ~n~(Armand's Dark Garage Mix)" ~n~Sneaker Pimps ~n~Written by I. Pickering, L. Coverdale Howe, C. Corner ~n~Remix and Additional Production by ~n~Armand Van Helden ~n~Published by BMG Songs, Inc ~n~(p) + © 1997 Clean Up Records Ltd ~n~Courtesy of EMI Music / ~n~One Little Indian, Ltd - -[CR09_13:CRED01] -~n~ ~n~ ~n~ ~n~"Plastic Dreams" ~n~Jaydee ~n~Written by R. Albers ~n~Published by TBM Holland ~n~(p) 1992 R & S Records ~n~© Robin Albers ~n~Courtesy of Robin "Jaydee" Albers - -[CR09_14:CRED01] -~n~ ~n~ ~n~ ~n~"Altered States" ~n~Ron Trent ~n~Written by R. Trent ~n~Published by ~n~High Fashion Music/ Nanada Music ~n~(p) + © 1993 Warehouse ~n~Djax-Up Beats ~n~Courtesy of High Fashion Music/ ~n~Djax-Up Beats - -[CR09_15:CRED01] -~n~ ~n~ ~n~ ~n~"There Will Come A Day (Half Tab Dub)" ~n~The Absolute featuring Suzanne Palmer ~n~Written by M. Pichiotti, C.J. Snider ~n~Published by Much Noyse Music/ ~n~Hoobini Music (ASCAP) ~n~(p) + © 1995 Mark Productions, Inc ~n~Courtesy of Mark Productions, Inc - -[CR09_16:CRED01] -~n~ ~n~ ~n~ ~n~"Positive Education" ~n~Slam ~n~Written by S. McMillan, O. Meikle, ~n~G. Gibbons, J. Muotone ~n~Published by EMI Music Publishing ~n~(p) + © 1997 Soma Recordings Ltd ~n~Courtesy of Soma Recordings Ltd - -[CR09_17:CRED01] -~n~ ~n~ ~n~ ~n~"Flash" ~n~Green Velvet ~n~Written by C. Jones ~n~Published by Curtis A. Jones Music (ASCAP) ~n~(p) 1995 Relief Records ~n~© 2000 Warner Bros. Records and N.E.W.S. Records and Relief Records ~n~Courtesy of Warner Strategic Marketing, N.E.W.S. Records, Relief Records - -[CR09_18:CRED01] -~n~ ~n~ ~n~ ~n~"Circus Bells (Hardfloor Remix)" ~n~Robert Armani ~n~Written by R. Armani ~n~Published by ~n~High Fashion Music/ Nanada Music ~n~(p) + © 1993 Warehouse/ ~n~Djax-Up Beats ~n~Courtesy of High Fashion Music/ ~n~Djax-Up Beats - -[CR09_19:CRED01] -~n~ ~n~ ~n~ ~n~"Higher State Of Consciousness" ~n~Wink ~n~Written by J. Wink ~n~Published by Strictly Rhythm Publishing, Inc. (ASCAP) / Warner/Chappell Music / Wink Inc. (ASCAP) / EMI Music Publishing ~n~(p) + © 1995 Strictly Rhythm Records LLC ~n~Courtesy of Warner Strategic Marketing - -[CR10_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RADIO DEL MUNDO - -[CR10_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Panjit Gavaskar - Hajaz Akram - -[CR10_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Jessica Wachsman - -[CR10_04:CRED01] -~n~ ~n~ ~n~ ~n~"Raghupati (Folk Tune)" ~n~Ananda Shankar ~n~Arranged by A. Shankar, Lewinson, Hassilev ~n~Published by Warner Chappell Inc ~n~(p) + © 1970 Reprise Records for the U.S. and WEA International Inc ~n~Courtesy of Warner Strategic Marketing - -[CR10_05:CRED01] -~n~ ~n~ ~n~ ~n~"Dum Maro Dum" ~n~Asha Bhosle ~n~Written by RD Burman, Anand Bakshi ~n~Published by Saregama India Ltd ~n~(p) + © 1971 Saregama India Ltd ~n~Courtesy of Saregama India Ltd - -[CR10_06:CRED01] -~n~ ~n~ ~n~ ~n~"Neeve Nanna (Only You Were Mine)" ~n~Vijaya Anand ~n~Written by Vijaya Anand ~n~Published by Shake Boom! (ASCAP)/ ~n~Luaka Bop Inc ~n~(p) 1988 Lahari/Audiovision ~n~© 1992 Sire Records Company ~n~Courtesy of ~n~Luaka Bop Records - -[CR10_07:CRED01] -~n~ ~n~ ~n~ ~n~"Kidda" ~n~Natacha Atlas ~n~Written by N. Atlas, J. Reynolds, J. Adams ~n~Published by Warner Chappell Music Ltd ~n~(p) + © 1997 Nation Records Ltd/ ~n~Beggars Banquet Records Ltd ~n~Courtesy of Nation Records Ltd/ ~n~Beggars Banquet Records Ltd - -[CR10_08:CRED01] -~n~ ~n~ ~n~ ~n~"Hebeena Hebeena" ~n~Farid El Atrache ~n~Written by Barakat, Atrache ~n~Published by Voices Of Lebanon ~n~(p) + © 1974 Voices Of Lebanon ~n~Courtesy of EMI Music/ EMI Music Arabia - -[CR10_09:CRED01] -~n~ ~n~ ~n~ ~n~"Aini Bet Ref" ~n~Ahmed Mneimneh ~n~Written by A. Alishaan ~n~Published by D. Dersahakian (ASCAP) ~n~(p) + © Voice of Stars & ~n~Lys Records ~n~Courtesy of Voice of Stars & ~n~Lys Records - -[CR10_10:CRED01] -~n~ ~n~ ~n~ ~n~"Im Nin'Alu" ~n~Ofra Haza ~n~Traditional, Arranged by I. Ashdot, B. Nagari ~n~Published by Blue Lake Music ~n~ (p) + © 1988 Sire Records Company ~n~Courtesy of Warner Strategic Marketing - -[CR10_11:CRED01] -~n~ ~n~ ~n~ ~n~"Ballaa Tsoubou Hal Kahwa" ~n~Samira Tawfic ~n~Written by R. Al Khylani, J. Al A'ss ~n~Published by Copyright Control ~n~(p) + © Voices Of Lebanon ~n~Courtesy of EMI Music/ EMI Music Arabia - -[CR11_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~K-JAH - -[CR11_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Natalee Walsh Davis - Pascale Armand - -[CR11_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Karl Weibel, Pat McKay - -[CR11_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jay Wright Productions - -[CR11_05:CRED01] -~n~ ~n~ ~n~ ~n~"Pick a Sound" ~n~Selah Collins, Ruddy Ranks, Redeye ~n~Written by S. Collins, H. Burke, ~n~E. Donaldson ~n~Published by Copyright Control/ MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR11_06:CRED01] -~n~ ~n~ ~n~ ~n~"What a Wonderful Feeling" ~n~Errol Bellot, Ruddy Ranks, Redeye ~n~Written by E. Bellot, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR11_07:CRED01] -~n~ "Watch How the People Dancing" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by K. Wright ~n~Published by Jetstar ~n~Courtesy of Honest Jons Records - -[CR11_08:CRED01] -~n~ ~n~ ~n~ ~n~"Lean Boot" ~n~Richie Davis, Ruddy Ranks, Redeye ~n~Written by R. Davis, H. Burke, ~n~E. Donaldson ~n~Published by Westbury Music/ MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR11_09:CRED01] -~n~ ~n~ ~n~ ~n~"Ready For the Dancehall Tonight" ~n~Peter Bouncer, Ruddy Ranks, Redeye ~n~Written by Peter McKenzie, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR11_10:CRED01] -~n~ ~n~ ~n~ ~n~"You Ha Fe Cool" ~n~Richie Davis, Ruddy Ranks, Redeye ~n~Written by R. Davis, H. Burke, ~n~E. Donaldson. ~n~Published by Westbury Music/MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR11_11:CRED01] -~n~ ~n~ ~n~ ~n~"Ring My Number" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by Kenneth Wright, H. Burke, ~n~E. Donaldson. ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR11_12:CRED01] -~n~ ~n~ ~n~ ~n~"Run Come Call Me" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by Kenneth Wright, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR12_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~THE LIBERTY JAM - -[CR12_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~DJ Clue as himself - -[CR12_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Jay Wright, Tom Yankowski, Chris Mercado, Vanessa Grullon - -[CR12_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jay Wright Productions - -[CR12_05:CRED01] -~n~ ~n~ ~n~ ~n~"All I Need" ~n~Method Man ~n~Written by C. Smith, R. Diggs ~n~Published by Sony BMG Music ~n~(p) + © 1994 Def Jam Recordings ~n~Courtesy of Def Jam Recordings/ UME - -[CR12_06:CRED01] -~n~ ~n~ ~n~ ~n~"Shook Ones Pt. II" ~n~Mobb Deep ~n~Written by A. Johnson, K. Muchita ~n~Published by ~n~BMG Songs Inc. (ASCAP) ~n~(p) + © 1995 BMG Music ~n~Courtesy of RCA Records by arrangement with Sony BMG Ent - -[CR12_07:CRED01] -~n~ ~n~ ~n~ ~n~"Incarcerated Scarface" ~n~Raekwon ~n~Written by R. Diggs, C. Woods, A. Tilman ~n~Published by ~n~Careers-BMG Music Publishing Inc./ ~n~Wu Tang Publishing (BMI)/ ~n~Bridgeport Music ~n~(p) + © 1995 BMG Music - -[CR12_08:CRED01] -Courtesy of RCA Records by arrangement with Sony BMG Ent ~n~This track contains a sample of "You're Getting A Little Too Smart" as performed by The Detroit Emeralds. Courtesy of Westbound Records. Used by permission. All rights reserved - -[CR12_09:CRED01] -~n~ ~n~ ~n~ ~n~"N.O.R.E." ~n~Noreaga ~n~Written by V. Santiago, J. Olivier, ~n~S. Barnes ~n~Published by Suite 1202 Music/ Jose Luis Gotcha Music (BMI)/ Slamuwell Productions/ Jelly's Jam LLC (ASCAP)/ ~n~12 & Under Music/ - -[CR12_10:CRED01] -Jumping Bean Songs LLC (BMI) ~n~(p) + © 1998 Penalty Recordings ~n~Courtesy of Warner Strategic Marketing - -[CR12_11:CRED01] -~n~ ~n~ ~n~ ~n~"Shut 'Em Down (Remix)" ~n~Onyx featuring Noreaga & Big Pun ~n~Written by F. Scruggs, K. Jones, T. Taylor, E. Hinson, E. Simmons ~n~Published by Universal Music/ ~n~Let Me Show You Music/ ~n~Jelly Jams Music/ - -[CR12_12:CRED01] -III Posse Music/ Ill Hill Billy'z Music/ Warner-Tamerlane Music ~n~(p) + © 1998 Rush Associated Labels Recordings ~n~Courtesy of Universal Music Enterprises - -[CR12_13:CRED01] -~n~ ~n~ ~n~ ~n~"Beware" ~n~Big Pun ~n~Written by C. Rios, J. Tineo ~n~Published by Let Me Show You Music/ ~n~Joe Cartegena Music (ASCAP), ~n~Administered by Jelly Jams Music (BMI)/ ~n~P.H.D. Music (ASCAP) - -[CR12_14:CRED01] -(p) + © 1998 Loud Records LLC ~n~Courtesy of Columbia Records by arrangement with Sony BMG Ent - -[CR12_15:CRED01] -~n~ ~n~ ~n~ ~n~"Twinz (Deep Cover 98)" ~n~Big Pun ~n~Written by C. Rios, J. Cartegena, ~n~C. Brodus, A. Young, C. Wolfe ~n~Published by Let Me Show You Music/ ~n~Joe Cartegena Music (ASCAP)/ ~n~Jelly Jams Music (BMI)/ ~n~Sony Tunes Inc. (ASCAP) - -[CR12_16:CRED01] -~n~(p) + © 1998 Loud Records LLC ~n~Courtesy of Columbia Records by arrangement with Sony BMG Ent ~n~This track contains a sample of "Deep Cover" as performed by Dr. Dre. Courtesy of Solar Records. Used by permission. All rights reserved - -[CR12_17:CRED01] -~n~ ~n~ ~n~ ~n~"Get At Me Dog" ~n~DMX featuring Sheek of The Lox ~n~Written by E. Simmons, D. Blackman, ~n~A. Fields, S. Taylor ~n~Published by Universal Music Publishing/ EMI April Music/ ~n~Sony ATV Tunes - -[CR12_18:CRED01] -~n~(p) + © 1998 Rush Associated Labels Recordings ~n~Courtesy of Universal Music Enterprises - -[CR12_19:CRED01] -~n~ ~n~ ~n~ ~n~"Ruff Ryders Anthem (Remix)" ~n~DMX featuring DJ Clue, Jadakiss, Styles, Drag-On & Eve ~n~Written by J. Phillips, M.J. Smalls, E. Shaw, K. Ifill, E. Simmons, K. Dean, E. Jeffers ~n~Published by Universal Music Publishing/ EMI Music Publishing - -[CR12_20:CRED01] -(p) + © 1998 Roc-a-Fella Records ~n~Courtesy of Universal Music Enterprises - -[CR12_21:CRED01] -~n~ ~n~ ~n~ ~n~"Do What You Feel" ~n~Redman featuring Method Man ~n~Written by P. Michael, R. Noble, C. Smith ~n~Published by Careers BMG/ Sony ATV Tunes/ Famous Music ~n~(p) + © 1996 Def Jam ~n~Courtesy of Universal Music Enterprises - -[CR12_22:CRED01] -~n~ ~n~ ~n~ ~n~"Chain Gang Freestyle" ~n~The Lox & Black Rob ~n~Written by Frierson, Phillips, Styles, Jacobs, Ross, Shaw ~n~Published by EMI Music Publishing ~n~Courtesy of Bad Boy Records - -[CR12_23:CRED01] -~n~ ~n~ ~n~ ~n~"Chest2chest Freestyle" ~n~The Lox ~n~Written by Phillips, Styles, Jacobs, Shaw, Barnes, Lemay, Montgomery ~n~Published by Taggie Music (BMI)/ ~n~Universal Polygram Int'l. (ASCAP)/ ~n~EMI Music Publishing ~n~Courtesy of Bad Boy Records - -[CR12_24:CRED01] -This track contains a sample of "Next Level" as performed by Showbiz & AG. Courtesy of Universal Music Enterprises. Used by permission. All rights reserved - -[CR13_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~MSX 98 - -[CR13_02:CRED01] -~n~ ~n~ ~n~ ~n~MC ~n~Codebreaker as himself - -[CR13_03:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Timecode - -[CR13_04:CRED01] -~n~ ~n~ ~n~ ~n~Station Production ~n~Timecode - -[CR13_05:CRED01] -~n~ ~n~ ~n~ ~n~"Renegade Snares" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1993 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_06:CRED01] -~n~ ~n~ ~n~ ~n~"Terrorist" ~n~Renegade ~n~Written, Produced & Engineered by ~n~A. Dookith ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_07:CRED01] -~n~ ~n~ ~n~ ~n~"Finest Illusion (Legal Mix)" ~n~Foul Play ~n~Written, Produced & Engineered by ~n~J. Morrow, S. Bradshaw, ~n~S. Gurley ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1993 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_08:CRED01] -~n~ ~n~ ~n~ ~n~"Living For the Future (FBD Project Remix)" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_09:CRED01] -~n~ ~n~ ~n~ ~n~"Stay Calm (Foul Play Remix)" ~n~DJ Pulse ~n~Written, Produced & Engineered by ~n~A. Brown ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_10:CRED01] -~n~ ~n~ ~n~ ~n~"Disturbance (Tango Remix)" ~n~Hyper-On Experience ~n~Written, Produced & Engineered by ~n~A. Banks, D. Demierre ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_11:CRED01] -~n~ ~n~ ~n~ ~n~"Cold Fresh Air" ~n~Higher Sense ~n~Written, Produced & Engineered by ~n~A. Miles, DJ Rhythm ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_12:CRED01] -~n~ ~n~ ~n~ ~n~"Living For the Future" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_13:CRED01] -~n~ ~n~ ~n~ ~n~"Thru The Vibe (2 on 1 Mix)" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_14:CRED01] -~n~ ~n~ ~n~ ~n~"The Helicopter Tune" ~n~Deep Blue ~n~Written, Produced & Engineered by ~n~S. O'Keefe ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_15:CRED01] -~n~ ~n~ ~n~ ~n~"Dred Bass" ~n~Dead Dred ~n~Written, Produced & Engineered by ~n~W. Smith, L. Smith ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR14_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~FLASHBACK FM - -[CR14_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Reni Wassulmaier - Barbara Rosenblatt - -[CR14_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Mike Shapiro - -[CR14_04:CRED01] -~n~ ~n~ ~n~ ~n~"First Hand Experience ~n~In Second Hand Love" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Giorgio Moroder ~n~Courtesy of Giorgio Moroder - -[CR14_05:CRED01] -~n~ ~n~ ~n~ ~n~"I Wanna Rock You" ~n~Giorgio ~n~Written by G. Moroder, H. Faltermeyer, ~n~K. Forsey ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1979 Giorgio Moroder ~n~Courtesy of Giorgio Moroder - -[CR14_06:CRED01] -~n~ ~n~ ~n~ ~n~"E=MC2" ~n~Giorgio ~n~Written by G. Moroder, H. Faltermeyer, ~n~P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1979 Giorgio Moroder ~n~Courtesy of Giorgio Moroder - -[CR14_07:CRED01] -~n~ ~n~ ~n~ ~n~"Chase" ~n~Giorgio Moroder ~n~Written by G. Moroder ~n~Published by Warner/ Chappell Music ~n~(p) + © 1978 Casablanca Films/ ~n~Columbia Pictures ~n~Courtesy of Sony Pictures Entertainment - -[CR14_08:CRED01] -~n~ ~n~ ~n~ ~n~"I'm Left, You're Right, She's Gone" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Giorgio Moroder ~n~Courtesy of Giorgio Moroder - -[CR14_09:CRED01] -~n~ ~n~ ~n~ ~n~"From Here To Eternity" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Casablanca Records ~n~Courtesy of Universal Music Enterprises - -[CR15_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~COMMERCIAL VOICES - -[CR15_02:CRED01] -~n~ ~n~ ~n~ ~n~Alex Anthony, Anouchka Benson, ~n~Audrey Amey, Bill Smith, ~n~Billy Gonzalez, Brian Thomas, - -[CR15_03:CRED01] -~n~ ~n~Chris Jobin, Chris Silvestro, ~n~Craig Blair, Dan Houser, ~n~Dan Merrill, Ed Thomas, - -[CR15_04:CRED01] -~n~ ~n~Ethan Abeles, Garth Johnston, ~n~Gregg Martin, Gregory Johnson, ~n~Hikari Yokoyama, James Ferrante, - -[CR15_05:CRED01] -~n~ ~n~James Larson, Jay Capozello, ~n~Jayson Gladstone, Jeff Berlin, ~n~Jen Sweeney, Jessica Wachsman, - -[CR15_06:CRED01] -~n~ ~n~ JJ Adler, Jonathan Hanst, ~n~Joshua Batista, Karen Saltus, ~n~Koji Nonoyami, Lance Williams, - -[CR15_07:CRED01] -~n~ ~n~Lazlow, Lynne Horton, ~n~Michael Nathan, Mike Ferrante Jr., ~n~Chris Ferrante, Mike Shapiro, - -[CR15_08:CRED01] -~n~ ~n~Natalya Wilson, Noelle Sadler, ~n~Phil Mikkelson, Ron Reeve, ~n~Smith Harrison, Stacy Rachels, - -[CR15_09:CRED01] -~n~ ~n~ Steve Carlesi, Julie Wemyss, ~n~Kim Gurney - -[CR16_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~CUTSCENE MUSIC - -[CR16_02:CRED01] -~n~ ~n~ ~n~ ~n~"Japanese Geisha" ~n~Sonia Slany ~n~Written by Sonia Slany ~n~Published by West One Music ~n~Courtesy of APM Music, LLC - -[CR16_03:CRED01] -~n~ ~n~ ~n~ ~n~"The Heist" ~n~Bugz in the Attic ~n~Written by K. Tatham ~n~Published by Copyright Control ~n~(p) 2005 Bugz In The Attic ~n~Courtesy of Bugz In The Attic ~n~www.bugzintheattic.co.uk - -[CR16_04:CRED01] -~n~ ~n~ ~n~ ~n~"A Dark March" ~n~Danger Mouse ~n~Written by Danger Mouse ~n~Published by ~n~Underground Animals (ASCAP) - -[CR17_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR NYC PUBLISHING TEAM - -[CR17_02:CRED01] -~n~ ~n~ ~n~ ~n~Terry Donovan, Jenefer Gross, ~n~Jennifer Kolbe, Devin Winterbottom, ~n~Adam Tedman, Michael Elkind, - -[CR17_03:CRED01] -~n~ ~n~Paul Yeates, Hosi Simon, ~n~Daniel Einzig, Marlene Yamaguchi, ~n~Gauri Khindaria, Stanton Sarjeant, - -[CR17_04:CRED01] -~n~ ~n~Jordan Chew, Ryan Rayhill, ~n~Devin Bennett, Todd Zuniga, ~n~Thomas O'Donnell, Maria Tabia, - -[CR17_05:CRED01] -~n~ ~n~Anthony Carvalho, Lyonel Tollemache, ~n~John Notarfrancesco, Jerry Luna, ~n~Stuart Petri, Stephen Walsh, - -[CR17_06:CRED01] -~n~ ~n~Michael Carnevale, Andrea Borzuku, ~n~John Schuhmann, Alice Chuang, ~n~Mike Torok, Mayumi Kobayashi, - -[CR17_07:CRED01] -~n~ ~n~Elizabeth Satterwhite, Bruce Dugan, ~n~Eli Weissman, Phil Poli, ~n~Jaesun Celebre, Russell Lewis, - -[CR17_08:CRED01] -~n~ ~n~Sean Mackenzie, Megan Henretta, ~n~Angus Wong, Kristine Severson - -[CR17_09:CRED01] -~n~ ~n~ ~n~ ~n~Cover Art ~n~Steven Olds, Stephen Bliss, ~n~Anthony Macbain - -[CR17_10:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LONDON PD - -[CR17_11:CRED01] -~n~ ~n~ ~n~ ~n~ Chris Madgwick, Chris Wood, ~n~Daimion Pinnock, David McCarthy, ~n~Graham Ainsley, Jurgen Mol, - -[CR17_12:CRED01] -~n~ ~n~ Laura Battistuzzi, Maike Köhler, ~n~Shino Hori, Lucien King - -[CR18_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LINCOLN - -[CR18_02:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Mark Lloyd - -[CR18_03:CRED01] -~n~ ~n~ ~n~ ~n~Deputy QA Manager ~n~Tim Bates - -[CR18_04:CRED01] -~n~ ~n~ ~n~ ~n~QA Supervisor ~n~Kevin Hobson - -[CR18_05:CRED01] -~n~ ~n~ ~n~ ~n~Lead Tester ~n~Eddie Gibson ~n~ ~n~ ~n~ ~n~Secondary Lead Tester ~n~Mike Bennett - -[CR18_06:CRED01] -~n~ ~n~ ~n~ ~n~Testers ~n~Jonathan Stones, Mike Emeny, ~n~Andy Mason, Lee Johnson, ~n~Carl Young, Matthew Lunnon, ~n~Dan Goddard, Steve McGagh, ~n~Craig Reeve, Joby Luckett - -[CR18_07:CRED01] -~n~ ~n~ ~n~ ~n~Localization Team ~n~ ~n~ ~n~ ~n~Localization Supervisor ~n~Chris Welsh - -[CR18_08:CRED01] -~n~ ~n~ ~n~ ~n~Testers ~n~Antoine Cabrol, Dominic Garcia, ~n~Paolo Ceccotti, Ferruccio Cinquemani, ~n~Nicolas Klimoff, Jesús Pérez Rosales ~n~ ~n~ ~n~ ~n~IT Support ~n~Nick McVey - -[CR19_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~SPECIAL THANKS - -[CR19_02:CRED01] -~n~ ~n~ ~n~ ~n~Scooter, Ross Wallace, ~n~Steve Taylor, Kevin Wong, ~n~Kevin Bolt, John Haime, - -[CR19_03:CRED01] -~n~ ~n~Dave Watson, Thomas French, ~n~James Arthur, Martin Connor, ~n~Brendon McDonald, Julie Wemyss, - -[CR19_04:CRED01] -~n~ ~n~Raff Crolla, James Duffy, ~n~Kim Gurney, Andrew Ness, ~n~Andy Brooks (Gearbox), Alan Mcgregor, - -[CR19_05:CRED01] -~n~ ~n~Chris McCallum, Fred, Narns, ~n~Alan, Taruki, Red, ~n~Big Foot, Rita Liberator, ~n~Elliot Torres - -[CR19_06:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~THANKS - -[CR19_07:CRED01] -~n~ ~n~ ~n~ ~n~Deborah Mannis-Gardner ~n~and Mark Schwartz. ~n~Randy Acker, Karen Adams, ~n~Mark Ainley, Robin Albers, - -[CR19_08:CRED01] -~n~ ~n~Duncan Baker, Armen Boladian, ~n~Tanya Bridges, Richard Brown, ~n~Matt Brookman, Elena Byington, - -[CR19_09:CRED01] -~n~ ~n~Ed Butts, Rob Cairns, ~n~Mike Callaghan, Joseph Carlone, ~n~Kevin Carson, Jason Chin, - -[CR19_10:CRED01] -~n~ ~n~Allison Cipris, Alimah Deen, ~n~James Ellis, Helen English, ~n~Nasko Fejza, Scott Gardner, - -[CR19_11:CRED01] -~n~ ~n~Jochem Gerrits, ~n~Laurie Goldstein Thomas Golubic, ~n~Nick Guarino, Jon Handle, ~n~Millie Hysu, Robert Jo, - -[CR19_12:CRED01] -~n~ ~n~Paul Johannes, Gavin Johnson, ~n~Curtis A. Jones, Jennifer Justice, ~n~Rod Kotler, Diana La Pointe, - -[CR19_13:CRED01] -~n~ ~n~Michael Lau, Jim Long, ~n~Alex De Maegd, John Massa, ~n~Kendall Minter, Steve Morgan, - -[CR19_14:CRED01] -~n~ ~n~Giorgio Moroder, Suzanne Moss, ~n~Melissa Munana, Kirin Murphy, ~n~Kurosh Nasseri, - -[CR19_15:CRED01] -~n~ ~n~Gwen Niles Sean Ogden ~n~aka DJ Nightshade, ~n~Robin Orlowski, Jonathan Palmer, ~n~Tanvi Patel, Jane Peterer, - -[CR19_16:CRED01] -~n~ ~n~Mark Picchiotti, Rob Playford, ~n~Dan Quan, R. Ramnarayan, ~n~Mary Beth Roberts, ~n~Virgil Roberts, Lindsay Rodman, - -[CR19_17:CRED01] -~n~ ~n~Jim Romano, Craig Roseberry, ~n~Gerry Rosenblatt, RZA, ~n~Ali Samii, Alan Scholefield, - -[CR19_18:CRED01] -~n~ ~n~Christopher Scott, Suzi Scott, ~n~Fredro Scruggs, Jennefer Showalter, ~n~Alan Skiena, Saskia Slegers, - -[CR19_19:CRED01] -~n~ ~n~Fran Spero, Lem Springsteen, ~n~David Steel, Jane Ventom, ~n~Christian Wiseman, Debi Wylde, - -[CR19_20:CRED01] -~n~ ~n~Donna Young, Richie Zito - -{ reLCS - original but modified (were all CAPS) } - -[FEH_SGA] -Start New Game - -[FEH_STA] -Stats - -[FEP_STA] -Stats - -[FEH_BRI] -Brief - -[FEH_MAP] -Map - -[FET_OPT] -Options - -[FEL_ENG] -English - -[FEL_FRE] -French - -[FEL_GER] -German - -[FEL_ITA] -Italian - -[FEL_SPA] -Spanish - -[FES_NGA] -New game - -[FES_LOA] -Load game - -{ reLCS - PC lines } -[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 - -[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~ - -[FEC_WAR] -Warning - -[FEC_OKK] -O.K. - -[FEC_DLF] -Delete Failed. - -[FEC_SVU] -Save Unsuccessful. - -[FEC_LUN] -Load Unsuccessful. File Corrupted, Please delete. - -[FEC_PAD] -Gamepad - -[FEC_JOY] -Joystick - -[FES_CSA] -Select a skin from the list below: - -[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_DSN] -Default Player Skin.bmp - -[FET_RSO] -ORIGINAL SETTING RESTORED - -[FET_RSC] -HARDWARE NOT AVAILABLE - ORIGINAL SETTING RESTORED - -[FEA_3DH] -AUDIO HARDWARE: - -[FEA_SPK] -SPEAKERS CONFIGURATION: - -[FEM_LOD] -DRAW DISTANCE: - -[FEM_VSC] -FRAME SYNC: - -[FEM_FRM] -FRAME LIMITER: - -[FEM_MM] -MAIN MENU - -[FED_RES] -SCREEN RESOLUTION: - -[FET_CTL] -CONTROLLER SETUP - -[FEC_MSH] -MOUSE SENSITIVITY: - -[FEC_IVV] -INVERT MOUSE VERTICALLY: - -[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 - -[FEC_SPC] -SPC - -[WIN_TTL] -Grand Theft Auto LCS - -[WIN_95] -Grand Theft Auto LCS cannot run on Windows 95 - -[WIN_DX] -Grand Theft Auto LCS requires at least DirectX version 8.1 - -[FET_EIG] -CANNOT SET A CONTROL FOR THIS ACTION - -[FET_DAM] -DYNAMIC ACOUSTIC MODELING: - -[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? - -[FET_QG] -QUIT GAME - -[FEN_STA] -START GAME - -[FET_PAU] -PAUSE MENU - -[REPLAY] -REPLAY - -[FEC_ANS] -Action - -[CVT_MSG] -Converting textures to optimal format for your video card - -[FEC_SFT] -SHIFT - -[FEH_VMP] -VIEW MAP - -[FES_DEE] -Delete Failed! Please try again. - -[FES_CMP] -Save failed! Please try again. - -[FESZ_WR] -Saving current game. Please wait... - -[FELD_WR] -Loading game. Please wait... - -[FEDL_WR] -Deleting saved game. Please wait... - -[PCRESRT] -Starting new game. Please wait... - -[FET_STI] -Standard Controls - -[FET_CTI] -Classic Controls - -[FET_PS] -Player Skin Setup - -[FEH_NA] -OPTION NOT AVAILABLE - -[FEH_MPH] -MOUSE, CURSORS TO MOVE - PGUP, PGDN, MSWHEEL TO ZOOM, L - LEGEND - -[NO_PCCD] -Please insert your GTA Liberty City Stories CD, or press ESC to cancel - -[FEH_SSA] -CURSORS TO MOVE - S TO SAVE TO FILE - -[FES_CMI] -LAST MISSION PASSED - -[FET_STS] -STATS SAVED TO 'STATS.HTML' + 'STATS.TXT' - -[WIN_VDM] -Grand Theft Auto LCS cannot find enough available video memory - -[FEC_ERI] -Error! One or more control actions are not bound to a key or button. Please check all control actions are set - -[FEC_TFU] -Turret + Lean Up - -[FEC_TFD] -Turret + Lean Down - -[FET_RIG] -SELECT A NEW CONTROL FOR THIS ACTION - -[FEA_NM3] -NO MP3 FILES FOUND - -[FEA_MPB] -MP3 VOLUME BOOST: - -[CVT_ERR] -You have run out of disk space. Please make some space on your harddisk before continuing. Press ESC to cancel. - -[FEA_ADP] -AUTO-DETECT HARDWARE - -[FEP_STG] -Start Game - -[FEP_OPT] -Options - -[FEP_QUI] -Quit Game - -[FEA_2SP] -2 Speakers - -[FEA_4SP] -More than 2 speakers - -[FEA_EAR] -Headphones - -[FEA_NAH] -NO AUDIO HARDWARE - -[FET_APP] -APPLY - -[FES_SKN] -SKIN NAME - -[FES_DAT] -DATE - -[FES_SET] -Use Skin - -[FET_DEF] -Restore Defaults - -[FESZ_QZ] -Are you sure you want to save this game? - -[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_LOL] -Look left - -[FEC_LOR] -Look right - -[FEC_NTR] -Next target - -[FEC_PTT] -Previous target - -[FEC_LBA] -Look behind - -[FEC_CEN] -Center camera - -[FET_CFT] -ON FOOT - -[FET_CCR] -IN CAR - -[FET_CAC] -ACTION - -[FEC_IBT] -- - -[FEC_MXO] -MXB1 - -[FEC_MXT] -MXB2 - -[FEC_UNB] -UNBOUND - -[FEC_TFL] -Look left+Turret L - -[FEC_TFR] -Look right+Turret R - -[FEC_MWF] -MS WHEEL UP - -[FEC_MWB] -MS WHEEL DN - -[FEC_ORR] -or - -[FEC_NUS] -NOT USED - -[FEC_LUD] -Look Up - -[FEC_LDU] -Look Down - -[FEC_CMP] -COMBO: LOOK L+R - -[FEC_RED] -Redefine Controls - -[FEC_MOU] -Mouse Settings - -[FEP_RES] -Resume - -{ reLCS updates } -{ new languages } -[FEL_JAP] -JAPANESE - -[FEL_POL] -POLISH - -[FEL_RUS] -RUSSIAN - -{ new display menus } -[FET_GRA] -Graphics Setup - -[FED_MIP] -MIP MAPPING: - -[FED_AAS] -ANTI ALIASING: - -[FED_FIL] -TEXTURE FILTERING: - -[FED_BIL] -BILINEAR - -[FED_TRL] -TRILINEAR - -[FED_WND] -WINDOWED - -[FED_FLS] -FULLSCREEN - -[FEM_CSB] -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: - -[FEC_FRC] -FREE CAM: - -{ Linux joy detection } -[FEC_JOD] -DETECT JOYSTICK - -[FEC_JPR] -Press any key on the joystick of your choice that you want to use on the game, and it will be selected. - -[FEC_JDE] -Detected joystick - -{ mission restart } -[FET_RMS] -REPLAY MISSION - -[FESZ_RM] -RETRY? - -[FED_VPL] -VEHICLE PIPELINE: - -[FED_PRM] -PED RIM LIGHT: - -[FED_RGL] -ROAD GLOSS: - -[FED_CLF] -COLOUR FILTER: - -[FED_WLM] -WORLD LIGHTMAPS: - -[FED_MBL] -MOTION BLUR: - -[FEM_SIM] -SIMPLE - -[FEM_NRM] -NORMAL - -[FEM_MOB] -MOBILE - -[FED_MFX] -MATFX - -[FED_NEO] -NEO - -[FEM_PS2] -PS2 - -[FEM_XBX] -XBOX - -[FEC_IVP] -INVERT PAD VERTICALLY - -[FEM_NON] -NONE - -[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/american.txt b/utils/gxt/american.txt new file mode 100644 index 0000000..2507d38 --- /dev/null +++ b/utils/gxt/american.txt @@ -0,0 +1,14429 @@ +[IN_VEH] +~g~Hey! Get back in the vehicle! + +[HEY] +~g~Don't go solo, keep your posse together! + +[HELP3] +You can only sprint for short periods before becoming tired. + +[HELP4_D] +Push the right analog stick up to ~h~accelerate. + +[HELP5_D] +Pull the right analog stick back to brake, or to reverse if the vehicle has stopped. + +[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. + +[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. + +[HORN] +~g~Sound the horn. + +[NOMONEY] +~g~You need more cash! + +[REWARD] +REWARD $~1~ + +[M_FAIL] +MISSION FAILED! + +[M_PASS] +MISSION PASSED! $~1~ + +[DEAD] +WASTED! + +[BUSTED] +BUSTED! + +[WEATHE1] +FORCE WEATHER SUNNY + +[WEATHE2] +FORCE WEATHER EXTRA SUNNY + +[WEATHE3] +FORCE WEATHER CLOUDY + +[WEATHE4] +FORCE WEATHER RAINY + +[WEATHE5] +FORCE WEATHER FOGGY + +[WEATHE6] +WEATHER NORMAL + +[NUMBER] +~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 + +[IMPORT1] +Go outside and wait for your vehicle. + +[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. + +[SAVE1] +Walk into the corona 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. + +[R_TIME] +RACE TIME: + +[PROP_1] +You don't have enough cash for this property + +[PROP_2] +You cannot buy property whilst on a mission + +[IND_ZON] +Vice City Beach + +[COM_ZON] +Vice City Mainland + +[BEACH1] +Ocean Beach + +[BEACH2] +Washington Beach + +[BEACH3] +Vice Point + +[GOLFC] +Leaf Links + +[STARI] +Starfish Island + +[DOCKS] +Viceport + +[HAVANA] +Little Havana + +[HAITI] +Little Haiti + +[PORNI] +Prawn Island + +[DTOWN] +Downtown + +[VICE_C] +Vice City + +[A_PORT] +Escobar International + +[JUNKY] +Junk Yard + +[PISTOL] +Pistol + +[PYTHON] +.357 + +[UZI] +Uz-1 + +[TEC9] +Tec 9 + +[M4] +M4 + +[INGRAM] +Mac + +[MP5] +MP + +[RUGER] +Kruger + +[SNIPE] +Sniper rifle + +[GRENADE] +Grenades + +[SHOTGN1] +Shotgun + +[SHOTGN2] +S.P.A.S. 12 + +[SHOTGN3] +Stubby shotgun + +[ARMOUR] +Body Armor + +[LASER] +.308 Sniper + +[BASEBAT] +Baseball bat + +[HAMMER] +Hammer + +[SCREWD] +Screwdriver + +[CLEVER] +Meat Cleaver + +[MACHETE] +Machete + +[KNIFE] +Knife + +[KATANA] +Katana + +[CHAINSA] +Chainsaw + +[G_COST] +Cost: $~1~ + +[CAR_1] +Ambulance + +[MALIBU] +The Malibu Club + +[MANSION] +Diaz's Mansion + +[TMANS] +Vercetti Estate + +[STRIP] +The 'Pole Position Club' + +[MALL1] +North Point Mall + +[BANKINT] +El Banco Corrupto Grande + +[RANGE] +Rifle Range + +[POL_HQ] +VCPD HQ + +[INT_B] +An Old Friend + +[INTB_1] +~g~Go to the Lawyer's office. + +[LAW_1] +The Party + +[LAW_2] +Back Alley Brawl + +[LAW_3] +Jury Fury + +[LAW_4] +Riot + +[COL_1] +Treacherous Swine + +[COL_2] +Mall Shootout + +[COL_3] +Guardian Angels + +[COL_4] +Sir, Yes Sir! + +[COL_5] +All Hands On Deck! + +[COK_1] +The Chase + +[COK_2] +Phnom Penh '86 + +[COK_3] +The Fastest Boat + +[COK_4] +Supply & Demand + +[KENT_1] +Death Row + +[ASS_1] +Rub Out + +[BUD_1] +Shakedown + +[BUD_2] +Bar Brawl + +[BUD_3] +Cop Land + +[CAP_1] +Cap the Collector + +[FIN_1] +Keep your Friends Close... + +[BANK_1] +No Escape? + +[BANK_2] +The Shootist + +[BANK_3] +The Driver + +[BANK_4] +The Job + +[CNT_1] +Spilling the Beans + +[CNT_2] +Hit the Courier + +[PORN_1] +Recruitment Drive + +[PORN_2] +Dildo Dodo + +[PORN_3] +Martha's Mug Shot + +[PORN_4] +G-spotlight + +[TAX_1] +Kaufman Cabs + +[TAXI_1] +V.I.P. + +[TAXI_2] +Friendly Rivalry + +[TAXI_3] +Cabmaggedon + +[ICE_1] +Distribution + +[TEX_1] +Four Iron + +[TEX_2] +Two Bit Hit + +[TEX_3] +Demolition Man + +[PHIL_1] +Gun Runner + +[PHIL_2] +Boomshine Saigon + +[BIKE_1] +Alloy Wheels of Steel + +[BIKE_2] +Messing with the Man + +[BIKE_3] +Hog Tied + +[ROCK_1] +Love Juice + +[ROCK_2] +Psycho Killer + +[ROCK_3] +Publicity Tour + +[ROCK_4] +Love Fist!! + +[HAT_1] +Juju Scramble + +[HAT_2] +Bombs Away! + +[HAT_3] +Dirty Lickin's + +[CUB_1] +Stunt Boat Challenge + +[CUB_2] +Cannon Fodder + +[CUB_3] +Naval Engagement + +[CUB_4] +Trojan Voodoo + +[JOB_1] +Road Kill + +[JOB_2] +Waste the Wife + +[JOB_3] +Autocide + +[JOB_4] +Check Out at the Check In + +[JOB_5] +Loose Ends + +[ANSWER] +Press the ~h~~k~~PED_ANSWER_PHONE~~w~ to answer your cell phone. + +[MOB_01A] +Awright me ol'china! It's Paul. I might have a little result for you, but I need to speak to you in person. + +[MOB_01B] +I'm enjoying a little R&R at the Club Malibu. + +[MOB_01C] +Reckon you're gonna owe me a favor or two after this, sunshine. I'll see you later. + +[MOB_02A] +Ssssnniiiiffffff Hey! Hello, Tommy? Tommy! + +[MOB_02B] +We got a situation over at the Print Works. You better go and check it out. + +[MOB_02C] +Some kind of mess or other. Things are messed up. I gotta go. + +[MOB_03A] +Mr. Vercetti? I have here a signed piece of crap stating + +[MOB_03B] +that you have taken on all of BJ's Auto's debts. + +[MOB_03C] +With BJ's sudden disappearance I have no choice + +[MOB_03D] +but to hold you responsible for his financial insecurities. + +[MOB_03E] +Until this account is settled in full + +[MOB_03F] +you should consider Vice City's streets to be very unfriendly. + +[MOB_04A] +How you doin' mate? It's Paulo again. + +[MOB_04B] +Look Tommy, I forgot to mention we're going to need some extra muscle for the concert. A bit of security. + +[MOB_04C] +There's a biker gang led by Mitch Baker, it would be great publicity. Very rock and roll, baby. + +[MOB_04D] +Sort this out for me and I'll get you some back stage passes for the gig, awright? + +[MOB_05A] +Hey, it's Mitch. You did good Tommy, it's good to have the old girl back. + +[MOB_05B] +You tell Kent Paul he'll get his security for the gig. + +[MOB_05C] +You have my word on that. + +[MOB_05D] +Now keep yourself out of trouble. + +[MOB_06A] +Tommy, 'nuf dead man been chattin' about you, my dear. + +[MOB_06B] +Thought you might need something to make you feel better. So Auntie Poulet make you some stew, aye? + +[MOB_06C] +Come by me kitchen some time, ok Tommy? + +[MOB_08A] +Hey Tommy, I thought you might need some business advice. + +[MOB_08B] +Once you got an operation up and running, you'll need to drop by and take the week's cash. + +[MOB_08C] +Let the guys think they got the run of the place and they'll try shaving the profits - ok? + +[MOB_08D] +Hey, I know how to handle business, Ken, ok? + +[MOB_08E] +Ok, ok. I know, you know. I know. I was, + +[MOB_08F] +I was just, you know, telling you I know, that you know, that I know. + +[MOB_08G] +Just keeping it sharp baby! + +[MOB_08H] +Whatever, Ken, whatever... + +[MOB_09A] +Hey Leo! I got some work for you! + +[MOB_09B] +This ain't Leo. + +[MOB_09C] +Hey, if Leo knows you got his phone, he gonna kill you! + +[MOB_09E] +You killed Leo? You must have big cojones - wanna work for me?! + +[MOB_09F] +Drop by my father's cafe in Little Havana and we'll talk mano a mano. + +[MOB_10A] +Tommy! Look, I gotta ask you a favor. + +[MOB_10B] +Steve! How's filming going! + +[MOB_10C] +Fine, fine. I, heh, WE need a car chase scene, but our budget can't stretch to it. + +[MOB_10D] +I've left some wheels around town. You'll know what to do. + +[MOB_10E] +Ok Steve, I'll keep an eye out. Catch you later. + +[MOB_11A] +Howdy son, just thought I'd ring you up and give you some advice. + +[MOB_11B] +Hey, Avery. What's eating you? + +[MOB_11C] +There's a lot of opportunity in this town if you own the right real estate, you catch my drift? + +[MOB_11D] +I reckon so... + +[MOB_11E] +All I'm saying is keep your eyes open and you might find the perfect business opportunity. I'll catch y'later. + +[MOB_11F] +Later, Avery. + +[MOB12_A] +Hey Tommy, it's Avery! Now listen, I got me all tied up at the moment + +[MOB12_B] +and I have a representative of mine needs chaperoning out to the Gator Keys. + +[MOB12_C] +I'm after some land out that way, so I'm sending someone out to sweeten the deal. + +[MOB12_D] +Could you do me a favor and make sure he gets there ok? + +[MOB12_E] +Yeah, sure thing Avery. Where'd you want me to pick him up? + +[MOB12_F] +He's just finishing some business at the building site. I said you'd pick him up from there. + +[MOB12_G] +No problem. See you later, Avery. + +[MOB13_A] +Vercetti? VERCETTI!! Damn you man, you've got to help me! + +[MOB13_B] +Mr. Moffat? How's family life? + +[MOB13_C] +Damn you to hell, HELL, do hear me?! + +[MOB13_D] +Well it was nice chatting... + +[MOB13_E] +WAIT! Wait, Vercetti - Tommy, can I call you Tommy? + +[MOB13_F] +We're both businessmen, yeah? You know a good deal when you hear one, ok? + +[MOB13_G] +I don't have time to chat, get to the point. + +[MOB13_H] +MONEY. Money is the goddamned point. + +[MOB13_I] +I've escaped the coop again, but it's never long before they track me down - they think it's a damned game! + +[MOB13_J] +I'm at a pay phone somewhere in this god forsaken shit hole. + +[MOB13_K] +Get me out of here before they take me back and...and..oh go-o-od... + +[MOB13_L] +Well, I'm busy for the next - + +[MOB13_M] +No! Don't shit with me here, have a heart! No man should have to do such, such things. + +[MOB13_N] +I'm on my knees here Tommy, in the dirt begging you please... + +[MOB13_O] +I guess I could swing by that way, see if I can spot you... + +[MOB13_P] +Oh god, they're coming. For the love of Christ hurry, hurry! + +[MOB_14A] +Hey there Tommy, you're gonna love me mate. + +[MOB_14B] +A little birdy told me that Vice City SWAT Division has a deposit box at a certain rather large banking establishment, + +[MOB_14C] +where they keep all the bribes they've taken over the years, + +[MOB_14D] +like some kind of old boys' retirement fund. + +[MOB_14E] +Of course, if this information should ever help you acquire any of that cash, + +[MOB_14F] +I guess you'd feel obliged to push some of it my way? + +[MOB_14G] +I'll bear that in mind, thanks Kent. + +[MOB_14H] +It's Paul. I'm from Kent, near London, you prat. + +[MOB_14I] +My provincial English geography ain't what it was. + +[MOB15_A] +Tommy, mate, it's Paul, from Kent, + +[MOB15_B] +a couple of proper sorts have your name written all over them, down at the Malibu. + +[MOB15_C] +What are you talking about? + +[MOB15_D] +Sorts. Birds. You know. Girls. Tastey ones, don't think they're brasses or nothing. + +[MOB15_E] +You gotta come check them out. + +[MOB16_A] +Tommy, Paulo here, que pasa amigo? + +[MOB16_B] +What do you want Paul. I don't want any fake label clothes. + +[MOB16_C] +Very funny, mate, but you know I don't touch bent gear. + +[MOB16_D] +Nah, I was just calling to see if I get a part in one your movies, + +[MOB16_E] +back in England I did a lot of blue stuff, mate. + +[MOB16_F] +I'm packing more heat than you, my son. + +[MOB16_G] +Paul, thanks for the offer, I'll bear it in mind. + +[MOB16_H] +Seriously, don't forget about me, after all I done for you. + +[MOB16_I] +That's what I'm trying to forget about. + +[MOB19_A] +Tommy V, It's KP here. Kent Paul. Word on the street is people want to rip you off. + +[MOB19_B] +Keep your eye's peeled, my son. And remember, I didn't say nothing to you about this. + +[MOB_20A] +Alright, Tommy, it's Paul. I just heard from a mush that you've been a real naughty boy. + +[MOB_20B] +Somebody has taken offense to you acting like the big guy all of a sudden, giving it the big shot thing. + +[MOB_20C] +Well, don't say I never warned you or nothing. Boasting is a mug's game, son. + +[MOB_20D] +Anyway, I heard there's some price been put on your head and someone's going to have a crack at you, + +[MOB_20E] +so watch yourself, and remember me, mate. + +[MOB21_A] +Tommy, Thomas, it's Cortez. Que pasa? + +[MOB21_B] +Things are interesting. How are you, my friend? + +[MOB21_G] +I wanted to ask you about Mercedes. + +[MOB21_H] +Ok, what about her? + +[MOB21_I] +Oh Tommy, Tommy. I, I hear these stories, all these stories - I don't know what to think. + +[MOB21_K] +Maybe she thinks she can do what she likes, but Tommy, tell me, is it true? + +[MOB21_M] +Is what true? + +[MOB21_N] +These stories I hear. Is she really going to be a lawyer? + +[MOB21_O] +Oh Tommy, the shame, the shame! You know, we Cortez's are a proud family. + +[MOB21_P] +We would never allow a daughter of ours to become a lawyer. Please tell me it isn't so. I don't think I could take it. + +[MOB21_Q] +Oh Colonel, I can assure you Mercedes is never going to become a lawyer. Don't worry about it. + +[MOB21_R] +Oh thank you, Tommy. Tommy, thank you. The shame would be unbearable. She is a lady, not a parasite, you know. + +[MOB21_S] +I know, colonel. + +[MOB21_T] +Anyway, Tommy, you must excuse me, the new minister of the interior has arrived. + +[MOB21_U] +Many years ago, I killed his father in a failed coup so I must be polite. Good day, amigo. + +[MOB21_C] +Tommy, it is always a struggle here. Excuse the poor line, we have just had another failed coup. + +[MOB21_D] +The people are the most demanding mistress of all. + +[MOB21_E] +So far, we have had three revolutions and four coups since I return from Vice City. + +[MOB21_F] +Luckily, I have been promoted each time. + +[MOB21_J] +Maybe everyone is humiliating me. + +[MOB21_L] +but tell me Tommy, is it true? + +[MOB22_A] +Tommy, you are proving very useful, my friend. + +[MOB22_B] +Thanks, Cortez. What about my deal? + +[MOB22_C] +Tommy, I am working tirelessly on your behalf to ensue we get to the bottom of this trench of stinking lies and deceit, + +[MOB22_D] +you have my word on that, but in the meantime, + +[MOB22_E] +please accept the esteemed thanks of my people for your work on our behalf. + +[MOB_25A] +Tommy, Thomas it's Cortez. Look, the French are giving me all kinds of trouble, amigo. + +[MOB_25B] +Damn hypocrites. They spend a hundred years stealing from poor countries and they call me a thief! + +[MOB_25C] +I am going to need your help as soon as possible, amigo. + +[MOB_25D] +So please hurry, Tommy, I need you, all right? I hate the damn French. + +[MOB_26A] +Hello, Tommy? + +[MOB_26B] +Yeah? + +[MOB_26C] +It's Baker. I just wanted to say I really enjoyed the show. + +[MOB_26D] +Me and the boys want to thank you, and remind you, + +[MOB_26E] +you got our respect. Good day. Keep riding hard, son. + +[MOB_29A] +Hello, is this Mr. Tommy Vercetti? + +[MOB_29B] +Yes. + +[MOB_29C] +Well, I hear through the vine of grapes you the man when someone got a vermin infestation. + +[MOB_29D] +Maybe... + +[MOB_29E] +Well, I got a real vermin infestation. Haitians everywhere. + +[MOB_29F] +My name is Umberto Robina and I want you to meet me at the Cafe Robina as soon as you can, + +[MOB_29G] +'cause I tell you, these damn Haitians gone too far this time. + +[MOB_29H] +Test + +[MOB_30A] +Tommy, is Umberto Robina + +[MOB_30B] +Hey, how's the cafe? + +[MOB_30C] +Oh, wonderful. Incredible. Tommy, incredible. No wimps, Tommy, just real men, and the beautiful women! + +[MOB_30D] +Anyway, I wanted to tell you, me and Papi, to us, you Cuban. + +[MOB_30E] +You have proved yourself, man. You got big cojones. + +[MOB_30F] +Well thank you, Umberto. Nobody's said that to me since I left jail. I'll see you around. + +[MOB_33A] +Tommy, it's Phil, now cut out all the reminiscing crap and listen to me, you hear? + +[MOB_33B] +Good. I got me some extra strength boomshine nearing fermentation time and I was wondering if you'd fancy having a shot. + +[MOB_33C] +Seriously, Tommy, if you like a drink, or if you need to strip paint, this stuff'll make a man out of you. + +[MOB_33D] +Sure did out of me, even though I can't see out of one eye. I'll be waiting for you, y'hear. + +[MOB_34A] +Tommy, I really enjoyed working with you. Ain't had so much fun since the ridge in Nam, pal. + +[MOB_34B] +Anyhows, you need anything, you call on me, you hear? + +[MOB_34C] +I always remember those I served with, + +[MOB_34D] +and I am sure I can help you out, you hear? + +[MOB_35A] +Tommy, the wound is healing well. Funny thing is, + +[MOB_35B] +I have fought in 6 battle zones and always walked away without a scratch, and now this! + +[MOB_35C] +One armed Phil. Still, I got me a healthy selection of one handed fire power so I'll never be unarmed Phil, you hear. + +[MOB_35D] +Any way son, cut out the sentimental crap and go buy yourself a drink, you hear! + +[MOB_36A] +Tommy, it's Phil, I want to thank you for helping me out back there son, + +[MOB_36B] +Damn Charlie, he'll always ambush you somewhere or other, + +[MOB_36C] +Anyway the wound is healing well, and it means I'll no longer be defrauding the government on my disability check. + +[MOB_40A] +Hey Tommy, it's Sonny. How's the sun tan? + +[MOB_40B] +I ain't got no sun tan. + +[MOB_40C] +Well, you ain't got my money, either, so I'm wondering to myself, + +[MOB_40D] +what are you doing? So, tell me, Tommy, what are you doing? + +[MOB_40E] +I'm looking for the money, Sonny. Don't worry. + +[MOB_40F] +I am worrying, Tommy, that's my style, + +[MOB_40G] +because I seem to have this problem in my life with unreliable people. + +[MOB_40H] +Don't be an unreliable person, Tommy, please. + +[MOB_40I] +Do us both a favor. I'm looking forward to hearing from you. + +[MOB_41A] +Tommy, remember me? + +[MOB_41B] +Hello Sonny. + +[MOB_41C] +That's right, Sonny. We're old friends, + +[MOB_41D] +You never write me, you never call. Don't you want to be friends no more? + +[MOB_41E] +I've been busy trying to sort things out. You didn't give me a lot of support down here, Sonny. + +[MOB_41F] +Oh, my fault is it? We'll I've heard you been busy all right. + +[MOB_41G] +Busy killing drugs barons. Busy taking over. + +[MOB_41H] +Don't forget about us, Tommy, 'cause I can assure you, I ain't forgotten about you. + +[MOB_42A] +Tommy. + +[MOB_42B] +Sonny. + +[MOB_42C] +Obviously you are suffering from hearing problems, so I'll try again. + +[MOB_42D] +Where's the goddamned money, where's the goddamned stuff, and where's my cut of your new action? + +[MOB_42E] +You are making an idiot out of me, Tommy, and I'm not laughing yet. + +[MOB_43A] +Tommy, Tommy, Tommy, I had Sonny on the phone, ok, are you with me?. + +[MOB_43B] +I don't know about you, but there's something about a man threatening to murder my family + +[MOB_43C] +which really scares the crap out of me. What are you going to do? + +[MOB_43D] +Ken, take it easy. + +[MOB_43E] +I AM calm, calm as a man can be when he's fearing for his life! + +[MOB_43F] +Stay off the idiot fuel and look after yourself. + +[MOB_43G] +No one's gonna take us out. I'll see you later. + +[MOB_43H] +I am calm. Don't I sound calm? Must be impending death that is doing this to my voice. + +[MOB45_A] +Tommy We gotta talk about stuff. + +[MOB45_B] +What's the problem Lance? + +[MOB45_C] +It's you, my friend, I feel you're not giving me a fair slice. + +[MOB45_D] +And more than that, you been embarrassing me in front of the boys. I can't have that. + +[MOB45_E] +Lance, it ain't like that. You've been making mistakes. + +[MOB45_F] +Tommy, I'm not your message boy. I'm not your running boy. + +[MOB45_G] +Lance, don't screw up, and we won't have any problems. I screw up, you can lay into me any time. + +[MOB45_H] +Tommy, I've done everything for you, you treat me like a fool. Don't do that. + +[MOB45_I] +Lance, I won't rip you off or stab you in the back, okay? + +[MOB45_J] +Just take it easy. This is tough enough without you getting all emotional on me. + +[MOB45_K] +Trust me. Do you hear me, do you hear me? + +[MOB45_L] +I hear you, Tommy, but I can't take this much more. + +[MOB45_M] +Lance, don't be like this. Now I'm warning you. + +[MOB45_N] +Do you hear me? Just relax, take a few days off. Okay? I'll talk to you. + +[MOB46_A] +Yo, Tommy! It's Lance. + +[MOB46_B] +Yeah? + +[MOB46_C] +Oh, nice to hear from you, Lance. Come on, man, be cool, be cool. + +[MOB46_D] +I'm in the middle of something. What do you want? + +[MOB46_E] +Nothing. Just to say, you know. Look Tommy, we can do this thing. + +[MOB46_F] +You and me, no problem. You know what I mean? + +[MOB46_G] +We're going to have to do it, 'cause otherwise, we're going to be dead, Lance. + +[MOB46_H] +We're in too far now. But thanks for the call. I'll speak to you later. + +[MOB_47A] +Tommy, Lance, we got big problems. Come down here. Right away. + +[MOB52_A] +Hey Leo, I think we got a buyer for Diaz's merchandise. + +[MOB52_B] +You gotta give him a ring, man, set up the deal, you know? + +[MOB52_C] +Where are you now? + +[MOB52_D] +You ok Leo? You sound kinda different. + +[MOB52_E] +Just tell me where you are. + +[MOB52_F] +Who the hell is this? Put Leo on, man! + +[MOB52_G] +Leo's gone away for a while, he left me in charge. + +[MOB52_H] +Screw you, man! + +[MOB54_A] +Hiya Tommy! + +[MOB54_B] +Hi Mercedes, howyadoin'? + +[MOB54_C] +I got a new apartment up in Vice Point + +[MOB54_D] +- thought you might want to drop by sometime. + +[MOB54_E] +I'd love to. I'll catch you later. + +[MOB55_A] +Tommy, it's me. + +[MOB55_B] +Hi Mercedes. + +[MOB55_C] +Tommy, I so bored, when we going to have some fun? + +[MOB55_D] +What do you mean? + +[MOB55_E] +Well, I know you're busy fighting and killing and corrupting people, + +[MOB55_F] +but I just want to have some fun. So don't forget about me, you hear? + +[MOB56_A] +Tommy, I hear you kill Ricardo Diaz. + +[MOB56_B] +there was an unfortunate fire at his mansion. + +[MOB56_C] +I think he burnt to death in an acrylic shirt. + +[MOB56_D] +Tommy, I so proud of you. I knew you were a real man. + +[MOB56_E] +He awful trouser stain of a man, you make me so proud to be your friend. + +[MOB56_F] +No, I know you going to be busy trying to take over this town, + +[MOB56_G] +but don't forget about me, you hear? + +[MOB57_A] +It's merceedes. I no longer love you Tommy. + +[MOB57_B] +I no longer do. Honest. 'cause you no longer nice to Mercedes. + +[MOB57_C] +You no longer treat her like a lady. You ignore me and I hate you. + +[MOB57_D] +I insist you come to see me right away! + +[MOB58_A] +Tommy. + +[MOB58_B] +Hey Mercedes. + +[MOB58_C] +Hey indeed Mr. Tough Guy. I real angry with you Tommy. + +[MOB58_D] +Never make me hang out with Jezz Torrent again. + +[MOB58_E] +He is pathetic. Half way through he starts crying about his doggie + +[MOB58_F] +that died when he was 7 years old and that his mommy never loved him. + +[MOB58_G] +And Tommy. He wear a wig and a bra in private. + +[MOB58_H] +I not very happy with you! + +[MOB59_A] +Ooh Tommy, its Mercedes. + +[MOB59_B] +I just want to say, I have so much fun on that film set. + +[MOB59_C] +Anything else you have like that, you let me know. + +[MOB59_D] +I really mean that. I always wanted to be an actress. + +[MOB59_E] +I think I learn a lot about the dramatic process. + +[MOB59_F] +It so enlightening! Thank you. Thank you. I see you real soon. Adios. + +[MOB_99] +Get to the payphone at location. + +[MOB_98] +Get to the payphone at location. + +[MOB_97] +Get to the payphone at location. + +[MOB_96] +Get to the payphone at location. + +[MOB_95] +Get to the payphone at location. + +[A_TIME] ++~1~ seconds + +[DODO_FT] +You flew for ~1~ seconds! + +[GA_8] +Use the detonator to activate the bomb. + +[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. + +[CHASE] +Highest media attention + +[CHASE1] +Ignored + +[CHASE2] +Boring + +[CHASE3] +Vaguely interesting + +[CHASE4] +Local paper Page 7 + +[CHASE5] +Front page of local paper + +[CHASE6] +Vice Courier Page 2 + +[CHASE7] +Vice Courier Front page + +[CHASE8] +Local TV 3am + +[CHASE9] +Local TV news + +[CHASE10] +Local TV Live coverage + +[CHASE11] +UFA Today page 12 + +[CHASE12] +UFA Today page 4 + +[CHASE13] +Picture in UFA Today + +[CHASE14] +National TV 4am + +[CHASE15] +National TV news + +[CHASE16] +National TV live coverage + +[CHASE17] +International news + +[CHASE18] +National crisis + +[CHASE19] +International crisis + +[CHASE20] +World event + +[CHASE21] +Stuff of legends + +[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... + +[FEM_ON] +ON + +[FEM_OFF] +OFF + +[FEM_YES] +Yes + +[FEM_NO] +No + +[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_LB] +Look behind + +[FEC_LR] +Look right + +[FEC_HOR] +Horn + +[FEC_VES] +Vehicle control + +[FEC_BRA] +Brake or Reverse + +[FEC_HAB] +Hand brake + +[FEC_CAW] +Car weapon + +[FEC_ACC] +Accelerate + +[FEC_CCF] +Configuration + +[FEC_CF1] +Setup 1 + +[FEC_CF2] +Setup 2 + +[FEC_CF3] +Setup 3 + +[FEC_CF4] +Setup 4 + +[FEC_CDP] +Controller Display + +[FEC_ONF] +On foot + +[FEC_INC] +In car + +[FEC_VIB] +Vibration + +[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_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 + +[PL_STAT] +Player stats + +[PE_WAST] +People you've wasted + +[PE_WSOT] +People wasted by others + +[TM_BUST] +Times busted + +[GNG_WST] +Gang members wasted + +[DED_CRI] +Criminals wasted + +[PER_COM] +Percentage completed + +[KGS_EXP] +Kgs of explosives used + +[ACCURA] +Accuracy + +[ST_WEAP] +Weapon Budget + +[ST_PROP] +Property Budget + +[ST_AUTO] +Auto Repair and Painting Budget + +[ST_PHOT] +Photographs Taken + +[ST_LOAN] +Visits From Loan Sharks + +[ST_STOR] +Stores Knocked Off + +[ST_MOVI] +Movie Stunts + +[ST_PIZZ] +Pizza's Delivered + +[ST_GARB] +Garbage Pickups Made + +[TOP_SHO] +Top Shooting Range Score + +[SHO_RAN] +Shooting Range Rank + +[SEAGULL] +Seagulls Sniped + +[PROPOWN] +Property Owned + +[ST_TIME] +Playing Time + +[ST_FTIM] +Flight hours + +[ST_PRAN] +Pilot Ranking + +[ST_RAN0] +Learner + +[ST_RAN1] +Navigator + +[ST_RAN2] +Co Pilot + +[ST_RAN3] +Junior + +[ST_RAN4] +Competent + +[ST_RAN5] +Senior + +[ST_RAN6] +Ace + +[ST_RAN7] +Red baron + +[ST_DRWN] +Fishes Fed + +[ST_FASH] +Fashion Budget + +[ST_DAMA] +Property Destroyed + +[TM_DED] +Hospital visits + +[DAYSPS] +Days passed in game + +[NUMSHV] +Safehouse visits + +[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 + +[BUL_FIR] +Bullets fired + +[BUL_HIT] +Bullets that hit + +[SPRAYIN] +Sprayings + +[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 + +[NMISON] +Mission attempts + +[PASDRO] +Passengers dropped off + +[MONTAX] +Cash made in taxi + +[DAYPLC] +Daily police spending + +[CRIMRA] +Criminal rating: + +[STPR_1] +The Malibu + +[STPR_2] +Print Works + +[STPR_3] +Film Studio + +[STPR_4] +Ice Cream Factory + +[STPR_5] +Car Showroom + +[STPR_6] +Taxi Company + +[STPR_7] +Boatyard + +[SET1EN] +SetUp 1. Enabled + +[GMSAVE] +Save Game + +[FEDS_TB] +Back + +[FEST_OO] +out of + +[FEC_TUC] +Turret control + +[FEC_RS3] +Radio station cycle (L3 button) + +[FEC_HO3] +Horn (L3 button) + +[C_FAIL] +Vigilante mission ended! + +[C_ESCP] +~r~The suspect has escaped! + +[C_VIGIL] +VIGILANTE BONUS!! + +[HEAL_A] +Your ~h~health~w~ is displayed in orange in the top right of the screen. + +[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: Vice City DVD + +[RESTART] +Starting new game + +[GA_3] +No more freebies. $100 to respray! + +[GA_1] +Whoa! I don't touch nothing THAT hot! + +[GA_1A] +Come back when you're not so busy... + +[HELP9_C] +Press the~h~ ~k~~PED_FIREWEAPON~ ~w~button to ~h~fire~w~ the sniper rifle. + +[TAXI2] +~r~You're out of time! + +[PAGEB13] +Health delivered to hideout + +[PAGEB14] +Adrenaline delivered to hideout + +[FESZ_CA] +Cancel + +[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 save game? + +[FESZ_QO] +Proceed with overwriting this save game? + +[T4X4_1] +'PCJ Playground' + +[BMX_1] +'Trial by Dirt' + +[BMX_2] +'Test Track' + +[BMXFAIL] +~r~You failed to set a new record! + +[BMX_REC] +~g~New Record Set:~1~ !! + +[T4X4_3] +'GRIPPED!' + +[MM_1] +'CONE CRAZY' + +[T4X4_F] +~r~You bailed! Too tough for you?! + +[LANDSTK] +Landstalker + +[IDAHO] +Idaho + +[STINGER] +Stinger + +[LINERUN] +Linerunner + +[PEREN] +Perennial + +[SENTINL] +Sentinel + +[RIO] +Rio + +[PATRIOT] +Patriot + +[FIRETRK] +Firetruck + +[TRASHM] +Trashmaster + +[STRETCH] +Stretch + +[MANANA] +Manana + +[INFERNS] +Infernus + +[VOODOO] +Voodoo + +[PONY] +Pony + +[MULE] +Mule + +[CHEETAH] +Cheetah + +[AMBULAN] +Ambulance + +[FBICAR] +FBI Washington + +[MOONBM] +Moonbeam + +[ESPERAN] +Esperanto + +[TAXI] +Taxi + +[WASHING] +Washington + +[BOBCAT] +Bobcat + +[WHOOPEE] +Mr. Whoopee + +[BFINJC] +BF Injection + +[HUNTER] +Hunter + +[POLICAR] +Police + +[ENFORCR] +Enforcer + +[SECURI] +Securicar + +[BANSHEE] +Banshee + +[PREDATR] +Predator + +[BUS] +Bus + +[RHINO] +Rhino + +[BARRCKS] +Barracks OL + +[CUBAN] +Cuban Hermes + +[HELI] +Helicopter + +[DODO] +Dodo + +[COACH] +Coach + +[CABBIE] +Cabbie + +[STALION] +Stallion + +[RUMPO] +Rumpo + +[RCBANDT] +RC Bandit + +[ROMERO] +Romero's Hearse + +[PACKER] +Packer + +[ADMIRAL] +Admiral + +[SQUALO] +Squalo + +[SEASPAR] +Sea Sparrow + +[PIZZABO] +Pizza Boy + +[GANGBUR] +Gang Burrito + +[TROPIC] +Tropic + +[SPEEDER] +Speeder + +[REEFER] +Reefer + +[FLATBED] +Flatbed + +[YANKEE] +Yankee + +[CADDY] +Caddy + +[ZEBRA] +Zebra Cab + +[TOPFUN] +Top Fun + +[SKIMMER] +Skimmer + +[PCJ600] +PCJ 600 + +[PHOENIX] +Phoenix + +[FAGGIO] +Faggio + +[FREEWAY] +Freeway + +[RCBARON] +RC Baron + +[RCRAIDE] +RC Raider + +[GLENDAL] +Glendale + +[OCEANIC] +Oceanic + +[SANCHEZ] +Sanchez + +[SPARROW] +Sparrow + +[LOVEFIS] +Love Fist + +[COASTG] +Coast Guard + +[DINGHY] +Dinghy + +[HERMES] +Hermes + +[SABRE] +Sabre + +[SABRETU] +Sabre Turbo + +[WALTON] +Walton + +[REGINA] +Regina + +[COMET] +Comet + +[DELUXO] +Deluxo + +[BURRITO] +Burrito + +[SPAND] +Spand Express + +[MARQUIS] +Marquis + +[BAGGAGE] +Baggage Handler + +[KAUFMAN] +Kaufman Cab + +[COASTMA] +Coastguard Maverick + +[MAVERIC] +Maverick + +[RANCHER] +Rancher + +[FBIRANC] +FBI Rancher + +[VIRGO] +Virgo + +[GREENWO] +Greenwood + +[HOTRING] +Hotring Racer + +[BLISTAC] +Blista Compact + +[FEST_DF] +Dist. traveled on foot (miles) + +[FEST_DC] +Dist. traveled by car (miles) + +[FESTDFM] +Distance traveled on foot (m) + +[FESTDCM] +Distance traveled by car (m) + +[TOT_DIS] +Total distance traveled (miles) + +[TOTDISM] +Total distance traveled (m) + +[DISTHEL] +Dist. traveled by helicopter (miles) + +[DISTHEM] +Distance traveled by helicopter (m) + +[DISTBOA] +Dist. traveled by boat (miles) + +[DISTBOM] +Distance traveled by boat (m) + +[FEST_LS] +People saved in an Ambulance + +[FEST_CC] +Criminals killed on Vigilante Mission + +[FEST_FE] +Total fires extinguished + +[FEST_RP] +Rampages passed + +[FEST_MP] +Missions passed + +[FEST_BB] +Bling-bling Scramble: + +[FEST_H0] +Most checkpoints + +[FEST_GC] +Gang Cars Totaled: + +[FEST_H1] +Diablo destruction + +[FEST_H2] +Mafia Massacre + +[FEST_H3] +Casino Calamity + +[FEST_H4] +Rumpo Wrecker + +[USJ] +UNIQUE STUNT BONUS! + +[RATNG1] +Upstanding Citizen + +[RATNG2] +Nobody Special + +[RATNG3] +Litterer + +[RATNG4] +Shoplifter + +[RATNG5] +Vandal + +[RATNG6] +Do boy + +[RATNG7] +Pickpocket + +[RATNG8] +Clepto + +[RATNG9] +Snitch + +[RATNG10] +Rat + +[RATNG11] +Leece + +[RATNG12] +Scam Artist + +[RATNG13] +Trickster + +[RATNG14] +Numbers Runner + +[RATNG15] +Hustler + +[RATNG16] +Bully + +[RATNG17] +Riff-Raff + +[RATNG18] +Scalawag + +[RATNG19] +Ruffian + +[RATNG20] +Outlaw + +[RATNG21] +Thug + +[RATNG22] +Drop Man + +[RATNG23] +SA Goon + +[RATNG24] +Goon + +[RATNG25] +Jailbird + +[RATNG26] +Ex-Con + +[RATNG27] +Felon + +[RATNG28] +Bag Man + +[RATNG29] +Wiseguy + +[RATNG30] +Wheelman + +[RATNG31] +Hired Muscle + +[RATNG32] +Hatchetman + +[RATNG33] +Headhunter + +[RATNG34] +Enforcer + +[RATNG35] +Ronin + +[RATNG36] +Fixer + +[RATNG37] +Hitman + +[RATNG38] +Associate + +[RATNG39] +Butcher + +[RATNG40] +Cleaner + +[RATNG41] +Assassin + +[RATNG42] +Consigliere + +[RATNG43] +Made Man + +[RATNG44] +Right-Hand Man + +[RATNG45] +Executioner + +[RATNG46] +Lieutenant + +[RATNG47] +Underboss + +[RATNG48] +Capo + +[RATNG49] +Boss + +[RATNG50] +Kingpin + +[RATNG51] +Don + +[RATNG52] +Godfather + +[PAGE_00] +. + +[WELCOME] +WELCOME TO + +[TSCORE] +EARNINGS: $~1~ + +[PBOAT_2] { reVC update } +Press the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button to fire the boat cannons. + +[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! + +[ATUTOR] +Press the ~h~~k~~TOGGLE_SUBMISSIONS~ ~w~button to toggle Paramedic missions on or off. + +[FEST_HA] +Highest Paramedic Mission level + +[C_KILLS] +CRIMINALS KILLED: ~1~ + +[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! + +[CINCAM] +Cinematic Camera + +[RC4] +'RUMPO RAMPAGE' + +[LEGAL] +~g~Eliminate the criminal threat! + +[GA_2] +New engine and paint job. The cops won't recognize you! + +[HELP15] +When on foot press the ~h~~k~~PED_LOOKBEHIND~ ~w~button to ~h~look behind~w~. + +[FEC_LB4] +Look behind (R3 button) + +[PERPIC] +Hidden Packages found + +[CO_ONE] +Hidden Package ~1~ of ~1~ + +[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 + +[USJ_ALL] +ALL UNIQUE STUNTS COMPLETED! + +[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] +--:---:---- --:--:-- + +[BONUS] +~g~BONUS $~1~ + +[HORN1] +Press the ~h~~k~~VEHICLE_HORN~ ~w~button to activate the ~h~horn. + +[HORN2] +Press the ~h~~k~~VEHICLE_HORN~ ~w~button to activate the ~h~horn + +[HORN3] +Press the ~h~~k~~VEHICLE_HORN~ ~w~button to activate the ~h~horn + +[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~ + +[FESZ_LS] +Load Successful. + +[HELI_1A] +Test your skills with the Sparrow, see how quickly you can complete the course. + +[HELI_1B] +Course Complete! $ ~1~ + +[HELIODD] +Helicopter odd jobs + +[LAW] +THE LAWYER MISSIONS + +[LAW1_1] +~g~Go get some new threads from Rafael's clothes shop. + +[LAW4_6] +Burn the management! + +[LAW4_7] +Kill the bosses! + +[LAW4_8] +Fight, Fight, Fight, Fight. + +[LAW4_9] +More Holiday, Less Work! + +[LAW4_11] +Fight! Fight! Fight! Fight! + +[LAW4_12] +Viva la revolution! + +[GENERAL] +THE COLONEL MISSIONS + +[GEN3_4] +Tommy Vercetti. Let's go... + +[GEN3_13] +What's the matter with you man?! Get on the roof across the yard before they turn up! + +[GEN3_17] +Sheeit! You trying to kill me?! + +[GEN3_21] +~g~He got Diaz's money! Chase him down and get it back! + +[GEN3_24] +~r~Diaz died! You failed to protect him! + +[GEN3_26] +~r~You shot Diaz! + +[GEN3_27] +~r~You shot Diaz's bodyguards! + +[GEN3_31] +~g~Now go to the drop off and watch over Diaz. + +[GEN3_32] +~g~Get to your vantage point on the roof of the building opposite Lance. + +[COKE] +THE COKE BARON MISSIONS + +[COK1_3] +Hope you fall and break your neck! + +[COK1_6] +I'm sick of these pricks. + +[COK2_7] +See those marker boys? Try taking out the lights! + +[COK2_10] +You sure is better at shooting than talking. + +[COK2_11] +Thanks. You're a real charmer yourself. + +[COK2_12] +I Know, Tommy. + +[COK2_18] +You cool with Kenny Loggins + +[COK2_19] +Hell, I love this record + +[COK2_26] +~r~You killed Lance! + +[COK3_1] +Don't shoot, dude! + +[COK3_2] +What's in this stuff? + +[COK3_3] +He's taking the boat. Bummer. + +[COK3_4] +Help! Some square's stealing the boat, man! + +[COK4_W] +Uugghh! That's the last of them. + +[COK4_X] +I'm going to start her up. + +[COK4_Y] +I think we've got some new friends. + +[COK4_2] +Yeah. + +[COK4_6] +Do you know where we're going? + +[COK4_7] +Are we lost? + +[COK4_8] +We got some competition! + +[COK4_9] +Take 'em out! + +[COK4_9A] +It's time for the Lance Vance Dance! + +[COK4_10] +They're matchwood! And fish food. + +[COK4_11] +We made it! Those other boats ain't VIP class. + +[COK4_17] +They're getting desperate! + +[COK4_18] +My damn feet are wet! WE'RE TAKING ON WATER! + +[COK4_21] +Bridge coming up! + +[COK4_22] +Bail out, she's about to blow! + +[COK4_23] +Good shooting. + +[COK4_29] +~r~You killed Lance! + +[ASS1_6] +Go on Tommy, I'll be ok! + +[ASS1_7] +Eat this, you murdering bastards!! + +[ASS1_8] +I'm pinned down! + +[ASS1_9] +I got you covered Tommy! + +[ASS1_10] +Hey, this is a real nice herbaceous border + +[ASS1_11] +Hey Tommy, can my room have a view of the bay? + +[ASS1_12] +Beautiful high ceilings in here... + +[ASS1_3] +Lance! I need cover! + +[ASS1_4] +Diaz must be inside! + +[ASS1_5] +Lance! + +[TAXWAR] +TAXI WAR MISSIONS + +[NOTAXI] +~g~You need a Kaufman Cab to activate this mission. + +[TAXW1_5] +~g~You need to be in a Kaufman cab! + +[TAX2_4] +Go on, Tommy. + +[TAX2_5] +Beat the hell out of him. + +[TAX2_6] +He hasn't even got a license. + +[TAX2_7] +Damn limo services. + +[TAXW3_1] +~g~Go and pick up Mercedes. + +[RACE1] +~g~3..2..1.. GO GO GO! + +[RACE2] +~g~3 + +[RACE3] +~g~2 + +[RACE4] +~g~1 + +[RACE5] +~g~GO! + +[FIRST] +~b~1st + +[SECOND] +~b~2nd + +[THIRD] +~b~3rd + +[FOURTH] +~b~4th + +[RACETM] +~b~RACE TIME: ~1~:~1~ + +[RACETM2] +~b~RACE TIME: ~1~:0~1~ + +[RACEFA] +~r~You failed to win the race! + +[TEX1_5] +~r~He got away! + +[SEG3_2] +~g~Get to the van that contains the RC Raider and remote timed bombs. + +[SEG3_3] +~g~You must use the RC RAIDER to transport 4 bombs to 4 target zones on the building site. + +[SERG3_5] +~g~You can only carry one bomb at a time and cannot pick up successfully planted bombs. + +[SEG3_7] +~g~Once you have dropped the FIRST bomb successfully in a target zone the detonation timer will start; you must then drop all the bombs within this time period. + +[SEG3_8] +~g~All 4 bombs must be located at the 4 target zones to pass the mission and demolish the building. + +[SEG3_9] +~g~You hit the target! 3 more to go. + +[SEG3_10] +~g~You hit the target! 2 more to go. + +[SEG3_11] +~g~You hit the target! Just 1 more to go! + +[SEG3_12] +~r~You missed the target! Go get a bomb! + +[SEG3_13] +~g~Drop the bomb at a target zone. + +[SEG3_14] +~r~You ran out of time and failed to demolish the building. + +[SEG3_15] +~r~Your RC Raider has been destroyed! How you gonna transport the bombs now? + +[AVERY] +AVERY MISSIONS + +[ASM] +ASSASSIN MISSIONS + +[ASM_1] +ASSASSIN MISSION 1 + +[ASM1_1] +~g~Mr. Teal, your help in eradicating those out-of-towners was invaluable to business. I have more work for you with a more 'hands-on' approach. Your next job is taped under the phone. + +[ASM1_2] +~g~Get to the payphone outside the Mall in Washington. + +[ASM1_3] +~g~Carl Pearson, Pizza Delivery Man. He must not complete his deliveries. + +[ASM1_4] +~g~Kill the Pizza Delivery Man before he completes his deliveries. + +[ASM_2] +ASSASSIN MISSION 2 + +[ASM_3] +ASSASSIN MISSION 3 + +[ASM3_A] +TEXT NO LONGER NEEDED + +[ASM3_B] +TEXT NO LONGER NEEDED + +[ASM3_1] +~g~Go and get the weapon Mr. Black has left for you. + +[ASM3_2] +~g~Don't get too close to the target or he may spot you! + +[ASM3_3] +~g~For a quick safe kill find a secluded spot nearby with a clear view of your target. + +[ASM3_4] +~g~He's seen you! Better waste him any way you can! + +[ASM3_5] +~g~Marcus Hammond is working on an advertising board in Washington. + +[ASM3_6] +~g~Franco Carter is working for DBP Security off Ocean Drive. + +[ASM3_7] +~g~Dick Tanner is situated near the Jewelry shop in Vice Point. + +[ASM3_8] +~g~Nick Kong is situated near Washington Beach. + +[ASM3_9] +~g~Stuntman Driver is situated in Washington. + +[ASM3_10] +~r~You failed to kill them all. + +[ASM_4] +ASSASSIN MISSION 4 + +[ASM4_1] +~g~Go get the rifle left for you in the foliage outside the airport terminal. + +[ASM4_2] +~g~Don't miss your target or you may alert his bodyguards, and remember keep your distance so he does not spot you. + +[ASM4_3] +~g~Watch the woman on the balcony above the check-in desks inside the airport terminal. DO NOT KILL HER. + +[ASM4_4] +~g~Kill the man she hands the briefcase to but only AFTER HE PICKS IT UP. Then retrieve the briefcase and take it to Ammu-Nation in Downtown. + +[ASM4_5] +~g~Get the briefcase! + +[ASM4_6] +~g~Take the briefcase to Ammu-Nation in Downtown. + +[ASM4_7] +~r~You killed the woman, you fool! + +[ASM4_8] +~r~The target heard you firing your weapon! The deal is off! + +[ASM4_9] +~r~The target has boarded his flight! + +[ASM4_11] +~r~The target has seen you! The deal is off! + +[ASM4_13] +~g~He's spotted you and is making a run for it, nail him and get the briefcase! + +[ASM4_14] +~g~The distance bar in the upper right of the screen gives you an indication to how close you are to your target do not let it fill or he will see you. + +[ASM_5] +ASSASSIN MISSION 5 + +[KICK] +KICKSTART + +[KICK1_3] +~g~Number of times foot put down: ~1~ + +[KICK1_4] +~g~Time penalty: ~1~ seconds + +[BANK] +BANKJOB MISSIONS + +[BANK1] +BANKJOB MISSION 1 + +[BANK2] +BANKJOB MISSION 2 + +[BJM2_21] +~g~Hit as many targets as you can while your ammo lasts. + +[BANK3] +BANKJOB MISSION 3 + +[BJM3_1] +~g~Get a fast car and get to the starting grid. + +[BNK4_2A] +Boys at the car lot did a great job on this baby. + +[BNK4_3G] +Oh crap, now the cops are onto us! + +[BNK4_3H] +- and we're not even there yet. + +[BNK4_3K] +We'll have to lose the cops first... + +[BNK4_3L] +Christ Tommy, you trying to kill us all!? + +[BNK4_3N] +Everything I care about gets trashed! + +[BNK4_26] +Hot damn! Here they come! + +[BNK4_32] +Use explosives to open the deposit boxes! + +[BNK4_36] +Where's Cam? + +[BNK4_37] +History... + +[BNK4_38] +That's the last of them. GO! GO! GO! + +[BNK_39] +Shit! Where's Hilary? + +[BK4_40A] +I'll give him abandonment issues! + +[BNK4_42] +Hey guys! Get in! I got you covered! + +[BNK4_43] +I've got our asses covered, DRIVE! + +[BNK4_44] +We made it! We're rich! RICH! + +[BNK4_45] +Shame Cam didn't make it, he was a good guy! + +[BNK4_46] +Yeah. Still... more for us! + +[BNK4_47] +Damned straight! YEEEEHAAAH! + +[BNK4_48] +Tommy, would you like a massage? + +[BNK4_49] +Well, Hi there, Mercedes! Yeah, I'm a little tense... + +[BNK450A] +What'd I tell you Tommy? What'd I tell you? Bent SWAT better watch out when Kent Paul is in town. + +[BNK450B] +Come on, gimme a bigger slice, mate, c'mon. I gotta get some new threads. + +[BNK4_51] +You look fine to me. + +[KENT] +KENT PAULS MISSIONS + +[KENT1] +KENT PAUL MISSION1 + +[COUNT] +COUNTERFEITING MISSIONS + +[COUNT1] +COUNTERFEITING MISSION 1 + +[COUNT2] +COUNTERFEITING MISSION 2 + +[BIKE] +THE BIKER GANG MISSIONS + +[BIKE1] +BIKER MISSION 1 + +[BIKE2] +BIKER MISSION 2 + +[BIKE3] +BIKER MISSION 3 + +[GOAWAY1] +~g~Come back when you have finished the Haitian gang missions. + +[HAIT] +THE HAITIAN GANG MISSIONS + +[HAIT1] +HAITIAN MISSION 1 + +[HAIT2] +HAITIAN MISSION 2 + +[HAIT3] +HAITIAN MISSION 3 + +[HAM3_6] +~g~Use the sniper rifle I have left to accomplish your task. + +[ROCK] +THE ROCKBAND GANG MISSIONS + +[ROK1_4] +~g~Ok, I think this is what you were after... + +[ROK1_1E] +~g~It'll cost more than you've got! + +[ROK1_1F] +~g~Come back when you got the money. + +[RBM2_6] +~g~Wow! She's a bloke, stop him! + +[ROCK3] +ROCKBAND MISSION 3 + +[RBM3_5] +~g~Take Love Fist to the venue. + +[CUBANM] +THE CUBAN GANG MISSIONS + +[CUBAN1] +CUBAN MISSION 1 + +[CUBAN2] +CUBAN MISSION 2 + +[CUB2_10] +~r~You are supposed to be killing Haitians, not Cubans. + +[CUBAN3] +CUBAN MISSION 3 + +[CUBAN4] +CUBAN MISSION 4 + +[PROT] +PROTECTION MISSIONS + +[PORN] +PORN MISSIONS + +[PORN1] +PORN MISSION 1 + +[POR1_03] +~r~Candy is dead! + +[PORN2] +PORN MISSION 2 + +[PORN3] +PORN MISSION 3 + +[PORN4] +PORN MISSION 4 + +[PHIL] +PHIL MISSIONS + +[PHIL1] +PHIL MISSION 1 + +[PHIL2] +PHIL MISSION 2 + +[PIZ1_A] +PIZZA BOY MISSION + +[CNTBUY1] +Printworks purchased: $~1~ + +[CARBUY] +Car Showroom purchased: $~1~ + +[PORNBUY] +Film Studio purchased: $~1~ + +[ICEBUY] +Ice Cream Factory purchased: $~1~ + +[TAXIBUY] +Taxi Firm purchased: $~1~ + +[BANKBUY] +The Malibu purchased: $~1~ + +[BOATBUY] +Boatyard purchased: $~1~ + +[PRNT_NO] +You cannot buy the Print Works at this time, come back later. + +[CAR_NO] +You cannot buy the Car Showroom at this time, come back later. + +[PORN_NO] +You cannot buy the Film Studio at this time, come back later. + +[ICE_NO] +You cannot buy the Ice Cream Factory at this time, come back later. + +[TAXI_NO] +You cannot buy the Taxi Company at this time, come back later. + +[BANK_NO] +You cannot buy The Malibu at this time, come back later. + +[BOAT_NO] +You cannot buy the Boatyard at this time, come back later. + +[COL2_6] +Freeze, imperialist American pig! + +[COL2_6B] +Zat iz propertay of ze government Francais. + +[COL2_6C] +'And eet over! + +[COL3_A] +Thomas I appreciate you coming + +[COL3_B] +Forgive me for getting straight to business, + +[COL3_C] +Diaz has asked me to oversee a minor business transaction. + +[COL3_D] +Let's hope it goes better than last time. + +[COL3_E] +Which is why I thought of you, my friend. + +[COL3_F] +I've dropped some protection at the multistory carpark. + +[COL3_G] +Pick it up then go and watch over Diaz's men at the drop off. + +[COL4_2] +Don't know Sir! + +[COL4_5] +Sir, Yes Sir! + +[COL4_10] +Lets go eat some doughnuts. + +[COL4_16] +Sir! Moving vehicle Sir! + +[COL4_25] +Vehicle self destruct initiated! + +[COL5_6] +Mercedes, that girl will be the death of me. + +[COL5_8] +Damn cockroach! + +[COL5_5] +Die French peegs! + +[CNT2_1] +Kill him. + +[CNT2_2] +Get the Plates! + +[CNT2_3] +Protect the courier! + +[FINKILL] +Ok boys, kill him! + +[FIN_1A] +Come here you double-crossing piece of shit! + +[FIN_1B] +You're going down, you back stabbing prick! + +[FIN_1C] +This is the last dance for lance vance! + +[FIN_2B] +Oh you think so! + +[FIN_2C] +I said I had enough of that at school! + +[FIN_3] +No one to cover your ass now, eh Tommy? + +[FIN_4] +You're history, Tommy, history + +[FIN_5] +You picked the wrong side, Lance... + +[FIN_6] +Sonny's up with the safe and MY money... + +[FIN_10] +Sonny? SONNY! I'm coming for ya! + +[FIN_11A] +You took fifteen years from me Sonny... + +[FIN_11B] +And now I'm gonna make you pay! + +[FIN_12A] +You still don't get it do you! + +[FIN_12B] +I OWN you, Tommy. + +[FIN_12C] +Those fifteen years were mine to spend! + +[FIN_13] +Get him boys, he never understood a thing. + +[RACES_4] +3 + +[RACES_5] +2 + +[RACES_6] +1 + +[RACES_7] +GO! + +[RACES_9] +Time: ~1~:~1~ + +[RACES] +TIME: + +[RACES17] +New best time: ~1~:~1~ + +[RACES18] +YOU HAVE WON: $~1~ + +[RACES20] +New best time: ~1~:0~1~ + +[RACES21] +Time: ~1~:0~1~ + +[RCH1_1] +NO LONGER NEEDED NO LONGER NEEDED NO LONGER NEEDED NO LONGER NEEDED NO LONGER NEEDED + +[RCH1_2] +~g~The CHECKPOINTS are scattered throughout the airport. + +[RCH1_3] +NO LONGER NEEDED NO LONGER NEEDED NO LONGER NEEDED NO LONGER NEEDED NO LONGER NEEDED + +[RCH1_5] +Time: + +[RCRC1_2] +~g~Get to the starting grid now! + +[RCRC1_4] +~g~3 + +[RCRC1_5] +~g~2 + +[RCRC1_6] +~g~1 + +[RCRC1_7] +~g~GO! + +[RCRC1_8] +~g~Race time: ~1~ seconds + +[RCPL1_1] +~g~Compete in a CHECKPOINT RACE with 3 other RC Baron's + +[RCPL1_2] +~g~You must go through the ~o~CENTRE CORONA ~g~to successfully pass a checkpoint. + +[RCPL1_3] +~g~Get to the starting grid now! + +[ICC1_O] +What is wrong with you?? + +[FEA_2SP] +2 Speakers + +[FEA_4SP] +More than 2 speakers + +[FEA_EAR] +Headphones + +[FEA_NAH] +NO AUDIO HARDWARE + +[FET_APP] +APPLY + +[FES_SKN] +SKIN NAME + +[FES_DAT] +DATE + +[FES_SET] +Use Skin + +[FET_DEF] +Restore Defaults + +[FESZ_QZ] +Are you sure you want to save this game? + +[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_LOL] +Look left + +[FEC_LOR] +Look right + +[FEC_NTR] +Next target + +[FEC_PTT] +Previous target + +[FEC_LBA] +Look behind + +[FEC_CEN] +Center camera + +[FET_CFT] +ON FOOT + +[FET_CCR] +IN CAR + +[FET_CAC] +ACTION + +[FEC_IBT] +- + +[FEC_MXO] +MXB1 + +[FEC_MXT] +MXB2 + +[FEC_UNB] +UNBOUND + +[FEC_TFL] +Look left+Turret L + +[FEC_TFR] +Look right+Turret R + +[FEC_MWF] +MS WHEEL UP + +[FEC_MWB] +MS WHEEL DN + +[FEC_ORR] +or + +[FEC_NUS] +NOT USED + +[FEC_LUD] +Look Up + +[FEC_LDU] +Look Down + +[FEC_CMP] +COMBO: LOOK L+R + +[LAW_1A] +law_1a + +[LAW_1B] +law_1b + +[LAW_2A] +law_2a + +[LAW_2B] +law_2b + +[FEH_STA] +STATS + +[FEH_LOA] +LOAD + +[FEH_CON] +CONTROLS + +[FEH_AUD] +AUDIO + +[FEH_LAN] +LANGUAGE + +[FEH_SGA] +START NEW GAME + +[FEO_CON] +Controller Setup + +[FEO_AUD] +Audio Setup + +[FEO_DIS] +Display Setup + +[FEO_LAN] +Language Setup + +[FEO_PLA] +Player Setup + +[FEA_OUT] +Output + +[FEA_ST] +Stereo + +[FEA_DTS] +DTS + +[FEA_RSS] +Radio station + +[FEA_NON] +RADIO OFF + +[FEA_FM0] +WILDSTYLE + +[FEA_FM1] +FLASH FM + +[FEA_FM2] +KCHAT + +[FEA_FM3] +FEVER 105 + +[FEA_FM4] +VROCK + +[FEA_FM5] +VCPR + +[FEA_FM7] +EMOTION 98.3 + +[FEA_FM8] +WAVE 103 + +[FED_BRI] +Brightness + +[FED_TRA] +Trails + +[FED_SUB] +Subtitles + +[FED_WIS] +Wide Screen + +[FED_POS] +Screen Position + +[FEP_RES] +Resume + +[FEP_STG] +Start Game + +[FEP_STA] +Stats + +[FEP_BRI] +Briefs + +[FEP_OPT] +Options + +[FEP_QUI] +Quit Game + +[FES_LOA] +Load game + +[FES_DEL] +Delete game + +[FEC_CSU] +Controller Setup + +[FEC_RED] +Redefine Controls + +[FEC_MOU] +Mouse Settings + +[DISTGOL] +Dist. traveled by golf cart (miles) + +[DISTGOM] +Distance traveled by golf cart (m) + +[ST_FAVR] +Favorite radio station + +[ST_WSTR] +least favorite radio station + +[ST_FAVV] +Favorite vehicle + +[ST_STAR] +Total number of wanted stars attained + +[ST_HEAD] +Number of headshots + +[ST_GANG] +Least favorite gang + +[ST_STGN] +Total number of wanted stars evaded + +[TYREPOP] +Tires popped with gunfire + +[TYRESLA] +Tires slashed with a blade + +[ST_BRK] +Number of bloodring kills + +[ST_LTBR] +Longest time in bloodring (secs) + +[ST_GNG1] +Cubans + +[ST_GNG2] +Haitians + +[ST_GNG3] +Streetwannabe's + +[ST_GNG4] +Diaz's gang + +[ST_GNG5] +Security guards + +[ST_GNG6] +Biker gang + +[ST_GNG7] +Vercetti gang + +[ST_GNG8] +Golfers + +[FEA_FM6] +ESPANTOSO + +[ST_ASSI] +Assassination Contracts Completed + +[DISTBIK] +Dist. traveled by bike (miles) + +[DISTBIM] +Distance traveled by bike (m) + +[HOTEL] +Ocean View + +[KICK1_9] +CHECKPOINTS: + +[FIN_B6] +You do not have enough money to start this mission. + +[TEX3_9] +~g~Pickup a bomb by maneuvering the RC helicopter next to it. + +[HELP22] +Go to the green house blip on the radar. + +[FES_FMS] +Format Successful. Select OK to continue. + +[FES_SSC] +Save Successful. Select OK to continue. + +[FES_DSC] +Delete Successful. Select OK to continue. + +[FESZ_QC] +Proceed with overwriting this corrupted save game? + +[FES_CHE] +Warning! One or more cheats have been activated. This may affect your save game. It is recommended that you do not save this game. + +[FET_SG] +SAVE GAME + +[FEH_BRI] +BRIEF + +[FEH_DIS] +DISPLAY + +[FEH_MAP] +MAP + +[FEM_OK] +OK + +[FEC_CRO] +Crouch + +[FEC_CR3] +Crouch (L3 button) + +[FEC_SMT] +Sub-mission + +[FEC_SM3] +Sub-mission (R3 button) + +[FEC_RSC] +Radio stations + +[ST_PR01] +Flyboy + +[ST_PR02] +Aircraftman + +[ST_PR03] +Pilot Officer + +[ST_PR04] +Corporal + +[ST_PR05] +Lieutenant + +[ST_PR06] +Sergeant + +[ST_PR07] +Captain + +[ST_PR08] +Biggs + +[ST_PR09] +Wedge + +[ST_PR10] +Red Baron + +[ST_PR11] +Goose + +[ST_PR12] +Viper + +[ST_PR13] +Jester + +[ST_PR14] +Chappy + +[ST_PR15] +Iceman + +[ST_PR16] +Maverick + +[ST_PR17] +Noops + +[ST_PR18] +Air Chief Marshal + +[ST_PR19] +Ace + +[FET_LG] +LOAD GAME + +[CAR_EXP] +Road Vehicles destroyed + +[BOA_EXP] +Boats destroyed + +[HEL_DST] +Planes & Helicopters destroyed + +[STFT_01] +Fastest time on 'Alloy Wheels Of Steel' + +[STFT_02] +Fastest time on 'The Driver' + +[STFT_03] +Fastest time in Dirt Ring + +[STFT_04] +Fastest time on RC Plane Race + +[STFT_05] +Fastest time on RC Car Race + +[STFT_06] +Fastest time on RC helicopter Pickup + +[STFT_07] +Fastest time on 'Terminal Velocity' + +[STFT_08] +Fastest time on 'Ocean Drive' + +[STFT_09] +Fastest time on 'Border Run' + +[STFT_10] +Fastest time on 'Capital Cruise' + +[STFT_11] +Fastest time on 'Tour!' + +[STFT_12] +Fastest time on 'V.C. Endurance' + +[STHC_01] +Highest score for Shooter + +[STHC_02] +Best Percentage of hits for Shooter + +[STHC_03] +Number of drug deals made + +[HELP24] +You can now take jobs from the Colonel. + +[HELP25] +You can now take jobs from Avery Carrington. + +[HELP29] +You can visit the clothes store when you're not on a mission. + +[HELP30] +When you buy new clothes your wanted level will be set to zero. + +[ASM4_24] +distance: + +[RBM1_6] +~g~Take Mercedes and the 'Love Juice' to the band at the recording studio. + +[RBM1_3] +NO LONGER NEEDED + +[HAM1_5] +NO LONGER NEEDED + +[RBM1_11] +NO LONGER NEEDED + +[HELP31] +To do a drive-by, first look left or right using the ~h~~k~~VEHICLE_LOOKLEFT~~w~ or the ~h~~k~~VEHICLE_LOOKRIGHT~. + +[HELP34] +You must have a sub machine gun to perform a drive-by. + +[STRIP_1] +~r~Not enough cash, you cheap sleazebag. + +[EXIT_1] +Press the ~h~~k~~PED_SPRINT~ ~w~button to exit. + +[ASM1_B] +Your next job is taped under the phone. + +[ASM1_C] +I have more work for you with a more 'hands-on' approach. + +[SCARF] +Apartment 3c + +[LAW4_10] +Rich management suck! + +[RCH1_6] +~g~Use the RC Helicopter to collect checkpoints scattered throughout the airport. + +[RCH1_9] +~b~TOTAL TIME: ~1~:~1~ + +[RCH1_10] +~b~TOTAL TIME: ~1~:0~1~ + +[WHEEL01] +TWO WHEELS DOUBLE BONUS: $ ~1~ Distance: ~1~.~1~m Time: ~1~ seconds + +[WHEEL02] +TWO WHEELS DOUBLE BONUS: $ ~1~ Distance: ~1~ feet Time: ~1~ seconds + +[WHEEL03] +TWO WHEELS BONUS: $ ~1~ Time: ~1~ seconds + +[WHEEL04] +TWO WHEELS BONUS: $ ~1~ Distance: ~1~.~1~m + +[WHEEL05] +TWO WHEELS BONUS: $ ~1~ Distance: ~1~ feet + +[WHEEL06] +WHEELIE BONUS: $ ~1~ Distance: ~1~.~1~m Time: ~1~ seconds + +[WHEEL07] +WHEELIE BONUS: $ ~1~ Distance: ~1~ feet Time: ~1~ seconds + +[WHEEL08] +WHEELIE BONUS: $ ~1~ Time: ~1~ seconds + +[WHEEL09] +WHEELIE BONUS: $ ~1~ Distance: ~1~.~1~m + +[WHEEL10] +WHEELIE BONUS: $ ~1~ Distance: ~1~ feet + +[WHEEL11] +STOPPIE BONUS: $ ~1~ Distance: ~1~.~1~m Time: ~1~ seconds + +[WHEEL12] +STOPPIE BONUS: $ ~1~ Distance: ~1~ feet Time: ~1~ seconds + +[WHEEL13] +STOPPIE BONUS: $ ~1~ Time: ~1~ seconds + +[WHEEL14] +STOPPIE BONUS: $ ~1~ Distance: ~1~.~1~m + +[WHEEL15] +STOPPIE BONUS: $ ~1~ Distance: ~1~ feet + +[ROK3_72] +Love Fist! + +[POR1_19] +Hey! + +[DESPERA] +Desperado + +[MOB_99A] +Get to the payphone next to the mall in Washington. + +[MOB_98A] +Get to the pay phone in Vice Point. + +[MOB_96A] +Get to the payphone at the airport terminal. + +[MOB_95A] +Get to the payphone in Little Havana. + +[BNK1_1] +Can I help you, sir? + +[BNK1_2] +There's an imposter! + +[BNK1_3] +He's gone insane! + +[BNK1_4] +Who the hell are you? + +[BNK1_5] +Where's your badge? + +[BNK1_6] +There they are! Shoot to kill! + +[MOB_24A] +Hola, is this Mr. Vercetti? + +[MOB_24B] +Yeah. + +[MOB_24C] +This is Cortez. You were at my party. + +[MOB_24D] +Yeah. I remember. + +[MOB_24E] +Mr. Vercetti, it was a most unfortunate incident that happened with your business deal. + +[MOB_24F] +I know. + +[MOB_24G] +I want you to know me and my people are doing their utmost to get to the bottom of it. + +[MOB_24H] +If you'd like to talk to me more privately, you can find me at the boat, eh? Okay? Good day, senor. + +[BNK2_6] +This guy's a lunatic! + +[ANGEL] +Angel + +[CUBJET] +Cuban Jetmax + +[SANDKIN] +Sandking + +[POLMAV] +Police Maverick + +[BOXVILL] +Boxville + +[BENSON] +Benson + +[HOTRINA] +Hotring Racer + +[HOTRINB] +Hotring Racer + +[BLOODRA] +Bloodring Banger + +[BLOODRB] +Bloodring Banger + +[MAFIACR] +Mafia Cruiser + +[COP_M2] +'VICE SQUAD' + +[COP_M3] +'BROWN THUNDER' + +[BNK3_2] +I'm not driving for you, no way, I'm sharing this at group. + +[FEM_SL1] +Save File 1 Not Present + +[FEM_SL2] +Save File 2 Not Present + +[FEM_SL3] +Save File 3 Not Present + +[FEM_SL4] +Save File 4 Not Present + +[FEM_SL5] +Save File 5 Not Present + +[FEM_SL6] +Save File 6 Not Present + +[FEM_SL7] +Save File 7 Not Present + +[FEM_SL8] +Save File 8 Not Present + +[FEA_CHA] +Changing audio output to STEREO. Please wait... + +[FEA_CHD] +Warning! You are changing from STEREO output to DTS. Please wait... + +[FEI_SEL] +Select + +[FEI_BAC] +Back + +[FEI_RES] +Resume + +[FEI_NAV] +Navigate + +[FEI_BTX] +/ button - + +[FEI_BTT] +" button - + +[FEI_STA] +START button - + +[FEI_BTD] +; = > < - + +[FEI_STO] +Stop + +[ST_ICEC] +'Ice Cream' Sold + +[MOB_68A] +Tommy son, have I got a surprise for you + +[MOB_68B] +I'm down at the recording studios with some major artists + +[MOB_68C] +Why don't you pay us a visit? + +[MOB_68D] +You know it makes sense, dontcha? See ya later. + +[OUTFT1] +Street + +[OUTFT2] +Soiree + +[OUTFT3] +Coveralls + +[OUTFT4] +Country Club + +[OUTFT5] +Havana + +[OUTFT6] +Cop + +[OUTFT7] +Bank Job + +[OUTFT8] +Casual + +[OUTFT9] +Mr Vercetti + +[OUTFT10] +Tracksuit + +[OUTFT13] +MC Tommy + +[CAR_AS1] +CAR SHOWROOM ASSET COMPLETED + +[CAR_AS2] +~g~Sunshine Auto's will now generate revenue up to a maximum of $~1~. Make sure you collect it regularly. + +[BUYSAVE] +~g~You can now save your game here when not on a mission. + +[BUYGARG] +~g~You can also store vehicles in this garage. + +[STRPBUY] +Pole Position Club purchased: $~1~ + +[GA_4] +Car bombs are $500 each + +[GA_5] +Your car is already fitted with a bomb. + +[GA_6] { reVC update } +Park it, prime it by pressing the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button and LEG IT! + +[GA_7] { reVC update } +Arm with the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button. Bomb will go off when engine is started. + +[GA_6B] { reVC update } +Park it, prime it by pressing the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button and LEG IT! + +[GA_7B] { reVC update } +Arm with the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button. Bomb will go off when engine is started. + +[MOB_70A] +Tommy, it's me, Colonel Cortez. Look senor, I believe you are a man who can get things done. So please help me. + +[MOB_70B] +You can find me at the boat. + +[PICK2] +.357 delivered to Ocean View Hotel! + +[PICK3] +Chainsaw delivered to Ocean View Hotel! + +[PICK4] +Flame Thrower delivered to Ocean View Hotel! + +[PICK5] +.308 Sniper delivered to Ocean View Hotel! + +[PICK6] +Minigun delivered to Ocean View Hotel! + +[PICK7] +Rocket Launcher delivered to Ocean View Hotel! + +[PICK8] +Sea Sparrow now available from the Mansion on Starfish Island! + +[PICK9] +Tank now available from the Army Barracks! + +[PICK10] +Hunter now available from the Army Barracks! + +[CLOTH1] +Soiree outfit delivered to Rafael's on Ocean Beach. + +[CLOTH2] +Street outfit delivered to Safehouses. + +[CLOTH3] +Coveralls outfit delivered to Tooled Up in The North Point Mall. + +[CLOTH4] +Country Club outfit delivered to The Golf Club in Leaf Links. + +[CLOTH5] +Havana outfit delivered to Little Havana Streetwear in Little Havana. + +[CLOTH6] +Cop outfit delivered to Police Station on Washington Beach. + +[CLOTH7] +Casual outfit delivered to Gash in The North Point Mall. + +[CLOTH8] +Mr Vercetti outfit delivered to Collar & Cuffs on Ocean Beach. + +[CLOTH9] +Tracksuit outfit delivered to Jocksport in Downtown. + +[CLOTH10] +Bank Job outfit delivered to Malibu Club in Vice Point. + +[MOB_62A] +Tommy, is Ricardo Diaz, I want to thank you for looking out for me my man. + +[MOB_62B] +I ask that prick Cortez, he say you the real deal, my friend, why you not come see me. + +[MOB_62C] +I need a guy like you. All I have now is dickheads, + +[MOB_62D] +dickheads everywhere, yo. I make you real rich. + +[GOAWAY2] +~g~Come back when you have finished the Biker gang missions. + +[COL2_9] +You American idiot! They followed you here! + +[LOADCOL] +Loading... + +[STFT_17] +Fastest time on 'PCJ Playground' + +[STFT_18] +Fastest time on 'Trial By Dirt' + +[STFT_19] +Fastest time on 'Test Track' + +[NEW_REC] +~g~New Record Set!! ~w~~1~ minutes ~g~and ~w~~1~ seconds. + +[BMX_HOW] +~g~Do two laps of the dirt track, ~y~passing through ~g~the ~y~CHECKPOINTS ~g~as you go! + +[BMXREW1] +~g~Each time you beat your previous record for the two laps + +[BMXREW2] +~g~a larger ~y~REWARD ~g~will be awarded! + +[BMXRAIN] +~g~Looks like rain... + +[ITBEG] +In the beginning... + +[NBMNBUY] +El Swanko Casa purchased: $~1~ + +[LNKVBUY] +Links View Apartment purchased: $~1~ + +[HYCOBUY] +Hyman Condo purchased: $~1~ + +[BUYGARS] +~g~You can also store vehicles in these garages. + +[OCHEBUY] +Ocean Heights Apartment purchased: $~1~ + +[WASHBUY] +1102 Washington Street purchased: $~1~ + +[VCPTBUY] +3321 Vice Point purchased: $~1~ + +[HELP6_C] +Press the ~h~~k~~VEHICLE_HANDBRAKE~ ~w~button to apply the vehicle's handbrake. + +[HELP2_A] +Press the ~h~~k~~PED_SPRINT~ ~w~button when running to ~h~sprint + +[HELP4_A] +Press the ~h~~k~~VEHICLE_ACCELERATE~ ~w~button to accelerate. + +[HELP5_A] +Press the ~h~~k~~VEHICLE_BRAKE~ ~w~button to brake, or to reverse if the vehicle has stopped. + +[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. + +[PBOAT_1] { reVC update } +Press the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button to fire the boat cannons. + +[SEG3_4] { reVC update } +~g~You can pick up bombs by simply piloting your RC Raider adjacent to each one, to drop a bomb press the ~h~~k~~VEHICLE_FIREWEAPON~ ~g~button. + +[RCR1_3] { reVC update } +~g~If you wish to quit this mission press the ~h~~k~~VEHICLE_FIREWEAPON~ ~g~button to detonate your RC car. + +[HELP32] { reVC update } +Then fire using the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button. + +[HELP33] { reVC update } +Then fire using the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button. + +[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. + +[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. + +[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. + +[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. + +[ATUTOR3] +Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle Paramedic missions on or off. + +[GUN_H1] +~w~Press the~h~ ~k~~PED_SPRINT~ ~w~button to buy. Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ ~w~button to exit. + +[PU_CF3] { reVC update } +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to replace current weapon in this slot. + +[PU_CF4] { reVC update } +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to replace current weapon in this slot. + +[HELP9_B] +Press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire~w~ the sniper rifle. + +[HELP37] +If you do not want to enter the vehicle while car jacking someone, press the ~h~~k~~PED_SPRINT~ ~w~button. + +[HELP6_A] +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. + +[HELP26] +Press the ~h~~k~~VEHICLE_ENTER_EXIT~ ~w~button to enter or exit a vehicle. + +[HELP27] +Press the ~h~~k~~VEHICLE_TURRETUP~~w~ button and the ~h~~k~~VEHICLE_TURRETDOWN~~w~ button, to shift your weight on a bike. + +[HELP28] +Press the ~h~~k~~VEHICLE_TURRETUP~~w~ button and the ~h~~k~~VEHICLE_TURRETDOWN~~w~ button, to shift your weight on a bike. + +[HELP35] +Press the ~h~~k~~GO_LEFT~~w~, and the ~h~~k~~GO_RIGHT~~w~, to steer the vehicle. + +[HELP36] +Press the ~h~~k~~GO_LEFT~~w~, and the ~h~~k~~GO_RIGHT~~w~, to steer the vehicle. + +[HELP42] +Follow the ~q~pink blip~w~ to find the hotel. + +[HELP19] +Walk into the ~q~pink marker ~w~to continue. + +[HELP1] +Stop in the center of the ~q~pink marker. + +[HELP12] +Walk into the center of the ~q~pink marker~w~ to trigger a mission. + +[SEG3_6] +~g~To successfully hit a target zone, you must drop the bomb in the area represented by the ~q~pink marker~w~. You can drop the bombs in any order. + +[S_PROMP] +When not on a mission you can save your progress by collecting the ~h~cassette tape pickup. + +[HELP16] +Walk through the front door of the ~h~Ocean View~w~ Hotel to enter the building. + +[HELP43] +~g~Goto the ~h~Ocean View~g~ hotel on Ocean Drive. + +[HELI_F1] +~r~Heli Checkpoint mission cancelled! + +[AMMUHLP] +If you need any weapons visit ~h~Ammu-Nation~w~. Follow the ~h~Gun blip~w~ on the radar. + +[HELI_1] +Downtown Chopper Checkpoint + +[HELI_2] +Ocean Beach Chopper Checkpoint + +[HELI_3] +Vice Point Chopper Checkpoint + +[HELI_4] +Little Haiti Chopper Checkpoint + +[FST_MFR] +Most Favorite Radio Station + +[FST_LFR] +Least Favorite Radio Station + +[FEI_HOL] +Hold + +[FEI_ZOO] +Zoom + +[FEI_BTR] +> < - + +[FEI_NA] +N\A + +[MESA] +Mesa Grande + +[STRP_NO] +You cannot buy the Stripclub at this time, come back later. + +[CHSE] +CHASE + +[NBMN_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase El Swanko Casa for $~1~ + +[NBMN_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase El Swanko Casa for $~1~ + +[NBMN_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase El Swanko Casa for $~1~ + +[LNKV_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase Links View Apartment for $~1~ + +[LNKV_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase Links View Apartment for $~1~ + +[LNKV_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase Links View Apartment for $~1~ + +[HYCO_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase Hyman Condo for $~1~ + +[HYCO_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase Hyman Condo for $~1~ + +[HYCO_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase Hyman Condo for $~1~ + +[OCHE_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase Ocean Heights Apartment for $~1~ + +[OCHE_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase Ocean Heights Apartment for $~1~ + +[OCHE_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase Ocean Heights Apartment for $~1~ + +[WASH_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase 1102 Washington Street for $~1~ + +[WASH_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase 1102 Washington Street for $~1~ + +[WASH_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase 1102 Washington Street for $~1~ + +[VCPT_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase 3321 Vice Point for $~1~ + +[VCPT_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase 3321 Vice Point for $~1~ + +[VCPT_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase 3321 Vice Point for $~1~ + +[PRNT_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Print Works for $~1~ + +[PRNT_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Print Works for $~1~ + +[PRNT_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Print Works for $~1~ + +[CAR_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Car Showroom for $~1~ + +[CAR_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Car Showroom for $~1~ + +[CAR_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Car Showroom for $~1~ + +[PORN_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Film Studios for $~1~ + +[PORN_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Film Studios for $~1~ + +[PORN_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Film Studios for $~1~ + +[ICE_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Ice Cream Factory for $~1~ + +[ICE_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Ice Cream Factory for $~1~ + +[ICE_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Ice Cream Factory for $~1~ + +[TAXI_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Taxi Company for $~1~ + +[TAXI_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Taxi Company for $~1~ + +[TAXI_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Taxi Company for $~1~ + +[BANK_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase The Malibu for $~1~ + +[BANK_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase The Malibu for $~1~ + +[BANK_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase The Malibu for $~1~ + +[BOAT_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Boatyard for $~1~ + +[BOAT_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Boatyard for $~1~ + +[BOAT_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Boatyard for $~1~ + +[STRP_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Pole Position Club for $~1~ + +[STRP_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Pole Position Club for $~1~ + +[STRP_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase the Pole Position Club for $~1~ + +[STOCK] +~r~out of stock + +[HELP14] +To find the Lawyer's office, follow the ~h~L blip~w~ on the radar + +[RAMPAGE] +RAMPAGE!! + +[RAMP_F] +RAMPAGE FAILED!! + +[RAMP_P] +RAMPAGE PASSED!! + +[RAMP_A] +ALL RAMPAGES COMPLETED!! + +[PAGE_01] +Kill ~1~ Gang Members in 2 Minutes! + +[PAGE_02] +Destroy ~1~ Vehicles in 2 Minutes! + +[PAGE_03] +Drive-by and Waste ~1~ Gang Members in 2 Minutes! + +[PAGE_04] +Runover and Kill ~1~ Gang Members in 2 Minutes! + +[PAGE_05] +Gun Down ~1~ Gang Members in 2 Minutes! + +[SENTXS] +Sentinel XS + +[MAP_LEG] +Map Legend + +[VCNMAV] +VCN Maverick + +[LG_01] +Player position + +[LG_02] +Avery Carrington + +[LG_03] +Biker Contact + +[LG_04] +Colonel Cortez + +[LG_05] +Ricardo Diaz + +[LG_06] +Kent Paul + +[LG_07] +Lawyer + +[LG_08] +Phil Cassidy + +[LG_09] +Boatyard + +[LG_10] +Malibu Club + +[LG_11] +Cubans + +[LG_12] +Film Studio + +[LG_13] +Ammu-Nation + +[LG_14] +Haitians + +[LG_15] +Hardware Store + +[LG_16] +Safe House + +[LG_17] +Ice Cream + +[LG_18] +Kaufman Cabs + +[LG_19] +Love Fist + +[LG_20] +Print Works + +[LG_21] +Property + +[LG_22] +Pay 'n' Spray + +[LG_23] +Clothes Shop + +[LG_24] +Tommy's Mansion + +[LG_25] +Telephone + +[LG_26] +Wildstyle Radio Station + +[LG_27] +Flash FM Radio Station + +[LG_28] +KChat Radio Station + +[LG_29] +Fever 105 Radio Station + +[LG_30] +VROck Radio Station + +[LG_31] +VCPR Radio Station + +[LG_32] +Espantoso Radio Station + +[LG_33] +Emotion 98.3 Radio Station + +[LG_34] +Wave 103 Radio Station + +[LG_36] +Sun Yard + +[LG_37] +Strip Club + +[MAP_YAH] +YOU ARE HERE + +[TAXSHRT] +~g~You can use this Kaufman Cab to take you to destinations instead of driving. It will cost you $9. + +[MOB_09D] +Maybe Leo's already dead. Maybe I killed Leo and took his phone - you think of that prick? + +[FE_MLG] +MAP LEGEND + +[FED_RDR] +RADAR MODE + +[FED_HUD] +HUD MODE + +[FED_RDB] +BLIPS ONLY + +[FEST_HV] +Highest Vigilante Mission level + +[BRIBE1] +You have just picked up a police bribe, this will reduce your wanted level by one star. + +[CLOHELP] +Clean Clothes!! + +[CRED001] +ROCKSTAR NORTH + +[CRD001A] +STUDIO DIRECTOR + +[CRD001B] +ANDREW SEMPLE + +[CRED002] +PRODUCER + +[CRD002A] +DEVELOPMENT DIRECTOR + +[CRED003] +LESLIE BENZIES + +[CRED004] +ART DIRECTOR + +[CRED005] +AARON GARBUT + +[CRED006] +TECHNICAL DIRECTORS + +[CRED007] +OBBE VERMEIJ + +[CRED008] +ADAM FOWLER + +[CRED010] +ANDREW DUTHIE + +[CRED011] +CRAIG FILSHIE + +[CRED012] +WILLIAM MILLS + +[CRED013] +CHRIS ROTHWELL + +[CRD013A] +IMRAN SARWAR + +[CRD013B] +JAMES WORRALL + +[CRD013C] +JOHN HAIME + +[CRED014] +WRITTEN BY + +[CRED015] +JAMES WORRALL + +[CRED016] +PAUL KUROWSKI + +[CRED017] +DAN HOUSER + +[CRED018] +LEAD CHARACTER DESIGNER + +[CRD018A] +CHARACTER DESIGNER + +[CRED019] +IAN MCQUE + +[CRD019A] +TOKS SOLARIN + +[CRD019B] +ALAN DAVIDSON + +[CRED020] +LEAD ANIMATOR + +[CRED021] +ALEX HORTON + +[CRD022A] +ANIMATORS + +[CRED022] +LEE MONTGOMERY + +[CRD022B] +DUNCAN SHIELDS + +[CRD022C] +GUS BRAID + +[CRED023] +VEHICLE DESIGNERS + +[CRD023A] +JOLYON ORME + +[CRD023B] +ALAN DUNCAN + +[CRD024A] +LEAD VEHICLE DESIGNER + +[CRED024] +PAUL KUROWSKI + +[CRED025] +MAP DESIGNERS + +[CRED026] +ADAM COCHRANE + +[CRED027] +NIK TAYLOR + +[CRED028] +GARY MCADAM + +[CRED029] +KEIRAN BAILLIE + +[CRED030] +ALISDAIR WOOD + +[CRED031] +ANDREW SOOSAY + +[CRD031A] +STEVEN MULHOLLAND + +[CRD031B] +WAYLAND STANDING + +[CRD031C] +CAMPBELL J. DICK + +[CRD031D] +GRAPHIC DESIGNER + +[CRD031E] +STUART PETRI + +[CRED032] +LEAD PROGRAMMER + +[CRD032A] +PROGRAMMERS + +[CRED033] +ALEXANDER ROGER + +[CRED034] +GRAEME WILLIAMSON + +[CRED035] +BARANE CHAN + +[CRED036] +DEREK PAYNE + +[CRED037] +GORDON YEOMAN + +[CRD037A] +ALAN CAMPBELL + +[CRD037B] +MARK HANLON + +[CRD037C] +ANDRZEJ MADAJCZYK + +[CRED038] +LEAD MUSIC PRODUCER + +[CRED039] +CRAIG CONNER + +[CRED040] +STUART ROSS + +[CRED041] +LEAD AUDIO ENGINEER + +[CRED042] +ALLAN WALKER + +[CRD041A] +AUDIO ENGINEER + +[CRD041B] +AUDIO + +[CRD042A] +WILL MORTON + +[CRED043] +AUDIO PROGRAMMER + +[CRED044] +RAYMOND USHER + +[CRED045] +TEST MANAGER + +[CRED046] +CRAIG ARBUTHNOTT + +[CRED047] +LEAD QA + +[CRED048] +NEIL CORBETT + +[CRED049] +KEVIN WONG + +[CRED050] +QA + +[CRED051] +DAVID BEDDOES + +[CRED052] +DAVID WATSON + +[CRED053] +BARRY CLARK + +[CRED054] +ROSS SPARROW + +[CRED055] +JAMES ALLAN + +[CRED056] +NEIL MEIKLE + +[CRD056A] +GEORGE WILLIAMSON + +[CRD056B] +MATT JONES + +[CRD056C] +ROB HARBOUR + +[CRD056D] +TOM WHITTAKER + +[CRED057] +LEAD TECHNICAL SUPPORT + +[CRED058] +LORRAINE ROY + +[CRD057A] +TECHNICAL SUPPORT + +[CRED059] +CHRISTINE CHALMERS + +[CRD060A] +OFFICE SUPPORT + +[CRD060B] +KIM GURNEY + +[CRD060C] +CASSIE OLIVER + +[CRED060] +ROCKSTAR NEW YORK + +[CRED061] +EXECUTIVE PRODUCER + +[CRED062] +SAM HOUSER + +[CRED063] +PRODUCER + +[CRED064] +DAN HOUSER + +[CRED065] +VP OF DEVELOPMENT + +[CRED066] +JAMIE KING + +[CRED067] +CHIEF TECHNOLOGY OFFICER + +[CRED068] +GARY J. FOREMAN + +[CRED069] +ASSOCIATE PRODUCER + +[CRED070] +JEREMY POPE + +[CRD071A] +DIRECTOR OF QUALITY ASSURANCE + +[CRD072A] +JEFF ROSA + +[CRED071] +MUSIC SUPERVISOR + +[CRED072] +TERRY DONOVAN + +[CRED073] +PRODUCTION TEAM + +[CRED074] +TERRY DONOVAN + +[CRED075] +JENNIFER KOLBE + +[CRED076] +JENEFER GROSS + +[CRED077] +LAURA PATERSON + +[CRED078] +JEFF CASTANEDA + +[CRED079] +JERONIMO BARRERA + +[CRED080] +CARLY SLATER + +[CRED081] +JUNG KWAK + +[CRED082] +BRIAN WOOD + +[CRED083] +RENAUD SEBANNE + +[CRED084] +RICHARD KRUGER + +[CRD084A] +DANIEL EINZIG + +[CRD084B] +JACEN BURROWS + +[CRD084C] +LINN PR + +[CRD084D] +COVER ART + +[CRD084E] +STEPHEN BLISS + +[CRED085] +KENT PAUL'S 80 NOSTALGIA ZONE + +[CRED086] +WRITTEN BY DAN HOUSER + +[CRD086A] +PRODUCED BY ADAM TEDMAN + +[CRED087] +WWW.KENTPAUL.COM AND WWW.VICECITY.COM + +[CRED088] +CREATED BY + +[CRD088A] +ADAM TEDMAN + +[CRD088B] +DAVID YU + +[CRD088C] +JERRY LUNA + +[CRD088D] +STUART PETRI + +[CRD088E] +MICHAEL CARNEVALE + +[CRD088F] +GREG LAU + +[CRD088G] +FUTABA HAYASHI + +[CRED089] +QA MANAGER + +[CRED090] +CRAIG ARBUTHNOTT + +[CRED091] +LEAD ANALYST + +[CRED092] +ADAM DAVIDSON + +[CRD092A] +JOE HOWELL + +[CRD092B] +MARC FERNANDEZ + +[CRED093] +GAME ANALYST + +[CRED094] +RICHARD HUIE + +[CRED095] +ROCKSTAR TEST TEAM + +[CRED096] +LANCE WILLIAMS + +[CRED097] +JOE GREENE + +[CRED098] +BRIAN PLANER + +[CRD098A] +ELIZABETH SATTERWHITE + +[CRD098B] +JAMEEL VEGA + +[CRD098C] +MIKE HONG + +[CRED099] +LEE CUMMINGS + +[CRED100] +STORY + +[CRED101] +JAMES WORRALL + +[CRED102] +DAN HOUSER + +[CRED103] +ADAM TEDMAN + +[CRED104] +PAUL YEATES + +[CRED105] +JENEFER GROSS + +[CRED106] +LAURA PATERSON + +[CRED107] +CUT SCENES + +[CRED108] +WRITTEN BY DAN HOUSER AND JAMES WORRALL + +[CRED109] +AUDIO DIRECTED BY DAN HOUSER AND NAVID KHONSARI + +[CRED110] +PRODUCED BY JAMIE KING + +[CRD110A] +TALENT PROCUREMENT: JAMIE KING, SEAN MACALUSO + +[CRED111] +CAST + +[CRD111A] +SUPPORTING CHARACTERS + +[CRED112] +TOMMY VERCETTI - RAY LIOTTA + +[CRED113] +KEN ROSENBERG - WILLIAN FICHTNER + +[CRED114] +SONNY FORELLI - TOM SIZEMORE + +[CRED115] +STEVE SCOTT - DENNIS HOPPER + +[CRED116] +AVERY CARRINGTON - BURT REYNOLDS + +[CRED117] +RICARDO DIAZ - LUIS GUZMAN + +[CRED118] +LANCE VANCE - PHILIP MICHAEL THOMAS + +[CRED119] +COLONEL JUAN CORTEZ - ROBERT DAVI + +[CRED120] +UMBERTO ROBINA - DANNY TREJO + +[CRED121] +PHIL CASSIDY - GARY BUSEY + +[CRED122] +MITCH BAKER - LEE MAJORS + +[CRED123] +MERCEDES CORTEZ - FAIRUZA BALK + +[CRED124] +KENT PAUL - DANNY DYER + +[CRED125] +JEZZ TORRENT - KEVIN MCKIDD + +[CRED126] +TAXI CONTROLLER - DEBORAH HARRY + +[CRED127] +CANDY SUXXX - JENNA JAMESON + +[CRED128] +BJ SMITH - LAWRENCE TAYLOR + +[CRED129] +AUNTIE POULET - YOUREE CLEOMILI HARRIS + +[CRED130] +SUPPLIER - ARMANDO RIESCO + +[CRED131] +COUGAR - BLAYNE PERRY + +[CRED132] +HILARY - CHARLES TUCKER + +[CRED133] +CONGRESSMAN ALEX SHRUB - CHRIS LUCAS + +[CRED134] +OLD MAN KELLY - GEORGE DICENZO + +[CRD134A] +CAM JONES - GREG SIMS + +[CRD134B] +PSYCHO - HUNTER PLATIN + +[CRD134C] +MAUDE THE ICE CREAM LADY - JANE GENNARO + +[CRD134D] +JETHRO - JOHN ZURHELLEN + +[CRD134E] +GONZALES - JORGE PUPO + +[CRD134F] +DWAYNE - NAVID KHONSARI + +[CRD134G] +DICK - PETER MCKAY + +[CRD134H] +MIKE THE GOON & PORN GUY - ROBERT CIHRA + +[CRD134I] +PERCY - RUSSELL FOREMAN + +[CRED135] +MOTION CAPTURE + +[CRED136] +ANIMATED BY + +[CRD136A] +TECHNICAL DIRECTION BY ALEX HORTON + +[CRED137] +DIRECTED BY + +[CRD137A] +DIRECTED BY NAVID KHONSARI + +[CRED138] +PRODUCED BY + +[CRD138A] +PRODUCED BY JAMIE KING + +[CRD138B] +RENAUD SEBBANE + +[CRED139] +RECORDED AT PERSPECTIVE STUDIOS, BROOKLYN + +[CRED140] +MOTION CAPTURE ACTORS + +[CRD140A] +BLAYNE PERRY + +[CRD140B] +JONATHON SALE + +[CRD140C] +CHARLES TUCKER + +[CRD140D] +EDDIE MARRERO + +[CRD140E] +WILLIAM MCCALL + +[CRD140F] +JORGE PUPO + +[CRD140G] +ROBERT JACKSON + +[CRD140H] +TARA RADCLIFFE + +[CRD140I] +JENIFER GAMBETESE + +[CRD140J] +KRIS ACHEVARRIA + +[CRD140K] +ALI ORDOUBADI + +[CRD140L] +KAHLEEM POOLE + +[CRED141] +PEDESTRIAN DIALOGUE + +[CRD141A] +WRITTEN BY DAN HOUSER, MARC FERNANDEZ, GILLIAN TELLING AND NAVID KHONSARI + +[CRD141B] +WITH HELP FROM JEREMY POPE, LANCE WILLIAMS, AND JENNY JEMISON + +[CRED142] +WRITTEN BY + +[CRD142A] +DAN HOUSER AND JAMES WORRALL + +[CRED143] +DIRECTED BY DAN HOUSER, CRAIG CONNER, MARC FERNANDEZ, AND ALLAN WALKER + +[CRED144] +PRODUCED BY RENAUD SEBANNE + +[CRED145] +PEDESTRIANS + +[CRED146] +ADAM DAVIDSON, ADAM WATKINS, ALEJANDRO K. BROWN, ALEX ANTHONY SIOUKAS, ALEX GARCIA, + +[CRED147] +ALICE SALTZMAN, ALISON CIHRA, AMY SALIMA, AMY SALZMAN, ANDREA VIDELA, ANTHONY ATTI, + +[CRED148] +ANTHONY RIVERA, BIJAN SHAMS, BLAYNE PERRY, BRETT BISOGNO, BREYE MATA, BRIAN PANEN, + +[CRED149] +BROCK VODER, CAREY BERTINI, CHARISSE LAMBERT, CHRIS DIFAT, CHRIS REISENBERGER, + +[CRED150] +CHRISTOPHER BRODAY, CHRISTOPHER CARRO, CYNTHIA GREENE, DAMARIES LOPEZ, DAN LEE, + +[CRED151] +DAN SCHNEIDER, DAN TOYAMA, DAVID DEAN CHALTFIELD, JR., DAVID HARRISON, DAVID WILEY, + +[CRED152] +DEBORAH COLLINS, DEBRANDA CHANEY-GILES, DEMETRA KOUKOULAS, DENISE ROSADO, + +[CRED153] +DEVIN BENNETT, DEVIN WINTERBOTTOM, DORIS WOO, DOUGLAS HARRISON, DUNCAN COUTTS, + +[CRED154] +DUPE AJAYI, EDWIN AVELLANEDA, ELIZABETH HOWELL, ELIZABETH SATTERWHITE, ERIC NAGLE, + +[CRED155] +ESTEBAN KARPLUS, F. FONT, FUTABA HAYASHI, GENE HILGREEN, GERALD COSGROVE, + +[CRED156] +GERARD LUNA, GILLIAN TELLING, GREGG CARLUCCI, GREGORY CLERVOIX, GREGORY SCHWEIZER, + +[CRED157] +HADLEY TOMICKI, J. ROSSETT, JAMEEL VEGA, JASON JONES, JEFF ROSA, JENNIFER JEMISON, + +[CRED158] +JEREMY TAGGERT, JESSICA RIDER, JOSEPH GREENE,JOSEPH HOWELL, KATE DUKICH, + +[CRED159] +KEL O'NEILL, KEVIN HOPKINS, LADAWN JAMES, LANCE WILLIAMS, LAURA BUBBLES, + +[CRED160] +LAURA PATTERSON, LEE CUMMINGS, LETICIA L. YOUNG, LINDSAY KENNEDY, LISA ORITZ, + +[CRED161] +LORNA JORDAN, LUCIO AMADIO, MARCO FERNANDEZ, MARIKO TANAKA, MARLON MATTHEWS, + +[CRED162] +MARY TELLING, MASAYOSHI MITSUYAMA, MATTHEW CHUNG, MAX ALLSTADT, MAX BOGDANOV, + +[CRED163] +MELISSA ALVAREZ, MICHAEL MAY, MICHAEL ROTHSTEIN, MIGUEL VIDAL, MIKE FEDERLINE, + +[CRED164] +NATALIE DESCALZO, N'GAI MEMBERS, NICOLAS MALLO, NOELLE SADLER, NORBERT MORIVAN, + +[CRED165] +OSWALD GREENE, JR., PETER MCKAY, PETER APPEL, PRESTON SAVARESE, RAFAEL GONZALES, + +[CRED166] +RANDY JOHNSON, REY CONCEPCION, RICHARD KROGER, ROB TIBBS, ROBERT JACKSON, + +[CRED167] +ROBERT SCHULER, ROSS A. MCINTYRE, RUSSELL FOREMAN, RUTH NUNEZ, SALVADORE SUAZO, + +[CRED168] +SAM WHITE, SANTOS GONZALES, SCOTT SMITH, SEYMOUR FRAILMAN, SPELMAN BRAUMAN, + +[CRED169] +STEPHANIE TELLING, STEVE KNEZEVICH, STEVE ROBERT, SUMIKO YASUDA, SUSAN LEWIS, + +[CRED170] +SYLVIA COLACIOS, TOMOKO MIYAZAKI, TRON, VERDEL HALE, YVES MONDESIR, ZENO LEINFELDER, + +[CRED171] +DAVID BEDDOES, CHRISTINE CHALMERS, BARRY CLARK, NEIL CORBETT, KIM GURNEY, NEIL MEIKLE, + +[CRED172] +CASSIE OLIVER, LORRAINE ROY, DAVID WATSON, KEVIN WONG, WILL MORTON + +[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] +MUSIC CONSULTANCY + +[CRD218A] +HEINZ HENN + +[CRD218B] +STUART ROSS + +[CRED219] +SOUNDTRACK CO-ORDINATOR + +[CRED220] +TERRY DONOVAN + +[CRED221] +PRODUCER FOR ROCKSTAR GAMES + +[CRED222] +DAN HOUSER AND LAZLOW + +[CRED223] +PRODUCER FOR ROCKSTAR NORTH + +[CRED224] +CRAIG CONNER + +[CRED225] +ALLAN WALKER + +[CRED226] +LAZLOW + +[CRED227] +DJ BANTER AND IMAGING + +[CRED228] +WRITTEN BY DAN HOUSER AND LAZLOW + +[CRED229] +FLASH FM + +[CRD229A] +TONI-MARIA CHAMBERS + +[CRD229B] +IMAGING VOICE AND PRODUCTION-JEFF BERLIN + +[CRED230] +SPECIAL THANKS TO + +[CRED231] +TOMMY MOTTOLA, + +[CRED232] +MICHELLE ANTHONY, + +[CRED233] +STEVE BARNETT, + +[CRED234] +CHUCK FLECKENSTEIN, + +[CRED235] +RITA LIBERATOR + +[CRED236] +MARTIN & CLAIRE LOGAN + +[CRED237] +SANDRA HUTTON + +[CRED238] +CHRISTINE DAVIDSON + +[CRED239] +ALAN, RED & BIGFOOT + +[CRED240] +LE T + +[CRED241] +COLIN DONALD + +[CRED242] +KERRY STALLWOOD + +[CRED243] +ALAN MCGREGOR + +[CRED244] +CHRIS MORTON + +[CRED245] +EMIL BUSSE + +[CRED246] +EMILY BAILLIE + +[CRED247] +KEVIN ARCHIBALD + +[CRED248] +MORAG KERR + +[CRED249] +CATH WALKER + +[CRED250] +ISO BAR + +[CRED251] +WATERLINE + +[CRED252] +NEWS CAFE + +[CRD251A] +THE POND + +[CRD252A] +PIVO + +[CRED253] +BUDGET VIDEO RENTALS + +[CRED254] +LORNA'S SCOOTER + +[CRED255] +GARETH MURFIN + +[CRED256] +ADDITIONAL ART + +[CRED257] +TONY PORTER + +[CRED258] +CRAIG MOORE + +[CRED259] +CUT SCENE LIP-SYNC ANIMATION + +[CRED260] +COSGROVE HALL FILMS + +[CRED261] +PRODUCER - OWEN BALLHATCHET + +[CRED262] +SENIOR ANIMATOR - JON TURNER + +[CRED263] +ANIMATORS - RICHARD DRUMM + +[CRED264] +DAVE BROWN + +[CRED265] +MAIR THOMAS + +[CRED266] +PRASHANT PATEL + +[CRED267] +AUDIO TECHNOLOGY CONSULTANT + +[CRED268] +RIK EDE FOR GAMESOUND LTD. + +[CRED269] +DTS INTEGRATION SUPPORT + +[CRED270] +TED LAVERTY FOR DTS + +[CRED271] +CHRIS GREER FOR DTS + +[CRED272] +JASON PAGE FOR SCEE + +[CRED273] +RESEARCH AND ANALYSIS + +[CRED274] +VROCK + +[CRED275] +DJ: LAZLOW AS HIMSELF + +[CRED276] +IMAGING VOICE-JOE KELLY + +[CRED277] +IMAGING PRODUCTION-JONATHAN HANST + +[CRED278] +WAVE 103 + +[CRED279] +DJ: ADAM FIRST-JAMIE CANFIELD + +[CRED280] +IMAGING VOICE-JEN SWEENEY + +[CRED281] +IMAGING PRODUCTION-JONATHAN HANST + +[CRED282] +FEVER 105 + +[CRED283] +DJ: OLIVER 'LADYKILLER' BISCUIT-JULIUS DYSON + +[CRED284] +IMAGING VOICE MALE-ED MCMANN + +[CRED285] +IMAGING VOICE FEMALE-SHAWNEE SMITH + +[CRED286] +IMAGING PRODUCTION- LISTEN KITCHEN + +[CRED287] +EMOTION 98.3 + +[CRED288] +DJ: FERNANDO- FRANK CHAVEZ + +[CRED289] +IMAGING VOICE-JEN SWEENEY + +[CRED290] +IMAGING PRODUCTION-JONATHAN HANST + +[CRED291] +RADIO ESPANTOSO + +[CRED292] +DJ: PEPE-TONY CHILRODES + +[CRED293] +WILDSTYLE + +[CRED294] +DJ: MISTER MAGIC AS HIMSELF + +[CRED295] +IMAGING VOICE-FRANK SILVESTRO + +[CRED296] +IMAGING PRODUCTION-LAZLOW + +[CRED297] +KCHAT + +[CRED298] +WRITTEN BY DAN HOUSER AND LAZLOW + +[CRED299] +PRODUCED AND EDITED BY LAZLOW + +[CRED300] +DJ AMY SHECKENHAUSEN -LEYNA WEBER + +[CRED301] +JEZ TORRENT-KEVIN MCKIDD + +[CRED302] +MANDY -COLLEEN CORBETT + +[CRED303] +MICHELLE CARAPADIS-MARY BIRDSONG + +[CRED304] +MR.ZOO-CARL DOWLING + +[CRED305] +GETHSEMANEE-LYNN LIPTON + +[CRED306] +CLAUDE MAGINOT-JOHN MAUCERI + +[CRED307] +BJ SMITH-LAWRENCE TAYLOR + +[CRED308] +THOR-FRANK FAVA + +[CRED309] +RADIO CALLERS + +[CRED310] +COUZIN ED, JOSH CLARK, JASON BUHRMESTER, JUAN ALLER, WAYNE OLIVER, SUSAN LEWIS, GILLIAN TELLING, TOM MURRAY, MIKE FERRANTE SR., EMMANUEL GOLDSTEIN, DAN HOUSER, NICK MANDELOS, GERRY COSGROVE, MIKE PALERMO, PORKCHOP, KEITH BROADAS + +[CRED311] +LEWIS, GILLIAN TELLING, TOM MURRAY, MIKE FERRANTE SR., EMMANUEL GOLDSTEIN, + +[CRED312] +DAN HOUSER, NICK MANDELOS, GERRY COSGROVE, MIKE PALERMO, PORKCHOP, + +[CRED313] +KEITH BROADAS + +[CRED314] +VCPR + +[CRED315] +WRITTEN BY DAN HOUSER AND LAZLOW + +[CRED316] +PRODUCED BY LAZLOW + +[CRED317] +MAURICE CHAVEZ-PHILLIP ANTHONY RODRIGUEZ + +[CRED318] +JONATHAN FREELOADER- PATRICK OLSEN + +[CRED319] +MICHELLE MONTANIUS-KELLY GUEST + +[CRED320] +REP. ALEX SHRUB- CHRIS LUCAS + +[CRED321] +CALLUM CRAYSHAW- SEAN MODICA + +[CRED322] +JOHN F. HICKORY- LJ GANSEN + +[CRED323] +PASTOR RICHARDS- DAVID GREEN + +[CRED324] +JAN BROWN- MAUREEN SILLIMAN + +[CRED325] +BARRY STARK- RENAUD SEBBANE + +[CRED326] +JENNY LOUISE CRAB- MARY BIRDSONG + +[CRED327] +KONSTANTINOS SMITH- KONSTANTINOS.COM + +[CRED328] +JEREMY ROBARD-PETER SILVESTRO + +[CRED329] +RADIO COMMERCIALS + +[CRED330] +WRITTEN BY DAN HOUSER AND LAZLOW + +[CRED331] +PRODUCED BY LAZLOW + +[CRED332] +ADDITIONAL JINGLES PRODUCED BY CRAIG CONNER + +[CRED333] +COMMERCIAL VOICES: + +[CRED334] +ADAM DAVIDSON, ALEX ANTHONY, ALICE SALTZMAN, AMY SALZMAN, KATE DUKICH, + +[CRED335] +ARAN RONICLE, BARB JONES, BEN KRECH, BRIAN THOMAS, BROCK YODER, CHRIS + +[CRED336] +FERRANTE, CRAIG CONNER, DAVE RYAN, DAVID GREEN, DORIS WOO, DOUGLAS + +[CRED337] +HARRISON, ED MCMANN, FRANK CHAVEZ, FRANK FAVA, GENE HILGREEN, GREG + +[CRED338] +SCHWEIZER, HUNTER PLATIN, JAMES FERRANTE, JEFF BERLIN, JEFF ROSA, JOE KELLY, + +[CRED339] +JOHN MAUCERI, JOSH CLARK, JULIE WEMYSS, KEVIN STRALEY, KIM GURNEY, LANCE + +[CRED340] +WILLIAMS, LAURA PATERSON, LAZLOW, LISA ORTIZ, LORNA JORDAN, LUCIEN JONES, + +[CRED341] +MAUREEN SILLIMAN, MIKE FERRANTE JR., PETE GUSTIN, PETER SILVESTRO, RAFF + +[CRED342] +CROLLA, RANDY JOHNSON, RICHARD KRUGER, RON REEVE, SHELLEY MILLER, SKY, TJ ALLARD + +[CRD344A] +AUDIO RECORDED AT DIGITAL ARTS STUDIOS, + +[CRED344] +NYC, TRACK 9 STUDIOS, NYC, + +[CRED345] +WEDDINGTON MULTIMEDIA, LOS ANGELES, + +[CRD345A] +SYNC SOUND, NYC AND RADIO LAZLOW, LONG ISLAND. + +[CRED346] +THANKS TO AXEL ERICSON AND WON LEE AT DIGITAL ARTS, PAUL VASQUEZ AT TRACK 9 STUDIOS, JOHN BOWEN AND JOHN HASSLER AT SYNC SOUND + +[CRED347] +MARK LLOYD + +[CRED348] +TIM BATES + +[CRED349] +KIT BROWN + +[CRED350] +ANDY MASON + +[CRED351] +PHIL DEANE + +[CRED352] +PHIL ALEXANDER + +[CRED353] +MATT HEWITT + +[CRED354] +DENBY GRACE + +[CRED355] +ANTOINE CABROL + +[CRED356] +JONOTHAN STONES + +[CRED357] +MIKE BLACKBURN + +[CRED358] +TIM MCGAFF + +[SUNSHIN] +Sunshine Autos + +[CHERRYP] +Cherry Popper Icecreams + +[KAUFCAB] +Kaufman Cabs + +[BOATYAR] +The Boatyard + +[WANT_L] +Your wanted level has been suspended, if you commit a crime whilst the stars are flashing your full wanted level will be reinstated. + +[PICK1] +Body Armor delivered to Ocean View Hotel! + +[HOTRNG] +HOTRING + +[BLODRNG] +BLOODRING + +[DIRTRNG] +DIRTRING + +[FEC_ABR] +Accelerate, Brake or Reverse + +[FEI_BTU] +; = - + +[FEI_SCR] +Scroll + +[SKUMBUY] +Skumole Shack purchased: $~1~ + +[SKUM_L] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase Skumole Shack for $~1~ + +[SKUM_T] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase Skumole Shack for $~1~ + +[SKUM_C] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to purchase Skumole Shack for $~1~ + +[LG_35] +Destination + +[BOAT_AS] +~g~The Boatyard will now generate revenue up to a maximum of $~1~. Make sure you collect it regularly. + +[BOAT_A2] +BOATYARD ASSET COMPLETED + +[BOAT_N] +Checkpoint Charlie + +[BOAT_P] +~g~collect the packages before the time runs out. + +[FEI_R1B] +R1 \ R2 button - + +[HELP9_A] +Press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire~w~ the sniper rifle. + +[HELP21] +Press the ~h~~k~~VEHICLE_ENTER_EXIT~ ~w~button to enter or exit a vehicle. + +[CREAM] +Distribution + +[UMBERTO] +Cafe Robina + +[PU_CF1] +Press the ~h~~k~~PED_ANSWER_PHONE~ ~w~button to pick up this weapon. It will replace any weapon you have of the same type. + +[FED_RDM] +MAP & BLIPS + +[FEC_ILU] +Invert Look in 1st Person + +[NITRO] +All taxi's now have a boost jump! Just press the horn button. + +[RATNG53] +Untrustworthy + +[RATNG54] +Embarrassment + +[RATNG55] +Hacker + +[RATNG56] +Cheater + +[RATNG57] +Total Liar + +[STHC_04] +Highest score with Keepie-Uppy beach ball + +[STHC_05] +Hotring Best Result + +[STFT_13] +Fastest time on Downtown Chopper Checkpoint + +[STFT_14] +Fastest time on Ocean Beach Chopper Checkpoint + +[STFT_15] +Fastest time on Vice Point Chopper Checkpoint + +[STFT_16] +Fastest time on Little Haiti Chopper Checkpoint + +[STFT_21] +Fastest time in Hotring + +[STFT_22] +Fastest lap time in Hotring + +[STFT_20] +Fastest time for 'Cone Crazy' + +[HELP44] +Stop in the ~q~pink marker. + +[HELP45] +Press the ~h~~k~~PED_DUCK~~w~ button to duck. This will increase the accuracy of guns you are holding. + +[RCR1_5] +RC Bandit Race + +[RCPL1_7] +RC Baron Race + +[RCH1_11] +RC Raider Pickup + +[FEA_CTD] +Warning! This feature requires DTS compatible hardware to be connected. Proceed? + +[FEM_STE] +USE STEREO + +[GREET] +Greetings from... + +[LANCE_1] +Come on man, drive more careful! + +[LANCE_2] +Hey watch what you're doin! + +[LANCE_3] +Hey where are we goin' now? + +[LANCE_4] +What are we doin' now? + +[LAW4_15] +More money! + +[MERC_5] +Nice car, Mr. Vercetti. + +[MERC_26] +FASTER, FASTER, FASTER! + +[MERC_27] +Careful, Tommy, I only have a nose job last month. + +[MERC_28] +Tommy, drive careful. + +[MERC_29] +Tommy, go slower. + +[MERC_30] +Tommy, please kill someone other than me. + +[MERC_31] +Tommy, baby, don't kill me! + +[MERC_32] +Tommy, I'm glad you stole this car! + +[MERC_40] +I had so much fun. + +[MERC_43] +Adios, angel. + +[MERC_44] +You keep working out, now, you hear. + +[MERC_45] +Ciao, beautiful. + +[COL5_17] +Oh my god they've got a helicopter! + +[COL5_18] +Shoot the helicopter! + +[COL5_19] +Tommy, take that chopper out! + +[COL5_20] +He's coming again! Blow that chopper! + +[COL5_21] +Look at the size of that chopper! + +[COL5_22] +Here he comes again! + +[FEA_DSM] +Warning! This savegame is set to use DTS. This requires DTS compatible hardware to be connected. Please select whether you want to proceed using DTS or STEREO output. + +[STFT_23] +Fastest time for Checkpoint Charlie + +[HELP50] +Press the ~h~~k~~PED_ANSWER_PHONE~~w~ button to set the camera behind you. + +[HELP51] +Press the ~h~~k~~PED_ANSWER_PHONE~~w~ button to set the camera behind you. + +[HELP52] +Press the ~h~~k~~PED_ANSWER_PHONE~~w~ button to set the camera behind you. + +[HELP53] +Press ~h~~k~~PED_CYCLE_WEAPON_LEFT~~w~ button or ~h~~k~~PED_CYCLE_WEAPON_RIGHT~~w~ button to cycle through your available weapons. + +[HELP46] +There are eight different types of weapon. + +[HELP47] +You can carry one of each type of weapon at a time - one type of pistol, one type of shotgun. + +[HELP54] +~w~Cost: $~1~ ~r~Buying this will replace your current weapon. + +[HELP2A2] +Press the ~h~~k~~PED_SPRINT~~w~ button when running to ~h~sprint + +[HLPSN_A] +The sniper rifle allows you to zoom in and fire accurately at targets from a distance. + +[HLPSN_B] +Press and hold the~h~ ~k~~PED_LOCK_TARGET~ ~w~button to ~h~target~w~ with the sniper rifle. + +[HLPSN_C] +Press and hold the~h~ ~k~~PED_LOCK_TARGET~ ~w~button to ~h~target~w~ with the sniper rifle. + +[HLPSN_D] +Press the ~h~~k~~PED_SNIPER_ZOOM_IN~~w~ 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. + +[HLPSN_E] +Press the ~h~~k~~PED_FIREWEAPON~~w~ button ~w~to ~h~fire~w~ the sniper rifle. + +[HLPSN_F] +Press the ~h~~k~~PED_FIREWEAPON~~w~ button ~w~to ~h~fire~w~ the sniper rifle. + +[HLPSN_G] +Press the ~h~~k~~PED_FIREWEAPON~~w~ button to ~h~fire~w~ the sniper rifle. + +[PLANE_H] +Use the ~h~~k~~VEHICLE_ACCELERATE~~w~ button to accelerate, Left and right to turn. + +[PLANE_4] { reVC update } +{ Use the ~h~~k~~VEHICLE_ACCELERATE~~w~ button to accelerate, Left and right to turn. } +Use the right analog stick to accelerate, pull back on the left analog stick to climb, push forwards to descend. Left and right to turn. + +[HELP55] +Press the ~h~~k~~PED_FIREWEAPON~~w~ button to attack the chef. + +[STPR_8] +Pole Position Club + +[STPR_9] +3321 Vice Point + +[STPR_10] +Links View Apartment + +[STPR_11] +El Swanko Casa + +[STPR_12] +1102 Washington Street + +[STPR_13] +Ocean Heights Apartment + +[STPR_14] +Skumole Shack + +[STPR_15] +Hyman Condo + +[RCCANX] +~r~RC plane cancelled. + +[CLT_HL2] +When a Clothes Pickup is collected, a one star or two star wanted level will be cleared. + +[CRED009] +MISSION DESIGN + +[CRED359] +LEE JOHNSON + +[CRED360] +HENDRIK LESSER + +[CRED361] +PASQUALE STACCHIOTTI + +[CRED362] +ENRIQUE FERNANDEZ + +[CRED363] +PAUL BYERS + +[CRED364] +MIKE EMENY + +[CRED365] +ROB DUNKIN + +[CRED366] +CHARLIE KINLOCH + +[CRED367] +KEVIN HOBSON + +[CRED368] +JIM CREE + +[MOB_66A] +Tommy, Tommy why you coming back here for? + +[MOB_66B] +I tell you we don't want to see you around here no more. + +[MOB_67A] +Tommy, me thinks you should be staying away, you hear? + +[MOB_67B] +The Haitian boys not too 'appy with you. + +[MOB_18A] +Tommy, it's Paulo, how are you? Right mate, anyway, thought I had to drop you a line. + +[MOB_18B] +Oh my good lord, my son, you will not believe the quality of the brass I just encountered. + +[MOB_18C] +Street walker or something, just down in Little Havana, mate. + +[MOB_18D] +Said her name was Mercedes or something. + +[MOB_18E] +Oh my god, mate. You gotta check this bird out. + +[MOB_18F] +Could strip the lead out of a pencil. Said I was the best she ever had and all. + +[MOB_18G] +Keep you potatoes skinned for her. Be seeing you. + +[MOB_72A] +Tommy, it's me, Lance. Keep your mouth shut there Tommy, 'cause I ain't got time to talk. + +[MOB_72B] +I ain't interested in what you got to say. Why should I be? You don't care about me, do you? + +[MOB_72C] +You gotta look after me a bit better. Give me a fair slice. You know... + +[MOB_72D] +Tommy... oh, look, man, I'm sorry. It's just that... + +[MOB_72E] +People patronize me all my life, treat me like a little kid. + +[MOB_72F] +My brother would do that. Please, man, don't do that. + +[MOB_72G] +I gotta go. + +[MOB_63A] +Tommy, it's Earnest. Earnest Kelly. + +[MOB_63B] +How are you? + +[MOB_63C] +I'm doing okay. I'll need a stick to walk, but I should be back at work soon enough. + +[MOB_63D] +Good. + +[MOB_63E] +I heard about Lance. What a little prick, eh? + +[MOB_63F] +Yes. + +[MOB_63G] +Never trust a man who walks the streets in his pajamas. That's what I say. Glad you killed him. I hope it was painful for the prick. + +[MOB_63H] +I think it was. I just didn't think he was like that... + +[MOB_63I] +Tommy, for a raging lunatic, you're pretty naive. I'll be back at work soon, teach you a thing or two about life, you hear. + +[MOB_63J] +Take your time, Earnest. Look after yourself. + +[MOB_16A] +Tommy, Paulo here, que pasa amigo? + +[MOB_16B] +What do you want Paul? I don't want any fake label clothes. + +[MOB_16C] +Very funny, mate, but you know I don't touch bent gear. Nah, I was just calling to see if I get a part in one your movies. + +[MOB_16D] +Back in England I did a lot of blue stuff, mate. I'm packing more heat than you, my son. + +[MOB_16E] +Paul, thanks for the offer, I'll bear it in mind. + +[MOB_16F] +Seriously, don't forget about me, after all I done for you. + +[MOB_16G] +That's what I'm trying to forget about. + +[MOB_17A] +Tommy Vercetti, how's it going, Mr. big shot? I hear all these things about you, some kind of player in town, now eh... + +[MOB_17B] +Paul, you're drunk. + +[MOB_17C] +Nah, you stupid prat, I ain't drunk. I only had a couple and some treats, ain't been to bed for a couple of days, you know. + +[MOB_17D] +Anyway, don't give me that. I ain't a mug. Who set you up in this town? Who? Me. That's who. + +[MOB_17F] +Really? + +[MOB_17G] +Don't give me that. Don't! I introduced you to people. I showed you the ropes, did a lot of stuff for you, and this is how you repay me. + +[MOB_17H] +You ignore me. You won't give me a way in, after all I did for you! What do you think I am? A div or something? + +[MOB_17I] +Paul, take it easy. I've been busy, don't be an idiot. + +[MOB_17J] +I ain't no idiot, mush. That's what they said in borstal. Are you asking for trouble son, because you're going to get it! + +[MOB_17K] +Tommy, mate. Please. You was my big hope! Please, don't laugh at me! + +[MOB_17L] +Paul, get some sleep, seriously. + +[MOB_73A] +Tommy, it's Steve. + +[MOB_73B] +Hey, Steve. + +[MOB_73C] +Hey indeed, genius. You're a marvel! I'm a marvel! They love us. We are re-writing the record books, pal. + +[MOB_73D] +We are talking major awards here. Finally, I can put my dad in a home an tell him to shut up. + +[MOB_73E] +Eeer, that's cool, Steve. + +[MOB_73F] +Cool? It's hot, man. Hot. H. O. T. He never believed in me. Never thought I was an artist, and now I've made it. + +[MOB_73G] +I'm the best damn skin flick director of all time, my friend. I just wanted to say, it's a pleasure to have met you. + +[MOB_73H] +Thanks steve. + +[MOB_73I] +I love you, baby. Don't go changing on me, you hear. + +[MOB_73J] +I hear you. Good bye, Steve. + +[BOLLOX] +Press the ~h~~k~~VEHICLE_HANDBRAKE~ ~w~button to drop a bomb. Press the ~h~~k~~VEHICLE_ENTER_EXIT~ ~w~button to cancel. + +[BRID_OP] +Storm warning over, all bridges to the mainland are now open. + +[BRID_CL] +Storm warning: All bridges to the mainland are closed. + +[LG_38] +Target + +[ASSET_C] +POLE POSITION ASSET COMPLETED! + +[ASSET_D] +~g~The Pole Position Club will now generate revenue up to a maximum of $~1~ per day. Pick up your cash regularly! + +[ST_WHEE] +Longest Wheelie time (secs) + +[ST_STOP] +Longest Stoppie time (secs) + +[ST_2WHE] +Longest 2 wheels time (secs) + +[ST_WHED] +Longest Wheelie distance (m) + +[ST_STOD] +Longest Stoppie distance (m) + +[ST_2WHD] +Longest 2 wheels distance (m) + +[OUTFT11] +Tracksuit + +[OUTFT12] +Frankie + +[RELOAD] +~g~You have won the fast reload ability! + +[APACHE] +Hunter delivered to helipad in Ocean Beach. + +[CRED369] +JOHN MCCARDLE + +[CRED370] +DAVID MURDOCH + +[CRED371] +CHRIS BROWN + +[CRED372] +PAUL GREEN + +[CRED373] +KYLE MILNE + +[CRED374] +KEVIN YUN + +[CRED375] +ERICK COBBS + +[CRED376] +RANDY BLAKE + +[CRED377] +BRANDON LIM + +[CRED378] +BRANDON FENOL + +[CRED379] +MICHAEL MANOLE + +[CRED380] +ALETHEIA SIMONSON + +[CRED381] +JOHN JANSEN + +[CUNTY] +New clothes delivered to the Vercetti Estate! + +[GOODBOY] +$50 Good Citizen Bonus! + +[NEWCONT] +New ~h~Contact Point ~w~opened at the marina in Ocean Beach!! + +[FIRELVL] +Fire Truck Mission level ~1~ + +[FEM_RET] +RETRY + +[FESZ_QR] +Are you sure you want to start a new game? All progress will be lost. Proceed? + +[SEG3_1] +TIME: + +[HELP56] +Press the ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~ button to change camera modes. + +[HELP57] +Press the ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~ button to change camera modes. + +[HELP58] +While targeting you can press the ~h~~k~~PED_CYCLE_TARGET_LEFT~ button or ~k~~PED_CYCLE_TARGET_RIGHT~ ~w~button to cycle through targets. + +[HELP59] +While targeting you can press the ~h~~k~~PED_CYCLE_TARGET_LEFT~ button or ~k~~PED_CYCLE_TARGET_RIGHT~ ~w~button to cycle through targets. + +[HELP60] +If you press the ~w~~k~~PED_SPRINT~ ~w~button while car jacking, you will not enter that vehicle. + +[HELP61] +You now have limitless ammo and double health on all vehicles. + +[FEC_LB1] +Look + +[FEC_LB2] +behind + +[FEC_LB3] +Look behind + +[FEC_R3] +(R3 button) + +[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 + +[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~ + +[FEC_WAR] +Warning + +[FEC_OKK] +O.K. + +[FEC_DLF] +Delete Failed. + +[FEC_SVU] +Save Unsuccessful. + +[FEC_LUN] +Load Unsuccessful. File Corrupted, Please delete. + +[FEC_PAD] +Gamepad + +[FEC_JOY] +Joystick + +[FES_CSA] +Select a skin from the list below: + +[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_DSN] +Default Player Skin.bmp + +[FET_RSO] +ORIGINAL SETTING RESTORED + +[FET_RSC] +HARDWARE NOT AVAILABLE - ORIGINAL SETTING RESTORED + +[FEA_3DH] +AUDIO HARDWARE + +[FEA_SPK] +SPEAKERS CONFIGURATION + +[FEM_LOD] +DRAW DISTANCE + +[FEM_VSC] +FRAME SYNC + +[FEM_FRM] +FRAME LIMITER + +[FEM_MM] +MAIN MENU + +[FED_RES] +SCREEN RESOLUTION + +[FET_CTL] +CONTROLLER SETUP + +[FET_OPT] +OPTIONS + +[FEC_MSH] +MOUSE SENSITIVITY + +[FEC_IVV] +INVERT MOUSE VERTICALLY + +[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 + +[FEC_SPC] +SPC + +[WIN_TTL] +Grand Theft Auto VC + +[WIN_95] +Grand Theft Auto VC cannot run on Windows 95 + +[WIN_DX] +Grand Theft Auto VC requires at least DirectX version 8.1 + +[FET_EIG] +CANNOT SET A CONTROL FOR THIS ACTION + +[FET_DAM] +DYNAMIC ACOUSTIC MODELING + +[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? + +[FET_QG] +QUIT GAME + +[FEN_STA] +START GAME + +[FET_PAU] +PAUSE MENU + +[REPLAY] +REPLAY + +[FEC_ANS] +Action + +[CVT_MSG] +Converting textures to optimal format for your video card + +[FEC_SFT] +SHIFT + +[FEH_VMP] +VIEW MAP + +[FES_DEE] +Delete Failed! Please try again. + +[FES_CMP] +Save failed! Please try again. + +[FESZ_WR] +Saving current game. Please wait... + +[FELD_WR] +Loading game. Please wait... + +[FEDL_WR] +Deleting saved game. Please wait... + +[PCRESRT] +Starting new game. Please wait... + +[FET_STI] +Standard Controls + +[FET_CTI] +Classic Controls + +[FET_PS] +PLAYER SKIN SETUP + +[FEH_NA] +OPTION NOT AVAILABLE + +[FEH_MPH] +MOUSE, CURSORS TO MOVE - PGUP, PGDN, MSWHEEL TO ZOOM, L - LEGEND + +[FEA_MP3] +MP3 PLAYER + +[NO_PCCD] +Please insert your GTA Vice City CD, or press ESC to cancel + +[FEH_SSA] +CURSORS TO MOVE - S TO SAVE TO FILE + +[FES_CMI] +LAST MISSION PASSED + +[FET_STS] +STATS SAVED TO 'STATS.HTML' + 'STATS.TXT' + +[WIN_VDM] +Grand Theft Auto VC cannot find enough available video memory + +[FEC_ERI] +Error! One or more control actions are not bound to a key or button. Please check all control actions are set + +[FEC_TFU] +Turret + Lean Up + +[FEC_TFD] +Turret + Lean Down + +[FET_RIG] +SELECT A NEW CONTROL FOR THIS ACTION + +[FEA_NM3] +NO MP3 FILES FOUND + +[FEA_MPB] +MP3 VOLUME BOOST + +[FEA_MUS] +MUSIC VOLUME + +[FEA_SFX] +SFX VOLUME + +[CVT_ERR] +You have run out of disk space. Please make some space on your harddisk before continuing. Press ESC to cancel. + +[FEA_ADP] +AUTO-DETECT HARDWARE + +{=================================== MISSION TABLE AMBULAE ===================================} + +[ATUTOR2:AMBULAE] +~g~Drive the patients to Hospital CAREFULLY. Each bump reduces their chances of survival. + +[A_FULL:AMBULAE] +~r~Ambulance full!! + +[A_FAIL2:AMBULAE] +~r~Your lack of urgency has been fatal to the patient! + +[A_FAIL3:AMBULAE] +~r~The patient is dead!! + +[A_PASS:AMBULAE] +Rescued! + +[A_COMP2:AMBULAE] +You will never get tired! + +[A_CANC:AMBULAE] +~r~Paramedic mission cancelled! + +[A_COMP3:AMBULAE] +Paramedic missions complete! You will never get tired when running! + +[ALEVEL:AMBULAE] +Paramedic Mission Level ~1~ + +[A_FAIL1:AMBULAE] +Paramedic mission ended. + +[A_SAVES:AMBULAE] +PEOPLE SAVED: ~1~ + +[A_COMP1:AMBULAE] +Paramedic missions complete: $~1~ + +{=================================== MISSION TABLE ASSIN1 ===================================} + +[ASM1_5:ASSIN1] +~r~Your target completed his deliveries! + +[ASM1_6:ASSIN1] +Deliveries left: + +[ASM1_7:ASSIN1] +~g~Carl Pearson, Pizza Delivery Man. Kill him before he completes his deliveries. + +[ASM1_A:ASSIN1] +Mr. Teal, your help in eradicating those out-of-towners was invaluable to business. I have more work for you with a more 'hands-on' approach. + +[ASM1_D:ASSIN1] +Mr. Teal, your help in eradicating those out-of-towners was invaluable to business. + +{=================================== MISSION TABLE ASSIN2 ===================================} + +[ASM2_1:ASSIN2] +~g~Mrs. Dawson will be leaving the Jewelry shop in Vice Point soon. Kill her. It must look like a car accident. + +[ASM2_3:ASSIN2] +~g~She's gonna blow! Get out of there! + +[ASM2_4:ASSIN2] +~r~You smashed up her car when she wasn't in it! She won't touch it now! + +[ASM2_5:ASSIN2] +~r~She got away! + +[ASM2_6:ASSIN2] +~r~You were too near the scene of the 'accident'! + +[ASM2_7:ASSIN2] +~r~It's supposed to look like an accident! Try ramming her off the road instead! + +[ASM2_8:ASSIN2] +~g~You must make Mrs. Dawson's death look like an accident. Do not use any weapons. + +[ASM2_9:ASSIN2] +~g~You need some wheels for this job! + +[ASM2_10:ASSIN2] +~g~When her car bursts into flames make your self scarce! + +[ASM2_11:ASSIN2] +Help me! + +[ASM2_12:ASSIN2] +Somebody help me! + +[ASM2_13:ASSIN2] +Oh my god! + +[ASM2_A:ASSIN2] +My compliments on a job well done Mr. Teal. My client was very pleased. + +[ASM2_2:ASSIN2] +health: + +{=================================== MISSION TABLE ASSIN3 ===================================} + +[ASM3_11:ASSIN3] +TIME: + +[ASM3_C:ASSIN3] +A European gang plans to hit a bank in Vice City. My employers would rather this didn't happen. + +[ASM3_D:ASSIN3] +Each member of the gang has a cover while they are here in Vice City. Some have menial jobs, others are on vacation. + +[ASM3_E:ASSIN3] +Each target and their likely whereabouts are taped under the phone. + +[ASM3_14:ASSIN3] +~g~Dick Tanner is working for DBP Security in Ocean Drive. + +[ASM3_15:ASSIN3] +~g~Marcus Hammond and Franco Carter are located near the Jewelry shop in Vice Point. + +[ASM3_16:ASSIN3] +~g~Nick Kong is cruising off Washington Beach. + +[ASM3_18:ASSIN3] +~g~Don't get too close to the target or he may spot you! + +[ASM3_19:ASSIN3] +~g~He's seen you! Waste him! + +[ASM3_20:ASSIN3] +~g~They have seen you! Make sure you waste them both! + +[ASM3_21:ASSIN3] +~r~You did not kill all the gang members in time! + +[ASM3_22:ASSIN3] +~g~Don't get too close to the targets or they may spot you! + +[ASM3_12:ASSIN3] +~g~A selection of weapons have been left for you nearby if you require them. You have ~h~9 MINUTES ~g~to kill all members of the gang. + +[ASM3_13:ASSIN3] +~g~Mike Griffin is working on an advertising board in Washington. + +[ASM3_17:ASSIN3] +~g~Charlie Dilson is riding in Washington. + +{=================================== MISSION TABLE ASSIN4 ===================================} + +[ASM4_10:ASSIN4] +~g~Looks like you're not the only one after the briefcase! Get it to Ammu-Nation, quick time! + +[ASM4_12:ASSIN4] +Distance: + +[ASM4_15:ASSIN4] +~g~Get the sniper rifle to your right. + +[ASM4_16:ASSIN4] +~g~Watch the woman on the balcony, she will walk down the escalators and ask someone the time. + +[ASM4_17:ASSIN4] +~g~Once the conversation has finished kill the person she spoke to, but do not kill her. + +[ASM4_18:ASSIN4] +~g~Once the target is dead retrieve his briefcase and take it to Ammu-Nation in Downtown. + +[ASM4_19:ASSIN4] +~g~Keep your distance from the target! Use the distance bar in the upper right corner of the screen. + +[ASM4_20:ASSIN4] +~g~If it gets full he will see you. + +[ASM4_21:ASSIN4] +~g~Get the briefcase! + +[ASM4_22:ASSIN4] +~g~Take the briefcase to Ammu-Nation in Downtown. + +[ASM4_23:ASSIN4] +~g~He has spotted you! Nail him and get the briefcase! + +[ASM4_25:ASSIN4] +~r~You killed the woman you fool! + +[ASM4_26:ASSIN4] +~r~The target has boarded his flight! + +[ASM4_27:ASSIN4] +~r~The target has seen you! You should have kept your distance! + +[ASM4_28:ASSIN4] +~r~The target heard you firing your weapon! + +[ASM4_29:ASSIN4] +~r~Itchy trigger finger? You killed him too soon! + +[ASM4_A:ASSIN4] +Time to fry bigger fish, Mr. Teal. There's a rifle in the foliage to your right. + +[ASM4_B:ASSIN4] +Watch the woman standing on the balcony above the check-in desks. She will walk through the crowd and ask someone the time. + +[ASM4_C:ASSIN4] +You must kill that person, retrieve his case and take it to the location taped under the phone. + +{=================================== MISSION TABLE ASSIN5 ===================================} + +[ASM5_A:ASSIN5] +There is a valuable exchange taking place on the roof of the Cherry Popper Ice Cream Company. + +[ASM5_B:ASSIN5] +Kill everyone involved, steal the merchandise and take it to the helipad at the airport. + +[ASM5_C:ASSIN5] +There is a gate to your left that leads to the back of the factory. + +[ASM5_1:ASSIN5] +~g~Enter the compound behind the Cherry Popper Ice Cream Company The deal is taking place on the roof. + +[ASM5_2:ASSIN5] +~g~Get the merchandise and take it to the helipad at the airport! + +[ASM5_3:ASSIN5] +~g~Take the merchandise to the helipad at the airport! + +{=================================== MISSION TABLE BANKJ1 ===================================} + +[WANTED1:BANKJ1] +~g~Shake the cops and lose your wanted level! + +[BJM1_A:BANKJ1] +Tommy! Hey, Tommy, look at this, this is great! I've got us this minibar installed! + +[BJM1_B:BANKJ1] +We got a whole bar downstairs, Ken. + +[BJM1_C:BANKJ1] +Yeah, yeah, whatever. Well, I got the chalkboard you asked for. + +[BJM1_D:BANKJ1] +Ah, that's the benefit of a law school education: the ability to follow instructions. + +[BJM1_E:BANKJ1] +Now, I need a safe man. + +[BJM1_F:BANKJ1] +Oh, all right, well, let me think...safe, safe, safe, safe - I got it! This guy will blow you away! + +[BJM1_G:BANKJ1] +Ahh, nah, that schmuck. He's on the inside. + +[BJM1_H:BANKJ1] +Where inside? + +[BJM1_I:BANKJ1] +In a police headquarter cell awaiting transfer. + +[BJM1_J:BANKJ1] +I think he's about to get paroled.... + +[BJM1_1:BANKJ1] +~g~Break Cam Jones out of police custody! + +[BJM1_3:BANKJ1] +~g~You will find something useful in the station's locker room. + +[BJM1_21:BANKJ1] +~g~The key card to the cells can be found upstairs in the station. + +[BNK1_7:BANKJ1] +Cam Jones? + +[BNK1_8:BANKJ1] +I'm busting you out! + +[BNK1_10:BANKJ1] +Yeah, that's me.. + +[BNK1_11:BANKJ1] +Whatever you say! + +[BNK1_13:BANKJ1] +I'm gonna be doing a job and you're my safe cracker. + +[BNK1_14:BANKJ1] +Beats losing my ass in a cell! + +[BJM1_22:BANKJ1] +~g~Get Cam back to his house! + +[BJM1_23:BANKJ1] +~g~You need to get the key card first! + +[BNK1_12:BANKJ1] +Lose the heat and get me back to my place! + +[BJM1_20:BANKJ1] +Put the weapon away or face the consequences! + +[BJM1_5:BANKJ1] +Only authorized personnel beyond this point! + +[BJM1_2:BANKJ1] +~r~You were supposed to bust Cam out, not get him killed! + +[BJM1_4:BANKJ1] +He's armed! Kill him! + +{=================================== MISSION TABLE BANKJ2 ===================================} + +[BJM2_A:BANKJ2] +We need a stick up man. You know one? + +[BJM2_B:BANKJ2] +Hey, Tommy, Tommy, Tommy, this stuff keeps you sharp, man. + +[BJM2_C:BANKJ2] +WoooOOOooo! + +[BJM2_D:BANKJ2] +I could be your stick up man! Stick 'em up! Stick 'em up! + +[BJM2_E:BANKJ2] +You ain't a stick up man, you're an idiot. + +[BJM2_F:BANKJ2] +Now get yourself a drink and shut up. + +[BJM2_G:BANKJ2] +Hey, get outta my way! Yeh yeh yeh - ow ow ow! + +[BJM2_H:BANKJ2] +Cam, what do you think? + +[BJM2_I:BANKJ2] +Well, the best shooter in this town is a guy named Cassidy. + +[BJM2_J:BANKJ2] +Is that so? + +[BJM2_K:BANKJ2] +Yeah. A military guy, or he thinks he is. + +[BJM2_L:BANKJ2] +I doubt he was ever in the army, but he certainly knows how to get a hold of guns. + +[BJM2_M:BANKJ2] +He'll be down at the shooting range. + +[BJM2_2A:BANKJ2] +You Phil Cassidy? + +[BJM2_2B:BANKJ2] +Why? + +[BJM2_2C:BANKJ2] +I'm looking for a man who can handle a gun. From this setup, I'm not too convinced. + +[BJM2_2D:BANKJ2] +Son, I could shoot a fly off your head at 80 feet. + +[BJM2_2E:BANKJ2] +Oh really? + +[BJM2_2F:BANKJ2] +Yeah. I learnt in the army. + +[BJM2_2G:BANKJ2] +Fly shooting real popular in the army? Glad I don't pay tax. + +[BJM2_2H:BANKJ2] +You tryin' to be funny kid? + +[BJM2_2I:BANKJ2] +Ha ha ha ha ha! + +[BJM2_2J:BANKJ2] +Let's shoot. + +[BJM2_1:BANKJ2] +~g~Go to Ammu-Nation in Downtown and talk to Phil Cassidy. + +[BJM2_3:BANKJ2] +HIT RATE: ~1~% + +[BJM2_4:BANKJ2] +SCORE ROUND ONE: ~1~ + +[BJM2_6:BANKJ2] +SCORE ROUND TWO: ~1~ + +[BJM2_7:BANKJ2] +TOTAL SCORE FOR SHOOT: ~1~ + +[BJM2_9:BANKJ2] +~g~Get to round two's starting point. + +[BJM2_11:BANKJ2] +~r~Phil's dead! + +[BJM2_12:BANKJ2] +~r~One of the shooters is dead! + +[BJM2_14:BANKJ2] +~g~Move on to the next area! + +[BJM2_15:BANKJ2] +SCORE: + +[BJM2_17:BANKJ2] +~g~Go and talk to Phil. + +[BJM2_18:BANKJ2] +SCORE TO BEAT: + +[BJM2_19:BANKJ2] +~g~Hit as many targets as you can in the time limit! + +[BJM2_22:BANKJ2] +~r~You have left the shooting range! + +[BJM2_23:BANKJ2] +~g~If you leave the shooting range during the competition, you will fail the mission. + +[BJM2_24:BANKJ2] +~g~The closest target is worth one point. + +[BJM2_25:BANKJ2] +~g~The middle target is worth two points. + +[BJM2_27:BANKJ2] +~g~All targets this round are worth one point. + +[BNK2_2:BANKJ2] +AIM 3-2-1 FIRE! + +[BNK2_3:BANKJ2] +AREA CLEAR! + +[BNK2_4:BANKJ2] +Hoooeee! + +[BNK2_5:BANKJ2] +Couldn't hit a barn door! + +[BNK2_7:BANKJ2] +So you wanna do me a favor, and help me put together a job? + +[BNK2_8:BANKJ2] +Son, after shooting like that, if you asked me to be your wife, I'd say yes. + +[BNK2_9A:BANKJ2] +Son, you better get your fancy talking and big ideas and shove 'em where there ain't no sun. You can't shoot nothin'! + +[BNK2_9B:BANKJ2] +You can't shoot nothin'. + +[BJM2_28:BANKJ2] +SCORE ROUND THREE: ~1~ + +[BJM2_20:BANKJ2] +~g~When you run out of ~w~time ~g~or ~w~ammunition ~g~the round is over! + +[BJM2_26:BANKJ2] +~g~The far target is worth three points. + +[BNK2_1:BANKJ2] +LIVE AMMUNITION + +[RANGE_1:BANKJ2] +SCORE FOR SHOOT: ~1~ + +[BJM2_2:BANKJ2] +~g~To exit the round press the ~h~~k~~PED_JUMPING~ ~g~button. + +[BJM2_N:BANKJ2] +Relax + +{=================================== MISSION TABLE BANKJ3 ===================================} + +[BJM3_A:BANKJ3] +Things are starting to come together nicely here. + +[BJM3_B:BANKJ3] +What's the plan, Tommy? Que pasa, amigo? + +[BJM3_C:BANKJ3] +The plan is you keep doing that like a moron. Anyhow, we need a driver. + +[BJM3_D:BANKJ3] +Tommy, I'll do it. I can drive. + +[BJM3_E:BANKJ3] +You want Hilary, mister. Not some smart-talking law school chump. + +[BJM3_F:BANKJ3] +Hilary's the real deal. You ain't never seen anyone drive so fast. I'll give him a call here. + +[BJM3_G:BANKJ3] +Hey Hil, it's Phil. How's it going? No. don't talk. We'll reminisce later. You want to do me a favor? + +[BJM3_H:BANKJ3] +I got me a guy from up north. No, no, I don't think he was in the service, but he wants a driver. + +[BJM3_I:BANKJ3] +For a bit of action. Okay, I understand. + +[BJM3_J:BANKJ3] +What'd he say? + +[BJM3_K:BANKJ3] +Well, he'll do it, no problem. Well, there might be a little problem - see, he has abandonment issues. + +[BJM3_L:BANKJ3] +Seems he won't work for anyone who can't beat him. Something to do with his momma. + +[BJM3_M:BANKJ3] +Anyway, he wants to race you first, said he'd meet you outside.. + +[BJM3_2A:BANKJ3] +You Tommy? Of course you're Tommy, I mean, + +[BJM3_2B:BANKJ3] +Why else would anyone want to speak to me? + +[BJM3_2C:BANKJ3] +OK. Consider it this way - + +[BJM3_2D:BANKJ3] +I'll drive for you IF, and only IF, you can drive properly. + +[BJM3_2E:BANKJ3] +Leave me alone - and I'll never forgive you. + +[BJM3_2:BANKJ3] +~r~Hilary is dead! + +[BJM3_4:BANKJ3] +~g~You need a car to take part! + +[BNK3_1:BANKJ3] +Ok. I'll drive for you, but please, treat me bad. + +[BNK3_3A:BANKJ3] +Illegal street race in progress at Vice Point. + +[BNK3_3B:BANKJ3] +Calling all officers. + +[BNK3_3C:BANKJ3] +Street racers, this is illegal and forbidden! + +{=================================== MISSION TABLE BANKJ4 ===================================} + +[BNK4_A:BANKJ4] +~w~As you can see, gentlemen, this is going to be the easiest buck we ever made. + +[BNK4_B:BANKJ4] +~w~Tommy, seriously, you gotta consider going into law. + +[BNK4_C:BANKJ4] +~w~What the hell are you smoking, man? This ain't no simple plan! + +[BNK4_D:BANKJ4] +~w~Well, who needs a simple plan anyway? + +[BNK4_E:BANKJ4] +~w~Take communism, now that was a simple plan. Didn't do Russia any favors, huh? + +[BNK4_F:BANKJ4] +~w~Calm down, all right? With a team like this it's going to be no problem. + +[BNK4_G:BANKJ4] +~w~We got Cam on safe. Phil? You and me will handle security, and Hilary'll drive the getaway car. + +[BNK4_H:BANKJ4] +~w~Uh, heh heh, aren't you forgetting somebody? Somebody who helped you to no end in this town? Somebody who... + +[BNK4_I:BANKJ4] +~w~Ken... Ken, that's right. Ken here, he washes the money for us and he keeps the drinks on ice. + +[BNK4_J:BANKJ4] +~w~I don't understand what I am supposed to be doing here. + +[BNK4_K:BANKJ4] +~w~Look, it's easy. Haven't you ever seen a movie? + +[BNK4_L:BANKJ4] +~w~We walk into the bank, we wave the gun around, and leave very rich men. + +[P_DEAD:BANKJ4] +~r~Phil's dead!! + +[C_DEAD:BANKJ4] +~r~Cam's dead!! + +[H_DEAD:BANKJ4] +~r~Hilary's dead!! + +[P_HIND:BANKJ4] +~r~You've lost Phil! + +[C_HIND:BANKJ4] +~r~Cam's been left behind! + +[H_HIND:BANKJ4] +~r~Hilary's been abandoned! + +[GETCAR:BANKJ4] +~g~Get in the getaway car to do the bank job! + +[TRASHED:BANKJ4] +~r~YOU TRASHED THE GETAWAY CAR!! + +[BNK4_1:BANKJ4] +I'll drive. + +[BNK4_2:BANKJ4] +Great. A passenger. Wait 'til I tell the group about this. + +[BNK4_3A:BANKJ4] +Hey, watch the wheels, Tommy! + +[BNK4_3B:BANKJ4] +Tommy, Hilary's taking up too much room! + +[BNK4_3C:BANKJ4] +I am not! + +[BNK4_3D:BANKJ4] +Are too! + +[BNK4_3E:BANKJ4] +Hey, shut up you two, or you can get out and walk. + +[BNK4_3F:BANKJ4] +Yeah - HILARY. + +[BNK4_3I:BANKJ4] +For god's sake, Phil, stop waving that thing around! + +[BNK4_3J:BANKJ4] +Yeah, you'll have somebody's eye out! + +[BNK4_3M:BANKJ4] +The car's ruined. RUINED! + +[BNK4_3O:BANKJ4] +You cling to an illusion of permanence. + +[BNK4_3P:BANKJ4] +What? + +[BNK4_3Q:BANKJ4] +You think all things will last. + +[BNK4_3R:BANKJ4] +Youth, loved ones, pizza, + +[BNK4_3S:BANKJ4] +All will pass or end and you must accept that. + +[BNK4_3T:BANKJ4] +You're right. Thanks, Cam. + +[BNK4_3U:BANKJ4] +Don't mention it. + +[BNK4_3V:BANKJ4] +Hey Tommy, why have we stopped? + +[BNK4_4A:BANKJ4] +~w~Keep driving around the block, OK? + +[BNK4_5:BANKJ4] +~w~Okay, Tommy, Okay. + +[BNK4_6:BANKJ4] +~w~THIS IS A RAID! + +[BNK4_7:BANKJ4] +~w~NOBODY MOVE! + +[BNK4_8:BANKJ4] +~w~EVERYBODY UP AGAINST THAT WALL! + +[BNK4_9:BANKJ4] +Phil, hold down the fort! + +[BNK4_10:BANKJ4] +Wilco roger that! + +[BNK4_11:BANKJ4] +Come on Cam, the vault's upstairs... + +[BK4_12A:BANKJ4] +Damn! It's a Flange 9000! + +[BK4_12B:BANKJ4] +This could take hours to crack, + +[BK4_12C:BANKJ4] +Or five minutes if you could find the manager. + +[BNK4_13:BANKJ4] +I'll go find where he's holed up. + +[BK4_14A:BANKJ4] +Phil, things still sweet? + +[BNK4_15:BANKJ4] +Sure. Everything's reeaal quiet. + +[BNK4_16:BANKJ4] +You - you're coming with me! + +[BNK4_17:BANKJ4] +Ok! Ok! Just don't shoot! + +[BNK4_18:BANKJ4] +I SAID NOBODY MOVE! + +[BK4_19A:BANKJ4] +It's on a time lock, + +[BK4_19B:BANKJ4] +You might as well give up now! + +[BK4_20A:BANKJ4] +Hell, I can bypass the time lock, + +[BK4_20B:BANKJ4] +Then we just need your key code and we're good! + +[BNK4_21:BANKJ4] +Stay here. You try anything and you're dead. + +[BNK422A:BANKJ4] +Cam, how long? + +[BK4_23A:BANKJ4] +Give me 5 minutes! + +[BK4_24A:BANKJ4] +I'm gonna check on Phil, I'll be right back. + +[BK4_24B:BANKJ4] +I told you not to touch that alarm! + +[BNK4_25:BANKJ4] +The SWAT team will be here any minute! + +[BNK4_27:BANKJ4] +I could do with some help here, Tommy! + +[BNK4_28:BANKJ4] +Vice City S.W.A.T! You are completely surrounded! + +[BNK4_29:BANKJ4] +Surrounded? HA HA HA HAAAAAaaa! + +[BNK4_30:BANKJ4] +They're crapping themselves, corrupt bastards! + +[BK4_31A:BANKJ4] +Tommy! The vault's open! + +[BK4_34A:BANKJ4] +Ok, we got the SWAT retirement fund. Let's get out of here! + +[BK4_34B:BANKJ4] +Ok, you asked for it! You've had your last chance! + +[BK4_35A:BANKJ4] +They're storming the place! + +[BK4_35B:BANKJ4] +Take cover! + +[BNK4_94:BANKJ4] +~w~Ok, guys. Nice an easy just as we planned. + +[BM_DEAD:BANKJ4] +~r~You needed the bank manager alive!! + +[ASSET_A:BANKJ4] +BANK HEIST ASSET COMPLETED! + +[ASSET_B:BANKJ4] +~g~The Malibu Club will now generate revenue up to a maximum of $~1~ per day. Pick up your cash regularly! + +[IDIOT:BANKJ4] +~r~ That's right, just wander about dressed like a lunatic and draw attention to yourself, IDIOT! + +{=================================== MISSION TABLE BARON1 ===================================} + +[COK1_A:BARON1] +Come on, baby, go! Yeah! Yeah! Arrrrr! + +[COK1_B:BARON1] +Stupid horse! I'll chop your head off! Grrrrr... + +[COK1_C:BARON1] +Who is this dickhead? + +[COK1_D:BARON1] +Tommy Vercetti. You remember me. + +[COK1_E:BARON1] +Excuse me. I'm a little anxious. Never trust a goddamn horse! + +[COK1_F:BARON1] +You do a good job - you work for me now. + +[COK1_H:BARON1] +As I said, amigo, you work for me now. Shut up. Some Judas has betrayed me. + +[COK1_I:BARON1] +He thinks I don't know how much money I should be making, but stealing 3% is as good as stealing 100%. + +[COK1_J:BARON1] +No one does this to me. NO ONE!! + +[COK1_K:BARON1] +You follow him from his apartment and you see where he goes! Later, we will kill him. + +[COK1_1:BARON1] +Ooh shit! + +[COK1_2:BARON1] +Too slow grandad! + +[COK1_4:BARON1] +Loser. + +[COK1_5:BARON1] +You better keep on running, asshole! + +[COK1_8:BARON1] +~g~Quick! Grab some wheels and follow him! + +[COK1_9:BARON1] +~r~You're supposed to follow him, not kill him! + +[COK1_10:BARON1] +~g~Go to the thief's house and find out where he's stashing the money. + +[COK1_11:BARON1] +~g~Have a look through his window. + +[COK1_7:BARON1] +~g~He's escaped to the roof, keep on his tail but don't kill him! + +[COK1_G:BARON1] +I work for money. + +{=================================== MISSION TABLE BARON2 ===================================} + +[COK2_A:BARON2] +What kind of incompetent fool are you? + +[COK2_B:BARON2] +FOOL! FOOL! FOOL! FOOL! + +[COK2_C:BARON2] +Tommy! + +[COK2_D:BARON2] +What, Ricardo? + +[COK2_E:BARON2] +These idiots - they always trying to screw you. + +[COK2_F:BARON2] +That's the problem with this business. + +[COK2_G:BARON2] +What do you think you're doing? + +[COK2_H:BARON2] +These pricks have failed me miserably, + +[COK2_I:BARON2] +Soon any mom and pop will think they can sell gallo in Vice City. + +[COK2_J:BARON2] +What next, huh? The stinking Mafia?! + +[COK2_K:BARON2] +That gang place is a fortress at ground level, + +[COK2_L:BARON2] +so Quentin here - Quentin! QUENTIN! + +[COK2_M:BARON2] +He'll fly you over the area! + +[COK2_N:BARON2] +Eradicate them! + +[COK2_O:BARON2] +What do you think you're doing? + +[COK2_P:BARON2] +What are you doing here? + +[COK2_Q:BARON2] +Hey, I've been asking around and it's obvious + +[COK2_R:BARON2] +that Diaz jumped the deal and iced my brother. + +[COK2_S:BARON2] +And he'll kill you, too! + +[COK2_T:BARON2] +I can take Diaz! + +[COK2_U:BARON2] +No - listen to me! I'll handle Diaz - + +[COK2_1:BARON2] +One thing puzzling me, What's with 'Quentin!? + +[COK2_2:BARON2] +I dunno, I always kinda liked it...Quentin Vance... + +[COK2_3:BARON2] +Vance? Your name's Lance Vance? + +[COK2_4:BARON2] +Hey! I got enough of that at school! + +[COK2_5:BARON2] +You ever fired one of those from a whirly? + +[COK2_8:BARON2] +Where the hell are we headed anyway? + +[COK2_9:BARON2] +Prawn Island. + +[COK2_13:BARON2] +Lance Vance. Poor bastard. + +[COK2_14:BARON2] +Ok, we're almost there. + +[COK2_15:BARON2] +We'll make a couple of passes. + +[COK2_16:BARON2] +So take out as many guns as you can. + +[COK2_17:BARON2] +Then I'll set you down and you're on your way. + +[COK2_20:BARON2] +Damn! This is a war zone! Take out some of those gunmen! + +[COK2_21:BARON2] +We're taking hits here, man! + +[COK2_22:BARON2] +This thing ain't cheap to fix! Take them out! + +[COK2_23:BARON2] +Ok, you're on your own from here! Good luck, brother! + +[COK2_24:BARON2] +Heli Health: + +[COK2_25:BARON2] +~g~Go and collect the money on the roof. + +[COK2_27:BARON2] +You're on MY turf asshole! + +[COK2_28:BARON2] +You're going down! + +[COK2_6:BARON2] +No. I'll get a bit of practice on the way though. + +[OPEN_B:BARON2] +The road blocks to the mainland have now been removed + +[COK2_V:BARON2] +- he's beginning to trust me. + +{=================================== MISSION TABLE BARON3 ===================================} + +[COK3_A:BARON3] +Not so pleased with your selves NOW, huh! + +[COK3_B:BARON3] +Ahahahahaa, Ahahahahaa. + +[COK3_C:BARON3] +Whoa! Watch where you're waving that thing! + +[COK3_D:BARON3] +No more pigeon shit on MY car, eh Tommy! + +[COK3_E:BARON3] +Guess not. + +[COK3_F:BARON3] +You're damn right. Now listen, + +[COK3_G:BARON3] +you know who owns the fastest boat on the east coast? + +[COK3_H:BARON3] +Not off hand, no. + +[COK3_I:BARON3] +ME. And I want it to stay that way. + +[COK3_J:BARON3] +Every smuggler from here to Caracas has one dream, a faster boat. + +[COK3_K:BARON3] +Rumor has it the boatyard has just completed such a vessel. + +[COK3_L:BARON3] +for some Costa Rican dickhead. + +[COK3_M:BARON3] +And Tommy...I WANT THAT BOAT!!! + +[COK3_N:BARON3] +I think your pigeons are back. + +[COK3_O:BARON3] +Ah! I thought I got you. Where'd you come from? + +[COK3_P:BARON3] +Pigeons! Boom! Aaaaah! + +[COK3_5:BARON3] +~g~Find the switch to lower the boat. + +[COK3_6:BARON3] +~g~Get the boat to the mansion. + +[COK3_7:BARON3] +~r~You destroyed the boat! + +[COK3_8:BARON3] +~g~Go to the boatyard at the docks and steal the fastest boat. + +[COK3_9:BARON3] +~g~Now get into the boat. + +{=================================== MISSION TABLE BARON4 ===================================} + +[COK4_A:BARON4] +Eject! PLASTIC CRAP! + +[COK4_B:BARON4] +You doing this to me? + +[COK4_C:BARON4] +Who do you think you are, you piece of plastic SHIT? Aaarrgh! + +[COK4_D:BARON4] +SCREW YOU! + +[COK4_E:BARON4] +It eats my favorite El burro movie, it die! + +[COK4_F:BARON4] +What else could I do? + +[COK4_G:BARON4] +It's probably not plugged in. + +[COK4_H:BARON4] +What? + +[COK4_I:BARON4] +Damn - no matter, I can buy a hundred more. + +[COK4_J:BARON4] +Now Tommy, + +[COK4_K:BARON4] +each month a freelancer sails into Vice City and moors his yacht. + +[COK4_L:BARON4] +He sells his cargo to the first boat. + +[COK4_M:BARON4] +I want you to take the speedboat + +[COK4_N:BARON4] +and beat all the other shitheads to it, + +[COK4_O:BARON4] +then you bring the cargo here, ok!? + +[COK4_P:BARON4] +Let me guess, you thought I could use a guardian angel. + +[COK4_Q:BARON4] +I'm just saying you need to let me in there, my man. + +[COK4_T:BARON4] +and you're probably gonna wanna kiss me! + +[COK4_U:BARON4] +Wacko. + +[COK4_V:BARON4] +Hahahahahaha! + +[COK4_1:BARON4] +So Tommy, we know it was Diaz busted our deal.. + +[COK4_3:BARON4] +So why the hell are we running errands for him? + +[COK4_4:BARON4] +The more we learn now, the less we have to learn when we take this town over! + +[COK4_5:BARON4] +I like your style, man. Real fresh. + +[COK4_12:BARON4] +Watch yourself, they're coming from all over! + +[COK4_13:BARON4] +Got 'em. Head for Diaz's as fast as you can! + +[COK4_14:BARON4] +You want some of this?! + +[COK4_15:BARON4] +Sleep with the fish! + +[COK4_16:BARON4] +Eat it! EAT IT! + +[COK4_19:BARON4] +More trouble up ahead! + +[COK4_20:BARON4] +There are gunmen on that jetty! + +[COK4_24:BARON4] +Good shooting, my friend. You're a real, proper, grade A lunatic. + +[COK4_25:BARON4] +Well, thank you. + +[COK4_26:BARON4] +See you around, Tommy. + +[COK4_27:BARON4] +Okay, Mr. Lance Vance Dance. + +[COK4_28:BARON4] +~g~Get to the yacht before the other boats do! + +[COK4_31:BARON4] +~g~Go to the fastest boat at the jetty! + +[COK4_32:BARON4] +~r~Too slow! + +[COK4_33:BARON4] +~r~You destroyed the boat! + +[COK4_34:BARON4] +~g~Take those boats out! + +[COK4_35:BARON4] +Boat health: + +[COK4_R:BARON4] +Now you can feed me all this 'lonely tough guy' crap, + +[COK4_S:BARON4] +but I know one day I'm gonna save your ass, + +{=================================== MISSION TABLE BARON5 ===================================} + +[PROP_A:BARON5] +PROPERTY ACQUIRED! + +[COK4_30:BARON5] +~r~Lance is dead! + +[ASS1_A:BARON5] +I got us some cannons in the trunk. + +[ASS1_B:BARON5] +Holy shit! Where'd you get all this stuff? + +[ASS1_C:BARON5] +Been saving it for a rainy day. + +[ASS1_D:BARON5] +You like? + +[ASS1_E:BARON5] +Yeah, I like. + +[ASS1_F:BARON5] +You stupid pricks... + +[ASS1_G:BARON5] +my beautiful house + +[ASS1_H:BARON5] +look what you've done to it! + +[ASS1_I:BARON5] +This is for my brother! + +[ASS1_J:BARON5] +I trusted you, Tommy. + +[ASS1_K:BARON5] +I woulda had you made... + +[ASS1_L:BARON5] +Say goodnight, Mr. Diaz. + +[ASS1_1:BARON5] +This place is going to be crawling with assholes...be careful... + +[ASS1_2:BARON5] +Don't worry Tommy, I'll cover you. + +[ASS1_13:BARON5] +DIAZ?! I've come to take over your business! + +[ASS1_15:BARON5] +~g~Storm the mansion and kill Diaz! + +[ASS1_16:BARON5] +~g~Kill Diaz! + +[ASS1_17:BARON5] +~g~There are multiple routes into the mansion. + +[BUD1:BARON5] +Lances Health: + +[ASS1_18:BARON5] +~g~The door is locked, try another route. + +[ASS1_19:BARON5] +This way! + +[ASS1_14:BARON5] +TOMMY! You betrayed me, you idiot! I'm gonna kill you real soon.. + +[ASS1_20:BARON5] +Tommy, my problem with Quentin, not wit you, man! + +{=================================== MISSION TABLE BIKE1 ===================================} + +[BM1_A:BIKE1] +Where's Baker? + +[BM1_B:BIKE1] +I'm looking for Big Mitch Baker... + +[BM1_C:BIKE1] +Who's lookin'? + +[BM1_D:BIKE1] +Tommy Vercetti. + +[BM1_E:BIKE1] +Vercetti + +[BM1_F:BIKE1] +You don't look like the law, so that's bought you a minute. + +[BM1_G:BIKE1] +You better talk fast. + +[BM1_H:BIKE1] +Kent Paul said you might be interested in pulling security for a gig he's got set up. + +[BM1_I:BIKE1] +Kent Paul? Sheesh! No wonder he sent ya. + +[BM1_J:BIKE1] +The last time he was here he left through the window in nothing but his limey birthday suit. + +[BM1_K:BIKE1] +Are you interested or not? + +[BM1_L:BIKE1] +We only do favors for our own. + +[BM1_M:BIKE1] +How do I join? + +[BM1_N:BIKE1] +This ain't no country club, boy. Can you handle a bike? + +[BM1_O:BIKE1] +Can you sit on a stool and drink? + +[BM1_P:BIKE1] +Cougar, Zeppelin, go see how this girl handles a bike... + +[BM1_3:BIKE1] +~r~The racers have been attacked! + +[BIKE1_1:BIKE1] +All right, fancy clothes. Let's see what you can do. + +[BM1_1:BIKE1] +~g~Get a Freeway or an Angel and get to the starting grid. + +[BM1_2:BIKE1] +~g~You need a Freeway or an Angel to compete! + +{=================================== MISSION TABLE BIKE2 ===================================} + +[BM2_1:BIKE2] +CHAOSMETER: + +[BM2_A:BIKE2] +Ah, got ya again. + +[BM2_B:BIKE2] +Hey Vercetti. + +[BM2_C:BIKE2] +Cougar says you can handle a bike pretty good. + +[BM2_D:BIKE2] +Yeah, how many more errands am I gonna to have to run? + +[BM2_E:BIKE2] +I'm a very busy man. + +[BM2_F:BIKE2] +If it's a fight that's gonna settle this then bring it on. + +[BM2_G:BIKE2] +Being one of us ain't just about brawlin'. It's about being part of a family. + +[BM2_H:BIKE2] +Yeah, I've been part of a family before alright. It didn't work out. + +[BM2_I:BIKE2] +Yeah, right, but this family takes care of its own. + +[BM2_J:BIKE2] +We don't ask a man to do the dirty work and then let him do fifteen years hard time. + +[BM2_K:BIKE2] +Yeah, that's right. I've done my homework. + +[BM2_L:BIKE2] +This here's the biggest family of misfits, outcasts and badasses. + +[BM2_M:BIKE2] +Hell, some of us has even been betrayed by our own country. + +[BM2_N:BIKE2] +I was locked up during 'Nam. Ugly business. + +[BM2_O:BIKE2] +Which is why I'm gonna ask you to go mess with the man. + +[BM2_Q:BIKE2] +So get out there, grab a bike and show this city how pissed you are! + +[BM2_R:BIKE2] +Alright, alright. + +[BM2_3:BIKE2] +~g~This sound indicates that you have filled a part of the meter, continue to do so. + +[BM2_2:BIKE2] +~g~You must fill the Chaos Meter in the time given to show us how much of a badass you are! + +[BM2_4:BIKE2] +~r~You failed to fill the Chaos Meter in time! + +[BM2_P:BIKE2] +This whole damn country needs a kick in the ass, and we're the ones to deliver it. + +{=================================== MISSION TABLE BIKE3 ===================================} + +[BM3_A:BIKE3] +Hey there, Mitch. + +[BM3_B:BIKE3] +Well, if it ain't 'bad ass' Vercetti. + +[BM3_C:BIKE3] +Now I wanna see how good you can fight for your patch. + +[BM3_D:BIKE3] +A local street gang made the mistake of stealing my hog... + +[BM3_E:BIKE3] +probably because of some machismo thing or somethin'. + +[BM3_F:BIKE3] +Me and the boys would go over there and teach them a lesson in respect an'all. + +[BM3_G:BIKE3] +Anyways. + +[BM3_H:BIKE3] +Then I got to thinking - this would make a good initiation for you. + +[BM3_I:BIKE3] +You get my bike back, you can tell Paul he's got his security. + +[BM3_2:BIKE3] +~r~You were supposed to bring the bike back, not destroy it! + +[BM3_3:BIKE3] +~g~Get the bike back to the bar! + +[BM3_4:BIKE3] +~g~Get on the bike! + +[INTRUDE:BIKE3] +~g~You've been spotted! + +[BM3_6:BIKE3] +~g~They are holed up behind Ammu-Nation in the Downtown area. + +[BM3_7:BIKE3] +~g~You will need a fast bike to gain access to the roof. + +[BM3_8:BIKE3] +~g~Use the bike to jump from these stairs to the roof on the far side of the road. + +[BM3_1:BIKE3] +~g~A local gang has stolen Mitch Baker's Angel. Get it back! + +[BM3_9:BIKE3] +~g~Get Mitch's Angel and get out of there! + +{=================================== MISSION TABLE BMX_1 ===================================} + +[GETBIK2:BMX_1] +~r~You have ~w~~1~ seconds ~g~to get on a Dirt Bike! + +{=================================== MISSION TABLE BOATBUY ===================================} + +[DRUG_2:BOATBUY] +Put it out. There's a dude here. + +[DRUG_3:BOATBUY] +Hey suit dude! I guess you're the new owner? + +[DRUG_4:BOATBUY] +Yeah. Which one of the boats is the fastest? + +[DRUG_5:BOATBUY] +It's already in the water, dude, + +[DRUG_6:BOATBUY] +I though you might want to try her out. + +[DRUG_7:BOATBUY] +Dude, she's already running with a 300 horse power engine... + +[DRUG_8:BOATBUY] +...and the fiberglass hull, she just shoots through the waves.! + +[DRUG_9:BOATBUY] +She can do like zero to sixty in four seconds flat dude... + +[DRUG_10:BOATBUY] +and she can hold like twenty bales of the best Jamaican smoke right in the hull! + +[DRUG_11:BOATBUY] +So go ahead dude, she's ready to fly! + +[DRUG_12:BOATBUY] +Yo yo, uh, suit dude, you gotta light? + +[DRUG_1:BOATBUY] +Hello? Hel-lo?! Hello? + +[DRUG_13:BOATBUY] +Dude? + +{=================================== MISSION TABLE CAP_1 ===================================} + +[CAP1_B1:CAP_1] +~g~The Mafia is taxing your businesses. Find them and kill them. + +[CAP1_B2:CAP_1] +~g~The Mafia has taxed the Boatyard! + +[CAP1_B3:CAP_1] +~g~The Mafia has taxed the Ice Cream Factory! + +[CAP1_B4:CAP_1] +~g~The Mafia has taxed the Car Showroom! + +[CAP1_B5:CAP_1] +~g~The Mafia has taxed the Taxi Firm! + +[CAP_01:CAP_1] +Ok, what's the emergency? + +[CAP_02:CAP_1] +WHO? + +[CAP_03:CAP_1] +Tommy...some mob thugs ...said they'd come to take their cut... + +[CAP_04:CAP_1] +...said it was a Mr. Forello's money...I feel like crap. + +[CAP_05:CAP_1] +Forelli? SONNY Forelli? + +[CAP_06:CAP_1] +Yeah, that's the guy...I think...they were very insistent... + +[CAP_07:CAP_1] +Don't you worry, pop, I'm not angry with you. + +[CAP_08:CAP_1] +Get him to the hospital. + +[CAP_09:CAP_1] +Tommy...rip that guy a new asshole for me... + +[CAP_10:CAP_1] +I'm gonna rip him two! + +[CAP1_2:CAP_1] +You know the rules, Vercetti! + +[CAP1_3:CAP_1] +Mr. Forelli sends his regards! + +[CAP1_4:CAP_1] +It's the Harwood Butcher! + +[CAP1_5:CAP_1] +You tell Sonny - stay away! + +[CAP1_6:CAP_1] +Vice City is MINE now, NOT his. + +[CAP1_7:CAP_1] +You think you can take me down, Vercetti? + +[CAP1_8:CAP_1] +We'll keep coming after you until you die, Vercetti. + +[CAP1_9:CAP_1] +You don't stand a chance, you psychotic prick. + +[CAP1_10:CAP_1] +I'll murder you Vercetti. + +[CAP1_11:CAP_1] +You always were a jerk. + +[CAP1_12:CAP_1] +You're going to die, Vercetti. + +[CAP1_B6:CAP_1] +~g~You have found the collector, kill him. + +[CAP1_B7:CAP_1] +~g~You've lost the collector. + +[CAP1_B8:CAP_1] +~r~The collector has taxed all of your businesses. + +[CAP1_B9:CAP_1] +~g~The mafia has taxed The Malibu! + +[CAP1_B0:CAP_1] +~g~The mafia has taxed the film studio! + +[CAP1_C2:CAP_1] +~g~The Mafia has arrived at the Boatyard! + +[CAP1_C3:CAP_1] +~g~The Mafia has arrived at the Ice Cream Factory! + +[CAP1_C4:CAP_1] +~g~The Mafia has arrived at the Car Showroom! + +[CAP1_C5:CAP_1] +~g~The Mafia has arrived at the Taxi Firm! + +[CAP1_C9:CAP_1] +~g~The Mafia has arrived at The Malibu! + +[CAP1_C0:CAP_1] +~g~The Mafia has arrived at the film studio! + +[CAP1_D2:CAP_1] +~g~The Mafia is leaving the Boatyard! + +[CAP1_D3:CAP_1] +~g~The Mafia is leaving the Ice Cream Factory! + +[CAP1_D4:CAP_1] +~g~The Mafia is leaving the Car Showroom! + +[CAP1_D5:CAP_1] +~g~The Mafia is leaving the Taxi Firm! + +[CAP1_D9:CAP_1] +~g~The Mafia is leaving The Malibu! + +[CAP1_D0:CAP_1] +~g~The Mafia is leaving the film studio! + +[CAP1B10:CAP_1] +You've capped the Collectors. More are on their way. + +{=================================== MISSION TABLE CARBUY ===================================} + +[CAR1_1:CARBUY] +B.J. Smith. And you must be Mr. Vercetti. + +[CAR1_2:CARBUY] +Would you like the tour? + +[CAR1_3:CARBUY] +Might as well. + +[CAR1_4:CARBUY] +Well, I'm very sad to be selling the dealership to y'all. + +[CAR1_5:CARBUY] +This was my first investment after I turned pro. + +[CAR1_6:CARBUY] +But now it's time for me to move on. + +[CAR1_7:CARBUY] +You're leaving town? + +[CAR1_8:CARBUY] +Not in too much of a hurry, I hope? + +[CAR1_9:CARBUY] +No. I'm just coming out of retirement, and preparing for my future comeback. + +[CAR1_10:CARBUY] +The business wasn't too strong, + +[CAR1_11:CARBUY] +and my staff took it upon themselves to get a bit more + +[CAR1_12:CARBUY] +creative with the generation of wealth. + +[CAR1_13:CARBUY] +Obviously, I could wind down the business before I hand it over. + +[CAR1_14:CARBUY] +Hell, I could burn the place down if I wanted to. + +[CAR1_15:CARBUY] +This is prime development land. + +[CAR1_16:CARBUY] +Oh, I wouldn't worry about any of that. + +[CAR1_17:CARBUY] +This place seems perfect. + +[CAR1_18:CARBUY] +Yeh it does, So I take it we have a deal? + +{=================================== MISSION TABLE CARPAR1 ===================================} + +[MM_1_A:CARPAR1] +~g~Collect ~y~5 checkpoints~r~ WITHOUT ~g~smashing any ~r~CONES! ~g~You may collect checkpoints in ~y~ANY ORDER. + +[CONE_1:CARPAR1] +~r~You smashed a cone!! + +[MM_1_C:CARPAR1] +~y~PASS THROUGH~g~ a checkpoint to start the timer. ~g~Each checkpoint will credit you with ~y~~1~ SECONDS~g~. + +{=================================== MISSION TABLE COPCAR ===================================} + +[KILLS:COPCAR] +KILLS: + +[C_BREIF:COPCAR] +~g~Suspect last seen in the ~a~ area. + +[COPCART:COPCAR] +~g~You have ~1~ seconds to return to a police vehicle before the mission ends. + +[C_CANC:COPCAR] +~r~Vigilante mission cancelled! + +[C_TIME:COPCAR] +~r~Your time as a law enforcer is over! + +[C_COMP1:COPCAR] +Vigilante mission level 12 complete: Your max Body Armor increased to 150 + +[CLEVEL:COPCAR] +Vigilante Mission Level ~1~ + +[C_PASS:COPCAR] +THREAT ELIMINATED: $ ~1~ + +{=================================== MISSION TABLE COUNT1 ===================================} + +[CM1_A:COUNT1] +Mr. Vercetti? Hey. You bought the old print works? + +[CM1_B:COUNT1] +Yeah, my old man used to work on these. + +[CM1_C:COUNT1] +I was going to follow him in his trade, but...I lived a different life. + +[CM1_D:COUNT1] +You planning on selling the old machinery, breaking it down? + +[CM1_E:COUNT1] +I'm thinking we might print something - a newspaper, a magazine... + +[CM1_F:COUNT1] +Oh, crap, sonny, low grade crap. I've always fancied printing money. It ain't too hard. + +[CM1_G:COUNT1] +You know, I've been doing it on a small scale for years. + +[CM1_H:COUNT1] +Really? + +[CM1_I:COUNT1] +Sure. But we'd need some good quality plates. + +[CM1_J:COUNT1] +Of course! There's a counterfeiting syndicate already operating in Florida. + +[CM1_K:COUNT1] +A syndicate? + +[CM1_L:COUNT1] +Yeah. Just rumors is all I've heard. + +[CM1_M:COUNT1] +I know a man who's good with rumors... + +[CM1_N:COUNT1] +I used to spend the evenings with him, cleaning the rollers... + +[CM1_2A:COUNT1] +Look at the arse on that! + +[CM1_2B:COUNT1] +Awright girl, it's your loss mate init! + +[CM1_2C:COUNT1] +Awright me ol'china, how's it hangin'? + +[CM1_2D:COUNT1] +What do you know about counterfeiting? + +[CM1_2E:COUNT1] +Oh I'm fine Paul, how 'bout you? + +[CM1_2F:COUNT1] +Come 'ere! + +[CM1_2G:COUNT1] +Awright! Awright! Awright!! You're obviously a busy man. + +[CM1_2H:COUNT1] +All I know about dodgy readys is the Triads supply the plates. + +[CM1_2I:COUNT1] +They've got a shipping company down the docks, + +[CM1_2J:COUNT1] +the boss man would know when the plates are coming in next! + +[CM1_2K:COUNT1] +Thanks Paul. + +[CM1_2L:COUNT1] +What's the matter with you, you maniac! + +[CM1_2M:COUNT1] +Give me another drink, lively! + +[CM1_3:COUNT1] +~g~You've been spotted! + +[CM1_5:COUNT1] +~g~Go and meet Kent Paul at the Malibu Club! + +[CNT1_1:COUNT1] +Who are you? Oooof! Aaiieee! Not the face! Not the face! + +[CM1_1:COUNT1] +~g~Go to the Chartered Libertine Lines boat at the docks. + +[CM1_2:COUNT1] +~g~The Shipping Officer will have the information that is required. + +[CNT1_2:COUNT1] +Ok, I talk! I talk! + +[CM1_6:COUNT1] +~g~Get the information back to the Print Works! + +{=================================== MISSION TABLE COUNT2 ===================================} + +[CNT2_B1:COUNT2] +Alright, the courier's moving the plates from the docks today. + +[CNT2_B2:COUNT2] +I'm gonna go intercept them, grab the plates, lose any heat, and make my way back here. + +[CNT2_B3:COUNT2] +Now. Depending how well this goes, + +[CNT2_B4:COUNT2] +we may have five minutes to print the money before the counterfeit syndicate finds us, or we may have all year. + +[CNT2_B5:COUNT2] +Either way, I want green rolling off the presses five minutes after I get back. Got it? + +[CNT2_B6:COUNT2] +Don't you worry Tommy. We'll be ready. + +[CNT2_B7:COUNT2] +Me an'the boys will be around in the neighborhood case you need any heat taken care of. + +[CNT2_B8:COUNT2] +All right, everybody cool? All right. I'll catch you later... + +[CNT2_01:COUNT2] +~g~The counterfeit plates ~y~courier~g~ is arriving at the ~r~docks~g~ in a helicopter any second now. + +[CNT2_02:COUNT2] +~r~The plates courier has fled in the helicopter. + +[CNT2_03:COUNT2] +~r~The courier has arrived at his destination safely, you're too late! + +[CNT2_04:COUNT2] +~r~You destroyed the plates in the explosion! + +[CNT2_05:COUNT2] +~g~You have the counterfeit plates. Take them to the print works. + +[CNT2_06:COUNT2] +~g~The courier has died and dropped the plates, get to them before anyone else. + +[CNT2_07:COUNT2] +~g~One of the guards has picked up the plates, don't let 'em get away. + +[CNT2_08:COUNT2] +~g~The ~r~courier~g~ with the plates has arrived at the docks. + +[CNT2_4:COUNT2] +Private business. You're not welcome! + +[CNT2_09:COUNT2] +PRINT WORKS ASSET COMPLETED + +[CNT2_10:COUNT2] +~g~The print works will now generate revenue up to a maximum of $~1~. Make sure you collect it regularly. + +[CNT2_11:COUNT2] +~r~The plates are at the bottom of the sea! + +{=================================== MISSION TABLE CUBAN1 ===================================} + +[CUB1_A:CUBAN1] +Si, men? + +[CUB1_B:CUBAN1] +Hey, easy Papi, this man's for me. You, you the boy? + +[CUB1_C:CUBAN1] +Oh yeh. You the boy. I think so, you know? + +[CUB1_D:CUBAN1] +No. I don't think I do. + +[CUB1_E:CUBAN1] +Oh yeah? You come here, tough guy. + +[CUB1_F:CUBAN1] +You think you can take me on? + +[CUB1_G:CUBAN1] +You think you can play stupid with me? + +[CUB1_H:CUBAN1] +No, I think you're playing plenty stupid enough for both of us. + +[CUB1_I:CUBAN1] +Hey, he call you dumb, son. + +[CUB1_J:CUBAN1] +And I call him a little girl, Papi. + +[CUB1_K:CUBAN1] +Look at him, all dressed up like that. + +[CUB1_L:CUBAN1] +What is this, ladies night? + +[CUB1_M:CUBAN1] +You some kind of tough guy, you dress like a woman? + +[CUB1_N:CUBAN1] +You got on panties like a woman too, huh? + +[CUB1_O:CUBAN1] +What you got against women? You prefer men, big boy? + +[CUB1_P:CUBAN1] +I like women! I like all women! I love my mother, chico! + +[CUB1_Q:CUBAN1] +Alright, alright, I'll take your word for it. Relax. + +[CUB1_R:CUBAN1] +Can you drive, amigo? + +[CUB1_S:CUBAN1] +Yeah... like a woman. + +[CUB1_T:CUBAN1] +Very funny. I like you, big boy. Maybe you can help. + +[CUB1_U:CUBAN1] +Maybe you can prove you a man. Huh? + +[CUB1_V:CUBAN1] +Take out the boat. + +[CUB1_W:CUBAN1] +Show me you got some big cojones, + +[CUB1_X:CUBAN1] +and not some little bitty chiquita ones. + +[CUB1_02:CUBAN1] +Ok man, treat her like a woman. + +[CUB1_03:CUBAN1] +Not bad, you're a real man. + +[CUB1_04:CUBAN1] +You got real big cojones, amigo. + +[CUB1_05:CUBAN1] +Amigo, you a man, man. + +[CUB1_06:CUBAN1] +Call yourself a man, man? + +[CUB1_07:CUBAN1] +You a little scaredy kitten, baby boy, go cry to your mommy! + +[CUB1_09:CUBAN1] +Man, you the man, man. I like you, man. I like you a lot. + +[CUB1_10:CUBAN1] +Any time, man. 'cause you got cojones. And all my friends have big cojones. + +[CUB1_11:CUBAN1] +~r~You Killed Rico! + +[CUB1_12:CUBAN1] +Go through the first checkpoint to begin the test. + +[CUB1_14:CUBAN1] +Get back in the boat! + +[CUB1_15:CUBAN1] +~r~You are too slow, man. + +[CUB1_01:CUBAN1] +Hey, I'm Rico. You the man with the big cojones? + +[CUB1_13:CUBAN1] +~g~You have three minutes to get round the course. + +[CUB1_08:CUBAN1] +You a big waste of space. Walk like a man, talk like a man, but you drive like an idiot. + +{=================================== MISSION TABLE CUBAN2 ===================================} + +[CUB2_A:CUBAN2] +Un cafecito, por favor, Alberto.. + +[CUB2_N:CUBAN2] +No problema, Tommy. + +[CUB2_B:CUBAN2] +Papi! Una grande problema! + +[CUB2_O:CUBAN2] +Umberto my son, what happened? + +[CUB2_C:CUBAN2] +The Haitians! I hate these Haitians! + +[CUB2_D:CUBAN2] +They mess with me for the last time! + +[CUB2_E:CUBAN2] +These Hai - these Haitians! We take 'em out! + +[CUB2_F:CUBAN2] +Only we need some backup. + +[CUB2_H:CUBAN2] +Amigo, you drive good! + +[CUB2_I:CUBAN2] +For a woman. Right? + +[CUB2_J:CUBAN2] +This is no time for joking! + +[CUB2_K:CUBAN2] +Come on, drive for me again! + +[CUB2_L:CUBAN2] +Take my boys over there, and then we'll take these Haitians down! + +[CUB2_01:CUBAN2] +Not enough room, man, you need a bigger car. + +[CUB2_02:CUBAN2] +We need reinforcements from the cafe! + +[CUB2_03:CUBAN2] +~g~Get a car and pick up the Cubans from outside Robina's Cafe. + +[CUB2_04:CUBAN2] +~g~Go and drop the Cubans off at the fight. + +[CUB2_05:CUBAN2] +Take out that cowardly sniper! + +[CUB2_07:CUBAN2] +They fight like girls! Take cover! + +[CUB2_09:CUBAN2] +Sniper on the roof! + +[CUB2_11:CUBAN2] +~r~You fool, we needed that car. + +[CUB2_12:CUBAN2] +Hey amigo! Good to see you could make it! + +[CUB2_13:CUBAN2] +Stinking nest of Haitians, we gonna kill 'em all! + +[CUB2_14:CUBAN2] +CHAAAAAARGE! + +[CUB2_15:CUBAN2] +Now, my brothers, CHAAARRRGGEE!! + +[CUB2_16:CUBAN2] +Tommy, we have proved our manful bravery! + +[CUB2_17:CUBAN2] +Let us steal the van full of drugs and make good our escape! + +[CUB2_18:CUBAN2] +~g~Get a car and pick up the Cubans + +[CUB2_19:CUBAN2] +We gonna fight like men! + +[CUB2_21:CUBAN2] +Fight like men with huge cojones! + +[CUB2_22:CUBAN2] +~g~ Finish off the rest of the Haitians so the Cubans can move forward. + +[CUB2_23:CUBAN2] +~g~ Little Haiti will be swarming with Haitians trying to even the score with the Cubans. Watch your back. + +[CUB2_24:CUBAN2] +~g~Return to Robina's Cafe with the Van and park it round the back. + +[CUB2_25:CUBAN2] +KILL ALL THE HAITIANS!! + +[CUB2_G:CUBAN2] +I lost a few hermanos already out there. + +[CUB2_M:CUBAN2] +They mess with me, they mess with the biggest boy in town! + +{=================================== MISSION TABLE CUBAN3 ===================================} + +[CUB3_B:CUBAN3] +Poppa, don't serve this snake in the straw. + +[CUB3_C:CUBAN3] +You're two-faced, Tommy! + +[CUB3_E:CUBAN3] +The Haitians, man. They're laughing at me! + +[CUB3_G:CUBAN3] +They're laughing at me, Tommy. At me! + +[CUB3_I:CUBAN3] +Nobody does whatever they like, Umberto, they do what you let them do. + +[CUB3_J:CUBAN3] +What? + +[CUB3_K:CUBAN3] +You want somebody taken care of? + +[CUB3_L:CUBAN3] +I can handle it, but it's gonna cost you. + +[CUB3_M:CUBAN3] +I know we're brothers and all, but this is business. + +[CUB3_N:CUBAN3] +Tommy. You a real man. Businessman, a gentleman. + +[CUB3_O:CUBAN3] +These Haitians. They have a load of product coming in off shore, really good stuff. + +[CUB3_P:CUBAN3] +We take it, and we finish them. + +[CUB3_Q:CUBAN3] +You take it, and I look after you. Like my brother. Like my son. + +[CUB3_R:CUBAN3] +I think I prefer the cash to being bounced on your knee, amigo. + +[CUB3_01:CUBAN3] +Hey Rico. Nice boat, you ready? + +[CUB3_03:CUBAN3] +~g~Collect all the briefcases filled with the drugs and cash. + +[CUB3_04:CUBAN3] +~g~Get the drugs and cash back to Umberto. + +[CUB3_05:CUBAN3] +Si Tommy. Now you be a good shot today, + +[CUB3_06:CUBAN3] +My boat, she no good full of holes, ok? + +[CUB3_07:CUBAN3] +~g~ Go meet Rico. He'll drive you to the meet location. + +[CUB3_02:CUBAN3] +~g~KILL ALL THE HAITIANS ON THE BOATS!! + +[CUB3_08:CUBAN3] +Uh oh.. Pack of Cubans. We under attack! + +[CUB3_A:CUBAN3] +Alberto. Una cafe, senor. + +[CUB3_D:CUBAN3] +You're either two-faced, or you're a wimp, baby boy! + +[CUB3_F:CUBAN3] +Easy, easy. What's your problem? + +[CUB3_H:CUBAN3] +Umberto Robina! They're doing whatever they like! + +{=================================== MISSION TABLE CUBAN4 ===================================} + +[CUB4_A:CUBAN4] +Hey, ladies. You know what I'm gonna do? + +[CUB4_B:CUBAN4] +I'm gonna kill me a Haitian. And then? + +[CUB4_C:CUBAN4] +And then I'm going to make love like a man. + +[CUB4_D:CUBAN4] +You know that, chica? Something like this. + +[CUB4_E:CUBAN4] +Loser! + +[CUB4_F:CUBAN4] +Prick. + +[CUB4_G:CUBAN4] +Hey, baby, I wouldn't touch you with a ten foot pole! + +[CUB4_H:CUBAN4] +Umberto Robina, he likes the ladies! Not some goat in a skirt! + +[CUB4_I:CUBAN4] +Tommy!! Tommy, I love you, I love you! Let's go! + +[CUB4_J:CUBAN4] +Go where? Can't I get a cup of coffee first? + +[CUB4_K:CUBAN4] +No time for coffee! Besides, I just had one. + +[CUB4_L:CUBAN4] +We gonna take out the Haitians. + +[CUB4_M:CUBAN4] +Tommy, how do you take out a snake? + +[CUB4_N:CUBAN4] +You bite him in the ass! Hahaha! + +[CUB4_O:CUBAN4] +Whatever you say, Umberto. + +[CUB4_P:CUBAN4] +Tommy, you go and get us a little Haitian car. + +[CUB4_Q:CUBAN4] +When you get it, come back and pick up my boy. + +[CUB4_R:CUBAN4] +Pepe, and take him out to the Haitians. + +[CUB4_S:CUBAN4] +Then, you go around to the Haitians processing plant, and you use their solvent as an explosive. + +[CUB4_T:CUBAN4] +Boom! Bye bye! + +[CUB4_U:CUBAN4] +Umberto, what about you? + +[CUB4_V:CUBAN4] +Uhh... I'm going to stay behind, and watch over the cafe with Poppa. + +[CUB4_W:CUBAN4] +He not feeling so good. You know? + +[CUB4_02:CUBAN4] +~g~The bombs will be set with a 45 second timer. + +[CUB4_04:CUBAN4] +~r~You've alerted the base, there is no way we will get in now! + +[CUB4_07:CUBAN4] +Oy - the solvent is round the back, amigo. + +[CUB4_08:CUBAN4] +Hola, amigos. + +[CUB4_09:CUBAN4] +Bueno. Haitian Putas. Muerte. + +[CUB4_10:CUBAN4] +Vamos. + +[CUB4_11:CUBAN4] +Vamos indeed. + +[CUB4_12:CUBAN4] +Hey, we need a Haitian gang car! + +[CUB4_13:CUBAN4] +Oye, let's go find our muchachos! + +[CUB4_14:CUBAN4] +Follow my compadres. + +[CUB4_15:CUBAN4] +Ok, in you go... + +[CUB4_16:CUBAN4] +I'm going to plant the bomb, cover me! + +[CUB4_17:CUBAN4] +RUN!! + +[CUB4_18:CUBAN4] +Man, this a nice part of town... + +[CUB4_19:CUBAN4] +This place is a dump, man. + +[CUB4_20:CUBAN4] +I had a beautiful woman... lived around this neighborhood. + +[CUB4_21:CUBAN4] +You know, they do nice pizzas here. + +[CUB4_22:CUBAN4] +Whoah, man. You drive like a crazy bitch! + +[CUB4_23:CUBAN4] +You lost, man? + +[CUB4_24:CUBAN4] +You've left Pepe behind, go and get him. + +[CUB4_03:CUBAN4] +~g~Stay in the car until safely parked inside the compound. + +[CUB4_26:CUBAN4] +~g~Take Pepe, head North into Little Haiti and steal a Voodoo car. + +[CUB4_27:CUBAN4] +~g~Go and meet up with Rico and the other Cubans. + +[CUB4_28:CUBAN4] +~g~Join the other Cubans at the Haitian Drugs Factory. + +[CUB4_29:CUBAN4] +~g~Walk into each of the markers to plant a bomb at that location. + +[CUB4_30:CUBAN4] +~g~After all three bombs are planted, get clear of the factory before it blows. + +[CUB4_31:CUBAN4] +~g~Get clear of the factory!! + +[CUB4_32:CUBAN4] +~g~Park the car at the blip and get out. + +[CUB4_06:CUBAN4] +~r~You did not get far enough away from the base and we had to abort the explosion! + +{=================================== MISSION TABLE FINALE ===================================} + +[FIN1_01:FINALE] +What's going on? + +[FIN1_02:FINALE] +Tommy! Oh good, good. Listen, listen. Uh, listen, + +[FIN1_03:FINALE] +I like fish. I love fish. + +[FIN1_04:FINALE] +I love them as pets in bowls, or as food on a plate, + +[FIN1_05:FINALE] +but as much as I love em, I don't want to sleep with them. + +[FIN1_06:FINALE] +Okay, but right now your Italian brothers are coming from up there to fit me with some cement shoes, and I... + +[FIN1_07:FINALE] +Shut up Ken. Sit down. + +[FIN1_08:FINALE] +Lance, what the hell's going on? + +[FIN1_09:FINALE] +It's your friends up north Tommy. They ain't too happy you capped their man. + +[FIN1_10:FINALE] +They're coming down to see the business today. + +[FIN1_11:FINALE] +They took longer than I thought... + +[FIN1_12:FINALE] +Guys, we gotta make this final we gotta leave no doubt that this is my operation. Mine! + +[FIN1_13:FINALE] +Ken, you get the first run of counterfeit cash and put three mil in briefcases. + +[FIN1_14:FINALE] +Lance, you get the guys together... + +[FIN2_01:FINALE] +Tommy! + +[FIN2_02:FINALE] +What? No big hugs for your old buddy? + +[FIN2_03:FINALE] +I've had fifteen years out of the loop, + +[FIN2_04:FINALE] +I'm a bit rusty on family etiquette. + +[FIN2_05:FINALE] +Always angry, eh Tommy. + +[FIN2_06:FINALE] +Didn't I say your temper would get you into trouble, huh? + +[FIN2_07:FINALE] +There's three mil in the cases... + +[FIN2_08:FINALE] +How many was it? Ten? No, eleven men. + +[FIN2_09:FINALE] +That's how you get to be called the Harwood Butcher! Heh-heh-heh! + +[FIN2_10:FINALE] +You sent me to kill one man, ONE MAN. They knew I was coming Sonny... + +[FIN2_11:FINALE] +Tommy, Tommy, watch your tone. + +[FIN2_12:FINALE] +Anyone would think you blame me for that unfortunate set of circumstances. + +[FIN2_13:FINALE] +Just take the money... + +[FIN2_14:FINALE] +Get the damn cash. + +[FIN2_15:FINALE] +You know, Tommy? I did what I could for you, I pulled strings, called in favors. + +[FIN2_16:FINALE] +I was your friend, Tommy. I hoped you'd see sense, see what's good for business. + +[FIN2_17:FINALE] +I trusted you, Tommy, and you disappointed me. + +[FIN2_18:FINALE] +But at least someone in your chicken shit organization knows how to do business, + +[FIN2_19:FINALE] +Isn't that right, Lance? + +[FIN2_20:FINALE] +I'm sorry Tommy. This is Vice City. This is business. + +[FIN2_21:FINALE] +You sold us out... + +[FIN2_22:FINALE] +No. I sold YOU out, Tommy, I sold YOU out. + +[FIN2_23:FINALE] +The real cash is upstairs in the safe. + +[FIN2_24:FINALE] +Tommy, what was the big plan? + +[FIN2_25:FINALE] +You think I'd just take the fake cash? + +[FIN2_26:FINALE] +Save face and run away with my tail between my legs?! + +[FIN2_27:FINALE] +No. + +[FIN2_28:FINALE] +I just wanted to piss you off before I kill you. + +[FIN3_01:FINALE] +Tommy? + +[FIN3_02:FINALE] +Oh my god, Tommy! What happened? + +[FIN3_03:FINALE] +What does it look like? + +[FIN3_04:FINALE] +It looks like you ruined your suit! + +[FIN3_05:FINALE] +and Tommy, that was a beautiful suit! Tommy, what on earth happened? + +[FIN3_06:FINALE] +I had a disagreement with a business associate, you know how it is. + +[FIN3_07:FINALE] +Tommy, I have a disagreement, I send them an angry letter. + +[FIN3_08:FINALE] +Maybe I pee in their mailbox. I don't start World War III. + +[FIN3_09:FINALE] +You know, maybe you should speak to my shrink... + +[FIN3_10:FINALE] +That stupid prick, Lance... + +[FIN3_11:FINALE] +Tommy. I never liked that guy, okay? + +[FIN3_12:FINALE] +He's neurotic, he's insecure, he's self-centered - the guy's an asshole! + +[FIN3_13:FINALE] +I'm glad you took him out! + +[FIN3_14:FINALE] +I don't think we're gonna be getting any more heat from up north either... + +[FIN3_15:FINALE] +...'cause there ain't no 'up north', anymore. + +[FIN3_16:FINALE] +It's all down south now. + +[FIN3_17:FINALE] +Wait, does that mean what I think it means..? Tommy, baby! + +[FIN3_18:FINALE] +What do you think it means? + +[FIN3_19:FINALE] +That we're in charge... I mean, that you're in charge. Oh, Tommy! + +[FIN3_20:FINALE] +You know, Ken. I think this could be the beginning of a beautiful business relationship.... + +[FIN3_21:FINALE] +After all, you're a conniving, backstabbing, two-bit thief + +[FIN3_22:FINALE] +and I'm a convicted psychotic killer and drug dealer. + +[FIN3_23:FINALE] +I know. Ain't it just beautiful? + +[FIN_B1:FINALE] +~g~Go and kill ~y~Lance Vance~g~ the backstabber. + +[FIN_B2:FINALE] +~g~Kill ~p~Sonny~g~ and finish this once and for all. + +[FIN_B3:FINALE] +~g~The Mafia are trying to steal your money. Defend the safe. + +[FIN_B4:FINALE] +~g~You are close to death, get some ~w~health~g~ from downstairs. + +[FIN_B5:FINALE] +~g~The Mafia is stealing your money, defend the ~c~safe + +[FIN_B7:FINALE] +~r~The mafia has stolen all your money. + +[DEFSAFE:FINALE] +~g~Get back to the safe and defend it. + +{=================================== MISSION TABLE FIRETRK ===================================} + +[F_PASS1:FIRETRK] +Fire extinguished! + +[F_FAIL2:FIRETRK] +~r~You're too late! + +[F_CANC:FIRETRK] +~r~Fire Fighter mission cancelled! + +[F_EXTIN:FIRETRK] +FIRES: + +[F_START:FIRETRK] +~g~Burning vehicle reported in the ~a~ area. Go and extinguish the fire. + +[SIREN_1:FIRETRK] +To turn on this vehicle's sirens tap the ~h~~k~~VEHICLE_HORN~ ~w~button. + +[SIREN_2:FIRETRK] +To turn on this vehicle's sirens tap the ~h~~k~~VEHICLE_HORN~ ~w~button. + +[FIREPRO:FIRETRK] +Fire Truck Mission level 12 complete. You are now completely fireproof!! + +[F_FAIL1:FIRETRK] +Fire Fighter mission ended. + +[F_STAR1:FIRETRK] +~g~Burning vehicles reported in the ~a~ area. Go and extinguish the fire. + +[SPRAY_4:FIRETRK] { reVC update } +Use the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button to fire the water cannon. Aim using ~h~~k~~VEHICLE_TURRETLEFT~~w~ and ~h~~k~~VEHICLE_TURRETRIGHT~~w~. + +[SPRAY_1:FIRETRK] { reVC update } +Use the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button to fire the water cannon. Aim using ~h~~k~~VEHICLE_TURRETLEFT~~w~ and ~h~~k~~VEHICLE_TURRETRIGHT~~w~. + +{=================================== MISSION TABLE GENERA1 ===================================} + +[GEN1_A:GENERA1] +Mr. Vercetti! + +[GEN1_B:GENERA1] +Colonel. + +[GEN1_D:GENERA1] +No - thanks. + +[GEN1_E:GENERA1] +I'm ashamed to admit that one of the causes of our mutual problem appears to have been the loose tongue of a man I used to trust. + +[GEN1_F:GENERA1] +I've been carrying Gonzalez for years, but now his incompetence reaches new heights! + +[GEN1_G:GENERA1] +It is only right that you kill Gonzalez... + +[GEN1_H:GENERA1] +Did he do it? It's the money that's important to me. + +[GEN1_J:GENERA1] +He will be at his Penthouse, half drunk probably. Use this... + +[GEN1_06:GENERA1] +Eh! He's got a blade! + +[GEN1_07:GENERA1] +Go away from me, you cheap bastard! + +[GEN1_08:GENERA1] +Oh sweet Jesus, I've wasted my life and my looks! + +[GEN1_10:GENERA1] +I'm going to shut that big mouth of yours! + +[GEN1_11:GENERA1] +Stop running you fat slimeball! + +[GEN1_12:GENERA1] +Stand still and I'll make it quick! + +[GEN1_13:GENERA1] +Quit your squealing, no one cares, fatso! + +[GEN1_C:GENERA1] +Thank you for coming. Please sit. Lobster? + +[GEN1_05:GENERA1] +~g~Go and kill Gonzalez! + +[GEN1_09:GENERA1] +I pay you double, Tommy, DOUBLE! + +[GEN1_18:GENERA1] +~r~Gonzalez has made it safely to the Police Station! + +[GEN1_19:GENERA1] +~g~The Vice City Police are on to you! + +[GEN1_20:GENERA1] +~g~Get into a vehicle. + +[GEN1_21:GENERA1] +~g~Get to the~h~ Pay 'N' Spray~g~ in~h~ Vice Point~g~. + +[GEN1_22:GENERA1] +Drive your vehicle into the spray shop to lose your ~h~wanted level, ~h~repair and ~h~respray your vehicle. Cost - ~h~$100. This time it's free. + +[GEN1_01:GENERA1] +When jogging, press and hold the~h~ ~k~~PED_FIREWEAPON~ ~w~button to prepare a melee attack. + +[GEN1_02:GENERA1] +When jogging, press and hold the~h~ ~k~~PED_FIREWEAPON~ ~w~button to prepare a melee attack. + +[GEN1_03:GENERA1] +When jogging, press and hold the~h~ ~k~~PED_FIREWEAPON~ ~w~button to prepare a melee attack. + +[GEN1_14:GENERA1] +Release the~h~ ~k~~PED_FIREWEAPON~ ~w~button to make the attack. + +[GEN1_15:GENERA1] +Release the~h~ ~k~~PED_FIREWEAPON~ ~w~button to make the attack. + +[GEN1_16:GENERA1] +Release the~h~ ~k~~PED_FIREWEAPON~ ~w~button to make the attack. + +[GEN1_I:GENERA1] +For this kindness I'll reward you, and then we will find your money together. + +[GEN1_23:GENERA1] +~g~Go back through the doors to return to the ground floor. + +{=================================== MISSION TABLE GENERA2 ===================================} + +[COL2_B:GENERA2] +This looks delicious, huh? Tapir snout? + +[COL2_C:GENERA2] +Uhhh... no, no. No, thanks. + +[COL2_D:GENERA2] +Tommy, you are like a pampas breeze that has freed me from the stench of corruption, + +[COL2_E:GENERA2] +although, I must appear to mourn his passing and carry on with business as usual. + +[COL2_F:GENERA2] +This isn't getting me any closer to my money... + +[COL2_G:GENERA2] +Tommy, my friend, you are not in Liberty now. Here we do things differently. + +[COL2_H:GENERA2] +I will continue with my enquiries but in the meantime I have a valuable deal to close. + +[COL2_I:GENERA2] +A favor for a friend, Cortez? + +[COL2_J:GENERA2] +You're a good friend, Tommy. I knew you would not let me down. + +[COL2_K:GENERA2] +I need you to meet a courier who has obtained some valuable technology for me... + +[COL2_1:GENERA2] +Ze rain, she is tres wet zis time of the year... + +[COL2_2:GENERA2] +What? + +[COL2_3:GENERA2] +Ah, comment? + +[COL2_4:GENERA2] +Look, Cortez sent me. Just give me the damn chips. + +[COL2_5:GENERA2] +Oh...d'accord. + +[COL2_B1:GENERA2] +~g~Meet the courier at the mall. + +[COL2_B2:GENERA2] +~g~The courier is fleeing with the guidance chips! Don't let him get away! + +[COL2_B3:GENERA2] +~g~Take the guidance chips back to the Colonel. + +[COL2_F1:GENERA2] +~r~You killed the contact! + +[COL2_F2:GENERA2] +~g~The courier is dead. Grab the guidance chips. + +[COL2_6A:GENERA2] +Freeze, imperialist American pig! Zat iz propertay of ze government Francais. 'And eet over! + +[BLIPHLP:GENERA2] +The blip on the radar is a triangle pointing up, this shows that the target is higher than the player. + +[COL2_F3:GENERA2] +~r~The guidance chips are at the bottom of the sea. + +[COL2_F4:GENERA2] +~r~The courier has escaped! You failed to get the guidance chips. + +[COL2_A:GENERA2] +Tommy! Come, join me. + +{=================================== MISSION TABLE GENERA3 ===================================} + +[GEN3_A:GENERA3] +Thomas, I appreciate your coming. + +[GEN3_B:GENERA3] +Forgive me for getting straight to business. + +[GEN3_C:GENERA3] +Diaz has asked me to oversee a minor business transaction. + +[GEN3_D:GENERA3] +Let's hope it goes better than last time, huh? + +[GEN3_E:GENERA3] +Which is why I thought of you, my friend. + +[GEN3_F:GENERA3] +I've dropped some protection at the multistory carpark. + +[GEN3_G:GENERA3] +Pick it up - then go and watch over Diaz's men at the drop off. + +[GEN3_H:GENERA3] +Gracias, amigo. + +[GEN3_1:GENERA3] +Hogging all the action, I see... + +[GEN3_2:GENERA3] +Look, you wanna do something other than just shadowing me everywhere? Why don't you come along and show me if you're any use. + +[GEN3_3:GENERA3] +I might just do that. The name's Lance, by the way. + +[GEN3_5:GENERA3] +You must be Cortez's new gun. + +[GEN3_6:GENERA3] +Until more gainful opportunities arise. + +[GEN3_7:GENERA3] +They'll be here any minute - we both better get a good vantage point... + +[GEN3_8:GENERA3] +OK! I'll take the balcony, you get the roof across the yard. + +[GEN3_9:GENERA3] +I live! Dickheads! And it's all down to you! What is your name? + +[GEN3_10:GENERA3] +Tommy. + +[GEN3_11:GENERA3] +I see you soon, amigo, I think! + +[GEN3_12:GENERA3] +Shit. Where's that guy Lance? + +[GEN3_14:GENERA3] +Tommy! I need some help here! + +[GEN3_15:GENERA3] +Don't worry, I got you covered! + +[GEN3_16:GENERA3] +Diaz's men are getting cut down! + +[GEN3_19:GENERA3] +~g~Haitians! They're busting the deal! Protect Diaz! + +[GEN3_20:GENERA3] +~g~The Colonel has arranged some firepower for you at the multistory carpark. + +[GEN3_22:GENERA3] +Diaz's Health: + +[GEN3_23:GENERA3] +~g~You've left Lance behind! Go and get him! + +[GEN3_25:GENERA3] +~r~Lance died! + +[GEN3_28:GENERA3] +~g~Take the briefcase back to Diaz. + +[GEN3_29:GENERA3] +~g~Collect the briefcase and take it back to Diaz. + +[GEN3_30:GENERA3] +~r~He got away with the money! Diaz will have your balls for this! + +[GEN3_33:GENERA3] +~r~Check your fire!! You're supposed to be watching over Diaz and his men, not shooting them! + +[GEN3_34:GENERA3] +~r~There ain't gonna be a deal if you shoot the Cubans! + +[GEN3_35:GENERA3] +~g~He's stolen Diaz's money! + +[GEN3_36:GENERA3] +~g~Grab the bike, chase him down and get Diaz's money back! + +[GEN3_37:GENERA3] +~g~Here come the Cubans. Watch over the deal making sure Diaz and Lance are safe. + +[GEN3_38:GENERA3] +~r~Diaz died! You failed to protect him! + +[GEN3_39:GENERA3] +~g~Get to your vantage point up the stairs. + +[GEN3_44:GENERA3] +~g~Go with Lance to the drop off and watch over Diaz. + +[GEN3_45:GENERA3] +They'll be here any minute, we both better get a good vantage point. + +[GEN3_40:GENERA3] { reVC update } +To ~h~shoot straight ahead ~w~on a ~h~motorbike ~w~press the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button. + +[GEN3_41:GENERA3] { reVC update } +To ~h~shoot straight ahead ~w~on a ~h~motorbike ~w~press the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button. + +[GEN3_46:GENERA3] +Sheeit! + +[GEN3_47:GENERA3] +Tommy! + +[GEN3_48:GENERA3] +Damn! + +[GEN3_49:GENERA3] +lance's health: + +[GEN3_50:GENERA3] +~r~You lost Diaz's money! Next time try not to reduce the money to ashes! + +[GEN3_51:GENERA3] +More damned Haitians in a shitty van! + +[GEN3_54:GENERA3] +Don't just stand there, you pricks, chase that Haitian dickhead down! + +[GEN3_55:GENERA3] +Tommy! I'll stay here and watch over Diaz! + +[GEN3_18:GENERA3] +~g~Here come the Cubans, keep close to Diaz. Watch over the deal making Diaz and Lance are safe. + +[GEN3_56:GENERA3] +~r~Diaz was ambushed and died! Next time keep him in your sights! + +[GEN3_57:GENERA3] +The Kruger is an assault rifle, which allows you to manually aim in 1st person. + +[GEN3_58:GENERA3] +Press and hold the~h~ ~k~~PED_LOCK_TARGET~~w~ button to ~h~aim~w~ with an assault rifle. + +[GEN3_59:GENERA3] +Press and hold the~h~ ~k~~PED_LOCK_TARGET~~w~ button to ~h~aim~w~ with an assault rifle. + +[GEN3_60:GENERA3] +Press the ~h~~k~~PED_FIREWEAPON~~w~ button to ~h~fire~w~ an assault rifle. + +[GEN3_61:GENERA3] +Press the ~h~~k~~PED_FIREWEAPON~~w~ button to ~h~fire~w~ an assault rifle. + +[GEN3_62:GENERA3] +Press the ~h~~k~~PED_FIREWEAPON~~w~ button to ~h~fire~w~ an assault rifle. + +[GEN3_63:GENERA3] +As well as performing drive-by's,~h~ motorbikes ~w~allow you to ~h~shoot forwards~w~. + +[GEN3_64:GENERA3] { reVC update } +To shoot forwards while on a bike press the ~h~~k~~VEHICLE_FIREWEAPON~~w~ button. + +[GEN3_65:GENERA3] { reVC update } +To shoot forwards while on a bike press the ~h~~k~~VEHICLE_FIREWEAPON~~w~ button. + +[GEN3_66:GENERA3] { reVC update } +To shoot forwards while on a bike press the ~h~~k~~VEHICLE_FIREWEAPON~~w~ button. + +[GEN3_67:GENERA3] +You must have a sub machine gun to shoot forwards on a motorbike. + +[GEN3_53:GENERA3] +MY MONEY! + +[GEN3_52:GENERA3] +These Haitians think they can take RICARDO DIAZ!?! + +{=================================== MISSION TABLE GENERA4 ===================================} + +[DETON:GENERA4] +DETONATION: + +[COL4_3:GENERA4] +CONVOY HALT! + +[COL4_6:GENERA4] +WE'RE TAKING ENEMY FIRE! + +[COL4_7:GENERA4] +Civilian, move away from the tank! + +[COL4_8:GENERA4] +I SAID, move away, IMMEDIATELY! + +[COL4_9:GENERA4] +DEFENSIVE POSITIONS! + +[COL4_11:GENERA4] +Get that civilian out of our way soldier! - Sir, Yes Sir! + +[COL4_12:GENERA4] +Civilian in the TANK! STOP HIM! + +[COL4_13:GENERA4] +This is a military convoy, do not obstruct our route. + +[COL4_14:GENERA4] +Drop him soldier. + +[COL4_15:GENERA4] +Get that civilian vehicle out of our way! - Sir! Moving vehicle Sir! + +[COL4_17:GENERA4] +Ok, PLATOON MOVE IT OUT! + +[COL4_18:GENERA4] +Someone's on the tank Sir! + +[COL4_19:GENERA4] +Go get some doughnuts, soldier! - Sir, Yes Sir! + +[COL4_20:GENERA4] +Target acquired, Sir + +[COL4_21:GENERA4] +SNIPER! + +[COL4_22:GENERA4] +I'm getting out of here. + +[COL4_23:GENERA4] +Objective completed! Platoon dismissed! - Lets go eat some doughnuts. + +[COL4_24:GENERA4] +Security protocol Delta India Echo triggered! Vehicle self destruct initiated! + +[COL4_26:GENERA4] +Prepare to die Communist scum! + +[COL4_B2:GENERA4] +~r~The tank arrived at its destination safely! + +[COL4_B5:GENERA4] +~r~The tank has been destroyed! + +[COL4_01:GENERA4] +Diaz was pleased, and would like to meet you again. + +[COL4_02:GENERA4] +Is that a good thing? + +[COL4_03:GENERA4] +Of course! Although I'm starting to think that Diaz was responsible for our unfortunate loss... + +[COL4_04:GENERA4] +What makes you say that? + +[COL4_05:GENERA4] +One does not wave accusations at a man like Diaz - I'm merely thinking out loud... + +[COL4_06:GENERA4] +No matter. I have a proposal that you could profit from... + +[COL4_07:GENERA4] +I don't have time to run more errands, Cortez. + +[COL4_08:GENERA4] +I would have thought a man with such dangerous debts would be hungry for opportunities. Please, Tommy, at least hear me out. + +[COL4_09:GENERA4] +Go on... + +[COL410:GENERA4] +I have a buyer for a piece of military hardware that is being taken through town. Pick it up for me... + +[COL411:GENERA4] +and once you get it, I want you to call me immediately, then... + +[COL4_B4:GENERA4] +~g~The tank is locked. Find a way to lure out the occupants. + +[COL4_1:GENERA4] +What's up with the Gunner? - Don't know Sir! + +[COL4_4:GENERA4] +Get topside soldier. - Sir, Yes Sir! + +[COL4_B1:GENERA4] +~g~Go and acquire the piece of military hardware that is being taken through town. + +[COL4_B3:GENERA4] +~g~Drop the tank off in the Colonels lockup before it self destructs. + +[COL4_B6:GENERA4] +~g~Find a way to steal the tank! + +[COL4_B7:GENERA4] +~g~Drive the tank into the garage. + +[COL4_B8:GENERA4] +~g~Get out of the tank and walk out of the garage. + +{=================================== MISSION TABLE GENERA5 ===================================} + +[COL5A_1:GENERA5] +Circumstances force a hasty departure, amigo. + +[COL5A_2:GENERA5] +What's the problem? + +[COL5A_3:GENERA5] +Ehh, the French want their missile technology back and after that last incident, + +[COL5A_4:GENERA5] +I feel it is time to find safer harbors. + +[COL5A_5:GENERA5] +Wouldn't it be safer to fly? + +[COL5A_6:GENERA5] +I'd be dead before I reached check-in. Besides, I need to get my merchandise out of the country. + +[COL5A_7:GENERA5] +Need another gun? + +[COL5A_8:GENERA5] +You, my friend, are worth ten guns... + +[COL5B_1:GENERA5] +Thomas, you have protected and served me well. + +[COL5B_2:GENERA5] +But now you must leave us before we reach the open seas. + +[COL5B_4:GENERA5] +Thank you, Colonel. + +[COL5B_5:GENERA5] +One more request. While I'm away, could you keep an eye on Mercedes for me? + +[COL5B_6:GENERA5] +I think she could look after herself, but sure, I'll keep an eye out. + +[COL5B_7:GENERA5] +Gracias, amigo. Hasta luego. + +[COL5B_8:GENERA5] +Adios, amigo. + +[COL5_7:GENERA5] +Stop shooting at me! + +[COL5_9:GENERA5] +Tommy, stop them shooting at me! + +[COL5_10:GENERA5] +I have diplomatic immunity! + +[COL5_11:GENERA5] +Don't shoot, I am a Colonel! + +[COL5_12:GENERA5] +Thomas, kill them, my country will love you. + +[COL5_13:GENERA5] +Tommy, we are being overrun by the French! + +[COL5_14:GENERA5] +Tommy, everywhere I look, there are French men, I hate it! + +[COL5_15:GENERA5] +Tommy, how are you? + +[COL5_16:GENERA5] +This is for Piaf and Gainesbourg and your stupid french bread! + +[COL5_1:GENERA5] +Port side! Port side! + +[COL5_2:GENERA5] +They're attacking from starboard! + +[COL5_3:GENERA5] +The bridge up ahead! + +[COL5_4:GENERA5] +They've got a helicopter! + +[COL5_B1:GENERA5] +~g~Defend the Colonel and his yacht at all costs. + +[COL5_B2:GENERA5] +~g~Get up front and clear the route for the Colonel's yacht. + +[COL5_B3:GENERA5] +~r~The Colonel is dead! + +[COL5_B4:GENERA5] +~g~Shoot the attacking helicopter out of the sky. + +[COL5B_3:GENERA5] +I will lower my personal launch. Keep it, my friend, a token of my gratitude. + +[COL5_B5:GENERA5] +~g~Shoot down the helicopters, do not endanger the yacht. + +[COL5_B6:GENERA5] +~g~You have run out of ammo, get more from the stairs on the top deck. + +[COL5_B7:GENERA5] +~g~You are running low on health, get more from the stairs on the top deck. + +{=================================== MISSION TABLE HAIT1 ===================================} + +[HAM1_A:HAIT1] +Hello? Hello? + +[HAM1_C:HAIT1] +You must be the big bad man me grandaddy been chattin' 'bout. + +[HAM1_D:HAIT1] +Tells me tings about you, you know, when he visits, + +[HAM1_E:HAIT1] +and about the others who wait for you. + +[HAM1_F:HAIT1] +Now, we all dead for long time, but you, + +[HAM1_G:HAIT1] +I wouldn't want to be in your shoes, ha ha ha ha ha! + +[HAM1_H:HAIT1] +I got a message to come here. + +[HAM1_I:HAIT1] +Can you hear dem? + +[HAM1_J:HAIT1] +Dem callin' your name, boy, must want you pretty bad, don't ya tink? + +[HAM1_K:HAIT1] +Now you do old Auntie Poulet a turn, huh, maybe she help you. + +[HAM1_L:HAIT1] +Maybe she can give you a little juju after all of dis. + +[HAM1_M:HAIT1] +Give you some magic to give the law man the stink eye, hmmmmm? + +[HAM1_N:HAIT1] +Look, this is all very, um... give me what? + +[HAM1_O:HAIT1] +I,I, I think I've got the wrong address... + +[HAM1_P:HAIT1] +Do me these tings, Tommy...... + +[HAM1_Q:HAIT1] +The Cubans, nasty proud foofoos, mmm, + +[HAM1_R:HAIT1] +been making my lovely Haitian boys shake de heads. + +[HAM1_S:HAIT1] +Now they told the policeman where me been stashing my powders. + +[HAM1_T:HAIT1] +Dey tink it drugs, them stupid. + +[HAM1_U:HAIT1] +Now be a good boy Tommy and go and get the powders for Auntie Poulet. + +[HAM1_V:HAIT1] +Yeah, yeah, sure, sure. + +[HAM1_1:HAIT1] +~g~The cops are closing in on our stashes. BE quick, and beat dem to it! + +[HAM1_2:HAIT1] +~r~The cops got to the stash first! + +[HAM1_3:HAIT1] +~g~Get this stuff back to the hideout! + +[HAM1_4:HAIT1] +~g~Good! Now get the next one! + +[HAM1_6:HAIT1] +~r~The Stash was destroyed, you idiot! + +[HAM1_7:HAIT1] +~g~The cops have got our stash! Retrieve it before they get away! + +[HAM1_8:HAIT1] +~g~The cops are on the way to pick up the stash, get a move on! + +[HAT_1A:HAIT1] +~g~Don't move a muscle, chump! + +[HAM1_B:HAIT1] +Come in, my dear, and rest your soul. + +{=================================== MISSION TABLE HAIT2 ===================================} + +[HAT2_B1:HAIT2] +~g~Get to the van that contains the flying bombs. + +[HAT2_B2:HAIT2] +Kill the Cubans... + +[HAT2_B4:HAIT2] +...and destroy their boats! + +[HAT2_B5:HAIT2] +~g~The Cubans are making a run for it. Don't let them get away! + +[HAT2_B6:HAIT2] +~r~The RC plane is getting too far out of range! + +[HAT2_B7:HAIT2] +~g~One of the Cubans in escaping in a car. Don't leave any witnesses! + +[HAT2_B8:HAIT2] +~r~You have no RC planes left! + +[HAT2_B9:HAIT2] +RC Planes: + +[HAT2_1:HAIT2] +Oh, sorry, I - I must have the wrong address... + +[HAT2_2:HAIT2] +Well, you might as well come in and rest your soles and have some tea. + +[HAT2_3:HAIT2] +Do you have something there for me, Tommy? + +[HAT2_4:HAIT2] +Yeah... + +[HAT2_5:HAIT2] +This place feels familiar to me, uh - it's - a smell from childhood - a deja vu... + +[HAT2_6:HAIT2] +Now Tommy, I'm going to whisper a lickle errand for you. Hear me well, aye? + +[HAT2_7:HAIT2] +You look like someone I, I... + +[HAT2_8:HAIT2] +The Cubans have fast boats they use to cross the seas with drugs. + +[HAT2_9:HAIT2] +It is their livelihood. + +[HAT2_10:HAIT2] +Me nephew bin making lickle flying bombs to take dem out. + +[HAT2_11:HAIT2] +Blow de boats to coffin wood. + +[HAT2_12:HAIT2] +Thanks for the tea. + +[HAT2_B3:HAIT2] { reVC update } +Press the ~h~~k~~VEHICLE_FIREWEAPON~ ~w~button to drop a bomb. Press the ~h~~k~~VEHICLE_ENTER_EXIT~ ~w~button to cancel. + +{=================================== MISSION TABLE HAIT3 ===================================} + +[HAM3_A:HAIT3] +Hello? Hello - uh..I'm looking for somebody around here... + +[HAM3_B:HAIT3] +You looking hungry, Tommy. + +[HAM3_C:HAIT3] +Do I know you? + +[HAM3_D:HAIT3] +Hush now. + +[HAM3_E:HAIT3] +One more ting an I can let you go, Tommy. + +[HAM3_F:HAIT3] +My boys gone war wit dem Cuban boys. + +[HAM3_G:HAIT3] +But no guns. + +[HAM3_H:HAIT3] +Hmm, but de Cubans have a surprise comin'. + +[HAM3_I:HAIT3] +While they fight in de streets, you take this rifle and kill dem in de hubbub. + +[HAM3_J:HAIT3] +No one sees you, no one hear you. + +[HAM3_K:HAIT3] +Now, Tommy, you do this for me, and you no longer tied to my apron strings. + +[HAM3_1:HAIT3] +~g~We must win this battle. If all the Haitians die we lose. + +[HAM3_3:HAIT3] +~g~I expect the Cubans to cheat so be on your guard. + +[HAM3_4:HAIT3] +~r~You have been spotted! The mission is a failure! + +[HAM3_5:HAIT3] +~g~You must kill the Cubans from a distance. You must not be seen. + +[HAM3_8:HAIT3] +~g~Haitians are dying! Improve your aim. + +[HAM3_7:HAIT3] +~g~Look Out! The Cubans have brought reinforcements. Kill them all!! + +[HAM3_2:HAIT3] +~r~The Haitians have died! + +[HAM3_L:HAIT3] +Kay auntie.. + +{=================================== MISSION TABLE HOTEL ===================================} + +[INTB_A:HOTEL] +Tommy! Tommy, it's been too long. + +[INTB_B:HOTEL] +Hello Sonny. + +[INTB_C:HOTEL] +I know, I know. You're just overwhelmed with emotion. + +[INTB_D:HOTEL] +Fifteen years - seems like only yesterday. + +[INTB_E:HOTEL] +I guess that's a perspective thing. + +[INTB_F:HOTEL] +Hey, doing time for the family is no piece of cake, + +[INTB_G:HOTEL] +but the family looks after its own, ok? + +[INTB_H:HOTEL] +So, how'd the deal go down - you sitting on some white gold? + +[INTB_I:HOTEL] +Look Sonny, we were set up. The deal was an ambush. Harry and Lee are dead. + +[INTB_J:HOTEL] +You better be kidding me Tommy. Tell me you still got the money. + +[INTB_K:HOTEL] +...no Sonny...I don't have the money. + +[INTB_L:HOTEL] +That was my money, Tommy, MY MONEY! + +[INTB_M:HOTEL] +You better not be screwing me Tommy because you know I'm not a man to be screwed with! + +[INTB_N:HOTEL] +Wait Sonny. + +[INTB_O:HOTEL] +You have my personal assurance that I'm going to get your money back and the drugs. + +[INTB_P:HOTEL] +And I'm gonna mail you the dicks of those responsible. + +[INTB_Q:HOTEL] +Hey, I already know that. You're not a fool Tommy, but I warn you, neither am I. + +[INTB_R:HOTEL] +If it was anybody else you'd be DEAD already. + +[INTB_S:HOTEL] +But because it's you, because we got history, I'm gonna let you handle this. + +[INTB_T:HOTEL] +Look, Sonny, you got my word. + +[INTB_U:HOTEL] +I'll be in touch. + +{=================================== MISSION TABLE ICECRE1 ===================================} + +[ICC1_1:ICECRE1] +~g~Use your Ice Cream van distribute drugs around Vice City. + +[ICC1_3:ICECRE1] +~g~You receive money for each transaction you make, but the more transactions you make the more police attention you get. + +[ICC1_4:ICECRE1] +~g~There aren't any customers in this area try another one. + +[ICC1_5:ICECRE1] +Deals done: + +[ICC1_6:ICECRE1] +~g~Use the Mr. Whoopee van to distribute Cherry Poppers product around Vice City. + +[ICC1_7:ICECRE1] +~g~You receive money for each transaction you make, but the more transactions you make the more police attention you get. + +[ICC1_9:ICECRE1] +~g~Local gangs will not appreciate you doing business on their turf so expect hostility if you do so. + +[ICC1_10:ICECRE1] +~g~You made ~1~ deals! + +[ICC1_11:ICECRE1] +~g~You made ~1~ deal! + +[ICC1_12:ICECRE1] +PROPERTY ACQUIRED! + +[ICC1_13:ICECRE1] +~r~You didn't make any deals! + +[ICC1_14:ICECRE1] +ICECREAM ASSET COMPLETED + +[ICC1_15:ICECRE1] +~g~The icecream factory will now generate revenue up to a maximum of $~1~. Make sure you collect it regularly. + +[ICC1_2:ICECRE1] +~g~Park your van and press the ~h~~k~~VEHICLE_HORN~~w~ to play your ice cream jingle to notify customers that your ready for business. + +[ICC1_16:ICECRE1] +~g~Use your Mr. Whoopee van to distribute Cherry Poppers product around Vice City. + +[ICC1_8:ICECRE1] +~g~To make a transaction, ~h~park your van ~g~and press the ~h~~k~~VEHICLE_HORN~ ~g~button to play the ice cream jingle to attract customers. + +[ICE_AT1:ICECRE1] +ICECREAM FACTORY ASSET COMPLETED + +[ICE_AT2:ICECRE1] +~g~The Cherry Popper factory will now generate revenue up to a maximum of $~1~. Make sure you collect it regularly. + +[ICC1_17:ICECRE1] +Distribution mission over + +[ICC1_18:ICECRE1] +Total ice cream sales: $~1~ + +[ICC1_19:ICECRE1] +Total deals done: ~1~ + +{=================================== MISSION TABLE ICECUT ===================================} + +[ICC1_A:ICECUT] +Who are you? + +[ICC1_B:ICECUT] +Your new owner. + +[ICC1_C:ICECUT] +Were you now, or at any time, a child? + +[ICC1_D:ICECUT] +What are you talking about? + +[ICC1_E:ICECUT] +Were you a child? + +[ICC1_F:ICECUT] +Yes! Calm down! What's wrong with you? + +[ICC1_G:ICECUT] +I knew it. A child. + +[ICC1_H:ICECUT] +A dirty, stinking, sniveling, snotting, vile, puking, crying little baby! + +[ICC1_K:ICECUT] +Ow! Calm down. + +[ICC1_L:ICECUT] +I HATE babies, and I hate children. + +[ICC1_N:ICECUT] +Enough already! + +[ICC1_P:ICECUT] +You make soft ice cream, okay? It's purely for kids. + +[ICC1_Q:ICECUT] +What kind of psycho are you? + +[ICC1_R:ICECUT] +Just so I understand this, why make children happy if you hate them? + +[ICC1_S:ICECUT] +Oh, you stupid, sniveling, snotty- + +[ICC1_T:ICECUT] +Shut up! + +[ICC1_U:ICECUT] +- Brat! + +[ICC1_V:ICECUT] +The ice cream is a front. + +[ICC1_W:ICECUT] +We distribute other, non-dairy products. + +[ICC1_X:ICECUT] +And if I see a kid, I put him to good use. + +[ICC1_Y:ICECUT] +Don't I, kiddies? Yes - yes, I do. Mummy doesn't love you. + +[ICC1_Z:ICECUT] +She HATES you! + +[ICC1_ZA:ICECUT] +PROPERTY ACQUIRED! + +[ICC1_M:ICECUT] +They're dirty, sniveling, snotting, vile, puking little.. + +[ICC1_I:ICECUT] +A baby.. an awful, horrible, disgusting little boo hoo. + +[ICC1_J:ICECUT] +Mommy doesn't love you. You little shit! + +{=================================== MISSION TABLE INTRO ===================================} + +[INT1_A:INTRO] +Tommy Vercetti...Huh! shit. + +[INT1_B:INTRO] +Didn't think they'd ever let him out. + +[INT1_C:INTRO] +He kept his head down, helps people forget. + +[INT1_D:INTRO] +People will remember soon enough. + +[INT1_E:INTRO] +When they see him walking down the streets of their neighborhoods. + +[INT1_F:INTRO] +It will be bad for business. + +[INT1_G:INTRO] +Well, what are we gonna do, Sonny? + +[INT1_H:INTRO] +We treat him like an old friend and keep him busy out of town. OK? + +[INT1_I:INTRO] +We been talking about expanding down South, right? + +[INT1_J:INTRO] +Vice City is twenty-four carat gold these days. + +[INT1_K:INTRO] +The Colombians, the Mexicans, hell, + +[INT1_L:INTRO] +even those Cuban refugees are cutting themselves a piece of some nice action. + +[INT1_M:INTRO] +But it's all drugs, Sonny, + +[INT1_N:INTRO] +None of the families will touch that shit! + +[INT1_O:INTRO] +Times are changing. + +[INT1_P:INTRO] +The families can't keep their backs turned while our enemies reap the rewards. + +[INT1_Q:INTRO] +So, we send someone down to do the dirty work for us... + +[INT1_R:INTRO] +and cut ourselves a nice quiet slice. OK? + +[INT1_S:INTRO] +Who's our contact down there? + +[INT1_T:INTRO] +Ken Rosenberg, schmuck of a lawyer. + +[INT1_U:INTRO] +How's he gonna hold Vercetti's leash? + +[INT1_V:INTRO] +We don't need him to. + +[INT1_W:INTRO] +We just set him loose in Vice City, + +[INT1_X:INTRO] +we give him a little cash to get started. OK? + +[INT1_Y:INTRO] +Give it a few months. + +[INT1_Z:INTRO] +Then we go down, + +[INT1_A1:INTRO] +pay him a little visit, right? + +[INT1_A2:INTRO] +see how he's doing. + +[INT2_A:INTRO] +Hey, hey, guys! It's, uh, Ken Rosenberg here! Hey! Heh, heh, hey, great, hey! + +[INT2_B:INTRO] +Well, uh, I'm gonna drive you guys to the meet, okay? + +[INT2_C:INTRO] +Now, I've talked to the suppliers and they are very, huh-ha, + +[INT2_D:INTRO] +keen to start a business relationship, so, uh, + +[INT2_E:INTRO] +if all goes well, we should, uh, + +[INT2_F:INTRO] +be doing very nicely for ourselves, which is, y'know... + +[INT2_G:INTRO] +good.. + +[INT2_H:INTRO] +Okay, so. They're brothers, okay. + +[INT2_I:INTRO] +One operates the uh, the business, + +[INT2_J:INTRO] +and the other one does the flying. + +[INT2_K:INTRO] +Now they operate out of Mexico, + +[INT2_M:INTRO] +They own a farm in Panama. + +[INT2_N:INTRO] +Okay, all right, listen - + +[INT2_O:INTRO] +you guys, when we get there should I stay in the car, + +[INT2_P:INTRO] +or do you guys want me to come in with you guys? + +[INT2_Q:INTRO] +No. Stay in the car. + +[INT2_R:INTRO] +You know what, I thought about it, + +[INT2_S:INTRO] +I'm gonna watch the car. + +[INT3_A:INTRO] +Ok, that's them in the chopper. + +[INT3_B:INTRO] +All right, here's the deal. + +[INT3_C:INTRO] +They want a straight exchange on open ground. + +[INT3_D:INTRO] +All right? Ok. Stay tight, let's go. + +[INT3_E:INTRO] +All right. Take it easy, now. + +[INT3_F:INTRO] +I'm right here. The cars running, baby! + +[INT3_G:INTRO] +Got it? + +[INT3_H:INTRO] +100% pure grade-A Colombian, my friend. + +[INT3_I:INTRO] +The greens? + +[INT3_J:INTRO] +Tens and twenties...used. + +[INT3_L:INTRO] +Go on, get out of here! Drive! + +[INT4_A:INTRO] +Screwed! We're screwed! + +[INT4_B:INTRO] +This is soo typical, + +[INT4_C:INTRO] +I poke my head out of the gutter for one freakin' second, + +[INT4_D:INTRO] +and fate shovels shit in my face! + +[INT4_E:INTRO] +Well, screw you! + +[INT4_F:INTRO] +Shut your face and quit complaining! You're alive, aren't ya'? + +[INT4_G:INTRO] +Drop me right up here. + +[INT4_H:INTRO] +Go dump the car, then go get some sleep. + +[INT4_I:INTRO] +I'll drop by your office tomorrow and we can start sorting this mess out. + +[INT4_J:INTRO] +OK, that's a good idea, I'll get some sleep. + +[INT4_K:INTRO] +What are you gonna do? + +[INT4_L:INTRO] +Make my way back to my hotel, + +[INT4_M:INTRO] +clear my head, and figure this crap out. + +[INT4_N:INTRO] +OK. + +[INTRO1:INTRO] +I poke my head out of the gutter for one freakin' second and fate shovels shit in my face! + +[INTRO2:INTRO] +Go get some sleep. + +[INTRO3:INTRO] +What are you gonna do? + +[INTRO4:INTRO] +I'll drop by your office tomorrow and we can start sorting this mess out. + +[INT3_K:INTRO] +I think we have a deal, my friend. HA HA! + +[INT3_M:INTRO] +Let me see it. + +[INT2_L:INTRO] +no, no, no, wait... + +[INT3_N:INTRO] +Oh Shit! + +{=================================== MISSION TABLE KENT1 ===================================} + +[KPM1_A:KENT1] +Awright mush, I'm gonna save your Vera, mate. + +[KPM1_B:KENT1] +What the hell are you talking about? + +[KPM1_C:KENT1] +You know that wanker Diaz, the Bugle Master. + +[KPM1_D:KENT1] +He's got your boy, Lance. Word is your mate tried to jump him... + +[KPM1_E:KENT1] +didn't jump high enough if you know what I mean. + +[KPM1_F:KENT1] +Where did he take him? In plain English? + +[KPM1_G:KENT1] +Keep your barnet on! They got him across town at the junkyard. + +[KPM1_H:KENT1] +Bloody hell....you nutter! + +[KPM1_2:KENT1] +~r~You were supposed to get Lance out alive! + +[KPM1_3:KENT1] +LANCE'S HEALTH: + +[RESC_1:KENT1] +You ok to use a gun? + +[RESC_2:KENT1] +Sure...I guess...nice to see you, too. + +[RESC_3:KENT1] +Let's get out of here. + +[RESC_4:KENT1] +There goes my careful planning blown to shit, thanks to you. You screwed up real good, Lance! + +[RESC_5:KENT1] +He killed my brother. What do you expect me to do, mow his lawns? + +[RESC_6:KENT1] +We're gonna have to take out that prick Diaz before he takes us out. + +[RESC_7:KENT1] +Get patched up and meet me on the bridge to Star Island, ok? + +[RESC_8:KENT1] +Ok, I got you. + +[KPM1_1:KENT1] +~g~Lance is being held at the junk yard, Go and rescue him! + +[KPM1_4:KENT1] +~g~Get Lance to the hospital! + +[M_PASSN:KENT1] +MISSION PASSED! + +[KPM1_5:KENT1] +~g~Diaz's guys are after you! Get Lance to the hospital. + +{=================================== MISSION TABLE KICKSTT ===================================} + +[KICK1_2:KICKSTT] +~r~You did not get back to the bike quickly enough! + +[KICK1_7:KICKSTT] +~r~You have wrecked the bike! + +[KICK1_8:KICKSTT] +~g~Get on the bike! + +[KICK1_T:KICKSTT] +TIME TAKEN: + +[KICKTM:KICKSTT] +~b~EVENT TIME: ~1~:~1~ + +[KICKTM2:KICKSTT] +~b~EVENT TIME: ~1~:0~1~ + +[GETBIKE:KICKSTT] +~g~You have ~1~ seconds to return to a dirtbike before the mission ends. + +[KICK1_1:KICKSTT] +~g~Complete the course as quickly as possible. + +[KICK1_6:KICKSTT] +~g~Well done! + +[KICK_10:KICKSTT] +~g~Use the Sanchez to complete the course by passing through all of the checkpoints. + +[KICK_12:KICKSTT] +~r~You bottled it! + +[KICK_13:KICKSTT] +~r~You have taken too long! + +[KICK_11:KICKSTT] +~g~To leave the mission stand in the ~q~pink marker~g~ on foot. + +{=================================== MISSION TABLE LAWYER1 ===================================} + +[LAW1_A:LAWYER1] +Go get some sleep, he says - + +[LAW1_B:LAWYER1] +- I have been sitting in this chair all night with the lights off drinking coffee! + +[LAW1_C:LAWYER1] +This is a disaster. We are so screwed, man! + +[LAW1_D:LAWYER1] +These gorillas, listen to me, are gonna come down here and rip my head off. It's ridiculous! + +[LAW1_E:LAWYER1] +I did NOT go to law school for this! Ok, now what the hell are we gonna do? + +[LAW1_F:LAWYER1] +Shut up, sit down, relax. I'll tell you what we're gonna do. + +[LAW1_G:LAWYER1] +You're gonna find out who took our cocaine - and then, I'm gonna kill them. + +[LAW1_H:LAWYER1] +That's a good idea. That's a GREAT idea. Let me think, let me think, let me think. + +[LAW1_I:LAWYER1] +- OH! There's this retired Colonel, Colonel Juan Garcia Cortez. + +[LAW1_J:LAWYER1] +He's the one that helped me set up this deal + +[LAW1_K:LAWYER1] +well away from Vice City's established thugs. Ok? + +[LAW1_L:LAWYER1] +Now, listen. He's holding his party out in the bay on his expensive yacht + +[LAW1_M:LAWYER1] +and all of Vice City's big players are gonna be there. OK? + +[LAW1_N:LAWYER1] +I have an invite, of course I have an invite, + +[LAW1_O:LAWYER1] +but there's no way that I'm going out there, sticking my head out the door - no way! Not gonna happen. + +[LAW1_P:LAWYER1] +I told you, shut up! I'll go myself... + +[LAW1_Q:LAWYER1] +Ho - whoa, whoa! Hey, I like 1978 too, but, y'know, this isn't gonna be a beer and strippers do. + +[LAW1_R:LAWYER1] +I mean, no offense, but I think that you might turn heads on the runway for the wrong reasons. + +[LAW1_S:LAWYER1] +What's wrong with the way I'm dressed? + +[LAW1_T:LAWYER1] +Ok, look, here. Stop by Rafael's, tell him I sent 'ya. He'll make you look respectable. + +[LAW1_U:LAWYER1] +OK, go, c'mon... + +[LAWP_1:LAWYER1] +Buenas noches. + +[LAWP_2:LAWYER1] +I understand you are here on the behalf of Mr. Rosenberg, + +[LAWP_3:LAWYER1] +I hope any recent problems have not affected his health, or uh, + +[LAWP_4:LAWYER1] +mental well being, Mr...uh? + +[LAWP_5:LAWYER1] +Vercetti. He's just got a touch of...agoraphobia. + +[LAWP_6:LAWYER1] +Excellent, excellent. And you? + +[LAWP_7:LAWYER1] +I just want my merchandise. + +[LAWP_8:LAWYER1] +Ah. It's an unfortunate set of circumstances for all involved. + +[LAWP_9:LAWYER1] +Of course I have initiated my own lines of inquiry, + +[LAWP_10:LAWYER1] +but such a delicate matter will take time. + +[LAWP_11:LAWYER1] +Perhaps we will talk later. + +[LAWP_12:LAWYER1] +Meanwhile, let me introduce you to my daughter, + +[LAWP_13:LAWYER1] +Mercedes! + +[LAWP_14:LAWYER1] +Caramia, could you look after our guest while I attend to my necessary obligations? + +[LAWP_15:LAWYER1] +Of course, daddy. + +[LAWP_16:LAWYER1] +Please excuse me. + +[LAWP_17:LAWYER1] +Mercedes!? + +[LAWP_18:LAWYER1] +You try living with it. + +[LAWP_19:LAWYER1] +Anyway, let me point out some of our more distinguished guests... + +[LAWP_20:LAWYER1] +That's our congressman Alex Shrub with rising silicone star Candy Suxxx... + +[LAWP_21:LAWYER1] +And have you met my lovely wife Laura? No? + +[LAWP_22:LAWYER1] +Well, unfortunately she's in Alabama. This is Candy. + +[LAWP_23:LAWYER1] +And over there we have the Vice City Mambas' star tight end, BJ - + +[LAWP_24:LAWYER1] +always the charmer. + +[LAWP_25:LAWYER1] +I blocked down on him and then I put him in a wheelchair! + +[LAWP_26:LAWYER1] +Haha, that is good! + +[LAWP_27:LAWYER1] +Well now, I'm looking at some prime real estate property. + +[LAWP_28:LAWYER1] +And that poolside amphibian is Jezz Torrent, + +[LAWP_29:LAWYER1] +lead singer with Love Fist. + +[LAWP_30:LAWYER1] +Can I tell yous - do you know how they play ping-pong in Thailand? + +[LAWP_31:LAWYER1] +Let me tell you's, + +[LAWP_32:LAWYER1] +it does not involve a paddle, if you know what I mean! + +[LAWP_33:LAWYER1] +Impotent. + +[LAWP_34:LAWYER1] +And the chatty trio. + +[LAWP_35:LAWYER1] +That sleeping sweat gland is Papa's right hand gimp, Gonzalez + +[LAWP_36:LAWYER1] +and the other two are Pastor Richards + +[LAWP_37:LAWYER1] +and pseudo intellectual film director, Steve Scott. + +[LAWP_38:LAWYER1] +...passion with the nympho invaders, + +[LAWP_39:LAWYER1] +when the giant shark comes in and + +[LAWP_40:LAWYER1] +just bites their dicks off! + +[LAWP_41:LAWYER1] +Ha now, you never saw anything like that before, have you? + +[LAWP_42:LAWYER1] +Colonel! + +[LAWP_43:LAWYER1] +your parties as ever are a triumph, hahahaha! + +[LAWP_44:LAWYER1] +I can only apologize for my late arrival. + +[LAWP_45:LAWYER1] +Ah, de nada amigo. How do we find you? + +[LAWP_46:LAWYER1] +Our business is very trying - barbarians at the gates. + +[LAWP_47:LAWYER1] +A time for rewarding one's friends and liquidating one's enemies, amigo. + +[LAWP_48:LAWYER1] +Who's the loudmouth? + +[LAWP_49:LAWYER1] +Ricardo Diaz. He's Mr. Coke. + +[LAWP_50:LAWYER1] +Mercedes! + +[LAWP_51:LAWYER1] +Oh, I was just taking my friend back into town. + +[LAWP_52:LAWYER1] +Another time, Ricardo! + +[LAWP_53:LAWYER1] +Let's get out of here. + +[LAWP_54:LAWYER1] +Actually, take me to the Pole Position club. + +[LAW1_2:LAWYER1] +~g~Get to the Colonel's boat. + +[LAW1_4:LAWYER1] +~r~You killed the Colonel's daughter! + +[LAW1_5:LAWYER1] +Will you be working for my father? + +[LAW1_6:LAWYER1] +Maybe. + +[LAW1_7:LAWYER1] +Do you mind me resting my hand in your lap? + +[LAW1_8:LAWYER1] +Maybe... + +[LAW1_9:LAWYER1] +It's so difficult having a rich and powerful father. Vamos. + +[LAW1_10:LAWYER1] +See you around, handsome! + +[LAW1_11:LAWYER1] +I'm sure you will. + +[LAW1_12:LAWYER1] +Hmmmm...nice bike. + +[LAW1_13:LAWYER1] +No! My Bike! + +[LAW1_3:LAWYER1] +~g~Take the Colonel's daughter to the Pole Position club. + +[HELP20:LAWYER1] +Follow the ~h~T-shirt~w~ blip on the radar to find Rafael's. + +[LAW1_14:LAWYER1] +Wow, I like, really dig your motorcycle. + +[LAW1_15:LAWYER1] +Yeah babe, just picked it up from Howlin' Pete's + +{=================================== MISSION TABLE LAWYER2 ===================================} + +[LAW2_A:LAWYER2] +Ah! Well, I hope you're having a good time. Because I'm going out of my mind with worry here. What did you find out? + +[LAW2_B:LAWYER2] +That there are more criminals in this town than in prison. We need a lead from the streets... + +[LAW2_C:LAWYER2] +Ok, let me think, let me think, let me think - + +[LAW2_D:LAWYER2] +- AH! I've got it! + +[LAW2_E:LAWYER2] +Ok, There's this limey, some music industry slimeball, + +[LAW2_F:LAWYER2] +goes by the name of Kent Paul. + +[LAW2_G:LAWYER2] +Anyway, he's got his nose so far up most of Vice City's ass + +[LAW2_I:LAWYER2] +it's this guy, all right? He's always at The Malibu. + +[LAW2_J:LAWYER2] +I'll go pay him a visit. + +[LAW2B_A:LAWYER2] +Where'd you pop up from? + +[LAW2B_B:LAWYER2] +I've been looking for a bird like you for ages, mate... + +[LAW2B_C:LAWYER2] +Kent Paul, mate. Yeah, I'm the guvnor 'round here. + +[LAW2B_D:LAWYER2] +I'm looking for some English guy... + +[LAW2B_E:LAWYER2] +I sort things out, you know what I mean? + +[LAW2B_F:LAWYER2] +I'll treat you. Whatever you want, I'll get you, girl. + +[LAW2B_G:LAWYER2] +Don't you worry about a thing, mate. + +[LAW2B_H:LAWYER2] +Get lost, honey. + +[LAW2B_I:LAWYER2] +Oi oi oi oi oi! + +[LAW2B_J:LAWYER2] +You Kent Paul? I'm a friend of Rosenberg's... + +[LAW2B_K:LAWYER2] +Rosenberg...Rosenberg...Oh, that bonkers ambulance chaser! + +[LAW2B_L:LAWYER2] +That guy could defend an innocent man all the way to death row! + +[LAW2B_M:LAWYER2] +Give us another drink, bruv. + +[LAW2B_N:LAWYER2] +Everybody's a comedian. + +[LAW2B_O:LAWYER2] +Listen to me, I'm missing twenty keys and a lot of cash... + +[LAW2B_P:LAWYER2] +Drugs, mate? It's a mug's game. + +[LAW2B_Q:LAWYER2] +What do you know about it? + +[LAW2B_R:LAWYER2] +Oi oi! What I was coming to was, + +[LAW2B_S:LAWYER2] +there's some chef-cum-trumpetshifter who deals out kitchen of a hotel on Ocean Drive. + +[LAW2B_T:LAWYER2] +He's been looking real pleased with himself lately. You could go and check him out...?! + +[LAW2B_U:LAWYER2] +I will - and I'll be seeing you around. + +[LAW2B_V:LAWYER2] +Yeah, that's right. Go on - walk away, you mug. I'll knock you spark out! + +[LAW2B_W:LAWYER2] +Give me a drink - and where's that slut! + +[LAW2C_A:LAWYER2] +Oh, way to go, tough guy. Beat him to a pulp. That should make him real chatty. + +[LAW2C_B:LAWYER2] +You want some, too? + +[LAW2C_C:LAWYER2] +Hey, chill. I want what you want, brother. + +[LAW2C_D:LAWYER2] +Oh, yeah? And what's that? + +[LAW2C_E:LAWYER2] +Your green - and my dead brother's white lady. Unfortunately, you just silenced our lead. + +[LAW2C_F:LAWYER2] +Accidents happen. Get lost. + +[LAW2C_G:LAWYER2] +Hey, hey, whoa. No need to go all 'Lone Ranger' on my ass. + +[LAW2C_H:LAWYER2] +The way I see it - we two hombres in a strange town. We need to watch each other's back. + +[LAW2C_I:LAWYER2] +My back's just fine, brother... + +[LAW2C_J:LAWYER2] +You sure about that? Here, take this. + +[LAW2C_K:LAWYER2] +Follow me! + +[LAW2_1:LAWYER2] +Hey, whatchoo lookin' at? + +[LAW2_2:LAWYER2] +You better start talking.. + +[LAW2_3:LAWYER2] +Hey, make me, you prick! + +[LAW2_4:LAWYER2] +This way! + +[LAW2_5:LAWYER2] +I'm going to go see what I can dig up. I'll be watching you, Tommy. + +[LAW2_6:LAWYER2] +~g~Go to the Malibu Club and find Kent Paul. + +[LAW2_7:LAWYER2] +~g~Go and find the chef on Ocean Drive. + +[LAW2_10:LAWYER2] +~g~Drive back to the hotel. + +[LAW2_11:LAWYER2] +~g~Pick up his cell phone. + +[LAW2_12:LAWYER2] +Cell phone acquired! You can now receive phone calls. + +[LAW2_13:LAWYER2] +~g~You've left Lance behind! Go and get him! + +[LAW2_14:LAWYER2] +We gotta get the hell outta here! + +[GUN_2A:LAWYER2] +Hold the ~h~~k~~PED_LOCK_TARGET~ ~w~button to ~h~auto-target~w~, press the ~h~~k~~PED_FIREWEAPON~ ~w~button to ~h~fire! + +[GUN_2C:LAWYER2] +Hold the ~h~~k~~PED_LOCK_TARGET~ ~w~button to ~h~auto-target~w~, press the ~h~~k~~PED_FIREWEAPON~ ~w~button to ~h~fire! + +[GUN_2D:LAWYER2] +Hold the ~h~~k~~PED_LOCK_TARGET~ ~w~button to ~h~auto-target~w~, press the ~h~~k~~PED_FIREWEAPON~ ~w~button to ~h~fire! + +[HELP17:LAWYER2] +Press the ~h~~k~~PED_FIREWEAPON~ ~w~button to attack the chef. + +[HELP18:LAWYER2] +Press the~h~ ~k~~PED_FIREWEAPON~ ~w~button to attack the chef. + +[LAW3_11:LAWYER2] +Stand in the ~q~pink marker~w~ to view the weapons on offer. + +[LAW3_12:LAWYER2] +You can select weapons by pressing ~h~left~w~ or ~h~right~w~ on the ~h~directional button. + +[LAW3_13:LAWYER2] +If you have enough cash you can buy weapons by pressing the ~h~~k~~PED_SPRINT~ ~w~button. + +[LAW3_14:LAWYER2] +You can exit the shop by pressing the ~h~~k~~VEHICLE_ENTER_EXIT~ ~w~button. + +[LAW3_15:LAWYER2] +Follow the ~h~Gun blip~w~ on the radar to find ~h~Ammu-Nation. + +[LAW2_15:LAWYER2] +~g~Go to Ammu-Nation. + +[LAW2_H:LAWYER2] +that if anybody knows the whereabouts of 20 k's of coke, + +[LAW2_K:LAWYER2] +Take it easy now. + +[LAW2_16:LAWYER2] +One thing you gotta realize about this town. You gotta pack some heat. + +[LAW2_17:LAWYER2] +C'mon, the local gun shop's a couple of blocks away. + +[LAW2_18:LAWYER2] +Tommy, every man needs a little R&R once in a while. + +[LAW2_19:LAWYER2] +This here's the Pole Position Strip Club. You might want to drop in some time. + +{=================================== MISSION TABLE LAWYER3 ===================================} + +[LAW3_A:LAWYER3] +Aaah! Oh, for god's sake, it's you! Oh, Jeez - I'm gonna need new pants! + +[LAW3_B:LAWYER3] +Hey, those psychos from up north - they've been on the horn, and they're coming down here soon. + +[LAW3_C:LAWYER3] +Now where is the goddamn money?! + +[LAW3_D:LAWYER3] +Relax, relax. We're not at that part yet. + +[LAW3_E:LAWYER3] +Ohhh... I thought that you were taking care of this, I really did! + +[LAW3_F:LAWYER3] +And now those guidos say we gotta do them a favor. + +[LAW3_G:LAWYER3] +You mean I gotta do 'em a favor. + +[LAW3_H:LAWYER3] +Oh, of course that's what I mean. Do I look like I can intimidate a jury? + +[LAW3_I:LAWYER3] +I couldn't intimidate a child - and believe me, I've tried. + +[LAW3_J:LAWYER3] +Now, look. It's either that, or Forelli's cousin, Giorgio, gets five years for fraud. + +[LAW3_K:LAWYER3] +You gotta take these guys OUT! + +[LAW3_L:LAWYER3] +I understand. Help the jury change their minds. Don't worry about it. + +[LAW3_M:LAWYER3] +No no no no no - NO! I tried that. The jury case didn't go so well, + +[LAW3_N:LAWYER3] +so MAKE them change their minds. + +[LAW3_1:LAWYER3] +Giorgio sends his regards. + +[LAW3_2:LAWYER3] +Remember, guilty is a dirty word. + +[LAW3_3:LAWYER3] +Innocent until I say otherwise. + +[LAW3_4:LAWYER3] +You know he's not guilty. + +[LAW3_5:LAWYER3] +You remember Giorgio? You remember he's innocent. + +[LAW3_6:LAWYER3] +Not guilty, understand? Good. + +[LAW3_8:LAWYER3] +~r~You killed a Juror! + +[LAW3_9:LAWYER3] +~g~Smash up the Juror's car to get him out! + +[HELP40:LAWYER3] +You can smash cars up by using the hammer or a similar weapon. + +[HELP41:LAWYER3] +or you can ram them with a vehicle + +[LAW3_20:LAWYER3] +~g~Smash up the Juror's car! + +[LAW3_21:LAWYER3] +I can't believe this is happening! + +[LAW3_22:LAWYER3] +Unbelievable! + +[LAW3_23:LAWYER3] +Ok! Ok, man! I get the message! + +[LAW3_24:LAWYER3] +~g~That hammer would be useful. + +[LAW3_7:LAWYER3] +~g~Go and intimidate the two jurors, but DON'T kill them! + +[HELP23:LAWYER3] +You can follow the ~h~hammer blip~w~ on the radar if you want to buy melee weapons from the hardware store. + +[LAW3_16:LAWYER3] +Dumb Florida Moron. + +[LAW3_17:LAWYER3] +Get out of the way! + +{=================================== MISSION TABLE LAWYER4 ===================================} + +[LAW4_A:LAWYER4] +Avery, it goes without saying... Tommy! Tommy! Any progress? No, no, no - tell me later, tell me later. + +[LAW4_B:LAWYER4] +Tommy, this is Avery Carrington - I believe you met at the party? + +[LAW4_C:LAWYER4] +Not in person. + +[LAW4_D:LAWYER4] +Howdy. + +[LAW4_E:LAWYER4] +Avery here has a proposition. + +[LAW4_F:LAWYER4] +Haven't we got other things on our mind? + +[LAW4_G:LAWYER4] +I'm trying to keep the wolves from the door, so could you please cut me some slack? + +[LAW4_H:LAWYER4] +I'm stretched like a wire and even if I'm dead by the end of the week, I'd like to think that I didn't die poor. + +[LAW4_I:LAWYER4] +Now just calm down, both of you. + +[LAW4_J:LAWYER4] +Son, you help me and any greaseballs giving you a hard time, I'll see to it they take a long dirt nap. + +[LAW4_K:LAWYER4] +Ok. What could I do for ya'? + +[LAW4_L:LAWYER4] +This delivery company's got its depot on some prime land. They won't sell. + +[LAW4_M:LAWYER4] +They're hanging on like a big old prairie rat, so we gotta go in there and smoke that vermin out. + +[LAW4_N:LAWYER4] +Head on down there and stir up a hornet's nest + +[LAW4_O:LAWYER4] +- the security will have their hands full and then you can sneak in and put 'em out of business. + +[LAW4_P:LAWYER4] +And you could drop by Rafael's for a change of clothes. You might be there a while, but yeah, go for it. + +[LAW4_Q:LAWYER4] +Should be a riot. + +[LAW4_R:LAWYER4] +If the balls drop like they should, stop by my office sometime... + +[LAW4_1:LAWYER4] +Please disperse. The management will discuss any grievances in the appropriate manner! + +[LAW4_2:LAWYER4] +Please disperse. Go back to your homes! + +[LAW4_3:LAWYER4] +Please disperse! This is inappropriate! + +[LAW4_4:LAWYER4] +Please disperse. You will all end up on the streets. + +[LAW4_5:LAWYER4] +Sticks out, boys! Let's crack some commie skulls! + +[LAW4_13:LAWYER4] +~g~Start fighting with at least 4 workers to get a riot started. + +[LAW4_14:LAWYER4] +~g~Destroy the vans in the compound! + +[HELP38:LAWYER4] +If you take out someone who's holding a weapon, they will drop it. + +[HELP39:LAWYER4] +You can target and shoot explosive barrels but keep your distance. + +{=================================== MISSION TABLE MIAMI_1 ===================================} + +[T4X4_1A:MIAMI_1] +~g~You have ~1~ seconds to collect ~y~24~g~ checkpoints. ~g~You may collect them in ~y~ANY ORDER. + +[T4X4_1B:MIAMI_1] +~y~PASS THROUGH~g~ the first checkpoint to start the ~r~TIMER. + +[T4X4_1C:MIAMI_1] +~1~ of 24! + +[GETBIK1:MIAMI_1] +You have ~1~ seconds to get on a PCJ 600! + +[GETBIK3:MIAMI_1] +~r~You need a PCJ 600 to attempt this mission! + +{=================================== MISSION TABLE MM ===================================} + +[BLOD_04:MM] +CAR HEALTH: + +[BLOD_05:MM] +~g~TARGET TIME: ~1~ Minute + +[BLOD_06:MM] +~g~TARGET TIME: ~1~ Minutes + +[BLOD_07:MM] +NEW Best Time: ~1~ Seconds + +[BLOD_08:MM] +Cars Destroyed: ~1~ + +[BLOD_09:MM] +$~1~ + +[BLOD_10:MM] +WINNER!! + +[BLOD_01:MM] +Drive through the checkpoints to increase your overall time. + +[BLOD_02:MM] +You will fail if your overall time reaches zero. + +[BLOD_03:MM] +Get your overall time above the Target Time to win! + +{=================================== MISSION TABLE OVALRIG ===================================} + +[HOTR_01:OVALRIG] +~g~The Race lasts for 12 laps. Only 1st, 2nd and 3rd places qualify for winnings. + +[HOTR_02:OVALRIG] +~g~If your car is destroyed you will be disqualified. + +[HOTR_03:OVALRIG] +~g~When your car is damaged you can get it repaired at the pitstop. + +[HOTR_04:OVALRIG] +~g~This is the way to leave the stadium. + +[HOTR_05:OVALRIG] +Car Health: + +[HOTR_06:OVALRIG] +Laps: + +[HOTR_07:OVALRIG] +New best time: ~1~:0~1~ + +[HOTR_08:OVALRIG] +Time: ~1~:~1~ + +[HOTR_10:OVALRIG] +Race Time: + +[HOTR_09:OVALRIG] +Position: + +[HOTR_12:OVALRIG] +~r~Your car has been destroyed! + +[HOTR_13:OVALRIG] +~r~You didn't win the race! + +[HOTR_14:OVALRIG] +~r~You have been disqualified! + +[HOTR_15:OVALRIG] +Time: ~1~:~1~ + +[HOTR_16:OVALRIG] +Time: ~1~:0~1~ + +[HOTR_17:OVALRIG] +Best Time: ~1~:~1~ + +[HOTR_18:OVALRIG] +Best Time: ~1~:0~1~ + +[HOTR_19:OVALRIG] +Best Time: NA + +[HOTR_20:OVALRIG] +New Best Time: ~1~:~1~ + +[HOTR_21:OVALRIG] +New Best Time: ~1~:0~1~ + +[HOTR_22:OVALRIG] +Best Result: NA + +[HOTR_23:OVALRIG] +Best Result: 1st + +[HOTR_24:OVALRIG] +Best Result: 2nd + +[HOTR_25:OVALRIG] +Best Result: 3rd + +[HOTR_26:OVALRIG] +Best Result: ~1~th + +[HOTR_27:OVALRIG] +Best Lap Time: ~1~.~1~ seconds + +[HOTR_28:OVALRIG] +Best Lap Time: ~1~.0~1~ seconds + +[HOTR_29:OVALRIG] +$~1~ + +[HOTR_30:OVALRIG] +1ST PLACE + +[HOTR_31:OVALRIG] +2ND PLACE + +[HOTR_32:OVALRIG] +3RD PLACE + +[HOTR_33:OVALRIG] +Best Lap Time: NA + +[HOTR_11:OVALRIG] +New best lap time: ~1~.~1~ seconds + +[HOTR_34:OVALRIG] +New best lap time: ~1~.0~1~ seconds + +{=================================== MISSION TABLE PHIL1 ===================================} + +[PHIL1_A:PHIL1] +Phil? + +[PHIL1_B:PHIL1] +RUN! + +[PHIL1_C:PHIL1] +Run + +[PHIL1_E:PHIL1] +Shit Phil, you drink that stuff? + +[PHIL1_F:PHIL1] +Hell, you don't have to drink it + +[PHIL1_G:PHIL1] +- just a good whiff will set you off. Hoowwee! + +[PHIL1_H:PHIL1] +Listen Phil, you said you could fix me up with some firepower... + +[PHIL1_I:PHIL1] +Sure thing. + +[PHIL1_J:PHIL1] +There's some Mexican gun-runner been doing me for business of late. + +[PHIL1_K:PHIL1] +He does his weekly run about now. + +[PHIL1_L:PHIL1] +Ram his hardware off the back of his trucks before he goes to ground. + +[PHIL1_M:PHIL1] +And you'd be doing me a favor while you're at it. + +[PHIL1_N:PHIL1] +Then finish him off. + +[PHI1_01:PHIL1] +~g~Go and knock the arms off the back of the dealers' trucks. + +[PHI1_02:PHIL1] +~g~The arms dealer dropped his load. Smash the crate and pick up the weapon. + +[PHI1_03:PHIL1] +~g~Looks like they have called for back up. + +[PHI1_04:PHIL1] +~g~Now go and finish off the remaining arms dealers. + +[PHI1_HP:PHIL1] +When using Detonator Grenades, throw a grenade then trigger the explosion at any time. + +[PHIL1_O:PHIL1] +Hoooooweeeeee! + +[PHIL1_D:PHIL1] +Never get a naked flame too close to one of Phil Cassidy's Boomshine stills! + +{=================================== MISSION TABLE PHIL2 ===================================} + +[PHIL2_A:PHIL2] +Hey Phil, how's it goin? + +[PHIL2_B:PHIL2] +Heeyyyy, Tommy. Howyadoin'? Ish been too long... + +[PHIL2_C:PHIL2] +I swear you should lay off that boomshine, man - + +[PHIL2_D:PHIL2] +smells like paint stripper. Making my eyes burn... + +[PHIL2_E:PHIL2] +Shshs shhh youshelf Tommy, + +[PHIL2_F:PHIL2] +and come over here because there's someshin' I wanna show you.. someshin. + +[PHIL2_G:PHIL2] +Woof! God! Should I be able to smell that from way over here? I'm feeling woozy. + +[PHIL2_H:PHIL2] +Don'tchaworry about the shmell Tommy, you jush wash thish. + +[PHIL2_I:PHIL2] +Shittycheapbatteriesh or shumin'. There'sh shum more on the bench. + +[PHIL2_J:PHIL2] +TA-DAAA! + +[PHIL2_K:PHIL2] +Aww Damn! + +[PHI2_01:PHIL2] +~g~Quick, get Phil to the hospital. + +[PHI2_03:PHIL2] +~r~Phil Cassidy is dead!!! Now who's gonna supply arms in Vice City? + +[PHI2_05:PHIL2] +Not the hospital, man! Too many cops and Viet Cong! + +[PHI2_06:PHIL2] +There's an ex-army surgeon owes me a few favors and a lawnmower. + +[PHI2_07:PHIL2] +He's got a place down Little Havana - ooo look, a giant fish. + +[PHI2_08:PHIL2] +Watch out! Charlie in the tree line! + +[PHI2_09:PHIL2] +Is it me or are the roads made of jelly? + +[PHI2_10:PHIL2] +Broken Spoon to Mother Hen, you copy? + +[PHI2_11:PHIL2] +Spooney Wooney Woo Woo Woooo! + +[PHI2_12:PHIL2] +He's come for me boy! + +[PHI2_13:PHIL2] +Black feathered wings beating all around... + +[PHI2_14:PHIL2] +It's beautiful, man ... it's beautiful ... but so cold ... + +[PHI2_15:PHIL2] +10-4 we've got a drunk driver. + +[PHI2_04:PHIL2] +PHIL'S HEALTH: + +[PHI_AS1:PHIL2] +PHILS PLACE ASSET COMPLETED + +[PHI_AS2:PHIL2] +~g~New Weapons available to purchase from Phils Place. + +{=================================== MISSION TABLE PIZZA ===================================} + +[PIZ1_01:PIZZA] +~g~Go deliver these pizzas, you must throw the pizza to the customers. Do a drive-by to throw the pizzas. + +[PIZ1_02:PIZZA] +~g~You have thrown all your pizzas, go back and get some more. + +[PIZ1_05:PIZZA] +~g~You have five minutes to deliver the orders before the customers phone another pizza shop. + +[PIZ1_07:PIZZA] +~r~You killed the customer! You're fired. + +[PIZ1_08:PIZZA] +~r~You are out of time. You're fired. + +[PIZ1_09:PIZZA] +~r~You destroyed our bike! You're fired. + +[PIZ1_11:PIZZA] +Hey! Get back on the bike! + +[PIZ1_12:PIZZA] +Pizzas left: + +[PIZ1_06:PIZZA] +Press the~h~ ~k~~TOGGLE_SUBMISSIONS~~w~ when on the bike to cancel the mission. + +[PIZ1_13:PIZZA] +Get these delivered nice and hot. + +[PIZ1_14:PIZZA] +Pal, pizza's for you. + +[PIZ1_15:PIZZA] +Hey, come on Mister, deliver these quick. + +[PIZ1_16:PIZZA] +What are you waiting around for Mister? You got pizza to deliver. + +[PIZ1_17:PIZZA] +I know you didn't want to be a pizza boy, well I don't give a damn. + +[PIZ1_18:PIZZA] +Deliver these. + +[PIZ1_19:PIZZA] +These need delivering. + +[PIZ1_20:PIZZA] +Come on Mister, deliver these things or you're sacked. + +[PIZ1_21:PIZZA] +We got people waiting pal. + +[PIZ1_22:PIZZA] +What are you waiting around for? These need delivering! + +[PIZ1_23:PIZZA] +Deliver the damn food Mister. + +[PIZ1_24:PIZZA] +These need delivering pal. + +[PIZ1_25:PIZZA] +Man, can you take these? + +[PIZ1_26:PIZZA] +Mister, deliver these pronto, avamos amigo. + +[PIZ1_27:PIZZA] +Come on, we're in a rush, deliver these. + +[PIZ1_28:PIZZA] +You again? well deliver these quick pal. + +[PIZ1_29:PIZZA] +No wasting time this time pal. + +[PIZ1_30:PIZZA] +Come on you lazy bastard, deliver this crap on time. + +[PIZ1_31:PIZZA] +You'll never get a promotion unless you move faster this time. + +[PIZ1_32:PIZZA] +~r~Pizza's too hot to handle? + +[PIZ1_33:PIZZA] +~g~Return to the restaurant for more orders. + +[PIZ1_34:PIZZA] +~g~Pizza delivered, here's your cash. + +[PIZ_WON:PIZZA] +Pizza Mission Complete. Your max Health increased to 150. + +{=================================== MISSION TABLE PORN1 ===================================} + +[POR1_A:PORN1] +Action. + +[POR1_B:PORN1] +Whoa! Now that's big. + +[POR1_C:PORN1] +12 inches. That is regulation baby. + +[POR1_D:PORN1] +CUT!! Who IS this idiot? You! YOU! Why are you in my space? WHY? + +[POR1_E:PORN1] +What is all this crap? + +[POR1_F:PORN1] +Aliens? Fishing poles? + +[POR1_G:PORN1] +Who's ever seen a shark that big? + +[POR1_H:PORN1] +All this stuff's gotta go. + +[POR1_I:PORN1] +Why'd you get in this business, ya prick? + +[POR1_J:PORN1] +Huh? + +[POR1_K:PORN1] +For the pussy, that's why! What is this?? + +[POR1_L:PORN1] +This is my art - SECURITY! + +[POR1_M:PORN1] +Look, you pompous asshole, I own you now. I own all of this. + +[POR1_N:PORN1] +We're gonna turn this place around... + +[POR1_O:PORN1] +I'm gonna make you rich. + +[POR1_P:PORN1] +Uh. You're - You - you're Tommy Vercetti? But I thought that you were... + +[POR1_Q:PORN1] +That's right. + +[POR1_R:PORN1] +We're gonna be making some changes around here and start making some real money. + +[POR1_S:PORN1] +Actually, have you ever thought about, umm... + +[POR1_T:PORN1] +But first we're going to need some good-looking broads. + +[POR1_U:PORN1] +Yeh, girls are fine but you... whew! + +[POR1_02:PORN1] +~g~ Go and take out Candy's pimp, then return and pick up Candy. + +[POR1_04:PORN1] +Yo, Candy. I'm looking for movie talent - you interested? + +[POR1_05:PORN1] +Sure! But, you'd have to talk to my agent... + +[POR1_06:PORN1] +The HELL are you doin'? + +[POR1_07:PORN1] +You should have stayed at home today! + +[POR1_7B:PORN1] +Can you believe this asshole? + +[POR1_08:PORN1] +Hey Mercedes! + +[POR1_09:PORN1] +Hey Tommy! You wanna party? + +[POR1_10:PORN1] +Not now sweets. You interested in doing some movies? + +[POR1_11:PORN1] +Of course. As long as it's cheap and sleazy. + +[POR1_13:PORN1] +~g~Take the girls back to the Studio to meet Steve. + +[POR1_17:PORN1] +Whoa, cool shark! + +[POR1_18:PORN1] +~r~Mercedes is dead! + +[POR1_20:PORN1] +Tommy where are you going? Get back here! + +[POR1_21:PORN1] +Where are you going? + +[POR1_22:PORN1] +Tommy, when are we going to spend some time alone together? + +[POR1_01:PORN1] +~g~Candy Suxxx would be perfect for a starring role! + +[POR1_12:PORN1] +~g~Take Candy with you to meet up with Mercedes. + +[POR1_16:PORN1] +Maybe later, babe... + +[POR1_24:PORN1] +~g~Go back and collect Candy. + +[POR1_25:PORN1] +~g~You have left Candy behind, go and get her. + +[POR1_23:PORN1] +~g~Candy will be taking care of business ~h~Downtown~g~. + +[POR1_26:PORN1] +~g~Here's Candy, looks like she has been with Congressman Shrub again. + +[POR1_15:PORN1] +Tommy, you coming in for a warm-up? + +[POR1_14:PORN1] +Heh heh - you're hired! + +[POR1_27:PORN1] +Come on, let's go. + +[POR1_28:PORN1] +Tommy be careful! My implants aren't insured yet! + +[POR1_29:PORN1] +You call that driving? + +[POR1_30:PORN1] +I can't do porno after this! + +[POR1_31:PORN1] +What? Are you trying to kill me? I thought I was the star! + +{=================================== MISSION TABLE PORN2 ===================================} + +[POR2_A:PORN2] +How's filming going, Steve? + +[POR2_B:PORN2] +Well, Candy is a natural and that new girl - she's insatiable! + +[POR2_C:PORN2] +She went through half the cast and crew before I even took a light reading. + +[POR2_D:PORN2] +Anyway, hey, tomorrow we're going on location to shoot the boat scenes - + +[POR2_E:PORN2] +Boat scenes?! What boat scenes? + +[POR2_F:PORN2] +The fishermen are in the throes of passion when this giant shark comes in - + +[POR2_G:PORN2] +What'd I say about the giant shark? + +[POR2_H:PORN2] +I said, 'NO GIANT SHARK', alright? + +[POR2_I:PORN2] +Just keep the cameras pointed at the poontang! + +[POR2_J:PORN2] +Ok ok, hey Tommy, a guy's gotta try, right? + +[POR2_K:PORN2] +Get those flyers printed up? + +[POR2_L:PORN2] +Yeah, but nobody's gonna let us distribute those things, I mean + +[POR2_M:PORN2] +They're just too, uh, they're unimaginative. + +[POR2_N:PORN2] +You don't worry about that. + +[POR2_O:PORN2] +I've got my own ideas for distribution. + +[POR2_P:PORN2] +O.K. Hey, Candy, uh - in my trailer. + +[POR2_01:PORN2] +~g~There is a seaplane that was used as a prop in some old indie film round the back of the studios. + +[POR2_02:PORN2] +~g~Pick one of the checkpoints to start dropping the flyers from. + +[POR2_03:PORN2] +~g~Drop the flyers all the way to the end checkpoint. + +[POR2_04:PORN2] +~r~LOW FUEL!!! + +[POR2_05:PORN2] +~g~Use it to distribute the flyers around town. + +[DILDO:PORN2] +Skimmer Fuel: + +[POR2_Q:PORN2] +Oh, boy. + +[PORN2_9:PORN2] +~g~You have ~1~ seconds to return to a Skimmer before the mission ends. + +{=================================== MISSION TABLE PORN3 ===================================} + +[POR3_A:PORN3] +Ok, what's the problem now? + +[POR3_B:PORN3] +SSShhhh! + +[POR3_C:PORN3] +Well, after his close encounter with the nympho-invaders, + +[POR3_D:PORN3] +our hero finds himself unable to think of anything but this huge phallic mountain - + +[POR3_E:PORN3] +and that's when I want to do the scene with the vat of mashed potatoes, but then we, uh - + +[POR3_F:PORN3] +I don't give a crap about that! + +[POR3_G:PORN3] +J - Just keep going, keep going! + +[POR3_H:PORN3] +Hey Tommy... + +[POR3_I:PORN3] +You mentioned something about some legal problem on the phone? + +[POR3_J:PORN3] +Congressman Alex Shrub has jumped on the pre-election bandwagon, he's going after the puritan vote. + +[POR3_K:PORN3] +Rumors are he's gonna support measures to restrict, shall we say, + +[POR3_L:PORN3] +the more fleshy aspects of this nation's great entertainment industry. + +[POR3_M:PORN3] +Great. + +[POR3_N:PORN3] +Candy! You know Shrub, + +[POR3_O:PORN3] +you guys get up to anything kinky? + +[POR3_P:PORN3] +Oh yeah, oh yeah, oh yeah! Yes yes yes YES OOOoooh! + +[POR3_Q:PORN3] +Please - tell me you got that. + +[POR3_R:PORN3] +Was that part of the, uh... or was she talking to..? + +[POR3_S:PORN3] +Hey, I can never tell. Anyway... + +[POR3_T:PORN3] +You're probably best following her after the shoot, + +[POR3_U:PORN3] +see if she'll lead you to their new love nest. + +[POR3_V:PORN3] +You got a camera? + +[POR3_X:PORN3] +Yeah. Get him a camera. + +[POR3_02:PORN3] +~r~You've killed the Congressman! There's no way you can blackmail him now. + +[POR3_03:PORN3] +~r~You've alerted the Congressman's protection, they will get him out of there immediately. + +[POR3_04:PORN3] +Uh, Candy, could you call me Martha? + +[POR3_05:PORN3] +Oh Alex - I mean Martha. Whatever you say... + +[POR3_06:PORN3] +Martha, someone's watching.. how kinky. + +[POR3_07:PORN3] +You! Give me that camera! + +[POR3_01:PORN3] +~g~Follow Candy's ~h~Stretch~g~. + +[POR3_15:PORN3] +~r~You trashed Candy's Stretch! + +[POR3_17:PORN3] +~g~Get back to the Porn Studios with the film. + +[POR3_19:PORN3] +~r~You ran out of film! + +[POR3_21:PORN3] +~g~You lost Candy's Stretch! + +[POR3_22:PORN3] +~g~The WK Chariot Hotel across from his balcony should provide an ideal photo-grabbing location. + +[POR3_23:PORN3] +~g~There is a side door that will allow you access to the hotel. + +[POR3_08:PORN3] +Press and hold the~h~ ~k~~PED_LOCK_TARGET~ ~w~button to ~h~target~w~ with the camera. + +[POR3_09:PORN3] +Press and hold the~h~ ~k~~PED_LOCK_TARGET~ ~w~button to ~h~target ~w~with the camera. + +[POR3_10:PORN3] +Press the~h~ ~k~~PED_SNIPER_ZOOM_IN~ ~w~button to ~h~zoom in ~w~with the camera and the~h~ ~k~~PED_SNIPER_ZOOM_OUT~ ~w~button to ~h~zoom out ~w~again. + +[POR3_11:PORN3] +Press the~h~ ~k~~PED_SNIPER_ZOOM_IN~ ~w~button to ~h~zoom in ~w~with the camera and the~h~ ~k~~PED_SNIPER_ZOOM_OUT~ ~w~button to ~h~zoom out ~w~again. + +[POR3_12:PORN3] +Press the~h~ ~k~~PED_FIREWEAPON~ ~w~button to take a picture. + +[POR3_13:PORN3] +Press the~h~ ~k~~PED_FIREWEAPON~ ~w~button to take a picture. + +[POR3_14:PORN3] +Press the~h~ ~k~~PED_FIREWEAPON~ ~w~button to take a picture. + +[POR3_20:PORN3] +~g~If you need transport, use the ~h~Sparrow~g~ round the back. + +[POR3_16:PORN3] +~g~You need three good blackmail photographs of Alex Shrub with Candy. + +[POR3_24:PORN3] +PHOTOS TAKEN: + +{=================================== MISSION TABLE PORN4 ===================================} + +[POR4_A:PORN4] +I'm sorry, but I just can't swallow this right now. + +[POR4_B:PORN4] +Oh COME ON darling! + +[POR4_C:PORN4] +He's hung like a sperm whale for pity's sake, + +[POR4_D:PORN4] +how can you not feel the part?! + +[POR4_E:PORN4] +But Stevie... + +[POR4_F:PORN4] +How's my star director? + +[POR4_G:PORN4] +Oh, man. The struggle between the artistic integrity and + +[POR4_H:PORN4] +the humping, pumping action continues unabated. + +[POR4_I:PORN4] +And before you ask, yes, all four videos will be released by their... + +[POR4_J:PORN4] +Honey, can you PLEASE keep the anaconda in the shot, + +[POR4_K:PORN4] +he costs more per hour than you do! + +[POR4_L:PORN4] +Oh, sorry Steve. + +[POR4_M:PORN4] +I was thinking, we need some kind of big stunt to really promote the launch. + +[POR4_N:PORN4] +Something that will make a real impact on the City - you got any ideas? + +[POR4_O:PORN4] +Well, in the old days they used to have gala events, + +[POR4_P:PORN4] +stars, limos, the night sky crisscrossed with searchlights... + +[POR4_Q:PORN4] +Searchlights! I've got an idea... + +[POR4_R:PORN4] +...yeah, yeah, yeah. The little sequined numbers, and the limos, oh, premieres + +[POR4_S:PORN4] +Oh, yes ma'am, of course ma'am, + +[POR4_T:PORN4] +and the press, and the barrage of lights... + +[POR4_01:PORN4] +~g~Go ~y~Downtown~g~ and adjust the spotlight on top of the building. + +[POR4_02:PORN4] +~g~A fast bike will be needed to jump from roof to roof. The Security Guard usually drives a ~y~PCJ 600~g~ to work... + +[POR4_03:PORN4] +~g~You will need to get onto the roofs of the buildings. There should be a lift into one of the upper offices... + +[POR4_06:PORN4] +~g~Return to the lower office if you need access to the rooftops again. + +[POR4_07:PORN4] +~g~You will need a bike so you can jump from building to building. + +[POR4_08:PORN4] +~g~Smash through the window to start the course. You have until 07:00 before it gets too light to get up there unseen. + +[POR4_09:PORN4] +~g~The pickups will show you which building to jump to next. + +[POR4_10:PORN4] +~r~It's too light to get up there unseen. + +[POR4_11:PORN4] +~g~Return to the ladder if you need access to the rooftops again. + +[POR4_05:PORN4] +~g~These stairs will lead round to a lower office. + +[POR_AS1:PORN4] +FILM STUDIO ASSET COMPLETED + +[POR_AS2:PORN4] +~g~Inter Global Films will now generate revenue up to a maximum of $~1~. Make sure you collect it regularly. + +{=================================== MISSION TABLE PROT1 ===================================} + +[PRO1_B:PROT1] +I can't stand this look. Tommy, whadaya say? Whadaya say we put a bar in... + +[PRO1_D:PROT1] +Listen to me, + +[PRO1_E:PROT1] +The time to take over this town is now. It's all out there waiting for us. + +[PRO1_F:PROT1] +We need to start seizing territory, + +[PRO1_G:PROT1] +let Vice City know we're the new players in town, know what I'm saying? + +[PRO1_I:PROT1] +What you need is a legitimate front Tommy, real estate. It's never done me no harm. + +[PRO1_J:PROT1] +We need to start using some muscle or we can kiss all that hard work goodbye. + +[PRO1_K:PROT1] +Local businesses know Diaz is dead, and they're refusing to pay protection! + +[PRO1_L:PROT1] +Ooh! We could try bribery... + +[PRO1_M:PROT1] +Bribery? Screw bribery! I'll show you how to make 'em scared! + +[PRO1_01:PROT1] +~g~Do a hit and run on the shop fronts and the owners will be begging for protection. + +[PRO1_03:PROT1] +~r~This was supposed to be a hit and run, not a 'hit and have coffee'. + +[PRO1_04:PROT1] +My livelihood, destroyed! + +[PRO1_05:PROT1] +Ruined...RUINED!! + +[PRO1_06:PROT1] +I pay through the ass for protection! + +[PRO1_07:PROT1] +My beautiful window display! + +[PRO1_08:PROT1] +My store. My wonderful store. + +[PRO1_09:PROT1] +Vercetti. Remember the name. + +[PRO1_10:PROT1] +I run this town now. ME! + +[BUYP1:PROT1] +You can now buy property in certain areas of the map. + +[BUYP2:PROT1] +If you see a green house pickup, you can buy that property. + +[PRO1_N:PROT1] +I'll be back here in five minutes... + +[PRO1_11:PROT1] +~g~Get to ~y~The North Point Mall~g~ in ~y~Vice Point~g~. + +[PRO1_12:PROT1] +~g~Smash the panes of glass in each shop front and the owners will be begging for new protection. + +[PRO1_A:PROT1] +Oh, we gotta redecorate this place. We gotta make it look older. + +[PRO1_C:PROT1] +You're my lawyer, Rosenberg, not my interior decorator. Got it? + +[BUYP3:PROT1] +Stand inside the pickup, then press the ~h~~k~~PED_ANSWER_PHONE~~w~ button to purchase that property. + +[PRO1_13:PROT1] +~g~You have five minutes to smash them all. + +{=================================== MISSION TABLE PROT2 ===================================} + +[PRO2_A:PROT2] +What's the problem? + +[PRO2_B:PROT2] +Some bar is refusing to pay. + +[PRO2_C:PROT2] +They reckon they're protected by a local gang of thugs. + +[PRO2_D:PROT2] +But don't worry Tommy, I can handle it. + +[PRO2_E:PROT2] +You call this handling it? + +[PRO2_F:PROT2] +You two, off your asses... + +[PRO2_G:PROT2] +Let's go. + +[PRO2_10:PROT2] +~g~Two more have made a run for it. Track them down and finish this. + +[PRO2_11:PROT2] +Get in the car, useless. + +[PRO2_02:PROT2] +Your protection needs a little more protection. + +[PRO2_03:PROT2] +Aw hell, not again! I don't need this crap! + +[PRO2_04:PROT2] +These idiots operate out of DBP Security around the block. + +[PRO2_05:PROT2] +You guys just sort it out amongst yourselves. + +[PRO2_06:PROT2] +I'll be seeing you later. + +[PRO2_07:PROT2] +Yeah, yeah, whatever. + +[PRO2_09:PROT2] +~g~Go and speak to the Front Page Bar Owner. + +[PRO2_01:PROT2] +~g~Take out the guards protecting the Front Page Bar and find out who supplied them. + +[PRO2_08:PROT2] +~g~DBP Security will know you are on your way, go and get them before they clear out. + +{=================================== MISSION TABLE PROT3 ===================================} + +[PRO3_A:PROT3] +You moron! What were you thinking?! + +[PRO3_B:PROT3] +Do you realize what this means?! + +[PRO3_C:PROT3] +We could all be sunk! + +[PRO3_D:PROT3] +The timer must have got screwed. + +[PRO3_E:PROT3] +That place was wired to go up like a firework factory. + +[PRO3_F:PROT3] +Then somebody tipped off the cops... + +[PRO3_G:PROT3] +What's the problem, fellas? + +[PRO3_H:PROT3] +Mike was supposed to torch some place in the mall, + +[PRO3_I:PROT3] +but he screwed the fuses and now the cops are crawling all over it. + +[PRO3_J:PROT3] +We gotta get our stuff and get out of here! + +[PRO3_K:PROT3] +Relax, both of you, let me think for a second! + +[PRO3_L:PROT3] +Tommy Vercetti just doesn't cut and run. + +[PRO3_M:PROT3] +The cops are gonna be going over that building with a fine toothed comb, right? + +[PRO3_N:PROT3] +But that takes time. + +[PRO3_O:PROT3] +We gotta go in and torch that place ourselves. + +[PRO3_P:PROT3] +Yeah, but... + +[PRO3_Q:PROT3] +No one but a cop could get within a mile of that place! + +[PRO3_R:PROT3] +So we go as cops. + +[PRO3_S:PROT3] +We gotta get uniforms - and we're gonna need a squad car. + +[PRO3_T:PROT3] +All thanks to you Mike. + +[PRO3_U:PROT3] +I'm sorry. + +[PRO3_V:PROT3] +I got it. + +[PRO3_W:PROT3] +What we got to do is lure the cops in with the finger, + +[PRO3_X:PROT3] +put them in a lock-up + +[PRO3_Y:PROT3] +and jump 'em. + +[PRO3_Z:PROT3] +Good plan. Let's go! + +[PRO3_A1:PROT3] +Alright. + +[PRO3_01:PROT3] +Ok Lance, let's get the cops' attention! + +[PRO3_02:PROT3] +~g~ Take a cop car and go and plant the bomb at the Tarbrush Coffee Shop in the Mall. + +[PRO3_03:PROT3] +~g~ You've left Lance behind, go and get him. + +[PRO3_04:PROT3] +~g~ Let's go. + +[PRO3_05:PROT3] +~r~You killed Lance! + +[PRO3_07:PROT3] +~g~ You have blown your cover. Hurry up and plant the bomb! + +[PRO3_09:PROT3] +Tie 'em up and gag 'em! + +[PRO3_10:PROT3] +Ooo. Fits perfectly! + +[PRO3_11:PROT3] +Bit tight around the crotch though... + +[PRO3_12:PROT3] +Oh yeah yeah, mine too. Mine too. + +[PRO3_13:PROT3] +Easy brother! No cop drives this bad! + +[PRO3_14:PROT3] +Remember - smile at the other cops + +[PRO3_15:PROT3] +Hey there officer. Nice badge, nice badge. + +[PRO3_16:PROT3] +Real smooth, Lance. + +[PRO3_17:PROT3] +Ok, timers are set, 5 seconds and ticking. + +[PRO3_18:PROT3] +5 seconds?!! We got to get the hell out of here! + +[PRO3_19:PROT3] +Now that got them really irritated. + +[PRO3_20:PROT3] +~g~ Get two cops to follow you into the garage. + +[PRO3_21:PROT3] +~g~Get a wanted level so the cops will follow you into the lock-up. + +[PRO3_22:PROT3] +~g~The lock-up door is blocked! You need to clear the door so it can close. + +[PRO3_23:PROT3] +~g~Walk into the marker to plant the bomb. + +[PRO3_24:PROT3] +~g~Get clear of the Cafe! + +[PRO_AS1:PROT3] +PROTECTION RING ASSET COMPLETED + +[PRO_AS2:PROT3] +~g~Vercetti Estate will now generate revenue up to a maximum of $~1~. Make sure you collect it regularly. + +[PRO3_08:PROT3] +~g~ Get back to ~h~Vercetti Estate~g~ on ~h~Starfish Island~g~. + +{=================================== MISSION TABLE RACES ===================================} + +[RACES_2:RACES] +~g~You need a vehicle to race, this is not a foot race! + +[RACES_3:RACES] +3..2..1.. GO GO GO! + +[RACES_8:RACES] +~r~You didn't win the race! + +[RACES00:RACES] +Race ~1~: + +[RACES01:RACES] +Terminal Velocity + +[RACES02:RACES] +Ocean Drive + +[RACES03:RACES] +Border Run + +[RACES04:RACES] +Capital Cruise + +[RACES05:RACES] +Tour! + +[RACES06:RACES] +V.C. Endurance + +[RACES07:RACES] +Entrance Fee: $~1~ + +[RACES08:RACES] +Best Time: ~1~:~1~ + +[RACES09:RACES] +Best Result: 1st + +[RACES10:RACES] +Best Result: 2nd + +[RACES11:RACES] +Best Result: 3rd + +[RACES12:RACES] +Best Result: 4th + +[RACES13:RACES] +Track Length: ~1~.~1~ km + +[RACES15:RACES] +Best Time: NA + +[RACES16:RACES] +Best Result: NA + +[RACES19:RACES] +You cannot afford to enter this race. + +[RACES22:RACES] +Best Time: ~1~:0~1~ + +[RACES23:RACES] +Track Length: ~1~.~1~ miles + +[RACES_1:RACES] +~g~Get a fast vehicle and get to the starting grid. + +[RACEHLP:RACES] +~w~Press the~h~ ~k~~PED_SPRINT~ ~w~button to start the selected race. Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ ~w~button to exit. + +{=================================== MISSION TABLE RCHELI1 ===================================} + +[WRECKED:RCHELI1] +~r~The vehicle is wrecked! + +[RCH1_4:RCHELI1] +Checkpoints: + +[RCH1_7:RCHELI1] +~g~There are 20 checkpoints in total. + +[RCH1_12:RCHELI1] +~g~The RC helicopter is getting too far out of range! + +[RCH1_13:RCHELI1] +~r~The RC helicopter went out of range! + +[RCH1_8:RCHELI1] { reVC update } +~g~If you wish to quit this mission press the ~h~~k~~VEHICLE_FIREWEAPON~ ~g~button to detonate your RC Helicopter. + +{=================================== MISSION TABLE RCPLNE1 ===================================} + +[RCPL1_4:RCPLNE1] +~g~Compete in a CHECKPOINT RACE with 3 other RC Plane's + +[RCPL1_5:RCPLNE1] +~g~Fly through the checkpoints scattered throughout Vice City. + +[RCPL1_6:RCPLNE1] { reVC update } +~g~If you wish to quit this mission press the ~h~~k~~VEHICLE_FIREWEAPON~ ~g~button to detonate your RC Plane. + +[RCPL1_8:RCPLNE1] +~g~Your RC Plane is going out of range! + +[RCPL1_9:RCPLNE1] +~r~Your RC Plane went out of range! + +{=================================== MISSION TABLE RCRACE1 ===================================} + +[RCRC1_1:RCRACE1] +~g~Compete in a CHECKPOINT RACE with 3 other RC Bandits over 2 LAPS + +[RCRC1_3:RCRACE1] +~g~Final lap! + +[RCR1_4:RCRACE1] +laps left: + +[RCR1_1:RCRACE1] +~g~Compete in a checkpoint race with 3 other RC Cars. + +[RCR1_2:RCRACE1] +~g~Be the first to complete two laps of the track to win! + +[RCR1_6:RCRACE1] +~g~Your RC Car is going out of range! + +[RCR1_7:RCRACE1] +~r~Your RC Car went out of range! + +{=================================== MISSION TABLE ROCK1 ===================================} + +[RBM1_A:ROCK1] +AllllllllRrrighttt! + +[RBM1_B:ROCK1] +Yessss! Brilliant, bloody brilliant! + +[RBM1_D:ROCK1] +Hey, you ever met Love Fist before? + +[RBM1_E:ROCK1] +No, I haven't but I've always loved your music. + +[RBM1_F:ROCK1] +Let me introduce you to the band. + +[RBM1_G:ROCK1] +This is Percy, Dick, and Willy's in the kaze, and that was Jezz in the booth earlier, + +[RBM1_H:ROCK1] +and guys, I want you to meet a good friend of mine. + +[RBM1_I:ROCK1] +This is Tommy. We go way back. + +[RBM1_J:ROCK1] +All right, pal. + +[RBM1_K:ROCK1] +And eh, what was your name again? + +[RBM1_L:ROCK1] +Leave it out, Jezz you, remember - + +[RBM1_M:ROCK1] +don't be playing them games with me, mate, + +[RBM1_N:ROCK1] +I'm too crafty for that, sunshine! + +[RBM1_O:ROCK1] +You see, the thing is, Tom, the boys need some help. + +[RBM1_P:ROCK1] +They ain't too connected here, they don't have the old 'how's your father?' + +[RBM1_Q:ROCK1] +We need some drugs, pal! + +[RBM1_R:ROCK1] +Gonna get on the old Love Fist fury, you know?! + +[RBM1_S:ROCK1] +Well, this is Vice City, man. What's the problem? + +[RBM1_U:ROCK1] +Love Juice, man! + +[RBM1_V:ROCK1] +Love Juice? + +[RBM1_W:ROCK1] +Aye, two parts boomshine, 1 part trumpet, 5 fizz bombs and a liter of petrol. + +[RBM1_X:ROCK1] +Can you help us out, pal? + +[RBM1_Y:ROCK1] +Aw, it would really mean a lot to the boys. + +[RBM1_Z:ROCK1] +You can do that for the boys, right? + +[RBM1_7:ROCK1] +~r~You did not get the Love Juice in time! + +[RBM1_8:ROCK1] +~r~Mercedes is dead! + +[RBM1_10:ROCK1] +~r~You idiot! You have destroyed the merchandise! + +[RBM1_13:ROCK1] +~g~Get the 'Love Juice' and Mercedes to the band before they are needed on stage. + +[RBM1_15:ROCK1] +~r~You have lost the dealer, our cash and the drugs! + +[RBM1_17:ROCK1] +~g~Kill the dealer and get the drugs! + +[MOB_07A:ROCK1] +Hey mate, the guys could do with some company, if you know what I mean... + +[MOB_07B:ROCK1] +I know just the girl. + +[ROK1_5:ROCK1] +Hey, Mercedes! + +[ROK1_6:ROCK1] +Hiya, Tommy. And how are you? + +[ROK1_7:ROCK1] +Just fine. Listen, you fancy having Love Fist? + +[ROK1_8:ROCK1] +Ok, but just as a favor I expect returned.. + +[RBM1_14:ROCK1] +~g~You need a car or a motorcycle! + +[RBM1_1:ROCK1] +~g~Go and collect Mercedes from her apartment. + +[RBM1_12:ROCK1] +~g~Go and collect the 'Love Juice' ingredients from the dealer. + +[ROK1_2:ROCK1] +NO LONGER NEEDED + +[ROK1_3:ROCK1] +NO LONGER NEEDED + +[MERC_39:ROCK1] +I'll see you later, big boy. + +[RBM1_C:ROCK1] +Hey, Tommy! Glad you could make it. + +[RBM1_9:ROCK1] +~g~Go and collect some love juice from the dealer for Love Fist! + +[ROK1_1A:ROCK1] +Looking for something special? I got what you need! + +[ROK1_9:ROCK1] +Thanks for the money, sucker! + +[RBM1_T:ROCK1] +We need Love Juice, man, you know? + +{=================================== MISSION TABLE ROCK2 ===================================} + +[RBM2_A:ROCK2] +Tommy, man. Am I glad to see you! + +[RBM2_B:ROCK2] +What's going on? + +[RBM2_C:ROCK2] +Bad vibes, Tommy.... + +[RBM2_E:ROCK2] +There's this cat, we hardly know him, but he knows us. + +[RBM2_F:ROCK2] +Like this cat. Knows all about us. + +[RBM2_G:ROCK2] +Knows that Willy likes his ladies' underwear, eh! + +[RBM2_H:ROCK2] +Or that Percy likes Duran Duran! + +[RBM2_K:ROCK2] +Yeah, the love rocket thing, right. But listen, this cat... + +[RBM2_L:ROCK2] +yeh, yeh, the guy, he wants Love Fist dead. + +[RBM2_M:ROCK2] +Dead Tommy. + +[RBM2_N:ROCK2] +Love Fist gone. You know what they say, the good die young. + +[RBM2_O:ROCK2] +but Tommy, you gotta save Love Fist! + +[RBM2_P:ROCK2] +We got a signing in two hours and I think... + +[RBM2_Q:ROCK2] +And the boys think the stalker's gonna try some monkey business there. + +[RBM2_1:ROCK2] +~g~Drive the limo to the signing event and try to draw the psycho out. + +[RBM2_2:ROCK2] +~r~You've wrecked the band's car! + +[RBM2_3:ROCK2] +~g~Get to the signing! + +[RBM2_4:ROCK2] +~g~Get the Psycho! Don't let him escape! + +[RBM2_5:ROCK2] +~r~You lost him, you idiot! + +[RBM2_7:ROCK2] +~r~The fans have been attacked, the psycho won't show! + +[RBM2_8:ROCK2] +~r~The security guards have been attacked, the psycho won't show! + +[PSYCH_1:ROCK2] +I'll see Love Fist burn! + +[PSYCH_2:ROCK2] +Love Fist ruined my life! + +[RBM2_I:ROCK2] +Shut up ye fool. Just 'cause Jezz bangs sheep. + +[RBM2_R:ROCK2] +Oi shut it! + +[RBM2_D:ROCK2] +Aye, I'm not joking, it's heavy stuff man, heavy you know? + +[RBM2_J:ROCK2] +It's a love rocket thing, you know? + +{=================================== MISSION TABLE ROCK3 ===================================} + +[RBM3_A:ROCK3] +Tommy! Tommy! Tommy, man, that psycho's back! + +[RBM3_B:ROCK3] +What's going on? + +[RBM3_C:ROCK3] +That psycho won't leave Love Fist alone! + +[RBM3_D:ROCK3] +You didnae kill him man. And now he's back. + +[RBM3_E:ROCK3] +Yeah, yeah, yeah, and the thing is... + +[RBM3_F:ROCK3] +The thing is, we need someone to drive the limo we can trust, + +[RBM3_G:ROCK3] +cause that nutter keeps making threats! + +[RBM3_I:ROCK3] +We're all bricking ourselves, man. + +[RBM3_J:ROCK3] +Okay guys, calm down, I'll handle this. + +[RBM3_K:ROCK3] +Normally I wouldn't busy myself with driving around a bunch of drunken Scottish bisexuals, + +[RBM3_L:ROCK3] +but, in your case I'll make an exception. + +[RBM3_4:ROCK3] +~r~You've killed Love Fist! + +[RBM3_6:ROCK3] +DETONATION: + +[RBM3_1:ROCK3] +~g~Drive Love Fist to the venue. + +[RBM3_2:ROCK3] +While the bomb is armed if you try to leave the car it will explode... + +[RBM3_3:ROCK3] +If the detonation bar completely fills the bomb will explode. + +[RBM3_8:ROCK3] +The faster you drive the lower the detonation bar will go. + +[RBM3_7:ROCK3] +~g~BOMB DEFUSED! + +[ROK3_62:ROCK3] +so we thought we'd show you our Temple of Rock - + +[ROK3_63:ROCK3] +Get a feel for that Love Fist fury! + +[ROK3_64:ROCK3] +Listen to yourself, man. It's papier-mache and gaffa tape. + +[ROK3_65:ROCK3] +Hey, to the kids, it's a temple and we are the priests! + +[ROK3_66:ROCK3] +Aye, well, if the kids like their priests half cut and tone deaf, + +[ROK3_67:ROCK3] +who am I to argue? + +[ROK3_68:ROCK3] +Oh geez, the tape's getting chewed again. + +[ROK3_69:ROCK3] +At this rate, we'll never get to play live. + +[ROK3_70:ROCK3] +Oohh shite! My bowels... + +[ROK3_73:ROCK3] +Jezz is running the tape, + +[RBM3_9:ROCK3] +If you are stopped or drive slowly the detonation bar will increase. + +[RBM3_H:ROCK3] +I'm shitin' masel' man. I need ma ma! + +[ROK3_71:ROCK3] +We gotta get on with it - thanks again Tommy, Know what I am saying, nice one, bye! + +[ROK3_1:ROCK3] +At last man, time for a well earned drink. The venue's just a hundred yards down the road. + +[ROK3_2:ROCK3] +Better make it a large one then. Hey Tommy, change the tunes, man. + +[ROK3_3:ROCK3] +I get confused if my head ain't banging. Ah look, what's this? Hey Tommy, stick this tape on. + +[ROK3_4:ROCK3] +Love Fist. Your time polluting the airwaves is over. I gave you the chance to be friends. + +[ROK3_5:ROCK3] +Now, I'm giving you the chance to die. Try to slow down and your limousine will explode, along with your BIG, HAIRY ARSES! + +[ROK3_6:ROCK3] +Tommy pal, you gotta save the band! I'm getting bored of this. Just keep the pedal to the metal!! + +[ROK3_7:ROCK3] +We gotta find the bomb! Can't we just drive around all day? Aye, we've got plenty to drink.. + +[ROK3_8:ROCK3] +Won't the bomb not be in the engine? We'll have to stop to get it. We're all going to die! I'm gonna get drunk! + +[ROK3_9:ROCK3] +Hey, there's a queue here pal! The answer ain't in the drinks cabinet! Get out of my way! + +[ROK3_10:ROCK3] +Hey, the vodka bottle's got wires coming out of it! That's not vodka, that's BOOMSHINE! + +[ROK3_11:ROCK3] +WAAAAAAGGGHHHH!!!! And it's wired to blow!! WAAAAAAAAAAAAGGGHHHHHHHH!!!! + +[ROK3_12:ROCK3] +They always said the drink would kill me. I've seen this on the telly. you gotta pull out one of the wires. Which wire? I don't know, man. + +[ROK3_13:ROCK3] +I don't have a clue. Willy, say something. I'm gonna play bass in hell. + +[ROK3_14:ROCK3] +Tommy man, keep driving fast, pal. Somebody do something. Aye, clever! + +[ROK3_15:ROCK3] +'Somebody do something', what kind of crap is that, I've seen braver girls. Okay tough guy, you do something. + +[ROK3_16:ROCK3] +Look, man, I play a musical instrument I don't have a clue about bomb disposal. Willy could just suck the boomshine out with a straw. + +[ROK3_17:ROCK3] +Aye, I've heard that your good at that kind of thing. Hey, I was off my tits that night, as well you know! + +[ROK3_18:ROCK3] +Just pass Willy a straw! A straw?!?! This is the Love Fist Tour Bus! + +[ROK3_19:ROCK3] +Where am I gonna get a straw from, know wot I mean? Which wire, Tommy? The green one. There isn't a green one. + +[ROK3_20:ROCK3] +Or is this one green? Any of these wires look green to you? + +[ROK3_21:ROCK3] +Oh no! Death's on the cards! Everything looks green! I should have dumped you lot when I had the chance man. + +[ROK3_22:ROCK3] +Glory seeker. Capitalist. I've been carrying you for years. Shut up. You're a muppit. + +[ROK3_23:ROCK3] +A big screaming girl. Yeah. Shut up and pull a wire. Which wire? This one.. + +[ROK3_24:ROCK3] +NO! Man, we're okay. We ain't been blown up, pal. + +[ROK3_25:ROCK3] +Tommy, man, nice one. Rock and roll, man. Ain't we got a gig to go to? + +[ROK3_26:ROCK3] +A racket to make? Groupies to abuse? LOVE FIST! + +[ROK3_27:ROCK3] +Have you finished with that bottle? + +{=================================== MISSION TABLE SERG1 ===================================} + +[TEX1_A:SERG1] +Come in and park yourself on the hide, son. + +[TEX1_B:SERG1] +Hell, my daddy used to say, never look a gift horse in the mouth, and by golly, he never did. + +[TEX1_C:SERG1] +Would you like a drop of the old Kentucky? + +[TEX1_D:SERG1] +No thanks. + +[TEX1_E:SERG1] +A clean thinker! I like that. + +[TEX1_F:SERG1] +Now, the property business isn't all about high-falootin' paper pushing. + +[TEX1_G:SERG1] +It's about dirt! And the will to claim that dirt! You with me, son? + +[TEX1_H:SERG1] +Oh yeah. + +[TEX1_K:SERG1] +Persuasion's my forte. + +[TEX1_L:SERG1] +Yeh, he'll be down at the country club, down on the golf course. + +[TEX1_M:SERG1] +They don't allow guns, so his bodyguards won't be packing lawgivers. + +[TEX1_N:SERG1] +Go beat eight tons of crap out of him. + +[TEX1_O:SERG1] +Here now - I got you a membership, and boy you're going to need more appropriate clothing. + +[TEX1_2:SERG1] +~g~Now head to the Leaf Links Golf Club. + +[TEX1_3:SERG1] +Who's this guy? Boys, deal with him. + +[TEX1_6:SERG1] +Nice ass baby! + +[TEX1_7:SERG1] +Is this me? + +[TEX1_I:SERG1] +Well, I need some tenacious bastard to let go of some dirt, + +[TEX1_J:SERG1] +and you look to me like the kind of guy to persuade him. + +[TEX1_0:SERG1] +~g~The target is at the driving range enjoying a game of golf. Make sure it's his last. + +[TEX1_8:SERG1] +Each time you enter a caddy you automatically receive a golf club, providing your melee weapon slot is empty. + +[TEX1_9:SERG1] +Get him! + +[TEX1_10:SERG1] +Kill that Psycho! + +[TEX1_1:SERG1] +~g~Go and pick up some golfing clothes from Jocksports. + +{=================================== MISSION TABLE SERG2 ===================================} + +[TEX_2A:SERG2] +~g~Excellent! They've spotted you! + +[TEX_2B:SERG2] +~r~Fool! People have to WITNESS a Cuban doing the hit! + +[TEX_2C:SERG2] +~g~Go get yourself some Cuban gang colors in Little Havana! + +[TEX_2D:SERG2] +~g~Take out the Haitian Gang Lord at Romero's Funeral Parlor! + +[TEX2_A:SERG2] +Tommy, this is Donald Love. Donald, this here is Tommy Vercetti, + +[TEX2_B:SERG2] +the latest gunslinger to come to these parts. + +[TEX2_C:SERG2] +Yeh...uh... + +[TEX2_D:SERG2] +Donald, you just shut up and listen, and you might learn something. + +[TEX2_E:SERG2] +Now, nothing brings down real estate prices quicker than a good old-fashioned gang war - + +[TEX2_F:SERG2] +'cept maybe a disaster, like a biblical plague or something, + +[TEX2_G:SERG2] +but, that may be going too far in this case. + +[TEX2_H:SERG2] +You getting this down, you four-eyed prick? + +[TEX2_I:SERG2] +Now recently a Haitian gang lord died. Apparently the Cubans did it, nobody's certain. + +[TEX2_J:SERG2] +But let's make them certain! You disguise yourself as a Cuban hombre, + +[TEX2_K:SERG2] +and head on down to crash that funeral. Mix it up, and then high tail it. + +[TEX2_L:SERG2] +You getting this down, Donald? + +[TEX2_M:SERG2] +Well, that ought to put the coyote in the chicken coop, huh? + +[TEX2_N:SERG2] +And then we'll just sit back, and watch the prices tumble. + +[TEXEXIT:SERG2] +~g~Now get out of Little Haiti! + +{=================================== MISSION TABLE SERG3 ===================================} + +[TEX3_A:SERG3] +Now look here, son. I got a problem and I reckon you could help me with it. + +[TEX3_B:SERG3] +I'm no builder. + +[TEX3_C:SERG3] +No, I was thinking more of your demolition skills. + +[TEX3_D:SERG3] +Now this here, this is the development as planned and this, + +[TEX3_E:SERG3] +this is the property that we're looking at. + +[TEX3_F:SERG3] +You're trying to say this new office block is kind of in the way. + +[TEX3_G:SERG3] +You catch on quick. + +[TEX3_H:SERG3] +Now I'm going to head out of town for a while + +[TEX3_I:SERG3] +and if that office development were to face sudden and insurmountable structural problems, then I.. + +[TEX3_J:SERG3] +As a civil minded individual you'd feel obliged to step in and + +[TEX3_K:SERG3] +save the rejuvenation of an important area of the city? + +[TEX3_L:SERG3] +Where can I get more guys like you? + +[TEX3_1:SERG3] +~g~Use the RC helicopter to transport bombs to four demolition points on the building site. + +[TEX3_2:SERG3] +~g~You must place one bomb at each target. You can place bombs in any order. + +[TEX3_3:SERG3] +~g~Maneuver the RC helicopter next to a bomb to pick it up. it can carry one bomb at a time.. + +[TEX3_5:SERG3] +~g~If you place a bomb unsuccessfully you can pick it up and try again. + +[TEX3_7:SERG3] +~g~You must then place the remaining bombs in 7 minutes! + +[TEX3_8:SERG3] +~g~You missed the target! Pick up a bomb and try again! + +[TEX3_10:SERG3] +~g~Drop the bomb at a target. + +[TEX3_11:SERG3] +targets left: + +[TEX3_17:SERG3] +~r~You ran out of time! + +[TEX3_18:SERG3] +~r~Your RC Helicopter has been destroyed! + +[TEX3_19:SERG3] +~r~You dropped your bomb in the water! That ain't no way to fish! + +[TEX3_20:SERG3] +~r~The RC Helicopter is nearly out of range! + +[TEX3_21:SERG3] +~r~The RC Helicopter went out of range! + +[TEX3_24:SERG3] +Press the ~h~~k~~VEHICLE_LOOKLEFT~ ~w~button to rotate the helicopter counter-clockwise. + +[TEX3_25:SERG3] +Press the ~h~~k~~VEHICLE_LOOKRIGHT~ ~w~button to rotate the helicopter clockwise. + +[TEX3_27:SERG3] +~g~A central stairway allows access to all the floors in the building. + +[TEX3_31:SERG3] +~r~You destroyed the TOPFUN van that contained the bombs and RC helicopter! + +[TEX3_32:SERG3] +You can ~h~look behind~w~ by simultaneously pressing the ~h~~k~~VEHICLE_LOOKLEFT~~w~ and the ~h~~k~~VEHICLE_LOOKRIGHT~~w~ buttons. + +[TEX3_4:SERG3] { reVC update } +~g~To drop a bomb press the~h~ ~k~~VEHICLE_FIREWEAPON~ ~g~button. + +[TEX3_29:SERG3] { reVC update } +To drop a bomb press the~h~ ~k~~VEHICLE_FIREWEAPON~ ~w~button. + +[TEX3_26:SERG3] +Pressing the ~h~~k~~VEHICLE_BRAKE~ ~w~button ~w~decreases the rotor speed, causing the helicopter to~h~ descend. + +[TEX3_22:SERG3] +Pressing the ~h~~k~~VEHICLE_ACCELERATE~ ~w~button increases the rotor speed, causing the helicopter to ~h~ascend. + +[TEX3_16:SERG3] +~g~Get to the ~w~TOPFUN ~g~van near the building site to be demolished. + +[TEX3_33:SERG3] +Once you pick up a bomb the radar will show you the position of the target relative to the RC helicopter. + +[TEX3_34:SERG3] +An ~h~upwards pointing triangular blip ~w~indicates the target is ~h~above ~w~the RC helicopter. + +[TEX3_35:SERG3] +A ~h~downward pointing triangular blip ~w~indicates the target is ~h~below ~w~the RC helicopter. + +[TEX3_36:SERG3] +A ~h~square blip ~w~indicates the target is on the ~h~same level ~w~as the RC helicopter + +[TEX3_6:SERG3] +~g~Once you have picked up a bomb for the first time, the detonation timer will start. + +[TEX3_28:SERG3] +To ~h~pick up a bomb~w~, simply maneuver the RC helicopter next to it. The RC Helicopter can carry one bomb at a time. + +[TEX3_30:SERG3] +~g~To pick up a bomb, simply maneuver the RC helicopter next to it. The RC Helicopter can carry one bomb at a time. + +[TEX3_12:SERG3] +~g~Bomb planted! Only 3 more targets to go! Go back and get another bomb. + +[TEX3_13:SERG3] +~g~Bomb planted! Only 2 more targets to go! Go back and get another bomb. + +[TEX3_14:SERG3] +~g~Bomb planted! Only 1 more target to go! Go back and get another bomb. + +[TEX3_15:SERG3] +~r~Detonation timer initiated! ~g~You must plant the ~w~4 bombs ~g~in the remaining time! + +[TEX3_37:SERG3] +Pushing ~h~back on the analog stick ~w~decreases the rotor speed, causing the helicopter to~h~ descend. + +[TEX3_38:SERG3] { reVC update } +{ Pressing the ~h~~k~~VEHICLE_ACCELERATE~ ~w~button increases the rotor speed, causing the helicopter to ~h~ascend. } +Pushing ~h~forward on the analog stick ~w~increases the rotor speed, causing the helicopter to ~h~ascend. + +[TEX3_39:SERG3] +~g~To drop a bomb press the ~h~~k~~VEHICLE_HANDBRAKE~ ~g~button. + +[TEX3_40:SERG3] +To drop a bomb press the ~h~~k~~VEHICLE_HANDBRAKE~ ~w~button. + +[TEX3_23:SERG3] +Press the ~h~~k~~VEHICLE_TURRETUP~~w~ and ~h~~k~~VEHICLE_TURRETDOWN~~w~ buttons to tilt the helicopter in the direction you wish to maneuver it. + +{=================================== MISSION TABLE TAXI1 ===================================} + +[FARES:TAXI1] +FARES: + +[TAXI1:TAXI1] +~g~Look for a fare. + +[TSCORE2:TAXI1] +$~1~ + +[IN_ROW:TAXI1] +~1~ IN A ROW bonus! $~1~ + +[TAXI3:TAXI1] +~r~Your passenger fled in terror! + +[TAXI7:TAXI1] +~r~Your car is trashed, get it repaired. + +[TAXI4:TAXI1] +Fare complete! + +[TAXI5:TAXI1] +SPEED BONUS!! + +[TAXI6:TAXI1] +Taxi mission over + +[TAXIH1:TAXI1] +Stop near a highlighted pedestrian to pick them up then drive them to their destination before the time runs out. + +[FARE1:TAXI1] +~g~Destination ~w~'The Pole Position Club' ~g~in Ocean Beach. + +[FARE3:TAXI1] +~g~Destination ~w~'The Marina' ~g~in Ocean Beach. + +[FARE4:TAXI1] +~g~Destination ~w~'Ammu-Nation' ~g~in Ocean Beach. + +[FARE5:TAXI1] +~g~Destination ~w~'The Hardware store' ~g~in Washington Beach. + +[FARE6:TAXI1] +~g~Destination ~w~'The North Point Mall' ~g~in Vice Point. + +[MFARE1:TAXI1] +~g~Destination ~w~'Ammu-Nation' ~g~in Downtown. + +[MFARE2:TAXI1] +~g~Destination ~w~'the Terminal' ~g~at Escobar International Airport. + +[WFARE3:TAXI1] +~g~Destination ~w~'Sunshine Autos' ~g~in Little Havana. + +[WFARE4:TAXI1] +~g~Destination ~w~'Kaufman Cabs' ~g~in Little Haiti. + +[WFARE5:TAXI1] +~g~Destination ~w~'The Hardware store' ~g~in Little Havana. + +[WFARE6:TAXI1] +~g~Destination ~w~'Howlin Petes Bike Emporium' ~g~in Downtown. + +[FARE7:TAXI1] +~g~Destination ~w~'The Jewelers' ~g~in Vice Point. + +[FARE8:TAXI1] +~g~Destination ~w~'The Beach' ~g~in Ocean Beach. + +[FARE9:TAXI1] +~g~Destination ~w~'The Beach' ~g~in Washington Beach. + +[FARE10:TAXI1] +~g~Destination ~w~'The Beach' ~g~in Vice Point. + +[FARE11:TAXI1] +~g~Destination ~w~'Hospital' ~g~in Ocean Beach. + +[FARE12:TAXI1] +~g~Destination ~w~'Hospital' ~g~in Vice Point. + +[FARE13:TAXI1] +~g~Destination ~w~'Police Station' ~g~in Washington Beach. + +[FARE14:TAXI1] +~g~Destination ~w~'Police Station' ~g~in Vice Point. + +[FARE15:TAXI1] +~g~Destination ~w~'Pizza Restaurant' ~g~in Vice Point. + +[WFARE7:TAXI1] +~g~Destination ~w~'Police Station' ~g~in Little Havana. + +[WFARE8:TAXI1] +~g~Destination ~w~'Police Station' ~g~in Downtown. + +[WFARE9:TAXI1] +~g~Destination ~w~'Hospital' ~g~in Downtown. + +[WFARE10:TAXI1] +~g~Destination ~w~'Hospital' ~g~in Little Havana. + +[WFARE11:TAXI1] +~g~Destination ~w~'The Stadium' ~g~in Downtown. + +[WFARE12:TAXI1] +~g~Destination ~w~'Pizza Restaurant' ~g~in Little Haiti. + +[WFARE13:TAXI1] +~g~Destination ~w~'Pizza Restaurant' ~g~in Downtown. + +[WFARE14:TAXI1] +~g~Destination ~w~'Docks' ~g~in Viceport. + +[WFARE15:TAXI1] +~g~Destination ~w~'Chemist' ~g~in Little Haiti. + +[FARE2:TAXI1] +~g~Destination ~w~'The Malibu club' ~g~in Vice Point. + +{=================================== MISSION TABLE TAXICUT ===================================} + +[TAXC_A:TAXICUT] +Guess you're the new owner. + +[TAXC_B:TAXICUT] +What are you, mob? Cartel? You don't look Mexican... + +[TAXC_C:TAXICUT] +Anyhoo, I guess you better get on with the 'things are gonna change around here' crap, + +[TAXC_D:TAXICUT] +maybe threaten one of the drivers - + +[TAXC_E:TAXICUT] +go steady on Ted over there, he's just had his hernia fixed. + +[TAXC_F:TAXICUT] +Well, yeah. Things are going to change around here, lady. + +[TAXC_G:TAXICUT] +Oh crap, sonny. Might as well leave this to me - + +[TAXC_H:TAXICUT] +I've been doing this for years. + +[TAXC_I:TAXICUT] +Now hear this. + +[TAXC_J:TAXICUT] +We are now under new management and things are going to change around here again. + +[TAXC_K:TAXICUT] +Our new management, the + +[TAXC_L:TAXICUT] +- Which gang are you? + +[TAXC_M:TAXICUT] +Well, I'm not part of any gang actually. + +[TAXC_N:TAXICUT] +What's your goddamned name, kid? + +[TAXC_O:TAXICUT] +Vercetti, Tommy Vercetti. + +[TAXC_P:TAXICUT] +Our new management, the Vercetti Gang, + +[TAXC_Q:TAXICUT] +is gonna make sure we get no trouble. + +[TAXC_R:TAXICUT] +Capiche? Out! + +[TAXC_S:TAXICUT] +Did you like the 'capiche'? I liked the 'capiche'. + +[TAXC_T:TAXICUT] +So this is how it's worked in the past, + +[TAXC_U:TAXICUT] +We run the firm as usual. + +[TAXC_V:TAXICUT] +If we get any trouble from rival firms, you beat the crap out of them. + +[TAXC_W:TAXICUT] +Then they beat the crap out of us, + +[TAXC_X:TAXICUT] +then you beat the crap out of them, + +[TAXC_Y:TAXICUT] +etcetera, etcetera. You got it? + +[TAXC_Z:TAXICUT] +Uh, yeah, I guess... + +[TAXC_A1:TAXICUT] +Just grab a taxi from the garage if you feel like jumping in. + +{=================================== MISSION TABLE TAXIWA1 ===================================} + +[OUTTIME:TAXIWA1] +~r~Too slow, man, too slow! + +[TAX1_1:TAXIWA1] +Ok, we got a high class fare needs picking up from Starfish island - any takers? + +[TAX1_2:TAXIWA1] +Tommy here, I'll take it! + +[TAX1_3:TAXIWA1] +This is my fare, back off asshole! + +[TAX1_4:TAXIWA1] +Come on come on, Get in, quick! + +[TAX1_5:TAXIWA1] +Ok, ok! Just don't hurt me! + +[TAXW1_1:TAXIWA1] +~g~Pick up the V.I.P. on Starfish Island. + +[TAXW1_2:TAXIWA1] +~g~Get the V.I.P back! Take the other car out! + +[TAXW1_3:TAXIWA1] +~r~The V.I.P. is dead! + +[TAXW1_4:TAXIWA1] +~r~The V.I.P. has been dropped off! + +[TAXW1_6:TAXIWA1] +~g~Take the V.I.P. to the airport! + +{=================================== MISSION TABLE TAXIWA2 ===================================} + +[TAX2_1:TAXIWA2] +Calling all cars, we're losing fares all over town. What's with you guys? + +[TAX2_2:TAXIWA2] +VC Cabs keep beating us to it. They've just got too many cars - we can't compete! + +[TAX2_3:TAXIWA2] +Mr. Vercetti, if you're out there listening in, you gotta put some VC Cabs out of action before we go bust! + +[TAXW2_1:TAXIWA2] +~g~Destroy 3 of the rival taxis! + +{=================================== MISSION TABLE TAXIWA3 ===================================} + +[TAX3_1:TAXIWA3] +Car 13, We got a Miss Cortez, asked for you especially. + +[TAX3_2:TAXIWA3] +Ok, I got it. Car 13 out! + +[TAX3_3:TAXIWA3] +Hmmmm, no sign of Mercedes... + +[TAXW3_3:TAXIWA3] +~g~Take out the leader cab! + +[TAXW3_2:TAXIWA3] +~g~Stay alive until the timer runs out. + +[TAX_AS1:TAXIWA3] +TAXI FIRM ASSET COMPLETED + +[TAX_AS2:TAXIWA3] +~g~Kaufman Cabs will now generate revenue up to a maximum of $~1~. Make sure you collect it regularly. + +[TAX3_4:TAXIWA3] +It's time for Kaufman Cab's guardian angel to eat some fender! + +[TAX3_5:TAXIWA3] +Hey boy I'm gonna tan your hide! + +{ reVC updates } +{ new languages } +[FEL_JAP] +JAPANESE + +[FEL_POL] +POLISH + +[FEL_RUS] +RUSSIAN + +{ new display menus } +[FET_GFX] +GRAPHICS SETUP + +[FED_MIP] +MIP MAPPING + +[FED_AAS] +ANTI ALIASING + +[FED_FIL] +TEXTURE FILTERING + +[FED_BIL] +BILINEAR + +[FED_TRL] +TRILINEAR + +[FED_WND] +WINDOWED + +[FED_FLS] +FULLSCREEN + +[FEM_CSB] +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 + +[FEC_FRC] +FREE CAM + +{ Linux joy detection } +[FEC_JOD] +DETECT JOYSTICK + +[FEC_JPR] +Press any key on the joystick of your choice that you want to use on the game, and it will be selected. + +[FEC_JDE] +Detected joystick + +{ mission restart } +[FET_RMS] +REPLAY MISSION + +[FESZ_RM] +RETRY? + +[FED_VPL] +VEHICLE PIPELINE + +[FED_PRM] +PED RIM LIGHT + +[FED_RGL] +ROAD GLOSS + +[FED_CLF] +COLOUR FILTER + +[FED_WLM] +WORLD LIGHTMAPS + +[FED_MBL] +MOTION BLUR + +[FEM_SIM] +SIMPLE + +[FEM_NRM] +NORMAL + +[FEM_MOB] +MOBILE + +[FED_MFX] +MATFX + +[FED_NEO] +NEO + +[FEM_PS2] +PS2 + +[FEM_XBX] +XBOX + +[FEC_IVP] +INVERT PAD VERTICALLY + +[FEM_NON] +NONE + +[FEC_DS2] +DUALSHOCK 2 + +[FEC_DS3] +DUALSHOCK 3 + +[FEC_DS4] +DUALSHOCK 4 + +[FEC_360] +XBOX 360 CONTROLLER + +[FEC_ONE] +XBOX ONE CONTROLLER + +[FEC_TYP] +GAMEPAD TYPE + +[FET_AGS] +GAMEPAD SETTINGS + +[FEM_AUT] { aspect ratio related } +AUTO + +{ 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/build.bat b/utils/gxt/build.bat index d57fa0a..7327497 100644 --- a/utils/gxt/build.bat +++ b/utils/gxt/build.bat @@ -1,5 +1,5 @@ -gxt -g LCS -i "ENGLISH.txt" -o "../../gamefiles/TEXT/ENGLISH.gxt" -gxt -g LCS -i "french.txt" -o "../../gamefiles/TEXT/french.gxt" -gxt -g LCS -i "german.txt" -o "../../gamefiles/TEXT/german.gxt" -gxt -g LCS -i "italian.txt" -o "../../gamefiles/TEXT/italian.gxt" -gxt -g LCS -i "spanish.txt" -o "../../gamefiles/TEXT/spanish.gxt" \ No newline at end of file +gxt -g VC -i "american.txt" -o "../../gamefiles/TEXT/american.gxt" +gxt -g VC -i "french.txt" -o "../../gamefiles/TEXT/french.gxt" +gxt -g VC -i "german.txt" -o "../../gamefiles/TEXT/german.gxt" +gxt -g VC -i "italian.txt" -o "../../gamefiles/TEXT/italian.gxt" +gxt -g VC -i "spanish.txt" -o "../../gamefiles/TEXT/spanish.gxt" \ No newline at end of file diff --git a/utils/gxt/french.txt b/utils/gxt/french.txt index 6644a10..d5983e9 100644 --- a/utils/gxt/french.txt +++ b/utils/gxt/french.txt @@ -1,728 +1,2166 @@ -[LETTER1] -abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"$,.'-?!!SDBF +{ + New strings are at the bottom of file. + Do not change the order of strings. + You can fix the typos of existing translation but please refrain from + unnecessary edits like rephasing because you think it suits better for your taste. +} -[DEFNAM] -Claude---------------------- +[RAMPAGE] +RODEO! + +[RAMP_F] +ECHEC DU RODEO! + +[RAMP_P] +RODEO REUSSI! + +[RAMP_A] +TOUS LES RODEOS REUSSIS! + +[PAGE_01] +Tue ~1~ membres de gang en 2 minutes! + +[PAGE_02] +Détruis ~1~ véhicules en 2 minutes! + +[PAGE_03] +Roule à côte des membres de gang et tue-en ~1~ en 2 minutes! + +[PAGE_04] +Ecrase ~1~ membres de gang en 2 minutes! + +[PAGE_05] +Eclate la tête de ~1~ membres de gang en 2 minutes! + +[FEC_ABR] +Accélérer, freiner ou marche arrière + +[CLOHELP] +Vêtements changés! + +[FE_MLG] +LEGENDE DE LA CARTE + +[FED_RDR] +RADAR + +[FED_HUD] +L'INTERFACE + +[FED_RDL] +GRAND + +[FED_RDB] +BIPS UNIQUEMENT + +[FED_HUF] +FONDU + +[FEI_BTU] +; = - + +[FEI_SCR] +Fait défiler + +[FEST_HV] +Missions d'Autodéfense, niveau maximum + +[LG_01] +Position du joueur + +[LG_02] +Avery Carrington + +[LG_03] +Motards + +[LG_04] +Colonel Cortez + +[LG_05] +Ricardo Diaz + +[LG_06] +Kent Paul + +[LG_07] +Avocat + +[LG_08] +Phil Cassidy + +[LG_09] +Chantier naval + +[LG_10] +Club Malibu + +[LG_11] +Cubains + +[LG_12] +Studio de Cinéma + +[LG_13] +Ammu-Nation + +[LG_14] +Haïtiens + +[LG_15] +Quincaillerie + +[LG_16] +Planque + +[LG_17] +Crèmes glacées + +[LG_18] +Taxi Kaufman + +[LG_19] +Love Fist + +[LG_20] +Imprimerie + +[LG_21] +Propriété + +[LG_22] +Pay 'n' Spray + +[LG_23] +Boutique de fringues + +[LG_24] +Manoir de Tommy + +[LG_25] +Téléphone + +[LG_26] +Station de radio Wildstyle + +[LG_27] +Station de radio Flash FM + +[LG_28] +Station de radio KChat + +[LG_29] +Station de radio Fever 105 + +[LG_30] +Station de radio VRock + +[LG_31] +Station de radio VCPR + +[LG_32] +Station de radio Espantoso + +[LG_33] +Station de radio Emotion 98.3 + +[LG_34] +Station de radio Onde 103 + +[LG_35] +Destination + +[LG_36] +Sun Yard + +[LG_37] +Boîte de striptease + +[MAP_YAH] +VOUS ETES ICI + +[MAP_LEG] +Légende + +[SENTXS] +Sentinelle XS + +[VCNMAV] +VCN Maverick + +[TAXSHRT] +~g~Au lieu de conduire, tu peux te servir de ce taxi Kaufman pour te déplacer. Cela te coûtera $9. + +[BRIBE1] +Tu viens de récupérer un pot-de-vin de la police. Cela réduira ton indice de recherche d'une étoile. + +[SUNSHIN] +Sunshine Autos + +[KAUFCAB] +Taxis Kaufman + +[BOATYAR] +Le chantier naval + +[WANT_L] +Tu as perdu ton indice de recherche. Ne commets pas de délit tant que les étoiles brillent ou tu seras de nouveau très recherché. + +[HOTRNG] +HOTRING + +[BLODRNG] +BLOODRING + +[DIRTRNG] +DIRTRING [IN_VEH] -~w~Hé ! Remonte dans le ~b~véhicule ! - -[IN_VEH2] -~w~Il te faut un véhicule pour ce job ! - -[IN_BOAT] -~w~Il te faut un bateau pour ce job ! +~g~Eh! Remonte dans ta caisse! [HEY] -~w~Reste avec tes potes ! - -[HEY2] -~w~Vous séparez pas, toi et tes potes ! - -[HEY7] -~w~Un flingue de plus, ce serait pas du luxe ! Fais demi-tour et va chercher ton contact ! - -[HEY9] -~w~Tu veux dominer la rue ? Va voir ton contact ! - -[GATE_1] -~w~Les Sindacco n'ouvriront la porte qu'aux voitures Sindacco. - -[HELPA] -~w~Voici ta ~h~planque. - -[HELPB] -~w~En dehors des missions, tu peux sauvegarder ta partie en récupérant des ~h~icones de sauvegarde~w~. Le temps avance alors de 6 heures. - -[HELPC] -~w~Les véhicules restant dans le ~h~garage d'à côté~w~ seront stockés quand tu sauvegarderas ta partie. - -[HELPD] -Pour quitter la planque, place-toi sur le ~h~repère. - -[HELP0] -~w~Appuie sur~h~ ~k~ ~VEEE~ ~w~pour monter ou descendre d'un véhicule. - -[HELP1] -~w~Arrête-toi au centre du ~h~repère jaune. +~g~Te la joue pas perso, reste avec tes potes! [HELP3] -~w~Tu ne peux sprinter que pendant un bref instant avant d'être à bout de souffle. +T'es vite crevé, ton sprint ne dure donc pas longtemps. -[HELP4] -~w~Utilise~h~ ~k~ ~VEACC~ ~w~pour ~h~accélérer et~h~ ~k~ ~VESTR~ ~w~pour te diriger. +[HELP4_D] +Pousse le ~h~joystick analogique droit ~w~ vers le haut pour ~h~accélérer. -[HELP5] -~w~Appuie sur~h~ ~k~ ~VEBRK~ ~w~pour ~h~freiner~w~, ou faire ~h~marche arrière~w~ si le véhicule est à l'arrêt. +[HELP5_D] +Tire le ~h~joystick analogique droit~w~ vers toi pour ~h~freiner~w~ ou pour ~h~reculer~w~ si le véhicule est à l'arrêt. -[HELP6] -~w~Appuie sur~h~ ~k~ ~VEHB~ ~w~pour utiliser le ~h~frein à main. +[HELP7_A] +Maintiens la ~h~ ~k~~PED_LOCK_TARGET~ ~w~ enfoncée pour ~h~viser~w~ avec le fusil à lunette. -[HELP7] -~w~Maintiens~h~ ~k~ ~PDLT~ ~w~pour viser avec le fusil de précision. - -[HELP8] -~w~Utilise~h~ ~k~ ~SNZI~ ~w~et~h~ ~k~ ~SNZO~ ~w~pour faire des ~h~zooms avant et arrière~w~ quand tu vises. +[HELP7_D] +Maintiens la ~h~ ~k~~PED_LOCK_TARGET~ ~w~ enfoncée pour ~h~viser~w~ avec le fusil à lunette. [HELP10] -~w~Le ~h~badge jaune~w~ t'indique que tu es ~h~recherché~w~. Les flics essaieront alors de t'arrêter ! +Ce badge t'indique que t'es recherché par la police. [HELP11] -~w~Plus il y a de badges à l'écran, plus les flics te recherchent activement. - -[HELP12] -~w~Avance sur le ~h~repère jaune~w~ pour lancer une mission. +Plus t'as de badges, plus ton indice de recherche est important. [HELP13] -~w~Sois à l'affût des chemins qui n'apparaissent pas sur le ~h~radar~w~ et utilise-les à ton avantage ! - -[HELP14] -~w~Utilise le ~h~radar~w~ pour te repérer dans la ville. Suis le ~h~spot jaune~w~ pour trouver ta ~h~planque. - -[HELP16] -~w~Utilise~h~ ~k~ ~VESTR~ ~w~pour te diriger. - -[HELP17] -~w~Phil Cassidy : pour une marchandise calibrée ! Nouvel arrivage très bientôt ! - -[HELP18] -~w~Un nouvel arrivage vient d'être livré à l'armurerie de Phil Cassidy ! - -[HELP18B] -~w~Phil Cassidy a maintenant le ~h~minigun~w~ en stock ! - -[HELP19A] -~w~Pour ~h~tirer en roulant~w~, maintiens~h~ ~k~ ~VELL~ ~w~ou~h~ ~k~ ~VELR~ ~w~et tire avec~h~ ~k~ ~VEWEP~. - -[HELP19C] -~w~Tu peux tirer en roulant que si t'as une ~h~mitraillette. - -[HELP19D] -En ~h~moto~w~, tu peux ~h~tirer vers l'avant~w~ en appuyant sur~h~ ~k~ ~VEWEP~. - -[HELP19F] -~w~Tu peux tirer vers l'avant que si t'as une ~h~mitraillette. - -[HELP20] -~w~T'as trouvé un ~h~pot-de-vin~w~ ! Récupère-le pour faire baisser ton ~h~indice de recherche~w~ d'une étoile ! - -[HELP21] -~w~Utilise~h~ ~k~ ~PDCWE~ ~w~pour changer d'arme quand t'es à pied. - -[HELP22] -~w~Pour trouver l'~h~entrepôt de Vincenzo~w~, suis le ~h~V~w~ sur le radar. - -[HELP23] -~w~Le spot est un ~h~triangle orienté vers le bas~w~, ce qui t'indique que la ~h~cible se situe plus bas~w~ par rapport à ta position. - -[HELP24] -~w~Maintiens~h~ ~k~ ~VELL~ ~w~ou~h~ ~k~ ~VELR~ ~w~pour regarder ~h~à gauche ou à droite~w~ dans un véhicule. Maintiens les deux pour regarder ~h~vers l'arrière. - -[HELP25] -~w~Appuie sur~h~ ~k~ ~CVEIW~ ~w~pour changer de ~h~mode de caméra. - -[HELP26] -~w~Saute dans un bateau et appuie sur ~h~ ~k~ ~VEEE~ ~w~pour grimper à bord. - -[HELP27] -~w~Si t'es à côté d'un bateau, appuie sur~h~ ~k~ ~VEEE~ ~w~pour monter à bord. - -[HELP29] -~w~Appuie sur~h~ ~k~ ~VEHN~ ~w~pour ~h~klaxonner. - -[HELP30] -~w~Utilise~h~ ~k~ ~VECRS~ ~w~pour changer de ~h~station de radio. - -[HELP33] -~w~Maintenant que les tueurs ont été payés, ils feront leur job, peu importe le temps que ça prendra. - -[HELP34] -~w~Maintiens~h~ ~k~ ~VELB~ ~w~pour regarder derrière quand tu conduis. - -[HELP38] -~w~Si tu butes quelqu'un qui est armé, tu peux récupérer son arme. - -[HELP40] -~w~A pied, utilise~h~ ~k~ ~PDLOO~ ~w~pour regarder autour de toi. - -[HELP58] -~w~Maintiens~h~ ~k~ ~PDLT~ ~w~pour ~h~verrouiller une cible~w~ et appuie sur~h~ ~k~ ~PDFW~ ~w~pour tirer ! - -[HELP59] -~w~Une fois ta cible verrouillée, appuie sur ~h~~k~ ~PDCTL~ ~w~pour en changer. - -[HELP60] -~w~Certains barils explosent si tu tires dessus. Mais garde tes distances, ça vaut mieux ! - -[TANK] -~w~Utilise~h~ ~k~ ~VEWEA~ ~w~pour viser le canon du Rhino et~h~ ~k~ ~VEWEP~ ~w~pour tirer. - -[ANSWER] -~w~Appuie sur~h~ ~k~ ~ANS~ ~w~pour répondre à ton portable et sur~h~ ~k~ ~VEEE~ ~w~pour raccrocher. - -[BOMB] -~w~Si tu conduis une caisse à l'atelier, 8-Ball te demandera ~h~500$~w~ pour y poser une ~h~bombe~w~. - -[BRIDGE1] -~w~Callahan Bridge : en construction. Fin des travaux : mai 1998 - -[STRIK_1] -~w~Tu pourras prendre le ~h~ferry~w~ jusqu'à Staunton Island quand la grève sera terminée. - -[SPRAY] -~w~Va au ~h~Pay 'n' Spray~w~ pour supprimer ton ~h~indice de recherche~w~, ~h~réparer ~w~et ~h~repeindre ~w~ton véhicule pour ~h~100$. - -[S_TRN_1] -~w~Prends le ~h~métro~w~ pour te déplacer dans Liberty City. Appuie sur~h~ ~k~ ~VEEE~ ~w~pour ~h~monter ~w~ou ~h~descendre~w~ d'une rame. - -[TUBE1] -~w~Quand la station sera ouverte, tu pourras prendre le ~h~métro~w~ jusqu'à Staunton Island. - -[TUBE2] -~w~Dès que cette station sera ouverte, tu pourras te rendre au ~h~Francis International Airport~w~. - -[TUBE_2] -~w~Pour monter à bord d'une ~h~rame de métro~w~, appuie sur~h~ ~k~ ~VEEE~. - -[SPRAY1] -~w~Gare-toi au ~h~Pay 'n' Spray~w~ pour te débarrasser de ton ~h~indice de recherche~w~, et faire ~h~réparer ~w~et ~h~repeindre ~w~ton véhicule. D'habitude, c'est ~h~100$~w~ mais pour cette fois, c'est cadeau. - -[HELPE31] -~w~A mesure que tu progresses dans le jeu, tu peux récupérer de nouvelles tenues auprès de M. Benz. - -[HELPE32] -~w~Pendant le jeu, rends-toi chez Ammu-Nation pour t'approvisionner en armes ultra puissantes. - -[HELPCOM] -~w~De nouvelles tenues sont dispos à la planque ! - -[HELP41] -~w~Gare-toi au ~h~Pay 'n' Spray~w~ pour faire repeindre et réparer ton véhicule. Suis la ~h~bombe de peinture~w~ sur le radar pour trouver le ~h~Pay 'n' Spray. - -[PAGEB1] -~w~Le ~h~pistolet~w~ est dispo dans ta planque ! - -[PAGEB10] -~w~T'as retrouvé tous les paquets ! Voici un bonus de ~h~50000$ ! - -[EXPO_W] -~w~Love Media en a besoin d'un comme ça ! - -[FERRY_2] -~w~Reviens quand un ferry sera à quai. - -[FERRY_3] -~w~Ton véhicule tient pas dans le ferry ! - -[FERRY_4] -~w~Les types recherchés par les flics sont pas autorisés à bord du ferry ! - -[FERRY_5] -~w~Un billet de ferry coûte ~h~25$~w~. Reviens quand t'auras assez d'argent ! - -[FERRY_6] -~w~En mission, tu peux pas prendre le ferry. - -[FERR_SK] -~w~Appuie sur~h~ ~k~ ~TRSK~ ~w~pour passer directement à la fin du voyage. - -[FERR_C1] -~w~Ferry pour Staunton. Prix : ~h~25$~w~. Appuie sur~h~ ~k~ ~TGSUB~ ~w~pour acheter un billet. - -[FERR_C2] -~w~Ferry pour Portland. Prix : ~h~25$~w~. Appuie sur~h~ ~k~ ~TGSUB~ ~w~pour acheter un billet. - -[A_H1] -~w~~k~ ~AMBUY~ ~w~pour acheter. ~n~~k~ ~AMEXI~ ~w~pour quitter. - -[A_UZI_A] -~w~Ammu-Nation a maintenant des pistolets-mitrailleurs en stock ! - -[AMMU] -~w~Des armes seront disponibles chez ~h~Ammu-Nation~w~ dès l'arrivée d'un nouveau stock. Désolé pour la gêne occasionnée. - -[WANT_A] -~w~Quand tu te fais ~h~'arrêter'~w~, tu es emmené au poste de police le plus proche. - -[WANT_B] -~w~La mission en cours est alors un échec et les flics te piquent toutes tes armes et un pot-de-vin. - -[WANT_C] -~w~Tu ne te fais ~h~'arrêter'~w~ que si t'as un ~h~indice de recherche~w~, représenté par une rangée d'étoiles dans le coin supérieur de l'écran. - -[WANT_D] -~w~Plus il y a d'étoiles, plus les flics te collent au train. - -[WANT_E] -~w~Il existe plusieurs moyens de faire baisser ton indice de recherche, alors reste à l'affût ! - -[WANT_F] -~w~Quand tu conduis, arrête-toi à un ~h~Pay 'n' Spray~w~ pour supprimer ton indice de recherche. - -[HEAL_A] -~w~Quand tu te fais ~h~'buter'~w~, t'es conduit à l'hosto le plus proche. - -[HEAL_B] -~w~Tu perds alors toutes tes armes et ta mission est un échec. Et en plus, tu dois payer pour te faire soigner. - -[HEAL_C] -~w~Ta ~h~santé~w~ est représentée par la barre rouge en haut à droite de l'écran. - -[HEAL_D] -~w~Il existe plusieurs moyens de te soigner ou de te protéger, alors ouvre l'oeil ! - -[H_WE_01] -~w~Marche sur une arme pour la ramasser. Tu peux la récupérer que si t'es à pied. - -[H_WE_02] -~w~Si t'as déjà une arme de ce type, appuie sur~h~ ~k~ ~PUCF~ ~w~pour la remplacer par la nouvelle. - -[PU_CF] -~w~Appuie sur~h~ ~k~ ~PUCF~ ~w~pour prendre cette arme. Si t'as déjà une arme de ce type, tu la perdras. - -[CLOTHA] -~h~~k~ ~AMMOV~ ~w~pour voir les tenues. ~h~~k~ ~AMBUY~ ~w~pour changer de tenue. ~h~~k~ ~AMEXI~ ~w~pour annuler. - -[CLOTHB] -~w~Tu peux changer de fringues ici à tout moment. - -[SIREN_1] -~w~Pour allumer ou couper la ~h~sirène d'un véhicule de secours~w~, appuie brièvement sur~h~ ~k~ ~VEHN~. - -[FHOSE_1] -~w~Maintiens~h~ ~k~ ~VEWEP~ ~w~pour utiliser le canon à eau. - -[PHOTO1] -~w~Maintiens~h~ ~k~ ~PDLT~ ~w~pour viser avec l'appareil photo. - -[PHOTO2] -~w~Tout en visant avec l'appareil photo, utilise~h~ ~k~ ~SNZI~ ~w~et~h~ ~k~ ~SNZO~ ~w~pour faire des ~h~zooms~w~ avant et arrière. - -[PHOTO3] -~w~Appuie sur~h~ ~k~ ~PDFW~ ~w~pour prendre une photo tout en visant avec l'appareil photo. - -[BENZ_H1] -~w~Suis la ~h~chemise~w~ sur le radar pour trouver le ~h~magasin de fringues de M. Benz. - -[BENZ_LE] -~w~Ton ~h~costume Leone~w~ est dispo dans ta planque. - -[BENZ_GU] -~w~La ~h~tenue des Avenging Angels~w~ est dispo dans ta planque. - -[BENZ_CH] -~w~L'~h~uniforme de chauffeur~w~ est dispo dans ta planque. - -[BENZ_TU] -~w~Le ~h~smoking~w~ est dispo dans ta planque. - -[ATUTOR] -~w~Pour activer ou désactiver les missions Ambulance, appuie sur~h~ ~k~ ~TGSUB~. - -[CTUTOR] -~w~Pour activer ou désactiver les missions Autodéfense, appuie sur~h~ ~k~ ~TGSUB~. - -[FTUTOR] -~w~Pour activer ou désactiver les missions Pompiers, appuie sur~h~ ~k~ ~TGSUB~. - -[TRATUT1] -~w~Pour activer ou désactiver les missions Eboueurs, appuie sur~h~ ~k~ ~TGSUB~. - -[TTUTOR] -~w~Pour activer ou désactiver les missions Taxi, appuie sur~h~ ~k~ ~TGSUB~. - -[A_COMP2] -~w~Mission Ambulance : niveau 12 terminé ! Sprinter ne te fatiguera jamais ! - -[FIREPRO] -~w~Mission Pompiers : niveau 12 terminé ! Les flammes n'osent plus te toucher ! - -[RCHELP] -~w~Pour faire ~h~exploser~w~ ta voiture radiocommandée, appuie sur~h~ ~k~ ~VEWEP~. - -[TAXIH1] -~w~Arrête-toi près d'~h~un piéton qui cherche un taxi~w~ pour le faire monter et conduis-le vite à bon port. - -[TIPHLP] -~w~La ~h~barre de pourboires~w~ diminue avec le ~h~temps~w~ et quand ton taxi se fait ~h~endommager. - -[ANG_E3] -~w~Pars à la recherche d'autres Avenging Angels à Chinatown. - -[ANGOUT] -~w~Reviens quand tu porteras une tenue des ~h~Avenging Angels ! - -[ANGCOM2] -~w~Missions Avenging Angel Staunton : niveau 15 terminé ! Maintenant, tu gardes ton fric quand tu te fais arrêter. - -[ANGCOM3] -~w~Missions Avenging Angel Shoreside : niveau 15 terminé ! Un véhicule "spécial" t'attend dans ta planque ! - -[TVOHELP] -~w~Reviens quand tu porteras un ~h~masque de hockey ! +Tu as parfois intérêt à emprunter des chemins non indiqués sur le radar. [TIMER] -C'est une mission limitée dans le temps. Accomplis-la avant la fin du chrono ! +Cette mission est en temps limité. Tu dois donc la réussir avant que le compteur n'atteigne zéro. -[GARAGE] -Conduis le véhicule dans le garage et ressors à pied. +[HORN] +~g~Klaxonne! -[TRASH] -~g~T'as bousillé ton véhicule ! Va faire réparer ton véhicule ! - -[WRECKED] -~r~Le véhicule est bon pour la casse ! - -[SPOOK] -INSOUCIOMETRE - -[SPOTTED] -~r~Ils sont à tes trousses ! +[NOMONEY] +~g~T'as pas assez de cash! [REWARD] -~w~Récompense : ~1~$ +RECOMPENSE $~1~ -[GAMEOVR] -FIN DE LA PARTIE +[M_FAIL] +ECHEC DE LA MISSION! -[Z] -Valeur axe Z : ~1~ +[M_PASS] +MISSION ACCOMPLIE! $~1~ [DEAD] -TU ES MORT ! +T'ES MORT! [BUSTED] -EN TAULE ! +CHOPE! -[GOODBOY] -~w~50$ de bonus du parfait citoyen ! +[WEATHE1] +TEMPS ENSOLEILLE + +[WEATHE2] +TEMPS TRES ENSOLEILLE + +[WEATHE3] +TEMPS NUAGEUX + +[WEATHE4] +TEMPS PLUVIEUX + +[WEATHE5] +TEMPS BRUMEUX + +[WEATHE6] +TEMPS NORMAL [NUMBER] ~1~ -[SCORE] -~1~$ - [LOADCAR] -CHARGEMENT VEHICULE... (APPUIE SUR LA touche L POUR ANNULER) +CHARGEMENT DU VEHICULE... (APPUIE SUR F1 POUR ANNULER) [CARSOFF] -Sans caisses. +Trafic désactivé. [CARS_ON] -Avec caisses. +Trafic activé. [TEXTXYZ] -Ecriture des coordonnées... +Ecriture des coordonnées sur le fichier... [CHEATON] -AVEC mode triche +Mode triche activé [CHEATOF] -SANS mode triche +Mode triche désactivé [IMPORT1] -Sors et attends ton véhicule. +Va dehors et attends ton véhicule. -[KE_PLYR] -Joueur +[PAGEB11] +Lance-flammes livré à la planque -[KE_CTCS] -Contacts +[WANT_A] +Tu ne seras arrêté que si tu as un ~h~indice de recherche. -[KE_WEPS] -Armes +[WANT_B] +La rangée d'étoiles dans le coin supérieur droit de l'écran symbolise ton ~h~indice de recherche~w~. -[KE_ADR] -Adrénaline +[WANT_C] +Ton ~h~indice de recherche~w~ est désormais de un... -[KE_BRIB] -Pots-de-vin +[WANT_D] +deux... -[KE_HLTH] -Santé +[WANT_E] +trois... -[KE_KILF] -Tuerie +[WANT_F] +Plus ton ~h~indice de recherche~w~ augmente, plus les forces de l'ordre t'en veulent. -[KE_ARM] -Protection +[WANT_G] +Quand tu es ~h~'chopé'~w~, tu es amené au poste de police le plus proche. -[KE_USJ] -Saut unique +[WANT_H] +Les flics se laisseront corrompre contre toutes tes armes et une partie de ton cash. -[KE_PKG] -Paquet caché +[WANT_I] +Toutes les missions en cours échoueront. -[KE_INFO] -Infos +[WANT_J] +Plus tu joueras, plus tu trouveras de moyens de diminuer ton indice de recherche. -[DAM] -Dégâts +[WANT_K] +En voiture, les ~h~ATELIERS DE PEINTURE~w~ te permettront d'effacer ton indice de recherche. -[KILLS] -Victimes +[HEAL_B] +Quand tu es ~h~'H.S'~w~, t'es amené à l'hôpital le plus proche. -[TIME] -Chrono +[HEAL_C] +On te confisque alors toute ton artillerie et les docteurs prennent ton argent pour te remettre en forme. -[STOPS] -Arrêts +[HEAL_E] +En jouant, tu trouveras d'autres moyens de te soigner ou de te protéger. -[EVID] -Preuve +[SAVE1] +Entre dans la corona pour ~h~sauvegarder la partie~w~. Tu ne peux pas sauvegarder en cours de mission. -[HEALTH] -Etat Caisse +[SAVE2] +Tout véhicule laissé dans ce garage sera enregistré lors de la sauvegarde. -[COLLECT] -Récupéré +[AMMU] +Va chez Ammu-Nation pour acheter une arme. -[LEVEL] -Niveau +[R_TIME] +TEMPS DE COURSE : -[SALES] -Ventes +[PROP_1] +Tu n'as pas assez de cash pour acheter cette propriété -[CITYZON] -Liberty City - -[VICE_C] -Liberty City +[PROP_2] +Tu ne peux pas acheter une propriété en cours de mission [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] -Garage de 8-Ball +Vice City Beach [COM_ZON] -Staunton Island +Partie centrale de Vice City -[STADIUM] -Aspatria +[BEACH1] +Ocean Beach -[STADIU2] -Aspatria +[BEACH2] +Washington Beach -[STADIU3] -Aspatria +[BEACH3] +Vice Point -[HOSPI_2] -Rockford +[GOLFC] +Leaf Links -[UNIVERS] -Liberty Campus +[STARI] +Starfish Island -[CONSTRU] -Fort Staunton +[DOCKS] +Port de Vice -[PARK] -Belleville Park +[HAVANA] +Little Havana -[COM_EAS] -Newport +[HAITI] +Little Haiti -[SHOPING] -Bedford Point +[PORNI] +Prawn Island -[SHOP2] -Bedford Point +[DTOWN] +Centre -[SHOP3] -Bedford Point +[VICE_C] +Vice City -[YAKUSA] -Torrington +[A_PORT] +Aéroport Escobar -[SUB_ZON] -Shoreside Vale +[JUNKY] +Décharge -[AIRPORT] -Francis Intl. Airport +[PISTOL] +Pistolet -[PROJECT] -Wichita Gardens +[PYTHON] +.357 -[SUB_IND] -Pike Creek +[UZI] +Uz-1 -[SWANKS] -Cedar Grove +[TEC9] +Tec 9 -[BIG_DAM] -Cochrane Dam +[M4] +M4 -[SUB_ZO2] -Shoreside Vale +[INGRAM] +Mac -[SUB_ZO3] -Shoreside Vale +[MP5] +MP + +[RUGER] +Kruger + +[SNIPE] +Fusil à lunette + +[GRENADE] +Grenades + +[SHOTGN1] +Fusil à pompe + +[SHOTGN2] +S.P.A.S. 12 + +[SHOTGN3] +Fusil à pompe Stubby + +[ARMOUR] +Gilet pare-balles + +[LASER] +.308 Lunette + +[BASEBAT] +Batte de baseball + +[HAMMER] +Marteau + +[SCREWD] +Tournevis + +[CLEVER] +Couperet + +[MACHETE] +Machette + +[KNIFE] +Couteau + +[KATANA] +Katana + +[CHAINSA] +Tronçonneuse + +[G_COST] +$~1~ [CAR_1] Ambulance -[CAR_2] -Camion pompiers +[MALIBU] +Malibu Club -[CAR_3] -Police +[MANSION] +La résidence de Diaz -[CAR_4] -Enforcer +[TMANS] +Chez Tommy -[CAR_5] -Barracks +[STRIP] +'Pole Position Club' -[CAR_6] -Rhino +[MALL1] +Centre commercial de North Point -[CAR_7] -FBI Cruiser +[BANKINT] +El Banco Corrupto Grande -[CAR_8] -Securicar +[RANGE] +Champ de tir -[CAR_9] -Moonbeam +[POL_HQ] +QG de Vice City Police -[CAR_10] -Bus +[INT_B] +Un vieil ami -[CAR_11] -Flatbed +[INTB_1] +~g~Va au bureau de l'avocat. -[CAR_12] -Linerunner +[LAW_1] +La Fête -[CAR_13] -Trashmaster +[LAW_2] +Baston de Rue -[CAR_14] -Patriot +[LAW_3] +Jury sous pression -[CAR_15] -Mr Whoopee +[LAW_4] +Emeute -[CAR_16] -Mule +[COL_1] +Salaud de traître -[CAR_17] -Yankee +[COL_2] +Fusillade -[CAR_18] -Pony +[COL_3] +Anges gardiens -[CAR_19] -Bobcat +[COL_4] +Chef, oui, chef ! -[CAR_20] -Rumpo +[COL_5] +Sur le Pont -[CAR_21] -Blista +[COK_1] +Course poursuite -[CAR_22] -Dodo +[COK_2] +Phnom Penh '86 -[CAR_23] -Bus +[COK_3] +Speedboat -[CAR_24] -Sentinel +[COK_4] +Offre & demande -[CAR_25] -Cheetah +[KENT_1] +Couloir de la mort -[CAR_26] -Banshee +[ASS_1] +Liquidation -[CAR_27] -Stinger +[BUD_1] +EXTORSION -[CAR_28] -Infernus +[BUD_2] +Rixe de Bar -[CAR_29] -Esperanto +[BUD_3] +CopLand -[CAR_30] -Kuruma +[CAP_1] +L'encaisseur -[CAR_31] -Stretch +[FIN_1] +Amis proches -[CAR_32] -Perennial +[BANK_1] +Sans Issue -[CAR_33] -Landstalker +[BANK_2] +Le Flingueur -[CAR_34] -Manana +[BANK_3] +Le Chauffeur -[CAR_35] -Idaho +[BANK_4] +Hold-up -[CAR_36] -Stallion +[CNT_1] +La Mèche est vendue -[CAR_37] -Taxi +[CNT_2] +Halte au Messager -[CAR_38] -Cabbie +[PORN_1] +Bout d'essai -[CAR_39] -Buggy +[PORN_2] +Dodo Vibro -[SINDACO] -Sindacco Argento +[PORN_3] +Martha -[HEARSE] -Hearse +[PORN_4] +Projecteur-G + +[TAX_1] +Taxis Kaufman + +[TAXI_1] +V.I.P. + +[TAXI_2] +Concurrence Amicale + +[TAXI_3] +Cabmaggedon + +[ICE_1] +Distribution + +[TEX_1] +Quatre fers + +[TEX_2] +Funérailles + +[TEX_3] +Demolition Man + +[PHIL_1] +Trafiquant d'armes + +[PHIL_2] +Boomshine Saigon + +[BIKE_1] +Alliage d'Acier + +[BIKE_2] +Colère + +[BIKE_3] +Bécane + +[ROCK_1] +Love Juice + +[ROCK_2] +Psychopathe + +[ROCK_3] +Promo + +[ROCK_4] +Les Love Fist! + +[HAT_1] +Juju + +[HAT_2] +Bombes! + +[HAT_3] +Raclée + +[CUB_1] +Cascades aquatiques + +[CUB_2] +Chair à Canon + +[CUB_3] +Bataille Navale + +[CUB_4] +Vaudou + +[JOB_1] +Accident de la route + +[JOB_2] +Bute la femme! + +[JOB_3] +Autocide + +[JOB_4] +Enregistrement + +[JOB_5] +Détails + +[ANSWER] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~~w~ pour répondre au téléphone. + +[MOB_01A] +Comment ça va, mon pote? C'est Paul! J'ai peut-être quelque chose d'intéressant pour toi, mais faut que je te parle en personne. + +[MOB_01B] +Je suis en train de me la couler douce au Malibu. + +[MOB_01C] +Tu me devras un ou deux petits services en échange, mon mignon. A tout à l'heure... + +[MOB_02A] +Sniiiiiiiiiiiif! Hé, salut, Tommy! Tommy? + +[MOB_02B] +On a un problème à l'imprimerie. Tu ferais mieux d'aller y jeter un coup d'oeil. + +[MOB_02C] +Quelque chose a merdé. C'est le bordel. Faut que j'te laisse. + +[MOB_03A] +Mr Vercetti? J'ai ici un document signé qui établit formellement + +[MOB_03B] +que vous avez racheté toutes les dettes de BJ's Auto. + +[MOB_03C] +La disparition soudaine de BJ ne me laisse pas d'autre choix + +[MOB_03D] +que de vous tenir pour responsable du passif de cette société. + +[MOB_03E] +Jusqu'à ce que ce compte soit complètement soldé + +[MOB_03F] +vous devriez considérer les rues de Vice City comme très dangereuses. + +[MOB_04A] +Comment va, vieille branche? + +[MOB_04B] +Ecoute, Tommy, j'avais oublié de te dire qu'on va avoir besoin de balaises en plus pour le concert. + +[MOB_04C] +Y'a un gang de motards dirigé par Mitch Baker, ça nous ferai une super publicité. Vraiment Rock'n'roll, Baby. + +[MOB_04D] +Règle ça pour moi et je te laisserai accéder aux coulisses du concert, d'accord? + +[MOB_05A] +Bien joué, Tommy, j'suis content d'avoir récupéré ma bécane. + +[MOB_05B] +Dis à Mr Kent Paul que la sécurité sera assurée pour le concert. + +[MOB_05C] +Tu as ma parole. + +[MOB_05D] +Bon, maintenant, évite de t'attirer des emmerdes. + +[MOB_06A] +Tommy! Ceux d'en bas, ils parlent de toi, mon petit... + +[MOB_06B] +Je me disais que tu te laisserais peut-être tenter par un doux foyer et par une soupe au gombo de tata Poulet? Mmm? + +[MOB_06C] +Fais un saut par ma cuisine un de ces jours, hein, Tommy? + +[MOB_08A] +Salut, Tommy, je me disais que t'aurais peut-être besoin d'un conseil en affaires... + +[MOB_08B] +Dès que tu as une opération en route, il faut que tu passes prendre le fric de la semaine. + +[MOB_08C] +Si tu laisses les mecs penser que ce sont eux qui dirigent l'affaire, ils essayent de ronger tes bénefs! Ok? + +[MOB_08D] +Ca va, Ken, je connais le business... + +[MOB_08E] +Ok, ok, je sais que tu sais. Je sais. C'était... + +[MOB_08F] +C'était juste pour te dire que je sais que tu sais que je sais... + +[MOB_08G] +Ouvre simplement l'oeil! + +[MOB_08H] +T'inquiète, Ken, t'inquiète... + +[MOB_09A] +Salut, Léo! J'ai du boulot pour toi! + +[MOB_09B] +C'est pas Léo. + +[MOB_09C] +Si Léo apprend que t'as son téléphone, il va te buter aussi sec! + +[MOB_09D] +Peut-être que Léo est mort. Peut-être même que c'est moi qui l'ai buté et que j'ai hérité de son téléphone. T'avais pas pensé à ça hein, connard? + +[MOB_09E] +T'as buté Léo? Alors, c'est que t'en as dans le froc! Tu veux bosser pour moi? + +[MOB_09F] +Passe au café de mon père dans Little Havana et on pourra causer entre hommes. + +[MOB_10A] +Tommy! Ecoute, j'ai un service à te demander! + +[MOB_10B] +Steve! Comment ça marche, le cinoche? + +[MOB_10C] +Ca va, ça va. Mais on a besoin d'une scène de poursuite en bagnole et on a pas le budget pour ça. + +[MOB_10D] +J'ai laissé des bagnoles dans les environs. Tu sauras quoi faire. + +[MOB_10E] +OK, Steve, je vais voir ce que je peux faire. A plus tard. + +[MOB_11A] +Salut petit, je me suis dit que j'allais te passer un coup de fil pour te donner un bon conseil. + +[MOB_11B] +Salut Avery, qu'est-ce que tu voulais me dire? + +[MOB_11C] +Les perspectives ne manquent pas dans cette ville, si tu possèdes le bon business... Tu vois ce que je veux dire? + +[MOB_11D] +Je pense que oui... + +[MOB_11E] +Je te conseille d'ouvrir l'oeil, et le bon, si tu veux dégotter un bon business. A plus tard. + +[MOB_11F] +Ciao, Avery. + +[MOB12_A] +Tommy! C'est Avery! Ecoute, je suis débordé de boulot pour le moment, + +[MOB12_B] +et j'ai un de mes réprésentants qui a besoin d'être chaperonné jusqu'aux Gator Keys. + +[MOB12_C] +Je suis sur l'achat d'un terrain là-bas, alors j'envoie un mec graisser quelques pattes. + +[MOB12_D] +J'ai besoin que tu t'assures qu'il arrive bien là-bas. OK? + +[MOB12_E] +OK, pas de problème, Avery! Mais où c'est que je le trouve, ce mec? + +[MOB12_F] +Il boucle une affaire au chantier. Je lui ai dit que tu le prendrais là-bas. + +[MOB12_G] +Ok, Avery. J'y vais. A plus tard. + +[MOB13_A] +Vercetti? VERCETTI! Putain, mec, faut que tu me files un coup de main! + +[MOB13_B] +Mr Moffat? Comment va la famille? + +[MOB13_C] +Merde, mais quel con! Tu m'entends? + +[MOB13_D] +Ca m'a fait plaisir d'avoir des nouvelles... + +[MOB13_E] +Attends! Attends! Vercetti, euh... Tommy. Je peux t'appeler Tommy? + +[MOB13_F] +On est tous les deux dans les affaires, pas vrai? Et tu sais renifler les bonnes, hein? + +[MOB13_G] +J'ai pas le temps de causer, viens-en au fait! + +[MOB13_H] +Du FRIC! Voilà le putain de fait! + +[MOB13_I] +Je me suis encore tiré de taule, mais ça prend jamais longtemps avant qu'ils me retombent dessus. Pour eux, c'est qu'un putain de jeu! + +[MOB13_J] +Je t'appelle d'une cabine quelque part dans le trou du cul du monde! + +[MOB13_K] +Sors-moi de là avant qu'ils me chopent encore et... et... ah... meeeerde... + +[MOB13_L] +Eh bien, c'est que je suis très occupé pour les prochaines- + +[MOB13_M] +Non! Me laisse pas dans cette merde! T'as pas de coeur ou quoi? Putain, j'devrais pas avoir à m'abaisser comme ça! + +[MOB13_N] +Je suis à genoux, Tommy! Et c'est les rotules dans la poussière que je te supplie... + +[MOB13_O] +J'imagine que je pourrais passer dans le coin et voir si je te trouve... + +[MOB13_P] +Oh, merde, les voilà! Putain, magne-toi, Tommy! Vite! + +[MOB_14A] +Salut, Tommy, on va bien s'entendre, toi et moi. + +[MOB_14B] +Une tendre amie est venu me sussurrer dans l'oreille que la division SWAT de Vice City a un coffre dans une grosse banque, + +[MOB_14C] +et ils y gardent les pots-de-vin de toutes ces dernières années. + +[MOB_14D] +C'est une sorte de caisse de retraite pour vieux garçons. + +[MOB_14E] +Evidemment, si cette info pouvait t'aider à ramasser un peu de ce pognon, + +[MOB_14F] +j'imagine que tu te sentirais obligé de m'en refiler un peu, pas vrai, Tommy? + +[MOB_14G] +Je vais garder ça à l'esprit, merci, Kent. + +[MOB_14H] +Je m'appelle Paul, abruti! Et je suis du Kent, près de Londres. + +[MOB_14I] +Pour ce que j'en ai à foutre de la campagne anglaise, depuis l'école... + +[MOB15_A] +Tommy, mon vieux, c'est Paul, du Kent. + +[MOB15_B] +Il y a une ou deux authentiques dames qui ont ton nom plein la bouche, au Malibu. + +[MOB15_C] +De quoi tu parles?! + +[MOB15_D] +De gonzesses, de poulettes, de filles, quoi! Et bien élevées, pas le genre à causer pognon. + +[MOB15_E] +Faut que tu viennes voir ça. + +[MOB16_A] +Tommy, c'est Paulo, que pasa amigo? + +[MOB16_B] +Qu'est-ce que tu m'veux, Paul? J'ai pas besoin de fausses fringues de marque. + +[MOB16_C] +Très drôle, mon vieux, mais je fais pas dans la fringue de tapette, moi. + +[MOB16_D] +Bon, je t'appelle parce que j'me demande si je ne pourrais pas avoir un rôle dans un de tes films. + +[MOB16_E] +J'ai fait pas mal de pornos en Angleterre, mon vieux. + +[MOB16_F] +Au plumard, je suis une mitrailleuse lourde. + +[MOB16_G] +Merci de me proposer tes services, Paul, j'y réfléchirai. + +[MOB16_H] +Sérieusement, pense à moi, après tout ce que j'ai fait pour toi... + +[MOB16_I] +Justement, j'essaie de l'oublier. + +[MOB17_A] +Tommy Vercetti, comment ça va, big boss? + +[MOB17_B] +J'ai entendu tous ces trucs sur toi. Un flambeur en ville maintenant... + +[MOB17_C] +Paul, t'es bourré. + +[MOB17_D] +Naan! Pauvre abruti! J'suis pas saoul! + +[MOB17_E] +J'ai juste pris un ou deux verres et quelques tournées, et ça fait deux jours que j'ai pas fermé l'oeil! + +[MOB17_F] +De toute façon, ne me traite pas comme ça. + +[MOB17_G] +Je suis pas une poire. Qui c'est qui t'a lancé dans cette ville? Hein, qui? Moi! + +[MOB17_H] +Ah ouais? + +[MOB17_I] +Ouais! + +[MOB17_J] +Paul, t'énerve pas. J'étais occupé, sois pas stupide. + +[MOB17_K] +Je suis pas stupide, connard! Ils me l'ont dit en maison de redressement! + +[MOB17_L] +Si tu cherches les emmerdes, mon pote, tu vas les trouver! + +[MOB17_M] +Tommy, s'il te plaît! T'étais mon grand espoir! Te fous pas de moi! + +[MOB17_N] +Paul, va roupiller un bon coup, sérieusement. + +[MOB18_A] +Tommy, c'est Paulo, comment ça va, mon pote, je me suis dit que j'allais te passer un petit coup de fil. + +[MOB18_B] +Ah, mon pote, tu croiras jamais l'incroyable petit lot que je viens de lever... + +[MOB18_C] +Elle se promenait juste en bas dans Little Havana, mon pote. + +[MOB18_D] +Elle m'a dit qu'elle s'appelait Mercedes ou un truc comme ça. Ah, mon pote, faut que t'ailles voir cette fille! + +[MOB18_E] +Elle ferait bander un eunuque! Elle m'a dit que j'étais le meilleur coup de sa vie et tout et tout! + +[MOB18_F] +Vas-y, trouve-la. A plus tard. + +[MOB19_A] +Tommy V, c'est KP! Kent Paul. Le bruit court que des mecs veulent te faire la peau. + +[MOB19_B] +Ouvre l'oeil, mon pote. Et oublie pas... Je t'ai rien dit. + +[MOB_20A] +Salut, Tommy, c'est Paul. Je viens juste d'entendre dire que t'avais été un vilain garçon. + +[MOB_20B] +Il y a quelqu'un qui s'est vexé de te voir jouer les caïds et ça lui a donné de mauvaises idées... + +[MOB_20C] +Bon, dis à personne que je t'ai rencardé. Les grandes gueules finissent toujours par l'avoir dans l'os. + +[MOB_20D] +Enfin, j'ai entendu dire que ta tête a été mise à prix et que quelqu'un va essayer de t'avoir, + +[MOB_20E] +alors fais gaffe, et m'oublie pas, mon pote. + +[MOB71_A] +Tommy, Thomas, c'est Cortez. Que pasa? + +[MOB71_B] +Les affaires tournent... Et toi, comment ça va? + +[MOB71_C] +Tommy, ici, c'est toujours la guerre. Excusez la mauvaise ligne, mais on vient juste d'avoir un nouveau coup d'état manqué. + +[MOB71_D] +Le peuple est la plus exigeante des maîtresses. + +[MOB71_E] +Si je compte bien, y'a eu trois révolutions et quatre coups d'état depuis que je suis rentré de Vice City. + +[MOB71_F] +Heureusement, à chaque fois, j'ai pris du galon. + +[MOB71_G] +Je voulais vous demander quelque chose à propos de Mercedes... + +[MOB71_H] +Ouais? Quoi? + +[MOB71_I] +Voilà, Tommy, Tommy, j'ai entendu toutes ces histoires et je sais pas quoi penser... + +[MOB71_J] +Peut-être que tout le monde essaye de m'humilier... + +[MOB71_K] +Peut-être qu'elle se croit tout permis, mais dites-moi juste la vérité, Tommy, c'est vrai? + +[MOB71_L] +Mais dites-moi juste la vérité, Tommy, c'est vrai? + +[MOB71_M] +Qu'est-ce qui est vrai? + +[MOB71_N] +Ces bruits qui courent... Elle va vraiment devenir avocate? + +[MOB71_O] +Ah, Tommy, c'est une véritable honte! Nous, les Cortez, sommes une honorable famille et nous ne tolèrerons jamais qu'une de nos filles devienne avocate. + +[MOB71_P] +Je vous en prie, dites-moi que ce n'est pas vrai, je ne crois pas que je pourrais le supporter. + +[MOB71_Q] +Colonel, je peux vous assurer que Mercedes ne deviendra jamais avocate. Ne vous inquiètez pas. + +[MOB71_R] +Merci, Tommy, cette honte me serait insupportable. C'est une femme, pas un parasite, vous comprenez. + +[MOB71_S] +Je le sais, colonel. + +[MOB71_T] +Bon, vous allez devoir m'excuser, Tommy, mais le nouveau ministre de l'intérieur vient d'arriver... + +[MOB71_U] +Il y a de nombreuses années, j'ai tué son père au cours d'une tentative de coup d'état ratée et je dois me montrer poli. Adios, amigo. + +[MOB22_A] +Tommy, vous vous révèlez très utile, amigo. + +[MOB22_B] +Merci, Cortez. Et mon affaire? + +[MOB22_C] +Tommy, je travaille inlassablement en ce sens pour aller au fond des choses et de la vérité dans cette terrible histoire. + +[MOB22_D] +Vous avez ma parole, mais en attendant, + +[MOB22_E] +acceptez, je vous en prie, les sincères remerciements de mon peuple pour vos actions bénéfiques. + +[MOB_25A] +Tommy, c'est Cortez. Les Français me font beaucoup d'ennuis... + +[MOB_25B] +Les sales hypocrites! Ils passent des siècles à piller les pays pauvres et ils osent me traiter de voleur! + +[MOB_25C] +Je vais avoir besoin de votre aide aussi vite que possible. + +[MOB_25D] +Vite, Tommy, j'ai vraiment besoin de vous. Je hais ces maudits Français! + +[MOB_26A] +Allo, Tommy? + +[MOB_26B] +Ouais? + +[MOB_26C] +C'est moi, Baker. Je voulais juste te dire que j'ai beaucoup apprécié le spectacle. + +[MOB_26D] +Moi et mes gars, on veut te remercier, et te rappeler + +[MOB_26E] +que tu as tout notre respect. Bon, salut. Et continue comme ça, mon pote. + +[MOB_29A] +Allo? Vous êtes bien M. Tommy Vercetti? + +[MOB_29B] +Ouais. + +[MOB_29C] +Bien. J'ai entendu dire que vous êtes l'homme à appeler quand on est victime d'une invasion de vermine. + +[MOB_29D] +Ca se peut... + +[MOB_29E] +Eh bien, là je suis vraiment envahi par la vermine. Les haïtiens sont partout... + +[MOB_29F] +Je m'appelle Umberto Robina et je vous propose une rencontre au Café Robina aussitôt que vous pourrez. + +[MOB_29G] +Moi j'vous le dis, ces maudits haïtiens sont allés trop loin, cette fois... + +[MOB_29H] +Test + +[MOB_30A] +Tommy, c'est Umberto Robina. + +[MOB_30B] +Quoi de neuf au café? + +[MOB_30C] +Oh, merveilleux, Tommy, vraiment incroyable! Ici, plus de mauviettes, Tommy. Juste de vrais hommes et des belles filles! + +[MOB_30D] +Je voulais te dire que moi et papa, maintenant, on te considère comme cubain. + +[MOB_30E] +T'as fait tes preuves, mon frère et t'en as une sacrée paire dans l'pantalon! + +[MOB_30F] +Euh, merci, Umberto. Personne ne m'a dit ça depuis que je suis sorti de taule. Bon, salut. + +[MOB_33A] +Tommy, c'est Phil! Bon, arrête tes conneries et écoute-moi, tu veux? + +[MOB_33B] +Bon. J'ai du whisky extra fort, presque fermenté, et je me demandais si tu voulais pas venir boire un coup... + +[MOB_33C] +Sans déconner, Tommy, si t'as besoin d'un verre ou de décoller de la peinture, t'es le bienvenu, ce truc fera de toi un homme! + +[MOB_33D] +Ca me fait cet effet, même si je vois plus rien d'un oeil. Je t'attends, t'entends? + +[MOB_34A] +Tommy, ça m'a fait vraiment plaisir de bosser avec toi. Je m'étais pas autant marré depuis la guerre du Vietnam, mon pote. + +[MOB_34B] +Bon, si t'as besoin de quelque chose, tu m'appelles, t'entends? + +[MOB_34C] +Je n'oublie jamais ceux avec qui j'ai servi + +[MOB_34D] +et je suis sûr que je peux t'aider, t'entends? + +[MOB_35A] +Tommy, la blessure cicatrise bien. Le truc drôle, c'est que + +[MOB_35B] +j'ai combattu dans six batailles et que je m'en suis toujours sorti sans une égratignure, et voilà! + +[MOB_35C] +'Phil, le manchot d'un bras.' Enfin, j'ai encore une large selection d'armes de poing alors je serai jamais 'Phil, le désarmé', t'entends? + +[MOB_35D] +Aller, mon pote, laisse tomber les conneries sentimentales et va te boire un verre, t'entends? + +[MOB_36A] +Tommy, c'est Phil. Je voulais te remercier pour le coup de main, mon pote. + +[MOB_36B] +Salopard de Charlie, toujours à tendre des embuscades ici ou là, + +[MOB_36C] +mais la blessure cicatrise bien, et ça veut aussi dire que j'aurai plus à truander le gouvernement pour le contrôle d'invalidité. Merci, mon pote. + +[MOB_40A] +Salut, Tommy, c'est Sonny. Alors ce bronzage? + +[MOB_40B] +J'suis pas bronzé. + +[MOB_40C] +Ouais et t'as pas non plus mon pognon, alors je m'interrogeais... + +[MOB_40D] +Je me disais : 'Qu'est-ce qu'il fout?' Alors, je te le demande, Tommy, qu'est-ce que tu fous? + +[MOB_40E] +Je cherche le pognon, Sonny, t'inquéte pas! + +[MOB_40F] +Je m'inquiéte, Tommy, c'est mon genre, + +[MOB_40G] +parce que j'ai ce problème récurrent dans la vie de tomber sur des gens indignes de confiance... + +[MOB_40H] +Ne sois pas indigne de ma confiance, Tommy, s'il te plaît... + +[MOB_40I] +Rends-nous à tous deux ce service. J'attends de tes nouvelles... + +[MOB_41A] +Tommy, tu te souviens de moi? + +[MOB_41B] +Salut, Sonny. + +[MOB_41C] +Ouais, exactement, Sonny, on est de vieux amis, + +[MOB_41D] +mais tu ne m'écris jamais, tu ne m'appelles jamais. Tu ne veux plus qu'on soit amis? + +[MOB_41E] +J'ai été très occupé à régler des trucs ici et là. Tu ne m'aides pas beaucoup, ici. + +[MOB_41F] +Oh, c'est ma faute? Bon, j'ai entendu que tu étais très occupé, d'accord, + +[MOB_41G] +occupé à liquider des barons de la drogue, occupé à prendre le pouvoir. + +[MOB_41H] +Alors je te préviens simplement de ne pas m'oublier, Tommy, parce que moi, je ne t'oublie pas... + +[MOB_42A] +Tommy. + +[MOB_42B] +Sonny. + +[MOB_42C] +Faut croire que t'es à moitié sourd, alors je vais me répéter : + +[MOB_42D] +Tommy, où est ce putain de pognon? Où est cette putain de marchandise? Et où est ma putain de part sur ta nouvelle affaire? + +[MOB_42E] +Tu te fous vraiment d'ma gueule, Tommy, et ça me fait pas rire! + +[MOB_43A] +Tommy! Tommy! J'ai eu Sonny au téléphone. Tu m'écoutes? + +[MOB_43B] +Je ne sais pas pour toi, mais il y a un mec qui menace de buter toute ma famille, + +[MOB_43C] +et ça me fout vraiment les jetons. Qu'est-ce que tu comptes faire? + +[MOB_43D] +Reste calme, Ken, tout va bien se passer. + +[MOB_43E] +Je suis calme! Calme comme un homme qui craint pour sa propre vie! + +[MOB_43F] +Ken, j'ai d'autres choses en tête pour l'instant, + +[MOB_43G] +on s'occupera de Forelli quand l'heure sera venue. + +[MOB_43H] +Je suis calme. J'ai pas l'air calme? J'sais pas, c'est ma voix qui a changé à cause de la mort qui me pend au nez! + +[MOB45_A] +Tommy, faut qu'on cause sérieusement. + +[MOB45_B] +C'est quoi le problème, Lance? + +[MOB45_C] +C'est toi le problème, mon pote, j'ai l'impression que tu m'files pas une part équitable... + +[MOB45_D] +Mais le pire, c'est que tu m'as foutu la honte devant les mecs. Je supporte pas ça. + +[MOB45_E] +Lance, c'est pas ça du tout. T'as fait des bourdes, c'est tout. + +[MOB45_F] +Tommy, je suis pas ton petit messager et encore moins ton garçon de courses. + +[MOB45_G] +Lance, déconne pas et on aura pas d'emmerdes! Et si c'est moi qui déconne, tu peux me rentrer dedans quand tu veux. + +[MOB45_H] +Tommy, j'ai tout fait pour toi et tu me traites comme un con. Fais pas ça. + +[MOB45_I] +Lance, je ne vais pas t'arnaquer ou te planter un couteau dans le dos, ok? + +[MOB45_J] +T'énerve pas. C'est déjà assez dur comme ça, sans que tu perdes les pédales. + +[MOB45_K] +Fais-moi confiance. Tu m'entends? Tu m'entends? + +[MOB45_L] +Je t'entends, Tommy, mais je peux pas supporter ça plus longtemps. + +[MOB45_M] +Lance, arrête de déconner. Maintenant, je te préviens. + +[MOB45_N] +Tu m'entends? Relax! Prends quelques jours de repos et on en reparle, ok? + +[MOB46_A] +Tommy, c'est Lance. + +[MOB46_B] +Ouais? + +[MOB46_C] +Même pas un 'ça fait plaisir d'avoir des tes nouvelles'? Allez, mec, sois sympa! + +[MOB46_D] +Je suis occupé. Qu'est-ce que tu veux? + +[MOB46_E] +Rien. C'était juste pour te dire... Tu sais, Tommy, on peut faire ce truc. + +[MOB46_F] +Toi et moi, sans problème. Tu vois ce que je veux dire? + +[MOB46_G] +Va bien falloir qu'on le fasse, parce que sinon, on est morts, Lance. + +[MOB46_H] +On peut plus reculer, maintenant, mais merci de ton appel. On se reparle plus tard. + +[MOB_47A] +Tommy, c'est Lance, on a de gros problèmes. Amène-toi ici en vitesse. + +[MOB52_A] +Salut, Léo, je crois qu'on a un acheteur pour la marchandise de Diaz. + +[MOB52_B] +Il faut que tu l'appelles, mec, pour organiser le deal, tu comprends? + +[MOB52_C] +T'es où, là? + +[MOB52_D] +T'es sûr que ça va, Léo? T'as une voix bizarre... + +[MOB52_E] +Dis-moi juste où t'es. + +[MOB52_F] +Qui c'est qui cause? Je veux parler à Léo! + +[MOB52_G] +Léo est parti pour un moment, je le remplace. + +[MOB52_H] +Va te faire foutre, connard! + +[MOB54_A] +Salut, Tommy! + +[MOB54_B] +Salut, Mercedes, quoi de neuf? + +[MOB54_C] +J'ai un nouvel appartement dans Vice Point. + +[MOB54_D] +J'ai pensé que tu voudrais peut-être passer un de ces quatre... + +[MOB54_E] +J'adorerai. A plus tard. + +[MOB55_A] +Tommy, c'est moi. + +[MOB55_B] +Salut, Mercedes. + +[MOB55_C] +Tommy, je m'ennuie tellement! Quand est-ce qu'on va s'amuser? + +[MOB55_D] +Comment ça? + +[MOB55_E] +Bon, je sais que t'es très occupé à te battre, à tuer des gens ou à les corrompre, + +[MOB55_F] +mais moi, j'ai envie de m'amuser un peu! Alors, ne m'oublie pas, Tommy! + +[MOB56_A] +Tommy, j'ai entendu dire que tu avais tué Ricardo Diaz! + +[MOB56_B] +Un feu accidentel s'est déclenché dans sa résidence... + +[MOB56_C] +Je pense qu'il a cramé dans sa chemise en acrylique. + +[MOB56_D] +Tommy, je suis si fière de toi! Je savais que tu étais un vrai macho! + +[MOB56_E] +Ah, mon dur de dur, je suis si fière d'être ton amie! + +[MOB56_F] +Je sais que tu vas être très occupé à essayer de t'emparer de cette ville, + +[MOB56_G] +mais ne m'oublie pas, d'accord? + +[MOB57_A] +C'est Mercedes. Je ne t'aime plus, Tommy! + +[MOB57_B] +C'est fini! C'est vrai! Parce que tu n'es plus gentil avec moi! + +[MOB57_C] +Tu ne me traites plus comme une dame! Tu m'ignores et je te déteste! + +[MOB57_D] +Je veux que tu viennes me voir tout de suite! " + +[MOB58_A] +Tommy. + +[MOB58_B] +Salut, Mercedes. + +[MOB58_C] +Bonjour monsieur le vrai dur! Je suis très en colère contre toi, Tommy! + +[MOB58_D] +Ne m'oblige plus jamais à supporter Jezz Torrent! + +[MOB58_E] +Il est pathétique! En plein milieu il a commencé à pleurer à cause de son toutou + +[MOB58_F] +qui est mort quand il avait 7 ans et parce que sa mère ne l'a jamais aimé... + +[MOB58_G] +En plus, Tommy, il porte une perruque et un soutien-gorge dans l'intimité! + +[MOB58_H] +Je t'en veux vraiment! + +[MOB59_A] +Ooh Tommy, c'est Mercedes. + +[MOB59_B] +Je voulais juste te dire que je m'étais éclatée sur le tournage! + +[MOB59_C] +Si tu as quelque chose d'autre de ce genre, pense à moi! + +[MOB59_D] +Je suis sincère! J'ai toujours voulu être actrice! + +[MOB59_E] +Je crois que j'ai beaucoup appris sur l'art dramatique! + +[MOB59_F] +C'est tellement révélateur! Merci beaucoup! On se voit très bientôt, adios! + +[MOB_99] +Rends-toi à la cabine indiquée. + +[MOB_98] +Rends-toi à la cabine indiquée. + +[MOB_97] +Rends-toi à la cabine indiquée. + +[MOB_96] +Rends-toi à la cabine indiquée. + +[MOB_95] +Rends-toi à la cabine indiquée. + +[A_TIME] ++~1~ secondes + +[F_RANGE] +La radio du camion de pompiers ne capte plus rien. Rapproche-toi d'une caserne! + +[DODO_FT] +Tu as 'volé' pendant ~1~ secondes! + +[GA_8] +Utilise le détonateur pour armer la bombe. + +[GA_10] +Bravo. 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 ne nous intéresse pas! + +[GA_20] +On en a trop des comme ça! Désolé, mec. + +[CHASE] +Attention maximale des médias + +[CHASE1] +Ignoré + +[CHASE2] +Ennuyeux + +[CHASE3] +Plus ou moins intéressant + +[CHASE4] +Journal local page 7 + +[CHASE5] +Journal local La une + +[CHASE6] +Vice Courier Rubrique 1 + +[CHASE7] +Vice Courier La une + +[CHASE8] +Télé locale 3h du mat' + +[CHASE9] +Télé locale Infos + +[CHASE10] +Télé locale Direct + +[CHASE11] +UFA Today page 12 + +[CHASE12] +UFA Today page 4 + +[CHASE13] +Photo dans UFA Today + +[CHASE14] +Télé nationale 4h du mat' + +[CHASE15] +Télé nationale Infos + +[CHASE16] +Télé nationale Direct + +[CHASE17] +Infos internationales + +[CHASE18] +Crise nationale + +[CHASE19] +Crise internationale + +[CHASE20] +Evénement mondial + +[CHASE21] +Truc de légendes + +[CR_1] +La grue ne peut pas soulever ce véhicule. + +[PU_MONY] +T'as pas assez de liquide. + +[CO_ALL] +Tu les as toutes eues. Tiens, voilà pour toi... + +[FEM_ON] +Activé + +[FEM_OFF] +Désactivé + +[FEM_YES] +Oui + +[FEM_NO] +Non + +[FEM_RET] +Réessayer + +[FEC_NA] +NA + +[FEC_CWL] +Faire défiler les armes vers la gauche + +[FEC_CWR] +Faire défiler les armes vers la droite + +[FEC_LOF] +Regarder devant + +[FEC_TAR] +Viser + +[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] +Rergarder à gauche + +[FEC_LB] +Regarder derrière + +[FEC_LR] +Regarder à droite + +[FEC_HOR] +Klaxon + +[FEC_VES] +Commandes du véhicule + +[FEC_BRA] +Freiner ou marche arrière + +[FEC_HAB] +Frein à main + +[FEC_CAW] +Arme du véhicule + +[FEC_ACC] +Accélérateur + +[FEC_CCF] +Configuration : + +[FEC_CF1] +Config. 1 + +[FEC_CF2] +Config. 2 + +[FEC_CF3] +Config. 3 + +[FEC_CF4] +Config. 4 + +[FEC_CDP] +Affichage manette : + +[FEC_ONF] +à pied + +[FEC_INC] +En voiture + +[FEC_VIB] +Vibrations : + +[FEL_ENG] +Anglais + +[FEL_FRE] +Français + +[FEL_GER] +Allemand + +[FEL_ITA] +Italien + +[FEL_SPA] +Espagnol + +[FED_DBG] +Menu Debug + +[FED_RID] +Recharger IDE + +[FED_RIP] +Recharger IPL + +[FED_PAH] +Analyser Saut + +[FED_DFL] +CTheScripts::DbgFlag + +[FED_DLS] +Lumière blanche de debug allumée + +[FED_SPR] +Affiche les groupes de pietons + +[FED_SCR] +Affiche les groupes en voiture + +[FED_SCZ] +Affiche les zones de massacre + +[FED_DSR] +Debug les demandes de répartition par niveaux + +[FED_SCP] +gb Indique les polys de collision + +[PL_STAT] +Stats du joueur + +[PE_WAST] +Personnes tuées par toi + +[PE_WSOT] +Personnes tuées par d'autres + +[TM_BUST] +Nb de fois capturé + +[GNG_WST] +Gangsters tués + +[DED_CRI] +Criminels tués + +[PER_COM] +Pourcentage accompli + +[KGS_EXP] +Kilos d'explosifs utilisés + +[ACCURA] +Précision + +[ST_WEAP] +Budget arsenal + +[ST_PROP] +Budget propriété + +[ST_AUTO] +Budget réparation et peinture voiture + +[ST_PHOT] +Photos prises + +[ST_LOAN] +Visites des usuriers + +[ST_STOR] +Magasins liquidés + +[ST_MOVI] +Cascades de films + +[ST_PIZZ] +Pizza livrées + +[ST_GARB] +Collectes de détritus effectuées + +[ST_ICEC] +Crèmes glacées vendues + +[TOP_SHO] +Meilleur score au champ de tir + +[SHO_RAN] +Position au champ de tir + +[SEAGULL] +Mouettes descendues + +[PROPOWN] +Propriété possédée + +[ST_TIME] +Temps de jeu + +[ST_FTIM] +Heures de vol + +[ST_PRAN] +Classement pilote + +[ST_RAN0] +Apprenti + +[ST_RAN1] +Navigateur + +[ST_RAN2] +Copilote + +[ST_RAN3] +Junior + +[ST_RAN4] +Compétent + +[ST_RAN5] +Senior + +[ST_RAN6] +As + +[ST_RAN7] +Baron rouge + +[ST_DRWN] +Poissons nourris + +[ST_FASH] +Budget fringues + +[ST_DAMA] +Propriété détruite + +[TM_DED] +Visites à l'hôpital + +[DAYSPS] +Jours passés dans le jeu + +[NUMSHV] +Visites dans l'entrepôt + +[MXCARD] +Dist. max. de saut de Cascade dangereuse (ft) + +[MXCARJ] +Hauteur max. de saut de Cascade dangereuse(ft) + +[MXCARDM] +Dist. max. de saut de Cascade dangereuse (m) + +[MXCARJM] +Hauteur max. de saut de Cascade dangereuse (m) + +[MXFLIP] +Saltos max. de saut de Cascade dangereuse + +[MXJUMP] +Rotation max. de saut de Cascade dangereuse + +[BUL_FIR] +Balles tirées + +[BUL_HIT] +Balles ayant atteint la cible + +[SPRAYIN] +Peintures + +[BSTSTU] +Meilleure cacade 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 réalisée + +[NOUNIF] +Sauts uniques accomplis + +[NMISON] +Tentatives de mission + +[PASDRO] +Passagers perdus + +[MONTAX] +Total des courses en taxi + +[DAYPLC] +Dépenses quotidiennes de police + +[CRIMRA] +Taux de criminalité : + +[STPR_1] +Le Malibu + +[STPR_2] +Imprimerie + +[STPR_3] +Studio de cinéma + +[STPR_4] +Usine de crème glacée + +[STPR_5] +Concession automobile + +[STPR_6] +Compagnie de taxis + +[STPR_7] +Chantier naval + +[SET1EN] +Config. 1. Activée + +[GMSAVE] +Sauvegarder partie + +[FEDS_TB] +Retour + +[FEST_OO] +sur + +[FEC_TUC] +Commandes tourelle + +[FEC_RS3] +Faire défiler les stations de radio (touche L3) + +[FEC_HO3] +Klaxonner (touche L3) + +[C_FAIL] +Mission d'autodéfense terminée! + +[C_ESCP] +~r~Le suspect s'est échappé! + +[C_VIGIL] +BONUS AUTODEFENSE! + +[HEAL_A] +Ton niveau de ~h~santé~w~ s'affiche en orange en haut à droite de l'écran. + +[WRONGCD] +Disque invalide. Insère le bon disque. + +[NOCD] +Le compartiment à disque est vide. Insère un disque. + +[OPENCD] +Le compartiment à disque est ouvert. Referme-le. + +[CDERROR] +Erreur au cours de la lecture du DVD de Grand Theft Auto: Vice City + +[RESTART] +Démarrage d'une nouvelle partie + +[GA_3] +Plus de cadeaux. 100$ pour repeindre! + +[GA_1] +Oula! Je ne touche à rien d'aussi chaud, moi! + +[GA_1A] +Reviens quand tu seras moins occupé... + +[HELP9_C] +Appuie sur la~h~ ~k~~PED_FIREWEAPON~ ~w~pour ~h~tirer~w~ avec le fusil à lunette. + +[TAXI2] +~r~Tu n'as plus le temps! + +[PAGEB13] +Santé livrée à la planque + +[PAGEB14] +Adrénaline livrée à la planque + +[FESZ_CA] +Annuler + +[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 les données depuis la dernière partie sauvegardée seront perdues. Continuer? + +[T4X4_1] +'Terrain de jeu PCJ' + +[BMX_1] +'Sélection par la boue' + +[BMX_2] +'Piste d'essai' + +[BMXFAIL] +~r~Tu n'as pas réussi à établir un nouveau record! + +[T4X4_3] +'DANS LA POCHE!' + +[MM_1] +'Cônes en folie' + +[T4X4_F] +~r~Tu t'es barré! Trop dur pour toi? [LANDSTK] Landstalker @@ -740,13 +2178,16 @@ Linerunner Perennial [SENTINL] -Sentinel +Sentinelle + +[RIO] +Rio [PATRIOT] -Patriot +Patriote [FIRETRK] -Camion pompiers +Camion de pompier [TRASHM] Trashmaster @@ -760,8 +2201,8 @@ Manana [INFERNS] Infernus -[BLISTA] -Blista +[VOODOO] +Voodoo [PONY] Pony @@ -776,7 +2217,7 @@ Cheetah Ambulance [FBICAR] -FBI Cruiser +FBI Washington [MOONBM] Moonbeam @@ -787,8 +2228,8 @@ Esperanto [TAXI] Taxi -[KURUMA] -Kuruma +[WASHING] +Washington [BOBCAT] Bobcat @@ -799,6 +2240,9 @@ Mr Whoopee [BFINJC] BF Injection +[HUNTER] +Hunter + [POLICAR] Police @@ -823,20 +2267,17 @@ Rhino [BARRCKS] Barracks OL -[BARRACK] -Barracks OL - -[TRAIN] -Train +[CUBAN] +Cuban Hermes [HELI] -Hélico +Hélicoptère [DODO] Dodo [COACH] -Bus +Coach [CABBIE] Cabbie @@ -850,32 +2291,29 @@ Rumpo [RCBANDT] RC Bandit -[BELLYUP] -Triad Fish Van +[ROMERO] +Corbillard de Romero -[MRWONGS] -Mr Wongs +[PACKER] +Packer -[MAFIACR] -Leone Sentinel +[ADMIRAL] +Amiral -[YARDICR] -Yardie Lobo +[SQUALO] +Squalo -[YAKUZCR] -Yakuza Stinger +[SEASPAR] +Sea Sparrow -[DIABLCR] -Diablo Stallion +[PIZZABO] +Pizza Boy -[COLOMCR] -Cartel Cruiser +[GANGBUR] +Gang Burrito -[HOODSCR] -Hoods Rumpo XL - -[AEROPL] -Avion +[TROPIC] +Tropic [SPEEDER] Speeder @@ -883,68 +2321,29 @@ Speeder [REEFER] Reefer -[PANLANT] -Panlantic - [FLATBED] Flatbed [YANKEE] Yankee -[BORGNIN] -Bickle'76 +[CADDY] +Caddy -[TOYZ] -TOYZ +[ZEBRA] +Taxi Zebra -[MCLARN] -Lancer MF1 +[TOPFUN] +Top Fun -[SHELBY] -Hellenbach GT +[SKIMMER] +Skimmer -[SUBARU] -Impreza WRX +[PCJ600] +PCJ 600 -[SUPRA] -Supra - -[SKYLINE] -Skoiloine - -[CYCLONE] -Cyclone GT - -[ESPRIT] -V8 Ghost - -[MINI] -Tommy - -[HOTROD] -Thunder-Rodd - -[CAMPVAN] -Campaign Rumpo - -[BALLOT] -Camionnette avec bulletins - -[GHOST] -Ghost - -[ANGEL] -Angel - -[ANGEL2] -Avenger - -[PIZZABO] -Mob Pizza - -[NOODLBO] -Mob Nouilles +[PHOENIX] +Phoenix [FAGGIO] Faggio @@ -952,2129 +2351,1742 @@ Faggio [FREEWAY] Freeway +[RCBARON] +RC Baron + +[RCRAIDE] +RC Raider + +[GLENDAL] +Glendale + +[OCEANIC] +Oceanic + [SANCHEZ] Sanchez -[SANCH2] -Manchez +[SPARROW] +Sparrow -[F_PASS1] -~w~Feu éteint ! Récomp. : ~1~$ +[LOVEFIS] +Love Fist -[F_RANGE] -~r~La radio du camion de pompiers ne capte plus rien ! Rapproche-toi d'une caserne ! +[COASTG] +Garde-côte -[C0TGSUB] -touche R3 +[DINGHY] +Dinghy -[C0VESTR] -joystick analogique gauche ou touches directionnelles gauche et droite +[HERMES] +Hermes -[C1VESTR] -joystick analogique gauche +[SABRE] +Sabre -[C2VESTR] -joystick analogique gauche ou touches directionnelles gauche et droite +[SABRETU] +Sabre Turbo -[C3VESTR] -joystick analogique gauche +[WALTON] +Walton -[C2VEHB] -~T~ +[REGINA] +Regina -[C3VEHB] -touche L1 +[COMET] +Comet -[C0VEHN] -touche L3 +[DELUXO] +Deluxo -[C0VELL] -touche L2 +[BURRITO] +Burrito -[C1VELL] -touche L2 +[SPAND] +Spandex Express -[C2VELL] -touche L2 +[MARQUIS] +Marquis -[C3VELL] -touche L2 +[BAGGAGE] +Bagagiste -[C0VELR] -touche R2 +[KAUFMAN] +Taxi Kaufman -[C1VELR] -touche R2 +[COASTMA] +Garde-côte Maverick -[C2VELR] -touche R2 +[MAVERIC] +Maverick -[C3VELR] -touche R2 +[RANCHER] +Rancher -[C0VELB] -touche L2 + touche R2 +[FBIRANC] +FBI Rancher -[C1VELB] -touche L2 + touche R2 +[VIRGO] +Virgo -[C2VELB] -touche L2 + touche R2 +[GREENWO] +Greenwood -[C3VELB] -touche L2 + touche R2 +[HOTRING] +Hotring Racer -[C0VECRS] -touche L1 - -[C1VECRS] -touche SELECT - -[C0VEWEI] -joystick analogique gauche vers le haut et vers le bas ou touches directionnelles haut et bas - -[C1VEWEI] -joystick analogique gauche vers le haut et vers le bas - -[C2VEWEI] -joystick analogique gauche vers le haut et vers le bas ou touches directionnelles haut et bas - -[C3VEWEI] -joystick analogique gauche vers le haut et vers le bas - -[C0PDCWE] -touche L2 et touche R2 - -[C1PDCWE] -touche L2 et touche R2 - -[C0PUCF] -touche L1 - -[C1PUCF] -touche L1 - -[C2PUCF] -~T~ - -[C3PUCF] -~O~ - -[C0PDLT] -touche R1 - -[C1PDLT] -touche R1 - -[C2PDLT] -touche R1 - -[C3PDLT] -touche L1 - -[C0PDCTL] -touche L2 et touche R2 - -[C1PDCTL] -touche L2 et touche R2 - -[C2PDCTL] -touche L2 et touche R2 - -[C3PDCTL] -touche L2 et touche R2 - -[C0CVEIW] -touche SELECT - -[C1CVEIW] -touches directionnelles haut et bas - -[C2CVEIW] -touche SELECT - -[C3CVEIW] -touche SELECT - -[C0PDBAK] -touche R3 - -[C1PDBAK] -touche R3 - -[C2PDBAK] -touche R3 - -[C3PDBAK] -touche R3 - -[C0PDLO1] -touche L - -[C1PDLO1] -touche L - -[C2PDLO1] -touche L - -[C3PDLO1] -touche L - -[C0PDLO2] -pad analogique - -[C2PDLO2] -pad analogique - -[C0ANS] -touche L1 - -[C1ANS] -touche L1 - -[C2ANS] -touche L1 - -[C3ANS] -touche L1 - -[WEATHE2] -METEO NORMALE - -[GA_4] -~w~Chaque bombe pour voiture coûte 500$ pièce. - -[GA_5] -~w~Ta caisse est déjà équipée d'une bombe. - -[GA_6] -~w~Gare-toi, amorce la bombe avec~h~ ~k~ ~PED_FIREWEAPON~ ~w~et TIRE-TOI ! - -[GA_7] -~w~Amorce la bombe avec ~h~ ~k~ ~PED_FIREWEAPON~~w~. Elle explosera quand le moteur démarrera. - -[GA_8] -~w~Utilise le détonateur pour activer la bombe. - -[GA_9] -T'as récupéré ~1~ des 10 caisses spéciales. - -[GA_10] -Bien joué. Voilà tes ~1~$. - -[GA_11] -On a déjà une caisse comme ça. Ca nous sert à rien. - -[GA_12] -Bombe amorcée - -[GA_13] -Une livraison de pro ! Termine la liste et t'auras un bonus. - -[GA_14] -Toutes les caisses ! BIEN JOUE ! Voilà pour toi. - -[GA_15] -~w~J'espère que t'aimes la nouvelle couleur. - -[GA_17] -~w~Nouveau moteur et nouvelle couleur ! - -[GA_19] -Ce modèle ne nous intéresse pas. - -[GA_20] -On en a déjà trop des comme ça. Désolé, mais j'prends pas. - -[GA_22] -~w~Tu peux pas mettre de bombe sur une moto. - -[GA_23] -~w~Voiture piégée. Pièce et main-d'oeuvre : 500$ - -[GA_24] -~w~Voiture piégée. Offerte par la maison, pour cette fois ! - -[CR_1] -~w~La grue peut pas soulever ce véhicule. - -[PU_MONY] -~w~T'as pas assez de cash. - -[PAUSED] -PAUSE - -[FEB_STA] -Stats - -[FEB_MAP] -Carte - -[FEB_BRI] -Briefings - -[FEB_CON] -Commandes - -[FEB_AUD] -Sons - -[FEB_DIS] -Affichage - -[FEB_LAN] -Langue - -[FEP_STA] -STATS - -[FEP_MAP] -CARTE - -[FEP_BRI] -BRIEFINGS - -[FEP_CON] -COMMANDES - -[FEP_AUD] -SONS - -[FEP_DIS] -AFFICHAGE - -[FEP_LAN] -LANGUE : - -[FEF_ST1] -C'est qui le méchant ? - -[FEF_ST2] -Quantité de dégâts provoqués - -[FEF_BR1] -T'as perdu le fil ? - -[FEF_CO1] -Tu perds le contrôle ? - -[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 le jeu ! - -[FEF_LA1] -Qu'est-ce que tu racontes ? - -[FEF_LA2] -Choisis la langue d'affichage. - -[FEM_ON] -AVEC - -[FEM_OFF] -SANS - -[FEM_YES] -Oui - -[FEM_NO] -Non - -[FEI_SEL] -Sélectionner - -[FEI_TAR] -Cible avec/sans - -[FEI_BAC] -Retour - -[FEI_RES] -Reprendre - -[FEI_NAV] -Naviguer - -[FEI_BTX] -/ - -[FEI_BTT] -" - -[FEI_STA] -touche START (mise en marche) - -[FEI_BTD] -pad analogique - -[FEI_BTU] -;= - -[FEI_R1B] -touche L / touche R - -[FEI_SCR] -Parcourir - -[FEI_ZOO] -Zoom - -[FEH_STA] -STATS - -[FEH_CON] -COMMANDES - -[FEH_AUD] -SONS - -[FEH_LAN] -LANGUE - -[FEH_SGA] -NOUVELLE PARTIE - -[FET_SG] -SAUVEGARDER - -[FEH_BRI] -BRIEFING - -[FEH_DIS] -AFFICHAGE - -[FEH_MAP] -CARTE - -[FEM_OK] -OK - -[FEC_CRO] -S'accroupir - -[FE_MLG] -LEGENDE CARTE - -[MAP_LEG] -LEGENDE : - -[LG_01] -Position du joueur - -[LG_13] -Ammu-Nation - -[LG_16] -Planque - -[LG_22] -Pay 'n' Spray - -[LG_23] -M. Benz - -[LG_25] -Téléphone - -[LG_26] -Station de radio Wildstyle - -[LG_27] -Station de radio Flash FM - -[LG_28] -Station de radio KChat - -[LG_29] -Station de radio Fever 105 - -[LG_30] -Station de radio VROck - -[LG_32] -Station de radio Espantoso - -[LG_33] -Station de radio Emotion 98.3 - -[LG_34] -Station de radio Wave 103 - -[LG_35] -Destination - -[LG_37] -Club de striptease - -[LG_38] -8-Ball - -[LG_39] -Confessionnal - -[LG_40] -Ma Cipriani - -[LG_41] -Donald Love - -[LG_42] -J.D. O'Toole - -[LG_43] -Salvatore Leone - -[LG_44] -Maria - -[LG_45] -McAffrey - -[LG_46] -Toshiko Kasen - -[LG_47] -Vincenzo Cilli - -[LG_48] -Atelier - -[LG_49] -Magasin de fringues - -[LG_50] -Phil Cassidy - -[LG_51] -Menace - -[LG_52] -Ami - -[LG_53] -A récupérer - -[LG_54] -Cible du joueur - -[FEO_CON] -Config. commandes - -[FEO_AUD] -Config. sons - -[FEO_DIS] -Config. affichage - -[FEO_LAN] -Config. langue - -[FEO_PLA] -Config. joueur - -[FEB_PMB] -Briefings mission préc. : - -[FEC_NA] -ND - -[FEC_CWL] -Parcourir armes gauche - -[FEC_CWR] -Parcourir armes droite - -[FEC_CW] -Parcourir armes - -[FEC_CT] -Parcourir cibles - -[FEC_TAR] -Viser - -[FEC_MOV] -Se déplacer - -[FEC_CAM] -Modes caméra - -[FEC_PAU] -Pause - -[FEC_ENV] -Monter dans véhicule - -[FEC_JUM] -Sauter - -[FEC_ATT] -Attaquer/Tirer - -[FEC_RUN] -Courir - -[FEC_FPC] -Regarder - -[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 véhicule - -[FEC_RSC] -Stations de radio - -[FEC_BRA] -Frein/marche arrière - -[FEC_HAB] -Frein à main - -[FEC_CAW] -Arme voiture - -[FEC_ACC] -Accélérateur - -[FEC_SMT] -Mission spéciale - -[FEC_CCF] -CONFIGURATION : - -[FEC_CF1] -CONFIG. 1 - -[FEC_CF2] -CONFIG. 2 - -[FEC_CF3] -CONFIG. 3 - -[FEC_CF4] -CONFIG. 4 - -[FEC_CDP] -TYPE : - -[FEC_ONF] -A PIED - -[FEC_INC] -EN VOITURE - -[FEC_VIB] -VIBRATION : - -[FEC_ILU] -INVERSER VUE : - -[FEC_SWP] -DEPLACEMENTS DU JOUEUR : - -[FEC_AS] -pad analogique - -[FEC_DP] -touches directionnelles - -[FEA_SFX] -EFFETS SONORES : - -[FEA_OUT] -Sortie audio : - -[FEA_ST] -Stéréo - -[FEA_MNO] -Mono - -[FEA_CTD] -Attention ! Cette fonction requiert un matériel compatible DTS. Continuer ? - -[FEA_DTS] -DTS - -[FEA_RSS] -STATION DE RADIO : - -[FEA_NON] -RADIO ETEINTE - -[FED_BRI] -LUMINOSITE : - -[FED_RDR] -MODE RADAR : - -[FED_HUD] -MODE ATH : - -[FED_RDM] -CARTE & SPOTS - -[FED_RDB] -SPOTS UNIQ. - -[FEL_ENG] -ANGLAIS - -[FEL_FRE] -FRANCAIS - -[FEL_GER] -ALLEMAND - -[FEL_ITA] -ITALIEN - -[FEL_SPA] -ESPAGNOL - -[FEM_MCM] -Menu carte mémoire - -[FEM_RMC] -Détecter carte mémoire dans la fente pour MEMORY CARD N°1 - -[FEM_TFM] -Tester formatage carte mémoire dans la fente pour MEMORY CARD N°1 - -[FEM_TUM] -Tester déformatage carte mémoire dans la fente pour MEMORY CARD N°1 - -[FEM_CRD] -Créer dossier racine - -[FEM_CLI] -Créer et charger icones - -[FEM_FFF] -Remplir premier fichier - -[FEM_SOG] -Sauvegarder le jeu uniquement - -[FEM_CES] -Vérifier chaque sauvegarde 0kB4 - -[FEM_STG] -Sauvegarder la partie - -[FEM_STS] -Sauvegarder la partie sous le nom GTA3 - -[FEM_CPD] -Créer dossier protégé contre les copies - -[FEM_MC2] -Menu carte mémoire 2 - -[FEM_TS] -Tester sauvegarde : - -[FEM_TL] -Tester chargement : - -[FEM_TD] -Tester effacement : - -[FEM_SL0] -Emplacement 0 - -[FEM_SL1] -Sauvegarde 1 absente - -[FEM_SL2] -Sauvegarde 2 absente - -[FEM_SL3] -Sauvegarde 3 absente - -[FEM_SL4] -Sauvegarde 4 absente - -[FEM_SL5] -Sauvegarde 5 absente - -[FEM_SL6] -Sauvegarde 6 absente - -[FEM_SL7] -Sauvegarde 7 absente - -[FES_LOA] -CHARGER PARTIE - -[ST_TIME] -Temps de jeu actuel - -[ST_OVTI] -Temps de jeu total - -[NUMSHV] -Nombre de sauvegardes - -[PL_STAT] -Stats joueur - -[PE_WAST] -Personnes éliminées par toi - -[PE_WSOT] -Personnes éliminées par d'autres - -[CAR_EXP] -Caisses explosées - -[BOA_EXP] -Bateaux explosés - -[TM_BUST] -Arrestations - -[M_WASTE] -Civils éliminés - -[F_WASTE] -Civiles éliminées - -[PIG_WST] -Flics éliminés - -[GNG_WST] -Gangsters éliminés - -[MED_WST] -Ambulanciers éliminés - -[FIRE_WS] -Pompiers éliminés - -[DED_CRI] -Criminels éliminés - -[DED_DED] -SDF éliminés - -[DED_HOK] -Putes éliminées - -[HEL_DST] -Hélicos détruits - -[PER_COM] -Pourcentage accompli - -[KGS_EXP] -Explosifs utilisés (kg) - -[ACCURA] -Précision - -[CAR_CRU] -Caisses broyées - -[HED_EX] -Têtes explosées - -[ST_HEAD] -Tirs en pleine tête - -[BUL_FIR] -Balles tirées - -[BUL_HIT] -Tirs réussis - -[SPRAYIN] -Véhicules repeints - -[TM_DED] -Visites à l'hosto - -[ST_GANG] -Gang le moins apprécié - -[ST_GNG1] -Leone - -[ST_GNG2] -Triades - -[ST_GNG3] -Diablos - -[ST_GNG4] -Yakuzas - -[ST_GNG5] -Yardies - -[ST_GNG6] -Colombiens - -[ST_GNG7] -Hoods - -[ST_GNG8] -Forelli - -[ST_GNG9] -Sindacco - -[DAYSPS] -Jours passés dans le jeu - -[MMRAIN] -Pluie tombée (mm) - -[ST_STAR] -Etoiles de recherche obtenues - -[ST_STGN] -Etoiles de recherche évitées - -[TOT_DIS] -Total distance parcourue (miles) - -[TOTDISM] -Total distance parcourue (m) - -[DISTBIK] -Dist. parcourue en moto (miles) - -[DISTBIM] -Distance parcourue en moto (m) - -[DISTHEL] -Dist. parcourue en hélico (miles) - -[DISTHEM] -Dist. parcourue en hélico (m) - -[DISTBOA] -Dist. parcourue en bateau (miles) - -[DISTBOM] -Distance parcourue en bateau (m) - -[ST_WHEE] -Tps max. sur roue arrière (s) - -[ST_STOP] -Tps max. sur roue avant (s) - -[ST_2WHE] -Tps max. sur 2 roues (s) - -[ST_WHED] -Dist. max. sur roue arrière (m) - -[ST_STOD] -Dist. max. sur roue avant (m) - -[ST_2WHD] -Dist. max. sur 2 roues (m) - -[ST_FAPD] -Dist. max. vol plané (m) - -[FEST_HV] -Mission Autodéfense (niveau max.) - -[FIRELVL] -Mission Pompiers (niveau max.) - -[ST_ASSI] -Contrats assassinat remplis - -[ST_FTIM] -Heures de vol - -[ST_WEAP] -Budget armement - -[ST_PROP] -Budget immobilier - -[ST_DAMA] -Propriétés détruites - -[ST_AUTO] -Budget réparation et peinture véhicules - -[MXCARD] -Distance max. de saut de taré (pd) - -[MXCARJ] -Hauteur max. de saut de taré (pd) - -[MXCARDM] -Distance max. de saut de taré (m) - -[MXCARJM] -Hauteur max. de saut de taré (m) - -[MXFLIP] -Saltos max. en saut de taré - -[MXJUMP] -Rotations max. en saut de taré - -[FST_MFR] -Station de radio préférée - -[FST_LFR] -Station de radio la moins écoutée - -[BSTSTU] -Meilleure cascade de taré jusqu'ici : - -[INSTUN] -Cascade de taré - -[PRINST] -Cascade de taré parfaite - -[DBINST] -Double cascade de taré - -[DBPINS] -Double cascade de taré parfaite - -[TRINST] -Triple cascade de taré - -[PRTRST] -Triple cascade de taré parfaite - -[QUINST] -Quadruple cascade de taré - -[PQUINS] -Quadruple cascade de taré parfaite - -[NOSTUC] -Aucune cascade de taré réalisée - -[NOUNIF] -Sauts uniques effectués - -[NOUNGM] -Total sauts uniques - -[NMISON] -Missions tentées - -[NMMISP] -Missions réussies - -[PASDRO] -Passagers déposés - -[MONTAX] -Cash gagné en taxi - -[CARSLD] -Voitures vendues - -[MONCAR] -Cash gagné en vendant des voitures - -[BIKESLD] -Motos vendues - -[MONBIKE] -Cash gagné en vendant des motos - -[CARSEXP] -Caisses trouvées pour Love Media - -[SLTVLVL] -Mission Slash TV (niveau max.) - -[SLTVKIL] -Adversaires tués (Slash TV) - -[MONTRS] -Cash gagné en ramassant les ordures - -[HTMKLD] -Assassins tués - -[GDAMSP] -Missions Avenging Angel réussies - -[HGAJD] -Total justice rendue (Avenging Angel) - -[BNDRACE] -Courses RC - -[FSTTRT] -Tps restant max. sur Wong Side of the Tracks - -[HGHTRC] -Cash max. sur Wong Side of the Tracks - -[FSTHRT] -Meilleur tps course hélico - -[BHLPOS] -Meilleure position course hélico - -[TMSOUT] -Changements de fringues - -[BSRPS0] -Low Rider Rumble - -[BSRPS1] -Deimos Dash - -[BSRPS2] -Wi-Cheetah Run - -[BSRPS3] -Red Light Racing - -[BSRPS4] -Torrington TT - -[BSRPS5] -Gangsta GP - -[DBIKE0] -Course 1 - -[DBIKE1] -Course 2 - -[DBIKE2] -Course 3 - -[DBIKE3] -Course 4 - -[DBIKE4] -Course 5 - -[DBIKE5] -Course 6 - -[DBIKE6] -Course 7 - -[DBIKE7] -Course 8 - -[DBIKE8] -Course 9 - -[DBIKE9] -Course 10 - -[DBIKEHE] -Bumps & Grinds - -[DBIKEBP] -Meilleure position - -[DBIKEFL] -Meil. tps au tour - -[DBIKEFT] -Meilleur temps - -[ST_PHOT] -Photos prises - -[ST_PIZZ] -Pizzas livrées - -[ST_NOOD] -Nouilles livrées - -[MO_TOUR] -Cash gagné avec les touristes - -[TA_TOUR] -Touristes emmenés sur lieux touristiques - -[SC_SCRA] -Meill. score Scrapyard Challenge - -[SC_9MM] -Meill. score 9mm Mayhem - -[SC_SCOO] -Meill. score Scooter Shooter - -[DAYPLC] -Dépenses quotidiennes police - -[SEAGULL] -Mouettes abattues - -[CRIMRA] -TAUX DE CRIMINALITE - -[CHASE] -Attention média max. - -[CHASE1] -Ignoré - -[CHASE2] -Ennuyeux - -[CHASE3] -Vague intérêt - -[CHASE4] -Journal local Page 7 - -[CHASE5] -Une du journal local - -[CHASE8] -Chaîne locale 3h - -[CHASE9] -Infos chaîne locale - -[CHASE10] -Direct sur chaîne locale - -[CHASE11] -UFA Today Page 12 - -[CHASE12] -UFA Today Page 4 - -[CHASE13] -Photo dans UFA Today - -[CHASE14] -Chaîne nationale 4h - -[CHASE15] -Infos chaîne nationale - -[CHASE16] -Direct sur chaîne nationale - -[CHASE17] -Infos internationales - -[CHASE18] -Crise nationale - -[CHASE19] -Crise internationale - -[CHASE20] -Evénement mondial - -[CHASE21] -Légende vivante - -[WHEEL01] -~w~BONUS 2 ROUES : ~1~$ Distance : ~1~,~1~m Temps : ~1~ secondes - -[WHEEL02] -~w~BONUS 2 ROUES : ~1~$ Distance : ~1~ pieds Temps : ~1~ secondes - -[WHEEL06] -~w~BONUS ROUE ARRIERE : ~1~$ Distance : ~1~,~1~m Temps : ~1~ secondes - -[WHEEL07] -~w~BONUS ROUE ARRIERE : ~1~$ Distance : ~1~ pieds Temps : ~1~ secondes - -[WHEEL11] -~w~BONUS ROUE AVANT : ~1~$ Distance : ~1~,~1~m Temps : ~1~ secondes - -[WHEEL12] -~w~BONUS ROUE AVANT : ~1~$ Distance : ~1~ pieds Temps : ~1~ secondes - -[PREBRF] -Briefings préc. - -[CNTLS] -Commandes - -[MUSMEN] -Musique/Effets - -[GAMSET] -Paramètres - -[LANGUA] -Langue - -[DSPLAY] -Affichage - -[DEBUGM] -Menu Debug - -[QUITOP] -Quitter options - -[CONTRL] -Configuration commandes - -[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] -SONS - -[MUSVOL] -Musique - -[SFXVOL] -Effets sonores - -[SCROPT] -ECRAN - -[CTRSCR] -Centrer écran - -[SCRFOR] -Format écran - -[GMSVLQ] -SAUVEGARDER-CHARGER-QUITTER - -[GMREST] -Recommencer - -[GMLOAD] -Charger - -[GMSAVE] -Sauvegarder - -[NOGMSV] -Sauvegarde depuis ta planque uniq. - -[DLFILE] -Supprimer fichiers Grand Theft Auto - -[CHFILE] -CHOISIR FICHIER A CHARGER - -[CHFIDL] -CHOISIR FICHIER A SUPPRIMER - -[SVCONF] -CONFIR. SAUVEGARDE - -[SVFNAM] -Ton fichier sauvegardé s'appelle - -[LANGSL] -CHOIX DE LA LANGUE - -[ENGLIS] -Anglais - -[GERMAN] -Allemand - -[ITALIA] -Italien - -[FRENCH] -Français - -[SPAIN] -Espagnol - -[GORLEV] -Niveau gore - -[PRVMEN] -Briefings précédents - -[PUSAVE] -Sauvegarder la partie uniq. - -[CNTSAV] -Sauvegarde impossible. Mission en cours. - -[CNCSAV] -Sauvegarde impossible. T'es en caisse. - -[CRMGSV] -Créer répertoire protégé contre la copie - -[MGSVCN] -Répertoire créé - -[MGSVNC] -Répertoire non créé - -[YES] -Oui - -[NO] -Non - -[X] -x - -[LAST] -Dernier message. STAUNTON COURSE 2 - -[GS_STYL] -STYLE DE JEU : - -[GS_FFAL] -CHACUN POUR SOI - -[GS_LOC] -ZONE DE JEU : - -[GS_SLMT] -LIMITE SCORE : - -[GS_KLMT] -LIMITE VICTIMES : - -[GS_TLMT] -LIMITE TEMPS : - -[GS_ULMT] -SANS LIMITE - -[GS_PRUP] -BONUS : - -[GS_RACE] -COURSE : - -[GS_LAPS] -TOURS : - -[GS_OK] -OK - -[FEH_MP] -MULTIJOUEUR - -[FEMP_J] -Rejoindre - -[FEMP_CS] -PERSO : - -[FEMP_PS] -PARAMETRES JOUEUR - -[FEMP_GS] -CHOIX PARTIE - -[FEMP_NG] -NOUVELLE PARTIE - -[SVRLIST] -LISTE HOTES - -[SVRINFO] -INFOS HOTE - -[SVRNAME] -NOM : - -[NO_SVRS] -RECHERCHE D'HOTES - -[NO_PLRS] -RECHERCHE DE JOUEURS - -[NO_NAME] -PAS DE NOM - -[NO_WIFI] -Pour jouer en multijoueur, il faut activer l'interrupteur WLAN. - -[FEMP_SG] -LANCER - -[FEMP_S] -Commencer - -[FEMP_WS] -En attente du feu vert de l'hôte... - -[SVRLOST] -La communication avec l'hôte a été perdue. - -[NOSVRS] -Hôte introuvable. - -[MP_WARN] -Commencer une partie multijoueur annulera tous progrès depuis la dernière sauvegarde. - -[FEDS_XB] -Sélectionner - -[FEDS_TB] -Retour - -[FEDS_ST] -touche START (mise en marche) : REPRENDRE - -[FEST_OO] -sur - -[FED_SUB] -SOUS-TITRES : - -[FEC_TUC] -Contrôle tourelle - -[FEC_SM3] -Mission spéciale (touche R3) - -[FEC_RS3] -Stations de radio (touche L3) - -[FEC_HO3] -Klaxon (touche L3) - -[FIRST] -~g~1er - -[SECOND] -~g~2e - -[THIRD] -~g~3e - -[FOURTH] -~g~4e - -[NOCONTE] -Veuillez connecter une manette analogique (DUALSHOCK®) ou une manette analogique (DUALSHOCK®2) dans le port de manette N°1 pour continuer. - -[WRCONT] -La manette connectée au port de manette N°1 n'est pas compatible. GTA: Liberty City Stories nécessite une manette analogique (DUALSHOCK®) ou une manette analogique (DUALSHOCK®2). - -[WRCONTE] -La manette connectée au port de manette N°1 n'est pas compatible. GTA: Liberty City Stories nécessite une manette analogique (DUALSHOCK®) ou une manette analogique (DUALSHOCK®2). - -[WRONGCD] -Disque incorrect. Insérer le disque de GTA:Liberty City Stories. - -[NOCD] -Le compartiment à disque est vide. Insérer le disque de GTA:Liberty City Stories. - -[OPENCD] -Le compartiment à disque est ouvert. Fermer le compartiment à disque. - -[RESTART] -Lancement d'une nouvelle partie. - -[GA_3] -~w~100$ la nouvelle peinture ! - -[GA_1A] -~w~Reviens quand tu seras moins occupé... - -[AWAY] -~r~Il s'est tiré ! - -[GA_6B] -~w~Gare-toi, amorce la bombe avec~h~ ~k~ ~PDFW~ ~w~et TIRE-TOI ! - -[GA_7B] -~w~Appuie sur~h~ ~k~ ~PDFW~~w~ pour amorcer la bombe. Elle explosera quand le moteur démarrera. - -[FESZ_CA] -Annuler - -[FESZ_QU] -Quitter - -[FESZ_L1] -Sauvegarde réussie. - -[FESZ_L2] -Nom de ta sauvegarde : - -[FESZ_OK] -OK - -[FES_LGA] -CHARGER PARTIE - -[FES_DGA] -SUPPRIMER SAUVEGARDE - -[FES_NGA] -NOUVELLE PARTIE - -[FES_CAN] -Annuler - -[FESZ_QL] -Toute progression non sauvegardée pour la partie en cours sera perdue. Charger ? - -[FESZ_QD] -Supprimer cette sauvegarde ? - -[FESZ_QO] -Ecraser cette sauvegarde ? - -[FESZ_QR] -Lancer une nouvelle partie ? Toute progression depuis la dernière sauvegarde sera perdue. Continuer ? - -[FESZ_QS] -SAUVEGARDER ? - -[T4X4_2A] -~g~T'as ~y~2 minutes~g~ pour franchir ~y~12~g~ points de passage !~n~ ~g~Tu peux les franchir dans ~y~N'IMPORTE QUEL ORDRE. - -[T4X4_2B] -~1~ sur 12 ! - -[T4X4_2C] -~y~FRANCHIS~g~ le premier point de passage pour enclencher le chrono. ~g~Chaque point de passage te donne ~y~10 SECONDES~g~. - -[T4X4_F] -~r~Tu t'es planté ! Pauvre naze ! - -[UPSIDE] -~r~T'as bousillé ta caisse ! +[BLISTAC] +Blista Compact [FEST_DF] Dist. parcourue à pied (miles) [FEST_DC] -Dist. parcourue en caisse (miles) +Dist. parcourue en voiture (miles) [FESTDFM] Distance parcourue à pied (m) [FESTDCM] -Distance parcourue en caisse (m) +Distance parcourue en voiture (m) + +[TOT_DIS] +Distance totale parcourue (miles) + +[TOTDISM] +Distance totale parcourue (m) + +[DISTHEL] +Dist. parcourue en hélicoptère (miles) + +[DISTHEM] +Dist. parcourue en hélicoptère (m) + +[DISTBOA] +Dist. parcourue en bateau (miles) + +[DISTBOM] +Dist. parcourue en bateau (m) [FEST_LS] -Personnes sauvées (Ambulance) +Personnes secourues en ambulance [FEST_CC] -Criminels tués (Autodéfense) +Criminels tués lors de la mission d'autodéfense [FEST_FE] -Incendies éteints - -[FEST_LF] -Plus long vol en Dodo - -[FEST_BD] -Meil. tps désamorçage +Nombre total de feux éteints [FEST_RP] Rodéos réussis -[FEST_CN] -Tps max. restant "Karmageddon" - -[FEST_TR] -Victimes max. "RC Triad Take-Down" - [FEST_MP] Missions réussies +[FEST_BB] +Les fous du volant : + [FEST_H0] -Points de passage max. +Nombre maximum de points de passage [FEST_GC] -Caisses de gang bousillées : +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 [USJ] -~w~BONUS POUR CASCADE UNIQUE ! - -[USJ_FAL] -~w~CASCADE UNIQUE RATEE ! - -[HM1_1] -~g~Bute 20 Purple Nines en 2 minutes 30 secondes. - -[KM1_8A] -Appuie sur~h~ ~k~ ~PDFW~ ~w~pour ~h~amorcer la bombe~w~ et tire-toi ! - -[KM1_8D] -Appuie sur~h~ ~k~ ~PDFW~ ~w~pour ~h~amorcer la bombe~w~ et tire-toi ! +BONUS POUR CASCADE UNIQUE! [RATNG1] -CITOYEN HONNETE +Citoyen honnête [RATNG2] -QUIDAM +Quidam [RATNG3] -EBOUEUR +Eboueur [RATNG4] -VOLEUR A L'ETALAGE +Voleur à l'étalage [RATNG5] -VANDALE +Vandale [RATNG6] -ESCROC +Escroc [RATNG7] -PICKPOCKET +Pickpocket [RATNG8] -CLEPTO +Cleptomane [RATNG9] -MOUCHARD +Mouchard [RATNG10] -RAT +Rat + +[RATNG11] +Sangsue [RATNG12] -ROI DE L'ARNAQUE +Le roi de l'arnaque [RATNG13] -AIGREFIN +Aigrefin [RATNG14] -GRIPPE-SOU +Grippe-sou [RATNG15] -CRAPULE +Crapule [RATNG16] -RASCAL +Rascal [RATNG17] -RACAILLE +Racaille [RATNG18] -GARNEMENT +Garnement [RATNG19] -VAURIEN +Vaurien [RATNG20] -HORS-LA-LOI +Hors-la-loi [RATNG21] -VOYOU +Voyou [RATNG22] -LACHE +Lâche [RATNG23] -GORILLE SA +Idiot SA [RATNG24] -GORILLE +Idiot [RATNG25] -RECIDIVISTE +Récidiviste [RATNG26] -EX-TAULARD +Ancien taulard [RATNG27] -CRIMINEL +Criminel [RATNG28] -CONVOYEUR +Clochard [RATNG29] -CERVEAU +Sage [RATNG30] -CHAUFFEUR +Pilote [RATNG31] -GROS BRAS +Gros bras [RATNG32] -TUEUR A GAGES +Tueur à gages [RATNG33] -CHASSEUR DE TETE +Chasseur de tête [RATNG34] -FORCE DE L'ORDRE +Force de l'ordre [RATNG35] -RONIN +Ronin [RATNG36] -MAGOUILLEUR +Magouilleur [RATNG37] -TUEUR +Tueur [RATNG38] -ASSOCIE +Associé [RATNG39] -BOUCHER +Boucher [RATNG40] -NETTOYEUR +Nettoyeur [RATNG41] -ASSASSIN +Assassin [RATNG42] -CONSEILLER +Conseiller [RATNG43] -AUTODIDACTE +Autodidacte [RATNG44] -BRAS DROIT +Bras droit [RATNG45] -BOURREAU +Exécutant [RATNG46] -LIEUTENANT +Lieutenant [RATNG47] -SOUS-CHEF +Sous-chef [RATNG48] -CAPO +Capo [RATNG49] -PATRON +Patron [RATNG50] -CAID +Noops [RATNG51] -DON +Don [RATNG52] -PARRAIN - -[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 - -[DETON] -EXPLOSION - -[RCBOMB1] -RC Triad Take-Down - -[RECORD] -~w~Nouveau record : ~1~ victimes ! - -[NRECORD] -~r~T'as pas battu l'ancien record de ~1~ victimes ! - -[RCBOMBF] -~r~T'es descendu de la camionnette ! - -[RC_2] -T'as 2 minutes pour faire exploser autant de caisses de la Mafia que possible. - -[RC_3] -T'as 2 minutes pour faire exploser autant de caisses des Yakuzas que possible. - -[RC_4] -T'as 2 minutes pour faire exploser autant de caisses des Yardies que possible. - -[RC_5] -T'as 2 minutes pour faire exploser autant de caisses des Hoods que possible. - -[RC_6] -T'as 2 minutes pour faire exploser autant de caisses du Cartel que possible. - -[RAMPKA] -~w~T'as besoin d'un véhicule pour ce rodéo. +Roi de la putain de ville [PAGE_00] . -[TURTXT] -Massacre mobile ! - -[TURPASS] -~w~Massacre réussi ! - -[TUR3D] -~w~Etat caisse - [WELCOME] -BIENVENUE +BIENVENUE A [TSCORE] -~w~TOTAL DES GAINS : ~1~$ +REVENUS : ~1~$ -[PBOAT_1] -Appuie sur~h~ ~k~ ~VEWEP~ ~w~pour tirer avec les canons du bateau. +[PBOAT_2] { reVC update } +Appuie sur la ~h~~k~~VEHICLE_FIREWEAPON~~w~ pour tirer avec les canons du bateau. -[HM2_1] -Utilise les RC buggies pour pulvériser les voitures blindées. Appuie sur~h~ ~k~ ~VEWEP~ ~w~pour les faire exploser. +[HJSTAT] +Distance : ~1~.~1~ m Hauteur : ~1~.~1~ m Saltos : ~1~ Rotation : ~1~_ -[HM2_1A] -Utilise les RC buggies pour pulvériser les voitures blindées. Appuie sur~h~ ~k~ ~VEWEP~ ~w~pour les faire exploser. +[HJSTATW] +Distance : ~1~.~1~ m Hauteur : ~1~.~1~ m Saltos : ~1~ Rotation : ~1~_ Et quelle belle réception! -[HM2_2] -~r~T'as pas pulvérisé toutes les voitures blindées. - -[HM2_6] -~g~Voiture blindée pulvérisée. - -[FESZ_UC] -ANNULER - -[FEDS_SM] -Touche L, Touche R-CHANGER MENU - -[FEDS_AS] -;=-CHANGER SELECTION - -[FEDSAS2] -<>-CHANGER SELECTION - -[FEDS_SS] -Touche L, Touche R-CHANGER SELECTION - -[FEDSSC1] -;-DEFILEMENT + RAPIDE - -[FEDSSC2] -=-ARRET DEFILEMENT - -[FES_LOF] -Echec du chargement. - -[FES_SLO] -SAUVEGARDE - -[FES_ISC] -CORROMPUE - -[FESZ_TI] -SAUV. Z1 - -[FESZ_SA] -Sauvegarder - -[MC_LDFL] -Echec du chargement ! - -[MC_NWRE] -La partie se relance... - -[BIFP_1] -~w~Aïe ! Distance vol plané : ~1~,~1~m - -[BIFP_1F] -~w~Aïe ! Distance vol plané : ~1~pieds - -[DIAB1_5] -TPS COURSE : - -[F_FAIL1] -~r~Fin de la mission Pompiers. - -[F_CANC] -~r~Mission Pompiers annulée ! - -[F_FAIL3] -~r~T'es à la bourre ! - -[F_FAIL4] -~r~Un des passagers est mort ! - -[F_FAIL5] -~r~Une des caisses est détruite ! - -[F_FAIL6] -~r~La caisse est bousillée ! - -[F_EXTIN] -Feux - -[A_CANC] -~r~Mission Ambulance annulée ! - -[ALEVEL] -~w~Mission Ambulance (niveau ~1~) - -[A_FAIL1] -~r~Fin de la mission Ambulance. +[ATUTOR] +Appuie sur la ~h~~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions ambulance. [FEST_HA] -Mission Ambulance (niveau max.) - -[A_SAVES] -~w~PERSONNES SAUVEES : ~1~ +Mission ambulance, niveau maximum [C_KILLS] -~w~CRIMINELS BUTES : ~1~ +CRIMINELS TUES : ~1~ -[F_START] -~b~Véhicule en flammes ~w~repéré dans le secteur : ~a~. Va vite l'éteindre ! +[HJSTATF] +Distance : ~1~ ft Hauteur : ~1~ ft Saltos : ~1~ Rotation : ~1~_ -[F_STAR1] -~b~Véhicules en flammes ~w~repérés dans le secteur : ~a~. Va vite les éteindre ! +[HJSTAWF] +Distance : ~1~ ft Hauteur : ~1~ ft Saltos : ~1~ Rotation : ~1~_ Et quelle belle réception! -[F_REWAR] -~w~FEU ETEINT ! Niveau ~1~ terminé ! Récomp. : ~1~$ +[CRED001] +ROCKSTAR NORTH + +[CRD001A] +DIRECTEUR DU STUDIO + +[CRD001B] +ANDREW SEMPLE + +[CRED002] +PRODUCTEUR + +[CRD002A] +DIRECTEUR DU DEVELOPPEMENT + +[CRED003] +LESLIE BENZIES + +[CRED004] +CONCEPTEUR GRAPHIQUE + +[CRED005] +AARON GARBUT + +[CRED006] +DIRECTEURS TECHNIQUES + +[CRED007] +OBBE VERMEIJ + +[CRED008] +ADAM FOWLER + +[CRED010] +ANDREW DUTHIE + +[CRED011] +CRAIG FILSHIE + +[CRED012] +WILLIAM MILLS + +[CRED013] +CHRIS ROTHWELL + +[CRD013A] +IMRAN SARWAR + +[CRD013B] +JAMES WORRALL + +[CRD013C] +JOHN HAIME + +[CRED014] +ECRIT PAR + +[CRED015] +JAMES WORRALL + +[CRED016] +PAUL KUROWSKI + +[CRED017] +DAN HOUSER + +[CRED018] +CONCEPTEUR PRINCIPAL DES PERSONNAGES + +[CRD018A] +CONCEPTEUR DES PERSONNAGES + +[CRED019] +IAN MCQUE + +[CRD019A] +TOKS SOLARIN + +[CRD019B] +ALAN DAVIDSON + +[CRED020] +ANIMATEUR PRINCIPAL + +[CRED021] +ALEX HORTON + +[CRD022A] +ANIMATEURS + +[CRED022] +LEE MONTGOMERY + +[CRD022B] +DUNCAN SHIELDS + +[CRD022C] +GUS BRAID + +[CRED023] +CONCEPTEURS DES VEHICULES + +[CRD023A] +JOLYON ORME + +[CRD023B] +ALAN DUNCAN + +[CRD024A] +CONCEPTEUR PRINCIPAL DES VEHICULES + +[CRED024] +PAUL KUROWSKI + +[CRED025] +CONCEPTEURS DE CARTE + +[CRED026] +ADAM COCHRANE + +[CRED027] +NIK TAYLOR + +[CRED028] +GARY MCADAM + +[CRED029] +KEIRAN BAILLIE + +[CRED030] +ALISDAIR WOOD + +[CRED031] +ANDREW SOOSAY + +[CRD031A] +STEVEN MULHOLLAND + +[CRD031B] +WAYLAND STANDING + +[CRD031C] +CAMPBELL J. DICK + +[CRD031D] +CONCEPTEUR GRAPHIQUE + +[CRD031E] +STUART PETRI + +[CRED032] +PROGRAMMEUR PRINCIPAL + +[CRD032A] +PROGRAMMEURS + +[CRED033] +ALEXANDER ROGER + +[CRED034] +GRAEME WILLIAMSON + +[CRED035] +BARANE CHAN + +[CRED036] +DEREK PAYNE + +[CRED037] +GORDON YEOMAN + +[CRD037A] +ALAN CAMPBELL + +[CRD037B] +MARK HANLON + +[CRD037C] +ANDRZEJ MADAJCZYK + +[CRED038] +PRODUCTEUR MUSIQUE PRINCIPAL + +[CRED039] +CRAIG CONNER + +[CRED040] +STUART ROSS + +[CRED041] +INGENIEUR AUDIO PRINCIPAL + +[CRED042] +ALLAN WALKER + +[CRD041A] +INGENIEUR DU SON + +[CRD041B] +AUDIO + +[CRD042A] +WILL MORTON + +[CRED043] +PROGRAMMEUR AUDIO + +[CRED044] +RAYMOND USHER + +[CRED045] +RESPONSABLE DES TESTS + +[CRED046] +CRAIG ARBUTHNOTT + +[CRED047] +RESPONSABLE CQ + +[CRED048] +NEIL CORBETT + +[CRED049] +KEVIN WONG + +[CRED050] +CQ + +[CRED051] +DAVID BEDDOES + +[CRED052] +DAVID WATSON + +[CRED053] +BARRY CLARK + +[CRED054] +ROSS SPARROW + +[CRED055] +JAMES ALLAN + +[CRED056] +NEIL MEIKLE + +[CRD056A] +GEORGE WILLIAMSON + +[CRD056B] +MATT JONES + +[CRD056C] +ROB HARBOUR + +[CRD056D] +TOM WHITTAKER + +[CRED057] +ASSISTANCE TECHNIQUE PRINCIPALE + +[CRED058] +LORRAINE ROY + +[CRD057A] +ASSISTANCE TECHNIQUE + +[CRED059] +CHRISTINE CHALMERS + +[CRD060A] +SERVICES GENERAUX + +[CRD060B] +KIM GURNEY + +[CRD060C] +CASSIE OLIVER + +[CRED060] +ROCKSTAR NEW YORK + +[CRED061] +PRODUCTEUR EXECUTIF + +[CRED062] +SAM HOUSER + +[CRED063] +PRODUCTEUR + +[CRED064] +DAN HOUSER + +[CRED065] +VICE-PRESIDENT DU DEVELOPPEMENT + +[CRED066] +JAMIE KING + +[CRED067] +RESPONSABLE TECHNOLOGIE + +[CRED068] +GARY J. FOREMAN + +[CRED069] +PRODUCTEUR ASSOCIE + +[CRED070] +JEREMY POPE + +[CRD071A] +RESPONSABLE CONTROLE QUALITE + +[CRD072A] +JEFF ROSA + +[CRED071] +RESPONSABLE MUSIQUE + +[CRED072] +TERRY DONOVAN + +[CRED073] +EQUIPE DE PRODUCTION + +[CRED074] +TERRY DONOVAN + +[CRED075] +JENNIFER KOLBE + +[CRED076] +JENEFER GROSS + +[CRED077] +LAURA PATERSON + +[CRED078] +JEFF CASTANEDA + +[CRED079] +JERONIMO BARRERA + +[CRED080] +CARLY SLATER + +[CRED081] +JUNG KWAK + +[CRED082] +BRIAN WOOD + +[CRED083] +RENAUD SEBANNE + +[CRED084] +RICHARD KRUGER + +[CRD084A] +DANIEL EINZIG + +[CRD084B] +JACEN BURROWS + +[CRD084C] +LINN PR + +[CRD084D] +COUVERTURE + +[CRD084E] +STEPHEN BLISS + +[CRED085] +KENT PAUL'S 80 NOSTALGIA ZONE + +[CRED086] +ECRIT PAR DAN HOUSER + +[CRD086A] +PRODUIT PAR ADAM TEDMAN + +[CRED087] +WWW.KENTPAUL.COM ET WWW.VICECITY.COM + +[CRED088] +CREES PAR + +[CRD088A] +ADAM TEDMAN + +[CRD088B] +DAVID YU + +[CRD088C] +JERRY LUNA + +[CRD088D] +STUART PETRI + +[CRD088E] +MICHAEL CARNEVALE + +[CRD088F] +GREG LAU + +[CRD088G] +FUTABA HAYASHI + +[CRED089] +RESPONSABLE CQ + +[CRED090] +CRAIG ARBUTHNOTT + +[CRED091] +ANALYSTE PRINCIPAL + +[CRED092] +ADAM DAVIDSON + +[CRD092A] +JOE HOWELL + +[CRD092B] +MARC FERNANDEZ + +[CRED093] +ANALYSTE DE JEU + +[CRED094] +RICHARD HUIE + +[CRED095] +EQUIPE DE TEST CHEZ ROCKSTAR + +[CRED096] +LANCE WILLIAMS + +[CRED097] +JOE GREENE + +[CRED098] +BRIAN PLANER + +[CRD098A] +ELIZABETH SATTERWHITE + +[CRD098B] +JAMEEL VEGA + +[CRD098C] +MIKE HONG + +[CRED099] +LEE CUMMINGS + +[CRED100] +HISTOIRE + +[CRED101] +JAMES WORRALL + +[CRED102] +DAN HOUSER + +[CRED103] +ADAM TEDMAN + +[CRED104] +PAUL YEATES + +[CRED105] +JENEFER GROSS + +[CRED106] +LAURA PATERSON + +[CRED107] +CINEMATIQUES + +[CRED108] +ECRITES PAR DAN HOUSER ET JAMES WORRALL + +[CRED109] +DIRECTION DE L'AUDIO PAR DAN HOUSER ET NAVID KHONSARI + +[CRED110] +PRODUCTION DE JAMIE KING + +[CRD110A] +CASTING : JAMIE KING, SEAN MACALUSO + +[CRED111] +DISTRIBUTION + +[CRD111A] +PERSONNAGES SECONDAIRES + +[CRED112] +TOMMY VERCETTI : RAY LIOTTA + +[CRED113] +KEN ROSENBERG : WILLIAN FICHTNER + +[CRED114] +SONNY FORELLI : TOM SIZEMORE + +[CRED115] +STEVE SCOTT : DENNIS HOPPER + +[CRED116] +AVERY CARRINGTON : BURT REYNOLDS + +[CRED117] +RICARDO DIAZ : LUIS GUZMAN + +[CRED118] +LANCE VANCE : PHILIP MICHAEL THOMAS + +[CRED119] +COLONEL JUAN CORTEZ : ROBERT DAVI + +[CRED120] +UMBERTO ROBINA : DANNY TREJO + +[CRED121] +PHIL CASSIDY : GARY BUSEY + +[CRED122] +MITCH BAKER : LEE MAJORS + +[CRED123] +MERCEDES CORTEZ : FAIRUZA BALK + +[CRED124] +KENT PAUL : DANNY DYER + +[CRED125] +JEZZ TORRENT : KEVIN MCKIDD + +[CRED126] +REGULATRICE TAXI : DEBORAH HARRY + +[CRED127] +CANDY SUXX : JENNA JAMESON + +[CRED128] +BJ SMITH : LAWRENCE TAYLOR + +[CRED129] +TATA POULET : YOUREE CLEOMILI HARRIS + +[CRED130] +FOURNISSEUR : ARMANDO RIESCO + +[CRED131] +COUGAR : BLAYNE PERRY + +[CRED132] +HILARY : CHARLES TUCKER + +[CRED133] +ALEX SHRUB, REPRESENTANT DU CONGRES : CHRIS LUCAS + +[CRED134] +LE VIEUX KELLY : GEORGE DICENZO + +[CRD134A] +CAM JONES : GREG SIMS + +[CRD134B] +PSYCHOPATHE : HUNTER PLATIN + +[CRD134C] +MAUDE, LA VENDEUSE DE GLACES : JANE GENNARO + +[CRD134D] +JETHRO : JOHN ZURHELLEN + +[CRD134E] +GONZALES : JORGE PUPO + +[CRD134F] +DWAYNE : NAVID KHONSARI + +[CRD134G] +DICK : PETER MCKAY + +[CRD134H] +MIKE, L'ACTEUR DE PORNO : ROBERT CIHRA + +[CRD134I] +PERCY : RUSSELL FOREMAN + +[CRED135] +CAPTURE DE MOUVEMENTS + +[CRED136] +ANIME PAR + +[CRD136A] +DIRECTION TECHNIQUE PAR ALEX HORTON + +[CRED137] +DIRIGE PAR + +[CRD137A] +DIRIGE PAR NAVID KHONSARI + +[CRED138] +PRODUIT PAR + +[CRD138A] +PRODUIT PAR JAMIE KING + +[CRD138B] +RENAUD SEBBANE + +[CRED139] +ENREGISTRE AUX PERSPECTIVE STUDIOS, BROOKLYN + +[CRED140] +ACTEURS POUR LA CAPTURE DE MOUVEMENTS + +[CRD140A] +BLAYNE PERRY + +[CRD140B] +JONATHON SALE + +[CRD140C] +CHARLES TUCKER + +[CRD140D] +EDDIE MARRERO + +[CRD140E] +WILLIAM MCCALL + +[CRD140F] +JORGE PUPO + +[CRD140G] +ROBERT JACKSON + +[CRD140H] +TARA RADCLIFFE + +[CRD140I] +JENIFER GAMBETESE + +[CRD140J] +KRIS ACHEVARRIA + +[CRD140K] +ALI ORDOUBADI + +[CRD140L] +KAHLEEM POOLE + +[CRED141] +DIALOGUES DES PIETONS + +[CRD141A] +ECRIT PAR DAN HOUSER, MARC FERNANDEZ, GILLIAN TELLING ET NAVID KHONSARI + +[CRD141B] +AVEC L'AIDE DE JEREMY POPE, LANCE WILLIAMS ET JENNY JEMISON + +[CRED142] +ECRITS PAR + +[CRD142A] +DAN HOUSER ET JAMES WORRALL + +[CRED143] +DIRIGE PAR DAN HOUSER, CRAIG CONNER, MARC FERNANDEZ ET ALLAN WALKER + +[CRED144] +PRODUITS PAR RENAUD SEBANNE + +[CRED145] +PIETONS + +[CRED146] +ADAM DAVIDSON, ADAM WATKINS, ALEJANDRO K. BROWN, ALEX ANTHONY SIOUKAS, ALEX GARCIA, + +[CRED147] +ALICE SALTZMAN, ALISON CIHRA, AMY SALIMA, AMY SALZMAN, ANDREA VIDELA, ANTHONY ATTI, + +[CRED148] +ANTHONY RIVERA, BIJAN SHAMS, BLAYNE PERRY, BRETT BISOGNO, BREYE MATA, BRIAN PANEN, + +[CRED149] +BROCK VODER, CAREY BERTINI, CHARISSE LAMBERT, CHRIS DIFAT, CHRIS REISENBERGER, + +[CRED150] +CHRISTOPHER BRODAY, CHRISTOPHER CARRO, CYNTHIA GREENE, DAMARIES LOPEZ, DAN LEE, + +[CRED151] +DAN SCHNEIDER, DAN TOYAMA, DAVID DEAN CHALTFIELD, JR., DAVID HARRISON, DAVID WILEY, + +[CRED152] +DEBORAH COLLINS, DEBRANDA CHANEY-GILES, DEMETRA KOUKOULAS, DENISE ROSADO, + +[CRED153] +DEVIN BENNETT, DEVIN WINTERBOTTOM, DORIS WOO, DOUGLAS HARRISON, DUNCAN COUTTS, + +[CRED154] +DUPE AJAYI, EDWIN AVELLANEDA, ELIZABETH HOWELL, ELIZABETH SATTERWHITE, ERIC NAGLE, + +[CRED155] +ESTEBAN KARPLUS, F. FONT, FUTABA HAYASHI, GENE HILGREEN, GERALD COSGROVE, + +[CRED156] +GERARD LUNA, GILLIAN TELLING, GREGG CARLUCCI, GREGORY CLERVOIX, GREGORY SCHWEIZER, + +[CRED157] +HADLEY TOMICKI, J. ROSSETT, JAMEEL VEGA, JASON JONES, JEFF ROSA, JENNIFER JEMISON, + +[CRED158] +JEREMY TAGGERT, JESSICA RIDER, JOSEPH GREENE,JOSEPH HOWELL, KATE DUKICH, + +[CRED159] +KEL O'NEILL, KEVIN HOPKINS, LADAWN JAMES, LANCE WILLIAMS, LAURA BUBBLES, + +[CRED160] +LAURA PATTERSON, LEE CUMMINGS, LETICIA L. YOUNG, LINDSAY KENNEDY, LISA ORITZ, + +[CRED161] +LORNA JORDAN, LUCIO AMADIO, MARCO FERNANDEZ, MARIKO TANAKA, MARLON MATTHEWS, + +[CRED162] +MARY TELLING, MASAYOSHI MITSUYAMA, MATTHEW CHUNG, MAX ALLSTADT, MAX BOGDANOV, + +[CRED163] +MELISSA ALVAREZ, MICHAEL MAY, MICHAEL ROTHSTEIN, MIGUEL VIDAL, MIKE FEDERLINE, + +[CRED164] +NATALIE DESCALZO, N'GAI MEMBERS, NICOLAS MALLO, NOELLE SADLER, NORBERT MORIVAN, + +[CRED165] +OSWALD GREENE, JR., PETER MCKAY, PETER APPEL, PRESTON SAVARESE, RAFAEL GONZALES, + +[CRED166] +RANDY JOHNSON, REY CONCEPCION, RICHARD KROGER, ROB TIBBS, ROBERT JACKSON, + +[CRED167] +ROBERT SCHULER, ROSS A. MCINTYRE, RUSSELL FOREMAN, RUTH NUNEZ, SALVADORE SUAZO, + +[CRED168] +SAM WHITE, SANTOS GONZALES, SCOTT SMITH, SEYMOUR FRAILMAN, SPELMAN BRAUMAN, + +[CRED169] +STEPHANIE TELLING, STEVE KNEZEVICH, STEVE ROBERT, SUMIKO YASUDA, SUSAN LEWIS, + +[CRED170] +SYLVIA COLACIOS, TOMOKO MIYAZAKI, TRON, VERDEL HALE, YVES MONDESIR, ZENO LEINFELDER, + +[CRED171] +DAVID BEDDOES, CHRISTINE CHALMERS, BARRY CLARK, NEIL CORBETT, KIM GURNEY, NEIL MEIKLE, + +[CRED172] +CASSIE OLIVER, LORRAINE ROY, DAVID WATSON, KEVIN WONG, WILL MORTON + +[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] +STATIONS DE RADIO ET MUSIQUE + +[CRED218] +CONSULTANT EN MUSIQUE + +[CRD218A] +HEINZ HENN + +[CRD218B] +STUART ROSS + +[CRED219] +COORDINATEUR DE LA BANDE-SON + +[CRED220] +TERRY DONOVAN + +[CRED221] +PRODUCTEUR CHEZ ROCKSTAR GAMES + +[CRED222] +DAN HOUSER ET LAZLOW + +[CRED223] +PRODUCTEUR CHEZ ROCKSTAR NORTH + +[CRED224] +CRAIG CONNER + +[CRED225] +ALLAN WALKER + +[CRED226] +LAZLOW + +[CRED227] +DJ BANTER ET IMAGING + +[CRED228] +ECRIT PAR DAN HOUSER ET LAZLOW + +[CRED229] +FLASH FM + +[CRD229A] +TONI-MARIA CHAMBERS + +[CRD229B] +VOIX ET PRODUCTION : JEFF BERLIN + +[CRED230] +REMERCIEMENTS SPECIAUX A + +[CRED231] +TOMMY MOTTOLA, + +[CRED232] +MICHELLE ANTHONY, + +[CRED233] +STEVE BARNETT, + +[CRED234] +CHUCK FLECKENSTEIN, + +[CRED235] +RITA LIBERATOR + +[CRED236] +MARTIN ET CLAIRE LOGAN + +[CRED237] +SANDRA HUTTON + +[CRED238] +CHRISTINE DAVIDSON + +[CRED239] +ALAN, RED ET BIGFOOT + +[CRED240] +LE T + +[CRED241] +COLIN DONALD + +[CRED242] +KERRY STALLWOOD + +[CRED243] +ALAN MCGREGOR + +[CRED244] +CHRIS MORTON + +[CRED245] +EMIL BUSSE + +[CRED246] +EMILY BAILLIE + +[CRED247] +KEVIN ARCHIBALD + +[CRED248] +MORAG KERR + +[CRED249] +CATH WALKER + +[CRED250] +ISO BAR + +[CRED251] +WATERLINE + +[CRED252] +NEWS CAFE + +[CRD251A] +THE POND + +[CRD252A] +PIVO + +[CRED253] +BUDGET VIDEO RENTALS + +[CRED254] +LORNA'S SCOOTER + +[CRED255] +GARETH MURFIN + +[CRED256] +GRAPHISMES ADDITIONNELS + +[CRED257] +TONY PORTER + +[CRED258] +CRAIG MOORE + +[CRED259] +ANIMATION SYNCHRO LABIALE DES CINEMATIQUES + +[CRED260] +COSGROVE HALL FILMS + +[CRED261] +PRODUCTEUR : OWEN BALLHATCHET + +[CRED262] +ANIMATEUR SENIOR : JON TURNER + +[CRED263] +ANIMATEURS : RICHARD DRUMM + +[CRED264] +DAVE BROWN + +[CRED265] +MAIR THOMAS + +[CRED266] +PRASHANT PATEL + +[CRED267] +CONSULTANT TECHNOLOGIE AUDIO + +[CRED268] +RIK EDE POUR GAMESOUND LTD. + +[CRED269] +ASSISTANCE INTEGRATION DTS + +[CRED270] +TED LAVERTY POUR DTS + +[CRED271] +CHRIS GREER POUR DTS + +[CRED272] +JASON PAGE POUR SCEE + +[CRED273] +RECHERCHE ET ANALYSE + +[CRED274] +VROCK + +[CRED275] +DJ : LAZLOW + +[CRED276] +VOIX : JOE KELLY + +[CRED277] +PRODUCTION : JONATHAN HANST + +[CRED278] +ONDE 103 + +[CRED279] +DJ : ADAM FIRST-JAMIE CANFIELD + +[CRED280] +VOIX : JEN SWEENLEY + +[CRED281] +PRODUCTION : JONATHAN HANST + +[CRED282] +FEVER 105 + +[CRED283] +DJ : OLIVER 'LADYKILLER' BISCUIT-JULIUS DYSON + +[CRED284] +VOIX D'HOMME : ED McMANN + +[CRED285] +VOIX DE FEMME : SHWNEE SMITH + +[CRED286] +PRODUCTION : LISTEN KISTEN + +[CRED287] +EMOTION 98.3 + +[CRED288] +DJ : FERNANDO- FRANK CHAVEZ + +[CRED289] +VOIX : JEN SWEENLEY + +[CRED290] +PRODUCTION : JONATHAN HANST + +[CRED291] +RADIO ESPANTOSO + +[CRED292] +DJ : PEPE-TONY CHILRODES + +[CRED293] +WILDSTYLE + +[CRED294] +DJ : MISTER MAGIC + +[CRED295] +VOIX : FRANK SILVESTRO + +[CRED296] +PRODUCTION : LAZLOW + +[CRED297] +KCHAT + +[CRED298] +ECRIT PAR DAN HOUSER ET LAZLOW + +[CRED299] +PRODUIT ET EDITE PAR LAZLOW + +[CRED300] +DJ AMY SHECKENHAUSEN : LEYNA WEBER + +[CRED301] +JEZ TORRENT : KEVIN MCKIDD + +[CRED302] +MANDY : COLLEEN CORBETT + +[CRED303] +MICHELLE CARAPADIS : MARY BIRDSONG + +[CRED304] +MR.ZOO : CARL DOWLING + +[CRED305] +GETHSEMANEE : LYNN LIPTON + +[CRED306] +CLAUDE MAGINOT : JOHN MAUCERI + +[CRED307] +BJ SMITH : LAWRENCE TAYLOR + +[CRED308] +THOR : FRANK FAVA + +[CRED309] +INTERLOCUTEURS + +[CRED310] +COUZIN ED, JOSH CLARK, JASON BUHRMESTER, JUAN ALLER, WAYNE OLIVER, SUSAN LEWIS, GILLIAN TELLING, TOM MURRAY, MIKE FERRANTE SR., EMMANUEL GOLDSTEIN, DAN HOUSER, NICK MANDELOS, GERRY COSGROVE, MIKE PALERMO, PORKCHOP, KEITH BROADAS + +[CRED311] +LEWIS, GILLIAN TELLING, TOM MURRAY, MIKE FERRANTE SR., EMMANUEL GOLDSTEIN, + +[CRED312] +DAN HOUSER, NICK MANDELOS, GERRY COSGROVE, MIKE PALERMO, PORKCHOP, + +[CRED313] +KEITH BROADAS + +[CRED314] +VCPR + +[CRED315] +ECRIT PAR DAN HOUSER ET LAZLOW + +[CRED316] +PRODUIT PAR LAZLOW + +[CRED317] +MAURICE CHAVEZ : PHILLIP ANTHONY RODRIGUEZ + +[CRED318] +JONATHAN FREELOADER : PATRICK OLSEN + +[CRED319] +MICHELLE MONTANIUS : KELLY GUEST + +[CRED320] +ALEX SHRUB : CHRIS LUCAS + +[CRED321] +CALLUM CRAYSHAW : SEAN MODICA + +[CRED322] +JOHN F. HICKORY : LJ GANSEN + +[CRED323] +LE PASTEUR RICHARDS : DAVID GREEN + +[CRED324] +JAN BROWN : MAUREEN SILLIMAN + +[CRED325] +BARRY STARK : RENAUD SEBBANE + +[CRED326] +JENNY LOUISE CRAB : MARY BIRDSONG + +[CRED327] +KONSTANTINOS SMITH : KONSTANTINOS.COM + +[CRED328] +JEREMY ROBARD : PETER SILVESTRO + +[CRED329] +PUBLICITES RADIO + +[CRED330] +ECRITES PAR DAN HOUSER ET LAZLOW + +[CRED331] +PRODUITES PAR LAZLOW + +[CRED332] +JINGLES SUPPLEMENTAIRES PRODUITS PAR CRAIG CONNER + +[CRED333] +VOIX DES PUBLICITES : + +[CRED334] +ADAM DAVIDSON, ALEX ANTHONY, ALICE SALTZMAN, AMY SALZMAN, KATE DUKICH, + +[CRED335] +ARAN RONICLE, BARB JONES, BEN KRECH, BRIAN THOMAS, BROCK YODER, CHRIS + +[CRED336] +FERRANTE, CRAIG CONNER, DAVE RYAN, DAVID GREEN, DORIS WOO, DOUGLAS + +[CRED337] +HARRISON, ED MCMANN, FRANK CHAVEZ, FRANK FAVA, GENE HILGREEN, GREG + +[CRED338] +SCHWEIZER, HUNTER PLATIN, JAMES FERRANTE, JEFF BERLIN, JEFF ROSA, JOE KELLY, + +[CRED339] +JOHN MAUCERI, JOSH CLARK, JULIE WEMYSS, KEVIN STRALEY, KIM GURNEY, LANCE + +[CRED340] +WILLIAMS, LAURA PATERSON, LAZLOW, LISA ORTIZ, LORNA JORDAN, LUCIEN JONES, + +[CRED341] +MAUREEN SILLIMAN, MIKE FERRANTE JR., PETE GUSTIN, PETER SILVESTRO, RAFF + +[CRED342] +CROLLA, RANDY JOHNSON, RICHARD KRUGER, RON REEVE, SHELLEY MILLER, SKY, TJ ALLARD + +[CRD344A] +ENREGISTREMENTS AUX DIGITAL ARTS STUDIOS, + +[CRED344] +NYC, TRACK 9 STUDIOS, NYC, + +[CRED345] +WEDDINGTON MULTIMEDIA, LOS ANGELES, + +[CRD345A] +SYNC SOUND, NYC ET RADIO LAZLOW, LONG ISLAND. + +[CRED346] +MERCI A AXEL ERICSON ET WON LEE DE DIGITAL ARTS, PAUL VASQUEZ DETRACK 9 STUDIOS, JOHN BOWEN ET JOHN HASSLER DE SYNC SOUND. + +[CRED347] +MARK LLOYD + +[CRED348] +TIM BATES + +[CRED349] +KIT BROWN + +[CRED350] +ANDY MASON + +[CRED351] +PHIL DEANE + +[CRED352] +PHIL ALEXANDER + +[CRED353] +MATT HEWITT + +[CRED354] +DENBY GRACE + +[CRED355] +ANTOINE CABROL + +[CRED356] +JONATHAN STONES + +[CRED357] +MIKE BLACKBURN + +[CRED358] +TIM MCGAFF [CINCAM] Caméra cinématique -[FEDS_AM] -<>-CHANGER MENU +[RC4] +'RODEO DE RUMPO' -[KABOOM] -KABOUM ! - -[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 +[LEGAL] +~g~Elimine toute menace criminelle! [GA_2] -~w~Nouveau moteur et nouvelle peinture : 100$ +Nouveau moteur et nouvelle peinture. Les flics ne te reconnaîtront plus! + +[HELP15] +Si tu es à pied, appuie sur la ~h~~k~~PED_LOOKBEHIND~~w~ pour ~h~regarder derrière~w~. Utilise le ~h~joystick analogique droit~w~ pour ~h~regarder autour~w~ de toi. + +[FEC_LB4] +Regarder derrière (touche R3) [PERPIC] -Paquets trouvés +Paquets cachés trouvés + +[CO_ONE] +Paquet caché ~1~ sur ~1~ [GA_21] -~w~Ce garage ne peut plus contenir de véhicules. +Impossible de garer plus de véhicules dans ce garage. [CHEAT1] -Code activé +Codes activés [CHEAT2] -Code arme +Code d'arme [CHEAT3] -Code santé +Code de santé [CHEAT4] -Code protection +Code d'armure [CHEAT5] -Code indice de recherche +Code d'indice de recherche [CHEAT6] -Code argent +Code d'argent [CHEAT7] -Code météo - -[FEDS_BA] -touche " - RETOUR - -[FED_WIS] -ECRAN LARGE : +Code de météo [USJ_ALL] -~w~T'AS REUSSI TOUTES LES CASCADES UNIQUES ! +TOUTES LES CASCADES ONT ETE ACCOMPLIES! [JAN] Jan @@ -3095,7 +4107,7 @@ Mai Jun [JUL] -Jul +Jui [AUG] Aoû @@ -3116,13996 +4128,10589 @@ Déc --:---:---- --:--:-- [BONUS] -~g~BONUS ~1~$ +~g~BONUS $~1~ -[TAXI_M] -'Taxi' +[HORN1] +Appuie sur la ~h~~k~~VEHICLE_HORN~ ~w~pour ~h~klaxonner. -[COP_M] -'Autodéfense' +[HORN2] +Appuie sur la ~h~~k~~VEHICLE_HORN~ ~w~pour ~h~klaxonner. -[FIRE_M] -'Pompiers' - -[AMBUL_M] -'Ambulance' - -[HJ_IS] -~w~BONUS CASCADE DE TARE : ~1~$ - -[HJ_PIS] -~w~BONUS CASCADE DE TARE PARFAITE : ~1~$ - -[HJ_DIS] -~w~BONUS DOUBLE CASCADE DE TARE : ~1~$ - -[HJ_PDIS] -~w~BONUS DOUBLE CASCADE DE TARE PARFAITE : ~1~$ - -[HJ_TIS] -~w~BONUS TRIPLE CASCADE DE TARE : ~1~$ - -[HJ_PTIS] -~w~BONUS TRIPLE CASCADE DE TARE PARFAITE : ~1~$ - -[HJ_QIS] -~w~BONUS QUADRUPLE CASCADE DE TARE : ~1~$ - -[HJ_PQIS] -~w~BONUS QUADRUPLE CASCADE DE TARE PARFAITE : ~1~$ - -[HJBAD] -~w~Un atterrissage de naze ! T'as failli gagné ~1~$ ! - -[HJDOWN] -Etat atterrissage : ~1~ - -[FESZ_LS] -Chargement réussi. - -[MRACE08] -~w~Reviens quand t'auras un véhicule ! - -[MRACE01] -~w~Attends les concurrents et klaxonne pour donner le départ de la course ! - -[MRACE02] -~w~La course commencera quand le premier joueur klaxonnera. - -[MRACE05] -~r~T'AS PERDU... - -[MRACE07] -~r~T'es mort, espèce de loser ! - -[MRACE06] -~r~T'abandonnes ? Sale flipette ! - -[MRACE09] -~w~Reprends la course ! - -[MRACE10] -~w~T'as gagné (mais t'étais tout seul)... - -[MRACEPO] -Position - -[MRCPU03] -TU LEUR AS MIS LE FEU ! - -[MRCPU04] -T'ES EN TRAIN DE CRAMER ! ( ------- TRASHMASTER ODD-JOB MISSION ------- ) - -[TRASH1] -Eboueurs - -[TRASH1A] -~w~Vide les bennes et apporte les ordures à la décharge. - -[TRASH1C] -~w~Le chrono s'enclenche quand tu vides une benne. Vide les bennes dans N'IMPORTE QUEL ORDRE. - -[TRASH1G] -~r~Trop dur pour toi ? Mauviette ! - -[TRASH1H] -~r~T'as plus de temps ! - -[TRASH1J] -~r~Tu t'es trop éloigné de ton itinéraire ! - -[TRASH1K] -~w~Va vider les ~g~bennes ! - -[TRASH1L] -~w~Retourne à la ~y~décharge ! - -[TRASH1M] -~w~Ordures ramassées ! +~1~ secondes - -[PCJINFO] -~w~Franchis les 25 ~y~points de passage~w~ en ~1~ secondes. - -[PCJFAIL] -~r~T'as pas battu le record de ~1~ secondes ! - -[PCJPROM] -~w~T'as ~1~ secondes pour remonter sur ton ~b~deux-roues. - -[PCJPRO1] -~w~T'as ~1~ seconde pour remonter sur ton ~b~deux-roues. - -[PCJDEST] -~r~Deux-roues détruit ! - -[PCJRET] -~r~T'as pas réussi à remonter sur ton deux-roues. - -[PCJTIME] -~r~T'as plus de temps ! - -[PCJCHEC] -~w~Point de passage ~1~ sur ~1~ - -[TRRACE1] -~w~Gagne un peu plus de temps à chaque point de passage franchi... - -[TRRACE3] -~w~T'as fini avec ~1~ secondes d'avance ! - -[TRRACE5] -~w~Ca te fait ~1~$ ! - -[TRRACE6] -~w~BRAVO ! T'as franchi tous les points de passage en premier ! Voici un bonus de 1000$ ! - -[TRRACE7] -~r~T'as quitté le circuit ! - -[TRRACE8] -~r~Ta moto est HS ! - -[TRRACE9] -~r~T'es pas remonté sur ta moto à temps. - -[TRRAC10] -~r~T'as perdu ta moto ! - -[TRRAC11] -~r~Temps écoulé ! - -[ANG] -Avenging Angels - -[ANG_1] -~w~Hé, mon pote, on va nettoyer cette ville de tous les criminels ! - -[ANG_2A] -Appuie sur~h~ ~k~ ~TGSUB~ ~w~pour rejoindre les Avenging Angels. - -[ANG_3] -~w~Toi et moi, on pourrait démonter cette ville à nous deux, mais... on va chercher du renfort, on sait jamais. - -[ANG_3A] -~w~Arrête-toi près d'autres Avenging Angels pour qu'ils rejoignent ton gang. - -[ANG_4] -~w~Yo ! J'ai rejoint cette bande de guignols pour me battre ! Qu'est-ce qu'on attend ? - -[ANG_5] -~w~J'suis ton homme... - -[ANG_6] -~w~Allons cramer quelques ordures ! - -[ANG_7] -~w~Ouais, c'est le top, la baston ! - -[ANG_7A] -~w~Moi, ça me va, et toi... ? - -[ANG_7B] -~w~On veut pas de gangs de nazes dans nos rues ! - -[ANG_7C] -~w~Pas de ça chez moi ! - -[ANG_7D] -~w~L'heure est venue de riposter ! - -[ANG_7E] -~w~Ici, c'est nous qui faisons la loi ! - -[ANG_8] -Temps restant - -[ANG_9] -~w~Temps prolongé ! - -[ANG_10] -~r~Temps écoulé ! - -[ANG_11] -~w~Il y a un groupe 'd'indésirables' qui traînent dans le coin... On va leur donner une leçon... - -[ANG_12] -~w~Y a un gang qui sème la panique dans les rues. On va leur apprendre ! - -[ANG_13] -~w~Cette ville devient folle ! Les gens croient avoir le droit de se rassembler ? On va leur montrer ! - -[ANG_13A] -~w~Un gang de connards a été repéré en train de malmener les gens dans les rues... - -[ANG_14] -~w~On signale un autre crime... En route ! - -[ANG_16] -~w~Certains individus ont été repérés en stationnement interdit. ON Y VA ! - -[ANG_16A] -~w~Je connais des gars toujours en quête d'un sale coup. Ils ont besoin d'une bonne correction. - -[ANG_OBJ] -~w~Liquide le ~r~gang perturbateur. - -[ANG_17] -~w~Bien joué ! Grâce à toi, ce quartier a été nettoyé des criminels... pour l'instant... - -[ANG_18] -~w~Ils se barrent ! - -[ANG_19] -~w~Trouve un Avenging Angel et arrête-toi près de lui pour connaître ta prochaine mission. - -[ANG_20] -~w~Ils se font la malle ! - -[ANG_21] -~w~Les laissez pas se tirer ! - -[VIC1] -Home Sweet Home - -[VIC2] -Slacker - -[VIC3] -Dealing Revenge - -[VIC4] -Snuff - -[VIC5] -Smash and Grab - -[VIC6] -Hot Wheels - -[VIC7] -The Portland Chainsaw Masquerade - -[MAR1] -Shop 'til you Strop - -[MAR2] -Taken for a Ride - -[MAR3] -Booby Prize - -[MAR4] -Biker Heat - -[MAR5] -Overdose of Trouble - -[SAL1] -The Offer - -[SAL2] -Ho Selecta ! - -[SAL3] -Frighteners - -[SAL4] -Rollercoaster Ride - -[SAL5] -Contra-Banned - -[SAL6] -Sindacco Sabotage - -[SAL7] -The Trouble with Triads - -[SAL8] -Driving Mr Leone - -[JDT1] -Bone Voyeur! - -[JDT2] -Don in 60 Seconds - -[JDT3] -A Volatile Situation - -[JDT4] -Blow up 'Dolls' - -[JDT5] -Salvatore's Salvation - -[JDT6] -The Guns of Leone - -[JDT7] -Calm before the Storm - -[JDT8] -The Made Man - -[MAC1] -Snappy Dresser - -[MAC2] -Big Rumble in Little China - -[MAC3] -Grease Sucho - -[MAC4] -Dead Meat - -[MAC4_0] -Casa - -[MAC5] -No Son of Mine - -[SALH1] -Rough Justice - -[SALH2] -Dead Reckoning - -[SALH3] -Shogun Showdown - -[SALH4] -The Shoreside Redemption - -[SALH4_V] -~r~v1.1 - -[SALH5] -The Sicilian Gambit - -[SALH5_V] -~r~v1.1 - -[DONH1] -Panlantic Land Grab - -[DONH2] -Stop the Press - -[DONH3] -Morgue Party Resurrection - -[DONH4] -No Money, Mo' Problems - -[DONH5] -Bringing the House Down - -[DONH6] -Love on the Run - -[TOSH1] -More Deadly than the Male - -[TOSH2] -Cash Clash - -[TOSH2F0] -~r~Une camionnette a atteint le complexe des Yakuzas ! - -[TOSH2F1] -~r~Le convoi a atteint le complexe des Yakuzas ! - -[TOSH2F2] -~r~T'as pas détruit les camionnettes de sécurité ! - -[TOSH2M0] -~w~Et une de moins ! - -[TOSH2M1] -~w~Encore une au tapis ! - -[TOSH3] -A Date with Death - -[TOSH4] -Cash in Kazuki's Chips - -[PO_MOB1] -~w~Toni ? C'est ta maman ! - -[POMOB1A] -~w~Depuis combien de temps es-tu de retour ? - -[POMOB1B] -~w~Pourquoi tu viens pas me voir ? - -[POMOB1C] -~w~C'est quoi ton problème ? - -[POMOB1D] -~w~Je suis ta mère, pour l'amour de Dieu ! Viens me voir ! - -[PO_MOB2] -~w~Salut Médor, c'est Maria. - -[PO_MOB3] -~w~Hé, Toni ! C'est J.D. - -[POMOB3A] -~w~Y paraît que t'es sur un gros coup. - -[POMOB3B] -~w~J'espère juste que t'oublieras pas ton vieux pote J.D. quand tu seras au sommet ! - -[POMOB4A] -~w~Qu'est-ce que tu veux ? - -[POMOB4B] -~w~Quelqu'un pour laver ton linge sale ? Pour te torcher ? - -[POMOB4C] -~w~Le prends pas comme ça... J'suis vraiment désolé pour tout... - -[POMOB4F] -~w~Un gâteau à l'arsenic ? - -[POMOB4G] -~w~Laisse tomber... - -[POMOB4I] -~w~Salvatore en a entendu parler et il m'a dit qu'on devait évoluer tous les deux. - -[POMOB4J] -~w~C'est ce que j'essaie de faire en m'excusant. - -[PO_MOB5] -~w~Toni ? C'est Salvatore. - -[POMOB5A] -~w~On a de gros ennuis ! Ramène-toi, et en vitesse ! - -[PO_MOB6] -~w~Anthony ? C'est Salvatore. - -[POMOB6A] -~w~T'as pas vu Maria ? - -[POMOB6B] -~w~Je trouve cette salope que quand elle a besoin de fric ! - -[ST_MOB8] -~w~Ouais ? - -[STMOB8A] -~w~Toni ? C'est Sal. - -[STMOB8B] -~w~Faut qu'on cause, mais j'aime pas ces téléphones portables. - -[STMOB8C] -~w~Je te rappelle sur le téléphone public, à l'extérieur du tribunal. - -[ST_MOB1] -~w~Toni. C'est Donald. - -[STMOB1A] -~w~J'ai un souci plutôt pressant qui réclame tes... talents. - -[STMOB1B] -~w~Passe me voir à mon bureau dès que tu peux. - -[ST_MOB2] -~w~Ouais ? - -[STMOB2A] -~w~Cipriani ? C'est moi, McAffrey. - -[STMOB2B] -~w~J'ai des nouvelles qui intéresseront sûrement Salvatore. - -[STMOB2C] -~w~Viens me retrouver à l'endroit habituel. - -[ST_MOB3] -~w~Ouais ? - -[STMOB3A] -~w~C'est Sal. - -[STMOB3B] -~w~Ecoute, les Forelli avaient le maire Hole dans leur poche. - -[STMOB3D] -~w~Je connais un homme d'affaires qui ferait n'importe quoi pour se faire élire. - -[STMOB3E] -~w~C'est un enfoiré de première... Il est donc parfaitement qualifié pour le poste. - -[STMOB3F] -~w~Je lui ai dit que tu veillerais à ce qu'il remporte l'élection... pour nous ! - -[ST_MOB4] -~w~Allô ? - -[STMOB4A] -~w~Toni. C'est moi, Sal. - -[STMOB4B] -~w~Je peux sentir la marque des Forelli sur la merde dans laquelle je suis fourré. - -[STMOB4C] -~w~La question qui m'intéresse, c'est pourquoi ils se servent du maire pour me pourrir la vie ? - -[STMOB4D] -~w~Ecoute, retrouve-moi à la jetée. - -[STMOB4E] -~w~Faut qu'on dégotte des infos ! - -[ST_MOB5] -~w~Yo ! - -[STMOB5B] -~w~Va à la cabine téléphonique de Torrington. - -[STMOB5C] -~w~Faut que je te parle. - -[STMOB5D] -~w~J'voudrais aussi que tu passes voir un de mes associés, à Aspatria, en chemin. - -[STMOB5E] -~w~Il va nous donner un coup de main pour mettre la pression sur les Sindacco et les Forelli. - -[ST_MOB6] -~w~Ouais ? - -[STMOB6A] -~w~Toni ? C'est Sal. - -[STMOB6B] -~w~Va à la cabine téléphonique de Liberty Campus. - -[STMOB6C] -~w~C'est important. - -[ST_MOB7] -~w~Ouais ? - -[STMOB7A] -~w~Toni ? C'est Sal. - -[STMOB7B] -~w~Va à Belleville et trouve la cabine téléphonique. - -[STMOB7C] -~w~J'ai un travail urgent. - -[ST_MOB9] -~w~Toni Cipriani. - -[STMOB9A] -~w~Toni ? C'est Maman. - -[STMOB9B] -~w~Il paraît que tu fais partie de la Famille !? - -[STMOB9C] -~w~... J'ai jamais douté une seule seconde, mon fils ! - -[STMOB9D] -~w~... et maintenant que tu as enfin fait tes preuves... - -[STMOB9E] -~w~J'annule le contrat sur ta tête. - -[STMOB9F] -~w~Allez, n'en parlons plus ! - -[STMOB9G] -~w~Après tout, c'était uniquement dans ton intérêt. - -[STMOB9H] -~w~Ah, quel genre de fils oblige sa maman à être aussi sévère ? - -[STMOB9I] -~w~A bientôt, mon fils, n'oublie pas ta bonne vieille maman. - -[STMO10] -~w~Ouais ? - -[STMO10A] -~w~Salut, le gros dur. C'est McAffrey. - -[STMO10B] -~w~Les Fédéraux ont embarqué ton boss, Salvatore. - -[STMO10C] -~w~Et ils sont vraiment pas contents. - -[STMO10D] -~w~Il va payer pour tous les crimes commis dans cette ville. - -[STMO10E] -~w~Alors, on se connaît pas, OK ? - -[SH_MOB1] -~w~Toni...? - -[SHMOB1A] -~w~Sal ? C'est toi ? - -[SHMOB1B] -~w~Oh, ferme-la ! Je parle à mon avocat, là ! - -[SHMOB1C] -~w~Toni ? ... euh... j'veux dire... Lionel ? - -[SHMOB1D] -~w~Ecoute, ils m'ont embarqué ! C'est pas croyable ! - -[SHMOB1E] -~w~Je suis dans la merde, là. - -[SHMOB1F] -~w~Alors, ramène-toi ici ! J'ai deux ou trois trucs à te confier. - -[SHMOB1G] -~w~... Lionel ? - -[SH_MOB2] -~w~Ouais ? - -[SHMOB2A] -~w~Toni ? C'est Donald. - -[SHMOB2B] -~w~Non, attends, raccroche pas ! - -[SHMOB2C] -~w~J'ai une proposition très intéressante à te faire... - -[SHMOB2D] -~w~S'il te plaît, passe me voir à ma... hum... résidence. Je te mettrai au courant. - -[SHMOB2E] -~w~Toni...? - -[SHMOB2F] -~w~Toni, je t'en supplie ! Je t'appelle avec ma dernière piè... - -[SH_MOB3] -~w~M. Cipriani ? - -[SHMOB3A] -~w~Qui c'est ? Comment vous avez eu ce numéro ? - -[SHMOB3B] -~w~Celui qui met toute sa volonté dans ses actes a toutes les chances de réussir. - -[SHMOB3C] -~w~Je ne devrais pas avoir à vous l'apprendre, M. Cipriani. - -[SHMOB3D] -~w~J'ai besoin de vous pour un problème délicat. - -[SHMOB3E] -~w~Vous en serez généreusement dédommagé. - -[SHMOB3F] -~w~Je vous expliquerai tout à mon appartement, à Torrington. - -[SH_MOB4] -~w~Toni ! C'est Sal ! - -[SHMOB4A] -~w~T'as réussi ! C'est pas croyable ! - -[SHMOB4B] -~w~On est sorti d'affaire, petit ! - -[SHMOB4C] -~w~Viens me voir, on a quelques détails à régler. - -[SH_MOB5] -~w~Toni ? C'est Donald. - -[SHMOB5A] -~w~Si le marché Panlantic est conclu, on va avoir besoin de... hum... - -[SHMOB5B] -~w~comment dire... - -[SHMOB5C] -~w~'nettoyer' un petit secteur, à Fort Staunton. - -[SHMOB5D] -~w~Quand vous dites 'on', vous voulez dire 'moi' ? - -[SHMOB5E] -~w~Toni, tu me comprends parfaitement. - -[SHMOB5F] -~w~Va voir 8-Ball. Je suis sûr qu'il peut nous fournir le matériel nécessaire. - -[SHMOB5G] -~w~Je suis sûr qu'il peut nous fournir le matériel nécessaire. - -[SH_MOB6] -~w~Allô, mec ? Ici 8-Ball. - -[SHMOB6A] -~w~Ton matos est prêt. - -[AHIT_H0] -~w~C'est tout ce dont t'es capable, connard ? - -[AHIT_H1] -~w~C'est pas vrai, ils abandonnent jamais, ces tarés ? - -[AHIT_H2] -~w~Va te faire mettre, minable ! - -[AHIT_H3] -~w~Vous commencez à me les casser ! - -[AHIT_BI] -~w~Ouvre l'oeil ! Un des tueurs de ta mère est pas loin ! - -[AHIT_TA] -~w~Fais gaffe ! Un des tueurs de ta mère est dans le coin. - -[AHIT_BU] -~w~Attention ! Un des tueurs de ta mère est sur ta piste. - -[AHIT_AM] -~w~Fais attention ! Un des tueurs de ta mère t'a repéré. - -[AHIT_VA] -~w~Te fais pas avoir ! Y a un tueur de ta mère dans le secteur ! - -[AHIT_PO] -~w~Reste sur tes gardes ! Un des tueurs de ta mère va tenter de t'avoir. - -[AHIT_CA] -~w~Ouvre l'oeil ! Un des tueurs de ta mère s'approche de toi ! - -[K_TKT] -Scrapyard Challenge - -[K_TK2] -~w~Passe à travers les cerceaux pour marquer des points. - -[K_TK4] -~w~Marque un maximum de points avant la fin du chrono ! - -[K_CD] -~w~T'as ~1~ secondes pour remonter sur ta ~b~moto ! - -[K_TKP1] -~w~1 point ! - -[K_TKP2] -~w~2 points ! - -[K_TKP3] -~w~3 points ! - -[K_SC] -score - -[K_SCX] -~w~T'as marqué ~1~ points ! - -[K_SCX1] -~w~T'as marqué 1 point ! - -[K_HSC1] -~w~Nouveau meilleur score : ~1~ points ! - -[K_HSC2] -~r~T'as pas battu le meilleur score de ~1~ points. - -[KRUSH] -Tu obtiendras désormais quatre fois plus de fric en te servant du broyeur ! - -[KRUSH2] -Tu obtiendras désormais huit fois plus de fric en te servant du broyeur ! - -[TURFAIL] -~r~DEFI TERMINE ! - -[TKR1] -9mm Mayhem - -[TKR2] -Scooter Shooter - -[TCKILL] -Victimes - -[TCHEAL] -Dégâts - -[TC2_1] -~r~T'as buté ton chauffeur ! - -[TC2_2] -~r~Véhicule détruit ! - -[TC2_3] -~r~Temps écoulé ! - -[TC_T_E] -~w~Cible éliminée ! ~1~$ - -[TUP_BR] -~w~Elimine autant de ~r~cibles ~w~que possible dans le temps imparti. - -[TUP_BR2] -~w~Elimine plus de ~1~ ~r~cibles ~w~pour inscrire un nouveau meilleur score ! - -[TUP_AD] -~w~T'as 3 pilules d'adrénaline. Appuie sur la touche R1 pour en utiliser une. - -[TUPSC1] -~w~Nouveau meilleur score : ~1~ victimes ! - -[TUPSC2] -~r~T'as pas battu le meilleur score de ~1~ victimes. - -[MPWCS1] -The Wedding List - -[MPWCS2] -Salut, ça roule ? - -[MPWCS3] -Ecoute, mon fils Joey va se marier ! - -[MPWCS4] -Je lui ai trouvé une fille très classe, comme ma Maria... J'suis impatient de les voir ensemble ! - -[MPWCS5] -Le seul problème, c'est que j'veux plus le voir conduire une des épaves qu'il répare dans son atelier. - -[MPWCS6] -Alors, tu vas parcourir cette ville et lui rapporter une vraie caisse. - -[MPWCS7] -Je veillerai à te récompenser. - -[MPTCS1] -Tanks for the Memories - -[MPTCS2] -C'est Sal. J'ai besoin de détourner l'attention des flics, et tu vas m'aider. - -[MPTCS3] -J'ai un blindé garé à l'autre bout de la ville. Prends-le et fais des dégâts ! Vas-y à fond ! - -[MPTCS4] -Je veux que les gens croient que Patton est ressorti de sa tombe ! - -[MPTCS5] -Ecoute, cette diversion est vraiment importante. Alors, j'ai d'autres gars qui vont en faire autant. - -[MPTCS6] -... Et je payerai seulement celui qui restera le plus longtemps au volant. - -[MPRCS1] -Street Rage - -[MPRCS2] -Ici Salvatore Leone ! Votre bienfaiteur public ! - -[MPRCS3] -... Ecoutez pas ce que raconte le procureur ! - -[MPRCS4] -Je suis un généreux protecteur de Liberty City. Et c'est pour ça que je sponsorise cette grande course aujourd'hui. - -[MPRCS5] -Ca me coûte combien, cette merde ? - -[MPRCS6] -QUOI ? Appelez le Samu, mon coeur s'est arrêté de battre ! - -[MPHPCS2] -C'est Sal... Les fédéraux ont mis mon téléphone sur écoute, alors j'vais faire dans le subtil. - -[MPHPCS3] -Y a une valise pleine de Benjamin sous le téléphone et une liste de noms. Devine ce que je veux... - -[MPHPCS4] -... attends ! J'veux pas que tu leur refiles mon fric ! - -[MPHPCS5] -Tu sais bien... Descends-les... - -[MPHPCS6] -Et je veux pas dire 'fais leur faire un tour à la cave'... - -[MPHPCS7] -Ecoute, bute juste tous les enculés sur la liste ! - -[DEB0] -DEBUG 0 - -[DEB1] -DEBUG 1 - -[DEB2] -DEBUG 2 - -[DEB3] -DEBUG 3 - -[DEB4] -DEBUG 4 - -[NUM0] -DEBUG 0 (~1~) - -[NUM1] -DEBUG 1 (~1~) - -[NUM2] -DEBUG 2 (~1~) - -[NUM3] -DEBUG 3 (~1~) - -[NUM4] -DEBUG 4 (~1~) - -[CARS] -Vendeur de voitures - -[BIKE] -Vendeur de motos - -[RACE_0] -Position - -[RACE_FL] -~w~DERNIER TOUR - -[RACE_X0] -~w~Prends une caisse et direction la ~y~ligne de départ ! - -[RACE_X1] -~w~Prends une moto et direction la ~y~ligne de départ ! - -[RACE_X2] -~w~Il te faut une caisse pour participer à cette course ! - -[RACE_X3] -~w~Il te faut une moto pour participer à cette course ! - -[RACE_X4] -~w~Il te reste ~1~ secondes pour trouver une caisse. - -[RACE_X5] -~w~Il te reste ~1~ secondes pour trouver une moto. - -[RACE_X6] -~w~Il te reste 1 seconde pour trouver une caisse. - -[RACE_X7] -~w~Il te reste 1 seconde pour trouver une moto. - -[RACE_T0] -~r~T'es pas arrivé premier ! - -[RACE_T1] -~r~T'as été disqualifié pour avoir abandonné ta caisse. - -[RACE_T2] -~r~Un des participants a été tué, la course est annulée ! - -[RACE_T3] -~r~T'as été disqualifié pour avoir abandonné ta moto. - -[RACE_Y3] -~w~3 - -[RACE_Y2] -~w~2 - -[RACE_Y1] -~w~1 - -[RACE_Y] -~w~GO !! - -[RACE_Z1] -~w~1ERE PLACE ! - -[RACE_Z2] -~w~2E PLACE ! - -[RACE_Z3] -~w~3E PLACE ! - -[RACE_Z4] -~w~DERNIER ! - -[RACE_R1] -~w~RECORD : ~1~:~1~~1~ NOUVEAU RECORD ! - -[RACE_R2] -~w~NOUVEAU RECORD ! - -[RACE_S0] -~w~TEMPS : ~1~:~1~~1~ - -[RACE_S1] -~w~MEILLEUR TOUR : ~1~:~1~~1~ - -[ABC01] -Record : 2e - -[ABC10] -Temps : 12:30 - -[ABC11] -Record : 10:56 - -[ABC20] -Meilleur tour : 4:26 - -[ABC21] -Record : 5:30 - -[ABC] -NOUVEAU RECORD - -[RAC1] -Low-Rider Rumble - -[RAC2] -Deimos Dash - -[RAC3] -Wi-Cheetah Run - -[BIK1] -Red Light Racing - -[BIK2] -Torrington TT - -[BIK3] -Gangsta GP - -[TT1] -Bumps & Grinds - -[TT1_A1] -~w~< CIRCUIT ~1~ > - -[TT1_B1] -~w~Temps cible : ~1~:~1~ - -[TT1_B1A] -~w~Temps cible : ~1~:0~1~ - -[TT1_B2] -~w~Meilleur temps du circuit : ~1~:~1~ - -[TT1_B2A] -~w~Meilleur temps du circuit : ~1~:0~1~ - -[TT1_B3] -~w~Meilleur temps au tour : ~1~:~1~ - -[TT1_B3A] -~w~Meilleur temps au tour : ~1~:0~1~ - -[TT1_B4] -~w~~1~:~1~ - -[TT1_B4A] -~w~~1~:0~1~ - -[TT1_B5] -~w~Nouveau record du circuit ! ~1~:~1~ - -[TT1_B5A] -~w~Nouveau record du circuit ! ~1~:0~1~ - -[TT1_L] -~r~ Non disponible. - -[A_PISTO] -~w~< Pistolet > - -[A_UZI] -~w~< Pistolet-mitrailleur > - -[A_AK] -~w~< AK47 > - -[A_SNIPE] -~w~< Fusil de précision > - -[A_GRENA] -~w~< Grenades > - -[A_ARMOU] -~w~< Protection pare-balles > - -[A_ROCKE] -~w~< Lance-roquettes > - -[A_SHOTG] -~w~< Fusil à pompe > - -[A_M4] -~w~< M4 > - -[A_FLAME] -~w~< Lance-flammes > - -[A_MINIG] -~w~< Minigun > - -[A_COST] -~w~Prix : ~h~~1~$ - -[A_COST2] -~w~Prix : ~h~~1~$ ~n~ ~r~Cet achat remplacera ton arme actuelle. - -[A_COST3] -~w~Prix : ~h~~1~$ ~n~ ~r~Ta protection pare-balles est en bon état. - -[A_COST4] -~w~Prix : ~h~~1~$ ~n~ ~r~Tu peux pas t'offrir ça. - -[A_STOCK] -~r~Stock épuisé. - -[A_VIC4] -~w~Un pistolet coûte en général 240$, mais là, c'est Vincenzo qui régale. - -[A_DONS4] -~w~Donald Love a déjà payé pour ça. - -[A_NEDS4] -~w~Un mec de l'église a réservé ça pour toi. - -[A_TALK1] -~w~J'ai tout ce qu'il faut pour votre défense personnelle. - -[A_TALK2] -~w~Vous voulez aussi un permis ? - -[A_TALK3] -~w~J'ai pas besoin de voir vos papiers. Vous m'inspirez confiance. - -[A_TALK4] -~w~Surtout, n'hésitez pas à essayer le stand de tir à l'arrière. - -[BENZ_GO] -~w~Faut que tu changes de fringues ! - -[PIZ_B01] -~w~T'as ~1~ seconde pour remonter sur la ~b~mob Pizza ! - -[PIZ_B02] -~w~T'as ~1~ secondes pour remonter sur la ~b~mob Pizza ! - -[PIZ_F04] -~r~T'as pas réussi à revenir à la mob Pizza ! - -[NDL_B01] -~w~T'as ~1~ seconde pour remonter sur la ~b~mob Nouilles ! - -[NDL_B02] -~w~T'as ~1~ secondes pour remonter sur la ~b~mob Nouilles ! - -[NDL_F04] -~r~T'es pas revenu à la mob Nouilles ! - -[EXPO_D] -~w~Voici pour toi : ~1~$ ! Termine la liste pour gagner un bonus ! - -[PUPSPN] -~w~BONUS A L'ECRAN ! - -[PUPMEGA] -~y~MEGA DEGATS ! - -[PUPREGN] -~y~BOOST DE SANTE ! - -[PUPINVS] -~y~INVISIBILITE ! - -[PUPFREZ] -~y~FOLIE FURIEUSE ! - -[MPK] -a tué - -[MPKHEAD] -d'un tir en pleine tête ! - -[MPNEED] -n'a besoin que de - -[MPNAME] -Nom - -[MPSCORE] -Score - -[MPPING] -Ping - -[MPCPS] -Points de passage - -[MPTIME] -Temps - -[MPBONUS] -Bonus - -[MPQG] -Quitter ? - -[MPQUIT] -Quitter - -[MPCONT] -Continuer - -[MPHIGH] -Meilleur temps - -[MPBY] -par - -[MPOVER] -Fin de la partie - -[MPFIRST] -a terminé en premier - -[MPWITH] -gagne avec $ - -[MPHP05] -~w~5 secondes avant la prochaine cible. - -[MPHP04] -~w~4 secondes avant la prochaine cible. - -[MPHP03] -~w~3 secondes avant la prochaine cible. - -[MPHP02] -~w~2 secondes avant la prochaine cible. - -[MPHP01] -~w~1 seconde avant la prochaine cible. - -[RCRANGE] -~w~Hors de portée ! - -[CAD5_AA] -Ici Sal. - -[CAD5_AB] -Ces Forelli m'ont vraiment foutu en rogne ! Ils vont le payer ! - -[CAD5_AC] -Je veux que tu prennes leurs plus belles caisses... - -[CAD5_AD] -... et que tu les apportes à leurs plus gros concurrents, dans le magasin de voitures des Sindacco. - -[CAD5_AE] -Débrouille-toi pour que les Forelli ne volent pas de voitures Sindacco pour se venger. - -[CAD5_AF] -Capici ? - -[CAD4_AA] -C'est moi, Sal. - -[CAD4_AB] -J'ai une dette envers Franco Forelli et tu vas m'aider à la payer. - -[CAD4_AC] -Ils ont des caisses super classes dans le magasin des Sindacco. - -[CAD4_AD] -Je veux que t'ailles toutes les piquer et que tu les ramènes au magasin des Forelli. - -[CAD4_AE] -Débrouille-toi juste pour qu'aucune voiture Forelli ne se fasse voler pendant que t'es là-bas. - -[CAD4_AF] -Hé, te plante pas sur ce coup-là. - -[MPC_000] -Toni - -[MPC_001] -'Lionel' - -[MPC_002] -Cipriani - -[MPC_003] -Chauffeur - -[MPC_004] -13e - -[MPC_005] -Toni the Tux - -[MPC_006] -Fury - -[MPC_007] -The King - -[MPC_008] -Cocks - -[MPC_009] -Streak - -[MPC_010] -'T' - -[MPC_011] -Dragon - -[MPC_012] -J.D. - -[MPC_013] -La Crampe - -[MPC_014] -Avery - -[MPC_015] -Choc-Choc - -[MPC_016] -8-Ball - -[MPC_017] -Maria - -[MPC_018] -'Hamfists' - -[MPC_021] -No 1 - -[MPC_023] -Hung Lo - -[MPC_025] -Yamazaki - -[MPC_031] -Officier '69' - -[MPC_032] -Le Spécialiste - -[MPC_034] -G.I. Jones - -[MPC_035] -Sam - -[FEA_FM0] -HEAD RADIO - -[FEA_FM1] -DOUBLE CLEF FM - -[FEA_FM2] -K-JAH - -[FEA_FM3] -RISE FM - -[FEA_FM4] -LIPS 106 - -[FEA_FM5] -RADIO DEL MUNDO - -[FEA_FM6] -MSX 98 - -[FEA_FM7] -FLASHBACK FM - -[FEA_FM8] -THE LIBERTY JAM - -[FEA_FM9] -LCFR - -[MRACELA] -Tour - -[DTB_01] -~w~Défends ta base contre les assaillants. - -[DTB_02] -~w~Protège tes voitures à tout prix. - -[CAD2_AB] -~w~Bonne nouvelle ! Les Forelli et les Sindacco se foutent de nouveau sur la gueule. - -[CAD2_AC] -~w~Ils veulent tous prendre le contrôle des vendeurs de voitures de Liberty. - -[CAD2_AD] -~w~Vu qu'on a 'aidé' les Forelli la semaine dernière... - -[CAD2_AE] -~w~... il est temps de rétablir l'équilibre. - -[CAD2_AF] -~w~Aide les Sindacco à écrémer le magasin de voitures des Forelli. - -[POMOB2A] -~w~Salvatore m'a donné ton numéro... Enfin, je l'ai trouvé dans son carnet d'adresses... Enfin bref... - -[POMOB2B] -~w~T'es son nouveau chien de garde, c'est ça ? Bon, j'ai envie de te promener. - -[POMOB2C] -~w~Je t'attends, alors dépêche ! - -[GS_RGUN] -ARMES DE DEPART : - -[TUSHTK] -AWOL Angel - -[SC_WICH] -Meilleur score AWOL Angel - -[NE_WIFI] -Erreur réseau. L'interrupteur WLAN est désactivé. Activer l'interrupteur WLAN pour jouer en multijoueur. - -[BNDRAC0] -Thrashin' RC - -[BNDRAC1] -Ragin' RC - -[BNDRAC2] -Chasin' RC - -[GS_G1] -LIBERTY CITY SURVIVOR - -[GS_G2] -STREET RAGE - -[GS_G3] -PROTECTION RACKET - -[GS_G4] -GET STRETCH - -[GS_G5] -TANKS FOR THE MEMORIES - -[GS_G6] -THE HIT LIST - -[GS_G7] -THE WEDDING LIST - -[TRCR1] -~w~3 - -[TRCR2] -~w~2 - -[TRCR3] -~w~1 - -[TRCRGO] -~w~GO ! - -[GA_16] -~w~La peinture est offerte. - -[NEW_TAX] -~w~Mission Taxi terminée ! Un nouveau modèle de taxi vient d'être livré au garage de taxis à Trenton ! - -[EXPO_2] -~w~Si tu leurs fournis les véhicules dont ils ont besoin en bonne condition, tu seras largement récompensé. - -[FEMP_NC] -Etablissement des connexions réseau... - -[C1TGSUB] -touche R3 - -[C2TGSUB] -touche R3 - -[C3TGSUB] -~S~ - -[C2VEHN] -touche R1 - -[C2VECRS] -touche L3 - -[C3VECRS] -~O~ - -[C2PDCWE] -touche L2 et touche R2 - -[C3PDCWE] -touche L2 et touche R2 - -[BENZ_LA] -~w~La ~h~tenue d'avocat~w~ est disponible dans la planque. - -[BENZ_TR] -~w~Ta ~h~tenue décontractée~w~ est disponible dans la planque. - -[SLH1_OU] -~w~Il te faut une ~h~tenue d'avocat~w~ pour entrer voir Sal. - -[SLH1_OR] -~w~Il te faut une tenue d'avocat pour voir Sal. - -[L_TRN_1] -~w~Tu peux prendre le ~h~métro aérien~w~ pour te déplacer dans Portland. Appuie sur~h~ ~k~ ~VEEE~ ~w~pour monter ou descendre d'une rame. - -[HELP2] -~w~Appuie sur~h~ ~k~ ~PDSPR~ ~w~en courant pour ~h~commencer à sprinter. - -[STMOB5A] -~w~Toni, c'est Sal. - -[SCH_TK7] -~r~T'as quitté la casse. - -[STMOB3C] -~w~Mais on va prendre le contrôle de la mairie. - -[SALH3A] -~w~Cherche un moyen de transport pour Donald. - -[MPCASH] -Argent - -[MPCARS] -Caisses - -[CRUSHED] -Valeur de la ferraille : ~1~$ - -[BENZ_BO] -~w~Va récupérer des ~h~sous-vêtements~w~ propres dans la planque. - -[BENZ_EL] -~w~La ~h~combi 'The King'~w~ est dispo dans ta planque. - -[BENZ_CO] -~w~Un ~h~costume de mascotte~w~ est dispo dans ta planque. - -[BENZ_HE] -~w~Missions Avenging Angel : Shoreside - niveau 15 terminé ! Le ~h~costume de super-héros~w~ est dispo dans ta planque. - -[BENZ_DR] -~w~La ~h~combi 'Dragon'~w~ est dispo dans ta planque. - -[TRTIT] -Wong Side Of The Tracks - -[TRRACE2] -~w~Fais gaffe ! Les frères Wong ont pas l'air cool... - -[MPTOTAL] -Total - -[TOUR_W6] -~w~Landstalker blindé livré à la planque. Abrite-le dans ton garage ! - -[OUTFITS] -Tenues débloquées - -[MPHPMAR] -est la nouvelle cible. - -[FEC_CWT] -Parcourir armes/cibles - -[EXPO_1] -~w~Love Media a besoin de prix à distribuer pour ses concours 'Car-razy Car Give Away' ! - -[PCJLAP] -~w~Nouveau record au tour de ~1~ secondes ! - -[MPBLCAR] -Voiture bleue : - -[MPRDCAR] -Voiture rouge : - -[RAMP_A] -~w~T'AS REUSSI TOUS LES RODEOS ! ~1~$ - -[FET_SAV] -Sauvegarder - -[FET_WRN] -Attention ! Un ou plusieurs codes ont été activés. Cela risque d'affecter la sauvegarde. Il est recommandé de ne pas sauvegarder cette partie. - -[HELP39] -~w~Utilise~h~ ~k~ ~VEWEI~ ~w~pour déplacer ton poids sur une moto. +[HORN3] +Appuie sur la ~h~~k~~VEHICLE_HORN~ ~w~pour ~h~klaxonner. [FEC_EXV] -Descendre du véhicule +Monter et descendre d'un véhicule -[MPCOLL] -NB DE CAISSES : +[TAXI_M] +'CHAUFFEUR DE TAXI' -[FEMP_HG] -HEBERGER +[COP_M] +'AUTODEFENSE' -[FEMP_JG] -REJOINDRE +[FIRE_M] +'POMPIER' -[K_TK3] -~w~1 point pour les ~g~verts~w~, 2 points pour les ~y~jaunes~w~, et 3 points pour les ~r~rouges. +[AMBUL_M] +'AMBULANCE' -[FEMP_GJ] -CHOISIR UNE PARTIE A REJOINDRE +[HJ_IS] +BONUS DE CASCADE DANGEREUSE : $~1~ -[FEMP_H] -HOTE : +[HJ_PIS] +BONUS DE CASCADE DANGEREUSE PARFAITE : $~1~ -[FEMP_P] -JOUEURS : +[HJ_DIS] +BONUS DE DOUBLE CASCADE DANGEREUSE : $~1~ -[FEMP_HN] -HEBERGER UNE NOUVELLE PARTIE +[HJ_PDIS] +BONUS DE DOUBLE CASCADE DANGEREUSE PARFAITE : $~1~ -[PO_MOB4] -~w~Hé ! C'est moi, Vincenzo. +[HJ_TIS] +BONUS DE TRIPLE CASCADE DANGEREUSE : $~1~ -[POMOB4D] -~w~Allez, passe me voir, j'ai un truc pour toi. +[HJ_PTIS] +BONUS DE TRIPLE CASCADE DANGEREUSE PARFAITE : $~1~ -[POMOB4E] -~w~Ah ouais ? C'est quoi ? Des baskets en béton armé ? +[HJ_QIS] +BONUS DE QUADRUPLE CASCADE DANGEREUSE : $~1~ -[POMOB4H] -~w~Non. Allez, Toni, quoi ! J'regrette ce qui s'est passé. +[HJ_PQIS] +BONUS DE QUADRUPLE CASCADE DANGEREUSE PARFAITE : $~1~ -[FEMP_F] -COMPLET +[FESZ_LS] +Chargement effectué. -[FEMP_R] -PAR DEFAUT +[HELI_1A] +Teste tes capacités avec le Sparrow et vois en combien de temps tu peux réussir le parcours. -[YOU] -TOI +[HELI_1B] +Parcours réussi! -[NE_POW] -Une erreur réseau est survenue. L'interrupteur POWER/HOLD (alimentation/bloquer) a été désactivé. +[HELIODD] +Petits boulots en hélico -[FEMP_SQ] -Tu veux vraiment lancer une partie multijoueur ? +[INT2_M] +Ils sont proprios d'une ferme au Panama! -[BIKETXT] -~w~Hogs & Cogs ouvre de 8h à 18h. Reviens à ce moment-là ! +[INT2_N] +Ok, écoutez un peu... -[RACE_2] -Temps +[INT2_O] +Les gars, quand on sera là-bas, est-ce que je dois rester dans la bagnole, -[FEF_CO2] -Choisis la configuration de commandes qui convient le mieux à ton style. +[INT2_P] +où bien est-ce que vous voulez absolument que je vienne avec vous? -[TYREPOP] -Pneus éclatés par balle +[INT2_Q] +Non, Reste dans la bagnole. -[FE_INIP] -Initialisation et chargement du menu Pause... Un instant... +[INT2_R] +Vous savez quoi, j'ai réfléchi à la question, -[DON4EX3] -~w~Tu prends les chèques ? +[INT2_S] +Je vais surveiller la bagnole. -[CRUSH] -~w~Gagne de l'argent avec de la ferraille ! Certains types de véhicules seront broyés si tu les laisses dans la zone délimitée par des pneus. +[INT4_A] +On est baisés! Baisés! -[ANG_15] -~w~Un groupe de débiles vient de voler la voiture d'un pauvre mec... On va se les faire ! +[INT4_B] +Putain, c'est vraiment le coup classique! -[CDERROR] -Veuillez patienter... +[INT4_C] +Je sors la tête d'un caniveau pour une seconde de défonce, -[FEC_LOF] -Regarder Devant +[INT4_D] +et le destin me chie de la merde plein la gueule! -[FEC_LFA] -Caméra/Visée précise +[INT4_E] +Allez vous faire mettre! -[MPHELP] -AIDE +[INT4_F] +Ferme-la et arrêter de gueuler! T'es encore vivant, pas vrai? -[C1VEHN] -touche L1 +[INT4_G] +Laisse-moi là. -[C3VEHN] -touche L3 +[INT4_H] +Débarrasse-toi de la caisse et va roupiller un bon coup. -[MPOBJ] -OBJECTIF : +[INT4_I] +Je passerai à ton bureau demain et on essayera de trouver une solution à ce merdier. -[MPLEG] -LEGENDE DU RADAR : +[INT4_J] +Ouais, bonne idée, je vais aller roupiller. -[GS_O1] -Chacun pour soi ! Tue les autres joueurs ! +[INT4_K] +Qu'est-ce que tu vas faire? -[GS_O2] -Conduis à travers les points de passage pour passer la ligne d'arrivée en premier. +[INT4_L] +Rentrer à mon hôtel. -[GS_OD3] -Défends les quatre limousines dans ta base contre tes assaillants. +[INT4_M] +Et penser à autre chose que ces conneries. -[GS_O6] -Tue le joueur 'cible' aussi vite que possible. Si tu es la 'cible', survis aussi longtemps que possible. +[INT4_N] +Ok. -[GS_O7] -Récupère les voitures aux quatre coins de la ville et conduis-les jusqu'aux conteneurs. +[LAW] +MISSIONS AVOCAT -[FHOSE_2] -~h~~k~ ~VEWEA~ ~w~permet d'ajuster la visée du canon. +[LAW1_1] +~g~Va te procurer de nouvelles fringues à la boutique de Rafael. -[MPI01] -BONUS +[LAW4_6] +Brûlez la direction! -[MPI02] -SANTE +[LAW4_7] +Tuez les patrons! -[MPI03] -PROTECTION +[LAW4_8] +Allez! Battez-vous! Allez! -[MPI04] -ARME +[LAW4_9] +Plus de vacances! Moins de travail! -[SPIDER] -Deimos SP +[LAW4_11] +Allez! Battez-vous! Allez! -[PONTIAC] -Phobos Vt +[LAW4_12] +Viva la revolucion! -[FORELLI] -Forelli ExSess +[GENERAL] +MISSIONS DU COLONEL -[AHIT_LO] -Tu l'as peut-être semé pour le moment mais tôt ou tard, il reviendra finir son job. +[GEN3_4] +Tommy Vercetti. Allons-y... -[FEM_ROF] -Radio éteinte +[GEN3_13] +C'est quoi ton problème, mec? Monte sur le toit de l'autre côté de la cour avant qu'ils rappliquent! -[GA_1] -~w~Tu veux rire ! Je touche pas à ça, moi ! +[GEN3_17] +Meeeerde! T'essayes de m'buter ou quoi? -[TRA_NEX] -Prochain arrêt : +[GEN3_21] +~g~Il a le pognon de Diaz! Attrape-le et récupère le fric! -[TRA_CUR] -Arrêt actuel : +[GEN3_24] +~r~Diaz est mort! Tu devais le protéger! -[PAGEB2] -~w~Le ~h~fusil à pompe~w~ est dispo dans ta planque ! +[GEN3_26] +~r~T'as flingué Diaz! -[PAGEB3] -~w~Une ~h~protection pare-balles~w~ est dispo dans ta planque ! +[GEN3_27] +~r~T'as descendu les gardes du corps de Diaz! -[PAGEB4] -~w~La ~h~mitraillette~w~ est dispo dans ta planque ! +[GEN3_31] +~g~Va au rencart et veille sur Diaz. -[PAGEB5] -~w~Le ~h~.357~w~ est dispo dans ta planque ! +[GEN3_32] +~g~Va te mettre en position sur le toit du bâtiment en face de Lance. -[PAGEB6] -~w~Le ~h~M4~w~ est dispo dans ta planque ! +[COKE] +MISSIONS BARON DE LA COKE -[PAGEB7] -~w~Le ~h~fusil de précision à visée laser~w~ est dispo dans ta planque ! +[COK1_3] +J'espère que tu vas te casser la gueule! -[PAGEB8] -~w~Le ~h~lance-flammes~w~ est dispo dans ta planque ! +[COK1_6] +J'en ai marre de ces merdeux. -[PAGEB9] -~w~Le ~h~lance-roquettes~w~ est dispo dans ta planque ! +[COK2_7] +Tu vois ces marqueurs? Essaye de flinguer les lumières! -[PAGE_01] -Abats ~1~ mecs des Triades en 2 minutes ! +[COK2_10] +En tout cas, tu tires mieux que tu causes. -[PAGE_02] -Fais exploser ~1~ véhicules en 2 minutes ! +[COK2_11] +Merci. T'as un certain charme aussi. -[PAGE_03] -Brûle ~1~ Diablos en 2 minutes ! +[COK2_12] +Je sais, Tommy. -[PAGE_04] -Bute ~1~ mafieux de Leone en 2 minutes ! +[COK2_18] +T'aimes bien Kenny Loggins? -[PAGE_05] -Crame ~1~ véhicules en 2 minutes ! +[COK2_19] +Tu parles, j'adore ce disque ouais! -[PAGE_06] -Ecrase ~1~ piétons en 2 minutes ! +[COK2_26] +~r~T'as buté Lance! -[PAGE_07] -Détruis ~1~ véhicules en 2 minutes ! +[COK3_1] +Tire pas, mec! -[PAGE_08] -Massacre ~1~ piétons en 2 minutes ! +[COK3_2] +Qu'est-ce que c'est que ça? -[PAGE_09] -Brûle ~1~ Yakuzas en 2 minutes ! +[COK3_3] +Il embarque le bateau! Merde! -[PAGE_10] -Descends ~1~ gangsters de Forelli en 2 minutes ! +[COK3_4] +A l'aide! Il y a un mec qui nous fauche le bateau! -[PAGE_11] -Ecrase ~1~ piétons en 2 minutes ! +[COK4_W] +Bon! C'est le dernier. -[PAGE_12] -Descends ~1~ piétons en 2 minutes ! +[COK4_X] +Je vais mettre le moteur en route. -[PAGE_13] -Tue ~1~ Yakuzas en 2 minutes ! +[COK4_Y] +Je crois qu'on a de la visite... -[PAGE_15] -Massacre ~1~ piétons en 2 minutes ! +[COK4_2] +Ouais. -[PAGE_16] -Pulvérise ~1~ véhicules en 2 minutes ! +[COK4_6] +Tu sais où on va? -[PAGE_17] -Tire sur ~1~ piétons en 2 minutes ! +[COK4_7] +On est paumés? -[PAGE_18] -Détruis ~1~ véhicules en 2 minutes ! +[COK4_8] +On a de la concurrence! -[PAGE_20] -Crame ~1~ piétons en 2 minutes ! +[COK4_9] +Bousille-les! -[MPI05] -ENNEMI +[COK4_9A] +L'heure de la danse de Lance Vance a sonné! -[MPI07] -PT DE PASSAGE +[COK4_10] +Réduits en miettes! Bons à nourrir la poiscaille! -[MPI08] -SUIVANT +[COK4_11] +On a réussi! Les autres bateaux ne sont pas de taille. -[MPI09] -LIGNE D'ARRIVEE +[COK4_17] +Ils sont prêts à tout! -[MPI10] -PILOTE +[COK4_18] +J'ai les pieds mouillés! On prend la flotte! -[MPI11] -BASE +[COK4_21] +Pont droit devant! -[MPI12] -BASE ENNEMIE +[COK4_22] +Ecope, on va chavirer! -[MPI13] -BLINDE +[COK4_23] +Joli coup. -[MPI14] -CIBLE HUMAINE +[COK4_29] +~r~T'as buté Lance! -[MPI15] -CAISSE +[ASS1_6] +Continue, Tommy, ça va aller! -[MPI16] -CONTENEUR +[ASS1_7] +Prenez ça, enculés d'assassins! -[FEI_LEG] -Afficher/masquer légende +[ASS1_8] +Je suis coincé! -[SR_ON] -Maintenant que tu t'es fait un nom dans le monde des courses sur circuit, attends-toi à te faire contacter par d'autres pilotes. +[ASS1_9] +Je te couvre, Tommy! -[FEC_FRA] -Visée libre +[ASS1_10] +Hé, c'est chouette toutes ces plantes... -[KAR_ON] -Retourne au camion de pompiers quand tu veux pour essayer de battre ton meilleur temps ! +[ASS1_11] +Hé, Tommy, je peux avoir une chambre avec vue sur la baie? -[DON2EX5] -~w~8-ball bougera pas le petit doigt à moins que tu lui files 20000$. +[ASS1_12] +Il y a vraiment de superbes plafonds, ici... -[PCJTIT] -GO GO Faggio +[ASS1_3] +Lance! Couvre-moi! -[FEA_MUS] -VOLUME RADIO : +[ASS1_5] +Lance! -[FEST_GO] -Meilleur temps Go Go Faggio +[ASS1_15] +~g~Attaque la résidence et tue Diaz! -[RC_1] -~w~Bute plus de ~1~ mecs des Triades. Chaque victime te rapporte du temps en plus ! +[ASS1_17] +~g~Il existe de nombreux accès à la résidence. -[EXPO_C] -~w~Merci ! C'était le dernier ! Y a un super bonus qui t'attend devant ton appart de Newport ! +[TAXWAR] +MISSIONS GUERRE DES TAXIS -[TRRACE0] -~w~Franchis les ~y~points de passage~w~ et passe la ligne d'arrivée en vie ! +[NOTAXI] +~g~T'as besoin d'un taxi Kaufman pour activer cette mission. -[RACE_P1] -~w~1er +[TAXW1_5] +~g~Faut que tu sois dans un taxi Kaufman! -[RACE_P2] -~w~2e +[TAX2_4] +Vas-y, Tommy. -[RACE_P3] -~w~3e +[TAX2_5] +Massacre-lui la tête. -[RACE_P4] -~w~4e +[TAX2_6] +Il a même pas son permis. -[OUTF_00] -~w~Tenue décontractée +[TAX2_7] +Putain de limousines! -[OUTF_01] -~w~Costume Leone +[TAXW3_1] +~g~Va prendre Mercedes. -[OUTF_03] -~w~Treillis des Avenging Angels +[RACE1] +~g~3..2..1.. PARTEZ! -[OUTF_04] -~w~Uniforme de chauffeur +[RACE2] +~g~3 -[OUTF_05] -~w~Tenue d'avocat +[RACE3] +~g~2 -[OUTF_06] -~w~Smoking +[RACE4] +~g~1 -[OUTF_07] -~w~Combi 'The King' +[RACE5] +~g~PARTEZ! -[OUTF_08] -~w~Costume de mascotte +[FIRST] +~b~1er -[OUTF_09] -~w~Sous-vêtements +[SECOND] +~b~2e -[OUTF_10] -~w~Costume de super-héros +[THIRD] +~b~3e -[OUTF_11] -~w~Combi 'Dragon' +[FOURTH] +~b~4e -[SLTVMON] -Cash gagné sur Slash TV +[RACETM] +~b~TEMPS DE COURSE : ~1~:~1~ -[DBIKEAI] -Plus haut saut (m) +[RACETM2] +~b~TEMPS DE COURSE : ~1~:0~1~ -[MPC_039] -Vincenzo +[RACEFA] +~r~Tu n'as pas gagné la course! -[MPC_040] -Salvatore +[TEX1_5] +~r~Il s'est tiré! -[MPC_041] -Toshi +[SEG3_1] +TEMPS: -[MPC_042] -Toshiko +[SEG3_2] +~g~Va à la camionnette qui contient le bombardier télécommandé et les bombes à retardement. -[MPC_043] -Ophelia Lardaz +[SEG3_3] +~g~Utilise le bombardier télécommandé pour transporter 4 bombes vers 4 zones cibles sur le chantier. -[MPC_044] -Ed Banger +[SERG3_5] +~g~Tu ne peux transporter qu'une bombe à la fois et tu ne peux récupérer une bombe déjà larguée avec succès. -[MPC_045] -Robin Emblind +[SEG3_7] +~g~Une fois que tu as largué la première bombe sur une zone cible, le compte à rebours s'enclenche. Tu dois larguer toutes les bombes avant la fin de celui-ci. -[MPC_046] -Mme Menalot +[SEG3_8] +~g~Les 4 bombes doivent être larguées sur les 4 zones cibles pour réussir la mission et détruire le bâtiment. -[MPC_047] -Hugh Jazz +[SEG3_9] +~g~Tu as touché la cible! Plus que 3! -[MPC_048] -Wayne +[SEG3_10] +~g~Tu as touché la cible! Plus que 2! -[MPC_049] -Paulie +[SEG3_11] +~g~Tu as touché la cible! Plus qu'une! -[MPC_050] -Anne Job +[SEG3_12] +~r~Tu as raté la cible! Va récupérer une bombe! -[MPC_051] -Randy Boner +[SEG3_13] +~g~Largue la bombe sur une zone cible. -[MPC_052] -Owen Monie +[SEG3_14] +~r~Le temps est écoulé et tu n'as pu détruire le bâtiment. -[MPC_053] -Ekant Sing +[SEG3_15] +~r~Ton bombardier télécommandé a été détruit! Comment tu vas transporter les bombes, maintenant? -[MPC_054] -M.T.Head +[AVERY] +MISSIONS AVERY -[MPC_055] -Rick O'Shea +[ASM] +MISSIONS ASSASSIN -[MPC_056] -Arden Long +[ASM_1] +MISSION ASSASSIN 1 -[MPC_057] -Ann Thrax +[ASM1_1] +~g~Ton aide dans l'éradication de ces indésirables fut une excellente affaire. J'ai un autre travail pour toi. Regarde sous le téléphone. -[MPC_058] -Fay Slift +[ASM1_2] +~g~Rends-toi à la cabine en dehors du centre commercial à Washington. -[MPC_059] -Mona Lott +[ASM1_3] +~g~Carl Pearson, livreur de pizzas. Il ne doit pas terminer sa tournée. -[C0VEACC] -~X~ +[ASM1_4] +~g~Tue le livreur de pizzas avant qu'il le livre toutes ses pizzas. -[C1VEACC] -~X~ +[ASM_2] +MISSION ASSASSIN 2 -[C2VEACC] -~X~ +[ASM_3] +MISSION ASSASSIN 3 -[C3VEACC] -joystick analogique droit vers le haut +[ASM3_A] +Marcus Hammond, Franco Carter, Dick Tanner, Nick Kong et Stuntman Driver appartiennent tous au syndicat européen qui s'apprête à faire un hold-up. -[C0VEBRK] -~S~ +[ASM3_B] +Ils sont tous en position. Il faut qu'ils soient tous morts avant le commencement. Tu as 9 minutes. J'ai laissé quelques flingues à proximité qui devraient t'être utiles. -[C1VEBRK] -~S~ +[ASM3_1] +~g~Va récupérer l'arme que M. Black a laissé pour toi. -[C2VEBRK] -~S~ +[ASM3_2] +~g~Ne t'approche pas trop près de la cible ou tu risques d'être repéré. -[C3VEBRK] -joystick analogique droit vers le bas +[ASM3_3] +~g~Pour un travail propre et rapide, installe-toi près de leurs positions dans des emplacements d'où tu pourras facilement les liquider, sans être repéré. -[C0VEHB] -touche R1 +[ASM3_4] +~g~Il t'a vu! Vaudrait mieux le buter en vitesse, maintenant! -[C1VEHB] -touche R1 +[ASM3_5] +~g~Marcus Hammond est en position près des panneaux publicitaires dans Washington. -[C0VEEE] -~T~ +[ASM3_6] +~g~Franco Carter est en position à côté de DBP Security non loin d'Ocean Drive. -[C1VEEE] -~T~ +[ASM3_7] +~g~Dick Tanner est en position à côté de la bijouterie dans Vice Point. -[C2VEEE] -touche L1 +[ASM3_8] +~g~Nick Kong est en position près de Washington Beach. -[C3VEEE] -touche R1 +[ASM3_9] +~g~Stuntman Driver est en position à Washington. -[C0VEWEP] -~O~ +[ASM3_10] +~r~Tu n'as pas réussi à tous les descendre. -[C1VEWEP] -~O~ +[ASM_4] +MISSION ASSASSIN 4 -[C2VEWEP] -~O~ +[ASM4_1] +~g~Va récupérer le fusil laissé à ton intention dans le feuillage à l'extérieur du terminal de l'aéroport. -[C3VEWEP] -~O~ +[ASM4_2] +~g~Ne rate pas la cible où tu alerteras ses gardes du corps et garde tes distances pour qu'il ne te repère pas. -[C0PDSPR] -~X~ +[ASM4_3] +~g~Observe la femme sur le balcon au-dessus des comptoirs d'enregistrements du terminal. NE LA TUE PAS. -[C1PDSPR] -~X~ +[ASM4_4] +~g~Tue l'homme à qui elle donnera la serviette, mais seulement quand il l'aura récupérée. Prends ensuite la serviette et amène-la à Ammu-Nation dans le centre. -[C0SNZI] -~S~ +[ASM4_5] +~g~Récupère la serviette! -[C1SNZI] -~S~ +[ASM4_6] +~g~Amène la serviette à Ammu-Nation dans le centre! -[C0SNZO] -~X~ +[ASM4_7] +~r~Imbécile! Tu as tué la femme! -[C1SNZO] -~X~ +[ASM4_8] +~r~La cible t'a entendu tirer! Le deal est annulé! -[C0PDFW] -~O~ +[ASM4_9] +~r~La cible a embarqué à bord de son avion! -[C1PDFW] -~O~ +[ASM4_10] +~r~On dirait que tu n'es pas le seul à t'intéresser à cette serviette! Amène-la en vitesse à Ammu-Nation! -[C0TRSK] -~X~ +[ASM4_11] +~r~La cible t'a repéré! Le deal est annulé! -[C1TRSK] -~X~ +[ASM4_13] +~g~Il t'a repéré et essaye de s'enfuir! Rattrape-le et récupère la serviette! -[C2TRSK] -~X~ +[ASM4_14] +~g~La barre de distance dans le coin supérieur droit de l'écran te signale ta proximité avec la cible. Ne la laisse pas devenir pleine ou il te repèrera. -[C3TRSK] -~X~ +[ASM_5] +MISSION ASSASSIN 5 -[C0AMBUY] -~X~ +[KICK] +DEMARRAGE AU PIED -[C1AMBUY] -~X~ +[KICK1_3] +~g~Nombre de fautes de pied : ~1~ -[C2AMBUY] -~X~ +[KICK1_4] +~g~Pénalité de temps : ~1~ secondes -[C3AMBUY] -~X~ +[BANK] +MISSIONS BRAQUAGE -[C0AMEXI] -~T~ +[BANK1] +MISSION BRAQUAGE 1 -[C1AMEXI] -~T~ +[BANK2] +MISSION BRAQUAGE 2 -[C2AMEXI] -~T~ +[BJM2_3] +TAUX DE REUSSITE : ~1~% -[C3AMEXI] -~T~ +[BJM2_15] +SCORE : -[C2PDSPR] -~O~ +[BJM2_18] +SCORE A BATTRE : -[C3PDSPR] -~X~ +[BJM2_19] +~g~Touche autant de cibles que possible dans le temps imparti! -[C2SNZI] -~T~ +[BJM2_21] +~g~Touche autant de cibles que possible jusqu'à épuisement de tes munitions. -[C3SNZI] -~S~ +[BANK3] +MISSION BRAQUAGE 3 -[C2SNZO] -~S~ +[BJM3_1] +~g~Trouve une bagnole qui a des chevaux et rends-toi sur la grille de départ. -[C3SNZO] -~X~ +[BNK4_2A] +Les gars au garage ont fait du super boulot sur ce bébé. -[C2PDFW] -~X~ +[BNK4_3G] +Oh, merde, maintenant, on a les flics au cul! -[C3PDFW] -touche R1 +[BNK4_3H] +Et on n'est même pas encore sur place... -[MPC_020] -Rico Garlik +[BNK4_3K] +Va d'abord falloir semer les flics... -[MPC_022] -Lou Scannon +[BNK4_3L] +Merde, Tommy, t'essayes de tous nous tuer? -[MPC_024] -Cruz Vormen +[BNK4_3N] +Tout ce que j'aime part en fumée! -[MPC_026] -Busta Moves +[BNK422A] +Cam, combien de temps? -[MPC_027] -Juan Kerr +[BK4_23A] +Donne-moi 3 minutes! -[MPC_028] -Nick Yakar +[BNK4_26] +Bordel de merde! Les voilà! -[MPC_029] -Lou Bricant +[BNK4_32] +Sers-toi des explosifs pour ouvrir les coffres! -[MPC_030] -Lance Urwell +[BNK4_43] +Je nous couvre, FONCE! -[MPC_033] -Agent Ochre +[BNK4_51] +Je te trouve très bien comme ça. -[MPC_036] -Papi Love +[KENT] +MISSIONS KENT PAUL -[MPC_037] -Lucy Lastic +[KENT1] +MISSION KENT PAUL 1 -[MPC_038] -Bill Durzbum +[COUNT] +MISSIONS CONTREFACON -[MPISCOL] -Objet ramassé +[COUNT1] +MISSION CONTREFACON 1 -[MPSTART] -La partie se lance... +[COUNT2] +MISSION CONTREFACON 2 -[MRACEC1] -~w~3... +[BIKE] +MISSIONS BIKERS -[MRACEC2] -~w~2... +[BIKE1] +MISSION BIKERS 1 -[MRACEC3] -~w~1... +[BIKE2] +MISSION BIKERS 2 -[MPC_019] -Phil DeGirth +[BIKE3] +MISSION BIKERS 3 -[GDA_HL] -Mission Avenging Angel (niveau max.) +[GOAWAY1] +Reviens quand tu auras fini les missions du gang haïtien. -[MP_SNEW] -Charger ou lancer une nouvelle partie Solo ou Multijoueur. +[HAIT] +MISSIONS GANG HAITIEN -[DON2EX9] -~r~Ned~w~ s'échappe ! Ne le perds pas de vue ! +[HAIT1] +MISSION GANG HAITIEN 1 -[FEI_CHA] -Changer d'équipe +[HAIT2] +MISSION GANG HAITIEN 2 -[FES_RES] -RETABLIR PARAMETRES DE JEU +[HAIT3] +MISSION GANG HAITIEN 3 -[FESZ_QT] -Rétablir tous les paramètres des commandes, de l'audio et de l'affichage ? Continuer ? +[HAM3_6] +~g~Utilise le fusil à lunette que je t'ai donné pour les tuer! -[FEH_LOA] -JEU +[ROCK] +MISSIONS GROUPE DE ROCK -[MPEMPTY] -Vide +[ROK1_4] +~g~Ok, je crois que c'est ce que vous vouliez... -[FEMP_SN] -LANCER PARTIE (2 joueurs minimum) +[ROK1_1E] +~g~Ca te coûtera plus que ce que tu as! -[JD_SUIT] -~w~J.D. peut pas te filer de boulot tant que t'es habillé en Leone ! +[ROK1_1F] +~g~Reviens quand tu auras le pognon! -[SAVD_SH] -(planque). +[RBM2_6] +~g~Waou! C'est un mec! Arrête-le! -[SAVD_DY] -Jour +[ROCK3] +MISSION GROUPE DE ROCK 3 -[SAVD_CO] -accompli(s). +[ROK3_6D] +~r~en même temps que vos sales grosses têtes chevelues! -[SAVD_AL] -Portland (planque). Jour 71, 57640$. 17% accompli(s). +[ROK3_40] +Près de la glacière? -[SAV_SLT] -Nouvelle sauvegarde +[RBM3_5] +~g~Emmène les Love Fist au concert. -[POMOB6C] -~w~Amène-toi dès que tu peux ! J'ai du boulot pour toi. +[CUBANM] +MISSIONS GANG CUBAIN -[ANG_2] -~w~Appuie sur~h~ ~k~ ~TGSUB~ ~w~pour activer ou désactiver les missions Avenging Angels. +[CUBAN1] +MISSION GANG CUBAIN 1 -[TVHELP] -~w~Appuie sur~h~ ~k~ ~TGSUB~ ~w~pour activer ou désactiver les missions SLASH TV. +[CUBAN2] +MISSION GANG CUBAIN 2 -[PAGERA] -~w~Le ~h~M60~w~ est dispo dans ta planque ! +[CUB2_10] +~r~T'es supposé tuer des Haïtiens, pas des Cubains! -[CO_ALL] -~w~Tu as retrouvé tous les paquets ! +[CUBAN3] +MISSION GANG CUBAIN 3 -[CO_ONE] -~w~Paquet ~1~ sur ~1~ trouvé ! +[CUBAN4] +MISSION GANG CUBAIN 40 -[PAGE_14] -Explose ~1~ gangsters colombiens en 2 minutes ! +[CUB4_25] +Ok, allons-y! -[PAGE_19] -Ecrase ~1~ gangsters colombiens en 2 minutes ! +[PROT] +MISSIONS DE PROTECTION -[ANG_22] -~r~Missions Avenging Angels annulées. +[PRO1_H] +Arrêtez de vous exciter, tous les deux. Je commence à peine à voir comment les choses marchent ici. -[SLATVQO] -~r~Mission Slash TV annulée. +[PRO1_02] +~g~Sors du centre commercial. -[C0FREE1] -touche L3 +[PRO3_06] +~g~Sème les flics. -[C1FREE1] -touche L3 +[PORN] +MISSIONS PORNO -[C2FREE1] -touche L3 +[PORN1] +MISSION PORNO 1 -[C3FREE1] -touche L3 +[POR1_03] +~r~Candy est morte! -[C0FREE2] -joystick analogique gauche +[PORN2] +MISSION PORNO 2 -[C2FREE2] -joystick analogique gauche +[PORN3] +MISSION PORNO 3 -[ANGCOM1] -~w~Missions Avenging Angel : Portland - niveau 15 terminé ! La moto unique "Avenger" t'attend dans ta planque ! +[POR3_18] +T'as été repéré! -[K_CE] -~w~T'as ~1~ seconde pour remonter sur ta ~b~moto ! +[PORN4] +MISSION PORNO 4 -[HELP31] -~w~Si tu te fais ~h~arrêter~w~ ou ~h~buter~w~ lors d'une mission, ce ~h~taxi~w~ fera son apparition. +[POR4_04] +~g~Les bureaux se trouvent de l'autre côté de cette porte. -[LOSER] -~y~PERDANT ! +[PHIL] +MISSIONS PHIL -[RCRHELP] -~w~Appuie sur~h~ ~k~ ~TGSUB~ ~w~pour ~h~quitter la course~w~. Appuie sur~h~ ~k~ ~VEWEP~ ~w~pour faire réapparaître ta voiture radiocommandée au dernier point de passage. +[PHIL1] +MISSION PHIL 1 -[SRC_ON] -Maintenant que tu t'es fait un nom dans le milieu underground des courses de voitures, des challengers essaieront de te contacter. +[PHI1_06] +Qu'est-ce que tu fous à conduire comme ça? -[SRB_ON] -Maintenant que tu t'es fait un nom dans le milieu underground des courses de motos, des challengers essaieront de te contacter. +[PHI1_07] +Hé! -[RACE_R0] -~w~RECORD PRECEDENT : ~1~:~1~~1~ - -[POMOB3C] -~w~Hé, passe me voir, un de ces quatre, OK ? - -[MPHPCS1] -The Hit List - -[MPWLGOC] -Descends de la voiture. - -[MPWLLTC] -Quitte le conteneur. - -[MPWLDTC] -Livre la voiture. - -[MPWLCD] -Voiture livrée. - -[MPWLNGC] -Maintenant, récupère les voitures. - -[MPAUTO] -LIRE UNE FOIS - -[MRACEGO] -~w~GO - -[MRACE04] -TU AS GAGNE - -[MRACEWI] -a gagné la course - -[MRCPU01] -~y~REPARATION INSTANTANEE - -[DTB01] -- Protège les voitures - -[DTB02] -- Détruis les voitures - -[DTB03] -- Voiture perdue - -[DTB04] -- Voiture détruite - -[MPWIN] -gagne - -[MPKSELF] -s'est fait tuer - -[MPMORE] -victimes de plus - -[MP1MORE] -victime de plus - -[MPSTRT] -COMMENCE - -[MPTANK] -a le blindé - -[MPONE] -n'a qu'une seule caisse à récupérer - -[MPDEL] -a livré une caisse - -[MPGOCAR] -Va chercher la caisse - -[MPGOGAR] -Livre la caisse - -[MPDEST] -Véhicule cible détruit - -[MPLEFT] -a quitté la partie - -[MPHPGO2] -~w~Tu es la nouvelle cible. - -[MPHPKI] -~w~Tu as tué un assassin. - -[LOCKON] -Danger ! - -[MPHPGO] -~w~Elimine la cible. - -[MPTNK] -Récupère le blindé - -[MRCPU02] -TU AS ECLATE LES PNEUS DE TOUT LE MONDE - -[MRCPU05] -TES PNEUS ONT ECLATE - -[MRCPU06] -~y~PNEUS ADHERENTS - -[WINNER] -~Y~GAGNANT - -[MPDRAW] -~w~EGALITE - -[MPDADDY] -C'EST TOI LE BOSS ! - -[MPRUN] -: CE SONT LES ROIS DE LA VILLE - -[MPBITCH] -C'EST QUI LE BOSS, MAINTENANT ? - -[FEMP_SM] -Joue à Grand Theft Auto avec des potes ou avec des types louches situés pas loin de toi. - -[MPYL] -LOSER ! - -[MPTMWIN] -: LES MEILLEURS, CE SONT EUX ! - -[GS_SCAR] -VEHICULE : - -[GS_MIN] -minute - -[GS_MINS] -minutes - -[MPTNKGA] -T'as le blindé. - -[MPTNKGB] -Alors garde-le. - -[GS_TYPE] -SCENARIO : - -[CLILOST] -La communication avec les autres joueurs a été perdue. - -[ONEHPC] -Terminé à 100 pour cent ! Il y a une petite surprise qui t'attend à Fort Staunton. - -[MPBLTM] -sindacco - -[MPRDTM] -forelli - -[MTN_1] -Sindacco - -[MTN_2] -Forelli - -[MPRDCAP] -Leur voiture a été capturée. - -[MPBLCAP] -Leur voiture a été capturée. - -[MPRDST] -Leur voiture a été volée. - -[MPBLST] -Leur voiture a été volée. - -[MPBLEST] -Leur voiture a été volée. - -[MPRDRET] -Leur voiture a été récupérée. - -[MPBLRET] -Leur voiture a été récupérée. - -[MPRDPOS] -Leur voiture est mal placée. - -[MPBLPOS] -Leur voiture est mal placée. - -[GS_TEAM] -REJOINDRE GANG : - -[FEMP_TS] -REJOINDRE GANG : - -[MPTEAM] -Gang - -[GS_OA3] -Détruis 4 limousines dans la base du gang adverse. - -[GS_O4] -Vole la voiture du gang adverse et ramène-la à ta base, tout en protégeant la caisse de ton gang. - -[MPI06] -MEMBRE DU GANG - -[FEMP_ST] -LANCER (1 joueur ou plus par gang nécessaire) - -[HELP32] -~w~Contre une somme modique (ou gratuitement si tu n'as pas d'argent), il t'emmènera voir ton ~h~contact~w~ pour la dernière mission tentée. - -[BENZ_HO] -La ~h~salopette~w~ est dispo dans la planque. Reviens ici la nuit en la portant pour jouer à SlashTV. - -[SLATXT] -~w~Reviens ici vêtu de la 'salopette' entre 18:00 et 05:00 pour jouer à SlashTV. - -[OUTF_02] -~w~Salopette - -[CAN_CON] -~w~Appuie de nouveau sur~h~ ~k~ ~TGSUB~ ~w~pour annuler la mission. - -[GNG1] -LEONE - -[GNG2] -TRIADES - -[GNG3] -DIABLOS - -[GNG4] -YAKUZAS - -[GNG5] -YARDIES - -[GNG6] -COLOMBIENS - -[GNG7] -HOODS - -[GNG8] -SINDACCO - -[GNG9] -FORELLI - -[GNG0] -SICILIENS - -[MP_GNG1] -GANG 1 : - -[MP_GNG2] -GANG 2 : - -[GS_TEMS] -GUERRE DES GANGS - -[CARS_O] -~w~Si tu veux te faire un peu d'argent de poche, Capital Autos à Harwood cherche de nouveaux vendeurs. - -[CARTXT] -~w~Capital Autos n'est ouvert que de 08:00 à 18:00. Reviens à ce moment-là ! - -[GS_TO1] -Tue le gang adverse ! - -[MPTNEED] -a encore besoin de - -[MPTWIN] -gagnent - -[BADTEAM] -L'un des gangs n'a plus de joueurs. - -[RACELAP] -Tour - -[GS_D1] -REVIVEZ L'EMISSION TELE DEVENUE CULTE ! LE DARWINISME URBAIN EST DE RETOUR. - -[GS_D2] -QUI EST LE MEILLEUR CONDUCTEUR (OU TRICHEUR) ? - -[GS_D3] -PROTEGE TES VOITURES CONTRE LES TRUANDS ET LES VANDALES. - -[GS_D4] -VOLE LA VOITURE DU GANG ADVERSE. MOQUE-TOI D'EUX. - -[GS_D5] -QUI TIENT LE PLUS A RECUPERER CE BLINDE ? - -[GS_D6] -LA CIBLE DOIT ETRE ABATTUE. - -[GS_D7] -RECUPERE DES VOITURES. - -[HELP61] -~w~Lorsque le ~h~triangle est orienté vers le haut~w~, la ~h~cible est au-dessus de toi~w~. Un ~h~carré~w~ indique que la ~h~cible~w~ est à ton niveau. - -[ST_DRWN] -Poissons nourris - -[RACE_T4] -~r~Tu as été disqualifié car tu n'as pas trouvé de voiture. - -[RACE_T5] -~r~Tu as été disqualifié car tu n'as pas trouvé de moto. - -[PCJ600] -PCJ-600 - -[FEC_HBB] -Frein à main :~h~ ~k~ ~VEACC~ ~w~et~h~ ~k~ ~VEBRK~ - -[HJSTAT] -~w~Distance : ~1~,~1~m Hauteur : ~1~,~1~m Saltos : ~1~ Rotation : ~1~° - -[HJSTATW] -~w~Distance : ~1~,~1~m Hauteur : ~1~,~1~m Saltos : ~1~ Rotation : ~1~° Et quel atterrissage ! - -[HJSTATF] -~w~Distance : ~1~ft Hauteur : ~1~ft Saltos : ~1~ Rotation : ~1~° - -[HJSTAWF] -~w~Distance : ~1~ft Hauteur : ~1~ft Saltos : ~1~ Rotation : ~1~° Et quel atterrissage ! - -[MPUNLK] -Nouveau contenu multijoueur débloqué. Nargue les autres joueurs avec tous les trucs déments que t'as débloqués ! - -[MPUNLKA] -Contenu multijoueur intégralement débloqué. Nargue les autres joueurs avec tous les trucs déments que t'as débloqués ! - -[TOUR] -See the Sight Before your Flight - -[NDL1_A] -Noodle Punk +[PHIL2] +MISSION PHIL 2 [PIZ1_A] -Well Snacked Pizza +MISSION LIVREUR DE PIZZA -[GS_SCUT] -VOIR INTRO : +[PIZ1_03] +~g~Retourne à la pizzeria pour d'autres commandes. -[TR_00] -COURSE 1 +[PIZ1_04] +~g~Voilà tes nouvelles commandes. -[TR_01] -COURSE 2 +[PIZ1_10] +Appuie sur la ~h~ touche R3 ~w~ pour annuler les missions pizzas. -[TR_02] -COURSE 3 +[CNTBUY1] +Imprimerie achetée : $~1~ -[TR_03] -COURSE 4 +[CARBUY] +Concession achetée : $~1~ -[TR_04] -COURSE 5 +[PORNBUY] +Studio de cinéma acheté: $~1~ -[TR_05] -COURSE 6 +[ICEBUY] +Usine de crème glacée achetée: $~1~ -[TR_06] -COURSE 7 +[TAXIBUY] +Compagnie de taxis achetée: $~1~ -[TR_07] -COURSE 8 +[BANKBUY] +Club Malibu acheté : $~1~ -[CHSE] -POURSUITE +[BOATBUY] +Chantier naval acheté: $~1~ -[NOCHANG] -Tu ne peux pas changer de vêtements au cours de cette mission. +[PRNT_NO] +Tu ne peux pas acheter l'imprimerie pour l'instant, reviens plus tard. -[OUTF_12] -Antonio +[CAR_NO] +Tu ne peux pas acheter la concession automobile pour l'instant, reviens plus tard. -[OUTF_13] -Jogging +[PORN_NO] +Tu ne peux pas acheter le studio de cinéma pour l'instant, reviens plus tard. -[OUTF_14] -Mafieux +[ICE_NO] +Tu ne peux pas acheter l'usine de crème glacée pour l'instant, reviens plus tard. -[OUTF_15] -Petit malin +[TAXI_NO] +Tu ne peux pas acheter la compagnie de taxis pour l'instant, reviens plus tard. -[BENZ_AN] -~w~La ~h~tenue d'Antonio~w~ est dispo dans ta planque. +[BANK_NO] +Tu ne peux pas acheter le club Malibu pour l'instant, reviens plus tard. -[BENZ_SW] -~w~Le ~h~jogging~w~ est dispo dans ta planque. +[BOAT_NO] +Tu ne peux pas acheter le chantier naval pour l'instant, reviens plus tard. -[BENZ_GD] -~w~La ~h~tenue Mafieux~w~ est dispo dans ta planque. +[PRNT_R3] +Appuie sur la touche R3 pour acheter l'imprimerie au prix de $~1~ -[BENZ_WI] -~w~La ~h~tenue Petit malin~w~ est dispo dans ta planque. +[CAR_R3] +Appuie sur la touche R3 pour acheter la concession automobile au prix de $~1~ -[RAMPAGE] -RODEO +[PORN_R3] +Appuie sur la touche R3 pour acheter le studio de cinéma au prix de $~1~ -[GS_TTGT] -TEMPS BLINDE : +[ICE_R3] +Appuie sur la touche R3 pour acheter l'usine de crème glacée au prix de $~1~ -[GS_O5] -Pour gagner, reste en vie le plus longtemps possible dans le blindé. Endommage le blindé pour le voler à un autre joueur. +[TAXI_R3] +Appuie sur la touche R3 pour acheter la compagnie de taxis au prix de $~1~ -[HELP28] -~w~Pour lancer une ~h~arme explosive~w~, appuie sur~h~ ~k~ ~PDFW~. ~w~Plus tu appuies longuement sur~h~ ~k~ ~PDFW~, ~w~plus l'arme ira loin. +[BANK_R3] +Appuie sur la touche R3 pour acheter le club Malibu au prix de $~1~ -[RATNG53] -Déshonorant +[BOAT_R3] +Appuie sur la touche R3 pour acheter le chantier naval au prix de $~1~ -[RATNG54] -Sale tricheur +[COL2_6] +Arrête espèce de porc impérialiste d'Américain! -[RATNG55] -Requin +[COL2_6B] +Ceci est la propriété du gouvernement français! -[RATNG56] -Escroc +[COL2_6C] +Et c'est terminé. -[RATNG57] -Le Don de tous les menteurs +[COL3_A] +Thomas, merci d'être venu. -[RATNG11] -SANGSUE +[COL3_B] +Désolé d'aller droit au but... -[CHASE6] -Liberty Tree Page 2 +[COL3_C] +Diaz m'a demandé de superviser une petite transaction financière. -[CHASE7] -Liberty Tree Première page +[COL3_D] +Espérons que ça se passera mieux que la dernière fois. -[AUTOLD] -Chargement depuis le Memory Stick™, ne pas retirer le Memory Stick™ ou redémarrer le système. +[COL3_E] +C'est la raison pour laquelle j'ai pensé à vous, mon ami. -[LDFAIL] -Echec du chargement. Les données sauvegardées sont corrompues. +[COL3_F] +J'ai laissé un revolver au parking à niveaux. -[MEMCHKA] -Memory Stick™ introuvable. Au moins +[COL3_G] +Récupèrez-le et allez surveiller les mecs de Diaz au dépôt. -[MEMCHKB] -sont nécessaires pour sauvegarder ces données de jeu. +[COL4_2] +Je sais pas, chef! -[MEMCHKC] -Espace insuffisant sur le Memory Stick™. Au moins +[COL4_5] +Chef, oui, chef! -[MEMCHKD] -sont nécessaires pour sauvegarder ces données de jeu. +[COL4_10] +Allons manger quelques beignets. -[M_FAIL] -ECHEC DE LA MISSION ! +[COL4_16] +Chef, on déplace le véhicule, chef! -[M_OVER] -FIN DE LA MISSION ! +[COL4_25] +Autodestruction du véhicule initialisée! -[M_PASS] -~Y~MISSION TERMINEE ! ~n~~1~$ +[COL5_6] +Mercedes, cette fille aura ma peau. -[M_PASSN] -~Y~MISSION TERMINEE +[COL5_8] +Maudit cafard! -[MRACE11] -~w~Remonte dans un véhicule pour terminer la course. +[COL5_5] +Crevez, porcs de Français! -[FEI_LE1] -Avec légende +[CNT2_1] +Tuez-le! -[FEI_LE2] -Sans légende +[CNT2_2] +Récupérez les plaques! -[FEI_TA1] -Avec cible +[CNT2_3] +Protégez le coursier! -[FEI_TA2] -Sans cible +[FINKILL] +Ok, les mecs, butez-le! -[C1FREE2] -joystick analogique gauche +[FIN_6] +Sonny est en haut avec le coffre et MON argent... -[C3FREE2] -joystick analogique gauche +[FIN_10] +Sonny? SONNY! Je viens te chercher! -[FEA_MP3] -BANDE-SON PERSO : +[RACES_4] +3 -[FEA_NA] -NON DISPONIBLE +[RACES_5] +2 -[MPC_060] -Antonio +[RACES_6] +1 -[MPC_061] -Jogging +[RACES_7] +PARTEZ! -[MPC_062] -Mafieux +[RACES_9] +Temps : ~1~:~1~ -[MPC_063] -Petit malin +[RACES] +TEMPS : -[MPC_064] -Kazuki +[RACES17] +Nv temps record : ~1~:~1~ -[NUMDBL1] -DEBUG 1 (~1~) (~1~) +[RACES20] +Nv temps record : ~1~:0~1~ -[SVRMBRS] -JOUEURS : +[RACES21] +Temps : ~1~:0~1~ -[RAMP_P] -RODEO TERMINE ! +[RCH1_1] +~g~Utilise l'hélicoptère radiocommandé, le RC Raider, pour PASSER les points de passage. -[RAMP_F] -ECHEC DU RODEO ! +[RCH1_2] +~g~Les POINTS DE PASSAGE sont disséminés dans l'aéroport. -[MPWLPAC] -a récupéré une voiture cible. +[RCH1_3] +~g~Tu as ~c~8 minutes~g~ pour passer les ~c~20! -[MPWLDAC] -a livré une voiture cible. +[RCH1_5] +Temps -[LDWAIT] -Appuie sur ~X~ pour continuer. +[RCRC1_1] +~g~Fais une COURSE DE POINTS DE PASSAGE contre deux autres RC Bandits sur 2 TOURS -[LOADING] -Chargement... Un instant. +[RCRC1_2] +~g~Va sur la grille de départ! -[RACEP1] -1er +[RCRC1_3] +~g~Dernier tour! -[RACEP2] -2e +[RCRC1_4] +~g~3 -[RACEP3] -3e +[RCRC1_5] +~g~2 -[RACEP4] -4e +[RCRC1_6] +~g~1 -[RACEP5] -5e +[RCRC1_7] +~g~PARTEZ! -[RACEP6] -6e +[RCRC1_8] +~g~Temps de course : ~1~ secondes -[FEA_UT] -Piste inconnue +[RCPL1_1] +~g~Fais une COURSE DE POINTS DE PASSAGE contre 3 autres RC Baron -[LOADIN2] -Chargement... +[RCPL1_2] +~g~Tu dois passer par le ~o~CENTRE CORONA ~g~pour valider un point de passage. -[DNH5_X2] -~r~T'as pas amorcé toutes les bombes. +[RCPL1_3] +~g~Va sur la grille de départ maintenant! -[MRACE12] -T'AS +[FEA_2SP] +2 haut-parleurs -[MRACE13] -s POUR TROUVER UN VEHICULE +[FEA_4SP] +Plus de 2 haut-parleurs -[MRACE14] -s POUR TROUVER UN VEHICULE +[FEA_EAR] +Casque -[DTB_03] -~w~L'équipe qui défend ses caisses le plus longtemps remporte la partie. +[FEA_NAH] +PAS DE MATERIEL AUDIO -[PUPCOL] -a récupéré un bonus +[FET_APP] +APPLIQUER -[TNKCSE] -Endommage le blindé pour le voler à un autre joueur. +[FES_SKN] +NOM DU SKIN -[TNKTM] -Pour gagner, reste en vie le plus longtemps possible dans le blindé. +[FES_DAT] +DATE -[MPFAIL] -RATE ! +[FES_SET] +Utiliser Skin -[GS_LOC2] -LIEU : +[FET_DEF] +Par défaut -[DTBSWPA] -T'as tenu les Sindacco à l'écart pendant +[FESZ_QZ] +Veux-tu vraiment sauvegarder cette partie? -[DTBSWPB] -Maintenant, détruis leurs caisses en moins de temps. +[FES_SCG] +Sauvegarder la partie en cours? -[DTBSWPC] -T'as détruit les caisses des Forelli en +[FES_LCG] +Charger la partie et continuer à jouer? -[DTBSWPD] -Maintenant, protège tes caisses pendant plus longtemps. +[FEC_FIR] +Tirer -[CHANOP] -Changer d'option +[FEC_NWE] +Arme suivante -[MPSSCT] -ARGENT CIBLE : +[FEC_PWE] +Arme précédente -[F_RANG2] -~r~La radio du camion de pompiers ne fonctionne pas dans le métro ! +[FEC_FOR] +Avant -[T_RANG2] -~r~Il n'y a pas d'ordures à ramasser dans le métro ! +[FEC_BAC] +Arrière -[T_RANGE] -~r~Il n'y a pas d'ordures à ramasser ici ! +[FEC_LEF] +Gauche -[FEU_YES] -OUI +[FEC_RIG] +Droite -[FEU_NO] -NON +[FEC_ZIN] +Zoom avant -[HELP43] -~w~Utilise le frein à main pour faire virer ton bateau plus rapidement. +[FEC_ZOT] +Zoom arrière -[RACE_T6] -~r~Un des véhicules a été détruit - la course est annulée ! +[FEC_EEX] +Entrer+sortir + +[FEC_RAD] +Radio + +[FEC_SUB] +Sous-mission + +[FEC_CMR] +Changer caméra + +[FEC_JMP] +Sauter + +[FEC_SPN] +Courir + +[FEC_HND] +Frein à main + +[FEC_LOL] +Regarder à gauche + +[FEC_LOR] +Regarder à droite + +[FEC_NTR] +Cible suivante + +[FEC_PTT] +Cible précédente + +[FEC_LBA] +Regarder derrière + +[FEC_CEN] +Centrer caméra + +[FET_CCN] +Classique + +[FET_SCN] +Standard + +[FET_CFT] +A PIED + +[FET_CCR] +EN VOITURE + +[FET_CAC] +ACTION + +[FEC_IBT] +- + +[FEC_MXO] +MXB1 + +[FEC_MXT] +MXB2 + +[FEC_UNB] +NON LIE + +[FEC_TFL] +Regard gauche+tourelle G + +[FEC_TFR] +Regarde droite+tourelle D + +[FEC_MWF] +VOLANT MS HAUT + +[FEC_MWB] +VOLANT MX BAS + +[FEC_ORR] +ou + +[FEC_NUS] +NON UTILISE + +[FEC_LUD] +Regarder en haut + +[FEC_LDU] +Regarder en bas + +[FEC_CMP] +COMBO : REGARDER G+D + +[LAW_1A] +law_1a + +[LAW_1B] +law_1b + +[LAW_2A] +law_2a + +[LAW_2B] +law_2b + +[FEH_STA] +STATS + +[FEH_LOA] +CHARGER + +[FEH_CON] +COMMANDES + +[FEH_AUD] +AUDIO + +[FEH_DIS] +AFFICHAGE + +[FEH_LAN] +LANGUE + +[FEH_SGA] +LANCER NOUVELLE PARTIE + +[FEO_CON] +Configuration manette + +[FEO_AUD] +Configuration audio + +[FEO_DIS] +Configuration affichage + +[FEO_LAN] +Choix langue + +[FEO_PLA] +Configuration joueur + +[FEA_OUT] +Sortie + +[FEA_ST] +Stéréo + +[FEA_DTS] +DTS + +[FEA_RSS] +Station de radio + +[FEA_NON] +RADIO ETEINTE + +[FEA_FM0] +WILDSTYLE + +[FEA_FM1] +FLASH FM + +[FEA_FM2] +KCHAT + +[FEA_FM3] +FEVER 105 + +[FEA_FM4] +VROCK + +[FEA_FM5] +VCPR + +[FEA_FM7] +EMOTION 98.3 + +[FEA_FM8] +ONDE 103 + +[FED_BRI] +Luminosité + +[FED_TRA] +Rémanences : + +[FED_SUB] +Sous-titres + +[FED_WIS] +Ecran large [FED_POS] -POSITION ECRAN +Position écran -[FES_DSS] -Choisir une sauvegarde à effacer : +[FEP_RES] +Reprendre -[FES_LSS] -Choisir une sauvegarde à charger : +[FEP_STG] +Commencer partie -[FES_DSC] -Effacement réussi. Pour continuer, sélectionner OK. +[FEP_STA] +Stats + +[FEP_BRI] +Briefings + +[FEP_OPT] +Options + +[FEP_QUI] +Quitter partie + +[FES_LOA] +Charger partie [FES_DEL] Effacer partie -[FES_DGM] -EFFACER PARTIE +[FEC_CSU] +Configuration manette -[ITBEG] -Au commencement... +[FEC_RED] +Réassigner commandes -[FET_LG] -CHARGER +[FEC_MOU] +Paramètres souris -[FES_SCG] -Sauvegarder la partie en cours ? +[DISTGOL] +Dist. parcourue en voiturette (miles) -[FESZ_QZ] -Sauvegarder cette partie ? +[DISTGOM] +Distance parcourue en voiturette (m) -[FES_SSC] -Sauvegarde réussie. Pour continuer, sélectionner OK. +[ST_FAVR] +Station de radio préférée -[FEM_NTF] -La memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 n'est pas formatée. +[ST_WSTR] +Station de radio la moins écoutée -[FES_CFM] -Formatage de la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1. Ne pas retirer la memory card (8MB) (pour PlayStation®2) ou la manette, ni redémarrer ou éteindre la console. +[ST_FAVV] +Véhicule préféré -[FES_LOQ] -Echec du chargement ! La sauvegarde sur la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 n'est pas compatible avec le jeu. Le jeu est en train d'être relancé. +[ST_STAR] +Total d'étoiles de recherche obtenues -[FEM_NTH] -Pas de memory card (8MB) (pour PlayStation®2) insérée dans la fente pour MEMORY CARD N°1. +[ST_HEAD] +Nombre de tirs à la tête -[FES_CMP] -Echec de la sauvegarde ! Vérifier la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 et réessayer. +[ST_GANG] +Gang le moins apprécié -[FESZ_FO] -La memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 n'est pas formatée. Voulez-vous la formater ? +[ST_STGN] +Total d'étoiles de recherche évitées -[FES_NOC] -Pas de memory card (8MB) (pour PlayStation®2) insérée dans la fente pour MEMORY CARD N°1. +[TYREPOP] +Pneus crevés avec des balles -[FES_LOE] -Echec du chargement ! Vérifier la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 et réessayer. Le jeu est en train d'être relancé. +[TYRESLA] +Pneus lacérés avec une lame -[FES_DEE] -Echec de l'effacement ! Vérifier la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 et réessayer. +[ST_BRK] +Nombre de victimes dans le Bloodring -[SLONFM] -Echec du formatage ! Vérifier la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 et réessayer. +[ST_LTBR] +Plus longue durée dans le Bloodring (sec) -[SLONDR] -Espace insuffisant sur la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1. Insérer une memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 avec au moins 330 KB d'espace libre, ou libérer de l'espace pour pouvoir sauvegarder les données de jeu. +[ST_GNG1] +Cubains -[SLNSP] -Espace insuffisant sur la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1. Au moins 101 KB d'espace libre supplémentaire sont nécessaires sur la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 pour pouvoir sauvegarder les données de jeu. +[ST_GNG2] +Haïtiens -[SLONNF] -La memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 n'est pas formatée. Voulez-vous la formater ? +[ST_GNG3] +Faux voyous -[FESZ_FF] -Echec du formatage ! Vérifier la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 et réessayer. +[ST_GNG4] +Gang de Diaz -[MCDNSP] -Pas de memory card (8MB) (pour PlayStation®2) insérée dans la fente pour MEMORY CARD N°1. Pour sauvegarder les données de jeu, insérer une memory card (8MB) (pour PlayStation®2) avec au moins 330 KB d'espace libre. Voulez-vous quand même commencer une partie ? +[ST_GNG5] +Agents de sécurité -[MCGNDP] -Espace insuffisant sur la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1. Au moins 330 KB d'espace libre sont nécessaires pour sauvegarder ces données de jeu. Voulez-vous quand même commencer une partie ? +[ST_GNG6] +Gang de motards -[MCGNSP] -Espace insuffisant sur la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1. Au moins 101 KB d'espace libre supplémentaire sont nécessaires sur la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 pour sauvegarder ces données de jeu. Voulez-vous quand même commencer une partie ? +[ST_GNG7] +Gang de Vercetti -[FESZ_WR] -Sauvegarde en cours. Ne pas retirer la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 ou la manette, ni redémarrer ou éteindre la console. +[ST_GNG8] +Golfeurs -[FELD_WR] -Chargement en cours. Ne pas retirer la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 ou la manette, ni redémarrer ou éteindre la console. +[FEA_FM6] +ESPANTOSO -[FEDL_WR] -Effacement en cours. Ne pas retirer la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 ou la manette, ni redémarrer ou éteindre la console. +[ST_ASSI] +Contrats exécutés -[C0VEWEA] -joystick analogique droit +[DISTBIK] +Dist. parcourue à moto (miles) -[C1VEWEA] -joystick analogique droit +[DISTBIM] +Dist. parcourue à moto (m) -[C2VEWEA] -joystick analogique droit +[HOTEL] +Hôtel Ocean View -[C3VEWEA] -touches directionnelles +[ICC1_1] +~g~Utilise ta camionnette de crème glacée pour distribuer de la drogue à Vice City. -[C0PDLOO] -joystick analogique droit +[ICC1_2] +~g~Gare ta camionnette et appuie sur ~h~~k~~VEHICLE_HORN~~w~ pour jouer le jingle et signaler à tes clients que tu es prêt. -[C1PDLOO] -joystick analogique droit +[ICC1_3] +~g~Tu reçois de l'argent pour chaque transaction faite, mais plus tu fais d'affaires, plus tu attires l'attention de la police. -[C2PDLOO] -joystick analogique droit +[KICK1_9] +POINTS DE PASSAGE RESTANTS : -[C3PDLOO] -joystick analogique droit +[FIN_B6] +Tu n'as pas assez d'argent pour commencer cette mission. -[C0AMMOV] -joystick analogique gauche ou touches directionnelles +[TEX3_3] +~g~Pour ramasser une bombe, manoeuvre l'hélico au-dessus d'elle. La bombe est alors automatiquement fixée sous la carlingue. -[C1AMMOV] -joystick analogique gauche ou touches directionnelles +[TEX3_9] +~g~Ramasse une bombe en manoeuvrant l'hélico à côté d'elle. -[C2AMMOV] -joystick analogique gauche ou touches directionnelles - -[C3AMMOV] -joystick analogique gauche ou touches directionnelles - -[FEC_ACB] -Accélérer/Freiner - -[FEM_SL8] -Sauvegarde 8 absente - -[FES_SAV] -SAUVEGARDER +[HELP22] +Va vers la position du bip de la maison verte sur le radar. [FES_FMS] -Formatage réussi. +Formatage terminé. Sélectionne OK pour continuer. -[MCDNCK] -Vérification de la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1. Ne pas retirer la memory card (8MB) (pour PlayStation®2) ou la manette, ni redémarrer ou éteindre la console. +[FES_SSC] +Sauvegarde terminée. Sélectionne OK pour continuer. + +[FES_DSC] +Suppression terminée. Sélectionne OK pour continuer. [FESZ_QC] -Procéder à l'écrasement de cette sauvegarde corrompue ? +Ecraser ce fichier de sauvegarde corrompu? -[NOCONT] -Pour continuer, connecter une manette analogique (DUALSHOCK®) ou une manette analogique (DUALSHOCK®2) au port de manette N°1. +[FES_CHE] +Attention! Un ou plusieurs codes ont été activés, ce qui peut affecter votre fichier de sauvegarde. Sauvegarde déconseillée. -[FES_LCF] -Echec du chargement ! Vérifier la memory card (8MB) (pour PlayStation®2) dans la fente pour MEMORY CARD N°1 et réessayer. +[FET_SG] +SAUVEGARDER -[DBGHELP] -~h~DEBUG MENU~w~ Select Item with ~h~left button & right button. ~w~Press ~h~X button ~w~to launch. Press ~h~TRIANGLE button ~w~to quit menu. +[FEH_BRI] +BRIEFING -[DBGSEL1] -Level Skip Menu +[FEH_MAP] +CARTE -[DBGSEL2] -Car Viewer +[FEM_OK] +OK -[DBGSEL3] -Character Viewer +[FEC_CRO] +S'accroupir -[DBGSEL4] -Building Viewer +[FEC_CR3] +S'accroupir (touche L3) -[DBGSEL5] -Weapon Cheat +[FEC_SMT] +Sous-mission -[DBGSEL6] -Player Cheat +[FEC_SM3] +Sous-mission (touche R3) -[DBGSEL7] -Weather and Time Changer +[FEC_RSC] +Stations de radio -[DBGSEL8] -Marketing Camera +[ST_PR01] +Pilote -[DBGSEL9] -MoCap Menu +[ST_PR02] +Soldat armée de l'air -[DBGSE10] -USJ Editor +[ST_PR03] +Officier pilote -[DBGSE11] -Toggle Player Coordinates +[ST_PR04] +Caporal -[DBGFIL0] -Ped Selector +[ST_PR05] +Lieutenant -[DBGFIL1] -Car Selector +[ST_PR06] +Sergent -[PLCHLD] -Placeholder: mission will complete in 5 seconds +[ST_PR07] +Capitaine -[PLCHLD2] -Placeholder Cutscene +[ST_PR08] +Biggs -[PLCHLD3] -Placeholder (MOCAP) Cutscene +[ST_PR09] +Wedge -[LS_MAC] -Ma Cipriani stream +[ST_PR10] +Baron rouge -[LS_JDT] -J.D. O'Toole stream +[ST_PR11] +Goose -[LS_SAL] -Salvatore stream +[ST_PR12] +Viper -[LS_COMP] -Completed all Missions in this stream +[ST_PR13] +Jester -[TEMP1] -Number: ~1~ +[ST_PR14] +Chappy -[LS2_H1] -Use ~h~analog up & down ~w~to select story stream. Use ~h~analog left & right ~w~to select mission. Use ~h~L button & R button ~w~to select an island. Press ~h~X button ~w~to start mission. Press ~h~TRIANGLE button ~w~to exit. +[ST_PR15] +Iceman -[LS2_H2] -You cannot use levelskip when you are ~h~on a mission. +[ST_PR16] +Maverick -[LS2_VIC] -~y~Vincenzo Cilli -~g~ ~a~ +[ST_PR17] +Noops -[LS2_MAC] -~y~Ma Cipriani -~g~ ~a~ +[ST_PR18] +Maréchal de l'air -[LS2_JDT] -~y~J.D. O'Toole -~g~ ~a~ +[ST_PR19] +As -[LS2_SAL] -~y~Salvatore -~g~ ~a~ +[FET_LG] +Charger partie -[LS2_MAR] -~y~Maria -~g~ ~a~ +[CAR_EXP] +Véhicules routiers détruits -[LS2_NED] -~y~Ned Burner -~g~ ~a~ +[BOA_EXP] +Bateaux détruits -[LS2_DON] -~y~Donald Love -~g~ ~a~ +[HEL_DST] +Avions et hélicoptères détruits -[LS2_RAY] -~y~Ray Machowski -~g~ ~a~ +[STFT_01] +Meilleur temps sur 'Alliage d'Acier' -[LS2_TOS] -~y~Toshiko Kasen -~g~ ~a~ +[STFT_02] +Meilleur temps sur 'Le chauffeur' -[FREEON] -Time Frozen +[STFT_03] +Meilleur temps sur Dirt Ring -[FREEOFF] -Time Unfrozen +[STFT_04] +Meilleur temps course avion télécommandé -[WTC_INS] -Use ~h~analog up & down ~w~to change weather. Use ~h~analog left & right ~w~to change hour. Press ~h~TRIANGLE button ~w~to exit. Press ~h~SQUARE button ~w~to freeze time. +[STFT_05] +Meilleur temps course voiture télécommandée -[WTC_TIM] -TIME: ~1~:00 +[STFT_06] +Meilleur temps hélico télécommandé -[WTC_WE0] -WEATHER: CLOUDY +[STFT_07] +Meilleur temps sur 'Terminal Velocity' -[WTC_WE1] -WEATHER: EXTRA COLOURS +[STFT_08] +Meilleur temps sur 'Ocean Drive' -[WTC_WE2] -WEATHER: EXTRA SUNNY +[STFT_09] +Meilleur temps sur 'Border Run' -[WTC_WE3] -WEATHER: FOGGY +[STFT_10] +Meilleur temps sur 'Capital Cruise' -[WTC_WE4] -WEATHER: HURRICANE +[STFT_11] +Meilleur temps sur 'Virée!' -[WTC_WE5] -WEATHER: RAINY +[STFT_12] +Meilleur temps sur 'Endurance V.C.' -[WTC_WE6] -WEATHER: SNOW +[STHC_01] +Meilleur score sur Le Flingueur. -[WTC_WE7] -WEATHER: SUNNY +[STHC_02] +Meilleur pourcentage de tir au but sur le Flingueur. -[CVHELP] -Use ~h~up button and down button ~w~to change character. Use ~h~left button and right button ~w~to rotate camera. HOLD ~h~SQUARE ~w~to zoom in (toggles upper and lower body). Press ~h~TRIANGLE ~w~to quit character viewer. +[STHC_03] +Nombre de deals de drogue -[VMENU1] ---------- Select a Viewer --------- --- ~h~Car~w~ - Character - Building -- +[HELP24] +Tu peux maintenant bosser pour le colonel. -[VMENU2] ---------- Select a Viewer --------- --- Car - ~h~Character~w~ - Building -- +[HELP25] +Tu peux maintenant bosser pour Avery Carrington -[VMENU3] ---------- Select a Viewer --------- --- Car - Character - ~h~Building~w~ -- +[HELP29] +Tu peux te rendre au magasin de fringues quand tu n'es pas en mission. -[CV_C] -COMPARISON MODEL +[HELP30] +Quand tu achètes de nouvelles fringues, ton indice de recherche retombe à zéro. -[CV_0] -ROW: -- MODEL: player +[BJM2_22] +~r~Tu as quitté le stand de tir! -[CV_1] -ROW: 114 MODEL: cop +[BJM2_23] +~g~Si tu quittes le stand de tir pendant la compétition, la mission est un échec. -[CV_2] -ROW: 115 MODEL: swat +[ASM4_24] +Distance : -[CV_3] -ROW: 116 MODEL: fbi +[RBM1_6] +~g~Ramène Mercedes et le Love Juice au groupe, au studio d'enregistrement. -[CV_4] -ROW: 117 MODEL: army +[RBM1_3] +PLUS NECESSAIRE -[CV_5] -ROW: 118 MODEL: medic +[HAM1_5] +PLUS NECESSAIRE -[CV_6] -ROW: 119 MODEL: fireman +[RBM1_11] +PLUS NECESSAIRE -[CV_7] -ROW: 71 MODEL: male01 +[HELP31] +Pour réaliser un arrosage latéral, regarde d'abord à droite ou à gauche en utilisant ~k~~VEHICLE_LOOKLEFT~ ou ~k~~VEHICLE_LOOKRIGHT~. -[CV_9] -ROW: 120 MODEL: taxi_d +[HELP34] +Tu dois être armé d'une mitraillette pour réaliser un arrosage latéral. -[CV_10] -ROW: 2 MODEL: pimp +[STRIP_1] +~r~T'as pas assez de pognon, pauvre fauché! -[CV_11] -ROW: 13 MODEL: criminal01 +[EXIT_1] +Appuie sur ~k~~PED_SPRINT~ pour sortir. -[CV_12] -ROW: 14 MODEL: criminal02 +[ASM1_A] +M. Teal, votre aide dans l'éradication de ces indésirables fut une excellente affaire. J'ai un autre travail plus en finesse pour vous. -[CV_13] -ROW: 15 MODEL: male02 +[ASM1_B] +Regardez sous le téléphone. -[CV_14] -ROW: 16 MODEL: male03 +[ASM1_C] +J'ai un autre travail plus en finesse pour vous. -[CV_15] -ROW: 121 MODEL: fatmale01 +[SCARF] +Appartement 3c -[CV_16] -ROW: 17 MODEL: fatmale02 +[LAW4_10] +Les patrons sont tous des salauds! -[CV_17] -ROW: 18 MODEL: female01 +[GEN1_04] +~g~Passe la porte pour accéder au toit de Gonzalez. -[CV_18] -ROW: 19 MODEL: female02 +[GEN1_17] +~g~Gonzalez se fait la malle! Suis-le et finis-en avec lui! -[CV_19] -ROW: 20 MODEL: female03 +[RCH1_9] +~b~TEMPS TOTAL : ~1~:~1~ -[CV_20] -ROW: 21 MODEL: fatfemale01 +[RCH1_10] +~b~TEMPS TOTAL : ~1~:0~1~ -[CV_21] -ROW: 22 MODEL: fatfemale02 +[WHEEL01] +DOUBLE BONUS DEUX ROUES : $ ~1~ Distance : ~1~.~1~m Temps : ~1~ secondes -[CV_22] -ROW: 23 MODEL: prostitute +[WHEEL02] +DOUBLE BONUS DEUX ROUES : $ ~1~ Distance : ~1~ feet Temps : ~1~ secondes -[CV_23] -ROW: 24 MODEL: prostitute2 +[WHEEL03] +BONUS DEUX ROUES : $ ~1~ Temps : ~1~ secondes -[CV_24] -ROW: 25 MODEL: p_man1 +[WHEEL04] +BONUS DEUX ROUES : $ ~1~ Distance : ~1~.~1~m -[CV_25] -ROW: 26 MODEL: p_man2 +[WHEEL05] +BONUS DEUX ROUES : $ ~1~ Distance : ~1~ pieds -[CV_26] -ROW: 27 MODEL: p_wom1 +[WHEEL06] +BONUS ROUE ARRIERE : $ ~1~ Distance : ~1~.~1~m Temps : ~1~ secondes -[CV_27] -ROW: 28 MODEL: p_wom2 +[WHEEL07] +BONUS ROUE ARRIERE : $ ~1~ Distance : ~1~ feet Temps : ~1~ secondes -[CV_28] -ROW: 29 MODEL: ct_man1 +[WHEEL08] +BONUS ROUE ARRIERE : $ ~1~ Temps : ~1~ secondes -[CV_29] -ROW: 30 MODEL: ct_man2 +[WHEEL09] +BONUS ROUE ARRIERE : $ ~1~ Distance : ~1~.~1~m -[CV_30] -ROW: 31 MODEL: ct_wom1 +[WHEEL10] +BONUS ROUE ARRIERE : $ ~1~ Distance : ~1~ pieds -[CV_31] -ROW: 32 MODEL: ct_wom2 +[WHEEL11] +BONUS ROUE AVANT : $ ~1~ Distance : ~1~.~1~m Temps : ~1~ secondes -[CV_32] -ROW: 33 MODEL: li_man1 +[WHEEL12] +BONUS ROUE AVANT : $ ~1~ Distance : ~1~ pieds Temps : ~1~ secondes -[CV_33] -ROW: 34 MODEL: li_man2 +[WHEEL13] +BONUS ROUE AVANT: $ ~1~ Temps : ~1~ secondes -[CV_34] -ROW: 35 MODEL: li_wom1 +[WHEEL14] +BONUS ROUE AVANT : $ ~1~ Distance : ~1~.~1~m -[CV_35] -ROW: 36 MODEL: li_wom2 +[WHEEL15] +BONUS ROUE AVANT : $ ~1~ Distance : ~1~ pieds -[CV_36] -ROW: 37 MODEL: docker1 +[ROK3_72] +Love Fist! -[CV_37] -ROW: 38 MODEL: docker2 +[POR1_19] +Hé! -[CV_38] -ROW: 39 MODEL: scum_man +[DESPERA] +Desperado -[CV_39] -ROW: 40 MODEL: scum_wom +[MOB_99A] +Rends-toi à la cabine près du centre commercial à Washington. -[CV_40] -ROW: 41 MODEL: worker1 +[MOB_98A] +Rends-toi à la cabine dans Vice Point. -[CV_41] -ROW: 42 MODEL: worker2 +[MOB_96A] +Rends-toi à la cabine du terminal de l'aéroport. -[CV_42] -ROW: 43 MODEL: b_man1 +[MOB_95A] +Rends-toi à la cabine dans Little Havana. -[CV_43] -ROW: 44 MODEL: b_man2 +[BNK1_1] +Je peux vous aider, monsieur? -[CV_44] -ROW: 67 MODEL: b_man3 +[BNK1_2] +Il y a un imposteur! -[CV_45] -ROW: 45 MODEL: b_wom1 +[BNK1_3] +Il a pêté les plombs! -[CV_46] -ROW: 46 MODEL: b_wom2 +[BNK1_4] +Bon sang, t'es qui, toi? -[CV_47] -ROW: 70 MODEL: b_wom3 +[BNK1_5] +Où es ton badge? -[CV_48] -ROW: 47 MODEL: mod_man +[BNK1_6] +Les voilà! Descendez-les! -[CV_49] -ROW: 48 MODEL: mod_wom +[MOB_24A] +Bonjour, c'est M. Vercetti? -[CV_50] -ROW: 49 MODEL: st_man +[MOB_24B] +Oui. -[CV_51] -ROW: 50 MODEL: st_wom +[MOB_24C] +ici Cortez. Vous étiez à ma fête. -[CV_52] -ROW: 51 MODEL: fan_man1 +[MOB_24D] +Oui, je me souviens. -[CV_53] -ROW: 52 MODEL: fan_man2 +[MOB_24E] +M. Vercetti, c'est un regrettable incident, ce qui s'est produit avec votre affaire. -[CV_54] -ROW: 53 MODEL: fan_wom +[MOB_24F] +Je sais. -[CV_55] -ROW: 54 MODEL: hos_man +[MOB_24G] +Je veux que vous sachiez que mes hommes et moi, faisons le maximum pour tirer ça au clair. -[CV_56] -ROW: 55 MODEL: hos_wom +[MOB_24H] +Si vous souhaitez me parler en privé, vous me trouverez sur le bateau. Au revoir, senor. -[CV_57] -ROW: 56 MODEL: const1 +[BNK2_2] +VISEZ 3-2-1 FEU! -[CV_58] -ROW: 57 MODEL: const2 +[BNK2_3] +ZONE DEGAGEE! -[CV_59] -ROW: 58 MODEL: shopper1 +[BNK2_6] +Ce mec est cinglé! -[CV_60] -ROW: 59 MODEL: shopper2 +[ANGEL] +Angel -[CV_61] -ROW: 60 MODEL: shopper3 +[CUBJET] +Jetmax cubain -[CV_62] -ROW: 61 MODEL: stud_man +[SANDKIN] +Sandking -[CV_63] -ROW: 62 MODEL: stud_wom +[POLMAV] +Maverick Police -[CV_64] -ROW: 63 MODEL: cas_man +[BOXVILL] +Boxville -[CV_65] -ROW: 64 MODEL: cas_wom +[BENSON] +Benson -[CV_79] -ROW: 123 MODEL: gang01 LEONE_A +[HOTRINA] +Hotring Racer -[CV_80] -ROW: 124 MODEL: gang02 LEONE_B +[HOTRINB] +Hotring Racer -[CV_81] -ROW: 69 MODEL: gang03 TRIAD_A +[BLOODRA] +Bloodring Banger -[CV_82] -ROW: 3 MODEL: gang04 TRIAD_B +[BLOODRB] +Bloodring Banger -[CV_83] -ROW: 4 MODEL: gang05 DIABLO_A +[MAFIACR] +Mafia Cruiser -[CV_84] -ROW: 5 MODEL: gang06 DIABLO_B +[COP_M2] +'VICE SQUAD' -[CV_85] -ROW: 68 MODEL: gang07 YAKUZA_A +[COP_M3] +'BROWN THUNDER' -[CV_86] -ROW: 6 MODEL: gang08 YAKUZA_B +[BJM2_20] +~g~Quand tu n'as plus de ~w~temps ~g~ou de ~w~munitions ~g~, la manche est terminée! -[CV_87] -ROW: 7 MODEL: gang09 YARDIE_A +[BNK3_2] +Pas question que je conduise pour toi! J'en parlerai pendant la réunion de groupe! -[CV_88] -ROW: 8 MODEL: gang10 YARDIE_B +[FEM_SL1] +Pas de sauvegarde 1 -[CV_89] -ROW: 9 MODEL: gang11 COLOMBIAN_A +[FEM_SL2] +Pas de sauvegarde 2 -[CV_90] -ROW: 10 MODEL: gang12 COLOMBIAN_B +[FEM_SL3] +Pas de sauvegarde 3 -[CV_91] -ROW: 11 MODEL: gang13 HOOD_A +[FEM_SL4] +Pas de sauvegarde 4 -[CV_92] -ROW: 12 MODEL: gang14 HOOD_B +[FEM_SL5] +Pas de sauvegarde 5 -[CV_93] -ROW: 89 MODEL: gang15 Forelli thug1 +[FEM_SL6] +Pas de sauvegarde 6 -[CV_94] -ROW: 90 MODEL: gang16 Forelli thug2 +[FEM_SL7] +Pas de sauvegarde 7 -[CV_95] -ROW: 88 MODEL: gang17 Sindacco thug1 +[FEM_SL8] +Pas de sauvegarde 8 -[CV_96] -ROW: 89 MODEL: gang18 Sindacco thug2 +[FEA_CHA] +Passage en mode STEREO. Patiente un instant... -[CV_109] -ROW: 65 MODEL: SAL_01 Salvatore (Mob Don) +[FEA_CHD] +Attention! Tu es en train de passer du mode STEREO au mode DTS. Patiente un instant... -[CV_110] -ROW: 66 MODEL: RAY_01 Ray (Bad Cop) +[FEI_SEL] +Sélectionner -[CV_111] -ROW: 72 MODEL: VINC_01 Vincenzo Cilli +[FEI_BAC] +Retour -[CV_112] -ROW: 73 MODEL: GRDANG1 Avenging Angel +[FEI_RES] +Reprendre -[CV_113] -ROW: 74 MODEL: NED_01 Ned Burner (Reporter) +[FEI_NAV] +Explorer -[CV_114] -ROW: 75 MODEL: MASTOR Massimo Torrini (Assassin) +[FEI_BTX] +Touche / - -[CV_115] -ROW: 76 MODEL: TOOL_01 JD O'Toole +[FEI_BTT] +Touche " - -[CV_116] -ROW: 77 MODEL: Not used Fthr Kenny +[FEI_STA] +Touche START - -[CV_117] -ROW: 78 MODEL: GRDANG2 Avenging Angel 2 +[FEI_BTD] +; = > < - -[CV_118] -ROW: 79 MODEL: M_HOLE Mayor RC Hole +[FEI_STO] +Arrêter -[CV_119] -ROW: 80 MODEL: FRANFOR Franco Forelli +[MOB_68A] +Tommy, mon fiston, j'ai une surprise pour toi! -[CV_120] -ROW: 81 MODEL: KAZUKI Kazuki Kasen +[MOB_68B] +Je suis au studio d'enregistrement avec quelques artistes réputés. -[CV_121] -ROW: 82 MODEL: PAULIE Paulie Sindacco +[MOB_68C] +Pourquoi tu ne viendrais pas faire un tour? -[CV_122] -ROW: 83 MODEL: HOPPER Jane Hopper +[MOB_68D] +C'est une bonne idée, non? Allez, à plus tard. C'est plutôt normal, non? Allez, à plus tard. -[CV_123] -ROW: 84 MODEL: AVERY Avery Carrington +[OUTFT1] +Streetwear -[CV_124] -ROW: 85 MODEL: CASA Giovanni Casa +[OUTFT2] +Soirée -[CV_125] -ROW: 86 MODEL: BABY Giovanni Casa (baby) +[OUTFT3] +Bleu de travail -[CV_126] -ROW: 87 MODEL: MCAFFRY Det. Leon McAffrey +[OUTFT4] +Country club -[CV_127] -ROW: 92 MODEL: EIGHT 8Ball +[OUTFT5] +Cubano -[CV_128] -ROW: 93 MODEL: MAR_01 Maria +[OUTFT6] +Flic -[CV_129] -ROW: 94 MODEL: LOVE_01 Donald Love +[OUTFT7] +Braqueur -[CV_130] -ROW: 95 MODEL: MICKEYH Mickey H +[OUTFT8] +Décontracté -[CV_131] -ROW: 96 MODEL: WAYNE Wayne (Biker Dude) +[OUTFT9] +M. Vercetti -[CV_132] -ROW: 97 MODEL: BIKER1 Biker Dude 1 +[OUTFT10] +Survêtement -[CV_133] -ROW: 98 MODEL: BIKER2 Biker Dude 2 +[OUTFT13] +MC Tommy -[CV_134] -ROW: 99 MODEL: DONOVAN O'Donovan +[HOTR_07] +Nouveau record : ~1~:0~1~ -[CV_135] -ROW: 100 MODEL: KAS_01 Toshiko Kasen (kimono) +[HOTR_08] +Temps : ~1~:~1~ -[CV_136] -ROW: 101 MODEL: WKAS_01 Toshiko Kasen (western) +[GEN3_45] +Ils seront là d'une minute à l'autre. On ferait mieux de se trouver une bonne planque... -[CV_137] -ROW: 104 MODEL: JDMADE JD O'Toole - Made Man +[CAR_AS1] +CONCESSION AUTOMOBILE ACQUISE -[CV_138] -ROW: 106 MODEL: THUG_01 Sicilian Thug 1 +[CAR_AS2] +~g~Sunshine Autos génère dorénavant un revenu de $~1~ maximum. Pense à récupérer le fric régulièrement. -[CV_139] -ROW: 107 MODEL: THUG_02 Sicilian Thug 2 +[BUYSAVE] +~g~Puisque tu n'es pas en mission, tu peux sauvegarder ta partie gratuitement. -[CV_140] -ROW: 109 MODEL: CAMP_MAN Campaign Worker +[BUYGARG] +~g~Tu peux aussi garer des véhicules dans ce garage. -[CV_141] -ROW: 110 MODEL: CAMP_WOM Campaign Worker 2 +[STRPBUY] +Club Pole Position acquis : $~1~ -[CV_142] -ROW: 111 MODEL: MIGUEL Miguel +[STRP_R3] +Pour acheter le club Pole Position pour $~1~, appuie sur la touche R3. -[CV_143] -ROW: 112 MODEL: DELIASS Deli Assistant +[NBMN_R3] +Pour acheter Elswanko Casa pour $~1~, appuie sur la touche R3. -[CV_144] -ROW: 113 MODEL: HOBO_01 Donald Love 2 +[GA_4] +Les bombes pour voiture coûtent $1000 pièce. -[CV_68] -ROW: 122 MODEL: HITMAN Hitman +[GA_5] +Ta caisse est déjà équipée d'une bombe. -[CV_146] -ROW: 125 MODEL: HOLEJOG Mayor RC Hole (Jogging outfit) +[GA_6] { reVC update } +Gare-toi, amorce-la en appuyant sur la ~h~~k~~VEHICLE_FIREWEAPON~~w~ et BARRE-TOI vite! -[CV_147] -ROW: 126 MODEL: Chauff Chauffeur +[GA_7] { reVC update } +Amorce la bombe en appuyant sur la ~h~~k~~VEHICLE_FIREWEAPON~~w~. Elle explosera au démarrage. -[CV_148] -ROW: 128 MODEL: plr2 (Lawyer) +[GA_6B] { reVC update } +Gare-toi, amorce-la en appuyant sur la ~h~~k~~VEHICLE_FIREWEAPON~~w~ et BARRE-TOI vite! -[CV_149] -ROW: 129 MODEL: plr3 (Travel clothes) +[GA_7B] { reVC update } +Amorce la bombe en appuyant sur la ~h~~k~~VEHICLE_FIREWEAPON~~w~. Elle explosera au démarrage. -[CV_150] -ROW: 130 MODEL: plr4 (Chauffeur) +[MOB_70A] +Tommy, c'est moi, le colonel Cortez. Ecoutez senor, je parie qu'avec vous, tout est possible. -[CV_151] -ROW: 131 MODEL: plr5 (Hockey mask) +[MOB_70B] +Je serai sur le bateau. -[CV_152] -ROW: 132 MODEL: plr6 (Tuxedo) +[PICK1] +Gilet pare-balles livré dans l'hôtel Ocean View! -[CV_153] -ROW: 133 MODEL: plr7 (Avenging Angel) +[PICK2] +.357 livré à la planque! -[CV_154] -ROW: 134 MODEL: plr8 (The King of Rock'n Roll) +[PICK3] +Tronçonneuse livrée à la planque! -[CV_155] -ROW: 135 MODEL: plr9 (Cock's Mascot) +[PICK4] +Lance-flammes livré à la planque! -[CV_156] -ROW: 136 MODEL: plr10 (Boxer Shorts) +[PICK5] +.308 Lunette livré à la planque! -[CV_157] -ROW: 137 MODEL: plr11 (Bad Super Hero) +[PICK6] +Mitrailleuse livrée à la planque! -[CV_158] -ROW: 138 MODEL: plr12 (Dragon) +[PICK7] +Lance-roquettes livré à la planque! -[CV_159] -ROW: 139 MODEL: PHILC Phil Cassidy +[PICK8] +Sea Sparrow désormais disponible dans la résidence! -[CV_160] -ROW: 140 MODEL: GREASE Grease Zuko +[PICK9] +Char désormais disponible dans la caserne de l'armée! -[CV_161] -ROW: 141 MODEL: GUN_ASS Gun assistant +[PICK10] +Hunter désormais disponible dans la caserne de l'armée! -[CV_162] -ROW: -- MODEL: JD_shot JD shot dead +[HELP41] +tu peux aussi les défoncer avec un véhicule -[CV_163] -ROW: -- MODEL: BODYBAG bodybag +[ICC1_6] +~g~Utilise le Mr. Whopee pour distribuer des produits Cherry Poppers dans Vice City. -[CV_164] -ROW: 142 MODEL: SAL_CON Sal Convict +[ICC1_12] +PROPRIETE ACQUISE! -[VV_131] -ID:131 MODEL: Landstalker (TBC) +[CLOTH1] +Tenue de soirée livrée chez Rafael sur Ocean Beach. -[VV_135] -ID:135 MODEL: Perenial (TBC) +[CLOTH2] +Tenue streetwear livrée aux planques. -[VV_138] -ID:138 MODEL: Firetruck +[CLOTH3] +Bleu de travail livré chez Tooled Up dans le centre commercial de North Point. -[VV_141] -ID:141 MODEL: Manana (TBC) +[CLOTH4] +Tenue pour le Country Club livrée au Leaf Links Golf Club. -[VV_148] -ID:148 MODEL: FBI Car (TBC) +[CLOTH5] +Tenue Cubano livrée chez Little Havana Streetwear dans Little Havana. -[VV_152] -ID:152 MODEL: Kuruma (TBC) +[CLOTH6] +Uniforme de flic livré au poste de police de Washington Beach. -[VV_164] -ID:164 MODEL: Dodo (TBC) +[CLOTH7] +Tenue décontractée livrée chez Gash dans le centre commercial de North Point. -[VV_169] -ID:169 MODELL: Rc Bandit +[CLOTH8] +Tenue de M. Vercetti livrée chez Collar & Cuffs sur Ocean Beach. -[VV_170] -ID:170 MODEL: BellyUp (Triad) (TBC) +[CLOTH9] +Survêtement livré chez Jocksport dans le centre. -[VV_172] -ID:172 MODEL: Leone Sentinel (TBC) +[CLOTH10] +Tenue de braqueur livrée au Malibu de Vice Point. -[VV_174] -ID: 174 MODEL: Yakuza (TBC) +[RBM1_9] +~g~Va chez le dealer et rapporte du Love Juice pour les Love Fist! -[VV_179] -ID:179 MODEL: Flatbed (TBC) +[MOB_62A] +Tommy, c'est Ricardo Diaz, je voulais te remercier de m'avoir sauvé. -[VV_181] -ID:181 MODEL: Borgnine Taxi (TBC) +[MOB_62B] +J'ai demandé à ce con de Cortez. Il a dit que tu feras l'affaire, mon ami. Viens me voir à l'occasion. -[VV_188] -ID: 188 MODEL: Sindacco Argento (TBC) +[MOB_62C] +C'est d'un mec comme toi dont j'ai besoin. J'ai plus que des têtes de bites, -[VV_189] -ID: 189 MODEL: Forelli Lexcess (TBC) +[MOB_62D] +des têtes de bite partout! Tu vas gagner plein de pognon. -[VV_192] -ID:192 MODEL: Speeder (TBC) +[GOAWAY2] +~g~Reviens quand tu auras terminé les missions Bikers. -[BV_H1] -Press CIRCLE to swap building model. +[COL2_9] +Imbécile de Ricain! Ils vous ont suivi jusqu'ici! -[BV_0A] -ROW: 2 - Portland. Safehouse Exterior. Press CIRCLE to swap. +[LOADCOL] +Chargement... -[BV_0B] -ROW:24 - Portland. Safehouse Interior. Press CIRCLE to swap. +[STFT_17] +Meilleur temps sur Terrain de jeu PCJ -[BV_1] -ROW: 3 - Portland. Ferry Terminal. +[STFT_18] +Meilleur temps sur 'Sélection par la boue' -[BV_2A] -ROW: 4 - Portland. Callahan Bridge 1. Press CIRCLE to swap. +[STFT_19] +Meilleur temps sur Piste d'essai -[BV_2B] -ROW: 4 - Portland. Callahan Bridge 2. Press CIRCLE to swap. +[NEW_REC] +Nouveau record! ~1~ minutes et ~1~ secondes. -[BV_3] -ROW: 5 - Portland. Les Cargo Freighter. +[BMX_HOW] +~g~Fais deux tours de circuit, ~y~en passant par ~g~les ~y~POINTS DE PASSAGE~g~! -[BV_4A] -ROW: 6 - Portland. Doll's House Brothel 1. Press CIRCLE to swap. +[BMXREW1] +~g~Chaque fois que tu inscris un nouveau record pour les deux tours, -[BV_4B] -ROW: 6 - Portland. Doll's House Brothel 2. Press CIRCLE to swap. +[BMXREW2] +~g~une meilleure ~y~RECOMPENSE ~g~t'est offerte! -[BV_5] -ROW: 7 - Portland. Tower Block. +[BMXRAIN] +~g~On dirait qu'il pleut... -[BV_6] -ROW: 8 - Portland. Eddie's Garage. +[ITBEG] +AU DEBUT... -[BV_7] -ROW: 9 - Portland. Bowler's Fist Pub. +[NBMNBUY] +El Swanko Casa acheté : $ ~1~ -[BV_8] -ROW:10 - Portland. Hepburn Heights. +[LNKVBUY] +Appartement de Links View acheté : $ ~1~ -[BV_9] -ROW:11 - Portland. Short Stay Hotel. +[HYCOBUY] +Hyman Condo acheté : $ ~1~ -[BV_10] -ROW:12 - Portland. Car Dealership. +[BUYGARS] +~g~Tu peux également stocker des véhicules dans ces garages. -[BV_11] -ROW:13 - Portland. Bus Graveyard. +[OCHEBUY] +Appartement d'Ocean Heights acheté : $ ~1~ -[BV_12A] -ROW:14 - Portland. Drugs Warehouse 1 (awaiting approval). Press CIRCLE to swap. +[WASHBUY] +1102 Washington Street acheté : $ ~1~ -[BV_12B] -ROW:14 - Portland. Drugs Warehouse 2 (awaiting approval). Press CIRCLE to swap. +[VCPTBUY] +3321 Vice Point acheté : $ ~1~ -[BV_13] -ROW:15 - Portland. Ma Cipriani's Restaurant. +[SKUMBUY] +Skumole Terrace achetée : $~1~ -[BV_14] -ROW:17 - Portland. Basketball Court, Callahan. +[HELP6_C] +Appuie sur la ~h~~k~~VEHICLE_HANDBRAKE~~w~ pour actionner le frein à main. -[BV_15] -ROW:18 - Portland. Bike Shop. +[HELP2_A] +Appuie sur la ~h~~k~~PED_SPRINT~~w~ lorsque tu cours pour ~h~sprinter. -[BV_16] -ROW:19 - Portland. Building near Basketball Court. +[HELP4_A] +Appuie sur la ~h~~k~~VEHICLE_ACCELERATE~~w~ pour accélérer. -[BV_17A] -ROW:20 - Portland. Luigi's Nightclub 1. +[HELP5_A] +Appuie sur la ~h~~k~~VEHICLE_BRAKE~~w~ pour freiner ou faire marche arrière si le véhicule est à l'arrêt. -[BV_17B] -ROW:20 - Portland. Luigi's Nightclub 2. +[HELP8_A] +Appuie sur la ~h~~k~~PED_SNIPER_ZOOM_IN~~w~ pour faire un zoom avant avec le fusil et sur la ~x~touche /~w~ pour faire un zoom arrière. -[BV_17C] -ROW:20 - Portland. Luigi's Nightclub 3. +[PBOAT_1] { reVC update } +Appuie sur la~h~ ~k~~VEHICLE_FIREWEAPON~~w~ pour tirer avec les canons du bateau. -[BV_18] -ROW:21 - Portland. Casa's Gourmet Deli. +[SEG3_4] { reVC update } +~g~Tu peux ramasser des bombes en pilotant ton avion radiocommandé à côté. Appuie sur la ~h~~k~~VEHICLE_FIREWEAPON~ ~g~touche. -[BV_19] -ROW:22 - Portland. Rusty Ship. +[RCR1_3] { reVC update } +~g~Si tu veux quitter cette mission, appuie sur la ~h~~k~~VEHICLE_FIREWEAPON~~g~ pour faire exploser ta voiture radiocommandée. -[BV_20] -ROW:23 - Portland. Door for Shopfront. +[HELP32] { reVC update } +Appuie ensuite sur la ~h~~k~~VEHICLE_FIREWEAPON~~w~ pour tirer. -[BV_21] -ROW:25 - Staunton. Casino. +[HELP33] { reVC update } +Appuie ensuite sur la ~h~~k~~VEHICLE_FIREWEAPON~~w~ pour tirer. -[BV_22] -ROW:26 - Staunton. Phil Cassidy's Store. +[TTUTOR] +Appuie sur la ~h~~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions Taxi. -[BV_23] -ROW:27 - Staunton. Zip store. +[TTUTOR2] +Appuie sur la ~h~~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions Taxi. -[BV_24] -ROW:28 - Staunton. Container Park. +[FTUTOR] +Appuie sur la ~h~~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions Camion de pompiers. -[BV_25] -ROW:29 - Staunton. Ferry Terminal. +[FTUTOR2] +Appuie sur la ~h~~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions Camion de pompiers. -[BV_26A] -ROW:30 - Staunton. Fort Staunton 1 NORTH. +[CTUTOR] +Appuie sur la ~h~~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions Auto-défense. -[BV_26B] -ROW:30 - Staunton. Fort Staunton 2 NORTH. +[CTUTOR2] +Appuie sur la ~h~~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions Auto-défense. -[BV_27A] -ROW:30 - Staunton. Fort Staunton 1 SOUTH. +[HELP8_B] +Appuie sur la~h~ ~k~~PED_SNIPER_ZOOM_IN~ ~w~pour faire un ~h~zoom avant~w~ avec le fusil et sur la ~h~~k~~PED_SNIPER_ZOOM_OUT~~w~ pour faire un ~h~zoom arrière~w~. -[BV_27B] -ROW:30 - Staunton. Fort Staunton 2 SOUTH. +[ATUTOR3] +Appuie sur la ~h~~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions Ambulance. -[BV_28] -ROW:31 - Ferry - Not Visible At Present. +[GUN_H1] +~w~Appuie sur la~h~ ~k~~PED_SPRINT~~w~ pour acheter. ~w~Appuie sur la~h~ ~k~~VEHICLE_ENTER_EXIT~~w~ pour quitter. -[BV_29A] -ROW:32 - Staunton. Safehouse Exterior (unchanged). Press CIRCLE to swap. +[PU_CF3] { reVC update } +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~~w~ pour remplacer l'arme actuelle dans cet emplacement. -[BV_29B] -ROW:32 - Staunton. Safehouse Interior. Press CIRCLE to swap. +[PU_CF4] { reVC update } +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~~w~ pour remplacer l'arme actuelle dans cet emplacement. -[BV_30] -ROW:33 - Staunton. Steps Added To Building. +[HELP9_B] +Appuie sur la~h~ ~k~~PED_FIREWEAPON~ ~w~pour ~h~tirer~w~ avec le fusil à lunette. -[BV_31] -ROW:34 - Portland. Outbuilding. +[HELP37] +Si tu ne veux pas monter dans un véhicule quand tu braques le conducteur, appuie sur la ~h~~k~~PED_SPRINT~. -[BV_32A] -ROW:34 - Shoreside. Safehouse Exterior (unchanged). Press CIRCLE to swap. +[HELP6_A] +Appuie sur la ~h~~k~~VEHICLE_HANDBRAKE~ ~w~ pour actionner le frein à main. -[BV_32B] -ROW:34 - Shoreside. Safehouse Interior. Press CIRCLE to swap. +[HELP6_D] +Appuie sur la ~h~~k~~VEHICLE_HANDBRAKE~ ~w~ pour actionner le frein à main. -[BV_33] -Not in Doc - Staunton - Warehouse Interior (not internally approved). +[HELP26] +Appuie sur la ~h~~k~~VEHICLE_ENTER_EXIT~ ~w~ pour monter ou sortir d'un véhicule. -[BV_34A] -Not in Doc - Staunton - Church Exterior. Press CIRCLE to swap. +[HELP27] +Appuie sur ~h~~k~~VEHICLE_TURRETUP~~w~ ou ~h~~k~~VEHICLE_TURRETDOWN~~w~ pour déplacer ton poids sur une moto. -[BV_34B] -Not in Doc - Staunton - Church Interior for scripted cutscene. Press CIRCLE to swap. +[HELP28] +Appuie sur ~h~~k~~VEHICLE_TURRETUP~~w~ ou ~h~~k~~VEHICLE_TURRETDOWN~~w~ pour déplacer ton poids sur une moto. -[NEDS2] -The Passion Of The Heist +[HELP35] +Appuie sur ~h~~k~~GO_LEFT~~w~ ou ~h~~k~~GO_RIGHT~~w~ pour diriger le véhicule. -[NEDS3] -Karmageddon +[HELP36] +Appuie sur ~h~~k~~GO_LEFT~~w~ ou ~h~~k~~GO_RIGHT~~w~ pour diriger le véhicule. -[NEDS4] -False Idols +[HELP42] +Suis le ~q~point rose~w~ pour trouver l'hôtel. -[DONS1] -The Morgue Party Candidate +[HELP19] +Marche sur le ~q~marqueur rose~w~ pour continuer. -[GAR_WIL] -Conduis la voiture dans le garage. +[HELP1] +Arrête-toi au centre du ~q~marqueur rose. -[DONS2] -Steering The Vote +[HELP12] +Marche au centre du ~q~marqueur rose~w~ pour lancer une mission. -[DONS3] -Cam-Pain +[SEG3_6] +~g~Pour toucher ta cible, tu dois larguer la bombe sur la zone indiquée par le ~q~marqueur rose~w~. Tu peux larguer les bombes dans n'importe quel ordre. -[DONS4] -Friggin' The Riggin' +[S_PROMP] +Lorsque tu n'es pas en mission, tu peux sauvegarder la partie en ramassant la ~h~cassette. -[DONS5] -Love & Bullets +[HELP16] +Franchis la porte d'entrée de l'hôtel ~h~Ocean View~w~ pour y pénétrer. -[DONS6] -Counterfeit Count +[HELP43] +~g~Rends-toi à l'hôtel ~h~Ocean View~g~ sur Ocean Drive. -[DONS7] -Love On The Rocks +[HELI_F1] +~r~Mission Point de passage hélico annulée! -[DONS7AA] -Toni, il faut que tu m'aides ! +[AMMUHLP] +Si tu as besoin d'armes, va chez ~h~Ammu-Nation~w~. Suis le ~h~point pistolet~w~ sur le radar. -[DONS7AB] -O'Donovan a des preuves qui me lient à Salvatore ! On est grillé ! +[HELI_1] +Point de passage hélico du Centre -[DONS7AC] -Du calme... des preuves disparaissent tous les jours. +[HELI_2] +Point de passage hélico d'Ocean Beach -[DONS7AD] -Sans parler des juges, des témoins et des jurés... +[HELI_3] +Point de passage hélico de Vice Point -[DONS7AE] -J'espérais que tu verrais ça comme ça. +[HELI_4] +Point de passage hélico de Little Haiti -[DONS7AF] -Un de mes gars a pris le mec qui a la preuve en filature. +[FST_MFR] +Station de radio préférée -[DONS7AG] -Il te retrouvera sous le pont autoroutier à Newport. +[FST_LFR] +Station de radio la moins écoutée -[SALS1] -A Walk In The Park +[FEI_HOL] +Maintenir -[SALS2] -Making Toni +[FEI_ZOO] +Zoom -[SALS3] -Caught In The Act +[FEI_BTR] +> < - -[SALS4] -Search And Rescue +[FEI_NA] +Aucun -[SALS5] -Taking The Peace +[MESA] +Grande table -[SALS6] -Shoot The Messenger +[STRP_NO] +Tu ne peux pas acheter la boîte de striptease maintenant. Reviens plus tard. -[RAYS1] -Sayonara Sindaccos +[CHSE] +POURSUITE -[RAYS2] -The Whole 9 Yardies +[NBMN_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter El Swanko Casa pour $~1~. -[RAYS3] -Crazy '69' +[NBMN_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter El Swanko Casa pour $~1~. -[RAYS4] -Night Of The Livid Dreads +[NBMN_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter El Swanko Casa pour $~1~. -[RAYS5] -Munitions Dump +[LNKV_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter l'appartement de Links View pour $~1~. -[MC_S07] -7. Cuttest - none +[LNKV_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter l'appartement de Links View pour $~1~. -[NEDS1] -L.C. Confidential +[LNKV_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter l'appartement de Links View pour $~1~. -[WILGAR2] -Descends de la voiture et va dehors. +[HYCO_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter Hyman Condo pour $~1~. -{=================================== MISSION TABLE SAL1 ===================================} +[HYCO_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter Hyman Condo pour $~1~. -[SAL1_M1:SAL1] -~w~Salvatore veut causer. +[HYCO_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter Hyman Condo pour $~1~. -[SAL1_M2:SAL1] -~w~Je joue pas le jeu de Salvatore. +[OCHE_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter l'appartement d'Ocean Heights pour $~1~. -[SAL1_M3:SAL1] -~w~Merci de la part des grévistes, petit... A bientôt... +[OCHE_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter l'appartement d'Ocean Heights pour $~1~. -[SAL1_M5:SAL1] -~w~Hé ! +[OCHE_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter l'appartement d'Ocean Heights pour $~1~. -[SAL1_D1:SAL1] -~w~Hé ! Briseur de grève ! +[WASH_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le 1102 Washington Street pour $~1~. -[SAL1_D2:SAL1] -~w~Chopez-le ! +[WASH_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le 1102 Washington Street pour $~1~. -[SAL1_D3:SAL1] -~w~Le voilà ! +[WASH_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le 1102 Washington Street pour $~1~. -[SAL1_D4:SAL1] -~w~Il est là-bas ! +[VCPT_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le 3321 Vice Point pour $~1~. -[SAL1_E1:SAL1] -~w~Echappe-toi des docks ! +[VCPT_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le 3321 Vice Point pour $~1~. -[SAL1_A1:SAL1] -~w~Va voir Jane Hopper, la chef du syndicat, à ~y~Portland Docks. +[VCPT_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le 3321 Vice Point pour $~1~. -[THEO_01:SAL1] -Hé, boss, ça va ? +[SKUM_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~~w~ pour acheter la Skumole Terrace pour $~1~. -[THEO_02:SAL1] -A ton avis ? +[SKUM_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~~w~ pour acheter la Skumole Terrace pour $~1~. -[THEO_03:SAL1] -Non. +[SKUM_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~~w~ pour acheter la Skumole Terrace pour $~1~. -[THEO_04:SAL1] -Alors quoi ? T'es vraiment trop con... +[PRNT_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter l'imprimerie pour $~1~. -[THEO_05:SAL1] -Si ça se voit, pourquoi tu demandes ? +[PRNT_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter l'imprimerie pour $~1~. -[THEO_06:SAL1] -J'arrive pas à croire que j'suis cerné par des cons ! +[PRNT_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter l'imprimerie pour $~1~. -[THEO_07:SAL1] -Désolé. +[CAR_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter la concession automobile pour $~1~. -[THEO_08:SAL1] -Non, Toni, c'est moi... T'es un des mecs en qui j'ai le plus confiance. +[CAR_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter la concession automobile pour $~1~. -[THEO_09:SAL1] -Après ce que t'as fait, t'es comme un fils pour moi, même plus que mon fils. +[CAR_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter la concession automobile pour $~1~. -[THEO_10:SAL1] -Plus que tous mes fils... +[PORN_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le studio de cinéma pour $~1~. -[THEO_11:SAL1] -Ta mère a de la chance... +[PORN_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le studio de cinéma pour $~1~. -[THEO_12:SAL1] -C'est c'qu'on dit. +[PORN_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le studio de cinéma pour $~1~. -[THEO_13:SAL1] -Anthony, c'est fini pour les mecs comme nous. +[ICE_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter l'usine de crème glacée pour $~1~. -[THEO_14:SAL1] -On sera bientôt bon pour la casse. +[ICE_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter l'usine de crème glacée pour $~1~. -[THEO_15:SAL1] -Ecoute, même dans ma propre famille, j'me sens comme Jésus cerné par 12 Judas. +[ICE_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter l'usine de crème glacée pour $~1~. -[THEO_16:SAL1] -Non mais, tu te rends compte : +[TAXI_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter la compagnie de taxis pour $~1~. -[THEO_17:SAL1] -J'ai cette syndicaliste, cette sale pute, qui doit me rendre un service, +[TAXI_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter la compagnie de taxis pour $~1~. -[THEO_18:SAL1] -et elle m'demande du fric ? +[TAXI_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter la compagnie de taxis pour $~1~. -[THEO_19:SAL1] -Tout ce que j'voulais, c'était un accès de 24 heures aux docks pendant la grève, +[BANK_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le Malibu pour $~1~. -[THEO_20:SAL1] -une grève que j'ai aidé à organiser pour que mes gars déchargent de la came peinards ! +[BANK_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le Malibu pour $~1~. -[THEO_21:SAL1] -Et voilà le résultat ! +[BANK_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le Malibu pour $~1~. -[THEO_22:SAL1] -J'veux dire, c'est des gens pour qui j'me suis battu, +[BOAT_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le chantier naval pour $~1~. -[THEO_23:SAL1] -des gens pour qui j'ai tué, des gens honnêtes. +[BOAT_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le chantier naval pour $~1~. -[THEO_26:SAL1] -C'est une honte, c'est fini pour les hommes d'honneur comme toi et moi ! +[BOAT_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le chantier naval pour $~1~. -[THEO_27:SAL1] -Ecoute, Toni, j'ai besoin que tu lui apportes quelque chose. +[STRP_L] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le Pole Position Club pour $~1~. -[THEO_28:SAL1] -Tu vas accepter qu'une nana te fasse chier ? +[STRP_T] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le Pole Position Club pour $~1~. -[THEO_29:SAL1] -Pour l'instant, j'ai pas trop le choix... +[STRP_C] +Appuie sur la ~h~~k~~PED_ANSWER_PHONE~ ~w~pour acheter le Pole Position Club pour $~1~. -[THEO_30:SAL1] -Bon, va la voir, file-lui la thune et dis-lui que j'voudrais lui parler. +[STOCK] +~r~stock écoulé -[THEO_31:SAL1] -Allez. +[HELP14] +Pour trouver le cabinet d'avocats, suis le ~h~point L~w~ sur le radar. -[THEO_24:SAL1] -- Et c'est comme ça qu'ils me remercient ? ~n~ - Tous des salauds. +[BOAT_AS] +~g~Le chantier naval génère dorénavant un revenu de $~1~ maximum. Pense à récupérer le fric régulièrement. -{=================================== MISSION TABLE SAL2 ===================================} +[BOAT_A2] +CHANTIER NAVAL OK -[SAL2_N:SAL2] -Filles +[BOAT_N] +Checkpoint Charlie -[SAL2_A0:SAL2] -~w~C'est un de tes nouveaux molosses, Sal ? +[BOAT_P] +~g~Récupère les paquets avant la fin du temps imparti. -[SAL2_A1:SAL2] -~w~M'sieur Leone ? +[FEI_R1B] +Touches R1\R2 - -[SAL2_A2:SAL2] -~w~Toni ! Come sta ? +[HELP9_A] +Appuie sur la touche ~h~~k~~PED_FIREWEAPON~ ~w~pour tirer avec le fusil à lunette. -[SAL2_A3:SAL2] -~w~Content de te voir, je voudrais que tu fasses quelque chose pour moi... +[HELP21] +Appuie sur la touche ~h~~k~~VEHICLE_ENTER_EXIT~ ~w~pour monter dans un véhicule ou en sortir. -[SAL2_A4:SAL2] -~w~Si je peux pas convaincre cette salope de dirigeante syndicaliste de marcher avec moi, j'peux sûrement convaincre ses gars. Capici ? +[CREAM] +Distribution -[SAL2_A:SAL2] -~w~Rassemble six ~b~putes~w~ et conduis-les au piquet de grève à Portland Docks. +[UMBERTO] +Café Robina -[SAL2_B0:SAL2] -~w~Hé, chéri, je fais pas les plans à trois quand y a que 2 places. +[PU_CF1] +Appuie sur la touche ~h~~k~~PED_ANSWER_PHONE~ ~w~pour ramasser cette arme. Elle remplacera toute autre arme du même type que tu possèdes. -[SAL2_B1:SAL2] -~w~On en reparlera quand t'auras plus de place ! Je voyage pas dans le coffre, chéri ! +[FED_RDM] +CARTE ET POINTS -[SAL2_D0:SAL2] -~w~T'es tout seul, mon mignon ? +[FEC_ILU] +Vue inversée à la 1ere personne : -[SAL2_D1:SAL2] -~w~Hé, beau gosse, tu veux pas t'amuser un peu ? +[NITRO] +Tous les taxis disposent d'un saut turbo! Appuie simplement sur la touche klaxonner. -[SAL2_D2:SAL2] -~w~Allez, chéri... On va s'éclater ensemble ! +[RATNG53] +Faux cul -[SAL2_D3:SAL2] -~w~Alors, c'est où la fête, chéri ? +[RATNG54] +Faiseur d'emmerdes -[SAL2_D4:SAL2] -~w~Salut, mon chou, tu veux prendre du bon temps ? +[RATNG55] +Malhonnête -[SAL2_D5:SAL2] -~w~Hé, beau gosse, t'as besoin de rien ? +[RATNG56] +Tricheur -[SAL2_F0:SAL2] -~w~Hé, j'viens aussi ! +[RATNG57] +Mythomane -[SAL2_F1:SAL2] -~w~Alors, c'est rien que toi et moi, hein !? +[STHC_04] +Meilleur score au beach ball de Keepie-Uppy -[SAL2_F2:SAL2] -~w~Bon, on y va ou quoi ? +[STHC_05] +Meilleur résultat au Hotring -[SAL2_F3:SAL2] -~w~OK, où est la fête ? +[STFT_13] +Meilleur tps point de passage hélico du centre -[SAL2_F4:SAL2] -~w~Oh allez, sois pas comme ça... +[STFT_14] +Meilleur tps point de passage hélico d'Ocean Beach -[SAL2_F5:SAL2] -~w~J'veux juste m'amuser avec toi ! +[STFT_15] +Meilleur tps point de passage hélico de Vice Point -[SAL2_G0:SAL2] -~w~Conduis-la au ~y~piquet de grève ! +[STFT_16] +Meilleur tps point de passage hélico de Little Haiti -[SAL2_G1:SAL2] -~w~Conduis les filles au ~y~piquet de grève ! +[STFT_21] +Meilleur temps au Hotring -[SAL2_G2:SAL2] -~w~Occupe-toi du ~r~client ! +[STFT_22] +Meilleur temps au tour au Hotring -[SAL2_G3:SAL2] -~w~Occupe-toi des ~r~clients ! +[STFT_20] +Meilleur temps au 'Cone Crazy' -[SAL2_G4:SAL2] -~w~Ramasse d'autres ~b~filles ! +[HELP44] +Arrête-toi sur le ~q~marqueur rose. -[SAL2_H:SAL2] -~w~Hé, c'est où la fête, mon chou ? +[HELP45] +Appuie sur la ~h~~k~~PED_DUCK~~w~ pour t'accroupir. Ceci augmente la précision des flingues que tu portes. -[SAL2_P:SAL2] -~w~Amusez-vous, les gars ! Avec les compliments de Salvatore Leone ! +[RCR1_5] +Course de Bandit RC -[SAL2_I0:SAL2] -~w~Trouve-toi une fille, connard ! Celle-là est à moi ! +[RCPL1_7] +Course de Baron RC -[SAL2_I1:SAL2] -~w~Hé, tu veux quoi, toi ? Sale voyeur ! +[RCH1_11] +Course de Raider RC -[SAL2_I3:SAL2] -~w~Hé, c'est qui ce mec ? Faut le choper ! +[FEA_CTD] +Attention! Un équipement matériel compatible DTS est requis pour cette fonction. Continuer? -[SAL2_I5:SAL2] -~w~Hé, mon pote, attends ton tour, on était là avant ! +[FEM_STE] +STEREO -[SAL2_I7:SAL2] -~w~T'es le meilleur, arrête pas... Oh oui, encore ! +[FEM_UDY] +DTS -[SAL2_I9:SAL2] -~w~Alors, au boulot... +[GREET] +Bien le bonjour de... -[SAL2_K0:SAL2] -~w~Faut pas faire chier Toni Cipriani ! +[LANCE_1] +Hé, mec, conduis un peu mieux! -[SAL2_K1:SAL2] -~w~OK ! En route ! +[LANCE_2] +Hé, fais gaffe à ce que tu fais! -[SAL2_K2:SAL2] -~w~Allez, ma poule, amène ton cul ! +[LANCE_3] +Hé, tu vas où, là? -[SAL2_C0:SAL2] -~w~Hé, reviens, chéri, je mords pas ! +[LANCE_4] +On fait quoi maintenant? -[SAL2_C1:SAL2] -~w~Hé, chéri, où c'est que tu vas ? +[LAW4_15] +Plus de fric! -[SAL2_L0:SAL2] -~w~Je vais pas attendre toute la journée, connard ! +[MERC_5] +Belle voiture, M. Vercetti. -[SAL2_L1:SAL2] -~w~Chéri, le compteur tourne ! +[MERC_26] +PLUS VITE, PLUS VITE, PLUS VITE! -[SAL2_X0:SAL2] -~r~Temps écoulé ! +[MERC_27] +Attention, Tommy, je me suis fait refaire le nez le mois dernier. -[SAL2_X1:SAL2] -~r~T'as tué trop de putes ! +[MERC_28] +Tommy, conduis prudemment! -[SAL2_X2:SAL2] -~r~T'as attaqué les dockers. Ils te feront plus confiance ! +[MERC_29] +Tommy, va moins vite! -[SAL2_X3:SAL2] -~r~T'as attaqué les filles des dockers. Ils te feront plus confiance ! +[MERC_30] +Tommy, tu veux bien tuer quelqu'un d'autre que moi? -[SAL2_G5:SAL2] -~w~On dirait que t'as un admirateur. +[MERC_31] +Tommy, chéri, ne me tue pas! -[SAL2_I8:SAL2] -~w~Chéri, tu ne veux pas finir en taule, si ? +[MERC_32] +Tommy, ça me très plaisir que t'aies volé cette caisse! -[SAL2_I6:SAL2] -~w~Oh oui ! Oui ! ... +[MERC_40] +J'ai vraiment passé un bon moment. -[SAL2_M:SAL2] -~w~Essaie de ne pas les tuer ! Trouve une autre ~b~fille. +[MERC_43] +Adios, mon chou. -[SAL2_W1:SAL2] -~w~Tu as jusqu'à 0~1~:~1~ avant que les grévistes ne changent d'équipe ! +[MERC_44] +Continue la muscu, d'accord? -[SAL2_W2:SAL2] -~w~Tu as jusqu'à ~1~:~1~ avant que les grévistes ne changent d'équipe ! +[MERC_45] +Ciao, mon beau. -[SAL2_G6:SAL2] -~w~Arrête-toi sur la ~y~marque jaune~w~ pour déposer les filles. +[COL5_17] +Oh mon dieu, ils ont un hélicoptère! -[SAL2_G7:SAL2] -~w~Dérange le client pour faire sortir la ~b~fille~w~ de la voiture. +[COL5_18] +Abattez l'hélico! -[SAL2_B:SAL2] -~w~Tu peux plus faire monter de filles dans ta caisse. +[COL5_19] +Tommy, débarrasse-nous de cet hélico! -{=================================== MISSION TABLE SAL3 ===================================} +[COL5_20] +Il revient! Détruisez cet hélico! -[SAL3_A0:SAL3] -~w~Toni ! Comment ça va, fiston ? +[COL5_21] +Visez la taille de cet hélico! -[SAL3_A1:SAL3] -~w~T'as l'air un peu maigre. Ta maman te nourrit suffisamment ? +[COL5_22] +Le revoilà! -[SAL3_A2:SAL3] -~w~Tout va bien, m'sieur Leone. +[FEA_DSM] +Attention! Cette sauvegarde est paramétrée pour un son DTS. Du matériel compatible DTS doit être connecté. Choisir entre une sortie audio STEREO ou DTS. -[SAL3_A3:SAL3] -~w~Ecoute, ces syndicalistes commencent à me les briser sévère. +[STFT_23] +Meilleur temps à Checkpoint Charlie -[SAL3_A5:SAL3] -~w~... mais faudrait qu'on remette les idées en place à d'autres... moins 'réceptifs'... +[HELP50] +Appuie sur la touche ~h~~k~~PED_ANSWER_PHONE~~w~ pour placer la caméra derrière toi. -[SAL3_B0:SAL3] -~w~Fous les jetons aux ~r~chefs syndicalistes~w~. Assure-toi qu'ils ont compris ! +[HELP51] +Appuie sur la touche ~h~~k~~PED_ANSWER_PHONE~~w~ pour placer la caméra derrière toi. -[SAL3_B3:SAL3] -~w~Maintenant, ils devraient faire exactement ce qu'on leur dira. +[HELP52] +Appuie sur la touche ~h~~k~~PED_ANSWER_PHONE~~w~ pour placer la caméra derrière toi. -[SAL3_BA:SAL3] -~w~T'es taré, mon gars ! Moi, j'veux pas d'emmerdes ! +[HELP53] +Appuie sur la touche ~h~~k~~PED_CYCLE_WEAPON_LEFT~~w~ ou sur la touche ~h~~k~~PED_CYCLE_WEAPON_RIGHT~~w~ pour faire défiler tes armes disponibles. -[SAL3_CA:SAL3] -~w~Qu'est-ce que vous faites ?! Vous êtes malade ? +[HELP46] +Il existe huit différents types d'armes. -[SAL3_DA:SAL3] -~w~Il me restait que deux traites à payer pour cette voiture, enculé ! +[HELP47] +Tu peux porter une arme de chaque type à la fois, un type de pistolet, un type de fusil à pompe, etc. -[SAL3_BB:SAL3] -~w~A partir de maintenant, tu fais ce qu'on te dit ! +[HELP54] +~w~Prix : $~1~ ~r~L'achat de cette arme remplacera celle que tu possèdes déjà. -[SAL3_CB:SAL3] -~w~T'occupe pas des affaires de Leone ! +[HELP2A2] +Appuie sur la touche ~h~~k~~PED_SPRINT~~w~ quand tu cours, pour ~h~sprinter. -[SAL3_A4:SAL3] -~w~On dirait que certains d'entre eux commencent à voir les choses à ma façon. +[HLPSN_A] +Grâce au fusil à lunette, tu peux zoomer de loin sur une cible et la viser avec précision. -[SAL3_A6:SAL3] -~w~Tu vois ce que je veux dire ? +[HLPSN_B] +Appuie sur la touche~h~ ~k~~PED_LOCK_TARGET~ ~w~et maintiens-la enfoncée pour ~h~viser~w~ avec le fusil à lunette. -[SAL3_B1:SAL3] -Tu peux pas faire passer ton message s'ils sont tous morts. Ne tue plus de ~r~chefs de syndicats ! +[HLPSN_C] +Appuie sur la touche~h~ ~k~~PED_LOCK_TARGET~ ~w~et maintiens-la enfoncée pour ~h~viser~w~ avec le fusil à lunette. -[SAL3_B2:SAL3] -~r~T'es censé leur faire peur, pas les tuer ! +[HLPSN_D] +Appuie sur la touche ~h~~k~~PED_SNIPER_ZOOM_IN~~w~ pour ~h~faire un zoom avant ~w~avec le fusil à lunette et sur la touche~h~ ~k~~PED_SNIPER_ZOOM_OUT~ ~w~pour ~h~faire un zoom arrière~w~. -[SAL3_B4:SAL3] -~w~Trouve un autre ~r~chef de syndicat~w~ auquel remonter les bretelles. +[HLPSN_E] +Appuie sur la touche ~h~~k~~PED_FIREWEAPON~~w~ ~w~pour ~h~tirer~w~ avec le fusil à lunette. -{=================================== MISSION TABLE SAL5 ===================================} +[HLPSN_F] +Appuie sur la touche ~h~~k~~PED_FIREWEAPON~~w~ ~w~pour ~h~tirer~w~ avec le fusil à lunette. -[SAL5_D3:SAL5] -~w~Conduis le ~h~véhicule ~w~dans le garage. +[HLPSN_G] +Appuie sur la touche ~h~~k~~PED_FIREWEAPON~~w~ ~w~pour ~h~tirer~w~ avec le fusil à lunette. -[SAL5_D4:SAL5] -~w~Descends du véhicule et sors du ~h~garage. +[PLANE_H] +Utilise la touche ~h~~k~~VEHICLE_ACCELERATE~~w~ pour accélérer. Gauche et droite pour tourner. -[SAL5_B:SAL5] -~w~Trouve un véhicule à 4 places et un peu de ~b~renforts. +[PLANE_4] { reVC update } +{Utilise la touche ~h~~k~~VEHICLE_ACCELERATE~~w~ pour accélérer. Gauche et droite pour tourner.} +Utilise le joystick analogique droit pour accélérer, appuie vers le bas sur le joystick analogique gauche pour monter et vers le haut pour descendre. Gauche et droite pour tourner. -[SAL5_C:SAL5] -~w~T'as besoin d'un véhicule à 4 places. +[HELP55] +Appuie sur la touche ~h~~k~~PED_FIREWEAPON~~w~ pour attaquer le chef. -[SAL5_C0:SAL5] -~w~Embarque les ~b~renforts. +[STPR_8] +Pole Position Club -[SAL5_C1:SAL5] -~w~T'as besoin d'un véhicule avec plus de sièges pour embarquer des ~b~renforts. +[STPR_9] +3321 Vice Point -[SAL5_C2:SAL5] -~w~Va à ~y~Portland Docks. +[STPR_10] +Appartement de Links View -[SAL5_AA:SAL5] -~w~Hé... mec... Ca fait des plombes que je t'attends ! +[STPR_11] +El Swanko Casa -[SAL5_AB:SAL5] -~w~Arrête de gémir, Miguel. T'as le matos ? +[STPR_12] +1102 Washington Street -[SAL5_AG:SAL5] -~w~... T'as notre fric ? +[STPR_13] +Appartement d'Ocean Heights -[SAL5_AH:SAL5] -~w~Ouais... +[STPR_14] +Skumole Shack -[SAL5_AI:SAL5] -~w~Hein ? +[STPR_15] +Hyman Condo -[SAL5_AJ:SAL5] -~w~Sale enfoiré ! +[RCCANX] +~r~Avion RC annulé. -[SAL5_C8:SAL5] -~w~Monte dans le ~b~véhicule~w~ avec la drogue et tire-toi en vitesse ! +[CLT_HL2] +Lorsque tu ramasses des fringues, une ou deux étoiles d'indice de recherche sont enlevées. -[SAL5_C9:SAL5] -~w~Conduis le véhicule au ~y~box de Salvatore. +[CRED009] +CONCEPTION DES MISSIONS -[SAL5_D1:SAL5] -~w~Remonte dans le ~b~véhicule ! +[CRED359] +LEE JOHNSON -[SAL5_D2:SAL5] -~r~La drogue a été détruite ! +[CRED360] +HENDRIK LESSER -[SAL5_AF:SAL5] -~w~Hé hé hé ! Je t'aime bien, Toni. T'es aussi couillu qu'un taureau ! +[CRED361] +PASQUALE STACCHIOTTI -[SAL5_C3:SAL5] -~w~Sème les flics ! +[CRED362] +ENRIQUE FERNANDEZ -[SAL5_D5:SAL5] -~r~La drogue a été saisie ! +[CRED363] +PAUL BYERS -[SAL5_AD:SAL5] -~w~Hé, j'suis un homme très occupé, Toni ! Le prochain coup, j'trouve un autre acheteur ! +[CRED364] +MIKE EMENY -[SAL5_AE:SAL5] -~w~Ouais, ben tu trouveras personne qui paye comme nous. +[CRED365] +ROB DUNKIN -[SAL5_D6:SAL5] -~w~Elimine les ~r~dealers de drogue. +[CRED366] +CHARLIE KINLOCH -[CONT_01:SAL5] -Ta gueule, sale pute ingrate ! +[CRED367] +KEVIN HOBSON -[CONT_06:SAL5] -Y a plus que comme ça que tu m'touches... +[CRED368] +JIM CREE -[CONT_07:SAL5] -Merde, et pourquoi j'voudrais te toucher ? +[MOB_66A] +Tommy, Tommy, Tommy, pourquoi t'es revenu ici? -[CONT_08:SAL5] -J'aime pas le matos d'occase. +[MOB_66B] +On t'a déjà dit qu'on voulait plus te revoir. -[CONT_09:SAL5] -Tu m'fous la gerbe. +[MOB_67A] +Tommy, je crois que tu devrais rester à l'écart, tu saisis? -[CONT_12:SAL5] -Oh, arrête ! Tu sais quoi ? +[MOB_67B] +Les petits gars Haïtiens t'aiment pas beaucoup. -[CONT_15:SAL5] -Salut, Toni... +[MOB_18A] +Tommy, c'est Paulo. Tu vas bien? Bon, mec, il faut que je te parle. -[CONT_16:SAL5] -J'veux mon fric, vieux con ! +[MOB_18B] +Ah, mon pote, tu croiras jamais l'incroyable petit lot que je viens de lever... -[CONT_17:SAL5] -Dégage de là, pétasse ! +[MOB_18C] +Elle se promenait juste en bas dans Little Havana, mon pote. -[CONT_18:SAL5] -Oh, Anthony, t'es un ange de miséricorde. +[MOB_18D] +Elle m'a dit qu'elle s'appelait Mercedes ou un truc comme ça. -[CONT_19:SAL5] -Ah, les femmes, qu'est-ce qu'on peut se faire chier avec, pas vrai ? +[MOB_18E] +Ah, mon pote, faut que t'ailles voir cette fille! -[CONT_20:SAL5] -Heureusement que j'peux avoir confiance en quelqu'un... en toi, Toni ! +[MOB_18F] +Elle ferait bander un eunuque! Elle m'a dit que j'étais le meilleur coup de sa vie et tout et tout! -[CONT_21:SAL5] -T'es un mec super important pour moi. J'te l'avais jamais dit ? +[MOB_18G] +Vas-y, trouve-la. A plus tard! -[CONT_22:SAL5] -T'arrives même pas à bander, pauvre connard ! +[MOB_72A] +Tommy, c'est moi, Lance. Ferme-la, Tommy, parce que j'ai pas le temps de discuter! -[CONT_23:SAL5] -Pas pour toi, j'trique pas pour les chiottes publiques, salope ! +[MOB_72B] +J'me tape de ce que t'as à me dire. Pourquoi ça m'intéresserait? T'en as rien à foutre de moi, non? -[CONT_24:SAL5] -Super important. Ecoute... Toi et moi, maintenant, on est aux commandes. +[MOB_72C] +Il faut que tu sois plus sympa avec moi. Donne-moi une belle part. Tu vois... -[CONT_25:SAL5] -On a viré tous ces cons. +[MOB_72D] +Tommy... Ecoute, mec, je suis désolé. C'est que... -[CONT_26:SAL5] -Qu'est-ce que t'en sais ? Tu préfères traîner avec des mecs ! +[MOB_72E] +Les gens arrêtent pas de me materner, de me traiter comme un gamin. -[CONT_27:SAL5] -Et toi, t'arrêtes de faire chier que quand t'as la culotte baissée, +[MOB_72F] +Mon frère pourrait me faire ça, mais pas toi. S'il te plaît. -[CONT_28:SAL5] -en train de te faire enfiler ! +[MOB_72G] +Faut que j'y aille. -[CONT_29:SAL5] -Putain... Même les lapins, ils ont pas le feu au cul comme toi ! +[MOB_63A] +Tommy, c'est Earnest. Earnest Kelly. -[CONT_33:SAL5] -Bon, j'ai un chargement de tu sais quoi qu'arrive... +[MOB_63B] +Ca va? -[CONT_34:SAL5] -Ca va nous propulser au sommet, toi et moi. +[MOB_63C] +Bien. Il va me falloir une canne pour marcher, mais je devrais revenir rapidement dans les affaires. -[CONT_35:SAL5] -Tout va se passer comme sur des roulettes. +[MOB_63D] +Bien. -[CONT_36:SAL5] -J'ai juste besoin d'un mec sur qui je peux compter pour gérer tout ça. +[MOB_63E] +J'ai appris au sujet de Lance. Quel enculé, hein? -[CONT_37:SAL5] -OK, Toni, à plus tard. - -[CONT_38:SAL5] -Et au fait, j'ai jamais rencontré de minette avec une culotte hydraulique ! - -[CONT_39:SAL5] -C'est pas croyable ! Bordel ! Pourquoi je l'ai épousée !? - -[CONT_40:SAL5] -J'rêvais d'une fille réglo et j'suis tombé sur une salope ! - -[CONT_41:SAL5] -J'ai dû être trop con dans une aut' vie... - -[CONT_42:SAL5] -J'vois que ça. - -[CONT_02:SAL5] -- Encore un mot et ça va chier pour ta gueule. ~n~ - Ouais, c'est ça, gros dur. - -[CONT_04:SAL5] -- Qu'est-ce tu vas me faire ? Me frapper ? ~n~ - Faudrait p'têt... - -[CONT_10:SAL5] -- Quoi ? Moi ? J'te fous la gerbe ? ~n~ - Ouais ! La gerbe ! - -[CONT_13:SAL5] -- Papa avait raison quand il disait que t'étais qu'un gros plouc... ~n~ - Ouais, ouais, c'est ça... - -[CONT_43:SAL5] -- Alors, écoute, c'est important... ~n~ - Va te faire foutre, Salvatore Leone, - -[CONT_31:SAL5] -- petite merde de macho rital tout juste bon à cogner sa salope. ~n~ - Me faire foutre ?! J'croyais que c'était ta spécialité ? - -{=================================== MISSION TABLE SAL4 ===================================} - -[SAL4_I1:SAL4] -~w~Cette grève continuera tant que j'aurai pas de garantie de la ville ! - -[SAL4_I2:SAL4] -~w~Si les Mafiosi croient diriger le syndicat, ils se trompent ! - -[SAL4_I3:SAL4] -~w~Ils me font pas peur ! - -[SAL4_I4:SAL4] -~w~J'en ai des plus grosses qu'eux tous réunis ! - -[SAL4_I5:SAL4] -~w~T'entends cette merde ? - -[SAL4_I6:SAL4] -~w~Je devrais mettre un contrat sur cette salope, elle me mène en bateau ! - -[SAL4_I7:SAL4] -~w~... mais c'est un jeu qui peut se jouer à deux... - -[SAL4_I8:SAL4] -~w~Toni, tu vas porter un message pour moi ! - -[SAL4_A2:SAL4] -~w~Vire le ~r~chauffeur~w~ du tableau. - -[SAL4_A3:SAL4] -~w~Hé ! - -[SAL4_A4:SAL4] -~w~Monte dans la ~b~limo. - -[SAL4_A5:SAL4] -~w~Ramène la limo à la ~y~station de radio ! - -[SAL4_A6:SAL4] -~w~Maintenant, attends Hopper. - -[SAL4_A7:SAL4] -~w~Gare la limo comme avant. Hopper ne doit rien suspecter. - -[SAL4_B1:SAL4] -~w~Embarcadère d'Harwood ! Et en vitesse ! - -[SAL4_B2:SAL4] -~w~C'est parti ! - -[SAL4_C1:SAL4] -~w~Colle la trouille de sa vie à Hopper ! - -[SAL4_C2:SAL4] -Trouillomètre - -[SAL4S1:SAL4] -~w~Hé, doucement, on fait pas la course ! - -[SAL4S2:SAL4] -~w~Dites donc, c'est pas le bon chemin, si ? - -[SAL4S3:SAL4] -~w~Hé, vous êtes pas mon chauffeur habituel ! - -[SAL4S4:SAL4] -~w~Merde, vous êtes qui ?! - -[SAL4S5:SAL4] -~w~Ta gueule ! - -[SAL4S6:SAL4] -~w~A partir de maintenant, tu fais exactement ce que Salvatore Leone te dit ! - -[SAL4S7:SAL4] -~w~Capici ? - -[SAL4S8:SAL4] -~w~Je... Pas question que je cède à ces menaces ! - -[SAL4S9:SAL4] -~w~C'est ce qu'on va voir ! - -[SAL4S10:SAL4] -~w~Laissez-moi sortir, et tout de suite ! - -[SAL4S11:SAL4] -~w~Je vous en prie, vous allez nous tuer ! - -[SAL4S12:SAL4] -~w~Noooooon ! - -[SAL4S13:SAL4] -~w~Qu'est-ce que j'ai fait pour mériter ça ? - -[SAL4_F1:SAL4] -~w~Où est ma limo ? - -[SAL4_F2:SAL4] -~w~Vous êtes pas mon chauffeur ! J'appelle la police ! - -[SAL4_F3:SAL4] -~r~Trop tard, Hopper t'a démasqué ! - -[SAL4_F4:SAL4] -~w~Salvatore peut aller se faire foutre ! - -[SAL4_F5:SAL4] -~r~La limo est détruite ! - -[SAL4_F6:SAL4] -~r~Hopper est morte ! - -[SAL4_F7:SAL4] -~r~Hopper a filé ! - -[SAL4_F8:SAL4] -~r~L'état de la limo a alerté Hopper. - -[SAL4_F9:SAL4] -~r~Hopper a eu la trouille. - -[SAL4_P1:SAL4] -~w~OK ! OK ! J'en ai assez ! - -[SAL4P1A:SAL4] -~w~Je ferai ce que vous voudrez. - -[SAL4_P2:SAL4] -~w~Conduis Hopper au ~y~piquet de grève de l'embarcadère. - -[SAL4_P3:SAL4] -~w~Et oublie pas notre accord, ma poule ! - -[SAL4_H1:SAL4] -~w~Une bonne dose de vitesse, de collisions et de cascades, et Hopper sera à tes pieds. - -[SAL4_F0:SAL4] -~r~Trop tard ! Hopper a quitté la station de radio ! - -[SAL4_A:SAL4] -~w~Atteins la ~y~station de radio~w~ avant que Hopper ne parte, à 0~1~:00. - -[SAL4_A1:SAL4] -~w~Atteins la ~y~station de radio~w~ avant que Hopper ne parte, à ~1~:00. - -{=================================== MISSION TABLE SAL6 ===================================} - -[SAL6_A0:SAL6] -~w~Toni, on a des ennuis, de gros ennuis ! - -[SAL6_A1:SAL6] -~w~Qu'est-ce qui se passe, Sal ? - -[SAL6_A3:SAL6] -~w~Ils nous mettent une branlée ! - -[SAL6_A4:SAL6] -~w~On termine tout juste une putain de guerre et BAM ! On se retrouve au beau milieu d'une autre ! - -[SAL6_A5:SAL6] -~w~J'te jure... Juste au moment où les choses s'amélioraient. Putain, j'suis maudit ! - -[SAL6_A6:SAL6] -~w~Hé, vous en faites pas pour ça, boss. J'm'en occupe. - -[SAL6_AA:SAL6] -~w~Sal a laissé les armes dont t'auras besoin dans le garage. - -[SAL6_B:SAL6] -~w~Arrête le massacre des ~r~Diablos~w~ avant que tous les mecs de Leone se fassent tuer ! - -[SAL6_1:SAL6] -~w~Seuls ~1~ mecs de Leone sont encore vivants ! - -[SAL6_2:SAL6] -~w~Un seul Leone est encore en vie ! - -[SAL6_C1:SAL6] -~w~On va tous se faire massacrer, Toni ! - -[SAL6_C2:SAL6] -~w~Je suis pas payé assez cher pour ça, mec ! - -[SAL6_C3:SAL6] -~w~T'es fêlé, Toni ! On va tous y passer ! - -[SAL6_E1:SAL6] -~w~Sal ? - -[SAL6_E2:SAL6] -~w~Toni ! C'est réglé ? Ca donne quoi ? - -[SAL6_E3:SAL6] -~w~C'est pas bon, Sal. - -[SAL6_E4:SAL6] -~w~J'ai sauvé quelques gars, mais on en avait perdu plein avant que j'arrive. - -[SAL6_E5:SAL6] -~w~J'crois qu'on va se faire virer de ce territoire. - -[SAL6_E6:SAL6] -~w~Faudra me tuer d'abord ! C'est pas encore joué ! - -[SAL6_E7:SAL6] -~w~Je peux pas perdre ! Les Leone battent jamais en retraite ! - -[SAL6_E8:SAL6] -~w~Tu m'entends, Toni ? - -[SAL6_E9:SAL6] -~w~Z'avez raison, Sal. - -[SAL6_G0:SAL6] -~r~Tous les hommes de Leone sont morts. - -[SAL6_Z1:SAL6] -Leone - -[SAL6_Z2:SAL6] -Diablos - -[SAL6_C0:SAL6] -~w~Qu'ils aillent se faire foutre ! On se tire d'ici ! - -[SAL6_A2:SAL6] -~w~Ce foutu monde tourne pas rond ! On a des tas de Diablos sur le dos à Hepburn ! - -{=================================== MISSION TABLE SAL7 ===================================} - -[SAL7_01:SAL7] -~w~Hé, Sal ! - -[SAL7_02:SAL7] -~w~Toni ! Comment tu trouves cette nouvelle caisse ? - -[SAL7_05:SAL7] -~w~Un vrai bijou, pas vrai ? Toutes les options, du haut de gamme. - -[SAL7_A6:SAL7] -~w~... Ah oui, la crise de la quarantaine ! - -[SAL7_07:SAL7] -~w~Ferme-la ! Ecoute, Toni... - -[SAL7_08:SAL7] -~w~J'ai un gros tas de fric à récupérer dans mon entrepôt du côté de Callahan Point. - -[SAL7_10:SAL7] -~w~Je peux faire confiance à personne. - -[SAL7_11:SAL7] -~w~Bon, vous allez papoter toute la journée ou on y va ? - -[SAL7_12:SAL7] -~w~Bébé, j'me souviens pas t'avoir donné l'autorisation de l'ouvrir ! - -[SAL7_20:SAL7] -~w~Allez ! Vite ! - -[SAL7_21:SAL7] -~w~OK... - -[SAL7_22:SAL7] -~w~Allons-y ! - -[SAL7_23:SAL7] -~w~Hé, Toni ! Come sta ? - -[SAL7_30:SAL7] -~w~Va à ~y~l'entrepôt. - -[SAL7_40:SAL7] -~w~Récupère le fric de Salvatore avant qu'il ne parte en fumée ! - -[SAL7_50:SAL7] -~w~Rapporte le fric chez ~y~Salvatore. - -[SAL7_NM:SAL7] -~w~Retourne là-bas ! T'as pas pris tout le ~g~fric ! - -[SAL7_E1:SAL7] -~w~Tuez-le ! - -[SAL7_E2:SAL7] -~w~Crève ! - -[SAL7_E3:SAL7] -~w~Y en a un là ! - -[SAL7_E4:SAL7] -~w~Je le vois ! - -[SAL7_T1:SAL7] -~w~Dégage ! - -[SAL7_T2:SAL7] -~w~Tu vas le sentir passer ! - -[SAL7_T3:SAL7] -~w~Allez ! - -[SAL7_T4:SAL7] -~w~Prends ça ! - -[SAL7_F1:SAL7] -~r~T'as pas récupéré le fric de Salvatore à temps ! - -[SAL7_06:SAL7] -~w~Qu'est-ce que ça sent ? - -[SAL7_42:SAL7] -~w~Récupère le ~g~fric~w~ avant qu'il ne parte en fumée ! - -{=================================== MISSION TABLE SAL8 ===================================} - -[SAL8_VE:SAL8] -~r~v1.2 - -[SAL8_11:SAL8] -~w~Toni, trouve une caisse et allons-y... - -[SAL8_12:SAL8] -~w~Va au terminal des ferrys. - -[SAL812A:SAL8] -~w~Mais la grève continue... Y en aura pas beaucoup, des ferrys. - -[SAL812B:SAL8] -~w~Toi, tu conduis et moi, je réfléchis. - -[SAL8_14:SAL8] -~w~Bordel de merde ! Ca grouille de flics par ici ! Sors-nous d'ici en vitesse ! - -[SAL8_15:SAL8] -~w~Où on va ? - -[SAL8_16:SAL8] -~w~Callahan Bridge ! - -[SAL816A:SAL8] -~w~... Mais les travaux sont pas achevés ! - -[SAL816B:SAL8] -~w~C'est nous qui serons achevés si tu décolles pas ! Fonce ! - -[SAL816C:SAL8] -~w~Va à ~y~Callahan Bridge. - -[SAL8_17:SAL8] -~w~Merde, qu'est-ce que tu fais ? - -[SAL8_18:SAL8] -~w~Toni ! On va avoir besoin d'une caisse ! - -[SAL818A:SAL8] -~w~J'ai pas du tout l'intention de marcher ! - -[SAL8_19:SAL8] -~w~T'as abandonné ~b~Salvatore~w~ ! Retourne le chercher ! - -[SAL8_20:SAL8] -~w~Sors-nous de là ! - -[SAL8_22:SAL8] -~w~Toni, t'as réussi ! Je savais que je pouvais te faire confiance ! - -[SAL822B:SAL8] -Bon, écoute... Je connais une planque où on pourra se mettre à l'abri un moment. - -[SAL822C:SAL8] -Allez, en route ! - -[SAL8_25:SAL8] -~w~Faut que ce tas de merde donne tout ce qu'il a dans le ventre ! A fond, Toni ! - -[SAL825A:SAL8] -~w~OH, MEEEEERDE ! - -[SAL8_26:SAL8] -Vitesse de saut - -[SAL8_27:SAL8] -~w~OK, on y est. - -[SAL8_28:SAL8] -~w~Je vais jeter un coup d'oeil dans le coin, voir ce qui se passe... - -[SAL828A:SAL8] -~w~Je te retrouve ici plus tard. - -[SAL8_29:SAL8] -~r~Sal a été tué ! - -[SAL829A:SAL8] -~w~Les flics t'ont repéré ! - -[SAL831:SAL8] -~w~La planque de Staunton est disponible ! - -[SAL833:SAL8] -~w~Sème les flics ! - -[SAL823A:SAL8] -~w~Mais est-ce vraiment le cas ? - -[SAL8_24:SAL8] -~w~Bien que toutes les lignes de métro et de ferrys soient officiellement rouvertes, - -[SAL824A:SAL8] -~w~des militants continuent à bloquer certaines parties de la ville. - -[SAL824B:SAL8] -~w~Le pont levant reliant Staunton Island et Shoreside Vale a été fermé. - -[SAL824C:SAL8] -~w~Les grévistes refusent d'accorder le moindre crédit aux promesses de la municipalité concernant l'avenir des ferrys. - -[SAL824D:SAL8] -~w~Pour conclure sur une note positive, les travaux du Callahan Bridge sont presque achevés. - -[SAL824E:SAL8] -~w~Mais ce travailleur de Liberty City ne pouvait supporter plus de retard. - -[SAL8_23:SAL8] -~w~Le mouvement de grève qui coupait Portland du reste de la ville est désormais terminé. - -[SAL812C:SAL8] -~w~Va jusqu'au ~y~terminal des ferrys. - -[SAL8WAN:SAL8] -Les flics veulent VRAIMENT Salvatore ! Si tu repeins le véhicule, ils finiront par retrouver sa trace. - -[SAL8_21:SAL8] -~w~Va au ~y~pont ! - -[SAL830:SAL8] -~w~Va à la ~y~planque. - -[SAL822A:SAL8] -~w~Si t'étais rasé, je pourrais t'embrasser ! - -[SAL832:SAL8] -~w~Il te faut une voiture ! - -[DRIV_01:SAL8] -Alors ? - -[DRIV_02:SAL8] -Alors quoi ? - -[DRIV_03:SAL8] -Joue pas au con avec moi, petit. - -[DRIV_06:SAL8] -Je sais c'que tu racontes sur moi. - -[DRIV_07:SAL8] -Tu m'prends pour un con ? Hein ? - -[DRIV_08:SAL8] -C'est c'que tu crois ? - -[DRIV_09:SAL8] -Patron, j'ai rien raconté sur vous. - -[DRIV_10:SAL8] -Bordel de merde... Je pige pas ce qui m'arrive... - -[DRIV_11:SAL8] -Putain. - -[DRIV_12:SAL8] -J'deviens parano, Toni. Complètement parano. - -[DRIV_13:SAL8] -Mais c'est pas parce que j'suis parano qu'ça veut dire que j'délire, capici ? - -[DRIV_14:SAL8] -Y a quelqu'un qui veut ma peau et c'est c'putain d'maire !! - -[DRIV_15:SAL8] -Il essaie de me coller tous les crimes du coin sur le dos ! - -[DRIV_16:SAL8] -Tous ! Alors que j'en ai pas commis la moitié ! - -[DRIV_17:SAL8] -Bon, allons régler ça. - -[DRIV_04:SAL8] -- Je jouais déjà au con quand ta mère était encore sur le trottoir. ~n~ - C'est quoi le problème au juste ? - -{=================================== MISSION TABLE JDT1 ===================================} - -[JDT1_CA:JDT1] -~w~J'suis sûr que les filles me truandent ! - -[JDT1_CB:JDT1] -~w~On va aller traîner dans le quartier et voir ce qui se passe ! - -[JDT1_DA:JDT1] -~w~C'est une de mes filles ! - -[JDT1_DB:JDT1] -~w~Hé, j'reconnais cette fille ! - -[JDT1_DC:JDT1] -~w~Une de mes filles ! - -[JDT1_DD:JDT1] -~w~Cette fille bosse pour nous. - -[JDT1_DE:JDT1] -~w~Cette fille là-bas... - -[JDT1_DF:JDT1] -~w~Arrête-toi à côté d'elle ! - -[JDT1_DG:JDT1] -~w~Arrête-toi près d'elle. - -[JDT1_DH:JDT1] -~w~On va l'embarquer. - -[JDT1_DI:JDT1] -~w~Gare-toi à côté d'elle. - -[JDT1_DJ:JDT1] -~w~Va jusqu'à elle. - -[JDT1_MA:JDT1] -~w~Salut, J.D., j'allais justement t'apporter ça, j'te jure ! - -[JDT1_MB:JDT1] -~w~Oh, tu me fais plus confiance, J.D. ? - -[JDT1_MC:JDT1] -~w~Salut, J.D. Mauvaise journée... c'est tout ce que j'ai gagné... - -[JDT1_MD:JDT1] -~w~Tu parles d'un Big Brother ! Le voilà, ton sale fric ! - -[JDT1_ME:JDT1] -~w~Hé, J.D. J'ai ton fric ici. - -[JDT1_MF:JDT1] -~w~Tu croyais que j'allais garder ce fric pour moi ou quoi ? - -[JDT1_MG:JDT1] -~w~Hé, tu nous surveilles, J.D. ? - -[JDT1_MH:JDT1] -~w~Tout est là... t'as qu'à compter ! - -[JDT1_EA:JDT1] -~w~Hé, ce mac est en train de soutirer son fric à une de mes filles ! - -[JDT1_EB:JDT1] -~w~Récupère le fric, Toni ! - -[JDT1_EC:JDT1] -~w~Merde, y fait quoi ce mac ? - -[JDT1_ED:JDT1] -~w~Il prend mon blé ! - -[JDT1_EE:JDT1] -~w~Chope-le, Toni ! - -[JDT1_45:JDT1] -~w~Récupère le ~g~fric du mac. - -[JDT1_46:JDT1] -~w~Le mac a filé ! - -[JDT1_FA:JDT1] -~w~C'est une de mes filles dans cette caisse ! - -[JDT1_FB:JDT1] -~w~Fais marche arrière en douceur jusqu'à la ~b~caisse~w~, que je jette un coup d'oeil. - -[JDT1_FC:JDT1] -~w~... Tout en douceur, faut pas les déranger ! - -[JDT1_FD:JDT1] -~w~Plus près... - -[JDT1_FE:JDT1] -~w~Plus près... - -[JDT1_FF:JDT1] -~w~Doucement... - -[JDT1_IA:JDT1] -~w~Bordel de merde, Toni ! Tu leur as fait peur ! - -[JDT1_GA:JDT1] -~w~Merde, Toni ! Je vois que dalle ! - -[JDT1_75:JDT1] -~w~Attends que la ~b~fille~w~ donne le fric à J.D. ! - -[JDT1_HA:JDT1] -~w~... Oh... ouais ! - -[JDT1_HB:JDT1] -~w~Continue, bébé ! - -[JDT1_HC:JDT1] -~w~C'est ça, c'est ça... - -[JDT1_HD:JDT1] -~w~... Oh OUAIS ! - -[JDT1_HE:JDT1] -~w~Quelle artiste ! - -[JDT1_HF:JDT1] -~w~Bon, c'est fini ou quoi ? - -[JDT1_JA:JDT1] -~w~Bien joué, Toni ! - -[JDT1_JB:JDT1] -~w~J'crois que les filles de cette équipe me causeront plus d'emmerdes... - -[JDT1_LA:JDT1] -~w~T'as tout foiré, Toni ! - -[JDT1_LB:JDT1] -~w~Je retourne au club ! - -[JDT1_ML:JDT1] -~w~Encore ~1~$ à récupérer ! - -[JDT1O01:JDT1] -~w~Monte dans la ~b~camionnette de J.D. - -[JDT1O02:JDT1] -~w~T'as abandonné ~b~J.D.~w~ ! Retourne le chercher ! - -[JDT1O03:JDT1] -~w~Attends que ~b~J.D.~w~ monte. - -[JDT1O04:JDT1] -~w~Cherche les filles de J.D. dans le Red Light District. - -[JDT1O05:JDT1] -~w~Retourne au ~y~club de J.D. - -[JDT1O07:JDT1] -~w~Arrête-toi près de la ~b~fille. - -[JDT1O08:JDT1] -~w~Bute le ~r~mac. - -[JDT1O09:JDT1] -~w~Encaisse le fric d'une des ~b~filles de J.D. - -[JDT1_F1:JDT1] -~r~La camionnette de J.D. a été détruite ! - -[JDT1_F2:JDT1] -~r~J.D. est mort ! - -[JDT1_F3:JDT1] -~r~T'as pas encaissé assez de fric de cette équipe ! - -[JDT1_D1:JDT1] -~w~Les filles de J.D. bossent dans le ~y~Red Light District~w~. Retourne là-bas ! - -[JDT1_F4:JDT1] -~r~Trop de filles de J.D. sont mortes ! - -[JDT1_KA:JDT1] -~w~C'était quoi, ça ? - -[JDT1_KB:JDT1] -~w~On a touché quelque chose ? - -[JDT1_KC:JDT1] -~w~Fais gaffe à la voiture, Toni ! - -[JDT1_81:JDT1] -~w~Tu as fait peur au client ! Il n'a pas besoin de public ! - -[JDT1O10:JDT1] -~w~Approche-toi de la ~b~voiture~w~ dans l'allée. - -[JDT1O11:JDT1] -~w~Klaxonne pour attirer leur attention ! - -[JDT1O12:JDT1] -~w~Plus tu laisses la fille travailler longtemps, plus elle gagne d'argent. - -[JDT1_MO:JDT1] -Cash Dû - -[JDT1_H1:JDT1] -~w~Utilise ~k~ ~VEHN~ pour klaxonner. - -[JDT1_WA:JDT1] -~w~Dépêche-toi ! Les ~b~filles~w~ finissent de bosser à ~1~:~1~ ! - -[JDT1_WB:JDT1] -~w~Dépêche-toi ! Les filles finissent de bosser à ~1~:~1~ ! - -[JDT1O06:JDT1] -~w~Encaisse le fric des filles de J.D., mais dépêche-toi, elles finissent de bosser à ~1~:~1~ ! - -[JDT1_WC:JDT1] -~w~Grouille-toi !~b~Les filles~w~ finissent de bosser à ~1~:0~1~ ! - -[JDT1_WD:JDT1] -~w~Grouille-toi ! Les filles finissent de bosser à ~1~:0~1~ ! - -[JDT1P06:JDT1] -~w~Récupère l'argent de J.D. auprès de ses filles. Fais vite, elles finissent de bosser à ~1~:0~1~. - -[BONE_01:JDT1] -Hé ! J.D., sors de là ! - -[BONE_02:JDT1] -Hé, J.D., pauvre taré, putain, sors de là, - -[BONE_03:JDT1] -ou j'viens te briser les jambes ! - -[BONE_04:JDT1] -Oh oui, je viens... mais pas comme ça, ha ha ! - -[BONE_05:JDT1] -Hé, Toni, que pasa ? On s'embrasse pas ? - -[BONE_06:JDT1] -Merde, t'es tout collant ! - -[BONE_07:JDT1] -Oh, c'est ce machin de strip-teaseuses qu'elles me foutent dessus. - -[BONE_08:JDT1] -Elles adorent ça. Elles en mettent partout et... bon, comment ça va ? - -[BONE_09:JDT1] -Putain, c'est quoi c'truc que tu portes ? - -[BONE_10:JDT1] -Quoi ? Ca ? J'suis un amant aventureux. - -[BONE_11:JDT1] -J'aime bien le... le côté expérimental, tu vois ? - -[BONE_16:JDT1] -Ben, c'est l'problème. On se fait truander. - -[BONE_17:JDT1] -OK, attends là deux secondes. - -[BONE_18:JDT1] -Faut que j'enlève ce... ce truc... - -[BONE_19:JDT1] -Hé, Raven, c'est le moment de ranger le double gode. - -[BONE_20:JDT1] -Allez, viens, Toni, on va faire un petit tour. - -[BONE_21:JDT1] -On a deux trois trucs à voir ensemble... OK ! OK !! - -[BONE_12:JDT1] -- Y a rien de mal à ça, si ? Tu peux mater si tu veux. ~n~- Merde, t'es givré, fais pas chier avec tes conneries. - -[BONE_14:JDT1] -- OK, relax Toni... ~n~ - Où est mon fric ? - -{=================================== MISSION TABLE JDT2 ===================================} - -[JDT2_I1:JDT2] -~w~Heureusement te voilà, Toni ! - -[JDT2_I2:JDT2] -~w~J'viens d'apprendre que les flics vont faire une descente ! - -[JDT2_I3:JDT2] -~w~Et alors ? T'as une licence. - -[JDT2_I4:JDT2] -~w~Pas pour tout ce qui s'passe ici ! - -[JDT2_I5:JDT2] -~w~Salvatore est là, en 'visite spéciale' auprès de mes filles, si tu vois ce que je veux dire... - -[JDT2_I6:JDT2] -~w~Faut le faire sortir d'ici avant que les flics débarquent ! - -[JDT2_I7:JDT2] -~w~Retrouve-le devant ! - -[JDT2_I8:JDT2] -~w~Jamais le temps de s'ennuyer... - -[JDT2_05:JDT2] -~w~Tirons-nous d'ici, et vite ! - -[JDT2_06:JDT2] -~w~Sème les flics, Toni ! J'veux pas ramener ces cons à la maison ! - -[JDT2_A1:JDT2] -~w~Monte dans la ~b~caisse. - -[JDT2_A2:JDT2] -~w~Ne perds pas ~b~Salvatore~w~. Retourne le chercher ! - -[JDT2_A3:JDT2] -~w~Conduis Salvatore ~y~chez lui. - -[JDT2_A5:JDT2] -~r~Salvatore est mort ! - -[JDT2_C1:JDT2] -~w~Tu t'en es bien tiré, fiston. J'aime ton style. T'as pas changé. - -[JDT2_C2:JDT2] -~w~Merci, m'sieur Leone. - -[JDT2_C3:JDT2] -~w~Tu sais, j'crois que Vincenzo t'accapare un peu trop. - -[JDT2_C4:JDT2] -~w~J'aurais besoin d'un bon gars comme toi. - -[JDT2_C5:JDT2] -~w~Appelle-moi un de ces quatre ! L'oncle Sal s'occupera de toi. - -[JDT2_A9:JDT2] -~r~Salvatore a été arrêté ! - -[JDT2_B2:JDT2] -~w~Sème les flics ! - -[JDT2_A6:JDT2] -~w~Ramène la ~b~voiture~w~ de Salvatore avant qu'il se fasse arrêter par les flics ! - -[JDT2_F1:JDT2] -~r~Tu as perdu Salvatore ! - -[JDT2_A4:JDT2] -~w~Conduis Salvatore loin du club et sème les flics ! - -{=================================== MISSION TABLE JDT3 ===================================} - -[JDT3_AA:JDT3] -~w~Salut, Toni, j'peux pas sortir maintenant, j'suis occupé... tu comprends ? - -[JDT3_AB:JDT3] -~w~A quoi ? Y se passe quoi là-dedans ? ... et c'est quoi cette puanteur ? - -[JDT3_AC:JDT3] -~w~Ecoute, Toni, on prépare un repas pour de vrais... euh... spécialistes. - -[JDT3_AD:JDT3] -~w~Ce truc, c'est de l'or en barre sur Internet ! - -[JDT3_AE:JDT3] -~w~Tu ferais mieux de t'inquiéter du tripot de Leone à Saint Mark's. - -[JDT3_AG:JDT3] -~w~Les Sindacco en font tout un plat. - -[JDT3_AH:JDT3] -~w~J'ai entendu dire qu'ils allaient le rayer de la carte... - -[JDT3_B:JDT3] -~w~Liquide les ~r~saboteurs Sindacco ! - -[JDT3_C:JDT3] -~r~Ils~w~ ont posé une bombe à l'extérieur du ~y~casino ! - -[JDT3_D:JDT3] -Explosion - -[JDT3_E:JDT3] -~w~Encore deux comme ça et le ~y~casino~w~ sera ruiné ! - -[JDT3_F:JDT3] -~w~Encore une et y a plus de ~y~casino ! - -[JDT3_H:JDT3] -~w~D'autres ~r~Sindacco~w~ rappliquent ! Arrête-les ! - -[JDT3_I:JDT3] -~w~La bombe du camion est amorcée ! - -[JDT3_J:JDT3] -~w~Le ~y~casino~w~ est sauvé. Tire-toi de là ! - -[JDT3_K:JDT3] -~w~Ils ont dû saboter le camion ! Il est bloqué en première ! - -[JDT3_L:JDT3] -~w~Des ~r~renforts Sindacco~w~ se dirigent vers le ~y~casino ! - -[JDT3_M:JDT3] -~w~Les ~r~Sindacco~w~ ont pas encore renoncé ! Y en a d'autres qui rappliquent ! - -[JDT3_N:JDT3] -~w~Ils se tirent ! Ne laisse aucun ~r~Sindacco~w~ s'échapper ! - -[JDT3_O:JDT3] -Distance de sécurité - -[JDT3_P:JDT3] -~w~Les Sindacco ont préparé un camion piégé ! Ils vont raser le casino d'un seul coup ! - -[JDT3_Q:JDT3] -~w~Défends le ~y~casino. - -[JDT3_R:JDT3] -~w~Va au ~y~casino. - -[JDT3_S:JDT3] -~w~Arrête le ~r~camion piégé~w~ pour protéger le ~y~casino ! - -[JDT3_T:JDT3] -~w~Eloigne le ~r~camion~w~ du ~y~casino~w~ avant qu'il explose ! - -[JDT3_BA:JDT3] -~w~Toni ? C'est J.D. - -[JDT3_BB:JDT3] -~w~Ecoute, j'viens d'apprendre qu'une bande de Sindacco se dirige vers toi. - -[JDT3_BC:JDT3] -~w~Et ils ont des explosifs à plus savoir qu'en faire ! - -[JDT3_BD:JDT3] -~w~Fais gaffe à toi ! - -[JDT3_BE:JDT3] -~w~Merci, J.D. ! - -[JDT3_BF:JDT3] -~w~J'te revaudrai ça. - -[JDT3_G:JDT3] -~r~Le casino a été détruit ! - -{=================================== MISSION TABLE JDT4 ===================================} - -[JDT4_3:JDT4] -~w~Les Sindacco qui gardent la Doll's House ne se fieront qu'aux ~h~voitures Sindacco. - -[JDT4_A1:JDT4] -~w~La classe... Si t'as pas de cul au jeu, tu peux t'en payer un pour te consoler ! - -[JDT4_B0:JDT4] -~w~Trouve un véhicule adapté et équipe-le d'une bombe. - -[JDT4_B1:JDT4] -~w~Remonte dans le ~b~véhicule~w~ avec la bombe. - -[JDT4_B3:JDT4] -~w~Maintenant, abandonne le véhicule et tire-toi ! - -[JDT4_B4:JDT4] -~w~Fais sauter la bombe ! - -[JDT4_B5:JDT4] -~w~Conduis le véhicule à l'~h~atelier~w~ et équipe-le d'une bombe. - -[JDT4_B6:JDT4] -~w~T'approche pas trop près ! - -[JDT4_C0:JDT4] -~r~T'étais trop près de l'explosion. - -[JDT4_C1:JDT4] -~w~Ca, c'est de la part de J.D. ! - -[JDT4_D0:JDT4] -~w~C'est qui, ce type ? - -[JDT4_D2:JDT4] -~w~Ca doit être un nouveau. - -[JDT4_0:JDT4] -COMPTE A REBOURS - -[JDT4_1:JDT4] -~w~Tu ne peux pas placer une bombe là-dessus ! - -[JDT4_2:JDT4] -~w~Suis la ~h~bombe~w~ sur le radar pour trouver l'~h~atelier de 8-Ball. - -[JDT4_A0:JDT4] -~w~Bon, Toni, les Sindacco tiennent une boîte, la 'Doll's House', - -[JDT4_AA:JDT4] -~w~un genre de casino-bordel. - -[JDT4_A2:JDT4] -~w~Hé hé ! Cette boîte est essentielle à leur organisation. - -[JDT4_A3:JDT4] -~w~Si tu pouvais les obliger à mettre la clé sous la porte... la faire sauter ou un truc comme ça... - -[JDT4_A4:JDT4] -~w~j'te jure que Salvatore apprécierait ! - -[JDT4_D1:JDT4] -~w~Je le reconnais pas... - -[JDT4_B2:JDT4] -~w~Prends le véhicule et gare-le dans le ~y~garage~w~ de la 'Doll's House'. - -[JDT4_B7:JDT4] -~w~Conduis prudemment ! Si ton véhicule est trop endommagé, il explosera ! - -[JDT4_B8:JDT4] -~w~Gare le véhicule dans le ~y~garage de la 'Doll's House'. - -[JDT4_4:JDT4] -~w~Appuie sur~h~ ~k~ ~PDFW~ ~w~pour ~h~faire exploser~w~ la bombe. - -[JDT4_B9:JDT4] -~w~Les Sindacco ont désamorcé la bombe ! - -{=================================== MISSION TABLE JDT5 ===================================} - -[JDT5_B0:JDT5] -~w~C'est un des mecs qu'ont enlevé Salvatore ! - -[JDT5_D0:JDT5] -~w~Où il est ? Dans le coffre ? - -[JDT5_D1:JDT5] -~w~Parfait, on l'emmène au broyeur. Le boss veut le voir plus plat qu'une pizza. - -[JDT5_E:JDT5] -~w~Sauve Salvatore avant qu'ils ne broient la ~b~caisse ! - -[JDT5_E0:JDT5] -~w~Ils t'ont repéré ! - -[JDT5_E1:JDT5] -~w~La ~b~caisse~w~ est pas surveillée ! Vole-la ! - -[JDT5_E2:JDT5] -~w~Conduis la caisse chez ~y~Salvatore. - -[JDT5_E3:JDT5] -~w~Remonte dans la ~b~caisse. - -[JDT5_F0:JDT5] -~w~Mmmphhh... mmmphhh... mpphh ! - -[JDT5_F3:JDT5] -~w~Mmpphh... arrgghh... mmpphh ! - -[JDT5_F4:JDT5] -~w~Mmpphh... arrgghh... arrggghh... arrg ! - -[JDT5_F5:JDT5] -~w~Yarrgghh... yarragh... mmpphh ! - -[JDT5_G0:JDT5] -~w~C'est quoi cette façon de conduire ? Tu veux me tuer ? - -[JDT5_G1:JDT5] -~w~M'sieur Leone. Boss... J'suis désolé. - -[JDT5_G2:JDT5] -~w~Qu'est-ce que j'peux dire ? - -[JDT5_G4:JDT5] -~w~J'leur arracherai le coeur ! J'ai pas dit mon dernier mot ! - -[JDT5_G5:JDT5] -~w~... Oh allez, Toni ! Tu m'as sauvé la mise ! Appelle-moi Sal ! - -[JDT5_X0:JDT5] -~r~Pas facile de suivre un homme mort... - -[JDT5_X1:JDT5] -~r~Tu l'as perdu ! - -[JDT5_F1:JDT5] -~w~C'est vous, m'sieur Leone ? C'est moi, Toni. - -[JDT5_F2:JDT5] -~w~Vous en faites pas. Je vais vous faire sortir d'ici ! - -[JDT5_G3:JDT5] -~w~Les fils de putes ! Ils croient qu'ils peuvent me faire ça, à moi !? - -[JDT5_X2:JDT5] -~r~Sal s'en est pas sorti ! - -[JDT5_X4:JDT5] -~r~Il t'a repéré. Tu trouveras plus Sal, maintenant ! - -[JDT5_X3:JDT5] -~r~Salvatore s'est fait écraser ! - -[JDT5_C:JDT5] -~w~Suis la ~r~voiture~w~, mais ne te fais pas repérer. - -[JDT5_0:JDT5] -~w~Si tu tires sur la caisse, tu risques d'atteindre Salvatore ! - -[JDT5_H0:JDT5] -~w~Suis la ~r~voiture~w~, mais ne t'approche pas trop ! - -[JDT5_H1:JDT5] -~w~Tu es trop près ! - -[JDT5_H2:JDT5] -~w~Ne t'éloigne pas trop ou tu vas perdre la ~r~voiture. - -[JDT5_H3:JDT5] -~w~Tu es trop loin ! - -[KIDN_01:JDT5] -J.D. ! - -[KIDN_02:JDT5] -Toni, c'est cool que tu sois là. - -[KIDN_03:JDT5] -Je transpire comme mon oncle dans une cour d'école ! - J'perds les pédales ! - -[KIDN_06:JDT5] -Oh mon dieu, c'est pas possible, y va me les arracher. - -[KIDN_07:JDT5] -Et y va me les coller dans un étau ! Et p'têt pas dans cet ordre-là ! - -[KIDN_08:JDT5] -Oh putain, j'me sens comme le jour où le FBI a fouillé mon disque dur ! - -[KIDN_13:JDT5] -Putain, j'arrive pas à l'croire... - -[KIDN_14:JDT5] -On peut pas m'accuser ! C'est pas ma faute ! - -[KIDN_15:JDT5] -Mais tu connais Salvatore, y va me coller les Moeurs au cul ! - -[KIDN_16:JDT5] -Bordel, ça va faire comme pour le détournement de mineures. - -[KIDN_17:JDT5] -T'as déjà fait de la taule pour détournement d'mineures, toi ? - -[KIDN_18:JDT5] -Y viennent te choper dans les douches ! - -[KIDN_19:JDT5] -Putain, elle avait 16 ans ! Bordel de merde, là, ça va être pire ! - -[KIDN_20:JDT5] -Hé, pauvre connard de suceurs de bites, c'est quoi l'problème ? - -[KIDN_04:JDT5] -- Qu'est-ce qu'on va faire ? ~n~ - Comment ça ? - -[KIDN_11:JDT5] -- Non, non... J'en ai déjà trop pris... ~n~ - Qu'est-ce qui s'passe, bordel ? - -[KIDN_09:JDT5] -J'ai l'coeur qui va exploser. T'aurais pas un tranquillisant ? - -[KIDN_10:JDT5] -Ou du rohapnin ? Ou alors p'têt un... - -[KIDN_21:JDT5] -C'est Salvatore. Il s'est fait kidnapper à la sortie du club. - -[KIDN_23:JDT5] -Pourquoi tu l'as pas dit tout de suite au lieu de me soûler avec tes conneries ? Allez, viens ! - -{=================================== MISSION TABLE JDT6 ===================================} - -[JDT6_A0:JDT6] -~w~Ouf ! Toni ! - -[JDT6_A1:JDT6] -~w~J.D. ? Hé, j'suis à l'arrière de... - -[JDT6_A2:JDT6] -~w~Je sais, je t'ai vu arriver. J'espérais vraiment que tu rappliquerais ! - -[JDT6_A3:JDT6] -~w~Salvatore est fou de rage ! - -[JDT6_A6:JDT6] -~w~Fais en sorte qu'il arrive rien à Salvatore. - -[JDT6_0:JDT6] -Santé de Sal - -[JDT6_1:JDT6] -~r~Salvatore a échoué. - -[JDT6_3:JDT6] -~w~Salvatore sera ici dans ~1~ secondes. - -[JDT6_5:JDT6] -~w~Protège ~b~Salvatore~w~ des ~r~Sindacco. - -[JDT6_6:JDT6] -~w~Un des ~b~gardes de Salvatore~w~ est mort ! - -[JDT6_7:JDT6] -~w~Les deux ~b~gardes de Salvatore~w~ sont morts ! - -[JDT6_8:JDT6] -~w~Les flics ! - -[JDT6_10:JDT6] -~w~Trouve une position favorable avant l'arrivée de Salvatore. - -[JDT6_11:JDT6] -~w~Où tu vas ? Salvatore a besoin de protection dans le Red Light District. - -[JDT6_12:JDT6] -Salvatore débarque. - -[JDT6_D1:JDT6] -~w~Hé... - -[JDT6_D4:JDT6] -~w~Quelqu'un a perdu un dollar ! - -[JDT6_C0:JDT6] -~w~C'est tout ce que tu sais faire ? - -[JDT6_C1:JDT6] -~w~Pauvre naze ! - -[JDT6_C2:JDT6] -~w~Bande de lopettes ! - -[JDT6_C3:JDT6] -~w~J'vais t'apprendre ! - -[JDT6_C4:JDT6] -~w~Prends ça ! - -[JDT6_C5:JDT6] -~w~Bande de bâtards ! - -[JDT6_C6:JDT6] -~w~J'suis le roi de cette ville ! - -[JDT6_A4:JDT6] -~w~Il s'amène ici en personne pour buter tous les Sindacco qu'il trouvera... - -[JDT6_A5:JDT6] -~w~... Alors, j'ai pris la tangente. Ecoute, j'ai laissé un fusil sur le toit, de l'autre côté de la rue. - -[JDT6_9:JDT6] -~w~Récupère le ~g~fusil de précision~w~ sur le toit. - -{=================================== MISSION TABLE JDT7 ===================================} - -[JDT7_VE:JDT7] -~r~v1.00 - -[JDT7_02:JDT7] -~w~Alors comme ça, Salvatore a nettoyé la baraque et maintenant, il s'occupe de la tienne !? - -[JDT7_03:JDT7] -~w~Tout est à moi, maintenant, Toni ! - -[JDT703A:JDT7] -~w~Ces connards de Sindacco ont été virés. - -[JDT7_04:JDT7] -~w~Ecoute, y paraît que les Siciliens essayaient de faire la paix entre les familles. - -[JDT7_4A:JDT7] -~w~Sal est avec un des grands pontes chez lui, en ce moment. - -[JDT7_4B:JDT7] -~w~Le truc, c'est qu'il sent le coup fourré. - -[JDT7_4C:JDT7] -~w~Il veut que quelqu'un aille là-bas pour suivre le mec, qu'on sache où il va. - -[JDT7_06:JDT7] -~r~T'as pas atteint l'hélico à temps ! Massimo est déjà parti ! - -[JDT7_07:JDT7] -~w~Suis ~r~Massimo~w~. Ne le perds pas ! - -[JDT7_08:JDT7] -~r~Il~w~ est en train de filer ! - -[JDT7_09:JDT7] -~r~T'as laissé filer Massimo ! - -[JDT7_10:JDT7] -~w~L'hélico a l'air d'atterrir. T'approche pas trop près ou tu leur feras peur. - -[JDT7_11:JDT7] -~r~Tu t'es trop approché ! Ils t'ont repéré ! - -[JDT7_14:JDT7] -~r~Il~w~ s'en va. Suis-~r~le~w~ à nouveau... - -[JDT7_15:JDT7] -~w~Massimo~w~ a l'air de vouloir atterrir là-bas... - -[JDT7_16:JDT7] -~w~Tu vas devoir t'approcher ~y~plus près... - -[JDT7_17:JDT7] -~r~T'as grillé ta couverture ! - -[JDT7_21:JDT7] -~w~Tu t'es fait repérer ! Liquide les ~r~Triades ! - -[JDT7_12:JDT7] -~w~Come siamo rimasti d'accordo, - -[JDT712A:JDT7] -~w~si vous faites le boulot de mes associés à leur place, vous n'aurez pas à vous plaindre... - -[JDT7_13:JDT7] -~w~... Hepburn Heights appartiendra aux Diablos. - -[JDT7_18:JDT7] -~w~... alors, maintenez les bastardi dei Leone occupés à Portland, - -[JDT718A:JDT7] -et dès que mes associés contrôleront cette ville, vous toucherez le gros lot. - -[JDT718B:JDT7] -Ci pensiamo noi. - -[JDT7_20:JDT7] -~w~Là-bas ! C'est un Leone ! - -[JDT7_22:JDT7] -Distance - -[JD_FIN:JDT7] -~w~Achève les ~r~Triades ! - -[JDT7_05:JDT7] -~w~Va au ~y~manoir de Salvatore~w~ avant le départ de Massimo ! - -[JDT7O07:JDT7] -~w~Atteins le ~y~manoir de Salvatore.~w~ Massimo s'en va à ~1~:~1~. - -[JDT7O08:JDT7] -~w~Il est presque ~1~:~1~. Massimo est sur le point de partir ! - -{=================================== MISSION TABLE JDT8 ===================================} - -[JDT8_A0:JDT8] -~w~Toni... C'est pour aujourd'hui ! J'vais enfin faire partie de la Famille ! - -[JDT8_A1:JDT8] -~w~J.D. l'intouchable ? Dieu nous protège ! - -[JDT8_A2:JDT8] -~w~Ca fait tellement longtemps que j'attendais ça... J'aurais jamais réussi sans toi, Toni. - -[JDT8_A3:JDT8] -~w~Arrête, tu vas me faire pleurer ! - -[JDT8_A4:JDT8] -~w~Salut Mickey ! Ca roule ? - -[JDT8_A5:JDT8] -~w~Je monte derrière... OK. - -[JDT8_C:JDT8] -~w~Monte dans la ~b~caisse~w~ et conduis J.D. à la cérémonie. - -[JDT8_C2:JDT8] -~w~Remonte dans la ~b~caisse. - -[JDT8_C3:JDT8] -~w~Va à la ~y~cérémonie. - -[JDT8_B0:JDT8] -~w~Ah, Toni ! J'vais te dire, j'arrive pas à croire que c'est la réalité ! - -[JDT8_B1:JDT8] -~w~Depuis le temps que j'en rêve ! - -[JDT8_B2:JDT8] -~w~J'ai trimé pour les Sindacco pendant des années pour que dalle ! - -[JDT8_B3:JDT8] -~w~Ces bâtards m'ont maintenu au bas de l'échelle ! - -[JDT8_B5:JDT8] -~w~Mais Salvatore, Dieu le bénisse, il est pas comme ça, et y a pas eu de problème. - -[JDT8_B6:JDT8] -~w~Je t'assure ! - -[JDT8_B7:JDT8] -~w~C'est génial ! - -[JDT8_B8:JDT8] -~w~Toni, j'hallucine ! - -[JDT8_B9:JDT8] -~w~Toni, c'est vraiment excellent, ce qui m'arrive, excellent ! - -[JDT8_BA:JDT8] -~w~Tu te rends compte ? J'y crois pas, c'est complètement dingue ! - -[JDT8_BB:JDT8] -~w~Ca y est, Toni ! J'appartiens à la Famille ! - -[JDT8_D1:JDT8] -~w~Où est Salvatore ? - -[JDT8_D2:JDT8] -~w~Toni, le premier verre est pour moi... - -[JDT8_D3:JDT8] -~w~BANG ! - -[JDT8_H0:JDT8] -~w~Hé, ce mec était une vraie vérole. - -[JDT8_H1:JDT8] -~w~Il a doublé son propre chef ! Disgrazia... - -[JDT8_H2:JDT8] -~w~Salvatore aurait jamais pu faire confiance à une ordure pareille ! - -[JDT8_H3:JDT8] -~w~Balance la putain de caisse dans la rivière. - -[JDT8_H4:JDT8] -~w~T'as qu'à me déposer en route. - -[JDT8_J:JDT8] -~w~Monte dans la ~b~caisse~w~ et va chez Mickey. - -[JDT8_J1:JDT8] -~w~Les flics t'ont repéré avec la caisse ! - -[JDT8_J2:JDT8] -~w~Les flics ont repéré ta ~b~caisse ! - -[JDT8_J3:JDT8] -~w~Remonte dans la ~b~caisse ! - -[JDT8_J4:JDT8] -~w~Dépose Mickey ~y~chez lui. - -[JDT8_K0:JDT8] -~w~Bon, j'te laisse régler ce merdier ! - -[JDT8_K1:JDT8] -~w~Oublie pas, balance la caisse dans la rivière ! - -[JDT8_F:JDT8] -~w~Balance la caisse dans la rivière. - -[JDT8_F1:JDT8] -~w~Balance la ~b~caisse~w~ dans la rivière. - -[JDT8_G5:JDT8] -~r~J.D. est mort ! - -[JDT8_G6:JDT8] -~r~Mickey est mort ! - -[JDT8_G8:JDT8] -~r~T'étais censé balancer la caisse dans la rivière. - -[JDT8_X0:JDT8] -~w~Où tu vas, Toni ? - -[JDT8_X3:JDT8] -~w~On va être en retard. - -[JDT8_X1:JDT8] -~w~Si les flics voient la caisse comme ça, on va se faire arrêter direct ! - -[JDT8_X2:JDT8] -~w~La cérémonie a lieu à Harwood. - -[JDT8_A6:JDT8] -~w~Toni... Toni... C'est pour aujourd'hui ! - -[JDT8_A7:JDT8] -~w~J'vais enfin faire partie de la Famille ! - -[JDT8_A8:JDT8] -~w~J.D. l'intouchable ? - -[JDT8__1:JDT8] -~w~J'attends ce moment depuis longtemps... - -[JDT8__2:JDT8] -~w~Ca aurait jamais été possible sans toi, Toni. - -[JDT8_A9:JDT8] -~w~Dieu nous protège ! - -[JDT8_D0:JDT8] -~w~Hé, on est arrivé ? - -[JDT8_B4:JDT8] -~w~Juste parce que j'avais une goutte de sang irlandais ! - -[JDT8_G7:JDT8] -~r~Tes passagers sont morts ! - -[JDT8_C4:JDT8] -~w~Elimine les ~r~tueurs des Sindacco~w~ avant qu'ils ne butent J.D. ! - -[JDT8_0:JDT8] -~w~Repeindre la voiture te permettra de gagner du temps mais dès que les flics verront le macchabée à la place du mort, ils seront de nouveau à tes trousses. - -[JDT8_K:JDT8] -~w~Oh c'est pas vrai ! - -[JDT8_BC:JDT8] -~w~Toni, putain, faut que tu décompresses. - -[JDT8_C5:JDT8] -~w~Achève les ~r~tueurs Sindacco. - -{=================================== MISSION TABLE MAC1 ===================================} - -[MAC1_AA:MAC1] -~w~M'man ? - -[MAC1_AB:MAC1] -~w~C'est moi, j'suis revenu ! - -[MAC1_AC:MAC1] -~w~Toni ?... Mais enfin, où étais-tu passé ? - -[MAC1_AM:MAC1] -~w~Tu n'as jamais téléphoné tout le temps que tu étais parti ! - -[MAC1_AD:MAC1] -~w~Il n'y avait pas le téléphone là où tu étais ? - -[MAC1_AE:MAC1] -~w~Oh, allez, m'man ! Tu sais bien que j'pouvais pas t'appeler ! - -[MAC1_AF:MAC1] -~w~Un vrai homme aurait appelé sa mère ! - -[MAC1_AG:MAC1] -~w~Tu ferais mieux de suivre l'exemple de Giovanni Casa ! - -[MAC1_AN:MAC1] -~w~Il appelle sa maman tous les jours, lui, - -[MAC1_AH:MAC1] -~w~et il est devenu un brave homme. - -[MAC1_AO:MAC1] -~w~Et sa saucisse sicilienne est la meilleure de la ville ! - -[MAC1_AI:MAC1] -~w~Casa ! Mais, m'man, Casa a rien d'un brave homme. C'est un pervers ! - -[MAC1_AJ:MAC1] -~w~Ce n'est qu'une stupide rumeur ! Quel genre d'homme es-tu, toi, Toni ? - -[MAC1_AK:MAC1] -~w~OK, m'man, comme tu voudras. - -[MAC1_AL:MAC1] -~w~J'vais peut-être appeler Giovanni pour voir ce qu'il devient. - -[MAC1_HA:MAC1] -~w~J'crois que j'ai besoin d'un gros câlin ! - -[MAC1_17:MAC1] -~w~Prouve à ta mère que Giovanni Casa n'est pas un brave homme ! - -[MAC1_B:MAC1] -~w~Va à ton ~y~appartement ~w~pour récupérer ton appareil photo. - -[MAC1_B0:MAC1] -~w~Va au ~y~traiteur de Casa. - -[MAC1B2:MAC1] -~w~Jolie photo ! Rapporte-la chez ~y~ta mère. - -[MAC1_B3:MAC1] -~w~Faufile-toi près de ~r~Casa~w~, et prends une photo compromettante ! - -[MAC1_B5:MAC1] -~w~Fais attention à ne pas ~r~lui~w~ faire peur. - -[MAC1_B6:MAC1] -~r~T'as plus de pellicule et t'as pas pris une seule photo compromettante de Casa pour ta mère. - -[MAC1_B7:MAC1] -~w~Récupère ton ~g~appareil photo. - -[MAC1_C0:MAC1] -~w~T'approche pas trop de ~r~Casa~w~ ou il aura des soupçons ! - -[MAC1_C1:MAC1] -~r~Tu lui as fait peur ! Maintenant, c'est raté pour la photo ! - -[MAC1_C2:MAC1] -~r~Quelque chose a alerté Casa ! - -[MAC1_C3:MAC1] -~r~T'as perdu Casa ! - -[MAC1_C4:MAC1] -~r~Casa s'est fait buter ! - -[MAC1_C5:MAC1] -~w~T'es trop près de ~r~Casa ! - -[MAC1_C6:MAC1] -~w~Ne perds pas ~r~Casa ! - -[MAC1_D0:MAC1] -~w~On dirait que Casa a trouvé un peu d'action. - -[MAC1_JA:MAC1] -~w~Salut, mesdames ! C'est l'heure de la tété ! - -[MAC1_JB:MAC1] -~w~Qui va être ma maman ? - -[MAC1_JC:MAC1] -~w~Oh là là ! - -[MAC1_IA:MAC1] -~w~OK, mesdames, je vous demande juste une minute... - -[MAC1_IB:MAC1] -~w~Je vais passer quelque chose de plus... moi. - -[MAC1_CA:MAC1] -~w~Bébé a besoin d'un gros câlin ! - -[MAC1_CB:MAC1] -~w~J'ai fait caca ! - -[MAC1_DA:MAC1] -~w~Suce ma tétine ! Suce-la ! - -[MAC1_EA:MAC1] -~w~Allez, les filles ! Mettez-vous dans l'ambiance ! - -[MAC1_FA:MAC1] -~w~MERDE ! Y a quelqu'un ! - -[MAC1_FB:MAC1] -~w~Vite ! Dans la camionnette ! - -[MAC1_GA:MAC1] -~w~Oh merde ! Merde ! - -[MAC1_GB:MAC1] -~w~NE ME REGARDE PAS ! - -[MAC1_BA:MAC1] -~w~Salut, m'man ! - -[MAC1_BB:MAC1] -~w~Regarde un peu cette photo ! C'est ton brave Giovanni Casa... qui porte des couches ! - -[MAC1_BC:MAC1] -~w~C'est à ça que tu passes ton temps ? - -[MAC1_BD:MAC1] -~w~A te faufiler dans les bois pour prendre des photos d'hommes ? - -[MAC1_BE:MAC1] -~w~C'est quoi ton problème, Antonio ? Tu me fais honte ! - -[MAC1_BF:MAC1] -~w~Mais... ? - -[MAC1_BG:MAC1] -~w~Et avec ou sans couche, il reste un bien meilleur homme que toi ! - -[MAC1_B8:MAC1] -~w~Maintenant, sors. - -[MAC1_B1:MAC1] -~w~Prends ~r~Casa~w~ en filature, mais ne t'approche pas trop. - -[MAC1_C7:MAC1] -~w~Fais un zoom sur ~r~Casa~w~ pour prendre une photo dont ~r~il aura honte. - -[MAC1_D1:MAC1] -~w~Ne lâche pas ~r~Casa~w~ ! Ca pourrait bien être l'occasion que tu attends. - -{=================================== MISSION TABLE MAC2 ===================================} - -[MAC2_AA:MAC2] -~w~M'man ! M'man! Allez, m'man, parle-moi ! - -[MAC2_AB:MAC2] -~w~Y a plus de m'man qui tienne, t'entends, espèce de lâche ! - -[MAC2_AC:MAC2] -~w~Ne me prends pas pour une imbécile ! Je sais pourquoi tu reviens pas t'installer ici ! - -[MAC2_AD:MAC2] -~w~Tu as peur de quelques Triades ! - -[MAC2_AE:MAC2] -~w~Ton père, Dieu ait son âme, n'aurait jamais laissé personne le chasser de chez lui ! - -[MAC2_AF:MAC2] -~w~Mais, m'man ! - -[MAC2_AG:MAC2] -~w~Mais ton père était pas un lâche, lui ! - -[MAC2_AH:MAC2] -~w~Tant que les Triades te montreront pas un peu de respect, tu ne seras plus mon fils ! - -[MAC2_AI:MAC2] -~w~A la rigueur ma fille, mais pas mon fils ! - -[MAC2_B1:MAC2] -~w~Montre à ta mère que t'as pas peur des Triades. Occupe-toi des ~r~deux gangs de Triades~w~ à Chinatown ! - -[MAC2_I1:MAC2] -~w~Un chef des Triades se trouve dans cette ~r~camionnette blindée~w~. Fais-lui quitter la route ! - -[MAC2_I2:MAC2] -~w~La ~r~camionnette ~w~file et elle perd sa cargaison ! Fais gaffe ! - -[MAC2_I3:MAC2] -~w~Ils se barrent ! Descends ces ordures de ~r~Triades~w~. - -[MAC2_I4:MAC2] -~w~Tu t'es fait repérer ! Liquide tous les ~r~membres des Triades ! - -[MAC2_I5:MAC2] -~w~Tu es dans le territoire des ~r~Triades~w~. Fais gaffe ! - -[MAC2_I6:MAC2] -~w~C'est bon pour cette Triade ! Occupe-toi de l'autre ~r~gang ! - -[MAC2_BA:MAC2] -~w~Ouais ! T'as vu ça, m'man !? - -[MAC2_BB:MAC2] -~w~C'est Toni Cipriani qui vous botte le cul ! - -[MAC2_BC:MAC2] -~w~Oubliez pas ce nom, bande d'imbéciles ! - -{=================================== MISSION TABLE MAC3 ===================================} - -[MAC3_A0:MAC3] -~w~M'man ? J'suis revenu... - -[MAC3_A1:MAC3] -~w~Regarde-toi ! Tu as l'air si maigre ! - -[MAC3_A2:MAC3] -~w~Si tu habitais encore ici, avec ta mère, comme un fils respectable, tu mangerais à ta faim ! - -[MAC3_A3:MAC3] -~w~Et quand je vois les voitures que tu conduis ! - -[MAC3_A4:MAC3] -~w~Tu me fais honte, Antonio, vraiment ! - -[MAC3_A5:MAC3] -~w~Les gens doivent penser que je t'ai mal élevé ! - -[MAC3_A6:MAC3] -~w~Qu'est-ce que j'y peux, m'man ? Tu sais que j'ferais n'importe quoi pour toi ! - -[MAC3_A7:MAC3] -~w~Tu as vu ce Sucho qui fait la course en ville aujourd'hui ? - -[MAC3_A8:MAC3] -~w~Ah, si tu pouvais être comme lui ! - -[MAC3_A9:MAC3] -~w~Il traite sa mère avec beaucoup de respect. - -[MAC3_AA:MAC3] -~w~Evidemment, si ton père était encore là, il gagnerait la course, lui, - -[MAC3_AB:MAC3] -~w~et il effacerait le sourire arrogant du visage de ce Sucho ! - -[MAC3_AC:MAC3] -~w~Ouais, et il le plomberait en beauté ! - -[MAC3_AD:MAC3] -~w~Mais ton père était un homme, un vrai ! Il en avait ! - -[MAC3_B0:MAC3] -~w~Prouve que tu vaux bien mieux que Sucho. Gagne la course et liquide-le. - -[MAC3_C0:MAC3] -~w~T'as battu ~r~Sucho~w~ ! Maintenant, bute-le ! - -[MAC3_C1:MAC3] -~r~Il~w~ essaie de se barrer ! - -[MAC3_X0:MAC3] -~r~T'as laissé filer Sucho ! - -[MAC3_C2:MAC3] -~r~Sucho~w~ s'échappe ! - -{=================================== MISSION TABLE MAC4 ===================================} - -[MAC4_A0:MAC4] -~w~M'man ! M'man ! T'es là ? - -[MAC4_A1:MAC4] -~w~Je ne te parle plus, Toni ! - -[MAC4_A2:MAC4] -~w~Tu déshonores tes racines siciliennes ! - -[MAC4_A3:MAC4] -~w~Depuis que tu as pris cette photo de Casa, il a arrêté de payer sa prime de protection. - -[MAC4_A4:MAC4] -~w~Et qu'est-ce que tu fais pour régler ça ? - -[MAC4_A5:MAC4] -~w~RIEN ! - -[MAC4_A6:MAC4] -~w~Ton père l'aurait déjà transformé en viande froide ! - -[MAC4_A8:MAC4] -~w~mais il faut des tripes pour snober un Cipriani ! - -[MAC4_A9:MAC4] -~w~Ah, si tu pouvais avoir ses tripes ! - -[MAC4_AA:MAC4] -~w~Tu veux que j'aie les tripes de Casa ? - -[MAC4_AB:MAC4] -~w~OK, m'man, tu les auras voulues ! - -[MAC4_B:MAC4] -~w~Va au ~y~traiteur de Giovanni Casa~w~ et persuade-le de venir faire un tour avec toi. - -[MAC4_B0:MAC4] -~w~Salut, Toni... Ca roule ? - -[MAC4_B1:MAC4] -~w~Quoi de neuf ? - -[MAC4_B2:MAC4] -~w~T'as perdu ta langue ? - -[MAC4_B3:MAC4] -~w~Toi et moi, faut qu'on parle, Casa... - -[MAC4_B4:MAC4] -~w~On va se trouver un coin plus peinard... - -[MAC4_C:MAC4] -~w~Ne laisse pas ~r~Casa~w~ s'en sortir vivant. - -[MAC4_C1:MAC4] -~w~Je payerai la prime de protection, Toni ! Je le jure ! - -[MAC4_C2:MAC4] -~w~Oh, arrête, Toni ! J'te donnerai tout ce que tu voudras ! - -[MAC4_C3:MAC4] -~w~Je ferai n'importe quoi, Toni ! Mais me fais pas de mal ! - -[MAC4_D1:MAC4] -~w~OK ! OK ! Tu m'as eu ! - -[MAC4_D2:MAC4] -~w~OK ! OK ! J'abandonne ! Mais me fais plus de mal ! - -[MAC4_D3:MAC4] -~w~Amène-toi, ducon ! - -[MAC4_E0:MAC4] -~w~Emmène Casa à la ~y~scierie. - -[MAC4_E1:MAC4] -~w~Ne laisse pas ~b~Casa ! - -[MAC4_F0:MAC4] -~w~Alors... euh... Où on va ? - -[MAC4_F1:MAC4] -~w~On est toujours potes, hein, Toni ? - -[MAC4_F2:MAC4] -~w~... J'vais te filer le fric que je dois, juré ! - -[MAC4_F3:MAC4] -J'ai juste besoin d'un peu de temps... - -[MAC4_F4:MAC4] -~w~Tu crois que ta mère aime les saucisses épicées ? - -[MAC4_F5:MAC4] -J'peux lui en dégotter sans problème ! - -[MAC4_G0:MAC4] -~w~Alors... euh... de quoi tu veux parler, Toni ? - -[MAC4_G1:MAC4] -~w~C'est pour la prime de protection ? - -[MAC4_G2:MAC4] -~w~C'est ça, non ? - -[MAC4_G3:MAC4] -~w~...Toni ? - -[MAC4_G4:MAC4] -~w~On peut en parler, hein, Toni ? - -[MAC4_G6:MAC4] -~w~Les gens se parlent plus assez de nos jours, Toni. - -[MAC4_G7:MAC4] -~w~Bouge plus et ferme-la, Casa. - -[MAC4_G8:MAC4] -~w~OK, Toni ! Mais... je... j'me sens pas à l'aise. - -[MAC4_G9:MAC4] -~w~Hé ! Attention avec ça, Toni ! C'est l'interrupteur de... - -[MAC4_GA:MAC4] -~w~AAARRRGGGHHHHHHHH ! - -[MAC4_GB:MAC4] -~w~Dégage de là en vitesse ! - -[MAC4_H:MAC4] -~w~La chair à saucisse maison à la sicilienne est dans la ~b~camionnette~w~, en attendant d'être livrée au traiteur de Casa. - -[MAC4_H1:MAC4] -~w~Fais la livraison au ~y~traiteur de Casa. - -[MAC4_H2:MAC4] -~w~Ne laisse pas la ~b~camionnette~w~ là-bas ! - -[MAC4_H3:MAC4] -~w~Sème les flics ! - -[MAC4_I0:MAC4] -~w~Une livraison de chair à saucisse spéciale ? - -[MAC4_I1:MAC4] -~w~Personne ne m'a prévenu ! - -[MAC4_I2:MAC4] -~w~Waou ! On a dévalisé un zoo, ce coup-ci ! - -[MAC4_I3:MAC4] -~w~Y a un gros tas de barbaque ici ! - -[MAC4_I4:MAC4] -~w~... Mmmm ! Délicieux ! OK, je suis preneur. - -[MAC4_I6:MAC4] -~w~S'il apprend ça, il va péter un plomb ! - -[MAC4_I7:MAC4] -~w~Et je l'aurai dans l'os ! - -[MAC4_X0:MAC4] -~r~C'était trop rapide et indolore pour un contrat sicilien ! - -[MAC4_X1:MAC4] -~r~Tu devais livrer la camionnette ! - -[MAC4_X2:MAC4] -~r~T'as perdu Casa ! - -[MAC4_E2:MAC4] -~w~Ne quitte pas la ~y~scierie ! - -[MAC4_I5:MAC4] -~w~Heureusement que Casa n'est pas là. - -[MAC4_G5:MAC4] -~w~Ouais ! Ouais ! C'est bien de parler. - -[MAC4_CN:MAC4] -~w~Appelez les flics ! - -[MAC4_CO:MAC4] -~w~Cherchez de l'aide ! - -[MAC4_CP:MAC4] -~w~Allez chercher de l'aide ! - -[MAC4_CQ:MAC4] -~w~Au secours ! - -[MAC4_CR:MAC4] -~w~Aidez-moi ! - -[MAC4_CS:MAC4] -~w~Sortez-moi de là ! - -[MAC4_A7:MAC4] -~w~Casa est peut-être un peu bizarre, - -[MAC4_C0:MAC4] -~w~On pourrait pas agir comme des gens civilisés, Toni? - -[MAC4_1:MAC4] -~w~Rapproche-toi de ~r~Casa ~w~en te faufilant derrière ~r~lui. - -{=================================== MISSION TABLE MAC5 ===================================} - -[MAC5_AA:MAC5] -~w~M'man ? T'es là ? - -[MAC5_AB:MAC5] -~w~Toni ? ... Je suis au téléphone... - -[MAC5_AC:MAC5] -~w~...ouais, il vient d'arriver... OK... OK... J'essaie de gagner du temps... ciao. - -[MAC5_AD:MAC5] -~w~Toni ? Tu es encore venu contrarier ta mère, hein !? - -[MAC5_AE:MAC5] -~w~Tu passes tes journées à jouer les durs. - -[MAC5_AF:MAC5] -~w~Tu viens jamais me voir, et tu ne me présentes même pas de fiancée ! - -[MAC5_AG:MAC5] -~w~De toute façon, qui voudrait de toi ? Si maigre et si blafard ! - -[MAC5_AH:MAC5] -~w~T'essaies de me faire mourir d'inquiétude et de honte !? ~w~Eh bien, c'est fini ! - -[MAC5_AI:MAC5] -~w~Maintenant... C'est terminé ! - -[MAC5_AJ:MAC5] -~w~J'ai placé un contrat sur ta tête. C'était le seul moyen, Antonio... - -[MAC5_AK:MAC5] -~w~... pour t'apprendre l'obéissance... - -[MAC5_AL:MAC5] -~w~Quoi ? M'man ! - -[MAC5_AM:MAC5] -~w~C'est pour ton bien, mon fils, essaie au moins de mourir en homme ! - -[MAC5_AN:MAC5] -~w~Et arrête de me couvrir de honte ! - -[MAC5_B1:MAC5] -~w~Les tueurs de ta mère sont là ! - -[MAC5_B2:MAC5] -~w~Montre à ta mère que tu vaux bien mieux que ses ~r~tueurs~w~. Tue-les tous ! - -[MAC5_B3:MAC5] -~w~Ils sont vraiment fous de rage ! Liquide-~r~les ! - -[MAC5_B4:MAC5] -~w~Les ~r~tueurs~w~ savent que t'es là. Tu dois t'éloigner de Saint Mark's ! - -[MAC4_B6:MAC5] -~w~D'autres ~r~tueurs~w~ s'amènent ! Dégage de Saint Mark's ! Ils savent où tu es ! - -[MAC4_B7:MAC5] -~w~UNE GRENADE ! COURS ! - -[MAC5_C1:MAC5] -~w~Tu t'es débarrassé de ceux-là... Mais ils ont été payés et d'autres respecteront le contrat, peu importe le temps que ça prendra. - -[MAC5_C2:MAC5] -~w~T'es prévenu... Ils reviendront ! - -[HM1:MAC5] -~w~Ils ne laissent pas tomber ! D'autres ~r~tueurs~w~ se dirigent vers toi. Elimine-les ! - -[HM2:MAC5] -~w~Attention ! Les ~r~tueurs~w~ se rapprochent. Descends-les ! - -[HM3:MAC5] -~w~D'autres ~r~tueurs~w~ approchent ! Explose-les ! - -[HM4:MAC5] -~w~Voici d'autres ~r~tueurs~w~ qui s'amènent ! Tue-les ! - -[MAC5_B5:MAC5] -~w~Occupe-toi des derniers ~r~tueurs~w~, mais n'entre pas dans Saint Mark's ! - -{=================================== MISSION TABLE MAR1 ===================================} - -[MAR1M1:MAR1] -~w~T'es en retard. Ah, les hommes... - -[MAR1M2:MAR1] -~w~Je vais faire du shopping et toi, tu conduis. - -[MAR1M3:MAR1] -~w~Alors sois gentil, je veux m'amuser aujourd'hui, même si t'en crèves ! - -[MAR1M4:MAR1] -~w~Je vais juste finir de me préparer. - -[MAR1M5:MAR1] -~w~Oh, pis non ! Je suis parfaite ! On y va, Toni ! - -[MAR1_B:MAR1] -~w~Conduis Maria au ~y~magasin. - -[MAR1_D:MAR1] -~w~Attends-moi ici, mon chou, ça sera pas long... - -[MAR1_D2:MAR1] -~w~Mais je voulais juste voir ce que ça donnait à la lumière du jour ! - -[MAR1_E:MAR1] -~w~Tirons-nous de là ! - -[MAR1_E3:MAR1] -~w~Retourne chercher ~b~Maria. - -[MAR1_F:MAR1] -~w~C'était génial ! Mais je dois encore récupérer deux trois trucs. - -[MAR1_G:MAR1] -~w~Laisse tourner le moteur... - -[MAR1_GB:MAR1] -~w~Déconne pas, Maria ! Arrête de faucher ! - -[MAR1_GC:MAR1] -~w~Mais non, mon chou ! C'était juste un malentendu ! - -[MAR1_G2:MAR1] -~w~Puisque je vous dis que j'ai rien caché ! - -[MAR1_H:MAR1] -~w~Ramène-moi chez moi ! - -[MAR1_I:MAR1] -~w~Si tu m'abandonnes ici, je demanderai à Salvatore de te les couper ! - -[MAR1_J:MAR1] -~r~Maria est morte ! Le monde est pas humain ! - -[MAR1_K:MAR1] -~w~Toni, mon chou, je me suis bien amusée ! - -[MAR1_K2:MAR1] -~w~Repasse donc un peu plus tard si tu veux qu'on s'amuse... tous les deux... - -[MAR1_K3:MAR1] -~w~A plus tard, mon chou ! - -[MAR1_L:MAR1] -~w~Les flics sont à nos trousses ! T'as intérêt à les semer ! - -[MAR1_L2:MAR1] -~w~On les a semés ! Allons faire du shopping ! - -[MAR1_M:MAR1] -~w~STOP ! VOLEUSE ! - -[MAR1EXT:MAR1] -~w~Ramène Maria à son ~y~appartement. - -[MAR1_D3:MAR1] -~w~Enlevez vos sales pattes de moi ! - -[MAR1_G3:MAR1] -~w~Foutez-moi la paix ! - -[MAR1_E2:MAR1] -~w~Sème les flics ! - -{=================================== MISSION TABLE MAR2 ===================================} - -[MAR2_AA:MAR2] -~w~C'est bon ! Un des molosses de Salvatore me conduit tout de suite... - -[MAR2_AB:MAR2] -~w~... oh, c'est un charmeur... - -[MAR2_AC:MAR2] -~w~Peut-être un peu trop maigre... - -[MAR2_AE:MAR2] -~w~Bon, écoute, je veux faire la fête, mais le placard est vide... - -[MAR2_AF:MAR2] -~w~T'as pas un peu de sucre ? Pure cane ? - -[MAR2_AG:MAR2] -~w~Génial. Ciao ! - -[MAR2_AH:MAR2] -~w~En route, Toni ! J'ai des courses à faire. - -[MAR2_BA:MAR2] -~w~T'as pas de caisse ? - -[MAR2_BB:MAR2] -~w~Dépêche ! Mon dealer va pas m'attendre toute la journée. - -[MAR2_3F:MAR2] -~w~Conduis Maria jusqu'à son ~y~dealer. - -[MAR2_BC:MAR2] -~w~Les voilà. Arrête-toi juste derrière eux. C'est bien... - -[MAR2_GA:MAR2] -~w~Attends-moi ici. - -[MAR2_GB:MAR2] -~w~J'suis pas sûr d'aimer ça. - -[MAR2_GC:MAR2] -~w~C'est gentil de t'inquiéter, mais j'suis la nana de Salvatore, tout ira bien. - -[MAR2_GE:MAR2] -~w~J'vais nulle part avec vous ! Vous vous prenez pour qui ? - -[MAR2_GF:MAR2] -~w~Fonce ! - -[MAR2_GG:MAR2] -~w~Toni ! - -[MAR2_GH:MAR2] -~w~Oh, meeeerde ! - -[MAR2_19:MAR2] -~w~Tue les ~r~Sindacco ! - -[MAR2_EA:MAR2] -~w~T'es contente de toi ? - -[MAR2_EB:MAR2] -~w~Toni Cipriani. Mon Héros ! - -[MAR2_EC:MAR2] -~w~Tu sais quoi ? Je me suis assez amusée. Ramène-moi, mon chou... - -[MAR2_HA:MAR2] -~w~Alors, euh... Tu montes boire un café... ou autre chose... ? - -[MAR2_HB:MAR2] -~w~Une autre fois. - -[MAR2_HC:MAR2] -~w~T'es sûr ? Ben, appelle-moi... - -[MAR2_O2:MAR2] -~w~Ramène Maria à son ~y~appartement. - -[MAR2_CA:MAR2] -~w~Vite, Toni ! - -[MAR2_CB:MAR2] -~w~C'est pas vrai, Toni, allez ! - -[MAR2_CC:MAR2] -~w~Au secours, Toni ! - -[MAR2_CD:MAR2] -~w~A l'aide ! - -[MAR2_CE:MAR2] -~w~Dépêche ! - -[MAR2_FA:MAR2] -~w~Et où je trouve ma came, maintenant, moi ? - -[MAR2_FB:MAR2] -~w~Tu crains, Toni ! - -[MAR2_LM:MAR2] -~w~T'as abandonné ~b~Maria~w~ ! Retourne la chercher. - -[MAR2_MD:MAR2] -~r~Maria est morte. - -[MAR2_WA:MAR2] -~w~Les ~r~dealers~w~ s'échappent ! - -[MAR2_DM:MAR2] -~r~Les dealers t'ont semé ! - -[MAR2_DA:MAR2] -~w~Tu parles d'un héros ! - -[MAR2_DF:MAR2] -~r~T'as fait peur aux dealers de Maria ! - -[MAR2_18:MAR2] -~w~Percute la ~r~voiture des Sindacco~w~ pour sauver Maria ! - -[MAR2_AD:MAR2] -~w~... ouais. - -{=================================== MISSION TABLE MAR3 ===================================} - -[MAR3_A0:MAR3] -~w~Cher Toni, je me suis offerte comme premier prix d'une course urbaine. - -[MAR3_A1:MAR3] -~w~Si Salvatore l'apprend, on aura tous les deux de gros ennuis... - -[MAR3_A2:MAR3] -~w~Alors, tu ferais mieux de venir sauver mes fesses... Et peut-être même que tu pourras en profiter ! - -[MAR3_A3:MAR3] -~w~Je t'embrasse, Maria. - -[MAR3_E0:MAR3] -~w~Allez, Maria ! On y va ! - -[MAR3_E1:MAR3] -~w~Ah, monsieur le dur passe enfin à l'action ! - -[MAR3_E2:MAR3] -~w~Ecoute, Maria. T'es la poule de Salvatore... - -[MAR3_E3:MAR3] -~w~Je suis la poule de personne ! - -[MAR3_E4:MAR3] -~w~... T'es vraiment qu'un sale ringard ! - -[MAR3_E5:MAR3] -~w~Allons-y, Wayne ! On va faire la fête ! - -{=================================== MISSION TABLE MAR4 ===================================} - -[MAR4_B1:MAR4] -~w~Wayne est avec son gang à ~y~Chinatown. - -[MAR4_B2:MAR4] -~w~Va là-bas et liquide-le ! - -[MAR4_C1:MAR4] -~r~Wayne~w~ se tire ! Grimpe sur une moto et explose-le ! - -[MAR4_C3:MAR4] -~w~T'es en train de le perdre ! Laisse pas ~r~Wayne ~w~se barrer ! - -[MAR4_D1:MAR4] -~w~C'est toi, Wayne ? - -[MAR4_D2:MAR4] -~w~Ca dépend, c'est pour qui ? - -[MAR4_D3:MAR4] -~w~J'suis un pote à Maria. - -[MAR4_D4:MAR4] -~w~... Alors, ça t'excite de cogner les gonzesses ? - -[MAR4_D5:MAR4] -~w~Cette salope l'avait cherché ! - -[MAR4_D6:MAR4] -~w~Ah ouais ? Alors, toi aussi ! - -[MAR4_D7:MAR4] -~w~Chopez-le ! - -[MAR4_T1:MAR4] -~w~Amène-toi, guignol ! - -[MAR4_T2:MAR4] -~w~T'es vraiment qu'un gros naze ! - -[MAR4_T3:MAR4] -~w~Tu sais même pas conduire une moto ! - -[MAR4_T4:MAR4] -~w~Si t'approches assez près, tu pourras embrasser mon cul ! - -[MAR4_F1:MAR4] -~r~T'as laissé filer Wayne ! - -[MAR4_P1:MAR4] -~w~T'as eu ce gros naze ! - -[MAR4_H1:MAR4] -Santé de Wayne - -[MAR4_C4:MAR4] -~w~Ne perds pas de vue ~r~Wayne. ~w~Poursuis-le et élimine-le ! - -[BIK_01:MAR4] -Qu'est-ce que t'as pris ? - -[BIK_02:MAR4] -Rien. - -[BIK_03:MAR4] -C'était quoi, ce coup-ci ? - -[BIK_04:MAR4] -De l'héro ? Des calmants ? Des quaaludes ? Un peu trop de coke ? - -[BIK_08:MAR4] -Qui t'a fait ça ? - -[BIK_09:MAR4] -Personne. - -[BIK_10:MAR4] -Qui c'est ? - -[BIK_11:MAR4] -Un mec que je fréquente, Wayne. - -[BIK_12:MAR4] -Un mec que tu fréquentes... T'es la nana d'mon patron ! - -[BIK_13:MAR4] -Ecoute, Toni, faut être plus cool. D'ailleurs, il me file du super speed, tu sais... - -[BIK_14:MAR4] -Une fille, ça a besoin d'excitants. - -[BIK_15:MAR4] -Et au lit, ça rend vraiment sauvage... - -[BIK_16:MAR4] -Ferme-la. Pourquoi il t'a fait ça, - -[BIK_17:MAR4] -ce connard de Wayne ? - -[BIK_18:MAR4] -Je lui ai dit que j'étais amoureuse d'un autre. - -[BIK_19:MAR4] -Je lui ai parlé de nous, Toni. - -[BIK_22:MAR4] -Où il est, ce Wayne ? - -[BIK_23:MAR4] -Il deale dans un bar de Chinatown. - -[BIK_24:MAR4] -Je t'aime, Toni Cipriani. - -[BIK_06:MAR4] -- Un peu trop de remontants pas assez forts ? ~n~ - Ferme-la, Toni ! - -[BIK_05:MAR4] -Ou pas assez d'antidépresseurs ? - -[BIK_20:MAR4] -- Et alors, il m'a cognée ! ~n~ - Y a rien entre toi et moi ! Merde, j'hallucine... - -{=================================== MISSION TABLE MAR5 ===================================} - -[MAR5_EA:MAR5] -~w~Pourquoi tu m'as conduite ici ? - -[MAR5_EB:MAR5] -~w~Ma came est pas là... Ici, c'est le coin où Wayne traînait toujours. - -[MAR5_EC:MAR5] -~w~... Je me souviens ! J'ai un peu de zap caché dans Hepburn Heights ! - -[MAR5_ED:MAR5] -~w~Hé, c'est cette salope de Maria ! Et c'est l'enfoiré qu'a buté Wayne ! - -[MAR5_AA:MAR5] -~w~J'ai caché le zap derrière la poubelle ! - -[MAR5_AB:MAR5] -~w~Merde ! Les ordures ont été enlevées ! - -[MAR5_AC:MAR5] -~w~Attends ! Je me souviens ! J'ai une autre cachette dans mon appart' ! - -[MAR5_AD:MAR5] -~w~T'es sûre, ce coup-ci ? - -[MAR5_AE:MAR5] -~w~Evidemment ! - -[MAR5_BA:MAR5] -~w~Je voulais dire chez Salvatore ! Chez Salvatore ! - -[MAR5_BB:MAR5] -~w~Tu te fous de moi, Maria !? - -[MAR5_FA:MAR5] -~w~Qu'est-ce que c'est que ce chauffeur ? J'attends depuis des plombes ! J'aurais pu faire une OD ! - -[MAR5_FB:MAR5] -~w~Je suis horrible ! Il me faut une nouvelle garde-robe, de nouveaux seins et une nouvelle tête ! - -[MAR5_FC:MAR5] -~w~Mon chou... T'as de l'argent ? - -[MAR5_FD:MAR5] -~w~Euh... Pas trop... - -[MAR5_FE:MAR5] -~w~Alors, je comprends pas pourquoi tu me tournes autour ! Je suis la nana de Salvatore ! - -[MAR5_FF:MAR5] -~w~Il est pété de thune ! T'as pas intérêt à recommencer à me brancher ! - -[MAR5_CA:MAR5] -~w~Mmm... - -[MAR5_CB:MAR5] -~w~Oh merde, je crois que je vais vomir. - -[MAR5_CC:MAR5] -~w~Je plane, Toni, putain, ce que je plane ! - -[MAR5_CD:MAR5] -~w~J'me sens pas bien... - -[MAR5_CE:MAR5] -~w~Tu conduis trop vite ! Trop lentement ! - -[MAR5_NC:MAR5] -~b~Maria~w~ peut à peine marcher. Trouve une caisse ! - -[MAR5_ND:MAR5] -~w~Maria peut à peine marcher. Trouve une caisse ! - -[MAR5_DA:MAR5] -~w~Putain, on va t'exploser, mec ! - -[MAR5_DB:MAR5] -~w~Toi et la salope, on va vous massacrer ! - -[MAR5_DC:MAR5] -~w~T'as fait une grosse erreur en essayant de nous baiser ! - -[MAR5_LM:MAR5] -~w~T'as abandonné ~b~Maria~w~ ! Retourne la chercher ! - -[MAR5_O1:MAR5] -~w~Conduis Maria au resto à ~y~Callahan Point. - -[MAR5_O2:MAR5] -~w~Conduis Maria à ~y~Hepburn Heights. - -[MAR5_O3:MAR5] -~w~Conduis Maria à ~y~son appartement. - -[MAR5_O4:MAR5] -~w~Conduis Maria au ~y~manoir de Salvatore. - -[MAR5_O5:MAR5] -~w~Retourne chercher ~b~Maria. - -[MAR5_MD:MAR5] -~r~Maria est morte ! - -[MAR5_O6:MAR5] -~w~Va chercher ~b~Maria. - -[OVER_01:MAR5] -Oh... Hé... Chéri... J'croyais que t'arriverais jamais... - -[OVER_02:MAR5] -Qu'est-ce que t'as ? - -[OVER_03:MAR5] -Oups ! Rien, chéri, tout va bien... - -[OVER_04:MAR5] -Debout, pauvre connasse, qu'est-ce que t'as encore pris ? - -[OVER_05:MAR5] -Encore pris ? Pas grand-chose... - -[OVER_06:MAR5] -Juste une ou deux... ou deux vertes, et puis une ou deux rouge foncé. - -[OVER_07:MAR5] -Oh, et puis, ces super pilules que j'fais venir de Hollande... - -[OVER_08:MAR5] -Une merveille ! C'est trop cool... - -[OVER_09:MAR5] -Non, c'est pas cool... - -[OVER_10:MAR5] -J'ai besoin d'un zap et tout ira bien ! - -[OVER_11:MAR5] -Ils sont quelque part par là. - -[OVER_12:MAR5] -C'est quoi ça, un zap ? - -[OVER_13:MAR5] -Un zap ? Tu sais pas ce que c'est qu'un zap ? - -[OVER_14:MAR5] -Ah, Toni, t'es vraiment un ringard ! - -[OVER_17:MAR5] -J'ai besoin d'un zap, Toni ! Je vais mourir ! - -[OVER_18:MAR5] -J'ai déjà ressenti ça juste avant une OD ! - -[OVER_19:MAR5] -Trouve-moi un zap, Toni ! - -[OVER_20:MAR5] -Je les ai oubliés au resto à Callahan Point. - -[OVER_21:MAR5] -Alors, bouge-toi ! On y va ! - -[OVER_15:MAR5] -- Toni, je t'aime. ~n~ - Allez, arrête de délirer ! - -{=================================== MISSION TABLE VIC1 ===================================} - -[VIC1I11:VIC1] -~w~J'ai une piaule sympa pour toi, Toni. - -[VIC1I12:VIC1] -~w~Ca va te plaire, c'est clair. - -[VIC1I13:VIC1] -~w~On va d'abord aller là-bas. - -[VIC1I14:VIC1] -~w~T'as le coeur sur la main. - -[VIC1_3:VIC1] -~w~Conduis Vincenzo à son ~y~entrepôt. - -[VIC1_4:VIC1] -~w~Remonte dans la ~b~caisse. - -[VIC1_5:VIC1] -~w~Conduis Vincenzo à la ~y~planque. - -[VIC1_6:VIC1] -~w~Marche sur le repère jaune dans l'embrasure de la ~y~porte. - -[VIC1_7:VIC1] -~w~Marche sur l'icone de fringues pour en changer. - -[VIC1_8:VIC1] -~w~Rejoins Vincenzo dehors. - -[VIC1_9:VIC1] -~w~Amène Vincenzo à ~y~Atlantic Quays. - -[VIC1_9A:VIC1] -~w~Maintenant, ramène-moi chez moi ! - -[VIC1_10:VIC1] -~w~Monte dans la ~b~caisse. - -[VIC1_D1:VIC1] -~w~Merde, Toni ! Tu conduis comme une gonzesse ! - -[VIC1_D2:VIC1] -~w~Fais gaffe à cette putain de caisse ! - -[VIC1_D3:VIC1] -~w~Toni, arrête de me manquer de respect et conduis comme un homme ! - -[VIC1_C1:VIC1] -~w~On y est, Toni. Ton petit chez toi. Mignon tout plein, pas vrai ? - -[VIC1_C2:VIC1] -~w~J'vais devoir crécher dans ce trou à rats ? - -[VIC1_C3:VIC1] -~w~Oh ! Mais ça te convient à merveille. - -[VIC1_C4:VIC1] -~w~Là, tu manques de respect au vieux Vincenzo. - -[VIC1_C5:VIC1] -~w~OK, champion, bouge ton cul là-haut et trouve des fringues correctes. - -[VIC1_C6:VIC1] -~w~J'ai pas toute la journée, magne-toi ! - -[VIC1_C7:VIC1] -~w~Hé, les apparts, ça coûte du fric, Toni. - -[VIC1_C8:VIC1] -~w~T'oublies peut-être qui paye les factures dans le coin... - -[VIC1_C9:VIC1] -~w~MOI ! Bibi ! Papa Vincenzo ! - -[VIC1C10:VIC1] -~w~Alors maintenant, tu bosses pour moi. - -[VIC1C11:VIC1] -~w~Et t'as intérêt à revenir ici vite fait... - -[VIC1_F:VIC1] -~r~Vincenzo est mort. - -[HOMS_01:VIC1] -Bon... alors le voilà, hein ? - -[HOMS_02:VIC1] -Ecoute, Toni, tu nous as rendu un grand service, - -[HOMS_03:VIC1] -et j'sais que ça fait un bail que tu te planques, - -[HOMS_04:VIC1] -alors, j'veux que tu te la coules douce un moment. - -[HOMS_05:VIC1] -Vincenzo va s'occuper d'toi. - -[HOMS_06:VIC1] -Si t'as besoin de fric, tu lui demandes. - -[HOMS_07:VIC1] -Si tu veux un job, Lucky te dégottera ça. - -[HOMS_08:VIC1] -Un mec de la famille peut pas rêver mieux. - -[HOMS_09:VIC1] -Même mon fils a pas la vie aussi cool. - -[HOMS_10:VIC1] -Mais, M. Leone, j'croyais qu'on était liés, - -[HOMS_11:VIC1] -j'ai beaucoup fait pour cette famille. - -[HOMS_12:VIC1] -Et là, vous voulez que j'obéisse à ce... ce... cet... - -[HOMS_13:VIC1] -Enfin, j'trouve pas ça très... juste... - -[HOMS_14:VIC1] -Toni, j'sais ce que t'as fait et y a personne qu'est plus reconnaissant que moi, j'te jure ! - -[HOMS_15:VIC1] -Mais si tu débarques comme ça - -[HOMS_16:VIC1] -et que tu commences à discuter mes ordres, franchement, - -[HOMS_17:VIC1] -c'est pas possible. Capici ? - -[HOMS_18:VIC1] -Compris, chef. - -[HOMS_19:VIC1] -Bene, alors quand t'as besoin de quelque chose, t'appelles Vincenzo à Atlantic Quays. - -[HOMS_20:VIC1] -Il s'occupera de toi, pas vrai, Lucky ? - -[HOMS_21:VIC1] -'sûr, chef, tout ce que vous voulez. - -[HOMS_22:VIC1] -D'ailleurs, on peut y aller direct. - -{=================================== MISSION TABLE VIC2 ===================================} - -[VIC2M2:VIC2] -Ce glandeur a pas fait un rond depuis des jours. - -[VIC2M3:VIC2] -Il a peut-être besoin d'encouragements pour se bouger le cul et se mettre au boulot. - -[VIC2M4:VIC2] -Une vraie gonzesse... Il me fait un peu penser à toi. - -[VIC2M5:VIC2] -~w~Qu'est-ce t'essaies de dire !? - -[VIC2M6:VIC2] -J'essaie pas, je le dis, c'est tout ! - -[VIC2M7:VIC2] -Je te dis juste d'aller là-bas pour veiller à ce que ce connard fasse rentrer un peu de fric ! - -[VIC2_B:VIC2] -~w~Trouve une caisse. - -[VIC2OB1:VIC2] -~w~Conduis le dealer au ~y~boulot. - -[VIC2_C:VIC2] -~w~Il va te falloir une caisse pour l'emmener dans son secteur habituel ! - -[VIC2_D:VIC2] -~w~Va chercher le dealer de Vincenzo à ~y~Saint Mark's. - -[VIC2_E:VIC2] -~w~Alors, Vincenzo m'a dit que t'étais trop une flipette pour bosser dans ton secteur ? - -[VIC2_E2:VIC2] -~w~Hé, mec, j'suis pas une flipette ! - -[VIC2_EX:VIC2] -~w~Je... euh... J'ai juste été malade ! - -[VIC2_E3:VIC2] -~w~Je retourne bosser demain... ou après-demain. - -[VIC2_E4:VIC2] -~w~Oh, que ça te plaise ou non, va falloir que t'y ailles aujourd'hui ! - -[VIC2_F:VIC2] -~w~Hé, me laisse pas ici, c'est un quartier hyper craignos, mec ! - -[VIC2_F2:VIC2] -~w~T'as abandonné ~b~le dealer de Vincenzo~w~ ! Retourne le chercher ! - -[VIC2_G:VIC2] -~w~Ecoute, mec, j'en ai déjà parlé à Vinnie... Chinatown marche plus avec les Leone ! - -[VIC2_G2:VIC2] -~w~Les Sindacco se sont installés ! Si j'y retourne, j'suis un homme mort ! - -[VIC2_G3:VIC2] -~w~Mais ouais... Bien sûr... - -[VIC2_G4:VIC2] -~w~J'te jure, mec ! Les Sindacco dealent là-bas ! - -[VIC2_G5:VIC2] -~w~J'me sens pas bien... J'crois que j'ai de la fièvre... - -[VIC2_H:VIC2] -~w~Arrête-toi près du ~b~dealer. - -[VIC2_I:VIC2] -~w~Oh, mec... - -[VIC2_J:VIC2] -~r~Le dealer de Vincenzo s'est fait buter ! - -[VIC2_K:VIC2] -~w~Conduis le dealer de Vincenzo à ~y~Chinatown. - -[VIC2M1:VIC2] -On a un dealer dans notre secteur de Chinatown nord. - -{=================================== MISSION TABLE VIC3 ===================================} - -[VIC3_H1:VIC3] -~w~Maintiens~h~ ~k~ ~PDLT~ ~w~pour ~h~verrouiller une cible~w~ et appuie sur~h~ ~k~ ~PDFW~ ~w~pour attaquer ! - -[VIC3_H2:VIC3] -~w~Appuie sur~h~ ~k~ ~PDFW~ ~w~pour attaquer le ~h~dealer. - -[VIC3O2:VIC3] -~w~Va à ~y~Chinatown. - -[VIC3O3:VIC3] -~w~Descends le ~r~dealer. - -[VIC3_1:VIC3] -~w~Vincenzo t'a laissé un cadeau qui peut servir. - -[VIC3_BA:VIC3] -~w~Ici, t'es en territoire Leone, connard ! - -[VIC3_BB:VIC3] -~w~T'as pas ton compte, enfoiré !? - -[VIC3_BC:VIC3] -~w~C'est Leone qui deale ici, personne d'autre ! Vous avez compris, connards de Sindacco ? - -[VIC3_6:VIC3] -~w~Les Sindacco dealent dans tout Chinatown. - -[VIC3_AA:VIC3] -~w~Vinnie ? - -[VIC3_AB:VIC3] -~w~C'est pas vrai, Toni ! J'peux pas avoir la paix !? - -[VIC3_AD:VIC3] -~w~J'suis déjà assez constipé et t'es vraiment la dernière chose dont j'ai besoin ! - -[VIC3_AE:VIC3] -~w~Mais puisque t'es là, j'voulais te dire que j'ai toujours pas reçu de fric - -[VIC3_AF:VIC3] -~w~de ce dealer. Et tu sais pourquoi ? - -[VIC3_AG:VIC3] -~w~Eclaire-moi. - -[VIC3_AJ:VIC3] -~w~Les Sindacco ont commencé à dealer et en plus, en territoire Leone ! - -[VIC3_AK:VIC3] -~w~Tu vas accepter ça, Toni ? - -[VIC3_AL:VIC3] -~w~Je veux que tu fonces à Chinatown ! - -[VIC3_AM:VIC3] -~w~OK, 'chef', je m'en occupe ! - -[VIC3_AN:VIC3] -~w~Bordel de merde ! Pourquoi y a jamais de PQ ici ! - -[VIC3_AH:VIC3] -~w~Parce qu'il est mort, crétin ! Y a un enfoiré qui l'a descendu. - -[VIC3O4:VIC3] -~r~Les Sindacco~w~ dealent dans tout Chinatown. Donne-leur une leçon qu'ils n'oublieront pas ! - -{=================================== MISSION TABLE VIC4 ===================================} - -[VIC4_H2:VIC4] -~w~Suis la ~h~bombe de peinture~w~ sur le radar pour trouver le ~h~Pay 'n' Spray. - -[VIC4_A2:VIC4] -~w~Place-toi sur le ~h~repère~w~ pour voir les armes disponibles. - -[VIC4_A3:VIC4] -~w~Sélectionne différentes armes en utilisant~h~ ~k~ ~AMMOV~. - -[VIC4_A4:VIC4] -~w~Appuie sur ~h~~k~ ~AMBUY~~w~ pour acheter l'arme sélectionnée si t'as le cash nécessaire. - -[VIC4_A6:VIC4] -~w~Tu peux utiliser jusqu'à huit types d'armes. - -[VIC4_A7:VIC4] -~w~Tu ne peux porter qu'une arme de chaque type à la fois : un type de pistolet, un type de fusil à pompe, etc. - -[VIC4_H1:VIC4] -~w~Suis le ~h~flingue~w~ sur le radar pour trouver un ~h~Ammu-Nation. - -[VIC4_H3:VIC4] -~w~Suis le ~h~flingue~w~ sur le radar pour retrouver un ~h~Ammu-Nation. - -[VIC4_AB:VIC4] -~w~Difficile de l'oublier... - -[VIC4_AD:VIC4] -~w~Le truc, c'est qu'il veut rejoindre les Leone maintenant. - -[VIC4_AE:VIC4] -~w~Laisse tomber ! Il a fait son choix. - -[VIC4_AG:VIC4] -~w~T'as rien dans la tête ! Merde, Toni, Sal a dit que t'étais une brute, - -[VIC4_AH:VIC4] -~w~mais j'avais pas compris que t'étais aussi débile. - -[VIC4_AJ:VIC4] -~w~Il sera notre homme dans la place. - -[VIC4_AK:VIC4] -~w~Juste un détail... - -[VIC4_AL:VIC4] -~w~Y a un gros balaise de Sindacco qui le baby-sitte. - -[VIC4_AM:VIC4] -~w~Je veux que tu supprimes ce petit obstacle - -[VIC4_AN:VIC4] -~w~et que J.D. marche avec nous ! Capici ? - -[VIC4_2:VIC4] -~w~Prends son ~g~téléphone portable~w~ comme preuve de l'exécution du boulot. - -[VIC4_BA:VIC4] -~w~Toni... Waouh, tu m'as fait cadeau d'un super snuff movie ! - -[VIC4_BB:VIC4] -~w~J.D. ? T'as tout vu ? TU ME FILMES ?! - -[VIC4_BC:VIC4] -~w~Euh, c'était juste... pour mon usage personnel ! - -[VIC4_BD:VIC4] -~w~J'suis impatient de bosser avec toi ! - -[VIC4_BE:VIC4] -~w~T'excite pas trop... Tu me dois encore du fric. - -[VIC4_BF:VIC4] -~w~Prends la caisse de ce connard de Sindacco en acompte, OK ? - -[VIC4_BG:VIC4] -~w~Repeins-la juste assez pour que personne la reconnaisse. - -[VIC4_BH:VIC4] -~w~Je vais m'occuper du corps. - -[VIC4_CA:VIC4] -~w~Hé, sors d'ici ! - -[VIC4_CB:VIC4] -~w~T'as rien à foutre là ! - -[VIC4_61:VIC4] -~w~Monte dans la ~b~caisse. - -[VIC4_62:VIC4] -~w~Conduis jusqu'au Pay 'n' Spray. - -[VIC4_DC:VIC4] -~r~J.D. t'a dit de faire repeindre la bagnole ! - -[VIC4_PR:VIC4] -Dring dring... - -[VIC4O1A:VIC4] -~w~Va ~y~à l'intérieur. - -[VIC4_O2:VIC4] -~w~Achète un pistolet. - -[VIC4_O4:VIC4] -~w~Tue le ~r~gros balaise de Sindacco. - -[VIC4_FA:VIC4] -~r~Il ne te vendra plus d'arme maintenant ! - -[VIC4_O3:VIC4] -~w~Va au ~y~chantier. - -[VIC4_AC:VIC4] -~w~Il gère actuellement un bar à nénettes contrôlé par les Sindacco, enfin, j'veux dire un club de gentlemen. - -[VIC4_AA:VIC4] -~w~Hé, tu te souviens de J.D. O'Toole ? - -[VIC4_AI:VIC4] -~w~On peut utiliser J.D. pour en savoir plus sur les plans des Sindacco. - -[HELP42:VIC4] -~w~En visant, appuie rapidement sur~h~ ~k~ ~FREE1~ ~w~pour passer en ~h~mode Visée libre~w~ et utilise ~h~ ~k~ ~FREE2~ ~w~pour ajuster ton tir. - -[VIC4_A1:VIC4] -~w~Va à l'~y~Ammu-Nation~w~ local pour récupérer une arme. - -[VIC4_O1:VIC4] -~w~Retourne chez ~y~Ammu-Nation~w~ pour récupérer une arme. - -[VIC4_1:VIC4] -~w~Le ~r~gros balaise des Sindacco~w~ est au fond du chantier. Tue-le ! - -{=================================== MISSION TABLE VIC5 ===================================} - -[VIC5_H:VIC5] -Leone - -[VIC5_I0:VIC5] -~w~Ah, c'est toi... - -[VIC5_I1:VIC5] -~w~Ouais, c'est moi, et alors ? T'as quelque chose à dire ?! - -[VIC5_I2:VIC5] -~w~J'vais te dire ce que j'ai à te dire, petit. - -[VIC5_I3:VIC5] -~w~Y a certains de nos gars qu'ont foiré un boulot tout fait. - -[VIC5_I4:VIC5] -~w~Ces cons sont même pas capables de réussir un raid tout ce qu'y a de plus simple. - -[VIC5_I5:VIC5] -~w~Maintenant, ils se retrouvent cernés par les flics à Chinatown. - -[VIC5_I6:VIC5] -~w~Bordel ! Pourquoi je suis entouré de nazes pareils ? - -[VIC5_I7:VIC5] -~w~J'sais pas... qui se ressemble s'assemble ? - -[VIC5_I8:VIC5] -~w~T'es vraiment un grand comique, toi ! - -[VIC5_I9:VIC5] -~w~Tu vas avoir l'occasion de rigoler. - -[VIC5I10:VIC5] -~w~Parce que c'est toi qui vas nettoyer ce merdier pour moi ! - -[VIC5I11:VIC5] -~w~Alors, fonce là-bas et ramène-moi ces débiles ! - -[VIC5_F1:VIC5] -~r~Un homme du gang est mort. - -[VIC5_G0:VIC5] -~w~Trouve une caisse à 4 places. - -[VIC5_O1:VIC5] -~w~Va sauver les ~b~hommes de Vincenzo. - -[VIC5_O3:VIC5] -~w~Sème les flics ! - -[VIC5_O4:VIC5] -~w~Conduis le gang chez ~y~Vincenzo. - -[VIC5_O5:VIC5] -~w~Les membres du ~b~gang~w~ doivent rester ensemble ! - -[VIC5_O6:VIC5] -~w~T'as besoin d'un véhicule avec plus de places ! - -[VIC5_G1:VIC5] -~w~Qu'est-ce qu'on va faire ? - -[VIC5_G2:VIC5] -~w~On est foutu ! - -[VIC5_G3:VIC5] -~w~Je vais pas en taule pour ce bâtard de Vincenzo ! - -[VIC5_G4:VIC5] -~w~Faut qu'on se tire d'ici ! - -[VIC5_G5:VIC5] -~w~Attends-moi ! - -[VIC5_G6:VIC5] -~w~Fonce, Toni ! - -[VIC5_E1:VIC5] -~w~Alors, vous avez le fric ? - -[VIC5_E2:VIC5] -~w~On a tout, chef... - -[VIC5_E3:VIC5] -~w~Hé, écoutez, on pouvait rien faire... - -[VIC5_E4:VIC5] -~w~... vous pouviez rien faire... - -[VIC5_E5:VIC5] -~w~Tout a foiré... On aurait pas pu imaginer pire. - -[VIC5_E6:VIC5] -~w~Qu'est-ce que t'en penses... c'est pas pire, maintenant ? - -[VIC5_E7:VIC5] -~w~Si jamais vous recommencez à déconner, ça deviendra pire pour vous aussi ! - -[VIC5_E8:VIC5] -~w~Maintenant, nettoyez-moi cette merde et dégagez le paysage ! - -[VIC5_E9:VIC5] -~w~J'ai un coup de fil à passer. - -[VIC5E10:VIC5] -~w~J'te jure, Toni, depuis que t'es revenu, ma chance a tourné en gros merdier. - -[VIC5E11:VIC5] -~w~Tu me portes vraiment la poisse, enfoiré. - -{=================================== MISSION TABLE VIC6 ===================================} - -[VIC6_BA:VIC6] -~w~On bouge plus ! - -[VIC6_BB:VIC6] -~w~Pas un geste, enfoiré ! - -[VIC6_P0:VIC6] -~w~Récupère la ~b~caisse de Vincenzo. - -[VIC6_P1:VIC6] -~w~C'est un piège des flics, dégage la caisse de là ! - -[VIC6_P2:VIC6] -~w~Sème les flics ! - -[VIC6_P3:VIC6] -~w~T'as semé les flics ! Maintenant ~w~conduis la caisse jusqu'au ~y~box de Vincenzo. - -[VIC6_P4:VIC6] -~w~Apprends à Vincenzo à plus jamais te chercher ! Va broyer sa ~b~caisse ! - -[VIC6_P5:VIC6] -~w~Remonte dans la ~b~caisse de Vincenzo ! - -[VIC6_P6:VIC6] -~w~Amène la caisse au ~y~box de Vincenzo. - -[VIC6_PA:VIC6] -~r~T'as détruit la caisse ! - -[VIC6_D1:VIC6] -~w~Monte dans la ~b~caisse. - -[VIC6_D3:VIC6] -~w~Roule jusqu'au ~y~broyeur de caisses. - -[VIC6_D4:VIC6] -~w~Sors et attends que le broyeur ait fini le boulot. - -[VIC6_D5:VIC6] -~r~Tu devais broyer la caisse ! - -[VIC6_AA:VIC6] -~w~Hé, Toni ! Alors, et ma caisse ? - -[VIC6_AB:VIC6] -~w~Sale fils de pute, Vinnie ! Tu m'as doublé ! - -[VIC6_AC:VIC6] -~w~Doublé ? DOUBLE ? - -[VIC6_AD:VIC6] -~w~Quand t'es revenu en ville, t'avais rien ! RIEN ! - -[VIC6_AE:VIC6] -~w~J't'ai pas doublé, je t'ai tout donné, enfoiré d'ingrat ! - -[VIC6_AF:VIC6] -~w~Oublie pas l'appartement et le job ! - -[VIC6_AG:VIC6] -~w~C'est pour toute cette générosité que j'attends que tu prennes quelques risques... - -[VIC6_AH:VIC6] -~w~J'suis pas l'armée du Salut, OK ? Et pas ta mère non plus ! - -[VIC6_AI:VIC6] -~w~Les flics surveillaient la caisse ? Je m'en fous des flics ! - -[VIC6_AJ:VIC6] -~w~Quand j'te dis de faire un truc, tu le fais ! Capici ? - -[VIC6_AK:VIC6] -~w~Ouais, j'ai compris, Vinnie... - -[VIC6_AL:VIC6] -~w~J'ai compris que tant que je bosserai pour toi, j'serai traité comme une merde. - -[VIC6_AM:VIC6] -~w~Tu regardais encore sous les jupes des filles que je blanchissais déjà des millions. - -[VIC6_AN:VIC6] -~w~J'te rends ton job de merde, 'boss', j'démissionne. - -[VIC6_AO:VIC6] -~w~Toni, tu fais une grosse... - -[VIC6_D2:VIC6] -~w~Arrête-toi sur le ~y~repère. - -[HOTW_01:VIC6] -Oui, m'man, j't'appelle plus tard. - -[HOTW_28:VIC6] -Vincenzo ! - -[HOTW_02:VIC6] -Mais oui, bien sûr que j'suis un bon garçon... - -[HOTW_03:VIC6] -Je t'aime. - -[HOTW_04:VIC6] -Hé, Cheryl, poupée, c'est bon, arrête. - -[HOTW_05:VIC6] -Prends ça et casse-toi. - -[HOTW_06:VIC6] -Un petit cadeau pour toi. - -[HOTW_11:VIC6] -T'es dégueulasse, t'as aucun respect... - -[HOTW_12:VIC6] -Respect ? Je joins juste l'utile à l'agréable. - -[HOTW_15:VIC6] -Parce que si c'est le cas, j'peux aussi demander à Ray pour toi... - -[HOTW_16:VIC6] -Va te faire foutre. - -[HOTW_17:VIC6] -Relax, j'me fous juste de ta gueule... - -[HOTW_18:VIC6] -Ecoute, mec, faut que tu m'rendes un service. - -[HOTW_19:VIC6] -J'ai des filles en manque et une caisse pleine de dope à Trenton. - -[HOTW_20:VIC6] -Va la récupérer... et appelle-moi. - -[HOTW_21:VIC6] -Tu m'prends pour qui ? Ton chauffeur ? - -[HOTW_22:VIC6] -Oh, allez, écoute... - -[HOTW_23:VIC6] -J'm'en occuperais bien moi-même, mais les Fédéraux m'ont à l'oeil. - -[HOTW_24:VIC6] -Tu sais que j'te protège, fais-moi confiance. - -[HOTW_25:VIC6] -Et oublie pas qu'il y a une hiérarchie à respecter, capici ? Allez, sois un bon petit gars ! - -[HOTW_07:VIC6] -- Alors, qui c'est qui t'aime, bébé ? ~n~ - Toi, Vinnie. - -[HOTW_09:VIC6] -- C'était ta mère au téléphone ? ~n~ - Ouais. - -[HOTW_13:VIC6] -- Ca te pose un problème de te faire sucer par une bombasse ? ~n~ - Hein ? - -{=================================== MISSION TABLE VIC7 ===================================} - -[VIC7_VE:VIC7] -~r~v1.01 - -[VIC7_1:VIC7] -~w~Vinnie, j'suis là ! Merde, t'es où !? C'est quoi ces conneries ? - -[VIC7_2:VIC7] -~w~Toni ? Come sta ? J'savais que t'appellerais. - -[VIC7_3:VIC7] -~w~Ecoute, j'suis à Portland docks. - -[VIC7_3A:VIC7] -~w~On a une grosse cargaison qui vient d'arriver. Amène-toi ! J'suis à bord du gros cargo. - -[VIC7_3B:VIC7] -~w~J'sais pas, Vinnie... J'ai des trucs à faire. - -[VIC7_3D:VIC7] -~w~Mais à partir de maintenant, on est des associés... Mieux que ça, des frères ! - -[VIC7_3E:VIC7] -~w~Alors, qu'est-ce que t'en dis ? C'est ce que veut Salvatore... - -[VIC7_3F:VIC7] -~w~OK. Pour Salvatore. - -[VIC7_3G:VIC7] -~w~Mais me prends plus jamais de haut, ou t'es un homme mort. - -[VIC7_4:VIC7] -~w~Wahaahha ! J'vais t'étriper ! - -[VIC7_4A:VIC7] -~w~Retrouve Vincenzo au ~y~cargo. - -[VIC7_5:VIC7] -~w~Crève ! - -[VIC7_6:VIC7] -~w~Ha ha ha ha ha ! - -[VIC7_7:VIC7] -~w~Ca y est, ce connard est mort ? - -[VIC7_8:VIC7] -~w~Désolé de te décevoir, Vinnie. - -[VIC7_9:VIC7] -~w~Sale fils de pute ! Pourquoi tu veux pas crever ? - -[VIC7_10:VIC7] -~w~T'aurais jamais dû revenir, Toni. - -[VIC710A:VIC7] -~w~Moi, j'ai tout donné, tout sacrifié pour Salvatore. - -[VIC710B:VIC7] -~w~Et toi, tu rappliques en ville et tout à coup, il y en a plus que pour toi ! - -[VIC7_11:VIC7] -~w~C'est ma ville, Toni ! MA VILLE ! - -[VIC711A:VIC7] -~w~Tu me la voleras pas ! - -[VIC7_12:VIC7] -~w~J'vais me faire plaisir... - -[VIC7_4B:VIC7] -~w~L'endroit a l'air désert. Monte à bord du ~y~bateau. - -[VIC7_13:VIC7] -~w~Va vers la ~y~sortie. - -[VIC7_3C:VIC7] -~w~Ecoute, Toni, j'sais que j'ai été con avec toi. Je m'excuse. - -[VIC7HUL:VIC7] -~w~Descends dans la ~y~coque. - -{=================================== MISSION TABLE SALS1 ===================================} - -[SALS1_6:SALS1] -Tue ~r~R.C. Hole, le maire ! - -[SALS1_7:SALS1] -Récupère le ~g~portable du maire ! - -[SALS1_8:SALS1] -~r~Le maire a fini son jogging. - -[SALS1_9:SALS1] -~r~Le maire s'est échappé. - -[SALS110:SALS1] -Apporte le téléphone à ~y~Salvatore ! - -[SALS111:SALS1] -Jette ton flingue ou je tire ! - -[SALS112:SALS1] -Ils sont après toi ! Le ~r~maire~w~ essaie de s'enfuir ! - -[SS1_AA:SALS1] -Ouais, c'est Toni. - -[SS1_AB:SALS1] -Ce salopard de maire essaie de me baiser et j'aime pas ces conneries ! - -[SS1_AC:SALS1] -Du calme, Sal... Je vais voir si je peux le virer du tableau pour vous. - -[SS1_AD:SALS1] -T'es un brave garçon, Toni. Tu fais honneur à la mémoire de ton père. - -[SS1_AE:SALS1] -Ecoute, ce gros con de maire doit faire son petit jogging quotidien dans le parc. - -[SS1_AF:SALS1] -Va lui couper le souffle... définitivement ! - -[SS1_AG:SALS1] -Et rapporte-moi son portable ! - -[SS1_AH:SALS1] -Comme ça, on saura à qui il a parlé. - -[SALS1AA:SALS1] -Ouais, c'est Toni. - -[SALS1AB:SALS1] -Ce salopard de maire essaie de me baiser. - -[SALS1AC:SALS1] -J'aime pas ces conneries ! - -[SALS1AD:SALS1] -Relax. Je vais lui régler son compte. - -[SALS1AE:SALS1] -T'es un brave gars, Toni. - -[SALS1AF:SALS1] -Ce gros con devrait faire son jogging quotidien dans le parc. - -[SALS1AG:SALS1] -Coupe-lui le souffle... définitivement ! - -[SALS1AH:SALS1] -Oh, et rapporte-moi son portable ! - -[SALS1AI:SALS1] -Comme ça, on verra à qui il a parlé... - -[SALS1C1:SALS1] -Baissez votre arme, monsieur ! - -[SALS1C2:SALS1] -Arrêtez ou je tire ! - -[SALS1C3:SALS1] -On ne bouge plus ! - -[SALS1C4:SALS1] -Doucement ! - -[SALS113:SALS1] -~r~Le téléphone du maire est H.S. - -[SALS114:SALS1] -Attention ! Ils te descendront si tu entres dans le parc avec une arme ! - -{=================================== MISSION TABLE SALS2 ===================================} - -[SALS2_1:SALS2] -~w~Va à la ~b~caisse. - -[SALS2_2:SALS2] -~w~Roule jusqu'au ~y~lieu du rendez-vous. - -[SALS2_3:SALS2] -~w~Remonte dans la ~b~caisse. - -[SALS2_4:SALS2] -~r~Mickey s'est fait tuer ! - -[SALS2_5:SALS2] -~r~Un des hommes de Salvatore a été tué ! - -[SALS2AA:SALS2] -Toni, - -[SALS2AB:SALS2] -Quelques-uns des gars passeront te voir plus tard. - -[SALS2AC:SALS2] -Sois dans le coin quand ils rappliqueront. - -[SALS2AD:SALS2] -Ciao, Salvatore. - -[SALS2CA:SALS2] -Salut Toni ! - -[SALS2CC:SALS2] -Allez, monte, c'est toi qui conduis ! - -[SALS2CD:SALS2] -Mickey, euh, y s'passe quoi, là ? - -[SALS2CE:SALS2] -Allez, Cipriani, quoi, t'as peur que j'te descende ? - -[SALS2BA:SALS2] -Salvatore est juste là-bas... - -[SALS2BC:SALS2] -Toni, mon garçon, - -[SALS2BD:SALS2] -c'est ton jour de gloire, aujourd'hui ! - -[SALS2BE:SALS2] -Salvatore... Mr Leone. - -[SALS2BF:SALS2] -Ca fait longtemps que maman attendait ça. - -[SALS2CB:SALS2] -Allez, monte, on va faire un tour. - -[SALS2BB:SALS2] -Madon' mia, qu'est-ce que tu attends ? - -[SALS2AF:SALS2] -Hé, merci, Toni. Je te recontacterai. - -{=================================== MISSION TABLE SALS3 ===================================} - -[SALS3_2:SALS3] -Dégâts - -[SALS313:SALS3] -~r~Le conseiller du maire est mort ! - -[SALS314:SALS3] -~r~Salvatore est mort ! - -[SALS3AA:SALS3] -Monte, Toni ! - -[SALS3AB:SALS3] -Où on va ? - -[SALS3AC:SALS3] -Parler avec l'assistant du maire à propos de Franco Forelli. - -[SALS3BA:SALS3] -Hé, sortez de mon bateau ! - -[SALS3BB:SALS3] -Tu viens avec moi. - -[SALS3BC:SALS3] -Vous pouvez pas faire ça ! - -[SALS3BD:SALS3] -Accélère, les services secrets vont pas tarder à rappliquer ! - -[SALS3CA:SALS3] -Toni, fais gaffe ! Y a des tireurs sur ces rochers ! - -[SALS3CB:SALS3] -Des tireurs droit devant ! - -[SALS3CC:SALS3] -Fais gaffe à droite, Toni ! - -[SALS3CD:SALS3] -A gauche, Toni, à gauche ! - -[SALS3CE:SALS3] -Des tireurs sur la jetée ! - -[SALS3CF:SALS3] -Bordel de merde, les services secrets s'amènent en hélico ! - -[SALS3DA:SALS3] -Le maire allait même pas aux chiottes sans demander à Franco ! - -[SALS3DB:SALS3] -Personne ne contrôlait le maire ! - -[SALS3DC:SALS3] -Aargh ! Attendez, OK, vous avez raison ! - -[SALS3DE:SALS3] -Les Siciliens ? Pourquoi ? - -[SALS3DF:SALS3] -Ils contrôlent Franco et veulent déclencher une guerre entre les familles de Liberty. - -[SALS3DG:SALS3] -Quand la poussière retombera, ils s'empareront de la ville. - -[SALS3DH:SALS3] -Toni, je t'appelle plus tard. - -[SALS3DI:SALS3] -Pour l'instant, faut que je balance ce connard au fond de la baie ! - -[SALS3DD:SALS3] -Ce sont ces Siciliens... ils ont forcé la main à Franco. - -{=================================== MISSION TABLE SALS4 ===================================} - -[SALS4BA:SALS4] +[MOB_63F] Ouais. -[SALS4BB:SALS4] -Grâce à Dieu, t'as décroché ! +[MOB_63G] +Ne jamais faire confiance à un mec qui se trimballe en pyjama. C'est ce que je dis toujours. J'espère bien qu'il en a bavé, ce con. -[SALS4BC:SALS4] -Quoi de neuf, Sal ? +[MOB_63H] +Je crois que oui. Je pensais pas qu'il était comme ça... -[SALS4BD:SALS4] -J'étais en train d'espionner les Forelli à Fort Staunton quand tout a basculé. +[MOB_63I] +Tommy, t'as beau être cinglé, t'es vraiment naïf. Il va falloir que je t'apprenne deux ou trois trucs sur la vie, dès que je serai remis sur pied. -[SALS4BE:SALS4] -Les Sindacco ont déclaré la guerre aux Forelli, +[MOB_63J] +Prends ton temps, Earnest et surtout, prends soin de toi. -[SALS4BF:SALS4] -et je suis coincé entre les tirs croisés ! +[MOB_16A] +Tommy, c'est Paulo. Que pasa amigo? -[SALS4BG:SALS4] -J'arrive. +[MOB_16B] +Qu'est-ce tu m'veux, Paul? J'veux pas de fringues de contrefaçon. -[SALS4BH:SALS4] -Amène ma limo, elle est blindée. On va en avoir besoin ! +[MOB_16C] +Très drôle, mon pote, mais tu sais que je fais pas dans la merde. Non, j'appelle juste pour savoir si t'aurais pas un rôle pour moi dans un de tes films. -[SALS4AA:SALS4] -Allez, Toni, on se tire de là ! +[MOB_16D] +J'ai fait pas mal de X en Angleterre, mec. J'en ai plus que toi dans l'pantalon. -[SALS4AB:SALS4] -Ramène-moi à la limo ! +[MOB_16E] +Paul, merci pour la proposition, je vais y réfléchir. -[SALS4AE:SALS4] -OK, j'ai une piaule à Newport. Conduis-moi là-bas ! +[MOB_16F] +Sérieux, pense à moi, après tout ce que j'ai fait pour toi. -[SALS4AF:SALS4] -Merci, Toni, je t'appelle. +[MOB_16G] +C'est ce que j'essaie d'oublier, justement... -[SAL4_1:SALS4] -Va prendre la ~b~limo de M. Leone. +[MOB_17A] +Tommy Vercetti, comment vas-tu? J'ai entendu tous ces trucs sur toi. Un flambeur en ville maintenant... -[SAL4_2:SALS4] -~r~T'as bousillé la voiture ! +[MOB_17B] +Paul, t'es bourré? -[SAL4_3:SALS4] -Conduis la voiture à ~y~Fort Staunton. +[MOB_17C] +Non, pauv' con, je suis pas bourré! J'ai juste pris deux ou trois verres et quelques tournées, et ça fait deux jours que j'ai pas fermé l'oeil! -[SAL4_4:SALS4] -~r~T'as laissé Salvatore mourir ! +[MOB_17D] +De toute façon, me traite pas comme ça. Je suis pas une poire. Qui c'est qui t'a lancé dans cette ville? Hein, qui? Moi! -[SAL4_6:SALS4] -~b~Salvatore~w~ est au bout de la ruelle. +[MOB_17F] +Ah ouais? -[SAL4_9:SALS4] -Va au ~y~garage. +[MOB_17G] +Me traite pas comme ça? Qui c'est qui t'a présenté à des gens? Je t'ai montré tous les trucs, je me suis fait chier pour toi et voilà comment tu m'remercies. -[SAL4_11:SALS4] -T'as abandonné ~b~Salvatore ! +[MOB_17H] +Tu m'ignores. Tu me laisses de côté après tout ce que j'ai fait pour toi! Qui tu crois que je suis? Une merde ou je sais pas quoi? -[SAL4_12:SALS4] -C'est bloqué ! Laisse la limo ici et continue à pied. +[MOB_17I] +Paul, calme-toi. J'ai été occupé, ne sois pas stupide. -[SAL4_13:SALS4] -Retourne à la ~b~limo. +[MOB_17J] +Je suis pas stupide, connard! Ils me l'ont dit en maison de redressement! Si tu cherches les emmerdes, mon pote, tu vas les trouver! -[SAL4_14:SALS4] -Conduis Salvatore et la limo jusqu'au ~y~garage~w~ à Newport. +[MOB_17K] +Tommy, s'il te plaît! T'étais mon grand espoir! Te fous pas de moi! -[SAL4_15:SALS4] -Trouve ~b~Salvatore ! +[MOB_17L] +Paul, va roupiller un bon coup, sérieusement. -[SAL4_16:SALS4] -Emmène Salvatore jusqu'à la ~b~limo. +[MOB_73A] +Tommy, c'est Steve. -[SAL4_17:SALS4] -Attends que ~b~Salvatore~w~ monte dans la limo ! +[MOB_73B] +Salut, Steve. -{=================================== MISSION TABLE SALS5 ===================================} +[MOB_73C] +Salut le génie. T'es merveilleux! Je suis une merveille! Ils nous adorent. On réécrit le livre des records, mon pote! -[SALS5_1:SALS5] -~w~Appuie sur~h~ ~k~ ~VEACC~ ~w~pour contrôler la caisse de Paul Sindacco. +[MOB_73D] +Je parle de putain de récompenses. Enfin je peux envoyer mon père à l'hospice et lui dire de fermer sa gueule. -[SALS5_2:SALS5] -~w~Descends les ~r~Forelli~w~ au rendez-vous avant que Sindacco trouve le système de contrôle. +[MOB_73E] +Euh... C'est cool, Steve. -[SALS5_3:SALS5] -~r~Paul Sindacco a été tué ! +[MOB_73F] +Cool? C'est génial, mec. GENIAL quoi! Il n'a jamais voulu croire en moi, mais regarde ce qu'on a réussi à faire. -[SALS5_4:SALS5] -~r~La camionnette de Salvatore a été détruite ! +[MOB_73G] +Je suis le plus grand réalisateur de films de cul faits maison de la planète, mon pote. Je voulais juste te dire que je suis heureux de t'avoir rencontré. -[SALS5_5:SALS5] -~r~Sindacco est arrivé au rendez-vous ! +[MOB_73H] +Merci, Steve. -[SALS5_6:SALS5] -~w~Va à la ~b~camionnette. +[MOB_73I] +Je t'aime, bébé. Et reste comme tu es, d'accord? -[SALS5_7:SALS5] -~w~Temps restant +[MOB_73J] +D'accord. Salut, Steve. -[SALS5_8:SALS5] -~r~Sindacco a trouvé le système de contrôle ! +[BOLLOX] +Appuie sur la touche ~o~R1 ~w~pour larguer une bombe. Appuie sur la touche ~t~" ~w~pour annuler. -[SALS5_9:SALS5] -~w~La commande satellite de la voiture de Sindacco aura un temps de réaction lent. +[BRID_OP] +Avis de tempête terminé : tous les ponts sont maintenant accessibles. -[SALS510:SALS5] -Dégâts +[BRID_CL] +Avis de tempête : tous les ponts sont fermés. -[SALS5AA:SALS5] -Allô ! +[LG_38] +Cible -[SALS5AB:SALS5] -Toni, c'est moi, j'ai un truc pour toi... +[ASSET_C] +Pole Position, OK -[SALS5AC:SALS5] -Tu vas adorer, ça va être génial. +[ASSET_D] +~g~Le club Pole Position va maintenant créer un revenu d'un maximum de $~1~ par jour. Venez retirer votre argent régulièrement. -[SALS5AD:SALS5] -Qu'est-ce que vous voulez que je fasse, Sal ? +[ST_WHEE] +Temps maximum sur roue arrière (secs) -[SALS5AE:SALS5] -Y a une camionnette pas loin. +[ST_STOP] +Temps maximum sur roue avant (secs) -[SALS5AF:SALS5] -Rappelle-moi quand tu l'auras trouvée. +[ST_2WHE] +Temps maximum sur deux roues (secs) -[SALS5BA:SALS5] -OK, Sal, je suis dans la camionnette. +[ST_WHED] +Distance maximum sur roue arrière (m) -[SALS5BB:SALS5] -Bon. On va s'amuser avec la caisse de Paulie Sindacco. +[ST_STOD] +Distance maximum sur roue avant (m) -[SALS5BC:SALS5] -Qu'est-ce que je suis censé faire ? +[ST_2WHD] +Distance maximum sur deux roues (m) -[SALS5BD:SALS5] -Paulie va rencontrer les Forelli... +[OUTFT11] +Survêtement -[SALS5BE:SALS5] -Il essaie de conclure une trêve. +[OUTFT12] +Frankie -[SALS5BF:SALS5] -Sers-toi du matos de la camionnette pour contrôler la voiture de Paulie. +[RELOAD] +~g~Tu as gagné la possibilité de recharger ton arme rapidement -[SALS5BG:SALS5] -Et sème la pagaille dans ce rendez-vous ! +[APACHE] +Hunter livré à l'héliport d'Ocean Beach -[SALS5CA:SALS5] -Mais qu'est-ce que... ? +[CRED369] +JOHN MCCARDLE -[SALS5CC:SALS5] -Non ! Au secours ! +[CRED370] +DAVID MURDOCH -[SALS5CD:SALS5] -Dégagez le passage ! +[CRED371] +CHRIS BROWN -[SALS5CF:SALS5] -Aidez-moi ! +[CRED372] +PAUL GREEN -[SALS5CG:SALS5] -Ma voiture est possédée ! +[CRED373] +KYLE MILNE -[SALS5CE:SALS5] -Cette voiture veut ma mort ! +[CUNTY] +Nouveaux vêtements livrés au Domaine Vercetti -[SALS5CB:SALS5] -Hé, mais qu'est-ce qui se passe ici ? +[GOODBOY] +$50 pour bonne conduite -{=================================== MISSION TABLE SALS6 ===================================} +[NEWCONT] +Nouveau ~h~point de contact ~w~créé à la marina d'Ocean Beach -[SALS601:SALS6] -~w~Sal t'a laissé un ~b~bateau ~w~à la jetée sud-ouest. Tu dois arrêter le petit malin. +[FIRELVL] +Mission Camion de pompiers niveau ~1~ -[SALS602:SALS6] -~w~Il file le long de la côte ! Arrête-~r~le ! +[HELP56] +Appuie sur la touche ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~ pour changer le mode de la caméra. -[SALS603:SALS6] -~r~Il ~w~retourne voir Franco Forelli ! +[HELP57] +Appuie sur la touche ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~ pour changer le mode de la caméra. -[SALS604:SALS6] -~r~Le petit malin a regagné Fort Staunton. +[HELP58] +Tout en visant, appuie sur la touche ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~ ou ~h~~k~~PED_CYCLE_TARGET_RIGHT~~w~ pour faire défiler les cibles. -[SALS605:SALS6] -~r~Il a filé ! +[HELP59] +Tout en visant, appuie sur la touche ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~ ou ~h~~k~~PED_CYCLE_TARGET_RIGHT~~w~ pour faire défiler les cibles. -[SALS606:SALS6] -~r~Il ~w~se barre à pied ! +[HELP60] +Si tu appuies sur la touche ~h~~k~~PED_SPRINT~ ~w~quand tu essaies de piquer une caisse, tu ne peux pas monter dedans. -[SALS607:SALS6] -~w~Il s'enfuit dans une ~r~caisse volée ! +[HELP61] +Tu as désormais des munitions illimitées et tous tes véhicules sont deux fois plus résistants. -[SALS608:SALS6] -~r~Tu peux pas le poursuivre sans bateau ! +[CRED374] +KEVIN YUN -[SALS6AA:SALS6] -Allô ? +[CRED375] +ERICK COBBS -[SALS6AD:SALS6] -Il vient de partir pour rencontrer Franco Forelli. +[CRED376] +RANDY BLAKE -[SALS6AE:SALS6] -Il est de notre intérêt que Franco ne sache rien +[CRED377] +BRANDON LIM -[SALS6AF:SALS6] -et que cette guerre continue. +[CRED378] +BRANDON FENOL -[SALS6AG:SALS6] -Liquide cette grande gueule ! +[CRED379] +MICHAEL MANOLE -[SALS6AH:SALS6] -C'est comme si c'était fait, Sal. +[CRED380] +ALETHEIA SIMONSON -[SALS6AB:SALS6] -Toni, un petit malin a découvert que les mafieux siciliens étaient derrière la querelle Forelli-Sindacco. +[CRED381] +JOHN JANSEN -[SLS6_20:SALS6] -~w~Il retourne voir Franco Forelli. Elimine-~r~le ! +[FEC_LB1] +Regarder -[SLS6_21:SALS6] -~w~Elimine-~r~le ! +[FEC_LB2] +derrière -{=================================== MISSION TABLE NEDS1 ===================================} +[FEC_LB3] +Regarder derrière -[NEDS1_1:NEDS1] -Le FBI est en route pour récupérer un rapport mensonger sur certaines stars du sport. +[FEC_R3] +(touche R3) -[NEDS1_2:NEDS1] -Si le rapport tombe entre les mains du FBI, des innocents seront accusés. +[FEC_PED] +Commandes à pied -[NEDS1_3:NEDS1] -Il faut que tu l'interceptes et que tu me l'apportes pour que je le mette en lieu sûr. +[FEC_VEH] +Commandes des véhicules -[NEDS1_4:NEDS1] -Tu auras besoin d'un véhicule du FBI. +[FEC_FPR] +Commandes en vue subjective -[NEDS1_5:NEDS1] -Une attaque à main armée a mal tourné sur l'autoroute. Le FBI est sur place. +[FEC_CMM] +Commandes principales -[NEDS1_6:NEDS1] -Vole leur caisse et va au lieu du rendez-vous avant qu'il ne soit trop tard ! +[FEC_PWL] +Aller à gauche -[NEDS1_8:NEDS1] -Remonte dans la ~b~caisse du FBI ! +[FEC_PWR] +Aller à droite -[NEDS1_9:NEDS1] -Va au ~y~lieu du rendez-vous. +[FEC_PWF] +Avancer -[NEDS111:NEDS1] -Sème les flics ! +[FEC_PWT] +Avancer vers caméra -[NEDS113:NEDS1] -J'ai ici le rapport que je t'avais promis... +[FEC_PLB] +Vue arrière -[NEDS114:NEDS1] -Qu'est-ce... Il y a déjà un agent ici !? +[FEC_PFR] +Tirer -[NEDS115:NEDS1] -Une autre bagnole du FBI ? Hé ! Mais... T'es un imposteur ! +[FEC_CLE] +Défilement Gauche des armes -[NEDS116:NEDS1] -Arrête ~r~l'informateur ! +[FEC_CRI] +Défilement Droite des armes -[NEDS117:NEDS1] -Récupère le ~g~rapport. +[FEC_LKT] +Verrouiller cible -[NEDS118:NEDS1] -Apporte le rapport au ~y~Liberty Tree. +[FEC_PJP] +Saut à pied -[NEDS119:NEDS1] -~r~La caisse du FBI est foutue. +[FEC_PSP] +Sprint à pied -[NEDS120:NEDS1] -~r~T'es arrivé trop tard ! L'informateur a donné son rapport au FBI ! +[FEC_PSH] +Tir à pied -[NEDS121:NEDS1] -Bien joué, Toni, Dieu sera content de toi ! +[FEC_TLF] +Cible suivante Gauche -[NEDS122:NEDS1] -Je veillerai à ce qu'il ne tombe pas entre de mauvaises mains. +[FEC_TRG] +Cible suivante Droite -[NEDS123:NEDS1] -Merci ! +[FEC_CCM] +Centrer caméra derrière joueur -[NEDS124:NEDS1] -~r~Le rapport est détruit ! +[FEC_SZI] +Fusil à lunette zoom avant -[NEDS1AA:NEDS1] -Pardonnez-moi, mon Père, car j'ai péché... +[FEC_SZO] +Fusil à lunette zoom arrière -[NEDS1AB:NEDS1] -Merde, le Diable te lâche vraiment pas, Antonio. +[FEC_LKL] +Regarder à gauche en vue subjective -[NEDS1AE:NEDS1] -Un misérable pécheur a confessé avoir fabriqué un faux rapport de dopage sur nos meilleurs athlètes. +[FEC_LRT] +Regarder à droite en vue subjective -[NEDS1AF:NEDS1] -Si tu pouvais empêcher qu'il soit remis au FBI, tu sauverais la carrière d'innocents. +[FEC_LUP] +Regarder en haut en vue subjective -[NEDS1AG:NEDS1] -Ce sera fait, mon Père. +[FEC_LDN] +Regarder en bas en vue subjective -[NEDS1BA:NEDS1] -Vous êtes en avance. +[FEC_LBH] +Regarder derrière le véhicule -[NEDS1BB:NEDS1] -Hé, je vous connais pas, où est John-O ? +[FEC_LLF] +Regarder à gauche du véhicule -[NEDS1BC:NEDS1] -John-O ? Il a pas pu venir. +[FEC_LRG] +Regarder à droite du véhicule -[NEDS1BD:NEDS1] -Hé, c'est John-O ! +[FEC_HRN] +Klaxon -[NEDS1BE:NEDS1] -Donne-moi ça ! +[FEC_HBR] +Frein à main -[NEDS1BF:NEDS1] -Enfoiré ! +[FEC_ACL] +Accélérer -[NEDS1AD:NEDS1] -Ah, la seconde option est plus dans mes cordes... +[FEC_BRK] +Freiner -[NEDS1AC:NEDS1] -Maintenant, soit tu t'en tires avec des Je vous Salue Marie, soit tu fais le sale boulot du Seigneur. +[FEC_TSM] +Activer/Désactiver sous-missions -[NEDS1_7:NEDS1] -Va sur les lieux du crime, vole la ~b~caisse du FBI~w~ et rends-toi au lieu du rendez-vous avant ~1~:~1~. +[FEC_CRD] +Changer la station de radio -[NEDS125:NEDS1] -Fonce sur les lieux du crime, vole une ~b~voiture du FBI~w~ et atteins le rendez-vous avant 0~1~:~1~ heures. +[FEC_ENT] +Entrer/Sortir d'un véhicule -[NEDS126:NEDS1] -Fonce sur les lieux du crime, vole une ~b~voiture du FBI~w~ et atteins le rendez-vous avant 0~1~:0~1~ heures. +[FEC_WPN] +Tirer -[NEDS127:NEDS1] -Fonce sur les lieux du crime, vole une ~b~voiture du FBI~w~ et atteins le rendez-vous avant ~1~:0~1~ heures. +[FEC_PAS] +Pause -{=================================== MISSION TABLE NEDS2 ===================================} +[FEC_FPO] +Changer d'arme en vue subjective -[NEDS2AA:NEDS2] -Pardonnez-moi, mon Père, car j'ai péché... +[FEC_SMS] +Afficher/Masquer curseur -[NEDS2AB:NEDS2] -Merde, Toni, qu'est-ce que t'as encore foutu ? +[FEC_CMS] +Changer de mode de caméra -[NEDS2AC:NEDS2] -Hé ! Votre langage, mon Père... +[FEC_TSS] +Faire une capture d'écran -[NEDS2AD:NEDS2] -Ah ouais, Je te salue Marie pleine de trucs... +[FEC_DBG] +Menu Debug -[NEDS2AE:NEDS2] -Une âme perdue a confessé un recel de diamants. +[FEC_TGD] +Alterner manette jeu/debug -[NEDS2AF:NEDS2] -Aide ce pèlerin à trouver le chemin de la rédemption. Prends les diamants et je veillerai à leur restitution... +[FEC_TDO] +Désactiver caméra debug -[NB2_2:NEDS2] -Prends la ~g~mallette~w~ et tue tous les membres du gang. +[FEC_IVH] +Inverser souris horizontale -[NB2_3:NEDS2] -Apporte la mallette aux ~y~bureaux de Liberty Tree. +[FEC_MSL] +BGS -[NB2_4:NEDS2] -Récupère la ~g~mallette ! +[FEC_MSM] +BMS -[NB2_1:NEDS2] -C'est un piège ! +[FEC_MSR] +BDS -[NB2_6:NEDS2] -Bute tous les ~r~gardes ! +[FEC_QUE] +??? -[NB2_7:NEDS2] -Détruis ~r~l'hélicoptère ! +[FEC_TWO] +Deux touches clavier au maximum -[NB2_5:NEDS2] -Détruis l'~r~hélicoptère~w~, tue les ~r~gardes~w~ et récupère la ~g~mallette. +[FEC_UMS] +Boutons souris uniquement -{=================================== MISSION TABLE NEDS3 ===================================} +[FEC_OMS] +Un bouton souris au maximum -[NEDS3AA:NEDS3] -Pardonnez-moi, mon Père, car j'ai péché... +[FEC_UJS] +Un bouton joystick au maximum -[NEDS3AB:NEDS3] -Toni, mon fils, comparé aux dégénérés de cette ville, t'es un vrai saint ! +[FEC_OJS] +Un bouton joystick maximum par action -[NEDS3AC:NEDS3] -Ils polluent nos enfants avec leurs gaz diaboliques ! Ils souillent le paradis ! +[FEC_PTL] +Utiliser verrouillage de cible avec commande de tir gauche -[NEDS3AD:NEDS3] -Ramène ces pauvres pécheurs dans le droit chemin ! +[FEC_PTR] +Utiliser verrouillage de cible avec commande de tir droite -[NEDS3_1:NEDS3] -Conduis le camion de pompiers à travers la ville en causant le plus d'accidents, de collisions et de destructions que tu peux. +[FEC_LBC] +Utiliser regarder gauche avec regarder droite -[NEDS3_2:NEDS3] -~w~Vole le ~b~camion de pompiers. +[FEC_JBO] +JOY ~1~ -[NEDS3_3:NEDS3] -~w~Tu as ~1~ secondes pour retourner au ~b~camion de pompiers. +[FEC_WAR] +Avertissement -[NEDS3_4:NEDS3] -Cote +[FEC_OKK] +O.K. -[NEDS3_5:NEDS3] -Maintenant, va causer le plus d'accidents, de collisions et de destructions possibles ! +[FEC_DLF] +Erreur lors de suppression -[NEDS3_6:NEDS3] -Piéton écrasé ! +[FEC_SVU] +Erreur lors de la sauvegarde -[NEDS3_7:NEDS3] -Véhicule coulé ! +[FEC_LUN] +Erreur lors du chargement. Fichier corrompu, veuillez le supprimer. -[NEDS3_8:NEDS3] -Véhicule détruit ! +[FEC_PAD] +Manette -[NEDS3_9:NEDS3] -Véhicule retourné ! +[FEC_JOY] +Joystick -[NEDS310:NEDS3] -~r~Le camion de pompiers a été détruit. +[FES_CSA] +Sélectionnez une apparence dans la liste suivante : -[NEDS311:NEDS3] -Dérapage 360° ! +[FET_HRD] +PARAMETRES PAR DEFAUT RETABLIS -[NEDS312:NEDS3] -Dérapage 720° ! +[FET_MST] +DIRECTION CONTROLEE PAR LA SOURIS -[NEDS313:NEDS3] -Dérapage 1080° ! +[FEC_STR] +ETOILE PAV.NUM. -[NEDS314:NEDS3] -~r~T'as abandonné le camion de pompiers. +[FET_MIG] +GAUCHE, DROITE, MOLETTE SOURIS POUR REGLER -[NEDS315:NEDS3] -Tonneau ! +[FET_CIG] +RETOUR ARRIERE POUR EFFACER - BGS, RETOUR POUR CHANGER -[NEDS316:NEDS3] -Série de trois collisions ! +[FET_DSN] +Skin joueur par defaut.bmp -[NEDS317:NEDS3] -Série de quatre collisions ! +[FET_RSO] +PARAMETRE D'ORIGINE RETABLI -[NEDS318:NEDS3] -Série de cinq collisions ! +[FET_RSC] +MATERIEL INDISPONIBLE - PARAMETRE D'ORIGINE RETABLI -[NEDS319:NEDS3] -Bonus carambolage ! +[FEA_3DH] +CONFIG. CARTE-SON -[NEDS320:NEDS3] -~r~T'as pas fait assez de dégâts dans le temps imparti. +[FEA_SPK] +CONFIG. HAUT-PARLEURS -[NEDS321:NEDS3] -Bonus chute ! +[FEM_LOD] +DISTANCE MODELES -[NEDS322:NEDS3] -Bonus chute mortelle ! +[FEM_VSC] +SYNCHRO VIDEO -[NEDS323:NEDS3] -Bonus voltige ! +[FEM_FRM] +RESTRICTION VIDEO -[NEDS324:NEDS3] -Bonus super voltige ! +[FEM_MM] +MENU PRINCIPAL -[NEDS325:NEDS3] -~w~T'as moins de 1 seconde pour retourner au ~b~camion de pompiers. +[FED_RES] +RESOLUTION ECRAN -[NEDS326:NEDS3] -Félicitations ! T'avais encore ~1~ secondes ! +[FET_CTL] +CONFIG. PERIPHERIQUE -[NEDS327:NEDS3] -~w~Maintenant, détruis le ~r~camion de pompiers~w~. Ne laisse aucune preuve ! +[FET_OPT] +OPTIONS -[NEDS328:NEDS3] -Des points de bonus récompensent les collisions, dérapages, tonneaux, retournements et destructions spectaculaires de véhicules. +[FEC_MSH] +SENSIBILITE SOURIS -[NEDS329:NEDS3] -Véhicule retourné x ~1~ +[FEC_IVV] +INVERSER SOURIS VERTIC. -[NEDS330:NEDS3] -Tonneau x ~1~ +[FET_MTI] +CONFIG. SOURIS -[NEDS332:NEDS3] -~w~Il te reste 1 seconde pour retourner au ~b~camion de pompiers. +[FEC_FNC] +F~1~ -[NEDS333:NEDS3] -Félicitations ! NOUVEAU MEILLEUR TEMPS avec ~1~ secondes restantes. +[FEC_IRT] +INSER -[NEDS334:NEDS3] -~w~Maintenant, détruis le camion de pompiers. Ne laisse aucune preuve ! +[FEC_DLL] +SUPPR -[NEDS335:NEDS3] -Demi-tour à 180° ! +[FEC_HME] +ORIG -[NEDS337:NEDS3] -Conduis le camion de pompiers dans la ville en causant autant d'accidents, de collisions et de chaos que tu peux avant ~1~:~1~. +[FEC_END] +FIN -[NEDS338:NEDS3] -Conduis le camion de pompiers dans la ville en causant autant d'accidents, de collisions et de chaos que tu peux avant ~1~:0~1~. +[FEC_PGU] +PAGE HAUT -[NEDS339:NEDS3] -Conduis le camion de pompiers dans la ville en causant autant d'accidents, de collisions et de chaos que tu peux avant 0~1~:~1~. +[FEC_PGD] +PAGE BAS -[NEDS340:NEDS3] -Conduis le camion de pompiers dans la ville en causant autant d'accidents, de collisions et de chaos que tu peux avant 0~1~:0~1~. +[FEC_UPA] +HAUT -[NEDS341:NEDS3] -Cause autant d'accidents, de collisions et de chaos que tu peux avant ~1~:~1~. +[FEC_DWA] +BAS -[NEDS342:NEDS3] -Cause autant d'accidents, de collisions et de chaos que tu peux avant ~1~:0~1~. +[FEC_LFA] +GAUCHE -[NEDS343:NEDS3] -Cause autant d'accidents, de collisions et de chaos que tu peux avant 0~1~:~1~. +[FEC_RFA] +DROITE -[NEDS344:NEDS3] -Cause autant d'accidents, de collisions et de chaos que tu peux avant 0~1~:0~1~. +[FEC_NUM] +PAV.NUM -[NEDS331:NEDS3] -Cause autant d'accidents, de collisions et de chaos que tu peux ! +[FEC_NMN] +PAV.NUM~1~ -{=================================== MISSION TABLE NEDS4 ===================================} +[FEC_FWS] +PAV.NUM / -[NEDS4_2:NEDS4] -~w~Les trois célébrités se rendent à une station de radio dans le centre, pour une interview avant la première de ce soir. +[FEC_PLS] +PAV.NUM + -[NEDS4_3:NEDS4] -~w~L'actrice, Faith W, arrivera du Francis Airport à bord de son hélicoptère privé. +[FEC_MIN] +PAV.NUM - -[NEDS4_4:NEDS4] -~w~Le gangster devenu acteur, DB-P, viendra par bateau de Portland. +[FEC_DOT] +PAV.NUM . -[NEDS4_5:NEDS4] -~w~L'acteur vieillissant et alcoolique, Black Lightman, sort de désintox et arrivera en limousine. +[FEC_NLK] +VERR NUM -[NEDS4_8:NEDS4] -~w~Faith est morte. +[FEC_ETR] +ENTR -[NEDS4_9:NEDS4] -~w~DB-P est mort. +[FEC_SLK] +ARRET DEFIL -[NEDS410:NEDS4] -~w~Black Lightman est mort. +[FEC_PSB] +PAUSE -[NEDS411:NEDS4] -~w~Les trois célébrités ont été liquidées. Retourne à l'~y~église~w~ et informe le Père. +[FEC_BSP] +RET. ARR. -[NEDS412:NEDS4] -~r~Faith est arrivée à la station de radio ! +[FEC_TAB] +TAB -[NEDS413:NEDS4] -~r~DB-P est arrivé à la station de radio ! +[FEC_CLK] +VERR MAJ -[NEDS414:NEDS4] -~r~Black Lightman est arrivé à la station de radio ! +[FEC_RTN] +RETOUR -[NEDS415:NEDS4] -~w~Il va changer pour un Patriot blindé. +[FEC_LSF] +MAJ. G -[NEDS417:NEDS4] -~w~Le Patriot est blindé. +[FEC_RSF] +MAJ. D -[NEDS418:NEDS4] -~w~Attention au tireur ! +[FEC_LCT] +CTRL G -[NEDS421:NEDS4] -~w~L'armurerie de Phil Cassidy est représentée par un drapeau sur le radar. +[FEC_RCT] +CTRL D -[NEDS4AA:NEDS4] -Pardonnez-moi, mon Père, car j'ai encore péché. +[FEC_LAL] +ALT G -[NEDS4AB:NEDS4] -Alors, tu dois de nouveau te racheter, mon fils. +[FEC_RAL] +ALT D -[NEDS4AC:NEDS4] -L'idolâtrie est allée trop loin ! +[FEC_LWD] +WIN G -[NEDS4AD:NEDS4] -Seules des créatures ayant vendu leur âme au Diable accordent une interview à la radio, sans donner l'exclu à un vrai journaliste ! +[FEC_RWD] +WIN D -[NEDS4AF:NEDS4] -Elimine ces fausses idoles ! +[FEC_WRC] +CLIC WIN -[NEDS4BA:NEDS4] -J'ai fait ce que vous vouliez, mon Père. +[FEC_SPC] +ESP -[NEDS4BB:NEDS4] -Parfait ! Le tirage du journal a triplé depuis que tu as trouvé ton âme. +[WIN_TTL] +Grand Theft Auto VC -[NEDS4BC:NEDS4] -Hein ? +[WIN_95] +Grand Theft Auto VC n'est pas compatible WINDOWS 95 -[NEDS4BD:NEDS4] -Merci encore pour ton aide, Toni ! +[WIN_DX] +Grand Theft Auto VC requiert la version 8.1 de DirectX minimum. -[NEDS4BE:NEDS4] -C'est quoi ces conneries ? +[FET_EIG] +IMPOSSIBLE DE PARAMETRER UNE TOUCHE POUR CETTE ACTION -[NEDS4BF:NEDS4] -T'ES QUI, TOI !? +[FET_DAM] +MODELAGE ACCOUST. DYNAMIQUE -[NEDS422:NEDS4] -Va récupérer un lance-roquettes à l'armurerie de Phil Cassidy. +[FEQ_SRE] +Etes-vous sûr de vouloir quitter ? Votre progression depuis la dernière sauvegarde sera perdue. Continuer ? -[NEDS4_7:NEDS4] -~w~Ne laisse aucune des ~r~célébrités~w~ atteindre la station de radio LCFR ! +[FEQ_SRW] +Etes-vous sûr de vouloir quitter la partie ? -[NEDS416:NEDS4] -~w~Ne laisse aucune des ~r~célébrités~w~ atteindre la station de radio LCFR ! +[FET_QG] +QUITTER PARTIE -[NEDS419:NEDS4] -~w~Tu trouveras des armes lourdes à l'armurerie de Phil Cassidy. +[FEN_STA] +COMMENCER PARTIE -[NEDS420:NEDS4] -~w~Le Père Ned a commandé un lance-roquettes. Va le récupérer à l'armurerie Fully Cocked de Phil Cassidy. +[FET_PAU] +MENU PAUSE -[NEDS4_6:NEDS4] -~w~Si tu as besoin d'artillerie lourde, va faire un tour à l'armurerie Fully Cocked de Phil Cassidy. +[REPLAY] +RALENTI -{=================================== MISSION TABLE DONS1 ===================================} +[FET_PS] +CONFIG. JOUEURS -[MORG_01:DONS1] -2-2-3, 3-2-3, 4-2-3, 5-2-3-... +[FEC_ANS] +Action -[MORG_02:DONS1] -Antonio ! Quel plaisir de te voir ! +[CVT_MSG] +Conversion des textures vers un format optimal pour votre carte graphique -[MORG_03:DONS1] -Qu'est-ce qui se passe ? +[FEC_SFT] +MAJ -[MORG_04:DONS1] -On donne une fête, mon cher, une fête. +[FEH_VMP] +VOIR CARTE -[MORG_05:DONS1] -Eh oui, une 'morgue party' ! +[FES_DEE] +Echec de la suppression ! Recommencer. -[MORG_08:DONS1] -C'est quoi, ces conneries ? Une 'morgue party' ? +[FES_CMP] +Echec de la sauvegarde ! Recommencer. -[MORG_09:DONS1] -Je crois qu'on va passer une soirée d'enfer. +[FESZ_WR] +Sauvegarde en cours. Un instant... -[MORG_10:DONS1] -Mais d'abord, il faut aller chercher nos invités... +[FELD_WR] +Chargement en cours. Un instant... -[MORG_11:DONS1] -Viens, avant qu'ils s'ennuient à mourir ! +[FEDL_WR] +Suppression en cours. Un instant... -[MORG_12:DONS1] -Sans mauvais jeu de mots... +[PCRESRT] +Lancement d'une nouvelle partie. Un instant... -[MORG_13:DONS1] -Puisqu'ils sont déjà morts... +[FET_STI] +Commandes standard -[MORG_14:DONS1] -Notre invité d'honneur est en visite dans un labo de pathologie. +[FET_CTI] +Commandes classiques -[MORG_15:DONS1] -Ne le faisons pas attendre ! +[FEH_NA] +OPTION NON DISPONIBLE -[MORG_06:DONS1] -- La première de la saison ! ~n~ - Ouh là, doucement... +[FEH_MPH] +SOURIS, CURSEURS POUR SE DEPLACER - PAGE HAUT, PAGE BAS, MOLETTE POUR ZOOMER, L - LEGENDE -[DL1_A:DONS1] -J'organise une Morgue Party et je veux que t'ailles chercher les 'invités'. +[FEA_MP3] +LECTEUR MP3 -[DL1_2:DONS1] -~r~T'as détruit la voiture. +[NO_PCCD] +Insérer le disque de GTA Vice City ou appuyer sur ECHAP pour annuler -[DL1_3:DONS1] -Les flics ont été alertés ! Fais baisser ton indice de recherche ! +[FEH_SSA] +CURSEURS POUR SE DEPLACER - S POUR SAUVEGARDER LE FICHIER -[DL1_4:DONS1] -Conduis la caisse au ~y~garage de Donald ! +[FES_CMI] +DERNIERE MISSION REUSSIE -[DL1_6:DONS1] -~r~Le corbillard a atteint le poste de police. +[FET_STS] +STATS SAUVEGARDEES DANS 'STATS.HTML' + 'STATS.TXT' -[DL1_9:DONS1] -Conduis la caisse à l'atelier de peinture. +[WIN_VDM] +Grand Theft Auto VC ne dispose pas de suffisamment de mémoire graphique. -[DL1_5:DONS1] -Vole le ~b~corbillard~w~ avant qu'il n'arrive à destination. +[FEC_ERI] +Erreur ! Une ou plusieurs actions ne sont pas assignées à une touche ou à un bouton. Vérifier que toutes les actions sont bien assignées. -{=================================== MISSION TABLE DONS2 ===================================} +[FEC_TFU] +Tourelle + Orienter haut -[DONS2AA:DONS2] -Don ? +[FEC_TFD] +Tourelle + Orienter bas -[DONS2AB:DONS2] -Toni ! +[FET_RIG] +CHOISIR UNE AUTRE COMMANDE POUR CETTE ACTION -[DONS2AC:DONS2] -Comment se passe la campagne ? +[FEA_NM3] +AUCUN FICHIER MP3 TROUVE -[DONS2AD:DONS2] -C'est la phase finale et chaque vote va compter ! +[FEA_MPB] +VOLUME MP3 A FOND -[DONS2AE:DONS2] -Les partisans d'O'Donovan bossent dur pour gagner les dernières voix. +[FEA_MUS] +VOLUME MUSIQUE -[DONS2AF:DONS2] -On a notre propre véhicule électoral, va donc répandre la bonne parole ! +[FEA_SFX] +VOLUME EFFETS SONORES -[DONS2BA:DONS2] -Votez pour O'Donovan à la mairie ! +[CVT_ERR] +Espace disque épuisé. Libérez de la mémoire sur votre disque dur pour continuer. Appuyez sur ECHAP pour annuler. -[DONS2BB:DONS2] -Votez pour O'Donovan contre la corruption ! +[FEA_ADP] +AUTODETECT MATERIEL -[DONS2BC:DONS2] -O'Donovan, notre maire à tous ! +{=================================== MISSION TABLE AMBULAE ===================================} -[DONS2BD:DONS2] -Votez contre le crime ! Votez O'Donovan ! +[ATUTOR2:AMBULAE] +~g~Conduis les patients à l'hôpital. DOUCEMENT. Chaque secousse réduit leurs chances de survie. -[DONS2BE:DONS2] -Votez pour la justice ! Votez O'Donovan! +[A_FULL:AMBULAE] +~r~Ambulance pleine! -[DONS2CA:DONS2] -O'Donovan a trois femmes ! +[A_FAIL2:AMBULAE] +~r~Ton manque de rapidité a été fatal pour le patient! -[DONS2CB:DONS2] -Qui a mangé les tartes ? O'Donovan ! +[A_FAIL3:AMBULAE] +~r~Le patient est mort!! -[DONS2CC:DONS2] -O'Donovan est un drogué ! +[A_PASS:AMBULAE] +Sauvé! -[DONS2CD:DONS2] -O'Donovan croit en la sodomie obligatoire ! +[A_COMP2:AMBULAE] +Tu ne seras plus jamais essoufflé! -[DONS2CE:DONS2] -O'Donovan est un communiste ! +[A_COMP1:AMBULAE] +Missions Ambulance réussies : $~1~ -[DONS2CF:DONS2] -O'Donovan porte les culottes de sa fille ! +[A_CANC:AMBULAE] +~r~Mission ambulance annulée! -[DONS2CG:DONS2] -O'Donovan barbote tout nu avec les porcs ! +[A_COMP3:AMBULAE] +Missions ambulance accomplies! Maintenant, tu peux sprinter indéfiniment! -[DONS2CH:DONS2] -O'Donovan déteste l'Amérique ! +[ALEVEL:AMBULAE] +Mission ambulance, niveau ~1~ -[DONS2CI:DONS2] -Love abandonnera l'impôt sur la fortune ! +[A_FAIL1:AMBULAE] +Mission ambulance achevée. -[DONS2CJ:DONS2] -Votez Love pour des cours de pathologie à l'école ! +[A_SAVES:AMBULAE] +PERSONNES SAUVEES : ~1~ -[DONS2CK:DONS2] -Donald Love se battra pour l'accès à la morgue pour tous ! +{=================================== MISSION TABLE ASSIN1 ===================================} -[DONS2CL:DONS2] -Donald Love est un héros de guerre ! +[ASM1_5:ASSIN1] +~r~Il a livré toutes ses pizzas! -[DONS2CM:DONS2] -Voter pour Love, c'est voter pour le bonheur ! +[ASM1_6:ASSIN1] +Livraisons restantes : -[DONS2CN:DONS2] -Donald Love : l'ennemi des végétariens ! +[ASM1_7:ASSIN1] +~g~Carl Pearson, livreur de pizzas. Tue-le avant qu'il ne termine ses livraisons. -[DONS2_1:DONS2] -~w~Monte dans la ~b~camionnette. +[ASM1_D:ASSIN1] +Ton aide dans l'éradication de ces indésirables fut une excellente affaire. -[DONS2_3:DONS2] -~w~O'Donovan a sorti ses ~r~camionnettes~w~ pour regagner des votes ! +{=================================== MISSION TABLE ASSIN2 ===================================} -[DONS2_4:DONS2] -~r~T'as pas gagné assez de votes ! +[ASM2_1:ASSIN2] +~g~Mme Dawson va bientôt quitter la bijouterie à Vice Point. Tue-la. Il faut que ça ressemble à un accident de voiture. -[DONS2_6:DONS2] -~w~Temps restant +[ASM2_3:ASSIN2] +~g~Ca va sauter, écarte toi! -[DONS2_7:DONS2] -~w~Remonte dans la ~b~camionnette~w~ et continue la mission ! +[ASM2_4:ASSIN2] +~r~T'as bousillé sa bagnole alors qu'elle était même pas dedans. Elle est pas près de l'utiliser, maintenant! -[DONS2_9:DONS2] -~w~O'Donovan a envoyé une nouvelle ~r~camionnette~w~ ! +[ASM2_5:ASSIN2] +~r~Elle s'est enfuie! -[DONS210:DONS2] -~w~Circonscriptions tenues +[ASM2_6:ASSIN2] +~r~Tu étais trop près de l'accident! -[DONS211:DONS2] -~r~Tu as perdu toutes les circonscriptions ! +[ASM2_7:ASSIN2] +~g~N'utilise pas d'armes! Il faut que ça ressemble à un accident! Sors-la plutôt de la route! -[DONS212:DONS2] -~r~Tu n'as pas réussi à décimer l'opposition ! +[ASM2_8:ASSIN2] +~g~La mort de madame Dawson doit avoir l'air d'un accident. N'utilise pas d'armes. -[DONS2_2:DONS2] -~w~Conduis à travers les ~y~points de passage des circonscriptions disputées~w~ pour gagner leur vote. +[ASM2_9:ASSIN2] +~g~Il te faut une voiture pour ce boulot! -[DONS215:DONS2] -~w~T'as perdu une ~y~circonscription~w~ au profit de O'Donovan ! +[ASM2_10:ASSIN2] +~g~Quand sa bagnole prendra feu, éloigne-toi le plus possible du lieu de l'accident. -[DONS216:DONS2] -~w~Ne laisse pas O'Donovan reprendre le contrôle de toutes les ~y~circonscriptions ! +[ASM2_11:ASSIN2] +A l'aide! -[DONS213:DONS2] -~w~T'as maintenant assez de circonscriptions. Elimine les ~r~camionnettes de l'opposition~w~ pour stopper la progression de O'Donovan. +[ASM2_12:ASSIN2] +Que quelqu'un m'aide! -[DONS2_8:DONS2] -~w~Tu dois tenir au moins 5 ~y~circonscriptions. +[ASM2_13:ASSIN2] +Oh non! -[DONS214:DONS2] -~w~Tu tiens moins de 5 ~y~circonscriptions~w~. Récupère-les ! +[ASM2_A:ASSIN2] +Mes félicitations pour ce travail bien fait, Mr. Teal. Mon client était ravi. -[DONS217:DONS2] -~w~Prends d'autres circonscriptions pour faire augmenter ta récompense. +[ASM2_2:ASSIN2] +Santé : -[DONS2_5:DONS2] -~r~La camionnette électorale a été détruite ! +{=================================== MISSION TABLE ASSIN3 ===================================} -[DONS218:DONS2] -~w~Tu dois tenir au moins 5 ~y~circonscriptions~w~ avant ~1~:~1~ heures. +[ASM3_11:ASSIN3] +TEMPS : -[DONS219:DONS2] -~w~Tu dois tenir au moins 5 ~y~circonscriptions~w~ avant 0~1~:~1~ heures. +[ASM3_C:ASSIN3] +Un gang européen prépare un braquage de banque à Vice City. Mes employeurs préfèreraient que cela n'arrive pas. -[DONS220:DONS2] -~w~Tu dois tenir au moins 5 ~y~circonscriptions~w~ avant 0~1~:0~1~ heures. +[ASM3_D:ASSIN3] +Chaque membre du gang dispose d'une couverture à Vice City. Certains ont des petits boulots, d'autres jouent les touristes. -[DONS221:DONS2] -~w~Tu dois tenir au moins 5 ~y~circonscriptions~w~ avant ~1~:0~1~ heures. +[ASM3_E:ASSIN3] +Chaque cible et leur position probable sont indiqués sous le téléphone. -[DONS230:DONS2] -~w~T'as maintenant assez de circonscriptions. Elimine la ~r~camionnette de l'opposition~w~ pour stopper la progression de O'Donovan. +[ASM3_14:ASSIN3] +~g~Dick Tanner est à côté de DBP Security sur Ocean Drive. -{=================================== MISSION TABLE DONS3 ===================================} +[ASM3_15:ASSIN3] +~g~Marcus Hammond et Franco Carter sont près de la bijouterie de Vice Point. -[CAMP_01:DONS3] -Antonio ! Que pasa, amigo ? +[ASM3_16:ASSIN3] +~g~Nick Kong est à côté de Washington Beach. -[CAMP_02:DONS3] -Il s'passe que j'suis italien, Don, pas espagnol. +[ASM3_18:ASSIN3] +~g~Ne t'approche pas trop près de la cible où elle risque de te repérer et d'essayer de se faire la malle! -[CAMP_03:DONS3] -Evidemment, suis-je bête... Mais j'aime tellement les langues romantiques. +[ASM3_19:ASSIN3] +~g~Il t'a repéré! Bute-le! -[CAMP_04:DONS3] -Oh mais, c'est délicieux. +[ASM3_20:ASSIN3] +~g~Ils t'ont repéré! Tue-les vite tous les deux! -[CAMP_05:DONS3] -Ca a le goût du poulet, mais en plus... comment dire... délicat... +[ASM3_21:ASSIN3] +~r~Tu n'as pas tué tous les membres du gang à temps! -[CAMP_06:DONS3] -Tu en veux ? +[ASM3_22:ASSIN3] +~g~Ne t'approche pas trop des cibles ou elles risquent de te repérer et d'essayer de filer. -[CAMP_07:DONS3] -J'ai déjà mangé, merci. +[ASM3_12:ASSIN3] +~g~Des armes ont été laissées à ta disposition dans le coin si tu en as besoin. Tu as ~h~9 MINUTES ~g~pour tuer tous les membres du gang. -[CAMP_08:DONS3] -Tant pis pour toi... +[ASM3_13:ASSIN3] +~g~Mike Griffin travaille sur un panneau publicitaire à Washington. -[CAMP_09:DONS3] -J'ai commandé quelques petites friandises supplémentaires... +[ASM3_17:ASSIN3] +~g~Charlie Dilson est à moto sur Washington. -[CAMP_10:DONS3] -Les libéraux s'en donneraient à coeur joie, évidemment, +{=================================== MISSION TABLE ASSIN4 ===================================} -[CAMP_11:DONS3] -mais que savent-ils des vrais plaisirs de la vie !? +[ASM4_12:ASSIN4] +Distance : -[CAMP_12:DONS3] -Sophistication et démocratie n'ont jamais fait bon ménage. +[ASM4_15:ASSIN4] +~g~Prends le fusil à lunette sur ta droite. -[CAMP_13:DONS3] -Ecoutez, Don, faut qu'on gagne cette élection. +[ASM4_16:ASSIN4] +~g~Observe la femme au balcon. Elle va descendre l'escalator et demander l'heure à quelqu'un. -[CAMP_14:DONS3] -Donc, il faut s'assurer qu'y a pas de cadavre dans les placards, +[ASM4_17:ASSIN4] +~g~Lorsque la conversation est terminée, liquide son interlocuteur sans faire de mal à la femme. -[CAMP_15:DONS3] -si vous voyez c'que j'veux dire... +[ASM4_18:ASSIN4] +~g~Une fois la cible éliminée, récupère la serviette et amène-la à Ammu-Nation dans le centre. -[CAMP_16:DONS3] -Absolument. +[ASM4_19:ASSIN4] +~g~Reste à distance de la cible. Sa proximité t'est indiquée par la barre de distance située dans le coin supérieur droit de l'écran. -[CAMP_17:DONS3] -C'que j'veux dire, c'est que... +[ASM4_20:ASSIN4] +~g~Ne la laisse pas devenir pleine ou tu seras repéré. -[CAMP_18:DONS3] -Comment on s'occupe de ce O'Donovan qui sert de couverture aux... +[ASM4_21:ASSIN4] +~g~Récupère la serviette! -[CAMP_19:DONS3] -qui représente les Forelli ? +[ASM4_22:ASSIN4] +~g~Ramène la serviette à Ammu-Nation dans le centre. -[CAMP_20:DONS3] -Ce type a pas mal de monde pour démarcher, +[ASM4_23:ASSIN4] +~g~Il t'a repéré et s'enfuit. Rattrape-le et récupère la serviette! -[CAMP_21:DONS3] -tout un tas de gens influents dans l'erreur, si tu vois ce que je veux dire. +[ASM4_25:ASSIN4] +~r~T'as buté la femme, imbécile! -[CAMP_22:DONS3] -Je crois qu'il faudrait... comment dire... secouer un peu leur foi en la démocratie. +[ASM4_26:ASSIN4] +~r~La cible a embarqué pour son vol! -[CAMP_23:DONS3] -Vous voulez que je leur colle la branlée du siècle ? +[ASM4_27:ASSIN4] +~r~La cible t'a repéré! Tu devais garder tes distances! -[CAMP_24:DONS3] -Oh, quelle fougue, Antonio ! C'est... sublime. +[ASM4_28:ASSIN4] +~r~La cible t'a repéré! Elle t'a entendu tirer! -[CAMP_25:DONS3] -C'est tellement... hum... Wagnérien ! Tu comprends ?! Arriverdici, amigo ! +[ASM4_29:ASSIN4] +~r~Ne le tue qu'après qu'il ait parlé à la femme! -[CAMP_26:DONS3] -Humphries, apportez les abats ! +[ASM4_A:ASSIN4] +L'heure est venue de s'occuper d'un gros poisson, M. Teal. Il y a un fusil dans le feuillage à votre droite. -[DONS3_1:DONS3] -Toni doit se débarrasser des employés électoraux de l'opposition pour affaiblir la campagne d'O'Donovan, le candidat des Forelli. +[ASM4_B:ASSIN4] +Surveillez la femme sur le balcon situé au-dessus des guichets d'enregistrement. Elle va avancer à travers la foule et demander l'heure à quelqu'un. -[DONS3_2:DONS3] -~w~Tue les ~r~employés électoraux de l'opposition. +[ASM4_C:ASSIN4] +Vous devez tuer son interlocuteur, récupérer la mallette et l'apporter à l'emplacement indiqué sous le téléphone. -[DONS3_3:DONS3] -~r~Le temps imparti est écoulé. +{=================================== MISSION TABLE ASSIN5 ===================================} -[DONS3_4:DONS3] -Ces trois ~r~partisans ~w~sont cuits. Occupe-toi des suivants ! +[ASM5_A:ASSIN5] +Un deal important se déroule sur le toit de l'usine de crème glacée Cherry Popper. -[DONS3_5:DONS3] -~w~Tue les ~r~employés électoraux~w~ de l'opposition avant ~1~:~1~. +[ASM5_B:ASSIN5] +Descendez toutes les personnes impliquées, embarquez la marchandise et amènez-la à la piste pour hélicos de l'aéroport. -[DONS3_6:DONS3] -~w~Tue les ~r~employés électoraux~w~ de l'opposition avant ~1~:0~1~. +[ASM5_C:ASSIN5] +Il y a une porte sur votre gauche qui mène à l'arrière de l'usine. -[DONS3_7:DONS3] -~w~Tue les ~r~employés électoraux~w~ de l'opposition avant 0~1~:~1~. +[ASM5_1:ASSIN5] +~g~Entre dans l'enceinte située derrière l'usine de crème glacée Cherry Popper et va jusqu'au toit où se fait le deal. -[DONS3_8:DONS3] -~w~Tue les ~r~employés électoraux~w~ de l'opposition avant 0~1~:0~1~. +[ASM5_2:ASSIN5] +~g~Récupère la marchandise et amène-la à la piste pour hélicos de l'aéroport. -{=================================== MISSION TABLE DONS4 ===================================} +[ASM5_3:ASSIN5] +~g~Emmène la marchandise à la piste pour hélicos de l'aéroport! -[DONS410:DONS4] -Va à ~y~l'entrepôt des Forelli~w~ et mets le feu à leurs bulletins de vote ! +{=================================== MISSION TABLE BANKJ1 ===================================} -[DONS411:DONS4] -Brûle les ~r~bulletins de vote~w~ et détruis les ~r~presses à imprimer ! +[WANTED1:BANKJ1] +~g~Largue les flics et perds ton indice de recherche! -[DONS412:DONS4] -Détruis la ~r~presse à imprimer ! +[BJM1_A:BANKJ1] +Tommy! Hé, regarde-ça, c'est génial! J'ai fait installer un minibar! -[DONS413:DONS4] -Brûle TOUS les ~r~bulletins de vote ! +[BJM1_B:BANKJ1] +Y'a déjà un vrai bar en bas, Ken. -[DONS414:DONS4] -Détruis les dernières ~r~camionnettes des Forelli ! +[BJM1_C:BANKJ1] +Ouais, je sais, et alors? Bon, j'ai le tableau noir que tu m'as demandé. -[DONS416:DONS4] -~r~T'as perdu une camionnette des Forelli ! Ils vont pouvoir truquer l'élection ! +[BJM1_D:BANKJ1] +Ah, c'est là qu'on voit l'intérêt de ton école de droit : t'as appris à suivre les instructions. -[DONS418:DONS4] -Il reste ~r~~1~ palettes~w~ de faux bulletins de vote. +[BJM1_E:BANKJ1] +Bon, il me faut un mec sûr. -[DONS419:DONS4] -Il reste ~r~1 palette~w~ de faux bulletins de vote ! +[BJM1_F:BANKJ1] +Euh, d'accord, laisse-moi réfléchir... Sûr... sûr... sûr... Je sais! Je connais un mec qui te plaira! -[DONS420:DONS4] -Détruis la dernière ~r~camionnette des Forelli ! +[BJM1_G:BANKJ1] +Aaah, non, merde, ce con est au trou. -[DONS421:DONS4] -Cette presse est détruite ! Occupe-toi de l'autre ~r~presse ! +[BJM1_H:BANKJ1] +Comment ça au trou? -[DONS422:DONS4] -La presse est détruite ! +[BJM1_I:BANKJ1] +Dans un poste de police. Il attend son transfert. -[DONS423:DONS4] -Maintenant, tire-toi de là ! +[BJM1_J:BANKJ1] +Je crois qu'il va être remis en liberté sur parole... -[DONS424:DONS4] -Détruis les ~r~presses à imprimer ! +[BJM1_1:BANKJ1] +~g~Sors Cam Jones de chez les flics! -[DS4_AA:DONS4] -Tous ces votes et tout ce fric qui attendent d'être récoltés... +[BJM1_3:BANKJ1] +~g~Tu trouveras quelque chose d'utile dans la salle des casiers. -[DS4_AB:DONS4] -Je ne prétends pas comprendre la politique. +[BJM1_21:BANKJ1] +~g~La carte d'accès aux cellules se trouve à l'étage. -[DS4_AC:DONS4] -Personne ne la comprend, en fait. Tout n'est que bluff et corruption. +[BNK1_7:BANKJ1] +Cam Jones? -[DS4_AD:DONS4] -Les Forelli détiennent une partie de la boîte qui fabrique les nouvelles machines à voter. +[BNK1_8:BANKJ1] +Je viens t'aider à mettre les bouts! -[DS4_AE:DONS4] -C'est pas bien, ça... +[BNK1_10:BANKJ1] +Ouais, c'est moi... -[DS4_AF:DONS4] -On peut sûrement pas leur faire confiance. +[BNK1_11:BANKJ1] +Ca me va! -[DS4_AG:DONS4] -Il vaudrait mieux qu'elles déplorent toutes un grave dysfonctionnement, si tu me suis... +[BNK1_13:BANKJ1] +J'ai un boulot à faire et t'es mon perceur de coffre. -[DONS4H1:DONS4] -Tu trouveras de l'artillerie lourde à l'armurerie Fully Cocked de Phil Cassidy. +[BNK1_14:BANKJ1] +Marre de perdre mon temps dans une cellule. -[DONS4AA:DONS4] -Antonio, content de te voir ! +[BJM1_22:BANKJ1] +~g~Ramène Cam chez lui! -[DONS4AB:DONS4] -Je ne suis pas Démocrate, mais même moi, je ne fais pas dans le truquage d'urnes. +[BJM1_23:BANKJ1] +~g~Tu dois d'abord trouver la carte d'accès! -[DONS4AC:DONS4] -Tu savais que les Forelli détenaient une partie de la boîte qui fabrique les nouvelles machines à voter ? +[BNK1_12:BANKJ1] +Sème les flics et ramène-moi chez moi! -[DONS4AD:DONS4] -C'est pas bien, ça... +[BJM1_20:BANKJ1] +Jette ton flingue ou tu vas en subir les conséquences! -[DONS4AE:DONS4] -On peut sûrement pas leur faire confiance. +[BJM1_5:BANKJ1] +Accès réservé au personnel autorisé! -[DONS4AF:DONS4] -Il vaudrait mieux qu'elles déplorent toutes un grave dysfonctionnement, si tu me suis... +[BJM1_2:BANKJ1] +~r~T'étais supposé faire sortir Cam, pas le faire tuer! -[DONS4_8:DONS4] -Va à l'armurerie Fully Cocked de Phil Cassidy. +[BJM1_4:BANKJ1] +Il est armé! Descendez-le! -[DONS4H2:DONS4] -L'armurerie de Phil Cassidy est représentée par un drapeau sur le radar. +{=================================== MISSION TABLE BANKJ2 ===================================} -[DONS427:DONS4] -Maintenant, tire-toi de Fort Staunton ! +[BJM2_A:BANKJ2] +Il nous faut un braqueur. T'en connais un? -[DONS4_9:DONS4] -Tu trouveras tout le matos nécessaire pour perturber la campagne des Forelli à l'armurerie Fully Cocked de Phil Cassidy. +[BJM2_B:BANKJ2] +Hé, Tommy, Tommy, ce truc ça permet d'rester dans l'coup, mec! -[DONS417:DONS4] -Il y a un autre lance-flammes à l'armurerie Fully Cocked de Phil Cassidy. +[BJM2_C:BANKJ2] +WoooOOOooo! -[DONS425:DONS4] -Récupère le lance-flammes à l'armurerie Fully Cocked de Phil Cassidy. +[BJM2_D:BANKJ2] +J'pourrais être ton braqueur! Haut les mains! Haut les mains! -[DONS426:DONS4] -~r~Le vendeur est de l'histoire ancienne ! +[BJM2_E:BANKJ2] +T'es pas un braqueur, t'es un idiot. -[DONS4H3:DONS4] -Donald Love a commandé un lance-flammes. Va le récupérer à l'armurerie Fully Cocked de Phil Cassidy. +[BJM2_F:BANKJ2] +Va boire un verre et ferme-la. -{=================================== MISSION TABLE DONS5 ===================================} +[BJM2_G:BANKJ2] +Hé, tire-toi de mon chemin! Ye ye ye ow ow! -[DONS5_7:DONS5] -Protège la limousine de Donald ! +[BJM2_H:BANKJ2] +Cam, qu'est-ce que t'en penses? -[DONS5_9:DONS5] -~r~Donald Love est mort ! +[BJM2_I:BANKJ2] +Ben, le meilleur tireur de cette ville, c'est un mec qui s'appelle Cassidy. -[DONS513:DONS5] -Dégâts de la limo +[BJM2_J:BANKJ2] +Ah ouais? -[DONS516:DONS5] -Monte dans la ~b~limo ! +[BJM2_K:BANKJ2] +Ouais. Un militaire ou en tout cas c'est ce qu'il croit. -[DONS517:DONS5] -T'as laissé tomber ~b~Donald Love ! +[BJM2_L:BANKJ2] +Je doute qu'il ait jamais été dans l'armée, mais il sait sûrement où dégotter des flingues. -[DONS519:DONS5] -Amène Donald à la ~y~planque ! +[BJM2_M:BANKJ2] +Il devrait être au champ de tir. -[DONS520:DONS5] -Tue les ~r~assaillants ! +[BJM2_2A:BANKJ2] +C'est toi, Phil Cassidy? -[DONS521:DONS5] -Monte dans la ~b~limo ! +[BJM2_2B:BANKJ2] +Pourquoi? -[DS5_AA:DONS5] -Et dire que je déteste la publicité... mais ça fait partie du jeu, n'est-ce pas ? +[BJM2_2C:BANKJ2] +Je cherche un mec qui sache se servir d'un flingue. D'après ce que je vois, j'suis pas convaincu... -[DS5_AB:DONS5] -Evidemment. +[BJM2_2D:BANKJ2] +Mon pote, je peux dégomme une mouche sur ta tête à 25 mètres! -[DS5_AC:DONS5] -Les Forelli vont essayer de me descendre, pas vrai ? +[BJM2_2E:BANKJ2] +Vraiment? -[DS5_AD:DONS5] -Vous inquiétez pas, j'vous accompagne... +[BJM2_2F:BANKJ2] +Ouais. J'ai appris ça à l'armée. -[DS5_AE:DONS5] -Bon, c'est là que tout se joue... +[BJM2_2G:BANKJ2] +Ils s'amusent souvent à descendre des mouches à l'armée? Heureusement que je paye pas d'impôts! -[DS5_BA:DONS5] -Merde ! C'est pas vrai ! +[BJM2_2H:BANKJ2] +Tu t'crois marrant peut-être, minus? -[DS5_BB:DONS5] -Pas de panique ! Je m'occupe de ces cons ! +[BJM2_2I:BANKJ2] +Ha ha ha ha ha! -[DS5_BC:DONS5] -Y a un fusil dans le coffre ! +[BJM2_2J:BANKJ2] +Tirons quelques coups. -[DS5_BD:DONS5] -Verrouillez les portes ! Ca sera pas long ! +[BJM2_1:BANKJ2] +~g~Va à Ammu-Nation dans le centre et parle à Phil Cassidy. -[DS5_CA:DONS5] -OK, on peut y aller. +[BJM2_4:BANKJ2] +SCORE MANCHE 1 : ~1~ -[DS5_CB:DONS5] -On a un autre tueur après nous ! +[BJM2_6:BANKJ2] +SCORE MANCHE 2 : ~1~ -[DS5_DA:DONS5] -Difficile de faire campagne en se terrant comme un lâche. +[BJM2_7:BANKJ2] +SCORE TOTAL : ~1~ -[DS5_DB:DONS5] -Nous allons devoir repenser notre stratégie. +[BJM2_9:BANKJ2] +~g~Va au point de départ de la deuxième manche. -[DONS522:DONS5] -Ramène Donald chez ~y~lui ! +[BJM2_11:BANKJ2] +~r~Phil est mort! -{=================================== MISSION TABLE DONS6 ===================================} +[BJM2_12:BANKJ2] +~r~Un des tireurs est mort! -[DS6_00:DONS6] -Suis la ~b~camionnette avec les bulletins ! +[BJM2_14:BANKJ2] +~g~Continue jusqu'au prochain secteur! -[DS6_01:DONS6] -Attends que le ~b~coursier ~w~fasse l'échange ! +[BJM2_17:BANKJ2] +~g~Va parler à Phil. -[DS6_02:DONS6] -Récupère les bulletins auprès du ~r~coursier ! +[BJM2_24:BANKJ2] +~g~La cible la plus proche rapporte un point. -[DS6_03:DONS6] -Tue le ~r~coursier ! +[BJM2_25:BANKJ2] +~g~La cible intermédiaire rapporte deux points. -[DS6_04:DONS6] -Prends le ~g~paquet ! +[BJM2_27:BANKJ2] +~g~Toutes les cibles de cette manche rapportent un point. -[DS6_05:DONS6] -Suis ~b~la camionnette ~w~avec les bulletins ! +[BNK2_4:BANKJ2] +Waou! -[DS6_06:DONS6] -~r~T'as tué un coursier avant de procéder à l'échange ! +[BNK2_5:BANKJ2] +Il raterait une vache dans un couloir! -[DS6_07:DONS6] -T'as manqué un échange ! Tu peux pas te permettre d'en rater un autre ! +[BNK2_7:BANKJ2] +Bon, tu veux bien me rendre un service et m'assister sur un boulot? -[DS6_08:DONS6] -~r~T'as manqué deux échanges, le vote ne peut pas être truqué ! +[BNK2_8:BANKJ2] +Mon gars, vu comment tu tires, si tu me demandes en mariage, j'accepte. -[DS6_09:DONS6] -~r~Tu lui as fait peur ! +[BNK2_9A:BANKJ2] +Mon gars, tu ferais mieux de remballer ton baratin et tes grands projets. T'es trop mauvais tireur. -[DS6_10:DONS6] -~r~La camionnette a été détruite ! +[BNK2_9B:BANKJ2] +T'es trop mauvais tireur. -[DS6_11:DONS6] -Le temps est écoulé ! +[BJM2_28:BANKJ2] +SCORE MANCHE TROIS : ~1~ -[DS6_12:DONS6] -~r~T'as pas rattrapé la camionnette ! +[BJM2_26:BANKJ2] +~g~La cible éloignée rapporte trois points. -[DS6_13:DONS6] -~r~La camionnette ne roule pas sans chauffeur ! +[BNK2_1:BANKJ2] +BALLES REELLES -[DS6_15:DONS6] -~r~T'as fais peur au chauffeur ! Tu le rattraperas plus maintenant ! +[RANGE_1:BANKJ2] +SCORE POUR LE TIR : ~1~ -[DS6_16:DONS6] -~1~ +[BJM2_2:BANKJ2] +~g~Pour quitter la manche, appuie sur la ~h~~k~~PED_JUMPING~. -[DS6_17:DONS6] -~w~Le chauffeur est mort ! Conduis la camionnette au ~y~garage de Donald. +[BJM2_N:BANKJ2] +Du calme... -[DONS6AA:DONS6] -Mauvaise nouvelle, Toni ! +{=================================== MISSION TABLE BANKJ3 ===================================} -[DONS6AB:DONS6] -Quoi ? +[BJM3_A:BANKJ3] +Les choses commencent à se mettre tranquillement en place, ici. -[DONS6AC:DONS6] -Les estimations nous donnent au coude à coude. +[BJM3_B:BANKJ3] +C'est quoi le plan, Tommy? Que pasa, amigo? -[DONS6AD:DONS6] -Alors, on passe au plan B. +[BJM3_C:BANKJ3] +Le plan, c'est que toi, tu restes ici à glander. Bon, on a besoin d'un chauffeur. -[DONS6AE:DONS6] -On vole quelques bulletins pas encore décomptés et on les remplace par les nôtres. +[BJM3_D:BANKJ3] +Tommy, je m'en charge! Je peux conduire. -[DONS6AF:DONS6] -Vous disiez quoi à propos du truquage électoral ? +[BJM3_E:BANKJ3] +C'est Hilary que tu veux, mec! Pas un stupide vantard d'école de droit. -[DONS6AG:DONS6] -Oh, la ferme ! +[BJM3_F:BANKJ3] +Hilary, c'est le meilleur. T'as jamais vu quelqu'un conduire aussi vite. Je vais l'appeler. -[DS6_14:DONS6] -Retourne chercher les ~g~bulletins~w~ ! Il nous les faut ! +[BJM3_G:BANKJ3] +Salut, Hil, c'est Phil. Comment ça va? Non, attends, on causera plus tard, j'ai besoin que tu me rendes un service. -[DS6_66:DONS6] -~r~Tu as détruit la voiture d'un coursier avant l'échange ! +[BJM3_H:BANKJ3] +J'ai avec moi un mec du nord. Non, je crois pas qu'il était dans l'armée, mais il a besoin d'un conducteur. -[DS6_18:DONS6] -T'as tué le coursier avant l'échange ! Ne recommence pas ! +[BJM3_I:BANKJ3] +Pour un peu d'adrénaline. Ok, compris. -[DS6_21:DONS6] -Magne-toi ! Il y a un autre échange en cours ! +[BJM3_J:BANKJ3] +Qu'est-ce qu'il a dit? -[DS6_22:DONS6] -T'as raté le premier échange, t'as plus droit à l'erreur ! +[BJM3_K:BANKJ3] +Bon, il marche, pas de problème. En fait, y'a juste un détail, tu vois, il pose toujours une condition. -[DS6_23:DONS6] -T'as raté le deuxième échange, t'as plus droit à l'erreur ! +[BJM3_L:BANKJ3] +Il refuse de bosser pour quelqu'un qui ne peut pas le battre. Un truc à cause de sa mère. -[DS6_24:DONS6] -T'as raté le troisième échange, t'as plus droit à l'erreur ! +[BJM3_M:BANKJ3] +Quoi qu'il en soit, il veut t'affronter d'abord et il a dit qu'il te retrouvait dehors... -[DS6_25:DONS6] -T'as raté le quatrième échange, t'as plus droit à l'erreur ! +[BJM3_2A:BANKJ3] +C'est toi Tommy? Evidemment que c'est toi Tommy, enfin, je veux dire, -[DS6_26:DONS6] -T'as foutu la trouille à un coursier avant l'échange ! Ne recommence pas ! +[BJM3_2B:BANKJ3] +pourquoi est-ce que quelqu'un d'autre parlerait avec moi? -[DS6_28:DONS6] -~r~T'as tout foiré ! Le vote ne peut plus être truqué ! +[BJM3_2C:BANKJ3] +Bon. Ecoute-moi. -{=================================== MISSION TABLE DONS7 ===================================} +[BJM3_2D:BANKJ3] +Je conduis pour toi que SI, et seulement SI, tu peux conduire convenablement. -[ELEC_01:DONS7] -Salut, Don, j'ai réglé ce merdier pour vous. +[BJM3_2E:BANKJ3] +Abandonne et je ne te pardonnerai jamais. -[ELEC_02:DONS7] -Tout devrait être cool maintenant. +[BJM3_2:BANKJ3] +~r~Hilary est mort! -[ELEC_03:DONS7] -Vraiment ? +[BJM3_4:BANKJ3] +~g~T'as besoin d'une voiture! -[ELEC_04:DONS7] -Vous avez plus aucun lien avec le crime organisé. +[BNK3_1:BANKJ3] +Ok, je piloterai pour toi, mais s'il te plaît, traite-moi mal. -[ELEC_05:DONS7] -Vous êtes blanc comme neige. Vous pourriez même devenir pape. +[BNK3_3A:BANKJ3] +Course de rue illégale dans Vice Point! -[ELEC_07:DONS7] -Bien qu'aucun lien n'ait pu être établi entre Donald Love +[BNK3_3B:BANKJ3] +Appel à tous les officiers. -[ELEC_08:DONS7] -et le crime organisé de Liberty City, +[BNK3_3C:BANKJ3] +Les courses de rue sont formellement interdites! -[ELEC_09:DONS7] -il semblerait que son amitié avec des gangsters tels que Toni Cipriani, +{=================================== MISSION TABLE BANKJ4 ===================================} -[ELEC_11:DONS7] -pèse lourd dans l'esprit des électeurs. +[BNK4_A:BANKJ4] +~w~Comme vous pouvez voir, les mecs, ça va être le fric le plus facile qu'on se soit jamais fait! -[ELEC_12:DONS7] -Les intentions de vote en sa faveur se sont effondrées en quelques heures. +[BNK4_B:BANKJ4] +~w~Tommy, sérieusement, va falloir que tu considères la question judiciaire. -[ELEC_13:DONS7] -Il est jugé, semble-t-il, indigne de servir... +[BNK4_C:BANKJ4] +~w~Merde! Qu'est-ce que tu fumes, mon pote? J'appelle pas ça un plan! -[ELEC_14:DONS7] -Indigne ! Par ta faute... +[BNK4_D:BANKJ4] +~w~Bon, de toute manière, on a pas besoin de plan! -[ELEC_15:DONS7] -Ouais. C'est entièrement ta faute ! +[BNK4_E:BANKJ4] +~w~Prenez le communisme, ça c'était un plan! Et regarde où en est la Russie, maintenant! -[ELEC_16:DONS7] -Ma faute ? +[BNK4_F:BANKJ4] +~w~Du calme, Ok? Avec une équipe comme ça, il n'y aura pas le moindre problème! -[ELEC_17:DONS7] -Ouais. +[BNK4_G:BANKJ4] +~w~On amène Cam au coffre. Phil, toi et moi, on s'occupe de la sécurité et Hilary conduit la bagnole. -[ELEC_18:DONS7] -Ma faute ? +[BNK4_H:BANKJ4] +~w~Hum, euh, t'oublies pas quelqu'un? Quelqu'un qui t'aurait aidé depuis le début dans cette ville? Quelqu'un... -[ELEC_19:DONS7] -Avec tous les sacrifices que j'ai faits pour cette ville, +[BNK4_I:BANKJ4] +~w~Ken... Ken, c'est vrai. Bon, Ken va s'occuper de blanchir le pognon et de garder les boissons au frais! -[ELEC_20:DONS7] -tu sais quel a été mon seul point faible tout ce temps ? +[BNK4_J:BANKJ4] +~w~Je comprends pas ce que je suis supposé faire ici. -[ELEC_21:DONS7] -L'humilité ! Et maintenant, me voilà ruiné ! +[BNK4_K:BANKJ4] +~w~Ecoute, c'est dans la poche. T'as jamais vu de film? -[ELEC_22:DONS7] -La faillite ! 20 millions de dollars ! +[BNK4_L:BANKJ4] +~w~On entre dans la banque, on sort nos flingues et on ressort plein aux as! -[ELEC_23:DONS7] -Ratiboisé... ruiné... refait... C'est fini ! C'est la FAILLITE ! +[P_DEAD:BANKJ4] +~r~Phil est mort! -[ELEC_06:DONS7] -Pape ! Regarde plutôt ça ! +[C_DEAD:BANKJ4] +~r~Cam est mort! -[DONS7_1:DONS7] -O'Donovan peut prouver le lien entre Donald Love et Salvatore Leone. La carrière politique de Donald Love ne tient qu'à un fil. Toni doit détruire la preuve. +[H_DEAD:BANKJ4] +~r~Hilary est mort! -[DONS7_2:DONS7] -~w~Va voler la ~b~camionnette~w~ qui contient la preuve ! +[P_HIND:BANKJ4] +~r~T'as perdu Phil! -[DONS7_3:DONS7] -~r~T'as tué le contact ! +[C_HIND:BANKJ4] +~r~T'as oublié Cam! -[DONS7_4:DONS7] -~w~Conduis la camionnette au ~y~point de livraison ! +[H_HIND:BANKJ4] +~r~Hilary est resté derrière! -[DONS7_5:DONS7] -~w~Remonte dans la ~b~camionnette ! +[GETCAR:BANKJ4] +~g~Monte dans la bagnole pour terminer le boulot! -[DONS7_7:DONS7] -Monte dans la ~b~voiture du contact. +[TRASHED:BANKJ4] +~r~T'as détruit la bagnole pour s'enfuir! -[DONS7CA:DONS7] -Ah, Toni ! +[BNK4_1:BANKJ4] +Je vais conduire. -[DONS7CB:DONS7] -La preuve est dans cette camionnette devant. +[BNK4_2:BANKJ4] +Super. Un passager. Attends que j'en parle à la réunion! -[DONS7CC:DONS7] -Tu vas devoir te frayer un chemin. +[BNK4_3A:BANKJ4] +Hé, fais gaffe à la caisse, Tommy! -[DONS7CD:DONS7] -Ramène la camionnette chez Donald ! +[BNK4_3B:BANKJ4] +Tommy, Hilary prend trop de place! -[DONS7CE:DONS7] -Bonne chance ! +[BNK4_3C:BANKJ4] +C'est pas vrai! -[DONS713:DONS7] -~w~Gare la camionnette dans le ~y~garage. +[BNK4_3D:BANKJ4] +Toi aussi! -[DONS714:DONS7] -~r~T'as détruit la camionnette ! +[BNK4_3E:BANKJ4] +Hé, fermez-la tous les deux ou vous rentrez à pied! -[RMN_AA:DONS7] -Chacun aura toutes les raisons de se réjouir ce soir, car la grève industrielle qui paralysait Liberty City, +[BNK4_3F:BANKJ4] +Ouais, Hilary. -[RMN_AB:DONS7] -est enfin terminée. +[BNK4_3I:BANKJ4] +Putain, Phil! Arrête d'agiter ce truc devant moi! -[RMN_AC:DONS7] -Le trafic a repris sur toutes les lignes de ferries et de métros. +[BNK4_3J:BANKJ4] +Ouais, tu vas éborgner quelqu'un! -[RMN_AD:DONS7] -Même le pont levant qui relie Staunton Island à Shoreside Vale a été rouvert au trafic. +[BNK4_3M:BANKJ4] +Mon bébé! Elle est foutue! -[RMN_AE:DONS7] -Les grévistes ont rangé leurs pancartes et regagné leurs postes de travail, +[BNK4_3O:BANKJ4] +Tu t'accroches à l'illusion de la permanence! -[RMN_AF:DONS7] -suite aux promesses du nouveau maire O'Donovan, à l'occasion d'un rassemblement : +[BNK4_3P:BANKJ4] +Quoi?! -[RMN_AG:DONS7] -'Vous avez ma parole de maire qu'il y aura TOUJOURS un service de ferries à Liberty City.' +[BNK4_3Q:BANKJ4] +Tu crois que toutes les choses dureront! -[RMN_AH:DONS7] -Mais certains trouveront peut-être que cette promesse sonne creux, +[BNK4_3R:BANKJ4] +La jeunesse, les amours, les pizzas... -[RMN_AI:DONS7] -les travaux du nouveau tunnel de Porter Road se poursuivant sans relâche. +[BNK4_3S:BANKJ4] +Tout prend fin un jour, et tu dois l'accepter. -[DONS7_6:DONS7] -~w~Retrouve l'~b~homme~w~ de Donald Love sous le pont autoroutier de Newport. +[BNK4_3T:BANKJ4] +Ouais, t'as raison, merci, Cam. -{=================================== MISSION TABLE RAYS1 ===================================} +[BNK4_3U:BANKJ4] +De rien. -[SAYO_01:RAYS1] -Alors c'est toi, l'empêcheur de tourner en rond ? +[BNK4_3V:BANKJ4] +Hé, Tommy, pourquoi on s'arrête? -[SAYO_02:RAYS1] -Pardon ? +[BNK4_4A:BANKJ4] +~w~Hilary, continue à tourner autour du quartier. -[SAYO_03:RAYS1] -Y a plein de mecs importants qui t'en veulent. +[BNK4_5:BANKJ4] +~w~Ok, Tommy, ok. -[SAYO_04:RAYS1] -Leon McAffrey, LCPD. +[BNK4_6:BANKJ4] +~w~C'EST UN HOLD-UP! -[SAYO_05:RAYS1] -J'vois pas d'quoi vous voulez parler. +[BNK4_7:BANKJ4] +~w~PERSONNE NE BOUGE! -[SAYO_06:RAYS1] -J'bosse dans la restauration. +[BNK4_8:BANKJ4] +~w~TOUT LE MONDE CONTRE LE MUR! -[SAYO_07:RAYS1] -Comme tu veux, cow-boy... +[BNK4_9:BANKJ4] +Phil! Monte la garde! -[SAYO_08:RAYS1] -Si vous voulez tous vous entretuer, c'est pas mon problème. +[BNK4_10:BANKJ4] +Bien compris! -[SAYO_09:RAYS1] -Tout c'que j'veux, c'est ma part. +[BNK4_11:BANKJ4] +Amène-toi, Cam, la salle des coffres est en haut... -[SAYO_12:RAYS1] -Ma part ? Elle est où ? +[BK4_12A:BANKJ4] +Merde! C'est un Flange 9000! -[SAYO_13:RAYS1] -Dans ton cul, mon pote ! Me fais pas rire ! +[BK4_12B:BANKJ4] +Ca peut prendre des heures à ouvrir, -[SAYO_14:RAYS1] -Tu continues à me faire chier et j'te descends avec tes potes et la famille de tes potes +[BK4_12C:BANKJ4] +ou cinq minutes si tu peux trouver le directeur... -[SAYO_15:RAYS1] -et tous les enfoirés d'habitants de ta putain de ville natale. +[BNK4_13:BANKJ4] +Je vais aller voir où il se planque. -[SAYO_16:RAYS1] -Hé ! Va tirer un coup, ça te calmera ! +[BK4_14A:BANKJ4] +Ca roule, Phil? -[SAYO_17:RAYS1] -On parle business. J'te propose un deal : +[BNK4_15:BANKJ4] +Pas de problème. Tout le monde se tient relax. -[SAYO_18:RAYS1] -J'te garantis que les flics s'occupent pas d'toi, les Fédéraux, Rico... +[BNK4_16:BANKJ4] +Toi! Tu viens avec moi! -[SAYO_19:RAYS1] -Et toi, tu m'garantis que je recevrai c'que j'aime. +[BNK4_17:BANKJ4] +D'accord! D'accord! Ne tirez pas! -[SAYO_20:RAYS1] -Et comment je sais que j'vais pas m'faire racketter +[BNK4_18:BANKJ4] +J'AI DIT PERSONNE NE BOUGE! -[SAYO_21:RAYS1] -par tous les flics pourris entre ici et Vice City ? +[BK4_19A:BANKJ4] +C'est réglé sur une serrure à horloge, -[SAYO_22:RAYS1] -Je t'aiderai à t'emparer de cette ville. +[BK4_19B:BANKJ4] +Vous feriez aussi bien d'abandonner tout de suite! -[SAYO_23:RAYS1] -En échange, je veux juste un peu de thune et quelques services. +[BK4_20A:BANKJ4] +Putain, je peux court-circuiter l'horloge, -[SAYO_24:RAYS1] -Allez, Toni, viens faire un tour avec moi... +[BK4_20B:BANKJ4] +on a juste besoin de ton code secret et c'est bingo! -[SAYO_25:RAYS1] -On va aller voir tes vieux potes, les Sindacco. +[BNK4_21:BANKJ4] +Reste ici. T'essayes quoi que ce soit et t'es mort! Pigé? -[SAYO_10:RAYS1] -- J'aime bien les mecs à principes. ~n~ - Ben, moi aussi. Je vais à leur enterrement dans des caisses de sport avec des super canons. +[BK4_24A:BANKJ4] +Je vais voir Phil, je reviens tout de suite. -[RS1_YK:RAYS1] -Dégâts +[BK4_24B:BANKJ4] +Je t'avais dit de pas toucher à cette alarme! -[RS1_01:RAYS1] -Liquide les ~r~Sindacco ! +[BNK4_25:BANKJ4] +Le commando du SWAT sera là d'une minute à l'autre! -[RS1_02:RAYS1] -~r~La voiture a été détruite ! +[BNK4_27:BANKJ4] +J'aurais besoin d'un coup de main, Tommy! -[RS1_03:RAYS1] -~r~Les Yakuzas se sont faits massacrer ! +[BNK4_28:BANKJ4] +Ici le SWAT de Vice City! Vous êtes complètement encerclés! -[RS1_04:RAYS1] -~w~Descends quelques ~r~Sindacco ~w~pour attirer leur attention. +[BNK4_29:BANKJ4] +Encerclés? HA HA HA HAAAAAaaa! -[RS1_05:RAYS1] -~w~Monte dans la ~b~caisse de Leon. +[BNK4_30:BANKJ4] +Ils racontent que des conneries, ces ripoux! -[RS1_06:RAYS1] -~w~Dirige-toi vers le ~y~territoire des Sindacco. +[BK4_31A:BANKJ4] +Tommy! La salle des coffres est ouverte! -[RS1_07:RAYS1] -~w~Retourne à la ~b~bagnole. +[BK4_34A:BANKJ4] +Ok, on a la caisse de retraite du SWAT! Tirons-nous de là! -[RS1_10:RAYS1] -~r~T'as tué Leon ! +[BK4_34B:BANKJ4] +Bon, vous l'aurez cherché! C'était votre dernière chance! -[RAYS1AA:RAYS1] -OK, moi, je prends le volant ! Toi, tu les flingues ! +[BK4_35A:BANKJ4] +Ils lancent l'assaut! -[RAYS1AB:RAYS1] -T'avais pas dit que les Yakuzas feraient le gros boulot ? +[BK4_35B:BANKJ4] +Planquez-vous! -[RAYS1AC:RAYS1] -S'adapter et survivre, Cipriani. S'adapter et survivre... +[BNK4_36:BANKJ4] +Où est Cam? -[RAYS1BA:RAYS1] -Merde, là, c'est un peu trop pour moi. +[BNK4_37:BANKJ4] +Du passé... -[RAYS1BB:RAYS1] -Va falloir que j'y aille, Toni, on se voit plus tard ! +[BNK4_38:BANKJ4] +C'était le dernier! On dégage! Allez! -[RAYS1CA:RAYS1] -Juste devant, Toni ! +[BNK_39:BANKJ4] +Merde! Où est Hilary? -[RAYS1CB:RAYS1] -Derrière nous, Toni, derrière ! +[BK4_40A:BANKJ4] +Il me payera ça! -[RAYS1CC:RAYS1] -Fais gaffe sur la gauche ! +[BNK4_42:BANKJ4] +Hé! Les mecs! Montez! Je vous couvre! -[RAYS1CD:RAYS1] -Sur la droite, Toni, la droite ! +[BNK4_44:BANKJ4] +On a réussi! On est riches! RICHES! -[RAYS1CE:RAYS1] -Retourne à la voiture ! +[BNK4_45:BANKJ4] +Dommage que Cam y soit resté, c'était un mec réglo! -[RAYS1CF:RAYS1] -Fais gaffe à ce que tu fais ! +[BNK4_46:BANKJ4] +Ouais. Enfin... On hérite de sa part! -[RAYS1OS:RAYS1] -Oh merde ! +[BNK4_47:BANKJ4] +Tu l'as dit! Ouais! -{=================================== MISSION TABLE RAYS2 ===================================} +[BNK4_48:BANKJ4] +Tommy, que dirais-tu d'un massage? -[RS2_02:RAYS2] -~w~Vite, monte sur une ~b~moto ! +[BNK4_49:BANKJ4] +Salut, Mercedes! Ouais, pourquoi pas, je me sens un peu tendu... -[RS2_03:RAYS2] -~w~Attire les motards dans la ~y~zone de tir ! +[BNK450A:BANKJ4] +Qu'est-ce que je te disais, Tommy? Hein, quoi? Le SWAT a du souci à se faire quand Kent Paul est en ville. -[RS2_04:RAYS2] -~w~Retourne là-bas, tu ne dois laisser aucun ~r~Forelli ~w~derrière toi ! +[BNK450B:BANKJ4] +Allez, allonge une plus grosse part, mon pote, j'ai besoin de nouvelles fringues! -[RS2_05:RAYS2] -~w~Remonte sur la ~b~moto ! +[BNK4_94:BANKJ4] +~w~Ok, les mecs. Tout roule comme prévu. -[RS2_06:RAYS2] -~r~T'as besoin d'une moto pour attirer les Forelli. +[BM_DEAD:BANKJ4] +~r~T'avais besoin du directeur vivant! -[RS2_07:RAYS2] -~r~Les Yardies veulent faire couler le sang des Forelli eux-mêmes. +[ASSET_A:BANKJ4] +BRAQUAGE DE BANQUE OK! -[RS2_08:RAYS2] -~r~Tous les Yardies ont été tués ! +[ASSET_B:BANKJ4] +~g~Le Malibu Club génère dorénavant un revenu de $~1~ maximum. Pense à récupérer le fric régulièrement. -[RS2_09:RAYS2] -~1~ +[IDIOT:BANKJ4] +~r~T'as raison, trimballe-toi déguisé en malade pour attirer l'attention! Espèce d'abruti! -[RS2_10:RAYS2] -~r~Ils peuvent pas te poursuivre sans motos ! +{=================================== MISSION TABLE BARON1 ===================================} -[RAYS2AA:RAYS2] -T'as pris ton temps, Toni. +[COK1_A:BARON1] +Allez, sale carne, allez! Allez! Putain... -[RAYS2AB:RAYS2] -C'était pour que tu puisses réfléchir. +[COK1_B:BARON1] +Connard de cheval! Je te ferai décapiter! -[RAYS2AD:RAYS2] -Très malin, bon, écoute. +[COK1_C:BARON1] +C'est qui ce con? -[RAYS2AE:RAYS2] -Les Yardies convoitent le territoire des Forelli à Newport. +[COK1_D:BARON1] +Tommy Vercetti, vous vous souvenez de moi? -[RAYS2AF:RAYS2] -Va là-bas et attire les troupes des Forelli jusqu'à l'hôpital de Rockford. +[COK1_E:BARON1] +Excuse-moi, mais j'suis un peu enervé. Fais jamais confiance à une saloperie de canasson! -[RAYS2AG:RAYS2] -Les Yardies les attendront là-bas. +[COK1_F:BARON1] +Tu fais du bon boulot. Maintenant, tu travailles pour moi. -[RAYS2AH:RAYS2] -Qu'est-ce que t'as à y gagner, toi ? +[COK1_H:BARON1] +Comme je disais, amigo, tu bosses pour moi. Maintenant, la ferme! Un salopard m'a trahi! -[RAYS2AI:RAYS2] -J'ai une dette envers eux. Salut. +[COK1_I:BARON1] +Il croit que je sais pas combien de pognon je devrais gagner... Mais me faucher 3%, c'est pareil que d'me faucher 100%! -[RS2_11:RAYS2] -Ne tue aucun Forelli ! +[COK1_J:BARON1] +Personne ne me fait ça! PERSONNE! -[RS2_12:RAYS2] -Elimine-~r~les ! +[COK1_K:BARON1] +Tu vas le suivre depuis son appart' pour voir où il va! On le descendra plus tard. -[RS2_01:RAYS2] -~w~Va voler une des ~b~motos~w~ des Forelli, mais ne tue personne. +[COK1_1:BARON1] +Oh merde! -[RAYS2DB:RAYS2] -Ouais. Allez, c'est parti ! +[COK1_2:BARON1] +Un peu trop lent, papi! -[RS2_13:RAYS2] -~r~Trop de Yardies se sont fait buter ! +[COK1_4:BARON1] +Pauv' mec. -{=================================== MISSION TABLE RAYS3 ===================================} +[COK1_5:BARON1] +Tu ferais mieux de continuer à courir, connard! -[CRAZ_01:RAYS3] -J'comprends pas ce que j'ai fait au bon Dieu pour t'mériter ! +[COK1_8:BARON1] +~g~Vite! Grimpe dans une caisse et suis-le! -[CRAZ_02:RAYS3] -Ray, t'as 40 balais mais t'es aussi naïf qu'un môme ! +[COK1_9:BARON1] +~r~Tu es supposé le suivre, pas le buter! -[CRAZ_03:RAYS3] -J'arrive pas à piger comment t'as tenu jusqu'ici. +[COK1_10:BARON1] +~r~Va à la maison des voleurs et trouve où il planque le fric! -[CRAZ_04:RAYS3] -Incroyable que personne ait encore collé une balle dans ta tronche de Mère Teresa ! +[COK1_11:BARON1] +~g~Regarde par cette fenêtre. -[CRAZ_05:RAYS3] -Fais gaffe à c'que tu dis, Leon... +[COK1_7:BARON1] +~g~Il s'est échappé vers le toit. Suis-le mais ne le tue pas! -[CRAZ_06:RAYS3] -Je comprends pas qu'on soit en train de parler de ça. +[COK1_G:BARON1] +Je travaille pour du fric. -[CRAZ_07:RAYS3] -Tu vas courir dans les jupes de ta mère ? +{=================================== MISSION TABLE BARON2 ===================================} -[CRAZ_08:RAYS3] -Tu vas sauter sur les genoux de ton père ? +[COK2_V:BARON2] +Il commence à me faire confiance... -[CRAZ_09:RAYS3] -Demander un gros câlin ? +[COK2_A:BARON2] +Qui c'est qui m'a foutu un con pareil! -[CRAZ_10:RAYS3] -Salut, Toni ! +[COK2_B:BARON2] +CON! CON! CON! CON! -[CRAZ_14:RAYS3] -Il veut s'assurer que j'applique bien toutes les règles du manuel ! +[COK2_C:BARON2] +Tommy - -[CRAZ_15:RAYS3] -Toni Cipriani, Ray Machowski. +[COK2_D:BARON2] +Quoi, Ricardo? -[CRAZ_16:RAYS3] -Il est avec nous. Bon, on va aller combattre le crime organisé, maintenant. +[COK2_E:BARON2] +Ces merdeux, faut toujours qu'ils essayent de m'baiser... -[CRAZ_17:RAYS3] -Tu fonces au poste de police et tu tapes ton rapport. +[COK2_F:BARON2] +C'est le problème avec ce genre de biz... -[CRAZ_18:RAYS3] -T'es un brave gars... Allez, en route, Toni ! +[COK2_G:BARON2] +Qu'est-ce que tu fous toi? -[CRAZ_19:RAYS3] -T'es qu'une grosse merde, Leon. +[COK2_H:BARON2] +Ces connards m'ont vraiment manqué de respect. -[CRAZ_11:RAYS3] -- Bouge pas, connard ! ~n~ - Hé ! Hé ! Du calme ! J'te présente mon nouveau coéquipier M. Garde-à-vous ! +[COK2_I:BARON2] +Bientôt, le premier connard venu va penser qu'il peut vendre de la dope à Vice City. -[RAYS3_1:RAYS3] -Aide les Yakuzas à s'emparer du territoire tenu par les Forelli, à Belleville Park. Il faut tuer ~1~ Forelli uniquement au katana. +[COK2_J:BARON2] +Et ensuite, ça sera quoi? Ces pourris de la Mafia, hein? -[RAYS3_2:RAYS3] -~w~Tue ~1~ ~r~Forelli~w~ en utilisant seulement le katana. +[COK2_K:BARON2] +Le Q.G. de ce gang est une vrai forteresse au rez-de-chaussée, -[RAYS3_3:RAYS3] -Victimes +[COK2_L:BARON2] +alors Quentin ici... Quentin! QUENTIN! -[RAYS3_4:RAYS3] -~w~Tu dois tuer les ~r~Forelli~w~ avec le katana. +[COK2_M:BARON2] +Il va te faire survoler la zone! -[RAYS3_5:RAYS3] -~w~T'as pas de katana. Trouves-en ~g~un ! +[COK2_N:BARON2] +Liquide-les! -[RAYS3_6:RAYS3] -~r~ Le temps est écoulé. +[COK2_O:BARON2] +Qu'est-ce que tu fous toi? -[RAYS3_7:RAYS3] -~w~Tue ~1~ ~r~Forelli~w~ à l'aide du katana uniquement avant ~1~:~1~. +[COK2_P:BARON2] +Qu'est-ce que tu fous ici? -[RAYS3_8:RAYS3] -~w~Tue ~1~ ~r~Forelli~w~ à l'aide du katana uniquement avant ~1~:0~1~. +[COK2_Q:BARON2] +Hé, je me suis un peu renseigné et c'est sûr -[RAYS3_9:RAYS3] -~w~Tue ~1~ ~r~Forelli~w~ à l'aide du katana uniquement avant 0~1~:~1~. +[COK2_R:BARON2] +que c'est Diaz qui a bousillé le deal et refroidi mon frère! -[RAYS310:RAYS3] -~w~Tue ~1~ ~r~Forelli~w~ à l'aide du katana uniquement avant 0~1~:0~1~. +[COK2_S:BARON2] +Et il va t'buter toi aussi! -{=================================== MISSION TABLE RAYS4 ===================================} +[COK2_T:BARON2] +Je peux me faire Diaz! -[RAYS4_1:RAYS4] -~w~Les Yardies sont attaqués à Newport. Liquide les assaillants ~r~Sindacco. +[COK2_U:BARON2] +Non, écoute-moi! JE m'occupe de Diaz! -[RAYS4_2:RAYS4] -~w~Va parler au ~b~chef des Yardies. +[COK2_1:BARON2] +Il y a un truc que j'pige pas, pourquoi 'Quentin'? -[RAYS4_3:RAYS4] -~w~Suis le ~b~chef des Yardies. +[COK2_2:BARON2] +Je sais pas, ça sonne bien... Quentin Vance... -[RAYS4_4:RAYS4] -~r~Un des Yardies a été tué ! +[COK2_3:BARON2] +Vance? Tu t'appelles Lance Vance? -[RAYS4_5:RAYS4] -~w~Protège les Yardies jusqu'à l'arrivée de l'ambulance ! +[COK2_4:BARON2] +Ca va, hein! J'en ai déjà eu pour mon compte à l'école! -[RAYS4_6:RAYS4] -~w~Retourne là-bas et protège les Yardies ! +[COK2_5:BARON2] +T'as déjà tiré depuis un hélico? -[RAYS4_7:RAYS4] -~w~Dégage le passage pour les Yardies jusqu'à l'ambulance ! +[COK2_8:BARON2] +On va où, au fait? -[RAYS4_8:RAYS4] -~w~Va à la rencontre de ~y~l'ambulance ! +[COK2_9:BARON2] +Prawn Island. -[RAYS4AA:RAYS4] -Cipriani, on peut plus se rencontrer comme ça. +[COK2_13:BARON2] +Lance Vance. Mon pauv' vieux... -[RAYS4AB:RAYS4] -Ca roule pour moi. +[COK2_14:BARON2] +Ok, on y est presque. -[RAYS4AC:RAYS4] -Allez, relax, mec. +[COK2_15:BARON2] +On va faire un ou deux passages, -[RAYS4AD:RAYS4] -Qu'est-ce que t'as pour moi, McAffrey ? +[COK2_16:BARON2] +Alors, descends autant de tireurs que tu peux. -[RAYS4AE:RAYS4] -Les Yardies ont quelques difficultés à tenir leur nouveau territoire à Newport. +[COK2_17:BARON2] +Et puis je te dépose et tu te débrouilles tout seul. -[RAYS4AF:RAYS4] -On dirait que les Sindacco veulent le reprendre. +[COK2_20:BARON2] +Merde, c'est la guerre en bas! Descends ces tireurs! -[RAYS4BA:RAYS4] -Mon pote Rudyard s'est fait allumer ! +[COK2_21:BARON2] +On s'fait canarder, mec! -[RAYS4BB:RAYS4] -Faut lui dégotter une ambulance ! +[COK2_22:BARON2] +Ca coûte un max de réparer c'coucou, alors bute-les! -[RAYS4BC:RAYS4] -Merde, voilà d'autres tarés de Sindacco ! +[COK2_23:BARON2] +Bon, t'es tout seul à partir de là. Bonne chance, mon frère! -[RAYS4BD:RAYS4] -Je vais chercher l'ambulance ! Toi, t'aides mes gars ! +[COK2_24:BARON2] +Etat hélico : -[RAYS4BE:RAYS4] -Tirons-nous d'ici ! +[COK2_25:BARON2] +~g~Va récupérer le pognon sur le toit. -[RAYS4BF:RAYS4] -Voilà l'ambulance ! +[COK2_27:BARON2] +T'es sur MES plates-bandes, connard! -[RAYS4BG:RAYS4] -Merci, M. Cipriani, on a une dette envers vous ! +[COK2_28:BARON2] +Ta fin est proche! -{=================================== MISSION TABLE RAYS5 ===================================} +[COK2_6:BARON2] +Non. Je vais m'entraîner un peu en chemin. -[RAYS5AA:RAYS5] -Alors quoi, pas de fleurs ? +[OPEN_B:BARON2] +Les barrières sur les routes pour le centre ville ont été retirées. -[RAYS5AB:RAYS5] -Je savais pas que c'était tes funérailles. +{=================================== MISSION TABLE BARON3 ===================================} -[RAYS5AC:RAYS5] -T'es un vrai comédien, Toni, un grand comique. +[COK3_A:BARON3] +Tu fais moins le fier maintenant, hein! -[RAYS5AD:RAYS5] -Les Forelli plaisantent plus, là. +[COK3_B:BARON3] +Ahahahaha, ahahahaha! -[RAYS5AE:RAYS5] -Ils trafiquent des armes et prélèvent une part de la marchandise... +[COK3_C:BARON3] +Ho! Fais gaffe où tu braques ce truc! -[RAYS5AF:RAYS5] -en prévision des ennuis. +[COK3_D:BARON3] +Plus de merde de pigeon sur ma bagnole, hein, Tommy! -[RAYS5AG:RAYS5] -Ils transportent les armes à Fort Staunton dans des camions. +[COK3_E:BARON3] +Faut croire que non... -[RAYS5AH:RAYS5] -C'était un plaisir... +[COK3_F:BARON3] +T'as sacrément raison. Bon, écoute, -[RAYS5AI:RAYS5] -Ouais, pareil. +[COK3_G:BARON3] +tu sais qui possède le bateau le plus rapide de la côte est? -[RAY5_2:RAYS5] -Ils ont appelé des renforts. +[COK3_H:BARON3] +Je suis pas bien sûr. -[RAY5_3:RAYS5] -~r~Les Forelli ont les munitions ! +[COK3_I:BARON3] +MOI! Et je voudrais pas que ça change... -[RAY5_4:RAYS5] -C'est Cipriani ! +[COK3_J:BARON3] +Tous les contrebandiers d'ici à Caracas ne rêvent que d'un seul truc, un bateau plus rapide que le mien. -[RAY5_5:RAYS5] -Butez-le ! +[COK3_K:BARON3] +Et la rumeur prétend que le chantier naval Hull-o-caust vient juste d'en finir un -[RAY5_6:RAYS5] -Un de moins ! Maintenant, détruis l'autre ~r~camion ! +[COK3_L:BARON3] +pour le compte de je ne sais quel connard du Costa Rica. -[RAY5_1:RAYS5] -Détruis les ~r~camions~w~ avant qu'ils n'arrivent à destination ! +[COK3_M:BARON3] +Alors, Tommy... JE VEUX CE BATEAU! -[RAY5_7:RAYS5] -Détruis le ~r~camion~w~ avant qu'ils ne déchargent suffisamment de munitions. +[COK3_N:BARON3] +Je crois que tes pigeons sont de retour... -[RAY5_8:RAYS5] -~r~Tu n'as pas détruit le camion à temps ! +[COK3_O:BARON3] +Ah! Je croyais que je t'avais eu! D'où tu sors? -{=================================== MISSION TABLE SALH1 ===================================} +[COK3_P:BARON3] +Pigeons d'mes deux! Boum! Aaaaah! -[SLH1_F1:SALH1] -~r~T'as tué un des Hoods. +[COK3_5:BARON3] +~g~Trouve l'interrupteur pour abaisser le bateau. -[SLH1_F2:SALH1] -~w~Attire les Forelli en bousillant leurs ~r~caisses. +[COK3_6:BARON3] +~g~Amène le bateau à la résidence. -[SLH1_F3:SALH1] -~w~Venge-toi des ~r~Forelli. +[COK3_7:BARON3] +~r~T'as détruit le bateau! -[SLH1_F4:SALH1] -~w~Attire d'autres Forelli en bousillant une autre ~r~caisse. +[COK3_8:BARON3] +~g~Va au chantier naval des docks et fauche le bateau le plus rapide. -[SLH1_F5:SALH1] -~w~Abandonne pas les ~b~Hoods ! +[COK3_9:BARON3] +~g~Monte dans le bateau. -[SLH1_B0:SALH1] -~w~OK, mec, on va exploser cette ville. +{=================================== MISSION TABLE BARON4 ===================================} -[SLH1_B1:SALH1] -~w~Hé, reviens ici, connard ! +[COK4_A:BARON4] +Ejection! Connerie d'engin! -[SLH1_B2:SALH1] -~w~Oh, tu déconnes ou quoi ? J'vais jamais pouvoir carrer mon cul là-dedans ! +[COK4_B:BARON4] +Pourquoi tu m'fais ça? -[SLH1_B3:SALH1] -~w~T'as raison, t'as absolument besoin de moi ! +[COK4_C:BARON4] +Pour qui tu t'prends, putain de magnéto! Grrr! -[SLH1_B4:SALH1] -~w~Ouah, trop fort, mec ! +[COK4_D:BARON4] +ENCULE! -[SLH1_B5:SALH1] -~w~Merde, je supporte pas ces Ritals ! +[COK4_E:BARON4] +Si il m'bouffe ma cassette préférée d'El burro, il est fini! -[SLH1_B6:SALH1] -~w~... sauf toi, Toni. +[COK4_F:BARON4] +Qu'est-ce que je peux faire d'autre? -[SLH1_B7:SALH1] -~w~Le moment est venu pour les Hoods de se lever et de réagir ! +[COK4_G:BARON4] +Il doit pas être branché, c'est tout... -[SLH1_B8:SALH1] -~w~Allez ! On va les exploser ! +[COK4_H:BARON4] +Hein? -[SLH1_C0:SALH1] -~w~Mon frère ! +[COK4_I:BARON4] +Merde! Tant pis, j'peux m'en acheter cent si ça me chante. -[SLH1_C1:SALH1] -~w~Yo ! Minus ! Où tu vas ? +[COK4_J:BARON4] +Bon, Tommy, -[SLH1_C2:SALH1] -~w~Et où c'est que j'suis supposé me mettre, moi ? +[COK4_K:BARON4] +tous les mois, il y a un indépendant qui met le cap sur Vice City pour y amarrer son yatch. -[SLH1_C3:SALH1] -~w~T'as raison, t'as absolument besoin de moi ! +[COK4_L:BARON4] +Il vend sa cargaison au premier bateau. -[SLH1_C4:SALH1] -~w~Merde ! Ca rigole pas dans cette ville ! +[COK4_M:BARON4] +Je veux que tu prennes le speedboat, -[SLH1_D0:SALH1] -~w~Hé ! C'est ma caisse ! +[COK4_N:BARON4] +que tu largues tous les autres connards intéressés -[SLH1_D1:SALH1] -~w~Je la préfère comme ça ! +[COK4_O:BARON4] +et que tu ramènes la cargaison ici. Ok? -[SLH1_E0:SALH1] -~w~Y se passe quoi ici ? +[COK4_P:BARON4] +Laisse-moi deviner. T'as pensé que je pourrais avoir besoin d'un ange-gardien. -[SLH1_E1:SALH1] -~w~On va vous virer de là, voilà ce qui se passe ! +[COK4_Q:BARON4] +Je dis juste que t'as intérêt à me laisser entrer, mon pote. -[SLH1_F0:SALH1] -~w~Passe chercher les ~b~Hoods~w~ et attire l'attention des ~r~Forelli. +[COK4_R:BARON4] +Tu peux m'sortir tout un tas de conneries sur le dur solitaire, -[RUFJ_01:SALH1] -C'est votre avocat, M. Leone. +[COK4_S:BARON4] +mais je sais qu'un de ces quatre, j'vais t'sauver la mise. -[RUFJ_02:SALH1] -J'sais parfaitement qui c'est... +[COK4_T:BARON4] +et qu'après tu voudras me rouler une pelle! -[RUFJ_03:SALH1] -Allez, laisse-moi un peu tranquille. +[COK4_U:BARON4] +Taré, va! -[RUFJ_04:SALH1] -Allez, petit, va faire un tour et dis bonjour à ta mère, capici ? +[COK4_V:BARON4] +Hahahaha -[RUFJ_05:SALH1] -D'accord... Vous avez 5 minutes. +[COK4_1:BARON4] +Tommy, on sait que c'est Diaz qui a fait foirer notre deal... -[RUFJ_06:SALH1] -Bon, euh, Lionel, t'as l'air en forme. +[COK4_3:BARON4] +Alors pourquoi on bosse pour sa gueule? -[RUFJ_07:SALH1] -Regarde-moi ! +[COK4_4:BARON4] +Plus on en apprend maintenant, plus on en saura quand on s'emparera de cette ville! -[RUFJ_08:SALH1] -Un membre honorable de la communauté, et j'me retrouve en taule. +[COK4_5:BARON4] +J'aime bien ton style, mon pote. Vraiment culotté. -[RUFJ_09:SALH1] -Un vrai défi à ma nature philanthropique ! +[COK4_12:BARON4] +Fais gaffe, ils arrivent de partout! -[RUFJ_10:SALH1] -C'est sûr, M. Leone. +[COK4_13:BARON4] +On les a eu! Fonce chez Diaz aussi vite que tu peux! -[RUFJ_11:SALH1] -On fait tout ce qu'on peut pour vous faire sortir d'ici et... euh... +[COK4_14:BARON4] +Tu veux ta part de plancton? -[RUFJ_12:SALH1] -pour que vous reveniez aider votre communauté le plus vite possible. +[COK4_15:BARON4] +Salue la poiscaille de ma part! -[RUFJ_13:SALH1] -J'espère bien. +[COK4_16:BARON4] +Mange! Mange! -[RUFJ_14:SALH1] -Je ferai un procès à quelqu'un pour cette injustice ! +[COK4_19:BARON4] +Encore des emmerdes droit devant! -[RUFJ_15:SALH1] -Ces connards de Sindacco ou ces enculés de Forelli, qui c'est qui m'a fait ça ? +[COK4_20:BARON4] +Il y a des porte-flingues sur cette jetée! -[RUFJ_16:SALH1] -Qui a craché le morceau ? +[COK4_24:BARON4] +Joli coup, mon pote. T'es vraiment un cinglé de première! -[RUFJ_18:SALH1] -On va tous les attaquer. +[COK4_25:BARON4] +Ah... Merci. -[RUFJ_19:SALH1] -A mon avis, ils ont besoin d'une bonne branlée pour ce coup de pute ! +[COK4_26:BARON4] +A la prochaine, Tommy. -[RUFJ_22:SALH1] -Merci, Toni. Tu comptes beaucoup pour moi, tu le sais. +[COK4_27:BARON4] +Okay, M. Lance Vance Danse. -[RUFJ_23:SALH1] -Ecoute, t'auras p'têt besoin d'renforts. +[COK4_28:BARON4] +~g~Atteins le yatch avant les autres bateaux! -[RUFJ_24:SALH1] -Fais appel aux Hoods. OK ? +[COK4_31:BARON4] +~g~Va jusqu'au bateau le plus rapide de la jetée! -[RUFJ_25:SALH1] -Tout c'que vous voudrez, M. Leone. +[COK4_32:BARON4] +~r~Trop lent! -[RUFJ_26:SALH1] -OK... Allez, barre-toi d'ici... Lionel. +[COK4_33:BARON4] +~r~T'as détruit le bateau! -[RUFJ_20:SALH1] -- Les enculés. ~n~ - Ce sera avec plaisir. +[COK4_34:BARON4] +~g~Bousille ces bateaux! -{=================================== MISSION TABLE SALH2 ===================================} +[COK4_35:BARON4] +Etat du bateau : -[SALH2AA:SALH2] -~w~Hé, Sal ! C'est moi... Toni. +{=================================== MISSION TABLE BARON5 ===================================} -[SALH2AB:SALH2] -~w~Toni ! Ca fait plaisir d'entendre ta voix, petit. +[PROP_A:BARON5] +PROPRIETE ACHETEE! -[SALH2AC:SALH2] -~w~Ces abrutis me laissent voir personne ! +[COK4_30:BARON5] +~r~Lance est mort! -[SALH2AD:SALH2] -~w~Ecoute, j'ai des tas d'affaires à régler. +[ASS1_A:BARON5] +J'ai récupéré des flingues. Ils sont dans l'coffre. -[SALH2AE:SALH2] -~w~Paulie Sindacco, par exemple. Sa famille est finie dans cette ville. +[ASS1_B:BARON5] +Merde alors! Où c'est que t'as dégoté tout ça? -[SALH2AF:SALH2] -~w~Mais il croit pouvoir se tirer comme ça, comme s'il avait aucune dette. +[ASS1_C:BARON5] +Je l'gardais au frais pour une grande occasion... -[SALH2AG:SALH2] -~w~Je suis en taule à cause de cet enfoiré ! +[ASS1_D:BARON5] +Ca te botte? -[SALH2AH:SALH2] -~w~Règle son compte à ce fils de pute. +[ASS1_E:BARON5] +Tu parles que ça m'botte. -[SALH2O1:SALH2] -~w~Intercepte Paulie Sindacco à la ~y~centrale de Cochrane Dam. +[ASS1_F:BARON5] +Espèce de connard... -[SALH2F1:SALH2] -~r~Il a filé ! Salvatore va pas être content ! +[ASS1_G:BARON5] +Ma belle maison... -[SALH2CA:SALH2] -~w~Bande de nazes ! C'est Toni Cipriani ! Butez-le ! +[ASS1_H:BARON5] +Regarde ce que t'en as fait! -[SALH2BA:SALH2] -~w~Hé, Toni ! Pourquoi tu viens pas à la nage me lécher le cul ? +[ASS1_I:BARON5] +Ca c'est pour mon frère! -[SALH2BB:SALH2] -~w~Hé, par ici, connard ! +[ASS1_J:BARON5] +Je te faisais confiance, Tommy... -[SALH2BI:SALH2] -~w~Salue Salvatore de ma part. Je lui enverrai une carte postale ! +[ASS1_K:BARON5] +Je t'aurais aidé à devenir... -[SALH2BC:SALH2] -~w~Qu'est-ce que tu vas faire, maintenant, toquard ? +[ASS1_L:BARON5] +Bonne nuit, Diaz. -[SALH2BE:SALH2] -~w~T'es mort ! +[ASS1_1:BARON5] +Cet endroit va bientôt grouiller de salopards... Fais gaffe. -[SALH2BF:SALH2] -~w~T'es que dalle ! +[ASS1_2:BARON5] +T'en fais pas, Tommy, je te couvre. -[SALH2BG:SALH2] -~w~Surprise ! Ordure ! +[ASS1_4:BARON5] +Diaz doit être à l'intérieur! -[SALH2BH:SALH2] -~w~Avis à la populace, Paulie Sindacco vient de faire sa sortie ! +[ASS1_13:BARON5] +DIAZ! Je suis venu reprendre ton affaire! -[SALH2BD:SALH2] -~w~T'as aucune chance de m'attraper, connard ! +[ASS1_14:BARON5] +TOMMY! Tu me trahis... Idiot! Je vais te buter tout de suite! -[SALH2O2:SALH2] -~w~Tue ~r~Paulie Sindacco~w~. Ne le laisse pas s'enfuir ! +[ASS1_16:BARON5] +~g~Tue Diaz! -[SALH2O3:SALH2] -Trouve une caisse et tends une embuscade à ~r~Paulie~w~ depuis la côte. +[BUD1:BARON5] +Lance -{=================================== MISSION TABLE SALH3 ===================================} +[ASS1_18:BARON5] +~g~La porte est verrouillée. Trouve un autre chemin. -[SALH3_1:SALH3] -~w~Sal ? Comment ça va ? +[ASS1_19:BARON5] +Par ici! -[SALH3_2:SALH3] -~w~Je m'éclate à mort ! +[ASS1_20:BARON5] +Tommy, mon problème c'est Quentin, pas toi, mec! -[SALH3_3:SALH3] -~w~Primo, le nouveau maire empêche ma remise en liberté sous caution. +{=================================== MISSION TABLE BIKE1 ===================================} -[SALH3_4:SALH3] -~w~Secundo, on doit se battre contre les Triades et les Diablos. +[BM1_A:BIKE1] +Où est Baker? -[SALH3_5:SALH3] -~w~Tertio, y a ces putains de Yakuzas qui vont essayer de prendre le contrôle de la ville. +[BM1_B:BIKE1] +Je cherche Big Mitch Baker... -[SALH3_6:SALH3] -~w~A part ça, c'est le pied ! +[BM1_C:BIKE1] +Qui le cherche? -[SALH3_7:SALH3] -~w~Après toutes ces années de contrôle de la famille, c'est la chasse et le fond des chiottes ! +[BM1_D:BIKE1] +Tommy Vercetti. -[SALH38:SALH3] -~w~J'peux m'occuper de tout ça, boss. +[BM1_E:BIKE1] +Vercetti... -[SALH39:SALH3] -~w~Les Yakuzas ont un stock d'armes à Aspatria. +[BM1_F:BIKE1] +T'as pas l'air d'un flic, ce qui te donne droit à une minute... -[SALH310:SALH3] -~w~Plus rien peut les arrêter ! +[BM1_G:BIKE1] +T'as intérêt à faire court! -[SALH311:SALH3] -~w~C'est ce qu'on va voir. +[BM1_H:BIKE1] +Kent Paul dit que ça pourrait t'intéresser de te charger de la sécurité pour un boulot qu'il prépare. -[SALH3_A:SALH3] -~w~Fais un tour au ~y~complexe des Yakuzas. +[BM1_I:BIKE1] +Kent Paul? Ah! Pas étonnant qu'il t'ai envoyé. -[SALH3C1:SALH3] -~w~Trouve un accès au ~y~complexe. +[BM1_J:BIKE1] +La dernière fois qu'il est passé ici, il en est ressorti par la fenêtre avec rien d'autre que son costume d'anglais. -[SALH3C2:SALH3] -~w~Bordel de merde ! J'y crois pas ! +[BM1_K:BIKE1] +Bon, t'es intéressé ou pas? -[SALH3C3:SALH3] -~w~Détruis le ~r~blindé ! +[BM1_L:BIKE1] +On ne rend des services qu'à ceux qui font partie de la bande. -[SALH3C4:SALH3] -~w~Mais qu'est-ce que... ? +[BM1_M:BIKE1] +Comment je me joins à vous? -[SALH3C5:SALH3] -~w~Butez-le ! +[BM1_N:BIKE1] +On est pas un club de loisirs, mon pote! Tu peux conduire une bécane? -[SALH3C6:SALH3] -~w~Le ~r~blindé ~w~est à l'épreuve des armes normales. Elles ne lui feront même pas une égratignure ! +[BM1_O:BIKE1] +Tu peux t'asseoir sur un tabouret de bar et boire? -[SALH3G1:SALH3] -~w~Hé, 'l'ami', t'as rien à faire là ! +[BM1_P:BIKE1] +Cougar, Zeppelin, allez voir comment elle se débrouille sur une bécane... -[SALH3G2:SALH3] -~w~Cette cour est réservée aux Yakuzas. +[BM1_2:BIKE1] +~g~Il te faut une Freeway ou une Angel pour participer! -[SALH3G3:SALH3] -~w~Vire ton cul de là ! +[BM1_3:BIKE1] +~r~Les concurrents ont été attaqués! -[SALH3_B:SALH3] -~w~Ils se sont fait avoir par la voiture des Yakuzas ! +[BIKE1_1:BIKE1] +Bon, chouettes fringues. Voyons ce que tu peux faire. -[SALH3_C:SALH3] -~w~Conduis jusqu'au ~y~complexe~w~ et va jeter un coup d'oeil. +[BM1_1:BIKE1] +~g~Enfourche une Freeway ou une Angel et va sur la grille de départ. -{=================================== MISSION TABLE SALH4 ===================================} +{=================================== MISSION TABLE BIKE2 ===================================} -[SALH4_1:SALH4] -~w~Sal ? Vous êtes là ? +[BM2_4:BIKE2] +~r~Tu n'as pas rempli le chaosmètre à temps! -[SALH4_2:SALH4] -~w~Toni ! Je vais sortir ! +[BM2_1:BIKE2] +CHAOSMETRE : -[SALH42A:SALH4] -~w~C'est aujourd'hui la lecture de mon acte d'accusation ! +[BM2_A:BIKE2] +Ha ha ha, je t'ai encore eu! -[SALH4_3:SALH4] -~w~Super ! +[BM2_B:BIKE2] +Hé, Vercetti. -[SALH44C:SALH4] -~w~Ouais, Toni. Fais comme tu veux. +[BM2_C:BIKE2] +Cougar dit que tu te débrouilles plutôt bien sur une bécane. -[SALH44E:SALH4] -~w~Bon, y a les gardiens qui s'amènent... Je te retrouve devant. +[BM2_D:BIKE2] +Ouais, mais combien d'épreuves il va encore falloir que je me tape? -[SALH4_5:SALH4] -~w~Trouve une voiture de police ! +[BM2_E:BIKE2] +Je suis très occupé, mon pote. -[SALH45A:SALH4] -~w~T'as besoin d'une voiture de police pour pas alerter le convoi ! +[BM2_F:BIKE2] +Si c'est une baston qui peut régler la question, alors amène-toi! -[SALH4_6:SALH4] -~w~Mets-toi en position au ~y~poste de police. +[BM2_G:BIKE2] +Devenir l'un d'entre nous, c'est pas qu'une question de baston. C'est appartenir à une famille. -[SALH4_7:SALH4] -~w~Bordel de merde ! +[BM2_H:BIKE2] +Ouais, j'ai déjà appartenu à une famille avant et ça n'a pas bien collé. -[SALH4_8:SALH4] -~w~Protège le ~b~fourgon~w~, il doit arriver en un seul morceau ! +[BM2_I:BIKE2] +Peut-être, mais notre famille veille sur les siens. -[SALH4_9:SALH4] -~w~Laisse pas trop de champ au ~b~fourgon ! +[BM2_J:BIKE2] +On demande à personne de faire le sale boulot pour l'abandonner au trou pendant quinze ans... -[SALH410:SALH4] -~w~Tu vas perdre le ~b~fourgon ! +[BM2_K:BIKE2] +Et ouais, je me suis renseigné. -[SALH411:SALH4] -~r~T'as perdu le fourgon ! Sal a été exécuté ! +[BM2_L:BIKE2] +Ce que tu vois, c'est la plus grande famille d'inadaptés, de parias et d'ordures qui existe. -[SALH412:SALH4] -~r~Le fourgon a été détruit ! +[BM2_M:BIKE2] +Certains ont même été trahis par leur propre pays! -[SALH413:SALH4] -~w~Enerve pas les flics ou les chances de libération sous caution de Sal s'envoleront ! +[BM2_N:BIKE2] +On m'a foutu en taule pendant la guerre du Vietnam! Saloperie... -[SALH416:SALH4] -~w~Escorte le ~b~convoi~w~ jusqu'à sa destination. +[BM2_O:BIKE2] +Voilà pourquoi je vais te demander d'aller foutre le bordel. -[SALH417:SALH4] -~r~T'as tout foiré ! Les flics ont annulé l'audition au tribunal ! +[BM2_P:BIKE2] +Ce pays de merde a vraiment besoin d'un coup de pied au cul et c'est nous qui allons le lui donner! -[SALH420:SALH4] -~r~Sal a été tué ! +[BM2_Q:BIKE2] +Alors sors de là, attrape une bécane et montre à cette ville à quel point t'es énervé! -[SALH421:SALH4] -~r~T'as perdu le fourgon ! +[BM2_R:BIKE2] +D'accord. -[SALH422:SALH4] -~w~Sème les flics ou tu vas attirer trop d'attention sur le convoi ! +[BM2_2:BIKE2] +~g~Tu dois remplir le chaosmètre dans le temps imparti pour nous prouver que t'es un dur de dur! -[SALH424:SALH4] -~w~Elimine le ~y~barrage routier ! +[BM2_3:BIKE2] +~g~Ce bruit veut dire qu'une partie du chaosmètre est remplie, continue comme ça. -[SALH415:SALH4] -~w~Ca fait du bien de se sentir libre. +{=================================== MISSION TABLE BIKE3 ===================================} -[SALH418:SALH4] -~w~Bon, écoute, je vais rentrer à la maison et me débarrasser de ces fringues qui puent, OK ? +[BM3_A:BIKE3] +Salut, Mitch. -[SALH419:SALH4] -~w~Je te retrouve là-bas. +[BM3_B:BIKE3] +Hé! Mais c'est ce gros méchant de Vercetti! -[SALH414:SALH4] -~w~Barrage routier hors-la-loi signalé dans le secteur... +[BM3_C:BIKE3] +Maintenant, je veux voir à quel point tu peux te battre pour ton secteur. -[SALH44A:SALH4] -~w~Avec moi coincé ici, qui va les empêcher de prendre le contrôle ? +[BM3_D:BIKE3] +Un gang local a commis l'erreur de me faucher ma bécane... -[SALH4_4:SALH4] -~w~Ouais, mais j'ai comme l'impression que les Siciliens ne veulent pas que j'arrive jusqu'au tribunal. +[BM3_E:BIKE3] +Probablement un truc de machos ou quelque chose de ce genre. -[SALH44B:SALH4] -~w~Hé, ils devront d'abord me passer sur le corps, Sal. +[BM3_F:BIKE3] +Moi et mes gars, on pourrait aller leur donner la leçon qu'ils méritent... -[SALH44D:SALH4] -~w~Débrouille-toi simplement pour que j'aie droit à mon procès ! +[BM3_G:BIKE3] +Enfin... -{=================================== MISSION TABLE SALH5 ===================================} +[BM3_H:BIKE3] +Je me suis dit que ça serait une excellente initiation pour toi. -[SALH51A:SALH5] -~w~Fonce, Toni ! +[BM3_I:BIKE3] +Tu me ramènes ma bécane et tu pourras dire à Paul qu'on assurera la sécurité. -[SALH51B:SALH5] -~w~Si je me trompe pas, les Siciliens vont s'en prendre au maire. +[BM3_2:BIKE3] +~r~Tu étais supposé ramener la bécane, pas la bousiller! -[SALH51C:SALH5] -~w~Il faut l'atteindre avant eux. +[BM3_3:BIKE3] +~g~Ramène la bécane au bar! -[SALH511:SALH5] -~w~C'est pas bon, ça... +[BM3_4:BIKE3] +~g~Monte sur la bécane! -[SALH554:SALH5] -~w~Accélère, Toni ! +[INTRUDE:BIKE3] +~g~T'as été repéré! -[SALH512:SALH5] -~w~T'as abandonné ~b~Sal~w~ ! Retourne le chercher ! +[BM3_6:BIKE3] +~g~Ils se planquent derrière Ammu-Nation dans le centre. -[SALH513:SALH5] -~w~C'est pas vrai ! Y sont déjà là ! +[BM3_7:BIKE3] +~g~T'auras besoin d'une bécane rapide pour accéder au toit. -[SALH560:SALH5] -~w~Massacre-les, Toni ! +[BM3_8:BIKE3] +~g~Sers-toi de la bécane pour sauter de ces marches jusqu'à l'autre côté de la route. -[SALH561:SALH5] -~w~Je vais chercher le maire ! +[BM3_1:BIKE3] +~g~Un gang local a volé l'Angel de Mitch Baker. Récupère-la! -[SALH514:SALH5] -~w~Ces enfoirés l'ont déjà emmené ! +[BM3_9:BIKE3] +~g~Récupère l'Angel de Mitch Baker et dégage de là! -[SALH555:SALH5] -~w~Vite, Toni ! Par là ! +{=================================== MISSION TABLE BMX_1 ===================================} -[SALH515:SALH5] -~w~Les voilà ! +[BMX_REC:BMX_1] +~g~Nouveau record établi : ~1~! -[SALH517:SALH5] -~w~D'où ils sortent, ces bâtards ? +[GETBIK2:BMX_1] +Tu as ~1~ secondes pour enfourcher une bécane! -[SALH556:SALH5] -~w~Derrière nous, Toni ! +{=================================== MISSION TABLE BOATBUY ===================================} -[SALH562:SALH5] -~w~Toni, juste devant ! +[DRUG_1:BOATBUY] +Bonjour? Y'a quelqu'un? Y'A QUELQU'UN??? -[SALH519:SALH5] -~w~Toni ! Descends l'hélico ! +[DRUG_2:BOATBUY] +Ferme-la. Il y a un mec, ici. -[SALH522:SALH5] -~w~Ils croient pouvoir se planquer dans le phare ! +[DRUG_3:BOATBUY] +Hé, mon pote! T'es le nouveau proprio? -[SALH557:SALH5] -~w~Bute ces connards ! +[DRUG_4:BOATBUY] +Ouais. Lequel de ces bateaux est le plus rapide? -[SALH558:SALH5] -~w~Bien visé, Toni ! +[DRUG_5:BOATBUY] +Il est déjà à l'eau, mon pote, -[SALH559:SALH5] -~w~Maintenant, finissons-en ! +[DRUG_6:BOATBUY] +je me suis dit que tu voudrais peut-être l'essayer. -[SALH526:SALH5] -~w~Je conduis et toi, tu nous couvres ! +[DRUG_7:BOATBUY] +Mon pote, il est déjà équipé d'un moteur de 300 chevaux... -[SALH527:SALH5] -~w~OK, Toni... On y est. +[DRUG_8:BOATBUY] +...et avec la coque en fibre de verre, il touche même pas l'eau! -[SALH528:SALH5] -~w~Ils sont combien ces bâtards sur ce rocher ? +[DRUG_9:BOATBUY] +Il monte à 60 noeuds en quatre secondes, mon pote... -[SALH553:SALH5] -~w~Tu butes un de ces enfoirés et t'en as direct un autre sur le dos ! +[DRUG_10:BOATBUY] +Et il peut embarquer vingt écopes de la meilleure jamaïquaine dans la coque. -[SALH523:SALH5] -~r~T'as laissé Salvatore se faire buter par les Siciliens ! +[DRUG_11:BOATBUY] +Alors vas-y, mon pote, il t'attend pour décoler! -[SALH524:SALH5] -~r~Salvatore a été tué ! +[DRUG_12:BOATBUY] +Ouais, hé, mon pote, t'as du feu? -[SALH552:SALH5] -~r~Le maire a été tué ! +[DRUG_13:BOATBUY] +Mec? -[SALH573:SALH5] -~r~T'as bousillé ton bateau ! Tu les as perdus ! +{=================================== MISSION TABLE CAP_1 ===================================} -[SALH516:SALH5] -~w~Liquide les gardes et suivons-les dans ce bateau ! +[CAP1_B1:CAP_1] +~g~La mafia taxe tes commerces. Trouve-les et bute-les. -[SALH518:SALH5] -~w~Un autre ~r~bateau~w~ arrive... +[CAP1_B2:CAP_1] +~g~La mafia taxe le chantier naval! -[SALH525:SALH5] -~w~Ha ! Ils ont laissé un lance-roquettes ici ! +[CAP1_B3:CAP_1] +~g~La mafia taxe l'usine de crème glacée! -[SALH520:SALH5] -~y~Je vais me rapprocher de la rive pour plus de protection ! Descends-le ! +[CAP1_B4:CAP_1] +~g~La mafia taxe la concession automobile! -[SALH521:SALH5] -~w~Bien joué ! En route ! +[CAP1_B5:CAP_1] +~g~La mafia taxe la compagnie de taxis! -[SALH53A:SALH5] -~w~Torini... J'aurais dû m'en douter... +[CAP_01:CAP_1] +Ok, où est l'urgence? -[SALH53B:SALH5] -~w~Lâche-le ! +[CAP_02:CAP_1] +QUI? -[SALH53C:SALH5] -~w~Le maire est à moi ! +[CAP_03:CAP_1] +Tommy... Des truands de la mafia... Ils ont dit qu'ils venaient prendre leur part... -[SALH53D:SALH5] -~w~Cette VILLE est à moi ! +[CAP_04:CAP_1] +... Ils ont dit que c'était le pognon de Mr Forello... J'me sens mal... -[SALH53E:SALH5] -~w~Salvatore... +[CAP_05:CAP_1] +Forelli? SONNY Forelli? -[SALH53F:SALH5] -~w~Les Siciliens voulaient pas questo schifo di citta. +[CAP_06:CAP_1] +Ouais, c'est ça... je crois... Ils ont beaucoup insisté... -[SALH53G:SALH5] -~w~Mais les tributs ont diminué, qu'est-ce qu'on pouvait faire...? +[CAP_07:CAP_1] +T'inquiète pas, je suis pas en colère contre toi. -[SALH53H:SALH5] -~w~Y avait rien de personnel... +[CAP_08:CAP_1] +Emmène-le à l'hosto. -[SALH53I:SALH5] -~w~Rien de personnel ? +[CAP_09:CAP_1] +Tommy... Taille un nouveau trou du cul à ce salopard de ma part... -[SALH53J:SALH5] -~w~Après tout ce que j'ai subi !? +[CAP_10:CAP_1] +Je vais lui en rajouter deux! -[SALH53K:SALH5] -~w~J'vais t'arracher le coeur ! +[CAP1_2:CAP_1] +Tu connais la règle, Vercetti! -[SALH5TD:SALH5] -~w~Descends l'~r~hélicoptère de Massimo ! +[CAP1_3:CAP_1] +Avec les compliments de M. Forelli! -[SALH5MO:SALH5] -~r~Massimo~w~ se barre ! +[CAP1_4:CAP_1] +C'est le boucher d'Harwood! -[SALH5GO:SALH5] -~r~Massimo s'est tiré ! +[CAP1_5:CAP_1] +Tu diras à Sonny... de dégager! -[SALH571:SALH5] -~w~Va à la ~y~jetée. +[CAP1_6:CAP_1] +Vice City est à moi, désormais, pas à lui! -[SALH570:SALH5] -~w~Descends ces ~r~gangsters siciliens ! +[CAP1_7:CAP_1] +Tu crois que tu peux m'avoir, Vercetti? -[SALH572:SALH5] -~w~Descends ce ~r~Sicilien ! +[CAP1_8:CAP_1] +On va continuer à s'amener jusqu'à ce que tu sois raide mort, Vercetti! -[SALH510:SALH5] -~w~Va à la ~y~mairie~w~. Et fais gaffe aux Siciliens que tu pourrais croiser ! +[CAP1_9:CAP_1] +T'as pas une chance, connard psychotique! -[SICI_01:SALH5] -Non, on en parlera plus tard... +[CAP1_10:CAP_1] +Je vais te descendre, Vercetti! -[SICI_04:SALH5] -On est tous les deux de retour ! Toi et moi ! +[CAP1_11:CAP_1] +T'as toujours été un con! -[SICI_05:SALH5] -On a réussi, pas vrai ? +[CAP1_12:CAP_1] +Tu vas crever, Vercetti! -[SICI_06:SALH5] -Comme tu dis ! +[CAP1_B6:CAP_1] +~g~Tu as trouvé l'encaisseur. Tue-le. -[SICI_07:SALH5] -On a nettoyé les Forelli. +[CAP1_B7:CAP_1] +~g~Tu as perdu l'encaisseur. -[SICI_08:SALH5] -On a balancé les Sindacco à la baille. +[CAP1_B8:CAP_1] +~r~L'encaisseur a taxé toutes tes affaires. -[SICI_09:SALH5] -Et là, j'ai les Siciliens au téléphone qui veulent faire la paix. +[CAP1_B9:CAP_1] +~g~La mafia a taxé le Malibu! -[SICI_10:SALH5] -On veut tous la paix ! Mais la mienne de paix, pas leur putain de paix à eux ! +[CAP1_B0:CAP_1] +~g~La mafia a taxé le studio de cinéma! -[SICI_11:SALH5] -C'est moi le caïd, maintenant. +[CAP1_C2:CAP_1] +~g~La mafia est arrivée au chantier naval! -[SICI_12:SALH5] -Et c'est pas un connard de Sicilien qui va me dire quoi faire. +[CAP1_C3:CAP_1] +~g~La mafia est arrivée à l'usine de crème glacée! -[SICI_13:SALH5] -J'leur ai dit d'aller se faire mettre. +[CAP1_C4:CAP_1] +~g~La mafia est arrivée à la concession automobile! -[SICI_14:SALH5] -Vous avez fait ça ? Vous êtes sûr de votre coup ? +[CAP1_C5:CAP_1] +~g~La mafia est arrivée à la compagnie de taxis! -[SICI_15:SALH5] -Hé, c'est moi le boss, maintenant. MOI ! +[CAP1_C9:CAP_1] +~g~La mafia est arrivée au Malibu! -[SICI_16:SALH5] -Allez, on va voir le maire pour l'abandon des charges contre moi... +[CAP1_C0:CAP_1] +~g~La mafia est arrivée au studio de cinéma! -[FIN1_01:SALH5] -Hé ! M'sieur le maire ! +[CAP1_D2:CAP_1] +~g~La mafia quitte le chantier naval! -[FIN1_03:SALH5] -Ouais, merci. +[CAP1_D3:CAP_1] +~g~La mafia quitte l'usine de crème glacée! -[FIN1_04:SALH5] -Ce qui implique... +[CAP1_D4:CAP_1] +~g~La mafia quitte la concession automobile! -[FIN1_05:SALH5] -Euh... que la ville vous est reconnaissante ? +[CAP1_D5:CAP_1] +~g~La mafia quitte la compagnie de taxis! -[FIN1_06:SALH5] -Essayez encore. +[CAP1_D9:CAP_1] +~g~La mafia quitte le Malibu! -[FIN1_07:SALH5] -Que vous travaillez pour moi ? +[CAP1_D0:CAP_1] +~g~La mafia quitte le studio de cinéma! -[FIN1_08:SALH5] -Ah, oui, que je travaille pour vous. +[CAP1B10:CAP_1] +Tu t'es occupé des taxeurs. Y'en a d'autres qui arrivent. -[FIN1_09:SALH5] -Bene. N'appelez pas. On vous contactera. +{=================================== MISSION TABLE CARBUY ===================================} -[FIN1_10:SALH5] -Maintenant, du balai, connard. +[CAR1_1:CARBUY] +B.J. Smith. Et vous devez être Mr Vercetti. -[FIN1_11:SALH5] -Merci, M. Leone. +[CAR1_2:CARBUY] +Vous voulez visiter? -[FIN1_12:SALH5] -Toni. On a réussi. On est aux commandes. Toi et moi. +[CAR1_3:CARBUY] +Pourquoi pas? -[FIN1_13:SALH5] -On fait une sacrée équipe, hein ? +[CAR1_4:CARBUY] +Vous savez, je suis bien triste de vendre l'affaire... -[FIN1_14:SALH5] -Bon, j'ai juste besoin que tu fasses un petit truc pour moi... +[CAR1_5:CARBUY] +C'était mon premier investissement de professionnel. -[FIN1_15:SALH5] -J'ai quelques problèmes à régler... +[CAR1_6:CARBUY] +Mais l'heure est venue pour moi de continuer ma route. -[FIN2_01:SALH5] -Salut, zio ! Comment va ? +[CAR1_7:CARBUY] +Vous quittez la ville? -[FIN2_02:SALH5] -T'as l'air en forme. +[CAR1_8:CARBUY] +Pas trop pressé, j'espère? -[FIN2_03:SALH5] -Ahhhh Salvatore, nous ne souhaitons que la clarté. +[CAR1_9:CARBUY] +Non, je sors juste de ma retraite et je prépare mon retour dans les affaires. -[FIN2_04:SALH5] -Oui, zio, j'apprécie. +[CAR1_10:CARBUY] +Cette affaire était pas trop solide, -[FIN2_07:SALH5] -Bene, bene. +[CAR1_11:CARBUY] +mais mon personnel a pris sur lui de faire un peu plus -[FIN2_08:SALH5] -Petit bâtard sournois... +[CAR1_12:CARBUY] +créatif en ce qui concerne les méthodes pour devenir rentable. -[FIN2_09:SALH5] -Impossible de faire confiance à ce mec. +[CAR1_13:CARBUY] +Evidemment, je pourrais démanteler l'affaire avant de la refiler. -[FIN2_23:SALH5] -On ne sait jamais ce qui peut arriver... +[CAR1_14:CARBUY] +Merde, je pourrais y foutre le feu si ça me chantait. -[FIN2_10:SALH5] -Ouais, mais on a réussi. +[CAR1_15:CARBUY] +C'est un terrain de premier ordre. -[FIN2_11:SALH5] -Ouais, on a tout nettoyé. T'as fait du bon boulot, Toni. Bien joué ! +[CAR1_16:CARBUY] +Oh, je ne m'en ferais pas pour ça. -[FIN2_12:SALH5] -J'ai toujours su que t'étais un gars bien. Tu m'as sauvé la peau plusieurs fois. +[CAR1_17:CARBUY] +Cet endroit me semble idéal. -[FIN2_13:SALH5] -Et c'est le genre de loyauté que j'apprécie. +[CAR1_18:CARBUY] +Ouais, il l'est, alors, marché conclu? -[FIN2_14:SALH5] -Merci. +{=================================== MISSION TABLE CARPAR1 ===================================} -[FIN2_15:SALH5] -Un bon travailleur. J'aime ça. Ca mérite le respect. +[MM_1_A:CARPAR1] +~g~Récupère ~y~5 points de passage~r~ SANS ~g~renverser de ~r~CONES! ~g~Tu peux les récupérer dans ~y~N'IMPORTE QUEL ORDRE. -[FIN2_19:SALH5] -Pour toi, l'amitié a un prix ? +[CONE_1:CARPAR1] +~r~Tu as renversé un cône! -[FIN2_20:SALH5] -C'est ça, l'amitié qui nous unit, toi et moi ? - -[FIN2_21:SALH5] -Tu devrais avoir honte. Amène-toi. - -[FIN2_22:SALH5] -T'es un brave gars, mais tu devrais avoir honte... - -[SICI_02:SALH5] -- Hé, Toni ! ~n~ - Sal ! Vous êtes de retour à la maison ! - -[FIN2_05:SALH5] -- Alors, es-tu en paix avec la Sicile ? ~n~ - Bien entendu. Moi et tous mes gars. - -[FIN2_16:SALH5] -- Et ce demi million que je t'avais promis. ~n~ - Demi ? Hé ! J'croyais... euh... Vous aviez pas dit deux millions ? - -[FIN2_18:SALH5] -J'ai dit un million de dollars ! Et alors ? - -[FIN1_02:SALH5] -On vient de vous sauver d'une bande de tarés de Siciliens. - -{=================================== MISSION TABLE DONH1 ===================================} - -[DONH1JA:DONH1] -~w~Toni, mon ancien mentor, Avery Carrington, arrive en ville par avion aujourd'hui... - -[DONH1JB:DONH1] -~w~J'ai appris qu'il travaille pour la Panlantic Corporation. - -[DONH1JC:DONH1] -~w~Ils ne reculent devant rien pour acquérir de belles propriétés. - -[DONH1JD:DONH1] -~w~Nous devons en apprendre plus sur leurs projets immobiliers. - -[DONH1JE:DONH1] -~w~Allez, Toni ! Suis-le ! - -[DONH1CA:DONH1] -~w~Euh, Toni, un moyen de transport serait une aubaine. - -[DONH1DA:DONH1] -~w~Va vers l'aéroport, Toni. - -[DONH1DB:DONH1] -~w~On n'a pas une minute à perdre. - -[DONH1EA:DONH1] -~w~Oh oui, c'est un de mes plus beaux plans, sans aucun doute... - -[DONH1EB:DONH1] -~w~Je n'aurais jamais cru avoir ça en moi... - -[DONH1EC:DONH1] -~w~Voilà qui va faire ma fortune... - -[DONH1ED:DONH1] -~w~Ouais, une vraie fortune... - -[DONH1EE:DONH1] -~w~Même Avery serait fier de moi. - -[DONH1GA:DONH1] -~w~Le voilà ! - -[DONH1GB:DONH1] -~w~Tue-le, Toni ! - -[DONH1GC:DONH1] -~w~Il me faut ces plans ! - -[DONH1HA:DONH1] -~w~Vite, Toni... Il s'échappe ! - -[DONH1IA:DONH1] -~w~Vite, c'est capital, Toni ! C-A-P-I-T-A-L ! - -[DONH1IB:DONH1] -~w~Maintenant, allons mettre ça à l'abri, dans mon... hum... domicile. - -[DONH1O0:DONH1] -~w~Conduis Donald Love à ~y~l'aéroport. - -[DONH1O1:DONH1] -~w~Tue ~r~Avery Carrington~w~ et prends ses plans ! - -[DONH1O2:DONH1] -~r~Avery~w~ tente de filer ! Arrête-le ! - -[DONH1O3:DONH1] -~r~Avery~w~ a une autre caisse. Ne le laisse pas se barrer ! - -[DONH1O4:DONH1] -~r~Avery~w~ essaie de se tirer ! Stoppe-le ! - -[DONH1O5:DONH1] -~w~Embarque ~b~Donald Love. - -[DONH1O6:DONH1] -~w~Bien joué ! Récupère les ~g~plans. - -[DONH1O7:DONH1] -~w~Ramène Donald et les plans à ~y~l'asile de nuit. - -[DONH1O8:DONH1] -~w~T'as laissé tomber les ~g~plans~w~! Retourne les chercher. - -[DONH1OA:DONH1] -~w~Ils t'ont repéré ! ~r~Avery~w~ essaie de s'enfuir ! Bute-le ! - -[DONH1OB:DONH1] -~w~T'as besoin d'un véhicule. - -[DONH1OC:DONH1] -~w~Ne perds pas ~b~Donald ! - -[DONH1OD:DONH1] -~w~Fais gaffe ! Les plans seront perdus si tu détruis la ~r~caisse d'Avery~w~ en même temps que lui ! - -[DONH1OE:DONH1] -~r~Avery Carrington~w~ s'échappe. Rattrape-le ! - -[DONH1F0:DONH1] -~r~Les plans ont été détruits ! - -[DONH1F1:DONH1] -~r~Avery Carrington s'est tiré ! - -[DONH1F2:DONH1] -~r~Donald a été tué ! - -[DONH1OF:DONH1] -~r~Avery Carrington~w~ est presque arrivé à destination. Arrête-le ! - -[DONH1O9:DONH1] -~w~N'abandonne pas ~b~Donald~w~ ! Ces Colombiens vont le tuer ! - -[DONH1FA:DONH1] -~w~Hum... Panlantic a dû recruter le Cartel pour protéger Avery. - -[LAND_01:DONH1] -Je sais ce que tu penses, Toni... Comment j'ai pu en arriver là ? - -[LAND_02:DONH1] -Mais c'est juste un faux pas... momentané... - -[LAND_03:DONH1] -OK. - -[LAND_04:DONH1] -Oh, sois pas si susceptible. - -[LAND_05:DONH1] -Je sais que j'ai pas été très sympa en disant que c'était ta faute, - -[LAND_06:DONH1] -mais l'orgueil est un sentiment qui mine... comme les termites. - -[LAND_07:DONH1] -Crois-moi, j'ai essayé les deux, récemment. - -[LAND_08:DONH1] -Sois patient, on n'a pas dit notre dernier mot ! - -[LAND_09:DONH1] -Je me suis pas barré... - -[LAND_10:DONH1] -On est ensemble sur ce coup, amigo. - -[LAND_11:DONH1] -Non, c'est des conneries. - -[LAND_12:DONH1] -S'il te plaît ! - -[LAND_13:DONH1] -S'il te plaît... S'il te plaît... Laisse tomber, mon pote. - -[LAND_18:DONH1] -Viens, je t'en dirai plus en chemin. - -[LAND_19:DONH1] -J'espère que t'as ta caisse. La mienne est... hum... au garage ! - -[LAND_16:DONH1] -- 10 % de quoi ? Ca ? Oh, t'es trop généreux. ~n~ - Pas de ça... de la grosse galette. - -[LAND_14:DONH1] -- 'C'est entièrement ta faute.' Pathétique. ~n~ - 10 % ? - -{=================================== MISSION TABLE DONH2 ===================================} - -[DONH2_1:DONH2] -~w~Va à ~y~l'église~w~ de Staunton Island. - -[DONH2_2:DONH2] -~w~Frappe le ~r~journaliste ~w~ou menace-le avec un flingue pour lui extorquer les photos. - -[DONH2_3:DONH2] -~w~T'as des photos de moi. Où elles sont ? - -[DONH2_4:DONH2] -~w~Ne me faites pas de mal ! - -[DONH2_5:DONH2] -~w~Où sont ces putains de photos ? - -[DONH2_6:DONH2] -~w~Je ne sais pas de quoi vous parlez ! - -[DONH2_7:DONH2] -~w~Où elles sont ? - -[DONH2_8:DONH2] -~w~Non, je vous en prie ! - -[DONH2_9:DONH2] -~w~Allez, pauvre naze, file-les-moi ! - -[DONH210:DONH2] -~w~OK ! OK ! - -[DONH2EX:DONH2] -~w~Je vais vous donner les photos ! - -[DONH211:DONH2] -~w~... J'ai caché le film dans mon box ! - -[DONH212:DONH2] -~w~Va au ~y~box du journaliste. - -[DONH213:DONH2] -~w~Au secours ! On m'enlève ! - -[DONH214:DONH2] -~w~Au secours ! Il va me tuer ! - -[DONH215:DONH2] -~w~... Je suis trop doué pour mourir ! - -[DONH216:DONH2] -~w~... Je peux pas mourir, j'ai pas fini mon roman ! - -[DONH217:DONH2] -~w~Mon éditeur ne m'avait rien dit de cette merde ! - -[DONH218:DONH2] -~w~Bouge pas d'un pouce, connard ! - -[DONH219:DONH2] -~w~Arrête-toi là, tête de con ! - -[DONH220:DONH2] -~w~Non mais tu vas arrêter d'essayer de te barrer ! ? - -[DONH221:DONH2] -~w~Toni ! Enfin ! - -[DONH222:DONH2] -~w~Un journaliste nous a vus buter Avery ! - -[DONH223:DONH2] -~w~Il a pris des photos ! Putain, je suis fini ! - -[DONH224:DONH2] -~w~Du calme ! Il est où ce journaliste ? - -[DONH225:DONH2] -~w~Oh, Toni, tu es formidable ! - -[DONH226:DONH2] -~w~Apparemment, il est en reportage sous couverture à l'église de Staunton Island. - -[DONH227:DONH2] -~w~Récupère les photos et enterre-le ! - -[DONH228:DONH2] -~r~Ned a filé ! - -[DONH230:DONH2] -~w~Tue ~r~Ned Burner. - -[DONH231:DONH2] -~r~Ned est mort avant de te donner les photos ! - -[DONH229:DONH2] -CONNERIES - -[DONCUTA:DONH2] -~w~Les voilà... Prenez-les ! Je les ai pas encore tirées. - -[DONCUTB:DONH2] -~w~Sale petite merde ! - -[DONH2SM:DONH2] -Trouillomètre - -[DONH233:DONH2] -Continue à intimider le journaliste. Si son trouillomètre diminue trop, il essaiera de filer. - -[DONH2LB:DONH2] -~w~T'as laissé le ~b~journaliste ~w~derrière toi. Retourne le chercher. - -[DONH2LC:DONH2] -~r~T'as perdu le journaliste. - -{=================================== MISSION TABLE DONH3 ===================================} - -[DONH3I1:DONH3] -~w~Je suis de retour ! - -[DONH3I2:DONH3] -~w~Revenu d'entre les morts, Toni ! Ressuscité, comme le phoenix de ses cendres ! - -[DONH3I3:DONH3] -~w~Comme Lazare... oui... Lazare Love ! - -[DONH3I4:DONH3] -~w~Ah, je vais redevenir riche ! - -[DONH3I5:DONH3] -~w~Panlantic va me payer une fortune pour conclure l'affaire ! - -[DONH3I6:DONH3] -~w~On a réussi, Toni ! - -[DONH3I7:DONH3] -~w~Mouais... - -[DONH3I8:DONH3] -~w~L'heure est venue de faire une petite fête avec une liste d'invités exclusifs. - -[DONH3I9:DONH3] -~w~Viens ! - -[DONH3C1:DONH3] -~w~Il nous faut un moyen de transport, Toni. On a pas beaucoup de temps. - -[DONH3L1:DONH3] -~w~T'as besoin de ~b~Donald~w~. Retourne le chercher ! - -[DONH3L2:DONH3] -~w~Allez, Toni ! Le temps presse ! - -[DONH3L3:DONH3] -~w~Ramène le cadavre ! - -[DONH3_5:DONH3] -~w~Toni, je meurs d'envie de faire la fête. - -[DONH35D:DONH3] -~w~Tout comme mes invités. - -[DONH35A:DONH3] -~w~Trouve un ~b~cadavre. - -[DONH35B:DONH3] -~w~Récupère le ~b~cadavre d'Avery. - -[DONH35C:DONH3] -~w~Récupère le ~b~cadavre de Ned. - -[DONH3_6:DONH3] -~w~Conduis Donald et Avery à ~y~l'aéroport. - -[DONH36A:DONH3] -~w~Hé ! Ramenez cette ambulance ! - -[DONH36B:DONH3] -~w~Avery. - -[DONH36C:DONH3] -~w~Oh, Avery ! T'as pris de la bouteille depuis notre dernière rencontre. - -[DONH36D:DONH3] -~w~... toi qui aimais tant m'abreuver des gouttes de ta sagesse... - -[DONH36E:DONH3] -~w~... je vais enfin pouvoir boire à ma soif ! - -[DONH36F:DONH3] -~w~... Bon Dieu ! Il porte une perruque ! - -[DONH36G:DONH3] -~w~Toni ! Conduis-nous, Avery et moi, à son jet privé à l'aéroport. - -[DONH3_7:DONH3] -~w~Conduis Donald et Ned à l'~y~aéroport. - -[DONH37F:DONH3] -~w~Toni ! Conduis-nous, Ned et moi, à l'aéroport. - -[DONH37A:DONH3] -~w~Hé ! Ce mec vole le cadavre ! - -[DONH37B:DONH3] -~w~Ah, Ned Burner, le grand journaliste. - -[DONH37C:DONH3] -~w~Ah, Ned... Je souhaite t'accorder l'exclusivité pour - -[DONH37D:DONH3] -~w~le reportage sur ma super fête. - -[DONH37E:DONH3] -~w~Tu sais que je n'inviterais pas n'importe qui à ma petite sauterie. - -[DONH37G:DONH3] -~w~Y en a qui seraient prêts à mourir pour être invités. - -[DONH3_8:DONH3] -~w~Conduis le cadavre d'Avery à l'~y~aéroport. - -[DONH3_9:DONH3] -~w~Conduis le cadavre de Ned à l'~y~aéroport. - -[DONH3A1:DONH3] -~w~Ramène les vieux restes pourris et puants d'Avery ici, avant que la sécurité nous découvre. - -[DONH3A2:DONH3] -~w~Son autopsie est imminente. - -[DONH3N1:DONH3] -~w~Débrouille-toi pour amener le cadavre de Ned Burner ici, avant que la sécurité nous découvre. Ils vont bientôt l'enterrer. - -[DONH3F1:DONH3] -~r~Love est mort. - -[DONH3F2:DONH3] -~r~Tu as perdu le corps d'Avery ! - -[DONH3F3:DONH3] -~r~Tu as perdu le corps de Ned ! - -[DONH3C2:DONH3] -~w~La sécurité de l'aéroport fermera le hangar d'Avery Carrington à 22:00. - -[DONH3F4:DONH3] -~r~Trop tard ! La sécurité de l'aéroport a fermé le hangar ! - -[DONH3F5:DONH3] -~r~Trop tard ! La sécurité de l'aéroport a trouvé Donald et le cadavre d'Avery ! - -[DONH3W1:DONH3] -~w~Vite ! La sécurité de l'aéroport fermera le hangar d'Avery Carrington à 22:00. - -[DONH3F6:DONH3] -~r~Trop tard ! La sécurité de l'aéroport a trouvé Donald avec le cadavre de Ned ! - -{=================================== MISSION TABLE DONH4 ===================================} - -[DONH4A:DONH4] -~w~Donald m'envoie chercher du... euh... matériel... - -[DONH4B:DONH4] -~w~OK. - -[DON4EX1:DONH4] -~w~J'ai ce qu'il vous faut, mais ça va vous coûter cher. - -[DON4EX2:DONH4] -~w~Don a dit que t'allais me payer et qu'il te rembourserait ensuite. - -[DONH4C:DONH4] -~w~Ben voyons... - -[DONH4D:DONH4] -~w~Ouais, c'est ça, t'as qu'à le mettre à l'ordre de 'M. Va t'faire mettre' ! - -[DONH4E:DONH4] -~w~Bon, où est le matos ? - -[DONH4F:DONH4] -~w~Hé, fiston, ce genre de matériel prend du temps à assembler ! - -[DON4EX4:DONH4] -~w~Je te tiens au courant. - -[DONH4G:DONH4] -Mission réussie ! - -[DONH4PS:DONH4] -~w~8-Ball te contactera lorsque le matériel sera prêt. - -{=================================== MISSION TABLE DONH5 ===================================} - -[DONH5_0:DONH5] -Camionnette - -[DNH5_A0:DONH5] -~w~Ecoute, cette camionnette est chargée à bloc. Tu vois ce que j'veux dire ? Alors, vas-y mollo. - -[DNH5_A1:DONH5] -~w~Ouais ? Tout est OK. - -[DNH5_A2:DONH5] -~w~Ouais, j'vous le passe. - -[DNH5_A3:DONH5] -~w~Toni, on n'est qu'à un petit boulot de rien du tout d'une fabuleuse fortune. - -[DNH5_A4:DONH5] -~w~On a épluché les plans de Fort Staunton. Ses points faibles se trouvent le long du vieux métro qui passe sous le secteur. - -[DNH5_A5:DONH5] -~w~Super, Don ! Tout ce que j'ai à faire, c'est d'éviter une centaine de cinglés d'Italiens. - -[DNH5_A6:DONH5] -~w~Longe simplement Porter Tunnel et tout ira comme sur des roulettes. - -[DNH5_B0:DONH5] -~w~Hé, vous ! Vous avez rien à faire ici ! - -[DNH5_B1:DONH5] -~w~Dégagez de là ! - -[DNH5_C0:DONH5] -~w~Monte dans la ~b~camionnette. - -[DNH5_C4:DONH5] -~w~Pose les ~y~explosifs ! - -[DNH5_C5:DONH5] -~w~Pose les ~y~explosifs~w~ restants ! - -[DNH5_C6:DONH5] -~w~Tire-toi par la ~y~bouche du métro ! - -[DNH5_D0:DONH5] -~w~Les Forelli ? Qu'est-ce qu'ils font ici ? - -[DNH5_D1:DONH5] -~w~Ne laisse pas les Forelli détruire la camionnette ! - -[DNH5_1:DONH5] -~w~Utilise un véhicule pour défoncer les portes. - -[DONH5_2:DONH5] -~w~Vas-y plus fort ! - -[DNH5_X0:DONH5] -~r~T'as bousillé la camionnette ! - -[DNH5_C1:DONH5] -~w~Remonte dans la ~b~camionnette. - -[DNH5_C2:DONH5] -~w~Dirige-toi vers l'une des ~y~entrées du Porter Road Tunnel. - -[DNH5_C3:DONH5] -~w~Suis le ~y~tunnel. - -[DNH5_E0:DONH5] -~w~Tue ces ~r~ouvriers en bâtiment. - -[DNH5_E1:DONH5] -~w~Tue cet ~r~ouvrier en bâtiment. - -[DNH5_E2:DONH5] -~w~Les Forelli ont bloqué le passage. Trouve une autre ~y~issue. - -[DNH5_E3:DONH5] -~w~Utilise un véhicule pour dégommer les portes et atteindre la ~y~sortie. - -[DNH5_X1:DONH5] -~r~Les Forelli ont bousillé la camionnette ! - -[DNH5_W1:DONH5] -~w~Ne t'éloigne pas trop de la ~b~camionnette ! - -[DNH5_E4:DONH5] -~w~Ne laisse aucun ~r~témoin. - -{=================================== MISSION TABLE DONH6 ===================================} - -[DONH6_V:DONH6] -~r~v1.00 - -[DONH6_1:DONH6] -~w~Va au ~y~manoir. - -[DONH6_5:DONH6] -~w~Oh, non ! Toni ! Fais quelque chose ! - -[DONH6_6:DONH6] -~w~Il te reste ~1~ secondes pour retourner dans le parc ! - -[DONH6_7:DONH6] -Temps de Retour - -[DONH6_8:DONH6] -~r~T'as pas réussi à rentrer au manoir... Donald a été exécuté ! - -[DONH610:DONH6] -~w~Trouve une caisse ! - -[DONH611:DONH6] -~w~Oh non, en voilà d'autres ! - -[DONH624:DONH6] -~w~Fonce, Toni ! - -[DONH612:DONH6] -~w~On a réussi ! - -[DONH623:DONH6] -~w~Conduis-moi au jet d'Avery. Ned et lui sont toujours à bord, alors je voyagerai pas seul. - -[DONH622:DONH6] -~w~Va au ~y~jet d'Avery. - -[DONH613:DONH6] -~w~Allons à l'aéroport. - -[DONH625:DONH6] -~w~Fonce à ~y~l'aéroport. - -[DONH615:DONH6] -~w~T'as abandonné ~b~Donald~w~ ! Retourne le chercher ! - -[DONH619:DONH6] -~r~Donald a été tué ! - -[DONH6_9:DONH6] -~w~Don ? Allez, en route ! - -[DONH614:DONH6] -~w~T'es sûr que c'est sans risque, Toni ? - -[DONH616:DONH6] -~w~Oh... mon... JARDIN ! - -[DOH616A:DONH6] -~w~Tu as vu ce que tu as fait de mon beau jardin !?! - -[DONH617:DONH6] -~w~Don... On contemple le paysage ou on dégage ? A vous de voir. - -[DONH618:DONH6] -~w~Conduis-moi à l'aéroport ! - -[DONH620:DONH6] -~w~J'aime pas les 'au revoir', mon ami. - -[DOH620A:DONH6] -~w~Disons-nous simplement 'adieu'. - -[DONH621:DONH6] -~w~Don... Vous m'avez beaucoup appris. - -[DONH66S:DONH6] -~w~Tu as ~1~ seconde pour retourner dans le parc ! - -[DONH66A:DONH6] -~w~Tue ces ~r~gangsters colombiens ! - -[DONP_01:DONH6] -Papillons... Pa... pillons... papi... non, ça va pas. - -[DONP_02:DONH6] -Ohmmmmmmmm. Merde. - -[DONP_03:DONH6] -C'est tellement... Oh, merde, si j'avais un truc froid pour me pelotonner tout contre, - -[DONP_06:DONH6] -Antonio ! Oh, je cherche juste l'illumination spirituelle, - -[DONP_07:DONH6] -si tu veux tout savoir, mais c'est pas pour aujourd'hui. - -[DONP_08:DONH6] -Peut-être demain. - -[DONP_09:DONH6] -Vous aviez l'air angoissé dans votre message. - -[DONP_10:DONH6] -Angoissé ? Je médite... angoissé, moi ? - -[DONP_11:DONH6] -Je ne fais qu'un avec l'univers. C'est impossible. - -[DONP_12:DONH6] -Euh, bon, c'est vrai. - -[DONP_13:DONH6] -Hum, y a une bande de Colombiens qui rapplique ici - -[DONP_14:DONH6] -pour me descendre si je refuse de la fermer et de passer à la caisse. - -[DONP_15:DONH6] -Oh, alors, j'comprends mieux pourquoi tous ces Colombiens traînent dehors. - -[DONP_16:DONH6] -Oh merde ! Je t'en supplie, Antonio, tu dois m'aider à sortir d'ici ! - -[DONP_17:DONH6] -Je veux pas... S'il te plait ! Je veux pas mourir ! Je veux... - -[DONP_18:DONH6] -L'univers et vous, vous êtes plus potes, c'est ça ? - -[DONP_19:DONH6] -Merci, Toni ! Je te promets... T'auras pas à le regretter ! - -[DONP_04:DONH6] -- ce serait facile... ~n~ - Quoi d'neuf, Don ? - -{=================================== MISSION TABLE TOSH1 ===================================} - -[TOSH1AB:TOSH1] -~w~Arrêtez-le ! - -[TOSH1AC:TOSH1] -~w~Chopez-le ! - -[TOSH1AD:TOSH1] -~w~Butez-le ! - -[TOSH1AA:TOSH1] -~w~Le voilà ! - -[TOSH120:TOSH1] -~w~Vole la ~b~cargaison d'armes~w~ des Yakuzas, à Bedford Point. - -[TOSH121:TOSH1] -~w~Tu dois encore passer les ~r~gardes Yakuzas. - -[TOSH122:TOSH1] -~w~Prends garde aux autres ~r~bateaux Yakuzas. - -[TOSH130:TOSH1] -~w~Apporte les armes au ~y~contact de Toshiko. - -[TOSH131:TOSH1] -~w~Retourne à la ~b~cargaison d'armes. - -[TOSH1BA:TOSH1] -~w~C'est de la super artillerie qu'on a là, fiston ! - -[TOSH1BB:TOSH1] -~w~Tu sais, je fais tellement d'affaires sur ces docks que j'aurais dû m'installer ici, - -[TOSH1BC:TOSH1] -~w~et pas à mi-chemin de cette saleté d'île ! - -[TOSH1BD:TOSH1] -~w~Bon, ben, c'était sympa ! - -[TOSH1DB:TOSH1] -~r~Les armes ont été détruites ! - -[TOSH1PH:TOSH1] -~w~Les Yakuzas garderont leur cargaison. Tu devras peut-être passer à l'armurerie de Phil Cassidy en chemin. - -[DEAD_01:TOSH1] -Alors c'est ça, le dur à cuire ? - -[DEAD_02:TOSH1] -Vous n'avez pas l'air si dur. - -[DEAD_03:TOSH1] -... Merci. - -[DEAD_04:TOSH1] -Savez-vous ce que c'est que de vivre sans amour, Toni-san ? - -[DEAD_05:TOSH1] -C'est vivre avec la haine... - -[DEAD_06:TOSH1] -Je vous crois sur parole. - -[DEAD_07:TOSH1] -Mon voeu le plus cher est de détruire un homme, M. Cipriani. - -[DEAD_08:TOSH1] -Le détruire... pas simplement le tuer... - -[DEAD_09:TOSH1] -Je veux que lui et toute son organisation soient affaiblis et humiliés avant de mourir. - -[DEAD_10:TOSH1] -Je veux qu'il souffre. - -[DEAD_11:TOSH1] -OK. - -[DEAD_12:TOSH1] -Cet homme que vous devez détruire est mon mari : Kazuki Kasen. - -[DEAD_13:TOSH1] -Ne vous inquiétez pas. - -[DEAD_14:TOSH1] -Vous serez généreusement récompensé pour vos services. - -[DEAD_15:TOSH1] -Et si je refuse ? - -[DEAD_16:TOSH1] -Vous ne refuserez pas... Car sa mort vous est nécessaire... - -[DEAD_17:TOSH1] -En fait, vous lui avez déjà porté un sérieux coup, M. Cipriani. - -[DEAD_18:TOSH1] -Mais il attend une autre livraison de munitions aujourd'hui. - -[DEAD_19:TOSH1] -Je veux que vous lui voliez ces armes juste sous son stupide nez. - -{=================================== MISSION TABLE TOSH2 ===================================} - -[TOSH2AA:TOSH2] -~w~Toni-san. - -[TOSH2AL:TOSH2] -~w~Vos actions ont rendu mon mari fou de rage. - -[TOSH2AB:TOSH2] -~w~Ses hommes et lui sont apparus tels qu'ils sont, - -[TOSH2AM:TOSH2] -~w~une bande d'imbéciles. - -[TOSH2AC:TOSH2] -~w~J'adore faire plaisir. Quelle est la suite, princesse ? - -[TOSH2AE:TOSH2] -~w~Mon mari va transporter une grande quantité d'argent depuis son casino. - -[TOSH2AF:TOSH2] -~w~Je veux que vous détruisiez tout cet argent. - -[TOSH2AG:TOSH2] -~w~Je pourrais trouver un usage pour tout ce fric, poupée. - -[TOSH2AH:TOSH2] -~w~Je veux que cet argent brûle dans la rue au vu de tous ! - -[TOSH2AI:TOSH2] -~w~OK, OK... Quand est-ce que ce transfert doit avoir lieu ? - -[TOSH2AJ:TOSH2] -~w~Il a déjà commencé. - -[TOSH2AK:TOSH2] -~w~Ils sont en train de quitter le casino et vous n'avez pas beaucoup de temps. - -[TOSH2O0:TOSH2] -~w~Détruis TOUTES les ~r~camionnettes de sécurité~w~. Laisse personne atteindre le ~y~complexe des Yakuzas ! - -[TOSH2O1:TOSH2] -~w~Ils s'enfuient ! Ne laisse partir aucune ~r~camionnette ! - -[TOSH2O2:TOSH2] -~w~Tu les as alertés ! Ne laisse pas partir les ~r~camionnettes ! - -[TOSH2E1:TOSH2] -~w~Le ~r~convoi~w~ approche du ~y~complexe des Yakuzas ! - -[TOSH2E2:TOSH2] -~w~Une ~r~camionnette~w~ est presque arrivée au ~y~complexe des Yakuzas ! - -{=================================== MISSION TABLE TOSH3 ===================================} - -[TOSH3M1:TOSH3] -~w~Y a quelqu'un ? - -[TOSH3M2:TOSH3] -~w~Toni-san ? Un instant, je vous prie... - -[TOSH3M3:TOSH3] -~w~Mon mari est furieux. - -[TOSH3EA:TOSH3] -~w~Il se demande comment vous avez pu l'attaquer avec autant de précision. - -[TOSH3M4:TOSH3] -~w~A moins d'être très bête, il le découvrira bientôt. - -[TOSH3M5:TOSH3] -~w~Peut-être devrions-nous l'aider... Ses hommes jacassent comme de vieilles pies. - -[TOSH3EB:TOSH3] -~w~Donnons-leur matière à parler. - -[TOSH3M6:TOSH3] -~w~Où on va ? - -[TOSH3M7:TOSH3] -~w~A l'opéra. - -[TOSH3M8:TOSH3] -~w~L'opéra ? Avec moi ? Vous plaisantez ? - -[TOSH3M9:TOSH3] -~w~Ne soyez pas ridicule, Toni-san ! Tout le monde aime l'opéra ! - -[TOSH3A:TOSH3] -~w~Si vous allez chercher ma voiture, nous pourrons passer prendre votre smoking. - -[TOSH3EC:TOSH3] -~w~Nous n'avons pas beaucoup de temps, le spectacle va bientôt commencer. - -[TOSH3B:TOSH3] -~w~Va chercher la ~b~voiture de Toshiko. - -[TOSH3C:TOSH3] -~w~Passe prendre ~b~Toshiko. - -[TOSH3C2:TOSH3] -~w~Récupère un smoking chez ~y~M. Benz. - -[TOSH3B3:TOSH3] -~w~Reconduis Toshiko à son ~y~appartement. - -[TOSH3B4:TOSH3] -~r~T'as oublié Toshiko ! - -[TOSH3B2:TOSH3] -Remonte dans la ~b~voiture de Toshiko. - -[TOSH3C3:TOSH3] -~w~Va à l'~y~opéra. - -[TOSH3D:TOSH3] -~w~Où allez-vous !? Nous allons être en retard ! - -[TOSH3D2:TOSH3] -~w~Je vous en prie, ne m'abandonnez pas, Toni-san ! - -[TOSH3Z1:TOSH3] -~w~Vous pensez que je suis une mauvaise personne, Toni-san ? - -[TOSH3Z2:TOSH3] -~w~J'suis pas un ange moi non plus, princesse. - -[TOSH3Z3:TOSH3] -~w~Non... Mais un ange ne me serait guère utile. - -[TOSH3Z4:TOSH3] -~w~Mon mari est un Samouraï, Toni-san. - -[TOSH3Z5:TOSH3] -~w~Il est très fort... et très mauvais. - -[TOSH3Z6:TOSH3] -~w~Il m'a épousée uniquement pour devenir waka-gashira, à Liberty City. - -[TOSH3Z7:TOSH3] -~w~Il ne m'a jamais aimée... Il préfère la compagnie de ses hommes. - -[TOSH3Z8:TOSH3] -~w~Vous comprenez ? - -[TOSH3Z9:TOSH3] -~w~Vous savez qu'il vous tuera quand il découvrira ce que vous faites. - -[TOSH3Z0:TOSH3] -~w~Vivre ou mourir, ça n'a plus aucune importance pour moi... Seule ma liberté compte. - -[TOSH3ZB:TOSH3] -~w~C'est une façon très zen de voir les choses. - -[TOSH3E:TOSH3] -~w~Le sang italien se mélange pas avec le sang japonais ! - -[TOSH3F:TOSH3] -~w~Mais ça va très bien se mélanger sur le trottoir ! - -[TOSH3G:TOSH3] -~w~Protège Toshiko et échappe-toi dans sa ~b~voiture. - -[TOSH3H:TOSH3] -~w~Protège ~b~Toshiko~w~ et ramène-la à son ~y~appartement. - -[TOSH3S1:TOSH3] -~w~Ma voiture ! - -[TOSH3S2:TOSH3] -~w~Sauvez-nous, Toni ! - -[TOSH3S3:TOSH3] -~w~Allez, Toni ! - -[TOSH3S4:TOSH3] -~w~Sortez-nous de là ! - -[TOSH3S5:TOSH3] -~w~SAUVEZ-MOI ! - -[TOSH3S6:TOSH3] -~w~A L'AIDE ! - -[TOSH3S7:TOSH3] -~w~On va pas s'en sortir ! - -[TOSH3S8:TOSH3] -~w~AU SECOURS ! - -[TOSH3S9:TOSH3] -~r~Toshiko est morte ! - -[TOSH310:TOSH3] -~r~La voiture de Toshiko a été détruite ! - -[TOSH311:TOSH3] -~r~Le temps est écoulé ! - -[TOSH3_1:TOSH3] -NONE - -[TOS3NE1:TOSH3] -~w~Protège Toshiko et tue les ~r~Forelli. - -[TOS3NE2:TOSH3] -~w~Tire-toi dans la voiture de ~b~Toshiko. - -[TOSH3EI:TOSH3] -~w~L'opéra commence à 20:00. Ne sois pas en retard ! - -{=================================== MISSION TABLE TOSH4 ===================================} - -[TOSH4O2:TOSH4] -~w~L'hélico de Kazuki se dirige vers le ~y~casino ! - -[TOSH4O4:TOSH4] -~w~Tue ~r~Kazuki ! - -[TOSH4O5:TOSH4] -~w~Va à l'~y~appartement de Toshiko. - -[TOSH4_3:TOSH4] -~w~Kazuki arrive dans cet hélico. Va à l'héliport et tue-le ! - -[TOSH4Y1:TOSH4] -~w~Chopez-le ! - -[TOSH4Y2:TOSH4] -~w~Tuez-le ! - -[TOSH4CA:TOSH4] -~w~Mes hommes m'ont déshonoré... - -[TOSH4CB:TOSH4] -~w~mais il est juste que je te tue moi-même. - -[TOSH4CC:TOSH4] -~w~Vous deux ! Laissez-nous ! - -[TOSH4CD:TOSH4] -~w~C'est avec grand plaisir que je vais te faire goûter à mon sabre... - -[TOSH4CE:TOSH4] -~w~Ouais, on m'a prévenu. - -[TOSH4K1:TOSH4] -~w~Descendez-le ! - -[TOSH4K2:TOSH4] -~w~Tuez-le ! - -[TOSH4_7:TOSH4] -~w~Apporte le sabre de Kazuki à Toshiko comme preuve de sa mort. - -[TOSH4_8:TOSH4] -~w~T'as fait peur à Kazuki ! Il s'échappe ! T'as raté ta chance de le liquider ! - -[TOSH4_C:TOSH4] -Kazuki - -[TOSH4AA:TOSH4] -~w~Hello ? - -[TOSH4AB:TOSH4] -~w~Je prends un bain, Toni-san. - -[TOSH4AC:TOSH4] -~w~Nous n'avons pas beaucoup de temps. - -[TOSH4AD:TOSH4] -~w~Mon mari sait qui est vraiment à l'origine de ses pertes. - -[TOSH4AE:TOSH4] -~w~Il vient me tuer... et vous aussi. - -[TOSH4AF:TOSH4] -~w~Bon, alors, je vais pas l'attendre ici. Où est-il ? - -[TOSH4AG:TOSH4] -~w~A Belleville, en train de rassembler ses hommes. - -[TOSH4AJ:TOSH4] -~w~Mais il sera bientôt là. - -[TOSH4AH:TOSH4] -~w~Sayonara, poupée. - -[TOSH4AI:TOSH4] -~w~Mes prières vous accompagnent, Toni-san. Bonne chance ! - -[TOSH4F1:TOSH4] -~r~Kazuki se moque de toi ! - -[TOSH4OA:TOSH4] -~w~Bute les ~r~gardes de Kazuki ! - -[TOSH4OB:TOSH4] -~w~Retourne chez ~y~Kazuki ! - -[TOSH4OC:TOSH4] -~w~Attention ! Voilà d'autres ~r~Yakuzas ! - -[TOSH4DA:TOSH4] -~w~Butez-le ! - -[TOSH4DB:TOSH4] -~w~Tuez-le ! - -[TOSH4DC:TOSH4] -~w~Tuez-le, bande de nazes ! - -[TOSH4O1:TOSH4] -~w~Va chez ~y~Kazuki~w~ et tue-le ! - -[TOSH4O3:TOSH4] -~w~Va à l'~y~héliport ! - -[CASH_01:TOSH4] -Hum... Bon... Toshiko. C'est terminé. - -[CASH_02:TOSH4] -Oui, oui, je le savais. Bonjour, Toni-san. - -[CASH_03:TOSH4] -Hé... Alors, euh... Vous avez gagné... - -[CASH_04:TOSH4] -Vous avez ce que vous vouliez, tout a marché comme convenu. - -[CASH_06:TOSH4] -Merveilleux, oui, merveilleux... - -[CASH_07:TOSH4] -Et maintenant c'est l'heure de la paye, ma poule... - -[CASH_08:TOSH4] -Nous sommes tous deux des tueurs fous, Toni-san. - -[CASH_09:TOSH4] -J'imagine... - -[CASH_10:TOSH4] -Ne pensez-vous pas que notre esprit paye un lourd tribut au monde, Toni-san ? - -[CASH_11:TOSH4] -Possible... - -[CASH_12:TOSH4] -Mais vous êtes libre maintenant. Je veux dire, d'aller au Costa Rica, à Aruba ou ailleurs. - -[CASH_13:TOSH4] -Tout recommencer, c'est ce dont vous rêviez. - -[CASH_14:TOSH4] -Je ne crois pas être prête pour les vacances à la plage, Toni-san. - -[CASH_15:TOSH4] -J'ai tout perdu, par ma seule volonté. - -[CASH_16:TOSH4] -Il m'a été accordé ce que je demandais. - -[CASH_17:TOSH4] -Désormais, je n'aspire plus qu'à la vraie liberté. - -[CASH_18:TOSH4] -Au revoir, Toni-san. +[MM_1_C:CARPAR1] +~y~FRANCHIS~g~ un point de passage pour enclencher le compteur. ~g~Chaque point de passage te crédite ~y~~1~ SECONDES~g~. {=================================== MISSION TABLE COPCAR ===================================} +[CLEVEL:COPCAR] +Missions d'autodéfense niveau ~1~ + [C_COMP1:COPCAR] -~w~Mission Autodéfense : niveau 12 terminé ! La protection pare-balles est encore plus efficace ! +Niveau 12 de mission Auto-défense réussi : votre max de gilet pare-balles passe à 150. + +[KILLS:COPCAR] +VICTIMES : [C_BREIF:COPCAR] -~r~Suspect~w~ aperçu pour la dernière fois dans le secteur : ~a~. +~g~Suspect aperçu pour la dernière fois dans le secteur ~a~. -[C_BREIG:COPCAR] -~r~Suspects~w~ aperçus pour la dernière fois dans le secteur : ~a~. - -[C_RANGE:COPCAR] -~r~La radio de la police ne capte plus rien ! Rapproche-toi d'un poste de police ! - -[C_TIMEA:COPCAR] -~w~Bonus temps ! +~1~ secondes +[C_PASS:COPCAR] +MENACE ENRAYEE : $~1~ [COPCART:COPCAR] -~w~T'as ~1~ secondes pour monter dans un véhicule de police avant la fin de la mission. - -[COPCARU:COPCAR] -~w~T'as ~1~ seconde pour monter dans un véhicule de police avant la fin de la mission. +~g~Tu as ~1~ secondes pour retourner à une voiture de police avant que la mission ne s'achève. [C_CANC:COPCAR] -~r~Mission Autodéfense annulée ! +~r~Mission d'autodéfense annulée! [C_TIME:COPCAR] -~r~T'as fait ton temps comme flic. C'est fini ! +~r~Ta carrière de flic est terminée! -[C_PASS3:COPCAR] -~w~MENACE ELIMINEE ! Récomp. : ~1~$ +{=================================== MISSION TABLE COUNT1 ===================================} -[C_LEVEL:COPCAR] -~r~T'as laissé les criminels s'enfuir ! +[CM1_A:COUNT1] +Vercetti? Hé, vous avez acheté la vieille imprimerie? -[C_RANG2:COPCAR] -~r~La radio de la caisse des flics ne fonctionne pas dans le métro ! +[CM1_B:COUNT1] +Ouais, mon vieux a travaillé sur ces machines. -{=================================== MISSION TABLE CARS ===================================} +[CM1_C:COUNT1] +J'aurais voulu marcher sur ses traces, mais... J'ai suivi une autre voie. -[CARS_10:CARS] -~w~Monte dans une caisse pour partir en balade ou quitte les lieux pour annuler la mission. +[CM1_D:COUNT1] +Vous avez l'intention de vendre les vieilles machines, et de tout casser? -[CARS_12:CARS] -~w~Ta mission sera un échec si tu descends de voiture. +[CM1_E:COUNT1] +Je m'disais qu'on pourrait peut-être imprimer quelque chose, un journal ou un magazine... -[CARS_1:CARS] -~w~Emmène un des clients en balade. +[CM1_F:COUNT1] +Arrête tes conneries, fiston! J'ai toujours rêvé d'imprimer mon propre pognon! C'est pas très compliqué! -[CARS_2:CARS] -~w~Tu dois trouver ce que chaque client attend des performances de la voiture. +[CM1_G:COUNT1] +Tu sais, j'ai fait ça sur une petite échelle pendant des années. -[CARS_3:CARS] -~w~Ensuite, sers-toi de tes talents de conducteur pour leur montrer que c'est la caisse de leurs rêves. +[CM1_H:COUNT1] +Ah ouais? -[CARS_5:CARS] -~w~Impressionne le client. +[CM1_I:COUNT1] +Ouais. Mais il nous faut des plaques de bonne qualité. -[CARS_6:CARS] -~w~Le client est à terre ! Choisis une autre caisse ! +[CM1_J:COUNT1] +Evidemment! Il y a un syndicat de contrefaçon qui opère déjà en Floride! -[CARS_30:CARS] -~w~Retourne chez le ~y~concessionnaire~w~ conclure l'affaire ! +[CM1_K:COUNT1] +Un syndicat? -[CARS_C1:CARS] -~w~Alors, mec, t'aimes bien larguer les flics ? +[CM1_L:COUNT1] +Ouais. C'est le bruit qui court en tout cas. -[CARS_C2:CARS] -~w~Ouais ! Ca lui apprendra ! +[CM1_M:COUNT1] +Je connais un mec qui en saura sûrement plus... -[CARS_P1:CARS] -~w~Waou ! Cette caisse est supersonique ! +[CM1_N:COUNT1] +On avait l'habitude de passer nos soirées ensemble, à nettoyer les rouleaux... -[CARS_P2:CARS] -~w~Waou ! Trop cool !! +[CM1_2A:COUNT1] +Mate-moi ce cul! -[CARS_P3:CARS] -~w~Tu conduis comme ma tante ! +[CM1_2B:COUNT1] +Ok, ma belle, c'est l'heure de l'initiation! -[CARS_P4:CARS] -~w~Cette voiture a des airbags ? +[CM1_2C:COUNT1] +Salut, vieille branche, comment ça va? -[CARS_M1:CARS] -~w~Ah, un petit tour bien tranquille... +[CM1_2D:COUNT1] +Que sais-tu à propos de la contrefaçon? -[CARS_M2:CARS] -~w~Vous savez que la vitesse est limitée ? +[CM1_2E:COUNT1] +Oh, je vais bien, Paul, et toi? -[CARS_M3:CARS] -~w~Oh mon Dieu, vous allez nous tuer ! +[CM1_2F:COUNT1] +Viens ici! -[CARS_O1:CARS] -~w~Oh ouais, plus de macadam pour nous retenir ! +[CM1_2G:COUNT1] +Bon! Bon! Bon! Tu es visiblement un homme très occupé! -[CARS_O2:CARS] -~w~Jusqu'au ciel, mon pote ! +[CM1_2H:COUNT1] +Tout ce que je sais, c'est que les Triades fournissent les plaques. -[CARS_O3:CARS] -~w~Trop cool, le tonneau !! +[CM1_2I:COUNT1] +Elles ont une compagnie de navigation sur les quais -[CARS_SC:CARS] -~w~Vente terminée. Commission : ~1~$ Bonus temps : ~1~ secondes +[CM1_2J:COUNT1] +et le patron devrait savoir quand les plaques arrivent! -[CARS_SD:CARS] -~w~Niveau ~1~ terminé. Commission : ~1~$ Bonus temps : ~1~ secondes +[CM1_2K:COUNT1] +Merci, Paul. -[CARS_IR:CARS] -~1~ A LA SUITE ! Bonus ! ~1~$ +[CM1_2L:COUNT1] +C'est quoi ton problème, pauvre maniaque! -[CARS_RE:CARS] -~w~Une petite prime pour notre meilleur vendeur ! +[CM1_2M:COUNT1] +Un autre verre, en vitesse! -[CARSIC1:CARS] -~w~J'ai besoin d'une caisse dure à rattraper, mec. +[CM1_3:COUNT1] +~g~T'as été repéré! -[CARSIC2:CARS] -~w~J'ai besoin d'une caisse capable de dégommer ces connards de piétons. +[CM1_5:COUNT1] +~g~Va retrouver Kent Paul au Malibu! -[CARSIP1:CARS] -~w~Ce bébé a l'air rapide ! +[CNT1_1:COUNT1] +T'es qui toi? Aïe! Pas le visage! Pas le visage! -[CARSIP2:CARS] -~w~Oh mec ! J'parie que ce truc peut voler ! +[CM1_1:COUNT1] +~g~Va au bateau de la Chartered Libertine Lines sur les docks. -[CARSIM1:CARS] -~w~Il paraît que c'est une voiture très rassurante. +[CM1_2:COUNT1] +~g~L'officier de navigation détient l'information dont tu as besoin. -[CARSIM2:CARS] -~w~Depuis mon opération, j'ai besoin d'une voiture plus lente. +[CNT1_2:COUNT1] +Ok, je parle! Je parle! -[CARSIO1:CARS] -~w~L'adhérence est bonne, sortons de la route ! +[CM1_6:COUNT1] +~g~Ramène l'info à l'imprimerie! -[CARSIO2:CARS] -~w~Mon pote réussit à faire des tonneaux avec sa caisse, et j'adore ça ! +{=================================== MISSION TABLE COUNT2 ===================================} -[CARS_N1:CARS] -~w~J'achète pas cette poubelle ! +[CNT2_B1:COUNT2] +Bon, le coursier déplace les plaques des docks aujourd'hui. -[CARS_N2:CARS] -~w~J'arrive pas à croire que vous avez voulu me faire acheter cette épave ! +[CNT2_B2:COUNT2] +Faut l'intercepter et récupérer ces plaques, semer les flics éventuels et revenir ici. -[CARS_N3:CARS] -~w~Vous autres, les vendeurs de caisses d'occasion, vous êtes tous pareils ! +[CNT2_B3:COUNT2] +En fonction de comment ça marche, -[CARS_Y1:CARS] -~w~Je l'achète ! +[CNT2_B4:COUNT2] +on aura entre cinq minutes et toute l'année pour imprimer le pognon avant que le syndicat de contrefaçon rapplique. -[CARS_Y2:CARS] -~w~C'est la voiture de mes rêves ! +[CNT2_B5:COUNT2] +Quoi qu'il en soit, je veux voir les premiers billets sortir de la presse cinq minutes après mon retour! C'est compris? -[CARS_Y3:CARS] -~w~Affaire conclue ! +[CNT2_B6:COUNT2] +T'inquiète pas, Tommy, on sera prêts. -[CARS_R1:CARS] -~w~J'aime bien la voiture, mais pas la couleur. +[CNT2_B7:COUNT2] +Les gars et moi, on sera dans le coin au cas où t'aurais besoin de renforts. -[CARS_R2:CARS] -~w~Fais repeindre la voiture ! +[CNT2_B8:COUNT2] +Bon, tout le monde a compris? Parfait. A plus tard. -[CARS_D1:CARS] -~w~J'aime bien, mais elle est pas en bon état... +[CNT2_01:COUNT2] +~g~Le ~r~coursier~g~ qui porte les plaques va bientôt arriver aux ~y~docks~g~ en hélico. -[CARS_D2:CARS] -~w~Fais réparer cette caisse ! +[CNT2_02:COUNT2] +~r~Le coursier s'est enfui en hélico! -[CARS_F1:CARS] -~r~T'as bousillé la caisse ! +[CNT2_03:COUNT2] +~r~Le coursier est parvenu à destination sain et sauf, c'est trop tard! -[CARS_F2:CARS] -~r~T'as tué le client ! +[CNT2_04:COUNT2] +~r~Tu as détruit les plaques dans l'explosion! -[CARS_F3:CARS] -~r~T'as trop traîné ! Le client en a eu marre ! +[CNT2_05:COUNT2] +~g~Tu as les plaques. Emmène-les à l'imprimerie! -[CARS_F4:CARS] -~r~Le client n'aime pas la caisse ! +[CNT2_06:COUNT2] +~g~Le coursier est mort et il a jeté les plaques. Récupère-les en premier. -[CARS_F5:CARS] -~r~Ta carrière de vendeur de voitures est terminée. +[CNT2_07:COUNT2] +~g~Un des gardes a ramassé les plaques, ne le laisse pas s'enfuir! -[CARS_F6:CARS] -~r~Le client aime pas la caisse ! Tu l'as crashée ! +[CNT2_08:COUNT2] +~g~Le ~r~coursier~g~ avec les plaques est arrivé aux docks. -[CARS_F7:CARS] -~r~Le client aime pas la caisse ! T'as roulé trop vite ! +[CNT2_4:COUNT2] +Affaire privée! Dégagez! -[CARS_F8:CARS] -~r~Le client aime pas la caisse ! T'as pas roulé assez vite ! +[CNT2_09:COUNT2] +IMPRIMERIE ACQUISE -[CARS_SA:CARS] -Vente +[CNT2_10:COUNT2] +~g~L'imprimerie va maintenant générer un revenu maximum de $~1~. Veille à relever régulièrement les compteurs. -[CARS_7:CARS] -~w~Monte dans une ~b~caisse ! +[CNT2_11:COUNT2] +~r~Les plaques sont au fond de la mer! -[CARS_RF:CARS] -~w~Capital Autos est désormais sous ta 'protection'. Pense à encaisser régulièrement les paiements. +{=================================== MISSION TABLE CUBAN1 ===================================} -{=================================== MISSION TABLE BIKE ===================================} +[CUB1_A:CUBAN1] +Si, mec? -[BIKE_10:BIKE] -~w~Grimpe sur la moto pour partir en balade ou quitte l'allée pour annuler la mission. +[CUB1_B:CUBAN1] +Hé, du calme, papa, ce mec est là pour moi. Hé, c'est toi le mec? -[BIKE_12:BIKE] -~w~Ta mission est un échec si tu descends de moto. +[CUB1_C:CUBAN1] +Oh ouais. C'est toi le mec. Je crois bien, tu sais. -[BIKE_1:BIKE] -~w~Emmène un des clients en balade. +[CUB1_D:CUBAN1] +Non, je crois pas. -[BIKE_2:BIKE] -~w~Tu dois découvrir ce que chaque client recherche en matière de performances. +[CUB1_E:CUBAN1] +Ah ouais? Amène-toi, gros dur! -[BIKE_3:BIKE] -~w~Ensuite, sers-toi de tes talents pour leur montrer que c'est la moto de leurs rêves. +[CUB1_F:CUBAN1] +Tu crois que tu peux jouer avec moi? -[BIKE_5:BIKE] -~w~Impressionne le client. +[CUB1_G:CUBAN1] +Tu penses que tu peux jouer au con avec moi? -[BIKE_30:BIKE] -~w~Retourne au ~y~magasin de motos~w~ pour conclure l'affaire ! +[CUB1_H:CUBAN1] +Non, je pense que tu joues assez le con pour nous deux. -[BIKE_C1:BIKE] -~w~OK, mec, faut donner une leçon aux flics, hein ! +[CUB1_I:CUBAN1] +Hé, il t'a traité de con, fiston. -[BIKE_C2:BIKE] -~w~Ouais ! Bien fait pour ce minable ! +[CUB1_J:CUBAN1] +Et moi, je le traite de fillette, papa. -[BIKE_P1:BIKE] -~w~Ouais ! Cette moto est géniale ! +[CUB1_K:CUBAN1] +Regarde-le, tout habillé comme ça. -[BIKE_P2:BIKE] -~w~Ouais ! +[CUB1_L:CUBAN1] +C'est la soirée des pouffiasses, ce soir? -[BIKE_P3:BIKE] -~w~Allez, elle peut pas aller plus vite ? +[CUB1_M:CUBAN1] +Toi qu'est plutôt balaise, pourquoi tu te fringues en nana? -[BIKE_P4:BIKE] -~w~Attention ! +[CUB1_N:CUBAN1] +Et t'as une petite culotte comme les gonzesses? -[BIKE_M1:BIKE] -~w~Ah, un petit tour tranquille... +[CUB1_O:CUBAN1] +Qu'est-ce que t'as contre les femmes? Tu préfères les mecs, mon gros? -[BIKE_M2:BIKE] -~w~Vous savez que la vitesse est limitée ? +[CUB1_P:CUBAN1] +J'aime les femmes! J'aime toutes les femmes! J'aime ma maman, Chico! -[BIKE_M3:BIKE] -~w~Oh mon Dieu, vous allez nous tuer ! +[CUB1_Q:CUBAN1] +Ok, ok, j'te crois sur parole. -[BIKE_O1:BIKE] -~w~Ouais, vive la liberté tout terrain ! +[CUB1_R:CUBAN1] +Tu sais conduire, amigo? -[BIKE_O2:BIKE] -~w~Le ciel nous appartient, mec ! +[CUB1_S:CUBAN1] +Ouais... Comme une gonzesse. -[BIKE_O3:BIKE] -~w~Ouais, d'enfer, les cascades ! +[CUB1_T:CUBAN1] +Très drôle... Tu me plais, ma grosse, peut-être que tu peux aider. -[BIKE_SC:BIKE] -~w~Vente terminée. Commission : ~1~$ Bonus temps : ~1~ secondes +[CUB1_U:CUBAN1] +Tu peux peut-être nous montrer que t'es un vrai mec? -[BIKE_IR:BIKE] -~1~ A LA SUITE ! Bonus ! ~1~$ +[CUB1_V:CUBAN1] +Sors le bateau. -[BIKE_RE:BIKE] -~w~Une petite prime pour notre meilleur vendeur ! +[CUB1_W:CUBAN1] +Prouve-moi que t'as des couilles énormes -[BIKE_RF:BIKE] -~w~Hogs 'n' Cogs est désormais sous ta 'protection'. Pense à encaisser régulièrement les paiements. +[CUB1_X:CUBAN1] +et pas une paire de pois chiches! -[BIKEIC1:BIKE] -~w~J'ai besoin de quelque chose de difficile à courser, mec. +[CUB1_02:CUBAN1] +Ok, mec, traite-la comme une gonzesse. -[BIKEIC2:BIKE] -~w~J'veux une moto pour régler leurs comptes à ces enfoirés de piétons ! +[CUB1_03:CUBAN1] +Pas mal, t'es un vrai macho. -[BIKEIP1:BIKE] -~w~Cette moto a l'air rapide ! +[CUB1_04:CUBAN1] +Merde, t'en a vraiment dans le pantalon, amigo. -[BIKEIP2:BIKE] -~w~J'veux une moto qu'impressionne les filles ! +[CUB1_05:CUBAN1] +Amigo, t'es un vrai mec, mec. -[BIKEIM1:BIKE] -~w~Il paraît que ces motos assurent une conduite tranquille. +[CUB1_06:CUBAN1] +Tu te prends pour un homme, mec? -[BIKEIM2:BIKE] -~w~J'suis encore un peu patraque, il me faut une moto plus lente. +[CUB1_07:CUBAN1] +T'es qu'une petite poule mouillée, petit, c'est ta mère qui te manque? -[BIKEIO1:BIKE] -~w~Super, l'adhérence ! On sors de la route ! +[CUB1_08:CUBAN1] +Tu gâches tout! Tu marches comme un mec, tu causes comme un mec, mais tu conduis comme une gonzesse! -[BIKEIO2:BIKE] -~w~Ces motos peuvent faire des super cascades, pas vrai !? +[CUB1_09:CUBAN1] +Mec, t'es un vrai mec de chez mec, mec! Putain, je t'adore, mec! -[BIKE_N1:BIKE] -~w~J'achète pas cette merde ! +[CUB1_10:CUBAN1] +C'est quand tu veux, mec. T'as des couilles de taureau et tous mes potes ont des couilles énormes! -[BIKE_N2:BIKE] -~w~Vous êtes malade si vous avez cru que j'achèterais cette épave ! +[CUB1_11:CUBAN1] +~r~T'as tué Rico! -[BIKE_N3:BIKE] -~w~Vous, les vendeurs de motos, vous êtes tous les mêmes ! +[CUB1_12:CUBAN1] +Va jusqu'au premier point de contrôle pour commencer le test. -[BIKE_Y1:BIKE] -~w~Je la prends ! +[CUB1_14:CUBAN1] +Retourne dans le bateau! -[BIKE_Y2:BIKE] -~w~C'est la moto qu'il me faut ! +[CUB1_15:CUBAN1] +~r~T'es trop lent, mec! -[BIKE_Y3:BIKE] -~w~Parfait, je l'achète ! +[CUB1_01:CUBAN1] +Salut, moi c'est Rico. C'est toi qu'a des couilles de taureau? -[BIKE_R1:BIKE] -~w~La moto est bien, mais j'aime pas la couleur. +[CUB1_13:CUBAN1] +~g~Tu as trois minutes pour terminer le parcours. -[BIKE_R2:BIKE] -~w~Fais repeindre la moto ! +{=================================== MISSION TABLE CUBAN2 ===================================} -[BIKE_D1:BIKE] -~w~Elle me plaît, mais l'état est pas terrible... +[CUB2_25:CUBAN2] +BUTE TOUS LES HAITIENS! -[BIKE_D2:BIKE] -~w~Fais réparer la moto ! +[CUB2_A:CUBAN2] +Un cafecito, por favor, Alberto... -[BIKE_F1:BIKE] -~r~T'as bousillé la moto ! +[CUB2_N:CUBAN2] +Tout de suite, Tommy. -[BIKE_F2:BIKE] -~r~T'as tué le client ! +[CUB2_B:CUBAN2] +Poppa! Un gran problema! -[BIKE_F3:BIKE] -~r~Trop tard ! Le client en a eu marre ! +[CUB2_O:CUBAN2] +Umberto, mon fils, que s'est-il passé? -[BIKE_F4:BIKE] -~r~Le client aime pas la moto ! +[CUB2_C:CUBAN2] +Les Haïtiens! Je hais les Haïtiens! -[BIKE_F5:BIKE] -~r~Ta carrière de vendeur de motos est terminée. +[CUB2_D:CUBAN2] +C'est la dernière fois qu'ils me font chier! -[BIKE_F6:BIKE] -~r~T'as bousillé la moto ! Le client en veut pas ! +[CUB2_E:CUBAN2] +Ces Haïtiens... On va les liquider! -[BIKE_F7:BIKE] -~r~T'as été trop vite ! Le client... est plus client ! +[CUB2_F:CUBAN2] +On a juste besoin de renforts... -[BIKE_F8:BIKE] -~r~T'as roulé trop lentement ! Le client achète pas ! +[CUB2_G:CUBAN2] +J'ai déjà perdu pas mal de frères là-bas. -[BIKE_B1:BIKE] -~w~T'as ~1~ secondes pour remonter sur la ~b~moto ! +[CUB2_H:CUBAN2] +Amigo, tu conduis pas mal! -[BIKE_B2:BIKE] -~w~Attends que le ~b~client~w~ remonte sur la moto ! +[CUB2_I:CUBAN2] +Pour une gonzesse... Pas vrai? -[BIKE_B3:BIKE] -~w~Laisse le ~b~client~w~ monter sur la moto ! +[CUB2_J:CUBAN2] +C'est pas l'heure des vannes! -[BIKE_SA:BIKE] -Vente +[CUB2_K:CUBAN2] +Allez, conduis encore pour moi! -[BIKE_7:BIKE] -~w~Monte sur une ~b~moto ! +[CUB2_L:CUBAN2] +Récupère mes gars là-bas et puis on s'occupe de ces Haïtiens! -[BIKE_S1:BIKE] -~w~T'as vendu toutes les Freeway qu'on avait en stock! +[CUB2_M:CUBAN2] +Ils m'ont cherché et ils sont tombés sur le mec le plus balaise de la ville! -[BIKE_S2:BIKE] -~w~T'as vendu toutes les PCJ 600 qu'on avait en stock ! +[CUB2_01:CUBAN2] +C'est trop petit, mec, il te faut une plus grosse bagnole. -[BIKE_S3:BIKE] -~w~T'as vendu toutes les Faggio qu'on avait en stock ! +[CUB2_02:CUBAN2] +On a besoin de renforts du café! -[BIKE_S4:BIKE] -~w~T'as vendu toutes les Sanchez qu'on avait en stock ! +[CUB2_03:CUBAN2] +~g~Prend une bagnole et va ramasser les Cubains à l'extérieur du café de Robina. -[BIKE_SN:BIKE] -~w~Un nouveau stock a été livré ! +[CUB2_04:CUBAN2] +~g~Amène les Cubains à l'endroit de la bagarre. -{=================================== MISSION TABLE RAC1 ===================================} +[CUB2_05:CUBAN2] +Liquide ce lâche de tireur embusqué! -[RAC1_A0:RAC1] -~w~Si tu veux prouver que ta caisse est pas un veau, présente-toi au départ de la prochaine course urbaine. +[CUB2_07:CUBAN2] +Ils se battent comme des filles! A couvert! -{=================================== MISSION TABLE RAC2 ===================================} +[CUB2_09:CUBAN2] +Un sniper sur le toit! -[RAC2_A0:RAC2] -~w~Hé, il paraît qu'il va y avoir une course urbaine ! Amène ta caisse sur la ligne de départ. +[CUB2_11:CUBAN2] +~r~Imbécile, on avait besoin de cette bagnole! -{=================================== MISSION TABLE RAC3 ===================================} +[CUB2_12:CUBAN2] +Hé, amigo! Content de te voir que t'as réussi! -[RAC3_A0:RAC3] -~w~Y a pas de caisse plus rapide, ni de meilleur pilote ! +[CUB2_13:CUBAN2] +Putains de Haïtiens, on va tous les descendre! -[RAC3_A1:RAC3] -~w~On se retrouve pour la prochaine course... dans mon rétro ! +[CUB2_14:CUBAN2] +CHAAAAAARGEZ! -{=================================== MISSION TABLE BIK1 ===================================} +[CUB2_15:CUBAN2] +Maintenant, mes frères! Chaaaargez! -[BIK1_A0:BIK1] -~w~Tu crois que tu peux me battre ? Tu délires ! +[CUB2_16:CUBAN2] +Tommy, on a fait la preuve de notre courage! -[BIK1_A1:BIK1] -~w~Amène ta bécane sur la ligne de départ et réglons ça ! +[CUB2_17:CUBAN2] +Piquons cette camionnette bourrée de drogue et tirons-nous! -{=================================== MISSION TABLE BIK2 ===================================} +[CUB2_18:CUBAN2] +~g~Trouve une bagnole et va chercher les Cubains. -[BIK2_A0:BIK2] -~w~Tu rêves si tu crois pouvoir me battre ! Le réveil va être brutal ! +[CUB2_19:CUBAN2] +On va se battre comme des hommes! -[BIK2_A1:BIK2] -~w~On se retrouve sur la ligne de départ. +[CUB2_21:CUBAN2] +Battez-vous avec vos couilles! -{=================================== MISSION TABLE BIK3 ===================================} +[CUB2_22:CUBAN2] +~g~Elimine les derniers Haïtiens pour que les Cubains puissent avancer. -[BIK3_A0:BIK3] -~w~C'est hyper simple. Sur deux roues, j'suis imbattable ! On va régler ça dans la rue. +[CUB2_23:CUBAN2] +~g~Little Haiti va grouiller de Haïtiens voulant régler leurs comptes avec les Cubains. Fais gaffe à tes couilles. -{=================================== MISSION TABLE TT1 ===================================} +[CUB2_24:CUBAN2] +~g~Retourne au café de Robina avec la camionnette et gare-la derrière. -[TT1_A0:TT1] -~w~~k~ ~AMBUY~ ~w~pour participer. ~n~~k~ ~AMEXI~ ~w~pour quitter. +{=================================== MISSION TABLE CUBAN3 ===================================} -[TT1_0:TT1] -Temps +[CUB3_A:CUBAN3] +Alberto. Un café, senor. -[TT1_1:TT1] -~w~Nouveau record au tour : ~1~:~1~ +[CUB3_B:CUBAN3] +Papa, ne sers pas ce morbac... -[TT1_1A:TT1] -~w~Nouveau record au tour : ~1~:0~1~ +[CUB3_C:CUBAN3] +T'es un hypocrite, Tommy! -[TT1_C1:TT1] -~w~3 +[CUB3_D:CUBAN3] +T'es soit un hypocrite, soit une gonzesse! -[TT1_C2:TT1] -~w~2 +[CUB3_E:CUBAN3] +Les Haïtiens, mec! Ils se foutent de ma gueule! -[TT1_C3:TT1] -~w~1 +[CUB3_F:CUBAN3] +Du calme. C'est quoi ton problème? -[TT1_C4:TT1] -~w~GO !! +[CUB3_G:CUBAN3] +Ils se foutent ma gueule, Tommy, de ma gueule! -[TT1_D1A:TT1] -~w~Hauteur saut : ~1~ pieds +[CUB3_H:CUBAN3] +Umberto Robina! Ils font comme ça leur chante! -[TT1_D2:TT1] -~w~Tour ~1~ Temps : ~1~:~1~ +[CUB3_I:CUBAN3] +Personne fait ce qu'il veut, Umberto, ils font ce que tu les laisses faire. -[TT1_D3:TT1] -~w~Tour ~1~ Temps : ~1~:0~1~ +[CUB3_J:CUBAN3] +Quoi? -[TT1_D4:TT1] -~w~Tour +[CUB3_K:CUBAN3] +Tu veux que quelqu'un s'en occupe? -[TT1_F2:TT1] -~r~T'as quitté le circuit ! +[CUB3_L:CUBAN3] +Je peux m'en charger, mais ça va te coûter cher! -[TT1_F3:TT1] -~r~T'as détruit la moto ! +[CUB3_M:CUBAN3] +Je sais qu'on est frères et tout et tout, mais ça, c'est les affaires... -[TT1_D5A:TT1] -~w~Hauteur saut : ~1~ pieds - 10$ de bonus! +[CUB3_N:CUBAN3] +Tommy, t'es un vrai mec! Un businessman! Un gentleman! -[TT1_D1:TT1] -~w~Hauteur saut : ~1~ mètres +[CUB3_O:CUBAN3] +Ces Haïtiens. Ils ont de la marchandise de première qualité qui arrive par la mer. -[TT1_D5:TT1] -~w~Hauteur saut : ~1~ mètres - 10$ de bonus ! +[CUB3_P:CUBAN3] +On la prend et on en finit avec eux. -[TT1_2:TT1] -~w~T'as battu le temps cible ! Nouveau circuit débloqué : 100$ de bonus ! +[CUB3_Q:CUBAN3] +Tu t'en charges et je veillerai sur toi. Comme mon frère. Comme mon fils. -[TT1_3:TT1] -~w~T'as battu le temps cible ! 100$ de bonus ! +[CUB3_R:CUBAN3] +J'préfère que tu me files du pognon, plutôt que de me faire sauter sur tes genoux, amigo... -[TTDONE:TT1] -~w~Tous les circuits terminés ! T'as débloqué la Manchez. +[CUB3_01:CUBAN3] +Salut, Rico. Chouette bateau. T'es prêt? -[TT1_2A:TT1] -~r~T'as pas battu le temps cible. +[CUB3_03:CUBAN3] +~g~Récupère toutes les serviettes pleines de drogue et de cash. -[TT1_2B:TT1] -~r~T'as pas battu le record du circuit. +[CUB3_04:CUBAN3] +~g~Ramène la drogue et le cash à Umberto. -{=================================== MISSION TABLE RCR ===================================} +[CUB3_05:CUBAN3] +Si, Tommy, faut que tu tires bien, aujourd'hui. -[RCRACE3:RCR] -~w~Essaie de battre les autres véhicules radiocommandés dans une course en ~1~ tour(s), autour du parc. +[CUB3_06:CUBAN3] +Mon bateau, je voudrais pas qu'il se retrouve plein de trous, ok? -[RCRACE4:RCR] -~w~Essaie de battre les autres véhicules radiocommandés dans une course en ~1~ tour(s), autour de l'aéroport. +[CUB3_07:CUBAN3] +~g~Va retrouver Rico. Il te conduira au rendez-vous. -[RCRACE7:RCR] -~w~Prêt ? +[CUB3_02:CUBAN3] +~g~TUE TOUS LES HAITIENS EN BATEAU! -[RCRLAP5:RCR] -~w~Nouveau record au tour de ~1~ secondes ! +[CUB3_08:CUBAN3] +Oh oh... Les Cubains. On nous attaque! -[RCRLAP6:RCR] -~w~Encore ~1~ tours ! +{=================================== MISSION TABLE CUBAN4 ===================================} -[RCRLAP7:RCR] -~w~Dernier tour ! +[CUB4_A:CUBAN4] +Salut, les filles, vous savez ce que je vais faire? -[RCRLTME:RCR] -Temps au tour +[CUB4_B:CUBAN4] +Je vais aller me descendre un Haïtien. Et après, vous savez quoi? -[RCRLOSE:RCR] -~r~T'as perdu ! T'es qu'un loser ! +[CUB4_C:CUBAN4] +Après, je vais me vider les couilles comme un homme! -[RCRLOS2:RCR] -~r~Tu gagneras jamais la course si t'arrives pas à rester sur le circuit ! +[CUB4_D:CUBAN4] +T'as déjà vu ça chica? Un peu comme ça... -[RCRTIME:RCR] -~w~T'as ~h~~1~ ~w~secondes pour revenir sur le circuit ! +[CUB4_E:CUBAN4] +Pauv' mec! -[RCRWIN1:RCR] -~w~Bravo, t'as GAGNE ! Mais t'as pas battu le meilleur temps au tour. +[CUB4_F:CUBAN4] +Connard! -[RCRWIN2:RCR] -~w~Ta prochaine course sera en ~1~ tours ! +[CUB4_G:CUBAN4] +Hé, ma poule, je te toucherai même pas avec une perche! -[RCRWIN3:RCR] -~w~Course RC de Belleville Park, à Staunton, maintenant disponible. +[CUB4_H:CUBAN4] +Umberto Robina, il aime les femmes! Pas les vieilles dindes en jupe! -[RCRWIN4:RCR] -~w~Course RC de Shoreside Airport maintenant disponible. +[CUB4_I:CUBAN4] +Tommy! Tommy, je t'aime, je t'aime! Allons-y! -[RCRWIN5:RCR] -~w~T'as fini tous les niveaux ! Recommence pour battre tes meilleurs temps au tour ! +[CUB4_J:CUBAN4] +Où ça? Je peux pas avoir un café d'abord? -[RCR1:RCR] -~w~1 +[CUB4_K:CUBAN4] +Pas le temps pour un café! D'ailleurs, je viens d'en prendre un! -[RCR2:RCR] -~w~2 +[CUB4_L:CUBAN4] +Faut qu'on liquide les Haïtiens! -[RCR3:RCR] -~w~3 +[CUB4_M:CUBAN4] +Tommy, tu sais comment on tue un serpent? -[RCRGO:RCR] -~w~GO ! +[CUB4_N:CUBAN4] +Tu le mords au cul! Ahahaha! -[RCBLAP:RCR] -Meilleur temps au tour : ~1~:~1~ +[CUB4_O:CUBAN4] +Si tu le dis, Umberto. -[RCBLAP1:RCR] -Meil. temps/tour : ~1~:0~1~ +[CUB4_P:CUBAN4] +Tommy, va nous trouver une petite bagnole haïtienne! -[RCBLA2:RCR] -Temps record au tour : ~1~:~1~ +[CUB4_Q:CUBAN4] +Dès que tu l'as, reviens récupérer mon petit -[RCBLA3:RCR] -Record temps/tour : ~1~:0~1~ +[CUB4_R:CUBAN4] +Pepe et emmène-le chez les Haïtiens. -[RCRRLA1:RCR] -~w~Nouveau record temps au tour : ~1~:~1~ +[CUB4_S:CUBAN4] +Ensuite, tu vas au centre de retraitement des Haïtiens et tu te sers de leurs solvants comme explosif. -[RCRRLA2:RCR] -~w~Nouv. record temps/tour : ~1~:0~1~ +[CUB4_T:CUBAN4] +Boom! Et bye bye! -[RCRACEA:RCR] -Thrashin' RC +[CUB4_U:CUBAN4] +Et toi, Umberto? -[RCRACEB:RCR] -Ragin' RC +[CUB4_V:CUBAN4] +Oh, je reste en arrière, je surveille le café avec papa. -[RCRACEC:RCR] -Chasin' RC +[CUB4_W:CUBAN4] +Il ne se sent pas très bien, tu sais. -[RCLE11:RCR] -Thrashin' RC NIVEAU 1 +[CUB4_02:CUBAN4] +~g~Les bombes ont un retardateur de 45 secondes. -[RCLE12:RCR] -Thrashin' RC NIVEAU 2 +[CUB4_04:CUBAN4] +~r~Tu as mis leur base en alerte! Plus question d'entrer, maintenant! -[RCLE13:RCR] -Thrashin' RC NIVEAU 3 +[CUB4_07:CUBAN4] +Les solvants sont à l'arrière, amigo. -[RCLE21:RCR] -Ragin' RC NIVEAU 1 +[CUB4_08:CUBAN4] +Hola, amigos. -[RCLE22:RCR] -Ragin' RC NIVEAU 2 +[CUB4_09:CUBAN4] +Bueno. Putains d'Haïtiens. Muerte. -[RCLE23:RCR] -Ragin' RC NIVEAU 3 +[CUB4_10:CUBAN4] +Vamos. -[RCLE31:RCR] -Chasin' RC NIVEAU 1 +[CUB4_11:CUBAN4] +Si, vamos. -[RCLE32:RCR] -Chasin' RC NIVEAU 2 +[CUB4_12:CUBAN4] +Hé, on a besoin d'une bagnole haïtienne! -[RCLE33:RCR] -Chasin' RC NIVEAU 3 +[CUB4_13:CUBAN4] +Bueno, allons trouver ces muchachos! -[RCRACE2:RCR] -~w~Essaie de battre les autres véhicules radiocommandés dans une course en ~1~ tour(s), autour du chantier ! +[CUB4_14:CUBAN4] +Suis mes amigos. -[RCRWIN6:RCR] -~w~Recommence la course pour battre ton meilleur temps au tour ! +[CUB4_15:CUBAN4] +Ok, tu entres... -[RCQUIT:RCR] -~r~Tes batteries sont à plat ? +[CUB4_16:CUBAN4] +Je vais poser la bombe, couvrez-moi! -[RCRFAIL:RCR] -~r~T'es pas arrivé premier ! +[CUB4_17:CUBAN4] +COURS! -[RCRLAP1:RCR] -~c~1ER ~w~TOUR +[CUB4_18:CUBAN4] +Mec, c'est un quartier cool... -[RCRLAP2:RCR] -~c~2E ~w~-TOUR +[CUB4_19:CUBAN4] +Cet endroit est une décharge, mec. -[RCRLAP3:RCR] -~c~3E ~w~TOUR +[CUB4_20:CUBAN4] +J'avais une belle copine... Elle vivait dans le coin. -[RCRLAP4:RCR] -~c~4E ~w~TOUR +[CUB4_21:CUBAN4] +Tu sais, ils font de super pizzas, ici! -[RCRWIN:RCR] -~w~Bravo, t'as gagné et inscrit le meilleur temps au tour, avec ~1~:~1~ ! Voici un bonus de 500$ ! +[CUB4_22:CUBAN4] +Hé, mec, tu conduis comme une putain de gonzesse! -[RCRWINB:RCR] -~w~Bravo, t'as gagné et inscrit le meilleur temps au tour, avec ~1~:0~1~ ! Voici un bonus de 500$ ! +[CUB4_23:CUBAN4] +T'es perdu, mec? -{=================================== MISSION TABLE TOUR ===================================} +[CUB4_24:CUBAN4] +T'as laissé Pepe derrière, va le récupérer! -[TOUR_H1:TOUR] -~w~Astuces photo : place-toi ~h~face~w~ au touriste, ~h~mais pas trop loin~w~. Veille à ce que ~h~le touriste et le décor~w~ soient bien sur la photo. +[CUB4_03:CUBAN4] +~g~Ne sors pas de la bagnole avant qu'elle soit garée en sécurité dans l'enceinte. -[TOUR_I2:TOUR] -~w~Tu obtiens des primes pour les photos de grande qualité ! +[CUB4_26:CUBAN4] +~g~Emmène Pepe, file au nord dans Little Haïti et fauche une bagnole Vaudou. -[TOUR_S0:TOUR] -~w~Il te reste ~h~~1~~w~ photos à prendre. +[CUB4_27:CUBAN4] +~g~Va retrouver Rico et les autres Cubains. -[TOUR_S1:TOUR] -~w~Il te reste une photo ! Tâche de pas la rater ! +[CUB4_28:CUBAN4] +~g~Va rejoindre les Cubains dans l'usine de dope haïtienne. -[TOUR_S2:TOUR] -~w~Ne gâche pas tes photos ! Il t'en reste ~h~~1~. +[CUB4_29:CUBAN4] +~g~Marche sur chacun des marqueurs pour y poser une bombe. -[TOUR_S4:TOUR] -~w~Tu dois bien cadrer le ~b~touriste~w~ ! Il te reste ~h~~1~~w~ photos à prendre. +[CUB4_30:CUBAN4] +~g~Une fois les trois bombes posées, sors de l'usine avant qu'elle n'explose. -[TOUR_F1:TOUR] -~r~Le touriste est mort ! +[CUB4_31:CUBAN4] +~g~Sors de l'usine! -[TOUR_F2:TOUR] -~r~T'as perdu le touriste ! +[CUB4_32:CUBAN4] +~g~Gare la bagnole à l'endroit du bip et descends. -[TOUR_F3:TOUR] -~r~T'as pas pris de photo du touriste ! +[CUB4_06:CUBAN4] +~r~Tu ne t'es pas assez éloigné de la base et on a dû annuler l'explosion! -[TOUR_F4:TOUR] -~r~T'avais plus assez de temps ! +{=================================== MISSION TABLE FINALE ===================================} -[TOUR_F5:TOUR] -~r~Mission Touriste annulée. +[FIN_1A:FINALE] +Amène-toi, putain de salopard de traître! -[TOUR_F6:TOUR] -~r~L'agresseur s'est tiré avec l'appareil photo du touriste ! +[FIN_1B:FINALE] +Tu vas crever, Judas de mes deux! -[TOUR_O1:TOUR] -~w~Emmène le touriste sur le ~y~lieu touristique. +[FIN_1C:FINALE] +C'est la dernière danse de Lance Vance! -[TOUR_O2:TOUR] -~w~Ne laisse pas tomber le ~b~touriste ! +[FIN_2B:FINALE] +Ah ouais, c'est ce que tu crois? -[TOUR_O3:TOUR] -~w~Suis le ~b~touriste~w~ à pied jusqu'au lieu de la photo. +[FIN_2C:FINALE] +J'ai dit que je l'avais assez entendu celle-là à l'école! -[TOUR_O4:TOUR] -~w~Utilise l'appareil photo du ~b~touriste~w~ pour prendre le cliché. +[FIN_3:FINALE] +Plus personne pour couvrir ton cul, hein, Tommy? -[TOUR_O5:TOUR] -~w~Ramène le touriste à l'~y~aéroport. +[FIN_4:FINALE] +T'es plus que du passé, Tommy, du passé! -[TOUR_O6:TOUR] -~w~Vite ! T'as plus beaucoup de temps ! +[FIN_5:FINALE] +T'as choisi le mauvais camp, Lance... -[TOUR_O7:TOUR] -~w~Récupère le ~b~touriste. +[FIN_11A:FINALE] +Tu m'as volé quinze ans de ma vie, Sonny... -[TOUR_O8:TOUR] -~w~Récupère le ~b~touriste~w~ suivant avant la fin du chrono. +[FIN_11B:FINALE] +Et je viens te présenter l'addition! -[TOUR_O9:TOUR] -~w~Tu devrais suivre le ~b~touriste~w~. Tu perds du temps ! +[FIN_12A:FINALE] +T'as encore rien compris! -[TOUR_OA:TOUR] -~w~Le ~b~touriste~w~ t'attend pour prendre la photo. Dépêche-toi, t'as plus beaucoup de temps ! +[FIN_12B:FINALE] +Tu m'appartiens, Tommy... -[TOUR_W1:TOUR] -~w~Paie reçue : ~h~~1~$~w~ Désolé, pas de bonus cette fois-ci. +[FIN_12C:FINALE] +C'est moi qui devait les faire ces quinze années! -[TOUR_W2:TOUR] -~w~Paie reçue : ~h~~1~$~w~ plus ~h~~1~$~w~ de bonus pour une bonne photo ! +[FIN_13:FINALE] +Attrapez-le, les mecs, il a jamais rien pigé. -[TOUR_W3:TOUR] -~w~Paie reçue : ~h~~1~$~w~ plus ~h~~1~$~w~ de bonus pour une super photo ! +[FIN1_01:FINALE] +Qu'est-ce qui se passe? -[TOUR_W4:TOUR] -~w~Paie reçue : ~h~~1~$~w~ plus ~h~~1~$~w~ de bonus pour une excellente photo ! +[FIN1_02:FINALE] +Tommy! Ah, bien, bien. Ecoute, écoute... Euh, écoute. -[TOUR_W5:TOUR] -~w~Bien joué ! T'as terminé toutes les missions 'Sights before Flights'. ~1~$ de bonus ! +[FIN1_03:FINALE] +J'aime bien les poissons. Ouais, j'adore le poisson! -[TOURDAM:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~emmène ce touriste à Cochrane Dam et prends une photo attestant de sa présence ! +[FIN1_04:FINALE] +Je l'aime à toutes les sauces, dans le bocal ou dans l'assiette, -[TOURBRI:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~cette dame veut voir Callahan Bridge, depuis Portland. +[FIN1_05:FINALE] +mais c'est pas parce que je l'aime que je veux dormir avec! -[TOURDRK:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~prends une photo de cette fan de cinéma devant la maison de l'acteur Black Lightman, sur Cedar Grove, à Shoreside Vale. +[FIN1_06:FINALE] +Et maintenant, il y a tes cousins ritals qui s'amènent pour me coller les pieds dans le béton, et je... -[TOURSTA:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~prends une photo de cette fan de sport devant le Liberty Memorial Coliseum, sur Staunton. +[FIN1_07:FINALE] +La ferme, Ken. Assis. -[TOURCHU:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~emmène ce pèlerin à la célèbre Liberty Cathedral, sur Staunton. +[FIN1_08:FINALE] +Lance, bordel, qu'est-ce qui se passe? -[TOURBCH:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~montre le merveilleux panorama de Portland Rock et de son phare depuis Portland Beach à cette touriste. +[FIN1_09:FINALE] +C'est tes amis du nord, Tommy... Ils ont pas aimé ce que t'as fait à leur mec. -[TOURCHI:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~l'ambiance orientale de Chinatown Plaza, à Portland, est la destination exotique que recherche ce touriste. +[FIN1_10:FINALE] +Ils s'amènent aujourd'hui pour régler cette affaire. -[TOURSHO:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~cette touriste veut que ses amies pensent qu'elle a fait son shopping au très chic Staunton Shopping Mall. Emmène-la sur place et prends-la en photo ! +[FIN1_11:FINALE] +Ils ont mis plus de temps que je pensais... -[TOURCAS:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~ce joueur invétéré veut que tu prennes sa photo devant le célèbre Casino sur Staunton. +[FIN1_12:FINALE] +Les mecs, faut en finir et faire comprendre à tout le monde que désormais, c'est mon business! LE MIEN! -[TOURMUS:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~cette universitaire veut visiter le Liberty City Museum sur Staunton, et obtenir une photo qui montre la taille impressionnante du bâtiment. +[FIN1_13:FINALE] +Ken, prend la première production de faux dollars et mets-en pour vingt millions dans des porte-documents. -[TOURHAL:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~ce touriste veut visiter l'hôtel de ville sur Staunton, une dernière fois avant de partir. +[FIN1_14:FINALE] +Lance, tu rassembles tout le monde... -[TOURRED:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~les amis de ce touriste prétendent qu'il n'a pas assez de cran pour visiter un club de striptease du quartier Red Light de Portland. Prouve-leur le contraire ! +[FIN2_01:FINALE] +Tommy! -[TOURMU0:TOUR] -~w~L'~r~agresseur~w~ a volé l'appareil photo ! Récupère-le ! +[FIN2_02:FINALE] +Quoi? T'embrasses pas ton vieux pote? -[TOURMU1:TOUR] -~w~Ca fait un criminel de moins dans les rues ! Ramasse l'~g~appareil photo ! +[FIN2_03:FINALE] +Ca fait quinze piges que je suis hors-circuit -[TOUR00:TOUR] -~w~Emmène le touriste au ~y~Cochrane Dam~w~, à Shoreside Vale. +[FIN2_04:FINALE] +et je suis un peu rouillé question étiquette. -[TOUR01:TOUR] -~w~Emmène la touriste au ~y~Liberty Memorial Coliseum~w~, sur Staunton. +[FIN2_05:FINALE] +Toujours la haine, hein, Tommy! -[TOUR02:TOUR] -~w~Emmène le touriste au ~y~Chinatown Plaza~w~, à Portland. +[FIN2_06:FINALE] +Je te l'avais pas dit que ton sale caractère te causerait des emmerdes? -[TOUR03:TOUR] -~w~Emmène le touriste à la ~y~Liberty Cathedral~w~, sur Staunton. +[FIN2_07:FINALE] +Il y a vingt millions là-dedans... -[TOUR06:TOUR] -~w~Emmène le touriste au ~y~club de striptease~w~ du Red Light District de Portland. +[FIN2_08:FINALE] +Combien ils étaient déjà? Dix, non onze... -[TOUR07:TOUR] -~w~Emmène le touriste au ~y~Liberty City Museum~w~, sur Staunton. +[FIN2_09:FINALE] +C'est pour ça qu'on t'a surnommé le boucher d'Hartwood! Hé hé hé! -[TOUR08:TOUR] -~w~Emmène le touriste au ~y~casino~w~, sur Staunton. +[FIN2_10:FINALE] +Tu m'avais envoyé buter un mec, un seul mec. Mais ils savaient que je venais, Sonny... -[TOUR10:TOUR] -~w~Emmène le touriste à l'~y~hôtel de ville~w~ de Staunton. +[FIN2_11:FINALE] +Fais gaffe à ce que tu dis... -[TOUR11:TOUR] -~w~Emmène le touriste à ~y~Portland Beach. +[FIN2_12:FINALE] +Quelqu'un pourrait penser que tu veux me coller sur le dos un malheureux concours de circonstances... -[TOUR04:TOUR] -~w~Emmène la touriste au ~y~Callahan Bridge~w~, côté Portland. +[FIN2_13:FINALE] +Prends simplement ce pognon... -[TOUR09:TOUR] -~w~Emmène la touriste voir la maison de l'acteur ~y~Black Lightman~w~, sur Cedar Grove, à Shoreside Vale. +[FIN2_14:FINALE] +Prendre le putain de fric? -[TOUR_I1:TOUR] -~w~Escorte des touristes jusqu'aux hauts lieux de Liberty City. +[FIN2_15:FINALE] +Tu sais, Tommy, j'ai fait ce que je pouvais pour toi, j'ai tiré des ficelles et demandé des services. -[TOUR_IA:TOUR] -~w~Une fois sur place, prends-les en photo. +[FIN2_16:FINALE] +J'étais ton pote, Tommy. J'espérais que tu entendrais raison et comprendrais ce qui est bon pour les affaires. -[TOUR_IB:TOUR] -~w~Puis ramène-les avant que leur avion ne décolle. +[FIN2_17:FINALE] +Je t'ai fait confiance, Tommy et je suis déçu... -[TOURMEM:TOUR] -~w~LIEU TOURISTIQUE ~1~ : ~w~ce vétéran veut rendre hommage à ses compagnons disparus au Liberty City War Memorial, à Belleville Park, sur Staunton. +[FIN2_18:FINALE] +Mais il y a au moins un mec dans ton organisation de merde qui s'y connaît en business, -[TOUR05:TOUR] -~w~Emmène le touriste au ~y~Liberty City War Memorial~w~ à Belleville Park, sur Staunton. +[FIN2_19:FINALE] +Pas vrai, Lance? + +[FIN2_20:FINALE] +Désolé, Tommy, On est à Vice City. C'est les affaires... + +[FIN2_21:FINALE] +Tu nous as vendus... + +[FIN2_22:FINALE] +Non, juste toi, Tommy, juste TOI. + +[FIN2_23:FINALE] +Le vrai pognon est en haut dans le coffre! + +[FIN2_24:FINALE] +Alors, Tommy, c'était quoi le grand plan? + +[FIN2_25:FINALE] +Tu croyais que j'allais simplement prendre les faux biftons? + +[FIN2_26:FINALE] +Sauver la face et m'enfuir la queue entre les jambes? + +[FIN2_27:FINALE] +Non. + +[FIN2_28:FINALE] +Je voulais juste te faire chier avant de te buter. + +[FIN3_01:FINALE] +Tommy? + +[FIN3_02:FINALE] +Oh, mon Dieu, Tommy! Qu'est-ce qui s'est passé? + +[FIN3_03:FINALE] +A ton avis? + +[FIN3_04:FINALE] +On dirait que t'as niqué ton costard! + +[FIN3_05:FINALE] +Sans compter qu'il était chouette, Tommy! Mais qu'est-ce qui s'est passé? + +[FIN3_06:FINALE] +J'ai eu un désaccord avec un partenaire commercial, tu sais comment c'est. + +[FIN3_07:FINALE] +Tommy, moi, quand j'ai un désaccord avec un partenaire commercial, je lui envoie une lettre enflammée... + +[FIN3_08:FINALE] +A la rigueur, je pisse dans sa boite aux lettres... Mais je commence pas la troisième guerre mondiale! + +[FIN3_09:FINALE] +Tu sais, tu devrais peut-être voir mon psy... + +[FIN3_10:FINALE] +Ce sale con de Lance... + +[FIN3_11:FINALE] +Tommy. J'ai jamais pu blairer ce mec, tu sais? + +[FIN3_12:FINALE] +C'est un névrosé dangereux et égocentrique. Un vrai salopard! + +[FIN3_13:FINALE] +Je suis bien content que tu l'aies liquidé! + +[FIN3_14:FINALE] +Je crois pas qu'on doive s'attendre à plus d'emmerdes en provenance du nord... + +[FIN3_15:FINALE] +... Parce qu'il y a plus de nord... + +[FIN3_16:FINALE] +Maintenant, il n'y a plus que le sud... + +[FIN3_17:FINALE] +Attends, est-ce que ça veut dire ce que je crois que ça veut dire, Tommy? + +[FIN3_18:FINALE] +Qu'est-ce que tu crois que ça veut dire? + +[FIN3_19:FINALE] +Qu'on est au commandement... Enfin, que tu es au commandement. Oh, Tommy... + +[FIN3_20:FINALE] +Tu sais, Ken, c'est peut-être le début d'une grande amitié en affaires... + +[FIN3_21:FINALE] +Après tout, t'es un voleur minable un peu magouilleur sur les bords... + +[FIN3_22:FINALE] +Et moi je suis un tueur psychotique doublé d'un dealer... + +[FIN3_23:FINALE] +Ouais. Si c'est pas grandiose! + +[FIN_B1:FINALE] +~g~Va tuer ~y~Vance~g~ le traître. + +[FIN_B2:FINALE] +~g~Trouve ~p~Sonni~g~ et règle-lui son compte pour de bon. + +[FIN_B3:FINALE] +~g~La mafia essaye de voler ton pognon. Défends le coffre. + +[FIN_B4:FINALE] +~g~Tu es presque mort. Va chercher ~w~de quoi te soigner~g~ en bas. + +[FIN_B5:FINALE] +~g~La mafia te vole ton pognon. Défends le ~c~coffre. + +[FIN_B7:FINALE] +~r~La mafia t'a volé tout ton pognon. + +[DEFSAFE:FINALE] +~g~Retourne au coffre et protège-le. + +{=================================== MISSION TABLE FIRETRK ===================================} + +[F_PASS1:FIRETRK] +Feu éteint! + +[F_FAIL2:FIRETRK] +~r~T'arrives trop tard! + +[F_CANC:FIRETRK] +~r~Mission pompier annulée! + +[F_EXTIN:FIRETRK] +INCENDIES : + +[F_START:FIRETRK] +~g~Véhicule en feu repéré dans le secteur ~a~. Va éteindre le feu. + +[SIREN_1:FIRETRK] +Pour déclencher la sirène de ce véhicule, appuie brièvement sur la ~h~~k~~VEHICLE_HORN~~w~. + +[SIREN_2:FIRETRK] +Pour déclencher la sirène de ce véhicule, appuie brièvement sur la ~h~~k~~VEHICLE_HORN~~w~. + +[FIREPRO:FIRETRK] +Mission Camion de pompiers niveau 12 réussie. T'es complètement ignifugé maintenant! + +[F_FAIL1:FIRETRK] +Mission Camion de pompiers achevée. + +[F_STAR1:FIRETRK] +~g~Véhicules en flammes dans la zone ~a~. Va éteindre l'incendie. + +[SPRAY_4:FIRETRK] { reVC update } +Utilise la touche ~h~~k~~VEHICLE_FIREWEAPON~ ~w~pour tirer avec le canon à eau et le ~h~~k~~VEHICLE_TURRETLEFT~~w~ et ~h~~k~~VEHICLE_TURRETRIGHT~~w~ pour viser. + +[SPRAY_1:FIRETRK] { reVC update } +Utilise la touche ~h~~k~~VEHICLE_FIREWEAPON~ ~w~pour tirer avec le canon à eau et le ~h~~k~~VEHICLE_TURRETLEFT~~w~ et ~h~~k~~VEHICLE_TURRETRIGHT~~w~ pour viser. + +{=================================== MISSION TABLE GENERA1 ===================================} + +[GEN1_A:GENERA1] +Mr. Vercetti! + +[GEN1_B:GENERA1] +Colonel. + +[GEN1_D:GENERA1] +Non merci. + +[GEN1_E:GENERA1] +Ca me gêne beaucoup d'admettre que la cause d'un de nos problèmes communs semble être un homme en qui j'avais confiance. + +[GEN1_F:GENERA1] +J'ai supporté Gonzalez pendant des années, mais son incompétence a atteint de nouveaux sommets. + +[GEN1_G:GENERA1] +Vous avez le droit de tuer Gonzalez... + +[GEN1_H:GENERA1] +C'est lui qui m'a entubé? La seule chose qui m'intéresse, c'est le pognon! + +[GEN1_I:GENERA1] +Je vous récompenserai pour ce service et nous chercherons ensuite votre argent ensemble. + +[GEN1_J:GENERA1] +Il sera dans son appartement, probablement à moitié saoul. Servez-vous de ça... + +[GEN1_06:GENERA1] +Hé! Il a une tronçonneuse! + +[GEN1_07:GENERA1] +T'approche pas de moi, connard! + +[GEN1_08:GENERA1] +Oh, mon Dieu, j'ai gâché ma vie et j'suis devenu un laidron! + +[GEN1_10:GENERA1] +Je vais t'faire fermer ta grande gueule une bonne fois pour toutes. + +[GEN1_11:GENERA1] +Essaye pas de t'enfuir, bâtard! + +[GEN1_12:GENERA1] +Laisse-toi faire et ça sera rapide! + +[GEN1_13:GENERA1] +Arrête de gueuler, ça intéresse personne! + +[GEN1_C:GENERA1] +Merci d'être venu. Asseyez-vous. Du homard? + +[GEN1_05:GENERA1] +~g~Va tuer Gonzales! + +[GEN1_09:GENERA1] +Je t'offre le double, Tommy, LE DOUBLE! + +[GEN1_18:GENERA1] +~r~Gonzalez a réussi à atteindre le poste de police vivant! + +[GEN1_19:GENERA1] +~g~Les flics de Vice City te cherchent! + +[GEN1_20:GENERA1] +~g~Monte dans une bagnole. + +[GEN1_21:GENERA1] +~g~Va au~h~ Pay 'N' Spray~g~ à~h~ Vice Point~g~. + +[GEN1_22:GENERA1] +~g~Conduis ton véhicule à l'intérieur de l'atelier de peinture pour perdre ton ~h~indice de recherche~g~, ~h~réparer ~g~et ~h~repeindre ~g~ton véhicule. Coût : ~h~$100~g~. Cette coup-ci, c'est gratuit. + +[GEN1_01:GENERA1] +Quand tu cours, maintiens la~h~ ~k~~PED_FIREWEAPON~~w~ enfoncée pour préparer une attaque au corps à corps. + +[GEN1_02:GENERA1] +Quand tu cours, maintiens la~h~ ~k~~PED_FIREWEAPON~~w~ enfoncée pour préparer une attaque au corps à corps. + +[GEN1_03:GENERA1] +Quand tu cours, maintiens la~h~ ~k~~PED_FIREWEAPON~~w~ enfoncée pour préparer une attaque au corps à corps. + +[GEN1_14:GENERA1] +Relâche la~h~ ~k~~PED_FIREWEAPON~~w~ pour attaquer. + +[GEN1_15:GENERA1] +Relâche la~h~ ~k~~PED_FIREWEAPON~~w~ pour attaquer. + +[GEN1_16:GENERA1] +Relâche la~h~ ~k~~PED_FIREWEAPON~~w~ pour attaquer. + +[GEN1_23:GENERA1] +~g~Franchis à nouveau les portes pour revenir au rez-de-chaussée. + +{=================================== MISSION TABLE GENERA2 ===================================} + +[COL2_A:GENERA2] +Tommy! Venez donc vous joindre à moi! + +[COL2_B:GENERA2] +Ca a l'air bon, hein! Un peu de museau de tapir? + +[COL2_C:GENERA2] +Euh... Non. Non, merci. + +[COL2_D:GENERA2] +Tommy, vous êtes comme le vent de la pampa qui m'a purifié de la puanteur de la corruption. + +[COL2_E:GENERA2] +Je dois cependant montrer que je pleure sa mort et continuer les affaires comme d'habitude. + +[COL2_F:GENERA2] +Ca me rapproche pas beaucoup de mon pognon... + +[COL2_G:GENERA2] +Tommy, mon cher, vous n'êtes pas à Liberty. Ici, ça se passe autrement. + +[COL2_H:GENERA2] +Je vais continuer mon enquête, mais en attendant, j'ai une bonne affaire à conclure. + +[COL2_I:GENERA2] +Un service à rendre à un ami, Cortez. + +[COL2_J:GENERA2] +Vous êtes un ami, Tommy. Je savais que vous ne me laisseriez pas tomber. + +[COL2_K:GENERA2] +Il faut que vous rencontriez un coursier qui m'a obtenu une technologie intéressante... + +[COL2_1:GENERA2] +Ah, la pluie est très dense en cette saison... + +[COL2_2:GENERA2] +Quoi? + +[COL2_3:GENERA2] +Ah, comment? + +[COL2_4:GENERA2] +Ecoute, Cortez m'envoie. File-moi ces putain de processeurs. + +[COL2_5:GENERA2] +Oh... D'accord. + +[COL2_B1:GENERA2] +~g~Retrouve le coursier au centre commercial. + +[COL2_B2:GENERA2] +~g~Le coursier se barre avec les processeurs de guidage. Ne le laisse pas filer! + +[COL2_B3:GENERA2] +~g~Ramène les processeurs de guidage au Colonel. + +[COL2_F1:GENERA2] +~r~T'as buté le contact! + +[COL2_F2:GENERA2] +~r~Le coursier est mort. Récupère les processeurs. + +[COL2_6A:GENERA2] +Arrête, espèce de porc impérialiste d'américain! Ceci est la propriété du gouvernement français! Rendez-le! + +[BLIPHLP:GENERA2] +Le bip sur le radar est un triangle pointant vers le haut, ce qui signifie que la cible est plus élevée que toi. + +[COL2_F3:GENERA2] +~r~Les processeurs de guidage sont au fond de la mer. + +[COL2_F4:GENERA2] +~r~Le coursier s'est fait la malle! Tu n'as pas récupéré les processeurs de guidage! + +{=================================== MISSION TABLE GENERA3 ===================================} + +[GEN3_49:GENERA3] +Santé de Lance: + +[GEN3_A:GENERA3] +Merci d'être venu, Thomas. + +[GEN3_B:GENERA3] +Pardonnez-moi d'en venir directement au fait... + +[GEN3_C:GENERA3] +Diaz m'a demandé de superviser une petite transaction... + +[GEN3_D:GENERA3] +Espérons que ça se passera mieux que l'autre fois, n'est-ce pas? + +[GEN3_E:GENERA3] +C'est pour ça que j'ai pensé à vous, amigo. + +[GEN3_F:GENERA3] +J'ai déposé une arme dans le parking à niveaux. + +[GEN3_G:GENERA3] +Récupèrez-le et allez surveiller les hommes de Diaz au rendez-vous. + +[GEN3_H:GENERA3] +Gracias, amigo... + +[GEN3_1:GENERA3] +On s'accapare toute l'action, à ce que je vois... + +[GEN3_2:GENERA3] +Ecoute, tu veux pas faire autre chose que de me suivre partout comme mon ombre? Pourquoi tu ne viens pas pour me montrer à quoi t'es bon? + +[GEN3_3:GENERA3] +Pourquoi pas... Au fait, moi c'est Lance. + +[GEN3_5:GENERA3] +Tu dois être le nouveau porte-flingues de Cortez. + +[GEN3_6:GENERA3] +Jusqu'à ce que de meilleures opportunités se présentent... + +[GEN3_7:GENERA3] +Ils seront là d'une minute à l'autre. On ferait mieux de se trouver une bonne planque... + +[GEN3_8:GENERA3] +OK! Je vais sur le balcon et toi tu t'mets sur le toit de l'autre côté de la cour. + +[GEN3_9:GENERA3] +J'suis vivant! Têtes de noeuds! Et ça c'est grâce à toi! C'est quoi ton nom? + +[GEN3_10:GENERA3] +Tommy. + +[GEN3_11:GENERA3] +On se reverra bientôt, je pense! + +[GEN3_12:GENERA3] +Bon, où est passé Lance? Merde... + +[GEN3_14:GENERA3] +Tommy! J'ai besoin d'un coup de main! + +[GEN3_15:GENERA3] +T'en fais pas, je te couvre! + +[GEN3_16:GENERA3] +Les hommes de Diaz se font massacrer! + +[GEN3_19:GENERA3] +~g~Les haïtiens! Ils veulent foutre le deal en l'air! Protège Diaz! + +[GEN3_20:GENERA3] +~g~Va au parking à niveaux où tu peux récupérer le flingue que le Colonel a laissé pour toi. + +[GEN3_22:GENERA3] +Santé de Diaz : + +[GEN3_23:GENERA3] +~g~T'as laissé Lance derrière! Va le chercher! + +[GEN3_25:GENERA3] +~r~Lance est mort! + +[GEN3_28:GENERA3] +~g~Ramène la serviette à Diaz. + +[GEN3_29:GENERA3] +~g~Récupère la serviette et ramène-la à Diaz. + +[GEN3_30:GENERA3] +~r~Il s'est barré avec le pognon! Diaz va te couper les couilles! + +[GEN3_33:GENERA3] +~r~Tu es supposé surveiller Diaz et ses hommes, pas les flinguer! + +[GEN3_34:GENERA3] +~r~Ils ne vont pas pouvoir faire affaire si tu descends les cubains! + +[GEN3_35:GENERA3] +~g~Il a volé le pognon de Diaz! + +[GEN3_36:GENERA3] +~g~Saute sur la moto, rattrape-le et récupère le pognon de Diaz! + +[GEN3_37:GENERA3] +~g~Voilà les Cubains. Surveille le deal en veillant à la sécurité de Diaz et de Lance. + +[GEN3_38:GENERA3] +~r~Diaz est mort! Tu devais le protéger! + +[GEN3_39:GENERA3] +~g~Prends position en haut des escaliers. + +[GEN3_44:GENERA3] +~g~Va avec Lance au rendez-vous et protège Diaz. + +[GEN3_40:GENERA3] { reVC update } +Pour ~h~tirer droit devant ~w~lorsque tu es en ~h~moto~w~, appuie sur la ~h~~k~~VEHICLE_FIREWEAPON~. + +[GEN3_41:GENERA3] { reVC update } +Pour ~h~tirer droit devant ~w~lorsque tu es en ~h~moto~w~, appuie sur la ~h~~k~~VEHICLE_FIREWEAPON~. + +[GEN3_46:GENERA3] +Chiiiier! + +[GEN3_47:GENERA3] +Tommy! + +[GEN3_48:GENERA3] +Merde! + +[GEN3_50:GENERA3] +~r~Tu as paumé le fric de Diaz! La prochaine fois, essaie de ne pas cramer le blé! + +[GEN3_51:GENERA3] +Encore des Haïtiens dans un camion merdique! + +[GEN3_54:GENERA3] +s Restez pas plantés là, bande d'abrutis! Butez-moi ce Haïtien de merde! + +[GEN3_55:GENERA3] +Tommy! Je reste là et je m'occupe de Diaz! + +[GEN3_18:GENERA3] +~g~Voilà les Cubains. Reste près de Diaz. Surveille les opérations tout en t'assurant que Diaz et Lance sont en sécurité. + +[GEN3_56:GENERA3] +~r~Diaz a été pris dans une embuscade et s'est fait tuer! La prochaine fois, ne le quitte pas des yeux! + +[GEN3_57:GENERA3] +Le Kruger est un fusil d'assaut permettant de viser manuellement à la 1ere personne. + +[GEN3_58:GENERA3] +Appuie sur la touche~h~ R1~w~ et maintiens-la enfoncée pour ~h~viser~w~ avec un fusil d'assaut. + +[GEN3_59:GENERA3] +Appuie sur la touche~h~ L1~w~ et maintiens-la enfoncée pour ~h~viser~w~ avec un fusil d'assaut. + +[GEN3_60:GENERA3] +Appuie sur la touche ~h~~k~~PED_FIREWEAPON~~w~ pour ~h~tirer~w~ avec un fusil d'assaut. + +[GEN3_61:GENERA3] +Appuie sur la touche ~h~~k~~PED_FIREWEAPON~~w~ pour ~h~tirer~w~ avec un fusil d'assaut. + +[GEN3_62:GENERA3] +Appuie sur la touche ~h~~k~~PED_FIREWEAPON~~w~ pour ~h~tirer~w~ avec un fusil d'assaut. + +[GEN3_63:GENERA3] +Tu peux fusiller des types de côté sur une ~h~ moto ~w~, mais également ~h~tirer droit devant~w~. + +[GEN3_64:GENERA3] { reVC update } +Appuie sur la touche ~h~~k~~VEHICLE_FIREWEAPON~~w~ pour tirer droit devant toi sur une moto. + +[GEN3_65:GENERA3] { reVC update } +Appuie sur la touche ~h~~k~~VEHICLE_FIREWEAPON~~w~ pour tirer droit devant toi sur une moto. + +[GEN3_66:GENERA3] { reVC update } +Appuie sur la touche ~h~~k~~VEHICLE_FIREWEAPON~~w~ pour tirer droit devant toi sur une moto. + +[GEN3_67:GENERA3] +Il te faut une mitrailleuse pour tirer droit devant toi sur une moto. + +[GEN3_53:GENERA3] +Mon argent! + +[GEN3_52:GENERA3] +Ces Haitiens pensent qu'ils peuvent se payer Ricardo Diaz! + +{=================================== MISSION TABLE GENERA4 ===================================} + +[DETON:GENERA4] +DETONATION : + +[COL4_3:GENERA4] +CONVOI, HALTE! + +[COL4_6:GENERA4] +ON EST SOUS LE FEU ENNEMI! + +[COL4_7:GENERA4] +Civil, éloigne-toi du char! + +[COL4_8:GENERA4] +J'ai dit, dégage! IMMEDIATEMENT! + +[COL4_9:GENERA4] +POSITIONS DEFENSIVES! + +[COL4_11:GENERA4] +Dégagez ce civil de notre chemin, soldat! -Chef, oui, chef! + +[COL4_12:GENERA4] +Un civil dans le char! ARRETEZ-LE! + +[COL4_13:GENERA4] +Ceci est un convoi militaire, ne bloquez pas la route! + +[COL4_14:GENERA4] +Descendez-le, soldat. + +[COL4_15:GENERA4] +Dégagez ce véhicule civil de la route! -Chef, on déplace le véhicule, chef! + +[COL4_17:GENERA4] +Ok, peloton, on dégage! + +[COL4_18:GENERA4] +Y'a quelqu'un dans le char, chef! + +[COL4_19:GENERA4] +Trouvez-moi quelques beignets, soldat! -Chef, oui, chef! + +[COL4_20:GENERA4] +Cible verrouillée, chef! + +[COL4_21:GENERA4] +TIREUR D'ELITE! + +[COL4_22:GENERA4] +Je me tire d'ici. + +[COL4_23:GENERA4] +Objectif atteint! Peloton, rompez! -Allons manger quelques beignets! + +[COL4_24:GENERA4] +Protocole de sécurité Delta India Echo déclenché! Autodestruction du véhicule initialisée! + +[COL4_26:GENERA4] +Prépare-toi à crever, ordure communiste! + +[COL4_B2:GENERA4] +~r~Le char est parvenu sans problème à destination! + +[COL4_B5:GENERA4] +~r~Le char est détruit! + +[COL4_01:GENERA4] +Diaz était très content et il veut vous voir. + +[COL4_02:GENERA4] +Et c'est une bonne chose? + +[COL4_03:GENERA4] +Evidemment! Même si je commence à penser que Diaz est responsable de notre malheureuse perte... + +[COL4_04:GENERA4] +Qu'est-ce qui vous fait dire ça? + +[COL4_05:GENERA4] +On n'accuse pas comme ça un homme comme Diaz... Je ne faisais que penser à haute voix... + +[COL4_06:GENERA4] +Quoi qu'il en soit, j'ai une proposition qui devrait vous intéresser... + +[COL4_07:GENERA4] +Je n'ai plus le temps de faire des commissions, Cortez. + +[COL4_08:GENERA4] +J'aurais pensé qu'un homme avec des dettes aussi délicates serait ouvert à toute opportunité. Mais écoutez quand même, Tommy. + +[COL4_09:GENERA4] +Allez-y... + +[COL410:GENERA4] +J'ai un acheteur pour une pièce d'artillerie qui est emmenée à travers la ville. Récupèrez-la pour moi. + +[COL411:GENERA4] +Et une fois que vous l'aurez, je veux que vous m'appeliez de suite, et... + +[COL4_B4:GENERA4] +~g~Le char est verrouillé. Trouve le moyen d'en faire sortir les occupants. + +[COL4_1:GENERA4] +Qu'est-ce qui se passe avec l'artilleur? - Aucune idée, chef! + +[COL4_4:GENERA4] +Montez voir, soldat! - Chef, oui, chef! + +[COL4_B1:GENERA4] +~g~Va faucher la pièce d'artillerie escortée à travers la ville. + +[COL4_B3:GENERA4] +~g~Amène le char dans le garage du colonel avant qu'il ne s'autodétruise. + +[COL4_B6:GENERA4] +~g~Trouve un moyen de piquer le char! + +[COL4_B7:GENERA4] +~g~Conduis le char dans le garage. + +[COL4_B8:GENERA4] +~g~Sors du char et du garage. + +{=================================== MISSION TABLE GENERA5 ===================================} + +[COL5A_1:GENERA5] +Les circonstances me forcent à un départ en hâte, amigo. + +[COL5A_2:GENERA5] +Quel est le problème? + +[COL5A_3:GENERA5] +Les français veulent récupérer leur technologie de missile et après le dernier incident, + +[COL5A_4:GENERA5] +je crois que l'heure est venue de me mettre à l'abri. + +[COL5A_5:GENERA5] +Ca serait pas plus sûr de partir en avion ? + +[COL5A_6:GENERA5] +Je serais mort avant d'avoir atteint l'enregistrement. D'ailleurs, il faut que je fasse sortir la marchandise du pays. + +[COL5A_7:GENERA5] +Besoin d'un autre flingue? + +[COL5A_8:GENERA5] +Vous, amigo, vous en valez dix... hahahaha. + +[COL5B_1:GENERA5] +Tommy, vous m'avez bien protégé et servi. + +[COL5B_2:GENERA5] +Mais maintenant, vous devez nous laisser avant qu'on arrive en pleine mer. + +[COL5B_4:GENERA5] +Merci, Colonel. + +[COL5B_5:GENERA5] +Une dernière chose, pendant que je suis parti, pouvez-vous surveiller Mercedes pour moi? + +[COL5B_6:GENERA5] +Je crois qu'elle peut se surveiller tout seule, mais soyez tranquille, je garderai l'oeil ouvert. + +[COL5B_7:GENERA5] +Merci, mon ami. Jusqu'à mon retour. + +[COL5B_8:GENERA5] +Adios, amigo. + +[COL5_7:GENERA5] +Arrêtez de me tirer dessus! + +[COL5_9:GENERA5] +Tommy, empêchez-les de me tirer dessus! + +[COL5_10:GENERA5] +J'ai l'immunité diplomatique! + +[COL5_11:GENERA5] +Ne tirez pas, je suis un Colonel! + +[COL5_12:GENERA5] +Tommy, descendez-les, mon pays vous en sera reconnaissant. + +[COL5_13:GENERA5] +Tommy, on est submergés par les Français! + +[COL5_14:GENERA5] +Tommy, il y a des Français partout! Je déteste ça! + +[COL5_15:GENERA5] +Tommy, comment ça va? + +[COL5_16:GENERA5] +Ca, c'est pour Piaf et Gainsbourg et votre saloperie de pain français! + +[COL5_1:GENERA5] +A bâbord! A bâbord! + +[COL5_2:GENERA5] +Ils attaquent à tribord! + +[COL5_3:GENERA5] +Le pont devant! + +[COL5_4:GENERA5] +Ils ont un hélico! + +[COL5_B1:GENERA5] +~g~Protège le colonel et son yacht à tout prix. + +[COL5_B2:GENERA5] +~g~Passe devant et dégage la route pour le yacht du colonel. + +[COL5_B3:GENERA5] +~r~Le colonel est mort! + +[COL5_B4:GENERA5] +~g~Abats l'hélicoptère vous tire dessus. + +[COL5B_3:GENERA5] +Je vous laisse ma vedette personnelle. Gardez-la en témoignage de ma gratitude! + +[COL5_B5:GENERA5] +~g~Descends les hélicos et protège bien le yacht. + +[COL5_B6:GENERA5] +~g~Tu n'as plus de munitions, va en chercher d'autres dans les escaliers du pont supérieur. + +[COL5_B7:GENERA5] +~g~Ta santé diminue. Régénère-la dans les escaliers du pont supérieur. + +{=================================== MISSION TABLE HAIT1 ===================================} + +[HAM1_A:HAIT1] +Bonjour? Y'a quelqu'un? + +[HAM1_B:HAIT1] +Entre, mon petit, et repose ton esprit. + +[HAM1_C:HAIT1] +Tu dois être le grand méchant homme dont m'a parlé mon grand-père. + +[HAM1_D:HAIT1] +Il me dit des choses sur toi, tu sais, quand il me rend visite + +[HAM1_E:HAIT1] +et aussi des choses sur les autres qui t'attendent. + +[HAM1_F:HAIT1] +Bon, nous sommes tous morts depuis longtemps, mais toi, + +[HAM1_G:HAIT1] +je ne voudrais pas être à ta place, hé hé hé! + +[HAM1_H:HAIT1] +J'ai reçu un message. De venir ici. + +[HAM1_I:HAIT1] +Tu les entends? + +[HAM1_J:HAIT1] +Ils crient ton nom, mon garçon, ils doivent vraiment te vouloir, tu ne crois pas? + +[HAM1_K:HAIT1] +Maintenant, si tu rends service à tata Poulet, peut-être qu'elle peut t'aider. + +[HAM1_L:HAIT1] +Peut-être qu'elle peut te donner un petit grigri après tout ça. + +[HAM1_M:HAIT1] +Te donner de la magie pour donner le mauvais oeil au policier, mmmm? + +[HAM1_N:HAIT1] +Ecoute, tout ça est très, hum... me donner quoi? + +[HAM1_O:HAIT1] +Je... Je crois que je me suis planté d'adresse... + +[HAM1_P:HAIT1] +Fais-ça pour moi, Tommy... + +[HAM1_Q:HAIT1] +Les Cubains, ces vilains coqs arrogants, hum, + +[HAM1_R:HAIT1] +ont fait des ennuis à mes adorables garçons haïtiens. + +[HAM1_S:HAIT1] +Et maintenant, ils ont dit au policier où je cachais mes poudres! + +[HAM1_T:HAIT1] +Ils pensent que c'est des drogues, les idiots! + +[HAM1_U:HAIT1] +Alors, sois un gentil garçon, Tommy, et va chercher les poudres de tata Poulet. + +[HAM1_V:HAIT1] +Oui, d'accord, d'accord. + +[HAM1_1:HAIT1] +~g~Les policiers se rapprochent des poudres! Va les récupérer avant eux! + +[HAM1_2:HAIT1] +~r~Les policiers ont trouvé la cachette les premiers! + +[HAM1_3:HAIT1] +~g~Ramène tout ça à la planque! + +[HAM1_4:HAIT1] +~g~Bien! Maintenant, la suivante! + +[HAM1_6:HAIT1] +~r~La cachette a été détruite, imbécile! + +[HAM1_7:HAIT1] +~g~Les policiers ont les poudres! Récupère-les avant qu'ils filent! + +[HAM1_8:HAIT1] +~g~Les flics sont en route pour récupérer les poudres, magne-toi! + +[HAT_1A:HAIT1] +~g~Bouge pas d'un poil, connard! + +{=================================== MISSION TABLE HAIT2 ===================================} + +[HAT2_B1:HAIT2] +~g~Va à la camionnette contenant les bombes volantes. + +[HAT2_B2:HAIT2] +Tue les Cubains... + +[HAT2_B4:HAIT2] +... Et détruis leurs bateaux! + +[HAT2_B5:HAIT2] +~g~Les Cubains essayent de s'enfuir! Ne les laisse pas faire! + +[HAT2_B6:HAIT2] +~r~L'avion télécommandé est hors de portée! + +[HAT2_B7:HAIT2] +~g~Un des Cubains s'échappe en voiture. Ne laisse aucun témoin! + +[HAT2_B8:HAIT2] +~r~Tu n'as plus d'avions télécommandés! + +[HAT2_B9:HAIT2] +Avions télécommandés : + +[HAT2_1:HAIT2] +Oh, désolé, j'ai dû me tromper d'adresse... + +[HAT2_2:HAIT2] +Eh bien, entre donc te détendre en buvant un peu de thé. + +[HAT2_3:HAIT2] +Tu as quelque chose pour moi, Tommy? + +[HAT2_4:HAIT2] +Ouais... + +[HAT2_5:HAIT2] +Cet endroit me semble familier. Un vague souvenir d'enfance, un air de déjà vu... + +[HAT2_6:HAIT2] +Tommy, je voudrais te demander de faire une petite commission pour moi... + +[HAT2_7:HAIT2] +Tu me rappelles quelqu'un que... + +[HAT2_8:HAIT2] +Les Cubains ont des bateaux très rapides qui leur servent à traverser les mers avec de la drogue. + +[HAT2_9:HAIT2] +C'est leur gagne-pain. + +[HAT2_10:HAIT2] +Mon neveu a fabriqué quelques bombes volantes pour nous en débarrasser. + +[HAT2_11:HAIT2] +Transforme leurs bateaux en allumettes! + +[HAT2_12:HAIT2] +Bon, merci pour le thé. + +[HAT2_B3:HAIT2] { reVC update } +Appuie sur la touche ~h~~k~~VEHICLE_FIREWEAPON~~w~ pour larguer une bombe ou sur ~h~~k~~VEHICLE_ENTER_EXIT~~w~ pour annuler. + +{=================================== MISSION TABLE HAIT3 ===================================} + +[HAM3_A:HAIT3] +Salut, euh, je... Je cherche quelqu'un dans le coin... + +[HAM3_B:HAIT3] +Tu as l'air d'avoir faim, Tommy. + +[HAM3_C:HAIT3] +On se connait? + +[HAM3_D:HAIT3] +Chut! + +[HAM3_E:HAIT3] +Encore une chose et je te laisse partir, Tommy. + +[HAM3_F:HAIT3] +Mes garçons sont en guerre contre les Cubains. + +[HAM3_G:HAIT3] +Mais pas de revolvers. + +[HAM3_H:HAIT3] +Hum, mais les Cubains ont une suprise qui les attend! + +[HAM3_I:HAIT3] +Pendant qu'ils se battent dans les rues, prends ce fusil et tue-les dans la confusion! + +[HAM3_J:HAIT3] +Personne ne te verra, personne ne t'entendra! + +[HAM3_K:HAIT3] +Si tu fais ça pour tata Poulet, Tommy, tu ne seras plus lié aux cordons de mon tablier! + +[HAM3_1:HAIT3] +~g~On doit gagner cette bataille! Si tous les Haïtiens meurent, c'est foutu! + +[HAM3_3:HAIT3] +~g~Les Cubains risquent de tricher, alors fais attention. + +[HAM3_4:HAIT3] +~r~Tu as été repéré! C'est foutu! + +[HAM3_5:HAIT3] +~g~Tu dois tuer les cubains de loin. Ne te fais pas voir. + +[HAM3_8:HAIT3] +~g~Les Haïtiens se font descendre! Vise mieux! + +[HAM3_7:HAIT3] +~g~Fais gaffe! Les Cubains ont amené des renforts. Liquide-les tous! + +[HAM3_2:HAIT3] +~r~Les Haïtiens sont morts! + +[HAM3_L:HAIT3] +Tata... + +{=================================== MISSION TABLE HOTEL ===================================} + +[INTB_A:HOTEL] +Tommy! Ca fait une paye! + +[INTB_B:HOTEL] +Salut Sonny... + +[INTB_C:HOTEL] +Je sais, je sais, t'es submergé par l'émotion, hein? + +[INTB_D:HOTEL] +Quinze piges et c'est comme si c'était hier! + +[INTB_E:HOTEL] +C'est une façon de voir les choses... + +[INTB_F:HOTEL] +Hé, bosser pour la famille, tu sais, c'est pas de la tarte, + +[INTB_G:HOTEL] +mais la famille veille toujours sur les siens, tu comprends? + +[INTB_H:HOTEL] +Bon, raconte un peu comment l'affaire s'est passée? Ca y est, t'es blindé? + +[INTB_I:HOTEL] +Ecoute, Sonny, on s'est fait piéger. C'était une embuscade. Et ils ont buté Harry et Lee. + +[INTB_J:HOTEL] +J'espère pour toi que tu rigoles, Tommy... Et t'as plutôt intérêt à toujours avoir le fric... + +[INTB_K:HOTEL] +... Non... Sonny... J'ai plus le fric... + +[INTB_L:HOTEL] +C'était mon fric, Tommy! MON FRIC!!! + +[INTB_M:HOTEL] +Vaudrait mieux pas que t'essayes de me baiser Tommy, parce que je suis pas le genre à aimer ça... + +[INTB_N:HOTEL] +Attend Sonny... + +[INTB_O:HOTEL] +Je te donne ma parole d'honneur que je vais récupérer ton fric et la dope. + +[INTB_P:HOTEL] +Et en prime, je t'enverrai les couilles de ceux qui ont fait ça! + +[INTB_Q:HOTEL] +Ca, je le sais déjà... Tommy, t'es pas con, mais je te préviens, moi non plus... + +[INTB_R:HOTEL] +Et si c'était pas toi, tu serais déjà mort... + +[INTB_S:HOTEL] +Mais j'ai un faible pour toi et en souvenir du passé, je vais te laisser t'en charger. + +[INTB_T:HOTEL] +T'en fais pas, Sonny, t'as ma parole! + +[INTB_U:HOTEL] +Je te tiens au courant, ciao. + +{=================================== MISSION TABLE ICECRE1 ===================================} + +[ICC1_4:ICECRE1] +~g~Il n'y a aucun client dans ce secteur. Essaye ailleurs. + +[ICC1_5:ICECRE1] +Deals effectués : + +[ICC1_7:ICECRE1] +~g~Tu reçois de l'argent pour chaque transaction faite, mais plus tu fais d'affaires, plus tu attires l'attention de la police. + +[ICC1_8:ICECRE1] +~g~Pour effectuer une transaction, ~h~gare ta camionnette ~g~et appuie sur la ~h~~k~~VEHICLE_HORN~ ~g~pour jouer le jingle et attirer les clients. + +[ICC1_9:ICECRE1] +~g~Les gangs locaux n'apprécient pas qu'on fasse des affaires sur leur territoire. Attends-toi à des représailles. + +[ICC1_10:ICECRE1] +~g~Tu as fait ~1~ deals! + +[ICC1_11:ICECRE1] +~g~Tu as fait ~1~ deals! + +[ICC1_13:ICECRE1] +~r~T'as fait aucun deal! + +[ICC1_14:ICECRE1] +USINE DE CREME GLACEE OK + +[ICC1_15:ICECRE1] +~g~L'usine de crème glacée génère dorénavant un revenu de $~1~ maximum. Pense à récupérer le fric régulièrement. + +[ICC1_16:ICECRE1] +~g~Utilise la camionnette de Mr Whoopee pour distribuer les produits Cherry Poppers dans Vice City. + +[ICE_AT1:ICECRE1] +USINE DE CREME GLACEE OK + +[ICE_AT2:ICECRE1] +~g~L'usine Cherry Popper génère dorénavant un revenu de $~1~ maximum. Pense à récupérer le fric régulièrement. + +[ICC1_17:ICECRE1] +Mission Distribution terminée + +[ICC1_18:ICECRE1] +Total des ventes de glaces : $~1~ + +[ICC1_19:ICECRE1] +Total de deals réalisés : ~1~ + +{=================================== MISSION TABLE ICECUT ===================================} + +[ICC1_A:ICECUT] +T'es qui toi? + +[ICC1_B:ICECUT] +Le nouveau proprio. + +[ICC1_C:ICECUT] +Est-ce que t'as déjà été enfant? + +[ICC1_D:ICECUT] +Mais de quoi tu parles? + +[ICC1_E:ICECUT] +As-tu été un gosse? + +[ICC1_F:ICECUT] +Ouais! Vas-y, c'est quoi ton problème? + +[ICC1_G:ICECUT] +Je le savais. Un chiard. + +[ICC1_H:ICECUT] +Un putain de gosse pourri gâté, un chialeur, un emmerdeur, un bébé à sa maman! + +[ICC1_I:ICECUT] +Un bébé... Un horrible et dégoûtant petit morveux. Ouin ouin. + +[ICC1_J:ICECUT] +Ta maman t'aime pas. Petite merde! + +[ICC1_K:ICECUT] +Hé! Calme-toi. + +[ICC1_L:ICECUT] +Je HAIS les mouflets et les mômes. + +[ICC1_M:ICECUT] +Ce sont des putains de pourris gâtés, de chialeurs, d'emmerdeurs... + +[ICC1_N:ICECUT] +Ca suffit maintenant! + +[ICC1_O:ICECUT] +C'est quoi ton problème? + +[ICC1_P:ICECUT] +Tu confectionnes des glaces, non? C'est un truc pour les gosses. + +[ICC1_Q:ICECUT] +T'es quoi comme genre de cinglé, toi? + +[ICC1_R:ICECUT] +Que je comprenne... A quoi ça sert de rendre les gosses heureux si tu les déteste? + +[ICC1_S:ICECUT] +Espèce d'abruti, petit curieux, fouinard- + +[ICC1_T:ICECUT] +La ferme! + +[ICC1_U:ICECUT] +-de merde! + +[ICC1_V:ICECUT] +Les glaces c'est une couverture. + +[ICC1_W:ICECUT] +On fait aussi dans autre chose que les produits laitiers. + +[ICC1_X:ICECUT] +Et si je vois un gosse, j'en fait mon affaire. + +[ICC1_Y:ICECUT] +N'est-ce pas, gamin? Ouais, c'est bien ça. Ta maman t'aime pas. + +[ICC1_Z:ICECUT] +Elle te DETESTE! + +[ICC1_ZA:ICECUT] +PROPRIETE ACQUISE! + +{=================================== MISSION TABLE INTRO ===================================} + +[INT1_A:INTRO] +Tommy Vercetti... Oh, merde! + +[INT1_B:INTRO] +J'pensais pas qu'ils le laisseraient sortir un jour... + +[INT1_C:INTRO] +Il a gardé un profil bas, pour se faire oublier... + +[INT1_D:INTRO] +Mais les gens vont vite retrouver la mémoire + +[INT1_E:INTRO] +quand ils vont le voir débouler dans les rues du voisinage. + +[INT1_F:INTRO] +Et ça va pas être bon pour les affaires... + +[INT1_G:INTRO] +Et alors, qu'est-ce qu'on va faire, Sonny? + +[INT1_H:INTRO] +On le traite comme un vieil ami et on lui trouve de quoi s'occuper en-dehors de la ville. OK? + +[INT1_I:INTRO] +On parlait justement de s'étendre vers le sud... Pas vrai? + +[INT1_J:INTRO] +Vice City, c'est du 24 carats, maintenant. + +[INT1_K:INTRO] +Les colombiens, les mexicains... Putain, + +[INT1_L:INTRO] +même les réfugiés cubains se taillent une belle part du gâteau! + +[INT1_M:INTRO] +Mais ils font tous dans la dope, Sonny! + +[INT1_N:INTRO] +Aucune famille ne touche à cette merde! + +[INT1_O:INTRO] +Les temps changent... + +[INT1_P:INTRO] +Les familles ne peuvent pas rester les bras croisés pendant que nos adversaires ramassent le jackpot. + +[INT1_Q:INTRO] +Alors, on envoie un mec là-bas faire le sale boulot + +[INT1_R:INTRO] +et pour nous en tailler une bonne part. OK? + +[INT1_S:INTRO] +C'est qui, notre contact là-bas? + +[INT1_T:INTRO] +Ken Rosenberg, le con d'avocat... + +[INT1_U:INTRO] +Et comment il va faire pour tenir Vercetti en laisse? + +[INT1_V:INTRO] +Il aura pas besoin de faire ça. + +[INT1_W:INTRO] +On le lâche juste dans Vice City + +[INT1_X:INTRO] +et on lui refile un peu de cash pour commencer. OK? + +[INT1_Y:INTRO] +Donne-lui quelques mois... + +[INT1_Z:INTRO] +Et puis, on descendra + +[INT1_A1:INTRO] +lui rendre une petite visite, tu saisis? + +[INT1_A2:INTRO] +Histoire de voir comment il se débrouille... + +[INT2_A:INTRO] +Hey, salut les gars, c'est moi, Ken Rosenberg! Hé ! Super! + +[INT2_B:INTRO] +Bon, euh, je vais vous conduire au rendez-vous, ok? + +[INT2_C:INTRO] +J'ai parlé avec les fournisseurs, ils sont très, hé hé, + +[INT2_D:INTRO] +très impatients de commencer cette affaire, et... euh, + +[INT2_E:INTRO] +si tout se passe sans accroc, on devrait... euh, + +[INT2_F:INTRO] +s'en mettre plein les poches, ce qui est vraiment, vous savez... + +[INT2_G:INTRO] +une bonne chose... + +[INT2_H:INTRO] +Ok. Bon, ils sont frères, ok. + +[INT2_I:INTRO] +Il y en a un qui fait marcher... euh, l'affaire + +[INT2_J:INTRO] +et l'autre qui s'occupe du transport en hélicoptère. + +[INT2_K:INTRO] +Maintenant, ils opèrent du Mexique, + +[INT3_A:INTRO] +Ok, c'est eux, dans l'hélico. + +[INT3_B:INTRO] +Bon, voilà le deal. + +[INT3_C:INTRO] +Ils veulent un échange en terrain découvert. + +[INT3_D:INTRO] +OK? Bon, allons-y et restez groupés. + +[INT3_E:INTRO] +Bon, personne s'énerve, maintenant. + +[INT3_F:INTRO] +Je suis ici! Le moteur tourne! + +[INT3_G:INTRO] +Tu l'as? + +[INT3_H:INTRO] +De la colombienne 100% pure, la meilleure qualité, amigo. + +[INT3_I:INTRO] +Les billets? + +[INT3_J:INTRO] +Des 10 et des 20... usagés. + +[INT3_L:INTRO] +Allez! Sors-nous de là! Roule! + +[INTRO1:INTRO] +Je sors la tête d'un caniveau pour une seconde de défonce, et le destin me chie de la merde plein la gueule! + +[INTRO2:INTRO] +Va roupiller. + +[INTRO3:INTRO] +Qu'est-ce que tu vas faire? + +[INTRO4:INTRO] +Je passerai à ton bureau demain et on essayera de trouver une solution à ce merdier. + +[INT3_K:INTRO] +Je crois que nous allons faire affaire, amigo, hé hé hé! + +[INT3_M:INTRO] +Laisse-moi voir. + +[INT2_L:INTRO] +non, non, non, attends... + +{=================================== MISSION TABLE KENT1 ===================================} + +[KPM1_A:KENT1] +D'accord, mon vieux, je vais sauver ton petit ami. + +[KPM1_B:KENT1] +De quoi tu m'causes? + +[KPM1_C:KENT1] +Tu connais ce branleur, Diaz, la grande gueule... + +[KPM1_D:KENT1] +Il a ton pote, Lance. Il paraît que celui-ci a essayé de lui sauter sur le poil. + +[KPM1_E:KENT1] +Mais il a pas sauté assez haut, si tu vois ce que je veux dire... + +[KPM1_F:KENT1] +Où il l'a emmené? Et tourne pas autour du pot! + +[KPM1_G:KENT1] +T'énerve pas! Ils l'ont emmené de l'autre côté de la ville, à la décharge. + +[KPM1_H:KENT1] +Putain... Pauvre cinglé... + +[KPM1_2:KENT1] +~r~Tu étais supposé sortir Lance vivant de ce guêpier! + +[KPM1_3:KENT1] +SANTE DE LANCE : + +[RESC_1:KENT1] +Tu peux te servir d'un flingue? + +[RESC_2:KENT1] +Ouais... je pense... Content de te voir moi aussi. + +[RESC_3:KENT1] +Sortons de là! + +[RESC_4:KENT1] +Ca fout tous mes plans en l'air, tes conneries. Cette fois-ci, t'as vraiment merdé pour de bon, Lance! + +[RESC_5:KENT1] +Il a descendu mon frère! Tu croyais que j'allais faire quoi? Lui tondre sa pelouse? + +[RESC_6:KENT1] +Va falloir qu'on liquide ce connard de Diaz avant qu'il en fasse autant avec nous. + +[RESC_7:KENT1] +Va récupérer et retrouve-moi sur le pont de Star Island. Ok? + +[RESC_8:KENT1] +OK. + +[KPM1_1:KENT1] +~g~Lance est retenu prisonnier dans la décharge. Va le sauver! + +[KPM1_4:KENT1] +~g~Amène Lance à l'hosto! + +[M_PASSN:KENT1] +MISSION TERMINEE! + +[KPM1_5:KENT1] +~g~Les mecs de Diaz sont après toi, amène Lance à l'hosto. + +{=================================== MISSION TABLE KICKSTT ===================================} + +[KICK1_2:KICKSTT] +~r~Tu n'as pas récupéré la moto assez vite! + +[KICK1_7:KICKSTT] +~r~Tu as niqué la moto! + +[KICK1_8:KICKSTT] +~g~Monte sur la moto! + +[KICK1_T:KICKSTT] +TEMPS PRIS : + +[KICKTM:KICKSTT] +~b~TEMPS DE L'EPREUVE : ~1~:~1~ + +[KICKTM2:KICKSTT] +~b~TEMPS DE L'EPREUVE : ~1~:0~1~ + +[GETBIKE:KICKSTT] +~g~Il te reste ~1~ secondes pour retourner à une moto avant la fin de la mission. + +[KICK1_1:KICKSTT] +~g~Termine le parcours aussi vite que possible. + +[KICK1_6:KICKSTT] +~g~Bien joué! + +[KICK_10:KICKSTT] +~g~Utilise la Sanchez pour terminer le parcours sans oublier aucun point de passage. + +[KICK_12:KICKSTT] +~r~Tu t'es dégonflé! + +[KICK_13:KICKSTT] +~r~T'as mis trop de temps! + +[KICK_11:KICKSTT] +~g~Pour quitter la mission, marche sur le ~q~marqueur rose~g~. + +{=================================== MISSION TABLE LAWYER1 ===================================} + +[LAW1_A:LAWYER1] +Va roupiller, qu'il m'a dit - + +[LAW1_B:LAWYER1] +- et je suis resté toute la nuit le cul vissé sur cette chaise dans le noir à boire du café! + +[LAW1_C:LAWYER1] +C'est la merde. On est baisés jusqu'à l'os, mon pote! + +[LAW1_D:LAWYER1] +Ecoute-moi, ces balaises, ils vont débarquer ici pour m'arracher la tête! C'est pas possible! + +[LAW1_E:LAWYER1] +J'me suis pas tapé l'école de droit pour ça! Putain, qu'est-ce qu'on va faire maintenant? + +[LAW1_F:LAWYER1] +Ferme-la, pose ton cul et détends-toi. Je vais te dire ce qu'on va faire. + +[LAW1_G:LAWYER1] +Faut que tu trouves les types qui nous ont fauché la coke et après je les descends. + +[LAW1_H:LAWYER1] +Bonne idée. Excellente idée. Laisse-moi réfléchir, laisse-moi réfléchir. + +[LAW1_I:LAWYER1] +Je sais! Il y a ce Colonel à la retraite, le Colonel Juan Garcia Cortez. + +[LAW1_J:LAWYER1] +C'est lui qui m'a aidé à organiser l'affaire + +[LAW1_K:LAWYER1] +en-dehors des truands établis de Vice City. Ok? + +[LAW1_L:LAWYER1] +Maintenant, écoute. Il organise une fiesta dans la baie, sur son yatch du luxe + +[LAW1_M:LAWYER1] +et tous les gros pontes de Vice City seront là! + +[LAW1_N:LAWYER1] +J'ai une invitation, bien sûr que j'ai une invitation, + +[LAW1_O:LAWYER1] +mais il est pas question que je sorte d'ici. Non, pas question! + +[LAW1_P:LAWYER1] +Ferme-la, je t'ai dit! Je vais y aller moi-même... + +[LAW1_Q:LAWYER1] +Attends deux secondes! Tu sais, moi aussi, j'aime bien 1978, mais là, c'est pas une soirée bière et striptease... + +[LAW1_R:LAWYER1] +Je veux dire, sans vouloir t'offenser, hein, tu risque de te faire refouler à l'entrée, quoi... + +[LAW1_S:LAWYER1] +Y'a un problème avec mes fringues? + +[LAW1_T:LAWYER1] +Bon, écoute. Fais un saut chez Rafael, dis-lui que tu viens de ma part et il te relookera. + +[LAW1_U:LAWYER1] +Ok, allez, vas-y... + +[LAWP_1:LAWYER1] +Buenas noches. + +[LAWP_2:LAWYER1] +Si je comprends bien, c'est M. Rosenberg qui vous envoie. + +[LAWP_3:LAWYER1] +J'espère que de récents problèmes n'ont pas affecté sa santé, ou ... hum... + +[LAWP_4:LAWYER1] +son équilibre mental, M....? + +[LAWP_5:LAWYER1] +Vercetti. Il fait simplement un peu... d'agoraphobie. + +[LAWP_6:LAWYER1] +Excellent, excellent. Et vous? + +[LAWP_7:LAWYER1] +Je veux juste ma marchandise. + +[LAWP_8:LAWYER1] +Ah. C'est un malheureux concours de circonstances pour toutes les personnes impliquées... + +[LAWP_9:LAWYER1] +Bien entendu, j'ai de mon côté ordonné une enquête... + +[LAWP_10:LAWYER1] +Mais c'est un problème délicat qui nécessite du temps... + +[LAWP_11:LAWYER1] +Peut-être en reparlerons-nous plus tard, voulez-vous? + +[LAWP_12:LAWYER1] +En attendant, laissez-moi vous présenter ma fille... + +[LAWP_13:LAWYER1] +Mercedes! + +[LAWP_14:LAWYER1] +Caramia, pourrais-tu t'occuper de notre invité pendant que je m'occupe des autres convives? + +[LAWP_15:LAWYER1] +D'accord, papa. + +[LAWP_16:LAWYER1] +Veuillez m'excuser... + +[LAWP_17:LAWYER1] +Mercedes? + +[LAWP_18:LAWYER1] +Et il faut vivre avec ça... + +[LAWP_19:LAWYER1] +Quoi qu'il en soit, laissez-moi vous montrer quelques uns de nos distingués invités... + +[LAWP_20:LAWYER1] +Celui-ci est le membre du congrès Alex Shrub accompagné par la star montante siliconée Candy Suxxx... + +[LAWP_21:LAWYER1] +Et connaissez-vous ma charmante femme Laura? Non? + +[LAWP_22:LAWYER1] +Eh bien, malheureusement, elle est en Alabama, voici Candy. + +[LAWP_23:LAWYER1] +Et là-bas, nous avons l'ailier vedette des Mambas de Vice City, BJ. + +[LAWP_24:LAWYER1] +toujours aussi charmeur + +[LAWP_25:LAWYER1] +Mais je l'ai plaqué et mis dans une chaise roulante! + +[LAWP_26:LAWYER1] +Ha ha! Excellent! + +[LAWP_27:LAWYER1] +En ce moment, je cherche une nouvelle propriété de luxe. + +[LAWP_28:LAWYER1] +Et ce molusque c'est Jezz Torrent, + +[LAWP_29:LAWYER1] +Le chanteur principal des Love Fist. + +[LAWP_30:LAWYER1] +Savez-vous... comment ils jouent au ping-pong, en Thaïlande? + +[LAWP_31:LAWYER1] +Je vais vous le dire... + +[LAWP_32:LAWYER1] +Ils n'utilisent pas de raquettes, si vous voyez ce que je veux dire! + +[LAWP_33:LAWYER1] +L'impotent. + +[LAWP_34:LAWYER1] +Et le trio bavard. + +[LAWP_35:LAWYER1] +Cette outre à sueur ronflante est le bras droit handicapé de papa, Gonzales. + +[LAWP_36:LAWYER1] +Les deux autres sont le Pasteur Richards + +[LAWP_37:LAWYER1] +et un réalisateur pseudo intellectuel nommé Steve Scott. + +[LAWP_38:LAWYER1] +...passion avec les envahisseuses nymphomanes, + +[LAWP_39:LAWYER1] +Le requin géant s'amène et + +[LAWP_40:LAWYER1] +il leur bouffe simplement les couilles! + +[LAWP_41:LAWYER1] +Ah, c'est là. Vous n'avez jamais vu un truc pareil avant, hein? + +[LAWP_42:LAWYER1] +Colonel! + +[LAWP_43:LAWYER1] +Vos fêtes sont toujours aussi réussies, hahahahha! + +[LAWP_44:LAWYER1] +Je ne puis que m'excuser de mon arrivée tardive. + +[LAWP_45:LAWYER1] +Ah, de nada amigo. Comment allez-vous? + +[LAWP_46:LAWYER1] +Nos affaires sont très difficile - Les barbares sont aux portes de la ville. + +[LAWP_47:LAWYER1] +L'heure est venue de récompenser les amis et de liquider les ennemis, amigo. + +[LAWP_48:LAWYER1] +C'est qui, la grande gueule? + +[LAWP_49:LAWYER1] +Ricardo Diaz, c'est Mr.Coke. + +[LAWP_50:LAWYER1] +Mercedes! + +[LAWP_51:LAWYER1] +Oh, je raccompagnais justement mon ami en ville. + +[LAWP_52:LAWYER1] +Une autre fois, Ricardo! + +[LAWP_53:LAWYER1] +Partons d'ici! + +[LAWP_54:LAWYER1] +En fait, emmenez-moi plutôt au Pole Position club. + +[LAW1_2:LAWYER1] +~g~Va au yatch du Colonel. + +[LAW1_4:LAWYER1] +~r~Tu as tué la fille du Colonel! + +[LAW1_5:LAWYER1] +Vous allez travailler pour mon père? + +[LAW1_6:LAWYER1] +Peut-être. + +[LAW1_7:LAWYER1] +Ca vous ennuie si je pose ma main sur votre genou? + +[LAW1_8:LAWYER1] +Peut-être... + +[LAW1_9:LAWYER1] +C'est trop dur d'avoir un père riche et puissant! Vamos! + +[LAW1_10:LAWYER1] +A plus tard, mon mignon! + +[LAW1_11:LAWYER1] +Sans aucun doute. + +[LAW1_12:LAWYER1] +Mmmm... Chouette bécane. + +[LAW1_13:LAWYER1] +Non! Ma moto! + +[LAW1_3:LAWYER1] +~g~Emmène la fille du Colonel au Pole Position Club. + +[HELP20:LAWYER1] +Suis le ~h~point T-shirt~w~ sur le radar pour trouver Rafael. + +[LAW1_14:LAWYER1] +Mmmm, j'aime beaucoup ta grosse moto. + +[LAW1_15:LAWYER1] +Ouais, bébé, je viens de piquer ça à ce con + +{=================================== MISSION TABLE LAWYER2 ===================================} + +[LAW2_A:LAWYER2] +Ah! Eh bien, j'espère que tu t'es bien amusé! Parce que moi, je suis mort d'inquiétude! Qu'est-ce que t'as trouvé? + +[LAW2_B:LAWYER2] +Qu'y'a plus de criminels dans cette ville qu'en taule. Faut qu'on trouve une piste dans la rue. + +[LAW2_C:LAWYER2] +Attends, laisse-moi réfléchir, voyons... + +[LAW2_D:LAWYER2] +Ah! J'ai trouvé! + +[LAW2_E:LAWYER2] +Bon, il y a bien cet anglais, une espèce de déchet du biz de la musique, + +[LAW2_F:LAWYER2] +il est connu sous le nom de Kent Paul. + +[LAW2_G:LAWYER2] +Quoi qu'il en soit, il a le nez plongé dans la merde de Vice City depuis un moment + +[LAW2_H:LAWYER2] +et ça, si quelqu'un sait où sont les 20 kilos de coke, + +[LAW2_I:LAWYER2] +c'est bien lui, ok? Il est toujours fourré au Malibu... + +[LAW2_J:LAWYER2] +Je vais aller lui rendre une petite visite... + +[LAW2B_A:LAWYER2] +D'où tu sors, toi? + +[LAW2B_B:LAWYER2] +Je cherche un oiseau dans ton genre depuis une éternité... + +[LAW2B_C:LAWYER2] +Kent Paul, mon pote. Ouais, dans le coin, c'est moi le patron. + +[LAW2B_D:LAWYER2] +Je cherche un Anglais... + +[LAW2B_E:LAWYER2] +Je résouds les problèmes, si tu vois ce que je veux dire? + +[LAW2B_F:LAWYER2] +Je vais m'occuper de toi. Quoi que tu demandes, tu l'auras... + +[LAW2B_G:LAWYER2] +Ne t'inquiéte absolument de rien. + +[LAW2B_H:LAWYER2] +Dégage, chérie! + +[LAW2B_I:LAWYER2] +Hé hé hé hé hé! + +[LAW2B_J:LAWYER2] +C'est toi, Kent Paul? Je suis un pote de Rosenberg... + +[LAW2B_K:LAWYER2] +Rosenberg...Rosenberg... Ah, ce cinglé qui poursuit les ambulances! + +[LAW2B_L:LAWYER2] +Ce mec peut défendre un innocent jusqu'au couloir de la mort! + +[LAW2B_M:LAWYER2] +Donne-nous un autre verre! + +[LAW2B_N:LAWYER2] +On est tous des comédiens. + +[LAW2B_O:LAWYER2] +Ecoute-moi, il me manque vingt kilos et un gros tas de pognon... + +[LAW2B_P:LAWYER2] +Une affaire de drogue? C'est toujours des pièges à con... + +[LAW2B_Q:LAWYER2] +Qu'est-ce que tu sais à ce propos? + +[LAW2B_R:LAWYER2] +Hé! Hé! Là où je voulais en venir, + +[LAW2B_S:LAWYER2] +c'est à un cuisinier-trompettiste qui deale à l'extérieur de la cuisine d'un hôtel sur Ocean Drive. + +[LAW2B_T:LAWYER2] +Il avait l'air très content de lui, ces derniers temps. Tu pourrais peut-être aller voir ça de plus près... + +[LAW2B_U:LAWYER2] +Bon, je vais y aller. A plus tard. + +[LAW2B_V:LAWYER2] +Ouais, c'est ça. Allez, dégage, imbécile ou je te botte le cul! + +[LAW2B_W:LAWYER2] +Donne-moi à boire et putain, où est cette salope? + +[LAW2C_A:LAWYER2] +Ouais, c'est bien, massacre-le, ça devrait le rendre plus bavard. + +[LAW2C_B:LAWYER2] +T'en veux aussi? + +[LAW2C_C:LAWYER2] +Hé, relax, je veux la même chose que toi, mon frère. + +[LAW2C_D:LAWYER2] +Ah ouais? Et c'est quoi? + +[LAW2C_E:LAWYER2] +Ton fric et la blanche de mon regretté frère. Malheureusement, tu viens de refroidir notre piste. + +[LAW2C_F:LAWYER2] +C'était un accident. Dégage. + +[LAW2C_G:LAWYER2] +Hé, hé! Pas la peine de jouer les justiciers solitaires avec moi! + +[LAW2C_H:LAWYER2] +Voilà comment je vois les choses... On est deux mecs dans une ville étrange. Et on a besoin de veiller l'un sur l'autre. + +[LAW2C_I:LAWYER2] +J'ai pas besoin de toi, mon frère... + +[LAW2C_J:LAWYER2] +T'en es sûr? Tiens, attrape! + +[LAW2C_K:LAWYER2] +Suis-moi! + +[LAW2_1:LAWYER2] +Qu'est-ce que tu regardes? + +[LAW2_2:LAWYER2] +Tu ferais mieux de commencer à causer... + +[LAW2_3:LAWYER2] +Suce-moi, connard! + +[LAW2_4:LAWYER2] +Par là! + +[LAW2_5:LAWYER2] +Je vais voir ce que je peux trouver. Je garde un oeil sur toi, Tommy. + +[LAW2_6:LAWYER2] +~g~Va au Malibu Club et trouve Kent Paul. + +[LAW2_7:LAWYER2] +~g~Trouve le cuisinier sur Ocean Drive. + +[LAW2_10:LAWYER2] +~g~Retourne à l'hôtel. + +[LAW2_11:LAWYER2] +~g~Ramasse son portable! + +[LAW2_12:LAWYER2] +Portable acquis! Tu peux maintenant recevoir des coups de fil. + +[LAW2_13:LAWYER2] +~g~Tu as laissé Lance derrière! Va le chercher! + +[LAW2_14:LAWYER2] +On doit foutre le camp d'ici! + +[GUN_2A:LAWYER2] +Maintiens la ~h~~k~~PED_LOCK_TARGET~ ~w~enfoncée pour ~h~viser automatiquement~w~. Appuie sur la~h~ ~k~~PED_FIREWEAPON~~w~ pour ~h~tirer! + +[GUN_2C:LAWYER2] +Maintiens la ~h~~k~~PED_LOCK_TARGET~ ~w~enfoncée pour ~h~viser automatiquement~w~. Appuie sur la~h~ ~k~~PED_FIREWEAPON~~w~ pour ~h~tirer! + +[GUN_2D:LAWYER2] +Maintiens la ~h~~k~~PED_LOCK_TARGET~ ~w~enfoncée pour ~h~viser automatiquement~w~. Appuie sur la~h~ ~k~~PED_FIREWEAPON~~w~ pour ~h~tirer! + +[HELP17:LAWYER2] +Appuie sur la~h~ ~k~~PED_FIREWEAPON~ ~w~pour attaquer le chef. + +[HELP18:LAWYER2] +Appuie sur la~h~ ~k~~PED_FIREWEAPON~~w~ pour attaquer le chef. + +[LAW3_11:LAWYER2] +Place-toi sur le ~q~marqueur rose~w~ pour consulter les armes en vente. + +[LAW3_12:LAWYER2] +Tu peux sélectionner des armes en appuyant sur ~h~gauche~w~ ou ~h~droite~w~ de la ~h~touche directionnelle. + +[LAW3_13:LAWYER2] +Si tu as assez de blé, tu peux acheter des armes en appuyant sur la ~h~~k~~PED_SPRINT~. + +[LAW3_14:LAWYER2] +Tu peux sortir du magasin en appuyant sur la ~h~~k~~VEHICLE_ENTER_EXIT~. + +[LAW3_15:LAWYER2] +Suis le ~h~point pistolet~w~ sur le radar pour trouver ~h~Ammu-Nation + +[LAW2_15:LAWYER2] +~g~Va chez Ammu-Nation. + +[LAW2_K:LAWYER2] +calme-toi, maintenant. + +[LAW2_16:LAWYER2] +Il faut que tu comprennes un truc sur cette ville. Tu dois toujours avoir un flingue sur toi. + +[LAW2_17:LAWYER2] +Allez, l'armurerie du coin n'est qu'à quelques pas d'ici. + +[LAW2_18:LAWYER2] +Tommy, tout le monde a besoin de se la couler douce de temps en temps. + +[LAW2_19:LAWYER2] +Voici le Pole Position Strip Club. Tu pourrais y passer de temps en temps. + +{=================================== MISSION TABLE LAWYER3 ===================================} + +[LAW3_A:LAWYER3] +Aaaaaah! Oh, nom de Dieu, c'est toi! Merde, je vais avoir besoin d'un nouveau pantalon! + +[LAW3_B:LAWYER3] +Putain, ces psychopathes du nord ont téléphoné pour dire qu'ils rappliquaient bientôt... + +[LAW3_C:LAWYER3] +Alors, où est ce sacré pognon? + +[LAW3_D:LAWYER3] +Relax, relax, on n'en est pas encore là. + +[LAW3_E:LAWYER3] +Je croyais vraiment que tu t'en occupais... + +[LAW3_F:LAWYER3] +Et maintenant, ces mecs disent qu'il faut qu'on leur rende un service... + +[LAW3_G:LAWYER3] +Tu veux dire que JE dois leur rendre un service... + +[LAW3_H:LAWYER3] +Ouais, évidemment! Est-ce que j'ai l'air de pouvoir impressionner un jury? + +[LAW3_I:LAWYER3] +Je ne pourrais même pas faire peur à un gosse et crois-moi, j'ai essayé! + +[LAW3_J:LAWYER3] +Maintenant, écoute, c'est ça ou le cousin de Forelli, Georgio, se prend cinq ans pour escroquerie. + +[LAW3_K:LAWYER3] +Faut que tu t'occupes de ces mecs! + +[LAW3_L:LAWYER3] +Je comprends. Demander au jury de changer d'opinion. T'en fais pas. + +[LAW3_M:LAWYER3] +Non non non non! Ca, j'ai déjà essayé! Et l'affaire ne s'est pas arrangée! + +[LAW3_N:LAWYER3] +Tu dois les OBLIGER à changer d'opinion! + +[LAW3_1:LAWYER3] +Avec les compliments de Georgio... + +[LAW3_2:LAWYER3] +N'oublie pas que le mot 'coupable' est proscrit! + +[LAW3_3:LAWYER3] +Il est innocent, jusqu'à ce que je dise le contraire. + +[LAW3_4:LAWYER3] +Tu sais qu'il n'est pas coupable... + +[LAW3_5:LAWYER3] +Tu te souviens de Georgio? Et donc qu'il est innocent? + +[LAW3_6:LAWYER3] +Non coupable. C'est compris... bien. + +[LAW3_8:LAWYER3] +~r~Tu as tué un juré! + +[LAW3_9:LAWYER3] +~g~Bousille la voiture du juré pour le faire sortir! + +[HELP40:LAWYER3] +Tu peux bousiller les voitures avec le marteau ou un outil similaire. + +[LAW3_10:LAWYER3] +~g~Tu peux aller à la ~h~quincaillerie~g~ pour acheter une arme de corps à corps. + +[LAW3_20:LAWYER3] +~g~Bousille la voiture du juré! + +[LAW3_21:LAWYER3] +Je n'arrive pas à le croire! + +[LAW3_22:LAWYER3] +Incroyable! + +[LAW3_23:LAWYER3] +Ok! C'est bon, j'ai compris! + +[LAW3_24:LAWYER3] +~g~Ce marteau pourrait être utile. + +[LAW3_7:LAWYER3] +~g~Va intimider les deux jurés, mais NE LES TUE PAS! + +[HELP23:LAWYER3] +Tu peux suivre le ~h~marteau~w~ sur le radar si tu veux acheter des armes de corps à corps dans la quincaillerie. + +[LAW3_16:LAWYER3] +de Pete de Floride. + +[LAW3_17:LAWYER3] +Casse-toi de là! + +{=================================== MISSION TABLE LAWYER4 ===================================} + +[LAW4_A:LAWYER4] +Avery, cela va sans dire... Ah, Tommy! Des nouvelles? Non, non, tu m'en parleras plus tard. Plus tard. + +[LAW4_B:LAWYER4] +Tommy, voici Avery Carrington. Je crois que vous vous êtes rencontrés à la fête? + +[LAW4_C:LAWYER4] +Pas directement. + +[LAW4_D:LAWYER4] +Salut. + +[LAW4_E:LAWYER4] +Avery a une proposition à nous faire. + +[LAW4_F:LAWYER4] +On a pas déjà du pain sur la planche? + +[LAW4_G:LAWYER4] +J'essaye de maintenir les loups au loin, alors lâche-moi un peu la grappe! + +[LAW4_H:LAWYER4] +Je suis tendu comme un cable et même si je dois crever avant la fin de la semaine, j'ai pas envie de mourir pauvre! + +[LAW4_I:LAWYER4] +Bon, vous énervez pas, tous les deux. + +[LAW4_J:LAWYER4] +Ecoute, petit, tu me files un coup de main et le moindre latino qui te fait chier, je m'occupe de lui. + +[LAW4_K:LAWYER4] +Ok, qu'est-ce que je peux faire pour toi? + +[LAW4_L:LAWYER4] +Cette société de livraison a son dépôt sur un terrain très intéressant. Et ils ne veulent pas vendre. + +[LAW4_M:LAWYER4] +Ils s'accrochent à leur terrain comme des rats entêtés, alors va falloir exploser cette vermine. + +[LAW4_N:LAWYER4] +Va là-bas et mets le feu aux poudres. + +[LAW4_O:LAWYER4] +La sécurité sera débordée et tu pourras te glisser dedans et en finir avec eux... + +[LAW4_P:LAWYER4] +Tu peux aussi passer chez Rafael pour changer de fringues. T'en as sans doute pour un moment, mais bon, fonce! + +[LAW4_Q:LAWYER4] +Ca va être une vraie émeute. + +[LAW4_R:LAWYER4] +Si tout se passe comme sur des roulettes, passe me voir au bureau... + +[LAW4_1:LAWYER4] +Dispersez-vous! La direction n'écoutera vos revendications que dans les conditions appropriées! + +[LAW4_2:LAWYER4] +Dispersez-vous! Retournez chez vous! + +[LAW4_3:LAWYER4] +Dispersez-vous! C'est inapproprié! + +[LAW4_4:LAWYER4] +Dispersez-vous ou vous finirez tous à la rue! + +[LAW4_5:LAWYER4] +Sortez vos bâtons, les mecs, on va briser quelques crânes de cocos! + +[LAW4_13:LAWYER4] +~g~Commence à te battre avec au moins 4 ouvriers pour déclencher une émeute. + +[LAW4_14:LAWYER4] +~g~Détruis les camionnettes du complexe! + +[HELP38:LAWYER4] +Si tu butes quelqu'un qui porte une arme, il la lâche. + +[HELP39:LAWYER4] +Tu peux tirer sur les barils d'explosifs, mais garde tes distances. + +{=================================== MISSION TABLE MIAMI_1 ===================================} + +[T4X4_1A:MIAMI_1] +~g~Tu as ~1~ secondes pour récupérer ~y~24~g~ points de passage. ~g~Fais-le dans ~y~N'IMPORTE QUEL ORDRE. + +[T4X4_1B:MIAMI_1] +~y~Passe A TRAVERS~g~ le premier point de passage pour déclencher le ~r~CHRONOMETRE. + +[T4X4_1C:MIAMI_1] +~1~ sur 24! + +[GETBIK1:MIAMI_1] +Tu as ~1~ secondes pour enfourcher une PCJ 600! + +[GETBIK3:MIAMI_1] +~r~Tu as besoin d'une PCJ 600 pour cette mission! + +{=================================== MISSION TABLE MM ===================================} + +[BLOD_04:MM] +ETAT DE LA VOITURE : + +[BLOD_05:MM] +~g~TEMPS VISE : ~1~ minute + +[BLOD_06:MM] +~g~TEMPS VISE : ~1~ minutes + +[BLOD_07:MM] +NV meilleur tps : ~1~ secondes + +[BLOD_08:MM] +Voitures détruites : ~1~ + +[BLOD_09:MM] +$~1~ + +[BLOD_10:MM] +VAINQUEUR! + +[BLOD_01:MM] +Franchis les points de passage pour augmenter ton temps général. + +[BLOD_02:MM] +Tu as perdu si ton temps général est à zéro. + +[BLOD_03:MM] +Il faut que ton temps général soit supérieur au temps visé pour gagner! + +{=================================== MISSION TABLE OVALRIG ===================================} + +[HOTR_01:OVALRIG] +~g~La course dure 12 tours. Seuls les trois premiers arrivés reçoivent une récompense. + +[HOTR_02:OVALRIG] +~g~Tu es disqualifié si ta bagnole est détruite. + +[HOTR_03:OVALRIG] +~g~Si ta bagnole est bousillée, tu peux la faire réparer aux stands. + +[HOTR_04:OVALRIG] +~g~C'est par là pour sortir du stade. + +[HOTR_05:OVALRIG] +Etat de la voiture : + +[HOTR_06:OVALRIG] +Tours : + +[HOTR_10:OVALRIG] +Temps de course : + +[HOTR_09:OVALRIG] +Position : + +[HOTR_12:OVALRIG] +~r~Ta caisse est bousillée! + +[HOTR_13:OVALRIG] +~r~Tu n'as pas gagné la course! + +[HOTR_14:OVALRIG] +~r~Tu as été disqualifié! + +[HOTR_15:OVALRIG] +Temps : ~1~:~1~ + +[HOTR_16:OVALRIG] +Temps : ~1~:0~1~ + +[HOTR_17:OVALRIG] +Meilleur temps : ~1~:~1~ + +[HOTR_18:OVALRIG] +Meilleur temps : ~1~:0~1~ + +[HOTR_19:OVALRIG] +Meilleur temps : aucun + +[HOTR_20:OVALRIG] +Nv meilleur tps : ~1~:~1~ + +[HOTR_21:OVALRIG] +Nv meilleur tps : ~1~:0~1~ + +[HOTR_22:OVALRIG] +Meilleur résultat : aucun + +[HOTR_23:OVALRIG] +Meilleur résultat : 1er + +[HOTR_24:OVALRIG] +Meilleur résultat : 2e + +[HOTR_25:OVALRIG] +Meilleur résultat : 3e + +[HOTR_26:OVALRIG] +Meilleur résultat : ~1~e + +[HOTR_27:OVALRIG] +Meilleur tps au tr : ~1~.~1~ secondes + +[HOTR_28:OVALRIG] +Meilleur tps au tr : ~1~.0~1~ secondes + +[HOTR_29:OVALRIG] +$~1~ + +[HOTR_30:OVALRIG] +1ERE PLACE + +[HOTR_31:OVALRIG] +2E PLACE + +[HOTR_32:OVALRIG] +3E PLACE + +[HOTR_33:OVALRIG] +Meilleur tps au tr : aucun + +[HOTR_11:OVALRIG] +Nv meilleur tps au tr : ~1~.~1~ secondes + +[HOTR_34:OVALRIG] +Nv meilleur tps au tr : ~1~.0~1~ secondes + +{=================================== MISSION TABLE PHIL1 ===================================} + +[PHI1_HP:PHIL1] +Tu peux lancer une grenade à détonateur quelque part puis l'y faire exploser au moment souhaité. + +[PHIL1_A:PHIL1] +Phil? + +[PHIL1_B:PHIL1] +COURS! + +[PHIL1_C:PHIL1] +Cours. + +[PHIL1_E:PHIL1] +Merde, Phil, tu bois cette saloperie? + +[PHIL1_F:PHIL1] +Putain, t'as pas besoin de la boire! + +[PHIL1_G:PHIL1] +Tu la renifles juste un bon coup et t'exploses direct! + +[PHIL1_H:PHIL1] +Ecoute, Phil, t'avais dit que tu pourrais t'occuper de ma puissance de feu... + +[PHIL1_I:PHIL1] +Pas de problème. + +[PHIL1_J:PHIL1] +Il y a ce mexicain qui trafique des armes, il a pas été réglo avec moi. + +[PHIL1_K:PHIL1] +Il fait sa tournée hebdomadaire, maintenant. + +[PHIL1_L:PHIL1] +Défonce l'arrière de son camion et sers-toi avant qu'il réagisse. + +[PHIL1_M:PHIL1] +Et rends-moi un service au passage tant que tu y es. + +[PHIL1_N:PHIL1] +Ensuite, règle-lui son compte... + +[PHI1_01:PHIL1] +~g~Va piquer les armes à l'arrière du camion du trafiquant. + +[PHI1_02:PHIL1] +~g~Le trafiquant a largué son chargement. Brise la caisse et ramasse l'artillerie. + +[PHI1_03:PHIL1] +~g~On dirait qu'ils ont demandé des renforts... + +[PHI1_04:PHIL1] +~g~Va maintenant finir les trafiquants d'armes survivants. + +[PHIL1_O:PHIL1] +Yeeeeeeehhaaaaa! + +[PHIL1_D:PHIL1] +N'approche jamais une allumette enflammée du boomshine de Phil Cassidy! + +{=================================== MISSION TABLE PHIL2 ===================================} + +[PHIL2_A:PHIL2] +Salut, Phil, ça roule? + +[PHIL2_B:PHIL2] +Saluut Tommyyyy! Comment ça va? Ca fait tellement longtemps... + +[PHIL2_C:PHIL2] +Je te jure que tu devrais arrêter le boomshine... + +[PHIL2_D:PHIL2] +Ca sent comme du décapant à peinture, j'ai les yeux qui brûlent... + +[PHIL2_E:PHIL2] +Ferme-la, Tommy + +[PHIL2_F:PHIL2] +et amène-toi par là. Y'a quelque chose que je veux te montrer... Quelque chose... + +[PHIL2_G:PHIL2] +Waou! Putain! C'est normal que je sente l'odeur d'ici? Je me sens tout drôle... + +[PHIL2_H:PHIL2] +T'inquiète pas de l'odeur, Tommy, regarde juste ça. + +[PHIL2_I:PHIL2] +Putain de saloperies de piles bon marché! Il y en a d'autres sur le banc. + +[PHIL2_J:PHIL2] +TA-DAAA! + +[PHIL2_K:PHIL2] +Oh merde! + +[PHI2_01:PHIL2] +~g~Vite, emmène Phil à l'hosto! + +[PHI2_03:PHIL2] +~r~Phil Cassidy est mort! Maintenant, qui va nous filer des flingues à Liberty? + +[PHI2_05:PHIL2] +Pas à l'hosto, mec, c'est plein de flics et de vietcongs! + +[PHI2_06:PHIL2] +Il y a un ancien chirurgien de l'armée qui me doit quelques services et une tondeuse... + +[PHI2_07:PHIL2] +Il crêche à Little Havana, oh! Regarde! Un poisson géant! + +[PHI2_08:PHIL2] +Fais gaffe! Charlie sur la ligne des arbres! + +[PHI2_09:PHIL2] +C'est moi qui hallucine ou la route est vraiment toute molle? + +[PHI2_10:PHIL2] +Cuillère Brisée à Mère Poule, tu me reçois? + +[PHI2_11:PHIL2] +Spooney Wooney Woo Woo Woooo! + +[PHI2_12:PHIL2] +La mort m'appelle, mon garçon! + +[PHI2_13:PHIL2] +Des ailes noires qui battent tout autour... + +[PHI2_14:PHIL2] +C'est magnifique, mec, magnifique... Mais tellement froid... + +[PHI2_15:PHIL2] +10-4 On a un conducteur en état d'ivresse. + +[PHI2_04:PHIL2] +SANTE DE PHIL : + +[PHI_AS1:PHIL2] +CHEZ PHILS PLACE OK + +[PHI_AS2:PHIL2] +~g~De nouvelles armes sont en vente chez Phils Place. {=================================== MISSION TABLE PIZZA ===================================} -[PIZ1_06:PIZZA] -~w~Appuie sur~h~ ~k~ ~TGSUB~ ~w~une fois sur la mob pour annuler la mission. +[PIZ1_01:PIZZA] +~g~Va livrer ces pizzas. Tu dois les balancer aux clients. Roule à côté d'eux pour lancer les pizzas. [PIZ1_02:PIZZA] -~w~T'as plus de pizza ! Retourne chez ~y~Joe's Pizza~w~ pour en prendre d'autres. - -[PIZ1_07:PIZZA] -~r~T'as tué le client ! T'es viré ! - -[PIZ1_08:PIZZA] -~r~T'as plus de temps... ni de boulot ! - -[PIZ1_09:PIZZA] -~r~T'as bousillé notre mob ! Tire-toi ! - -[PIZ1_11:PIZZA] -~w~Il te faut la ~b~mob~w~ Pizza pour livrer les commandes ! - -[PIZ1_12:PIZZA] -Pizzas - -[PIZ1_13:PIZZA] -~w~Pizza ! Chaude et prête à emporter ! J'adore ! - -[PIZ1_14:PIZZA] -~w~Prêtes pour livraison ! ... Alors va livrer ! - -[PIZ1_15:PIZZA] -~w~Avec un supplément de sauce piquante ! - -[PIZ1_16:PIZZA] -~w~Sors-toi les doigts du cul et va les livrer, fissa ! - -[PIZ1_17:PIZZA] -~w~Faut livrer ces pizzas aujourd'hui... pas l'an prochain ! - -[PIZ1_18:PIZZA] -~w~Tu veux pas te rabaisser à livrer des pizzas ? Mille excuses, monseigneur ! - -[PIZ1_19:PIZZA] -~w~Bon, tu vas les livrer ou pas ? - -[PIZ1_20:PIZZA] -~w~T'es viré ! ... Je plaisante. Mais t'as intérêt à ce qu'elles soient livrées à temps ! - -[PIZ1_21:PIZZA] -~w~Chaudes les pizzas ! Allez ! On a des obèses qu'attendent ! - -[PIZ1_22:PIZZA] -~w~T'as craché sur les pizzas ? Non ? ... Tu devrais ! Ca donne du goût ! - -[PIZ1_23:PIZZA] -~w~Non mais tu crois qu'elles vont se livrer toutes seules ? - -[PIZ1_24:PIZZA] -~w~Si elles sont froides en arrivant, tu vas t'attirer tout un tas de problèmes ! - -[PIZ1_25:PIZZA] -~w~Et bouge-toi un peu cette fois ! - -[PIZ1_26:PIZZA] -~w~Hé, va livrer ces pizzas ! - -[PIZ1_27:PIZZA] -~w~OK, va les livrer et reviens en chercher d'autres ! - -[PIZ1_28:PIZZA] -~w~Nos pizzas assurent ! Alors, assure, toi aussi, sinon t'auras des emmerdes ! - -[PIZ1_29:PIZZA] -~w~T'en redemandes ? Mais t'es un vrai morfal ! - -[PIZ1_30:PIZZA] -~w~Je crois que j'ai éternué sur une de ces pizzas... Pas grave... Va les livrer ! - -[PIZ1_31:PIZZA] -~w~Je déteste ce job ! Mais au moins, ça me donne le droit de te maltraiter... - -[PIZ1_3A:PIZZA] -~w~Si ces pizzas arrivent pas à l'heure, tu peux faire une croix sur ta thune ! - -[PIZ1_32:PIZZA] -~r~Nos pizzas sont pas digestes ? - -[PIZ1_33:PIZZA] -~w~Retourne chez ~y~Joe's Pizza~w~ pour de nouvelles commandes. - -[PIZ1_34:PIZZA] -~w~Une livraison égale plus de pognon ! - -[PIZ_WON:PIZZA] -~w~Défi Pizza terminé ! Bien joué ! Ta santé maximale a augmenté ! - -[PIZ_WO1:PIZZA] -~w~Joe's Pizza Restaurant est désormais sous ta 'protection'. Pense à encaisser régulièrement les paiements. - -[PIZ1_01:PIZZA] -~w~Livre ces pizzas à nos ~b~clients~w~ aussi vite que possible. +~g~T'as balancé toutes tes pizzas, retourne en chercher d'autres. [PIZ1_05:PIZZA] -~w~Passe en mob à côté d'un client pour lui filer sa pizza. +~g~Tu as 5 minutes pour livrer les commandes avant que que les clients n'appelent une autre pizzeria. -{=================================== MISSION TABLE TAXI ===================================} +[PIZ1_07:PIZZA] +~r~T'as tué le client! T'es viré! -[TAXI1:TAXI] -~w~Cherche une ~b~course. +[PIZ1_08:PIZZA] +~r~T'es à la bourre! T'es viré! -[TAXI1A:TAXI] -~w~Il n'y a pas de course par ici. Continue à chercher ! +[PIZ1_09:PIZZA] +~r~T'as bousillé notre bécane! T'es viré! -[TAXI2:TAXI] -~r~T'as plus le temps ! +[PIZ1_11:PIZZA] +Hé! Retourne sur ta bécane! -[TAXI3:TAXI] -~w~Ton passager s'est enfui, terrorisé ! +[PIZ1_12:PIZZA] +Pizzas restantes : -[TAXI4:TAXI] -~w~Course terminée : ~1~$ +[PIZ1_06:PIZZA] +Appuie sur la~h~ ~k~~TOGGLE_SUBMISSIONS~~w~ quand tu es sur la moto pour annuler la mission. -[TAXI4A:TAXI] -~w~Course terminée : ~1~$ + bonus ~1~ A LA SUITE ! ~1~$ +[PIZ1_13:PIZZA] +Effectue ces livraisons en vitesse. -[TAXI5:TAXI] -~w~BONUS VITESSE : ~1~$ +[PIZ1_14:PIZZA] +Mon pote, un pizza pour toi! -[TAXI5A:TAXI] -~w~BONUS VITESSE : ~1~$ + bonus ~1~ A LA SUITE ! ~1~$ +[PIZ1_15:PIZZA] +Allez, mon vieux, livre ça en vitesse. -[TAXI7:TAXI] -~w~Va faire réparer ton épave ! +[PIZ1_16:PIZZA] +Qu'est-ce que t'attends, mon vieux? T'as des pizzas à livrer! -[TAXI8:TAXI] -~r~Mission Taxi annulée. +[PIZ1_17:PIZZA] +Je sais que tu voulais pas faire ce boulot, mais je m'en tape! -[TAXI9:TAXI] -~r~Ton taxi est en ruine ! +[PIZ1_18:PIZZA] +Va livrer ça. -[FARES:TAXI] -Courses +[PIZ1_19:PIZZA] +On a besoin de livrer ça. -[TIP:TAXI] -Pourboire +[PIZ1_20:PIZZA] +Allez, mon vieux, livre ça ou t'es viré! -[FARE9:TAXI] -~w~Destination : ~y~Portland Docks. +[PIZ1_21:PIZZA] +Il y a des gens qui attendent, mon vieux. -[FARE20:TAXI] -~w~Destination : ~y~parc~w~, Belleville. +[PIZ1_22:PIZZA] +Mais qu'est-ce que t'attends? Faut livrer ça! -[FARE22:TAXI] -~w~Destination : ~y~Cochrane Dam. +[PIZ1_23:PIZZA] +Va livrer cette saloperie de bouffe! -[FARE2:TAXI] -~w~Destination : ~y~Head Radio~w~, Harwood. +[PIZ1_24:PIZZA] +Les clients ont les crocs, mon vieux! -[FARE3:TAXI] -~w~Destination : ~y~port des ferrys~w~, Harwood. +[PIZ1_25:PIZZA] +Tu peux prendre ça, mon vieux? -[FARE4:TAXI] -~w~Destination : ~y~hôpital~w~, Portland View. +[PIZ1_26:PIZZA] +Tiens, va livrer ça en vitesse, amigo. -[FARE7:TAXI] -~w~Destination : ~y~chantier~w~, Hepburn Heights. +[PIZ1_27:PIZZA] +Magne-toi, on est débordés. Va livrer ça! -[FARE8:TAXI] -~w~Destination : ~y~Cipriani Restaurant~w~, Saint Mark's. +[PIZ1_28:PIZZA] +Encore toi? Qu'est-ce que t'attends? Va livrer ça! -[FARE10:TAXI] -~w~Destination : ~y~Punk Noodles~w~, Chinatown. +[PIZ1_29:PIZZA] +Perds pas de temps, cette fois-ci. -[FARE12:TAXI] -~w~Destination : ~y~port des ferrys~w~, Rockford. +[PIZ1_30:PIZZA] +Espèce de bon à rien! Va livrer ça en vitesse! -[FARE13:TAXI] -~w~Destination : ~y~église~w~, Bedford Point. +[PIZ1_31:PIZZA] +T'auras jamais de promotion si tu traînes encore ce coup-ci. -[FARE14:TAXI] -~w~Destination : ~y~bureaux de Liberty Tree~w~, Bedford Point. +[PIZ1_32:PIZZA] +~r~La pizza est trop chaude ou quoi? -[FARE15:TAXI] -~w~Destination : ~y~université de Liberty~w~, Liberty Campus. +[PIZ1_33:PIZZA] +~g~Retourne au restaurant pour d'autres commandes. -[FARE16:TAXI] -~w~Destination : ~y~Hogs 'n' Cogs~w~, Belleville Park Area. +[PIZ1_34:PIZZA] +~g~Pizza livrée. Voilà ton fric. -[FARE17:TAXI] -~w~Destination : ~y~tribunal~w~, Belleville Park Area. +[PIZ_WON:PIZZA] +Mission Pizza terminée. votre max de Santé passe à 150. -[FARE18:TAXI] -~w~Destination : ~y~M. Benz~w~, Bedford Point. +{=================================== MISSION TABLE PORN1 ===================================} -[FARE19:TAXI] -~w~Destination : ~y~Joe's Pizza~w~, Bedford Point. +[POR1_A:PORN1] +Action -[FARE21:TAXI] -~w~Destination : ~y~Terminal A~w~, Francis International Airport. +[POR1_B:PORN1] +Ooooh! C'est un sacré morceau! -[FARE23:TAXI] -~w~Destination : ~y~manoir~w~, Cedar Grove. +[POR1_C:PORN1] +30 centimètres, c'est la taille réglementaire, bébé. -[FARE24:TAXI] -~w~Destination : ~y~hôpital~w~, Pike Creek. +[POR1_D:PORN1] +COUPEZ! Qui c'est cet abruti? Toi! Toi! T'es dans le champ? POURQUOI? -[FARE25:TAXI] -~w~Destination : ~y~parc~w~, Shoreside Vale. +[POR1_E:PORN1] +Qu'est-ce que c'est que ces conneries? -[FARE26:TAXI] -~w~Destination : ~y~North West Towers~w~, Wichita Gardens. +[POR1_F:PORN1] +Des aliens? Des cannes à pêche? -[FARE27:TAXI] -~w~Destination : ~y~dépôt de bus~w~, Trenton. +[POR1_G:PORN1] +J'ai jamais vu un requin aussi gros... -[FARE28:TAXI] -~w~Destination : ~y~M. Benz~w~, Chinatown. +[POR1_H:PORN1] +Faut que tout ça dégage! -[FARE29:TAXI] -~w~Destination : ~y~M. Benz~w~, Pike Creek. +[POR1_I:PORN1] +Pourquoi t'es dans le métier, connard? -[FARE30:TAXI] -~w~Destination : ~y~Terminal C~w~, Francis International Airport. +[POR1_J:PORN1] +Hein? -[FARE31:TAXI] -~w~Destination : ~y~AM Petroleum~w~, Pike Creek. +[POR1_K:PORN1] +Ben, pour les chattes, évidemment! Alors, qu'est-ce que c'est que ça? -[FARE32:TAXI] -~w~Destination : ~y~Liberty Pharmaceuticals~w~, Pike Creek. +[POR1_L:PORN1] +Ceci est mon art - SECURITE! -[FARE11:TAXI] -~w~Destination : ~y~armurerie Phil Cassidy Fully Cocked~w~, Bedford Point. +[POR1_M:PORN1] +Ecoute-moi, trou du cul arrogant, tu m'appartiens maintenant. Tout m'appartient ici. -[FARE1A:TAXI] -~w~Destination : ~y~Paulie's Revue Bar~w~, Red Light District. +[POR1_N:PORN1] +On va révolutionner cet endroit... -[FARE1C:TAXI] -~w~Destination : ~y~Sex Club Seven~w~, Red Light District. +[POR1_O:PORN1] +Je vais faire ta fortune... -[FARE5:TAXI] -~w~Destination : ~y~Ammu-Nation~w~, Red Light District. +[POR1_P:PORN1] +Oh. Tu es... Tu... es Tommy Vercetti? Mais je croyais que tu étais... -[FARE6:TAXI] -~w~Destination : ~y~Capital Autos~w~, Saint Mark's. +[POR1_Q:PORN1] +Exactement... -{=================================== MISSION TABLE AMBU ===================================} +[POR1_R:PORN1] +Va y avoir quelques changements dans le coin et on va commencer à se faire des ronds. -[A_FAIL2:AMBU] -~r~Ton manque d'empressement a été fatal au patient ! +[POR1_S:PORN1] +Au fait, as-tu jamais pensé à... -[A_FAIL3:AMBU] -~r~Le patient est mort ! +[POR1_T:PORN1] +Mais d'abord, on va avoir besoin de quelques putes bien foutues... -[ATUTOR4:AMBU] -~w~Chaque secousse réduit les chances de survie du patient ! +[POR1_U:PORN1] +Ouais, les filles c'est bien mais toi... waou! -[A_TIME:AMBU] -~w~Patient embarqué ! +~1~ secondes +[POR1_02:PORN1] +~g~Bute le mac de Candy, puis retourne la récupérer. -[A_TIME2:AMBU] -~w~Bonus ! +~1~ secondes +[POR1_04:PORN1] +Salut, Candy. Je cherche des actrices, ça te branche? -[AREWARD:AMBU] -~w~Niveau ~1~ terminé ! Récomp. : ~1~$ +[POR1_05:PORN1] +Et comment! Mais faut causer à mon agent... -[A_RANGE:AMBU] -~r~La radio de l'ambulance ne capte plus rien ! Rapproche-toi d'un hôpital ! +[POR1_06:PORN1] +Putain qu'est-ce que tu fous? -[ATUTOR5:AMBU] -~w~Va chercher un ~b~patient. +[POR1_07:PORN1] +Tu aurais mieux fait de rester à la maison, aujourd'hui! -[ATUTOR6:AMBU] -~w~Emmène le patient à l'~y~hôpital ! +[POR1_7B:PORN1] +J'arrive pas à croire ce trou du cul! -[ATUTOR7:AMBU] -~w~Cherche d'autres ~b~patients~w~ ou emmène celui-ci à l'~y~hôpital. +[POR1_08:PORN1] +Salut, Mercedes! -[A_FULL:AMBU] -~w~Ton ambulance est pleine ! Va déposer tes patients à l'~y~hôpital. +[POR1_09:PORN1] +Salut, Tommy! Tu viens faire la fête? -[A_RANG2:AMBU] -~r~La radio de l'ambulance ne fonctionne pas dans le métro ! +[POR1_10:PORN1] +Non, pas maintenant, chérie. Ca te dirait de faire du cinéma? -{=================================== MISSION TABLE TV ===================================} +[POR1_11:PORN1] +Evidemment! Mais seulement si c'est sordide et bon marché! -[TV_01:TV] -Slash TV +[POR1_13:PORN1] +~g~Emmène les filles au studio y retrouver Steve. -[TV_02:TV] -~w~Tue tous les psychopathes... Il en arrive de partout ! +[POR1_14:PORN1] +T'es engagé! -[TV_03:TV] -~w~La difficulté augmente avec chaque niveau : plus d'ennemis à tuer et plus de prix à remporter ! +[POR1_15:PORN1] +Hé tommy, tu viens pour un bout d'essai? -[TV_04:TV] -~w~NIVEAU ~1~ +[POR1_17:PORN1] +Waou! Sympa le requin! -[TV_10:TV] -~w~T'as gagné un prix spécial ! +[POR1_18:PORN1] +~r~Mercedes est morte! -[TV_09:TV] -Montant gagné dans ce mini-jeu : ~1~$ ! +[POR1_20:PORN1] +Tommy! Où tu vas? Reviens ici! -[TV_05:TV] -~w~NIVEAU TERMINE ! +[POR1_21:PORN1] +Où tu vas? -[TV_06:TV] -~w~Tu as gagné un prix de ~1~$ ! +[POR1_22:PORN1] +Tommy, quand c'est qu'on va pouvoir être un peu seuls ensemble? -[TV_07:TV] -~w~A VOS MARQUES... +[POR1_01:PORN1] +~g~Candy Suxxx serait parfaite pour un premier rôle! -[TV_08:TV] -~w~GO! +[POR1_12:PORN1] +~g~Emmène Candy avec toi pour rencontrer Mercedes. -{=================================== MISSION TABLE NOODLE ===================================} +[POR1_16:PORN1] +Plus tard, peut-être, mon chou... -[NDL1_02:NOODLE] -~w~Oh... Plus de nouilles ! Retourne chez ~y~Punk Noodles~w~ pour en récupérer. +[POR1_24:PORN1] +~g~Retourne chercher Candy. -[NDL1_06:NOODLE] -~w~Appuie sur~h~ ~k~ ~TGSUB~ ~w~quand t'es sur ta mob pour annuler la mission. +[POR1_25:PORN1] +~g~Tu as laissé Candy. Retourne la chercher! -[NDL1_07:NOODLE] -~r~T'as tué un client ! T'es viré ! +[POR1_23:PORN1] +~g~Candy va s'occuper de l'affaire dans le ~h~Centre~g~. -[NDL1_08:NOODLE] -~r~T'as plus de temps ! T'es viré ! +[POR1_26:PORN1] +~g~Voilà Candy. On dirait qu'elle a encore eu rendez-vous avec le représentant du Congrès, Alex Shrub. -[NDL1_09:NOODLE] -~r~T'as bousillé notre mob ! T'es viré ! +[POR1_27:PORN1] +Allez, partons d'ici! -[NDL1_11:NOODLE] -~w~Remonte sur la ~b~mob ! +[POR1_28:PORN1] +Tommy, sois prudent! Mes implants ne sont pas encore assurés! -[NDL1_12:NOODLE] -Nouilles +[POR1_29:PORN1] +Tu appelles ça conduire? -[NDL1_13:NOODLE] -~w~Des nouilles ! Des tonnes de nouilles à livrer ! +[POR1_30:PORN1] +Je pourrais plus faire du porno après ça! -[NDL1_14:NOODLE] -~w~Nos clients adorent mes nouilles ! +[POR1_31:PORN1] +Quoi? T'essaies de me tuer ou quoi? Je croyais que c'était moi, la star! -[NDL1_15:NOODLE] -~w~J'ai des nouilles à livrer ! +{=================================== MISSION TABLE PORN2 ===================================} -[NDL1_16:NOODLE] -~w~Tâche de livrer ces nouilles à temps ! +[POR2_A:PORN2] +Comment ça se passe, Steve? -[NDL1_17:NOODLE] -~w~Hé ! Faut livrer ces nouilles ! +[POR2_B:PORN2] +Eh ben, Candy est faite pour le rôle et la nouvelle fille est infatigable! -[NDL1_18:NOODLE] -~w~Va livrer ces nouilles ! Et vite ! +[POR2_C:PORN2] +Elle s'est tapé la moitié du casting et des techniciens avant même que j'ai fini de régler les éclairages! -[NDL1_19:NOODLE] -~w~Nos clients veulent des nouilles chaudes, pas froides ! +[POR2_D:PORN2] +Enfin, demain, on va en extérieurs pour tourner les scènes du bateau... -[NDL1_20:NOODLE] -~w~Tu supportes pas la chaleur de la cuisine ? Confucius a dit : éteins la cuisinière. +[POR2_E:PORN2] +Les scènes du bateau? Quelles scènes du bateau? -[NDL1_21:NOODLE] -~w~Va livrer ces nouilles, tu veux ? +[POR2_F:PORN2] +Les pêcheurs sont dans les filets de la passion quand ce requin géant arrive... -[NDL1_22:NOODLE] -~w~Et encore des nouilles à livrer ! +[POR2_G:PORN2] +Qu'est-ce que j'avais dit à propos du requin géant? -[NDL1_23:NOODLE] -~w~Des nouilles, des nouilles, des nouilles ! Faut les livrer bien chaudes ! +[POR2_H:PORN2] +J'avais dit : PAS DE REQUIN GEANT! Ok? -[NDL1_24:NOODLE] -~w~Nos clients attendent ! Pourquoi tant de haine ? +[POR2_I:PORN2] +Laisse simplement les caméras braquées sur le pieu! -[NDL1_25:NOODLE] -~w~Cette commande est pas encore partie ? +[POR2_J:PORN2] +Ok ok, Tommy, j'avais bien le droit d'essayer... -[NDL1_26:NOODLE] -~w~Qu'est-ce que t'attends ? Le Nouvel An chinois ? +[POR2_K:PORN2] +Les prospectus sont imprimés? -[NDL1_27:NOODLE] -~w~Ces nouilles refroidissent ! Dépêche-toi ! +[POR2_L:PORN2] +Ouais, mais personne va nous laisser distribuer ces trucs, je veux dire... -[NDL1_28:NOODLE] -~w~Je voulais être astronaute. Mais ce boui-boui est à mon père... Qu'est-ce que je pouvais faire ? +[POR2_M:PORN2] +Ils sont un peu trop, hum, enfin, ils manquent un peu de poésie... -[NDL1_29:NOODLE] -~w~Si tu veux garder ton job, bouge-toi et va livrer ces nouilles ! +[POR2_N:PORN2] +T'en fais pas pour ça! -[NDL1_30:NOODLE] -~w~Des nouilles sautées et croustillantes... J'adore ça ! +[POR2_O:PORN2] +J'ai mes propres plans pour la distribution... -[NDL1_31:NOODLE] -~w~J'aurais parié que t'étais plutôt du genre à livrer des pizzas... +[POR2_P:PORN2] +OK. Hé, Candy, amène-toi dans ma caravane! -[NDL1_3A:NOODLE] -~w~Ils en veulent toujours plus. Reviens quand tu auras fini ! +[POR2_01:PORN2] +~g~Il y a un hydravion à l'arrière des studios qui servait pour la propagande des vieux films. -[NDL1_32:NOODLE] -~r~Qu'est-ce qui se passe ? T'aimes pas les nouilles ? +[POR2_02:PORN2] +~g~Atteins l'un des points de contrôle pour commencer à larguer les prospectus. -[NDL1_33:NOODLE] -~w~Retourne au ~y~Punk Noodles~w~ pour de nouvelles commandes. +[POR2_03:PORN2] +~g~Largue les prospectus tout le long du chemin jusqu'au dernier point de contrôle. -[NDL1_34:NOODLE] -~w~Nouilles livrées, thune encaissée ! +[POR2_04:PORN2] +~r~NIVEAU DE CARBURANT BAS! -[NDL_WON:NOODLE] -~w~Félicitations ! Défi Nouilles terminé ! Ta santé maximale a augmenté ! +[POR2_05:PORN2] +Utilise-le pour distribuer les prospectus dans la ville. -[NDL_WO1:NOODLE] -~w~Punk Noodles est maintenant sous ta 'protection'. Pense à encaisser régulièrement les paiements. +[DILDO:PORN2] +Kérosène : -[NDL1_01:NOODLE] -~w~Livre ces nouilles à nos ~b~clients~w~ et plus vite que ça ! +[POR2_Q:PORN2] +Oh, merde! -[NDL1_05:NOODLE] -~w~Passe en mob à côté d'un client pour lui lancer les nouilles. +[PORN2_9:PORN2] +~g~Il te reste ~1~ secondes pour retourner à une Skimmer avant la fin de la mission. -{=================================== MISSION TABLE MPSURV ===================================} +{=================================== MISSION TABLE PORN3 ===================================} -[SAL01:MPSURV] -~w~Maria, je vais à l'hosto pour me faire soigner mon "tu-sais-quoi". +[POR3_A:PORN3] +Bon, c'est quoi le problème, maintenant? -[SAL02:MPSURV] -~w~Quand je sortirai, l'étalon porcin reprendra du service comme jamais... +[POR3_B:PORN3] +Chuuuut! -[SAL04:MPSURV] -~w~PS : prépare-toi pour mon grand retour, bébé ! +[POR3_C:PORN3] +Eh bien, après l'intime rencontre avec les envahisseuses nymphomanes, -[SAL05:MPSURV] -~w~PPS : ... Et laisse pas traîner ce message n'importe où ! +[POR3_D:PORN3] +notre jeune héros se retrouve incapable de penser à autre chose que cette énorme montagne phallique -[SAL03:MPSURV] -~w~Tâche de pas t'attirer d'ennuis en mon absence, parce que y a plein de mecs qui meurent d'envie de prendre le pouvoir... +[POR3_E:PORN3] +et c'est là qu'on veut placer la scène avec la cuve de purée de patates, mais alors on... -[SAL03A:MPSURV] -~w~Littéralement ! +[POR3_F:PORN3] +Ces conneries m'intéressent pas! -{=================================== MISSION TABLE JDREF ===================================} +[POR3_G:PORN3] +Continuez simplement le boulot, continuez... -[JDT1_BA:JDREF] -~w~Pas question que je bosse pour un Leone ! +[POR3_H:PORN3] +Hé, Tommy... -[JDT1_BB:JDREF] -~w~... Hé, Toni, reviens quand tu te feras moins remarquer. +[POR3_I:PORN3] +T'as évoqué un problème légal au téléphone... -[CHNGOUT:JDREF] -~w~Enlève ton costume Leone, sinon J.D. pourra pas être vu en train de te parler. +[POR3_J:PORN3] +Ah ouais! Le représentant du Congrès Alex Shrub a pris le train électoral en marche à la pêche des votes puritains... -{=================================== MISSION TABLE CRED01 ===================================} +[POR3_K:PORN3] +La rumeur laisse entendre qu'il soutient des mesures de restriction contre... -[CR01_01:CRED01] -~n~ ~n~ ~n~ ~n~CREDITS +[POR3_L:PORN3] +Disons... les formes les plus charnelles de la grande industrie cinématographique de ce pays. -[CR01_02:CRED01] -~n~ ~n~ ~n~ ~n~ROCKSTAR NORTH +[POR3_M:PORN3] +Super. -[CR01_03:CRED01] -~n~ ~n~ ~n~ ~n~Producer ~n~Leslie Benzies +[POR3_N:PORN3] +Candy! Tu connais Shrub. -[CR01_04:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Aaron Garbut +[POR3_O:PORN3] +Vous faites des trucs bizarres tous les deux? -[CR01_05:CRED01] -~n~ ~n~ ~n~ ~n~Technical Direction ~n~Obbe Vermeij, Adam Fowler +[POR3_P:PORN3] +Oh oui! Oui! Oh oui! Oui oui oui ouuuuuuuuuuuuuuuuuui! -[CR01_06:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~Written By ~n~Dan Houser, James Worrall ~n~ & David Bland +[POR3_Q:PORN3] +Dis-moi que t'as eu ça... -[CR01_07:CRED01] -~n~ ~n~ ~n~ ~n~Programming ~n~Alexander Roger, Alexander Illes, ~n~Andrzej Madajczyk, Barane Chan, ~n~Derek Payne, Derek Ward, +[POR3_R:PORN3] +Est-ce que ça faisait partie du... euh... Ou bien elle parlait à... -[CR01_08:CRED01] -~n~ ~n~Gordon Yeoman, Graeme Williamson, ~n~Greg Smith, James Broad, ~n~John Gurney, John Whyte, +[POR3_S:PORN3] +Impossible à dire... Dans tous les cas... -[CR01_09:CRED01] -~n~ ~n~Keith McLeman, Mark Nicholson, ~n~Shaun McKillop +[POR3_T:PORN3] +Tu ferais mieux de la suivre après le tournage -[CR01_10:CRED01] -~n~ ~n~ ~n~ ~n~Audio Programmer ~n~Matthew Smith +[POR3_U:PORN3] +et voir si elle te mènera pas à leur nouveau nid d'amour. -[CR01_11:CRED01] -~n~ ~n~ ~n~ ~n~Sound Design and Mastering ~n~Allan Walker +[POR3_V:PORN3] +T'as un appareil photo? -[CR01_12:CRED01] -~n~ ~n~ ~n~ ~n~Lead Cut Scene Animator ~n~Mondo Ghulam +[POR3_X:PORN3] +Hé, file-lui un appareil photo! -[CR01_13:CRED01] -~n~ ~n~ ~n~ ~n~Cut Scene Animator ~n~Dermot Bailie +[POR3_02:PORN3] +~r~Tu as tué le représentant du Congrès! T'auras du mal à le faire chanter, maintenant! -[CR01_14:CRED01] -~n~ ~n~ ~n~ ~n~Character Animator ~n~Felipe Busquets +[POR3_03:PORN3] +~r~Tu as alerté la sécurité du représentant du Congrès, ils vont le faire sortir tout de suite. -[CR01_15:CRED01] -~n~ ~n~ ~n~ ~n~In-Game Animation ~n~Gus Braid, Terry Kenny +[POR3_04:PORN3] +Candy, tu peux m'appeler Martha? -[CR01_16:CRED01] -~n~ ~n~ ~n~ ~n~Characters Artist ~n~Ian McQue +[POR3_05:PORN3] +Oh Alex, enfin, je veux dire Martha. Comme tu veux... -[CR01_17:CRED01] -~n~ ~n~ ~n~ ~n~Vehicle Artist ~n~Joylon Orme +[POR3_06:PORN3] +Martha, il y a quelqu'un qui regarde... C'est pervers... -[CR01_18:CRED01] -~n~ ~n~ ~n~ ~n~Additional Art ~n~Rick Stirling, Alisdair Wood +[POR3_07:PORN3] +Vous là-bas, donnez-moi cet appareil photo! -[CR01_19:CRED01] -~n~ ~n~ ~n~ ~n~Music Producer ~n~Craig Conner +[POR3_01:PORN3] +~g~Suis la ~h~Stretch~g~ de Candy. -[CR01_20:CRED01] -~n~ ~n~ ~n~ ~n~Audio Design and Dialogue Editor ~n~Will Morton +[POR3_15:PORN3] +~r~T'as bousillé la Stretch de Candy! -[CR01_21:CRED01] -~n~ ~n~ ~n~ ~n~Additional Dialogue Editor ~n~Jon McCavish +[POR3_17:PORN3] +~g~Retourne aux Porn Studios avec la pellicule. -[CR01_22:CRED01] -~n~ ~n~ ~n~ ~n~Development Support ~n~Milly Cottam +[POR3_19:PORN3] +~r~T'es à court de pellicule! -[CR01_23:CRED01] -~n~ ~n~ ~n~ ~n~Graphic Designers ~n~Stuart Petri, Steve Walsh +[POR3_21:PORN3] +~g~T'as perdu la Stretch de Candy! -[CR01_24:CRED01] -~n~ ~n~ ~n~ ~n~Lead Level Design ~n~William Mills +[POR3_22:PORN3] +~g~Le WK Chariot Hotel de l'autre côté de ce balcon devrait être idéal, comme point de vue. -[CR01_25:CRED01] -~n~ ~n~ ~n~ ~n~Level Design ~n~Chris Rothwell, Andy Duthie, ~n~Chris McMahon, Neil Ferguson +[POR3_23:PORN3] +~g~Il y a une porte latérale qui te permettra d'accéder à l'hôtel. -[CR01_26:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Craig Arbuthnott +[POR3_08:PORN3] +Appuie sur la~h~ ~k~~PED_LOCK_TARGET~ ~w~et maintiens-la enfoncée pour ~h~cadrer~w~ la photo. -[CR01_27:CRED01] -~n~ ~n~ ~n~ ~n~Senior Lead Test ~n~Neil Corbett +[POR3_09:PORN3] +Appuie sur la~h~ ~k~~PED_LOCK_TARGET~ ~w~et maintiens-la enfoncée pour ~h~cadrer~w~ la photo. -[CR01_28:CRED01] -~n~ ~n~ ~n~ ~n~Lead Test ~n~David Murdoch, Neil Meikle, ~n~Alex Bazlinton, Brenda Carey +[POR3_10:PORN3] +Appuie sur la~h~ ~k~~PED_SNIPER_ZOOM_IN~ ~w~pour faire un ~h~zoom avant~w~ et sur la~h~ ~k~~PED_SNIPER_ZOOM_OUT~ ~w~pour faire un ~h~zoom arrière~w~. -[CR01_29:CRED01] -~n~ ~n~ ~n~ ~n~Build Engineer / Lead Test ~n~Neil Walker +[POR3_11:PORN3] +Appuie sur la~h~ ~k~~PED_SNIPER_ZOOM_IN~ ~w~pour faire un ~h~zoom avant~w~ et sur la~h~ ~k~~PED_SNIPER_ZOOM_OUT~ ~w~pour faire un ~h~zoom arrière~w~. -[CR01_30:CRED01] -~n~ ~n~ ~n~ ~n~Audio Test ~n~George Williamson +[POR3_12:PORN3] +Appuie sur la~h~ ~k~~PED_FIREWEAPON~ ~w~pour prendre une photo. -[CR01_31:CRED01] -~n~ ~n~ ~n~ ~n~Test ~n~Brian Kelly, Lindsay Robertson, ~n~Sundram Soosay, Eugene Kuczerepa, ~n~Christopher Soosay, Ben Abbott, +[POR3_13:PORN3] +Appuie sur la~h~ ~k~~PED_FIREWEAPON~ ~w~pour prendre une photo. -[CR01_32:CRED01] -~n~ ~n~Oliver Elliott, Louis Dinan, ~n~Bobby Wright, Thomas Philips, ~n~Nick Rees, Ivor Williams +[POR3_14:PORN3] +Appuie sur la~h~ ~k~~PED_FIREWEAPON~ ~w~pour prendre une photo. -[CR01_33:CRED01] -~n~ ~n~ ~n~ ~n~Test Tools Programming ~n~James Whitcroft, Alex Carter +[POR3_20:PORN3] +~g~Si tu as besoin de te déplacer, utilise la ~h~Sparrow~g~ garée derrière. -[CR01_34:CRED01] -~n~ ~n~ ~n~ ~n~IT Manager ~n~Lorraine Roy +[POR3_16:PORN3] +~g~Il te faut trois bons clichés d'Alex Shrub avec Candy pour le faire chanter. -[CR01_35:CRED01] -~n~ ~n~ ~n~ ~n~IT Support ~n~Christine Chalmers, Dave Bruce +[POR3_24:PORN3] +PHOTOS PRISES : -[CR01_36:CRED01] -~n~ ~n~ ~n~ ~n~Studio Director ~n~Andrew Semple +{=================================== MISSION TABLE PORN4 ===================================} -[CR01_37:CRED01] -~n~ ~n~ ~n~ ~n~Office Administration ~n~Kim Gurney +[POR4_A:PORN4] +Je suis désolée, mais je ne peux pas avaler maintenant! -[CR01_38:CRED01] -~n~ ~n~ ~n~ ~n~Administration Support ~n~Charlene Maguire, Kim Wilson +[POR4_B:PORN4] +Oh, ALLEZ! Chérie! -[CR02_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LEEDS +[POR4_C:PORN4] +Il décharge comme une baleine, par pitié -[CR02_02:CRED01] -~n~ ~n~ ~n~ ~n~Studio Director ~n~Gordon Hall +[POR4_D:PORN4] +comment tu fais pour ne pas saisir le rôle? -[CR02_03:CRED01] -~n~ ~n~ ~n~ ~n~Head of Development ~n~David Box +[POR4_E:PORN4] +Mais Stevie... -[CR02_04:CRED01] -~n~ ~n~ ~n~ ~n~Lead Programming ~n~Andrew Greensmith, Matthew Shepcar ~n~ ~n~ ~n~ ~n~Console Programming ~n~Nigel Conroy, Richard Frankish, ~n~Andrew Greensmith, Robin Mangham, ~n~Damian McKenna, Finlay Munro, ~n~Stuart Roskell, Matthew Shepcar +[POR4_F:PORN4] +Comment va mon réalisateur vedette? -[CR02_05:CRED01] -~n~ ~n~ ~n~ ~n~Programming ~n~Jon Bellamy, Ross Childs, ~n~Nigel Conroy, Neil Dodwell, ~n~Alastair Dukes, David Huebner, +[POR4_G:PORN4] +Ah, mon pote, la lutte incessante entre l'intégrité artistique et -[CR02_06:CRED01] -~n~ ~n~Robin Mangham, Jason McGann, ~n~Warren Merrifield, Stephen McGreal +[POR4_H:PORN4] +l'éjaculation sous toutes ses formes est loin d'être terminée. -[CR02_07:CRED01] -~n~ ~n~ ~n~ ~n~Sound Programming ~n~Finlay Munro, Charles Waddington +[POR4_I:PORN4] +Et avant que tu me poses la question, je t'informe que les quatre vidéos sortiront dans les... -[CR02_08:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Ian Bowden +[POR4_J:PORN4] +Chérie, veux-tu garder l'anaconda dans le champ, S'IL TE PLAIT. -[CR02_09:CRED01] -~n~ ~n~ ~n~ ~n~Art Department Director ~n~Chris Smart +[POR4_K:PORN4] +Il prend plus de l'heure que toi! -[CR02_10:CRED01] -~n~ ~n~ ~n~ ~n~Lead Character Artist ~n~Paul Smith +[POR4_L:PORN4] +Oh, pardon, Steve... -[CR02_11:CRED01] -~n~ ~n~ ~n~ ~n~Character Artist ~n~Chris Allison +[POR4_M:PORN4] +Je me disais, faudrait monter un gros coup de pub pour la promo du film. -[CR02_12:CRED01] -~n~ ~n~ ~n~ ~n~Lead City Artist ~n~Dan Roberts +[POR4_N:PORN4] +Un truc qui aurait vraiment de l'impact sur la ville... T'as pas une idée? -[CR02_13:CRED01] -~n~ ~n~ ~n~ ~n~City Artists ~n~Paul McKee, James McHale, ~n~Siu Lee +[POR4_O:PORN4] +Eh ben, autrefois, on faisait des galas, -[CR02_14:CRED01] -~n~ ~n~ ~n~ ~n~Cutscene Interiors ~n~Izzy Stewart +[POR4_P:PORN4] +avec des vedettes, des limousines, la nuit éclairée par les projos... -[CR02_15:CRED01] -~n~ ~n~ ~n~ ~n~Concept Artist ~n~John Wigley +[POR4_Q:PORN4] +Des projecteurs? J'ai une idée! -[CR02_16:CRED01] -~n~ ~n~ ~n~ ~n~Additional Character Animation ~n~Alan Bowker +[POR4_R:PORN4] +...Ouais, ouais, ouais! Le petit numéro de paillettes, les limousines, ah, les premières! -[CR02_17:CRED01] -~n~ ~n~ ~n~ ~n~Additional Artists ~n~Andy Walker, Jason Gee, ~n~Chris Edwards, Lee Clark +[POR4_S:PORN4] +Oh oui, chère madaaaame, bien sûr, chère madaaaame... -[CR02_18:CRED01] -~n~ ~n~ ~n~ ~n~Design Director ~n~David Bland +[POR4_T:PORN4] +et la presse, et le barrage de lumières... -[CR02_19:CRED01] -~n~ ~n~ ~n~ ~n~Lead Level Design ~n~John Li +[POR4_01:PORN4] +~g~Va dans le ~y~Centre~g~ et ajuste le projecteur sur le toit du bâtiment. -[CR02_20:CRED01] -~n~ ~n~ ~n~ ~n~Senior Level Design ~n~Tony Gowland, Martyn Bramall +[POR4_02:PORN4] +~g~Une bécane rapide est nécessaire pour sauter de toit en toit. L'agent de sécurité a l'habitude de venir en ~y~PCJ 600~g~ au boulot... -[CR02_21:CRED01] -~n~ ~n~ ~n~ ~n~Level Design ~n~Sam Hackett, Stephen Robertson, ~n~Tom Kingsley, Chris Edwards, ~n~Kris Gormley +[POR4_03:PORN4] +~g~Faut que tu montes sur les toits. Il devrait y avoir un ascenceur dans l'un des immeubles de bureaux. -[CR02_22:CRED01] -~n~ ~n~ ~n~ ~n~Associate Designer ~n~Mark McGinley +[POR4_06:PORN4] +~g~Retourne à l'immeuble de bureaux du bas si tu as besoin d'accéder à nouveau au toit. -[CR02_23:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Paul Colls +[POR4_07:PORN4] +~g~Tu as besoin d'une bécane pour sauter de bâtiment en bâtiment! -[CR02_24:CRED01] -~n~ ~n~ ~n~ ~n~QA ~n~Jody Cobb, ~n~ ~n~Luke Brown, Nick Robey, ~n~Matthew Haven +[POR4_08:PORN4] +~g~Fonce à travers la fenêtre pour commencer. Tu as jusqu'à 07:00 avant que la lumière du jour ne risque de te faire découvrir. -[CR02_25:CRED01] -~n~ ~n~ ~n~ ~n~Company Secretary ~n~Naomi Martin +[POR4_09:PORN4] +~g~Les marqueurs t'indiquent sur quel bâtiment sauter ensuite. -[CR02_26:CRED01] -~n~ ~n~ ~n~ ~n~IT Manager ~n~Chris Waring +[POR4_10:PORN4] +~r~Il fait maintenant trop clair pour monter sans te faire voir. -[CR03_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR NYC +[POR4_11:PORN4] +Retourne à l'escalier si tu as à nouveau besoin d'accéder au toit. -[CR03_02:CRED01] -~n~ ~n~ ~n~ ~n~Executive Producer ~n~Sam Houser +[POR4_05:PORN4] +~g~Ces escaliers mènent à un bureau. -[CR03_03:CRED01] -~n~ ~n~ ~n~ ~n~VP of Creative ~n~Dan Houser +[POR_AS1:PORN4] +STUDIO DE CINEMA OK -[CR03_04:CRED01] -~n~ ~n~ ~n~ ~n~VP of Development ~n~Jamie King +[POR_AS2:PORN4] +~g~Inter Global Films génère dorénavant un revenu de $~1~ maximum. Pense à récupérer le fric régulièrement. -[CR03_05:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Alex Horton +{=================================== MISSION TABLE PROT1 ===================================} -[CR03_06:CRED01] -~n~ ~n~ ~n~ ~n~Chief Technology Officer ~n~Gary J. Foreman +[PRO1_B:PROT1] +Je supporte pas ce style. Tommy, qu'est-ce que t'en penses? Qu'est-ce que tu dirais qu'on mette un bar dans... -[CR03_07:CRED01] -~n~ ~n~ ~n~ ~n~Associate Producer ~n~Rich Rosado +[PRO1_D:PROT1] +Ecoutez-moi... -[CR03_08:CRED01] -~n~ ~n~ ~n~ ~n~Director of Quality Assurance ~n~Jeff Rosa +[PRO1_E:PROT1] +L'heure est venue de mettre la main sur cette ville! Le monde n'attend plus que nous! -[CR03_09:CRED01] -~n~ ~n~ ~n~ ~n~Senior Lead Analyst ~n~Lance Williams +[PRO1_F:PROT1] +Faut qu'on commence à s'emparer de territoires! -[CR03_10:CRED01] -~n~ ~n~ ~n~ ~n~Project Lead ~n~Jameel Vega +[PRO1_G:PROT1] +Faut qu'on fasse comprendre à tout Vice City qu'on est les nouveaux maîtres du jeu! Tu vois ce que je veux dire? -[CR03_11:CRED01] -~n~ ~n~ ~n~ ~n~Rockstar Test Team ~n~Ethan Abeles, William Rompf, ~n~Christopher Mansfield, Chris Choi, ~n~Mike Hong, Tamara Carrion, +[PRO1_I:PROT1] +Ce qu'il te faut, c'est une façade légale, Tommy! Une affaire officielle! Ca m'a jamais rapporté d'emmerdes! -[CR03_12:CRED01] -~n~ ~n~Rich Huie, Mike Nathan, ~n~Vance Wallace, Marc Rodriguez, ~n~Adam Tetzloff +[PRO1_J:PROT1] +Faut qu'on commence à utiliser des balaises ou autant faire une croix sur tout le boulot qu'on s'est tapé jusque là. -[CR03_13:CRED01] -~n~ ~n~ ~n~ ~n~Business Development Director ~n~Sean Macaluso +[PRO1_K:PROT1] +Les commerces locaux savent que Diaz est mort et ils refusent de payer pour leur protection! -[CR03_14:CRED01] -~n~ ~n~ ~n~ ~n~Soundtrack Supervision ~n~Heinz Henn, Ivan Pavlovich, ~n~Tim Sweeney +[PRO1_L:PROT1] +Ah. On pourrait essayer la corruption... -[CR04_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~CUT SCENES & DIALOGUE +[PRO1_M:PROT1] +La corruption! Mon cul, la corruption! Je vais vous montrer comment on leur fait peur! -[CR04_02:CRED01] -~n~ ~n~ ~n~ ~n~Motion Capture Director ~n~Navid Khonsari +[PRO1_01:PROT1] +~g~Défoule-toi sur les devantures des magasins et les proprios supplieront pour être protégés. -[CR04_03:CRED01] -~n~ ~n~ ~n~ ~n~Motion Capture Performed by ~n~Danny Mastrogiorgio, Jeffrey C. Hawkins, ~n~Bruce MacVittie, David Zayas, ~n~Peter Appel, Hannah Moon, ~n~Alyssa Truppelli, Joe Lotruglio +[PRO1_03:PROT1] +~r~C'était supposé être un raid éclair, pas une pause café. -[CR04_04:CRED01] -~n~ ~n~ ~n~ ~n~Voices Performed by ~n~Salvatore Leone - Frank Vincent ~n~Toni Cipriani - Danny Mastrogiorgio ~n~Donald Love - Will Janowitz +[PRO1_04:PROT1] +Mon gagne-pain est détruit! -[CR04_05:CRED01] -~n~ ~n~ Vincenzo Cilli - Joe Lotruglio ~n~Maria Latore - Fiona Gallagher ~n~JD O'Toole - Greg Wilson +[PRO1_05:PROT1] +Tout est en ruines! -[CR04_06:CRED01] -~n~ ~n~Leon McAffrey - Ron Orbach ~n~Ray Machowski - Peter Appel ~n~Toshiko Kasen - Hannah Moon +[PRO1_06:PROT1] +Je paye le prix fort pour ma protection! -[CR04_07:CRED01] -~n~ ~n~ Ned Burner - Peter Bradbury ~n~Ma Cipriani - Sondra James ~n~Giovanni Casa - Joel Jones +[PRO1_07:PROT1] +Ma belle vitrine! -[CR04_08:CRED01] -~n~ ~n~Kazuki Kasen - Keenan Shimizu, ~n~Massimo Torini - Duccio Faggella ~n~Mickey Hamfists - Chris Tardio +[PRO1_08:PROT1] +Mon magasin! Mon beau magasin! -[CR04_09:CRED01] -~n~ ~n~Jane Hopper - Gordana Rashovich ~n~Mayor O'Donovan - John Braden ~n~8 Ball - Guru +[PRO1_09:PROT1] +Vercetti. Souvenez-vous de mon nom... -[CR04_10:CRED01] -~n~ ~n~Radio Newscaster - Sharon Washington ~n~TV Reporter - Brooke Alexander +[PRO1_10:PROT1] +Je règne désormais sur cette ville. MOI! -[CR04_11:CRED01] -~n~ ~n~ ~n~ ~n~Pedestrian Dialogue ~n~Una Cruickshank, Gregory Johnson, ~n~Sanford Santacroce, Ayana Osada +[BUYP1:PROT1] +Tu peux désormais acheter des propriétés dans certaines zones de la carte. -[CR04_12:CRED01] -~n~ ~n~ ~n~ ~n~Pedestrian Voices ~n~Jamie Hector, Jackson Loo, ~n~Bruce MacVittie, Jeff Gurner, ~n~Jamie Hector, Andrea Kessler, +[BUYP2:PROT1] +Si tu vois un marqueur vert sur une propriété, c'est que tu peux l'acheter. -[CR04_13:CRED01] -~n~ ~n~Lynne Horton, Phil Mikkelson, ~n~Koji Nonoyama, Devin Bennett, ~n~Jay Capozello, Mike Nathan, +[PRO1_N:PROT1] +Je reviens dans cinq minutes... -[CR04_14:CRED01] -~n~ ~n~Ethan Abeles, Lance Williams, ~n~Natalya Wilson, Jay Gladstone, ~n~Craig Blair, Dave Edwards, +[PRO1_11:PROT1] +~g~Va au ~y~Centre commercial de North Point~g~ dans ~y~Vice Point~g~. -[CR04_15:CRED01] -~n~ ~n~Gregory Johnson, John Zurhellen, ~n~Blair Sadler, Georgia Sadler, ~n~Nicole Sadler, Judy Henderson, +[PRO1_12:PROT1] +~g~Brise les vitrines de chaque magasin et les proprios supplieront pour une nouvelle protection. -[CR04_16:CRED01] -~n~ ~n~Kim Graham, Kerry Shaw, ~n~Tamara Carrion, Franceska Clemens, ~n~Navid Khonsari, Noelle Sadler, +[PRO1_A:PROT1] +Ah, faut qu'on redécore cet endroit, faut qu'on lui donne un air plus vieux. -[CR04_17:CRED01] -~n~ ~n~Nicholas Mongomery, Anthony Macbain, ~n~Ryan Rayhill, Josh Slater, ~n~Carmelo Gaeta, Hikari Yokoyama, +[PRO1_C:PROT1] +T'es mon avocat, Rosenberg. Pas mon décorateur. Compris? -[CR04_18:CRED01] -~n~ ~n~Chris Jobin, Michael Rothstein, ~n~Stacey Rachels, Jennifer Koontz, ~n~Dan Merrill, Ali Khonsari, +[BUYP3:PROT1] +Tiens-toi sur le marqueur, puis appuie sur la touche ~h~~k~~PED_ANSWER_PHONE~~w~ pour acheter cette propriété. -[CR04_19:CRED01] -~n~ ~n~Ellen Rose, Chris Standal, ~n~Lorie Goodman, Neal Johnston, ~n~Son Garth, James Larsen, +[PRO1_13:PROT1] +~g~Tu as cinq minutes pour tous les avoir. -[CR04_20:CRED01] -~n~ ~n~Karl Weibel, Ramin Khonsari, ~n~Ed. Thomas Jr., Stanton Sargent, ~n~Oswald Greene, Audrey Amey, +{=================================== MISSION TABLE PROT2 ===================================} -[CR04_21:CRED01] -~n~ ~n~Sanford Santacroce, Jeff Madrick, ~n~Ben Weaver, Andrea Kessler, ~n~CS Lee, Yoshi Amao, +[PRO2_A:PROT2] +C'est quoi l'problème? -[CR04_22:CRED01] -~n~ ~n~ Jackson Loo, Martha Morrison, ~n~Sarah Bloodsworth, Adam Deher, ~n~Billy Gonzalez +[PRO2_B:PROT2] +Un bar refuse de payer. -[CR04_23:CRED01] -~n~ ~n~ ~n~ ~n~Additional Motion Graphics ~n~Maryam Parwana +[PRO2_C:PROT2] +Le boss considère qu'il est sous la protection d'un gang de voyous du coin... -[CR04_24:CRED01] -~n~ ~n~ ~n~ ~n~Dialogue Recording & Mixing ~n~Nicholas Montgomery +[PRO2_D:PROT2] +Mais t'en fais pas, Tommy, je peux m'en occuper. -[CR04_25:CRED01] -~n~ ~n~ ~n~ ~n~Foley Recording ~n~Bryan Scibinico +[PRO2_E:PROT2] +C'est ça que t'appelles t'en occuper? -[CR04_26:CRED01] -~n~ ~n~ ~n~ ~n~Foley recorded at Dig It Studios +[PRO2_F:PROT2] +Vous deux, levez vos culs de là... -[CR04_27:CRED01] -~n~ ~n~ ~n~ ~n~Production Team ~n~Noelle Sadler, Eli Weissman, ~n~Kerry Shaw, John Zurhellen, ~n~Peter Adler, Anthony Carvalho, +[PRO2_G:PROT2] +Allons-y. -[CR04_28:CRED01] -~n~ ~n~Phil Poli, Jaesun Celebre, ~n~Franceska Clemens, Anthony Litton +[PRO2_01:PROT2] +~g~Liquide les gardes qui protègent le Front Page Bar et trouve qui les a approvisionnés. -[CR04_29:CRED01] -~n~ ~n~ ~n~ ~n~Casting ~n~Judy Henderson and Associates +[PRO2_10:PROT2] +~g~Il y en a deux de plus qui se sont fait la malle. Finis-en avec eux. -[CR04_30:CRED01] -~n~Motion Capture recorded at Perspective Studios +[PRO2_11:PROT2] +Montez dans la caisse, bons à rien. -[CR05_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RADIO +[PRO2_02:PROT2] +Ta protection a besoin d'être légèrement renforcée. -[CR05_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ Banter, Talk Radio, Commercials and Imaging written by ~n~Dan Houser and Lazlow +[PRO2_03:PROT2] +Ah, non, pas encore! J'en ai marre! -[CR05_03:CRED01] -~n~ ~n~ ~n~ ~n~Production by ~n~Lazlow +[PRO2_04:PROT2] +Ces imbéciles opèrent dans le quartier à partir de DBP Security. -[CR05_04:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~LCFR +[PRO2_05:PROT2] +Réglez la question entre vous, les mecs. -[CR05_05:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Smith Harrison, Karen Saltus +[PRO2_06:PROT2] +Bon, à plus tard. -[CR05_06:CRED01] -~n~ ~n~ ~n~ ~n~Heartland Values with Nurse Bob ~n~Nurse Bob - Chuck Montgomery +[PRO2_07:PROT2] +Ouais, ouais, c'est ça. -[CR05_07:CRED01] -~n~ ~n~ ~n~ ~n~Guests and Callers ~n~Ayana Osada, Nick Montgomery, ~n~Russell Lewis, Nick Born, ~n~Sean Macaluso, Kerry Shaw, +[PRO2_08:PROT2] +~g~Les abrutis du DBP Security sauront que t'y vas, alors fonce et chope-les avant qu'ils décampent! -[CR05_08:CRED01] -~n~ ~n~Chad Johnson, Craig Conner, ~n~Mary Elizabeth, Rob Cross, ~n~Josh Bitney +[PRO2_09:PROT2] +~g~Va parler au proprio du Front Page Bar. -[CR05_09:CRED01] -~n~ ~n~ ~n~ ~n~Electron Zone ~n~Steve - Ptolemy Slocum ~n~Bill - Michael Urichek +{=================================== MISSION TABLE PROT3 ===================================} -[CR05_10:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Alice Saltzman, Jeremy Wheaton, ~n~Ryan Rayhill, Maine Anderson, ~n~Patton Oswalt, Wil Wheaton, ~n~Anthony Cumia, Madena Parwana +[PRO3_A:PROT3] +Pauvre crétin! A quoi tu pensais? -[CR05_11:CRED01] -~n~ ~n~ ~n~ ~n~Breathing World ~n~Lee Chowder - Ashley Albert ~n~Crow - Gregg Martin +[PRO3_B:PROT3] +Tu réalise ce qui aurait pu arriver? -[CR05_12:CRED01] -~n~ ~n~ ~n~ ~n~Coq 'O' Vin ~n~Richard Goblin - Mike Shapiro +[PRO3_C:PROT3] +On a failli tous se faire avoir! -[CR05_13:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Ben Krech +[PRO3_D:PROT3] +Le retardateur a dû déconner... -[CR05_14:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Franceska Clemins, Sarah Bloodsworth, ~n~Adam Deher, Martha Morrison, ~n~Carmelo Gaeta +[PRO3_E:PROT3] +Cet endroit était prêt à sauter comme une usine de feux d'artifice. -[CR05_15:CRED01] -~n~ ~n~ ~n~ ~n~Chatterbox ~n~Lazlow as himself +[PRO3_F:PROT3] +Et pis quelqu'un a rencardé les flics... -[CR05_16:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Susan Lewis, Ben Weaver, ~n~Jacky Bam Bam, Ben Sparks, ~n~Deanna Moyer, Liezl Jacinto, +[PRO3_G:PROT3] +C'est quoi le problème, les mecs? -[CR05_17:CRED01] -~n~ ~n~Joshua Batista, Gregg Opie Hughes, ~n~Sondra James, Elizabeth Satterwhite +[PRO3_H:PROT3] +Mike devait foutre le feu quelque part dans le centre commercial, -[CR06_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~HEAD RADIO +[PRO3_I:PROT3] +mais il a foiré son coup et maintenant, les flics grouillent, là-bas. -[CR06_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Michael Hunt - Russ Mottla +[PRO3_J:PROT3] +Faut qu'on récupère notre bordel et qu'on s'tire de là! -[CR06_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Jeff Berlin, Katelyn Hutchinson +[PRO3_K:PROT3] +Du calme, vous deux, laissez-moi réfléchir une seconde! -[CR06_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jeff Berlin +[PRO3_L:PROT3] +Tommy Vercetti a pas l'habitude de mettre les bouts comme ça... -[CR06_05:CRED01] -~n~ ~n~ ~n~ ~n~"Train" ~n~Conor & Jay ~n~Written by Craig Conner & Julie Wemyss ~n~Produced by Craig Conner ~n~Guitars by Jon McCavish ~n~Vocals by Julie Wemyss and Craig Conner +[PRO3_M:PROT3] +Les flics vont passer ce bâtiment au peigne fin, pas vrai? -[CR06_06:CRED01] -~n~ ~n~ ~n~ ~n~"The One For Me" ~n~Cloud Nineteen ~n~Written & Produced by ~n~Will Morton ~n~Additional Lyrics by Paul Mackie ~n~Guitars by Allan Walker & Chris Morton ~n~Lead Vocals by Raff ~n~Backing Vocals by Paul Mackie & Raff +[PRO3_N:PROT3] +Mais ça prend du temps... -[CR06_07:CRED01] -~n~ ~n~ ~n~ ~n~"Take The Pain" ~n~Purser ~n~Written & Produced by ~n~Will Morton, Chris Morton ~n~Additional Lyrics by Paul Mackie ~n~Lead Vocals by Paul Mackie ~n~Additional Vocals by Will Morton +[PRO3_O:PROT3] +On va entrer et foutre le feu nous-mêmes! -[CR06_08:CRED01] -~n~ ~n~ ~n~ ~n~"Free Yourself" ~n~L-Marie featuring Raff ~n~Written & Produced by Craig Conner ~n~Vocals by L-Marie and Raff ~n~Backing Vocals by Craig Conner +[PRO3_P:PROT3] +Ouais, mais... -[CR06_09:CRED01] -~n~ ~n~ ~n~ ~n~"Drive" ~n~15 Ways ~n~Written & Produced by Colin Entwistle ~n~Vocals by Paul Mackie +[PRO3_Q:PROT3] +Il y a que les flics qui peuvent approcher à moins d'un kilomètre de là-bas! -[CR06_10:CRED01] -~n~ ~n~ ~n~ ~n~"Welcome To The Real World" ~n~Rosco Stow ~n~Written & Produced by Craig Conner ~n~Guitars Written, Produced and Performed by Allan Walker ~n~Lead Vocals by Andy Dorrat ~n~Backing Vocals by Craig Conner, ~n~Anna Stuart and Kim Gurney +[PRO3_R:PROT3] +Alors, on ira en tant que flics! -[CR06_11:CRED01] -~n~ ~n~ ~n~ ~n~"Keep Dreaming" ~n~Vanilla Smoothie ~n~Written & Produced by ~n~Alastair MacGregor ~n~Guitars by Allan Walker ~n~Vocals by Fiona Stoddart +[PRO3_S:PROT3] +On va se dégotter des uniformes et il nous faut aussi une bagnole de patrouille. -[CR07_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~LIPS 106 +[PRO3_T:PROT3] +Tout ça à cause de toi, Mike. -[CR07_02:CRED01] -~n~ ~n~ ~n~ ~n~DJs ~n~Cliff - Ed McMann ~n~Andee - Shelley Miller +[PRO3_U:PROT3] +Je suis désolé. -[CR07_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Jonathan Hanst +[PRO3_V:PROT3] +J'ai trouvé! -[CR07_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jonathan Hanst +[PRO3_W:PROT3] +Tout ce qu'on a à faire, c'est appâter les flics avec un doigt levé, -[CR07_05:CRED01] -~n~ ~n~ ~n~ ~n~"Funk In Time" ~n~Rudy La Fontaine ~n~Written & Produced by Jon McCavish ~n~Guitars by Julian Pais ~n~Vocals by Julian Pais +[PRO3_X:PROT3] +de les prendre au piège -[CR07_06:CRED01] -~n~ ~n~ ~n~ ~n~"Love Is The Feeling" ~n~Sawarr ~n~Written by Craig Conner & Julie Wemyss ~n~Produced by Craig Conner ~n~Vocals by Julie Wemyss +[PRO3_Y:PROT3] +et de leur sauter dessus! -[CR07_07:CRED01] -~n~ ~n~ ~n~ ~n~"Mine Until Monday" ~n~Sunshine Shine ~n~Written & Produced by Will Morton ~n~Additional Lyrics by Paul Mackie ~n~Vocals by Paul Mackie & Raff +[PRO3_Z:PROT3] +Super plan! En route! -[CR07_08:CRED01] -~n~ ~n~ ~n~ ~n~"Get Down" ~n~Credit Check ~n~Written & Produced by ~n~Alastair MacGregor ~n~Guitars by Martyn Livingstone ~n~Bass by Andy Wilson ~n~Vocals by Louise Ferrier +[PRO3_A1:PROT3] +OK. -[CR07_09:CRED01] -~n~ ~n~ ~n~ ~n~"Tonight" ~n~Cool Timers ~n~Written & Produced by Craig Conner ~n~Vocals by Julie Wemyss +[PRO3_01:PROT3] +Ok Lance, attirons l'attention des flics! -[CR07_10:CRED01] -~n~ ~n~ ~n~ ~n~"Bassmatic" ~n~Nina Barry ~n~Written & Produced by Jon McCavish ~n~Vocals by Riz Maslen +[PRO3_02:PROT3] +~g~Prends la bagnole des flics et va poser la bombe au Tarbrush Coffee Shop dans le centre commercial. -[CR07_11:CRED01] -~n~ ~n~ ~n~ ~n~"Into Something (C'mon Get Down)" ~n~The Jackstars ~n~Written & Produced By ~n~Craig Conner ~n~Vocals by Lucie Danti-Juan ~n~Backing vocals by ~n~Kevin Stacey & Craig Conner +[PRO3_03:PROT3] +~g~T'as laissé Lance derrière, va le récupérer! -[CR08_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~DOUBLE CLEF FM +[PRO3_04:PROT3] +~g~Allons-y! -[CR08_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Sergio Boccino - Robert Blumenfeld +[PRO3_05:PROT3] +~r~T'as buté Lance! -[CR08_03:CRED01] -~n~ ~n~ ~n~ ~n~Caller ~n~Gerald Cosgrove +[PRO3_07:PROT3] +~g~Tu as grillé ta couverture! Magne-toi de poser la bombe! -[CR08_04:CRED01] -~n~ ~n~ ~n~ ~n~"Il Trovatore: Anvil Chorus" ~n~Composed by Giuseppe Verdi ~n~Performed by ~n~Nuremberg Symphonic Orchestra ~n~& Munich State Opera Choir ~n~Courtesy of Point Classics, LLC +[PRO3_09:PROT3] +Ligotons et bâillonnons-les! -[CR08_05:CRED01] -~n~ ~n~ ~n~ ~n~"Il Trovatore: Tacea la notte placida" ~n~Composed by Giuseppe Verdi ~n~Performed by ~n~Nuremberg Symphonic Orchestra & ~n~Munich State Opera Choir ~n~(Eva Illes, Soprano) ~n~Courtesy of Point Classics, LLC +[PRO3_10:PROT3] +Aaah! Il me va parfaitement! -[CR08_06:CRED01] -~n~ ~n~ ~n~ ~n~"Nabucco: Chorus of the Hebrew Slaves" ~n~Composed by Giuseppe Verdi ~n~Performed by Philharmonia Slavonica ~n~Courtesy of Point Classics, LLC +[PRO3_11:PROT3] +Mais quand même un peu serré au niveau des couilles... -[CR08_07:CRED01] -~n~ ~n~ ~n~ ~n~"Così fan tutte: È amore un ladroncello" ~n~Composed by Wolfgang Amadeus Mozart ~n~Performed by ~n~Bratislava Opera Soloists, ~n~Choir and Orchestra ~n~(Ida Kirilova "Dorabella") ~n~Courtesy of Point Classics, LLC +[PRO3_12:PROT3] +Ah ouais? Le mien aussi, c'est pareil! -[CR08_08:CRED01] -~n~ ~n~ ~n~ ~n~"Marriage of Figaro: Overture" ~n~Composed by Wolfgang Amadeus Mozart ~n~Performed by ~n~London Philharmonic Orchestra ~n~Courtesy of Point Classics, LLC +[PRO3_13:PROT3] +Du calme, mon pote! Les flics conduisent pas aussi mal! -[CR08_09:CRED01] -~n~ ~n~ ~n~ ~n~"I Pagliacci: Vesti la giubba" ~n~Composed by Ruggiero Leoncavallo ~n~Performed by ~n~Nuremberg Symphonic Orchestra ~n~(José Maria Perez, Tenor) ~n~Courtesy of Point Classics, LLC +[PRO3_14:PROT3] +Oublie pas... Faut sourire aux autres flics... -[CR09_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RISE FM +[PRO3_15:PROT3] +Salut officier. Bel insigne, bel insigne... -[CR09_02:CRED01] -~n~ ~n~ ~n~ ~n~Engineered by Mike Callaghan +[PRO3_16:PROT3] +Tout doux, Lance. -[CR09_03:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Boy Sanchez - Oliver Vaquer +[PRO3_17:PROT3] +Ok, les retardateurs sont programmés, 5 secondes et ça saute! -[CR09_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~DJ Andre, Lupus Thunder, ~n~Andi Hanley, Mat Ckillz, ~n~Couzin Ed, Lazlow, +[PRO3_18:PROT3] +5 secondes? Putain faut dégager d'ici en vitesse! -[CR09_05:CRED01] -~n~ ~n~Terry Donovan, Bill Brissette, ~n~Juan Aller, Ed Andrews, ~n~Xeni Jardin, Matthew Orr, ~n~Jeff Berlin +[PRO3_19:PROT3] +Maintenant, ils vont vraiment être fâchés... -[CR09_06:CRED01] -~n~ ~n~ ~n~ ~n~"Sing It Back ~n~(Boris Musical Mix)" ~n~Moloko ~n~Written by M. Brydon, R. Murphy ~n~Published by Chrysalis Music (ASCAP) ~n~Remix and Additional Production by ~n~Boris Dlugosch ~n~(p) + © 1998 The Echo Label ~n~Courtesy of Chrysalis Music Limited +[PRO3_20:PROT3] +~g~Fais-toi suivre par deux flics dans le garage. -[CR09_07:CRED01] -~n~ ~n~ ~n~ ~n~"Free" ~n~Ultra Nate ~n~Written by U. Nate, L. Springsteen, ~n~J. Ciafone ~n~Published by Warner/ Chappell Music/ BMG Music ~n~(p) + © 1997 Strictly Rhythm Records LLC ~n~Courtesy of Warner Strategic Marketing +[PRO3_21:PROT3] +~g~Tu dois avoir un indice de recherche pour que les flics te suivent dans le piège. -[CR09_08:CRED01] -~n~ ~n~ ~n~ ~n~"I Believe" ~n~Happy Clappers ~n~Written by C. Scott, G. Ripley, M. Knotts, M. Topham ~n~Published by All Boys Music Ltd ~n~(p) + © 1994 C J Scott Productions ~n~Courtesy of C J Scott Productions +[PRO3_22:PROT3] +~g~La porte est bloquée! Dégage le passage pour qu'elle puisse être refermée. -[CR09_09:CRED01] -~n~ ~n~ ~n~ ~n~"House Music" ~n~Eddie Amador ~n~Written by Eddie Amador ~n~Published by ~n~Deep Dish Music ~n~(p) + © 1998 Yoshitoshi Records ~n~Courtesy of ~n~Deep Dish Recordings, Inc. ~n~by arrangement with ~n~Nasseri Music Business Solutions +[PRO3_23:PROT3] +~g~Marche sur le marqueur pour poser la bombe. -[CR09_10:CRED01] -~n~ ~n~ ~n~ ~n~"Feel What You Want" ~n~Kristine W ~n~Written by R. Dougan, R. Armstrong, ~n~K. Weitz ~n~Published by BMG Music/Weitz House Publishing (ASCAP)/ EMI Music Publishing ~n~(p) + © 1996 RCA/ BMG ~n~Courtesy of Sony BMG Entertainment +[PRO3_24:PROT3] +~g~Tire-toi du café! -[CR09_11:CRED01] -~n~ ~n~ ~n~ ~n~"Hideaway ~n~(Deep Dish Vocal Remix)" ~n~De'Lacy ~n~Written by K. Hedge, J. Milan ~n~Published by ~n~Warner-Tamerlane Publishing Corp ~n~Remix and Additional Production by ~n~Deep Dish ~n~(p) 1995 Easy Street Recordings Inc ~n~© 1998 Kickin Music Ltd ~n~Courtesy of Easy Street Recordings Inc. and Slip n' Slide Records +[PRO_AS1:PROT3] +PROTECTION OK -[CR09_12:CRED01] -~n~ ~n~ ~n~ ~n~"Spin Spin Sugar ~n~(Armand's Dark Garage Mix)" ~n~Sneaker Pimps ~n~Written by I. Pickering, L. Coverdale Howe, C. Corner ~n~Remix and Additional Production by ~n~Armand Van Helden ~n~Published by BMG Songs, Inc ~n~(p) + © 1997 Clean Up Records Ltd ~n~Courtesy of EMI Music / ~n~One Little Indian, Ltd +[PRO_AS2:PROT3] +~g~Vercetti Estate génère désormais un revenu de $~1~ maximum. Pense à récupérer le fric régulièrement. -[CR09_13:CRED01] -~n~ ~n~ ~n~ ~n~"Plastic Dreams" ~n~Jaydee ~n~Written by R. Albers ~n~Published by TBM Holland ~n~(p) 1992 R & S Records ~n~© Robin Albers ~n~Courtesy of Robin "Jaydee" Albers +[PRO3_08:PROT3] +~g~ Retourne à ~h~Vercetti Estate~g~ sur ~h~Starfish Island~g~. -[CR09_14:CRED01] -~n~ ~n~ ~n~ ~n~"Altered States" ~n~Ron Trent ~n~Written by R. Trent ~n~Published by ~n~High Fashion Music/ Nanada Music ~n~(p) + © 1993 Warehouse ~n~Djax-Up Beats ~n~Courtesy of High Fashion Music/ ~n~Djax-Up Beats +{=================================== MISSION TABLE RACES ===================================} -[CR09_15:CRED01] -~n~ ~n~ ~n~ ~n~"There Will Come A Day (Half Tab Dub)" ~n~The Absolute featuring Suzanne Palmer ~n~Written by M. Pichiotti, C.J. Snider ~n~Published by Much Noyse Music/ ~n~Hoobini Music (ASCAP) ~n~(p) + © 1995 Mark Productions, Inc ~n~Courtesy of Mark Productions, Inc +[RACES_2:RACES] +~g~Il te faut un véhicule, c'est pas une course à pied! -[CR09_16:CRED01] -~n~ ~n~ ~n~ ~n~"Positive Education" ~n~Slam ~n~Written by S. McMillan, O. Meikle, ~n~G. Gibbons, J. Muotone ~n~Published by EMI Music Publishing ~n~(p) + © 1997 Soma Recordings Ltd ~n~Courtesy of Soma Recordings Ltd +[RACES_3:RACES] +3... 2... 1... PARTEZ! -[CR09_17:CRED01] -~n~ ~n~ ~n~ ~n~"Flash" ~n~Green Velvet ~n~Written by C. Jones ~n~Published by Curtis A. Jones Music (ASCAP) ~n~(p) 1995 Relief Records ~n~© 2000 Warner Bros. Records and N.E.W.S. Records and Relief Records ~n~Courtesy of Warner Strategic Marketing, N.E.W.S. Records, Relief Records +[RACES_8:RACES] +~r~Tu n'as pas gagné la course! -[CR09_18:CRED01] -~n~ ~n~ ~n~ ~n~"Circus Bells (Hardfloor Remix)" ~n~Robert Armani ~n~Written by R. Armani ~n~Published by ~n~High Fashion Music/ Nanada Music ~n~(p) + © 1993 Warehouse/ ~n~Djax-Up Beats ~n~Courtesy of High Fashion Music/ ~n~Djax-Up Beats +[RACES00:RACES] +Course ~1~ : -[CR09_19:CRED01] -~n~ ~n~ ~n~ ~n~"Higher State Of Consciousness" ~n~Wink ~n~Written by J. Wink ~n~Published by Strictly Rhythm Publishing, Inc. (ASCAP) / Warner/Chappell Music / Wink Inc. (ASCAP) / EMI Music Publishing ~n~(p) + © 1995 Strictly Rhythm Records LLC ~n~Courtesy of Warner Strategic Marketing +[RACES01:RACES] +Terminal Velocity -[CR10_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RADIO DEL MUNDO +[RACES02:RACES] +Ocean Drive -[CR10_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Panjit Gavaskar - Hajaz Akram +[RACES03:RACES] +Border Run -[CR10_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Jessica Wachsman +[RACES04:RACES] +Capital Cruise -[CR10_04:CRED01] -~n~ ~n~ ~n~ ~n~"Raghupati (Folk Tune)" ~n~Ananda Shankar ~n~Arranged by A. Shankar, Lewinson, Hassilev ~n~Published by Warner Chappell Inc ~n~(p) + © 1970 Reprise Records for the U.S. and WEA International Inc ~n~Courtesy of Warner Strategic Marketing +[RACES05:RACES] +Virée! -[CR10_05:CRED01] -~n~ ~n~ ~n~ ~n~"Dum Maro Dum" ~n~Asha Bhosle ~n~Written by RD Burman, Anand Bakshi ~n~Published by Saregama India Ltd ~n~(p) + © 1971 Saregama India Ltd ~n~Courtesy of Saregama India Ltd +[RACES06:RACES] +Endurance V.C. -[CR10_06:CRED01] -~n~ ~n~ ~n~ ~n~"Neeve Nanna (Only You Were Mine)" ~n~Vijaya Anand ~n~Written by Vijaya Anand ~n~Published by Shake Boom! (ASCAP)/ ~n~Luaka Bop Inc ~n~(p) 1988 Lahari/Audiovision ~n~© 1992 Sire Records Company ~n~Courtesy of ~n~Luaka Bop Records +[RACES07:RACES] +Participation : ~1~$ -[CR10_07:CRED01] -~n~ ~n~ ~n~ ~n~"Kidda" ~n~Natacha Atlas ~n~Written by N. Atlas, J. Reynolds, J. Adams ~n~Published by Warner Chappell Music Ltd ~n~(p) + © 1997 Nation Records Ltd/ ~n~Beggars Banquet Records Ltd ~n~Courtesy of Nation Records Ltd/ ~n~Beggars Banquet Records Ltd +[RACES08:RACES] +Meilleur temps : ~1~:~1~ -[CR10_08:CRED01] -~n~ ~n~ ~n~ ~n~"Hebeena Hebeena" ~n~Farid El Atrache ~n~Written by Barakat, Atrache ~n~Published by Voices Of Lebanon ~n~(p) + © 1974 Voices Of Lebanon ~n~Courtesy of EMI Music/ EMI Music Arabia +[RACES09:RACES] +Meilleure perf : 1er -[CR10_09:CRED01] -~n~ ~n~ ~n~ ~n~"Aini Bet Ref" ~n~Ahmed Mneimneh ~n~Written by A. Alishaan ~n~Published by D. Dersahakian (ASCAP) ~n~(p) + © Voice of Stars & ~n~Lys Records ~n~Courtesy of Voice of Stars & ~n~Lys Records +[RACES10:RACES] +Meilleure perf : 2e -[CR10_10:CRED01] -~n~ ~n~ ~n~ ~n~"Im Nin'Alu" ~n~Ofra Haza ~n~Traditional, Arranged by I. Ashdot, B. Nagari ~n~Published by Blue Lake Music ~n~ (p) + © 1988 Sire Records Company ~n~Courtesy of Warner Strategic Marketing +[RACES11:RACES] +Meilleure perf : 3e -[CR10_11:CRED01] -~n~ ~n~ ~n~ ~n~"Ballaa Tsoubou Hal Kahwa" ~n~Samira Tawfic ~n~Written by R. Al Khylani, J. Al A'ss ~n~Published by Copyright Control ~n~(p) + © Voices Of Lebanon ~n~Courtesy of EMI Music/ EMI Music Arabia +[RACES12:RACES] +Meilleure perf : 4e -[CR11_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~K-JAH +[RACES13:RACES] +Longueur circuit : ~1~.~1~ km -[CR11_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Natalee Walsh Davis - Pascale Armand +[RACES15:RACES] +Meilleur temps : NA -[CR11_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Karl Weibel, Pat McKay +[RACES16:RACES] +Meilleure perf : NA -[CR11_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jay Wright Productions +[RACES18:RACES] +TU AS GAGNE : $~1~ -[CR11_05:CRED01] -~n~ ~n~ ~n~ ~n~"Pick a Sound" ~n~Selah Collins, Ruddy Ranks, Redeye ~n~Written by S. Collins, H. Burke, ~n~E. Donaldson ~n~Published by Copyright Control/ MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[RACES19:RACES] +Tu n'as pas assez de moyens pour participer. -[CR11_06:CRED01] -~n~ ~n~ ~n~ ~n~"What a Wonderful Feeling" ~n~Errol Bellot, Ruddy Ranks, Redeye ~n~Written by E. Bellot, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[RACES22:RACES] +Meilleur temps : ~1~:0~1~ -[CR11_07:CRED01] -~n~ "Watch How the People Dancing" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by K. Wright ~n~Published by Jetstar ~n~Courtesy of Honest Jons Records +[RACES23:RACES] +Longueur circuit : ~1~.~1~ miles -[CR11_08:CRED01] -~n~ ~n~ ~n~ ~n~"Lean Boot" ~n~Richie Davis, Ruddy Ranks, Redeye ~n~Written by R. Davis, H. Burke, ~n~E. Donaldson ~n~Published by Westbury Music/ MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[RACES_1:RACES] +~g~Trouve un bolide et rends-toi sur la grille de départ. -[CR11_09:CRED01] -~n~ ~n~ ~n~ ~n~"Ready For the Dancehall Tonight" ~n~Peter Bouncer, Ruddy Ranks, Redeye ~n~Written by Peter McKenzie, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[RACEHLP:RACES] +~w~Appuie sur la~h~ ~k~~PED_SPRINT~~w~ pour commencer la course choisie. Appuie sur la~h~ ~k~~VEHICLE_ENTER_EXIT~~w~ pour quitter. -[CR11_10:CRED01] -~n~ ~n~ ~n~ ~n~"You Ha Fe Cool" ~n~Richie Davis, Ruddy Ranks, Redeye ~n~Written by R. Davis, H. Burke, ~n~E. Donaldson. ~n~Published by Westbury Music/MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +{=================================== MISSION TABLE RCHELI1 ===================================} -[CR11_11:CRED01] -~n~ ~n~ ~n~ ~n~"Ring My Number" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by Kenneth Wright, H. Burke, ~n~E. Donaldson. ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[WRECKED:RCHELI1] +Ton véhicule est mort! -[CR11_12:CRED01] -~n~ ~n~ ~n~ ~n~"Run Come Call Me" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by Kenneth Wright, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[RCH1_4:RCHELI1] +Points de passage restants : -[CR12_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~THE LIBERTY JAM +[RCH1_6:RCHELI1] +~g~Utilise l'hélico télécommandé pour passer les points de passage à travers l'aéroport. -[CR12_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~DJ Clue as himself +[RCH1_7:RCHELI1] +~g~Il y a 20 points de passage en tout. -[CR12_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Jay Wright, Tom Yankowski, Chris Mercado, Vanessa Grullon +[RCH1_12:RCHELI1] +~g~L'hélicoptère télécommandé est presque hors de portée! -[CR12_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jay Wright Productions +[RCH1_13:RCHELI1] +~r~L'hélicoptère radiocommandé est hors de portée! -[CR12_05:CRED01] -~n~ ~n~ ~n~ ~n~"All I Need" ~n~Method Man ~n~Written by C. Smith, R. Diggs ~n~Published by Sony BMG Music ~n~(p) + © 1994 Def Jam Recordings ~n~Courtesy of Def Jam Recordings/ UME +[RCH1_8:RCHELI1] { reVC update } +~g~Si tu veux quitter cette mission, appuie sur la ~h~~k~~VEHICLE_FIREWEAPON~~g~ pour faire exploser ton hélicoptère radiocommandé. -[CR12_06:CRED01] -~n~ ~n~ ~n~ ~n~"Shook Ones Pt. II" ~n~Mobb Deep ~n~Written by A. Johnson, K. Muchita ~n~Published by ~n~BMG Songs Inc. (ASCAP) ~n~(p) + © 1995 BMG Music ~n~Courtesy of RCA Records by arrangement with Sony BMG Ent +{=================================== MISSION TABLE RCPLNE1 ===================================} -[CR12_07:CRED01] -~n~ ~n~ ~n~ ~n~"Incarcerated Scarface" ~n~Raekwon ~n~Written by R. Diggs, C. Woods, A. Tilman ~n~Published by ~n~Careers-BMG Music Publishing Inc./ ~n~Wu Tang Publishing (BMI)/ ~n~Bridgeport Music ~n~(p) + © 1995 BMG Music +[RCPL1_4:RCPLNE1] +~g~Fais une COURSE DE POINTS DE PASSAGE avec 3 autres avions télécommandés. -[CR12_08:CRED01] -Courtesy of RCA Records by arrangement with Sony BMG Ent ~n~This track contains a sample of "You're Getting A Little Too Smart" as performed by The Detroit Emeralds. Courtesy of Westbound Records. Used by permission. All rights reserved +[RCPL1_5:RCPLNE1] +~g~Passe par les points de passage dispersés dans Vice City. -[CR12_09:CRED01] -~n~ ~n~ ~n~ ~n~"N.O.R.E." ~n~Noreaga ~n~Written by V. Santiago, J. Olivier, ~n~S. Barnes ~n~Published by Suite 1202 Music/ Jose Luis Gotcha Music (BMI)/ Slamuwell Productions/ Jelly's Jam LLC (ASCAP)/ ~n~12 & Under Music/ +[RCPL1_6:RCPLNE1] { reVC update } +~g~Si tu veux quitter cette mission, appuie sur la ~h~~k~~VEHICLE_FIREWEAPON~~g~ pour faire exploser ton avion radiocommandé. -[CR12_10:CRED01] -Jumping Bean Songs LLC (BMI) ~n~(p) + © 1998 Penalty Recordings ~n~Courtesy of Warner Strategic Marketing +[RCPL1_8:RCPLNE1] +~g~Ton avion RC va sortir du périmètre! -[CR12_11:CRED01] -~n~ ~n~ ~n~ ~n~"Shut 'Em Down (Remix)" ~n~Onyx featuring Noreaga & Big Pun ~n~Written by F. Scruggs, K. Jones, T. Taylor, E. Hinson, E. Simmons ~n~Published by Universal Music/ ~n~Let Me Show You Music/ ~n~Jelly Jams Music/ +[RCPL1_9:RCPLNE1] +~r~Ton avion RC est sorti du périmètre! -[CR12_12:CRED01] -III Posse Music/ Ill Hill Billy'z Music/ Warner-Tamerlane Music ~n~(p) + © 1998 Rush Associated Labels Recordings ~n~Courtesy of Universal Music Enterprises +{=================================== MISSION TABLE RCRACE1 ===================================} -[CR12_13:CRED01] -~n~ ~n~ ~n~ ~n~"Beware" ~n~Big Pun ~n~Written by C. Rios, J. Tineo ~n~Published by Let Me Show You Music/ ~n~Joe Cartegena Music (ASCAP), ~n~Administered by Jelly Jams Music (BMI)/ ~n~P.H.D. Music (ASCAP) +[RCR1_4:RCRACE1] +Tours restants : -[CR12_14:CRED01] -(p) + © 1998 Loud Records LLC ~n~Courtesy of Columbia Records by arrangement with Sony BMG Ent +[RCR1_1:RCRACE1] +~g~Fais une course de points de passage contre 3 autres voitures RC. -[CR12_15:CRED01] -~n~ ~n~ ~n~ ~n~"Twinz (Deep Cover 98)" ~n~Big Pun ~n~Written by C. Rios, J. Cartegena, ~n~C. Brodus, A. Young, C. Wolfe ~n~Published by Let Me Show You Music/ ~n~Joe Cartegena Music (ASCAP)/ ~n~Jelly Jams Music (BMI)/ ~n~Sony Tunes Inc. (ASCAP) +[RCR1_2:RCRACE1] +~g~Sois le premier à boucler 2 tours de circuit pour gagner! -[CR12_16:CRED01] -~n~(p) + © 1998 Loud Records LLC ~n~Courtesy of Columbia Records by arrangement with Sony BMG Ent ~n~This track contains a sample of "Deep Cover" as performed by Dr. Dre. Courtesy of Solar Records. Used by permission. All rights reserved +[RCR1_6:RCRACE1] +~g~Ta voiture RC va sortir du périmètre! -[CR12_17:CRED01] -~n~ ~n~ ~n~ ~n~"Get At Me Dog" ~n~DMX featuring Sheek of The Lox ~n~Written by E. Simmons, D. Blackman, ~n~A. Fields, S. Taylor ~n~Published by Universal Music Publishing/ EMI April Music/ ~n~Sony ATV Tunes +[RCR1_7:RCRACE1] +~r~Ta voiture RC est sortie du périmètre! -[CR12_18:CRED01] -~n~(p) + © 1998 Rush Associated Labels Recordings ~n~Courtesy of Universal Music Enterprises +{=================================== MISSION TABLE ROCK1 ===================================} -[CR12_19:CRED01] -~n~ ~n~ ~n~ ~n~"Ruff Ryders Anthem (Remix)" ~n~DMX featuring DJ Clue, Jadakiss, Styles, Drag-On & Eve ~n~Written by J. Phillips, M.J. Smalls, E. Shaw, K. Ifill, E. Simmons, K. Dean, E. Jeffers ~n~Published by Universal Music Publishing/ EMI Music Publishing +[RBM1_A:ROCK1] +Okaaaaaaaaaay! -[CR12_20:CRED01] -(p) + © 1998 Roc-a-Fella Records ~n~Courtesy of Universal Music Enterprises +[RBM1_B:ROCK1] +Grandiose! Vraiment génial! -[CR12_21:CRED01] -~n~ ~n~ ~n~ ~n~"Do What You Feel" ~n~Redman featuring Method Man ~n~Written by P. Michael, R. Noble, C. Smith ~n~Published by Careers BMG/ Sony ATV Tunes/ Famous Music ~n~(p) + © 1996 Def Jam ~n~Courtesy of Universal Music Enterprises +[RBM1_D:ROCK1] +Hé, t'as déjà rencontré les Love Fist? -[CR12_22:CRED01] -~n~ ~n~ ~n~ ~n~"Chain Gang Freestyle" ~n~The Lox & Black Rob ~n~Written by Frierson, Phillips, Styles, Jacobs, Ross, Shaw ~n~Published by EMI Music Publishing ~n~Courtesy of Bad Boy Records +[RBM1_E:ROCK1] +Non, mais j'adore votre musique! -[CR12_23:CRED01] -~n~ ~n~ ~n~ ~n~"Chest2chest Freestyle" ~n~The Lox ~n~Written by Phillips, Styles, Jacobs, Shaw, Barnes, Lemay, Montgomery ~n~Published by Taggie Music (BMI)/ ~n~Universal Polygram Int'l. (ASCAP)/ ~n~EMI Music Publishing ~n~Courtesy of Bad Boy Records +[RBM1_F:ROCK1] +Laisse-moi te présenter au groupe. -[CR12_24:CRED01] -This track contains a sample of "Next Level" as performed by Showbiz & AG. Courtesy of Universal Music Enterprises. Used by permission. All rights reserved +[RBM1_G:ROCK1] +Voici P, Percy, Dick et Willy est aux chiottes et Jezz était dans la cabine tout à l'heure... -[CR13_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~MSX 98 +[RBM1_H:ROCK1] +Les mecs, je veux vous présenter un bon ami à moi. -[CR13_02:CRED01] -~n~ ~n~ ~n~ ~n~MC ~n~Codebreaker as himself +[RBM1_I:ROCK1] +Voici Tommy. Ca fait un bail qu'on se connait. -[CR13_03:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Timecode +[RBM1_J:ROCK1] +Ok, mon pote. -[CR13_04:CRED01] -~n~ ~n~ ~n~ ~n~Station Production ~n~Timecode +[RBM1_K:ROCK1] +Ah, euh... C'est quoi déjà, ton nom? -[CR13_05:CRED01] -~n~ ~n~ ~n~ ~n~"Renegade Snares" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1993 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_L:ROCK1] +Arrête-ça Jezz tu t'en souviens, -[CR13_06:CRED01] -~n~ ~n~ ~n~ ~n~"Terrorist" ~n~Renegade ~n~Written, Produced & Engineered by ~n~A. Dookith ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_M:ROCK1] +et essaye pas de jouer au plus malin avec moi, -[CR13_07:CRED01] -~n~ ~n~ ~n~ ~n~"Finest Illusion (Legal Mix)" ~n~Foul Play ~n~Written, Produced & Engineered by ~n~J. Morrow, S. Bradshaw, ~n~S. Gurley ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1993 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_N:ROCK1] +je suis trop intelligent, mon mignon! -[CR13_08:CRED01] -~n~ ~n~ ~n~ ~n~"Living For the Future (FBD Project Remix)" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_O:ROCK1] +Tu vois, le problème, Tom, c'est que ces garçons ont besoin d'aide. -[CR13_09:CRED01] -~n~ ~n~ ~n~ ~n~"Stay Calm (Foul Play Remix)" ~n~DJ Pulse ~n~Written, Produced & Engineered by ~n~A. Brown ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_P:ROCK1] +Ils n'ont pas beaucoup de contacts ici et ils savent pas à qui s'adresser. -[CR13_10:CRED01] -~n~ ~n~ ~n~ ~n~"Disturbance (Tango Remix)" ~n~Hyper-On Experience ~n~Written, Produced & Engineered by ~n~A. Banks, D. Demierre ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_Q:ROCK1] +On a besoin de drogue, mon pote! -[CR13_11:CRED01] -~n~ ~n~ ~n~ ~n~"Cold Fresh Air" ~n~Higher Sense ~n~Written, Produced & Engineered by ~n~A. Miles, DJ Rhythm ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_R:ROCK1] +Faut qu'on réveille la vieille fureur de Love Fist, tu vois? -[CR13_12:CRED01] -~n~ ~n~ ~n~ ~n~"Living For the Future" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_S:ROCK1] +Et bien, ici, c'est Vice City, quel est le problème? -[CR13_13:CRED01] -~n~ ~n~ ~n~ ~n~"Thru The Vibe (2 on 1 Mix)" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_U:ROCK1] +Du Love Juice, mec! -[CR13_14:CRED01] -~n~ ~n~ ~n~ ~n~"The Helicopter Tune" ~n~Deep Blue ~n~Written, Produced & Engineered by ~n~S. O'Keefe ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_V:ROCK1] +Du Love Juice? -[CR13_15:CRED01] -~n~ ~n~ ~n~ ~n~"Dred Bass" ~n~Dead Dred ~n~Written, Produced & Engineered by ~n~W. Smith, L. Smith ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_W:ROCK1] +Ouais, deux doses de boomshine, une dose de trompette, 5 bombes fizz et un litre d'essence. -[CR14_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~FLASHBACK FM +[RBM1_X:ROCK1] +Tu peux nous aider, mon pote? -[CR14_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Reni Wassulmaier - Barbara Rosenblatt +[RBM1_Y:ROCK1] +Ah, ça rendrait tellement service aux garçons! -[CR14_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Mike Shapiro +[RBM1_Z:ROCK1] +Tu peux faire ça pour les garçons, pas vrai? -[CR14_04:CRED01] -~n~ ~n~ ~n~ ~n~"First Hand Experience ~n~In Second Hand Love" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Giorgio Moroder ~n~Courtesy of Giorgio Moroder +[RBM1_8:ROCK1] +~r~Mercedes est morte! -[CR14_05:CRED01] -~n~ ~n~ ~n~ ~n~"I Wanna Rock You" ~n~Giorgio ~n~Written by G. Moroder, H. Faltermeyer, ~n~K. Forsey ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1979 Giorgio Moroder ~n~Courtesy of Giorgio Moroder +[RBM1_10:ROCK1] +~r~Imbécile! Tu as détruit la marchandise! -[CR14_06:CRED01] -~n~ ~n~ ~n~ ~n~"E=MC2" ~n~Giorgio ~n~Written by G. Moroder, H. Faltermeyer, ~n~P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1979 Giorgio Moroder ~n~Courtesy of Giorgio Moroder +[RBM1_13:ROCK1] +~g~Amène le Love Juice et Mercedes au groupe avant qu'ils n'entrent sur scène. -[CR14_07:CRED01] -~n~ ~n~ ~n~ ~n~"Chase" ~n~Giorgio Moroder ~n~Written by G. Moroder ~n~Published by Warner/ Chappell Music ~n~(p) + © 1978 Casablanca Films/ ~n~Columbia Pictures ~n~Courtesy of Sony Pictures Entertainment +[RBM1_15:ROCK1] +~r~Tu as perdu le dealer, notre cash et la drogue! -[CR14_08:CRED01] -~n~ ~n~ ~n~ ~n~"I'm Left, You're Right, She's Gone" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Giorgio Moroder ~n~Courtesy of Giorgio Moroder +[RBM1_17:ROCK1] +~g~Tue le dealer et prends la drogue! -[CR14_09:CRED01] -~n~ ~n~ ~n~ ~n~"From Here To Eternity" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Casablanca Records ~n~Courtesy of Universal Music Enterprises +[MOB_07A:ROCK1] +Salut, mon vieux, les gars auraient besoin d'un peu de compagnie, si tu vois ce que je veux dire... -[CR15_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~COMMERCIAL VOICES +[MOB_07B:ROCK1] +Je connais justement la fille qu'il faut. -[CR15_02:CRED01] -~n~ ~n~ ~n~ ~n~Alex Anthony, Anouchka Benson, ~n~Audrey Amey, Bill Smith, ~n~Billy Gonzalez, Brian Thomas, +[ROK1_5:ROCK1] +Salut Mercedes! -[CR15_03:CRED01] -~n~ ~n~Chris Jobin, Chris Silvestro, ~n~Craig Blair, Dan Houser, ~n~Dan Merrill, Ed Thomas, +[ROK1_6:ROCK1] +Salut, Tommy. Comment vas-tu? -[CR15_04:CRED01] -~n~ ~n~Ethan Abeles, Garth Johnston, ~n~Gregg Martin, Gregory Johnson, ~n~Hikari Yokoyama, James Ferrante, +[ROK1_7:ROCK1] +Ca roule. Ecoute, les Love Fist, ça te branche? -[CR15_05:CRED01] -~n~ ~n~James Larson, Jay Capozello, ~n~Jayson Gladstone, Jeff Berlin, ~n~Jen Sweeney, Jessica Wachsman, +[ROK1_8:ROCK1] +Ok, mais c'est un service qu'il faudra me retourner... -[CR15_06:CRED01] -~n~ ~n~ JJ Adler, Jonathan Hanst, ~n~Joshua Batista, Karen Saltus, ~n~Koji Nonoyami, Lance Williams, +[RBM1_14:ROCK1] +~g~T'as besoin d'une bagnole ou d'une bécane! -[CR15_07:CRED01] -~n~ ~n~Lazlow, Lynne Horton, ~n~Michael Nathan, Mike Ferrante Jr., ~n~Chris Ferrante, Mike Shapiro, +[RBM1_1:ROCK1] +~g~Va prendre Mercedes à son appartement. -[CR15_08:CRED01] -~n~ ~n~Natalya Wilson, Noelle Sadler, ~n~Phil Mikkelson, Ron Reeve, ~n~Smith Harrison, Stacy Rachels, +[RBM1_12:ROCK1] +~g~Va récupérer les ingrédients du Love Juice chez le dealer. -[CR15_09:CRED01] -~n~ ~n~ Steve Carlesi, Julie Wemyss, ~n~Kim Gurney +[ROK1_2:ROCK1] +PLUS NECESSAIRE -[CR16_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~CUTSCENE MUSIC +[ROK1_3:ROCK1] +PLUS NECESSAIRE -[CR16_02:CRED01] -~n~ ~n~ ~n~ ~n~"Japanese Geisha" ~n~Sonia Slany ~n~Written by Sonia Slany ~n~Published by West One Music ~n~Courtesy of APM Music, LLC +[MERC_39:ROCK1] +A plus tard, champion. -[CR16_03:CRED01] -~n~ ~n~ ~n~ ~n~"The Heist" ~n~Bugz in the Attic ~n~Written by K. Tatham ~n~Published by Copyright Control ~n~(p) 2005 Bugz In The Attic ~n~Courtesy of Bugz In The Attic ~n~www.bugzintheattic.co.uk +[RBM1_C:ROCK1] +Hé, Tommy! Content que t'aies réussi! -[CR16_04:CRED01] -~n~ ~n~ ~n~ ~n~"A Dark March" ~n~Danger Mouse ~n~Written by Danger Mouse ~n~Published by ~n~Underground Animals (ASCAP) +[ROK1_1A:ROCK1] +Tu cherches quelque chose de spécial? J'ai ce qu'il te faut! -[CR17_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR NYC PUBLISHING TEAM +[ROK1_9:ROCK1] +Merci pour le pognon, suce boules! -[CR17_02:CRED01] -~n~ ~n~ ~n~ ~n~Terry Donovan, Jenefer Gross, ~n~Jennifer Kolbe, Devin Winterbottom, ~n~Adam Tedman, Michael Elkind, +[RBM1_T:ROCK1] +On a besoin de Love Juice, mec, tu vois? -[CR17_03:CRED01] -~n~ ~n~Paul Yeates, Hosi Simon, ~n~Daniel Einzig, Marlene Yamaguchi, ~n~Gauri Khindaria, Stanton Sarjeant, +{=================================== MISSION TABLE ROCK2 ===================================} -[CR17_04:CRED01] -~n~ ~n~Jordan Chew, Ryan Rayhill, ~n~Devin Bennett, Todd Zuniga, ~n~Thomas O'Donnell, Maria Tabia, +[RBM2_A:ROCK2] +Tommy, mon pote, je suis content de te voir! -[CR17_05:CRED01] -~n~ ~n~Anthony Carvalho, Lyonel Tollemache, ~n~John Notarfrancesco, Jerry Luna, ~n~Stuart Petri, Stephen Walsh, +[RBM2_B:ROCK2] +Qu'est-ce qui se passe? -[CR17_06:CRED01] -~n~ ~n~Michael Carnevale, Andrea Borzuku, ~n~John Schuhmann, Alice Chuang, ~n~Mike Torok, Mayumi Kobayashi, +[RBM2_C:ROCK2] +Des mauvaises vibrations, Tommy... -[CR17_07:CRED01] -~n~ ~n~Elizabeth Satterwhite, Bruce Dugan, ~n~Eli Weissman, Phil Poli, ~n~Jaesun Celebre, Russell Lewis, +[RBM2_E:ROCK2] +Il y a ce chat, on le connaît pas, mais lui il nous connaît. -[CR17_08:CRED01] -~n~ ~n~Sean Mackenzie, Megan Henretta, ~n~Angus Wong, Kristine Severson +[RBM2_F:ROCK2] +C'est comme ce chat. Il nous connaît tous. -[CR17_09:CRED01] -~n~ ~n~ ~n~ ~n~Cover Art ~n~Steven Olds, Stephen Bliss, ~n~Anthony Macbain +[RBM2_G:ROCK2] +Il sait que Willy a un faible pour les culottes de ses femmes, hé hé! -[CR17_10:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LONDON PD +[RBM2_H:ROCK2] +Ou que Percy aime bien Duran Duran! -[CR17_11:CRED01] -~n~ ~n~ ~n~ ~n~ Chris Madgwick, Chris Wood, ~n~Daimion Pinnock, David McCarthy, ~n~Graham Ainsley, Jurgen Mol, +[RBM2_K:ROCK2] +Ouais, le truc de la fusée d'amour, c'est vrai. Mais écoute, ce chat... -[CR17_12:CRED01] -~n~ ~n~ Laura Battistuzzi, Maike Köhler, ~n~Shino Hori, Lucien King +[RBM2_L:ROCK2] +ouais, ouais, ce gars, il veut voir les Love Fist morts! -[CR18_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LINCOLN +[RBM2_M:ROCK2] +Morts, Tommy. -[CR18_02:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Mark Lloyd +[RBM2_N:ROCK2] +Les Love Fist disparus. Tu sais ce qu'on dit, les meilleurs meurent jeunes... -[CR18_03:CRED01] -~n~ ~n~ ~n~ ~n~Deputy QA Manager ~n~Tim Bates +[RBM2_O:ROCK2] +Tommy, faut que tu sauves les Love Fist! -[CR18_04:CRED01] -~n~ ~n~ ~n~ ~n~QA Supervisor ~n~Kevin Hobson +[RBM2_P:ROCK2] +On a une séance d'autographes dans deux heures et je pense que... -[CR18_05:CRED01] -~n~ ~n~ ~n~ ~n~Lead Tester ~n~Eddie Gibson ~n~ ~n~ ~n~ ~n~Secondary Lead Tester ~n~Mike Bennett +[RBM2_Q:ROCK2] +Et les garçons pensent que le mec va essayer quelque chose de très vilain là-bas. -[CR18_06:CRED01] -~n~ ~n~ ~n~ ~n~Testers ~n~Jonathan Stones, Mike Emeny, ~n~Andy Mason, Lee Johnson, ~n~Carl Young, Matthew Lunnon, ~n~Dan Goddard, Steve McGagh, ~n~Craig Reeve, Joby Luckett +[RBM2_1:ROCK2] +~g~Conduis la limousine à la séance d'autographes et essaye de démasquer le psychopathe . -[CR18_07:CRED01] -~n~ ~n~ ~n~ ~n~Localization Team ~n~ ~n~ ~n~ ~n~Localization Supervisor ~n~Chris Welsh +[RBM2_2:ROCK2] +~r~T'as bousillé la bagnole du groupe! -[CR18_08:CRED01] -~n~ ~n~ ~n~ ~n~Testers ~n~Antoine Cabrol, Dominic Garcia, ~n~Paolo Ceccotti, Ferruccio Cinquemani, ~n~Nicolas Klimoff, Jesús Pérez Rosales ~n~ ~n~ ~n~ ~n~IT Support ~n~Nick McVey +[RBM2_3:ROCK2] +~g~Va à la séance d'autographes! -[CR19_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~SPECIAL THANKS +[RBM2_4:ROCK2] +~g~Attrape le psychopathe! Ne le laisse pas s'échapper! -[CR19_02:CRED01] -~n~ ~n~ ~n~ ~n~Scooter, Ross Wallace, ~n~Steve Taylor, Kevin Wong, ~n~Kevin Bolt, John Haime, +[RBM2_5:ROCK2] +~r~Tu l'as perdu, imbécile! -[CR19_03:CRED01] -~n~ ~n~Dave Watson, Thomas French, ~n~James Arthur, Martin Connor, ~n~Brendon McDonald, Julie Wemyss, +[RBM2_7:ROCK2] +~r~Les fans ont été attaqués, le psychopathe ne se montrera pas! -[CR19_04:CRED01] -~n~ ~n~Raff Crolla, James Duffy, ~n~Kim Gurney, Andrew Ness, ~n~Andy Brooks (Gearbox), Alan Mcgregor, +[RBM2_8:ROCK2] +~r~Les agents de sécurité ont été attaqués, le psychopathe ne se montrera pas! -[CR19_05:CRED01] -~n~ ~n~Chris McCallum, Fred, Narns, ~n~Alan, Taruki, Red, ~n~Big Foot, Rita Liberator, ~n~Elliot Torres +[PSYCH_1:ROCK2] +Je veux voir les Love Fist morts! -[CR19_06:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~THANKS +[PSYCH_2:ROCK2] +Les Love Fist ont gâché ma vie! -[CR19_07:CRED01] -~n~ ~n~ ~n~ ~n~Deborah Mannis-Gardner ~n~and Mark Schwartz. ~n~Randy Acker, Karen Adams, ~n~Mark Ainley, Robin Albers, +[RBM2_I:ROCK2] +Ferme-la un peu. C'est pas parce que Jezz encule les moutons... -[CR19_08:CRED01] -~n~ ~n~Duncan Baker, Armen Boladian, ~n~Tanya Bridges, Richard Brown, ~n~Matt Brookman, Elena Byington, +[RBM2_R:ROCK2] +Oh, ferme-la! -[CR19_09:CRED01] -~n~ ~n~Ed Butts, Rob Cairns, ~n~Mike Callaghan, Joseph Carlone, ~n~Kevin Carson, Jason Chin, +[RBM2_D:ROCK2] +Je plaisante pas. C'est pas des conneries, mec, tu piges? -[CR19_10:CRED01] -~n~ ~n~Allison Cipris, Alimah Deen, ~n~James Ellis, Helen English, ~n~Nasko Fejza, Scott Gardner, +[RBM2_J:ROCK2] +C'est le truc de la fusée d'amour, tu sais? -[CR19_11:CRED01] -~n~ ~n~Jochem Gerrits, ~n~Laurie Goldstein Thomas Golubic, ~n~Nick Guarino, Jon Handle, ~n~Millie Hysu, Robert Jo, +{=================================== MISSION TABLE ROCK3 ===================================} -[CR19_12:CRED01] -~n~ ~n~Paul Johannes, Gavin Johnson, ~n~Curtis A. Jones, Jennifer Justice, ~n~Rod Kotler, Diana La Pointe, +[RBM3_A:ROCK3] +Tommy! Le psychopathe est de retour! -[CR19_13:CRED01] -~n~ ~n~Michael Lau, Jim Long, ~n~Alex De Maegd, John Massa, ~n~Kendall Minter, Steve Morgan, +[RBM3_B:ROCK3] +Qu'est-ce qui se passe? -[CR19_14:CRED01] -~n~ ~n~Giorgio Moroder, Suzanne Moss, ~n~Melissa Munana, Kirin Murphy, ~n~Kurosh Nasseri, +[RBM3_C:ROCK3] +Ce psychopathe ne laissera jamais les Love Fist tranquilles! -[CR19_15:CRED01] -~n~ ~n~Gwen Niles Sean Ogden ~n~aka DJ Nightshade, ~n~Robin Orlowski, Jonathan Palmer, ~n~Tanvi Patel, Jane Peterer, +[RBM3_D:ROCK3] +Tu l'as pas tué, mon pote et il est revenu. -[CR19_16:CRED01] -~n~ ~n~Mark Picchiotti, Rob Playford, ~n~Dan Quan, R. Ramnarayan, ~n~Mary Beth Roberts, ~n~Virgil Roberts, Lindsay Rodman, +[RBM3_E:ROCK3] +Ouais, ouais et le truc c'est que... -[CR19_17:CRED01] -~n~ ~n~Jim Romano, Craig Roseberry, ~n~Gerry Rosenblatt, RZA, ~n~Ali Samii, Alan Scholefield, +[RBM3_F:ROCK3] +Le truc, c'est qu'on a besoin de quelqu'un de confiance pour conduire la limousine, -[CR19_18:CRED01] -~n~ ~n~Christopher Scott, Suzi Scott, ~n~Fredro Scruggs, Jennefer Showalter, ~n~Alan Skiena, Saskia Slegers, +[RBM3_G:ROCK3] +parce que ce timbré continue à nous menacer! -[CR19_19:CRED01] -~n~ ~n~Fran Spero, Lem Springsteen, ~n~David Steel, Jane Ventom, ~n~Christian Wiseman, Debi Wylde, +[RBM3_I:ROCK3] +On chie tous dans nos frocs, mec. -[CR19_20:CRED01] -~n~ ~n~Donna Young, Richie Zito +[RBM3_J:ROCK3] +Ok, les gars, du calme, je vais m'en occuper... + +[RBM3_K:ROCK3] +Normalement, j'ai mieux à foutre que de faire le taxi pour une bande d'Ecossais bisexuels bourrés, + +[RBM3_L:ROCK3] +mais dans votre cas, je vais faire une exception. + +[ROK3_03:ROCK3] +Autant pas faire dans la demi-mesure, alors. + +[ROK3_04:ROCK3] +Hé, Tommy, change la musique! + +[ROK3_08:ROCK3] +Ca commence à me faire chier, cette histoire. + +[ROK3_09:ROCK3] +Garde juste le pied au plancher! + +[ROK3_61:ROCK3] +Faut qu'on trouve la bombe! + +[ROK3_28:ROCK3] +Je vais bientôt jouer de la basse en enfer... + +[ROK3_30:ROCK3] +Que quelqu'un fasse quelque chose! + +[ROK3_32:ROCK3] +Ok, toi monsieur le dur à cuire, fais quelque chose! + +[ROK3_34:ROCK3] +Willy pourrait juste sucer le boomshine à la paille. + +[ROK3_37:ROCK3] +Passez une paille à Willy! + +[ROK3_41:ROCK3] +Quel fil, Tommy? + +[ROK3_42:ROCK3] +Le vert. + +[ROK3_43:ROCK3] +Y'en a pas de vert. Ou alors celui-la est vert? + +[ROK3_44:ROCK3] +Est-ce qu'un de ces fils te semble vert? + +[ROK3_49:ROCK3] +Ca fait des années que je te supporte! + +[ROK3_51:ROCK3] +Une grosse poufiasse hurlante... + +[ROK3_52:ROCK3] +Ouais! + +[ROK3_53:ROCK3] +Ferme-la et arrache un fil! + +[ROK3_54:ROCK3] +Lequel? + +[ROK3_55:ROCK3] +Celui-là... + +[ROK3_56:ROCK3] +Non! + +[ROK3_57:ROCK3] +Hé, on est ok, on a pas sauté, les potes! Tommy, mon pote bravo. Et Rock and Roll! + +[ROK3_58:ROCK3] +On a pas un concert où aller? Un racket à faire? Des fans à insulter? + +[ROK3_59:ROCK3] +LOVE FIST! + +[ROK3_60:ROCK3] +T'as fini avec cette bouteille? + +[RBM3_4:ROCK3] +~r~Tu as tué les Love Fist! + +[RBM3_6:ROCK3] +DETONATION : + +[RBM3_1:ROCK3] +~g~Conduis les Love Fist jusqu'au concert. + +[RBM3_2:ROCK3] +Si tu essayes de quitter la voiture tant que la bombe est armée, elle explosera. + +[RBM3_3:ROCK3] +Si la jauge de détonation devient pleine, la bombe explose. + +[RBM3_8:ROCK3] +Plus tu conduis vite, plus la jauge de détonation diminue. + +[RBM3_7:ROCK3] +~g~BOMBE DESAMORCEE! + +[ROK3_6A:ROCK3] +~g~Love Fist. Vous avez fini de polluer les ondes! + +[ROK3_6B:ROCK3] +~g~Je vous ai donné l'occasion de devenir mes amis. Je vais maintenant vous offrir celle de mourir! + +[ROK3_62:ROCK3] +alors on a pensé te montrer notre Temple du rock- + +[ROK3_63:ROCK3] +Que tu te fasses une idée de la fureur des Love Fist! + +[ROK3_64:ROCK3] +Ecoute-toi toi même, mon pote. C'est de la daube! + +[ROK3_65:ROCK3] +Hé, à tous les gosses, c'est un temple et nous sommes les prêtres! + +[ROK3_66:ROCK3] +Ouais, eh ben, si les gosses aiment leurs prêtres à moitié saouls et complètement sourds, + +[ROK3_67:ROCK3] +c'est leur problème. + +[ROK3_68:ROCK3] +Ah, merde, la bande de la cassette est encore bouffée. + +[ROK3_69:ROCK3] +Si ça continue, faudra jouer en live. + +[ROK3_70:ROCK3] +Ooooh merde! Mes intestins... + +[ROK3_74:ROCK3] +Ah, tiens, qu'est-ce que c'est que ça? Tommy, mets cette cassette. + +[ROK3_01:ROCK3] +Mon pote, c'est enfin l'heure d'un verre bien mérité. + +[ROK3_02:ROCK3] +La salle de concert est à une centaine de mètres plus loin. + +[ROK3_05:ROCK3] +Je me sens bizarre quand ma tête ne tambourine pas. + +[ROK3_07:ROCK3] +Tommy, faut que tu sauves le groupe! + +[ROK3_29:ROCK3] +Tommy, continue de foncer, mec! + +[ROK3_31:ROCK3] +Que quelqu'un fasse quelque chose... C'est quoi ces conneries? J'ai déjà vu des minettes plus courageuses. + +[ROK3_33:ROCK3] +Ecoute, mec. Moi, je joue d'un instrument, j'y connais rien aux bombes. + +[ROK3_35:ROCK3] +Ouais, j'ai entendu dire que t'étais doué pour ce genre de trucs! + +[ROK3_38:ROCK3] +Une paille? Hé, ici, c'est le bus de tournée des Love Fist! + +[ROK3_39:ROCK3] +Où c'est que tu veux que je trouve une paille? + +[ROK3_46:ROCK3] +J'aurais dû te larguer quand j'en avais l'occasion. + +[ROK3_47:ROCK3] +Capitaliste! + +[ROK3_48:ROCK3] +Arriviste! + +[ROK3_73:ROCK3] +Jezz écoute la cassette, + +[RBM3_9:ROCK3] +Si tu t'arrêtes ou conduis trop lentement, la jauge de détonation augmente. + +[ROK3_50:ROCK3] +Ferme-la, pauvre abruti! + +[ROK3_36:ROCK3] +Hé, j'étais raide défoncé cette nuit-là, et tu le sais bien! + +[RBM3_H:ROCK3] +Je chie dans mon froc, mec. Je veux ma maman! + +[ROK3_45:ROCK3] +Oh, je vois la mort dans les cartes! Tout est vert! + +[ROK3_6C:ROCK3] +~g~Si tu ralentis, la limousine explosera et les GROS TOCARDS CHEVELUS avec! + +[ROK3_71:ROCK3] +On doit continuer. Merci encore, Tommy! T'as assuré, mec! A plus! + +[ROK3_1:ROCK3] +Enfin, mec, voici l'heure d'un verre bien mérité. La salle est juste à quelques mètres d'ici. + +[ROK3_2:ROCK3] +Tu m'en sers un grand alors. Hé, Tommy, change de musique, mec. + +[ROK3_3:ROCK3] +Je pète les plombs si je secoue pas la tête. Hé, regarde, c'est quoi ça? Tommy, mets cette cassette. + +[ROK3_4:ROCK3] +Love Fist. Vous avez fini de polluer les ondes. Je vous ai donné une chance de devenir mes amis. + +[ROK3_5:ROCK3] +Maintenant vous allez mourir. Essayez de freiner et c'est la fin! Paf, plus de limousine et plus de GROS NASES CHEVELUS non plus. + +[ROK3_6:ROCK3] +Tommy, mec, tu dois sauver le groupe! J'en ai marre de ces conneries. Enlève pas ton pied de la pédale, mec! + +[ROK3_7:ROCK3] +On doit trouver la bombe! On peut pas continuer à rouler toute la journée? Ouais, quoi, on a plein de trucs à boire... + +[ROK3_8:ROCK3] +La bombe, elle serait pas dans le moteur? Va falloir qu'on s'arrête pour la désamorcer! Merde, mec, on va tous crever! J'vais m'bourrer la gueule! + +[ROK3_9:ROCK3] +Hé, on est dans la mouise, mon pote! Tu trouveras pas ta réponse dans la boisson! Tire-toi de là! + +[ROK3_10:ROCK3] +Hé, y'a des fils qui sortent de la bouteille de vodka! C'est pas de la vodka, c'est du BOOMSHINE! + +[ROK3_11:ROCK3] +AAAAAHHHHHH! Elle va exploser! AAAAAAAAAAAHHHHH!!!!!!!!!! + +[ROK3_12:ROCK3] +On m'avait prévenu que l'alcool me perdrait. J'ai déjà vu ça à la télé. Il suffit de tirer un de ces fils, mais lequel? J'en sais foutre rien, mec! + +[ROK3_13:ROCK3] +Putain, j'en sais rien! Willy, dis quelque chose. J'vais jouer de la basse en enfer. + +[ROK3_14:ROCK3] +Tommy, mec, continue de rouler à fond la caisse. Que quelqu'un fasse quelque chose! Ouais, c'est ça. + +[ROK3_15:ROCK3] +'Que quelqu'un fasse quelque chose'. Putain, c'est quoi ces conneries. J'ai connu des tantes plus braves. Vas-y le gros dur, fais quelque chose! + +[ROK3_16:ROCK3] +Ecoute, mec, je suis musicien moi, j'sais pas comment ça fonctionne les bombes. Willy a qu'à sucer le boomshine à la paille. + +[ROK3_17:ROCK3] +Ouais, on m'a dit que ça, tu savais faire. J'étais tout émoustillé ce soir-là, comme tu le sais! + +[ROK3_18:ROCK3] +T'as qu'à filer une paille à Willy! Une paille? C'est le bus de tournée des Love Fist! + +[ROK3_19:ROCK3] +Où est-ce que je vais bien pouvoir trouver une paille? Quel fil, Tommy? Le vert. Y'en a pas de vert. + +[ROK3_20:ROCK3] +Où peut-être qu'il est vert celui-là? T'en vois un vert, toi? + +[ROK3_21:ROCK3] +Oh non! On va crever! Je vois la vie en vert! J'aurais dû me débarrasser de toi qu'en j'en avais l'occasion. + +[ROK3_22:ROCK3] +Chasse la gloire! Capitaliste! Ca fait des années que je te soutiens. Ferme-là, tafiole! + +[ROK3_23:ROCK3] +Une grosse chialeuse, ouais, ferme-là et tire le putain de fil! Lequel? Celui-là... + +[ROK3_24:ROCK3] +NON! On est pas morts. On a pas sauté, mec! + +[ROK3_25:ROCK3] +Tommy, bien joué, mec. Rock and roll, mon pote! On a pas un concert à donner, nous? + +[ROK3_26:ROCK3] +Amasser du blé? Abuser des minettes? LOVE FIST! + +[ROK3_27:ROCK3] +T'as fini avec cette bouteille? + +{=================================== MISSION TABLE SERG1 ===================================} + +[TEX1_A:SERG1] +Entre et pose ton cul sur une des banquettes. + +[TEX1_B:SERG1] +Putain, mon père avait l'habitude de dire qu'à cheval donné, on ne regarde pas les dents et il l'a jamais fait! + +[TEX1_C:SERG1] +Tu veux une larme de bon vieux whisky? + +[TEX1_D:SERG1] +Non merci. + +[TEX1_E:SERG1] +Un mec qui aime avoir les idées claires, c'est bien. + +[TEX1_F:SERG1] +En ce moment, mes affaires tournent pas comme elles le devraient... + +[TEX1_G:SERG1] +C'est la merde! Et je veux nettoyer une partie de cette merde! T'es avec moi? + +[TEX1_H:SERG1] +Euh, ouais. + +[TEX1_I:SERG1] +En fait, j'ai besoin d'un mec obstiné pour me débarrasser d'une merde. + +[TEX1_J:SERG1] +T'as l'air du genre persuasif. + +[TEX1_K:SERG1] +La persuasion c'est ma spécialité. + +[TEX1_L:SERG1] +Bon, ce mec sera au country club du golf. + +[TEX1_M:SERG1] +Ils autorisent pas les flingues, alors ses gardes du corps en auront pas. + +[TEX1_N:SERG1] +Va me massacrer ce salopard. + +[TEX1_O:SERG1] +Tiens, voilà ta carte de membre, mais va falloir te trouver des fringues plus appropriées. + +[TEX1_2:SERG1] +~g~Maintenant, direction le Leaf Links Golf Club. + +[TEX1_0:SERG1] +~g~La cible est à ta portée, en train de jouer au golf. Fais en sorte que ce soit sa dernière partie! + +[TEX1_3:SERG1] +C'est qui ce mec? Occupez-vous de lui! + +[TEX1_6:SERG1] +Quel beau cul! + +[TEX1_7:SERG1] +C'est moi, ça? + +[TEX1_8:SERG1] +Chaque fois que tu ouvres ton caddie, tu reçois automatiquement un club de golf si ton emplacement d'arme de corps à corps est vide. + +[TEX1_9:SERG1] +Attrapez-le! + +[TEX1_10:SERG1] +Tuez-moi ce dingue! + +[TEX1_1:SERG1] +~g~Va chercher des fringues de golfeur chez Jocksport's. + +{=================================== MISSION TABLE SERG2 ===================================} + +[TEXEXIT:SERG2] +~g~Maintenant, casse-toi de Little Haiti! + +[TEX_2A:SERG2] +~g~Parfait! Ils t'ont repéré! + +[TEX_2B:SERG2] +~r~Imbécile! Les gens doivent VOIR un cubain faire le coup! + +[TEX_2C:SERG2] +~g~Va te trouver des fringues de cubain dans Little Havana! + +[TEX_2D:SERG2] +~g~Maintenant, liquide le chef de gang haïtien au salon funéraire Romero! + +[TEX2_A:SERG2] +Tommy, voici Donald Love. Donald, Tommy Vercetti, + +[TEX2_B:SERG2] +la dernière crapule à débarquer ici. + +[TEX2_C:SERG2] +Ouais... Euh... + +[TEX2_D:SERG2] +Donald, ferme-la et écoute, t'apprendras peut-être quelque chose. + +[TEX2_E:SERG2] +Bon. Il y a rien de mieux qu'une bonne guerre des gangs pour faire baisser les prix de l'immobilier. + +[TEX2_F:SERG2] +A part une catastrophe, peut-être, comme une peste biblique ou un truc dans le genre. + +[TEX2_G:SERG2] +Mais ça serait aller un peu trop loin, dans le cas présent. + +[TEX2_H:SERG2] +Tu piges, tête de gland? + +[TEX2_I:SERG2] +Un chef du gang haïtien est mort y'a pas longtemps. C'est apparemment un coup des Cubains, mais personne en est sûr. + +[TEX2_J:SERG2] +Alors on va arranger ça! Tu te déguises en Cubain + +[TEX2_K:SERG2] +et tu fonces foutre le bordel aux funérailles. Tu leur balances la sauce et tu dégages vite fait. + +[TEX2_L:SERG2] +T'as compris, Donald? + +[TEX2_M:SERG2] +C'est comme faire entrer le renard dans le poulailler, hein? + +[TEX2_N:SERG2] +Et puis on attend tranquillement que les prix s'écroulent. + +{=================================== MISSION TABLE SERG3 ===================================} + +[TEX3_A:SERG3] +Regarde un peu, mon pote. J'ai un problème et je compte sur ton aide. + +[TEX3_B:SERG3] +Je suis pas constructeur. + +[TEX3_C:SERG3] +Ben, je pensais surtout à tes talents de démolisseur. + +[TEX3_D:SERG3] +Bon, là, c'est le développement prévu, et ça, + +[TEX3_E:SERG3] +c'est la propriété sur laquelle on a des vues. + +[TEX3_F:SERG3] +T'essayes de me dire que ce nouveau bloc de bureaux est comme qui dirait sur le chemin. + +[TEX3_G:SERG3] +T'as tout compris. + +[TEX3_H:SERG3] +Bon, je vais aller faire un tour en ville pendant un moment + +[TEX3_I:SERG3] +et si la construction de ces bureaux devait faire face à de subits et insurmontables problèmes structurels, alors je... + +[TEX3_J:SERG3] +En tant qu'honnête citoyen, vous vous sentiriez obligé d'intervenir + +[TEX3_K:SERG3] +pour la réhabilitation d'un important secteur de la ville? + +[TEX3_L:SERG3] +Où on peut en trouver d'autres, des mecs dans ton genre? + +[TEX3_1:SERG3] +~g~Utilise l'hélico télécommandé pour transporter des bombes sur les quatre cibles du bâtiment que tu dois détruire. + +[TEX3_2:SERG3] +~g~Tu dois larguer une bombe sur chaque cible, et ce, dans n'importe quel ordre. + +[TEX3_5:SERG3] +~g~Si tu largues une bombe sans succès, tu peux la récupérer pour un nouvel essai. + +[TEX3_7:SERG3] +~g~Tu a alors 7 minutes pour larguer toutes les autres bombes! + +[TEX3_8:SERG3] +~g~Tu as raté la cible! Récupère la bombe et réessaye! + +[TEX3_10:SERG3] +~g~Largue la bombe sur la cible. + +[TEX3_11:SERG3] +Cibles restantes: + +[TEX3_17:SERG3] +~r~Tu as dépassé le temps imparti et le bâtiment n'est pas détruit. + +[TEX3_18:SERG3] +~r~Ton hélico télécommandé a été détruit! Comment vas-tu faire pour transporter les bombes, maintenant? + +[TEX3_19:SERG3] +~r~Tu as largué ta bombe dans l'eau! Tu as besoin des 4 bombes pour détruire le bâtiment! + +[TEX3_20:SERG3] +~g~Ton hélico télécommandé est presque hors de portée! Retourne au bâtiment et termine le travail! + +[TEX3_21:SERG3] +~r~Ton hélico télécommandé est hors de portée! + +[TEX3_24:SERG3] +Appuie sur ~h~~k~~VEHICLE_LOOKLEFT~ ~w~pour faire pivoter l'hélico dans le sens inverse des aiguilles d'une montre. + +[TEX3_25:SERG3] +Appuie sur ~h~~k~~VEHICLE_LOOKLEFT~ ~w~pour faire pivoter l'hélico dans le sens des aiguilles d'une montre. + +[TEX3_27:SERG3] +~g~L'escalier central mène à tous les étages du bâtiment. + +[TEX3_31:SERG3] +~r~Tu as détruit la camionnette qui contenait l'hélico télécommandé et les bombes! + +[TEX3_32:SERG3] +Tu peux ~h~regarder derrière~w~ toi en ~h~appuyant simultanément sur ~k~~VEHICLE_LOOKLEFT~ et ~k~~VEHICLE_LOOKRIGHT~~w~. + +[TEX3_4:SERG3] { reVC update } +~g~Pour larguer une bombe, appuie sur la~h~ ~k~~VEHICLE_FIREWEAPON~~w~. + +[TEX3_29:SERG3] { reVC update } +Pour larguer une bombe, appuie sur la~h~ ~k~~VEHICLE_FIREWEAPON~. + +[TEX3_26:SERG3] +Appuie sur la ~h~~k~~VEHICLE_BRAKE~ ~w~pour réduire la vitesse du rotor et ainsi faire~h~ descendre l'hélicoptère. + +[TEX3_22:SERG3] +Appuie sur la ~h~~k~~VEHICLE_ACCELERATE~ ~w~pour augmenter la vitesse du rotor et ainsi faire~h~ monter l'hélicoptère. + +[TEX3_16:SERG3] +~g~Va jusqu'au camion ~w~TOPFUN ~g~ près du bâtiment à démolir. + +[TEX3_33:SERG3] +Une fois que tu as ramassé une bombe, le radar t'indique la position de la cible par rapport à l'hélico. + +[TEX3_34:SERG3] +Le ~h~point triangulaire vers le haut ~w~indique que la cible se trouve ~h~au-dessus ~w~de l'hélicoptère radiocommandé. + +[TEX3_35:SERG3] +Le ~h~point triangulaire vers le bas ~w~indique que la cible se trouve ~h~en dessous ~w~de l'hélicoptère radiocommandé. + +[TEX3_36:SERG3] +Le ~h~point carré ~w~indique que la cible se trouve ~h~au même niveau ~w~que l'hélicoptère radiocommandé. + +[TEX3_6:SERG3] +~g~Une fois que tu as ramassé une bombe pour la première fois, le compte à rebours s'enclenche. + +[TEX3_28:SERG3] +Pour ~h~ramasser une bombe~w~, manoeuvre l'hélico radiocommandé à côté. Il ne peut transporter qu'une seule bombe à la fois. + +[TEX3_30:SERG3] +~g~Pour ramasser une bombe, manoeuvre l'hélico radiocommandé à côté. Il ne peut transporter qu'une seule bombe à la fois. + +[TEX3_12:SERG3] +~g~Bombe posée! Plus que 3 cibles! Va chercher une autre bombe! + +[TEX3_13:SERG3] +~g~Bombe posée! Plus que 2 cibles! Va chercher une autre bombe! + +[TEX3_14:SERG3] +~g~Bombe posée! Plus qu'une cible! Va chercher une autre bombe! + +[TEX3_15:SERG3] +~r~Compte à rebours enclenché! ~g~Tu dois poser les ~w~4 bombes ~g~avant la fin du temps imparti! + +[TEX3_37:SERG3] +Pousse le ~h~joystick analogique droit vers le haut ~w~pour vitesse la vitesse du rotor et ainsi faire ~h~ monter l'hélicoptère. + +[TEX3_38:SERG3] { reVC update } +{Pousse le ~h~~k~~VEHICLE_ACCELERATE~ ~w~pour augmenter la réduire du rotor et ainsi faire ~h~ descendre l'hélicoptère.} +Pousse le ~h~joystick analogique droit vers la bas ~w~pour augmenter la réduire du rotor et ainsi faire ~h~ descendre l'hélicoptère. + +[TEX3_39:SERG3] +~g~Appuie sur la touche ~h~~k~~VEHICLE_HANDBRAKE~ ~g~pour larguer une bombe. + +[TEX3_40:SERG3] +Appuie sur la touche ~h~~k~~VEHICLE_HANDBRAKE~ ~w~pour larguer une bombe. + +[TEX3_23:SERG3] +Appuyer sur les touches ~h~~k~~VEHICLE_TURRETUP~~w~ et ~h~~k~~VEHICLE_TURRETDOWN~~w~ pour orienter l'hélicoptère dans la direction souhaitée. + +{=================================== MISSION TABLE TAXI1 ===================================} + +[FARES:TAXI1] +CLIENTS: + +[TAXI1:TAXI1] +Cherche une course. + +[TSCORE2:TAXI1] +~1~$ + +[IN_ROW:TAXI1] +~1~ DE SUITE! Bonus : ~1~$ + +[TAXI3:TAXI1] +~r~Ton client est parti terrorisé! + +[TAXI7:TAXI1] +~r~Ta voiture est endommagée. Fais-la réparer. + +[TAXI4:TAXI1] +La course est finie! + +[TAXI5:TAXI1] +BONUS DE VITESSE! + +[TAXI6:TAXI1] +La mission taxi est finie + +[TAXIH1:TAXI1] +Arrête-toi près d'un piéton mis en évidence pour qu'il monte, puis conduis-le à destination avant la fin du temps imparti. + +[FARE1:TAXI1] +~g~Destination ~w~'le Pole Position Club' ~g~à Ocean Beach. + +[FARE3:TAXI1] +~g~Destination ~w~'le Marina' ~g~à Ocean Beach. + +[FARE4:TAXI1] +~g~Destination ~w~'Ammu-Nation' ~g~à Ocean Beach. + +[FARE5:TAXI1] +~g~Destination ~w~'la quincaillerie' ~g~à Washington Beach. + +[FARE6:TAXI1] +~g~Destination ~w~'le centre commercial de North Point' ~g~à Vice Point. + +[MFARE1:TAXI1] +~g~Destination ~w~'Ammu-Nation' ~g~dans le Centre. + +[MFARE2:TAXI1] +~g~Destination ~w~'le Terminal' ~g~à l'aéroport International Escobar. + +[WFARE3:TAXI1] +~g~Destination ~w~'Sunshine Autos' ~g~dans Little Havana. + +[WFARE4:TAXI1] +~g~Destination ~w~'les taxis Kaufman' ~g~dans Little Haiti. + +[WFARE5:TAXI1] +~g~Destination ~w~'la quincaillerie' ~g~dans Little Havana. + +[WFARE6:TAXI1] +~g~Destination ~w~'Howlin Petes Bike Emporium' ~g~dans le Centre. + +[FARE7:TAXI1] +~g~Destination ~w~'Les bijoutiers' ~g~à Vice Point. + +[FARE8:TAXI1] +~g~Destination ~w~'la plage' ~g~à Ocean Beach. + +[FARE9:TAXI1] +~g~Destination ~w~'la plage' ~g~à Washington Beach. + +[FARE10:TAXI1] +~g~Destination ~w~'la plage' ~g~à Vice Point. + +[FARE11:TAXI1] +~g~Destination ~w~'l'hôpital' ~g~à Ocean Beach. + +[FARE12:TAXI1] +~g~Destination ~w~'l'hôpital' ~g~à Vice Point. + +[FARE13:TAXI1] +~g~Destination ~w~'le commissariat de police' ~g~à Washington Beach. + +[FARE14:TAXI1] +~g~Destination ~w~'le commissariat de police' ~g~à Vice Point. + +[FARE15:TAXI1] +~g~Destination ~w~'le restaurant de pizza' ~g~à Vice Point. + +[WFARE7:TAXI1] +~g~Destination ~w~'le commissariat de police' ~g~à Little Havana. + +[WFARE8:TAXI1] +~g~Destination ~w~'le commissariat de police' ~g~à Downtown. + +[WFARE9:TAXI1] +~g~Destination ~w~'l'hôpital' ~g~à Downtown. + +[WFARE10:TAXI1] +~g~Destination ~w~'l'hôpital' ~g~à Little Havana. + +[WFARE11:TAXI1] +~g~Destination ~w~'le stade' ~g~à Downtown. + +[WFARE12:TAXI1] +~g~Destination ~w~'le restaurant de pizza' ~g~à Little Haiti. + +[WFARE13:TAXI1] +~g~Destination ~w~'le restaurant de pizza' ~g~à Downtown. + +[WFARE14:TAXI1] +~g~Destination ~w~'les docks' ~g~à Viceport. + +[WFARE15:TAXI1] +~g~Destination ~w~'la pharmacie' ~g~à Little Haiti. + +[FARE2:TAXI1] +~g~Destination ~w~'le Malibu club' ~g~à Vice Point. + +{=================================== MISSION TABLE TAXICUT ===================================} + +[TAXC_A:TAXICUT] +J'imagine que t'es le nouveau proprio. + +[TAXC_B:TAXICUT] +D'où tu sors? La Mafia? Le Cartel? T'as pas l'air mexicain... + +[TAXC_C:TAXICUT] +Quoi qu'il en soit, tu ferais mieux de continuer avec le barratin comme quoi les choses vont changer, + +[TAXC_D:TAXICUT] +peut-être même menacer des conducteurs... + +[TAXC_E:TAXICUT] +Vas-y mollo avec Ted là-bas, on vient juste de lui soigner son hernie. + +[TAXC_F:TAXICUT] +Eh bien, ouais. Les choses vont changer dans le coin, madame. + +[TAXC_G:TAXICUT] +Arrête tes conneries, petit. Vaut mieux que tu me laisses faire. + +[TAXC_H:TAXICUT] +Ca fait des années que je suis dans ce genre de biz. + +[TAXC_I:TAXICUT] +Ecoutez tous. + +[TAXC_J:TAXICUT] +On a une nouvelle direction et les choses vont encore changer dans le coin. + +[TAXC_K:TAXICUT] +Notre nouvelle direction, la... + +[TAXC_L:TAXICUT] +Tu fais partie de quel gang? + +[TAXC_M:TAXICUT] +En fait, je fais pas partie d'un gang... + +[TAXC_N:TAXICUT] +C'est quoi ton foutu nom, petit? + +[TAXC_O:TAXICUT] +Vercetti, Tommy Vercetti. + +[TAXC_P:TAXICUT] +Notre nouvelle direction, le gang Vercetti, + +[TAXC_Q:TAXICUT] +va veiller à nous éviter les emmerdes. + +[TAXC_R:TAXICUT] +Capiche? Terminé! + +[TAXC_S:TAXICUT] +Qu'est-ce que t'as pensé du 'capiche'? Moi, j'ai bien aimé le 'capiche'. + +[TAXC_T:TAXICUT] +Bon, alors c'est comme ça que ça marchait avant + +[TAXC_U:TAXICUT] +et on va continuer à faire tourner l'entreprise comme ça. + +[TAXC_V:TAXICUT] +Si on a des ennuis avec une compagnie concurrente, tu leur flanques une dérouillée. + +[TAXC_W:TAXICUT] +Puis ils nous flanquent une dérouillée. + +[TAXC_X:TAXICUT] +puis tu leur flanques une dérouillée, + +[TAXC_Y:TAXICUT] +et cetera et cetera. T'as pigé? + +[TAXC_Z:TAXICUT] +Euh, ouais, je crois... + +[TAXC_A1:TAXICUT] +Prends simplement un taxi au garage si tu te sens de bosser. + +{=================================== MISSION TABLE TAXIWA1 ===================================} + +[OUTTIME:TAXIWA1] +~r~T'es trop lent, mec, trop lent! + +[TAX1_1:TAXIWA1] +Ok, on a un client rupin qui a besoin d'être ramassé à Starfish island, ça intéresse quelqu'un? + +[TAX1_2:TAXIWA1] +Ici, Tommy, je prends! + +[TAX1_3:TAXIWA1] +C'est mon client, dégage! + +[TAX1_4:TAXIWA1] +Allez, vite, monte! + +[TAX1_5:TAXIWA1] +Ok, ok, mais ne me faites pas de mal! + +[TAXW1_1:TAXIWA1] +~g~Va prendre le V.I.P. sur Starfish Island. + +[TAXW1_2:TAXIWA1] +~g~Ramène le V.I.P.! Bousille l'autre bagnole! + +[TAXW1_3:TAXIWA1] +~r~Le V.I.P. est mort! + +[TAXW1_4:TAXIWA1] +~r~Le V.I.P. a été déposé! + +[TAXW1_6:TAXIWA1] +~g~Emmène le V.I.P. à l'aéroport! + +{=================================== MISSION TABLE TAXIWA2 ===================================} + +[TAX2_1:TAXIWA2] +Appel à toutes les voitures, on perd des clients dans toute la ville! Qu'est-ce que vous foutez, les gars? + +[TAX2_2:TAXIWA2] +Les taxis VC nous les prennent! Ils ont trop de voitures, on peut pas rivaliser! + +[TAX2_3:TAXIWA2] +Vercetti, si t'es en ville en train d'écouter, va falloir mettre quelques taxis VC hors circuit ou c'est la faillite! + +[TAXW2_1:TAXIWA2] +~g~Détruis 3 taxis concurrents! + +{=================================== MISSION TABLE TAXIWA3 ===================================} + +[TAX3_1:TAXIWA3] +Voiture 13, on a une demoiselle Cortez à prendre dans le centre, elle vous a spécialement demandé. + +[TAX3_2:TAXIWA3] +Ok, je prends. Voiture 13 en course! + +[TAX3_3:TAXIWA3] +Hmmmm, aucun signe de Mercedes... + +[TAXW3_3:TAXIWA3] +~g~Bousille le taxi leader! + +[TAXW3_2:TAXIWA3] +~g~Reste vivant jusqu'à la fin du temps imparti. + +[TAX_AS1:TAXIWA3] +COMPAGNIE DE TAXIS ACQUISE + +[TAX_AS2:TAXIWA3] +~G~Les taxis Kaufman génère dorénavant un revenu de $~1~ maximum. Pense à récupérer le fric régulièrement. + +[TAX3_4:TAXIWA3] +L'heure est venue pour l'ange gardien des taxis Kaufman de froisser de la tôle! + +[TAX3_5:TAXIWA3] +Hé mec, j'vais te bousiller ta caisse! + +{ reVC updates } +{ new languages } +[FEL_JAP] +JAPONAIS + +[FEL_POL] +POLONAIS + +[FEL_RUS] +RUSSE + +{ new display menus } +[FET_GFX] +GRAPHICS SETUP + +[FED_MIP] +MIP MAPPING + +[FED_AAS] +ANTI ALIASING + +[FED_FIL] +TEXTURE FILTERING + +[FED_BIL] +BILINEAR + +[FED_TRL] +TRILINEAR + +[FED_WND] +WINDOWED + +[FED_FLS] +FULLSCREEN + +[FEM_CSB] +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 + +[FEC_FRC] +FREE CAM + +{ Linux joy detection } +[FEC_JOD] +DETECT JOYSTICK + +[FEC_JPR] +Press any key on the joystick of your choice that you want to use on the game, and it will be selected. + +[FEC_JDE] +Detected joystick + +{ mission restart } +[FET_RMS] +REJOUER MISSION + +[FESZ_RM] +REJOUER? + +[FED_VPL] +VEHICLE PIPELINE + +[FED_PRM] +PED RIM LIGHT + +[FED_RGL] +ROAD GLOSS + +[FED_CLF] +COLOUR FILTER + +[FED_WLM] +WORLD LIGHTMAPS + +[FED_MBL] +MOTION BLUR + +[FEM_SIM] +SIMPLE + +[FEM_NRM] +NORMAL + +[FEM_MOB] +MOBILE + +[FED_MFX] +MATFX + +[FED_NEO] +NEO + +[FEM_PS2] +PS2 + +[FEM_XBX] +XBOX + +[FEC_IVP] +INVERT PAD VERTICALLY + +[FEM_NON] +NONE + +[FEC_DS2] +DUALSHOCK 2 + +[FEC_DS3] +DUALSHOCK 3 + +[FEC_DS4] +DUALSHOCK 4 + +[FEC_360] +XBOX 360 CONTROLLER + +[FEC_ONE] +XBOX ONE CONTROLLER + +[FEC_TYP] +GAMEPAD TYPE + +[FET_AGS] +GAMEPAD SETTINGS + +[FEM_AUT] { aspect ratio related } +AUTO [DUMMY] THIS LABEL NEEDS TO BE HERE !!! diff --git a/utils/gxt/german.txt b/utils/gxt/german.txt index 79df0b1..f5ff5e2 100644 --- a/utils/gxt/german.txt +++ b/utils/gxt/german.txt @@ -1,1406 +1,117 @@ -[LETTER1] -abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"$,.'-?!!SDBF +{ + New strings are at the bottom of file. + Do not change the order of strings. + You can fix the typos of existing translation but please refrain from + unnecessary edits like rephasing because you think it suits better for your taste. +} -[DEFNAM] -Claude---------------------- +[RAMPAGE] +AMOKLAUF!! -[IN_VEH] -~w~Hey! Zurück ins ~b~Fahrzeug! +[RAMP_F] +AMOKLAUF FEHLGESCHLAGEN!! -[IN_VEH2] -~w~Du brauchst eine Karre für diesen Job! +[RAMP_P] +AMOKLAUF BESTANDEN!! -[IN_BOAT] -~w~Du brauchst ein Boot für diesen Job! +[RAMP_A] +ALLE AMOKLÃUFE BESTANDEN!! -[HEY] -~w~Keine Alleingänge. Halt die Gang beisammen! +[PAGE_01] +Dein Job: ~1~ Gang-Mitglieder in 2 Minuten! -[HEY2] -~w~Nicht aufteilen. Halt die Leute zusammen! +[PAGE_02] +Zerstöre ~1~ Fahrzeuge in 2 Minuten! -[HEY3] -~w~Du hast deinen besten Mann verloren. Los, zurück! Hol 8-Ball! +[PAGE_03] +Erledige ~1~ Gang-Mitglieder in 2 Minuten im Vorbeifahren! -[HEY6] -~w~Du stehst mit deiner Ehre für den Yakuza Kanbu ein. Du musst ihn beschützen! +[PAGE_04] +Überfahre ~1~ Gang-Mitglieder in 2 Minuten! -[HEY7] -~w~Ein Mann mehr kann nicht schaden. Los, zurück. Hol deinen Kontaktmann ab! +[PAGE_05] +Dein Job: ~1~ Gang-Mitglieder in 2 Minuten! -[HEY9] -~w~Du willst wissen, was so geredet wird? Sprich mit deinem Kontaktmann! - -[GATE_1] -~w~Die Sindaccos öffnen die Tore nur für Sindacco-Wagen. - -[HELPA] -~w~Das ist dein ~h~Versteck. - -[HELPB] -~w~Bist du nicht auf einer Mission, kannst du speichern, indem du das ~h~Speicher-Icon~w~ aufnimmst - die Uhr wird dann um 6 Stunden vorgestellt. - -[HELPC] -~w~Fahrzeuge in der ~h~Garage nebenan~w~ werden beim Speichern für dich aufbewahrt. - -[HELPD] -Zum Verlassen des Verstecks, stell dich in die ~h~Markierung. - -[HELP0] -~w~Drücke~h~ ~k~ ~VEEE~~w~, um in ein Fahrzeug ein- oder auszusteigen. - -[HELP1] -~w~Halte in der Mitte der ~h~gelben Markierung. - -[HELP3] -~w~Du kannst nur kurze Zeit sprinten, ohne zu ermüden. - -[HELP4] -~w~Benutze~h~ ~k~ ~VEACC~ ~w~zum ~h~Beschleunigen. Benutze~h~ ~k~ ~VESTR~ ~w~zum Steuern. - -[HELP5] -~w~Drücke~h~ ~k~ ~VEBRK~ ~w~zum ~h~Bremsen~w~, oder zum ~h~Zurücksetzen~w~. - -[HELP6] -~w~Drücke die~h~ ~k~ ~VEHB~~w~, um die ~h~Handbremse~w~ anzuziehen. - -[HELP7] -~w~Halte~h~ ~k~ ~PDLT~~w~, um mit einem Präzisionsgewehr zu zielen. - -[HELP8] -~w~Mit~h~ ~k~ ~SNZI~ ~w~und~h~ ~k~ ~SNZO~ ~w~kannst du beim Zielen ~h~heran- und herauszoomen. - -[HELP10] -~w~Der ~h~gelbe Stern~w~ zeigt an, dass du ~h~gesucht wirst~w~ - Die Polizei wird versuchen, dich zu verhaften. - -[HELP11] -~w~Je mehr Sterne, umso energischer werden Gesetzeshüter gegen dich vorgehen. - -[HELP12] -~w~Stell dich in die ~h~gelbe Markierung~w~, um eine Mission zu starten. - -[HELP13] -~w~Achte auf Wege, die nicht auf dem ~h~Radar~w~ angezeigt werden und nutze sie zu deinem Vorteil! - -[HELP14] -~w~Benutze das ~h~Radar~w~, um dich zu orientieren - folge dem ~h~gelben Punkt~w~, um das ~h~Versteck~w~ zu finden. - -[HELP16] -~w~Benutze~h~ ~k~ ~VESTR~ ~w~zum Steuern. - -[HELP17] -~w~Phil Cassidy's - Ware von größerem Kaliber: Demnächst neue Lieferung! - -[HELP18] -~w~Phil Cassidy's Fully Cocked Gun Shop hat neue Ware geliefert bekommen! - -[HELP18B] -~w~Phil Cassidy's hat jetzt die ~h~Minigun~w~ vorrätig! - -[HELP19A] -~w~Um ein ~h~Drive-by~w~ auszuführen, halte die~h~ ~k~ ~VELL~ ~w~oder die~h~ ~k~ ~VELR~ ~w~und feuere mit~h~ ~k~ ~VEWEP~. - -[HELP19C] -~w~Ein Drive-by kannst du nur ausführen, wenn du eine ~h~Maschinenpistole~w~ hast. - -[HELP19D] -~h~Auf Motorrädern ~w~kannst du durch Drücken von~h~ ~k~ ~VEWEP~ nach vorn schießen~w~. - -[HELP19F] -~w~Du kannst nur nach vorn schießen, wenn du eine ~h~Maschinenpistole~w~ hast. - -[HELP20] -~w~Du hast ~h~Polizeischmiergeld~w~ gefunden. Das verringert deinen ~h~Fahndungslevel~w~ um einen Stern! - -[HELP21] -~w~Drücke~h~ ~k~ ~PDCWE~~w~, um zu Fuß Waffen zu wechseln. - -[HELP22] -~w~Um ~h~Vincenzos Lagerhaus~w~ zu finden, folge dem ~h~V~w~ auf dem Radar. - -[HELP23] -~w~Ein ~h~nach unten zeigendes Dreieck~w~ bedeutet, dass sich das ~h~Ziel in geringerer Höhe~w~ als du befindet. - -[HELP24] -~w~Halte~h~ ~k~ ~VELL~ ~w~oder~h~ ~k~ ~VELR~~w~, um im Fahrzeug nach ~h~links oder rechts~w~ zu sehen. Halte beide, um nach ~h~hinten~w~ zu sehen. - -[HELP25] -~w~Drücke die~h~ ~k~ ~CVEIW~~w~, um den ~h~Blickwinkel~w~ zu verändern. - -[HELP26] -~w~Spring auf ein Boot und drücke~h~ ~k~ ~VEEE~~w~, um hinein zu gelangen. - -[HELP27] -~w~In der Nähe eines Boots drücke~h~ ~k~ ~VEEE~~w~, um an Bord zu gehen. - -[HELP29] -~w~Drücke~h~ ~k~ ~VEHN~~w~, um zu ~h~hupen. - -[HELP30] -~w~Mit der~h~ ~k~ ~VECRS~ ~w~kannst du verschiedene ~h~Radiosender~w~ einstellen. - -[HELP33] -~w~Jetzt, wo die Killer angeheuert worden sind, werden sie den Job durchziehen, egal wie lange es dauert. - -[HELP34] -~w~Halte~h~ ~k~ ~VELB~~w~, um in einem Auto nach hinten zu sehen. - -[HELP38] -~w~Erledigst du jemanden, der eine Waffe hat, wird er sie fallen lassen. - -[HELP40] -~w~Gehst du zu Fuß, benutze~h~ ~k~ ~PDLOO~~w~, um dich umzusehen. - -[HELP58] -~w~Halte~h~ ~k~ ~PDLT~~w~, um ~h~ein Ziel zu erfassen~w~, und drücke~h~ ~k~ ~PDFW~ ~w~zum Feuern! - -[HELP59] -~w~Hast du ein Ziel erfasst, drücke~h~ ~k~ ~PDCTL~~w~, um es zu wechseln. - -[HELP60] -~w~Manche Fässer explodieren, wenn du auf sie schießt - aber halte Abstand! - -[TANK] -~h~~k~ ~VEWEA~~w~, um mit der Kanone des Rhino zu zielen.~h~ ~k~ ~VEWEP~ ~w~zum Feuern. - -[ANSWER] -~w~Drücke die~h~ ~k~ ~ANS~~w~, um an dein Handy zu gehen und~h~ ~k~ ~VEEE~~w~, um aufzulegen. - -[BOMB] -~w~Fährst du in die Bombenwerkstatt, wird 8-Ball für ~h~$500~w~ eine ~h~Bombe~w~ an deinem Wagen anbringen. - -[BRIDGE1] -~w~Callahan Bridge: Im Bau. Geplante Fertigstellung: Mai 1998 - -[STRIK_1] -~w~Wenn der Streik beendet ist, wirst du mit der ~h~Fähre~w~ nach Staunton Island fahren können. - -[SPRAY] -~w~Beim ~h~Pay 'n' Spray~w~ wirst du deinen ~h~Fahndungslevel~w~ los und dein Fahrzeug wird ~h~repariert ~w~und ~h~umgespritzt~w~. Kostenpunkt: ~h~$100. - -[S_TRN_1] -~w~Mit der ~h~U-Bahn~w~ kannst du in Liberty City herumfahren. Drücke~h~ ~k~ ~VEEE~~w~, um in eine U-Bahn ~h~ein- ~w~oder ~h~auszusteigen~w~. - -[TUBE1] -~w~Wenn der Bahnhof öffnet, kannst du eine ~h~U-Bahn~w~ nach Staunton Island nehmen. - -[TUBE2] -~w~Du kannst zum ~h~Francis International Airport ~w~fahren, wenn dieser Bahnhof öffnet. - -[TUBE_2] -~w~Um in eine ~h~U-Bahn~w~ zu steigen, drücke~h~ ~k~ ~VEEE~. - -[SPRAY1] -~w~Parkst du im ~h~Pay 'n' Spray~w~, so wirst du deinen ~h~Fahndungslevel~w~ los und dein Fahrzeug wird ~h~repariert ~w~und ~h~umgespritzt~w~. Normalerweise kostet das ~h~$100~w~ - diesmal gratis. - -[HELPE31] -~w~Während des Spiels werden stets neue Outfits für den Spieler verfügbar und müssen bei Mr. Benz abgeholt werden. - -[HELPE32] -~w~Während des Spiels hat der Spieler die Möglichkeit, bei Ammu-Nation großkalibrigere Waffen zu kaufen. - -[HELPCOM] -~w~Neue Outfits im Versteck freigeschaltet! - -[HELP41] -~w~Parke im ~h~Pay 'n' Spray~w~, um dein Auto reparieren und umspritzen zu lassen. Die ~h~Sprühdose~w~ auf dem Radar führt dich zum ~h~Pay 'n' Spray. - -[PAGEB1] -~w~Die ~h~Pistole~w~ ist jetzt in deinem Versteck verfügbar! - -[PAGEB10] -~w~Du hast alle versteckten Päckchen gefunden! Hier hast du einen ~h~$50.000-Bonus! - -[EXPO_W] -~w~Love Media braucht einen von denen! - -[FERRY_2] -~w~Komm wieder, wenn eine Fähre angelegt hat. - -[FERRY_3] -~w~Dein Fahrzeug passt nicht auf die Fähre! - -[FERRY_4] -~w~Gesuchte Verbrecher dürfen nicht auf die Fähre! - -[FERRY_5] -~w~Du brauchst ~h~$25~w~ für ein Fährticket. Komm wieder, wenn du genug Geld hast. - -[FERRY_6] -~w~Während einer Mission kannst du nicht die Fähre nehmen. - -[FERR_SK] -~w~Drücke~h~ ~k~ ~TRSK~~w~, um den Rest der Fahrt zu überspringen. - -[FERR_C1] -~w~Fähre nach Staunton. Fahrpreis: ~h~$25~w~. Drücke~h~ ~k~ ~TGSUB~~w~, um ein Ticket zu kaufen. - -[FERR_C2] -~w~Fähre nach Portland. Fahrpreis: ~h~$25~w~. Drücke~h~ ~k~ ~TGSUB~~w~, um ein Ticket zu kaufen. - -[A_H1] -~w~~k~ ~AMBUY~ ~w~zum Kaufen. ~n~~k~ ~AMEXI~ ~w~zum Beenden. - -[A_UZI_A] -~w~Ammu-Nation hat jetzt Micro SMGs auf Lager! - -[AMMU] -~w~Wenn eine neue Lieferung eintrifft, gibt es wieder Waffen bei ~h~Ammu-Nation~w~. Sorry, dass Sie umsonst hier waren. - -[WANT_A] -~w~Wirst du ~h~'verhaftet'~w~, so wirst du zum nächsten Polizeirevier gebracht. - -[WANT_B] -~w~Passiert dir das auf einer Mission, ist diese fehlgeschlagen und die Cops nehmen dir alle Waffen weg und kassieren Schmiergeld von dir. - -[WANT_C] -~w~Du wirst nur ~h~'verhaftet'~w~, wenn du einen ~h~Fahndungslevel~w~ hast - dargestellt durch eine Reihe von Sternen am oberen Bildschirmrand. - -[WANT_D] -~w~Je mehr Sterne du hast, desto entschiedener werden die Gesetzeshüter dich verfolgen. - -[WANT_E] -~w~Es gibt Wege, deinen Fahndungslevel zu verringern - halte die Augen danach offen. - -[WANT_F] -~w~Bist du mit einem Fahrzeug unterwegs, wirst du deinen Fahndungslevel bei einem ~h~Pay 'n' Spray~w~ los. - -[HEAL_A] -~w~Wenn du ~h~'außer Gefecht'~w~ bist, wirst du zur nächsten Klinik gebracht. - -[HEAL_B] -~w~Du verlierst alle Waffen und eine etwaige Mission ist fehlgeschlagen. Außerdem musst du die Behandlung bezahlen. - -[HEAL_C] -~w~Dein ~h~Gesundheitszustand~w~ wird durch den roten Balken oben rechts angezeigt. - -[HEAL_D] -~w~Es gibt Möglichkeiten, sich zu kurieren oder zu schützen - halte die Augen danach offen. - -[H_WE_01] -~w~Gehe über eine Waffe, um sie aufzuheben. Du kannst Waffen nur zu Fuß an dich nehmen. - -[H_WE_02] -~w~Hast du bereits eine Waffe dieses Typs, dann drücke~h~ ~k~ ~PUCF~~w~, um sie durch die neue zu ersetzen. - -[PU_CF] -~w~Drücke die~h~ ~k~ ~PUCF~~w~, um diese Waffe an dich zu nehmen. Eine etwaige Waffe gleichen Typs geht verloren. - -[CLOTHA] -Benutze~h~ ~k~ ~AMMOV~~w~, um Bekleidung anzusehen. Umziehen ~n~mit~h~ ~k~ ~AMBUY~~w~. Abbrechen mit~h~ ~k~ ~AMEXI~~w~. - -[CLOTHB] -~w~Du kannst hier jederzeit deine Kleidung wechseln. - -[SIREN_1] -~w~Um die ~h~Sirene eines Einsatzfahrzeuges~w~ ein- oder auszuschalten, drücke schnell die~h~ ~k~ ~VEHN~. - -[FHOSE_1] -~w~Halte~h~ ~k~ ~VEWEP~~w~, um die Löschkanone einzusetzen. - -[PHOTO1] -~w~Halte~h~ ~k~ ~PDLT~~w~, um durch den Sucher der Kamera zu schauen. - -[PHOTO2] -~w~Während du die Kamera benutzt, kannst du mit~h~ ~k~ ~SNZI~ ~w~und~h~ ~k~ ~SNZO~ ~w~heran- und heraus~h~zoomen~w~. - -[PHOTO3] -~w~Drücke~h~ ~k~ ~PDFW~~w~, um ein anvisiertes Motiv zu fotografieren. - -[BENZ_H1] -~w~Das ~h~Hemdensymbol~w~ auf dem Radar führt dich zu ~h~Mr. Benz' Bekleidungsgeschäft. - -[BENZ_LE] -~w~Der ~h~Leone-Anzug~w~ ist jetzt im Versteck verfügbar. - -[BENZ_GU] -~w~Das ~h~Avenging Angel-Kostüm~w~ ist jetzt im Versteck verfügbar. - -[BENZ_CH] -~w~Die ~h~Chauffeurslivree~w~ ist jetzt im Versteck verfügbar. - -[BENZ_TU] -~w~Der ~h~Smoking~w~ ist jetzt im Versteck verfügbar. - -[ATUTOR] -~w~Zum Ein- und Ausschalten von Krankenwagen-Missionen drücke~h~ ~k~ ~TGSUB~. - -[CTUTOR] -~w~Zum Ein- und Ausschalten von Bürgerwehr-Missionen drücke~h~ ~k~ ~TGSUB~. - -[FTUTOR] -~w~Zum Ein- und Ausschalten von Feuerwehr-Missionen drücke~h~ ~k~ ~TGSUB~. - -[TRATUT1] -~w~Zum Ein- und Ausschalten von Müllabfuhr-Missionen drücke~h~ ~k~ ~TGSUB~. - -[TTUTOR] -~w~Zum Ein- und Ausschalten von Taxi-Missionen drücke~h~ ~k~ ~TGSUB~. - -[A_COMP2] -~w~Krankenwagen-Mission: Level 12 abgeschlossen! Laufen ermüdet dich nie mehr! - -[FIREPRO] -~w~Feuerwehr-Mission: Level 12 abgeschlossen! Du bist jetzt feuerfest! - -[RCHELP] -~w~Zum ~h~Sprengen~w~ deines ferngesteuerten Autos drücke~h~ ~k~ ~VEWEP~. - -[TAXIH1] -~w~Halte neben einem ~h~markierten Fußgänger~w~, um ihn einsteigen zu lassen, dann bring ihn schnell an sein Fahrtziel. - -[TIPHLP] -~w~Der ~h~Trinkgeld-Balken~w~ sinkt mit zunehmender ~h~Fahrtzeit~w~ und wenn dein Taxi ~h~beschädigt~w~ wird. - -[ANG_E3] -~w~Suche in Chinatown nach anderen Avenging Angels. - -[ANGOUT] -~w~Komm wieder, wenn du ein ~h~Avenging Angel~w~-Kostüm trägst. - -[ANGCOM2] -~w~Avenging Angel-Missionen Staunton: Level 15 abgeschlossen! Du verlierst nun kein Geld mehr, wenn du verhaftet wirst! - -[ANGCOM3] -~w~Avenging Angel-Missionen Shoreside: Level 15 abgeschlossen! In deinem Versteck wartet ein 'Spezial-Fahrzeug' auf dich! - -[TVOHELP] -~w~Komm wieder, wenn du die ~h~Hockey-Maske~w~ trägst. - -[TIMER] -Diese Mission hat ein Zeitlimit. Du musst sie beendet haben, bevor die Zeit um ist. - -[GARAGE] -Fahr den Wagen in die Garage, dann geh nach draußen. - -[TRASH] -~g~Du hast dein Fahrzeug ziemlich geschrottet! Lass es reparieren! - -[WRECKED] -~r~Das Fahrzeug ist Schrott! - -[SPOOK] -SCHRECK-O-METER - -[SPOTTED] -~r~Sie haben dich bemerkt! - -[REWARD] -~w~Belohnung: $~1~ - -[GAMEOVR] -GAME OVER - -[Z] -Z-Achse Wert: ~1~ - -[DEAD] -AUSSER GEFECHT! - -[BUSTED] -VERHAFTET! - -[GOODBOY] -~w~$50 Braver-Bürger-Bonus! - -[NUMBER] -~1~ - -[SCORE] -$~1~ - -[LOADCAR] -LADE FAHRZEUG... (ABBRECHEN MIT L-Taste) - -[CARSOFF] -Deaktivierte Fahrzeuge. - -[CARS_ON] -Aktivierte Fahrzeuge. - -[TEXTXYZ] -Schreibe Koordinaten in Datei... - -[CHEATON] -Cheat Modus AN - -[CHEATOF] -Cheat Modus AUS - -[IMPORT1] -Geh nach draußen und warte auf dein Fahrzeug. - -[KE_PLYR] -Spieler - -[KE_CTCS] -Kontaktleute - -[KE_WEPS] -Waffen - -[KE_ADR] -Adrenalin - -[KE_BRIB] -Schmiergeld - -[KE_HLTH] -Gesundheit - -[KE_KILF] -Spezialauftrag - -[KE_ARM] -Panzerung - -[KE_USJ] -M-Stunt - -[KE_PKG] -Verstecktes Päckchen - -[KE_INFO] -Information - -[DAM] -Schaden - -[KILLS] -Hits - -[TIME] -Timer - -[STOPS] -Stops - -[BULL] -Goldbarren - -[EVID] -Beweismittel - -[HEALTH] -Auto - -[COLLECT] -Gesammelt - -[LEVEL] -Level - -[SALES] -Verkäufe - -[CITYZON] -Liberty City - -[VICE_C] -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] -Rotlichtviertel - -[TOWERS] -Hepburn Heights - -[HARWOOD] -Harwood - -[ROADBR1] -Callahan Bridge - -[ROADBR2] -Callahan Bridge - -[TUNNELP] -Porter Tunnel - -[BOMB1] -8-Balls Werkstatt - -[COM_ZON] -Staunton Island - -[STADIUM] -Aspatria - -[STADIU2] -Aspatria - -[STADIU3] -Aspatria - -[HOSPI_2] -Rockford - -[UNIVERS] -Liberty Campus - -[CONSTRU] -Fort Staunton - -[PARK] -Belleville Park - -[COM_EAS] -Newport - -[SHOPING] -Bedford Point - -[SHOP2] -Bedford Point - -[SHOP3] -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] -Krankenwagen - -[CAR_2] -Feuerwehrwagen - -[CAR_3] -Streifenwagen - -[CAR_4] -Enforcer - -[CAR_5] -Barracks - -[CAR_6] -Rhino - -[CAR_7] -FBI Cruiser - -[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 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 - -[SINDACO] -Sindacco Argento - -[HEARSE] -Hearse - -[LANDSTK] -Landstalker - -[IDAHO] -Idaho - -[STINGER] -Stinger - -[LINERUN] -Linerunner - -[PEREN] -Perennial - -[SENTINL] -Sentinel - -[PATRIOT] -Patriot - -[FIRETRK] -Feuerwehrwagen - -[TRASHM] -Trashmaster - -[STRETCH] -Stretch Limo - -[MANANA] -Manana - -[INFERNS] -Infernus - -[BLISTA] -Blista - -[PONY] -Pony - -[MULE] -Mule - -[CHEETAH] -Cheetah - -[AMBULAN] -Krankenwagen - -[FBICAR] -FBI Cruiser - -[MOONBM] -Moonbeam - -[ESPERAN] -Esperanto - -[TAXI] -Taxi - -[KURUMA] -Kuruma - -[BOBCAT] -Bobcat - -[WHOOPEE] -Mr Whoopee - -[BFINJC] -BF Injection - -[POLICAR] -Streifenwagen - -[ENFORCR] -Enforcer - -[SECURI] -Securicar - -[BANSHEE] -Banshee - -[PREDATR] -Predator - -[BUS] -Bus - -[RHINO] -Rhino - -[BARRCKS] -Barracks OL - -[BARRACK] -Barracks OL - -[TRAIN] -Zug - -[HELI] -Helikopter - -[DODO] -Dodo - -[COACH] -Coach - -[CABBIE] -Cabbie - -[STALION] -Stallion - -[RUMPO] -Rumpo - -[RCBANDT] -RC Bandit - -[BELLYUP] -Triaden-Fisch-Van - -[MRWONGS] -Mr Wongs - -[MAFIACR] -Leone Sentinel - -[YARDICR] -Yardie Lobo - -[YAKUZCR] -Yakuza Stinger - -[DIABLCR] -Diablo Stallion - -[COLOMCR] -Kartell Cruiser - -[HOODSCR] -Hoods Rumpo XL - -[AEROPL] -Flugzeug - -[SPEEDER] -Speeder - -[REEFER] -Reefer - -[PANLANT] -Panlantic - -[FLATBED] -Flatbed - -[YANKEE] -Yankee - -[BORGNIN] -Bickle '76 - -[TOYZ] -TOYZ - -[MCLARN] -Lancer MF1 - -[SHELBY] -Hellenbach GT - -[SUBARU] -Impreza WRX - -[SUPRA] -Supra - -[SKYLINE] -Skoiloine - -[CYCLONE] -Cyclone GT - -[ESPRIT] -V8 Ghost - -[MINI] -Tommy - -[HOTROD] -Thunder-Rodd - -[CAMPVAN] -Wahlkampf-Rumpo - -[BALLOT] -Stimmzettel-Van - -[GHOST] -Ghost - -[ANGEL] -Angel - -[ANGEL2] -Avenger - -[PIZZABO] -Pizzaboy - -[NOODLBO] -Nudelboy - -[FAGGIO] -Faggio - -[FREEWAY] -Freeway - -[SANCHEZ] -Sanchez - -[SANCH2] -Manchez - -[F_PASS1] -~w~Feuer gelöscht! Belohnung: $~1~ - -[F_RANGE] -~r~Du bist außer Reichweite des Feuerwehrfunks. Fahr näher an eine Feuerwache heran! - -[C0TGSUB] -die R3-Taste - -[C0VESTR] -den linken Analog-Stick oder die Richtungstasten Links und Rechts - -[C1VESTR] -den linken Analog-Stick - -[C2VESTR] -linken Analog-Stick oder Richtungstasten Links und Rechts - -[C3VESTR] -linken Analog-Stick - -[C2VEHB] -~T~ - -[C3VEHB] -L1-Taste - -[C0VEHN] -L3-Taste - -[C0VELL] -L2-Taste - -[C1VELL] -L2-Taste - -[C2VELL] -L2-Taste - -[C3VELL] -L2-Taste - -[C0VELR] -R2-Taste - -[C1VELR] -R2-Taste - -[C2VELR] -R2-Taste - -[C3VELR] -R2-Taste - -[C0VELB] -die L2-Taste + die R2-Taste - -[C1VELB] -die L2-Taste + die R2-Taste - -[C2VELB] -L2-Taste + R2-Taste - -[C3VELB] -L2-Taste + R2-Taste - -[C0VECRS] -L1-Taste - -[C1VECRS] -SELECT-Taste - -[C0VEWEI] -dem linken Analog-Stick oben/unten oder den Richtungstasten Oben und Unten - -[C1VEWEI] -dem linken Analog-Stick oben/unten - -[C2VEWEI] -linken Analog-Stick oben/unten oder Richtungstasten Oben und Unten - -[C3VEWEI] -linken Analog-Stick oben/unten - -[C0PDCWE] -die L2-Taste und die R2-Taste - -[C1PDCWE] -die L2-Taste und die R2-Taste - -[C0PUCF] -L1-Taste - -[C1PUCF] -L1-Taste - -[C2PUCF] -~T~ - -[C3PUCF] -~O~ - -[C0PDLT] -die R1-Taste - -[C1PDLT] -die R1-Taste - -[C2PDLT] -R1-Taste - -[C3PDLT] -L1-Taste - -[C0PDCTL] -die L2-Taste und die R2-Taste - -[C1PDCTL] -die L2-Taste und die R2-Taste - -[C2PDCTL] -L2-Taste und R2-Taste - -[C3PDCTL] -L2-Taste und R2-Taste - -[C0CVEIW] -SELECT-Taste - -[C1CVEIW] -Richtungstasten Oben und Unten - -[C2CVEIW] -SELECT-Taste - -[C3CVEIW] -SELECT-Taste - -[C0PDBAK] -R3-Taste - -[C1PDBAK] -R3-Taste - -[C2PDBAK] -R3-Taste - -[C3PDBAK] -R3-Taste - -[C0PDLO1] -L-Taste - -[C1PDLO1] -L-Taste - -[C2PDLO1] -L-Taste - -[C3PDLO1] -L-Taste - -[C0PDLO2] -Analog-Pad - -[C2PDLO2] -Analog-Pad - -[C0ANS] -L1-Taste - -[C1ANS] -L1-Taste - -[C2ANS] -L1-Taste - -[C3ANS] -L1-Taste - -[WEATHER] -WETTER ÄNDERN - -[WEATHE2] -WETTER NORMAL - -[GA_4] -~w~Autobomben kosten $500 pro Stück. - -[GA_5] -~w~In deinem Fahrzeug ist schon eine Autobombe. - -[GA_6] -~w~Park die Karre, mach sie durch Drücken von~h~ ~k~ ~PED_FIREWEAPON~ ~w~scharf, und dann HAU AB! - -[GA_7] -~w~Mach die Bombe mit ~h~ ~k~ ~PED_FIREWEAPON~~w~ scharf. Dann geht sie hoch, wenn der Wagen angelassen wird. - -[GA_8] -~w~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] -Das Modell haben wir schon. Das können wir nicht gebrauchen! - -[GA_12] -Bombe ist scharf - -[GA_13] -Saubere Arbeit. Wenn du alle auf der Liste abgeliefert hast, kriegst du einen Bonus. - -[GA_14] -Du hast alle Karren geliefert. SEHR GUT! Hier, für dich. - -[GA_15] -~w~Hoffentlich gefällt dir die neue Farbe. - -[GA_17] -~w~Neuer Motor und neue Lackierung! - -[GA_19] -An dem Modell haben wir kein Interesse. - -[GA_20] -Von der Sorte haben wir mehr als genug. Da kommen wir nicht ins Geschäft. - -[GA_22] -~w~In ein Motorrad kannst du keine Bombe einbauen. - -[GA_23] -~w~Autobombe eingebaut - Material und Arbeit: $500 - -[GA_24] -~w~Autobombe eingebaut - die geht aufs Haus! - -[CR_1] -~w~Der Kran kann dieses Fahrzeug nicht anheben. - -[PU_MONY] -~w~Du hast nicht genug Geld. - -[PAUSED] -PAUSE - -[FEB_STA] -Statistiken - -[FEB_MAP] -Karte - -[FEB_BRI] -Infos - -[FEB_CON] -Steuerung - -[FEB_AUD] -Audio - -[FEB_DIS] -Anzeige - -[FEB_LAN] -Sprache - -[FEP_STA] -STATISTIKEN - -[FEP_MAP] -KARTE - -[FEP_BRI] -INFOS - -[FEP_CON] -STEUERUNG - -[FEP_AUD] -AUDIO - -[FEP_DIS] -ANZEIGE - -[FEP_LAN] -SPRACHE: - -[FEF_ST1] -Wer ist der Härteste? - -[FEF_ST2] -Wie viel Chaos hast du angerichtet? - -[FEF_BR1] -Du blickst nicht mehr durch? - -[FEF_CO1] -Taste dich ran, Mann! - -[FEF_SA1] -Keep your place in the pile! - -[FEF_SA2] -Spiele laden und speichern - -[FEF_AU1] -Volle Dröhnung gefällig? - -[FEF_AU2] -Radiosender und Soundeffekte auswählen - -[FEF_DI1] -Andere Optik? - -[FEF_DI2] -Spiel für deinen Fernseher optimieren - -[FEF_LA1] -Was für ein Gefasel! - -[FEF_LA2] -Welches Idiom liegt dir denn so? - -[FEM_ON] -EIN - -[FEM_OFF] -AUS - -[FEM_YES] -Ja - -[FEM_NO] -Nein - -[FEM_NON] -Kein(e) - -[FEI_SEL] -Auswahl - -[FEI_TAR] -Ziel An/Aus - -[FEI_BAC] -Zurück - -[FEI_RES] -Fortsetzen - -[FEI_NAV] -Bewegen - -[FEI_BTX] -/ - -[FEI_BTT] -" - -[FEI_STA] -START - -[FEI_BTD] -analog - -[FEI_BTU] -;= - -[FEI_R1B] -L \ R - -[FEI_SCR] -Scrollen - -[FEI_ZOO] -Zoom - -[FEH_STA] -STATISTIKEN - -[FEH_CON] -STEUERUNG - -[FEH_AUD] -AUDIO - -[FEH_LAN] -SPRACHE - -[FEH_SGA] -NEUES SPIEL STARTEN - -[FET_SG] -SPIEL SPEICHERN - -[FEH_BRI] -INFO - -[FEH_DIS] -ANZEIGE - -[FEH_MAP] -KARTE - -[FEM_OK] -OK - -[FEC_CRO] -Ducken - -[FE_MLG] -KARTENLEGENDE +[SENTXS] +Sentinel XS [MAP_LEG] -LEGENDE: +Legende + +[VCNMAV] +VCN Maverick [LG_01] Position des Spielers +[LG_02] +Avery Carrington + +[LG_03] +Biker-Kontaktpunkt + +[LG_04] +Colonel Cortez + +[LG_05] +Ricardo Diaz + +[LG_06] +Kent Paul + +[LG_07] +Rechtsanwalt + +[LG_08] +Phil Cassidy + +[LG_09] +Bootswerft + +[LG_10] +Malibu Club + +[LG_11] +Kubaner + +[LG_12] +Filmstudio + [LG_13] -Ammu-Nation +AmmuNation + +[LG_14] +Haitianer + +[LG_15] +Eisenwarenladen [LG_16] Versteck +[LG_17] +Eiscreme + +[LG_18] +Kaufman-Taxis + +[LG_19] +Love Fist + +[LG_20] +Druckerei + +[LG_21] +Immobilie + [LG_22] Pay 'n' Spray [LG_23] -Mr. Benz +Bekleidungsgeschãft + +[LG_24] +Tommys Villa [LG_25] Telefon @@ -1421,7 +132,7 @@ Radiosender Fever 105 Radiosender VRock [LG_31] -VCPR Radio Station +Polizeifunk-Zentrale [LG_32] Radiosender Espantoso @@ -1432,800 +143,1490 @@ Radiosender Emotion 98.3 [LG_34] Radiosender Wave 103 -[LG_35] -Ziel - [LG_36] Sun Yard [LG_37] -Strip Club +Stripper-Bar -[LG_38] -8-Ball +[MAP_YAH] +DU BIST HIER -[LG_39] -Kirche zum Beichten +[TAXSHRT] +~g~Du kannst dieses Kaufman-Taxi nehmen, statt selbst Auto zu fahren. Das kostet dich $9. -[LG_40] -Ma Cipriani +[MOB_09D] +Vielleicht hab ich Leo ja erledigt und mir sein Handy genommen. Hast du schon mal daran gedacht, du Penner? -[LG_41] -Donald Love - -[LG_42] -JD O'Toole - -[LG_43] -Salvatore Leone - -[LG_44] -Maria - -[LG_45] -McAffrey - -[LG_46] -Toshiko Kasen - -[LG_47] -Vincenzo Cilli - -[LG_48] -Bombenwerkstatt - -[LG_49] -Bekleidungsgeschäft - -[LG_50] -Phil Cassidy's - -[LG_51] -Bedrohung - -[LG_52] -Freund - -[LG_53] -Gegenstand - -[LG_54] -Spieler-Ziel - -[FEO_CON] -Steuerungs-Setup - -[FEO_AUD] -Audio-Setup - -[FEO_DIS] -Anzeigen-Setup - -[FEO_LAN] -Sprachen-Setup - -[FEO_PLA] -Spieler-Setup - -[FEB_PMB] -Vorherige Missionsinfos: - -[FEC_NA] -Nicht belegt - -[FEC_CWL] -Eine Waffe nach links - -[FEC_CWR] -Eine Waffe nach rechts - -[FEC_CW] -Waffenauswahl - -[FEC_CT] -Zielauswahl - -[FEC_TAR] -Zielen - -[FEC_MOV] -Bewegung - -[FEC_CAM] -Blickwinkel ändern - -[FEC_PAU] -Pause - -[FEC_ENV] -In Fahrzeug einsteigen - -[FEC_JUM] -Springen - -[FEC_ATT] -Angreifen/Feuern - -[FEC_RUN] -Rennen - -[FEC_FPC] -Umherschauen - -[FEC_LL] -Nach links schauen - -[FEC_LB1] -Schau - -[FEC_LB2] -nach hinten - -[FEC_LB] -Nach hinten schauen - -[FEC_LR] -Nach rechts schauen - -[FEC_HOR] -Hupe - -[FEC_VES] -Fahrzeugsteuerung - -[FEC_RSC] -Radiosender wechseln - -[FEC_BRA] -Bremsen/Zurücksetzen - -[FEC_HAB] -Handbremse - -[FEC_CAW] -Fahrzeugwaffe - -[FEC_ACC] -Beschleunigen - -[FEC_SMT] -Spezialmission - -[FEC_CCF] -KONFIGURATION: - -[FEC_CF1] -KONFIG. 1 - -[FEC_CF2] -KONFIG. 2 - -[FEC_CF3] -KONFIG. 3 - -[FEC_CF4] -KONFIG. 4 - -[FEC_CDP] -TYP: - -[FEC_ONF] -ZU FUSS - -[FEC_INC] -IM FAHRZEUG - -[FEC_VIB] -VIBRATION: - -[FEC_ILU] -KAMERA INVERTIEREN: - -[FEC_SWP] -SPIELER-BEWEGUNG: - -[FEC_AS] -Analog-Pad - -[FEC_DP] -Richtungstasten - -[FEA_SFX] -LAUTSTÄRKE SFX: - -[FEA_OUT] -Tonausgabe: - -[FEA_ST] -Stereo - -[FEA_MNO] -Mono - -[FEA_CTD] -Achtung! Für dieses Feature muss DTS-kompatible Hardware angeschlossen sein. Weiter? - -[FEA_DTS] -DTS - -[FEA_RSS] -RADIOSENDER: - -[FEA_NON] -Radio aus - -[FED_BRI] -HELLIGKEIT: - -[FED_TRA] -UNSCHÄRFE-FX: +[FE_MLG] +KARTENLEGENDE [FED_RDR] -RADAR-MODUS: +RADAR-MODUS [FED_HUD] -HUD-MODUS: +HUD-MODUS -[FED_RDM] -KARTE & SYMBOLE +[FED_RDL] +GROSS [FED_RDB] NUR SYMBOLE -[FEL_ENG] -ENGLISCH - -[FEL_FRE] -FRANZÖSISCH - -[FEL_GER] -DEUTSCH - -[FEL_ITA] -ITALIENISCH - -[FEL_SPA] -SPANISCH - -[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] -Das Spiel speichern - -[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] -Spielstand 0 - -[FEM_SL1] -Spielstand 1 nicht vorhanden - -[FEM_SL2] -Spielstand 2 nicht vorhanden - -[FEM_SL3] -Spielstand 3 nicht vorhanden - -[FEM_SL4] -Spielstand 4 nicht vorhanden - -[FEM_SL5] -Spielstand 5 nicht vorhanden - -[FEM_SL6] -Spielstand 6 nicht vorhanden - -[FEM_SL7] -Spielstand 7 nicht vorhanden - -[FES_LOA] -SPIEL LADEN - -[ST_TIME] -Spielzeit bei diesem Spiel - -[ST_OVTI] -Gesamtspielzeit - -[NUMSHV] -Wie oft gespeichert - -[PL_STAT] -Spielerstatistiken - -[PE_WAST] -Von dir abservierte Personen - -[PE_WSOT] -Von anderen abservierte Personen - -[CAR_EXP] -Explodierte Autos - -[BOA_EXP] -Zerstörte Boote - -[TM_BUST] -Zahl deiner Verhaftungen - -[M_WASTE] -Männliche Zivilisten - -[F_WASTE] -Weibliche Zivilisten - -[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] -Verschrottete Fahrzeuge - -[HED_EX] -Köpfe - -[ST_HEAD] -Entscheidende Treffer - -[BUL_FIR] -Abgefeuerte Kugeln - -[BUL_HIT] -Kugeln, die trafen - -[SPRAYIN] -Anzahl Lackierungen - -[TM_DED] -Krankenhausbesuche - -[ST_GANG] -Unbeliebteste Gang - -[ST_GNG1] -Leones - -[ST_GNG2] -Triaden - -[ST_GNG3] -Diablos - -[ST_GNG4] -Yakuza - -[ST_GNG5] -Yardies - -[ST_GNG6] -Kolumbianer - -[ST_GNG7] -Hoods - -[ST_GNG8] -Forellis - -[ST_GNG9] -Sindaccos - -[DAYSPS] -Im Spiel verstrichene Tage - -[MMRAIN] -Regenfälle in mm - -[ST_STAR] -Anzahl angehäufter Fahndungssterne - -[ST_STGN] -Anzahl losgewordener Fahndungssterne - -[TOT_DIS] -Zurückgelegte Entfernung in Meilen - -[TOTDISM] -Zurückgelegte Entfernung in Metern - -[DISTBIK] -Mit Motorrad zurückgel. Meilen - -[DISTBIM] -Mit Motorrad zurückgelegte Meter - -[DISTHEL] -Mit Helikopter zurückgel. Meilen - -[DISTHEM] -Mit Helikopter zurückgel. Meter - -[DISTBOA] -Mit Boot zurückgel. Meilen - -[DISTBOM] -Mit Boot zurückgelegte Meter - -[ST_WHEE] -Längste 'Wheelie' Zeit (Sek.) - -[ST_STOP] -Längste 'Stoppie' Zeit (Sek.) - -[ST_2WHE] -Längste Zeit auf zwei Rädern (Sek.) - -[ST_WHED] -Längste 'Wheelie' Distanz (m) - -[ST_STOD] -Längste 'Stoppie' Distanz (m) - -[ST_2WHD] -Längste Distanz auf zwei Rädern (m) - -[ST_FAPD] -Längster 'Flug' nach Motorradsturz (m) +[FED_HUF] +INFOS EIN- & AUSBLENDEN [FEST_HV] Höchstes Bürgerwehr-Missions-Level -[FIRELVL] -Höchstes Feuerwehr-Missions-Level +[BRIBE1] +Du hast soeben Polizei-Bestechungsgeld aufgenommen, dein Fahndungslevel verringert sich damit um einen Stern. -[ST_STOR] -Stores Knocked Off +[CLOHELP] +Saubere Klamotten!! -[ST_ASSI] -Erfolgreich ausgeführte Attentate +[SUNSHIN] +Sunshine Autos -[ST_FTIM] -Flugstunden +[CHERRYP] +Cherry Popper Eiscreme -[ST_FASH] -Fashion Budget +[KAUFCAB] +Kaufman-Taxis -[ST_WEAP] -Waffenbudget +[BOATYAR] +Die Bootswerft -[ST_PROP] -Budget für Immobilien +[WANT_L] +Dein Fahndungslevel ist bis auf weiteres aufgehoben. Solltest du ein Verbrechen begehen, wãhrend die Sterne blinken, wird dein volles Fahndungslevel wieder aktiv. -[ST_DAMA] -Gesamtwert zerstörter Sachen +[PICK1] +Kugelsichere Weste im Ocean View Hotel angeliefert! -[ST_AUTO] -Budget für Reparaturen und Lackierung +[HOTRNG] +HOTRING -[MXCARD] -Weitester Irrsinns-Sprung (in Fuß) +[BLODRNG] +CHAOS-DERBY -[MXCARJ] -Höchster Irrsinns-Sprung (in Fuß) +[DIRTRNG] +DIRTRING -[MXCARDM] -Weitester Irrsinns-Sprung (m) +[FEC_ABR] +Beschleunigen, Bremsen oder Zurücksetzen -[MXCARJM] -Höchster Irrsinns-Sprung (m) +[FEI_BTU] +; = - -[MXFLIP] -Max. Anzahl Saltos bei Irrsinns-Sprung +[FEI_SCR] +Scrollen -[MXJUMP] -Max. Drehung bei Irrsinns-Sprung +[SKUMBUY] +Skumole Shack gekauft: $ ~1~ -[FST_MFR] -Bevorzugter Radiosender +[SKUM_L] +Drücke die ~h~L1-Taste~w~, um Skumole Shack zu kaufen. Preis: $~1~ -[FST_LFR] -Unbeliebtester Radiosender +[SKUM_T] +Drücke die ~t~"-Taste~w~, um Skumole Shack zu kaufen. Preis: $~1~ -[BSTSTU] -Bester Irrsinns-Stunt bisher: +[SKUM_C] +Drücke die ~o~|-Taste~w~, um Skumole Shack zu kaufen. Preis: $~1~ -[INSTUN] -Irrsinns-Stunt +[LG_35] +Ziel -[PRINST] -Super Irrsinns-Stunt +[IN_VEH] +~g~Hey! Zurück ins Auto!! -[DBINST] -Doppelter Irrsinns-Stunt +[HEY] +~g~Keine Alleingãnge. Halt die Gang beisammen! -[DBPINS] -Super-Doppel-Irrsinns-Stunt +[HELP3] +Du kannst nur kurze Zeit sprinten, ohne müde zu werden. -[TRINST] -Dreifacher Irrsinns-Stunt +[HELP4_D] +Drücke den~h~ rechten Analog-Stick nach oben, um zu ~h~beschleunigen. -[PRTRST] -Super-Dreifach-Irrsinns-Stunt +[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. -[QUINST] -Vierfacher Irrsinns-Stunt +[HELP7_A] +Halte die~h~ ~k~~PED_LOCK_TARGET~ ~w~gedrückt, um mit dem Prãzisionsgewehr zu zielen. -[PQUINS] -Super-Vierfach-Irrsinns-Stunt +[HELP7_D] +Halte die~h~ ~k~~PED_LOCK_TARGET~ ~w~gedrückt, um mit dem Prãzisionsgewehr zu zielen. -[NOSTUC] -Bisher keine Irrsinns-Stunts geschafft +[HELP10] +Dieser Stern zeigt an, dass du von der Polizei gesucht wirst. -[NOUNIF] -Monster-Stunts geschafft +[HELP11] +Je mehr Sterne, desto dringender wirst du gesucht. -[NOUNGM] -Monster-Stunts insgesamt +[HELP13] +Manchmal musst du vielleicht Wege finden, die das Radar nicht zeigt. -[NMISON] -Begonnene Missionen +[TIMER] +Diese Mission hat ein Zeitlimit. Du musst sie beendet haben, bevor die Zeit um ist. -[NMMISP] -Erfüllte Missionen +[HORN] +~g~Drück auf die Hupe. -[PASDRO] -Beförderte Fahrgäste +[NOMONEY] +~g~Du brauchst mehr Cash! -[MONTAX] -Mit Taxi verdientes Geld +[REWARD] +BELOHNUNG $~1~ -[CARSLD] -Verkaufte Autos +[M_FAIL] +MISSION FEHLGESCHLAGEN! -[MONCAR] -Einnahmen aus Autoverkäufen +[M_PASS] +MISSION ERFÜLLT! $~1~ -[BIKESLD] -Verkaufte Motorräder +[DEAD] +AUSSER GEFECHT! -[MONBIKE] -Einnahmen aus Motorradverkäufen +[BUSTED] +VERHAFTET! -[CARSEXP] -Für Love Media gefundene Autos +[WEATHE1] +WETTER AUF SONNIG UMSTELLEN -[SLTVLVL] -Höchstes Slash-TV Missions-Level +[WEATHE2] +WETTER AUF SEHR SONNIG UMSTELLEN -[SLTVKIL] -Bei Slash-TV erledigte Gegner +[WEATHE3] +WETTER AUF BEWÖLKT UMSTELLEN -[MONTRS] -Einnahmen aus Müllabfuhr +[WEATHE4] +WETTER AUF REGNERISCH UMSTELLEN -[HTMKLD] -Killer erledigt +[WEATHE5] +WETTER AUF NEBLIG UMSTELLEN -[GDAMSP] -Anzahl absolvierter Avenging Angel-Missionen +[WEATHE6] +WETTER NORMAL -[HGAJD] -Opfer bei Avenging Angel-Missionen +[NUMBER] +~1~ -[BNDRACE] -RC-Rennen +[LOADCAR] +LADE FAHRZEUG... (ABBRECHEN MIT L1) -[FSTTRT] -Höchste Restzeit bei 'Triaden-Trial' +[CARSOFF] +Deaktivierte Fahrzeuge. -[HGHTRC] -Höchste Einnahmen bei 'Triaden-Trial' +[CARS_ON] +Aktivierte Fahrzeuge. -[FSTHRT] -Bestzeit bei Helikopter-Rennen +[TEXTXYZ] +Schreibe Koordinaten in Datei... -[BHLPOS] -Bestplatzierung bei Helikopter-Rennen +[CHEATON] +Cheat Modus AN -[TMSOUT] -Kleidungswechsel +[CHEATOF] +Cheat Modus AUS -[BSRPS0] -'Low Rider Rumble' +[IMPORT1] +Geh nach draußen und warte auf dein Fahrzeug. -[BSRPS1] -'Deimos Dash' +[PAGEB11] +Flammenwerfer in Versteck angeliefert. -[BSRPS2] -'Wi-Cheetah Run' +[WANT_A] +Verhaftet wirst du nur, wenn die Polizei nach dir ~h~fahndet. -[BSRPS3] -'Rotlicht-Racing' +[WANT_B] +Dein ~h~Fahndungslevel~w~ wird durch die Reihe von Sternen oben rechts auf dem Bildschirm dargestellt. -[BSRPS4] -'Torrington TT' +[WANT_C] +Du hast jetzt einen ~h~Fahndungslevel~w~ von eins... -[BSRPS5] -'Gangsta GP' +[WANT_D] +zwei... -[DBIKE0] -Kurs 1 +[WANT_E] +drei... -[DBIKE1] -Kurs 2 +[WANT_F] +Steigt dein ~h~Fahndungslevel~w~, wirst du von besser ausgebildeten Polizisten gejagt. -[DBIKE2] -Kurs 3 +[WANT_G] +Wirst du ~h~verhaftet~w~, wirst du zum nãchsten Polizeirevier gebracht. -[DBIKE3] -Kurs 4 +[WANT_H] +Die Cops werden dir alle Waffen abnehmen und kassieren ein wenig Bestechungsgeld von dir. -[DBIKE4] -Kurs 5 +[WANT_I] +Wenn dir das auf einer Mission passiert, ist die Mission fehlgeschlagen. -[DBIKE5] -Kurs 6 +[WANT_J] +Im Verlauf des Spiels wirst du Möglichkeiten entdecken, deinen Fahndungslevel zu reduzieren. -[DBIKE6] -Kurs 7 +[WANT_K] +Wenn du in einem Wagen sitzt, werden ~h~LACKIEREREIEN~w~ den Fahndungslevel ~h~annullieren. -[DBIKE7] -Kurs 8 +[HEAL_B] +Wenn du ~h~'außer Gefecht'~w~ bist, wirst du zur nãchsten Klinik gebracht. -[DBIKE8] -Kurs 9 +[HEAL_C] +Du verlierst alle Waffen, und die Ãrzte knöpfen dir ein wenig Cash für die Behandlung ab. -[DBIKE9] -Kurs 10 +[HEAL_E] +Je lãnger du spielst, desto mehr Wege wirst du finden, dich selbst zu verarzten oder zu schützen. -[DBIKEHE] -Krasses Gelände +[SAVE1] +Stell dich in die Markierung. So kannst du dein ~h~Spiel speichern~w~. Wãhrend einer Mission kannst du nicht speichern. -[DBIKEBP] -Beste Platzierung +[SAVE2] +Jedes Fahrzeug, das in dieser Garage abgestellt wird, wird für dich aufbewahrt, wenn das Spiel gespeichert wird. -[DBIKEFL] -Schnellste Runde +[AMMU] +Betritt den Ammu-Nation, um eine Waffe zu kaufen. -[DBIKEFT] -Bestzeit +[R_TIME] +ZEIT: -[ST_PHOT] -Geknipste Fotos +[PROP_1] +Du hast nicht genug Cash für dieses Objekt. -[ST_PIZZ] -Ausgelieferte Pizzas +[PROP_2] +Wãhrend einer Mission kannst du keine Objekte kaufen. -[ST_NOOD] -Ausgelieferte Nudelsnacks +[IND_ZON] +Vice City Beach -[MO_TOUR] -Einnahmen durch Touristen +[COM_ZON] +Vice City Mainland -[TA_TOUR] -Zu Sehenswürdigkeiten geführte Touristen +[BEACH1] +Ocean Beach -[SC_SCRA] -High-Score bei 'Schrottplatz-Challenge' +[BEACH2] +Washington Beach -[SC_9MM] -High-Score bei 'Jagdszenen in 9mm' +[BEACH3] +Vice Point -[SC_SCOO] -High-Score bei 'Scooter Shooter' +[GOLFC] +Leaf Links Golfclub -[DAYPLC] -Tagesetat der Polizei +[STARI] +Starfish Island -[SEAGULL] -Abgeschossene Möwen +[DOCKS] +Viceport -[CRIMRA] -RANG +[HAVANA] +Little Havana + +[HAITI] +Little Haiti + +[PORNI] +Prawn Island + +[DTOWN] +Downtown + +[VICE_C] +Vice City + +[A_PORT] +Escobar Inter. Airport + +[JUNKY] +Schrottplatz + +[PISTOL] +Pistole + +[PYTHON] +.357 + +[UZI] +Uz-1 + +[TEC9] +Tec 9 + +[M4] +M4 + +[INGRAM] +Mac + +[MP5] +MP + +[RUGER] +Kruger + +[SNIPE] +Prãzisionsgewehr + +[GRENADE] +Granaten + +[SHOTGN1] +Schrotflinte + +[SHOTGN2] +S.P.A.S. 12 + +[SHOTGN3] +Abgesãgte Schrotflinte + +[ARMOUR] +Kugelsichere Weste + +[LASER] +.308 Prãzisionsgewehr + +[BASEBAT] +Baseballschlãger + +[HAMMER] +Hammer + +[SCREWD] +Schraubenzieher + +[CLEVER] +Fleischerbeil + +[MACHETE] +Machete + +[KNIFE] +Messer + +[KATANA] +Katana + +[CHAINSA] +Kettensãge + +[G_COST] +$~1~ + +[CAR_1] +Krankenwagen + +[MALIBU] +Malibu Club + +[MANSION] +Diaz' Haus + +[TMANS] +Vercetti Estate + +[STRIP] +Pole Position Club + +[MALL1] +North Point Einkaufszentrum + +[BANKINT] +El Banco Corrupto Grande + +[RANGE] +Schießstand + +[POL_HQ] +Vice City Polizeihauptquartier + +[INT_B] +Ein alter Freund + +[INTB_1] +~g~Begib dich in die Anwaltskanzlei. + +[LAW_1] +Die Party + +[LAW_2] +Dunkle Gassen + +[LAW_3] +Die Geschworenen + +[LAW_4] +Aufruhr + +[COL_1] +Der Verrãter + +[COL_2] +Kugelhagel im Einkaufszentrum + +[COL_3] +Die Schutzengel + +[COL_4] +Zu Befehl, Sir! + +[COL_5] +Alle Mann an Deck! + +[COK_1] +Die Jagd + +[COK_2] +Phnom Penh '86 + +[COK_3] +Das schnellste Boot + +[COK_4] +Angebot & Nachfrage + +[KENT_1] +Die Befreiungsaktion + +[ASS_1] +Pizza Mortale + +[BUD_1] +Fette Beute + +[BUD_2] +Zoff in der Bar + +[BUD_3] +Cop-Land + +[CAP_1] +Der Eintreiber + +[FIN_1] +Freunde und andere Feinde + +[BANK_1] +Kein Entkommen? + +[BANK_2] +Der Scharfschütze + +[BANK_3] +Der Fahrer + +[BANK_4] +Der Coup + +[CNT_1] +Der Singvogel + +[CNT_2] +Der Kurier + +[PORN_1] +Alle meine Pferdchen + +[PORN_2] +Der Dildo-Jet + +[PORN_3] +Ein Mann namens Martha + +[PORN_4] +Heiße Lightshow + +[TAX_1] +Kaufman-Taxis + +[TAXI_1] +V.I.P + +[TAXI_2] +Konkurrentenjagd + +[TAXI_3] +Das Taxi-Inferno + +[ICE_1] +Eiscreme und andere Leckereien + +[TEX_1] +Schlagende Argumente + +[TEX_2] +Das Begrãbnis + +[TEX_3] +Schutt und Asche + +[PHIL_1] +Der Waffenschieber + +[PHIL_2] +TNT-Whiskey + +[BIKE_1] +Wheels of Steel + +[BIKE_2] +Chaos-City + +[BIKE_3] +Big Bakers Bike + +[ROCK_1] +Love Juice + +[ROCK_2] +Der Psychokiller + +[ROCK_3] +Die PR-Tour + +[ROCK_4] +Love Fist! + +[HAT_1] +Mysteriöses Pulver + +[HAT_2] +Fliegende Bomben + +[HAT_3] +Schmutzige Methoden + +[CUB_1] +Stunt-Boot-Action + +[CUB_2] +Kanonenfutter + +[CUB_3] +Die Seeschlacht + +[CUB_4] +Trojanisches Voodoo + +[JOB_1] +Der Pizza-Lieferant + +[JOB_2] +Ein bedauerlicher Unfall + +[JOB_3] +Die rasende Schrottfabrik + +[JOB_4] +Trouble am Check-In + +[JOB_5] +Gefeuert! + +[ANSWER] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um den Anruf auf deinem Handy entgegenzunehmen. + +[MOB_01A] +Hey, mein Alter! Paul hier. Ich hãtte da vielleicht was für dich, aber das müssen wir unter vier Augen besprechen. + +[MOB_01B] +Ich bin im Malibu und lass es mir gutgehen. + +[MOB_01C] +Ich denke, ich hab einen gut bei dir, wenn du das hörst, Kumpel. Bis gleich. + +[MOB_02A] +Hey! Hallo, Tommy? Tommy! + +[MOB_02B] +In der Druckerei ist irgendwas im Busch. Fahr mal rüber und kümmere dich darum. + +[MOB_02C] +Es scheint ziemlichen Ãrger zu geben. Ich muss Schluss machen. + +[MOB_03A] +Mr. Vercetti? Ich habe hier einen unterschriebenen Wisch, + +[MOB_03B] +der besagt, dass Sie alle Schulden von 'BJ's Autos' übernehmen. + +[MOB_03C] +Nach BJ's plötzlichem Verschwinden hab ich keine andere Wahl, + +[MOB_03D] +als Sie für seine Verbindlichkeiten zur Rechenschaft zu ziehen. + +[MOB_03E] +Bis Sie die volle Summe beglichen haben, + +[MOB_03F] +sollte Ihnen klar sein, dass Vice City ein heißes Pflaster für Sie ist. + +[MOB_04A] +Wie geht's, mein Alter? + +[MOB_04B] +Ich hab vergessen, dir zu sagen, dass wir für das Konzert noch ein paar Ordner brauchen. + +[MOB_04C] +Da gibt's so 'ne Biker-Gang, die wãr super für die Publicity. + +[MOB_04D] +Wenn du mir das arrangierst, besorg ich dir 'n VIP-Pass für den Abend. Ok? + +[MOB_05A] +Gut gemacht, Tommy. Schön, den Ofen wiederzuhaben. + +[MOB_05B] +Sag Mr. Kent Paul, dass er seine Ordner für das Konzert kriegt. + +[MOB_05C] +Du hast mein Wort darauf. + +[MOB_05D] +Halt die Ohren steif. + +[MOB_06A] +Tommy, man hört so allerlei über dich, mein Junge. + +[MOB_06B] +Wenn du willst, kocht Tante Poulet dir ein leckeres Süppchen, dann kannst du mal abschalten, hm? + +[MOB_06C] +Komm doch die Tage mal bei mir vorbei, ok, Tommy? + +[MOB_08A] +Tommy, ich dachte mir, du könntest meinen Rat als Geschãftsmann brauchen. + +[MOB_08B] +Wenn du ein Unternehmen am Laufen hast, musst du einmal pro Woche die Einnahmen kassieren gehen. + +[MOB_08C] +Sonst werden deine Leute übermütig und versuchen, in die eigene Tasche zu wirtschaften. Ok? + +[MOB_08D] +Hey, ich weiß selbst, wie man so was macht, Ken, ok? + +[MOB_08E] +Ok, ok. Ich weiß ja, dass du Bescheid weißt. + +[MOB_08F] +Ich meinte ja nur, damit du weißt, dass ich im Zweifelsfall auch Bescheid weiß. + +[MOB_08G] +Nur für alle Fãlle, mein Alter! + +[MOB_08H] +Wenn du meinst, Ken... + +[MOB_09A] +Hey, Leo! Ich hab Arbeit für dich! + +[MOB_09B] +Hier ist nicht Leo. + +[MOB_09C] +Hey, wenn Leo erfãhrt, dass du mit seinem Handy telefonierst, bist du fãllig. + +[MOB_09E] +Du hast Leo erledigt? Du musst Mumm haben - willst du für mich arbeiten? + +[MOB_09F] +Komm ins Café von meinem Vater in Little Havana, dann können wir reden. + +[MOB_10A] +Tommy! Du musst mir einen Gefallen tun. + +[MOB_10B] +Steve! Was machen die Dreharbeiten? + +[MOB_10C] +Gut. Ich- ãh, WIR brauchen noch eine Autoverfolgungsjagd, aber unser Budget ist knapp. + +[MOB_10D] +Ich hab in der Stadt verteilt ein paar Karren stehen. Du weißt, was zu tun ist. + +[MOB_10E] +Ok, Steve, ich halt die Augen offen. Bis dann. + +[MOB_11A] +Hallo, Söhnchen. Ich wollte dir kurz 'nen kleinen Tipp geben. + +[MOB_11B] +Hi, Avery. Worum geht's denn? + +[MOB_11C] +Man kann in dieser Stadt viel Geld machen, wenn man die richtigen Immobilien hat. Klingelt's? + +[MOB_11D] +Ich denke schon. + +[MOB_11E] +Also, halt die Augen offen, dann könnte sich dir die ideale Gelegenheit bieten. Bis bald. + +[MOB_11F] +Ciao, Avery. + +[MOB12_A] +Hey, Tommy. Avery hier. Hör mal, ich hab gerade alle Hãnde voll zu tun, + +[MOB12_B] +und ein Bevollmãchtigter von mir müsste zu den Gator Keys eskortiert werden. + +[MOB12_C] +Ich will da ein Stück Land kaufen und schick ihn hin, um den Deal abzuschließen. + +[MOB12_D] +Könntest du dafür sorgen, dass er gut dort ankommt? + +[MOB12_E] +Mach ich doch glatt, Avery. Wo soll ich ihn abholen? + +[MOB12_F] +Er hat gerade noch an der Baustelle zu tun. Hol ihn doch am besten dort ab. + +[MOB12_G] +Kein Problem. Bis dann, Avery. + +[MOB13_A] +Vercetti? VERCETTI!! Verdammt, Mann, Sie müssen mir helfen! + +[MOB13_B] +Mr. Moffat? Wie geht's der Familie? + +[MOB13_C] +Zur Hölle mit Ihnen, hören Sie! + +[MOB13_D] +Tja, war nett, mit Ihnen zu plaudern... + +[MOB13_E] +WARTEN SIE! Vercetti - Tommy, kann ich Tommy zu Ihnen sagen? + +[MOB13_F] +Wir sind beide Geschãftsleute. Sie erkennen doch ein gutes Geschãft sofort, oder? + +[MOB13_G] +Ich hab keine Zeit für Palaver. Kommen Sie zum Punkt. + +[MOB13_H] +GELD. Geld ist der Punkt, verdammt! + +[MOB13_I] +Ich bin den Kerlen nochmal entwischt, aber sie sitzen mir im Nacken. Die machen sich einen Spaß daraus! + +[MOB13_J] +Ich bin in einer Telefonzelle, irgendwo in diesem verdammten Loch. + +[MOB13_K] +Holen Sie mich hier raus, bevor sie mich schnappen und-... oh Gott... + +[MOB13_L] +Ich bin leider ausgebucht bis-... + +[MOB13_M] +Nein! Verarschen Sie mich nicht, haben Sie Erbarmen! Kein Mensch hat das verdient! + +[MOB13_N] +Ich flehe Sie an, Tommy, auf den Knien flehe ich Sie an! Bitte... + +[MOB13_O] +Naja, ich könnte 'nen kurzen Abstecher machen. Vielleicht finde ich Sie... + +[MOB13_P] +Oh Gott, sie kommen! Um Himmels Willen, beeilen Sie sich! + +[MOB_14A] +Hey, Tommy, hör zu, das wird dir gefallen. + +[MOB_14B] +Ein Vögelchen hat mir gesteckt, dass das Vice City-Spezialkommando in einem renommierten Finanzinstitut ein Schließfach hat. + +[MOB_14C] +Da sind die Schmiergelder drin, die sie über die Jahre kassiert haben. + +[MOB_14D] +So 'ne Art Altersversorgung für die ganze Mannschaft. + +[MOB_14E] +Sollte dir diese Info je helfen, dir was von dem Kuchen anzueignen, + +[MOB_14F] +würdest du dich sicher verpflichtet fühlen, mir 'n Stück davon abzugeben? + +[MOB_14G] +Ich werd dich nicht vergessen. Danke, Kent. + +[MOB_14H] +'Paul'heiße ich, Scherzkeks. Ich KOMME aus Kent, Nãhe London. + +[MOB_14I] +Mein geographisches Wissen über England ist eben nicht mehr, was es war. + +[MOB15_A] +Tommy, Alter. Hier ist Paul aus Kent. + +[MOB15_B] +Unten im Malibu, da sind ein paar Keulen, die haben ein Auge auf dich geworfen. + +[MOB15_C] +Ich verstehe nur Bahnhof. + +[MOB15_D] +Hasen. Miezen. Na, Puppen, eben. Coole Babes, keine Professionellen, oder so. + +[MOB15_E] +Du solltest mal kommen und sie dir ansehen. + +[MOB16_A] +Tommy, hier Paul. Wie geht's, mein Freund? + +[MOB16_B] +Was willst du, Paul? Ich brauch keine getürkten Designer-Klamotten. + +[MOB16_C] +Sehr witzig. Du weißt, dass ich mit getürkter Ware nichts am Hut habe. + +[MOB16_D] +Wollte nur hören, ob ich nicht 'ne Rolle in einem von deinen Filmen kriegen könnte. + +[MOB16_E] +In England habe ich viel einschlãgiges Zeug gedreht. + +[MOB16_F] +Ich hab mehr zu bieten als du, mein Alter. + +[MOB16_G] +Paul, danke für das Angebot. Ich komm auf dich zurück. + +[MOB16_H] +Lass mich nicht hãngen. Denk dran, was ich alles für dich getan habe. + +[MOB16_I] +Das versuch ich ja grade zu vergessen. + +[MOB17_A] +Tommy Vercetti. Wie geht's, großer Meister? + +[MOB17_B] +Man hört so einiges über dich. Bist jetzt 'ne große Nummer in der Stadt, hã? + +[MOB17_C] +Paul, du bist betrunken. + +[MOB17_D] +Nein, du Trottel, ich bin nicht betrunken. + +[MOB17_E] +Hab mir nur ein paar Ladungen Stoff gegeben, war seit ein paar Tagen nicht im Bett. + +[MOB17_F] +Und du brauchst mich nicht dumm anzureden. + +[MOB17_G] +Ich bin nicht irgendwer. Wer hat dir denn in dieser Stadt den Weg geebnet? Ich! + +[MOB17_H] +Tatsãchlich? + +[MOB17_I] +Tatsãchlich! + +[MOB17_J] +Paul, reg dich ab. Ich hatte viel zu tun. Sei kein Idiot. + +[MOB17_K] +Ich bin kein Idiot. Das haben sie schon im Jugendknast gesagt. + +[MOB17_L] +Wenn du Ãrger haben willst, Freundchen, den kannst du haben! + +[MOB17_M] +Tommy, bitte! Du warst meine große Hoffnung. Bitte, mach dich nicht lustig über mich! + +[MOB17_N] +Paul, schlaf mal 'ne Runde. Im Ernst. + +[MOB18_A] +Tommy, hier Paul. Wie geht's, Alter? Hey, ich dachte mir, das musst du hören... + +[MOB18_B] +Echt der Hammer. Du glaubst nicht, was mir für 'ne Puppe über den Weg gelaufen ist. + +[MOB18_C] +'ne Bordsteinschwalbe, oder sowas. Unten in Little Havana. + +[MOB18_D] +Sagt, sie heißt Mercedes oder so ãhnlich. Wahnsinn, Alter. Die Puppe musst du dir geben. + +[MOB18_E] +Da würde 'nen Toter Hormonkoller kriegen. Sie sagt, ich wãr der beste, den sie je hatte. + +[MOB18_F] +Halt die Augen nach ihr offen. Bis dann. + +[MOB19_A] +Tommy, hier KP - Kent Paul. Ich hab lãuten hören, dass jemand dich leimen will. + +[MOB19_B] +Also, sei wachsam, mein Freund. Und kein Sterbenswörtchen, dass du das von mir weißt. + +[MOB_20A] +Hallo, Tommy. Hier Paul. Ich höre, dass du ein paar Leuten auf den Schlips getreten bist. + +[MOB_20B] +Irgendjemand sieht es anscheinend nicht gern, dass du auf einmal den großen Zampano spielst. + +[MOB_20C] +Also, sag nicht, ich hãtte dich nicht gewarnt. Es rãcht sich, wenn man's übertreibt. + +[MOB_20D] +Jedenfalls ist angeblich ein Kopfgeld auf dich ausgesetzt und es ist schon jemand hinter dir her. + +[MOB_20E] +Also pass auf dich auf. Und vergiss mich nicht ganz. + +[MOB71_A] +Tommy, Thomas, hier Cortez. Wie geht's? + +[MOB71_B] +Es bleibt spannend. Und selbst? + +[MOB71_C] +Ein ewiger Kampf, Tommy. Entschuldigen Sie die schlechte Verbindung, wir hatten wieder einen Putschversuch. + +[MOB71_D] +Es gibt keine anspruchsvollere Geliebte als das Volk. + +[MOB71_E] +Seit ich aus Vice City zurück bin, gab's drei Revolutionen und vier Staatsstreiche. + +[MOB71_F] +Zum Glück bin ich jedesmal befördert worden. + +[MOB71_G] +Ich wollte Sie wegen Mercedes etwas fragen. + +[MOB71_H] +OK. Was ist mit ihr? + +[MOB71_I] +Ich hör Geschichten über sie und weiß nicht, was ich davon halten soll. + +[MOB71_J] +Vielleicht wollen mich alle demütigen. + +[MOB71_K] +Vielleicht wird sie übermütig, seit ich weg musste, sagen Sie mir nur eins, Tommy. Ist das wahr?. + +[MOB71_L] +sagen Sie mir nur eins, Tommy. Ist das wahr? + +[MOB71_M] +Ist was wahr? + +[MOB71_N] +Die Geschichten, die ich höre? Will sie wirklich Anwãltin werden? + +[MOB71_O] +Welche Schande, Tommy. Wir Cortez sind eine stolze Familie und würden nie einer Tochter erlauben, Anwãltin zu werden. + +[MOB71_P] +Sagen Sie mir, dass es nicht wahr ist. Das ertrage ich nicht. + +[MOB71_Q] +Colonel, ich versichere Ihnen, dass Mercedes niemals Anwãltin wird. Keine Angst. + +[MOB71_R] +Danke, Tommy - das wãre zu viel der Schande. Sie ist eine Dame, keine Schmarotzerin. + +[MOB71_S] +Ich weiß, Colonel + +[MOB71_T] +Tommy, Sie müssen jetzt entschuldigen, gerade kommt der neue Innenminister. + +[MOB71_U] +Ich hab seinen Vater vor Jahren bei einem Putschversuch erledigt. Ich muss mich gut mit ihm stellen. Wiederhören. + +[MOB22_A] +Tommy, Sie erweisen sich als sehr nützlich, mein Freund. + +[MOB22_B] +Danke, Cortez. Was ist mit meinem Deal? + +[MOB22_C] +Tommy, ich mühe mich ohne Unterlass, um diesem Sumpf von elenden Lügen und Intrigen auf den Grund zu gehen. + +[MOB22_D] +Sie haben mein Wort darauf. Einstweilen möchte ich + +[MOB22_E] +Ihnen den Dank meines Volkes aussprechen, für das Sie so viel getan haben. + +[MOB_25A] +Tommy, hier Cortez. Die Franzosen machen mir Ãrger. Und wie. + +[MOB_25B] +Verdammte Heuchler! Jahrhundertelang beuten sie arme Lãnder aus und mich schimpfen sie einen Dieb! + +[MOB_25C] +Ich brauche dingend Ihre Hilfe. + +[MOB_25D] +Beeilen Sie sich. Ich brauche Sie. Ich hasse die Franzosen. + +[MOB_26A] +Hallo, Tommy? + +[MOB_26B] +Ja? + +[MOB_26C] +Baker hier. Wollte dir nur sagen, der Gig hat Spaß gemacht. + +[MOB_26D] +Danke, auch im Namen der Gang. Eins sollst du wissen: + +[MOB_26E] +Du hast unsern Respekt. Halt die Nase im Wind, Junge. + +[MOB_29A] +Hallo? Spreche ich mit Mr. Tommy Vercetti? + +[MOB_29B] +Ja. + +[MOB_29C] +Ich hab mir sagen lassen, du wãrst der richtige Mann, wenn man Kroppzeug am Hals hat. + +[MOB_29D] +Vielleicht... + +[MOB_29E] +Tja, ich hab 'ne regelrechte Plage am Hals. Haitianer, überall. + +[MOB_29F] +Mein Name ist Umberto Robina und es wãr mir recht, wenn du baldmöglichst ins Café Robina kãmst. + +[MOB_29G] +Diesmal haben's die Haitianer nãmlich zu weit getrieben. + +[MOB_29H] +Test + +[MOB_30A] +Tommy, hier Umberto Robina. + +[MOB_30B] +Wie lãuft das Café? + +[MOB_30C] +Oh, bestens. Sagenhaft, Tommy, sagenhaft. Keine Memmen, Tommy, nur echte Mãnner. Und wunderschöne Frauen! + +[MOB_30D] +Ich wollte nur sagen, für mich und Paps bist du jetzt einer von uns. Ein Kubaner. + +[MOB_30E] +Du bist ein ganzer Kerl. Du hast Mumm in den Knochen. + +[MOB_30F] +Danke, Umberto. Seit ich aus dem Knast raus bin, hat das keiner zu mir gesagt. Bis dann. + +[MOB_33A] +Tommy, Phil hier. Spar dir die sentimentalen Worte, hör mir einfach zu, ok? + +[MOB_33B] +Also, ich brau hier 'nen extra starken TNT-Whiskey und ich wollte fragen, ob du mal 'nen Schluck probieren willst. + +[MOB_33C] +Im Ernst, Tommy, wenn du 'nen Drink willst, oder 'ne Wand abbeizen musst - das Zeug macht einen Mann aus dir. + +[MOB_33D] +Bei mir hat's jedenfalls gewirkt, auch wenn ich jetzt auf einem Auge nichts mehr sehe. Ich warte auf dich. + +[MOB_34A] +Tommy, war ein Vergnügen, mit dir zu arbeiten. So einen Spaß hatte ich seit Vietnam nicht mehr. + +[MOB_34B] +Also, falls du je irgendwas brauchst, ruf mich an, ok? + +[MOB_34C] +Ich vergesse keinen, mit dem ich in der Schlacht war. + +[MOB_34D] +Und ich kann dir bestimmt irgendwann helfen, ok? + +[MOB_35A] +Tommy, die Wunde verheilt gut. Ist nur komisch: + +[MOB_35B] +da hab ich auf 6 Schlachtfeldern gekãmpft und nie 'n Kratzer abgekriegt und dann das! + +[MOB_35C] +Jetzt bin ich der einarmige Phil. Hab aber 'n gutes Arsenal an Handfeuerwaffen, also bin ich auch mit Arm ab nicht arm dran. + +[MOB_35D] +Also hör auf mit der sentimentalen Scheiße und hol dir 'nen Drink, ok! + +[MOB_36A] +Tommy, hier Phil. Wollte mich bedanken, dass du mich da rausgehauen hast. + +[MOB_36B] +Verdammte Vietnamesen. Wo du hinschaust ein Hinterhalt. + +[MOB_36C] +Die Wunde heilt gut. Und jetzt kassiere ich meine Versehrtenrente endlich völlig zurecht. Danke, Kumpel. + +[MOB_40A] +Hey, Tommy, hier Sonny. Was macht die Sonnenbrãune? + +[MOB_40B] +Ich hab keine Sonnenbrãune. + +[MOB_40C] +Naja, mein Geld hast du jedenfalls auch nicht. Daher frag ich mich, + +[MOB_40D] +was treibst du eigentlich die ganze Zeit, Tommy? Sag doch mal? + +[MOB_40E] +Ich bin auf der Suche nach deinem Geld, Sonny. Keine Sorge. + +[MOB_40F] +Ich mach mir aber Sorgen, Tommy, ich kann nicht anders. + +[MOB_40G] +Ich hab nãmlich anscheinend mit zu viel unzuverlãssigen Menschen zu tun. + +[MOB_40H] +Sei du bitte kein unzuverlãssiger Mensch, Tommy. + +[MOB_40I] +Tu dir und mir einen Gefallen. Ich freu mich, von dir zu hören. + +[MOB_41A] +Tommy, kennst du mich noch? + +[MOB_41B] +Hey, Sonny. + +[MOB_41C] +Ja genau, Sonny. Wir sind doch alte Freunde, + +[MOB_41D] +aber du schreibst nie, rufst nie an. Willst du denn nicht mehr mein Freund sein? + +[MOB_41E] +Ich hab alle Hãnde voll zu tun, die Sache zu regeln. Und du bist auch keine große Hilfe. + +[MOB_41F] +Ach, ich bin also schuld? Ja, ich hab gehört, dass du zu tun hast... + +[MOB_41G] +Musst Drogenbarone erledigen, ihre Geschãfte übernehmen. + +[MOB_41H] +Vergiss mich nicht, Tommy. Ich verspreche dir nãmlich, dass ich dich nicht vergesse... + +[MOB_42A] +Tommy. + +[MOB_42B] +Sonny. + +[MOB_42C] +Anscheinend hörst du neuerdings schlecht, deshalb frag ich dich jetzt nochmal: + +[MOB_42D] +Tommy, wo ist die verdammte Kohle? Wo ist der verdammte Stoff und wo ist mein Anteil an deinem neuen Geschãft? + +[MOB_42E] +Du hãltst mich zum Narren, Tommy, ich find's bloß nicht zum Lachen. + +[MOB_43A] +Tommy, Tommy, Tommy, Sonny hat gerade angerufen, dãmmert dir was? + +[MOB_43B] +Ich weiß nicht, wie das mit dir ist, aber wenn mir jemand droht, dass er meine Familie umbringt, + +[MOB_43C] +dann macht mir das eine Scheißangst. Was gedenkst du zu unternehmen? + +[MOB_43D] +Nur die Ruhe, Ken, alles wird cool. + +[MOB_43E] +Ich BIN ruhig. So ruhig wie man sein kann, wenn man um sein Leben fürchtet! + +[MOB_43F] +Ken, ich muss mich gerade auf was anderes konzentrieren. + +[MOB_43G] +Wir kümmern uns zu gegebener Zeit um Forelli. + +[MOB_43H] +Ich bin ruhig. Hör ich mich nicht ruhig an? Muss die Todesangst sein, die auf die Stimme schlãgt. + +[MOB45_A] +Tommy, wir müssen miteinander reden. + +[MOB45_B] +Wo liegt das Problem, Lance? + +[MOB45_C] +Bei dir, mein Freund: Ich finde, du gibst mir keinen fairen Anteil. + +[MOB45_D] +Noch dazu hast du mich vor den Jungs blamiert. Das kann ich nicht auf mir sitzen lassen. + +[MOB45_E] +Lance, das siehst du falsch. Du hast Fehler gemacht. + +[MOB45_F] +Tommy, ich bin nicht dein Laufbursche. Nicht dein Lakai. + +[MOB45_G] +Lance, alles ist ok, solange du keinen Mist baust. Und sollte ICH Mist bauen, steh ich dafür gerade. + +[MOB45_H] +Tommy, ich hab alles für dich getan und du trittst mich mit Füßen. Mach das doch nicht. + +[MOB45_I] +Lance, ich betrüg dich nicht und falle dir nicht in den Rücken, ok? + +[MOB45_J] +Reiß dich zusammen. Es ist schwer genug, ohne dass du mir die Ohren vollheulst. + +[MOB45_K] +Vertrau mir, hörst du. Hörst du? + +[MOB45_L] +Ja, Tommy, aber ich halt das nicht mehr lange aus. + +[MOB45_M] +Lance, komm mir bloß nicht so, ich warne dich. + +[MOB45_N] +Reg dich ab, mach ein paar Tage frei, dann unterhalten wir uns, ok? + +[MOB46_A] +Tommy - Lance. + +[MOB46_B] +Ja? + +[MOB46_C] +Kein 'Schön, dass du anrufst, Lance!' Kein freundliches Wort? Was soll das? + +[MOB46_D] +Ich habe gerade zu tun, Lance. Was willst du? + +[MOB46_E] +Nichts. Ich wollte dir nur sagen, wir kriegen das hin. + +[MOB46_F] +Du und ich, ohne Probleme. Du verstehst mich? + +[MOB46_G] +Wir müssen es hinkriegen. Sonst sind wir erledigt, Lance. + +[MOB46_H] +Wir stecken schon viel zu tief drin. Aber danke für den Anruf. Du hörst von mir. + +[MOB_47A] +Tommy - Lance. Wir stecken in der Patsche. Du musst sofort kommen. + +[MOB52_A] +Hey, Leo, ich glaube, wir haben einen Kãufer für Diaz' Ware. + +[MOB52_B] +Du musst ihn anrufen und den Deal in die Wege leiten, ok? + +[MOB52_C] +Wo bist du gerade? + +[MOB52_D] +Ist irgendwas, Leo? Du hörst dich so komisch an. + +[MOB52_E] +Sag mir, wo du bist. + +[MOB52_F] +Verdammt, wer ist da dran? Gib mir Leo! + +[MOB52_G] +Leo ist 'ne Weile verreist, ich vertrete ihn. + +[MOB52_H] +Zum Teufel mit dir! + +[MOB54_A] +Hi, Tommy! + +[MOB54_B] +Hi, Mercedes. Wie geht's? + +[MOB54_C] +Ich hab 'ne neue Wohnung in Vice Point. + +[MOB54_D] +Vielleicht kommst du mich ja mal besuchen. + +[MOB54_E] +Klar, gern. Also, bis spãter. + +[MOB55_A] +Tommy, ich bin's. + +[MOB55_B] +Hi, Mercedes. + +[MOB55_C] +Tommy, mir ist so langweilig. Wann hast du denn mal Zeit für mich? + +[MOB55_D] +Was soll denn das heißen? + +[MOB55_E] +Ich weiß, du hast so viel zu tun, musst Leute beseitigen und bestechen. + +[MOB55_F] +Aber ich will mal wieder Spaß haben. Also vergiss mich nicht, hörst du? + +[MOB56_A] +Tommy, es heißt, du hast Ricardo Diaz erledigt. + +[MOB56_B] +In seinem Haus ist ein Feuer ausgebrochen. + +[MOB56_C] +Ich glaube, er hatte ein Acrylhemd an und ist verbrannt. + +[MOB56_D] +Tommy, ich bin so stolz auf dich. Ich wusste, du bist ein echter Mann. + +[MOB56_E] +Und er war ein Mistkerl. Ich bin so stolz, dass du mein Freund bist. + +[MOB56_F] +Ich weiß, du hast zu tun, du musst schließlich die Stadt erobern. + +[MOB56_G] +Aber vergiss mich nicht, hörst du? + +[MOB57_A] +Ich bin's, Mercedes. Ich liebe dich nicht mehr, Tommy. + +[MOB57_B] +Wirklich nicht mehr. Du bist nicht mehr nett zu Mercedes. + +[MOB57_C] +Du behandelst mich nicht mehr wie eine Dame. Du ignorierst mich und ich hasse dich. + +[MOB57_D] +Ich bestehe darauf, dass du sofort zu mir kommst! + +[MOB58_A] +Tommy. + +[MOB58_B] +Hey, Mercedes. + +[MOB58_C] +Selber hey, du toller Hecht. Ich bin sauer auf dich, Tommy. + +[MOB58_D] +Schick mich nie mehr zu diesem Jezz Torrent. + +[MOB58_E] +So ein Jammerlappen. Mittendrin fãngt er an zu weinen wegen seinem Hündchen, + +[MOB58_F] +das gestorben ist, als er 7 war, und dass seine Mama ihn nie lieb hatte. + +[MOB58_G] +Und Tommy - privat lãuft er in Perücke und BH rum. + +[MOB58_H] +Ich bin nicht gut auf dich zu sprechen! + +[MOB59_A] +Oh, Tommy. Ich bin's, Mercedes. + +[MOB59_B] +Ich wollte dir nur sagen, es ist ganz toll beim Film. + +[MOB59_C] +Wenn du nochmal etwas für mich hast, sag Bescheid. + +[MOB59_D] +Wirklich. Ich wollte immer Schauspielerin werden. + +[MOB59_E] +Ich denke, ich lerne viel über die Dramaturgie. + +[MOB59_F] +Es ist so lehrreich! Vielen, vielen Dank. Bis bald. Adios. + +[MOB_99] +Geh zu der Telefonzelle vor Ort. + +[MOB_98] +Geh zu der Telefonzelle vor Ort. + +[MOB_97] +Geh zu der Telefonzelle vor Ort. + +[MOB_96] +Geh zu der Telefonzelle vor Ort. + +[MOB_95] +Geh zu der Telefonzelle vor Ort. + +[A_TIME] ++~1~ Sekunden + +[F_RANGE] +~g~Du bist außer Reichweite des Feuerwehrfunks. Fahr nãher an eine Feuerwache heran! + +[DODO_FT] +Du bist ~1~ Sekunden geflogen! + +[GA_8] +Benutze den Zünder, um die Bombe hochgehen zu lassen. + +[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. [CHASE] Größtes Medieninteresse bisher [CHASE1] -Keins +Null [CHASE2] Minimal @@ -2239,14 +1640,20 @@ Lokalblatt Seite 7 [CHASE5] Lokalblatt Titelseite +[CHASE6] +Vice Courier einspaltig + +[CHASE7] +Vice Courier Titelseite + [CHASE8] -Lokal-TV 3-Uhr-News +Lokalsender 3-Uhr-Nachrichten [CHASE9] -Lokal-TV 20-Uhr-News +Lokalsender 20-Uhr-Nachrichten [CHASE10] -Lokal-TV Live-Berichterstattung +Lokalsender Live-Berichterstattung [CHASE11] UFA Today Seite 12 @@ -2281,518 +1688,806 @@ Weltereignis [CHASE21] Stoff aus dem Legenden sind -[WHEEL01] -~w~ZWEIRAD BONUS: $~1~ Distanz: ~1~,~1~m Zeit: ~1~ Sekunden +[CR_1] +Kran kann dieses Fahrzeug nicht anheben. -[WHEEL02] -~w~ZWEIRAD BONUS: $~1~ Distanz: ~1~ Fuß Zeit: ~1~ Sekunden +[PU_MONY] +Du hast nicht genug Geld. -[WHEEL06] -~w~WHEELIE BONUS: $~1~ Distanz: ~1~,~1~m Zeit: ~1~ Sekunden +[CO_ALL] +Du hast sie alle geliefert. Hier, für dich. -[WHEEL07] -~w~WHEELIE BONUS: $~1~ Distanz: ~1~ Fuß Zeit: ~1~ Sekunden +[FEM_ON] +AN -[WHEEL11] -~w~STOPPIE BONUS: $~1~ Distanz: ~1~,~1~m Zeit: ~1~ Sekunden +[FEM_OFF] +AUS -[WHEEL12] -~w~STOPPIE BONUS: $~1~ Distanz: ~1~ Fuß Zeit: ~1~ Sekunden +[FEM_YES] +Ja -[GMSTOR] -Game Store +[FEM_NO] +Nein -[PREBRF] -Vorherige Missionsinfos +[FEM_RET] +Wiederholen -[CNTLS] -Steuerung +[FEC_NA] +Nicht verfügbar -[MUSMEN] -Musik/SFX +[FEC_CWL] +Eine Waffe nach links -[GAMSET] -Spieleinstellungen +[FEC_CWR] +Eine Waffe nach rechts -[LANGUA] -Sprache +[FEC_LOF] +Nach vorne sehen -[DSPLAY] -Anzeige +[FEC_TAR] +Zielen -[DEBUGM] -Debug Menu +[FEC_MOV] +Bewegung -[QUITOP] -Optionen verlassen +[FEC_CAM] +Blickwinkel -[CONTRL] -Konfiguration d. Steuerung +[FEC_PAU] +Pause + +[FEC_ENV] +In Fahrzeug einsteigen + +[FEC_JUM] +Springen + +[FEC_ATT] +Angreifen oder Waffe abfeuern + +[FEC_RUN] +Rennen + +[FEC_FPC] +Subjektive Kamera + +[FEC_LL] +Nach links sehen + +[FEC_LB] +Nach hinten sehen + +[FEC_LR] +Nach rechts sehen + +[FEC_HOR] +Hupe + +[FEC_VES] +Fahrzeugsteuerung + +[FEC_BRA] +Bremsen oder rückwãrts fahren + +[FEC_HAB] +Handbremse + +[FEC_CAW] +Fahrzeugwaffe + +[FEC_ACC] +Beschleunigen + +[FEC_CCF] +Konfiguration : + +[FEC_CF1] +Konfig. 1 + +[FEC_CF2] +Konfig. 2 + +[FEC_CF3] +Konfig. 3 + +[FEC_CF4] +Konfig. 4 + +[FEC_CDP] +Controller-Anzeige : + +[FEC_ONF] +Zu Fuß + +[FEC_INC] +Im Auto + +[FEC_VIB] +Vibration : + +[FEL_ENG] +Englisch + +[FEL_FRE] +Französisch + +[FEL_GER] +Deutsch + +[FEL_ITA] +Italienisch + +[FEL_SPA] +Spanisch + +[FED_DBG] +Menu Debug + +[FED_RID] +Reload IDE + +[FED_RIP] +Reload IPL + +[FED_PAH] +Parse Heap + +[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 + +[PL_STAT] +Spielerstatistiken + +[PE_WAST] +Von dir abservierte Personen + +[PE_WSOT] +Von anderen abservierte Personen + +[TM_BUST] +Zahl deiner Verhaftungen + +[GNG_WST] +Gang-Mitglieder + +[DED_CRI] +Kriminelle + +[PER_COM] +Absolviert (in Prozent) + +[KGS_EXP] +Sprengstoffverbrauch in kg + +[ACCURA] +Treffsicherheit + +[ST_WEAP] +Waffen-Budget + +[ST_PROP] +Budget für Objekte + +[ST_AUTO] +Budget für Autoreparaturen und Lackierung + +[ST_PHOT] +Von dir gemachte Fotos + +[ST_LOAN] +Besuche von Kredithaien + +[ST_STOR] +Geknackte Lãden + +[ST_MOVI] +Film-Stunts + +[ST_PIZZ] +Gelieferte Pizzas + +[ST_GARB] +Getãtigte Müllfuhren + +[ST_ICEC] +Verkaufte Eiscreme + +[TOP_SHO] +Beste Schießstand-Punktzahl + +[SHO_RAN] +Schießstand-Rangliste + +[SEAGULL] +Abgeschossene Möwen + +[PROPOWN] +Objekte in deinem Besitz + +[ST_TIME] +Gespielte Zeit + +[ST_FTIM] +Flugstunden + +[ST_PRAN] +Piloten-Rating + +[ST_RAN0] +Anfãnger + +[ST_RAN1] +Navigator + +[ST_RAN2] +Co-Pilot + +[ST_RAN3] +Halb-Profi + +[ST_RAN4] +Könner + +[ST_RAN5] +Profi + +[ST_RAN6] +Ass + +[ST_RAN7] +Roter Baron + +[ST_DRWN] +Gefütterte Fische + +[ST_FASH] +Kleidungsbudget + +[ST_DAMA] +Zerstörte Objekte + +[TM_DED] +Krankenhausbesuche + +[DAYSPS] +Im Spiel verstrichene Tage + +[NUMSHV] +Besuche in Versteck + +[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 Salti + +[MXJUMP] +Max. Drehungen im Sprung + +[BUL_FIR] +Verschossene Kugeln + +[BUL_HIT] +Kugeln, die trafen + +[SPRAYIN] +Anzahl Lackierungen + +[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 Irrsinns-Stunts geschafft + +[NOUNIF] +Monster-Stunts geschafft + +[NMISON] +Begonnene Missionen + +[PASDRO] +Ans Ziel beförderte Fahrgãste + +[MONTAX] +Mit Taxi verdientes Geld + +[DAYPLC] +Tagesetat für Polizei + +[CRIMRA] +Rang: + +[STPR_1] +Malibu Club + +[STPR_2] +Druckerei + +[STPR_3] +Filmstudio + +[STPR_4] +Eiscremefabrik + +[STPR_5] +Autohaus + +[STPR_6] +Taxiunternehmen + +[STPR_7] +Bootswerft [SET1EN] Konfig. 1 aktiviert -[SET1] -Konfig. 1 - -[SET2EN] -Konfig. 2 aktiviert - -[SET2] -Konfig. 2 - -[SET3EN] -Konfig. 3 aktiviert - -[SET3] -Konfig. 3 - -[SET4EN] -Konfig. 4 aktiviert - -[SET4] -Konfig. 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 - -[GMLOAD] -Spiel laden - [GMSAVE] Spiel speichern -[NOGMSV] -Du kannst nur in deinem Versteck speichern. - -[DLFILE] -Grand Theft Auto Dateien löschen - -[CHFILE] -ZU LADENDE DATEI AUSWÄHLEN - -[CHFIDL] -ZU LÖSCHENDE DATEI AUSWÄHLEN - -[SVCONF] -SPEICHERBESTÄTIGUNG - -[SVFNAM] -Dateiname des gespeicherten Spiels: - -[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 - -[FORMEN] -Formatierungsmenü - -[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] -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. - -[GS_STYL] -SPIEL-STIL: - -[GS_FFAL] -JEDER FÜR SICH - -[GS_LOC] -SPIEL-ORT: - -[GS_SLMT] -SCORE-LIMIT: - -[GS_KLMT] -HIT-LIMIT: - -[GS_TLMT] -ZEIT-LIMIT: - -[GS_ULMT] -KEIN LIMIT - -[GS_PRUP] -POWERUPS: - -[GS_RACE] -RENNEN: - -[GS_LAPS] -RUNDEN: - -[GS_OK] -OK - -[FEH_MP] -MULTIPLAYER - -[FEMP_J] -Mitspielen - -[FEMP_CS] -CHARAKTER: - -[FEMP_PS] -SPIELER-EINSTELLUNGEN - -[FEMP_GS] -SPIELAUSWAHL - -[FEMP_NG] -EIN NEUES SPIEL STARTEN - -[SVRLIST] -HOST-LISTE - -[SVRINFO] -HOST-DETAILS - -[SVRNAME] -NAME: - -[NO_SVRS] -SUCHE NACH HOSTS - -[NO_PLRS] -SUCHE NACH SPIELERN - -[NO_NAME] -KEIN NAME - -[NO_WIFI] -Um ein Multiplayer-Spiel zu spielen, musst du den WLAN-Schalter zuerst auf AN stellen. - -[FEMP_SG] -SPIEL STARTEN - -[FEMP_S] -Start - -[FEMP_WS] -Warte darauf, dass Host Spiel startet... - -[SVRLOST] -Verbindung mit Host wurde unterbrochen. - -[NOSVRS] -Konnte keinen Host finden. - -[MP_WARN] -Bei Start eines Multiplayer-Spiels gehen alle Fortschritte seit der letzten Speicherung verloren. - -[FEDS_XB] -Auswählen - [FEDS_TB] Zurück -[FEDS_ST] -START-Taste - WEITER - [FEST_OO] von -[FED_SUB] -UNTERTITEL: - [FEC_TUC] Geschützsteuerung -[FEC_SM3] -Spezialmission aktivieren (R3-Taste) - [FEC_RS3] -Radiosender auswählen (L3-Taste) +Radiosender auswãhlen (L3-Taste) [FEC_HO3] Hupe (L3-Taste) -[FIRST] -~g~1. +[C_FAIL] +Bürgerwehr-Mission beendet! -[SECOND] -~g~2. +[C_ESCP] +~r~Der Verdãchtige ist entwischt! -[THIRD] -~g~3. +[C_VIGIL] +BÜRGERWEHR BONUS!! -[FOURTH] -~g~4. - -[NOCONTE] -Bitte stecken Sie einen Analog Controller (DUALSHOCK®) oder einen Analog Controller (DUALSHOCK®2) in Controller-Anschluss 1 um fortzufahren. - -[WRCONT] -Der Controller in Controller-Anschluss 1 wird nicht unterstützt. GTA: Liberty City Stories benötigt einen Analog Controller (DUALSHOCK®) oder einen Analog Controller (DUALSHOCK®2). - -[WRCONTE] -Der Controller in Controller-Anschluss 1 wird nicht unterstützt. GTA: Liberty City Stories benötigt einen Analog Controller (DUALSHOCK®) oder einen Analog Controller (DUALSHOCK®2). +[HEAL_A] +Dein ~h~Gesundheitszustand~w~ wird rechts oben auf dem Bildschirm in Orange angezeigt. [WRONGCD] -Falsche DVD/CD-ROM. ~n~Bitte die DVD/CD-ROM für GTA:Liberty City Stories einlegen. +Falsche DVD. Bitte legen Sie die richtige DVD ein. [NOCD] -Die DVD/CD-Lade ist leer. ~n~Bitte die DVD/CD-ROM für GTA:Liberty City Stories einlegen. +Die DVD-Lade ist leer. Bitte DVD einlegen. [OPENCD] -Die DVD/CD-Lade ist offen. Bitte die DVD/CD-Lade schließen. +Die DVD-Lade ist offen. Bitte schließen. + +[CDERROR] +Fehler beim Lesen der 'Grand Theft Auto: Vice City' DVD. [RESTART] -Neues Spiel wird gestartet. +Neues Spiel wird gestartet [GA_3] -~w~Umspritzen kostet $100! +Keine Gratisjobs mehr. Umspritzen kostet $100! + +[GA_1] +Hey, so was heißes rühre ich nicht an! [GA_1A] -~w~Komm wieder, wenn du nicht so viel zu tun hast... +Komm wieder, wenn du nicht so viel zu tun hast... -[AWAY] -~r~Er ist verschwunden! +[HELP9_C] +Drücke die~h~ ~k~~PED_FIREWEAPON~~w~, um das Prãzisionsgewehr ~h~abzufeuern~w~. -[GA_6B] -~w~Park die Karre, mach sie durch Drücken von~h~ ~k~ ~PDFW~ ~w~scharf, und dann HAU AB! +[TAXI2] +~r~Die Zeit ist um! -[GA_7B] -Mach die Bombe mit~h~ ~k~ ~PDFW~~w~ scharf. Sie geht hoch, wenn der Wagen angelassen wird. +[PAGEB13] +Gesundheits-Powerups in Versteck angeliefert. + +[PAGEB14] +Adrenalin in Versteck vorrãtig. [FESZ_CA] Abbrechen -[FESZ_QU] -Beenden - -[FESZ_L1] -Spiel gespeichert! - -[FESZ_L2] -Spiel gespeichert unter: - -[FESZ_OK] -OK - -[FES_LGA] -Spiel laden - -[FES_DGA] -SPIELDATEN LÖSCHEN - [FES_NGA] -NEUES SPIEL +Neues Spiel [FES_CAN] Abbrechen [FESZ_QL] -Alle nicht gespeicherten Daten des aktuellen Spiels werden verloren gehen. Laden fortsetzen? +Alle nicht gespeicherten Daten des aktuellen Spiels werden verloren gehen. Ladevorgang fortsetzen? [FESZ_QD] -Diesen Spielstand wirklich löschen? +Dieses gespeicherte Spiel wirklich löschen? [FESZ_QO] -Diesen Spielstand wirklich überschreiben? +Dieses gespeicherte Spiel wirklich überschreiben? [FESZ_QR] Wirklich ein neues Spiel beginnen? Alle Daten seit dem letzten Speichern werden verloren gehen. Weiter? -[FESZ_QS] -SPEICHERN FORTSETZEN? +[T4X4_1] +'PCJ Rallye' -[T4X4_2A] -~g~Du hast ~y~2 Minuten~g~, um ~y~12~g~ Checkpoints abzufahren! ~g~Die ~y~REIHENFOLGE IST BELIEBIG. +[BMX_1] +'Krasses Gelãnde' -[T4X4_2B] -~1~ von 12! +[BMX_2] +'Teststrecke' -[T4X4_2C] -~y~PASSIERE~g~ den ersten Checkpoint, dann läuft die Zeit. ~g~Jeder Checkpoint bringt dir ~y~10 SEKUNDEN~g~. +[BMXFAIL] +~r~Du hast es nicht geschafft, einen neuen Rekord aufzustellen! + +[BMX_REC] +~g~Neuer Rekord:~1~ !! + +[T4X4_3] +'CHECKPOINT FIEBER' + +[MM_1] +'PYLONEN-RALLYE' [T4X4_F] ~r~Du hast gekniffen! Schon überfordert? -[UPSIDE] -~r~Du hast dich überschlagen! +[LANDSTK] +Landstalker + +[IDAHO] +Idaho + +[STINGER] +Stinger + +[LINERUN] +Linerunner + +[PEREN] +Perennial + +[SENTINL] +Sentinel + +[RIO] +Rio + +[PATRIOT] +Patriot + +[FIRETRK] +Feuerwehrwagen + +[TRASHM] +Trashmaster + +[STRETCH] +Stretch Limo + +[MANANA] +Manana + +[INFERNS] +Infernus + +[VOODOO] +Voodoo + +[PONY] +Pony + +[MULE] +Mule + +[CHEETAH] +Cheetah + +[AMBULAN] +Krankenwagen + +[FBICAR] +FBI Washington + +[MOONBM] +Moonbeam + +[ESPERAN] +Esperanto + +[TAXI] +Taxi + +[WASHING] +Washington + +[BOBCAT] +Bobcat + +[WHOOPEE] +Mr Whoopee + +[BFINJC] +BF Injection + +[HUNTER] +Hunter + +[POLICAR] +Polizei + +[ENFORCR] +Enforcer + +[SECURI] +Securicar + +[BANSHEE] +Banshee + +[PREDATR] +Predator + +[BUS] +Bus + +[RHINO] +Rhino + +[BARRCKS] +Barracks OL + +[CUBAN] +Kubanischer Hermes + +[HELI] +Helikopter + +[DODO] +Dodo + +[COACH] +Coach + +[CABBIE] +Cabbie + +[STALION] +Stallion + +[RUMPO] +Rumpo + +[RCBANDT] +RC Bandit + +[ROMERO] +Romeros Leichenwagen + +[PACKER] +Packer + +[ADMIRAL] +Admiral + +[SQUALO] +Squalo + +[SEASPAR] +Sea Sparrow + +[PIZZABO] +Pizza Boy + +[GANGBUR] +Gang Burrito + +[TROPIC] +Tropic + +[SPEEDER] +Speeder + +[REEFER] +Reefer + +[FLATBED] +Flatbed + +[YANKEE] +Yankee + +[CADDY] +Caddy + +[ZEBRA] +Zebra Cab + +[TOPFUN] +Top Fun + +[SKIMMER] +Skimmer + +[PCJ600] +PCJ 600 + +[PHOENIX] +Phoenix + +[FAGGIO] +Faggio + +[FREEWAY] +Freeway + +[RCBARON] +RC Baron + +[RCRAIDE] +RC Raider + +[GLENDAL] +Glendale + +[OCEANIC] +Oceanic + +[SANCHEZ] +Sanchez + +[SPARROW] +Sparrow + +[LOVEFIS] +Love Fist + +[COASTG] +Küstenwache + +[DINGHY] +Dinghy + +[HERMES] +Hermes + +[SABRE] +Sabre + +[SABRETU] +Sabre Turbo + +[WALTON] +Walton + +[REGINA] +Regina + +[COMET] +Comet + +[DELUXO] +Deluxo + +[BURRITO] +Burrito + +[SPAND] +Spandex Express + +[MARQUIS] +Marquis + +[BAGGAGE] +Baggage Handler + +[KAUFMAN] +Kaufman-Taxi + +[COASTMA] +Küstenwachen-Maverick + +[MAVERIC] +Maverick + +[RANCHER] +Rancher + +[FBIRANC] +FBI Rancher + +[VIRGO] +Virgo + +[GREENWO] +Greenwood + +[HOTRING] +Hotring Racer + +[BLISTAC] +Blista Compact [FEST_DF] -Zu Fuß zurückgel. Meilen +Zu Fuß zurückgel. Strecke (Meilen) [FEST_DC] -Mit Auto zurückgel. Meilen +Mit Auto gefahrene Strecke (Meilen) [FESTDFM] -Zu Fuß zurückgelegte Meter +Zu Fuß zurückgelegte Strecke (Meter) [FESTDCM] -Mit Auto zurückgelegte Meter +Mit Auto gefahrene Strecke (Meter) + +[TOT_DIS] +Insgesamt zurückgel. Strecke (Meilen) + +[TOTDISM] +Insgesamt zurückgel. Strecke (Meter) + +[DISTHEL] +Mit Helikopter geflogene Strecke (Meilen) + +[DISTHEM] +Mit Helikopter geflogene Strecke (Meter) + +[DISTBOA] +Mit Boot zurückgel. Strecke (Meilen) + +[DISTBOM] +Mit Boot zurückgel. Strecke (Meter) [FEST_LS] Mit Krankenwagen gerettete Menschen @@ -2803,23 +2498,14 @@ 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] -Erfüllte Spezialaufträge - -[FEST_CN] -Höchste Restzeit bei 'Karmageddon' - -[FEST_TR] -Meiste Hits bei 'RC Triaden-Terror' +Bestandene Amokfahrten [FEST_MP] -Erfüllte Missionen +Erledigte Missionen + +[FEST_BB] +Schnelle Autos, Schnelles Geld: [FEST_H0] Meiste Checkpoints @@ -2827,416 +2513,1577 @@ 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 + [USJ] -~w~MONSTER-STUNT-BONUS! - -[USJ_FAL] -~w~MONSTER-STUNT MISSGLÜCKT - -[HM1_1] -~g~Fertige 20 Purple Nines in 2 Min. 30 Sek. ab. - -[KM1_8A] -Drücke~h~ ~k~ ~PDFW~ ~w~zum ~h~Zünden der Bombe~w~. Aber geh vorher in Deckung! - -[KM1_8D] -Drücke~h~ ~k~ ~PDFW~ ~w~zum ~h~Zünden der Bombe~w~. Aber geh vorher in Deckung! +MONSTER-STUNT-BONUS! [RATNG1] -UNBESCHOLTENER BÜRGER +Unbescholtener Bürger [RATNG2] -DURCHSCHNITTSTYP +Durchschnittstyp [RATNG3] -FALSCHPARKER +Falschparker [RATNG4] -LADENDIEB +Ladendieb [RATNG5] -ROWDY +Rowdy [RATNG6] -LAUFBURSCHE +Laufbursche [RATNG7] -TASCHENDIEB +Taschendieb [RATNG8] -KLEPTOMANE +Kleptomane [RATNG9] -INFORMANT +Informant [RATNG10] -SPITZEL +Spitzel + +[RATNG11] +Verrãter [RATNG12] -HOCHSTAPLER +Hochstapler [RATNG13] -BETRÜGER +Betrüger [RATNG14] -SCHIEBER +Schieber [RATNG15] -FALSCHSPIELER +Falschspieler [RATNG16] -SCHLÄGER +Schlãger [RATNG17] -STRASSENGAUNER +Straßengauner [RATNG18] -GAUNER +Gauner [RATNG19] -HALUNKE +Halunke [RATNG20] -OUTLAW +Outlaw [RATNG21] -SCHURKE +Schurke [RATNG22] -KURIER +Kurier [RATNG23] -GANGSTER +Gangster [RATNG24] -OBERGANGSTER +Obergangster [RATNG25] -GALGENVOGEL +Galgenvogel [RATNG26] -EX-KNACKI +Ex-Knacki [RATNG27] -SCHWERER JUNGE +Schwerer Junge [RATNG28] -PROFI +Profi [RATNG29] -DRAHTZIEHER +Drahtzieher [RATNG30] -FAHRER +Fahrer [RATNG31] -SOLDAT +Soldat [RATNG32] -GORILLA +Gorilla [RATNG33] -KOPFGELDJÄGER +Kopfgeldjãger [RATNG34] -MANN FÜRS GROBE +Mann fürs Grobe [RATNG35] -RONIN +Ronin [RATNG36] -ABRÄUMER +Abrãumer [RATNG37] -HIT-MAN +Hit-Man [RATNG38] -PARTNER +Partner [RATNG39] -METZGER +Butcher [RATNG40] -TROUBLESHOOTER +Troubleshooter [RATNG41] -ATTENTÄTER +Attentãter [RATNG42] -ADJUTANT +Adjutant [RATNG43] -GEMACHTER MANN +Gemachter Mann [RATNG44] -RECHTE HAND +Rechte Hand [RATNG45] -VOLLSTRECKER +Vollstrecker [RATNG46] -LEUTNANT +Leutnant [RATNG47] -VIZE-BOSS +Vize-Boss [RATNG48] -CAPO +Capo [RATNG49] -BOSS +Boss [RATNG50] -OBERBOSS +Oberboss [RATNG51] -DON +Don [RATNG52] -PATE - -[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 - -[DETON] -DETONATION - -[RCBOMB1] -RC Triaden-Terror - -[RECORD] -~w~Neuer Rekord - ~1~ Opfer! - -[NRECORD] -~r~Du hast den bisherigen Rekord von ~1~ Opfern nicht verbessert! - -[RCBOMBF] -~r~Du bist aus dem Van gestiegen! - -[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! - -[RAMPKA] -~w~Du brauchst ein Fahrzeug für diesen Spezialauftrag. +King of the City [PAGE_00] -. - -[TURTXT] -Bleihaltige 'Spritztour'! - -[TURPASS] -~w~'Spritztour' vorbei! - -[TUR3D] -~w~Auto - -[FTFRENZ] -Feuerwehr-Spezialauftrag +.. [WELCOME] WILLKOMMEN IN [TSCORE] -~w~GESAMTEINKÜNFTE: $~1~ +EINKÜNFTE: $~1~ -[PBOAT_1] -Drücke~h~ ~k~ ~VEWEP~~w~, um die Bordkanonen abzufeuern. +[PBOAT_2] { reVC update } +Drücke die ~h~~k~~VEHICLE_FIREWEAPON~~w~, um die Bordkanonen abzufeuern. -[HM2_1] -Zerstöre die gepanzerten Fahrzeuge mit den Buggies. Zur Zündung drücke~h~ ~k~ ~VEWEP~~w~. +[HJSTAT] +Distanz: ~1~.~1~m Höhe: ~1~.~1~m Saltos: ~1~ Drehungen: ~1~_ -[HM2_1A] -Zerstöre die gepanzerten Fahrzeuge mit den Buggies. Zur Zündung drücke~h~ ~k~ ~VEWEP~~w~. +[HJSTATW] +Distanz: ~1~.~1~m Höhe: ~1~.~1~m Saltos: ~1~ Drehungen: ~1~_ Und was für eine Landung! -[HM2_2] -~r~Du hast nicht alle gepanzerten Fahrzeuge zerstört! - -[HM2_6] -~g~Gepanzertes Fahrzeug zerstört! - -[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 - -[FES_LOF] -Laden fehlgeschlagen. - -[FES_SLO] -GESPEICHERTE DATEI - -[FES_ISC] -IST BESCHÄDIGT - -[FESZ_TI] -Z1 SPEICHERN - -[FESZ_SA] -Spiel speichern - -[MC_LDFL] -Laden fehlgeschlagen! - -[MC_NWRE] -Spiel wird neu gestartet. - -[BIFP_1] -~w~Autsch! 'Flug'-Weite: ~1~,~1~m - -[BIFP_1F] -~w~Autsch! 'Flug'-Weite: ~1~ Fuß - -[DIAB1_5] -ZEIT: - -[F_FAIL1] -~r~Feuerwehr-Mission beendet. - -[F_CANC] -~r~Feuerwehr-Mission abgebrochen! - -[F_FAIL3] -~r~Du kommst zu spät! - -[F_FAIL4] -~r~Einer der Insassen ist gestorben! - -[F_FAIL5] -~r~Eins der Autos wurde zerstört! - -[F_FAIL6] -~r~Das Auto wurde zerstört! - -[F_EXTIN] -Brände - -[A_CANC] -~r~Krankenwagen-Mission abgebrochen! - -[ALEVEL] -~w~Krankenwagen-Mission Level ~1~ - -[A_FAIL1] -~r~Krankenwagen-Mission beendet. +[ATUTOR] +Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~~w~, um Krankenwagen-Missionen an- oder abzuschalten. [FEST_HA] -Höchstes Krankenwagen-Missions-Level - -[A_SAVES] -~w~GERETTETE MENSCHEN: ~1~ +Höchster Krankenwagen-Missions-Level [C_KILLS] -~w~ERLEDIGTE KRIMINELLE: ~1~ +KRIMINELLE: ~1~ -[F_START] -~b~Brennendes Fahrzeug ~w~in der Gegend von ~a~ gemeldet. Lösche den Brand. +[HJSTATF] +Distanz: ~1~Fuß Höhe: ~1~Fuß Saltos: ~1~ Drehungen: ~1~_ -[F_STAR1] -~b~Brennende Fahrzeuge ~w~in der Gegend von ~a~ gemeldet. Lösche die Brände. +[HJSTAWF] +Distanz: ~1~Fuß Höhe: ~1~Fuß Saltos: ~1~ Drehungen: ~1~_ Und was für eine Landung! -[F_REWAR] -~w~BRAND GELÖSCHT! Level ~1~ abgeschlossen! Belohnung: $~1~ +[CRED001] +ROCKSTAR NORTH + +[CRD001A] +STUDIO DIRECTOR + +[CRD001B] +ANDREW SEMPLE + +[CRED002] +PRODUCER + +[CRD002A] +DEVELOPMENT DIRECTOR + +[CRED003] +LESLIE BENZIES + +[CRED004] +ART DIRECTOR + +[CRED005] +AARON GARBUT + +[CRED006] +TECHNICAL DIRECTORS + +[CRED007] +OBBE VERMEIJ + +[CRED008] +ADAM FOWLER + +[CRED010] +ANDREW DUTHIE + +[CRED011] +CRAIG FILSHIE + +[CRED012] +WILLIAM MILLS + +[CRED013] +CHRIS ROTHWELL + +[CRD013A] +IMRAN SARWAR + +[CRD013B] +JAMES WORRALL + +[CRD013C] +JOHN HAIME + +[CRED014] +WRITTEN BY + +[CRED015] +JAMES WORRALL + +[CRED016] +PAUL KUROWSKI + +[CRED017] +DAN HOUSER + +[CRED018] +LEAD CHARACTER DESIGNER + +[CRD018A] +CHARACTER DESIGNER + +[CRED019] +IAN MCQUE + +[CRD019A] +TOKS SOLARIN + +[CRD019B] +ALAN DAVIDSON + +[CRED020] +LEAD ANIMATOR + +[CRED021] +ALEX HORTON + +[CRD022A] +ANIMATORS + +[CRED022] +LEE MONTGOMERY + +[CRD022B] +DUNCAN SHIELDS + +[CRD022C] +GUS BRAID + +[CRED023] +VEHICLE DESIGNERS + +[CRD023A] +JOLYON ORME + +[CRD023B] +ALAN DUNCAN + +[CRD024A] +LEAD VEHICLE DESIGNER + +[CRED024] +PAUL KUROWSKI + +[CRED025] +MAP DESIGNERS + +[CRED026] +ADAM COCHRANE + +[CRED027] +NIK TAYLOR + +[CRED028] +GARY MCADAM + +[CRED029] +KEIRAN BAILLIE + +[CRED030] +ALISDAIR WOOD + +[CRED031] +ANDREW SOOSAY + +[CRD031A] +STEVEN MULHOLLAND + +[CRD031B] +WAYLAND STANDING + +[CRD031C] +CAMPBELL J. DICK + +[CRD031D] +GRAPHIC DESIGNER + +[CRD031E] +STUART PETRI + +[CRED032] +LEAD PROGRAMMER + +[CRD032A] +PROGRAMMERS + +[CRED033] +ALEXANDER ROGER + +[CRED034] +GRAEME WILLIAMSON + +[CRED035] +BARANE CHAN + +[CRED036] +DEREK PAYNE + +[CRED037] +GORDON YEOMAN + +[CRD037A] +ALAN CAMPBELL + +[CRD037B] +MARK HANLON + +[CRD037C] +ANDRZEJ MADAJCZYK + +[CRED038] +LEAD MUSIC PRODUCER + +[CRED039] +CRAIG CONNER + +[CRED040] +STUART ROSS + +[CRED041] +LEAD AUDIO ENGINEER + +[CRED042] +ALLAN WALKER + +[CRD041A] +AUDIO ENGINEER + +[CRD041B] +AUDIO + +[CRD042A] +WILL MORTON + +[CRED043] +AUDIO PROGRAMMER + +[CRED044] +RAYMOND USHER + +[CRED045] +TEST MANAGER + +[CRED046] +CRAIG ARBUTHNOTT + +[CRED047] +LEAD QA + +[CRED048] +NEIL CORBETT + +[CRED049] +KEVIN WONG + +[CRED050] +QA + +[CRED051] +DAVID BEDDOES + +[CRED052] +DAVID WATSON + +[CRED053] +BARRY CLARK + +[CRED054] +ROSS SPARROW + +[CRED055] +JAMES ALLAN + +[CRED056] +NEIL MEIKLE + +[CRD056A] +GEORGE WILLIAMSON + +[CRD056B] +MATT JONES + +[CRD056C] +ROB HARBOUR + +[CRD056D] +TOM WHITTAKER + +[CRED057] +LEAD TECHNICAL SUPPORT + +[CRED058] +LORRAINE ROY + +[CRD057A] +TECHNICAL SUPPORT + +[CRED059] +CHRISTINE CHALMERS + +[CRD060A] +OFFICE SUPPORT + +[CRD060B] +KIM GURNEY + +[CRD060C] +CASSIE OLIVER + +[CRED060] +ROCKSTAR NEW YORK + +[CRED061] +EXECUTIVE PRODUCER + +[CRED062] +SAM HOUSER + +[CRED063] +PRODUCER + +[CRED064] +DAN HOUSER + +[CRED065] +VP OF DEVELOPMENT + +[CRED066] +JAMIE KING + +[CRED067] +CHIEF TECHNOLOGY OFFICER + +[CRED068] +GARY J. FOREMAN + +[CRED069] +ASSOCIATE PRODUCER + +[CRED070] +JEREMY POPE + +[CRD071A] +DIRECTOR OF QUALITY ASSURANCE + +[CRD072A] +JEFF ROSA + +[CRED071] +MUSIC SUPERVISOR + +[CRED072] +TERRY DONOVAN + +[CRED073] +PRODUCTION TEAM + +[CRED074] +TERRY DONOVAN + +[CRED075] +JENNIFER KOLBE + +[CRED076] +JENEFER GROSS + +[CRED077] +LAURA PATERSON + +[CRED078] +JEFF CASTANEDA + +[CRED079] +JERONIMO BARRERA + +[CRED080] +CARLY SLATER + +[CRED081] +JUNG KWAK + +[CRED082] +BRIAN WOOD + +[CRED083] +RENAUD SEBANNE + +[CRED084] +RICHARD KRUGER + +[CRD084A] +DANIEL EINZIG + +[CRD084B] +JACEN BURROWS + +[CRD084C] +LINN PR + +[CRD084D] +COVER ART + +[CRD084E] +STEPHEN BLISS + +[CRED085] +KENT PAUL'S 80 NOSTALGIA ZONE + +[CRED086] +WRITTEN BY DAN HOUSER + +[CRD086A] +PRODUCED BY ADAM TEDMAN + +[CRED087] +WWW.KENTPAUL.COM AND WWW.VICECITY.COM + +[CRED088] +CREATED BY + +[CRD088A] +ADAM TEDMAN + +[CRD088B] +DAVID YU + +[CRD088C] +JERRY LUNA + +[CRD088D] +STUART PETRI + +[CRD088E] +MICHAEL CARNEVALE + +[CRD088F] +GREG LAU + +[CRD088G] +FUTABA HAYASHI + +[CRED089] +QA MANAGER + +[CRED090] +CRAIG ARBUTHNOTT + +[CRED091] +LEAD ANALYST + +[CRED092] +ADAM DAVIDSON + +[CRD092A] +JOE HOWELL + +[CRD092B] +MARC FERNANDEZ + +[CRED093] +GAME ANALYST + +[CRED094] +RICHARD HUIE + +[CRED095] +ROCKSTAR TEST TEAM + +[CRED096] +LANCE WILLIAMS + +[CRED097] +JOE GREENE + +[CRED098] +BRIAN PLANER + +[CRD098A] +ELIZABETH SATTERWHITE + +[CRD098B] +JAMEEL VEGA + +[CRD098C] +MIKE HONG + +[CRED099] +LEE CUMMINGS + +[CRED100] +STORY + +[CRED101] +JAMES WORRALL + +[CRED102] +DAN HOUSER + +[CRED103] +ADAM TEDMAN + +[CRED104] +PAUL YEATES + +[CRED105] +JENEFER GROSS + +[CRED106] +LAURA PATERSON + +[CRED107] +CUT SCENES + +[CRED108] +WRITTEN BY DAN HOUSER AND JAMES WORRALL + +[CRED109] +AUDIO DIRECTED BY DAN HOUSER AND NAVID KHONSARI + +[CRED110] +PRODUCED BY JAMIE KING + +[CRD110A] +TALENT PROCUREMENT: JAMIE KING, SEAN MACALUSO + +[CRED111] +CAST + +[CRD111A] +SUPPORTING CHARACTERS + +[CRED112] +TOMMY VERCETTI - RAY LIOTTA + +[CRED113] +KEN ROSENBERG - WILLIAN FICHTNER + +[CRED114] +SONNY FORELLI - TOM SIZEMORE + +[CRED115] +STEVE SCOTT - DENNIS HOPPER + +[CRED116] +AVERY CARRINGTON - BURT REYNOLDS + +[CRED117] +RICARDO DIAZ - LUIS GUZMAN + +[CRED118] +LANCE VANCE - PHILIP MICHAEL THOMAS + +[CRED119] +COLONEL JUAN CORTEZ - ROBERT DAVI + +[CRED120] +UMBERTO ROBINA - DANNY TREJO + +[CRED121] +PHIL CASSIDY - GARY BUSEY + +[CRED122] +MITCH BAKER - LEE MAJORS + +[CRED123] +MERCEDES CORTEZ - FAIRUZA BALK + +[CRED124] +KENT PAUL - DANNY DYER + +[CRED125] +JEZZ TORRENT - KEVIN MCKIDD + +[CRED126] +TAXI CONTROLLER - DEBORAH HARRY + +[CRED127] +CANDY SUXX - JENNA JAMESON + +[CRED128] +BJ SMITH - LAWRENCE TAYLOR + +[CRED129] +AUNTIE POULET - YOUREE CLEOMILI HARRIS + +[CRED130] +SUPPLIER - ARMANDO RIESCO + +[CRED131] +COUGAR - BLAYNE PERRY + +[CRED132] +HILARY - CHARLES TUCKER + +[CRED133] +CONGRESSMAN ALEX SHRUB - CHRIS LUCAS + +[CRED134] +OLD MAN KELLY - GEORGE DICENZO + +[CRD134A] +CAM JONES - GREG SIMS + +[CRD134B] +PSYCHO - HUNTER PLATIN + +[CRD134C] +MAUDE THE ICE CREAM LADY - JANE GENNARO + +[CRD134D] +JETHRO - JOHN ZURHELLEN + +[CRD134E] +GONZALES - JORGE PUPO + +[CRD134F] +DWAYNE - NAVID KHONSARI + +[CRD134G] +DICK - PETER MCKAY + +[CRD134H] +MIKE THE GOON & PORN GUY - ROBERT CIHRA + +[CRD134I] +PERCY - RUSSELL FOREMAN + +[CRED135] +MOTION CAPTURE + +[CRED136] +ANIMATED BY + +[CRD136A] +TECHNICAL DIRECTION BY ALEX HORTON + +[CRED137] +DIRECTED BY + +[CRD137A] +DIRECTED BY NAVID KHONSARI + +[CRED138] +PRODUCED BY + +[CRD138A] +PRODUCED BY JAMIE KING + +[CRD138B] +RENAUD SEBBANE + +[CRED139] +RECORDED AT PERSPECTIVE STUDIOS, BROOKLYN + +[CRED140] +MOTION CAPTURE ACTORS + +[CRD140A] +BLAYNE PERRY + +[CRD140B] +JONATHON SALE + +[CRD140C] +CHARLES TUCKER + +[CRD140D] +EDDIE MARRERO + +[CRD140E] +WILLIAM MCCALL + +[CRD140F] +JORGE PUPO + +[CRD140G] +ROBERT JACKSON + +[CRD140H] +TARA RADCLIFFE + +[CRD140I] +JENIFER GAMBETESE + +[CRD140J] +KRIS ACHEVARRIA + +[CRD140K] +ALI ORDOUBADI + +[CRD140L] +KAHLEEM POOLE + +[CRED141] +PEDESTRIAN DIALOGUE + +[CRD141A] +WRITTEN BY DAN HOUSER, MARC FERNANDEZ, GILLIAN TELLING AND NAVID KHONSARI + +[CRD141B] +WITH HELP FROM JEREMY POPE, LANCE WILLIAMS, AND JENNY JEMISON + +[CRED142] +WRITTEN BY + +[CRD142A] +DAN HOUSER AND JAMES WORRALL + +[CRED143] +DIRECTED BY DAN HOUSER, CRAIG CONNER, MARC FERNANDEZ, AND ALLAN WALKER + +[CRED144] +PRODUCED BY RENAUD SEBANNE + +[CRED145] +PEDESTRIANS + +[CRED146] +ADAM DAVIDSON, ADAM WATKINS, ALEJANDRO K. BROWN, ALEX ANTHONY SIOUKAS, ALEX GARCIA, + +[CRED147] +ALICE SALTZMAN, ALISON CIHRA, AMY SALIMA, AMY SALZMAN, ANDREA VIDELA, ANTHONY ATTI, + +[CRED148] +ANTHONY RIVERA, BIJAN SHAMS, BLAYNE PERRY, BRETT BISOGNO, BREYE MATA, BRIAN PANEN, + +[CRED149] +BROCK VODER, CAREY BERTINI, CHARISSE LAMBERT, CHRIS DIFAT, CHRIS REISENBERGER, + +[CRED150] +CHRISTOPHER BRODAY, CHRISTOPHER CARRO, CYNTHIA GREENE, DAMARIES LOPEZ, DAN LEE, + +[CRED151] +DAN SCHNEIDER, DAN TOYAMA, DAVID DEAN CHALTFIELD, JR., DAVID HARRISON, DAVID WILEY, + +[CRED152] +DEBORAH COLLINS, DEBRANDA CHANEY-GILES, DEMETRA KOUKOULAS, DENISE ROSADO, + +[CRED153] +DEVIN BENNETT, DEVIN WINTERBOTTOM, DORIS WOO, DOUGLAS HARRISON, DUNCAN COUTTS, + +[CRED154] +DUPE AJAYI, EDWIN AVELLANEDA, ELIZABETH HOWELL, ELIZABETH SATTERWHITE, ERIC NAGLE, + +[CRED155] +ESTEBAN KARPLUS, F. FONT, FUTABA HAYASHI, GENE HILGREEN, GERALD COSGROVE, + +[CRED156] +GERARD LUNA, GILLIAN TELLING, GREGG CARLUCCI, GREGORY CLERVOIX, GREGORY SCHWEIZER, + +[CRED157] +HADLEY TOMICKI, J. ROSSETT, JAMEEL VEGA, JASON JONES, JEFF ROSA, JENNIFER JEMISON, + +[CRED158] +JEREMY TAGGERT, JESSICA RIDER, JOSEPH GREENE,JOSEPH HOWELL, KATE DUKICH, + +[CRED159] +KEL O'NEILL, KEVIN HOPKINS, LADAWN JAMES, LANCE WILLIAMS, LAURA BUBBLES, + +[CRED160] +LAURA PATTERSON, LEE CUMMINGS, LETICIA L. YOUNG, LINDSAY KENNEDY, LISA ORITZ, + +[CRED161] +LORNA JORDAN, LUCIO AMADIO, MARCO FERNANDEZ, MARIKO TANAKA, MARLON MATTHEWS, + +[CRED162] +MARY TELLING, MASAYOSHI MITSUYAMA, MATTHEW CHUNG, MAX ALLSTADT, MAX BOGDANOV, + +[CRED163] +MELISSA ALVAREZ, MICHAEL MAY, MICHAEL ROTHSTEIN, MIGUEL VIDAL, MIKE FEDERLINE, + +[CRED164] +NATALIE DESCALZO, N'GAI MEMBERS, NICOLAS MALLO, NOELLE SADLER, NORBERT MORIVAN, + +[CRED165] +OSWALD GREENE, JR., PETER MCKAY, PETER APPEL, PRESTON SAVARESE, RAFAEL GONZALES, + +[CRED166] +RANDY JOHNSON, REY CONCEPCION, RICHARD KROGER, ROB TIBBS, ROBERT JACKSON, + +[CRED167] +ROBERT SCHULER, ROSS A. MCINTYRE, RUSSELL FOREMAN, RUTH NUNEZ, SALVADORE SUAZO, + +[CRED168] +SAM WHITE, SANTOS GONZALES, SCOTT SMITH, SEYMOUR FRAILMAN, SPELMAN BRAUMAN, + +[CRED169] +STEPHANIE TELLING, STEVE KNEZEVICH, STEVE ROBERT, SUMIKO YASUDA, SUSAN LEWIS, + +[CRED170] +SYLVIA COLACIOS, TOMOKO MIYAZAKI, TRON, VERDEL HALE, YVES MONDESIR, ZENO LEINFELDER, + +[CRED171] +DAVID BEDDOES, CHRISTINE CHALMERS, BARRY CLARK, NEIL CORBETT, KIM GURNEY, NEIL MEIKLE, + +[CRED172] +CASSIE OLIVER, LORRAINE ROY, DAVID WATSON, KEVIN WONG, WILL MORTON + +[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] +MUSIC CONSULTANCY + +[CRD218A] +HEINZ HENN + +[CRD218B] +STUART ROSS + +[CRED219] +SOUNDTRACK CO-ORDINATOR + +[CRED220] +TERRY DONOVAN + +[CRED221] +PRODUCER FOR ROCKSTAR GAMES + +[CRED222] +DAN HOUSER AND LAZLOW + +[CRED223] +PRODUCER FOR ROCKSTAR NORTH + +[CRED224] +CRAIG CONNER + +[CRED225] +ALLAN WALKER + +[CRED226] +LAZLOW + +[CRED227] +DJ BANTER AND IMAGING + +[CRED228] +WRITTEN BY DAN HOUSER AND LAZLOW + +[CRED229] +FLASH FM + +[CRD229A] +TONI-MARIA CHAMBERS + +[CRD229B] +IMAGING VOICE AND PRODUCTION-JEFF BERLIN + +[CRED230] +SPECIAL THANKS TO + +[CRED231] +TOMMY MOTTOLA, + +[CRED232] +MICHELLE ANTHONY, + +[CRED233] +STEVE BARNETT, + +[CRED234] +CHUCK FLECKENSTEIN, + +[CRED235] +RITA LIBERATOR + +[CRED236] +MARTIN & CLAIRE LOGAN + +[CRED237] +SANDRA HUTTON + +[CRED238] +CHRISTINE DAVIDSON + +[CRED239] +ALAN, RED & BIGFOOT + +[CRED240] +LE T + +[CRED241] +COLIN DONALD + +[CRED242] +KERRY STALLWOOD + +[CRED243] +ALAN MCGREGOR + +[CRED244] +CHRIS MORTON + +[CRED245] +EMIL BUSSE + +[CRED246] +EMILY BAILLIE + +[CRED247] +KEVIN ARCHIBALD + +[CRED248] +MORAG KERR + +[CRED249] +CATH WALKER + +[CRED250] +ISO BAR + +[CRED251] +WATERLINE + +[CRED252] +NEWS CAFE + +[CRD251A] +THE POND + +[CRD252A] +PIVO + +[CRED253] +BUDGET VIDEO RENTALS + +[CRED254] +LORNA'S SCOOTER + +[CRED255] +GARETH MURFIN + +[CRED256] +ADDITIONAL ART + +[CRED257] +TONY PORTER + +[CRED258] +CRAIG MOORE + +[CRED259] +CUT SCENE LIP-SYNC ANIMATION + +[CRED260] +COSGROVE HALL FILMS + +[CRED261] +PRODUCER - OWEN BALLHATCHET + +[CRED262] +SENIOR ANIMATOR - JON TURNER + +[CRED263] +ANIMATORS - RICHARD DRUMM + +[CRED264] +DAVE BROWN + +[CRED265] +MAIR THOMAS + +[CRED266] +PRASHANT PATEL + +[CRED267] +AUDIO TECHNOLOGY CONSULTANT + +[CRED268] +RIK EDE FOR GAMESOUND LTD. + +[CRED269] +DTS INTEGRATION SUPPORT + +[CRED270] +TED LAVERTY FOR DTS + +[CRED271] +CHRIS GREER FOR DTS + +[CRED272] +JASON PAGE FOR SCEE + +[CRED273] +RESEARCH AND ANALYSIS + +[CRED274] +VROCK + +[CRED275] +DJ: LAZLOW AS HIMSELF + +[CRED276] +IMAGING VOICE-JOE KELLY + +[CRED277] +IMAGING PRODUCTION-JONATHAN HANST + +[CRED278] +WAVE 103 + +[CRED279] +DJ: ADAM FIRST-JAMIE CANFIELD + +[CRED280] +IMAGING VOICE-JEN SWEENEY + +[CRED281] +IMAGING PRODUCTION-JONATHAN HANST + +[CRED282] +FEVER 105 + +[CRED283] +DJ: OLIVER 'LADYKILLER' BISCUIT-JULIUS DYSON + +[CRED284] +IMAGING VOICE MALE-ED MCMANN + +[CRED285] +IMAGING VOICE FEMALE-SHAWNEE SMITH + +[CRED286] +IMAGING PRODUCTION- LISTEN KITCHEN + +[CRED287] +EMOTION 98.3 + +[CRED288] +DJ: FERNANDO- FRANK CHAVEZ + +[CRED289] +IMAGING VOICE-JEN SWEENEY + +[CRED290] +IMAGING PRODUCTION-JONATHAN HANST + +[CRED291] +RADIO ESPANTOSO + +[CRED292] +DJ: PEPE-TONY CHILRODES + +[CRED293] +WILDSTYLE + +[CRED294] +DJ: MISTER MAGIC AS HIMSELF + +[CRED295] +IMAGING VOICE-FRANK SILVESTRO + +[CRED296] +IMAGING PRODUCTION-LAZLOW + +[CRED297] +KCHAT + +[CRED298] +WRITTEN BY DAN HOUSER AND LAZLOW + +[CRED299] +PRODUCED AND EDITED BY LAZLOW + +[CRED300] +DJ AMY SHECKENHAUSEN -LEYNA WEBER + +[CRED301] +JEZ TORRENT-KEVIN MCKIDD + +[CRED302] +MANDY -COLLEEN CORBETT + +[CRED303] +MICHELLE CARAPADIS-MARY BIRDSONG + +[CRED304] +MR.ZOO-CARL DOWLING + +[CRED305] +GETHSEMANEE-LYNN LIPTON + +[CRED306] +CLAUDE MAGINOT-JOHN MAUCERI + +[CRED307] +BJ SMITH-LAWRENCE TAYLOR + +[CRED308] +THOR-FRANK FAVA + +[CRED309] +RADIO CALLERS + +[CRED310] +COUZIN ED, JOSH CLARK, JASON BUHRMESTER, JUAN ALLER, WAYNE OLIVER, SUSAN LEWIS, GILLIAN TELLING, TOM MURRAY, MIKE FERRANTE SR., EMMANUEL GOLDSTEIN, DAN HOUSER, NICK MANDELOS, GERRY COSGROVE, MIKE PALERMO, PORKCHOP, KEITH BROADAS + +[CRED311] +LEWIS, GILLIAN TELLING, TOM MURRAY, MIKE FERRANTE SR., EMMANUEL GOLDSTEIN, + +[CRED312] +DAN HOUSER, NICK MANDELOS, GERRY COSGROVE, MIKE PALERMO, PORKCHOP, + +[CRED313] +KEITH BROADAS + +[CRED314] +VCPR + +[CRED315] +WRITTEN BY DAN HOUSER AND LAZLOW + +[CRED316] +PRODUCED BY LAZLOW + +[CRED317] +MAURICE CHAVEZ-PHILLIP ANTHONY RODRIGUEZ + +[CRED318] +JONATHAN FREELOADER- PATRICK OLSEN + +[CRED319] +MICHELLE MONTANIUS-KELLY GUEST + +[CRED320] +REP. ALEX SHRUB- CHRIS LUCAS + +[CRED321] +CALLUM CRAYSHAW- SEAN MODICA + +[CRED322] +JOHN F. HICKORY- LJ GANSEN + +[CRED323] +PASTOR RICHARDS- DAVID GREEN + +[CRED324] +JAN BROWN- MAUREEN SILLIMAN + +[CRED325] +BARRY STARK- RENAUD SEBBANE + +[CRED326] +JENNY LOUISE CRAB- MARY BIRDSONG + +[CRED327] +KONSTANTINOS SMITH- KONSTANTINOS.COM + +[CRED328] +JEREMY ROBARD-PETER SILVESTRO + +[CRED329] +RADIO COMMERCIALS + +[CRED330] +WRITTEN BY DAN HOUSER AND LAZLOW + +[CRED331] +PRODUCED BY LAZLOW + +[CRED332] +ADDITIONAL JINGLES PRODUCED BY CRAIG CONNER + +[CRED333] +COMMERCIAL VOICES: + +[CRED334] +ADAM DAVIDSON, ALEX ANTHONY, ALICE SALTZMAN, AMY SALZMAN, KATE DUKICH, + +[CRED335] +ARAN RONICLE, BARB JONES, BEN KRECH, BRIAN THOMAS, BROCK YODER, CHRIS + +[CRED336] +FERRANTE, CRAIG CONNER, DAVE RYAN, DAVID GREEN, DORIS WOO, DOUGLAS + +[CRED337] +HARRISON, ED MCMANN, FRANK CHAVEZ, FRANK FAVA, GENE HILGREEN, GREG + +[CRED338] +SCHWEIZER, HUNTER PLATIN, JAMES FERRANTE, JEFF BERLIN, JEFF ROSA, JOE KELLY, + +[CRED339] +JOHN MAUCERI, JOSH CLARK, JULIE WEMYSS, KEVIN STRALEY, KIM GURNEY, LANCE + +[CRED340] +WILLIAMS, LAURA PATERSON, LAZLOW, LISA ORTIZ, LORNA JORDAN, LUCIEN JONES, + +[CRED341] +MAUREEN SILLIMAN, MIKE FERRANTE JR., PETE GUSTIN, PETER SILVESTRO, RAFF + +[CRED342] +CROLLA, RANDY JOHNSON, RICHARD KRUGER, RON REEVE, SHELLEY MILLER, SKY, TJ ALLARD + +[CRD344A] +AUDIO RECORDED AT DIGITAL ARTS STUDIOS, + +[CRED344] +NYC, TRACK 9 STUDIOS, NYC, + +[CRED345] +WEDDINGTON MULTIMEDIA, LOS ANGELES, + +[CRD345A] +SYNC SOUND, NYC AND RADIO LAZLOW, LONG ISLAND. + +[CRED346] +THANKS TO AXEL ERICSON AND WON LEE AT DIGITAL ARTS, PAUL VASQUEZ AT TRACK 9 STUDIOS, JOHN BOWEN AND JOHN HASSLER AT SYNC SOUND + +[CRED347] +MARK LLOYD + +[CRED348] +TIM BATES + +[CRED349] +KIT BROWN + +[CRED350] +ANDY MASON + +[CRED351] +PHIL DEANE + +[CRED352] +PHIL ALEXANDER + +[CRED353] +MATT HEWITT + +[CRED354] +DENBY GRACE + +[CRED355] +ANTOINE CABROL + +[CRED356] +JONATHAN STONES + +[CRED357] +MIKE BLACKBURN + +[CRED358] +TIM MCGAFF [CINCAM] Cinematic-Kamera -[FEDS_AM] -<>-MENÜ WECHSELN +[RC4] +'ROCK'N ROLL MIT RUMPO' -[KABOOM] -KA-WUMM! - -[SPLAT] -PLATT! - -[PANCAK] -IM EIMER! - -[SOAKED] -FERTIG! - -[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 +[LEGAL] +~g~Schalte die kriminelle Bedrohung aus! [GA_2] -~w~Neuer Motor und neue Lackierung: $100 +Neuer Motor und neue Lackierung. Die Cops werden dich nicht identifizieren! + +[HELP15] +Wenn zu Fuß unterwegs, drücke die ~h~~k~~PED_LOOKBEHIND~~w~, um ~h~nach hinten zu sehen~w~. Benutze den ~h~rechten Analog-Stick~w~, um dich ~h~umzusehen~w~. + +[FEC_LB4] +Nach hinten sehen (R3-Taste) [PERPIC] -Gefundene versteckte Päckchen +Versteckte Pãckchen gefunden + +[CO_ONE] +Verstecktes Pãckchen ~1~ von ~1~ [GA_21] -~w~In dieser Garage bringst du keine Fahrzeuge mehr unter. +In dieser Garage bringst du keine Autos mehr unter. [CHEAT1] Cheat aktiviert @@ -3259,14 +4106,8 @@ Geld-Cheat [CHEAT7] Wetter-Cheat -[FEDS_BA] -"-Taste - ZURÜCK - -[FED_WIS] -BREITWAND: - [USJ_ALL] -~w~ALLE MONSTER-STUNTS ABSOLVIERT! +ALLE MONSTER-STUNTS ABSOLVIERT! [JAN] Jan @@ -3275,7 +4116,7 @@ Jan Feb [MAR] -Mär +Mãr [APR] Apr @@ -3310,12021 +4151,5061 @@ Dez [BONUS] ~g~BONUS $~1~ -[TAXI_M] -'Taxifahrer' +[HORN1] +Drück die ~h~~k~~VEHICLE_HORN~~w~, um zu ~h~hupen. -[COP_M] -'Bürgerwehr' +[HORN2] +Drück die ~h~~k~~VEHICLE_HORN~~w~, um zu ~h~hupen. -[FIRE_M] -'Feuerwehrmann' - -[AMBUL_M] -'Sanitäter' - -[HJ_IS] -~w~IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_PIS] -~w~SUPER IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_DIS] -~w~DOPPELTER IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_PDIS] -~w~SUPER-DOPPEL-IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_TIS] -~w~DREIFACHER IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_PTIS] -~w~SUPER-DREIFACH-IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_QIS] -~w~VIERFACHER IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_PQIS] -~w~SUPER-VIERFACH-IRRSINNS-STUNT-BONUS: $~1~ - -[HJBAD] -~w~Grausige Landung - fast hättest du $~1~ gewonnen! - -[HJUP] -Takeoff health: ~1~ - -[HJDOWN] -Landing health: ~1~ - -[FESZ_LS] -Laden erfolgreich. - -[CEDBUG1] -!!Debug Event!! - -[CEDBUG2] -!!Player is dead or not playing!! - -[CEDBUG3] -!!Player is in INDUSTRIAL level!! - -[CEDBUG4] -Trying to make COLLECTIVE with ~1~ - -[CEDBUG5] -Debug Value: ~1~ - -[CEDBUG6] -Debug Values: A: ~1~ B: ~1~ - -[CEDBUG7] -Debug Values: A: ~1~ B: ~1~ C: ~1~ - -[LINE] -This is Line ~1~ - -[MRACE08] -~w~Komm wieder, wenn du eine Karre hast! - -[MRACE01] -~w~Warte auf ein paar Gegner und dann hupe, um das Rennen zu starten! - -[MRACE02] -~w~Das Rennen beginnt, wenn der erste Spieler hupt. - -[MRACE05] -~r~DU HAST VERLOREN! - -[MRACE07] -~r~Du bist tot! Du Loser! - -[MRACE06] -~r~Du Flasche hast aufgegeben! - -[MRACE09] -~w~Fahr das Rennen weiter! - -[MRACE10] -~w~Du hast (ein Rennen ohne Gegner) gewonnen! - -[MRACEPO] -Platzierung - -[MRCPU03] -DU HAST ALLEN EINGEHEIZT! - -[MRCPU04] -DU STEHST IN FLAMMEN! ( ------- TRASHMASTER ODD-JOB MISSION ------- ) - -[TRASH1] -Turbo-Müll - -[TRASH1A] -~w~Hole die Tonnen ab und bring den Müll zur Mülldeponie. - -[TRASH1C] -~w~Die Zeit läuft, wenn du die erste Tonne abholst. Die REIHENFOLGE IST BELIEBIG. - -[TRASH1G] -~r~Überfordert? Das war eine Leistung für den Müll! - -[TRASH1H] -~r~Die Zeit ist um! - -[TRASH1J] -~r~Du bist zu weit von deiner Route abgewichen! - -[TRASH1K] -~w~Hol die ~g~Tonnen~w~ ab! - -[TRASH1L] -~w~Fahr zurück zur ~y~Mülldeponie! - -[TRASH1M] -~w~Müll abgeholt! +~1~ Sekunden - -[PCJINFO] -~w~Fahr alle 25 ~y~Checkpoints~w~ in ~1~ Sekunden ab. - -[PCJFAIL] -~r~Du hast die Zeit von ~1~ Sek. nicht schlagen können! - -[PCJPROM] -~w~Du hast ~1~ Sekunden, um wieder auf das ~b~Motorrad~w~ zu steigen! - -[PCJPRO1] -~w~Du hast ~1~ Sekunde, um wieder auf das ~b~Motorrad~w~ zu steigen! - -[PCJDEST] -~r~Motorrad zerstört! - -[PCJRET] -~r~Du bist nicht wieder aufs Motorrad gestiegen. - -[PCJTIME] -~r~Die Zeit ist um! - -[PCJCHEC] -~w~Checkpoint ~1~ von ~1~ - -[TRRACE1] -~w~Für jeden abgefahrenen Checkpoint erhältst du einen Zeitbonus... - -[TRRACE3] -~w~Du bist mit einer Restzeit von ~1~ Sek. ins Ziel gekommen! - -[TRRACE4] -~w~Du hast ~1~ von ~1~ Checkpoints als Erster erreicht. - -[TRRACE5] -~w~Das bringt dir $~1~ ein! - -[TRRACE6] -~w~SUPER! Du hast alle Checkpoints als Erster erreicht! Das bringt $1000 Bonus! - -[TRRACE7] -~r~Du hast die Strecke verlassen! - -[TRRACE8] -~r~Dein Motorrad wurde zerstört! - -[TRRACE9] -~r~Du bist nicht rechtzeitig zu deinem Motorrad zurückgekehrt! - -[TRRAC10] -~r~Du hast dein Motorrad verloren! - -[TRRAC11] -~r~Die Zeit ist um! - -[ANG] -Avenging Angels - -[ANG_1] -~w~Hey, Kumpel! Wir säubern diese Stadt vom Verbrechen! - -[ANG_2A] -Drücke~h~ ~k~ ~TGSUB~~w~, um dich den Avenging Angels anzuschließen. - -[ANG_3] -~w~Du und ich könnten diese Stadt alleine aufmischen, aber, äh... holen wir lieber Hilfe, für alle Fälle. - -[ANG_3A] -~w~Bleib neben anderen Avenging Angels stehen, damit sie sich deiner Truppe anschließen. - -[ANG_4] -~w~Yo! Ich bin bei diesem Sauhaufen, um Gesocks aufzumischen. Also los! - -[ANG_5] -~w~Ich bin dabei... - -[ANG_6] -~w~Machen wir ein paar Dreckschweine fertig! - -[ANG_7] -~w~Gesocks aufmischen ist geil! - -[ANG_7A] -~w~Ist das nicht der Hammer?! - -[ANG_7B] -~w~Wir dulden keine Schläger-Gangs auf unseren Straßen! - -[ANG_7C] -~w~Nicht vor meiner Haustür! - -[ANG_7D] -~w~Wird Zeit, dass wir zurückschlagen! - -[ANG_7E] -~w~Wir sind das Gesetz in dieser Stadt! - -[ANG_8] -Zeit - -[ANG_9] -~w~Zeit verlängert! - -[ANG_10] -~r~Die Zeit ist um! - -[ANG_11] -~w~In der Nähe lungert 'ne Meute von 'unerwünschten Elementen' rum... erteilen wir ihnen eine Lektion. - -[ANG_12] -~w~Ein Lynchmob macht Terz auf der Straße! Stellen wir die Idioten ruhig! - -[ANG_13] -~w~Was ist aus dieser Stadt geworden? Denken die Leute, wir hätten Versammlungsfreiheit? Denen zeigen wir's! - -[ANG_13A] -~w~Eine üble Gang wurde beobachtet, wie sie auf der Straße Leute schikaniert hat... - -[ANG_14] -~w~Es wurde wieder ein Verbrechen gemeldet... los! - -[ANG_16] -~w~Es wurden Leute beim Falschparken beobachtet! LOS, KOMMT! - -[ANG_16A] -~w~Ich kenn ein paar Typen, die führen immer was im Schilde. Wird Zeit, dass wir denen eine Abreibung verpassen! - -[ANG_OBJ] -~w~Zieh die unruhestiftende ~r~Gang~w~ aus dem Verkehr. - -[ANG_17] -~w~Gute Arbeit, Kumpel! Dank dir ist diese Gegend sicher. Fürs Erste jedenfalls... - -[ANG_18] -~w~Sie hauen ab! - -[ANG_19] -~w~Suche einen Avenging Angel und stell dich neben ihn, um deine nächste Mission zu erhalten. - -[ANG_20] -~w~Sie suchen das Weite! - -[ANG_21] -~w~Sie dürfen nicht entkommen! - -[VIC1] -Home Sweet Home - -[VIC2] -Slacker - -[VIC3] -Payback-Time - -[VIC4] -Snuff-Movie - -[VIC5] -Eingekesselt - -[VIC6] -Hot Wheels - -[VIC7] -Portland Kettensägen-Maskerade - -[MAR1] -Shopping-Koller - -[MAR2] -Immer Ärger mit Maria - -[MAR3] -Preis-Titten - -[MAR4] -Biker-Trouble - -[MAR5] -Überdosis Trouble - -[SAL1] -Das Angebot - -[SAL2] -Nutten-Express - -[SAL3] -Einschüchterungstaktik - -[SAL4] -Achterbahnfahrt - -[SAL5] -Gratis Stoff - -[SAL6] -Sindacco-Sabotage - -[SAL7] -Trouble mit den Triaden - -[SAL8] -Mr. Leone und sein Chauffeur - -[JDT1] -Pferdchenkontrolle - -[JDT2] -Die Razzia - -[JDT3] -Eine brisante Situation - -[JDT4] -Explodierende 'Dolls' - -[JDT5] -Salvatores Rettung - -[JDT6] -Die Kanonen von Leone - -[JDT7] -Ruhe vor dem Sturm - -[JDT8] -Der Capo in spe - -[MAC1] -Das Riesen-'Baby' - -[MAC2] -Big Stress in Little China - -[MAC3] -Too Much-o Sucho - -[MAC4] -'Schweine'-Fleisch - -[MAC4_0] -Casa - -[MAC5] -Der verstoßene Sohn - -[SALH1] -Kurzer Prozess - -[SALH2] -Arrivederci, Paulie! - -[SALH3] -Shogun Showdown - -[SALH4] -Salvatores Gerichtstermin - -[SALH4_V] -~r~v1.1 - -[SALH5] -Das Sizilianische Gambit - -[SALH5_V] -~r~v1.1 - -[DONH1] -Bauherrenmodell Panlantic - -[DONH2] -Presse-Pressing - -[DONH3] -Auferstehung bis zum Abwinken - -[DONH4] -Bastelzaster - -[DONH5] -Fall auf Knall - -[DONH6] -Love auf der Flucht - -[TOSH1] -Waffen raffen - -[TOSH2] -Knetenfete - -[TOSH2F0] -~r~Ein Van hat den Yakuza-Komplex erreicht! - -[TOSH2F1] -~r~Der Konvoi hat den Yakuza-Komplex erreicht! - -[TOSH2F2] -~r~Du hast die Geldtransporter nicht zerstört! - -[TOSH2M0] -~w~Einer weniger! - -[TOSH2M1] -~w~Noch einer weniger! - -[TOSH3] -Rendezvous mit dem Tod - -[TOSH4] -Kazukis Kassensturz - -[PO_MOB1] -~w~Toni? Hier ist deine Ma! - -[POMOB1A] -~w~Wie lange bist du schon wieder in der Stadt? - -[POMOB1B] -~w~Wieso kommst du mich nicht besuchen? - -[POMOB1C] -~w~Was ist nur los mit dir? - -[POMOB1D] -~w~Ich bin deine Mutter, Himmel noch mal! Wirklich! - -[PO_MOB2] -~w~Hallo, Fiffi! Hier Maria. - -[PO_MOB3] -~w~Hey, Toni! Hier JD. - -[POMOB3A] -~w~Es heißt überall, dass du bald 'ne große Nummer wirst. - -[POMOB3B] -~w~Ich hoffe, du vergisst deinen alten Kumpel JD nicht, wenn du ganz oben bist. Okay? - -[POMOB4A] -~w~Was willst du, verflucht? - -[POMOB4B] -~w~Jemand, der dir deine Wäsche abholt? Oder dir den Arsch abwischt? - -[POMOB4C] -~w~Hab dich nicht so. Hör mal, mir tut das alles Leid... - -[POMOB4F] -~w~Ein schönes Stück Arsenkuchen? - -[POMOB4G] -~w~Vergiss es. - -[POMOB4I] -~w~Salvatore hat davon erfahren und meinte, wir sollten beide erwachsen werden. - -[POMOB4J] -~w~Und das versuch ich hiermit gerade. Es tut mir Leid. Komm! - -[PO_MOB5] -~w~Toni? Hier Salvatore. - -[POMOB5A] -~w~Wir haben schweren Ärger! Beweg deinen Arsch her, pronto! - -[PO_MOB6] -~w~Anthony? Hier Salvatore. - -[POMOB6A] -~w~Hast du Maria gesehen? - -[ST_MOB8] -~w~Ja? - -[STMOB8A] -~w~Toni? Hier Sal. - -[STMOB8B] -~w~Ich muss mit dir reden. Aber diesen Scheiß-Handys trau ich nicht. - -[STMOB8C] -~w~Ich ruf dich in der Telefonzelle vor dem Gericht an. - -[ST_MOB1] -~w~Toni. Donald hier. - -[STMOB1A] -~w~Da wäre eine dringende Sache, bei der ich deine... besonderen Talente brauche. - -[STMOB1B] -~w~Komm bitte baldmöglichst zu mir ins Büro. - -[ST_MOB2] -~w~Ja? - -[STMOB2A] -~w~Cipriani? Ich bin's, McAffrey. - -[STMOB2B] -~w~Ich hab Neuigkeiten, die Salvatore interessieren könnten. - -[STMOB2C] -~w~Komm zu unserem üblichen Treffpunkt. - -[ST_MOB3] -~w~Ja? - -[STMOB3A] -~w~Sal hier. - -[STMOB3B] -~w~Hör zu, die Forellis hatten Bürgermeister Hole in der Tasche. - -[STMOB3D] -~w~Ich kenn 'nen Geschäftsmann - große Nummer - der würd alles tun, um Bürgermeister zu werden. - -[STMOB3E] -~w~Er ist ein komplettes Arschloch, also geeignet für das Amt. - -[STMOB3F] -~w~Ich hab ihm gesagt, du sorgst dafür, dass er die Wahl gewinnt... für uns! - -[ST_MOB4] -~w~Hallo. - -[STMOB4A] -~w~Toni. Ich bin's, Sal. - -[STMOB4B] -~w~Ich riech, dass die Forellis hinter der Scheiße stecken, in der ich sitze. - -[STMOB4C] -~w~Was ich wissen will, ist: warum haben sie dafür gesorgt, dass mir der Bürgermeister die Hölle heiß macht? - -[STMOB4D] -~w~Hör zu, wir treffen uns unten am Pier. - -[STMOB4E] -~w~Und betreiben ein bisschen Recherche. - -[ST_MOB5] -~w~Yo! - -[STMOB5B] -~w~Fahr rüber zur Telefonzelle in Torrington. - -[STMOB5C] -~w~Wir müssen reden. - -[STMOB5D] -~w~Fahr auf dem Weg noch bei einem Geschäftsfreund von mir in Aspatria vorbei. - -[STMOB5E] -~w~Er wird uns helfen, die Sindaccos und Forellis unter Druck zu setzen. - -[ST_MOB6] -~w~Ja? - -[STMOB6A] -~w~Toni? Hier Sal. - -[STMOB6B] -~w~Fahr zur Telefonzelle auf dem Liberty Campus. - -[STMOB6C] -~w~Es ist wichtig. - -[ST_MOB7] -~w~Ja? - -[STMOB7A] -~w~Toni? Sal hier. - -[STMOB7B] -~w~Fahr rüber nach Belleville, zu der Telefonzelle dort. - -[STMOB7C] -~w~Du musst dringend was für mich erledigen. - -[ST_MOB9] -~w~Hier Toni Cipriani. - -[STMOB9A] -~w~Toni? Hier ist deine Ma. - -[STMOB9B] -~w~Ich hab's eben gehört. Du bist Capo geworden. - -[STMOB9C] -~w~...Ich habe keine Sekunde an dir gezweifelt, mein Sohn! - -[STMOB9D] -~w~...und wo du dich jetzt endlich bewährt hast, - -[STMOB9E] -~w~ruf ich die Killer zurück, die ich auf dich angesetzt hatte. - -[STMOB9F] -~w~Vergessen wir das Ganze. - -[STMOB9G] -~w~Schließlich hab ich ja nur dein Bestes gewollt. - -[STMOB9H] -~w~Ah, was sind das für Söhne, die ihre Mutter so weit bringen? - -[STMOB9I] -~w~Bis bald, mein Sohn. Vergiss deine alte Ma nicht. - -[STMO10] -~w~Ja? - -[STMO10A] -~w~Hey, Großmaul. McAffrey hier. - -[STMO10B] -~w~Das FBI ist deinem Boss Salvatore draufgekommen. - -[STMO10C] -~w~Und die sind stinksauer. - -[STMO10D] -~w~Die hängen ihm jetzt ungefähr jedes Verbrechen in dieser Stadt an. - -[STMO10E] -~w~Also, wir kennen uns nicht. Klar? - -[SH_MOB1] -~w~Toni...? - -[SHMOB1A] -~w~Sal? Bist du das? - -[SHMOB1B] -~w~Hey, Schnauze! Ich sprech mit meinem Anwalt! - -[SHMOB1C] -~w~Toni? ...Ich meine, äh... Lionel? - -[SHMOB1D] -~w~Hör zu. Sie haben mich erwischt. Ist das zu fassen? - -[SHMOB1E] -~w~Ich steck schwer in der Scheiße. - -[SHMOB1F] -~w~Also beweg deinen Arsch hierher, du musst was für mich erledigen. - -[SHMOB1G] -~w~...Lionel? - -[SH_MOB2] -~w~Ja? - -[SHMOB2A] -~w~Toni? Hier Donald. - -[SHMOB2B] -~w~Nein, warte! Leg nicht auf! - -[SHMOB2C] -~w~Ich hab ein sehr verlockendes Angebot für dich... - -[SHMOB2D] -~w~Komm bitte zu meinem augenblicklichen... ähm... Wohnsitz und ich erklär dir alles. - -[SHMOB2E] -~w~Toni...? - -[SHMOB2F] -~w~Bitte, Toni, hab Erbarmen. Ich ruf mit meinem letzten Groschen a-... - -[SH_MOB3] -~w~Ist da Mr. Cipriani? - -[SHMOB3A] -~w~Wer ist da? Woher haben Sie meine Nummer? - -[SHMOB3B] -~w~Geht man mit dem nötigen Willen zu Werke, so erreicht man allerlei. - -[SHMOB3C] -~w~Das brauche ich ja Ihnen nicht zu sagen, Mr. Cipriani. - -[SHMOB3D] -~w~Ich benötige Ihre Hilfe in einer delikaten Angelegenheit. - -[SHMOB3E] -~w~Und für diese Hilfe werden Sie reich belohnt. - -[SHMOB3F] -~w~Alles Weitere, wenn Sie bei meiner Wohnung in Torrington eintreffen. - -[SH_MOB4] -~w~Toni! Hier ist Sal! - -[SHMOB4A] -~w~Du hast es geschafft! Nicht zu fassen! - -[SHMOB4B] -~w~Wir sind fast aus dem Schneider! - -[SHMOB4C] -~w~Komm zu mir. Wir müssen nur noch ein paar Kleinigkeiten regeln. - -[SH_MOB5] -~w~Toni? Donald hier. - -[SHMOB5A] -~w~Wenn der Panlantic-Deal zustande kommen soll, müssen wir, ähm... - -[SHMOB5B] -~w~wie drück ich das am vorsichtigsten aus... - -[SHMOB5C] -~w~ein kleines Areal in Fort Staunton 'räumen'. - -[SHMOB5D] -~w~Mit 'wir' meinen Sie mich, stimmt's? - -[SHMOB5E] -~w~Toni, du hast mich durchschaut. - -[SHMOB5F] -~w~Fahr zu 8-Ball. Er kann uns das nötige Werkzeug sicher beschaffen. - -[SHMOB5G] -~w~I'm sure he can provide us with the necessary hardware. - -[SH_MOB6] -~w~Mein Alter? Hier ist 8-Ball. - -[SHMOB6A] -~w~Dein Werkzeug liegt abholbereit. - -[AHIT_H0] -~w~Hast du nicht mehr drauf, Arschgesicht? - -[AHIT_H1] -~w~Zum Kuckuck! Wann geben die Idioten endlich auf? - -[AHIT_H2] -~w~Leck mich am Arsch, Wichskopf! - -[AHIT_H3] -~w~Langsam geht ihr mir auf den Sack! - -[AHIT_BI] -~w~Sei auf der Hut! Einer von Mas Killern ist in der Nähe! - -[AHIT_TA] -~w~Halte die Augen offen! Einer von Mas gedungenen Mördern ist in der Nähe! - -[AHIT_BU] -~w~Pass auf! Einer von Mas Killern ist im Anmarsch! - -[AHIT_AM] -~w~Vorsicht! Einer von Mas Auftragskillern hat dich gesehen! - -[AHIT_VA] -~w~Sei wachsam! Einer von Mas Killern ist in der Gegend! - -[AHIT_PO] -~w~Gib Acht! Einer von Mas Killern will dich aufs Korn nehmen! - -[AHIT_CA] -~w~Pass auf! Einer von Mas Attentätern nähert sich dir! - -[K_TKT] -Schrottplatz-Challenge - -[K_TK2] -~w~Fahr durch die Markierungen, um Punkte zu sammeln. - -[K_TK4] -~w~Sammle möglichst viele Punkte, bevor die Zeit abgelaufen ist! - -[K_CD] -~w~Du hast ~1~ Sekunden, um zu deinem ~b~Motorrad~w~ zurückzukehren! - -[K_TKP1] -~w~1 Punkt! - -[K_TKP2] -~w~2 Punkte! - -[K_TKP3] -~w~3 Punkte! - -[K_SC] -Punkte - -[K_SCX] -~w~Du hast ~1~ Punkte erzielt! - -[K_SCX1] -~w~Du hast 1 Punkt erzielt! - -[K_HSC1] -~w~Neuer High Score von ~1~ Punkten! - -[K_HSC2] -~r~Du konntest den High Score von ~1~ Punkten nicht übertreffen. - -[KRUSH] -Du bekommst nun viermal so viel Geld, wenn du die Schrottpresse benutzt. - -[KRUSH2] -Du bekommst nun achtmal so viel Geld, wenn du die Schrottpresse benutzt. - -[TURFAIL] -~r~JOB BEENDET! - -[TKR1] -Jagdszenen in 9mm - -[TKR2] -Scooter Shooter - -[TCKILL] -Hits - -[TCHEAL] -Schaden - -[TC2_1] -~r~Du hast deinen Fahrer umgebracht! - -[TC2_2] -~r~Fahrzeug zerstört! - -[TC2_3] -~r~Die Zeit ist um! - -[TC_T_E] -~w~Ziel eliminiert! $~1~ - -[TUP_BR] -~w~Eliminiere so viele ~r~Ziele ~w~wie möglich innerhalb des Zeitlimits. - -[TUP_BR2] -~w~Eliminiere mehr als ~1~ ~r~Ziele ~w~für einen neuen High Score! - -[TUP_AD] -~w~Du hast 3 Adrenalin-Pillen. Drücke die R1-Taste, um eine zu nehmen. - -[TUPSC1] -~w~Neuer High Score von ~1~ Hits! - -[TUPSC2] -~r~Du konntest den High Score von ~1~ Hits nicht übertreffen. - -[MPWCS1] -The Wedding List - -[MPWCS2] -Hey, wie geht's? - -[MPWCS3] -Hör mal, mein Sohn Joey heiratet! - -[MPWCS4] -Ich hab ein klasse Mädchen für ihn ausgesucht, genau wie meine Maria... Kann's kaum erwarten, die beiden bekannt zu machen. - -[MPWCS5] -Ich will nur nicht, dass sie ihn mit einem von den Schrottkarren rumfahren sieht, die er in seiner Werkstatt zusammenflickt. - -[MPWCS6] -Deshalb gehst du mal in der Stadt nach einem anständigen Auto schauen. - -[MPWCS7] -Soll dein Schaden nicht sein. - -[MPTCS1] -Tanks for the Memories - -[MPTCS2] -Hier Sal. Ich brauch einen, der die Bullen ablenkt und das machst du. - -[MPTCS3] -Ich hab am anderen Ende der Stadt einen Panzer stehen. Richte ordentlich Verwüstung damit an! - -[MPTCS4] -Die Leute sollen denken, sie hätten auf General Pattons Grab gepinkelt. - -[MPTCS5] -Dieses Ablenkungsmanöver ist sehr wichtig. Deshalb hab ich auch noch andere engagiert, um das Ding zu fahren. - -[MPTCS6] -...aber ich zahl nur den, der am längsten hinterm Steuer hockt. - -[MPRCS1] -Street Rage - -[MPRCS2] -Hier spricht Salvatore Leone! Euer nimmermüder Wohltäter. - -[MPRCS3] -Glaubt dem Staatsanwalt kein Wort! - -[MPRCS4] -Ich bin ein guter und großzügiger Freund Liberty Citys. Deshalb sponsere ich dieses tolle Rennen heute. - -[MPRCS5] -Wie viel kostet mich der Scheiß? - -[MPRCS6] -WAS?! Holt den Notarzt! Ich hab Herzstechen! - -[MPHPCS2] -Hier Sal... das FBI hat mein Telefon angezapft, deshalb kein Klartext - -[MPHPCS3] -Unter dem Telefon ist eine Aktentasche voller Präsidentenporträts und eine Liste mit Namen. Jetzt rate, was ich will... - -[MPHPCS4] -Warte! Nicht, dass du jetzt das Geld an die Wichser auf der Liste verteilst! - -[MPHPCS5] -Ich meine... der Anblick von RADIESCHEN, der hat doch was... - -[MPHPCS6] -Warte! Nicht, dass du jetzt Radieschen kaufst! Die sollen sich die von... ähm... - -[MPHPCS7] -Ach, leg die Wichser auf der Liste einfach alle um! - -[DEB0] -DEBUG 0 - -[DEB1] -DEBUG 1 - -[DEB2] -DEBUG 2 - -[DEB3] -DEBUG 3 - -[DEB4] -DEBUG 4 - -[NUM0] -DEBUG 0 (~1~) - -[NUM1] -DEBUG 1 (~1~) - -[NUM2] -DEBUG 2 (~1~) - -[NUM3] -DEBUG 3 (~1~) - -[NUM4] -DEBUG 4 (~1~) - -[CARS] -'Autohändler' - -[BIKE] -'Motorradhändler' - -[RACE_0] -Platzierung - -[RACE_FL] -~w~LETZTE RUNDE - -[RACE_X0] -~w~Schnapp dir ein Auto und fahr zur ~y~Startlinie! - -[RACE_X1] -~w~Schnapp dir ein Motorrad und fahr zur ~y~Startlinie! - -[RACE_X2] -~w~Du brauchst ein Auto für dieses Rennen! - -[RACE_X3] -~w~Du brauchst ein Motorrad für dieses Rennen! - -[RACE_X4] -~w~Du hast ~1~ Sekunden, um ein Auto zu finden. - -[RACE_X5] -~w~Du hast ~1~ Sekunden, um ein Motorrad zu finden. - -[RACE_X6] -~w~Du hast 1 Sekunde, um ein Auto zu finden. - -[RACE_X7] -~w~Du hast 1 Sekunde, um ein Motorrad zu finden. - -[RACE_T0] -~r~Du bist nicht Erster geworden! - -[RACE_T1] -~r~Du wirst disqualifiziert, weil du dein Auto verlassen hast. - -[RACE_T2] -~r~Einer der Fahrer ist gestorben - das Rennen wird abgeblasen! - -[RACE_T3] -~r~Du wirst disqualifiziert, weil du dein Motorrad verlassen hast. - -[RACE_Y3] -~w~3 - -[RACE_Y2] -~w~2 - -[RACE_Y1] -~w~1 - -[RACE_Y] -~w~LOS! - -[RACE_Z1] -~w~1. PLATZ - -[RACE_Z2] -~w~2. PLATZ - -[RACE_Z3] -~w~3. PLATZ - -[RACE_Z4] -~w~LETZTER PLATZ - -[RACE_R1] -~w~REKORD: ~1~:~1~~1~ NEUER REKORD! - -[RACE_R2] -~w~NEUER REKORD! - -[RACE_S0] -~w~ZEIT: ~1~:~1~~1~ - -[RACE_S1] -~w~BESTE RUNDE: ~1~:~1~~1~ - -[RAC1] -Low Rider Rumble - -[RAC2] -Deimos Dash - -[RAC3] -Wi-Cheetah Run - -[BIK1] -Rotlicht-Racing - -[BIK2] -Torrington TT - -[BIK3] -Gangsta GP - -[TT1] -Krasses Gelände - -[TT1_A1] -~w~< STRECKE ~1~ > - -[TT1_B1] -~w~Strecken-Ziel: ~1~:~1~ - -[TT1_B1A] -~w~Strecken-Ziel: ~1~:0~1~ - -[TT1_B2] -~w~Streckenbestzeit: ~1~:~1~ - -[TT1_B2A] -~w~Streckenbestzeit: ~1~:0~1~ - -[TT1_B3] -~w~Rundenbestzeit: ~1~:~1~ - -[TT1_B3A] -~w~Rundenbestzeit: ~1~:0~1~ - -[TT1_B4] -~w~~1~:~1~ - -[TT1_B4A] -~w~~1~:0~1~ - -[TT1_B5] -~w~Neuer Streckenrekord! ~1~:~1~ - -[TT1_B5A] -~w~Neuer Streckenrekord! ~1~:0~1~ - -[TT1_L] -~r~Nicht verfügbar. - -[A_PISTO] -~w~< Pistole > - -[A_UZI] -~w~< Micro SMG > - -[A_AK] -~w~< AK > - -[A_SNIPE] -~w~< Präzisionsgewehr > - -[A_GRENA] -~w~< Granaten > - -[A_ARMOU] -~w~< Kugelsichere Weste > - -[A_ROCKE] -~w~< Raketenwerfer > - -[A_SHOTG] -~w~< Schrotflinte > - -[A_M4] -~w~< M4 > - -[A_FLAME] -~w~< Flammenwerfer > - -[A_MINIG] -~w~< Minigun > - -[A_COST] -~w~Preis: ~h~$~1~ - -[A_COST2] -~w~Preis: ~h~$~1~ ~n~ ~r~Deine augenblickliche Waffe wird durch diese ersetzt. - -[A_COST3] -~w~Preis: ~h~$~1~ ~n~ ~r~Deine kugelsichere Weste ist in guter Verfassung. - -[A_COST4] -~w~Preis: ~h~$~1~ ~n~ ~r~Das kannst du dir nicht leisten. - -[A_STOCK] -~r~Nicht vorrätig. - -[A_VIC4] -~w~Eine Pistole kostet normalerweise $240, aber die geht auf Vincenzo. - -[A_DONS4] -~w~Donald Love hat dafür schon bezahlt. - -[A_NEDS4] -~w~Irgendein Kirchentyp hat einen davon für dich reservieren lassen. - -[A_TALK1] -~w~Ich hab alles, was man zur Selbstverteidigung braucht. - -[A_TALK2] -~w~Brauchen Sie auch 'nen Waffenschein? - -[A_TALK3] -~w~Ausweis ist nicht nötig. Sie sehen vertrauenswürdig aus. - -[A_TALK4] -~w~Probieren Sie doch unseren Schießstand hinterm Haus aus. - -[BENZ_GO] -~w~Wechsle deine Kleidung! - -[PIZ_B01] -~w~Du hast ~1~ Sekunde, um zu dem ~b~Pizza-Moped~w~ zurückzukehren! - -[PIZ_B02] -~w~Du hast ~1~ Sekunden, um zu dem ~b~Pizza-Moped~w~ zurückzukehren! - -[PIZ_F04] -~r~Du bist nicht rechtzeitig zu dem Pizza-Moped zurückgekehrt! - -[NDL_B01] -~w~Du hast ~1~ Sekunde, um zu dem ~b~Nudel-Moped~w~ zurückzukehren! - -[NDL_B02] -~w~Du hast ~1~ Sekunden, um zu dem ~b~Nudel-Moped~w~ zurückzukehren! - -[NDL_F04] -~r~Du bist nicht rechtzeitig zu dem Nudel-Moped zurückgekehrt! - -[EXPO_D] -~w~Hier, Finderlohn: $~1~! Wenn du alle auf der Liste abgeliefert hast, gibt's einen Bonus! - -[PUPSPN] -~w~POWERUP ERSCHIENEN! - -[PUPMEGA] -~y~MEGA-SCHADEN! - -[PUPREGN] -~y~SCHNELLERHOHLUNG! - -[PUPINVS] -~y~UNSICHTBARKEIT! - -[PUPFREZ] -~y~RAKETEN-SPECIAL! - -[MPK] -erledigte - -[MPKHEAD] -mit einem entscheidenden Treffer! - -[MPNEED] -braucht nur noch - -[MPNAME] -Name - -[MPSCORE] -Score - -[MPPING] -Ping - -[MPCPS] -Checkpoints - -[MPTIME] -Zeit - -[MPBONUS] -Bonus - -[MPQG] -Spiel beenden? - -[MPQUIT] -Beenden - -[MPCONT] -Fortsetzen - -[MPHIGH] -Längste Zeit - -[MPBY] -von - -[MPOVER] -Game Over - -[MPFIRST] -war als Erster fertig - -[MPWITH] -siegt mit $ - -[MPHP05] -~w~5 Sekunden, bis einer markiert wird. - -[MPHP04] -~w~4 Sekunden, bis einer markiert wird. - -[MPHP03] -~w~3 Sekunden, bis einer markiert wird. - -[MPHP02] -~w~2 Sekunden, bis einer markiert wird. - -[MPHP01] -~w~1 Sekunde, bis einer markiert wird. - -[RCRANGE] -~w~Außer Reichweite! - -[CAD5_AA] -Sal hier. - -[CAD5_AB] -Diese Forellis haben mich geärgert! Dafür werden sie bezahlen! - -[CAD5_AC] -Ich will, dass du ihre edelsten Karren klaust... - -[CAD5_AD] -...und sie zu ihren Hauptkonkurrenten beim Sindacco-Autohof bringst. - -[CAD5_AE] -Aber sorg dafür, dass die Forellis nicht aus Rache irgendwelche Sindacco-Karren klauen. - -[CAD5_AF] -Capiche? - -[CAD4_AA] -Ich bin's, Sal. - -[CAD4_AB] -Ich bin Franco Forelli was schuldig, und du wirst mir helfen, die Schuld zu begleichen. - -[CAD4_AC] -Drüben im Sindacco-Autohof haben sie ein paar richtig edle Karren. - -[CAD4_AD] -Ich will, dass du die alle klaust und sie zum Forelli-Parkplatz bringst. - -[CAD4_AE] -Und sorg dafür, dass keine Forelli-Fahrzeuge gestohlen werden, während du dort bist. - -[CAD4_AF] -Hey, vermassle das bloß nicht. - -[MPC_000] -Toni - -[MPC_001] -'Lionel' - -[MPC_002] -Cipriani - -[MPC_003] -Chauffeur - -[MPC_004] -13. - -[MPC_005] -Smoking Toni - -[MPC_006] -Fury - -[MPC_007] -The King - -[MPC_008] -Cocks - -[MPC_009] -Flitzer - -[MPC_010] -'T' - -[MPC_011] -Dragon - -[MPC_012] -JD - -[MPC_013] -Der Sexsklave - -[MPC_014] -Avery - -[MPC_015] -Choc-Choc - -[MPC_016] -8-Ball - -[MPC_017] -Maria - -[MPC_018] -'Hamfists' - -[MPC_021] -Nr. 1 - -[MPC_023] -Hung Lo - -[MPC_025] -Yamazaki - -[MPC_031] -Officer '69' - -[MPC_032] -Der Spezialist - -[MPC_034] -G.I. Jones - -[MPC_035] -Sam - -[FEA_FM0] -HEAD RADIO - -[FEA_FM1] -DOUBLE CLEF FM - -[FEA_FM2] -K-JAH - -[FEA_FM3] -RISE FM - -[FEA_FM4] -LIPS 106 - -[FEA_FM5] -RADIO DEL MUNDO - -[FEA_FM6] -MSX 98 - -[FEA_FM7] -FLASHBACK FM - -[FEA_FM8] -THE LIBERTY JAM - -[FEA_FM9] -LCFR - -[MRACELA] -Runde - -[DTB_01] -~w~Verteidige eure Basis gegen feindliche Angreifer. - -[DTB_02] -~w~Verteidige eure Autos unter allen Umständen. - -[CAD2_AB] -~w~Gute Nachrichten - die Forellis und die Sindaccos gehen sich gerade wieder an die Gurgel! - -[CAD2_AC] -~w~Beide wollen sämtliche Autohäuser in Liberty übernehmen. - -[CAD2_AD] -~w~Und da wir vorige Woche den Forellis 'assistiert' haben... - -[CAD2_AE] -~w~...sollen jetzt die Sindaccos zu ihrem Recht kommen. - -[CAD2_AF] -~w~Hilf den Sindaccos, den Forelli-Autohof auszuräumen. - -[POMOB6B] -~w~Ich schwör's dir, die Schlampe lässt sich nur blicken, wenn sie wieder Geld braucht! - -[POMOB2A] -~w~Salvatore hat mir deine Nummer gegeben... naja, ich hab sie in seinem Adressbuch gefunden. Aber egal! - -[POMOB2B] -~w~Du bist doch sein neuer Fiffi, oder? Und ich will mit dir Gassi gehen. - -[POMOB2C] -~w~Ich erwarte dich in Kürze. - -[GS_RGUN] -MIT WAFFEN STARTEN: - -[TUSHTK] -Angel auf Abwegen - -[SC_WICH] -High-Score bei 'Angel auf Abwegen' - -[NE_WIFI] -Ein Netzwerkfehler ist aufgetreten. Der WLAN-Schalter ist AUS. Bitte schalte den WLAN-Schalter AN, um Multiplayer-Spiele zu spielen. - -[BNDRAC0] -Thrashin' RC - -[BNDRAC1] -Ragin' RC - -[BNDRAC2] -Chasin' RC - -[GS_G1] -LIBERTY CITY SURVIVOR - -[GS_G2] -STREET RAGE - -[GS_G3] -PROTECTION RACKET - -[GS_G4] -GET STRETCH - -[GS_G5] -TANKS FOR THE MEMORIES - -[GS_G6] -THE HIT LIST - -[GS_G7] -THE WEDDING LIST - -[TRCR1] -~w~1 - -[TRCR2] -~w~2 - -[TRCR3] -~w~3 - -[TRCRGO] -~w~LOS! - -[GA_16] -~w~Das Umspritzen ist gratis. - -[NEW_TAX] -~w~Taxi-Mission abgeschlossen! Mean Street Taxis haben ein neues Fahrzeug zu ihrem Depot in Trenton geliefert bekommen! - -[EXPO_2] -~w~Wenn du ihnen die Fahrzeuge, die sie brauchen, in gutem Zustand lieferst, erhältst du eine Belohnung. - -[FEMP_NC] -Netzwerkverbindungen werden aufgebaut...Bitte warten - -[C1TGSUB] -die R3-Taste - -[C2TGSUB] -R3-Taste - -[C3TGSUB] -~S~ - -[C2VEHN] -R1-Taste - -[C2VECRS] -L3-Taste - -[C3VECRS] -~O~ - -[C2PDCWE] -L2-Taste und R2-Taste - -[C3PDCWE] -L2-Taste und R2-Taste - -[BENZ_LA] -~w~Die ~h~Anwalts-Aufmachung~w~ ist jetzt im Versteck verfügbar. - -[BENZ_TR] -~w~Deine ~h~Freizeitkleidung~w~ ist jetzt im Versteck verfügbar. - -[SLH1_OU] -~w~Du wirst eine ~h~Anwalts-Aufmachung~w~ brauchen, um zu Sal gelassen zu werden. - -[SLH1_OR] -~w~Du brauchst eine ~h~Anwalts-Aufmachung~w~, um Sal besuchen zu können. - -[L_TRN_1] -~w~Mit der ~h~Hochbahn~w~ kannst du in Portland herumfahren. Drücke~h~ ~k~ ~VEEE~~w~, um in einen Zug ein- oder auszusteigen. - -[HELP2] -~w~Drücke~h~ ~k~ ~PDSPR~~w~, um zu ~h~sprinten. - -[STMOB5A] -~w~Toni, Sal. - -[SCH_TK7] -~r~Du hast den Schrottplatz verlassen. - -[STMOB3C] -~w~Aber jetzt tanzt das Rathaus bald nach unserer Pfeife. - -[SALH3A] -~w~Besorg ein Fahrzeug für Donald. - -[MPCASH] -Geld - -[MPCARS] -Autos - -[CRUSHED] -Schrottwert $~1~ - -[BENZ_BO] -~w~Zieh dir im Versteck frische ~h~Unterwäsche~w~ an. - -[BENZ_EL] -~w~Der ~h~King-Overall~w~ ist jetzt im Versteck verfügbar. - -[BENZ_CO] -~w~Ein ~h~Cox-Maskottchen-Kostüm~w~ ist jetzt im Versteck verfügbar. - -[BENZ_HE] -~w~Avenging Angel-Mission: Shoreside - Level 15 abgeschlossen! Das ~h~Superheldenkostüm~w~ ist jetzt im Versteck verfügbar. - -[BENZ_DR] -~w~Das ~h~Dragon-Outfit~w~ ist jetzt im Versteck verfügbar. - -[TRTIT] -Triaden-Trial - -[TRRACE2] -~w~Vorsicht! Die Wong-Brüder sehen fies aus... - -[MPTOTAL] -Gesamtzeit - -[TOUR_W6] -~w~Einzigartiger gepanzerter Landstalker in deinem Versteck angeliefert. Du solltest ihn in deiner Garage aufbewahren! - -[OUTFITS] -Freigeschaltete Outfits - -[MPHPMAR] -ist als Ziel markiert worden. - -[FEC_CWT] -Waffen/Ziele auswählen - -[EXPO_1] -~w~Love Media braucht Preise zum Verschenken für ihre 'Koole-Karren- Verschenk'-Konkurrenz! - -[PCJLAP] -~w~Neuer Rekord von ~1~ Sekunden! - -[MPBLCAR] -Blaues Auto: - -[MPRDCAR] -Rotes Auto: - -[RAMP_A] -~w~ALLE SPEZIALAUFTRÄGE ERFÜLLT! $~1~ - -[FET_SAV] -Spiel speichern - -[FET_WRN] -Achtung! Einer oder mehrere Cheats wurden aktiviert. Dies könnte Auswirkungen auf den Spielstand haben. Es wird empfohlen, dieses Spiel nicht zu speichern. - -[HELP39] -~w~Mit~h~ ~k~ ~VEWEI~ ~w~verlagerst du dein Gewicht auf einem Motorrad. +[HORN3] +Drück die ~h~~k~~VEHICLE_HORN~~w~, um zu ~h~hupen. [FEC_EXV] -Fahrzeug verlassen +In Fahrzeug ein- und aussteigen. -[MPCOLL] -PKW ZU SAMMELN: +[TAXI_M] +'TAXIFAHRER' -[FEMP_HG] -SPIEL HOSTEN +[COP_M] +'BÜRGERWEHR' -[FEMP_JG] -MITSPIELEN +[FIRE_M] +'FEUERWEHRMANN' -[K_TK3] -~w~1 Punkt für ~g~grün~w~, 2 Punkte für ~y~gelb~w~ und 3 Punkte für ~r~rot. +[AMBUL_M] +'SANITÃTER' -[FEMP_GJ] -SPIEL ZUM MITSPIELEN AUSWÄHLEN +[HJ_IS] +IRRSINNS-STUNT-BONUS: $~1~ -[FEMP_H] -HOST: +[HJ_PIS] +SUPER IRRSINNS-STUNT-BONUS: $~1~ -[FEMP_P] -SPIELER: +[HJ_DIS] +DOPPELTER IRRSINNS-STUNT-BONUS: $~1~ -[FEMP_HN] -EIN NEUES SPIEL HOSTEN +[HJ_PDIS] +SUPER-DOPPEL-IRRSINNS-STUNT-BONUS: $~1~ -[PO_MOB4] -~w~Hey, ich bin's, Vincenzo. +[HJ_TIS] +DREIFACHER IRRSINNS-STUNT-BONUS: $~1~ -[POMOB4D] -~w~Los. Komm bei mir vorbei. Ich hab was für dich. +[HJ_PTIS] +SUPER-DREIFACH-IRRSINNS-STUNT-BONUS: $~1~ -[POMOB4E] -~w~Ach, ja? Was denn? Ein Paar Zementstiefel? +[HJ_QIS] +VIERFACHER IRRSINNS-STUNT-BONUS: $~1~ -[POMOB4H] -~w~Nein. Komm, Toni, was da passiert ist, tut mir echt Leid. +[HJ_PQIS] +SUPER-VIERFACH-IRRSINNS-STUNT-BONUS: $~1~ -[FEMP_F] -VOLL +[FESZ_LS] +Ladevorgang beendet. -[FEMP_R] -STANDARD WIEDERHERSTELLEN +[HELI_1A] +Teste dein Können mit dem 'Sparrow'. Probiere, wie schnell du den Kurs abfliegen kannst. -[YOU] -DU +[HELI_1B] +Kurs absolviert! -[NE_POW] -Ein Netzwerk-Fehler ist aufgetreten. Der POWER-/HOLD-Schalter wurde AUSGESCHALTET. +[HELIODD] +Helikopter-Jobs -[FEMP_SQ] -Wirklich ein Multiplayer-Spiel starten? +[LAW] +DIE ANWALTSMISSIONEN -[BIKETXT] -~w~Hogs & Cogs hat nur zwischen 08:00 Uhr und 18:00 Uhr offen. Komm dann wieder! +[LAW1_1] +~g~Besorge dir neue Sachen in Rafaels Shop. -[RACE_2] -Zeit +[LAW4_6] +Nieder mit der Geschãftsleitung! -[FEF_CO2] -Wähle das Steuerungs-Setup, das zu deinem Spielstil am besten passt +[LAW4_7] +Tod den Bossen! -[TYREPOP] -Zerschossene Reifen +[LAW4_8] +Kampf, Kampf, Kampf, Kampf! -[FE_INIP] -Initialisiere und lade Pausenmenü. Bitte warten. +[LAW4_9] +Mehr Urlaub, weniger Arbeit! -[DON4EX3] -~w~Nimmst du Schecks? +[LAW4_11] +Kampf, Kampf, Kampf, Kampf! -[CRUSH] -~w~Mach Geld mit Schrott! Bestimmte Fahrzeuge werden verschrottet, wenn sie in der von Reifen markierten Zone abgestellt werden. +[LAW4_12] +Es lebe die Revolution! -[ANG_15] -~w~Eine Bande Idioten hat einem armen Kerl das Auto geklaut... denen zeigen wir's! +[GENERAL] +DIE COLONEL-MISSIONEN -[CDERROR] -Bitte warten... +[GEN3_4] +Tommy Vercetti. Los, komm... -[FEC_LOF] -Nach vorne schauen +[GEN3_13] +Was ist los, Mann?! Steig auf das Dach gegenüber im Hof bevor sie kommen! -[FEC_LFA] -Schauen/Feinzielen +[GEN3_17] +Mist! Willst du mich umbringen?! -[MPHELP] -HILFE +[GEN3_21] +~g~Er hat Diaz' Geld! Stelle ihn und hole es zurück! -[C1VEHN] -L1-Taste +[GEN3_24] +~r~Diaz hat's erwischt! Du hast versagt! -[C3VEHN] -L3-Taste +[GEN3_26] +~r~Du hast Diaz erwischt! -[MPOBJ] -MISSIONSZIEL: +[GEN3_27] +~r~Du hast Diaz' Bodyguards erwischt! -[MPLEG] -RADARLEGENDE: +[GEN3_31] +~g~Begib dich zum Übergabeort und pass auf Diaz auf. -[GS_O1] -Jeder für sich! Erledige die anderen Spieler! +[GEN3_32] +~g~Begib dich zu deinem Beobachtungsposten auf dem Dach des Gebãudes gegenüber von Lance. -[GS_O2] -Fahr die Checkpoints ab und erreiche die Ziellinie als Erster. +[COKE] +DIE KOKS-BARON-MISSIONEN -[GS_OD3] -Verteidige die vier Limos in eurer Basis vor heranrückenden Angreifern. +[COK1_3] +Ich hoffe, du brichst dir das Genick! -[GS_O6] -Erledige schnellstmöglich den 'markierten' Spieler. Der 'Markierte' muss überleben, so lange er kann. +[COK1_6] +Ich hab diese Idioten satt! -[GS_O7] -Schnapp dir über die Stadt verstreute Autos, dann fahr sie in die bereitstehenden Container. +[COK2_7] +Siehst du diese Bojen? Versuch, die Lichter auszuschießen. -[FHOSE_2] -~h~~k~ ~VEWEA~~w~, um mit der Kanone zu zielen. +[COK2_10] +Eines ist sicher: Du schießt besser als du laberst. -[MPI01] -POWERUP +[COK2_11] +Danke. Du bist ein echter Charmeur. -[MPI02] -GESUNDHEIT +[COK2_12] +Ich weiß, Tommy. -[MPI03] -PANZERUNG +[COK2_18] +Stehst du auf Kenny Loggins? -[MPI04] -WAFFE +[COK2_19] +Mann, ich liebe diese Scheibe. -[SPIDER] -Deimos SP +[COK2_26] +~r~Du hast Lance erwischt! -[PONTIAC] -Phobos Vt +[COK3_1] +Nicht schießen, Mann! -[FORELLI] -Forelli ExSess +[COK3_2] +Was ist in dem Zeug drin? -[AHIT_LO] -Fürs Erste bist du ihn vielleicht los, aber er wird wiederkommen, um den Job zu beenden. +[COK3_3] +Er klaut das Boot. Mist! -[FEM_ROF] -Radio aus +[COK3_4] +Hilfe! Irgendein Irrer stiehlt das Boot, Mann! -[GA_1] -~w~Das soll wohl 'n Witz sein! Das Ding rühr ich nicht an! +[COK4_W] +Uff! Das ist der letzte. -[TRA_NEX] -Nächster Halt: +[COK4_X] +Ich lass die Mühle an. -[TRA_CUR] -Derzeitiger Halt: +[COK4_Y] +Ich glaube, wir haben ein paar neue Freunde. -[PAGEB2] -~w~Die ~h~Schrotflinte~w~ ist jetzt in deinem Versteck verfügbar! +[COK4_2] +Ja. -[PAGEB3] -~w~Die ~h~Kugelsichere Weste~w~ ist jetzt in deinem Versteck verfügbar! +[COK4_6] +Weißt du, wo's lang geht? -[PAGEB4] -~w~Die ~h~SMG~w~ ist jetzt in deinem Versteck verfügbar! +[COK4_7] +Haben wir uns verfahren? -[PAGEB5] -~w~Die ~h~.357~w~ ist jetzt in deinem Versteck verfügbar! +[COK4_8] +Wir haben Konkurrenz bekommen! -[PAGEB6] -~w~Das ~h~M4~w~ ist jetzt in deinem Versteck verfügbar! +[COK4_9] +Knöpf sie dir vor! -[PAGEB7] -~w~Das ~h~Präzisionsgewehr mit Laservisier~w~ ist jetzt in deinem Versteck verfügbar! +[COK4_9A] +Zeit für den Lance Vance Dance! -[PAGEB8] -~w~Der ~h~Flammenwerfer~w~ ist jetzt in deinem Versteck verfügbar! +[COK4_10] +Die sind Kleinholz! Und Fischfutter. -[PAGEB9] -~w~Der ~h~Raketenwerfer~w~ ist jetzt in deinem Versteck verfügbar! +[COK4_11] +Geschafft! Die anderen Schiffchen taugen nicht viel. -[PAGE_01] -Erledige ~1~ Triaden in 2 Minuten! +[COK4_17] +Die wollen's wissen! -[PAGE_02] -Sprenge ~1~ Fahrzeuge in 2 Minuten! +[COK4_18] +Ich hab nasse Füße! WIR KRIEGEN WASSER INS BOOT! -[PAGE_03] -Heize ~1~ Diablos in 2 Minuten ein! +[COK4_21] +Achtung, Brücke! -[PAGE_04] -Erledige ~1~ Leone-Mafiosi in 2 Minuten! +[COK4_22] +Raus! Das Ding geht hoch! -[PAGE_05] -Fackle ~1~ Fahrzeuge in 2 Minuten ab! +[COK4_23] +Gut geschossen. -[PAGE_06] -Dein Job: ~1~ Fußgänger in 2 Minuten! +[COK4_29] +~r~Du hast Lance erwischt! -[PAGE_07] -Zerstöre ~1~ Fahrzeuge in 2 Minuten! +[ASS1_6] +Geh nur, Tommy, ich komm schon zurecht! -[PAGE_08] -Dein Job: ~1~ Fußgänger in 2 Minuten! +[ASS1_7] +Das ist für euch, ihr verdammten Mörder!! -[PAGE_09] -Heize ~1~ Yakuza in 2 Minuten ein! +[ASS1_8] +Ich komm hier nicht weg! -[PAGE_10] -Erledige ~1~ Forellis in 2 Minuten! +[ASS1_9] +Ich bin da, Tommy! -[PAGE_11] -Dein Job: ~1~ Fußgänger in 2 Minuten! +[ASS1_10] +Hey, das ist aber ein herzallerliebstes Beet. -[PAGE_12] -Dein Job: ~1~ Fußgänger in 2 Minuten! +[ASS1_11] +Hey Tommy, krieg ich ein Zimmer mit Blick auf die Bucht? -[PAGE_13] -Erledige ~1~ Yakuza in 2 Minuten! +[ASS1_12] +Schön hohe Decken hat's hier... -[PAGE_15] -Dein Job: ~1~ Fußgänger in 2 Minuten! +[ASS1_3] +Lance! Ich brauche Deckung! -[PAGE_16] -Zerstöre ~1~ Fahrzeuge in 2 Minuten! +[ASS1_4] +Diaz muss drinnen sein! -[PAGE_17] -Dein Job: ~1~ Fußgänger in 2 Minuten! +[ASS1_5] +Lance! -[PAGE_18] -Zerstöre ~1~ Fahrzeuge in 2 Minuten! +[ASS1_15] +~g~Stürme die Villa und erledige Diaz! -[PAGE_20] -Dein Job: ~1~ Fußgänger in 2 Minuten! +[ASS1_17] +~g~Es führen mehrere Wege in die Villa. -[MPI05] -FEIND +[TAXWAR] +TAXI-KRIEG-MISSIONEN -[MPI07] -CHECKPOINT +[NOTAXI] +~g~Du brauchst ein Kaufman-Taxi, um diese Mission zu aktivieren. -[MPI08] -NÄCHSTER +[TAXW1_5] +~g~Du musst in einem Kaufman-Taxi sitzen! -[MPI09] -ZIELLINIE +[TAX2_4] +Auf geht's, Tommy. -[MPI10] -FAHRER +[TAX2_5] +Polier ihm die Visage. -[MPI11] -BASIS +[TAX2_6] +Der hat nicht mal eine Lizenz. -[MPI12] -FEINDBASIS +[TAX2_7] +Verdammte Limo-Services. -[MPI13] -PANZER +[TAXW3_1] +~g~Hole Mercedes ab. -[MPI14] -DER MARKIERTE +[RACE1] +~g~3...2...1...LOS, LOS, LOS! -[MPI15] -AUTO +[RACE2] +~g~3 -[MPI16] -CONTAINER +[RACE3] +~g~2 -[FEI_LEG] -Legende An/Aus +[RACE4] +~g~1 -[SR_ON] -Jetzt da du dir im Straßenrennzirkus einen Namen gemacht hast, achte auf Herausforderer, die dich kontaktieren wollen. +[RACE5] +~g~LOS! -[FEC_FRA] -Manuelles Zielen +[FIRST] +~b~1. -[KAR_ON] -Schnapp dir das Feuerwehrauto wieder, wenn du versuchen willst, deine Bestzeit zu unterbieten. +[SECOND] +~b~2. -[DON2EX5] -~w~8-Ball rührt keinen Finger, solange du ihm nicht $20.000 zahlst +[THIRD] +~b~3. -[PCJTIT] -VORWÄRTS, Faggio! +[FOURTH] +~b~4. -[FEA_MUS] -LAUTSTÄRKE RADIO: +[RACETM] +~b~ZEIT: ~1~:~1~ -[FEST_GO] -Bestzeit bei 'Vorwärts Faggio' +[RACETM2] +~b~ZEIT: ~1~:0~1~ -[RC_1] -~w~Erledige mehr als ~1~ Triaden - jeder einzelne bringt dir einen Zeitbonus! +[RACEFA] +~r~Du hast das Rennen verloren! -[EXPO_C] -~w~Danke! Du hast alle geliefert. Vor deiner Wohnung in Newport wartet ein netter Bonus auf dich! +[TEX1_5] +~r~Er ist entkommen! -[TRRACE0] -~w~Rase durch die ~y~Checkpoints~w~ und komm lebendig am Streckenende an! +[SEG3_1] +ZEIT: -[RACE_P1] -~w~1. +[SEG3_2] +~g~Begib dich zu dem Transporter mit dem RC Raider und den Zeitzünder-Bomben. -[RACE_P2] -~w~2. +[SEG3_3] +~g~Du musst den RC Raider benutzen, um 4 Bomben zu 4 Zielzonen auf dem Grundstück zu bringen. -[RACE_P3] -~w~3. +[SERG3_5] +~g~Du kannst immer nur 1 Bombe transportieren und kannst erfolgreich platzierten Bomben nicht wieder aufnehmen. -[RACE_P4] -~w~4. +[SEG3_7] +~g~Sobald du die ERSTE Bombe platziert hast, lãuft der Timer des Zeitzünders an. Du musst dann alle Bomben innerhalb dieses Zeitraums platzieren. -[OUTF_00] -~w~Freizeitkleidung +[SEG3_8] +~g~Alle 4 Bomben müssen in den 4 Zielzonen platziert werden, um die Mission zu erfüllen und das Gebãude zu demolieren. -[OUTF_01] -~w~Leone-Anzug +[SEG3_9] +~g~Zielzone getroffen! Noch 3 Bomben. -[OUTF_03] -~w~Avenging Angels-Tarnanzug +[SEG3_10] +~g~Zielzone getroffen! Noch 2 Bomben. -[OUTF_04] -~w~Chauffeurslivree +[SEG3_11] +~g~Zielzone getroffen! Noch 1 Bombe. -[OUTF_05] -~w~Anwaltsanzug +[SEG3_12] +~r~Ziel verfehlt. Hol dir eine Bombe! -[OUTF_06] -~w~Smoking +[SEG3_13] +~g~Wirf die Bombe in einer Zielzone ab. -[OUTF_07] -~w~'The King'-Overall +[SEG3_14] +~r~Die Zeit ist um. Demolierung des Gebãudes fehlgeschlagen. -[OUTF_08] -~w~Cox-Maskottchen-Kostüm +[SEG3_15] +~r~Dein RC Raider ist zerstört. Wie willst du jetzt die Bomben transportieren? -[OUTF_09] -~w~Unterwäsche +[AVERY] +AVERY-MISSIONEN -[OUTF_10] -~w~Superheldenkostüm +[ASM] +ATTENTÃTERMISSIONEN -[OUTF_11] -~w~'Dragon'-Overall +[ASM_1] +ATTENTÃTERMISSION 1 -[SLTVMON] -Bei Slash-TV insgesamt verdientes Geld +[ASM1_1] +~g~Mr. Teal, Ihre Hilfe bei der Beseitigung der Landeier war ãußerst wertvoll. Ich habe noch mehr Arbeit, die eine eher 'zupackende' Art verlangt. Ihr nãchster Job klebt unter dem Telefon. -[DBIKEAI] -Größte Sprunghöhe (m) +[ASM1_2] +~g~Begib zu dich dem Fernsprecher vor dem Einkaufszentrum in Washington. -[MPC_039] -Vincenzo +[ASM1_3] +~g~Carl Pearson, Pizza-Lieferant. Er darf seine Lieferungen nicht durchführen. -[MPC_040] -Salvatore +[ASM1_4] +~g~Schalte den Pizza-Lieferanten aus, bevor er seine Lieferungen abschließt. -[MPC_041] -Toshi +[ASM_2] +ATTENTÃTERMISSION 2 -[MPC_042] -Toshiko +[ASM_3] +ATTENTÃTERMISSION 3 -[MPC_043] -Ophelia Lardaz +[ASM3_A] +Marcus Hammond, Franco Carter, Dick Tanner, Nick Kong und Stuntman Driver gehören zu einem europãischen Syndikat und planen einen Überfall. -[MPC_044] -Ed Banger +[ASM3_B] +Sie sind alle bereits in Position. Schalten Sie sie aus, bevor es losgeht. Sie haben 9 Minuten. Ich habe in der Nãhe Waffen deponiert, die Sie brauchen werden. -[MPC_045] -Robin Emblind +[ASM3_1] +~g~Hol dir die Waffe, die Mr. Black für dich deponiert hat. -[MPC_046] -Mrs. Menalot +[ASM3_2] +~g~Geh nicht zu dicht an die Zielperson heran, sonst bemerkt sie dich. -[MPC_047] -Hugh Jazz +[ASM3_3] +~g~Es geht schneller, wenn du dir eine günstige Position nahe ihrem Standort suchst und zuschlãgst, ohne gesehen zu werden. -[MPC_048] -Wayne +[ASM3_4] +~g~Er hat dich gesehen. Du musst ihn irgendwie ausschalten! -[MPC_049] -Paulie +[ASM3_5] +~g~Marcus Hammond befindet sich bei den Werbetafeln in Washington Beach. -[MPC_050] -Anne Job +[ASM3_6] +~g~Franco Carter befindet sich bei DBP Security nahe dem Ocean Drive. -[MPC_051] -Randy Boner +[ASM3_7] +~g~Dick Tanner ist in der Nãhe des Juweliers in Vice Point. -[MPC_052] -Owen Monie +[ASM3_8] +~g~Nick Kong befindet sich nãhe Washington Beach. -[MPC_053] -Ekant Sing +[ASM3_9] +~g~Stuntman Driver ist in Washington. -[MPC_054] -M.T. Head +[ASM3_10] +Du hast nicht alle ausgeschaltet. -[MPC_055] -Rick O'Shea +[ASM_4] +ATTENTÃTERMISSION 4 -[MPC_056] -Arden Long +[ASM4_1] +~g~Hol dir das Gewehr, das im Laub vor dem Flughafen-Terminal für dich deponiert wurde. -[MPC_057] -Ann Thrax +[ASM4_2] +~g~Verfehle dein Ziel nicht, du alarmierst sonst die Leibwãchter. Und bleib auf Distanz, damit er dich nicht bemerkt. -[MPC_058] -Fay Slift +[ASM4_3] +~g~Beobachte die Frau über den Check-in-Schaltern im Terminal. TU IHR NICHTS. -[MPC_059] -Mona Lott +[ASM4_4] +~g~Erledige den Mann, dem sie den Aktenkoffer gibt, aber erst, NACHDEM ER IHN GENOMMEN HAT. Hole den Koffer und bringe ihn ins Ammu-Nation Downtown. -[C0VEACC] -~X~ +[ASM4_5] +Hol dir den Aktenkoffer. -[C1VEACC] -~X~ +[ASM4_6] +~g~Bring den Aktenkoffer ins Ammu-Nation Downtown. -[C2VEACC] -~X~ +[ASM4_7] +~r~Du hast die Frau erwischt, du Idiot! -[C3VEACC] -rechten Analog-Stick oben +[ASM4_8] +~r~Die Zielperson hat gehört, wie du geschossen hast. Der Deal ist geplatzt! -[C0VEBRK] -~S~ +[ASM4_9] +~r~Die Zielperson hat das Flugzeug bestiegen! -[C1VEBRK] -~S~ +[ASM4_11] +~r~Die Zielperson hat dich gesehen! Der Deal ist geplatzt! -[C2VEBRK] -~S~ +[ASM4_13] +~g~Er hat dich bemerkt und flieht. Schalte ihn aus und hol dir den Aktenkoffer! -[C3VEBRK] -rechten Analog-Stick unten +[ASM4_14] +~g~Der Distanz-Balken am oberen rechten Bildschirmrand zeigt dir, wie nahe du der Zielperson bist. Lass ihn nicht voll werden, sonst sieht sie dich. -[C0VEHB] -R1-Taste +[ASM_5] +ATTENTÃTERMISSION 5 -[C1VEHB] -R1-Taste +[KICK] +KICKSTART -[C0VEEE] -~T~ +[KICK1_3] +~g~Anzahl, wie oft der Fuß abgesetzt wurde: ~1~ -[C1VEEE] -~T~ +[KICK1_4] +~g~Zeitstrafe: ~1~ Sekunden -[C2VEEE] -L1-Taste +[BANK] +BANK-MISSIONEN -[C3VEEE] -~T~ +[BANK1] +BANK-MISSION 1 -[C0VEWEP] -~O~ +[BANK2] +BANK-MISSION 2 -[C1VEWEP] -~O~ +[BJM2_21] +~g~Triff so viele Ziele als möglich, solange deine Munition reicht. -[C2VEWEP] -~O~ +[BANK3] +BANK-MISSION 3 -[C3VEWEP] -R1-Taste +[BJM3_1] +~g~Besorg dir ein schnelles Auto und fahre an den Start. -[C0PDSPR] -~X~ +[BNK4_2A] +Die Mechaniker haben das Baby super hergerichtet. -[C1PDSPR] -~X~ +[BNK4_3G] +Oh, Mist, jetzt haben wir die Cops am Hals! -[C0SNZI] -~S~ +[BNK4_3H] +Und wir sind noch nicht mal da. -[C1SNZI] -~S~ +[BNK4_3K] +Also, erst mal müssen wir die Cops abschütteln... -[C0SNZO] -~X~ +[BNK4_3L] +Großer Gott, Tommy, willst du uns alle umbringen?! -[C1SNZO] -~X~ +[BNK4_3N] +Alles, was ich gern habe, geht kaputt! -[C0PDFW] -~O~ +[BNK4_26] +Verdammt! Da sind sie schon! -[C1PDFW] -~O~ +[BNK4_32] +Spreng die Schließfãcher mit Sprengstoff auf. -[C0TRSK] -~X~ +[BNK4_36] +Wo ist Cam? -[C1TRSK] -~X~ +[BNK4_37] +In der Hölle. -[C2TRSK] -~X~ +[BNK4_38] +Das ist der letzte! LOS! LOS! LOS! -[C3TRSK] -~X~ +[BNK_39] +Shit! Wo bleibt Hilary? -[C0AMBUY] -~X~ +[BK4_40A] +Ich werd was für seine Verlustãngste tun! -[C1AMBUY] -~X~ +[BNK4_42] +Hey, Jungs! Los, rein! Ich geb euch Deckung! -[C2AMBUY] -~X~ +[BNK4_43] +Ich hab alles im Griff! FAHR! -[C3AMBUY] -~X~ +[BNK4_44] +Geschafft! Wir sind reich! REICH! -[C0AMEXI] -~T~ +[BNK4_45] +Ein Jammer, dass Cam es nicht gepackt hat. Er war 'n guter Kerl. -[C1AMEXI] -~T~ +[BNK4_46] +Ja. Andererseits, so bleibt mehr für uns! -[C2AMEXI] -~T~ +[BNK4_47] +Sehr richtig! YEEEEHAAAH! -[C3AMEXI] -~T~ +[BNK4_48] +Tommy, eine Massage gefãllig? -[C2PDSPR] -~O~ +[BNK4_49] +Hi, Mercedes. Ja, ich bin ein bisschen verspannt... -[C3PDSPR] -~X~ +[BNK450A] +Was hab ich gesagt, Tommy? Korrupte Bullen müssen sich vorsehen, wenn Kent Paul in der Stadt ist. -[C2SNZI] -~T~ +[BNK450B] +Komm, gib mir 'nen größeren Batzen ab. Na komm. Ich brauch neue Klamotten. -[C3SNZI] -~S~ +[BNK4_51] +Ich finde, du siehst ok aus. -[C2SNZO] -~S~ +[KENT] +KENT PAUL-MISSIONEN -[C3SNZO] -~X~ +[KENT1] +KENT PAUL-MISSION 1 -[C2PDFW] -~X~ +[COUNT] +FÃLSCHER-MISSIONEN -[C3PDFW] -R1-Taste +[COUNT1] +FÃLSCHER-MISSION 1 -[MPC_020] -Rico Garlik +[COUNT2] +FÃLSCHER-MISSION 2 -[MPC_022] -Lou Scannon +[BIKE] +DIE BIKER GANG-MISSIONEN -[MPC_024] -Cruz Vormen +[BIKE1] +BIKER-MISSION 1 -[MPC_026] -Busta Moves +[BIKE2] +BIKER-MISSION 2 -[MPC_027] -Juan Kerr +[BIKE3] +BIKER-MISSION 3 -[MPC_028] -Nick Yakar +[GOAWAY1] +Komm wieder, wenn du die Haiti-Gang-Missionen abgeschlossen hast. -[MPC_029] -Lou Bricant +[HAIT] +DIE HAITI-GANG-MISSIONEN -[MPC_030] -Lance Urwell +[HAIT1] +HAITI-MISSION 1 -[MPC_033] -Agent Ochre +[HAIT2] +HAITI-MISSION 2 -[MPC_036] -Papi Love +[HAIT3] +HAITI-MISSION 3 -[MPC_037] -Lucy Lastic +[HAM3_6] +~g~Verwende das Prãzisionsgewehr, das ich für dich besorgt habe. -[MPC_038] -Bill Durzbum +[ROCK] +DIE ROCKBAND-GANG-MISSIONEN -[MPISCOL] -Pickup aufgenommen +[ROK1_4] +~g~Ok, ich glaube, das ist es, was du suchst... -[MPSTART] -Spiel wird gestartet... +[ROK1_1E] +~g~Das kostet mehr als du hast! -[MRACEC1] -~w~1... +[ROK1_1F] +~g~Komm wieder, wenn du die Kohle hast. -[MRACEC2] -~w~2... +[RBM2_6] +~g~Wow! Die ist 'n Kerl! Halt ihn auf! -[MRACEC3] -~w~3... +[ROCK3] +ROCKBAND-MISSION 3 -[MPC_019] -Phil DeGirth +[ROK3_6D] +~r~und IHR UND EUER KOPFPUTZ mit dazu! -[GDA_HL] -Höchstes Avenging Angel-Level +[ROK3_40] +Neben dem Kühler für die Babynahrung? -[MP_SNEW] -Bitte lade oder starte ein neues Singleplayer- oder Multiplayer-Spiel. +[RBM3_5] +~g~Bring Love Fist zu ihrem Auftritt. -[DON2EX9] -~r~Ned~w~ haut ab! Lass dich nicht abhängen! +[CUBANM] +DIE KUBA-GANG-MISSIONEN -[FEI_CHA] -Team wechseln +[CUBAN1] +KUBA-MISSION 1 -[FES_RES] -SPIELEINSTELLUNGEN ZURÜCKSETZEN +[CUBAN2] +KUBA-MISSION 2 -[FESZ_QT] -Wirklich alle Einstellungen für Steuerung, Audio und Anzeige zurücksetzen? Fortfahren? +[CUB2_10] +~r~Du sollst Haitianer ausschalten, keine Kubaner! -[FEH_LOA] -SPIEL +[CUBAN3] +KUBA-MISSION 3 -[MPEMPTY] -Leer +[CUBAN4] +KUBA-MISSION 4 -[FEMP_SN] -SPIEL STARTEN (2 oder mehr Spieler benötigt) +[CUB4_04] +~r~Du hast die Basis alarmiert. Jetzt kommen wir niemals rein! -[JD_SUIT] -~w~JD kann dir keine Arbeit geben, wenn du wie ein Leone angezogen bist! +[CUB4_05] +~r~Du solltest doch im Auto bleiben. Jetzt lassen sie uns niemals rein. -[SAVD_SH] -Versteck. +[CUB4_25] +Okay, los geht's. -[SAVD_DY] -Tag +[PROT] +SCHUTZGELD-MISSIONEN -[SAVD_CO] -absolviert. +[PRO1_02] +~g~Verlasse das Einkaufszentrum. -[SAVD_AL] -Portland safehouse. Day 71, $57640. 17% complete. +[PRO3_06] +~g~Hãng die Cops ab. -[SAV_SLT] -Neuer Spielstand +[PORN] +PORNO-MISSIONEN -[POMOB6C] -~w~Komm gleich mal bei mir vorbei. Ich hab Arbeit für dich. +[PORN1] +PORNO-MISSION 1 -[ANG_2] -~w~Drücke~h~ ~k~ ~TGSUB~~w~, um Avenging Angel-Missionen an- oder abzuschalten. +[POR1_03] +~r~Candy ist erledigt! -[TVHELP] -~w~Drücke~h~ ~k~ ~TGSUB~~w~, um SLASH TV-Missionen an- oder abzuschalten. +[PORN2] +PORNO-MISSION 2 -[PAGERA] -~w~Das ~h~M60~w~ ist jetzt in deinem Versteck verfügbar! +[PORN3] +PORNO-MISSION 3 -[CO_ALL] -~w~Alle versteckten Päckchen gefunden! +[POR3_18] +Man hat dich bemerkt! -[CO_ONE] -~w~Verstecktes Päckchen ~1~ von ~1~ gefunden! +[PORN4] +PORNO-MISSON 4 -[PAGE_14] -Erledige ~1~ kolumbianische Gangster in 2 Minuten! +[POR4_04] +~g~Die Büros liegen auf der anderen Seite dieses Tors. -[PAGE_19] -Dein Job: ~1~ kolumbianische Gangster in 2 Minuten! +[PHIL] +PHIL-MISSIONEN -[ANG_22] -~r~Avenging Angel-Missionen abgebrochen. +[PHIL1] +PHIL-MISSION 1 -[SLATVQO] -~r~Slash TV-Mission abgebrochen. - -[C0FREE1] -L3-Taste - -[C1FREE1] -L3-Taste - -[C2FREE1] -L3-Taste - -[C3FREE1] -L3-Taste - -[C0FREE2] -linken Analog-Stick - -[C2FREE2] -linken Analog-Stick - -[ANGCOM1] -~w~Avenging Angel-Mission: Portland - Level 15 abgeschlossen! Das einzigartige 'Avenger'-Motorrad wurde in deinem Versteck angeliefert! - -[K_CE] -~w~Du hast ~1~ Sekunde, um zu deinem ~b~Motorrad~w~ zurückzukehren! - -[HELP31] -~w~Wirst du während einer Mission ~h~'verhaftet'~w~ oder ~h~'außer Gefecht'~w~ gesetzt, erscheint dieses ~h~Taxi~w~. - -[LOSER] -~y~VERLIERER! - -[RCRHELP] -~w~Drücke~h~ ~k~ ~TGSUB~~w~, um das ~h~Rennen zu beenden~w~.~h~ ~k~ ~VEWEP~~w~, um dein ferngesteuertes Auto zum letzten Checkpoint zurückzusetzen. - -[SRC_ON] -Jetzt, da du dir im Underground- Autorennzirkus einen Namen gemacht hast, werden Herausforderer versuchen, dich zu kontaktieren. - -[SRB_ON] -Jetzt, da du dir im Underground- Motorradrennzirkus einen Namen gemacht hast, werden Herausforderer versuchen, dich zu kontaktieren. - -[RACE_R0] -~w~BISHERIGER REKORD: ~1~:~1~~1~ - -[POMOB3C] -~w~Hey, schau mal wieder vorbei, Alter. - -[MPHPCS1] -The Hit List - -[MPWLGOC] -Steig aus dem Auto. - -[MPWLLTC] -Verlass den Container. - -[MPWLDTC] -Liefere das Auto ab. - -[MPWLCD] -Auto geliefert. - -[MPWLNGC] -Jetzt schnapp dir die Autos. - -[MPAUTO] -EINMAL ABSPIELEN - -[MRACEGO] -~w~LOS - -[MRACE04] -DU BIST DER SIEGER - -[MRACEWI] -hat das Rennen gewonnen - -[MRCPU01] -~y~SOFORT-REPARATUR - -[DTB01] -müssen die Autos verteidigen - -[DTB02] -müssen die Autos zerstören - -[DTB03] -haben ein Auto verloren - -[DTB04] -haben ein Auto zerstört - -[MPWIN] -gewinnt - -[MPKSELF] -ist außer Gefecht - -[MPMORE] -Hits - -[MP1MORE] -Hit - -[MPSTRT] -gestartet - -[MPTANK] -hat den Panzer - -[MPONE] -muss nur noch ein Auto beschaffen - -[MPDEL] -hat ein Auto geliefert - -[MPGOCAR] -Finde das Auto - -[MPGOGAR] -Liefere das Auto ab - -[MPDEST] -Zielfahrzeug zerstört - -[MPLEFT] -hat das Spiel verlassen - -[MPHPGO2] -~w~Du bist als Ziel markiert worden - -[MPHPKI] -~w~Du hast einen Killer erledigt - -[LOCKON] -Anvisiert - -[MPHPGO] -~w~Eliminiere den Markierten - -[MPTNK] -Schnapp dir den Panzer - -[MRCPU02] -DU HAST ALLEN DIE REIFEN GEPLÄTTET - -[MRCPU05] -DEINE REIFEN SIND KAPUTT - -[MRCPU06] -~y~Gute Reifen - -[WINNER] -~Y~SIEGER - -[MPDRAW] -~w~UNENTSCHIEDEN - -[MPDADDY] -JETZT BIST DU DER KING. - -[MPRUN] -BEHERRSCHEN DIESE STADT. - -[MPBITCH] -WER IST HIER DER KING, TÖLE? - -[FEMP_SM] -Grand Theft Auto mit Freunden oder zufällig in der Nähe stehenden, schrägen Fremdlingen spielen. - -[MPYL] -DU LOSER! - -[MPTMWIN] -SIND JETZT DIE OBERMACKER! - -[GS_SCAR] -FAHRZEUG: - -[GS_MIN] -Minute - -[GS_MINS] -Minuten - -[MPTNKGA] -Du hast den Panzer, harter Bursche. - -[MPTNKGB] -Jetzt sieh zu, dass du ihn behältst. - -[GS_TYPE] -SZENARIO: - -[CLILOST] -Verbindung zu anderen Spielern ist unterbrochen. - -[ONEHPC] -100 Prozent absolviert! In Fort Staunton wartet ein kleines Geschenk auf dich. - -[MPBLTM] -sindaccos - -[MPRDTM] -forellis - -[MTN_1] -Sindaccos - -[MTN_2] -Forellis - -[MPRDCAP] -Auto wurde erobert - -[MPBLCAP] -Auto wurde erobert - -[MPRDST] -Auto wurde gestohlen - -[MPBLST] -Auto wurde gestohlen - -[MPBLEST] -Auto wurde gestohlen - -[MPRDRET] -haben ihr Auto wieder - -[MPBLRET] -haben ihr Auto wieder - -[MPRDPOS] -Auto ist außer Position - -[MPBLPOS] -Auto ist außer Position - -[GS_TEAM] -GANG BEITRETEN: - -[FEMP_TS] -DEINE GANG: - -[MPTEAM] -Gang - -[GS_OA3] -Zerstöre in der Basis der feindlichen Gang vier Limos. - -[GS_O4] -Klau das Auto der feindlichen Gang und bring es zu eurer Basis. Verteidige gleichzeitig das Auto eurer Gang. - -[MPI06] -GANG-MITGLIED - -[FEMP_ST] -SPIEL STARTEN (1 oder mehr Spieler pro Gang benötigt) - -[HELP32] -~w~Gegen eine kleine Gebühr (falls du kein Geld hast auch gratis) bringt es dich zum ~h~Kontaktpunkt~w~ deiner letzten Mission. - -[BENZ_HO] -~w~Die ~h~Latzhose~w~ ist jetzt im Versteck verfügbar. Komm abends in der Latzhose hierher zurück, um bei SlashTV teilzunehmen. - -[SLATXT] -~w~Komm zwischen 18:00 Uhr und 5:00 Uhr in der Latzhose hierher zurück, um bei SlashTV teilzunehmen. - -[OUTF_02] -~w~Latzhose - -[CAN_CON] -~w~Drücke nochmal~h~ ~k~ ~TGSUB~~w~, um die Mission abzubrechen. - -[GNG1] -LEONES - -[GNG2] -TRIADEN - -[GNG3] -DIABLOS - -[GNG4] -YAKUZA - -[GNG5] -YARDIES - -[GNG6] -KOLUMBIANER - -[GNG7] -HOODS - -[GNG8] -SINDACCOS - -[GNG9] -FORELLIS - -[GNG0] -SIZILIANER - -[MP_GNG1] -GANG 1: - -[MP_GNG2] -GANG 2: - -[GS_TEMS] -GANG-KRIEG - -[CARS_O] -~w~Capital Autos in Harwood sucht einen neuen Verkäufer, falls du dir was nebenbei verdienen willst. - -[CARTXT] -~w~Capital Autos hat nur zwischen 08:00 Uhr und 18:00 Uhr offen. Komm dann wieder! - -[GS_TO1] -Erledige die feindliche Gang! - -[MPTNEED] -brauchen nur noch - -[MPTWIN] -gewinnen - -[BADTEAM] -Eine der Gangs hat keine Spieler mehr übrig. - -[RACELAP] -Runde - -[GS_D1] -ERLEBE DEN GAME-SHOW-KLASSIKER NEU! DER URBANE DARWINISMUS IST WIEDER DA. - -[GS_D2] -WER KANN AM BESTEN FAHREN (ODER BESCHEISSEN)? - -[GS_D3] -SCHÜTZE EURE AUTOS VOR FIESLINGEN UND VANDALEN. - -[GS_D4] -KLAU DAS AUTO DER FEINDLICHEN GANG UND VERLACHE SIE. - -[GS_D5] -WER IST AM SCHÄRFSTEN AUF DEN PANZER? - -[GS_D6] -DER MARKIERTE MUSS ERLEDIGT WERDEN. - -[GS_D7] -MACH KOHLE MIT AUTOHANDEL. - -[HELP61] -~w~Wenn das ~h~Dreieck nach oben zeigt~w~, ist das ~h~Ziel über dir~w~. Ein ~h~Rechteck~w~ bedeutet, das ~h~Ziel ist in gleicher Höhe mit dir. - -[ST_DRWN] -Gefütterte Fische - -[RACE_T4] -~r~Du wurdest disqualifiziert, weil du kein Auto gefunden hast. - -[RACE_T5] -~r~Du wurdest disqualifiziert, weil du kein Motorrad gefunden hast. - -[PCJ600] -PCJ-600 - -[FEC_HBB] -Handbremse~h~ ~k~ ~VEACC~ ~w~und~h~ ~k~ ~VEBRK~ - -[HJSTAT] -~w~Distanz: ~1~,~1~m Höhe: ~1~,~1~m Saltos: ~1~ Drehung: ~1~° - -[HJSTATW] -~w~Distanz: ~1~,~1~m Höhe: ~1~,~1~m Saltos: ~1~ Drehung: ~1~° Und was für eine Landung! - -[HJSTATF] -~w~Distanz: ~1~,~1~ Fuß Höhe: ~1~,~1~ Fuß Saltos: ~1~ Drehung: ~1~° - -[HJSTAWF] -~w~Distanz: ~1~,~1~ Fuß Höhe: ~1~,~1~ Fuß Saltos: ~1~ Drehung: ~1~° Und was für eine Landung! - -[MPUNLK] -Neuer Multiplayer-Inhalt freigeschaltet. Beschäme andere Spieler mit dem ganzen Zeug, das du freigeschaltet hast! - -[MPUNLKA] -Alle Multiplayer-Inhalte freigeschaltet. Beschäme andere Spieler mit dem ganzen Zeug, das du freigeschaltet hast! - -[TOUR] -Erst knipsen, dann starten - -[NDL1_A] -Nudel-Dödel +[PHIL2] +PHIL-MISSION 2 [PIZ1_A] -Pizza-Flitzer +PIZZABOTEN-MISSION -[GS_SCUT] -INTRO ABSPIELEN: +[PIZ1_03] +~g~Fahr zurück zum Pizza-Service für weitere Bestellungen. -[TR_00] -RENNEN EINS +[PIZ1_04] +~g~Hier sind die neuen Bestellungen. -[TR_01] -RENNEN ZWEI +[PIZ1_10] +Drücke die ~h~R3-Taste~w~, um die Pizza-Missionen abzubrechen. -[TR_02] -RENNEN DREI +[CNTBUY1] +Druckerei gekauft: $ ~1~ -[TR_03] -RENNEN VIER +[CARBUY] +Autohaus gekauft: $ ~1~ -[TR_04] -RENNEN FÜNF +[PORNBUY] +Filmstudio gekauft: $ ~1~ -[TR_05] -RENNEN SECHS +[ICEBUY] +Eiscremefabrik gekauft: $ ~1~ -[TR_06] -RENNEN SIEBEN +[TAXIBUY] +Taxiunternehmen gekauft: $ ~1~ -[TR_07] -RENNEN ACHT +[BANKBUY] +Malibu Club gekauft: $ ~1~ -[CHSE] -VERFOLGUNGSJAGD +[BOATBUY] +Bootswerft gekauft: $ ~1~ -[NOCHANG] -Während dieser Mission kannst du keine Outfits wechseln. +[PRNT_NO] +Zurzeit kannst du die Druckerei nicht kaufen. Komm spãter wieder. -[OUTF_12] -Antonio +[CAR_NO] +Zurzeit kannst du das Autohaus nicht kaufen. Komm spãter wieder. -[OUTF_13] -Trainingsklamotten +[PORN_NO] +Zurzeit kannst du das Filmstudio nicht kaufen. Komm spãter wieder. -[OUTF_14] -Goodfella +[ICE_NO] +Zurzeit kannst du die Eiscremefabrik nicht kaufen. Komm spãter wieder. -[OUTF_15] -Mr. Smart +[TAXI_NO] +Zurzeit kannst du das Taxiunternehmen nicht kaufen. Komm spãter wieder. -[BENZ_AN] -~w~Das ~h~Antonio-Outfit~w~ ist jetzt im Versteck verfügbar. +[BANK_NO] +Zurzeit kannst du den Malibu Club nicht kaufen. Komm spãter wieder. -[BENZ_SW] -~w~Die ~h~Trainingsklamotten~w~ sind jetzt im Versteck verfügbar. +[BOAT_NO] +Zurzeit kannst du die Bootswerft nicht kaufen. Komm spãter wieder. -[BENZ_GD] -~w~Das ~h~Goodfella-Outfit~w~ ist jetzt im Versteck verfügbar. +[PRNT_R3] +Drücke R3, um die Druckerei zu kaufen. Preis: $~1~ -[BENZ_WI] -~w~Das ~h~Mr. Smart-Outfit~w~ ist jetzt im Versteck verfügbar. +[CAR_R3] +Drücke R3, um das Autohaus zu kaufen. Preis: $~1~ -[RAMPAGE] -SPEZIALAUFTRAG +[PORN_R3] +Drücke R3, um das Filmstudio zu kaufen. Preis: $~1~ -[GS_TTGT] -PANZER-ZEIT: +[ICE_R3] +Drücke R3, um die Eiscremefabrik zu kaufen. Preis: $~1~ -[GS_O5] -Du gewinnst, wenn du am längsten im Panzer überlebst. Beschädige den Panzer, um ihn einem anderen Spieler wegzunehmen. +[TAXI_R3] +Drücke R3, um das Taxiunternehmen zu kaufen. Preis: $~1~ -[HELP28] -~w~Um eine ~h~Explosivwaffe~w~ zu werfen, drücke~h~ ~k~ ~PDFW~. ~w~Je länger du~h~ ~k~ ~PDFW~ ~w~gedrückt hältst, umso weiter fliegt die Waffe. +[BANK_R3] +Drücke R3, um den Malibu Club zu kaufen. Preis: $~1~ -[RATNG53] -Ehrloser Schuft +[BOAT_R3] +Drücke R3, um die Bootswerft zu kaufen. Preis: $~1~ -[RATNG54] -Betrügerische Ratte +[COL2_6] +Keine Bewegung, amerikanisches Imperialistenschwein! -[RATNG55] -Hai +[COL2_6B] +Das ist Eigentum des französischen Staates. -[RATNG56] -Falscher Fuffziger +[COL2_6C] +Her damit! -[RATNG57] -Der Pate aller Lügner +[COL3_A] +Thomas, schön, dass Sie da sind. -[RATNG11] -BLUTSAUGER +[COL3_B] +Verzeihen Sie, dass ich direkt zum Geschãftlichen komme. -[CHASE6] -Liberty Tree Seite 2 +[COL3_C] +Diaz bat mich, eine kleine Transaktion für ihn zu überwachen. -[CHASE7] -Liberty Tree Titelseite +[COL3_D] +Hoffentlich lãuft es diesmal besser als zuletzt. -[AUTOLD] -Es wird vom Memory Stick™ geladen, bitte Memory Stick™ nicht entfernen oder System ausschalten. +[COL3_E] +Deshalb wende ich mich ja an Sie, mein Freund. -[LDFAIL] -Laden fehlgeschlagen. Gespeicherte Daten sind beschädigt. +[COL3_F] +Ich habe im Parkhaus ein wenig Artillerie deponiert. -[MEMCHKA] -Memory Stick™ wurde nicht gefunden. Mindestens +[COL3_G] +Holen Sie sich die und beschützen Sie Diaz' Mãnner bei der Übergabe. -[MEMCHKB] -wird benötigt, um Spieldaten zu speichern. +[COL4_2] +Ich weiß nicht, Sir! -[MEMCHKC] -Nicht genug Speicherplatz auf dem Memory Stick™. Mindestens +[COL4_5] +Sir, zu Befehl, Sir! -[MEMCHKD] -wird benötigt, um Spieldaten zu speichern. +[COL4_10] +Gehen wir ein paar Donuts essen. -[M_FAIL] -MISSION FEHLGESCHLAGEN! +[COL4_16] +Fahrzeug wird weggeschafft, Sir! -[M_OVER] -MISSION BEENDET! +[COL4_25] +Selbstzerstörung des Fahrzeugs eingeleitet! -[M_PASS] -~Y~MISSION ERFÜLLT! ~n~$~1~ +[COL5_6] +Mercedes - dieses Kind bringt mich noch ins Grab. -[M_PASSN] -~Y~MISSION ERFÜLLT! +[COL5_8] +Verdammte Bande! -[MRACE11] -~w~Beschaff dir ein Fahrzeug, um das Rennen zu beenden +[COL5_5] +Nehmt das, Franzosenschweine! -[FEI_LE1] -Legende an +[CNT2_1] +Macht ihn fertig! -[FEI_LE2] -Legende aus +[CNT2_2] +Hol die Platten! -[FEI_TA1] -Spieler-Ziel an +[CNT2_3] +Beschütze den Kurier! -[FEI_TA2] -Spieler-Ziel aus +[FINKILL] +Ok, Jungs, macht ihn fertig! -[C1FREE2] -linken Analog-Stick +[FIN_1A] +Komm her, du hinterhãltiger Dreckskerl! -[C3FREE2] -linken Analog-Stick +[FIN_1B] +Jetzt bist du fãllig, du mieser Verrãter! -[FEA_MP3] -EIGENE SONGS: +[FIN_1C] +Das wird dein letzter 'Dance', Lance Vance! -[FEA_NA] -NICHT VERFÜGBAR +[FIN_2B] +Ach, wirklich? -[MPC_060] -Antonio +[FIN_2C] +Der dumme Spruch war schon im Kindergarten alt! -[MPC_061] -Training Toni +[FIN_3] +Keiner da, um dich rauszuhauen, diesmal, hã, Tommy? -[MPC_062] -Goodfella +[FIN_4] +Du bist am Ende, Tommy. -[MPC_063] -Mr. Smart +[FIN_5] +Du hast dich auf die falsche Seite geschlagen, Lance... -[MPC_064] -Kazuki +[FIN_6] +Sonny ist oben am Safe mit MEINEM Geld... -[NUMDBL1] -DEBUG 1 (~1~) (~1~) +[FIN_10] +Sonny? SONNY! Jetzt bist du fãllig! -[SVRMBRS] -SPIELER-LISTE: +[FIN_11A] +Du hast mir 15 Jahre gestohlen, Sonny. -[RAMP_P] -SPEZIALAUFTRAG ERFÜLLT! +[FIN_11B] +Und das wirst du mir jetzt büßen! -[RAMP_F] -SPEZIALAUFTRAG GESCHEITERT! +[FIN_12A] +Du kapierst es immer noch nicht, oder? -[MPWLPAC] -hat sich ein Ziel-Auto geschnappt. +[FIN_12B] +Dein Arsch gehört mir, Tommy. -[MPWLDAC] -hat ein Ziel-Auto abgeliefert. +[FIN_12C] +Diese 15 Jahre hast du anstelle von mir abgesessen! -[LDWAIT] -Drücke ~X~, um fortzufahren. +[FIN_13] +Schnappt ihn euch. Er hat nie was begriffen. -[LOADING] -Ladevorgang... Bitte warten. +[RACES_4] +3 -[RACEP1] -1. +[RACES_5] +2 -[RACEP2] -2. +[RACES_6] +1 -[RACEP3] -3. +[RACES_7] +LOS! -[RACEP4] -4. +[RACES_9] +Zeit: ~1~:~1~ -[RACEP5] -5. +[RACES] +ZEIT: -[RACEP6] -6. +[RACES17] +Neue Bestzeit: ~1~:~1~ -[FEA_UT] -Unbekannter Track +[RACES18] +PREISGELD: $~1~ -[LOADIN2] -Ladevorgang... +[RACES20] +Neue Bestzeit: ~1~:0~1~ -[DNH5_X2] -~r~Du hast nicht alle Bomben angebracht. +[RACES21] +Zeit: ~1~:0~1~ -[MRACE12] -DU HAST +[RCH1_1] +~g~Benutze den ferngesteuerten Helikopter, den RC Raider, um die Checkpoints zu PASSIEREN. -[MRACE13] -SEKUNDEN, UM EIN FAHRZEUG ZU FINDEN +[RCH1_2] +~g~Die CHECKPOINTS sind überall auf dem Flughafen verteilt. -[MRACE14] -SEKUNDE, UM EIN FAHRZEUG ZU FINDEN +[RCH1_3] +~g~Du hast ~c~8 MINUTEN~g~, um alle ~c~20 zu passieren! -[DTB_03] -~w~Das Team, das seine Autos am längsten verteidigt, gewinnt. +[RCH1_5] +Zeit -[PUPCOL] -hat ein Powerup aufgenommen. +[RCRC1_2] +~g~Begib dich zur Startlinie! -[TNKCSE] -Beschädige den Panzer, um ihn einem anderen Spieler wegzunehmen. +[RCRC1_4] +~g~3 -[TNKTM] -Du gewinnst, wenn du am längsten im Panzer überlebst. +[RCRC1_5] +~g~2 -[MPFAIL] -FEHLGESCHLAGEN +[RCRC1_6] +~g~1 -[GS_LOC2] -SPIEL-ORT: +[RCRC1_7] +~g~LOS! -[DTBSWPA] -So lange wurden die Sindaccos abgewehrt: +[RCRC1_8] +~g~Absolvierte Zeit: ~1~ Sekunden -[DTBSWPB] -Jetzt zerstöre ihre Autos in kürzerer Zeit. +[RCPL1_1] +~g~Liefere dir mit 3 anderen RC Barons ein CHECKPOINT-RENNEN. -[DTBSWPC] -So lange hat es gedauert, die Forelli-Autos zu zerstören: +[RCPL1_2] +~g~Du musst durch die ~o~MITTLERE MARKIERUNG ~g~hindurch, um einen Checkpoint zu passieren. -[DTBSWPD] -Jetzt verteidige eure Autos länger. +[RCPL1_3] +~g~Begib dich zur Startlinie! -[CHANOP] -Option ändern +[ICC1_O] +Was ist denn in Sie gefahren? -[MPSSCT] -CASH-VORGABE: +[FEA_2SP] +2 Boxen -[F_RANG2] -~r~Der Feuerwehrfunk funktioniert nicht in der U-Bahn! +[FEA_4SP] +Mehr als 2 Boxen -[T_RANG2] -~r~In der U-Bahn gibt es keinen Müll abzuholen! +[FEA_EAR] +Kopfhörer -[T_RANGE] -~r~Hier gibt es keinen Müll abzuholen! +[FEA_NAH] +KEINE AUDIO HARDWARE -[FEU_YES] -JA +[FET_APP] +ÜBERNEHMEN -[FEU_NO] -NEIN +[FES_SKN] +SKIN-NAME -[HELP43] -~w~Mit der Handbremse kannst du das Boot schneller wenden. +[FES_DAT] +DATUM -[RACE_T6] -~r~Eines der Fahrzeuge wurde zerstört - das Rennen wird abgeblasen! +[FES_SET] +Skin verwenden -[FED_POS] -BILDSCHIRMPOSITION - -[FES_DSS] -Zu löschenden Spielstand auswählen: - -[FES_LSS] -Zu ladenden Spielstand auswählen: - -[FES_DSC] -Löschen erfolgreich. Zum Fortfahren OK wählen. - -[FES_DEL] -Spiel löschen - -[FES_DGM] -SPIEL LÖSCHEN - -[ITBEG] -Am Anfang... - -[FET_LG] -SPIEL LADEN - -[FES_SCG] -Aktuelles Spiel speichern? +[FET_DEF] +Standard wiederherst. [FESZ_QZ] Dieses Spiel wirklich speichern? +[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] +Hinauszoomen + +[FEC_EEX] +Ein-/Aussteigen + +[FEC_RAD] +Radio + +[FEC_SUB] +Spezialmission + +[FEC_CMR] +Blickwinkel ãndern + +[FEC_JMP] +Springen + +[FEC_SPN] +Sprinten + +[FEC_HND] +Handbremse + +[FEC_LOL] +Nach links sehen + +[FEC_LOR] +Nach rechts sehen + +[FEC_NTR] +Nãchstes Ziel + +[FEC_PTT] +Vorheriges Ziel + +[FEC_LBA] +Nach hinten sehen + +[FEC_CEN] +Kamera zentrieren + +[FET_CCN] +Classic + +[FET_SCN] +Standard + +[FET_CFT] +ZU FUSS + +[FET_CCR] +IN FAHRZEUG + +[FET_CAC] +AKTION + +[FEC_IBT] +- + +[FEC_MXO] +MXB1 + +[FEC_MXT] +MXB2 + +[FEC_UNB] +NICHT BEL. + +[FEC_TFL] +Links sehen + Geschütz L + +[FEC_TFR] +Rechts sehen + Geschütz R + +[FEC_MWF] +MAUSRAD AUFW. + +[FEC_MWB] +MAUSRAD ABW. + +[FEC_ORR] +oder + +[FEC_NUS] +NICHT VERWENDET + +[FEC_LUD] +Aufw. sehen + +[FEC_LDU] +Abw. sehen + +[FEC_CMP] +COMBO: L+R SEHEN + +[LAW_1A] +law_1a + +[LAW_1B] +law_1b + +[LAW_2A] +law_2a + +[LAW_2B] +law_2b + +[FEH_STA] +STATISTIKEN + +[FEH_LOA] +LADEN + +[FEH_CON] +STEUERUNG + +[FEH_AUD] +AUDIO + +[FEH_DIS] +ANZEIGE + +[FEH_LAN] +SPRACHE + +[FEH_SGA] +NEUES SPIEL STARTEN + +[FEO_CON] +Controller-Setup + +[FEO_AUD] +Audio-Setup + +[FEO_DIS] +Anzeigen-Setup + +[FEO_LAN] +Sprachen-Setup + +[FEO_PLA] +Spieler-Setup + +[FEA_OUT] +Ausgabe + +[FEA_ST] +Stereo + +[FEA_DTS] +DTS + +[FEA_RSS] +Radiosender + +[FEA_NON] +RADIO AUS + +[FEA_FM0] +WILDSTYLE + +[FEA_FM1] +FLASH FM + +[FEA_FM2] +KCHAT + +[FEA_FM3] +FEVER 105 + +[FEA_FM4] +VROCK + +[FEA_FM5] +VCPR + +[FEA_FM7] +EMOTION 98.3 + +[FEA_FM8] +WAVE 103 + +[FED_BRI] +Helligkeit + +[FED_TRA] +Unschãrfe-FX + +[FED_SUB] +Untertitel + +[FED_WIS] +Breitbild + +[FED_POS] +Anzeige-Position + +[FEP_RES] +Fortsetzen + +[FEP_STG] +Spiel starten + +[FEP_STA] +Statistiken + +[FEP_BRI] +Missionsinfos + +[FEP_OPT] +Optionen + +[FEP_QUI] +Spiel beenden + +[FES_LOA] +Spiel laden + +[FES_DEL] +Spiel löschen + +[FEC_CSU] +Controller-Setup + +[FEC_RED] +Steuerung ãndern + +[FEC_MOU] +Maus-Einstellg. + +[DISTGOL] +Mit Golfwagen zurückgel. Entfernung (Meilen) + +[DISTGOM] +Mit Golfwagen zurückgel. Entfernung (Meter) + +[ST_FAVR] +Lieblings-Radiosender + +[ST_WSTR] +Unbeliebtester Radiosender + +[ST_FAVV] +Lieblingsfahrzeug + +[ST_STAR] +Anzahl angehãufter Fahndungssterne + +[ST_HEAD] +Anzahl Köpfe + +[ST_GANG] +Unbeliebteste Gang + +[ST_STGN] +Anzahl losgewordener Fahndungssterne + +[TYREPOP] +Zerschossene Reifen + +[TYRESLA] +Aufgeschlitzte Reifen + +[ST_BRK] +Erledigte Gegner im Chaos-Derby + +[ST_LTBR] +Lãngste Zeit im Chaos-Derby (Sekunden) + +[ST_GNG1] +Kubaner + +[ST_GNG2] +Haitianer + +[ST_GNG3] +Möchtegern-Gangster + +[ST_GNG4] +Diaz' Gang + +[ST_GNG5] +Sicherheitsbeamte + +[ST_GNG6] +Biker-Gang + +[ST_GNG7] +Vercetti-Gang + +[ST_GNG8] +Golfer + +[FEA_FM6] +ESPANTOSO + +[ST_ASSI] +Ausgeführte Attentãtermissionen + +[DISTBIK] +Mit Motorrad zurückgel. Strecke (Meilen) + +[DISTBIM] +Mit Motorrad zurückgel. Strecke (Meter) + +[HOTEL] +Ocean View Hotel + +[KICK1_9] +VERBLEIBENDE CHECKPOINTS: + +[FIN_B6] +Du hast nicht genug Geld, um diese Mission zu beginnen. + +[TEX3_9] +~g~Steuere den Helikopter über eine Bombe, um sie aufzunehmen. + +[HELP22] +Begib dich zu dem grünen Haus-Symbol auf dem Radar. + [FES_SSC] -Speichern erfolgreich. Zum Fortfahren OK wählen. +Daten wurden gespeichert. Weiter mit OK. -[FEM_NTF] -Die Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 ist nicht formatiert. - -[FES_CFM] -Formatiert Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1. Memory Card (8MB) (für PlayStation®2) und Controller nicht entfernen und die Konsole nicht zurückstellen oder abschalten. - -[FES_LOQ] -Laden gescheitert! Der Spielstand auf der Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 ist nicht mit diesem Spiel kompatibel. Bitte einen anderen Spielstand laden. Spiel wird jetzt neu gestartet. - -[FEM_NTH] -Keine Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 eingelegt. - -[FES_CMP] -Speichern gescheitert! Bitte überprüfen Sie die Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 und versuchen Sie es noch einmal. - -[FESZ_FO] -Die Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 ist nicht formatiert. Möchten Sie sie jetzt formatieren? - -[FES_NOC] -Keine Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 eingelegt. - -[FES_LOE] -Laden gescheitert! Bitte überprüfen Sie die Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 und versuchen Sie es noch einmal. Spiel wird jetzt neu gestartet. - -[FES_DEE] -Löschen gescheitert! Bitte überprüfen Sie die Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 und versuchen Sie es noch einmal. - -[SLONFM] -Formatieren gescheitert! Bitte überprüfen Sie die Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 und versuchen Sie es noch einmal. - -[SLONDR] -Ungenügend Speicherplatz auf der Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1. Bitte legen Sie eine Memory Card (8MB) (für PlayStation®2) mit mindestens 330 KB freiem Speicherplatz in MEMORY CARD-Steckplatz 1 ein, um Spieldaten zu speichern. - -[SLNSP] -Ungenügend Speicherplatz auf der Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1. Zum Speichern der Spieldaten werden auf der Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 mindestens 101 KB zusätzlicher freier Speicherplatz benötigt. - -[SLONNF] -Die Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 ist nicht formatiert. Möchten Sie sie jetzt formatieren? - -[FESZ_FF] -Formatieren gescheitert! Bitte überprüfen Sie die Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 und versuchen Sie es noch einmal. - -[MCDNSP] -Keine Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 eingelegt. Zum Speichern der Spieldaten legen Sie bitte eine Memory Card (8MB) (für PlayStation®2) mit mindestens 330 KB freiem Speicherplatz ein. Wollen Sie das Spiel trotzdem starten? - -[MCGNDP] -Ungenügend Speicherplatz auf der Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1. Zum Speichern der Spieldaten werden mindestens 330 KB freier Speicherplatz benötigt. Wollen Sie das Spiel trotzdem starten? - -[MCGNSP] -Ungenügend Speicherplatz auf der Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1. Zum Speichern der Spieldaten werden auf der Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 mindestens 101 KB zusätzlicher freier Speicherplatz benötigt. Wollen Sie das Spiel trotzdem starten? - -[FESZ_WR] -Speichert Daten. Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 und Controller nicht entfernen und die Konsole nicht zurückstellen oder abschalten. - -[FELD_WR] -Lädt Daten. Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 und Controller nicht entfernen und die Konsole nicht zurückstellen oder abschalten. - -[FEDL_WR] -Löscht Daten. Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 und Controller nicht entfernen und die Konsole nicht zurückstellen oder abschalten. - -[C0VEWEA] -Rechter Analog-Stick - -[C1VEWEA] -Rechter Analog-Stick - -[C2VEWEA] -Rechter Analog-Stick - -[C3VEWEA] -Richtungstasten - -[C0PDLOO] -den rechten Analog-Stick - -[C1PDLOO] -den rechten Analog-Stick - -[C2PDLOO] -Rechter Analog-Stick - -[C3PDLOO] -Rechter Analog-Stick - -[C0AMMOV] -den linken Analog-Stick oder die Richtungstasten - -[C1AMMOV] -den linken Analog-Stick oder die Richtungstasten - -[C2AMMOV] -Linker Analog-Stick oder Richtungstasten - -[C3AMMOV] -Linker Analog-Stick oder Richtungstasten - -[FEC_ACB] -Beschleunigen/Bremsen - -[FEM_SL8] -Spielstand 8 nicht vorhanden - -[FES_SAV] -SPIEL SPEICHERN - -[FES_FMS] -Formatieren erfolgreich. - -[MCDNCK] -Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 wird überprüft. Memory Card (8MB) (für PlayStation®2) und Controller nicht entfernen und die Konsole nicht zurückstellen oder abschalten. +[FES_DSC] +Daten wurden gelöscht. Weiter mit OK. [FESZ_QC] -Diese beschädigte Datei wirklich überschreiben? +Dieses beschãdigte Spiel überschreiben? -[NOCONT] -Bitte schließen Sie einen Analog Controller (DUALSHOCK®) oder einen Analog Controller (DUALSHOCK®2) an Controller-Anschluss 1 an, um fortzufahren. +[FES_CHE] +Achtung! Ein oder mehrere Cheats sind aktiviert, dies kann sich auf die Speicherung auswirken. Es wird empfohlen, dieses Spiel nicht zu speichern. -[FES_LCF] -Laden gescheitert! Bitte überprüfen Sie die Memory Card (8MB) (für PlayStation®2) in MEMORY CARD-Steckplatz 1 und versuchen Sie es noch einmal. +[FET_SG] +SPIEL SPEICHERN -[DBGHELP] -~h~DEBUG MENU~w~ Select Item with ~h~left button & right button. ~w~Press ~h~X button ~w~to launch. Press ~h~TRIANGLE button ~w~to quit menu. +[FEH_BRI] +MISSIONSINFO -[DBGSEL1] -Level Skip Menu +[FEH_MAP] +KARTE -[DBGSEL2] -Car Viewer +[FEM_OK] +OK -[DBGSEL3] -Character Viewer +[FEC_CRO] +Ducken -[DBGSEL4] -Building Viewer +[FEC_CR3] +Ducken (L3-Taste) -[DBGSEL5] -Weapon Cheat +[FEC_SMT] +Spezialmission -[DBGSEL6] -Player Cheat +[FEC_SM3] +Spezialmission (R3-Taste) -[DBGSEL7] -Weather and Time Changer +[FEC_RSC] +Radiosender -[DBGSEL8] -Marketing Camera +[ST_PR01] +Flieger -[DBGSEL9] -MoCap Menu +[ST_PR02] +Luftwaffensoldat -[DBGSE10] -USJ Editor +[ST_PR03] +Gefreiter -[DBGSE11] -Toggle Player Coordinates +[ST_PR04] +Unteroffizier -[DBGFIL0] -Ped Selector +[ST_PR05] +Leutnant -[DBGFIL1] -Car Selector +[ST_PR06] +Stabsunteroffizier -[PLCHLD] -Placeholder: mission will complete in 5 seconds +[ST_PR07] +Hauptmann -[PLCHLD2] -Placeholder Cutscene +[ST_PR08] +Könner -[PLCHLD3] -Placeholder (MOCAP) Cutscene +[ST_PR09] +Profi -[LS_MAC] -Ma Cipriani stream +[ST_PR10] +Roter Baron -[LS_JDT] -J.D. O'Toole stream +[ST_PR11] +Wildgans -[LS_SAL] -Salvatore stream +[ST_PR12] +Viper -[LS_COMP] -Completed all Missions in this stream +[ST_PR13] +Falke -[TEMP1] -Number: ~1~ +[ST_PR14] +Adler -[LS2_H1] -Use ~h~analog up & down ~w~to select story stream. Use ~h~analog left & right ~w~to select mission. Use ~h~L button & R button ~w~to select an island. Press ~h~X button ~w~to start mission. Press ~h~TRIANGLE button ~w~to exit. +[ST_PR15] +Blitz -[LS2_H2] -You cannot use levelskip when you are ~h~on a mission. +[ST_PR16] +Tornado -[LS2_VIC] -~y~Vincenzo Cilli -~g~ ~a~ +[ST_PR17] +Taifun -[LS2_MAC] -~y~Ma Cipriani -~g~ ~a~ +[ST_PR18] +Luftwaffengeneral -[LS2_JDT] -~y~J.D. O'Toole -~g~ ~a~ +[ST_PR19] +Ass -[LS2_SAL] -~y~Salvatore -~g~ ~a~ +[FET_LG] +SPIEL LADEN -[LS2_MAR] -~y~Maria -~g~ ~a~ +[CAR_EXP] +Straßenfahrzeuge zerstört -[LS2_NED] -~y~Ned Burner -~g~ ~a~ +[BOA_EXP] +Boote zerstört -[LS2_DON] -~y~Donald Love -~g~ ~a~ +[HEL_DST] +Flugzeuge & Helikopter zerstört -[LS2_RAY] -~y~Ray Machowski -~g~ ~a~ +[STFT_01] +Schnellste Zeit bei 'Wheels of Steels' -[LS2_TOS] -~y~Toshiko Kasen -~g~ ~a~ +[STFT_02] +Schnellste Zeit bei 'Der Fahrer' -[FREEON] -Time Frozen +[STFT_03] +Schnellste Zeit auf Gelãndemotorradstrecke -[FREEOFF] -Time Unfrozen +[STFT_04] +Schnellste Zeit bei Modellflugzeug-Rennen -[WTC_INS] -Use ~h~analog up & down ~w~to change weather. Use ~h~analog left & right ~w~to change hour. Press ~h~TRIANGLE button ~w~to exit. Press ~h~SQUARE button ~w~to freeze time. +[STFT_05] +Schnellste Zeit mit den ferngesteuerten Autos -[WTC_TIM] -TIME: ~1~:00 +[STFT_06] +Schnellste Zeit bei Helikopter-Rennen -[WTC_WE0] -WEATHER: CLOUDY +[STFT_07] +Schnellste Zeit bei 'Todeskaracho' -[WTC_WE1] -WEATHER: EXTRA COLOURS +[STFT_08] +Schnellste Zeit bei 'Ocean Drive' -[WTC_WE2] -WEATHER: EXTRA SUNNY +[STFT_09] +Schnellste Zeit bei 'Küsten-Rallye' -[WTC_WE3] -WEATHER: FOGGY +[STFT_10] +Schnellste Zeit bei 'Capital Cruise' -[WTC_WE4] -WEATHER: HURRICANE +[STFT_11] +Schnellste Zeit bei 'Tour!' -[WTC_WE5] -WEATHER: RAINY +[STFT_12] +Schnellste Zeit bei 'V.C. Endurance' -[WTC_WE6] -WEATHER: SNOW +[STHC_01] +High-Score bei Schießstand-Mission -[WTC_WE7] -WEATHER: SUNNY +[STHC_02] +Beste Trefferquote am Schießstand (in Prozent) -[CVHELP] -Use ~h~up button and down button ~w~to change character. Use ~h~left button and right button ~w~to rotate camera. HOLD ~h~SQUARE ~w~to zoom in (toggles upper and lower body). Press ~h~TRIANGLE ~w~to quit character viewer. +[STHC_03] +Anzahl getãtigter Drogendeals -[VMENU1] ---------- Select a Viewer --------- --- ~h~Car~w~ - Character - Building -- +[HELP24] +Du kannst jetzt Auftrãge vom Colonel annehmen. -[VMENU2] ---------- Select a Viewer --------- --- Car - ~h~Character~w~ - Building -- +[HELP25] +Du kannst jetzt Auftrãge von Avery Carrington annehmen. -[VMENU3] ---------- Select a Viewer --------- --- Car - Character - ~h~Building~w~ -- +[HELP29] +Außerhalb eine Mision kannst du zu dem Bekleidungsgeschãft gehen. -[CV_C] -COMPARISON MODEL +[HELP30] +Wenn du neue Klamotten kaufst, reduziert sich dein Fahndungslevel auf null. -[CV_0] -ROW: -- MODEL: player +[ASM4_24] +Entfernung: -[CV_1] -ROW: 114 MODEL: cop +[RBM1_6] +~g~Bring Mercedes und den 'Love Juice' zu der Band ins Aufnahmestudio. -[CV_2] -ROW: 115 MODEL: swat +[RBM1_3] +NICHT MEHR BENÖTIGT -[CV_3] -ROW: 116 MODEL: fbi +[HAM1_5] +NICHT MEHR BENÖTIGT -[CV_4] -ROW: 117 MODEL: army +[RBM1_11] +NICHT MEHR BENÖTIGT -[CV_5] -ROW: 118 MODEL: medic +[HELP31] +Um aus dem fahrenden Fahrzeug zu schießen, sieh zuerst mit ~k~~VEHICLE_LOOKLEFT~ oder ~k~~VEHICLE_LOOKRIGHT~ nach links oder rechts. -[CV_6] -ROW: 119 MODEL: fireman +[HELP34] +Du brauchst eine Maschinenpistole für einen 'Drive-By'. -[CV_7] -ROW: 71 MODEL: male01 +[STRIP_1] +~r~Nicht genug Cash, du windiger Geizhals! -[CV_9] -ROW: 120 MODEL: taxi_d +[EXIT_1] +~k~~PED_SPRINT~ zum Beenden. -[CV_10] -ROW: 2 MODEL: pimp +[ASM1_B] +Ihr nãchster Auftrag klebt unter dem Telefon. -[CV_11] -ROW: 13 MODEL: criminal01 +[ASM1_C] +Ich habe noch mehr Arbeit, die eine eher 'zupackende' Art verlangt. -[CV_12] -ROW: 14 MODEL: criminal02 +[SCARF] +Apartment 3c -[CV_13] -ROW: 15 MODEL: male02 +[LAW4_10] +Reiche Manager sind Schweine! -[CV_14] -ROW: 16 MODEL: male03 +[RCH1_6] +~g~Benutze den ferngesteuerten Helikopter, um Checkpoints überall auf dem Flughafen abzufliegen. -[CV_15] -ROW: 121 MODEL: fatmale01 +[RCH1_9] +~b~GESAMTZEIT: ~1~:~1~ -[CV_16] -ROW: 17 MODEL: fatmale02 +[RCH1_10] +~b~GESAMTZEIT: ~1~:0~1~ -[CV_17] -ROW: 18 MODEL: female01 +[WHEEL01] +ZWEIRAD DOPPELBONUS: $ ~1~ Distanz: ~1~.~1~m Zeit: ~1~ Sekunden -[CV_18] -ROW: 19 MODEL: female02 +[WHEEL02] +ZWEIRAD DOPPELBONUS: $ ~1~ Distanz: ~1~ Fuß Zeit: ~1~ Sekunden -[CV_19] -ROW: 20 MODEL: female03 +[WHEEL03] +ZWEIRAD BONUS: $ ~1~ Zeit: ~1~ Sekunden -[CV_20] -ROW: 21 MODEL: fatfemale01 +[WHEEL04] +ZWEIRAD BONUS: $ ~1~ Distanz: ~1~.~1~m -[CV_21] -ROW: 22 MODEL: fatfemale02 +[WHEEL05] +ZWEIRAD BONUS: $ ~1~ Distanz: ~1~ Fuß -[CV_22] -ROW: 23 MODEL: prostitute +[WHEEL06] +WHEELIE BONUS: $ ~1~ Distanz: ~1~.~1~m Zeit: ~1~ Sekunden -[CV_23] -ROW: 24 MODEL: prostitute2 +[WHEEL07] +WHEELIE BONUS: $ ~1~ Distanz: ~1~ Fuß Time: ~1~ Sekunden -[CV_24] -ROW: 25 MODEL: p_man1 +[WHEEL08] +WHEELIE BONUS: $ ~1~ Zeit: ~1~ Sekunden -[CV_25] -ROW: 26 MODEL: p_man2 +[WHEEL09] +WHEELIE BONUS: $ ~1~ Distanz: ~1~.~1~m -[CV_26] -ROW: 27 MODEL: p_wom1 +[WHEEL10] +WHEELIE BONUS: $ ~1~ Distanz: ~1~.~1~ Fuß -[CV_27] -ROW: 28 MODEL: p_wom2 +[WHEEL11] +VOLLBREMSUNGSBONUS: $ ~1~ Distanz: ~1~.~1~m Zeit: ~1~ Sekunden -[CV_28] -ROW: 29 MODEL: ct_man1 +[WHEEL12] +VOLLBREMSUNGSBONUS: $ ~1~ Distanz: ~1~ Fuß Zeit: ~1~ Sekunden -[CV_29] -ROW: 30 MODEL: ct_man2 +[WHEEL13] +VOLLBREMSUNGSBONUS: $ ~1~ Zeit: ~1~ Sekunden -[CV_30] -ROW: 31 MODEL: ct_wom1 +[WHEEL14] +VOLLBREMSUNGSBONUS: $ ~1~ Distanz: ~1~.~1~m -[CV_31] -ROW: 32 MODEL: ct_wom2 +[WHEEL15] +VOLLBREMSUNGSBONUS: $ ~1~ Distanz: ~1~ Fuß -[CV_32] -ROW: 33 MODEL: li_man1 +[ROK3_72] +Love Fist! -[CV_33] -ROW: 34 MODEL: li_man2 +[ROK3_74] +Ah, seht mal, was ist das? Hey, Tommy, leg mal dieses Band ein. -[CV_34] -ROW: 35 MODEL: li_wom1 - -[CV_35] -ROW: 36 MODEL: li_wom2 - -[CV_36] -ROW: 37 MODEL: docker1 - -[CV_37] -ROW: 38 MODEL: docker2 - -[CV_38] -ROW: 39 MODEL: scum_man - -[CV_39] -ROW: 40 MODEL: scum_wom - -[CV_40] -ROW: 41 MODEL: worker1 - -[CV_41] -ROW: 42 MODEL: worker2 - -[CV_42] -ROW: 43 MODEL: b_man1 - -[CV_43] -ROW: 44 MODEL: b_man2 - -[CV_44] -ROW: 67 MODEL: b_man3 - -[CV_45] -ROW: 45 MODEL: b_wom1 - -[CV_46] -ROW: 46 MODEL: b_wom2 - -[CV_47] -ROW: 70 MODEL: b_wom3 - -[CV_48] -ROW: 47 MODEL: mod_man - -[CV_49] -ROW: 48 MODEL: mod_wom - -[CV_50] -ROW: 49 MODEL: st_man - -[CV_51] -ROW: 50 MODEL: st_wom - -[CV_52] -ROW: 51 MODEL: fan_man1 - -[CV_53] -ROW: 52 MODEL: fan_man2 - -[CV_54] -ROW: 53 MODEL: fan_wom - -[CV_55] -ROW: 54 MODEL: hos_man - -[CV_56] -ROW: 55 MODEL: hos_wom - -[CV_57] -ROW: 56 MODEL: const1 - -[CV_58] -ROW: 57 MODEL: const2 - -[CV_59] -ROW: 58 MODEL: shopper1 - -[CV_60] -ROW: 59 MODEL: shopper2 - -[CV_61] -ROW: 60 MODEL: shopper3 - -[CV_62] -ROW: 61 MODEL: stud_man - -[CV_63] -ROW: 62 MODEL: stud_wom - -[CV_64] -ROW: 63 MODEL: cas_man - -[CV_65] -ROW: 64 MODEL: cas_wom - -[CV_79] -ROW: 123 MODEL: gang01 LEONE_A - -[CV_80] -ROW: 124 MODEL: gang02 LEONE_B - -[CV_81] -ROW: 69 MODEL: gang03 TRIAD_A - -[CV_82] -ROW: 3 MODEL: gang04 TRIAD_B - -[CV_83] -ROW: 4 MODEL: gang05 DIABLO_A - -[CV_84] -ROW: 5 MODEL: gang06 DIABLO_B - -[CV_85] -ROW: 68 MODEL: gang07 YAKUZA_A - -[CV_86] -ROW: 6 MODEL: gang08 YAKUZA_B - -[CV_87] -ROW: 7 MODEL: gang09 YARDIE_A - -[CV_88] -ROW: 8 MODEL: gang10 YARDIE_B - -[CV_89] -ROW: 9 MODEL: gang11 COLOMBIAN_A - -[CV_90] -ROW: 10 MODEL: gang12 COLOMBIAN_B - -[CV_91] -ROW: 11 MODEL: gang13 HOOD_A - -[CV_92] -ROW: 12 MODEL: gang14 HOOD_B - -[CV_93] -ROW: 89 MODEL: gang15 Forelli thug1 - -[CV_94] -ROW: 90 MODEL: gang16 Forelli thug2 - -[CV_95] -ROW: 88 MODEL: gang17 Sindacco thug1 - -[CV_96] -ROW: 89 MODEL: gang18 Sindacco thug2 - -[CV_109] -ROW: 65 MODEL: SAL_01 Salvatore (Mob Don) - -[CV_110] -ROW: 66 MODEL: RAY_01 Ray (Bad Cop) - -[CV_111] -ROW: 72 MODEL: VINC_01 Vincenzo Cilli - -[CV_112] -ROW: 73 MODEL: GRDANG1 Avenging Angel - -[CV_113] -ROW: 74 MODEL: NED_01 Ned Burner (Reporter) - -[CV_114] -ROW: 75 MODEL: MASTOR Massimo Torrini (Assassin) - -[CV_115] -ROW: 76 MODEL: TOOL_01 JD O'Toole - -[CV_116] -ROW: 77 MODEL: Not used Fthr Kenny - -[CV_117] -ROW: 78 MODEL: GRDANG2 Avenging Angel 2 - -[CV_118] -ROW: 79 MODEL: M_HOLE Mayor RC Hole - -[CV_119] -ROW: 80 MODEL: FRANFOR Franco Forelli - -[CV_120] -ROW: 81 MODEL: KAZUKI Kazuki Kasen - -[CV_121] -ROW: 82 MODEL: PAULIE Paulie Sindacco - -[CV_122] -ROW: 83 MODEL: HOPPER Jane Hopper - -[CV_123] -ROW: 84 MODEL: AVERY Avery Carrington - -[CV_124] -ROW: 85 MODEL: CASA Giovanni Casa - -[CV_125] -ROW: 86 MODEL: BABY Giovanni Casa (baby) - -[CV_126] -ROW: 87 MODEL: MCAFFRY Det. Leon McAffrey - -[CV_127] -ROW: 92 MODEL: EIGHT 8Ball - -[CV_128] -ROW: 93 MODEL: MAR_01 Maria - -[CV_129] -ROW: 94 MODEL: LOVE_01 Donald Love - -[CV_130] -ROW: 95 MODEL: MICKEYH Mickey H - -[CV_131] -ROW: 96 MODEL: WAYNE Wayne (Biker Dude) - -[CV_132] -ROW: 97 MODEL: BIKER1 Biker Dude 1 - -[CV_133] -ROW: 98 MODEL: BIKER2 Biker Dude 2 - -[CV_134] -ROW: 99 MODEL: DONOVAN O'Donovan - -[CV_135] -ROW: 100 MODEL: KAS_01 Toshiko Kasen (kimono) - -[CV_136] -ROW: 101 MODEL: WKAS_01 Toshiko Kasen (western) - -[CV_137] -ROW: 104 MODEL: JDMADE JD O'Toole - Made Man - -[CV_138] -ROW: 106 MODEL: THUG_01 Sicilian Thug 1 - -[CV_139] -ROW: 107 MODEL: THUG_02 Sicilian Thug 2 - -[CV_140] -ROW: 109 MODEL: CAMP_MAN Campaign Worker - -[CV_141] -ROW: 110 MODEL: CAMP_WOM Campaign Worker 2 - -[CV_142] -ROW: 111 MODEL: MIGUEL Miguel - -[CV_143] -ROW: 112 MODEL: DELIASS Deli Assistant - -[CV_144] -ROW: 113 MODEL: HOBO_01 Donald Love 2 - -[CV_68] -ROW: 122 MODEL: HITMAN Hitman - -[CV_146] -ROW: 125 MODEL: HOLEJOG Mayor RC Hole (Jogging outfit) - -[CV_147] -ROW: 126 MODEL: Chauff Chauffeur - -[CV_148] -ROW: 128 MODEL: plr2 (Lawyer) - -[CV_149] -ROW: 129 MODEL: plr3 (Travel clothes) - -[CV_150] -ROW: 130 MODEL: plr4 (Chauffeur) - -[CV_151] -ROW: 131 MODEL: plr5 (Hockey mask) - -[CV_152] -ROW: 132 MODEL: plr6 (Tuxedo) - -[CV_153] -ROW: 133 MODEL: plr7 (Avenging Angel) - -[CV_154] -ROW: 134 MODEL: plr8 (The King of Rock'n Roll) - -[CV_155] -ROW: 135 MODEL: plr9 (Cock's Mascot) - -[CV_156] -ROW: 136 MODEL: plr10 (Boxer Shorts) - -[CV_157] -ROW: 137 MODEL: plr11 (Bad Super Hero) - -[CV_158] -ROW: 138 MODEL: plr12 (Dragon) - -[CV_159] -ROW: 139 MODEL: PHILC Phil Cassidy - -[CV_160] -ROW: 140 MODEL: GREASE Grease Zuko - -[CV_161] -ROW: 141 MODEL: GUN_ASS Gun assistant - -[CV_162] -ROW: -- MODEL: JD_shot JD shot dead - -[CV_163] -ROW: -- MODEL: BODYBAG bodybag - -[CV_164] -ROW: 142 MODEL: SAL_CON Sal Convict - -[VV_131] -ID:131 MODEL: Landstalker (TBC) - -[VV_135] -ID:135 MODEL: Perenial (TBC) - -[VV_138] -ID:138 MODEL: Firetruck - -[VV_141] -ID:141 MODEL: Manana (TBC) - -[VV_148] -ID:148 MODEL: FBI Car (TBC) - -[VV_152] -ID:152 MODEL: Kuruma (TBC) - -[VV_164] -ID:164 MODEL: Dodo (TBC) - -[VV_169] -ID:169 MODELL: Rc Bandit - -[VV_170] -ID:170 MODEL: BellyUp (Triad) (TBC) - -[VV_172] -ID:172 MODEL: Leone Sentinel (TBC) - -[VV_174] -ID: 174 MODEL: Yakuza (TBC) - -[VV_179] -ID:179 MODEL: Flatbed (TBC) - -[VV_181] -ID:181 MODEL: Borgnine Taxi (TBC) - -[VV_188] -ID: 188 MODEL: Sindacco Argento (TBC) - -[VV_189] -ID: 189 MODEL: Forelli Lexcess (TBC) - -[VV_192] -ID:192 MODEL: Speeder (TBC) - -[BV_H1] -Press CIRCLE to swap building model. - -[BV_0A] -ROW: 2 - Portland. Safehouse Exterior. Press CIRCLE to swap. - -[BV_0B] -ROW:24 - Portland. Safehouse Interior. Press CIRCLE to swap. - -[BV_1] -ROW: 3 - Portland. Ferry Terminal. - -[BV_2A] -ROW: 4 - Portland. Callahan Bridge 1. Press CIRCLE to swap. - -[BV_2B] -ROW: 4 - Portland. Callahan Bridge 2. Press CIRCLE to swap. - -[BV_3] -ROW: 5 - Portland. Les Cargo Freighter. - -[BV_4A] -ROW: 6 - Portland. Doll's House Brothel 1. Press CIRCLE to swap. - -[BV_4B] -ROW: 6 - Portland. Doll's House Brothel 2. Press CIRCLE to swap. - -[BV_5] -ROW: 7 - Portland. Tower Block. - -[BV_6] -ROW: 8 - Portland. Eddie's Garage. - -[BV_7] -ROW: 9 - Portland. Bowler's Fist Pub. - -[BV_8] -ROW:10 - Portland. Hepburn Heights. - -[BV_9] -ROW:11 - Portland. Short Stay Hotel. - -[BV_10] -ROW:12 - Portland. Car Dealership. - -[BV_11] -ROW:13 - Portland. Bus Graveyard. - -[BV_12A] -ROW:14 - Portland. Drugs Warehouse 1 (awaiting approval). Press CIRCLE to swap. - -[BV_12B] -ROW:14 - Portland. Drugs Warehouse 2 (awaiting approval). Press CIRCLE to swap. - -[BV_13] -ROW:15 - Portland. Ma Cipriani's Restaurant. - -[BV_14] -ROW:17 - Portland. Basketball Court, Callahan. - -[BV_15] -ROW:18 - Portland. Bike Shop. - -[BV_16] -ROW:19 - Portland. Building near Basketball Court. - -[BV_17A] -ROW:20 - Portland. Luigi's Nightclub 1. - -[BV_17B] -ROW:20 - Portland. Luigi's Nightclub 2. - -[BV_17C] -ROW:20 - Portland. Luigi's Nightclub 3. - -[BV_18] -ROW:21 - Portland. Casa's Gourmet Deli. - -[BV_19] -ROW:22 - Portland. Rusty Ship. - -[BV_20] -ROW:23 - Portland. Door for Shopfront. - -[BV_21] -ROW:25 - Staunton. Casino. - -[BV_22] -ROW:26 - Staunton. Phil Cassidy's Store. - -[BV_23] -ROW:27 - Staunton. Zip store. - -[BV_24] -ROW:28 - Staunton. Container Park. - -[BV_25] -ROW:29 - Staunton. Ferry Terminal. - -[BV_26A] -ROW:30 - Staunton. Fort Staunton 1 NORTH. - -[BV_26B] -ROW:30 - Staunton. Fort Staunton 2 NORTH. - -[BV_27A] -ROW:30 - Staunton. Fort Staunton 1 SOUTH. - -[BV_27B] -ROW:30 - Staunton. Fort Staunton 2 SOUTH. - -[BV_28] -ROW:31 - Ferry - Not Visible At Present. - -[BV_29A] -ROW:32 - Staunton. Safehouse Exterior (unchanged). Press CIRCLE to swap. - -[BV_29B] -ROW:32 - Staunton. Safehouse Interior. Press CIRCLE to swap. - -[BV_30] -ROW:33 - Staunton. Steps Added To Building. - -[BV_31] -ROW:34 - Portland. Outbuilding. - -[BV_32A] -ROW:34 - Shoreside. Safehouse Exterior (unchanged). Press CIRCLE to swap. - -[BV_32B] -ROW:34 - Shoreside. Safehouse Interior. Press CIRCLE to swap. - -[BV_33] -Not in Doc - Staunton - Warehouse Interior (not internally approved). - -[BV_34A] -Not in Doc - Staunton - Church Exterior. Press CIRCLE to swap. - -[BV_34B] -Not in Doc - Staunton - Church Interior for scripted cutscene. Press CIRCLE to swap. - -[MODWOR] -Modify World Speed - -[MODTIT] -Changing World Speed - -[NEDS2] -Himmelfahrt und Hochkaräter - -[NEDS3] -Karmageddon - -[NEDS4] -Götzendämmerung - -[DONS1] -Der Leichenhauskandidat - -[GAR_WIL] -Fahr das Auto in die Garage. - -[DONS2] -Stimmenfang - -[DONS3] -Wahlkrampf - -[DONS4] -'Glimm'-Zettel - -[DONS5] -Love & Blei - -[DONS6] -Zettelwirtschaft - -[DONS7] -Schlechtes Vitamin B - -[DONS7AA] -Toni, du musst mir helfen! - -[DONS7AB] -O'Donovan hat Beweise für meine Verbindung zu Salvatore. Es ist aus! - -[DONS7AC] -Ruhig Blut. Beweise verschwinden jeden Tag. - -[DONS7AD] -Und Richter, Zeugen und Geschworene sowieso. - -[DONS7AE] -Gut, dass du das so siehst. - -[DONS7AF] -Einer meiner Leute ist dem Mann mit dem Beweismaterial gefolgt. - -[DONS7AG] -Er erwartet dich unter der Überführung in Newport. - -[SALS1] -Auf ins Grüne - -[SALS2] -Feuertaufe für Toni - -[SALS3] -In Flagranti - -[SALS4] -Rettungsdienste - -[SALS5] -Friedensmisshandlungen - -[SALS6] -Sarg für 'nen Singvogel - -[RAYS1] -Sayonara Sindaccos - -[RAYS2] -Yardie-'Party' - -[RAYS3] -Crazy '69' - -[RAYS4] -Yardie-Schutzengel - -[RAYS5] -Waffenschiebung - -[MC_01] -MOCAP Scenes - -[MC_02] -Während du den Cutscene-Selector benutzt, kannst du keine Mission ausführen. - -[MC_04] -Wähle die gewünschte Cutscene aus und drücke X. Drücke DREIECK zum Abbrechen. - -[MC_03] -~g~Cutscene-Name - Script-Name~w~ - -[MC_S01] -1. Biker - mar4 - -[MC_S02] -2. Bonevoy - jdt1 - -[MC_S03] -3. Campain - dons3 - -[MC_S04] -4. Cashchp - tosh4 - -[MC_S05] -5. Contban - sal5 - -[MC_S06] -6. Crazy69 - rays3 - -[MC_S07] -7. Cuttest - none - -[MC_S08] -8. Deadly - tosh1 - -[MC_S09] -9. Donprob - donh6 - -[MC_S10] -10. Drivnmr - sal8 - -[MC_S11] -11. Electon - dons7 - -[MC_S12] -12. Homswet - vic1 - -[MC_S13] -13. Hotwhel - vic6 - -[MC_S14] -14. Kidnapp - jdt5 - -[MC_S15] -15. Landgrb - donh1 - -[MC_S16] -16. Morgue - dons1 - -[MC_S17] -17. Overdos - mar5 - -[MC_S18] -18. Rufjust - salh1 - -[MC_S19] -19. Sayonar - rays1 - -[MC_S20] -20. sicilan - salh5 - -[MC_S21] -21. Theofer - sal1 - -[MC_S22] -22. Intro - -[MC_S23] -23. Final - -[MC_S24] -24. Final_2 - -[NEDS1] -L.C. Confidential - -[WILGAR2] -Steig aus dem Auto und geh nach draußen. - -{=================================== MISSION TABLE SAL1 ===================================} - -[SAL1_M1:SAL1] -~w~Salvatore will mit Ihnen reden. - -[SAL1_M2:SAL1] -~w~Ich spiele Salvatores Spielchen nicht mit. - -[SAL1_M3:SAL1] -~w~Danke für die Spende, Kleiner... bis bald mal. - -[SAL1_M5:SAL1] -~w~Hey! - -[SAL1_D1:SAL1] -~w~Hey! Streikbrecher! - -[SAL1_D2:SAL1] -~w~Schnappt ihn euch! - -[SAL1_D3:SAL1] -~w~Da ist er! - -[SAL1_D4:SAL1] -~w~Er ist da drüben! - -[SAL1_E1:SAL1] -~w~Flüchte von den Docks! - -[SAL1_A1:SAL1] -~w~Triff dich mit der Gewerkschaftsvorsitzenden, Jane Hopper, bei den ~y~Portland Docks. - -[THEO_01:SAL1] -Ey, Boss, geht's gut? - -[THEO_02:SAL1] -Sehe ich so aus? - -[THEO_03:SAL1] -Nein. - -[THEO_04:SAL1] -Sag mal, hast du nur Scheiße im Hirn? - -[THEO_05:SAL1] -Immer sagst du, was sowieso klar ist. - -[THEO_06:SAL1] -Unglaublich, mit was für Typen ich mich abgeben muss. - -[THEO_07:SAL1] -Entschuldigung. - -[THEO_08:SAL1] -Ich entschuldige mich. Du bist einer meiner getreuesten Verbündeten. - -[THEO_09:SAL1] -Was du getan hast, macht dich wie einen Sohn für mich. Mehr als mein Sohn, - -[THEO_10:SAL1] -mehr als jeder Sohn. - -[THEO_11:SAL1] -Deine Mutter ist zu beneiden. - -[THEO_12:SAL1] -So sagt man. - -[THEO_13:SAL1] -Anthony, Männer wie wir sind passé. - -[THEO_14:SAL1] -Wir sind Dinosaurier. Dodos. Dildos. Oder sowas. - -[THEO_15:SAL1] -Sogar in meiner eigenen Familie habe ich das Gefühl, von 12 Judassen umgeben zu sein. - -[THEO_16:SAL1] -Ich meine, hör dir das an: - -[THEO_17:SAL1] -Da bitte ich 'nen Gewerkschaftsboss, noch dazu 'ne Tussi, um 'nen Gefallen - -[THEO_18:SAL1] -und sie verlangt Geld von mir! - -[THEO_19:SAL1] -Dabei wollte ich nur für 24 Stunden Zugang zu den Docks, während der Streik lief - - -[THEO_20:SAL1] -den ich mitorganisiert hatte, damit meine Jungs Drogen entladen konnten - - -[THEO_21:SAL1] -und jetzt bringt sie diese Scheiße! - -[THEO_22:SAL1] -Dabei sind das Leute, für die ich persönlich gekämpft habe, - -[THEO_23:SAL1] -für die ich getötet habe. Ehrliche Leute. - -[THEO_26:SAL1] -Eine Schande. Wir sind erledigt, wir Ehrenmänner wie du und ich. - -[THEO_27:SAL1] -Hör zu, Toni, ich möchte, dass du ihr etwas bringst. - -[THEO_28:SAL1] -Sie lassen sich sowas von 'ner Tussi bieten? - -[THEO_29:SAL1] -Was bleibt mir vorerst übrig? - -[THEO_30:SAL1] -Hör mal, bring ihr die Knete und sag ihr, dass ich sie sprechen will. - -[THEO_31:SAL1] -Los. - -[THEO_24:SAL1] -- Und so danken sie es mir? ~n~ - Beleidigend ist das. - -{=================================== MISSION TABLE SAL2 ===================================} - -[SAL2_N:SAL2] -Girls - -[SAL2_A0:SAL2] -~w~Ist das einer von deinen neuen Fiffis, Sal? - -[SAL2_A1:SAL2] -~w~Mr. Leone? - -[SAL2_A2:SAL2] -~w~Toni! Come sta? - -[SAL2_A3:SAL2] -~w~Schön, dass du da bist. Du musst etwas für mich erledigen... - -[SAL2_A4:SAL2] -~w~Wenn die Schlampe von der Gewerkschaft nicht will, dann aber vielleicht ihre Jungs. Capiche? - -[SAL2_A:SAL2] -~w~Sammle 6 ~b~Nutten~w~ auf und bring sie zu den Streikposten bei den Portland Docks. - -[SAL2_B0:SAL2] -~w~Süßer, ich steh nicht auf so'n 'Zwei-für-einen'-Scheiß! - -[SAL2_B1:SAL2] -~w~Wenn du mehr Platz hast, dann kannst du mal auf mir Platz nehmen! Ich fahr nicht auf dem Dachgepäckträger! - -[SAL2_D0:SAL2] -~w~Bist du allein, Sweetie? - -[SAL2_D1:SAL2] -~w~Hey, Hübscher, hast du Lust auf ein bisschen Spaß? - -[SAL2_D2:SAL2] -~w~Schnuckelchen... wie wär's denn mit uns beiden? - -[SAL2_D3:SAL2] -~w~Lust auf 'ne kleine Privatparty, Süßer? - -[SAL2_D4:SAL2] -~w~Hey, Baby, willst du dich amüsieren? - -[SAL2_D5:SAL2] -~w~Hi, Süßer! Ich bin Candy! - -[SAL2_F0:SAL2] -~w~Hey! Ich komm auch mit! - -[SAL2_F1:SAL2] -~w~Also, nur wir zwei Hübschen, hä? - -[SAL2_F2:SAL2] -~w~Machen wir's jetzt, oder was? - -[SAL2_F3:SAL2] -~w~Lust auf 'ne kleine Privatparty? - -[SAL2_F4:SAL2] -~w~Oh, Mann, jetzt hab dich nicht so. - -[SAL2_F5:SAL2] -~w~Ich will nur ein bisschen Fez mit dir machen! - -[SAL2_G0:SAL2] -~w~Bring sie zu den ~y~Streikposten! - -[SAL2_G1:SAL2] -~w~Bring die Girls zu den ~y~Streikposten! - -[SAL2_G2:SAL2] -~w~Kümmere dich um den ~r~Freier! - -[SAL2_G3:SAL2] -~w~Kümmere dich um die ~r~Freier! - -[SAL2_G4:SAL2] -~w~Hol mehr ~b~Girls! - -[SAL2_H:SAL2] -~w~Lust auf 'ne kleine Privatparty, Süßer? - -[SAL2_P:SAL2] -~w~Viel Spaß, Jungs! Das spendiert Salvatore Leone! - -[SAL2_I0:SAL2] -~w~Such dir selber 'n Girl, Arschgesicht! Die gehört mir! - -[SAL2_I1:SAL2] -~w~Hey! Bist du ein Spanner, oder was! - -[SAL2_I3:SAL2] -~w~Hey! Wer ist das, verdammt? Den schnappen wir uns! - -[SAL2_I5:SAL2] -~w~Hey, Freundchen, hinten anstellen! Wir waren zuerst da. - -[SAL2_I7:SAL2] -~w~Du bist der Beste! Nicht aufhören... oh, ja, Daddy! - -[SAL2_I9:SAL2] -~w~Also, an die Arbeit... - -[SAL2_K0:SAL2] -~w~Leg dich nie mit Toni Cipriani an! - -[SAL2_K1:SAL2] -~w~Komm! Mach schon! - -[SAL2_K2:SAL2] -~w~Mach schon, Mädchen! Beweg den Arsch! - -[SAL2_C0:SAL2] -~w~Hey! Komm zurück, Baby! ...Ich beiß nicht! - -[SAL2_C1:SAL2] -~w~Hey! Baby! Wo willst du hin? - -[SAL2_L0:SAL2] -~w~Ich warte hier nicht den ganzen Tag, Arschloch! - -[SAL2_L1:SAL2] -~w~Schätzchen, meine Zeit kostet Geld! - -[SAL2_X0:SAL2] -~r~Die Zeit ist um! - -[SAL2_X1:SAL2] -~r~Du hast zu viele Nutten erledigt! - -[SAL2_X2:SAL2] -~r~Du hast die Dockarbeiter angegriffen. Jetzt vertrauen sie dir nie mehr! - -[SAL2_X3:SAL2] -~r~Du hast die Girls der Dockarbeiter angegriffen. Jetzt vertrauen sie dir nie mehr! - -[SAL2_G5:SAL2] -~w~Sieht so aus, als hättest du einen Verehrer. - -[SAL2_I8:SAL2] -~w~Süße, du willst doch nicht ins Kittchen, oder? - -[SAL2_I6:SAL2] -~w~Ja! Ja! ... - -[SAL2_M:SAL2] -~w~Versuch, sie möglichst nicht umzubringen. Finde ein anderes ~b~Girl! - -[SAL2_W1:SAL2] -~w~Du hast nur bis 0~1~:~1~ Uhr Zeit, bevor die Streikposten Schichtwechsel haben! - -[SAL2_W2:SAL2] -~w~Du hast nur bis ~1~:~1~ Uhr Zeit, bevor die Streikposten Schichtwechsel haben! - -[SAL2_G6:SAL2] -~w~Halte in der ~y~gelben Markierung~w~, um die Girls abzusetzen. - -[SAL2_G7:SAL2] -~w~Störe den Freier, damit das ~b~Girl~w~ aus dem Auto steigt. - -[SAL2_B:SAL2] -~w~Es passen keine Girls mehr in dein Auto. - -{=================================== MISSION TABLE SAL3 ===================================} - -[SAL3_A0:SAL3] -~w~Toni! Wie geht's dir, mein Junge? - -[SAL3_A1:SAL3] -~w~Du siehst mager aus. Kocht dir deine Mama nichts Anständiges? - -[SAL3_A2:SAL3] -~w~Mir geht's gut, Mr. Leone. - -[SAL3_A3:SAL3] -~w~Hör mal, diese Gewerkschaftler - die nerven mich langsam. - -[SAL3_A5:SAL3] -~w~aber wir müssen ein paar von den 'weniger einsichtigen' Gewerkschaftsfunktionären mehr Druck machen. - -[SAL3_B0:SAL3] -~w~Jag den ~r~Gewerkschaftsfunktionären~w~ Angst ein, damit sie kapieren! - -[SAL3_B3:SAL3] -~w~Die sollen ab jetzt tun, was sie gesagt bekommen. - -[SAL3_BA:SAL3] -~w~Sie sind verrückt, Mann! Ich will keinen Ärger mehr! - -[SAL3_CA:SAL3] -~w~Was soll das? Sind Sie verrückt? - -[SAL3_DA:SAL3] -~w~Das Auto war bis auf zwei Raten abbezahlt! Du Hurensohn! - -[SAL3_BB:SAL3] -~w~Ab sofort tust du, was man dir sagt! - -[SAL3_CB:SAL3] -~w~Misch dich nicht in Leone-Angelegenheiten! - -[SAL3_A4:SAL3] -~w~Anscheinend kommen zwar manche inzwischen zur Vernunft, - -[SAL3_A6:SAL3] -~w~Verstehst du, was ich meine? - -[SAL3_B1:SAL3] -~w~Wie willst du dein Argument anbringen, wenn sie alle tot sind? Bring keine weiteren ~r~Gewerkschaftsbosse~w~ um! - -[SAL3_B2:SAL3] -~r~Du solltest sie einschüchtern, nicht umbringen! - -[SAL3_B4:SAL3] -~w~Such dir einen anderen ~r~Gewerkschaftsboss~w~, um ihm Vernunft beizubringen. - -{=================================== MISSION TABLE SAL5 ===================================} - -[SAL5_D3:SAL5] -~w~Fahr das ~h~Fahrzeug ~w~in die Garage. - -[SAL5_D4:SAL5] -~w~Steig aus und lass das Fahrzeug in der ~h~Garage. - -[SAL5_B:SAL5] -~w~Beschaff dir einen Viersitzer und lade ein paar Mann als ~b~Verstärkung~w~ ein. - -[SAL5_C:SAL5] -~w~Du brauchst einen Viersitzer. - -[SAL5_C0:SAL5] -~w~Hol dir ~b~Verstärkung. - -[SAL5_C1:SAL5] -~w~Du brauchst ein Fahrzeug mit mehr Sitzplätzen für mehr ~b~Verstärkung. - -[SAL5_C2:SAL5] -~w~Fahr zu den ~y~Portland Docks. - -[SAL5_AA:SAL5] -~w~Heeey... Alter... ich warte schon seit Stunden auf dich! - -[SAL5_AB:SAL5] -~w~Hör auf zu meckern, Miguel. Hast du den Stoff? - -[SAL5_AG:SAL5] -~w~...hast du unser Geld? - -[SAL5_AH:SAL5] -~w~Klar... - -[SAL5_AI:SAL5] -~w~Was? - -[SAL5_AJ:SAL5] -~w~Du scheiß Latinoarsch! - -[SAL5_C8:SAL5] -~w~Steig in das ~b~Drogenfahrzeug~w~ und dann nichts wie weg hier! - -[SAL5_C9:SAL5] -~w~Bring das Fahrzeug zu ~y~Salvatores Garage. - -[SAL5_D1:SAL5] -~w~Steig wieder in das ~b~Fahrzeug! - -[SAL5_D2:SAL5] -~r~Die Drogen wurden zerstört! - -[SAL5_AF:SAL5] -~w~Hehehe! Ich mag dich, Toni. Du hast große Eier - wie ein Stier! - -[SAL5_C3:SAL5] -~w~Schüttle die Cops ab! - -[SAL5_D5:SAL5] -~r~Die Drogen wurden beschlagnahmt! - -[SAL5_AD:SAL5] -~w~Hey, ich bin ein vielbeschäftigter Mann, Toni. Das nächste Mal verkauf ich an 'nen anderen! - -[SAL5_AE:SAL5] -~w~Ja. Ich bezweifle, dass du einen findest, der so viel zahlt wie wir. - -[SAL5_D6:SAL5] -~w~Erledige die ~r~Drogendealer. - -[CONT_01:SAL5] -Halt's Maul, undankbares Miststück. - -[CONT_06:SAL5] -Sonst fasst du mich ja in letzter Zeit nicht an. - -[CONT_07:SAL5] -Warum sollte ich dich Miststück anfassen? - -[CONT_08:SAL5] -Ich mag keine Gebrauchtwaren. - -[CONT_09:SAL5] -Du ekelst mich an. - -[CONT_12:SAL5] -Bitte! Weißt du, was? - -[CONT_15:SAL5] -Hallo, Toni. - -[CONT_16:SAL5] -Ich will meine Kohle, alter Sack! - -[CONT_17:SAL5] -Hau ab, du Flittchen. - -[CONT_18:SAL5] -Hey, Anthony, du Retter in der Not. - -[CONT_19:SAL5] -Weiber - was will man machen, hm? - -[CONT_20:SAL5] -Zum Glück kann ich einem im Leben trauen - dir, Toni. - -[CONT_21:SAL5] -Du bedeutest mir wirklich viel. Hab ich dir das je gesagt? - -[CONT_22:SAL5] -Krieg erst mal einen hoch, alter Drecksack! - -[CONT_23:SAL5] -Bei dir Schlampe nicht. Öffentliche Klos machen mich nicht an. - -[CONT_24:SAL5] -Es ist wichtig, also hör zu. Wir beide haben jetzt allein das Sagen. - -[CONT_25:SAL5] -Wir haben diese Idioten vertrieben. - -[CONT_26:SAL5] -Woher willst du das wissen? Du bist doch lieber mit Kerlen zusammen! - -[CONT_27:SAL5] -Und du bist nur zufrieden, wenn du mit runtergezogenem Schlüpfer - -[CONT_28:SAL5] -gegen 'ne Wand gelehnt stehst! - -[CONT_29:SAL5] -Mensch, es gibt Karnickel, die weniger rammeln als du! - -[CONT_33:SAL5] -Jedenfalls erwarte ich 'ne Lieferung du weißt schon was. - -[CONT_34:SAL5] -Die Sache wird uns - dich und mich - ganz groß machen. - -[CONT_35:SAL5] -Es dürfte alles glatt laufen. - -[CONT_36:SAL5] -Ich brauche nur jemanden, dem ich vertrauen kann, der's für mich abwickelt. - -[CONT_37:SAL5] -Na gut, Toni, wir sprechen uns später. - -[CONT_38:SAL5] -Und noch was - mir ist noch nie 'ne Puppe mit 'nem Hydraulik-Slip untergekommen. - -[CONT_39:SAL5] -Nicht zu fassen! Warum hab ich sie geheiratet? - -[CONT_40:SAL5] -Ich wollte 'ne Schlampe und heirate 'ne Nutte! - -[CONT_41:SAL5] -In 'nem früheren Leben hab ich jemanden echt sauer gemacht, - -[CONT_42:SAL5] -so viel steht fest. - -[CONT_02:SAL5] -- Noch ein Wort und ich schick dich für 'ne Woche ins Krankenhaus. ~n~ - Ja klar, du Flachwichser. - -[CONT_04:SAL5] -- Willst du mal wieder zuschlagen? ~n~ - Ich sollte dir... - -[CONT_10:SAL5] -- Ich ekel dich an?! ~n~ - Jawohl! - -[CONT_13:SAL5] -- Mein Vater hatte Recht damit, dass du nur ein widerlicher Fettsack bist... ~n~ - Ja, ja, ja... - -[CONT_43:SAL5] -- Hör zu, es ist wichtig... ~n~ - Ach, leck mich doch, Salvatore Leone, - -[CONT_31:SAL5] -- du schwanzloser, prügelnder, italienischer Scheißkerl! ~n~ - Lecken soll ich dich? Bestimmt nicht. Das macht doch sonst jeder! - -{=================================== MISSION TABLE SAL4 ===================================} - -[SAL4_I1:SAL4] -~w~Dieser Streik geht weiter, bis die Stadt uns Garantien gibt! - -[SAL4_I2:SAL4] -~w~Mafiosi! Denken, die Gewerkschaft würde nach ihrer Pfeife tanzen - von wegen! - -[SAL4_I3:SAL4] -~w~Mir machen die keine Angst! - -[SAL4_I4:SAL4] -~w~Ich hab mehr Mumm als die alle zusammen! - -[SAL4_I5:SAL4] -~w~Hör dir den Scheiß an. - -[SAL4_I6:SAL4] -~w~Ich sollte die Schlampe umnieten lassen. Die verscheißert mich! - -[SAL4_I7:SAL4] -~w~Na, was die kann, kann ich auch. - -[SAL4_I8:SAL4] -~w~Toni, du überbringst eine Nachricht für mich! - -[SAL4_A2:SAL4] -~w~Jetzt zieh den ~r~Chauffeur~w~ aus dem Verkehr. - -[SAL4_A3:SAL4] -~w~Hey! - -[SAL4_A4:SAL4] -~w~Steig in die ~b~Limo. - -[SAL4_A5:SAL4] -~w~Fahr mit der Limousine zum ~y~Radiosender! - -[SAL4_A6:SAL4] -~w~Jetzt warte auf Hopper. - -[SAL4_A7:SAL4] -~w~Stell die Limo wieder auf ihren Platz. Hopper darf keinen Verdacht schöpfen. - -[SAL4_B1:SAL4] -~w~Harwood Fährhafen und zwar flott! - -[SAL4_B2:SAL4] -~w~Wie Sie wünschen! - -[SAL4_C1:SAL4] -~w~Jag Hopper eine Heidenangst ein! - -[SAL4_C2:SAL4] -Angst - -[SAL4S1:SAL4] -~w~Hey, langsam, wir fahren hier kein Rennen! - -[SAL4S2:SAL4] -~w~Ist das auch der richtige Weg? - -[SAL4S3:SAL4] -~w~Hey, Sie sind gar nicht mein Fahrer! - -[SAL4S4:SAL4] -~w~Verdammt, wer sind Sie?! - -[SAL4S5:SAL4] -~w~Halt's Maul! - -[SAL4S6:SAL4] -~w~Ab sofort tust du genau das, was Salvatore Leone dir sagt! - -[SAL4S7:SAL4] -~w~Capiche? - -[SAL4S8:SAL4] -~w~Da... damit machen Sie mir keine Angst! - -[SAL4S9:SAL4] -~w~Abwarten! - -[SAL4S10:SAL4] -~w~Lassen Sie mich sofort aussteigen! - -[SAL4S11:SAL4] -~w~Bitte! Sie bringen uns beide um! - -[SAL4S12:SAL4] -~w~Neeeiiin! - -[SAL4S13:SAL4] -~w~Womit habe ich das verdient? - -[SAL4_F1:SAL4] -~w~Wo ist meine Limousine? - -[SAL4_F2:SAL4] -~w~Sie sind nicht mein Fahrer. Ich rufe die Polizei! - -[SAL4_F3:SAL4] -~r~Zu spät, Hopper ist dir draufgekommen! - -[SAL4_F4:SAL4] -~w~Salvatore kann mich kreuzweise! - -[SAL4_F5:SAL4] -~r~Die Limousine wurde zerstört! - -[SAL4_F6:SAL4] -~r~Hopper ist tot! - -[SAL4_F7:SAL4] -~r~Hopper ist entkommen! - -[SAL4_F8:SAL4] -~r~Die verbeulte Limousine hat Hopper verschreckt. - -[SAL4_F9:SAL4] -~r~Hopper wurde verschreckt. - -[SAL4_P1:SAL4] -~w~Okay! Okay! Ich habe genug! - -[SAL4P1A:SAL4] -~w~Ich tue, was Sie wollen. - -[SAL4_P2:SAL4] -~w~Bring Hopper zu den Streikposten am ~y~Fährhafen. - -[SAL4_P3:SAL4] -~w~Und denken Sie an unsere kleine Abmachung, Lady! - -[SAL4_H1:SAL4] -~w~Eine Mischung aus Tempo, Karambolagen und Stunt-Sprüngen sollte Hopper gefügig machen. - -[SAL4_F0:SAL4] -~r~Zu spät! Hopper hat den Radiosender verlassen! - -[SAL4_A:SAL4] -~w~Du musst zu dem ~y~Radiosender~w~, bevor Hopper ihn um 0~1~:00 Uhr verlässt. - -[SAL4_A1:SAL4] -~w~Du musst zu dem ~y~Radiosender~w~, bevor Hopper ihn um ~1~:00 Uhr verlässt. - -{=================================== MISSION TABLE SAL6 ===================================} - -[SAL6_A0:SAL6] -~w~Toni, wir haben Ärger! Großen Ärger! - -[SAL6_A1:SAL6] -~w~Was ist los, Sal? - -[SAL6_A3:SAL6] -~w~Die machen uns fertig! - -[SAL6_A4:SAL6] -~w~Da haben wir gerade einen Krieg hinter uns und PÄNG! - stecken wir mitten im nächsten! - -[SAL6_A5:SAL6] -~w~Ich sag's dir - gerade wo's aufwärts ging! Mir klebt ein scheiß Fluch am Leib! - -[SAL6_A6:SAL6] -~w~Hey, keine Sorge, Boss! Ich kümmere mich darum. - -[SAL6_AA:SAL6] -~w~Sal hat die Waffen, die du brauchst, in der Garage deponiert. - -[SAL6_B:SAL6] -~w~Schlage die ~r~Diablos~w~ zurück, ehe alle Leone-Gangster tot sind! - -[SAL6_1:SAL6] -~w~Es sind nur noch ~1~ Leones am Leben! - -[SAL6_2:SAL6] -~w~Es ist nur noch 1 Leone am Leben! - -[SAL6_C1:SAL6] -~w~Wir werden hier massakriert, Toni! - -[SAL6_C2:SAL6] -~w~Für so'n Scheiß krieg ich zu wenig bezahlt, Mann! - -[SAL6_C3:SAL6] -~w~Du bist irre, Toni! Wir gehen alle drauf! - -[SAL6_E1:SAL6] -~w~Sal? - -[SAL6_E2:SAL6] -~w~Toni! Ist es vorbei? Wie lief's? - -[SAL6_E3:SAL6] -~w~Sieht nicht gut aus, Sal. - -[SAL6_E4:SAL6] -~w~Ein paar Jungs konnte ich retten, aber es gab vorher schon zu viele Verluste. - -[SAL6_E5:SAL6] -~w~Ich glaub, den Teil der Stadt verlieren wir. - -[SAL6_E6:SAL6] -~w~Nur über meine Leiche! Noch ist es nicht vorbei! - -[SAL6_E7:SAL6] -~w~Gar nichts verlier ich! Die Leones geben niemals klein bei! - -[SAL6_E8:SAL6] -~w~Hast du gehört, Toni? - -[SAL6_E9:SAL6] -~w~Hab verstanden, Sal. - -[SAL6_G0:SAL6] -~r~Alle Leone-Leute sind tot. - -[SAL6_Z1:SAL6] -Leones - -[SAL6_Z2:SAL6] -Diablos - -[SAL6_X0:SAL6] -Got threat - -[SAL6_X1:SAL6] -Had threat - -[SAL6_X2:SAL6] -Find threat - -[SAL6_X3:SAL6] -Complain - -[SAL6_C0:SAL6] -~w~Lass die Wichser! Verschwinden wir schleunigst hier! - -[SAL6_A2:SAL6] -~w~Wo soll das noch enden? Die Diablos haben in Hepburn einen Großangriff auf uns gestartet! - -{=================================== MISSION TABLE SAL7 ===================================} - -[SAL7_01:SAL7] -~w~Hey, Sal! - -[SAL7_02:SAL7] -~w~Toni! Wie findest du mein neues Auto? - -[SAL7_05:SAL7] -~w~Ein Prachtstück, hä? Luxusausstattung, das Beste vom Besten. - -[SAL7_A6:SAL7] -~w~...ach so, Midlife-Krise! - -[SAL7_07:SAL7] -~w~Schnauze! Toni, hör zu. - -[SAL7_08:SAL7] -~w~In meinem Lagerhaus am Callahan Point liegt ein Riesenhaufen Geld. Das müsste abgeholt werden. - -[SAL7_10:SAL7] -~w~Außer dir trau ich da keinem. - -[SAL7_11:SAL7] -~w~Mädels, wollt ihr den ganzen Tag quatschen, oder fahren wir? - -[SAL7_12:SAL7] -~w~Verdammt, Weib! Hab ich dir erlaubt, den Mund aufzumachen? - -[SAL7_20:SAL7] -~w~Komm! Beeil dich! - -[SAL7_21:SAL7] -~w~Okay... - -[SAL7_22:SAL7] -~w~Los geht's! - -[SAL7_23:SAL7] -~w~Hey, Toni! Come sta? - -[SAL7_30:SAL7] -~w~Du musst zu dem ~y~Lagerhaus. - -[SAL7_40:SAL7] -~w~Hol Salvatores gesamtes Geld raus, ehe es in Flammen aufgeht! - -[SAL7_50:SAL7] -~w~Bring die Beute zu ~y~Salvatore. - -[SAL7_NM:SAL7] -~w~Geh wieder rein! Du hast noch nicht das ganze ~g~Geld. - -[SAL7_E1:SAL7] -~w~Macht ihn fertig! - -[SAL7_E2:SAL7] -~w~Stirb! - -[SAL7_E3:SAL7] -~w~Da ist einer! - -[SAL7_E4:SAL7] -~w~Ich sehe ihn! - -[SAL7_T1:SAL7] -~w~Zurück! - -[SAL7_T2:SAL7] -~w~Wie schmeckt dir das! - -[SAL7_T3:SAL7] -~w~Na, komm! - -[SAL7_T4:SAL7] -~w~Friss das! - -[SAL7_F1:SAL7] -~r~Du hast Salvatores Geld nicht rechtzeitig geborgen! - -[SAL7_06:SAL7] -~w~Was stinkt denn da so? - -[SAL7_42:SAL7] -~w~Hol dir das ~g~Geld~w~, bevor es zu brennen anfängt! - -{=================================== MISSION TABLE SAL8 ===================================} - -[SAL8_VE:SAL8] -~r~v1.2 - -[SAL8_11:SAL8] -~w~Hol ein Auto, Toni, wir fahren wohin... - -[SAL8_12:SAL8] -~w~Fahr Richtung Fähranlegestelle. - -[SAL812A:SAL8] -~w~Aber die streiken noch... es gehen keine Fähren. - -[SAL812B:SAL8] -~w~Fahr einfach. Überlass das Denken mir. - -[SAL8_14:SAL8] -~w~Heiliger Bimbam! Hier wimmelt's nur so von Bullen! Nichts wie weg hier, verdammt! - -[SAL8_15:SAL8] -~w~Wo fahren wir hin? - -[SAL8_16:SAL8] -~w~Callahan Bridge! - -[SAL816A:SAL8] -~w~Die Callahan Bridge ist noch nicht fertig! - -[SAL816B:SAL8] -~w~Gleich sind aber wir 'fertig', wenn du nicht fährst! Gib Gas! - -[SAL816C:SAL8] -~w~Fahr zur ~y~Callahan Bridge. - -[SAL8_17:SAL8] -~w~Was soll das, verdammt? - -[SAL8_18:SAL8] -~w~Toni! Wir brauchen ein Auto! - -[SAL818A:SAL8] -~w~Ich hab nicht vor, zu Fuß zu gehen! - -[SAL8_19:SAL8] -~w~Du hast ~b~Salvatore~w~ zurückgelassen. Hol ihn! - -[SAL8_20:SAL8] -~w~Bring uns hier weg! - -[SAL8_22:SAL8] -~w~Toni, du hast es geschafft! Ich wusste, auf dich ist Verlass! - -[SAL822B:SAL8] -Hör zu, ich kenn einen sicheren Ort, wo wir 'ne Weile untertauchen können. - -[SAL822C:SAL8] -Komm, fahren wir. - -[SAL8_25:SAL8] -~w~Du musst alles aus der Scheißkarre rausholen! Drück drauf, Toni! - -[SAL825A:SAL8] -~w~OH, SHIIIIIIIIIIIIIT! - -[SAL8_26:SAL8] -Sprungtempo - -[SAL8_27:SAL8] -~w~Ja. Da wären wir. - -[SAL8_28:SAL8] -~w~Ich seh mich mal um. Verschaff mir 'nen Überblick. - -[SAL828A:SAL8] -~w~Vielleicht sehen wir uns dann später wieder hier. - -[SAL8_29:SAL8] -~r~Sal ist tot! - -[SAL829A:SAL8] -~w~Die Cops haben dich entdeckt! - -[SAL831:SAL8] -~w~Versteck in Staunton jetzt verfügbar! - -[SAL833:SAL8] -~w~Hau vor den Cops ab! - -[SAL823A:SAL8] -~w~Oder vielleicht doch nicht? - -[SAL8_24:SAL8] -~w~Obwohl die U-Bahn- und Fährlinien den Betrieb offiziell wieder aufgenommen haben, - -[SAL824A:SAL8] -~w~setzen militante Arbeiter ihre Blockade in Teilen der Stadt fort. - -[SAL824B:SAL8] -~w~Die Hebebrücke zwischen Staunton Island und Shoreside Vale wurde geschlossen. - -[SAL824C:SAL8] -~w~Die Streikenden misstrauen den Versprechungen der Stadtverwaltung bezüglich der Zukunft der Fähren. - -[SAL824D:SAL8] -~w~Ein kleiner Lichtblick: die Callahan Bridge nähert sich ihrer Fertigstellung. - -[SAL824E:SAL8] -~w~Aber dieser Liberty City-Pendler hatte das Warten satt. - -[SAL8_23:SAL8] -~w~Die Arbeitskampfmaßnahmen, die Portland vom Rest der Stadt abgeschnitten hatten, sind endlich beendet. - -[SAL812C:SAL8] -~w~Fahr zur ~y~Fähranlegestelle. - -[SAL8WAN:SAL8] -Die Cops wollen Salvatore UNBEDINGT! Das Fahrzeug umzuspritzen, wird sie nur kurze Zeit von seiner Fährte ablenken. - -[SAL8_21:SAL8] -~w~Fahr zu der ~y~Brücke! - -[SAL830:SAL8] -~w~Begib dich zu dem ~y~Versteck. - -[SAL822A:SAL8] -~w~Ich könnte dich küssen, wenn du rasiert wärst! - -[SAL832:SAL8] -~w~Du brauchst einen fahrbaren Untersatz! - -[DRIV_01:SAL8] -Also? - -[DRIV_02:SAL8] -Also was? - -[DRIV_03:SAL8] -Stell dich nicht blöd, Kleiner. - -[DRIV_06:SAL8] -Ich weiß, was du über mich verbreitest. - -[DRIV_07:SAL8] -Du hältst mich für dämlich, hä? - -[DRIV_08:SAL8] -Stimmt das? - -[DRIV_09:SAL8] -Boss, ich hab gar nichts über Sie verbreitet. - -[DRIV_10:SAL8] -Ach, Scheiße. Ich weiß auch nicht, was mit mir los ist. - -[DRIV_11:SAL8] -Herr im Himmel. - -[DRIV_12:SAL8] -Ich leide langsam unter Verfolgungswahn, Toni. Scheiße. - -[DRIV_13:SAL8] -Nur, weil ich glaube, dass alle mich hassen, heißt das nicht, dass es nicht stimmt, verstehst du? - -[DRIV_14:SAL8] -Das Schwein von Bürgermeister will mich fertig machen! - -[DRIV_15:SAL8] -Er will mir jede Scheiße in die Schuhe schieben, die im Viertel passiert ist. - -[DRIV_16:SAL8] -Und nicht nur das, was auf meine Kappe geht, sondern alles. - -[DRIV_17:SAL8] -Komm, nehmen wir uns der Sache an. - -[DRIV_04:SAL8] -- Das hab ich schon gemacht, als deine Mutter noch anschaffen ging. ~n~ - Was ist denn los? - -{=================================== MISSION TABLE JDT1 ===================================} - -[JDT1_CA:JDT1] -~w~Ich bin mir sicher, dass die Girls mich übers Ohr hauen. - -[JDT1_CB:JDT1] -~w~Wir sollten uns mal in der Gegend umsehen, was da los ist. - -[JDT1_DA:JDT1] -~w~Da ist eins meiner Girls! - -[JDT1_DB:JDT1] -~w~Hey! Die kenn ich. - -[JDT1_DC:JDT1] -~w~Die ist eins von meinen Girls. - -[JDT1_DD:JDT1] -~w~Das ist eins von unseren Girls. - -[JDT1_DE:JDT1] -~w~Das Girl da... - -[JDT1_DF:JDT1] -~w~Halt bei ihr an. - -[JDT1_DG:JDT1] -~w~Halt neben der an. - -[JDT1_DH:JDT1] -~w~Reden wir mal mit ihr. - -[JDT1_DI:JDT1] -~w~Park neben ihr. - -[JDT1_DJ:JDT1] -~w~Fahr zu ihr hin. - -[JDT1_MA:JDT1] -~w~Hi, JD. Das wollte ich gerade bei dir abliefern, ehrlich! - -[JDT1_MB:JDT1] -~w~Jesus! Traust du mir nicht mehr, JD? - -[JDT1_MC:JDT1] -~w~Hey, JD. War 'n schlechter Tag... mehr hab ich nicht. - -[JDT1_MD:JDT1] -~w~Big Brother's watching, oder wie? Hier hast du dein Scheißgeld! - -[JDT1_ME:JDT1] -~w~Hey, JD. Hier hab ich dein Geld. - -[JDT1_MF:JDT1] -~w~Hast du gedacht, ich liefere das nicht bei dir ab, oder was? - -[JDT1_MG:JDT1] -~w~Überwachst du uns jetzt alle, JD? - -[JDT1_MH:JDT1] -~w~Alles da... kannst ja nachzählen! - -[JDT1_EA:JDT1] -~w~Hey! Der Zuhälter kassiert eins von meinen Girls ab! - -[JDT1_EB:JDT1] -~w~Hol mir das Geld zurück, Toni! - -[JDT1_EC:JDT1] -~w~Was macht der Zuhälter da, verdammt? - -[JDT1_ED:JDT1] -~w~Er sackt mein Geld ein! - -[JDT1_EE:JDT1] -~w~Schnapp ihn dir, Toni! - -[JDT1_45:JDT1] -~w~Hol dir von dem Zuhälter das ~g~Geld. - -[JDT1_46:JDT1] -~w~Der Zuhälter ist entkommen! - -[JDT1_FA:JDT1] -~w~Das ist eins von meinen Girls in dem Auto! - -[JDT1_FB:JDT1] -~w~Setz langsam zu dem ~b~Auto~w~ zurück, ganz nahe, damit ich mir das ansehen kann. - -[JDT1_FC:JDT1] -~w~...schön langsam, wir wollen sie schließlich nicht stören! - -[JDT1_FD:JDT1] -~w~Näher... - -[JDT1_FE:JDT1] -~w~Näher... - -[JDT1_FF:JDT1] -~w~Langsam... - -[JDT1_IA:JDT1] -~w~Zum Kuckuck, Toni! Du hast sie verscheucht! - -[JDT1_GA:JDT1] -~w~Jesus, Toni! Ich seh überhaupt nichts! - -[JDT1_75:JDT1] -~w~Warte bis das ~b~Girl~w~ JD ihr Geld gibt! - -[JDT1_HA:JDT1] -~w~...oh, ja! - -[JDT1_HB:JDT1] -~w~Weiter, Baby! - -[JDT1_HC:JDT1] -~w~So ist's gut. So ist's gut. - -[JDT1_HD:JDT1] -~w~...oh, JA! - -[JDT1_HE:JDT1] -~w~Das ist wunderbar! - -[JDT1_HF:JDT1] -~w~Sind wir hier fertig? - -[JDT1_JA:JDT1] -~w~Gute Arbeit, Toni! - -[JDT1_JB:JDT1] -~w~Glaub nicht, dass die Girls mir auf dieser Schicht noch mal Ärger machen. - -[JDT1_LA:JDT1] -~w~Toni! Das hast du sauber vermasselt! - -[JDT1_LB:JDT1] -~w~Ich fahre zurück zum Club! - -[JDT1_ML:JDT1] -~w~Es sind noch $~1~ abzukassieren! - -[JDT1O01:JDT1] -~w~Steig in JDs ~b~Van. - -[JDT1O02:JDT1] -~w~Du hast ~b~JD~w~ zurückgelassen. Hol ihn! - -[JDT1O03:JDT1] -~w~Warte bis ~b~JD~w~ eingestiegen ist. - -[JDT1O04:JDT1] -~w~Such im Rotlichtviertel nach JDs Girls. - -[JDT1O05:JDT1] -~w~Fahr zurück zu ~y~JDs Club. - -[JDT1O07:JDT1] -~w~Halte neben dem ~b~Girl. - -[JDT1O08:JDT1] -~w~Erledige den ~r~Zuhälter. - -[JDT1O09:JDT1] -~w~Kassiere eins von JDs ~b~Girls~w~ ab. - -[JDT1_F1:JDT1] -~r~JDs Van wurde zerstört! - -[JDT1_F2:JDT1] -~r~JD ist tot! - -[JDT1_F3:JDT1] -~r~Du hast während der Schicht nicht genug Geld abkassiert! - -[JDT1_D1:JDT1] -~w~JDs Girls arbeiten im ~y~Rotlichtviertel.~w~ Fahr dorthin zurück! - -[JDT1_F4:JDT1] -~r~Es sind zu viele von JDs Girls draufgegangen! - -[JDT1_KA:JDT1] -~w~Was zum Teufel war das? - -[JDT1_KB:JDT1] -~w~Haben wir irgendwas gerammt? - -[JDT1_KC:JDT1] -~w~Pass auf die Karre auf, Toni! - -[JDT1_81:JDT1] -~w~Du hast den Freier verschreckt! Er will keine Zuschauer! - -[JDT1O10:JDT1] -~w~Nähere dich dem ~b~Auto~w~ in der Gasse. - -[JDT1O11:JDT1] -~w~Hupe, damit sie auf dich aufmerksam werden! - -[JDT1O12:JDT1] -~w~Je länger du das Girl anschaffen lässt, desto mehr Geld nimmt sie ein. - -[JDT1_MO:JDT1] -Schulden - -[JDT1_H1:JDT1] -~w~Drücke die ~k~ ~VEHN~, um zu hupen. - -[JDT1_WA:JDT1] -~w~Beeilung! Die Schicht der ~b~Mädchen~w~ endet um ~1~:~1~! - -[JDT1_WB:JDT1] -~w~Beeil dich! Die Schicht der Mädchen endet um ~1~:~1~! - -[JDT1O06:JDT1] -~w~Kassiere JDs Geld von seinen Nutten. Mach schnell, ihre Schicht endet um ~1~:~1~. - -[JDT1_WC:JDT1] -~w~Beeilung! Die Schicht der ~b~Mädchen~w~ endet um ~1~:0~1~! - -[JDT1_WD:JDT1] -~w~Beeilung! Die Schicht der Mädchen endet um ~1~:0~1~! - -[JDT1P06:JDT1] -~w~Kassiere JDs Geld von seinen Nutten. Mach schnell, ihre Schicht endet um ~1~:0~1~. - -[BONE_01:JDT1] -Hey, JD! Komm raus! - -[BONE_02:JDT1] -Hey, JD, du Perversling, komm raus, verdammt, - -[BONE_03:JDT1] -sonst komm ich rein und brech dir die Knochen! - -[BONE_04:JDT1] -Ich komm ja schon... aber nicht so. - -[BONE_05:JDT1] -Hey, Toni, que pasa? Lass dich drücken. - -[BONE_06:JDT1] -Du bist ganz klebrig! - -[BONE_07:JDT1] -Och, die haben mich mit dem Stripperinnenzeug eingeschmiert. - -[BONE_08:JDT1] -Die stehen drauf. Die schmieren's überall hin und... also, wie geht's denn so? - -[BONE_09:JDT1] -Scheiße, was hast du denn an? - -[BONE_10:JDT1] -Das? In Liebesdingen mag ich's gewagt. - -[BONE_11:JDT1] -Da... experimentiere ich gern, weißt du? - -[BONE_16:JDT1] -Tja, das ist so 'ne Sache. Man will uns bescheißen. - -[BONE_17:JDT1] -Okay, warte kurz hier. - -[BONE_18:JDT1] -Ich zieh mir schnell dieses, äh... Teil aus. - -[BONE_19:JDT1] -Hey, Raven, kannst den Doppeldildo wegräumen. - -[BONE_20:JDT1] -Toni, wir zwei machen jetzt 'ne Spritztour. - -[BONE_21:JDT1] -Wir müssen uns ein bisschen was angucken... Okay! Okay! - -[BONE_12:JDT1] -- Ist doch nichts dabei, hm? Darfst zugucken, wenn du willst. ~n~ - Halt's Maul, verdammt, du bist ja krank. - -[BONE_14:JDT1] -- Reg dich ab, Toni... ~n~ - Wo ist meine Kohle? - -{=================================== MISSION TABLE JDT2 ===================================} - -[JDT2_I1:JDT2] -~w~Gott sei Dank, dass du da bist, Toni! - -[JDT2_I2:JDT2] -~w~Eben hab ich 'nen Tipp gekriegt, dass die Cops 'ne Razzia hier planen! - -[JDT2_I3:JDT2] -~w~Und? Du hast doch 'ne Lizenz. - -[JDT2_I4:JDT2] -~w~Aber nicht für alles, was hier so abläuft! - -[JDT2_I5:JDT2] -~w~Salvatore ist hier. Stattet meinen Mädchen einen... 'Freundschaftsbesuch' ab... verstehst du? - -[JDT2_I6:JDT2] -~w~Wir müssen ihn wegschaffen, ehe die Bullen kommen! - -[JDT2_I7:JDT2] -~w~Er wartet draußen auf dich! - -[JDT2_I8:JDT2] -~w~Es wird nie langweilig. - -[JDT2_05:JDT2] -~w~Schaff mich hier weg, verdammt! - -[JDT2_06:JDT2] -~w~Toni? Häng die Bullen ab! Hab keine Lust, die mit nach Hause zu schleppen! - -[JDT2_A1:JDT2] -~w~Steig in das ~b~Auto. - -[JDT2_A2:JDT2] -~w~Vergiss nicht ~b~Salvatore!~w~ Kehr um und hol ihn! - -[JDT2_A3:JDT2] -~w~Bring Salvatore ~y~nach Hause. - -[JDT2_A5:JDT2] -~r~Salvatore ist tot! - -[JDT2_C1:JDT2] -~w~Das war gute Arbeit vorhin. Du gefällst mir. Schon immer. - -[JDT2_C2:JDT2] -~w~Danke, Mr. Leone. - -[JDT2_C3:JDT2] -~w~Weißt du, ich finde, Vincenzo belegt dich zu sehr mit Beschlag. - -[JDT2_C4:JDT2] -~w~Ich könnte einen guten Mann wie dich gebrauchen. - -[JDT2_C5:JDT2] -~w~Ruf mich gelegentlich mal an. Onkel Sal kümmert sich um dich. - -[JDT2_A9:JDT2] -~r~Salvatore wurde verhaftet! - -[JDT2_B2:JDT2] -~w~Häng die Cops ab! - -[JDT2_A6:JDT2] -~w~Du musst zurück zu Salvatores ~b~Auto~w~, ehe die Cops ihn schnappen! - -[JDT2_F1:JDT2] -~r~Du hast Salvatore verloren! - -[JDT2_A4:JDT2] -~w~Fahr Salvatore vom Club weg und häng die Cops ab! - -{=================================== MISSION TABLE JDT3 ===================================} - -[JDT3_AA:JDT3] -~w~Hey, Toni, ich kann gerade nicht. Bin... beschäftigt. - -[JDT3_AB:JDT3] -~w~Wieso? Was ist da drin los? ...und was zur Hölle stinkt hier so? - -[JDT3_AC:JDT3] -~w~Weißt du, Toni, wir verköstigen heute Leute mit äh... Sonderwünschen. - -[JDT3_AD:JDT3] -~w~Das wird 'ne Internet-Goldgrube! - -[JDT3_AE:JDT3] -~w~Kümmer du dich lieber um Leones Spielhölle oben in Saint Mark's. - -[JDT3_AG:JDT3] -~w~Die ist den Sindaccos ein Dorn im Auge. - -[JDT3_AH:JDT3] -~w~Es heißt, sie wollen das Ding hochjagen. - -[JDT3_B:JDT3] -~w~Erledige die ~r~Sindacco-Saboteure! - -[JDT3_C:JDT3] -~r~Sie~w~ haben eine Bombe vor dem ~y~Casino~w~ deponiert! - -[JDT3_D:JDT3] -Detonation - -[JDT3_E:JDT3] -~w~Noch ein paar von denen und das ~y~Casino~w~ ist nicht mehr! - -[JDT3_F:JDT3] -~w~Noch eine und das ~y~Casino~w~ ist hin! - -[JDT3_H:JDT3] -~w~Es kommen noch mehr ~r~Sindaccos~w~! Halte sie auf! - -[JDT3_I:JDT3] -~w~Die Truck-Bombe ist scharf! - -[JDT3_J:JDT3] -~w~Das ~y~Casino~w~ ist gerettet. Verschwinde jetzt! - -[JDT3_K:JDT3] -~w~Sie müssen den Truck manipuliert haben - man kann nicht hochschalten! - -[JDT3_L:JDT3] -~r~Sindacco-Verstärkung~w~ ist auf dem Weg zum ~y~Casino! - -[JDT3_M:JDT3] -~w~Die ~r~Sindaccos~w~ haben noch nicht aufgegeben. Es kommen noch mehr! - -[JDT3_N:JDT3] -~w~Sie steigen aus. Lass keine ~r~Sindaccos~w~ entkommen! - -[JDT3_O:JDT3] -Sicherheitsabstand - -[JDT3_P:JDT3] -~w~Die Sindaccos lassen eine riesige Truck-Bombe anrollen. Sie wollen das Casino auf einen Schlag vernichten! - -[JDT3_Q:JDT3] -~w~Verteidige das ~y~Casino. - -[JDT3_R:JDT3] -~w~Fahr zum ~y~Casino. - -[JDT3_S:JDT3] -~w~Verhindere, dass die ~r~Truck-Bombe~w~ das ~y~Casino~w~ zerstört! - -[JDT3_T:JDT3] -~w~Fahr den ~r~Truck~w~ vom ~y~Casino~w~ weg, bevor er hochgeht! - -[JDT3_BA:JDT3] -~w~Toni? Hier JD. - -[JDT3_BB:JDT3] -~w~Ich hör gerade, dass ein paar Sindacco-Gorillas auf dem Weg zu dir sind. - -[JDT3_BC:JDT3] -~w~Und sie sind schwer bewaffnet! - -[JDT3_BD:JDT3] -~w~Pass auf dich auf! - -[JDT3_BE:JDT3] -~w~Danke, JD! - -[JDT3_BF:JDT3] -~w~Gut zu wissen. - -[JDT3_G:JDT3] -~r~Das Casino wurde zerstört! - -{=================================== MISSION TABLE JDT4 ===================================} - -[JDT4_3:JDT4] -~w~Die Sindaccos, die das Doll's House bewachen, trauen nur ~h~Sindacco-Wagen. - -[JDT4_A1:JDT4] -~w~Hat Klasse. Auch wenn du am Spieltisch verlierst, die Weiber sind 'n Hauptgewinn da! - -[JDT4_B0:JDT4] -~w~Such dir ein geeignetes Fahrzeug und bau eine Bombe ein. - -[JDT4_B1:JDT4] -~w~Steig wieder in das ~b~Fahrzeug~w~ mit der Bombe. - -[JDT4_B3:JDT4] -~w~Jetzt steig aus und verschwinde hier. - -[JDT4_B4:JDT4] -~w~Zünde die Bombe! - -[JDT4_B5:JDT4] -~w~Fahr zur ~h~Bombenwerkstatt~w~ und lass eine Bombe in das Fahrzeug einbauen. - -[JDT4_B6:JDT4] -~w~Geh nicht zu nah ran! - -[JDT4_C0:JDT4] -~r~Du warst zu nahe bei der Explosion. - -[JDT4_C1:JDT4] -~w~Die geht auf JD! - -[JDT4_D0:JDT4] -~w~Wer ist das? - -[JDT4_D2:JDT4] -~w~Muss ein Neuer sein. - -[JDT4_0:JDT4] -COUNTDOWN - -[JDT4_1:JDT4] -~w~In das Ding kannst du keine Bombe einbauen! - -[JDT4_2:JDT4] -~w~Das ~h~Bomben-Symbol~w~ auf dem Radar führt dich zu ~h~8-Balls Bombenwerkstatt. - -[JDT4_A0:JDT4] -~w~Toni, die Sindaccos haben da so'n Laden - Das 'Dolls House'. - -[JDT4_AA:JDT4] -~w~Ist ein Casino UND Bordell in einem. - -[JDT4_A2:JDT4] -~w~Hehe! Und mit dem Laden steht und fällt ihre ganze Organisation hier. - -[JDT4_A3:JDT4] -~w~Wenn man die Bude, äh... plattmachen würde, weißt du, äh... in die Luft jagt, oder so... - -[JDT4_A4:JDT4] -~w~ich sag dir, dann würde Salvatore uns die Füße küssen! - -[JDT4_D1:JDT4] -~w~Den kenn ich nicht... - -[JDT4_B2:JDT4] -~w~Nimm das Fahrzeug und park es in der ~y~Garage~w~ beim 'Doll's House'. - -[JDT4_B7:JDT4] -~w~Fahr vorsichtig. Wenn du es zu sehr beschädigst, explodiert es! - -[JDT4_B8:JDT4] -~w~Parke das Fahrzeug in der ~y~Garage~w~ des 'Doll's House'. - -[JDT4_4:JDT4] -~w~Drücke~h~ ~k~ ~PDFW~~w~, um die Bombe ~h~detonieren~w~ zu lassen. - -[JDT4_B9:JDT4] -~w~Die Sindaccos haben die Bombe entschärft! - -{=================================== MISSION TABLE JDT5 ===================================} - -[JDT5_B0:JDT5] -~w~Das ist einer von den Typen, die Salvatore entführt haben! - -[JDT5_D0:JDT5] -~w~Wo ist er? Im Kofferraum? - -[JDT5_D1:JDT5] -~w~Gut. Wir bringen ihn zur Schrottpresse. Der Boss will ihn flacher als 'ne Pizza haben. - -[JDT5_E:JDT5] -~w~Rette Salvatore aus dem ~b~Auto~w~, bevor es verschrottet wird! - -[JDT5_E0:JDT5] -~w~Sie haben dich entdeckt! - -[JDT5_E1:JDT5] -~w~Das ~b~Auto~w~ ist unbewacht! Nimm es dir! - -[JDT5_E2:JDT5] -~w~Bring das Auto zu ~y~Salvatores Villa. - -[JDT5_E3:JDT5] -~w~Steig wieder in das ~b~Auto. - -[JDT5_F0:JDT5] -~w~Mmmphhh - mmmphhh - mpphh - -[JDT5_F3:JDT5] -~w~Mmpphh - arrgghh - mmpphh - -[JDT5_F4:JDT5] -~w~Mmpphh - arrgghh - arrggghh - arrg - -[JDT5_F5:JDT5] -~w~Yarrgghh - yarrgh - mmpphh - -[JDT5_G0:JDT5] -~w~Was war denn das für eine Fahrerei? Wolltest du mich umbringen? - -[JDT5_G1:JDT5] -~w~Mr. Leone. Boss. Tut mir Leid. - -[JDT5_G2:JDT5] -~w~Was soll ich sagen? - -[JDT5_G4:JDT5] -~w~Denen reiß ich das Herz aus dem Leib! Das ist noch nicht vorbei! - -[JDT5_G5:JDT5] -~w~Heiliger Strohsack, Toni - du hast mir den Arsch gerettet! Sag Sal zu mir! - -[JDT5_X0:JDT5] -~r~Einen Toten kann man schlecht verfolgen. - -[JDT5_X1:JDT5] -~r~Du hast ihn verloren! - -[JDT5_F1:JDT5] -~w~Sind Sie das, Mr. Leone? Ich bin's, Toni. - -[JDT5_F2:JDT5] -~w~Machen Sie sich keine Sorgen. Ich schaff Sie hier raus! - -[JDT5_G3:JDT5] -~w~Hurensöhne! Die glauben, die können das mit mir machen! - -[JDT5_X2:JDT5] -~r~Sal hat nicht überlebt! - -[JDT5_X4:JDT5] -~r~Er hat dich bemerkt. Jetzt wirst du Sal nie finden! - -[JDT5_X3:JDT5] -~r~Salvatore wurde zerquetscht! - -[JDT5_C:JDT5] -~w~Folge dem ~r~Auto~w~, aber unauffällig. - -[JDT5_0:JDT5] -~w~Wenn du auf das Auto schießt, könntest du Salvatore treffen! - -[JDT5_H0:JDT5] -~w~Folge dem ~r~Wagen,~w~ aber nicht zu dicht. - -[JDT5_H1:JDT5] -~w~Du bist zu dicht dran! - -[JDT5_H2:JDT5] -~w~Fall nicht zu weit zurück, damit du den ~r~Wagen~w~ nicht verlierst. - -[JDT5_H3:JDT5] -~w~Du bist zu weit entfernt! - -[KIDN_01:JDT5] -JD! - -[KIDN_02:JDT5] -Toni! Gott sei Dank bist du da. - -[KIDN_03:JDT5] -Ich schwitz wie mein Onkel auf 'nem Schulhof - ich dreh gleich durch. - -[KIDN_06:JDT5] -Das darf doch nicht wahr sein! Er schneidet mir die Eier ab - -[KIDN_07:JDT5] -und klemmt sie in 'nen Schraubstock. Oder umgekehrt. - -[KIDN_08:JDT5] -Das ist fast so wie damals, als das FBI meine Festplatte gefilzt hat. - -[KIDN_13:JDT5] -Großer Gott, ich fass es nicht... - -[KIDN_14:JDT5] -Dabei konnte ich überhaupt nichts dafür! - -[KIDN_15:JDT5] -Aber du kennst Salvatore. Der hetzt mir die Sitte auf den Hals. - -[KIDN_16:JDT5] -Das wird wie bei meiner Anzeige wegen Unzucht mit Minderjährigen. - -[KIDN_17:JDT5] -Hast du mal wegen Unzucht mit Minderjährigen gesessen, Mann? - -[KIDN_18:JDT5] -Die gehen beim Duschen auf dich los! - -[KIDN_19:JDT5] -Herrgott, dabei war sie 18! Diesmal wird's schlimmer! - -[KIDN_20:JDT5] -Hör auf zu sabbern, du Schwanzlutscher! Was ist passiert?! - -[KIDN_04:JDT5] -- Was machen wir jetzt? ~n~ - Wieso? Was ist? - -[KIDN_11:JDT5] -- Nein, nein... Weißt du, ich hab zu viel... ~n~ - Was ist denn los? - -[KIDN_09:JDT5] -Oh, ich hab Herzrasen. Hast du mal ein Valion? - -[KIDN_10:JDT5] -Oder ein Rohapnin? Oder... - -[KIDN_21:JDT5] -Sie haben Salvatore entführt, als er aus dem Club kam. - -[KIDN_23:JDT5] -Warum sagst du mir das nicht gleich, statt mich mit Scheiße vollzulabern? Komm. - -{=================================== MISSION TABLE JDT6 ===================================} - -[JDT6_A0:JDT6] -~w~Gott sei Dank! Toni. - -[JDT6_A1:JDT6] -~w~JD? Hey, ich bin im Hinterhof vom... - -[JDT6_A2:JDT6] -~w~Ich weiß. Hab dich reingehen sehen. Hab gebetet, dass du auftauchst! - -[JDT6_A3:JDT6] -~w~Salvatore rast vor Wut! - -[JDT6_A6:JDT6] -~w~Pass auf, dass Salvatore nichts passiert. - -[JDT6_0:JDT6] -Salvatore - -[JDT6_1:JDT6] -~r~Salvatore ist nicht durchgekommen. - -[JDT6_3:JDT6] -~w~Salvatore ist in ~1~ Sekunden hier. - -[JDT6_5:JDT6] -~w~Beschütze ~b~Salvatore~w~ vor den ~r~Sindaccos. - -[JDT6_6:JDT6] -~w~Einer von ~b~Salvatores Leibwächtern~w~ ist tot! - -[JDT6_7:JDT6] -~b~Salvatores Leibwächter~w~ sind beide tot! - -[JDT6_8:JDT6] -~w~Die Bullen! - -[JDT6_10:JDT6] -~w~Such dir einen guten Standort, ehe Salvatore kommt. - -[JDT6_11:JDT6] -~w~Wo willst du hin? Salvatore braucht Schutz im Rotlichtviertel. - -[JDT6_12:JDT6] -Salvatore trifft ein - -[JDT6_D1:JDT6] -~w~Hey... - -[JDT6_D4:JDT6] -~w~Da hat einer 'nen Dollar verloren! - -[JDT6_C0:JDT6] -~w~Mehr habt ihr nicht zu bieten? - -[JDT6_C1:JDT6] -~w~Na kommt! - -[JDT6_C2:JDT6] -~w~Ihr kämpft wie Schwächlinge! - -[JDT6_C3:JDT6] -~w~Auch was gefällig? - -[JDT6_C4:JDT6] -~w~Friss das! - -[JDT6_C5:JDT6] -~w~Ihr elenden Dreckschweine! - -[JDT6_C6:JDT6] -~w~Mama wär stolz auf mich! - -[JDT6_A4:JDT6] -~w~Er kommt hierher, um jeden Sindacco, den er findet, persönlich zu erledigen... - -[JDT6_A5:JDT6] -~w~...also bin ich verduftet. Hör zu, ich hab auf dem Dach gegenüber ein Gewehr deponiert. - -[JDT6_9:JDT6] -~w~Hol dir das ~g~Präzisionsgewehr~w~ auf dem Dach. - -{=================================== MISSION TABLE JDT7 ===================================} - -[JDT7_VE:JDT7] -~r~v1.00 - -[JDT7_02:JDT7] -~w~Erst hat Salvatore 'aufgeräumt' in dem Laden, hä... und jetzt renoviert er ihn dir sogar! - -[JDT7_03:JDT7] -~w~Das gehört jetzt mir ganz allein, Toni. - -[JDT703A:JDT7] -~w~Diese Sindacco-Schwanzlutscher haben alle 'nen Arschtritt gekriegt. - -[JDT7_04:JDT7] -~w~Hör zu, es heißt, die Sizilianer wollen 'nen Frieden zwischen den Familien aushandeln. - -[JDT7_4A:JDT7] -~w~Da ist jetzt gerade so'n Obermotz bei Sal. - -[JDT7_4B:JDT7] -~w~Die Sache ist nur, Sal traut dem Braten nicht. - -[JDT7_4C:JDT7] -~w~Er möchte, dass jemand dort vorbeischaut und dem Kerl folgt. Guckt, wo er hingeht. - -[JDT7_06:JDT7] -~r~Du hast den Helikopter nicht rechtzeitig erreicht. Massimo ist schon weg! - -[JDT7_07:JDT7] -~w~Folge ~r~Massimo.~w~ Verlier ihn nicht! - -[JDT7_08:JDT7] -~r~Er~w~ geht dir durch die Lappen! - -[JDT7_09:JDT7] -~r~Du hast Massimo entkommen lassen! - -[JDT7_10:JDT7] -~w~Der Helikopter scheint zu landen - geh nicht zu nah ran, sonst verschreckst du sie. - -[JDT7_11:JDT7] -~r~Du warst zu nahe. Man hat dich entdeckt! - -[JDT7_14:JDT7] -~r~Er~w~ verschwindet... folge ~r~ihm~w~ wieder... - -[JDT7_15:JDT7] -~w~Massimo~w~ scheint da oben zu landen... - -[JDT7_16:JDT7] -~w~Du musst ~y~näher ran... - -[JDT7_17:JDT7] -~r~Du bist aufgeflogen! - -[JDT7_21:JDT7] -~w~Du bist entdeckt worden! Erledige die ~r~Triaden! - -[JDT7_12:JDT7] -~w~Come siamo rimasti d'accordo, - -[JDT712A:JDT7] -~w~wenn ihr meinen Geschäftsfreunden die Arbeit abnehmt, werdet ihr reich belohnt. - -[JDT7_13:JDT7] -~w~...Hepburn Heights wird den Diablos gehören. - -[JDT7_18:JDT7] -~w~...also beschäftigt quei bastardi dei Leone unten in Portland, - -[JDT718A:JDT7] -und wenn meine Geschäftsfreunde diese Stadt kontrollieren, wird man es euch danken. - -[JDT718B:JDT7] -Ci pensiamo noi. - -[JDT7_20:JDT7] -~w~Da drüben! Das ist ein Leone! - -[JDT7_22:JDT7] -Entfernung - -[JD_FIN:JDT7] -~w~Erledige die ~r~Triaden! - -[JDT7_05:JDT7] -~w~Du musst zu ~y~Salvatores Villa~w~, ehe Massimo sich auf den Weg macht! - -[JDT7O07:JDT7] -~w~Du musst zu ~y~Salvatores Villa.~w~ Massimo bricht um ~1~:~1~ Uhr auf. - -[JDT7O08:JDT7] -~w~Es ist fast ~1~:~1~ Uhr. Massimo bricht gleich auf! - -{=================================== MISSION TABLE JDT8 ===================================} - -[JDT8_A0:JDT8] -~w~Toni... heute ist es soweit! Heute werd ich zum Capo ernannt! - -[JDT8_A1:JDT8] -~w~JD, der 'Unbestechliche'? Gott steh uns bei! - -[JDT8_A2:JDT8] -~w~Darauf habe ich lange gewartet... ohne dich wär es nicht dazu gekommen, Toni. - -[JDT8_A3:JDT8] -~w~Hey, ich fang gleich an zu weinen! Hör auf! - -[JDT8_A4:JDT8] -~w~Hey, Mickey! Wie geht's? - -[JDT8_A5:JDT8] -~w~Ich steig hinten ein... okay? - -[JDT8_C:JDT8] -~w~Steig in das ~b~Auto~w~ und fahr JD zu seiner Ernennung zum Capo. - -[JDT8_C2:JDT8] -~w~Steig wieder ins ~b~Auto. - -[JDT8_C3:JDT8] -~w~Fahr zu der ~y~Zeremonie. - -[JDT8_B0:JDT8] -~w~Ich sag's dir, Toni, ich kann's noch gar nicht fassen! - -[JDT8_B1:JDT8] -~w~Ich hab so lange gewartet. - -[JDT8_B2:JDT8] -~w~Jahrelang hab ich für die Sindaccos malocht - und nichts! - -[JDT8_B3:JDT8] -~w~Die Bastarde haben mich kleingehalten, - -[JDT8_B5:JDT8] -~w~Aber Salvatore - Gott segne ihn - für den spielt so 'ne Kleinigkeit keine Rolle. - -[JDT8_B6:JDT8] -~w~Ich sag's dir! - -[JDT8_B7:JDT8] -~w~Das ist Wahnsinn! - -[JDT8_B8:JDT8] -~w~Toni, ich bin so aufgeregt! - -[JDT8_B9:JDT8] -~w~Toni, ich weiß gar nicht, was ich mit mir anstellen soll, so aufgeregt bin ich! - -[JDT8_BA:JDT8] -~w~Schau mich an, ich kann mein Glück noch gar nicht fassen! - -[JDT8_BB:JDT8] -~w~Endlich, hä, Toni? Ein Capo zu werden! - -[JDT8_D1:JDT8] -~w~Wo ist Salvatore? - -[JDT8_D2:JDT8] -~w~Toni, die erste Runde geht auf mich... - -[JDT8_H0:JDT8] -~w~Hey, der Kerl war 'ne scheiß Ratte! - -[JDT8_H1:JDT8] -~w~Er hat seinen eigenen Boss verraten! Schande, sowas! - -[JDT8_H2:JDT8] -~w~Salvatore hätte dem Wichser nie trauen können. - -[JDT8_H3:JDT8] -~w~Versenk die Scheißkarre im Fluss! - -[JDT8_H4:JDT8] -~w~Unterwegs kannst du mich absetzen. - -[JDT8_J:JDT8] -~w~Steig in das ~b~Auto~w~ und fahr Mickey nach Hause. - -[JDT8_J1:JDT8] -~w~Die Cops haben dich mit dem Auto entdeckt! - -[JDT8_J2:JDT8] -~w~Die Cops haben dich mit dem ~b~Auto~w~ entdeckt! - -[JDT8_J3:JDT8] -~w~Steig wieder in das ~b~Auto! - -[JDT8_J4:JDT8] -~w~Setz Mickey bei ihm ~y~zuhause~w~ ab. - -[JDT8_K0:JDT8] -~w~Verdammt, ich verschwinde hier! - -[JDT8_K1:JDT8] -~w~Denk dran, versenk die Karre im Fluss. - -[JDT8_F:JDT8] -~w~Versenk das Auto im Fluss. - -[JDT8_F1:JDT8] -~w~Versenk das ~b~Auto~w~ im Fluss. - -[JDT8_G5:JDT8] -~r~JD ist tot! - -[JDT8_G6:JDT8] -~r~Mickey ist tot! - -[JDT8_G8:JDT8] -~r~Du hättest das Auto im Fluss versenken sollen. - -[JDT8_X0:JDT8] -~w~Wo willst du hin, Toni? - -[JDT8_X3:JDT8] -~w~Wir verspäten uns. - -[JDT8_X1:JDT8] -~w~Wenn die Cops die Karre so sehen, dann halten sie uns garantiert an! - -[JDT8_X2:JDT8] -~w~Die Zeremonie ist in Harwood. - -[JDT8_A6:JDT8] -~w~Toni... heute ist es soweit! - -[JDT8_A7:JDT8] -~w~Heute werd ich zum Capo ernannt! - -[JDT8_A8:JDT8] -~w~JD, der 'Unbestechliche'? - -[JDT8__1:JDT8] -~w~Darauf habe ich lange gewartet... - -[JDT8__2:JDT8] -~w~Ohne dich wär es nicht dazu gekommen, Toni. - -[JDT8_A9:JDT8] -~w~Gott steh uns bei! - -[JDT8_D0:JDT8] -~w~Hey, sind wir da? - -[JDT8_B4:JDT8] -~w~nur weil ich ein bisschen irisches Blut in den Adern habe. - -[JDT8_G7:JDT8] -~r~Deine Fahrgäste sind tot! - -[JDT8_C4:JDT8] -~w~Schalte die ~r~Sindacco-Killer~w~ aus, ehe sie JD erledigen! - -[JDT8_0:JDT8] -~w~Das Auto umzuspritzen bringt dir etwas Zeit, aber sobald die Cops die Leiche auf dem Beifahrersitz sehen, werden sie dir wieder im Nacken sitzen. - -[JDT8_K:JDT8] -~w~Oh, Daddy, nein! - -[JDT8_BC:JDT8] -~w~Toni, Mann, du musst dich abregen. - -[JDT8_C5:JDT8] -~w~Erledige die ~r~Sindacco-Killer. - -{=================================== MISSION TABLE MAC1 ===================================} - -[MAC1_AA:MAC1] -~w~Ma? - -[MAC1_AB:MAC1] -~w~Ich bin's! Ich bin wieder da! - -[MAC1_AC:MAC1] -~w~Toni?... Verflucht, wo hast du gesteckt? - -[MAC1_AM:MAC1] -~w~Und die ganze Zeit, wo du weg warst, nicht ein Anruf! - -[MAC1_AD:MAC1] -~w~Haben die keine Telefone, da wo du warst? - -[MAC1_AE:MAC1] -~w~Ach, komm, Ma! Du weißt, dass ich nicht anrufen konnte! - -[MAC1_AF:MAC1] -~w~Ein richtiger Mann hätte seine Mutter angerufen. - -[MAC1_AG:MAC1] -~w~Du könntest dir ein Beispiel an Giovanni Casa nehmen. - -[MAC1_AN:MAC1] -~w~Er ruft seine Mutter jeden Tag an. - -[MAC1_AH:MAC1] -~w~Das ist ein anständiger Mann. - -[MAC1_AO:MAC1] -~w~Und seine sizilianische Wurst ist die beste der Stadt! - -[MAC1_AI:MAC1] -~w~Casa! Ma, das ist kein anständiger Mann. Das ist ein Perverser! - -[MAC1_AJ:MAC1] -~w~Das ist doch nur üble Nachrede! Was für ein Mann bist du denn, Toni? - -[MAC1_AK:MAC1] -~w~Okay, Ma, wenn du meinst. - -[MAC1_AL:MAC1] -~w~Vielleicht besuch ich Giovanni mal... mal sehen, was er so treibt. - -[MAC1_HA:MAC1] -~w~Ich glaube, mir steht der Sinn nach Liebe! - -[MAC1_17:MAC1] -~w~Beweise deiner Ma, dass Giovanni Casa ein Schwein ist! - -[MAC1_B:MAC1] -~w~Fahr zu deiner ~y~Wohnung ~w~und hol deine Kamera. - -[MAC1_B0:MAC1] -~w~Fahr zu ~y~Casa's Deli. - -[MAC1B2:MAC1] -~w~Gutes Foto! Bring das jetzt deiner ~y~Ma! - -[MAC1_B3:MAC1] -~w~Schleich dich an ~r~Casa~w~ ran und mach das kompromittierende Foto! - -[MAC1_B5:MAC1] -~w~Verschrecke ~r~ihn~w~ nicht. - -[MAC1_B6:MAC1] -~r~Der Film ist voll! Und du hast kein kompromittierendes Foto von Casa, um es deiner Ma zu zeigen. - -[MAC1_B7:MAC1] -~w~Hol deine ~g~Kamera. - -[MAC1_C0:MAC1] -~w~Geh nicht zu nah ran, sonst schöpft ~r~Casa~w~ Verdacht! - -[MAC1_C1:MAC1] -~r~Du hast ihn verschreckt! Jetzt kriegst du das Foto nie! - -[MAC1_C2:MAC1] -~r~Etwas hat Casa verschreckt! - -[MAC1_C3:MAC1] -~r~Du hast Casa verloren! - -[MAC1_C4:MAC1] -~r~Casa ist hinüber! - -[MAC1_C5:MAC1] -~w~Du bist zu nah dran an ~r~Casa! - -[MAC1_C6:MAC1] -~w~Verlier ~r~Casa~w~ nicht! - -[MAC1_D0:MAC1] -~w~Scheint, als sei Casa fündig geworden. - -[MAC1_JA:MAC1] -~w~Okay, Ladies! Zeit für die Brust! - -[MAC1_JB:MAC1] -~w~Wer will meine Mammi sein? - -[MAC1_JC:MAC1] -~w~O je! - -[MAC1_IA:MAC1] -~w~Okay, Ladies, gebt mir 'ne Minute, ja? - -[MAC1_IB:MAC1] -~w~Ich zieh mir schnell was an, was mehr zu mir passt. - -[MAC1_CA:MAC1] -~w~Baby will schmusen! - -[MAC1_CB:MAC1] -~w~Ich hab Kaki gemacht! - -[MAC1_DA:MAC1] -~w~Lutsch meinen Schnulli! Lutsch ihn! - -[MAC1_EA:MAC1] -~w~Hey, kommt, Mädels! Stellt euch nicht so an! - -[MAC1_FA:MAC1] -~w~SHIT! Da ist jemand! - -[MAC1_FB:MAC1] -~w~Schnell! In den Van! - -[MAC1_GA:MAC1] -~w~Oh, Gott! Oh, Gott! - -[MAC1_GB:MAC1] -~w~SCHAU - MICH - NICHT - AN! - -[MAC1_BA:MAC1] -~w~Hey, Ma! - -[MAC1_BB:MAC1] -~w~Schau dir mal das Foto an! Da ist dein 'anständiger Mann' Giovanni Casa drauf... mit einer Scheißwindel an! - -[MAC1_BC:MAC1] -~w~So verbringst du also deine Zeit? - -[MAC1_BD:MAC1] -~w~Schleichst im Wald herum und machst Fotos von Leuten? - -[MAC1_BE:MAC1] -~w~Was ist los mit dir, Antonio? Ich muss mich ja schämen für dich! - -[MAC1_BF:MAC1] -~w~Aber... - -[MAC1_BG:MAC1] -~w~Und Windel hin oder her, trotzdem ist er ein anständigerer Mann als du! - -[MAC1_B8:MAC1] -~w~Jetzt geh nach draußen. - -[MAC1_B1:MAC1] -~w~Folge ~r~Casa~w~, aber nicht zu dicht. - -[MAC1_C7:MAC1] -~w~Zoome an ~r~Casa~w~ heran und mach das Foto, das ~r~ihn~w~ kompromittiert. - -[MAC1_D1:MAC1] -~w~Bleib an ~r~Casa~w~ dran. Das könnte eine gute Fotogelegenheit werden. - -{=================================== MISSION TABLE MAC2 ===================================} - -[MAC2_AA:MAC2] -~w~Ma!... Ma!... Komm, Ma... rede mit mir! - -[MAC2_AB:MAC2] -~w~Es gibt hier keine 'Ma' mehr für dich, du Feigling! - -[MAC2_AC:MAC2] -~w~Mir machst du nichts vor, ich weiß, warum du nicht wieder hier einziehst! - -[MAC2_AD:MAC2] -~w~Du hast Angst vor irgendwelchen Triaden! - -[MAC2_AE:MAC2] -~w~Dein Vater - ruhe er in Frieden - hätte sich von niemandem aus seinem Heim vertreiben lassen! - -[MAC2_AF:MAC2] -~w~Aber Ma! - -[MAC2_AG:MAC2] -~w~Aber im Gegensatz zu dir war dein Vater auch nicht feige! - -[MAC2_AH:MAC2] -~w~Bis du den Triaden nicht Respekt eingebläut hast, bist du nicht mehr mein Sohn! - -[MAC2_AI:MAC2] -~w~Höchstens eine Tochter, aber nicht mein Sohn! - -[MAC2_B1:MAC2] -~w~Zeig Ma, dass du keine Angst vor den Triaden hast. Knöpf dir die ~r~zwei Triadenbanden~w~ in Chinatown vor! - -[MAC2_I1:MAC2] -~w~In dem kugelsicheren ~r~Fisch-Van~w~ ist ein Triadenanführer. Ramm ihn von der Straße! - -[MAC2_I2:MAC2] -~w~Der ~r~Transporter ~w~fährt - und verliert seine Ladung! Vorsicht! - -[MAC2_I3:MAC2] -~w~Sie steigen aus! Mach die ~r~Triaden~w~-Schweine fertig! - -[MAC2_I4:MAC2] -~w~Du bist entdeckt worden! Erledige sämtliche ~r~Triadenbanden-Mitglieder! - -[MAC2_I5:MAC2] -~w~Du bist auf ~r~Triaden~w~-Gebiet. Sei vorsichtig! - -[MAC2_I6:MAC2] -~w~Eine erledigt, eine übrig. Jetzt zeig's der anderen ~r~Bande! - -[MAC2_BA:MAC2] -~w~Yeah! Schaust du zu, Ma?! - -[MAC2_BB:MAC2] -~w~Ich bin Toni Cipriani, und ich mach euch fertig! - -[MAC2_BC:MAC2] -~w~Merkt euch den Namen, Fischköpfe! - -{=================================== MISSION TABLE MAC3 ===================================} - -[MAC3_A0:MAC3] -~w~Ma? Ich bin wieder da... - -[MAC3_A1:MAC3] -~w~Guck dich mal an! Du bist ganz mager! - -[MAC3_A2:MAC3] -~w~Würdest du noch bei deiner Mutter wohnen, wie sich das für einen Sohn gehört, würdest du anständig essen! - -[MAC3_A3:MAC3] -~w~Und was du für Autos fährst! - -[MAC3_A4:MAC3] -~w~Ich muss mich für dich schämen, Antonio, wirklich. - -[MAC3_A5:MAC3] -~w~Die Leute müssen denken, ich hätte dich nicht anständig erzogen! - -[MAC3_A6:MAC3] -~w~Was soll ich machen, Ma? Du weißt, ich tu alles für dich. - -[MAC3_A7:MAC3] -~w~Dieser Sucho fährt heute in der Stadt ein Rennen. - -[MAC3_A8:MAC3] -~w~Von dem könntest du dir eine Scheibe abschneiden! - -[MAC3_A9:MAC3] -~w~Der hat noch Achtung vor seiner Mutter. - -[MAC3_AA:MAC3] -~w~Wenn dein Vater noch da wäre - der würde das Rennen gewinnen, - -[MAC3_AB:MAC3] -~w~UND diesem Sucho sein hämisches Grinsen austreiben! - -[MAC3_AC:MAC3] -~w~Ja, er würde ihm Blei zu fressen geben! - -[MAC3_AD:MAC3] -~w~Ah, dein Vater war ein richtiger Mann! Der hatte Mumm! - -[MAC3_B0:MAC3] -~w~Beweise, dass du mehr drauf hast als Sucho. Gewinn das Rennen, dann erledige ihn. - -[MAC3_C0:MAC3] -~w~Du hast ~r~Sucho~w~ besiegt, jetzt erledige ihn! - -[MAC3_C1:MAC3] -~r~Er~w~ versucht abzuhauen! - -[MAC3_X0:MAC3] -~r~Sucho ist dir entkommen! - -[MAC3_C2:MAC3] -~r~Sucho~w~ haut ab! - -{=================================== MISSION TABLE MAC4 ===================================} - -[MAC4_A0:MAC4] -~w~Ma! ... Ma! ... bist du da? - -[MAC4_A1:MAC4] -~w~Mit dir rede ich nicht mehr, Toni! - -[MAC4_A2:MAC4] -~w~Du beschämst deine sizilianische Abkunft! - -[MAC4_A3:MAC4] -~w~Seit du das Foto von Casa gemacht hast, zahlt er kein Schutzgeld mehr. - -[MAC4_A4:MAC4] -~w~Und was unternimmst du deswegen? - -[MAC4_A5:MAC4] -NICHTS! - -[MAC4_A6:MAC4] -~w~Dein Vater hätte längst Hackfleisch aus ihm gemacht! - -[MAC4_A8:MAC4] -~w~aber mit den Ciprianis legst du dich nur an, wenn was in dir steckt! - -[MAC4_A9:MAC4] -~w~Ich wünschte, du hättest was von dem, was in ihm steckt! - -[MAC4_AA:MAC4] -~w~Du wünschtest, ich hätte was von dem, was in ihm steckt? - -[MAC4_AB:MAC4] -~w~Okay, Ma, wie du willst! - -[MAC4_B:MAC4] -~w~Fahr bei ~y~Giovanni Casa's Deli~w~ vorbei und 'überrede' ihn zu einer kleinen Spazierfahrt. - -[MAC4_B0:MAC4] -~w~Hi, Toni... wie geht's dir? - -[MAC4_B1:MAC4] -~w~Was gibt's? - -[MAC4_B2:MAC4] -~w~Hat's dir die Sprache verschlagen? - -[MAC4_B3:MAC4] -~w~Wir beide müssen was besprechen, Casa... - -[MAC4_B4:MAC4] -~w~Aber irgendwo, wo wir unter uns sind. - -[MAC4_C:MAC4] -~w~Lass ~r~Casa~w~ nicht lebend entkommen. - -[MAC4_C1:MAC4] -~w~Ich zahl das Schutzgeld, Toni! Ich schwör's dir! - -[MAC4_C2:MAC4] -~w~Oh, komm, Toni! Du kriegst von mir, was du willst! - -[MAC4_C3:MAC4] -~w~Ich mach alles, was du willst, Toni! Alles! Aber tu mir nichts! - -[MAC4_D1:MAC4] -~w~Okay! Okay! Du hast mich! - -[MAC4_D2:MAC4] -~w~Okay! Okay! Ich geb auf! Ich geb auf! Aber tu mir nichts mehr! - -[MAC4_D3:MAC4] -~w~Komm mit, Arschgesicht! - -[MAC4_E0:MAC4] -~w~Bring Casa zum ~y~Sägewerk. - -[MAC4_E1:MAC4] -~w~Geh nicht weg von ~b~Casa! - -[MAC4_F0:MAC4] -~w~Und... äh... wo gehen wir hin? - -[MAC4_F1:MAC4] -~w~Du bist mir doch wieder gut, oder, Toni? - -[MAC4_F2:MAC4] -~w~...Ich beschaff das Geld, das ich euch schulde... ehrlich! - -[MAC4_F3:MAC4] -Ich brauch nur ein bisschen Zeit! - -[MAC4_F4:MAC4] -~w~Mag deine Ma immer noch scharfe Würste? - -[MAC4_F5:MAC4] -Ich besorg ihr welche, kein Problem! - -[MAC4_G0:MAC4] -~w~Also... ähm... was willst du mit mir besprechen, Toni? - -[MAC4_G1:MAC4] -~w~Geht's um das Schutzgeld? - -[MAC4_G2:MAC4] -~w~Darum geht's doch, oder? - -[MAC4_G3:MAC4] -~w~...Toni? - -[MAC4_G4:MAC4] -~w~Darüber können wir doch reden, stimmt's, Toni? - -[MAC4_G6:MAC4] -~w~Die Leute reden heutzutage viel zu wenig miteinander, Toni. - -[MAC4_G7:MAC4] -~w~Stell dich da hin und halt's Maul, Casa. - -[MAC4_G8:MAC4] -~w~Okay, Toni! Aber das... das ist mir gar nicht geheuer. - -[MAC4_G9:MAC4] -~w~Hey! Sei vorsichtig damit, Toni! Das ist der Schalter für... - -[MAC4_GA:MAC4] -~w~AAARRRGGGHHHHHHHH! - -[MAC4_GB:MAC4] -~w~Verschwinde schleunigst! - -[MAC4_H:MAC4] -~w~In dem ~b~Van~w~ wartet 'Hack a la Casa' für Würstchen sizilianischer Art darauf, zu Casa's Deli gebracht zu werden. - -[MAC4_H1:MAC4] -~w~Fahr die Lieferung zu ~y~Casa's Deli. - -[MAC4_H2:MAC4] -~w~Lass den ~b~Van~w~ nicht dort stehen! - -[MAC4_H3:MAC4] -~w~Häng die Cops ab! - -[MAC4_I0:MAC4] -~w~Eine Sonderlieferung Wurstbrät? - -[MAC4_I1:MAC4] -~w~Davon hat mir keiner was gesagt! - -[MAC4_I2:MAC4] -~w~Wuh! Welchen Zoo haben wir denn diesmal beklaut? - -[MAC4_I3:MAC4] -~w~Hier hinten ist jede Menge Fleisch! - -[MAC4_I4:MAC4] -~w~...Hmm! Lecker! Okay, nehm ich. - -[MAC4_I6:MAC4] -~w~Wenn er das erfährt, dreht er durch! - -[MAC4_I7:MAC4] -~w~Und dann bin ich dran! - -[MAC4_X0:MAC4] -~r~Das ging zu schnell und schmerzlos für einen Sizilianer-Mord! - -[MAC4_X1:MAC4] -~r~Du hast die Lieferung nicht getätigt! - -[MAC4_X2:MAC4] -~r~Casa ist dir entwischt! - -[MAC4_E2:MAC4] -~w~Verlass das ~y~Sägewerk~w~ nicht! - -[MAC4_I5:MAC4] -~w~Gut, dass Casa nicht hier ist. - -[MAC4_G5:MAC4] -~w~Klar! Man kann doch über alles reden! - -[MAC4_CN:MAC4] -~w~Ruft die Polizei! - -[MAC4_CO:MAC4] -~w~Zu Hilfe! - -[MAC4_CP:MAC4] -~w~Hol doch jemand Hilfe! - -[MAC4_CQ:MAC4] -~w~Hilfe! - -[MAC4_CR:MAC4] -~w~Hilf mir doch jemand! - -[MAC4_CS:MAC4] -~w~Holt mich hier raus! - -[MAC4_A7:MAC4] -~w~Casa mag ein bisschen verquer sein, - -[MAC4_C0:MAC4] -~w~Können wir das nicht wie vernünftige Menschen regeln, Toni? - -[MAC4_1:MAC4] -~w~Geh näher an ~r~Casa ~w~ran, indem du dich von hinten an ~r~ihn ~w~heranschleichst. - -{=================================== MISSION TABLE MAC5 ===================================} - -[MAC5_AA:MAC5] -~w~Ma? Bist du da? - -[MAC5_AB:MAC5] -~w~Toni? ...Ich bin am Telefon... - -[MAC5_AC:MAC5] -~w~...Ja, jetzt ist er da... okay. Ich halte ihn so lange hin. Ciao. - -[MAC5_AD:MAC5] -~w~Toni? Bist du wieder hier, um deiner Mutter weh zu tun, hä? - -[MAC5_AE:MAC5] -~w~Den ganzen Tag hast du wieder Rambo gespielt. - -[MAC5_AF:MAC5] -~w~Nie besuchst du mich, bringst nie nette Mädchen nach Hause. - -[MAC5_AG:MAC5] -~w~Aber was für eine will dich schon haben? So käsig und mager wie du bist! - -[MAC5_AH:MAC5] -~w~Du bringst mich noch ins Grab, so viel Sorgen und Schande machst du mir. ~w~Aber damit ist jetzt Schluss. - -[MAC5_AI:MAC5] -~w~Ab sofort... sind wir geschiedene Leute. - -[MAC5_AJ:MAC5] -~w~Ich hab Auftragskiller auf dich angesetzt. Es geht nicht anders, Antonio... - -[MAC5_AK:MAC5] -~w~...du warst immer ein ungehorsamer Junge. - -[MAC5_AL:MAC5] -~w~Was!? Ma! - -[MAC5_AM:MAC5] -~w~Es ist das Beste so, mein Sohn... versuch wenigstens, wie ein Mann zu sterben! - -[MAC5_AN:MAC5] -~w~Mach mir nicht noch mehr Schande! - -[MAC5_B1:MAC5] -~w~Mas Auftragskiller sind da! - -[MAC5_B2:MAC5] -~w~Zeig Ma, dass du ihren ~r~Killern~w~ über bist. Erledige sie alle! - -[MAC5_B3:MAC5] -~w~Jetzt sind sie richtig wütend! Erledige ~r~sie. - -[MAC5_B4:MAC5] -~w~Die ~r~Killer~w~ wissen, dass du hier bist. Du musst weit weg aus Saint Mark's! - -[MAC4_B6:MAC5] -~w~Es kommen noch mehr ~r~Killer~w~! Verschwinde aus Saint Mark's. Sie wissen, wo du bist! - -[MAC4_B7:MAC5] -~w~GRANATE! WEG HIER! - -[MAC5_C1:MAC5] -~w~ Fürs Erste bist du sie los. Aber jetzt, wo sie angeheuert worden sind, werden sie den Job durchziehen, egal wie lange es dauert. - -[MAC5_C2:MAC5] -~w~Sei gewarnt... sie KOMMEN wieder! - -[HM1:MAC5] -~w~Sie geben nicht auf! Es kommen noch mehr ~r~Killer~w~. Mach sie fertig! - -[HM2:MAC5] -~w~Vorsicht! Es sind ~r~Killer~w~ im Anmarsch. Erledige sie! - -[HM3:MAC5] -~w~Es nähern sich noch mehr ~r~Killer~w~. Puste sie weg! - -[HM4:MAC5] -~w~Es sind noch mehr ~r~Killer~w~ unterwegs! Schalte sie aus! - -[MAC5_B5:MAC5] -~w~Knöpf dir die übrigen ~r~Killer~w~ vor, aber halte dich von Saint Mark's fern! - -{=================================== MISSION TABLE MAR1 ===================================} - -[MAR1M1:MAR1] -~w~Du hast dich verspätet! Typisch Mann! - -[MAR1M2:MAR1] -~w~Ich will shoppen gehen und du fährst mich. - -[MAR1M3:MAR1] -~w~Ich werd mich göttlich amüsieren. Und wenn du dabei draufgehst! - -[MAR1M4:MAR1] -~w~Ich bin nur noch nicht fertig zurechtgemacht. - -[MAR1M5:MAR1] -~w~Ach, scheiß drauf! Ich seh traumhaft aus. Komm, Toni! - -[MAR1_B:MAR1] -~w~Bring Maria zu dem ~y~Geschäft. - -[MAR1_D:MAR1] -~w~Warte hier, Schnucki, es dauert nicht lange... - -[MAR1_D2:MAR1] -~w~Ich wollte doch nur sehen, wie es bei Tageslicht aussieht! - -[MAR1_E:MAR1] -~w~Nichts wie weg hier! - -[MAR1_E3:MAR1] -~w~Fahr zurück und hol ~b~Maria. - -[MAR1_F:MAR1] -~w~Das war lustig! Aber ich brauche noch ein paar andere Sachen. - -[MAR1_G:MAR1] -~w~Lass den Motor laufen... - -[MAR1_GB:MAR1] -~w~Komm, Maria! Kein Geklaue mehr! - -[MAR1_GC:MAR1] -~w~Ach, Unsinn, Toni-Baby! Das war doch nur ein Missverständnis vorhin! - -[MAR1_G2:MAR1] -~w~Ich sag Ihnen, ich hab da drin nichts versteckt! - -[MAR1_H:MAR1] -~w~Bring mich nach Hause! - -[MAR1_I:MAR1] -~w~Lass mich hier und ich sorg dafür, dass Salvatore dir die Eier abschneidet! - -[MAR1_J:MAR1] -~r~Maria ist tot! O Schmerz! - -[MAR1_K:MAR1] -~w~Toni, Süßer, ich hatte einen Heidenspaß heute. - -[MAR1_K2:MAR1] -~w~Komm doch nachher wieder, dann können wir uns noch mehr amüsieren. - -[MAR1_K3:MAR1] -~w~Bis später, Hübscher! - -[MAR1_L:MAR1] -~w~Die Cops sind hinter uns her! Häng die mal bloß ab! - -[MAR1_L2:MAR1] -~w~Ich glaube, wir haben sie abgehängt! Fahren wir shoppen! - -[MAR1_M:MAR1] -~w~HALT! DIEBIN! - -[MAR1EXT:MAR1] -~w~Bring Maria zurück zu ihrer ~y~Wohnung. - -[MAR1_1:MAR1] -KEIN(E) - -[MAR1_D3:MAR1] -~w~Nehmen Sie Ihre verdammten Pfoten weg! - -[MAR1_G3:MAR1] -~w~Lassen Sie mich los! - -[MAR1_E2:MAR1] -~w~Häng die Bullen ab! - -{=================================== MISSION TABLE MAR2 ===================================} - -[MAR2_AA:MAR2] -~w~Hör auf! Einer von Salvatores Fiffis fährt mich gleich rüber... - -[MAR2_AB:MAR2] -~w~...oh, ein Charmeur. - -[MAR2_AC:MAR2] -~w~Vielleicht ein bisschen dünn. - -[MAR2_AE:MAR2] -~w~Hör zu, ich will Party machen, aber die Vorräte sind alle. - -[MAR2_AF:MAR2] -~w~Hast du denn Puder da? 'Nasenpuder', hm? - -[MAR2_AG:MAR2] -~w~Super. Ciao! - -[MAR2_AH:MAR2] -~w~Komm, Toni. Ich muss dringend wohin. - -[MAR2_BA:MAR2] -~w~Hast du kein Auto? - -[MAR2_BB:MAR2] -~w~Fahren wir. Mein Dealer wartet nicht ewig auf mich. - -[MAR2_3F:MAR2] -~w~Bring Maria zu ihrem ~y~Dealer. - -[MAR2_BC:MAR2] -~w~Da sind sie. Halt hinter ihnen an. Braver Junge. - -[MAR2_GA:MAR2] -~w~Du wartest hier. - -[MAR2_GB:MAR2] -~w~Irgendwie gefällt mir das nicht. - -[MAR2_GC:MAR2] -~w~Süß, du machst dir Sorgen. Aber ich bin Salvatores Mädchen, mir passiert nichts. - -[MAR2_GE:MAR2] -~w~Mit euch geh ich nirgendwohin! Für wen haltet ihr euch, verdammt? - -[MAR2_GF:MAR2] -~w~Fahr! - -[MAR2_GG:MAR2] -~w~Toni! - -[MAR2_GH:MAR2] -~w~Oh, Shit! - -[MAR2_19:MAR2] -~w~Erledige die ~r~Sindaccos! - -[MAR2_EA:MAR2] -~w~Zufrieden? - -[MAR2_EB:MAR2] -~w~Toni Cipriani. Mein Held! - -[MAR2_EC:MAR2] -~w~Weißt du was? Genug amüsiert für heute. Fahr mich heim, Tiger. - -[MAR2_HA:MAR2] -~w~Tja, äh, hast du Lust, mit raufzukommen... auf 'n Kaffee, oder so? - -[MAR2_HB:MAR2] -~w~Lass gut sein. - -[MAR2_HC:MAR2] -~w~Sicher? Tja, ruf mich mal an. - -[MAR2_O2:MAR2] -~w~Bring Maria zurück zu ihrer ~y~Wohnung. - -[MAR2_CA:MAR2] -~w~Mach schon, Toni! - -[MAR2_CB:MAR2] -~w~Um Himmels Willen, Toni, schnell! - -[MAR2_CC:MAR2] -~w~Rette mich, Toni! - -[MAR2_CD:MAR2] -~w~Hilfe! - -[MAR2_CE:MAR2] -~w~Mach schooooon! - -[MAR2_FA:MAR2] -~w~Und von wem krieg ich jetzt meinen Stoff? - -[MAR2_FB:MAR2] -~w~Du bist ein Idiot, Toni! - -[MAR2_LM:MAR2] -~w~Du hast ~b~Maria~w~ zurückgelassen. Hol sie. - -[MAR2_MD:MAR2] -~r~Maria ist tot. - -[MAR2_WA:MAR2] -~w~Die ~r~Dealer~w~ entkommen! - -[MAR2_DM:MAR2] -~r~Du hast die Dealer verloren! - -[MAR2_DA:MAR2] -~w~Schöner Held bist du! - -[MAR2_DF:MAR2] -~r~Du hast Marias Dealer vertrieben! - -[MAR2_18:MAR2] -~w~Ramme das ~r~Sindacco-Auto~w~, um Maria zu retten! - -[MAR2_AD:MAR2] -~w~...Genau. - -{=================================== MISSION TABLE MAR3 ===================================} - -[MAR3_A0:MAR3] -~w~Lieber Toni, ich habe mich als Hauptpreis bei einem Straßenrennen gemeldet. - -[MAR3_A1:MAR3] -~w~Wenn Salvatore das erfährt, kriegen wir beiden tierischen Ärger. - -[MAR3_A2:MAR3] -~w~Also komm schnell und rette meinen Arsch... dann gehört er vielleicht sogar dir! - -[MAR3_A3:MAR3] -~w~Für immer dein, Maria. - -[MAR3_E0:MAR3] -~w~Komm, Maria. Fahren wir. - -[MAR3_E1:MAR3] -~w~Na, endlich! Der harte Kerl traut sich ran. - -[MAR3_E2:MAR3] -~w~Hör mal, Maria, du gehörst Salvatore... - -[MAR3_E3:MAR3] -~w~Ich gehör mir allein! - -[MAR3_E4:MAR3] -~w~...du bist so ein verdammter Spießer! - -[MAR3_E5:MAR3] -~w~Komm, Wayne! Hauen wir auf den Putz! - -{=================================== MISSION TABLE MAR4 ===================================} - -[MAR4_B1:MAR4] -~w~Du findest Wayne bei seiner Gang in ~y~Chinatown. - -[MAR4_B2:MAR4] -~w~Fahr hin und mach ihn alle! - -[MAR4_C1:MAR4] -~r~Wayne~w~ flieht! Schnapp dir ein Motorrad und mach ihn fertig! - -[MAR4_C3:MAR4] -~w~Er hängt dich ab! Lass ~r~Wayne ~w~nicht entkommen! - -[MAR4_D1:MAR4] -~w~Bist du Wayne? - -[MAR4_D2:MAR4] -~w~Wer will das wissen? - -[MAR4_D3:MAR4] -~w~Ich bin ein Freund von Maria. - -[MAR4_D4:MAR4] -~w~...Frauen zu verprügeln, bringt dich auf Touren, hä? - -[MAR4_D5:MAR4] -~w~Die Schlampe hatte es verdient! - -[MAR4_D6:MAR4] -~w~Ja? Dann bist du jetzt dran! - -[MAR4_D7:MAR4] -~w~Schnappt ihn! - -[MAR4_T1:MAR4] -~w~Na komm, Großmaul! - -[MAR4_T2:MAR4] -~w~Du hast doch nichts drauf! - -[MAR4_T3:MAR4] -~w~Du fährst wie ein Amateur! - -[MAR4_T4:MAR4] -~w~Wenn du näher rankommst, kannst du mich am Arsch lecken! - -[MAR4_F1:MAR4] -~r~Du hast Wayne entkommen lassen! - -[MAR4_P1:MAR4] -~w~Du hast den Penner gekriegt! - -[MAR4_H1:MAR4] -Wayne - -[MAR4_C4:MAR4] -~w~Verlier ~r~Wayne~w~ nicht. Stelle ihn und mach ihn fertig! - -[BIK_01:MAR4] -Was hast du denn jetzt wieder eingepfiffen? - -[BIK_02:MAR4] -Nichts. - -[BIK_03:MAR4] -Was war's diesmal, hä? - -[BIK_04:MAR4] -Schnee? Downer? Glückspillen? Ein bisschen zuviel Koks? - -[BIK_08:MAR4] -Wer hat das getan? - -[BIK_09:MAR4] -Keiner. - -[BIK_10:MAR4] -Wer war das? - -[BIK_11:MAR4] -Ein Typ, mit dem ich was hab. Wayne. - -[BIK_12:MAR4] -Mit dem du was hast? Du bist die Frau vom Boss! - -[BIK_13:MAR4] -Sei nicht so spießig, Toni. Außerdem besorgt er mir 'n geiles Speed. - -[BIK_14:MAR4] -Es baut mich auf. - -[BIK_15:MAR4] -Und macht einen echt scharf in der Kiste. - -[BIK_16:MAR4] -Halt's Maul. Warum hat er dir das angetan, - -[BIK_17:MAR4] -dieser tote Flachwichser Wayne? - -[BIK_18:MAR4] -Ich hab ihm gesagt, dass ich 'nen anderen liebe. - -[BIK_19:MAR4] -Ich hab ihm von uns erzählt, Toni. - -[BIK_22:MAR4] -Wo finde ich diesen Wayne? - -[BIK_23:MAR4] -Er dealt in 'ner Bar in Chinatown. - -[BIK_24:MAR4] -Ich liebe dich, Toni Cipriani. - -[BIK_06:MAR4] -- Hat die Mischung nicht gestimmt? ~n~ - Halt den Mund, Toni! - -[BIK_05:MAR4] -Nicht genug Dizeopam? - -[BIK_20:MAR4] -- Und dann hat er mich verprügelt! ~n~ - Es gibt kein 'uns'! Bist du bescheuert? - -{=================================== MISSION TABLE MAR5 ===================================} - -[MAR5_EA:MAR5] -~w~Warum hast du mich hier hergebracht? - -[MAR5_EB:MAR5] -~w~Hier ist mein Zeug nicht... hier ist Wayne immer rumgehangen. - -[MAR5_EC:MAR5] -~w~...Jetzt fällt's mir ein - ich hab ein paar Zaps in Hepburn Heights gebunkert! - -[MAR5_ED:MAR5] -~w~Hey, das ist diese Schlampe, Maria! Und der Wichser, der Wayne umgelegt hat! - -[MAR5_AA:MAR5] -~w~Ich hab das Zap hinter der Mülltonne versteckt! - -[MAR5_AB:MAR5] -~w~Shit! Die Müllabfuhr war da! - -[MAR5_AC:MAR5] -~w~Warte! Mir fällt ein, dass ich in meiner Wohnung noch was habe! - -[MAR5_AD:MAR5] -~w~Bist du dir diesmal sicher? - -[MAR5_AE:MAR5] -~w~Natürlich bin ich mir sicher! - -[MAR5_BA:MAR5] -~w~Ich meinte Salvatores Wohnung! Bei Salvatore! - -[MAR5_BB:MAR5] -~w~Verdammt noch mal, Maria! - -[MAR5_FA:MAR5] -~w~Was bist'n du für ein Fahrer? Das hat ja ewig gedauert! Ich hätte mit Überdosis draufgehen können. - -[MAR5_FB:MAR5] -~w~Wie seh ich denn aus! Ich brauch neue Klamotten, und ein Lifting, das volle Programm! - -[MAR5_FC:MAR5] -~w~Süßer... hast du eigentlich Geld? - -[MAR5_FD:MAR5] -~w~Äh... nicht wirklich. - -[MAR5_FE:MAR5] -~w~Und was gräbst du mich dann an, verdammt? Ich bin Salvatores Mädchen! - -[MAR5_FF:MAR5] -~w~Und der stinkt vor Geld! Bagger mich bloß nie wieder an! - -[MAR5_CA:MAR5] -~w~(Stöhnen) - -[MAR5_CB:MAR5] -~w~Oh, Shit, ich glaub, ich muss kotzen. - -[MAR5_CC:MAR5] -~w~Ich bin echt verdammt high, Toni! - -[MAR5_CD:MAR5] -~w~Mir geht's gar nicht gut. - -[MAR5_CE:MAR5] -~w~Du fährst zu schnell! Und zu langsam! - -[MAR5_NC:MAR5] -~b~Maria~w~ kann kaum noch laufen. Beschaff ein Fahrzeug! - -[MAR5_ND:MAR5] -~w~Maria kann kaum noch laufen. Beschaff ein Fahrzeug! - -[MAR5_DA:MAR5] -~w~Dich machen wir alle, Mann! - -[MAR5_DB:MAR5] -~w~Du und die Schlampe sind heute Nacht fällig! - -[MAR5_DC:MAR5] -~w~War ein großer Fehler, dich mit uns anzulegen! - -[MAR5_LM:MAR5] -~w~Du hast ~b~Maria~w~ zurückgelassen. Hol sie. - -[MAR5_O1:MAR5] -~w~Bring Maria zu dem Diner beim ~y~Callahan Point. - -[MAR5_O2:MAR5] -~w~Bring Maria nach ~y~Hepburn Heights. - -[MAR5_O3:MAR5] -~w~Bring Maria zu ~y~ihrer Wohnung. - -[MAR5_O4:MAR5] -~w~Bring Maria zu ~y~Salvatores Villa. - -[MAR5_O5:MAR5] -~w~Fahr zurück und hol ~b~Maria. - -[MAR5_MD:MAR5] -~r~Maria ist tot! - -[MAR5_O6:MAR5] -~w~Hol ~b~Maria. - -[OVER_01:MAR5] -Oh, hey, Süßer. Ich dachte schon, du kommst nie. - -[OVER_02:MAR5] -Was ist los mit dir? - -[OVER_03:MAR5] -Upps! Nichts, Baby, alles bestens. - -[OVER_04:MAR5] -Du spinnst wohl! Steh auf! Was hast du denn diesmal eingepfiffen? - -[OVER_05:MAR5] -Eingepfiffen? Nicht viel. - -[OVER_06:MAR5] -Na ja, ein bisschen Opium, ein bisschen LSD. - -[OVER_07:MAR5] -Ach, und so geile Pillen, die ich jetzt aus Holland kriege. - -[OVER_08:MAR5] -Total rein! Mir geht's super. - -[OVER_09:MAR5] -Von wegen. - -[OVER_10:MAR5] -Ich nehme 'n Zap, dann geht's wieder. - -[OVER_11:MAR5] -Die sind da irgendwo. - -[OVER_12:MAR5] -Was sind 'Zaps'? - -[OVER_13:MAR5] -Du weißt nicht, was 'Zaps' sind? - -[OVER_14:MAR5] -Och, Toni, du bist so spießig. - -[OVER_17:MAR5] -Ich brauch 'n Zap, sonst geh ich drauf! - -[OVER_18:MAR5] -Ich hab 'ne Überdosis erwischt. - -[OVER_19:MAR5] -Besorg mir ein Zap, Toni. - -[OVER_20:MAR5] -Ich hab sie im Diner am Callahan Point vergessen. - -[OVER_21:MAR5] -Was hockst du noch rum? Los! - -[OVER_15:MAR5] -- Toni, ich liebe dich. ~n~ - Lass den Blödsinn. - -{=================================== MISSION TABLE VIC1 ===================================} - -[VIC1I11:VIC1] -~w~Ich hab 'ne nette kleine Bude für dich, Toni. - -[VIC1I12:VIC1] -~w~Die ist wie für dich geschaffen. - -[VIC1I13:VIC1] -~w~Da fahren wir als Erstes hin. - -[VIC1I14:VIC1] -~w~Zu gütig. - -[VIC1_3:VIC1] -~w~Fahr Vincenzo zu seinem ~y~Lagerhaus. - -[VIC1_4:VIC1] -~w~Steig wieder in das ~b~Auto. - -[VIC1_5:VIC1] -~w~Fahr Vincenzo ins ~y~Versteck. - -[VIC1_6:VIC1] -~w~Stell dich in die gelbe Markierung am ~y~Eingang. - -[VIC1_7:VIC1] -~w~Nimm das Bekleidungssymbol auf, um dich umzuziehen. - -[VIC1_8:VIC1] -~w~Geh wieder raus zu Vincenzo. - -[VIC1_9:VIC1] -~w~Bring Vincenzo zu den ~y~Atlantic Quays. - -[VIC1_9A:VIC1] -~w~Jetzt fahr mich nach Hause. - -[VIC1_10:VIC1] -~w~Steig in das ~b~Auto. - -[VIC1_D1:VIC1] -~w~Mann, fährst du'n Scheißdreck zusammen, Toni! - -[VIC1_D2:VIC1] -~w~Pass auf die Scheißkarre auf! - -[VIC1_D3:VIC1] -~w~Toni, hör auf, mich zu verscheißern und fahr vernünftig, du Wichser! - -[VIC1_C1:VIC1] -~w~Da wären wir, Toni. 'Home, sweet home'. Hübsch, nicht? - -[VIC1_C2:VIC1] -~w~In dem Dreckloch soll ich wohnen? - -[VIC1_C3:VIC1] -~w~Oh! Ich finde, es passt zu dir. - -[VIC1_C4:VIC1] -~w~Jetzt beleidigst du den guten, alten Vincenzo aber. - -[VIC1_C5:VIC1] -~w~Okay, Großmaul, schwing deinen Arsch da rauf und zieh dir was Anständiges an. - -[VIC1_C6:VIC1] -~w~Ich hab nicht ewig Zeit, also beeil dich. - -[VIC1_C7:VIC1] -~w~Hey, Wohnungen kosten Geld, Toni. - -[VIC1_C8:VIC1] -~w~Also vergiss nicht, wer hier die Rechnungen bezahlt. - -[VIC1_C9:VIC1] -~w~ICH! Daddy Vincenzo hier. - -[VIC1C10:VIC1] -~w~Und deshalb arbeitest du ab sofort für mich. - -[VIC1C11:VIC1] -~w~Dass du mir also bald wieder hier aufkreuzt. - -[VIC1_F:VIC1] -~r~Vincenzo ist tot. - -[HOMS_01:VIC1] -Hey... also da ist er, hm? - -[HOMS_02:VIC1] -Hör zu, Toni, ich weiß, du hast gute Arbeit für uns geleistet - -[HOMS_03:VIC1] -und ich weiß, du warst lange auf Tauchstation, - -[HOMS_04:VIC1] -deshalb trittst du mal eine Weile kürzer, hmm? - -[HOMS_05:VIC1] -Vincenzo kümmert sich um dich. - -[HOMS_06:VIC1] -Brauchst du Geld, frag ihn. - -[HOMS_07:VIC1] -Brauchst du 'nen Job, besorgt dir Lucky was. - -[HOMS_08:VIC1] -Kann man mehr von der Familie verlangen? - -[HOMS_09:VIC1] -So gut hat's nicht mal mein Sohn. - -[HOMS_10:VIC1] -Aber Mr. Leone, verbindet uns nicht was? - -[HOMS_11:VIC1] -Ich hab viel für diese Familie getan. - -[HOMS_12:VIC1] -Und jetzt machen Sie mich zum Befehlsempfänger von diesem... diesem... - -[HOMS_13:VIC1] -Das finde ich einfach nicht richtig. - -[HOMS_14:VIC1] -Toni, ich weiß, was du getan hast und keiner ist dankbarer als ich. Ehrlich. - -[HOMS_15:VIC1] -Aber dass du hier reinspazierst - -[HOMS_16:VIC1] -und meine Anweisungen in Frage stellst, ist, offengesagt, - -[HOMS_17:VIC1] -unangebracht. Capiche? - -[HOMS_18:VIC1] -Verstehe, Boss. - -[HOMS_19:VIC1] -Wenn du also was brauchst, melde dich bei Vincenzo an dem Atlantic Quay. - -[HOMS_20:VIC1] -Er kümmert sich um dich, stimmt's, Lucky? - -[HOMS_21:VIC1] -Natürlich, Boss. Ist doch klar. - -[HOMS_22:VIC1] -Weißt du, was? Fahren wir gleich hin. - -{=================================== MISSION TABLE VIC2 ===================================} - -[VIC2M2:VIC2] -Die faule Sau hat seit Tagen keine Kohle mehr abgeliefert. - -[VIC2M3:VIC2] -Vielleicht braucht er 'n bisschen Ansporn, damit er den Arsch hochkriegt und was arbeitet. - -[VIC2M4:VIC2] -Scheiß Einstellung, der Kerl... erinnert mich irgendwie an dich. - -[VIC2M5:VIC2] -~w~Was willst du damit sagen? - -[VIC2M6:VIC2] -Ich will damit gar nichts SAGEN! - -[VIC2M7:VIC2] -Ich BEFEHLE dir damit, dafür zu sorgen, dass das Arschloch endlich anfängt, Kohle ranzuschleifen! - -[VIC2_B:VIC2] -~w~Beschaff dir ein Fahrzeug. - -[VIC2OB1:VIC2] -~w~Bring den Dealer zur ~y~Arbeit. - -[VIC2_C:VIC2] -~w~Du brauchst ein Fahrzeug, um ihn zu seinem Revier zu bringen! - -[VIC2_D:VIC2] -~w~Hol Vincenzos Dealer im ~y~St. Mark's Distrikt~w~ ab. - -[VIC2_E:VIC2] -~w~Vincenzo meint, du wärst zu feige, um dein Revier zu bearbeiten? - -[VIC2_E2:VIC2] -~w~Hey, Mann! Ich bin kein Feigling! - -[VIC2_EX:VIC2] -~w~Ich... äh... ich war nur krank! - -[VIC2_E3:VIC2] -~w~Ab morgen arbeite ich wieder... oder vielleicht ab übermorgen. - -[VIC2_E4:VIC2] -~w~Ich glaube, du arbeitest ab heute wieder... ob's dir passt oder nicht! - -[VIC2_F:VIC2] -~w~Hey! Lass mich hier nicht stehen! Das ist 'ne üble Gegend, Mann! - -[VIC2_F2:VIC2] -~w~Du hast ~b~Vincenzos Dealer ~w~zurückgelassen. Fahr ihn holen. - -[VIC2_G:VIC2] -~w~Hey, ich hab's Vinnie schon gesagt... Chinatown ist inzwischen zu heiß für die Leones. - -[VIC2_G2:VIC2] -~w~Die Sindaccos machen sich da breit! Ich bin ein toter Mann, wenn ich da aufkreuze! - -[VIC2_G3:VIC2] -~w~Klar... klar... - -[VIC2_G4:VIC2] -~w~Ich sag dir doch, Mann, da dealen jetzt die Sindaccos. - -[VIC2_G5:VIC2] -~w~Mir geht's echt gar nicht gut... ich glaub, ich hab Fieber, oder so. - -[VIC2_H:VIC2] -~w~Halte neben ~b~dem Dealer. - -[VIC2_I:VIC2] -~w~Oh, Mann... - -[VIC2_J:VIC2] -~r~Vincenzos Dealer ist hinüber! - -[VIC2_K:VIC2] -~w~Bring Vincenzos Dealer nach ~y~Chinatown. - -[VIC2_1:VIC2] -KEIN(E) - -[VIC2M1:VIC2] -Wir haben einen Dealer, der für uns Nord-Chinatown versorgt. - -{=================================== MISSION TABLE VIC3 ===================================} - -[VIC3_H1:VIC3] -~w~Halte~h~ ~k~ ~PDLT~~w~, um ein ~h~Ziel zu erfassen~w~ und drücke~h~ ~k~ ~PDFW~~w~, um anzugreifen! - -[VIC3_H2:VIC3] -~w~Drücke~h~ ~k~ ~PDFW~~w~, um den ~h~Dealer~w~ anzugreifen. - -[VIC3O2:VIC3] -~w~Fahr nach ~y~Chinatown. - -[VIC3O3:VIC3] -~w~Erledige den ~r~Dealer. - -[VIC3_1:VIC3] -~w~Vincenzo hat dir dafür ein nützliches Geschenk hinterlassen. - -[VIC3_BA:VIC3] -~w~Halt dich von Leone-Gebiet fern, Arschloch! - -[VIC3_BB:VIC3] -~w~Hast du noch nicht genug, Arschgesicht? - -[VIC3_BC:VIC3] -~w~In dieser Stadt dealen die Leones! Sonst keiner! Ist das klar, ihr Sindacco-Wichser? - -[VIC3_6:VIC3] -~w~Die Sindaccos dealen in ganz Chinatown. - -[VIC3_AA:VIC3] -~w~Vinnie? - -[VIC3_AB:VIC3] -~w~Zum Kuckuck, Toni! Kann ich nie meine Ruhe haben? - -[VIC3_AD:VIC3] -~w~Ich kann eh schon nicht kacken, da kann ich dich nicht auch noch gebrauchen. - -[VIC3_AE:VIC3] -~w~Aber wo du schon mal da bist - ich hab immer noch kein Geld gesehen - -[VIC3_AF:VIC3] -~w~von diesem Dealer. Und weißt du, warum? - -[VIC3_AG:VIC3] -~w~Ich bin ganz Ohr. - -[VIC3_AJ:VIC3] -~w~Die Sindaccos haben angefangen zu dealen und das auf Leone-Gebiet! - -[VIC3_AK:VIC3] -~w~Hast du vor, das zu dulden, Toni? - -[VIC3_AL:VIC3] -~w~Ich will, dass du nach Chinatown fährst! - -[VIC3_AM:VIC3] -~w~Okay, 'Boss'. Wird gemacht. - -[VIC3_AN:VIC3] -~w~Oh, Gott, warum ist denn hier nie Klopapier, verflucht noch mal? - -[VIC3_AH:VIC3] -~w~Weil er tot ist, du Idiot. Jemand hat ihn umgelegt. - -[VIC3O4:VIC3] -~r~Die Sindaccos~w~ dealen in ganz Chinatown. Erteile ihnen eine Lektion, die sie nie mehr vergessen! - -{=================================== MISSION TABLE VIC4 ===================================} - -[VIC4_H2:VIC4] -~w~Die ~h~Sprühdose~w~ auf dem Radar führt dich zum ~h~Pay 'n' Spray. - -[VIC4_A2:VIC4] -~w~Stell dich in die ~h~Markierung~w~, um dir das Waffenangebot anzusehen. - -[VIC4_A3:VIC4] -~w~Benutze~h~ ~k~ ~AMMOV~~w~, um verschiedene Waffen auszuwählen. - -[VIC4_A4:VIC4] -~w~Kaufe die ausgewählte Waffe durch Drücken von~h~ ~k~ ~AMBUY~ ~w~- aber nur, wenn du genug Geld hast! - -[VIC4_A6:VIC4] -~w~Es gibt acht verschiedene Waffentypen. - -[VIC4_A7:VIC4] -~w~Du kannst pro Waffentyp immer nur eine bei dir tragen: Eine Pistole, eine Schrotflinte, usw. - -[VIC4_H1:VIC4] -~w~Das ~h~Waffensymbol~w~ auf dem Radar führt dich zu ~h~Ammu-Nation. - -[VIC4_H3:VIC4] -~w~Das ~h~Waffensymbol~w~ auf dem Radar führt dich wieder zu ~h~Ammu-Nation. - -[VIC4_AB:VIC4] -~w~Wie könnt ich den vergessen? - -[VIC4_AD:VIC4] -~w~Das Interessante ist, er möchte jetzt gern ein Leone werden. - -[VIC4_AE:VIC4] -~w~Der Wichser hat die Wahl gehabt! - -[VIC4_AG:VIC4] -~w~Hallo, Hirn...-zelle! Mann, Sal meinte zwar, du wärst ein dummer Schläger, - -[VIC4_AH:VIC4] -~w~aber dass einer gleich so dumm sein kann... - -[VIC4_AJ:VIC4] -~w~Er wird unser Informant bei denen. - -[VIC4_AK:VIC4] -~w~Die Sache hat nur einen Haken. - -[VIC4_AL:VIC4] -~w~So ein Sindacco-Gorilla hat ihn am Gängelband. - -[VIC4_AM:VIC4] -~w~Und dieses kleine Hindernis sollst du aus dem Weg räumen - -[VIC4_AN:VIC4] -~w~und JD auf unsere Seite ziehen. Capiche? - -[VIC4_2:VIC4] -~w~Nimm das ~g~Handy~w~ als Beweis, dass du den Job erledigt hast. - -[VIC4_BA:VIC4] -~w~Toni... oh, du hast mir eben ein super Snuff-Video geliefert! - -[VIC4_BB:VIC4] -~w~JD? Du hast das gesehen? DU HAST MICH GEFILMT?! - -[VIC4_BC:VIC4] -~w~Och, ich... das ist nur für den Heimgebrauch! - -[VIC4_BD:VIC4] -~w~Ich kann's kaum erwarten, dass wir im selben Team sind! - -[VIC4_BE:VIC4] -~w~Freu dich mal nicht zu früh. Du schuldest mir immer noch Geld. - -[VIC4_BF:VIC4] -~w~Nimm die Karre von dem Sindacco als Anzahlung, hä? - -[VIC4_BG:VIC4] -~w~Spritz sie um, dann erkennt sie keiner. - -[VIC4_BH:VIC4] -~w~Ich kümmere mich um die Leiche. - -[VIC4_CA:VIC4] -~w~Hey! Mach die Fliege! - -[VIC4_CB:VIC4] -~w~Du hast hier nichts verloren! - -[VIC4_61:VIC4] -~w~Steig in das ~b~Auto. - -[VIC4_62:VIC4] -~w~Fahr zum Pay 'n' Spray. - -[VIC4_DC:VIC4] -~r~JD sagte, du sollst das Auto umspritzen lassen! - -[VIC4_PR:VIC4] ---ring ring-- - -[VIC4O1A:VIC4] -~w~Geh ~y~rein. - -[VIC4_O2:VIC4] -~w~Kauf dir eine Pistole. - -[VIC4_O4:VIC4] -~w~Erledige den ~r~Sindacco-Gorilla. - -[VIC4_FA:VIC4] -~r~Jetzt verkauft er dir keine Knarre mehr! - -[VIC4_O3:VIC4] -~w~Fahr zu der ~y~Baustelle. - -[VIC4_AC:VIC4] -~w~Der führt jetzt eine von den Sindaccos kontrollierte Titten-Bar - ich meine, einen Herrenclub. - -[VIC4_AA:VIC4] -~w~Hey, erinnerst du dich an JD O'Toole? - -[VIC4_AI:VIC4] -~w~Über JD können wir erfahren, was die Sindaccos so planen. - -[HELP42:VIC4] -~w~Drücke während des Zielens die~h~ ~k~ ~FREE1~~w~, um den ~h~manuellen Zielmodus~w~ zu aktivieren und benutze dann den~h~ ~k~ ~FREE2~ ~w~zum Anvisieren. - -[VIC4_A1:VIC4] -~w~Besorg dir beim nächsten ~y~Ammu-Nation~w~ eine Knarre. - -[VIC4_O1:VIC4] -~w~Begib dich wieder zu ~y~Ammu-Nation~w~ und besorg dir eine Knarre. - -[VIC4_1:VIC4] -~w~Der ~r~Sindacco-Schläger~w~ ist auf der Rückseite der Baustelle. Erledige ihn! - -{=================================== MISSION TABLE VIC5 ===================================} - -[VIC5_H:VIC5] -Leones - -[VIC5_I0:VIC5] -~w~Ach, du bist es. - -[VIC5_I1:VIC5] -~w~Ja, wer hätte das gedacht - ich bin's. Was sagt man dazu? - -[VIC5_I2:VIC5] -~w~Dazu sag ich dir folgendes, Großmaul: - -[VIC5_I3:VIC5] -~w~Ein paar von unseren Leuten haben ein völlig idiotensicheres Ding vermasselt. - -[VIC5_I4:VIC5] -~w~Zu blöd für 'nen popeligen Überfall, die Volldeppen! - -[VIC5_I5:VIC5] -~w~Jetzt haben die Bullen sie in Chinatown eingekesselt. - -[VIC5_I6:VIC5] -~w~Kacke! Warum bin ich nur von lauter Idioten umgeben? - -[VIC5_I7:VIC5] -~w~Keine Ahnung... 'Wie der Herr...'? - -[VIC5_I8:VIC5] -~w~An dir ist ein Komiker verloren gegangen! - -[VIC5_I9:VIC5] -~w~Mal sehen, ob du das auch lustig findest: - -[VIC5I10:VIC5] -~w~Du wirst diese Scheiße nämlich für mich aufräumen! - -[VIC5I11:VIC5] -~w~Also hau die Idioten da raus und schaff sie mir her! - -[VIC5_F1:VIC5] -~r~Eins der Gang-Mitglieder ist tot. - -[VIC5_G0:VIC5] -~w~Besorg dir einen Viersitzer. - -[VIC5_O1:VIC5] -~w~Fahr ~b~Vincenzos Männer~w~ retten. - -[VIC5_O2:VIC5] -~w~Hau ~b~die Gang~w~ da raus! - -[VIC5_O3:VIC5] -~w~Häng die Cops ab! - -[VIC5_O4:VIC5] -~w~Fahr die Gang zu ~y~Vincenzos Bude. - -[VIC5_O5:VIC5] -~w~Halte ~b~die Gang~w~ zusammen! - -[VIC5_O6:VIC5] -~w~Du brauchst ein Fahrzeug mit mehr Platz! - -[VIC5_G1:VIC5] -~w~Was machen wir jetzt? - -[VIC5_G2:VIC5] -~w~Wir sind am Arsch! - -[VIC5_G3:VIC5] -~w~Für den Drecksack von Vincenzo geh ich nicht in den Knast! - -[VIC5_G4:VIC5] -~w~Hauen wir ab hier, verdammt! - -[VIC5_G5:VIC5] -~w~Warte auf mich! - -[VIC5_G6:VIC5] -~w~Gib Gas, Toni! - -[VIC5_E1:VIC5] -~w~Also, habt ihr das Geld? - -[VIC5_E2:VIC5] -~w~Jeden Cent, Boss... - -[VIC5_E3:VIC5] -~w~Hey, hören Sie, wir konnten echt nichts machen... - -[VIC5_E4:VIC5] -~w~...ihr konntet echt nichts machen... - -[VIC5_E5:VIC5] -~w~Es ist scheiße gelaufen, schlimmer hätt's nicht kommen können... - -[VIC5_E6:VIC5] -~w~Was meinst du... ist es jetzt besser oder schlimmer? - -[VIC5_E7:VIC5] -~w~Wenn ihr mir noch mal ein Ding in den Sand setzt, wird's für euch auch schlimmer! - -[VIC5_E8:VIC5] -~w~Jetzt räumt die Scheiße da weg und geht mir aus den Augen! - -[VIC5_E9:VIC5] -~w~Ich muss mal telefonieren. - -[VIC5E10:VIC5] -~w~Ich schwör bei Gott, Toni, seit du zurückgekommen bist, hab ich 'ne Pechsträhne. - -[VIC5E11:VIC5] -~w~Du bist ein verdammter Unglücksbringer! - -{=================================== MISSION TABLE VIC6 ===================================} - -[VIC6_BA:VIC6] -~w~Anhalten! - -[VIC6_BB:VIC6] -~w~Keine Bewegung, Arschloch! - -[VIC6_P0:VIC6] -~w~Hol Vincenzos ~b~Auto~w~ ab. - -[VIC6_P1:VIC6] -~w~Eine Polizeifalle! Schaff das Auto da weg! - -[VIC6_P2:VIC6] -~w~Häng die Cops ab! - -[VIC6_P3:VIC6] -~w~Du hast die Cops abgehängt! ~w~Bring das Auto jetzt zu Vincenzos ~y~Garage. - -[VIC6_P4:VIC6] -~w~Zeig Vincenzo, dass du dir nichts mehr von ihm gefallen lässt - verschrotte sein ~b~Auto! - -[VIC6_P5:VIC6] -~w~Steig wieder in Vincenzos ~b~Auto! - -[VIC6_P6:VIC6] -~w~Bring das Auto zu Vincenzos ~y~Garage. - -[VIC6_PA:VIC6] -~r~Du hast das Auto zerstört! - -[VIC6_D1:VIC6] -~w~Steig in das ~b~Auto. - -[VIC6_D3:VIC6] -~w~Fahr es zur ~y~Schrottpresse. - -[VIC6_D4:VIC6] -~w~Steig aus und lass die Schrottpresse ihre Arbeit tun. - -[VIC6_D5:VIC6] -~r~Du hättest das Auto verschrotten sollen! - -[VIC6_AA:VIC6] -~w~Hey, Toni, was macht das Auto? - -[VIC6_AB:VIC6] -~w~Du Hurensohn, Vinnie! Du hast mich reingelegt! - -[VIC6_AC:VIC6] -~w~Reingelegt? REINGELEGT? - -[VIC6_AD:VIC6] -~w~Als du in diese Stadt zurückkamst, hattest du nichts! NICHTS! - -[VIC6_AE:VIC6] -~w~Ich habe dir geholfen, du undankbarer Bastard! - -[VIC6_AF:VIC6] -~w~Mit einer Wohnung und einem Job! - -[VIC6_AG:VIC6] -~w~Und für diese Großzügigkeit erwarte ich, dass du ab und zu ein Risiko eingehst. - -[VIC6_AH:VIC6] -~w~Ich bin nämlich nicht die Wohlfahrt, klar? Und nicht dein Sugardaddy. - -[VIC6_AI:VIC6] -~w~Dann hat die Polizei das Auto also beobachtet! Scheiß auf die Polizei! - -[VIC6_AJ:VIC6] -~w~Wenn ich dir einen Auftrag erteile, führst du ihn aus. Capiche? - -[VIC6_AK:VIC6] -~w~Oh, ja, ich hab kapiert, Vinnie. - -[VIC6_AL:VIC6] -~w~Ich hab kapiert, dass ich wie Dreck behandelt werde, solange ich für dich arbeite. - -[VIC6_AM:VIC6] -~w~Ich hab schon Dinger gedreht, da hast du noch Mädchen den Rock hochgeschaut. - -[VIC6_AN:VIC6] -~w~Steck dir deinen Drecksjob an den Hut, 'Boss'. Ich kündige! - -[VIC6_AO:VIC6] -~w~Toni, du machst einen großen... - -[VIC6_D2:VIC6] -~w~Halte in der ~y~Markierung. - -[HOTW_01:VIC6] -Klar, Mamma, ich ruf dich später an. - -[HOTW_28:VIC6] -Vincenzo! - -[HOTW_02:VIC6] -Ja, natürlich. Natürlich bin ich ein braver Junge. - -[HOTW_03:VIC6] -Hab dich lieb. - -[HOTW_04:VIC6] -Hey, Cheryl, Süße, lass mal gut sein. - -[HOTW_05:VIC6] -Da. Und jetzt verschwinde. - -[HOTW_06:VIC6] -Kleines Wundertütchen für dich. - -[HOTW_11:VIC6] -Du bist widerlich. Kennst du keine Achtung? - -[HOTW_12:VIC6] -Achtung? Ich nenn's Vielseitigkeit, Antonio. - -[HOTW_15:VIC6] -Wenn nicht, kann ich Ray bitten, bei dir einzuspringen. - -[HOTW_16:VIC6] -Arschloch! - -[HOTW_17:VIC6] -Ich verarsch dich doch nur. Reg dich ab. - -[HOTW_18:VIC6] -Hör zu, du musst mir einen Gefallen tun. - -[HOTW_19:VIC6] -Meine Mädels brauchen Stoff. Ich hab 'n Auto voll davon in Trenton stehen. - -[HOTW_20:VIC6] -Hol die Kiste und ruf mich an. - -[HOTW_21:VIC6] -Bin ich dein Chauffeur? Leck mich. - -[HOTW_22:VIC6] -Hör zu, hör zu, hör zu... - -[HOTW_23:VIC6] -Ich würd's selber machen, aber das FBI beobachtet mich. - -[HOTW_24:VIC6] -Ich pass schon auf dich auf. Ehrlich. - -[HOTW_25:VIC6] -Außerdem gibt's hier 'ne Rangordnung, capiche? Jetzt sei ein braver Junge! - -[HOTW_07:VIC6] -- Hey, wer liebt dich, Engelchen? ~n~ - Du, Vinnie. - -[HOTW_09:VIC6] -- War das deine Mutter am Apparat? ~n~ - Ja. - -[HOTW_13:VIC6] -- Lässt du dir nicht gern von 'ner scharfen Braut einen blasen? ~n~ - Was? - -{=================================== MISSION TABLE VIC7 ===================================} - -[VIC7_VE:VIC7] -~r~v1.01 - -[VIC7_1:VIC7] -~w~Vinnie, ich bin's! Wo steckst du, verdammt? Was soll das? - -[VIC7_2:VIC7] -~w~Toni? Come sta? Ich wusste, dass du anrufst. - -[VIC7_3:VIC7] -~w~Hör zu, ich bin bei den Portland Docks. - -[VIC7_3A:VIC7] -~w~Wir kriegen 'ne große Lieferung rein. Mach, dass du herkommst. Ich bin auf dem großen Frachter. - -[VIC7_3B:VIC7] -~w~Ich weiß nicht, Vinnie... ich hab zu tun. - -[VIC7_3D:VIC7] -~w~Aber von jetzt an sind wir Partner, okay? Nein, noch viel mehr... wir sind Brüder! - -[VIC7_3E:VIC7] -~w~Also, komm. Was meinst du? Salvatore wünscht es sich. - -[VIC7_3F:VIC7] -~w~Okay. Salvatore zuliebe. - -[VIC7_3G:VIC7] -~w~Aber wenn du noch mal diesen 'Daddy'-Scheiß abziehst, bist du ein toter Mann. - -[VIC7_4:VIC7] -~w~Hahaha! Ich schlitz dich auf, Kleiner! - -[VIC7_4A:VIC7] -~w~Triff Vincenzo auf dem ~y~Frachter. - -[VIC7_5:VIC7] -~w~Stiiirrrb! - -[VIC7_6:VIC7] -~w~Hahahahahaha! - -[VIC7_7:VIC7] -~w~Ist der verblödete Scheißkerl tot? - -[VIC7_8:VIC7] -~w~Ich muss dich leider enttäuschen, Vinnie. - -[VIC7_9:VIC7] -~w~Du Hurensohn! Kannst du nicht endlich verrecken? - -[VIC7_10:VIC7] -~w~Du hättest nicht zurückkommen sollen, Toni. - -[VIC710A:VIC7] -~w~Ich hab mir für Salvatore die Finger wund geschuftet. - -[VIC710B:VIC7] -~w~Und dann kommst du wieder anspaziert und ich hör von ihm nur noch: Toni dies, Toni das! - -[VIC7_11:VIC7] -~w~Das ist meine Stadt, Toni! MEINE STADT! - -[VIC711A:VIC7] -~w~Und du nimmst sie mir nicht weg! - -[VIC7_12:VIC7] -~w~Das werd ich genießen. - -[VIC7_4B:VIC7] -~w~Sieht menschenleer aus. Geh an Bord des ~y~Schiffes. - -[VIC7_13:VIC7] -~w~Begib dich zum ~y~Ausgang. - -[VIC7_3C:VIC7] -~w~Ich weiß, dass ich dich wie 'n Arschloch behandelt habe. Tut mir auch ehrlich Leid. - -[VIC7HUL:VIC7] -~w~Geh runter in den ~y~Rumpf. - -{=================================== MISSION TABLE SALS1 ===================================} - -[SALS1_1:SALS1] -KEIN(E) - -[SALS1_6:SALS1] -Beseitige ~r~Bürgermeister R.C. Hole! - -[SALS1_7:SALS1] -Schnapp dir das ~g~Handy des Bürgermeisters! - -[SALS1_8:SALS1] -~r~Der Bürgermeister joggt nicht mehr. - -[SALS1_9:SALS1] -~r~Der Bürgermeister ist entkommen. - -[SALS110:SALS1] -Bring das Handy zu ~y~Salvatore. - -[SALS111:SALS1] -Waffe weg oder ich schieße! - -[SALS112:SALS1] -Sie haben Verdacht geschöpft! Der ~r~Bürgermeister~w~ haut ab! - -[SS1_AA:SALS1] -Ich bin's, Toni. - -[SS1_AB:SALS1] -Diese Bürgermeistersau verarscht mich. Das lass ich mir nicht bieten! - -[SS1_AC:SALS1] -Reg dich ab, Sal. Ich werd versuchen, ihn aus dem Verkehr zu ziehen. - -[SS1_AD:SALS1] -Bist ein guter Junge, Toni. Dein Vater wäre stolz auf dich. - -[SS1_AE:SALS1] -Hör zu, der Fettsack von Bürgermeister müsste beim Joggen im Park sein. - -[SS1_AF:SALS1] -Sorg dafür, dass ihm die Luft ausgeht... für immer! - -[SS1_AG:SALS1] -Und schnapp dir sein Handy! - -[SS1_AH:SALS1] -Dann sehen wir, mit wem er telefoniert hat. - -[SALS1AA:SALS1] -Ich bin's, Toni. - -[SALS1AB:SALS1] -Diese Bürgermeistersau verarscht mich. - -[SALS1AC:SALS1] -Das lass ich mir nicht bieten! - -[SALS1AD:SALS1] -Reg dich ab. Ich zieh ihn aus dem Verkehr. - -[SALS1AE:SALS1] -Bist ein guter Junge, Toni. - -[SALS1AF:SALS1] -Der Fettsack müsste beim Joggen im Park sein. - -[SALS1AG:SALS1] -Sorg dafür, dass ihm die Luft ausgeht. Für immer! - -[SALS1AH:SALS1] -Ach, und schnapp dir sein Handy! - -[SALS1AI:SALS1] -Dann sehen wir, mit wem er telefoniert hat. - -[SALS1C1:SALS1] -Waffe weg, Sir! - -[SALS1C2:SALS1] -Halt oder ich schieße! - -[SALS1C3:SALS1] -Keine Bewegung! - -[SALS1C4:SALS1] -Seien Sie kein Idiot! - -[SALS113:SALS1] -~r~Das Handy des Bürgermeisters wurde zerstört. - -[SALS114:SALS1] -Vorsicht! Sie schießen, wenn du bewaffnet im Park auftauchst. - -{=================================== MISSION TABLE SALS2 ===================================} - -[SALS2_1:SALS2] -~w~Geh zum ~b~Auto. - -[SALS2_2:SALS2] -~w~Fahr zum ~y~Treffpunkt. - -[SALS2_3:SALS2] -~w~Steig wieder ins ~b~Auto. - -[SALS2_4:SALS2] -~r~Mickey ist draufgegangen! - -[SALS2_5:SALS2] -~r~Ein Mann von Salvatore ist draufgegangen! - -[SALS2AA:SALS2] -Toni, - -[SALS2AB:SALS2] -ein paar von den Jungs kommen nachher bei dir vorbei. - -[SALS2AC:SALS2] -Sieh zu, dass du da bist, wenn sie kommen. - -[SALS2AD:SALS2] -Ciao, Salvatore. - -[SALS2CA:SALS2] -Hey, Toni. - -[SALS2CC:SALS2] -Los, steig ein. Du fährst. - -[SALS2CD:SALS2] -Mickey, was ist denn los? - -[SALS2CE:SALS2] -Ach, komm, Cipriani, meinst du, ich will dich umnieten? - -[SALS2BA:SALS2] -Salvatore ist da unten. - -[SALS2BC:SALS2] -Toni, mein Junge, - -[SALS2BD:SALS2] -heute ist dein großer Tag! - -[SALS2BE:SALS2] -Oh, Salvatore. Mr. Leone. - -[SALS2BF:SALS2] -Auf den Tag hat meine Mamma gewartet. - -[SALS2CB:SALS2] -Steig ein, komm, wir fahren wohin. - -[SALS2BB:SALS2] -Madonn' mia, worauf wartest du? - -[SALS2AF:SALS2] -Hey, Toni, danke. Du hörst von mir. - -{=================================== MISSION TABLE SALS3 ===================================} - -[SALS3_1:SALS3] -KEIN(E) - -[SALS3_2:SALS3] -Schaden - -[SALS313:SALS3] -~r~Der Berater des Bürgermeisters ist hinüber! - -[SALS314:SALS3] -~r~Salvatore ist hinüber! - -[SALS3AA:SALS3] -Toni, steig ein! - -[SALS3AB:SALS3] -Wo fahren wir hin? - -[SALS3AC:SALS3] -Zu einem Plausch mit dem Assistenten des Bürgermeisters über Franco Forelli. - -[SALS3BA:SALS3] -Runter von meinem Boot! - -[SALS3BB:SALS3] -Du kommst mit. - -[SALS3BC:SALS3] -Was fällt Ihnen ein! - -[SALS3BD:SALS3] -Beeil dich, der Sicherheitsdienst guckt zu! - -[SALS3CA:SALS3] -Toni, Vorsicht! Schützen auf den Felsen! - -[SALS3CB:SALS3] -Schützen vor dir! - -[SALS3CC:SALS3] -Vorsicht, rechts, Toni! - -[SALS3CD:SALS3] -Links, Toni, links! - -[SALS3CE:SALS3] -Schützen auf der Mole da! - -[SALS3CF:SALS3] -Scheiße, der Sicherheitsdienst tanzt im Hubschrauber an! - -[SALS3DA:SALS3] -Der Bürgermeister wär ohne Francos Okay nicht mal scheißen gegangen! - -[SALS3DB:SALS3] -Der Bürgermeister war nicht gekauft! - -[SALS3DC:SALS3] -Halt, halt, ihr habt Recht. - -[SALS3DE:SALS3] -Die Sizilianer? Wieso? - -[SALS3DF:SALS3] -Sie haben Franco gekauft und wollen Krieg zwischen den Familien in Liberty. - -[SALS3DG:SALS3] -Wenn sich alles beruhigt hat, übernehmen sie die Macht. - -[SALS3DH:SALS3] -Toni, ich ruf dich gleich an. - -[SALS3DI:SALS3] -Aber erst muss ich diesen Scheißhaufen entsorgen! - -[SALS3DD:SALS3] -Diese Sizilianer... die haben Franco dazu überredet. - -{=================================== MISSION TABLE SALS4 ===================================} - -[SALS4_1:SALS4] -KEIN(E) - -[SALS4BA:SALS4] -Ja. - -[SALS4BB:SALS4] -Gott sei Dank bist du rangegangen! - -[SALS4BC:SALS4] -Was gibt's, Sal? - -[SALS4BD:SALS4] -Ich bin in Fort Staunton, die Forellis ausspionieren und jetzt dampft die Kacke! - -[SALS4BE:SALS4] -Die Sindaccos eröffnen den Krieg gegen die Forellis - -[SALS4BF:SALS4] -und ich stecke mitten in dem Gemetzel drin! - -[SALS4BG:SALS4] -Ich bin sofort da. - -[SALS4BH:SALS4] -Nimm die Limo. Sie ist gepanzert. Wir werden sie brauchen! - -[SALS4AA:SALS4] -Toni, nichts wie weg hier! - -[SALS4AB:SALS4] -Bring mich zur Limo! - -[SALS4AE:SALS4] -Gut, ich hab 'ne Wohnung in Newport. Fahr mich hin! - -[SALS4AF:SALS4] -Hey, Toni, danke. Ich melde mich. - -[SAL4_1:SALS4] -Hol Mr. Leones ~b~Limo. - -[SAL4_2:SALS4] -~r~Du hast den Wagen zerstört! - -[SAL4_3:SALS4] -Fahr den Wagen nach ~y~Fort Staunton. - -[SAL4_4:SALS4] -~r~Du hast Salvatore sterben lassen! - -[SAL4_6:SALS4] -~b~Salvatore~w~ ist in der Gasse. - -[SAL4_9:SALS4] -Begib dich zur ~y~Garage. - -[SAL4_11:SALS4] -Du hast ~b~Salvatore ~w~zurückgelassen! - -[SAL4_12:SALS4] -Versperrt! Lass die Limo stehen und geh zu Fuß hin. - -[SAL4_13:SALS4] -Steig in die ~b~Limo. - -[SAL4_14:SALS4] -Bring Salvatore und die Limo zur ~y~Garage~w~ in Newport. - -[SAL4_15:SALS4] -Such ~b~Salvatore! - -[SAL4_16:SALS4] -Bring Salvatore zur ~b~Limo. - -[SAL4_17:SALS4] -Warte, bis ~b~Salvatore~w~ in der Limo ist! - -{=================================== MISSION TABLE SALS5 ===================================} - -[SALS5_1:SALS5] -~w~Drücke~h~ ~k~ ~VEACC~ ~w~um Paul Sindaccos Auto zu steuern. - -[SALS5_2:SALS5] -~w~Erledige die ~r~Forellis~w~ am Treffpunkt, ehe Sindacco das Steuergerät entdeckt. - -[SALS5_3:SALS5] -~r~Paul Sindacco ist tot! - -[SALS5_4:SALS5] -~r~Salvatores Van wurde zerstört! - -[SALS5_5:SALS5] -~r~Sindacco ist am Treffpunkt! - -[SALS5_6:SALS5] -~w~Los, zum ~b~Van. - -[SALS5_7:SALS5] -~w~Restzeit - -[SALS5_8:SALS5] -~r~Sindacco hat das Steuergerät entdeckt! - -[SALS5_9:SALS5] -~w~Die Satellitensteuerung von Sindaccos Auto reagiert bei dir verzögert. - -[SALS510:SALS5] -Schaden - -[SALS5AA:SALS5] +[POR1_19] Hey! -[SALS5AB:SALS5] -Toni, ich bin's. Ich hab was für dich. +[DESPERA] +Desperado -[SALS5AC:SALS5] -Es wird dir mordsmäßig Spaß machen. +[MOB_99A] +Begib dich zu dem Fernsprecher neben dem Einkaufszentrum in Washington Beach. -[SALS5AD:SALS5] -Was soll ich erledigen, Sal? +[MOB_98A] +Begib dich zu dem Fernsprecher in Vice Point. -[SALS5AE:SALS5] -Um die Ecke steht ein Van. +[MOB_96A] +Begib dich zu dem Fernsprecher beim Flughafen-Terminal. -[SALS5AF:SALS5] -Ruf mich an, wenn du ihn findest. +[MOB_95A] +Begib dich zu dem Fernsprecher in Little Havana. -[SALS5BA:SALS5] -Okay, Sal, ich bin im Van. +[BNK1_1] +Kann ich Ihnen helfen, Sir? -[SALS5BB:SALS5] -Gut. Wir haben an Paulie Sindaccos Auto rumgebastelt. +[BNK1_2] +Der Typ ist verkleidet! -[SALS5BC:SALS5] -Was mach ich jetzt? +[BNK1_3] +Er ist verrückt geworden! -[SALS5BD:SALS5] -Paulie trifft sich mit den Forellis, +[BNK1_4] +Wer zum Teufel sind Sie? -[SALS5BE:SALS5] -um 'nen Waffenstillstand auszuhandeln. +[BNK1_5] +Wo ist Ihre Dienstmarke? -[SALS5BF:SALS5] -Mit dem Apparat im Van kannst du Paulies Auto fernsteuern +[BNK1_6] +Da sind sie! Feuer frei! -[SALS5BG:SALS5] -und ihnen dazwischenfunken. +[MOB_24A] +Hallo, spricht da Mr. Vercetti? -[SALS5CA:SALS5] -Hä?! +[MOB_24B] +Ja. -[SALS5CC:SALS5] -Großer Gott, Hilfe! +[MOB_24C] +Hier Cortez. Sie waren bei meiner Party. -[SALS5CD:SALS5] -Aus dem Weg! +[MOB_24D] +Ja. Ich erinnere mich. -[SALS5CF:SALS5] -Helft mir doch! +[MOB_24E] +Mr. Vercetti, es war höchst unglücklich, was da bei der Abwicklung Ihres Geschãfts vorgefallen ist. -[SALS5CG:SALS5] -Mein Auto ist besessen! +[MOB_24F] +Ich weiß. -[SALS5CE:SALS5] -Die Karre will mich umbringen! +[MOB_24G] +Sie sollen wissen, dass ich und meine Leute alles tun, um der Sache auf den Grund zu gehen. -[SALS5CB:SALS5] -Hey, was ist denn jetzt los? +[MOB_24H] +Falls Sie mit mir persönlich sprechen wollen, finden Sie mich auf dem Schiff. Guten Tag, Senor. -{=================================== MISSION TABLE SALS6 ===================================} +[BNK2_6] +Der Typ ist geisteskrank! -[SALS601:SALS6] -~w~Sal hat ein ~b~Boot ~w~für dich am Südwestpier liegen. Fang den Klugscheißer ab. +[ANGEL] +Angel -[SALS602:SALS6] -~w~Er fährt entlang der Küste. Schnapp ~r~ihn! +[CUBJET] +Kubanischer Jetmax -[SALS603:SALS6] -~r~Er ~w~fährt zu Franco Forelli! +[SANDKIN] +Sandking -[SALS604:SALS6] -~r~Der Klugscheißer hat Fort Staunton erreicht. +[POLMAV] +Polizei-Maverick -[SALS605:SALS6] -~r~Er ist entkommen! +[BOXVILL] +Boxville -[SALS606:SALS6] -~r~Er ~w~entkommt zu Fuß! +[BENSON] +Benson -[SALS607:SALS6] -~w~Er entkommt in einem ~r~gestohlenen Auto! +[HOTRINA] +Hotring Racer -[SALS608:SALS6] -~r~Ohne Boot kannst du ihn nicht verfolgen! +[HOTRINB] +Hotring Racer -[SALS6AA:SALS6] -Hallo. +[BLOODRA] +Chaos-Derby Banger -[SALS6AC:SALS6] -Forelli-Sindacco-Fehde. +[BLOODRB] +Chaos-Derby Banger -[SALS6AD:SALS6] -Er ist jetzt zu Franco Forelli unterwegs. +[MAFIACR] +Mafia Cruiser -[SALS6AE:SALS6] -Für uns ist es von großem Vorteil, wenn Franco nichts erfährt +[COP_M2] +'EINSATZ IN VICE CITY' -[SALS6AF:SALS6] -und dieser Krieg weitergeht. +[COP_M3] +'DONNER ÜBER VICE CITY' -[SALS6AG:SALS6] -Mach das Plappermaul unschädlich. +[BNK3_2] +Ich fahre nicht für dich, niemals. Das erzãhle ich in der Therapie. -[SALS6AH:SALS6] -Wird erledigt, Sal. +[FEM_SL1] +Datei 1 nicht vorhanden -[SALS6AB:SALS6] -Toni, so'n Klugscheißer hat rausgekriegt, dass die sizilianische Mafia hinter der Forelli-Sindacco-Fehde steckt. +[FEM_SL2] +Datei 2 nicht vorhanden -[SLS6_20:SALS6] -~w~Er will zurück zu Franco Forelli, erledige ~r~ihn ~w~! +[FEM_SL3] +Datei 3 nicht vorhanden -[SLS6_21:SALS6] -~w~Erledige ~r~ihn ~w~! +[FEM_SL4] +Datei 4 nicht vorhanden -{=================================== MISSION TABLE NEDS1 ===================================} +[FEM_SL5] +Datei 5 nicht vorhanden -[NEDS1_1:NEDS1] -Das FBI ist unterwegs, um einen gefälschten Bericht über Spitzensportler in Empfang zu nehmen. +[FEM_SL6] +Datei 6 nicht vorhanden -[NEDS1_2:NEDS1] -Gelangt der Bericht in die Hände des FBI, landen unschuldige Menschen im Knast. +[FEM_SL7] +Datei 7 nicht vorhanden -[NEDS1_3:NEDS1] -Du sollst den Bericht abfangen und mir bringen, damit ich ihn sicher verwahren kann. +[FEM_SL8] +Datei 8 nicht vorhanden -[NEDS1_4:NEDS1] -Du benötigst ein FBI-Fahrzeug. +[FEA_CHA] +Tonausgabe wird auf STEREO umgeschaltet. Bitte warten... -[NEDS1_5:NEDS1] -Auf dem Highway wurde ein bewaffneter Raubüberfall vereitelt. Das FBI ist am Tatort. +[FEA_CHD] +Achtung! Sie schalten die Tonausgabe von STEREO auf DTS um. Bitte warten... -[NEDS1_6:NEDS1] -Klau ihr Auto und fahr zur Übergabestelle, ehe es zu spät ist. +[FEI_SEL] +Auswahl -[NEDS1_8:NEDS1] -Steig wieder ins ~b~FBI-Auto! +[FEI_BAC] +Zurück -[NEDS1_9:NEDS1] -Fahr zum ~y~Übergabeort. +[FEI_RES] +Weiter -[NEDS111:NEDS1] -Häng die Cops ab! +[FEI_NAV] +Navigieren -[NEDS113:NEDS1] -Ich hab den versprochenen Bericht. +[FEI_BTX] +/-Taste - -[NEDS114:NEDS1] -Hä? Hier ist schon ein Agent!? +[FEI_BTT] +"-Taste - -[NEDS115:NEDS1] -Noch ein FBI-Auto? Moment! Sie sind ein Hochstapler! +[FEI_STA] +START-Taste - -[NEDS116:NEDS1] -Stoppe den ~r~Informanten! +[FEI_BTD] +; = > < - -[NEDS117:NEDS1] -Hol dir den ~g~Bericht. +[FEI_STO] +Stop -[NEDS118:NEDS1] -Bring den Bericht zur ~y~Liberty Tree Redaktion. +[MOB_68A] +Tommy, Alter, ich hab eine Überraschung für dich. -[NEDS119:NEDS1] -~r~Das FBI-Auto kannst du dir abschminken. +[MOB_68B] +Ich bin im Aufnahmestudio mit ein paar super Musikern. -[NEDS120:NEDS1] -~r~Du bist zu spät gekommen! Der Informant hat dem FBI den Bericht gegeben! +[MOB_68C] +Warum kommst du nicht kurz vorbei? -[NEDS121:NEDS1] -Gute Arbeit, Toni. Gott findet Wohlgefallen an dir. +[MOB_68D] +Kannst dir denken, dass es sich lohnt, oder? Bis dann. -[NEDS122:NEDS1] -Bei mir gerät er nicht in falsche Hände. +[OUTFT1] +Straße -[NEDS123:NEDS1] -Tschüs. +[OUTFT2] +Abendgarderobe -[NEDS124:NEDS1] -~r~Der Bericht ist im Eimer! +[OUTFT3] +Overall -[NEDS1AA:NEDS1] -Vergib mir, Vater, denn ich habe gesündigt... +[OUTFT4] +Country Club -[NEDS1AB:NEDS1] -Scheiße, der Teufel hat dich am Wickel, Antonio. +[OUTFT5] +Havana -[NEDS1AE:NEDS1] -Ein armer Sünder hat gebeichtet, einen Dopingbericht über Spitzensportler frei erfunden zu haben. +[OUTFT6] +Cop -[NEDS1AF:NEDS1] -Wenn du verhinderst, dass er ihn dem FBI übergibt, wären die Karrieren Unschuldiger gerettet. +[OUTFT7] +Bankrãuber -[NEDS1AG:NEDS1] -Wird erledigt, Vater. +[OUTFT8] +Freizeit -[NEDS1BA:NEDS1] -Sie sind früh da. +[OUTFT9] +Mr. Vercetti -[NEDS1BB:NEDS1] -Ich kenne Sie nicht. Wo ist John-O? +[OUTFT10] +Trainingsanzug -[NEDS1BC:NEDS1] -John-O? Er konnte nicht kommen. +[OUTFT13] +MC Tommy -[NEDS1BD:NEDS1] -Hey, da ist John-O! +[CAR_AS1] +AUTOHAUS ERWORBEN -[NEDS1BE:NEDS1] -Her damit! +[CAR_AS2] +~g~Sunshine Autos generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. -[NEDS1BF:NEDS1] -Scheiße! +[BUYSAVE] +~g~Außerhalb einer Mission kannst du dein Spiel hier umsonst speichern. -[NEDS1AD:NEDS1] -Äh, Letzteres ist eher meine Kragenweite... +[BUYGARG] +~g~Du kannst in dieser Garage auch Autos abstellen. -[NEDS1AC:NEDS1] -Du kannst also entweder Ave Marias beten oder die Drecksarbeit des Herrn verrichten. +[STRPBUY] +Pole Position Club gekauft: $ ~1~ -[NEDS1_7:NEDS1] -Begib dich zum Tatort und klau ein ~b~FBI-Auto~w~. Komm dann vor ~1~:~1~ zum Treffpunkt. +[STRP_R3] +Drücke R3, um den Pole Position Club zu kaufen. Preis: $~1~ -[NEDS125:NEDS1] -Fahr zum Tatort und klau einen ~b~FBI-Wagen~w~, dann sieh zu, dass du vor 0~1~:~1~ Uhr den Treffpunkt erreichst. +[NBMN_R3] +Drücke R3, um Elswanko Casa zu kaufen. Preis: $~1~ -[NEDS126:NEDS1] -Fahr zum Tatort und klau einen ~b~FBI-Wagen~w~, dann sieh zu, dass du vor 0~1~:0~1~ Uhr den Treffpunkt erreichst. +[GA_4] +Autobomben kosten $1000 pro Stück. -[NEDS127:NEDS1] -Fahr zum Tatort und klau einen ~b~FBI-Wagen~w~, dann sieh zu, dass du vor ~1~:0~1~ Uhr den Treffpunkt erreichst. +[GA_5] +In deinem Wagen ist schon eine Autobombe. -{=================================== MISSION TABLE NEDS2 ===================================} +[GA_6] { reVC update } +Park die Karre, mach sie durch Drücken der ~h~~k~~VEHICLE_FIREWEAPON~~w~ scharf und dann HAU AB! -[NEDS2_1:NEDS2] -KEIN(E) +[GA_7] { reVC update } +Mach die Bombe mit der ~h~~k~~VEHICLE_FIREWEAPON~~w~ scharf. Dann geht sie hoch, wenn der Wagen angelassen wird. -[NEDS2AA:NEDS2] -Vergib mir, Vater, denn ich habe gesündigt. +[GA_6B] { reVC update } +Park die Karre, mach sie durch Drücken der ~h~~k~~VEHICLE_FIREWEAPON~~w~ scharf und dann HAU AB! -[NEDS2AB:NEDS2] -Heilige Kacke, Toni, was hast du jetzt angestellt? +[GA_7B] { reVC update } +Mach die Bombe mit der ~h~~k~~VEHICLE_FIREWEAPON~~w~ scharf. Dann geht sie hoch, wenn der Wagen angelassen wird. -[NEDS2AC:NEDS2] -Sie fluchen, Vater. +[MOB_70A] +Tommy, ich bin's, Colonel Cortez. Hören Sie, Sie sind doch ein Mann, der Dinge zu erledigen weiß. -[NEDS2AD:NEDS2] -Stimmt. Ave Maria, voll der Dingsbums. +[MOB_70B] +Sie finden mich auf dem Boot. -[NEDS2AE:NEDS2] -Ein Gestrauchelter hat gebeichtet, Diamantenhehler zu sein. +[PICK2] +.357 in Verstecken angeliefert! -[NEDS2AF:NEDS2] -Schick ihn in die ewige Erlösung, schnapp dir die Klunker, dann gebe ich sie dem Besitzer zurück. +[PICK3] +Kettensãgen in Verstecken angeliefert! -[NB2_2:NEDS2] -Hol dir den ~g~Koffer~w~ und leg alle Gang-Mitglieder um. +[PICK4] +Flammenwerfer in Verstecken angeliefert! -[NB2_3:NEDS2] -Bring den Koffer zur ~y~Liberty Tree Redaktion. +[PICK5] +.308 Prãzisionsgewehr in Verstecken angeliefert! -[NB2_4:NEDS2] -Hol dir den ~g~Koffer! +[PICK6] +Mini-Kanonen in Verstecken angeliefert! -[NB2_1:NEDS2] -Das ist 'ne Falle! +[PICK7] +Raketenwerfer in Verstecken angeliefert! -[NB2_6:NEDS2] -Erledige alle ~r~Wachen! +[PICK8] +Sea Sparrow jetzt bei Vercetti Estate verfügbar! -[NB2_7:NEDS2] -Zerstöre den ~r~Helikopter! +[PICK9] +Panzer jetzt in Army-Kaserne verfügbar! -[NB2_5:NEDS2] -Schalte den ~r~Helikopter~w~ und die ~r~Wachen~w~ aus und hol dir den ~g~Koffer. +[PICK10] +Hunter jetzt in Army-Kaserne verfügbar! -{=================================== MISSION TABLE NEDS3 ===================================} +[CLOTH1] +Abendgarderobe bei Rafaels in Ocean Beach erhãltlich. -[NEDS3AA:NEDS3] -Vergib mir, Vater, denn ich habe gesündigt. +[CLOTH2] +Straßenkleidung in Verstecken angeliefert. -[NEDS3AB:NEDS3] -Toni, verglichen mit deinen degenerierten Mitbürgern bist du ein Heiliger! +[CLOTH3] +Overall bei 'Tooled Up' im North Point Einkaufszentrum erhãltlich. -[NEDS3AC:NEDS3] -Ihre Autos pumpen Satans Darmwinde in die Lungen unserer Kinder! Sie verpesten den Garten Eden! +[CLOTH4] +Country Club-Bekleidung beim Golf Club in Leaf Links erhãltlich. -[NEDS3AD:NEDS3] -Zeige diesen Sündern, dass ihr Tun falsch ist! +[CLOTH5] +Havana-Outfit bei 'Little Havana Streetwear' in Little Havana erhãltlich. -[NEDS3_1:NEDS3] -Fahr mit dem Feuerwehrauto durch die Stadt und verursache möglichst viele Unfälle und Karambolagen. +[CLOTH6] +Polizeiuniform bei Polizeistation in Washington Beach erhãltlich. -[NEDS3_2:NEDS3] -~w~Klau das ~b~Feuerwehrauto. +[CLOTH7] +Freizeitbekleidung bei 'Gash' im North Point Einkaufszentrum erhãltlich. -[NEDS3_3:NEDS3] -~w~Du hast ~1~ Sekunden, um zu dem ~b~Feuerwehrauto~w~ zurückzukehren. +[CLOTH8] +Mr. Vercetti-Outfit bei 'Collar & Cuffs'in Ocean Beach erhãltlich. -[NEDS3_4:NEDS3] -Wertung +[CLOTH9] +Trainingsanzug bei 'Jocksport' in Downtown erhãltlich. -[NEDS3_5:NEDS3] -Fahr los und verursache möglichst viele Unfälle, Karambolagen, Schaden und Chaos! +[CLOTH10] +Bankrãuber-Outfit beim Malibu Club in Vice Point erhãltlich. -[NEDS3_6:NEDS3] -Fußgänger hinüber! +[MOB_62A] +Tommy, hier Ricardo Diaz. Ich wollte dir danken, dass du mich gerettet hast. -[NEDS3_7:NEDS3] -Fahrzeug versunken! +[MOB_62B] +Ich hab den Trottel von Cortez gefragt. Er meint, du wãrst ein Mann für alle Fãlle. Komm doch mal bei mir vorbei. -[NEDS3_8:NEDS3] -Fahrzeug zerstört! +[MOB_62C] +Ich brauche einen Kerl wie dich. Ich hab nãmlich nur Schwachköpfe. -[NEDS3_9:NEDS3] -Fahrzeug-Salto! +[MOB_62D] +Nur lauter Schwachköpfe. Ich mache dich schwer reich. -[NEDS310:NEDS3] -~r~Das Feuerwehrauto wurde zerstört. +[GOAWAY2] +Komm wieder, wenn du die Biker Gang-Missionen abgeschlossen hast. -[NEDS311:NEDS3] -360-Grad-Dreher! +[COL2_9] +Du amerikanischer Idiot! Sie sind dir hierher gefolgt! -[NEDS312:NEDS3] -720-Grad-Dreher! +[LOADCOL] +Lade... -[NEDS313:NEDS3] -1080-Grad-Dreher! +[STFT_17] +Schnellste Zeit bei 'PCJ Rallye' -[NEDS314:NEDS3] -~r~Du hast das Feuerwehrauto verlassen. +[STFT_18] +Schnellste Zeit bei 'Krasses Gelãnde' -[NEDS315:NEDS3] -Überschlagenes Fahrzeug! +[STFT_19] +Schnellste Zeit bei 'Teststrecke' -[NEDS316:NEDS3] -3 Zusammenstöße in Folge! +[NEW_REC] +Neuer Rekord!! ~1~ Minuten und ~1~ Sekunden. -[NEDS317:NEDS3] -4 Zusammenstöße in Folge! +[BMX_HOW] +~g~Fahr zwei Runden auf der Gelãndemotorradstrecke. ~y~Passiere dabei ~g~die ~y~CHECKPOINTS~g~! -[NEDS318:NEDS3] -5 Zusammenstöße in Folge! +[BMXREW1] +~g~Jedes Mal wenn du deine bisherige Bestzeit für die zwei Runden verbesserst, -[NEDS319:NEDS3] -Bonus für Massenkarambolage! +[BMXREW2] +~g~bekommst du eine noch höhere ~y~BELOHNUNG~g~! -[NEDS320:NEDS3] -~r~Du hast die nötige Wertung nicht rechtzeitig erzielt. +[BMXRAIN] +~g~Sieht nach Regen aus... -[NEDS321:NEDS3] -Bonus für Biker-Sturz! +[ITBEG] +Am Anfang... -[NEDS322:NEDS3] -Bonus für krassen Biker-Sturz! +[NBMNBUY] +El Swanko Casa gekauft: $ ~1~ -[NEDS323:NEDS3] -Bonus für Himmelfahrt! +[LNKVBUY] +Links View Apartment gekauft: $ ~1~ -[NEDS324:NEDS3] -Bonus für extra hohe Himmelfahrt! +[HYCOBUY] +Hyman Condo gekauft: $ ~1~ -[NEDS325:NEDS3] -~w~Du hast weniger als 1 Sekunde, um zu dem ~b~Feuerwehrauto~w~ zurückzukehren. +[BUYGARS] +~g~Du kannst in diesen Garagen auch Autos abstellen. -[NEDS326:NEDS3] -Glückwunsch! Geschafft! Du hast noch ~1~ Sekunden Restzeit. +[OCHEBUY] +Ocean Heights Apartment gekauft: $ ~1~ -[NEDS327:NEDS3] -~w~Zerstöre das ~r~Feuerwehrauto.~w~ Hinterlasse keine Spuren. +[WASHBUY] +1102 Washington Street gekauft: $ ~1~ -[NEDS328:NEDS3] -Bonuspunkte gibt es für spektakuläre Zusammenstöße, Saltos, schleudernde oder zerstörte Fahrzeuge. +[VCPTBUY] +3321 Vice Point gekauft: $ ~1~ -[NEDS329:NEDS3] -Fahrzeug-Salto x ~1~ +[HELP6_C] +Drücke die ~h~~k~~VEHICLE_HANDBRAKE~~w~, um die Handbremse anzuziehen. -[NEDS330:NEDS3] -Fahrzeug überschlagen x ~1~ +[HELP2_A] +Drücke die ~h~~k~~PED_SPRINT~~w~, um zu ~h~sprinten. -[NEDS332:NEDS3] -~w~Du hast 1 Sekunde, um zu dem ~b~Feuerwehrauto~w~ zurückzukehren. +[HELP4_A] +Drücke die ~h~~k~~VEHICLE_ACCELERATE~~w~, um zu beschleunigen. -[NEDS333:NEDS3] -Glückwunsch! NEUE BESTZEIT! Noch ~1~ Sekunden Restzeit. +[HELP5_A] +Drücke die ~h~~k~~VEHICLE_BRAKE~~w~, um zu bremsen, oder um zurückzusetzen, wenn das Fahrzeug steht. -[NEDS334:NEDS3] -~w~Zerstöre jetzt das Feuerwehrauto. Hinterlasse keine Spuren. +[HELP8_A] +Drücke die ~h~~k~~PED_SNIPER_ZOOM_IN~~w~, um an das Ziel heranzuzoomen und die ~x~/-Taste~w~,um herauszuzoomen. -[NEDS335:NEDS3] -180-Grad-Dreher! +[PBOAT_1] { reVC update } +Drücke die~h~ ~k~~VEHICLE_FIREWEAPON~~w~, um die Bordkanonen abzufeuern. -[NEDS337:NEDS3] -Fahr mit dem Feuerwehrauto durch die Stadt und verursache bis ~1~:~1~ Uhr möglichst viele Unfälle, Karambolagen und Chaos. +[SEG3_4] { reVC update } +~g~Um Bomben aufzunehmen, steuere den RC Raider einfach nahe an sie heran. Um eine abzuwerfen, drücke die ~h~~k~~VEHICLE_FIREWEAPON~~g~-Taste. -[NEDS338:NEDS3] -Fahr mit dem Feuerwehrauto durch die Stadt und verursache bis ~1~:0~1~ Uhr möglichst viele Unfälle, Karambolagen und Chaos. +[RCR1_3] { reVC update } +~g~Wenn du diese Mission abbrechen willst, drücke die ~h~~k~~VEHICLE_FIREWEAPON~~g~, um dein Auto zu sprengen. -[NEDS339:NEDS3] -Fahr mit dem Feuerwehrauto durch die Stadt und verursache bis 0~1~:~1~ Uhr möglichst viele Unfälle, Karambolagen und Chaos. +[HELP32] { reVC update } +Dann feuere mit der ~h~~k~~VEHICLE_FIREWEAPON~. -[NEDS340:NEDS3] -Fahr mit dem Feuerwehrauto durch die Stadt und verursache bis 0~1~:0~1~ Uhr möglichst viele Unfälle, Karambolagen und Chaos. +[HELP33] { reVC update } +Dann feuere mit der ~h~~k~~VEHICLE_FIREWEAPON~. -[NEDS341:NEDS3] -Verursache bis ~1~:~1~ Uhr möglichst viele Unfälle, Karambolagen und Chaos. +[TTUTOR] +Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~~w~, um Taxi-Missionen an- oder abzuschalten. -[NEDS342:NEDS3] -Verursache bis ~1~:0~1~ Uhr möglichst viele Unfälle, Karambolagen und Chaos. +[TTUTOR2] +Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~~w~, um Taxi-Missionen an- oder abzuschalten. -[NEDS343:NEDS3] -Verursache bis 0~1~:~1~ Uhr möglichst viele Unfälle, Karambolagen und Chaos. +[FTUTOR] +Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~~w~, um Feuerwehrwagen-Missionen an- oder abzuschalten. -[NEDS344:NEDS3] -Verursache bis 0~1~:0~1~ Uhr möglichst viele Unfälle, Karambolagen und Chaos. +[FTUTOR2] +Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~~w~, um Feuerwehrwagen-Missionen an- oder abzuschalten. -[NEDS331:NEDS3] -Verursache möglichst viele Unfälle, Karambolagen und Chaos! +[CTUTOR] +Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~~w~, um Bürgerwehr-Missionen zu aktivieren oder zu deaktivieren. -{=================================== MISSION TABLE NEDS4 ===================================} +[CTUTOR2] +Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~~w~, um Bürgerwehr-Missionen zu aktivieren oder zu deaktivieren. -[NEDS4_1:NEDS4] -KEIN(E) +[HELP8_B] +Drücke die~h~ ~k~~PED_SNIPER_ZOOM_IN~~w~, um ~h~an das Ziel heranzuzoomen ~w~und die~h~ ~k~~PED_SNIPER_ZOOM_OUT~~w~, um ~h~herauszuzoomen~w~. -[NEDS4_2:NEDS4] -~w~Die 3 Promis wollen zu einem Radiosender in der Innenstadt, um vor der Premiere heute Abend ein Interview zu geben. +[ATUTOR3] +Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~~w~, um Krankenwagen-Missionen an- oder abzuschalten. -[NEDS4_3:NEDS4] -~w~Die Schauspielerin Faith W. kommt im Privathubschrauber vom Francis Airport. +[GUN_H1] +~w~Drück die~h~ ~k~~PED_SPRINT~~w~, um zu kaufen. ~w~Drück die~h~ ~k~~VEHICLE_ENTER_EXIT~~w~, um zu gehen. -[NEDS4_4:NEDS4] -~w~Der Schauspieler und Gangster DB-P kommt im Boot von Portland. +[PU_CF3] { reVC update } +Drück die ~h~~k~~PED_ANSWER_PHONE~~w~, um die augenblickliche Waffe in diesem Slot auszutauschen. -[NEDS4_5:NEDS4] -~w~Der alternde, alkoholkranke Schauspieler Black Lightman kommt mit der Limousine von der Entzugsklinik. +[PU_CF4] { reVC update } +Drück die ~h~~k~~PED_ANSWER_PHONE~~w~, um die augenblickliche Waffe in diesem Slot auszutauschen. -[NEDS4_8:NEDS4] -~w~Faith ausgeschaltet. +[HELP9_B] +Drücke die~h~ ~k~~PED_FIREWEAPON~~w~, um das Prãzisionsgewehr ~h~abzufeuern~w~. -[NEDS4_9:NEDS4] -~w~DB-P ausgeschaltet. +[HELP37] +Wenn du doch nicht in ein Auto einsteigen willst, das du im Begriff bist, zu klauen, drück die ~h~~k~~PED_SPRINT~. -[NEDS410:NEDS4] -~w~Black Lightman ausgeschaltet. +[HELP6_A] +Drücke die ~h~~k~~VEHICLE_HANDBRAKE~~w~, um die Handbremse anzuziehen. -[NEDS411:NEDS4] -~w~Alle 3 Promis sind ausgeschaltet. Begib dich zurück zur ~y~Kirche~w~ und melde es dem Beichtvater. +[HELP6_D] +Drücke die ~h~~k~~VEHICLE_HANDBRAKE~~w~, um die Handbremse anzuziehen. -[NEDS412:NEDS4] -~r~Faith hat den Radiosender erreicht! +[HELP26] +Drücke die ~h~~k~~VEHICLE_ENTER_EXIT~~w~, um in ein Fahrzeug ein- oder auszusteigen. -[NEDS413:NEDS4] -~r~DB-P hat den Radiosender erreicht! +[HELP27] +Drücke ~h~~k~~VEHICLE_TURRETUP~~w~ oder ~h~~k~~VEHICLE_TURRETDOWN~~w~ um dein Gewicht auf einem Motorrad zu verlagern. -[NEDS414:NEDS4] -~r~Black Lightman hat den Radiosender erreicht! +[HELP28] +Drücke ~h~~k~~VEHICLE_TURRETUP~~w~ oder ~h~~k~~VEHICLE_TURRETDOWN~~w~ um dein Gewicht auf einem Motorrad zu verlagern. -[NEDS415:NEDS4] -~w~Er wird in einen kugelsicheren Patriot umsteigen. +[HELP35] +Benutze die ~h~~k~~GO_LEFT~~w~ oder ~h~~k~~GO_RIGHT~~w~ um das Fahrzeug zu steuern. -[NEDS417:NEDS4] -~w~Der Patriot ist kugelsicher. +[HELP36] +Benutze die ~h~~k~~GO_LEFT~~w~ oder ~h~~k~~GO_RIGHT~~w~ um das Fahrzeug zu steuern. -[NEDS418:NEDS4] -~w~Gib auf den Schützen Acht. +[HELP42] +Folge dem ~q~rosa Symbol~w~, um zum Hotel zu kommen. -[NEDS421:NEDS4] -~w~Phil Cassidy's Waffenladen ist als Fähnchen auf dem Radar sichtbar. +[HELP19] +Stell dich in die ~q~rosa Markierung~w~, um weiterzumachen. -[NEDS4AA:NEDS4] -Vergib mir, Vater, ich habe wieder gesündigt. +[HELP1] +Halte in der Mitte der ~q~rosa Markierung. -[NEDS4AB:NEDS4] -Und wieder sollst du Erlösung finden, mein Sohn. +[HELP12] +Geh ins Zentrum der ~q~rosa Markierung~w~, um eine Mission zu starten. -[NEDS4AC:NEDS4] -Der Prominentenkult nimmt Auswüchse an! +[SEG3_6] +~g~Um eine Zielzone zu treffen, musst du die Bombe innerhalb der ~q~rosa Markierung~g~ abwerfen. Die Reihenfolge spielt dabei keine Rolle. -[NEDS4AD:NEDS4] -Was sind das für Huren, die im Radio schwafeln, statt redlichen Zeitungsreportern Exklusivinterviews zu geben? +[S_PROMP] +Außerhalb einer Mission kannst du dein Spiel speichern, indem du das ~h~Cassetten-Symbol aufnimmst. -[NEDS4AF:NEDS4] -Vernichte diese Götzen! +[HELP16] +Geh durch die Eingangstür, um das ~h~Ocean View Hotel~w~ zu betreten. -[NEDS4BA:NEDS4] -Ich habe getan, was Sie verlangt haben. +[HELP43] +~g~Begib dich zum ~h~Ocean View Hotel~g~ am Ocean Drive. -[NEDS4BB:NEDS4] -Prima! Die Zeitungsauflage hat sich seit deiner Bekehrung verdreifacht. +[HELI_F1] +~r~Heli-Ceckpoint-Mission abgebrochen! -[NEDS4BC:NEDS4] +[AMMUHLP] +Wenn du Waffen brauchst, geh zu ~h~AmmuNation~w~. Das ~h~Pistolensymbol~w~ auf dem Radar zeigt dir den Weg. + +[HELI_1] +Downtown Heli-Checkpoint + +[HELI_2] +Ocean Beach Heli-Checkpoint + +[HELI_3] +Vice Point Heli-Checkpoint + +[HELI_4] +Little Haiti Heli-Checkpoint + +[FST_MFR] +Lieblings-Radiosender + +[FST_LFR] +Unbeliebtester Radiosender + +[FEI_HOL] +Halten + +[FEI_ZOO] +Zoom + +[FEI_BTR] +> < - + +[FEI_NA] +Nicht verfügbar + +[MESA] +Mesa Grande + +[STRP_NO] +Zurzeit kannst du die Stripper-Bar nicht kaufen. Komm spãter wieder. + +[CHSE] +VERFOLGUNGSJAGD + +[NBMN_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um El Swanko Casa zu kaufen. Preis: $~1~ + +[NBMN_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um El Swanko Casa zu kaufen. Preis: $~1~ + +[NBMN_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um El Swanko Casa zu kaufen. Preis: $~1~ + +[LNKV_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Links View Apartment zu kaufen. Preis: $~1~ + +[LNKV_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Links View Apartment zu kaufen. Preis: $~1~ + +[LNKV_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Links View Apartment zu kaufen. Preis: $~1~ + +[HYCO_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Hyman Condo zu kaufen. Preis: $~1~ + +[HYCO_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Hyman Condo zu kaufen. Preis: $~1~ + +[HYCO_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Hyman Condo zu kaufen. Preis: $~1~ + +[OCHE_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Ocean Heights Apartment zu kaufen. Preis: $~1~ + +[OCHE_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Ocean Heights Apartment zu kaufen. Preis: $~1~ + +[OCHE_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Ocean Heights Apartment zu kaufen. Preis: $~1~ + +[WASH_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um 1102 Washington Street zu kaufen. Preis: $~1~ + +[WASH_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um 1102 Washington Street zu kaufen. Preis: $~1~ + +[WASH_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um 1102 Washington Street zu kaufen. Preis: $~1~ + +[VCPT_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um 3321 Vice Point zu kaufen. Preis: $~1~ + +[VCPT_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um 3321 Vice Point zu kaufen. Preis: $~1~ + +[VCPT_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um 3321 Vice Point zu kaufen. Preis: $~1~ + +[PRNT_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um die Druckerei zu kaufen. Preis: $~1~ + +[PRNT_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um die Druckerei zu kaufen. Preis: $~1~ + +[PRNT_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um die Druckerei zu kaufen. Preis: $~1~ + +[CAR_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Autohaus zu kaufen. Preis: $~1~ + +[CAR_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Autohaus zu kaufen. Preis: $~1~ + +[CAR_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Autohaus zu kaufen. Preis: $~1~ + +[PORN_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Filmstudio zu kaufen. Preis: $~1~ + +[PORN_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Filmstudio zu kaufen. Preis: $~1~ + +[PORN_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Filmstudio zu kaufen. Preis: $~1~ + +[ICE_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um die Eiscremefabrik zu kaufen. Preis: $~1~ + +[ICE_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um die Eiscremefabrik zu kaufen. Preis: $~1~ + +[ICE_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um die Eiscremefabrik zu kaufen. Preis: $~1~ + +[TAXI_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Taxiunternehmen zu kaufen. Preis: $~1~ + +[TAXI_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Taxiunternehmen zu kaufen. Preis: $~1~ + +[TAXI_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um das Taxiunternehmen zu kaufen. Preis: $~1~ + +[BANK_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um den Malibu Club zu kaufen. Preis: $~1~ + +[BANK_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um den Malibu Club zu kaufen. Preis: $~1~ + +[BANK_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um den Malibu Club zu kaufen. Preis: $~1~ + +[BOAT_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um die Bootswerft zu kaufen. Preis: $~1~ + +[BOAT_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um die Bootswerft zu kaufen. Preis: $~1~ + +[BOAT_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um die Bootswerft zu kaufen. Preis: $~1~ + +[STRP_L] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um den Pole Position Club zu kaufen. Preis: $~1~ + +[STRP_T] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um den Pole Position Club zu kaufen. Preis: $~1~ + +[STRP_C] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um den Pole Position Club zu kaufen. Preis: $~1~ + +[STOCK] +~r~nicht vorrãtig + +[HELP14] +Um das Büro des Anwalts zu finden, folge dem ~h~'L'~w~ auf dem Radar. + +[BOAT_AS] +~g~Die Bootswerft generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. + +[BOAT_A2] +BOOTSWERFT-MISSIONEN ERFÜLLT + +[BOAT_N] +Checkpoint Charlie + +[BOAT_P] +~g~Sammle die Pãckchen ein, ehe die Zeit um ist. + +[FEI_R1B] +R1- \ R2-Taste - + +[HELP9_A] +Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Prãzisionsgewehr abzufeuern. + +[HELP21] +Drücke die ~h~~k~~VEHICLE_ENTER_EXIT~~w~-Taste, um in ein Fahrzeug ein- oder auszusteigen. + +[CREAM] +Stoff-Auslieferung + +[UMBERTO] +Café Robina + +[PU_CF1] +Drück die ~h~~k~~PED_ANSWER_PHONE~~w~-Taste, um diese Waffe aufzunehmen. Falls du schon eine Waffe von diesem Typ hast, wird sie durch die neue ersetzt. + +[FED_RDM] +KARTE & SYMBOLE + +[FEC_ILU] +Kamera invertieren : + +[NITRO] +Alle Taxis haben jetzt einen Jumper-Turbo! Du musst nur die Taste für die Hupe drücken. + +[RATNG53] +Windei + +[RATNG54] +Niete + +[RATNG55] +Hacker + +[RATNG56] +Mogelpaket + +[RATNG57] +Totaler Lügner + +[STHC_04] +High-Score beim Fußball-Hochhalten + +[STHC_05] +Bestes Hotring-Resultat + +[STFT_13] +Schnellste Zeit bei Downtown Heli-Checkpoint + +[STFT_14] +Schnellste Zeit Ocean Beach Heli-Checkpoint + +[STFT_15] +Schnellste Zeit bei Vice Point Heli-Checkpoint + +[STFT_16] +Schnellste Zeit bei Little Haiti Heli-Checkpoint + +[STFT_21] +Schnellste Zeit bei Hotring + +[STFT_22] +Schnellste Rundenzeit bei Hotring + +[STFT_20] +Schnellste Zeit bei 'Pylonen-Rallye' + +[HELP44] +Halte in der ~q~rosa Markierung. + +[HELP45] +Drücke die ~h~~k~~PED_DUCK~~w~ um dich zu ducken. Dadurch erhöht sich die Treffsicherheit der Waffen, die du hãltst. + +[RCR1_5] +RC Bandit-Rennen + +[RCPL1_7] +RC Baron-Rennen + +[RCH1_11] +RC Raider Checkpoint-Jagd + +[FEA_CTD] +Achtung! Für diesen Modus muss DTS-kompatible Hardware angeschlosen sein. Fortfahren? + +[FEM_STE] +AUF STEREO EINSTELLEN + +[FEM_UDY] +AUF DTS EINSTELLEN + +[GREET] +Grüße aus... + +[LANCE_1] +Hey, Mann, fahr vorsichtiger! + +[LANCE_2] +Hey, pass doch auf, was du machst! + +[LANCE_3] +Hey, wo fahren wir jetzt hin? + +[LANCE_4] +Was machen wir jetzt? + +[LAW4_15] +Mehr Geld! + +[MERC_5] +Schönes Auto, Mr. Vercetti. + +[MERC_26] +SCHNELLER, SCHNELLER, SCHNELLER! + +[MERC_27] +Vorsichtig, Tommy, ich hab mir erst letzten Monat die Nase korrigieren lassen. + +[MERC_28] +Tommy, fahr vorsichtig. + +[MERC_29] +Tommy, fahr langsamer. + +[MERC_30] +Tommy, bring jemand anders um, aber bitte nicht mich. + +[MERC_31] +Tommy, Baby, bring mich nicht um! + +[MERC_32] +Tommy, ich bin froh, dass du dieses Auto gestohlen hast! + +[MERC_40] +Ich hatte so viel Spaß. + +[MERC_43] +Adios, mein Engel. + +[MERC_44] +Und mach schön weiter Bodybuilding, hörst du? + +[MERC_45] +Ciao, mein Hübscher. + +[COL5_17] +Oh, Gott, sie haben einen Helikopter! + +[COL5_18] +Schießt den Helikopter ab! + +[COL5_19] +Tommy, schießen Sie den Helikopter ab! + +[COL5_20] +Da kommt er wieder! Schießt den Helikopter ab! + +[COL5_21] +Sieh dir diesen riesigen Helikopter an! + +[COL5_22] +Da kommt er wieder! + +[FEA_DSM] +Achtung! Dieses Spiel ist auf DTS-Tonausgabe eingestellt. Dazu muss DTS-kompatible Hardware angeschlossen sein. Bitte wãhlen Sie, ob Sie mit DTS oder STEREO-Tonausgabe fortfahren wollen. + +[STFT_23] +Schnellste Zeit bei Checkpoint Carlie + +[HELP50] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~-Taste, um die Spielerfigur von hinten zu sehen. + +[HELP51] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~-Taste, um die Spielerfigur von hinten zu sehen. + +[HELP52] +Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~-Taste, um die Spielerfigur von hinten zu sehen. + +[HELP53] +Benutze die ~h~~k~~PED_CYCLE_WEAPON_LEFT~~w~-Taste und die ~h~~k~~PED_CYCLE_WEAPON_RIGHT~~w~-Taste, um zwischen deinen Waffen zu wechseln. + +[HELP46] +Es gibt acht verschiedene Waffentypen. + +[HELP47] +Du kannst von jedem Waffentyp immer nur eine bei dir tragen - also einen Typ Pistole, einen Typ Schrotflinte, usw. + +[HELP54] +~w~Preis: $~1~ ~r~Deine augenblickliche Waffe wird ersetzt, wenn du diese kaufst. + +[HELP2A2] +Drücke die ~h~~k~~PED_SPRINT~~w~-Taste, um zu ~h~sprinten. + +[HLPSN_A] +Das Prãzisionsgewehr ermöglicht dir, an dein Ziel heranzuzoomen und auf größere Distanz mit hoher Genauigkeit zu schießen. + +[HLPSN_B] +Halte die~h~ ~k~~PED_LOCK_TARGET~~w~-Taste gedrückt, um mit dem Prãzisionsgewehr zu ~h~zielen~w~. + +[HLPSN_C] +Halte die~h~ ~k~~PED_LOCK_TARGET~~w~-Taste gedrückt, um mit dem Prãzisionsgewehr zu ~h~zielen~w~. + +[HLPSN_D] +Drücke die ~h~~k~~PED_SNIPER_ZOOM_IN~~w~-Taste, um ~h~an das Ziel heranzuzoomen ~w~und die~h~ ~k~~PED_SNIPER_ZOOM_OUT~~w~,um ~h~herauszuzoomen~w~. + +[HLPSN_E] +Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Prãzisionsgewehr ~h~abzufeuern~w~. + +[HLPSN_F] +Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Prãzisionsgewehr ~h~abzufeuern~w~. + +[HLPSN_G] +Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Prãzisionsgewehr ~h~abzufeuern~w~. + +[PLANE_H] +Benutze die ~h~~k~~VEHICLE_ACCELERATE~~w~-Taste, um zu beschleunigen. Links bzw. Rechts für Richtungswechsel. + +[PLANE_4] { reVC update } +{Benutze die ~h~~k~~VEHICLE_ACCELERATE~~w~-Taste, um zu beschleunigen. Links bzw. Rechts für Richtungswechsel.} +Benutze den rechten Analog-Stick, um zu beschleunigen. Ziehe den linken Analog-Stick, um zu steigen oder drücke ihn nach vorn, um zu sinken. Links bzw. Rechts für Richtungswechsel. + +[HELP55] +Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um den Küchenchef anzugreifen. + +[STPR_8] +Pole Position Club + +[STPR_9] +3321 Vice Point + +[STPR_10] +Links View Apartment + +[STPR_11] +El Swanko Casa + +[STPR_12] +1102 Washington Street + +[STPR_13] +Ocean Heights Apartment + +[STPR_14] +Skumole Shack + +[STPR_15] +Hyman Condo + +[RCCANX] +~r~Flugzeug-Mission abgebrochen. + +[CLT_HL2] +Wenn du neue Kleider aufnimmst, werden dadurch Fahndungslevel von einem bis zwei Sternen annulliert. + +[CRED009] +MISSION DESIGN + +[CRED359] +LEE JOHNSON + +[CRED360] +HENDRIK LESSER + +[CRED361] +PASQUALE STACCHIOTTI + +[CRED362] +ENRIQUE FERNANDEZ + +[CRED363] +PAUL BYERS + +[CRED364] +MIKE EMENY + +[CRED365] +ROB DUNKIN + +[CRED366] +CHARLIE KINLOCH + +[CRED367] +KEVIN HOBSON + +[CRED368] +JIM CREE + +[MOB_66A] +Tommy, Tommy, Tommy, wieso bist du wieder zurückgekommen? + +[MOB_66B] +Ich hab dir doch gesagt, wir wollen dich hier nicht mehr sehen. + +[MOB_67A] +Tommy, ich glaube, du solltest dich hier nicht mehr blicken lassen, hörst du? + +[MOB_67B] +Die Haitianer sind nicht sehr gut auf dich zu sprechen. + +[MOB_18A] +Tommy, hier Paul. Wie geht's, Alter? Hey, ich dachte mir, das musst du hören... + +[MOB_18B] +Echt der Hammer. Du glaubst nicht, was mir für 'ne Puppe über den Weg gelaufen ist. + +[MOB_18C] +'ne Bordsteinschwalbe, oder sowas. Unten in Little Havana. + +[MOB_18D] +Sagt, sie heißt Mercedes oder so ãhnlich. + +[MOB_18E] +Wahnsinn, Alter. Die Puppe musst du dir geben. + +[MOB_18F] +Da würde 'nen Toter Hormonkoller kriegen. Sie sagt, ich wãr der beste, den sie je hatte. + +[MOB_18G] +Halt die Augen nach ihr offen. Bis dann. + +[MOB_72A] +Tommy, ich bin's, Lance. Du hãltst jetzt mal den Rand, Tommy, ich hab nãmlich keine Zeit für Geschwãtz. + +[MOB_72B] +Interessiert mich auch nicht, was du zu sagen hast. Warum auch? Ich bin dir doch sowieso scheißegal, stimmt's? + +[MOB_72C] +Du solltest dich mehr um mich kümmern. Mir einen fairen Anteil geben. Weißt du... + +[MOB_72D] +Tommy... hör mal, Mann, es tut mir leid. Nur... + +[MOB_72E] +ich werd schon mein Leben lang immer nur von oben herab behandelt, wie ein kleines Kind. + +[MOB_72F] +Mein Bruder hat das auch immer gemacht. Bitte, mein Alter, mach du das nicht. + +[MOB_72G] +Ich muss auflegen. + +[MOB_63A] +Tommy, hier Earnest. Earnest Kelly. + +[MOB_63B] +Wie geht's? + +[MOB_63C] +Ganz gut. Werd zum Laufen 'nen Stock brauchen, müsste aber bald wieder arbeiten können. + +[MOB_63D] +Gut. + +[MOB_63E] +Ich hab das mit Lance gehört. Was für ein Schwein, hã? + +[MOB_63F] +Ja. + +[MOB_63G] +Trau nie einem Mann, der im Pyjama auf der Straße herumlãuft. Gut, dass du ihn erledigt hast. Ich hoffe, es war nicht kurz und schmerzlos. + +[MOB_63H] +Eher nicht. Ich hãtte nur nicht gedacht, dass er so einer ist... + +[MOB_63I] +Tommy, für einen wildgewordenen Irren bist du ziemlich naiv. Ich bin bald wieder an der Arbeit, dann bring ich dir mal ein paar Sachen übers Leben bei, ok? + +[MOB_63J] +Lass dir Zeit, Earnest. Pass auf dich auf. + +[MOB_16A] +Tommy, hier Paul. Wie geht's, mein Freund? + +[MOB_16B] +Was willst du, Paul? Ich brauch keine getürkten Designer-Klamotten. + +[MOB_16C] +Sehr witzig. Du weißt, dass ich mit getürkter Ware nichts am Hut habe. Wollte nur hören, ob ich nicht 'ne Rolle in einem von deinen Filmen kriegen könnte. + +[MOB_16D] +In England habe ich damals viel einschlãgiges Zeug gedreht. Ich hab mehr zu bieten als du, mein Alter. + +[MOB_16E] +Paul, danke für das Angebot. Ich komm auf dich zurück. + +[MOB_16F] +Lass mich nicht hãngen. Denk dran, was ich alles für dich getan habe. + +[MOB_16G] +Das versuch ich ja grade zu vergessen. + +[MOB_17A] +Tommy Vercetti. Wie geht's, großer Meister? Man hört so einiges über dich. Bist jetzt 'ne große Nummer in der Stadt, hã? + +[MOB_17B] +Paul, du bist betrunken. + +[MOB_17C] +Nein, du Trottel, ich bin nicht betrunken. Hab mir nur ein paar Ladungen Stoff gegeben, war seit ein paar Tagen nicht im Bett. + +[MOB_17D] +Und du brauchst mich nicht dumm anzureden. Ich bin nicht irgendwer. Wer hat dir denn in dieser Stadt den Weg geebnet? Ich! + +[MOB_17F] +Tatsãchlich? + +[MOB_17G] +Komm mir nicht so! Ich hab dich mit den ganzen Leuten bekanntgemacht. Hab dir gezeigt, wie der Hase lãuft, hab alles mögliche für dich getan, und so dankst du es mir?! + +[MOB_17H] +Du ignorierst mich. Du gibst mir keine Chance, mitzumischen, nach allem, was ich für dich getan habe! Hãltst du mich für einen Schwachkopf? + +[MOB_17I] +Paul, reg dich ab. Ich hatte viel zu tun. Sei kein Idiot. + +[MOB_17J] +Ich bin kein Idiot. Das haben sie schon im Jugendknast gesagt. Wenn du Ãrger haben willst, Freundchen, den kannst du haben! + +[MOB_17K] +Tommy, bitte! Du warst meine große Hoffnung. Bitte, mach dich nicht lustig über mich! + +[MOB_17L] +Paul, schlaf mal 'ne Runde. Im Ernst. + +[MOB_73A] +Tommy, hier Steve. + +[MOB_73B] +Hey, Steve. + +[MOB_73C] +Hey, aber wie! Du bist ein Genie! Ich bin ein Genie! Sie lieben uns alle. Wir brechen alle Rekorde, mein Alter. + +[MOB_73D] +Uns winken ganz große Filmpreise. Jetzt kann ich endlich meinen alten Herrn ins Heim stecken und ihm sagen, er soll die Klappe halten. + +[MOB_73E] +Ãh, das ist cool, Steve. + +[MOB_73F] +Cool? Mann, das ist heiß! Heiß! H.E.I.ß! Er hat nie an mich geglaubt. Hat immer gedacht, ich wãre kein Künstler, und jetzt hab ich's geschafft! + +[MOB_73G] +Ich bin der größte Porno-Regisseur aller Zeiten, mein Freund. Wollte dir nur sagen, es ist mir eine Freude, dich kennengelernt zu haben. + +[MOB_73H] +Danke, Steve. + +[MOB_73I] +Ich liebe dich, Baby. Bleib bloß genau so wie du bist, ok? + +[MOB_73J] +Werd's mir merken. Ciao, Steve. + +[BOLLOX] +Drücke die ~o~R1~w~-Taste, um eine Bombe abzuwerfen. Drücke die ~t~"~w~-Taste zum Abbrechen. + +[BRID_OP] +Sturmwarnung vorüber. Alle Brücken zum Festland sind wieder geöffnet. + +[BRID_CL] +Sturmwarnung: Alle Brücken zum Festland sind gesperrt. + +[LG_38] +Ziel + +[ASSET_C] +POLE POSITION ERWORBEN! + +[ASSET_D] +~g~Der Pole Position Club sorgt nun für ein Einkommen von bis zu $~1~ pro Tag. Hol dir dein Geld regelmãssig! + +[ST_WHEE] +Lãngste 'Wheelie' Zeit (sekunden) + +[ST_STOP] +Lãngste 'Stoppie' Zeit (sekunden) + +[ST_2WHE] +Lãngste 2 Rad Zeit (sekunden) + +[ST_WHED] +Lãngste 'Wheelie' Distanz (m) + +[ST_STOD] +Lãngste 'Stoppie' Distanz (m) + +[ST_2WHD] +Lãngste 2 Rad Distanz (m) + +[OUTFT11] +Trainer + +[OUTFT12] +Frankie + +[RELOAD] +~g~Du hast die schnell Nachladefãhigkeit gewonnen! + +[APACHE] +Hunter zur Heli Landeplattform am Ocean Beach geliefert. + +[CRED369] +JOHN MCCARDLE + +[CRED370] +DAVID MURDOCH + +[CRED371] +CHRIS BROWN + +[CRED372] +PAUL GREEN + +[CRED373] +KYLE MILNE + +[CUNTY] +Neue Kleider wurden zum Vercetti Estate geliefert! + +[GOODBOY] +$50 'Guter Bürger' Bonus! + +[NEWCONT] +Neuer Kontaktpunkt am Jachthafen am Ocean Beach!! + +[FIRELVL] +Feuerwehr-Mission Level ~1~ + +[HELP56] +Drücke die ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~-Taste, um den Blickwinkel zu ãndern. + +[HELP57] +Drücke die ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~-Taste, um den Blickwinkel zu ãndern. + +[HELP58] +Beim Zielen kann durch Drücken der ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~-Taste zwischen Zielen hin- und her gewechselt werden. + +[HELP59] +Beim Zielen kann durch Drücken der ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~-Taste zwischen Zielen hin- und her gewechselt werden. + +[HELP60] +Wenn du wãhrend eines Autodiebstahls die ~h~~k~~PED_SPRINT~ ~w~-Taste drückst, steigst du nicht in das Fahrzeug ein. + +[HELP61] +Du hast jetzt unbegrenzt Munition und doppelte Health für alle Fahrzeuge. + +[CRED374] +KEVIN YUN + +[CRED375] +ERICK COBBS + +[CRED376] +RANDY BLAKE + +[CRED377] +BRANDON LIM + +[CRED378] +BRANDON FENOL + +[CRED379] +MICHAEL MANOLE + +[CRED380] +ALETHEIA SIMONSON + +[CRED381] +JOHN JANSEN + +[FEC_LB1] +Schau + +[FEC_LB2] +nach hinten + +[FEC_LB3] +Nach hinten schauen + +[FEC_R3] +(R3-Taste) + +[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 + +[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~ + +[FEC_WAR] +Achtung! + +[FEC_OKK] +OK + +[FEC_DLF] +Löschen fehlgeschlagen. + +[FEC_SVU] +Speichern fehlgeschlagen. + +[FEC_LUN] +Laden fehlgeschlagen. Datei beschãdigt. Bitte löschen. + +[FEC_PAD] +Gamepad + +[FEC_JOY] +Joystick + +[FES_CSA] +Wãhlen Sie eine Skin aus der Liste aus: + +[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_DSN] +Standard-Player Skin.bmp + +[FET_RSO] +ORIGINAL-EINSTELLG. WIEDERHERGESTELLT + +[FET_RSC] +HARDWARE NICHT VERFÜGBAR - ORIGINAL-EINSTELLG. WIEDERHERGESTELLT + +[FEA_3DH] +AUDIO HARDWARE + +[FEA_SPK] +BOXEN KONFIGURATION + +[FEM_LOD] +DISTANZ-DARSTELLG. + +[FEM_VSC] +FRAME SYNC + +[FEM_FRM] +FRAME LIMITER + +[FEM_MM] +HAUPTMENÜ + +[FED_RES] +BILDSCHIRMAUFLSG. + +[FET_CTL] +CONTROLLER-SETUP + +[FET_OPT] +OPTIONEN + +[FEC_MSH] +MAUSEMPFINDLICHKEIT + +[FEC_IVV] +MAUS VERTIKAL INVERTIEREN + +[FET_MTI] +MAUS STEURUNGSKONFIG. + +[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 + +[FEC_SPC] +LEERT. + +[WIN_TTL] +GTA VC + +[WIN_95] +GTA VC lãuft nicht unter Windows 95 + +[WIN_DX] +GTA VC benötigt mind. DirectX Version 8.1 + +[FET_EIG] +KANN DIESER AKTION KEINE STEUERUNG ZUWEISEN + +[FET_DAM] +DYNAMISCHE AKUSTIK + +[FEQ_SRE] +Wirklich beenden? Alle Daten seit dem letzten Speichern werden verlorengehen. Weiter? + +[FEQ_SRW] +Spiel wirklich beenden? + +[FET_QG] +SPIEL BEENDEN + +[FEN_STA] +SPIEL STARTEN + +[REPLAY] +WIEDERHOLUNG + +[FET_PAU] +PAUSENMENÜ + +[FEC_ANS] +Aktion + +[CVT_MSG] +Texturen werden in optimales Format für Ihre Grafikkarte konvertiert + +[FEC_SFT] +UMSCHALT + +[CVT_ERR] +Kein Platz mehr auf der Festplatte. Bitte schaffen Sie Speicherplatz, bevor Sie fortfahren. ESC zum Abbrechen. + +[FEH_VMP] +KARTE ANSEHEN + +[FES_DEE] +Löschen fehlgeschlagen! Bitte noch einmal versuchen. + +[FES_CMP] +Speichern fehlgeschlagen! Bitte noch einmal versuchen. + +[FESZ_WR] +Spiel wird gespeichert. Bitte warten... + +[FELD_WR] +Spiel wird geladen. Bitte warten... + +[FEDL_WR] +Gespeichertes Spiel wird gelöscht. Bitte warten... + +[PCRESRT] +Neues Spiel wird gestartet. Bitte warten... + +[FET_STI] +Standard-Steuerung + +[FET_CTI] +Classic-Steuerung + +[FET_PS] +SPIELER-SKIN SETUP + +[FEH_NA] +OPTION NICHT VERFÜGBAR + +[FEH_MPH] +MAUS, CURSOR ZUM BEWEGEN - BILD AUFW., BILD ABW., MAUSRAD ZUM ZOOMEN, L - LEGENDE + +[FEA_MP3] +MP3 PLAYER + +[NO_PCCD] +Bitte legen Sie die GTA Vice City Disk ein, oder drücken Sie ESC zum Abbrechen + +[FEH_SSA] +CURSOR ZUM BEWEGEN - S UM ZU SPEICHERN + +[FES_CMI] +LETZTE ERFÜLLTE MISSION + +[FET_STS] +STATISTIKEN GESPEICHERT IN 'STATS.HTML' + 'STATS.TXT' + +[WIN_VDM] +Nicht genug verfügbarer Grafikspeicher für GTA Vice City vorhanden + +[FEC_ERI] +Fehler! Eine oder mehrere Aktionen haben keine Tastenbelegungen. Bitte alle Aktionen belegen. + +[FEC_TFU] +Geschütz + nach hinten neigen + +[FEC_TFD] +Geschütz + nach vorne neigen + +[FET_RIG] +WÃHLEN SIE EINE NEUE TASTENBELEGUNG FÜR DIESE AKTION + +[FEA_NM3] +KEINE MP3-DATEIEN GEFUNDEN + +[FEA_MPB] +MP3 LAUTSTÃRKE-BOOST + +[FEA_MUS] +LAUTSTÃRKE MUSIK + +[FEA_SFX] +LAUTSTÃRKE SFX + +[FEA_ADP] +AUTOMATISCHE HARDWARE ERKENNUNG + +{=================================== MISSION TABLE AMBULAE ===================================} + +[A_COMP1:AMBULAE] +Krankenwagen-Missionen abgeschlossen: $ ~1~ + +[ATUTOR2:AMBULAE] +~g~Fahre die Patienten VORSICHTIG in die Klinik. Jede Erschütterung verringert ihre Überlebenschancen. + +[A_FULL:AMBULAE] +~r~Krankenwagen voll!! + +[A_FAIL2:AMBULAE] +~r~Deine Bummelei war tödlich für den Patienten! + +[A_FAIL3:AMBULAE] +~r~Der Patient ist tot!! + +[A_PASS:AMBULAE] +Gerettet! + +[A_COMP2:AMBULAE] +Du ermüdest nie! + +[A_CANC:AMBULAE] +~r~Krankenwagen-Mission abgebrochen! + +[A_COMP3:AMBULAE] +Krankenwagen-Missionen abgeschlossen! Du wirst beim Rennen nie ermüden! + +[ALEVEL:AMBULAE] +Krankenwagen-Mission Level ~1~ + +[A_FAIL1:AMBULAE] +Krankenwagen-Mission beendet. + +[A_SAVES:AMBULAE] +GERETTETE MENSCHEN: ~1~ + +{=================================== MISSION TABLE ASSIN1 ===================================} + +[ASM1_5:ASSIN1] +~r~Er hat seine Lieferungen abgeschlossen! + +[ASM1_6:ASSIN1] +Weitere Lieferungen: + +[ASM1_7:ASSIN1] +~g~Carl Pearson, Pizza-Lieferant. Schalte ihn aus, bevor er seine Lieferungen abschließt. + +[ASM1_A:ASSIN1] +Mr. Teal, Ihre Hilfe bei der Beseitigung der Landeier war ãußerst wertvoll. Ich habe noch mehr Arbeit, die eine eher 'zupackende' Art verlangt. + +[ASM1_D:ASSIN1] +Mr. Teal, Ihre Hilfe bei der Beseitigung der Landeier war ãußerst wertvoll. + +{=================================== MISSION TABLE ASSIN2 ===================================} + +[ASM2_1:ASSIN2] +~g~Mrs. Dawson verlãsst bald den Juwelier in Vice Point. Schalte sie aus. Es muss wie ein Autounfall aussehen. + +[ASM2_3:ASSIN2] +~g~Das Fahrzeug wird explodieren! Hau ab! + +[ASM2_4:ASSIN2] +~r~Du hast ihr Auto beschãdigt, obwohl sie nicht drin saß! Jetzt wird sie nicht einsteigen! + +[ASM2_5:ASSIN2] +~r~Sie ist entwischt! + +[ASM2_6:ASSIN2] +~r~Du warst zu nah am Unfallort! + +[ASM2_7:ASSIN2] +~g~Keine Waffen! Es soll wie ein Unfall aussehen! Drãnge sie stattdessen von der Fahrbahn! + +[ASM2_8:ASSIN2] +~g~Das ganze muss wie ein Unfall aussehen. Benutze keine Waffen. + +[ASM2_9:ASSIN2] +Du brauchst einen fahrbaren Untersatz für diesen Job. + +[ASM2_10:ASSIN2] +~g~Wenn ihr Auto in Flammen aufgeht, entferne dich so weit wie möglich von der Unfallstelle. + +[ASM2_11:ASSIN2] +Hilfe! + +[ASM2_12:ASSIN2] +Hilf mir doch jemand! + +[ASM2_13:ASSIN2] +Oh Gott! + +[ASM2_A:ASSIN2] +Mein Kompliment für die gute Arbeit, Mr. Teal. Mein Kunde war sehr zufrieden. + +[ASM2_2:ASSIN2] +Health: + +{=================================== MISSION TABLE ASSIN3 ===================================} + +[ASM3_11:ASSIN3] +ZEIT: + +[ASM3_C:ASSIN3] +Eine europãische Gang plant einen Überfall auf eine Bank in Vice City. Meinen Arbeitgebern wãre sehr daran gelegen, dass das nicht passiert. + +[ASM3_D:ASSIN3] +Alle Mitglieder der Gang haben eine Tarnung, solange sie sich hier in Vice City aufhalten. Manche haben Jobs, andere geben sich als Touristen aus. + +[ASM3_E:ASSIN3] +Infos über alle Zielpersonen und ihre wahrscheinlichen Aufenthaltsorte kleben unter dem Telefon. + +[ASM3_14:ASSIN3] +~g~Dick Tanner hãlt sich bei DBP Security am Ocean Drive auf. + +[ASM3_15:ASSIN3] +~g~Marc Hammond und Franco Carter halten sich in der Nãhe des Juwelierladens in Vice Point auf. + +[ASM3_16:ASSIN3] +~g~Nick Kong hãlt sich in der Nãhe von Washington Beach auf. + +[ASM3_18:ASSIN3] +~g~Geh nicht zu nahe an deine Zielperson heran, sonst entdeckt sie dich und du musst hinter ihr herjagen. + +[ASM3_19:ASSIN3] +~g~Er hat dich gesehen! Schalte ihn aus! + +[ASM3_20:ASSIN3] +~g~Sie haben dich gesehen! Schalte alle beide aus! + +[ASM3_21:ASSIN3] +~r~Du hast nicht alle Mitglieder der Gang rechtzeitig erledigt! + +[ASM3_22:ASSIN3] +~g~Geh nicht zu nahe an deine Zielpersonen heran, sonst entdecken sie dich und versuchen zu fliehen. + +[ASM3_12:ASSIN3] +~g~In der Nãhe sind einige Waffen für dich deponiert worden, falls du sie brauchen solltest. Du hast ~h~9 MINUTEN~g~, um alle Gang-Mitglieder auszuschalten. + +[ASM3_13:ASSIN3] +~g~Mike Griffin arbeitet an einer Plakatwand in Washington. + +[ASM3_17:ASSIN3] +~g~Charlie Dilson fãhrt mit dem Motorrad in Washington herum. + +{=================================== MISSION TABLE ASSIN4 ===================================} + +[ASM4_10:ASSIN4] +~g~Du warst anscheinend nicht der einzige, der hinter dem Aktenkoffer her war. Bring ihn schnell ins Ammu-Nation! + +[ASM4_12:ASSIN4] +Distanz: + +[ASM4_15:ASSIN4] +~g~Nimm das Prãzisionsgewehr zu deiner Rechten. + +[ASM4_16:ASSIN4] +~g~Behalte die Frau auf der Empore im Auge. Sie wird die Rolltreppe hinuntergehen und die Zielperson nach der Uhrzeit fragen. + +[ASM4_17:ASSIN4] +~g~Schalte die Zielperson aus, NACHDEM die Frau mit ihr gesprochen hat. Aber erledige nicht die Frau. + +[ASM4_18:ASSIN4] +~g~Wenn die Zielperson ausgeschaltet ist, nimm ihren Aktenkoffer und bringe ihn zum Ammu-Nation in Downtown. + +[ASM4_19:ASSIN4] +~g~Halte Abstand von der Zielperson. Die Entfernungs-Anzeige rechts oben am Bildschirm zeigt an, wie nahe du an der Zielperson bist. + +[ASM4_20:ASSIN4] +~g~Lass den Anzeigebalken nicht an den Anschlag geraten, sonst sieht dich die Zielperson. + +[ASM4_21:ASSIN4] +~g~Schnapp dir den Aktenkoffer! + +[ASM4_22:ASSIN4] +~g~Bring den Aktenkoffer zum Ammu-Nation in Downtown. + +[ASM4_23:ASSIN4] +~g~Er hat dich entdeckt und versucht zu fliehen. Erledige ihn und schnapp dir den Aktenkoffer! + +[ASM4_25:ASSIN4] +~r~Du hast die Frau ausgeschaltet, du Idiot! + +[ASM4_26:ASSIN4] +~r~Die Zielperson hat das Flugzeug bestiegen! + +[ASM4_27:ASSIN4] +~r~Die Zielperson hat dich gesehen! Du hãttest Abstand halten sollen! + +[ASM4_28:ASSIN4] +~r~Die Zielperson hat dich gesehen! Er hat gehört, wie du geschossen hast! + +[ASM4_29:ASSIN4] +~r~Schalte ihn erst aus, wenn er mit der Frau gesprochen hat! + +[ASM4_A:ASSIN4] +Es wird Zeit für dickere Brocken, Mr. Teal. Unter dem Busch zu Ihrer Rechten ist ein Gewehr. + +[ASM4_B:ASSIN4] +Behalten Sie die Frau auf der Empore über dem Check-In im Auge. Sie wird durch die Menge gehen und jemanden nach der Uhrzeit fragen. + +[ASM4_C:ASSIN4] +Sie müssen die betreffende Person ausschalten, ihren Aktenkoffer nehmen und ihn zu der Adresse, die unter dem Telefon klebt, bringen. + +{=================================== MISSION TABLE ASSIN5 ===================================} + +[ASM5_A:ASSIN5] +Auf dem Dach der Cherry Popper-Eiscremefabrik findet eine Übergabe von wertvoller Ware statt. + +[ASM5_B:ASSIN5] +Erledigen Sie alle Beteiligten, klauen Sie die Ware und bringen Sie sie zum Heliport am Flughafen. + +[ASM5_C:ASSIN5] +Links von Ihnen ist ein Tor, das zur Rückseite der Fabrik führt. + +[ASM5_1:ASSIN5] +~g~Geh auf das Gelãnde hinter der Cherry Popper-Eiscremefabrik und dann auf das Dach, wo der Deal abgewickelt wird. + +[ASM5_2:ASSIN5] +~g~Schnapp dir die Ware und bring sie zum Heliport am Flughafen. + +[ASM5_3:ASSIN5] +~g~Bring die Ware zum Heliport am Flughafen! + +{=================================== MISSION TABLE BANKJ1 ===================================} + +[WANTED1:BANKJ1] +~g~Schüttle die Cops ab. Verringere deinen Fahndungslevel. + +[BJM1_A:BANKJ1] +Tommy! Hey, Tommy, sieh mal, das ist super! Ich hab eine Minibar einbauen lassen! + +[BJM1_B:BANKJ1] +Wir haben unten eine ausgewachsene Bar, Ken. + +[BJM1_C:BANKJ1] +Ja, ja, wie auch immer. Tja, ich hab die Tafel besorgt, die du haben wolltest. + +[BJM1_D:BANKJ1] +Ah, das ist der Lohn des Jurastudiums: Die Fãhigkeit, Anweisungen auszuführen. + +[BJM1_E:BANKJ1] +Also, ich brauche einen Safeknacker. + +[BJM1_F:BANKJ1] +Oh, ok, mal nachdenken...Safeknacker, Safeknacker...Ich hab's! Du wirst begeistert sein! + +[BJM1_G:BANKJ1] +Aah, nicht dieser Schwachkopf. Der sitzt doch. + +[BJM1_H:BANKJ1] +Wo sitzt er denn? + +[BJM1_I:BANKJ1] +In einer Zelle in einem Polizeirevier. Er wartet auf seine Verlegung. + +[BJM1_J:BANKJ1] +Ich glaube fast, er kommt auf Bewãhrung raus... + +[BJM1_1:BANKJ1] +~g~Befreie Cam Jones aus der Haft! + +[BJM1_3:BANKJ1] +~g~In der Umkleide des Reviers findest du etwas Nützliches. + +[BJM1_21:BANKJ1] +~g~Die Key Card zu den Zellen findet sich im Obergeschoss des Reviers. + +[BNK1_7:BANKJ1] +Cam Jones? + +[BNK1_8:BANKJ1] +Ich hol dich hier raus. + +[BNK1_10:BANKJ1] +Ja, der bin ich... + +[BNK1_11:BANKJ1] +Ganz wie du meinst! + +[BNK1_13:BANKJ1] +Ich ziehe einen Job durch, und du bist mein Safeknacker. + +[BNK1_14:BANKJ1] +Besser als in 'ner Zelle zu verrotten! + +[BJM1_22:BANKJ1] +~g~Bring Cam nach Hause! + +[BJM1_23:BANKJ1] +~g~Du brauchst zunãchst die Magnetkarte für die Tür! + +[BNK1_12:BANKJ1] +Hãng die Bullen ab und bring mich nach Hause! + +[BJM1_20:BANKJ1] +Die Waffe weg oder es passiert was! + +[BJM1_5:BANKJ1] +Zutritt ab hier nur für befugtes Personal. + +[BJM1_2:BANKJ1] +~r~Du solltest Cam die Freiheit bringen, nicht den Tod! + +[BJM1_4:BANKJ1] +Er ist bewaffnet! Erledigt ihn! + +{=================================== MISSION TABLE BANKJ2 ===================================} + +[BJM2_A:BANKJ2] +Wir brauchen einen Überfall-Experten. Kennt ihr einen? + +[BJM2_B:BANKJ2] +Hey, Tommy, Tommy, Tommy, das Zeug bringt dich nach vorn, Mann. + +[BJM2_C:BANKJ2] +WoooOOOooo! + +[BJM2_D:BANKJ2] +Ich könnte dein Experte sein! Überfall! Überfall! + +[BJM2_E:BANKJ2] +Du bist kein Experte, du bist ein Idiot. + +[BJM2_F:BANKJ2] +Mach dir 'nen Drink und halt die Klappe. + +[BJM2_G:BANKJ2] +Hey, aus dem Weg! + +[BJM2_H:BANKJ2] +Cam, was meinst du? + +[BJM2_I:BANKJ2] +Tja, der beste Schütze in der Stadt ist ein Kerl namens Cassidy. + +[BJM2_J:BANKJ2] +Ach ja? + +[BJM2_K:BANKJ2] +Ja. Soldat, oder wenigstens hãlt er sich dafür. + +[BJM2_L:BANKJ2] +Ich bezweifle, dass er je bei der Army war, aber er kann mit der Knarre umgehen. + +[BJM2_M:BANKJ2] +Wahrscheinlich ist er in der Schießanlage. + +[BJM2_2A:BANKJ2] +Bist du Phil Cassidy? + +[BJM2_2B:BANKJ2] +Wieso? + +[BJM2_2C:BANKJ2] +Ich suche einen, der mit der Kanone umgehen kann. Was ich hier so sehe, überzeugt mich nicht. + +[BJM2_2D:BANKJ2] +Jungchen, ich schieße dir auf 25 Meter eine Fliege vom Kopf. + +[BJM2_2E:BANKJ2] +Ach wirklich? + +[BJM2_2F:BANKJ2] +Ja. Hab ich bei der Army gelernt. + +[BJM2_2G:BANKJ2] +Ist Fliegen-Schießen so beliebt in der Army? Gut, dass ich keine Steuern zahle. + +[BJM2_2H:BANKJ2] +Sollte das witzig sein, Jungchen? + +[BJM2_2I:BANKJ2] +Ha ha ha ha ha! + +[BJM2_2J:BANKJ2] +Lass uns schießen. + +[BJM2_1:BANKJ2] +~g~Begib dich nach Downtown ins Ammu-Nation und sprich mit Phil Cassidy. + +[BJM2_3:BANKJ2] +TREFFERQUOTE: ~1~% + +[BJM2_4:BANKJ2] +PUNKTE RUNDE EINS: ~1~ + +[BJM2_6:BANKJ2] +PUNKTE RUNDE ZWEI: ~1~ + +[BJM2_7:BANKJ2] +GESAMTPUNKTZAHL FÜR DAS SCHIESSEN: ~1~ + +[BJM2_9:BANKJ2] +~g~Begib dich zum Startpunkt für Runde Zwei. + +[BJM2_11:BANKJ2] +~r~Phil ist erledigt! + +[BJM2_12:BANKJ2] +~r~Einer der Schützen ist erledigt! + +[BJM2_14:BANKJ2] +~g~Begib dich zum nãchsten Areal! + +[BJM2_15:BANKJ2] +PUNKTE: + +[BJM2_17:BANKJ2] +~g~Sprich mit Phil. + +[BJM2_18:BANKJ2] +ZU SCHLAGEN: + +[BJM2_19:BANKJ2] +~g~Triff innerhalb des Zeitlimits so viele Ziele wie du kannst! + +[BJM2_22:BANKJ2] +~r~Du hast den Schießstand verlassen! + +[BJM2_23:BANKJ2] +~g~Wenn du den Schießstand wãhrend des Wettbewerbs verlãsst, ist die Mission gescheitert. + +[BJM2_24:BANKJ2] +~g~Das nahegelegenste Ziel bringt 1 Punkt. + +[BJM2_25:BANKJ2] +~g~Das mittlere Ziel bringt 2 Punkte. + +[BJM2_27:BANKJ2] +~g~Alle Ziele dieser Runde bringen 1 Punkt. + +[BNK2_2:BANKJ2] +ZIELEN 3-2-1 FEUER! + +[BNK2_3:BANKJ2] +AREAL KLAR! + +[BNK2_4:BANKJ2] +Huuuiii! + +[BNK2_5:BANKJ2] +Der trãfe nicht mal ein Scheunentor. + +[BNK2_7:BANKJ2] +Also, was ist jetzt, hilfst du mir bei dem Job? + +[BNK2_8:BANKJ2] +Jungchen, so wie du schießt, würde ich dich sogar heiraten. + +[BNK2_9A:BANKJ2] +Junge, deine Sprüche und deine Hirngespinste kannst du dir sonst wohin stecken. Du bist ein lausiger Schütze. + +[BNK2_9B:BANKJ2] +Du bist ein lausiger Schütze. + +[BJM2_28:BANKJ2] +PUNKTE RUNDE DREI: ~1~ + +[BJM2_20:BANKJ2] +~g~Geht dir die ~w~Zeit ~g~oder die ~w~Munition ~g~aus, ist die Runde beendet! + +[BJM2_26:BANKJ2] +~g~Das am weitesten entfernte Ziel bringt 3 Punkte. + +[BNK2_1:BANKJ2] +SCHARFE MUNITION + +[RANGE_1:BANKJ2] +PUNKTZAHL SCHIESS-RUNDE:~1~ + +[BJM2_2:BANKJ2] +~g~Um die Runde zu beenden, drücke die ~h~~k~~PED_JUMPING~. + +[BJM2_N:BANKJ2] +Nur die Ruhe. + +{=================================== MISSION TABLE BANKJ3 ===================================} + +[BJM3_A:BANKJ3] +Langsam fügt sich alles sehr schön zusammen hier. + +[BJM3_B:BANKJ3] +Was ist der Plan, Tommy? Was geht ab, Amigo? + +[BJM3_C:BANKJ3] +Der Plan ist, dass du dich wie ein Vollidiot benimmst. Wir brauchen einen Fahrer. + +[BJM3_D:BANKJ3] +Tommy, ich mach's. Ich kann fahren. + +[BJM3_E:BANKJ3] +Nimm Hilary, Boss, nicht diesen Labersack von einem Rechtverdreher. + +[BJM3_F:BANKJ3] +Hilary ist der beste. So schnell wie den hast noch keinen fahren sehen. Ich rufe ihn mal an. + +[BJM3_G:BANKJ3] +Hey, Hil, hier Phil. Wie lãuft's? Nein, sag nichts. Dazu haben wir spãter Zeit. Tust du mir einen Gefallen? + +[BJM3_H:BANKJ3] +Ich hab hier einen Typ aus dem Norden. Nein, ich glaub, er war nicht beim Militãr. Aber er braucht einen Fahrer. + +[BJM3_I:BANKJ3] +Für einen Job. Ok, verstehe. + +[BJM3_J:BANKJ3] +Was hat er gesagt? + +[BJM3_K:BANKJ3] +Er macht's. Kein Problem. Na ja, ein kleines vielleicht: Er leidet unter Verlustãngsten. + +[BJM3_L:BANKJ3] +Er arbeitet anscheinend nicht für Leute, die ihn nicht schlagen können. Hat was mit seiner Mutter zu tun. + +[BJM3_M:BANKJ3] +Jedenfalls will er erst ein Rennen gegen dich fahren. Er wartet draußen auf dich. + +[BJM3_2A:BANKJ3] +Bist du Tommy? Klar bist du Tommy, ich meine, + +[BJM3_2B:BANKJ3] +wieso sollte sonst einer mit mir reden wollen? + +[BJM3_2C:BANKJ3] +Ok. Das ganze lãuft so ab: + +[BJM3_2D:BANKJ3] +Ich fahre für dich, WENN und NUR WENN du selbst anstãndig fãhrst. + +[BJM3_2E:BANKJ3] +Verlierst du mich, verzeihe ich dir das nie. + +[BJM3_2:BANKJ3] +Hilary ist erledigt! + +[BJM3_4:BANKJ3] +~g~Du brauchst ein Auto, um mitzumachen. + +[BNK3_1:BANKJ3] +Ok, ich fahre für dich. Aber bitte, behandle mich schlecht. + +[BNK3_3A:BANKJ3] +Illegales Straßenrennen bei Vice Point. + +[BNK3_3B:BANKJ3] +An alle Einsatzkrãfte. + +[BNK3_3C:BANKJ3] +Straßenrennen sind verboten und illegal! + +{=================================== MISSION TABLE BANKJ4 ===================================} + +[BNK4_A:BANKJ4] +~w~Ihr seht Gentlemen, das wird leicht verdientes Geld für uns. + +[BNK4_B:BANKJ4] +~w~Ernsthaft, Tommy, du solltest dir überlegen, Anwalt zu werden. + +[BNK4_C:BANKJ4] +~w~Was zum Geier rauchst du eigentlich, Mann? Das ist kein simpler Plan. + +[BNK4_D:BANKJ4] +~w~Ach, wer braucht schon simple Plãne? + +[BNK4_E:BANKJ4] +~w~Der Kommunismus, das war ein simpler Plan. Hat Russland aber nicht viel genützt, hah? + +[BNK4_F:BANKJ4] +~w~Ganz ruhig. Mit einem Team wie diesem ist das alles kein Problem. + +[BNK4_G:BANKJ4] +~w~Cam übernimmt den Safe. Phil? Wir beide kümmern uns um die Sicherheit, und Hilary fãhrt den Fluchtwagen. + +[BNK4_H:BANKJ4] +~w~Ãh, hast du nicht jemanden vergessen? Jemanden, der dir unzãhlige Male geholfen hat in dieser Stadt? Jemanden...? + +[BNK4_I:BANKJ4] +~w~Ken...Ken, richtig. Ken wãscht das Geld für uns und stellt schon mal die Drinks kalt. + +[BNK4_J:BANKJ4] +~w~Ich verstehe nicht, was ich hier soll. + +[BNK4_K:BANKJ4] +~w~Ist doch ganz einfach. Warst du noch nie im Kino? + +[BNK4_L:BANKJ4] +~w~Wir latschen in die Bank rein, fuchteln mit den Knarren rum und gehen stinkreich wieder raus. + +[P_DEAD:BANKJ4] +~r~Phil ist erledigt!! + +[C_DEAD:BANKJ4] +~r~Cam ist erledigt!! + +[H_DEAD:BANKJ4] +~r~Hilary ist erledigt!! + +[P_HIND:BANKJ4] +~r~Du hast Phil verloren! + +[C_HIND:BANKJ4] +~r~Cam wurde abgehãngt! + +[H_HIND:BANKJ4] +~r~Hilary wurde im Stich gelassen! + +[GETCAR:BANKJ4] +Steig in den Fluchtwagen und führe den Plan aus! + +[TRASHED:BANKJ4] +~r~DU HAST DEN FLUCHTWAGEN GESCHROTTET!! + +[BNK4_1:BANKJ4] +Ich fahre. + +[BNK4_2:BANKJ4] +Na prima. Beifahrer. Wenn ich das in der Therapie erzãhle. + +[BNK4_3A:BANKJ4] +Hey, pass auf, wo du hinfãhrst, Tommy! + +[BNK4_3B:BANKJ4] +Tommy, Hilary macht sich so breit! + +[BNK4_3C:BANKJ4] +Stimmt gar nicht! + +[BNK4_3D:BANKJ4] +Doch! + +[BNK4_3E:BANKJ4] +Hey, Klappe, ihr zwei, oder ihr könnt zu Fuß gehen. + +[BNK4_3F:BANKJ4] +Ja, Hilary. + +[BNK4_3I:BANKJ4] +Herrgott, Phil, hör auf, mit diesem Ding rumzufuchteln! + +[BNK4_3J:BANKJ4] +Ja, am Ende geht das noch ins Auge! + +[BNK4_3M:BANKJ4] +Mein Baby! Alles Schrott! + +[BNK4_3O:BANKJ4] +Du hãngst zu sehr an der Illusion der Ewigkeit. + +[BNK4_3P:BANKJ4] Was? -[NEDS4BD:NEDS4] -Danke nochmals für deine Hilfe, Toni! +[BNK4_3Q:BANKJ4] +Du denkst, alles bleibt ewig. -[NEDS4BE:NEDS4] -Scheiße, was soll das? +[BNK4_3R:BANKJ4] +Jugend, geliebte Menschen, Pizza, -[NEDS4BF:NEDS4] -WER SIND SIE? +[BNK4_3S:BANKJ4] +Alles geht mal vorbei, und das musst du akzeptieren. -[NEDS422:NEDS4] -Besorg dir bei Phil Cassidy's Fully Cocked Gun Shop einen Raketenwerfer. +[BNK4_3T:BANKJ4] +Hey, du hast recht. Danke, Cam. -[NEDS4_7:NEDS4] -~w~Du musst verhindern, dass die ~r~Promis~w~ den Radiosender LCFR erreichen! +[BNK4_3U:BANKJ4] +Nichts zu danken. -[NEDS416:NEDS4] -~w~Du musst verhindern, dass die ~r~Promis~w~ den Radiosender LCFR erreichen! +[BNK4_3V:BANKJ4] +Hey, Tommy, wieso halten wir? -[NEDS419:NEDS4] -~w~Schwere Waffen bekommst du in Phil Cassidy's Fully Cocked Gun Shop. +[BNK4_4A:BANKJ4] +~w~Hilary, fahr ein bisschen um den Block. -[NEDS420:NEDS4] -~w~Vater Ned hat einen Raketenwerfer gekauft. Hol ihn bei Phil Cassidy's Fully Cocked Gun Shop ab. +[BNK4_5:BANKJ4] +~w~Ok, Tommy, ok. -[NEDS4_6:NEDS4] -~w~Schwere Waffen bekommst du in Phil Cassidy's Fully Cocked Gun Shop. +[BNK4_6:BANKJ4] +~w~DIES IST EIN ÜBERFALL! -{=================================== MISSION TABLE DONS1 ===================================} +[BNK4_7:BANKJ4] +~w~KEINER BEWEGT SICH! -[MORG_01:DONS1] -2-2-3, 3-2-3, 4-2-3, 5-2-3-... +[BNK4_8:BANKJ4] +~w~ALLE AN DIE WAND! -[MORG_02:DONS1] -Antonio! Wie schön, dich zu sehen! +[BNK4_9:BANKJ4] +Phil, halt die Stellung! -[MORG_03:DONS1] -Was ist los? +[BNK4_10:BANKJ4] +Verstanden! -[MORG_04:DONS1] -Wir geben eine Party, mein lieber Junge. +[BNK4_11:BANKJ4] +Los Cam, der Tresor ist oben... -[MORG_05:DONS1] -Eine Leichenhausparty! +[BK4_12A:BANKJ4] +Verdammt, das ist ein Flange 9000! -[MORG_08:DONS1] -Was soll das sein, verdammt, 'ne Leichenhausparty? +[BK4_12B:BANKJ4] +Könnte Stunden dauern, den zu knacken. -[MORG_09:DONS1] -Das wird heute ein Mordsabend. +[BK4_12C:BANKJ4] +Oder 5 Minuten, wenn du den Manager findest. -[MORG_10:DONS1] -Doch zuerst müssen wir die Gäste abholen. +[BNK4_13:BANKJ4] +Ich seh nach, wo er sich verkrochen hat. -[MORG_11:DONS1] -Los, bevor sich unsere Gäste zu Tode langweilen. +[BK4_14A:BANKJ4] +Phil, alles im grünen Bereich? -[MORG_12:DONS1] -Ungeschickt formuliert! +[BNK4_15:BANKJ4] +Klar. Im dunkelgrünen Bereich. -[MORG_13:DONS1] -Sie sind nämlich schon tot. +[BNK4_16:BANKJ4] +Du da! Mitkommen! -[MORG_14:DONS1] -Unser Ehrengast macht gerade einen kleinen Ausflug in die Pathologie. +[BNK4_17:BANKJ4] +Ok! Ok! Nicht schießen! -[MORG_15:DONS1] -Lassen wir ihn nicht warten. +[BNK4_18:BANKJ4] +ICH SAGTE, KEINER RÜHRT SICH! -[MORG_06:DONS1] -- Die erste der Saison. ~n~ - Moment, Moment, Moment... +[BK4_19A:BANKJ4] +Der Safe hat eine Zeitsperre, -[DONS1_1:DONS1] -Kein(e) +[BK4_19B:BANKJ4] +ihr könnt ebenso gut gleich aufgeben! -[DL1_A:DONS1] -Ich gebe eine Leichenhausparty und du sollst die "Gäste" abholen. +[BK4_20A:BANKJ4] +Ach, die Zeitsperre kann ich umgehen. -[DL1_2:DONS1] -~r~Du hast das Auto zerstört. +[BK4_20B:BANKJ4] +Dann brauchen wir nur noch deinen Code und alles ist in Butter! -[DL1_3:DONS1] -Die Cops sind alarmiert. Werde deinen Fahndungslevel los! +[BNK4_21:BANKJ4] +Bleib hier. Wenn du Zicken machst, bist du Fischfutter, klar? -[DL1_4:DONS1] -Bring das Auto in Donalds ~y~Garage. +[BNK422A:BANKJ4] +Cam, wie lange noch? -[DL1_6:DONS1] -~r~ Der Leichenwagen hat das Polizeirevier erreicht. +[BK4_23A:BANKJ4] +Gib mir noch 3 Minuten! -[DL1_9:DONS1] -Fahr das Auto in die Lackiererei. +[BK4_24A:BANKJ4] +Ich seh mal nach Phil. Bin gleich wieder da. -[DL1_5:DONS1] -Klau den ~b~Leichenwagen~w~, ehe er sein Ziel erreicht. +[BK4_24B:BANKJ4] +Ich hab gesagt, Finger weg vom Alarm! -{=================================== MISSION TABLE DONS2 ===================================} +[BNK4_25:BANKJ4] +Das Spezialkommando muss gleich hier sein! -[DONS2AA:DONS2] -D.L.? +[BNK4_27:BANKJ4] +Ich könnte ein bisschen Hilfe brauchen, Tommy! -[DONS2AB:DONS2] -Toni! +[BNK4_28:BANKJ4] +Vice City Spezialkommando! Sie sind umzingelt! -[DONS2AC:DONS2] -Was macht der Wahlkampf? +[BNK4_29:BANKJ4] +Umzingelt? HA HA HA HAAAAAaaa! -[DONS2AD:DONS2] -Es ist fünf vor zwölf und jede einzelne Stimme zählt! +[BNK4_30:BANKJ4] +Die scheißen sich ein, die korrupten Schweine! -[DONS2AE:DONS2] -O'Donovans Helfer bearbeiten die umkämpften Wahlbezirke gnadenlos. +[BK4_31A:BANKJ4] +Tommy, der Tresor ist offen! -[DONS2AF:DONS2] -Wir haben auch einen Lautsprecherwagen - also ab, die Werbetrommel rühren! +[BK4_34A:BANKJ4] +Ok, wir haben die Pensionskasse der Bullen. Los, raus hier! -[DONS2BA:DONS2] -O'Donovan zum Bürgermeister! +[BK4_34B:BANKJ4] +Ok, ihr habt es so gewollt. Ihr hattet eure letzte Chance! -[DONS2BB:DONS2] -O'Donovan macht Schluss mit der Korruption! +[BK4_35A:BANKJ4] +Die stürmen den Laden! -[DONS2BC:DONS2] -O'Donovan, der Bürgermeister Ihres Vertrauens! +[BK4_35B:BANKJ4] +In Deckung! -[DONS2BD:DONS2] -Gegen das Verbrechen, für O'Donovan! +[BNK4_94:BANKJ4] +~w~Ok, Jungs. Jeder hãlt sich an den Plan . -[DONS2BE:DONS2] -Wählt Gerechtigkeit! Wählt O'Donovan! +[BM_DEAD:BANKJ4] +~r~Du brauchst den Bank Manager lebend!! -[DONS2CA:DONS2] -O'Donovan hat drei Ehefrauen! +[ASSET_A:BANKJ4] +BANK-MISSIONEN ERFÜLLT! -[DONS2CB:DONS2] -Wer ist fett und verfressen? O'Donovan! +[ASSET_B:BANKJ4] +~g~Der Malibu Club generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. -[DONS2CC:DONS2] -O'Donovan ist ein Junkie! +[IDIOT:BANKJ4] +~r~Na super - angezogen wie ein Irrer durch die Gegend laufen und Aufmerksamkeit erregen, IDIOT! -[DONS2CD:DONS2] -O'Donovan will Analverkehrspflicht einführen! +{=================================== MISSION TABLE BARON1 ===================================} -[DONS2CE:DONS2] -O'Donovan ist ein Kommunist! +[COK1_A:BARON1] +Komm schon, Brauner, komm! -[DONS2CF:DONS2] -O'Donovan zieht die Slips seiner Tochter an! +[COK1_B:BARON1] +Dãmlicher Klepper! Dich mach ich einen Kopf kürzer! -[DONS2CG:DONS2] -O'Donovan macht Striptease vor Schweinen! +[COK1_C:BARON1] +Wer ist der Blödmann? -[DONS2CH:DONS2] -O'Donovan hasst Amerika! +[COK1_D:BARON1] +Tommy Vercetti, Sie erinnern sich. -[DONS2CI:DONS2] -Love schafft Steuer für Reiche ab! +[COK1_E:BARON1] +Tschuldigung, ich bin etwas nervös. Vertrau niemals einem verdammten Pferd! -[DONS2CJ:DONS2] -Love für Pathologie-Unterricht an Schulen! +[COK1_F:BARON1] +Du machst deine Sache gut. Du arbeitest jetzt für mich. -[DONS2CK:DONS2] -Donald Love für allgemeinen Leichenhauszugang! +[COK1_H:BARON1] +Wie gesagt, Amigo, du arbeitest für mich. Basta. So ein Mistkerl hat mich betrogen. -[DONS2CL:DONS2] -Donald Love ist ein Kriegsheld! +[COK1_I:BARON1] +Er denkt, ich weiß nicht, wie viel Geld mir zusteht. Aber 3% zu klauen ist genauso schlimm wie 100% zu klauen. -[DONS2CM:DONS2] -Wer Love wählt, wählt Zufriedenheit! +[COK1_J:BARON1] +Niemand haut mich übers Ohr. NIEMAND!! -[DONS2CN:DONS2] -Donald Love: kein Pardon für Vegetarier! +[COK1_K:BARON1] +Folge ihm von seiner Wohnung aus und sieh nach, wo er hin will. Spãter erledigen wir ihn. -[DONS2_1:DONS2] -~w~Steig in den ~b~Van. - -[DONS2_3:DONS2] -~w~O'Donovan hat seine ~r~Vans~w~ losgeschickt, um sich die Stimmen zurückzuholen! - -[DONS2_4:DONS2] -~r~Du hast nicht genug Stimmen geholt! - -[DONS2_6:DONS2] -~w~Restzeit - -[DONS2_7:DONS2] -~w~Steig wieder in den ~b~Van~w~ und setze die Mission fort. - -[DONS2_9:DONS2] -~w~O'Donovan hat noch einen ~r~Van~w~ losgeschickt! - -[DONS210:DONS2] -~w~Bezirke gewonnen - -[DONS211:DONS2] -~r~Du hast alle Wahlbezirke verloren! - -[DONS212:DONS2] -~r~Du hast es nicht geschafft, die Gegner auszuschalten! - -[DONS2_2:DONS2] -~w~Fahr die ~y~Checkpoints der umkämpften Wahlbezirke~w~ ab, um dort Stimmen zu gewinnen. - -[DONS215:DONS2] -~w~Du hast einen ~y~Bezirk~w~ an O'Donovan verloren! - -[DONS216:DONS2] -~w~Verhindere, dass O'Donovan alle ~y~Bezirke~w~ zurückgewinnt! - -[DONS213:DONS2] -~w~Jetzt wo du genug Bezirke hast, schalte die ~r~gegnerischen Vans~w~ aus, um zu verhindern, dass O'Donovan Bezirke dazugewinnt. - -[DONS2_8:DONS2] -~w~Gewinne mindestens 5 der ~y~Wahlbezirke. - -[DONS214:DONS2] -~w~Du hast weniger als 5 ~y~Bezirke~w~. Erobere sie zurück! - -[DONS217:DONS2] -~w~Hol dir zusätzliche Bezirke für eine höhere Belohnung. - -[DONS2_5:DONS2] -~r~Der Lautsprecherwagen wurde zerstört. - -[DONS218:DONS2] -~w~Gewinne mindestens 5 der ~y~Wahlbezirke~w~ vor ~1~:~1~ Uhr. - -[DONS219:DONS2] -~w~Gewinne mindestens 5 der ~y~Wahlbezirke~w~ vor 0~1~:~1~ Uhr. - -[DONS220:DONS2] -~w~Gewinne mindestens 5 der ~y~Wahlbezirke~w~ vor 0~1~:0~1~ Uhr. - -[DONS221:DONS2] -~w~Gewinne mindestens 5 der ~y~Wahlbezirke~w~ vor ~1~:0~1~ Uhr. - -[DONS230:DONS2] -~w~Jetzt wo du genug Bezirke hast, schalte den ~r~gegnerischen Van~w~ aus, um zu verhindern, dass O'Donovan Bezirke dazugewinnt. - -{=================================== MISSION TABLE DONS3 ===================================} - -[CAMP_01:DONS3] -Antonio! Que pasa, amigo? - -[CAMP_02:DONS3] -Don, Sie wissen, dass ich Italiener und kein Spanier bin. - -[CAMP_03:DONS3] -Natürlich, wie dumm von mir. Ich liebe einfach alle romanischen Sprachen. - -[CAMP_04:DONS3] -Gott, ist das lecker. - -[CAMP_05:DONS3] -Schmeckt wie Hühnchen, nur irgendwie, äh, mit mehr Biss. - -[CAMP_06:DONS3] -Möchtest du was? - -[CAMP_07:DONS3] -Ich hab schon gegessen. - -[CAMP_08:DONS3] -Schade. Schmeckt fantastisch. - -[CAMP_09:DONS3] -Ich lasse gleich weitere Delikatessen auftischen... - -[CAMP_10:DONS3] -Wär ein gefundenes Fressen für die Liberalen, natürlich, - -[CAMP_11:DONS3] -doch was verstehen die von den wahren Freuden des Lebens? - -[CAMP_12:DONS3] -Weltläufigkeit und Demokratie konnten es noch nie so recht miteinander. - -[CAMP_13:DONS3] -Hören Sie, Don, wir müssen diese Wahl gewinnen. - -[CAMP_14:DONS3] -Deshalb müssen wir sichergehen, dass es keine Leichen im Keller gibt, - -[CAMP_15:DONS3] -wenn Sie mich verstehen. - -[CAMP_16:DONS3] -Alles klar. - -[CAMP_17:DONS3] -Ich meine damit... - -[CAMP_18:DONS3] -Was machen wir mit diesem O'Donovan, der als Strohmann für die... - -[CAMP_19:DONS3] -der für die Forellis antritt? - -[CAMP_20:DONS3] -Der Mann hat 'ne Menge prominente Wahlhelfer, - -[CAMP_21:DONS3] -lauter verblendete Sozialromantiker, wenn Sie mich verstehen. - -[CAMP_22:DONS3] -Wir müssen ihren Glauben an die Demokratie ins Wanken bringen. - -[CAMP_23:DONS3] -Sie meinen, ich soll ihnen die Zähne rausschlagen? - -[CAMP_24:DONS3] -Ach, deine Leidenschaft, Antonio, ist... grandios. - -[CAMP_25:DONS3] -Sie ist so, ähm, wagnerianisch! Verstehst du? Arrivederci, amigo. - -[CAMP_26:DONS3] -Humphries, trag die Kaldaunen auf! - -[DONS3_1:DONS3] -Toni muss die gegnerischen Wahlhelfer loswerden, um den Wahlkampf des Forelli-Kandidaten O'Donovan möglichst wirkungslos zu machen. - -[DONS3_2:DONS3] -~w~Erledige die gegnerischen ~r~Wahlhelfer. - -[DONS3_3:DONS3] -~r~Zu spät. Die Zeit ist um. - -[DONS3_4:DONS3] -Diese ~r~Wahlkampfhelfer ~w~wären erledigt. Mach die nächsten fertig. - -[DONS3_5:DONS3] -~w~Erledige die gegnerischen ~r~Wahlkampfhelfer ~w~vor ~1~:~1~ Uhr - -[DONS3_6:DONS3] -~w~Erledige die gegnerischen ~r~Wahlkampfhelfer ~w~vor ~1~:0~1~ Uhr - -[DONS3_7:DONS3] -~w~Erledige die gegnerischen ~r~Wahlkampfhelfer ~w~vor 0~1~:~1~ Uhr - -[DONS3_8:DONS3] -~w~Erledige die gegnerischen ~r~Wahlkampfhelfer ~w~vor 0~1~:0~1~ Uhr - -{=================================== MISSION TABLE DONS4 ===================================} - -[DONS410:DONS4] -Fahr zum ~y~Lagerhaus der Forellis~w~ und verbrenne ihre Stimmzettel! - -[DONS411:DONS4] -Verbrenne die ~r~Stimmzettel~w~ und zerstöre die ~r~Druckmaschinen! - -[DONS412:DONS4] -Zerstöre die ~r~Druckmaschine! - -[DONS413:DONS4] -Verbrenne ALLE ~r~Stimmzettel! - -[DONS414:DONS4] -Zerstöre die restlichen ~r~Forelli-Vans! - -[DONS416:DONS4] -~r~Ein Forelli-Van ist entkommen! Die Forellis können die Wahl manipulieren. - -[DONS418:DONS4] -Noch ~r~~1~ Paletten~w~ gefälschter Stimmzettel sind übrig. - -[DONS419:DONS4] -Nur noch ~r~1 Palette~w~ gefälschter Stimmzettel ist übrig. - -[DONS420:DONS4] -Zerstöre den letzten ~r~Forelli-Van! - -[DONS421:DONS4] -Die Druckmaschine ist zerstört! Zerstöre jetzt die andere ~r~Druckmaschine! - -[DONS422:DONS4] -Die Druckmaschine ist zerstört! - -[DONS423:DONS4] -Hau jetzt ab! - -[DONS424:DONS4] -Zerstöre die ~r~Druckmaschinen! - -[DS4_AA:DONS4] -So viele Menschen, so viel Geld. Man muss nur zugreifen. - -[DS4_AB:DONS4] -Ich blick bei Politik nicht durch. - -[DS4_AC:DONS4] -Wer tut das schon? Ist alles nur Bluff und Korruption. - -[DS4_AD:DONS4] -Die Forellis sind stille Teilhaber der Firma, die die neuen Wahlautomaten herstellt. - -[DS4_AE:DONS4] -Nicht gut, oder? - -[DS4_AF:DONS4] -Trauen können wir ihnen keinesfalls. - -[DS4_AG:DONS4] -Das Beste wäre, sie hätten alle einen SCHWEREN Defekt, verstehst du? - -[DONS4H1:DONS4] -Schwere Waffen bekommst du in Phil Cassidy's Fully Cocked Gun Shop. - -[DONS4AA:DONS4] -Antonio! Schön, dich zu sehen. - -[DONS4AB:DONS4] -Ich bin wahrlich kein Demokrat, aber Wahlbetrug geht selbst mir zu weit. - -[DONS4AC:DONS4] -Weißt du, dass die Forellis stille Teilhaber der Firma sind, die die neuen Wahlautomaten herstellt? - -[DONS4AD:DONS4] -Nicht gut, oder? - -[DONS4AE:DONS4] -Trauen können wir ihnen keinesfalls. - -[DONS4AF:DONS4] -Das Beste wäre, sie hätten alle einen SCHWEREN Defekt, verstehst du? - -[DONS4_8:DONS4] -Fahr zu Phil Cassidy's Fully Cocked Gun Shop. - -[DONS4H2:DONS4] -Phil Cassidy's Fully Cocked Gun Shop ist als Fähnchen auf dem Radar sichtbar. - -[DONS427:DONS4] -Jetzt verschwinde aus Fort Staunton! - -[DONS4_9:DONS4] -Phil Cassidy's Fully Cocked Gun Shop rüstet dich mit dem Nötigen aus, um den Forelli-Wahlkampf lahmzulegen. - -[DONS417:DONS4] -In Phil Cassidy's Fully Cocked Gun Shop gibt es noch einen Flammenwerfer. - -[DONS425:DONS4] -Hol den Flammenwerfer von Phil Cassidy's Fully Cocked Gun Shop. - -[DONS426:DONS4] -~r~Der Verkäufer ist hinüber! - -[DONS4H3:DONS4] -Donald Love hat einen Flammenwerfer gekauft. Hol ihn an der Kasse ab. - -{=================================== MISSION TABLE DONS5 ===================================} - -[DONS5_7:DONS5] -Beschütze Donalds Limo! - -[DONS5_9:DONS5] -~r~Donald Love ist hinüber! - -[DONS513:DONS5] -Schaden Limo - -[DONS516:DONS5] -Steig in die ~b~Limo. - -[DONS517:DONS5] -Du hast ~b~Donald Love~w~ zurückgelassen! - -[DONS519:DONS5] -Bring Donald zu seinem ~y~Versteck! - -[DONS520:DONS5] -Erledige die ~r~Angreifer! - -[DONS521:DONS5] -Steig in die ~b~Limo. - -[DS5_AA:DONS5] -Ich hasse Rummel, aber der gehört nun mal dazu, was? - -[DS5_AB:DONS5] -Leider ja. - -[DS5_AC:DONS5] -Die Forellis werden versuchen, mich umzunieten, nicht? - -[DS5_AD:DONS5] -Keine Angst, ich fahr mit gezückter Knarre. - -[DS5_AE:DONS5] -Nun gut, Augen zu und durch. - -[DS5_BA:DONS5] -Scheiße! Das gibt's nicht! - -[DS5_BB:DONS5] -Keine Panik, ich kümmere mich um die Ärsche! - -[DS5_BC:DONS5] -Im Kofferraum liegt ein Gewehr! - -[DS5_BD:DONS5] -Sperren Sie ab, es dauert nicht lange! - -[DS5_CA:DONS5] -Okay, wir können. - -[DS5_CB:DONS5] -Da ist noch ein Killer hinter uns her! - -[DS5_DA:DONS5] -Als Einsiedler kann ich keinen Wahlkampf führen. - -[DS5_DB:DONS5] -Eventuell müssen wir eine andere Taktik erwägen. - -[DONS522:DONS5] -Bring Donald zurück zu seinem ~y~Gebäude! - -{=================================== MISSION TABLE DONS6 ===================================} - -[DONS6_1:DONS6] -KEIN(E) - -[DS6_00:DONS6] -Folge dem ~b~Stimmzettel-Van. - -[DS6_01:DONS6] -Warte, bis der ~b~Kurier ~w~die Übergabe vorgenommen hat. - -[DS6_02:DONS6] -Hol dir die Stimmzettel von dem ~r~Kurier. - -[DS6_03:DONS6] -Erledige den ~r~Kurier. - -[DS6_04:DONS6] -Nimm das ~g~Päckchen. - -[DS6_05:DONS6] -Folge dem ~b~Stimmzettel-Van~w~ weiter. - -[DS6_06:DONS6] -~r~Du hast einen Kurier vor der Übergabe erledigt! - -[DS6_07:DONS6] -Du hast eine Übergabe verpennt, eine zweite darfst du nicht verpassen! - -[DS6_08:DONS6] -~r~Du hast eine zweite Übergabe verpasst. Das Wahlergebnis steht fest! - -[DS6_09:DONS6] -Du hast ihn verschreckt! - -[DS6_10:DONS6] -~r~Der Van wurde zerstört! - -[DS6_11:DONS6] -Die Zeit ist um! - -[DS6_12:DONS6] -~r~Der Van ist dir entwischt! - -[DS6_13:DONS6] -~r~Ohne Fahrer kann der Van nicht fahren! - -[DS6_15:DONS6] -~r~Du hast den Fahrer verschreckt. Jetzt erwischst du ihn nie! - -[DS6_16:DONS6] -~1~ - -[DS6_17:DONS6] -~w~Der Fahrer ist tot. Fahr den Van zu ~y~Donalds Garage. - -[DONS6AA:DONS6] -Schlechte Nachricht, Toni! - -[DONS6AB:DONS6] -Was ist? - -[DONS6AC:DONS6] -Laut Hochrechnung steht es Kopf an Kopf. - -[DONS6AD:DONS6] -Zeit für Plan B. - -[DONS6AE:DONS6] -Wir müssen die noch nicht ausgezählten Stimmzettel klauen und durch unsere eigenen ersetzen. - -[DONS6AF:DONS6] -Wie standen Sie noch mal zu Wahlbetrug? - -[DONS6AG:DONS6] -Ach, halt den Mund! - -[DS6_14:DONS6] -Hol die ~g~Stimmzettel~w~. Du darfst sie nicht liegen lassen! - -[DS6_66:DONS6] -~r~Du hast das Auto des Kuriers vor der Übergabe zerstört! - -[DS6_18:DONS6] -Du hast einen Kurier vor der Übergabe erledigt! Erledige nicht noch weitere! - -[DS6_21:DONS6] -Beeil dich! Es findet eine weitere Übergabe statt! - -[DS6_22:DONS6] -Du hast die erste Übergabe verpasst, eine weitere darfst du nicht verpassen! - -[DS6_23:DONS6] -Du hast die zweite Übergabe verpasst, eine weitere darfst du nicht verpassen! - -[DS6_24:DONS6] -Du hast die dritte Übergabe verpasst, eine weitere darfst du nicht verpassen! - -[DS6_25:DONS6] -Du hast die vierte Übergabe verpasst, eine weitere darfst du nicht verpassen! - -[DS6_26:DONS6] -Du hast den Kurier vor der Übergabe vertrieben! Vertreibe nicht noch einen! - -[DS6_28:DONS6] -~r~Du hast es vermasselt! Jetzt kann die Wahl nicht mehr manipuliert werden! - -{=================================== MISSION TABLE DONS7 ===================================} - -[ELEC_01:DONS7] -Hey, Don, ich hab das Schlamassel beseitigt. - -[ELEC_02:DONS7] -Jetzt dürfte alles glatt gehen. - -[ELEC_03:DONS7] -Ach, wirklich? - -[ELEC_04:DONS7] -Mit der Mafia sind Sie nicht mehr in Verbindung zu bringen. - -[ELEC_05:DONS7] -Ihre Weste ist blütenweiß. Sie könnten Papst werden. - -[ELEC_07:DONS7] -Obwohl keine nachweislichen Verbindungen zwischen Donald Love - -[ELEC_08:DONS7] -und dem organisierten Verbrechen bestehen, - -[ELEC_09:DONS7] -scheint seine Freundschaft mit Mafiosi wie Toni Cipriani - -[ELEC_11:DONS7] -den Wählern ein beträchtlicher Dorn im Auge zu sein. - -[ELEC_12:DONS7] -Seit einigen Stunden fallen seine Quoten in den Keller. - -[ELEC_13:DONS7] -Man wähnt ihn wohl untauglich für das Amt... - -[ELEC_14:DONS7] -Untauglich! Deinetwegen... - -[ELEC_15:DONS7] -Ja. Das ist nur deine Schuld. - -[ELEC_16:DONS7] -Meine Schuld? - -[ELEC_17:DONS7] -Oh ja. - -[ELEC_18:DONS7] -Meine Schuld? - -[ELEC_19:DONS7] -Dabei habe ich solche Opfer für diese Stadt gebracht! - -[ELEC_20:DONS7] -Und weißt du, was von Anfang an mein Schwachpunkt war? - -[ELEC_21:DONS7] -Bescheidenheit! Ich bin ruiniert. - -[ELEC_22:DONS7] -Bankrott! 20 Mio Dollar versenkt. - -[ELEC_23:DONS7] -Futsch... bankrott...erledigt! Arrivederci! Bankrott! - -[ELEC_06:DONS7] -Papst! Sieh mal. - -[DONS7_1:DONS7] -O'Donovan bringt Donald Love mit Salvatore Leone in Verbindung. Loves politische Karriere steht auf dem Spiel. Toni muss die Beweise vernichten. - -[DONS7_2:DONS7] -~w~Klau den ~b~Van~w~ mit dem Beweismaterial. - -[DONS7_3:DONS7] -~r~Du hast den Kontaktmann erledigt. - -[DONS7_4:DONS7] -~w~Fahr den Van zum ~y~Übergabeort. - -[DONS7_5:DONS7] -~w~Steig wieder in den ~b~Van. - -[DONS7_7:DONS7] -Steig ins ~b~Auto des Kontaktmanns. - -[DONS7CA:DONS7] -Toni! - -[DONS7CB:DONS7] -Das Beweismaterial ist in dem Van da vorn. - -[DONS7CC:DONS7] -Du musst gewaltsam eindringen. - -[DONS7CD:DONS7] -Fahr den Van zu D.L. - -[DONS7CE:DONS7] -Viel Glück! - -[DONS713:DONS7] -~w~Park den Van in der ~y~Garage. - -[DONS714:DONS7] -~r~Du hast den Van zerstört! - -[RMN_AA:DONS7] -Heute Abend gibt es Anlass zum Feiern, denn der Arbeitskampf, der Liberty City lahm legte, - -[RMN_AB:DONS7] -wurde endlich beendet. - -[RMN_AC:DONS7] -Sämtliche U-Bahnen und Fähren haben den Betrieb wieder aufgenommen. - -[RMN_AD:DONS7] -Auch die Brücke, die Staunton Island mit Shoreside Vale verbindet, ist wieder geöffnet. - -[RMN_AE:DONS7] -Die Streikenden legten ihre Transparente nieder und begaben sich wieder an ihre Arbeitsplätze, - -[RMN_AF:DONS7] -nachdem der neu ins Amt gewählte Bürgermeister O'Donovan ihnen folgende Garantie gab: - -[RMN_AG:DONS7] -Als Ihr Bürgermeister verbürge ich mich für den dauerhaften Fortbestand des Fährbetriebs in Liberty City. - -[RMN_AH:DONS7] -Doch für manchen klingt sein Versprechen wenig überzeugend - -[RMN_AI:DONS7] -angesichts der unverminderten Bautätigkeiten am Porter Tunnel. - -[DONS7_6:DONS7] -~w~Triff dich mit Donald Loves ~b~Kontaktmann~w~ unter der Überführung in Newport. - -{=================================== MISSION TABLE RAYS1 ===================================} - -[SAYO_01:RAYS1] -Dann bist du die lästige Hämorrhoide? - -[SAYO_02:RAYS1] -Wie bitte? - -[SAYO_03:RAYS1] -Du hast 'n Haufen wichtige Leute ziemlich sauer gemacht. - -[SAYO_04:RAYS1] -Leon McAffrey, LCPD. - -[SAYO_05:RAYS1] -Ich hab keine Ahnung, wovon Sie reden. - -[SAYO_06:RAYS1] -Ich bin in der Gastronomiebranche. - -[SAYO_07:RAYS1] -Wie du willst, Schlaumeier. - -[SAYO_08:RAYS1] -Ist mir scheißegal, wenn ihr Arschlöcher euch gegenseitig umpusten wollt. - -[SAYO_09:RAYS1] -Mich interessiert nur mein Anteil. - -[SAYO_12:RAYS1] -Mein Anteil! Wo ist er? - -[SAYO_13:RAYS1] -In deinem Arsch, du Witzfigur. - -[SAYO_14:RAYS1] -Hör auf mit dem Scheiß, sonst lass ich dich, deine Bekannten und ihre Verwandten, - -[SAYO_15:RAYS1] -dein ganzes Heimatkaff über die Klinge springen. - -[SAYO_16:RAYS1] -Reg dich ab. Geh 'ne Runde vögeln. - -[SAYO_17:RAYS1] -Wir sind gleichberechtigte Geschäftspartner. - -[SAYO_18:RAYS1] -Ich halte euch die Bullen und Mafiajäger vom Hals, - -[SAYO_19:RAYS1] -und ihr haltet mich angemessen bei Kasse. - -[SAYO_20:RAYS1] -Und woher weiß ich, dass ich nicht zur wandelnden - -[SAYO_21:RAYS1] -Weihnachtsgans für jeden korrupten Cop zwischen hier und Vice City werde? - -[SAYO_22:RAYS1] -Mit mir kriegt ihr die Stadt unter eure Kontrolle. - -[SAYO_23:RAYS1] -Dafür verlange ich Kohle und Erkenntlichkeit. - -[SAYO_24:RAYS1] -Los, Toni, machen wir 'ne kleine Tour. - -[SAYO_25:RAYS1] -Wir fahren zu deinen alten Freunden, den Sindaccos. - -[SAYO_10:RAYS1] -- Ich mag Männer mit Prinzipien. ~n~ - Ich auch. Ich fahr auf alle ihre Beerdigungen mit heißen Puppen in schnellen Autos. - -[RS1_YK:RAYS1] -Schaden - -[RS1_01:RAYS1] -Beseitige die ~r~Sindaccos. - -[RS1_02:RAYS1] -~r~Das Auto wurde zerstört! - -[RS1_03:RAYS1] -~r~Die Yakuza wurden massakriert! - -[RS1_04:RAYS1] -~w~Erledige ein paar ~r~Sindaccos~w~, damit sie dich bemerken. - -[RS1_05:RAYS1] -~w~Steig in Leons ~b~Auto. - -[RS1_06:RAYS1] -~w~Fahr ins ~y~Sindacco-Gebiet. - -[RS1_07:RAYS1] -~w~Geh wieder zum ~b~Auto. - -[RS1_10:RAYS1] -~r~Du hast Leon umgelegt! - -[RAYS1AA:RAYS1] -Gut, ich fahre und du ballerst los! - -[RAYS1AB:RAYS1] -Ich denke, die Yakuza erledigen die grobe Arbeit? - -[RAYS1AC:RAYS1] -Nur wer sich anpasst, überlebt, Cipriani! - -[RAYS1BA:RAYS1] -Scheiße, die Sache wird Wellen schlagen. - -[RAYS1BB:RAYS1] -Ich muss mich dünne machen. Bis demnächst, Toni. - -[RAYS1CA:RAYS1] -Augen geradeaus, Toni! - -[RAYS1CB:RAYS1] -Hinter uns, Toni, hinter uns! - -[RAYS1CC:RAYS1] -Vorsicht, links! - -[RAYS1CD:RAYS1] -Rechts, Toni, rechts! - -[RAYS1CE:RAYS1] -Steig wieder ein! - -[RAYS1CF:RAYS1] -Pass gefälligst auf! - -[RAYS1OS:RAYS1] +[COK1_1:BARON1] Oh, Shit! -{=================================== MISSION TABLE RAYS2 ===================================} +[COK1_2:BARON1] +Zu langsam, Opa! -[RS2_02:RAYS2] -~w~Schwing dich auf ein ~b~Motorrad! +[COK1_4:BARON1] +Versager. -[RS2_03:RAYS2] -~w~Locke die Motorradfahrer in die ~y~Todeszone! +[COK1_5:BARON1] +Ich würde einen Zahn zulegen, du Mistsack! -[RS2_04:RAYS2] -~w~Kehr um! Du darfst keine ~r~Forellis ~w~zurücklassen! +[COK1_8:BARON1] +~g~Schnell! Schnapp dir einen Untersatz und folge ihm! -[RS2_05:RAYS2] -~w~Steig auf das ~b~Motorrad! +[COK1_9:BARON1] +~r~Du sollst ihn verfolgen, nicht umlegen! -[RS2_06:RAYS2] -~r~Du musst die Forellis mit dem Motorrad weglocken. +[COK1_10:BARON1] +~r~Begib dich zum Haus des Diebes und such das Geldversteck. -[RS2_07:RAYS2] -~r~Die Yardies wollten selber Forelli-Hackepeter machen. +[COK1_11:BARON1] +~g~Schau durch sein Fenster. -[RS2_08:RAYS2] -~r~Kein Yardie hat überlebt! +[COK1_7:BARON1] +~g~Er ist aufs Dach geflohen. Bleib ihm auf den Fersen, aber erledige ihn nicht. -[RS2_09:RAYS2] -~1~ +[COK1_G:BARON1] +Ich arbeite gegen Geld. -[RS2_10:RAYS2] -~r~Ohne Motorräder können sie dich nicht verfolgen! +{=================================== MISSION TABLE BARON2 ===================================} -[RAYS2AA:RAYS2] -Hast dir Zeit gelassen, Toni. +[COK2_A:BARON2] +Was bist du eigentlich für ein inkompetenter Narr? -[RAYS2AB:RAYS2] -Sie können mich mal kreuzweise. +[COK2_B:BARON2] +NARR! NARR! NARR! NARR! -[RAYS2AD:RAYS2] -Nett. Hör zu. +[COK2_C:BARON2] +Tommy- -[RAYS2AE:RAYS2] -Die Yardies strecken die Gierfinger nach Forelli-Gebiet in Newport aus. +[COK2_D:BARON2] +Was, Ricardo? -[RAYS2AF:RAYS2] -Fahr hin und locke die Forelli-Schergen zum Krankenhaus in Rockford. +[COK2_E:BARON2] +Diese Idioten - dauernd wollen sie einen reinlegen. -[RAYS2AG:RAYS2] -Die Yardies werden auf sie warten. +[COK2_F:BARON2] +Das ist der Fehler an dieser Branche. -[RAYS2AH:RAYS2] -Was springt für Sie raus? +[COK2_G:BARON2] +Was soll denn das? Aaaaah! -[RAYS2AI:RAYS2] -Ich schulde denen was. Bis dann. +[COK2_H:BARON2] +Diese Mistkerle haben mich bitter enttãuscht. -[RS2_11:RAYS2] -Töte keinen von den Forellis! +[COK2_I:BARON2] +Bald denkt jeder Depp, er kann in Vice City Koks verkaufen. -[RS2_12:RAYS2] -Mach ~r~sie ~w~fertig! +[COK2_J:BARON2] +Was kommt als nãchstes, hah? Die verstunkene Mafia?! -[RS2_01:RAYS2] -~w~Klau ein ~b~Motorrad~w~ der Forellis. Aber töte keinen von ihnen. +[COK2_K:BARON2] +Diese Bandengegend ist eine Festung ohne Mauern. -[RAYS2DB:RAYS2] -Ja. Kommt, machen wir sie fertig! +[COK2_L:BARON2] +Also: Quentin hier - Quentin! QUENTIN! -[RS2_13:RAYS2] -~r~Es sind zu viele Yardies umgekommen! +[COK2_M:BARON2] +Er fliegt dich über das Areal. -{=================================== MISSION TABLE RAYS3 ===================================} +[COK2_N:BARON2] +Heb ihr Nest aus! -[CRAZ_01:RAYS3] -Mit welcher Schandtat in meinem früheren Leben hab ich Sie verdient? +[COK2_O:BARON2] +Was soll denn das? -[CRAZ_02:RAYS3] -Ray, Sie sind 40 Jahre alt und haben von Nichts 'ne Ahnung. +[COK2_P:BARON2] +Was willst du hier? -[CRAZ_03:RAYS3] -Wie sind Sie bloß so weit gekommen? +[COK2_Q:BARON2] +Hey, ich hab mich umgehört, und es ist klar, -[CRAZ_04:RAYS3] -Ein Wunder, dass Ihnen noch keiner 'ne Kugel in Ihre Mutter-Theresa-Birne gejagt hat. +[COK2_R:BARON2] +dass Diaz in den Deal reingeplatzt ist und meinen Bruder erledigt hat. -[CRAZ_05:RAYS3] -Nehmen Sie sich in Acht, Leon. +[COK2_S:BARON2] +Und dich erledigt er auch! -[CRAZ_06:RAYS3] -So'n Gerede geht echt zu weit, verdammt! +[COK2_T:BARON2] +Mit Diaz nehm ich's auf! -[CRAZ_07:RAYS3] -Wie? Wollen Sie zu Mammi laufen? +[COK2_U:BARON2] +Nein, hör zu! Ich übernehme Diaz - -[CRAZ_08:RAYS3] -Auf Daddys Schoß hüpfen? +[COK2_V:BARON2] +er beginnt mir zu vertrauen. -[CRAZ_09:RAYS3] -Sich 'nen Kuss abholen? +[COK2_1:BARON2] +Eines versteh ich nicht: Was soll das mit 'Quentin'!? -[CRAZ_10:RAYS3] -Hey, Toni! +[COK2_2:BARON2] +Weiß nicht. Hat mir immer gefallen...Quentin Vance... -[CRAZ_14:RAYS3] -Er sorgt dafür, dass ich alles nach Vorschrift mache. +[COK2_3:BARON2] +Vance? Du heißt wirklich Lance Vance?! -[CRAZ_15:RAYS3] -Toni Cipriani - Ray Machowski. +[COK2_4:BARON2] +Hey! Das hab ich schon in der Schule oft genug gehört! -[CRAZ_16:RAYS3] -Er gehört zu uns. Hey, wir fahren jetzt auf Mafiajagd. +[COK2_5:BARON2] +Hast du so was schon mal aus einem Helikopter abgefeuert? -[CRAZ_17:RAYS3] -Ab mit Ihnen ins Revier, 'nen Bericht schreiben. +[COK2_8:BARON2] +Wo fliegen wir denn hier? -[CRAZ_18:RAYS3] -Braver Junge... Los, Toni. +[COK2_9:BARON2] +Prawn Island. -[CRAZ_19:RAYS3] -Leon, Sie elendes Stück Scheiße. +[COK2_13:BARON2] +'Lance Vance'. Du armer Teufel. -[CRAZ_11:RAYS3] -- Stehen bleiben, Arschloch. ~n~ - Hey, langsam! Darf ich vorstellen: mein neuer Partner, Mr. Hip! +[COK2_14:BARON2] +Ok, wir sind gleich da. -[RAYS3_1:RAYS3] -Hilf den Yakuza, das Forelli-Gebiet in Belleville zu erobern. Der Spieler muss ~1~ Forellis nur mit einer Katana erledigen. +[COK2_15:BARON2] +Wir fliegen ein paar Mal drüber weg. -[RAYS3_2:RAYS3] -~w~Erledige ~1~ ~r~Forellis~w~ nur mit der griffbereiten Katana. +[COK2_16:BARON2] +Schalte so viele Kerle aus wie du kannst. -[RAYS3_3:RAYS3] -Hits +[COK2_17:BARON2] +Dann setze ich dich ab, und du bist auf dich allein gestellt. -[RAYS3_4:RAYS3] -~w~Du musst die ~r~Forellis~w~ mit der Katana erledigen. +[COK2_20:BARON2] +Shit! Das ist ja wie im Krieg hier! Schalt welche von den Schützen aus! -[RAYS3_5:RAYS3] -~w~Du hast keine Katana mehr. Hol dir eine ~g~neue. +[COK2_21:BARON2] +Wir werden getroffen, Mann! -[RAYS3_6:RAYS3] -~r~Die Zeit ist um. +[COK2_22:BARON2] +Reparaturen an dem Kübel hier kosten! Schalt sie aus! -[RAYS3_7:RAYS3] -~w~Erledige ~1~ ~r~Forellis~w~ nur mit der bereitgestellten Katana vor ~1~:~1~ Uhr +[COK2_23:BARON2] +Ok, von jetzt an bist du auf dich alleine gestellt. Viel Glück! -[RAYS3_8:RAYS3] -~w~Erledige ~1~ ~r~Forellis~w~ nur mit der bereitgestellten Katana vor ~1~:0~1~ Uhr +[COK2_24:BARON2] +Zustand Helikopter: -[RAYS3_9:RAYS3] -~w~Erledige ~1~ ~r~Forellis~w~ nur mit der bereitgestellten Katana vor 0~1~:~1~ Uhr +[COK2_25:BARON2] +~g~Hol das Geld auf dem Dach. -[RAYS310:RAYS3] -~w~Erledige ~1~ ~r~Forellis~w~ nur mit der bereitgestellten Katana vor 0~1~:0~1~ Uhr +[COK2_27:BARON2] +Du bist auf MEINEM Gebiet, Mistkerl! -{=================================== MISSION TABLE RAYS4 ===================================} +[COK2_28:BARON2] +Dich mach ich fertig! -[RAYS4_1:RAYS4] -~w~Die Yardies werden in Newport angegriffen. Erledige die angreifenden ~r~Sindaccos. +[COK2_6:BARON2] +Nein. Aber ich kann ja unterwegs ein bisschen üben. -[RAYS4_2:RAYS4] -~w~Sprich mit dem ~b~Boss der Yardie-Gang. +[OPEN_B:BARON2] +Die Straßensperren zum Festland sind aufgehoben worden. -[RAYS4_3:RAYS4] -~w~Folge dem ~b~Boss der Yardie-Gang. +{=================================== MISSION TABLE BARON3 ===================================} -[RAYS4_4:RAYS4] -~r~Ein Yardie wurde umgelegt! +[COK3_A:BARON3] +Das gefãllt euch nicht, was?! -[RAYS4_5:RAYS4] -~w~Beschütze die Yardies, bis der Krankenwagen kommt. +[COK3_B:BARON3] +Ahahahahaa, Ahahahahaa. -[RAYS4_6:RAYS4] -~w~Zurück! Beschütze die Yardies. +[COK3_C:BARON3] +Vorsicht! Passen Sie auf, wo Sie damit hin zielen! -[RAYS4_7:RAYS4] -~w~Räume den Yardies den Weg zum Krankenwagen frei. +[COK3_D:BARON3] +Kein Taubendreck mehr auf MEINEM Dach, was Tommy? -[RAYS4_8:RAYS4] -~w~Geh schon mal vor zum ~y~Krankenwagen. +[COK3_E:BARON3] +Sieht nicht so aus. -[RAYS4AA:RAYS4] -Cipriani, diese Zusammenkünfte müssen aufhören. +[COK3_F:BARON3] +Das kannst du laut sagen. Also, hör zu: -[RAYS4AB:RAYS4] -Meinetwegen. +[COK3_G:BARON3] +Weißt du, wem das schnellste Boot an der Ostküste gehört? -[RAYS4AC:RAYS4] -Zieh nicht so'n Gesicht. +[COK3_H:BARON3] +Nicht wirklich. -[RAYS4AD:RAYS4] -Was haben Sie für mich, McAffrey? +[COK3_I:BARON3] +MIR. Und das soll auch so bleiben. -[RAYS4AE:RAYS4] -Die Yardies tun sich 'n bisschen schwer damit, ihr frisch erworbenes Gebiet in Newport zu halten. +[COK3_J:BARON3] +Jeder Schmuggler von hier bis Caracas hat EINEN Traum: ein schnelleres Boot. -[RAYS4AF:RAYS4] -Die Sindaccos wollen es wohl zurück. +[COK3_K:BARON3] +Es heißt, die Hull Werft hat gerade so ein Boot fertiggestellt, -[RAYS4BA:RAYS4] -Rudyard hat 'ne Kugel abgekriegt! +[COK3_L:BARON3] +für irgendeinen costaricanischen Idioten. -[RAYS4BB:RAYS4] -Wir müssen ihm 'nen Krankenwagen holen! +[COK3_M:BARON3] +Und, Tommy...ICH WILL DIESES BOOT!!! -[RAYS4BC:RAYS4] -Scheiße! Noch mehr Sindacco-Penner! +[COK3_N:BARON3] +Ich glaube, die Tauben sind wieder da. -[RAYS4BD:RAYS4] -Ich hol den Krankenwagen. Hilf du meinen Jungs! +[COK3_O:BARON3] +Ah! Ich dachte, ich hab euch erwischt. Wo kommst du denn her? -[RAYS4BE:RAYS4] -Los, weg hier! +[COK3_P:BARON3] +Tauben! Boom! Aaaaah! -[RAYS4BF:RAYS4] -Da kommt der Krankenwagen! +[COK3_5:BARON3] +~g~Suche den Schalter, um das Boot abzusenken. -[RAYS4BG:RAYS4] -Danke, Mr. Cipriani, wir revanchieren uns! +[COK3_6:BARON3] +~g~Bringe das Boot zur Villa. -{=================================== MISSION TABLE RAYS5 ===================================} +[COK3_7:BARON3] +~r~Du hast das Boot zerstört! -[RAYS5_1:RAYS5] -KEIN(E) +[COK3_8:BARON3] +~g~Begib dich zur Bootswerft an den Docks und klau das schnellste Boot. -[RAYS5AA:RAYS5] -Was? Keine Blumen? +[COK3_9:BARON3] +~g~Jetzt steig in das Boot. -[RAYS5AB:RAYS5] -Wusste nicht, dass Sie Beerdigung haben. +{=================================== MISSION TABLE BARON4 ===================================} -[RAYS5AC:RAYS5] -Du bist ein Scherzkeks, Toni, ein echter Komiker. +[COK4_A:BARON4] +Eject! PLASTIKMÜLL! -[RAYS5AD:RAYS5] -Die Forellis machen ernst. +[COK4_B:BARON4] +Wie kannst du mir das antun? -[RAYS5AE:RAYS5] -Sie verschieben Waffen und reißen sich 'nen Teil davon selbst unter den Nagel. +[COK4_C:BARON4] +Was bildest du dir ein, du mieses Stück Plastikdreck! Aaargh! -[RAYS5AF:RAYS5] -Das riecht nach Ärger. +[COK4_D:BARON4] +VERDAMMT! -[RAYS5AG:RAYS5] -Sie schaffen die Knarren in Trucks nach Fort Staunton. +[COK4_E:BARON4] +Wenn das Ding meinen Lieblings-El-Burro-Film frisst, ist Sense! -[RAYS5AH:RAYS5] -War mir ein Vergnügen. +[COK4_F:BARON4] +Was kann ich noch tun? -[RAYS5AI:RAYS5] -Gleichfalls. +[COK4_G:BARON4] +Ist wahrscheinlich nicht eingesteckt. -[RAY5_2:RAYS5] -Sie holen Verstärkung. +[COK4_H:BARON4] +Was? -[RAY5_3:RAYS5] -~r~Die Forellis haben die Waffen! +[COK4_I:BARON4] +Verdammt. Egal, ich kann mir noch 100 davon kaufen. -[RAY5_4:RAYS5] -Hey, das ist Cipriani! +[COK4_J:BARON4] +Also, Tommy, -[RAY5_5:RAYS5] -Legt ihn um! +[COK4_K:BARON4] +jeden Monat legt ein 'Freiberufler' mit seiner Jacht in Vice City an. -[RAY5_6:RAYS5] -Einen erwischt. Zerstöre jetzt den zweiten ~r~Truck. +[COK4_L:BARON4] +Er verkauft seine Fracht an das erstbeste Schiff. -[RAY5_1:RAYS5] -Zerstöre die ~r~Trucks~w~, ehe sie ihr Ziel erreichen! +[COK4_M:BARON4] +Du schnappst dir das Rennboot, -[RAY5_7:RAYS5] -Zerstöre den ~r~Truck~w~, ehe sie sich genug Munition daraus geholt haben. +[COK4_N:BARON4] +und bist vor allen anderen Pennern bei ihm. -[RAY5_8:RAYS5] -~r~Du hast den Truck nicht rechtzeitig zerstört! +[COK4_O:BARON4] +Dann bringst du die Fracht hierher, ok? -{=================================== MISSION TABLE SALH1 ===================================} +[COK4_P:BARON4] +Lass mich raten. Du dachtest, ich brauche einen Schutzengel. -[SLH1_F1:SALH1] -~r~Du hast einen von den Hoods umgebracht. +[COK4_Q:BARON4] +Ich denke nur, du solltest mich mitnehmen, Mann. -[SLH1_F2:SALH1] -~w~Locke die Forellis heraus, indem du ihre ~r~Autos~w~ kaputtschlägst. +[COK4_R:BARON4] +Du kannst lange den einsamen Macho-Helden markieren, -[SLH1_F3:SALH1] -~w~Zahl es den ~r~Forellis~w~ heim. +[COK4_S:BARON4] +aber eines Tages werde ich dir den Hintern retten -[SLH1_F4:SALH1] -~w~Locke noch mehr Forellis heraus, indem du noch ein ~r~Auto~w~ kaputtschlägst. +[COK4_T:BARON4] +und du wirst mich wahrscheinlich dafür küssen wollen. -[SLH1_F5:SALH1] -~w~Lass die ~b~Hoods~w~ nicht zurück. +[COK4_U:BARON4] +Spinner. -[SLH1_B0:SALH1] -~w~Okay, Vetter. Mischen wir die Stadt auf. +[COK4_V:BARON4] +Hahahaha! -[SLH1_B1:SALH1] -~w~Hey! Komm zurück, Idiot! +[COK4_1:BARON4] +Tommy, wir wissen, es war Diaz, der unseren Deal platzen ließ. -[SLH1_B2:SALH1] -~w~Hey, du Witzbold! Da krieg ich meinen Arsch doch nicht mehr rein! +[COK4_3:BARON4] +Wieso spielen wir dann die Laufburschen für ihn? -[SLH1_B3:SALH1] -~w~Besser so! Denn ohne mich solltet ihr gar nicht erst losfahren! +[COK4_4:BARON4] +Je mehr wir jetzt lernen, desto weniger müssen wir lernen, wenn wir diese Stadt übernehmen! -[SLH1_B4:SALH1] -~w~Verdammt! Das war 'ne enge Kiste, Mann! +[COK4_5:BARON4] +Dein Stil gefãllt mir. Echt erfrischend. -[SLH1_B6:SALH1] -~w~...nimm's nicht persönlich, Toni. +[COK4_12:BARON4] +Pass auf, die kommen von überall -[SLH1_B7:SALH1] -~w~Es wird Zeit, dass die Hoods aufstehen und das Richtige machen! +[COK4_13:BARON4] +Erwischt! Fahr zu Diaz so schnell du kannst! -[SLH1_B8:SALH1] -~w~Kommt! Die machen wir fertig! +[COK4_14:BARON4] +Willst du was abhaben? -[SLH1_C0:SALH1] -~w~Mein Bruder! +[COK4_15:BARON4] +Schönen Gruß an die Fische! -[SLH1_C1:SALH1] -~w~Yo! Trottel! Wo willst du hin? +[COK4_16:BARON4] +Nimm das! Und das! -[SLH1_C2:SALH1] -~w~Und wo soll ich da meinen scheiß Arsch hinpflanzen? +[COK4_19:BARON4] +Gleich kommt's noch dicker! -[SLH1_C3:SALH1] -~w~Besser so! Denn ohne mich solltet ihr gar nicht erst losfahren! +[COK4_20:BARON4] +Da sind Schützen auf dem Pier! -[SLH1_C4:SALH1] -~w~Shiiit! Mann, ging da die Kacke ab! +[COK4_24:BARON4] +Gut geschossen, mein Freund. Du bist ein erstklassiger Psycho. -[SLH1_D0:SALH1] -~w~Hey! Das ist mein Auto! +[COK4_25:BARON4] +Danke sehr. -[SLH1_D1:SALH1] -~w~So gefällt mir das besser! +[COK4_26:BARON4] +Wir sehen uns, Tommy. -[SLH1_E0:SALH1] -~w~Verdammt, was ist hier los? +[COK4_27:BARON4] +Ok, Mr. Lance Vance Dance. -[SLH1_E1:SALH1] -~w~Wir kicken eure Ärsche raus hier! Das ist los! +[COK4_28:BARON4] +~g~Sei vor den anderen Booten bei der Jacht! -[SLH1_X0:SALH1] -Got threat +[COK4_31:BARON4] +~g~Begib dich zum schnellsten Boot auf dem Pier! -[SLH1_X1:SALH1] -Had threat +[COK4_32:BARON4] +~r~Zu langsam! -[SLH1_X2:SALH1] -Find threat +[COK4_33:BARON4] +~r~Du hast das Boot zerstört! -[SLH1_F0:SALH1] -~w~Hol die ~b~Hoods~w~ ab, dann zieh die Aufmerksamkeit der ~r~Forellis~w~ auf dich. +[COK4_34:BARON4] +~g~Zieh diese Boote aus dem Verkehr! -[RUFJ_01:SALH1] -Ihr Anwalt, Mr. Leone. +[COK4_35:BARON4] +Zustand Boot: -[RUFJ_02:SALH1] -Ich weiß schon, wer das ist! +{=================================== MISSION TABLE BARON5 ===================================} -[RUFJ_03:SALH1] -Komm, geh mir nicht auf den Keks. +[PROP_A:BARON5] +OBJEKT ERWORBEN! -[RUFJ_04:SALH1] -Ab mit dir, Kleiner. Bestell deiner Mutter 'nen Gruß von mir, capiche? +[COK4_30:BARON5] +~r~Lance ist erledigt! -[RUFJ_05:SALH1] -Na schön. Sie haben fünf Minuten. +[ASS1_A:BARON5] +Im Kofferraum sind ein paar Kanonen. -[RUFJ_06:SALH1] -Sagen Sie, äh, Lionel, Sie schauen gut aus. +[ASS1_B:BARON5] +Wahnsinn! Wo hast du denn die alle her? -[RUFJ_07:SALH1] -Sehen Sie mich an! +[ASS1_C:BARON5] +Hab ich für schlechte Zeiten zurückgelegt. -[RUFJ_08:SALH1] -Eben noch geachtetes Mitglied der Gesellschaft und jetzt im Knast. +[ASS1_D:BARON5] +Zufrieden? -[RUFJ_09:SALH1] -Da kann mir die Menschenfreundlichkeit echt vergehen! +[ASS1_E:BARON5] +Ja. Und wie! -[RUFJ_10:SALH1] -Gewiss, Mr. Leone. +[ASS1_F:BARON5] +Ihr dãmlichen Idioten! -[RUFJ_11:SALH1] -Wir tun, was in unserer Macht steht, um Sie heraus zu bekommen, +[ASS1_G:BARON5] +Mein schönes Haus -[RUFJ_12:SALH1] -damit Sie sich bald wieder dem Gemeinwohl widmen können. +[ASS1_H:BARON5] +Seht euch an, was ihr angestellt habt! -[RUFJ_13:SALH1] -Natürlich. +[ASS1_I:BARON5] +Das ist für meinen Bruder! -[RUFJ_14:SALH1] -Und dann verklagen wir sie für diese Unverfrorenheit! +[ASS1_J:BARON5] +Ich habe dir vertraut, Tommy. -[RUFJ_15:SALH1] -Diese Arschlöcher, die Sindaccos, oder die Forelli-Schwanzlutscher - wer war's? +[ASS1_K:BARON5] +Ich hãtte was aus dir gemacht... -[RUFJ_16:SALH1] -Wer hat mich verpfiffen? +[ASS1_L:BARON5] +Gute Nacht, Mr. Diaz. -[RUFJ_18:SALH1] -Wir machen sie beide fertig. +[ASS1_1:BARON5] +Bald wimmelt's hier von Arschlöchern. Sei vorsichtig. -[RUFJ_19:SALH1] -Sie haben beide ordentlich Prügel für diese Unverfrorenheit verdient. +[ASS1_2:BARON5] +Keine Panik, Tommy, ich geb dir Deckung. -[RUFJ_22:SALH1] -Danke. Toni, du bedeutest mir wirklich sehr viel, das weißt du. +[ASS1_13:BARON5] +DIAZ?! Ich bin hier, um deinen Laden zu übernehmen! -[RUFJ_23:SALH1] -Kann sein, dass du Unterstützung brauchst. +[ASS1_14:BARON5] +TOMMY! Du Verrãter...Du Idiot! Dich mache ich fix und fertig... -[RUFJ_24:SALH1] -Nimm die Hoods, okay? +[ASS1_16:BARON5] +~g~Erledige Diaz! -[RUFJ_25:SALH1] -Wie Sie meinen, Mr. Leone. +[BUD1:BARON5] +Lance -[RUFJ_26:SALH1] -Gut. Und jetzt raus hier... Lionel. +[ASS1_18:BARON5] +~g~Die Tür ist verschlossen. Versuche es auf einem anderen Weg. -[RUFJ_20:SALH1] -- Die Wichser. ~n~ - Es wird mir ein Vergnügen sein. +[ASS1_19:BARON5] +Da lang! -{=================================== MISSION TABLE SALH2 ===================================} +[ASS1_20:BARON5] +Tommy, ich hab ein Problem mit Quentin, nicht mit dir, Mann! -[SALH2AA:SALH2] -~w~Hey, Sal! Ich bin's... Toni. +{=================================== MISSION TABLE BIKE1 ===================================} -[SALH2AB:SALH2] -~w~Toni! Schön, deine Stimme zu hören, Junge. +[BM1_A:BIKE1] +Wo ist Baker? -[SALH2AC:SALH2] -~w~Die Säcke lassen keinen Besuch zu mir! +[BM1_B:BIKE1] +Ich suche Big Mitch Baker... -[SALH2AD:SALH2] -~w~Hör mal, es gibt 'nen Haufen Zeug zu tun. +[BM1_C:BIKE1] +Wer sucht ihn? -[SALH2AE:SALH2] -~w~Paulie Sindacco, zum Beispiel. Seine Familie ist erledigt in dieser Stadt. +[BM1_D:BIKE1] +Tommy Vercetti. -[SALH2AF:SALH2] -~w~Aber er denkt, er kann einfach abhauen, als ob er keine Verpflichtungen hätte. +[BM1_E:BIKE1] +Vercetti. -[SALH2AG:SALH2] -~w~Wegen dem Drecksack sitz ich im Loch! +[BM1_F:BIKE1] +Du siehst nicht wie ein Bulle aus, das heißt, du hast 1 Minute. -[SALH2AH:SALH2] -~w~Zieh den Hurensohn zur Rechenschaft. +[BM1_G:BIKE1] +Also drück auf die Tube. -[SALH2O1:SALH2] -~w~Fang Paulie Sindacco am ~y~Generatorenhaus~w~ des Cochrane Dam ab. +[BM1_H:BIKE1] +Kent Paul sagt, ihr wãrt interessiert, die Security für einen Gig zu übernehmen, den er plant. -[SALH2F1:SALH2] -~r~Er ist entkommen! Salvatore wird nicht begeistert sein! +[BM1_I:BIKE1] +Kent Paul? Pfff! Kein Wunder, dass er dich schickt. -[SALH2CA:SALH2] -~w~Ihr Idioten! Das ist Toni Cipriani! Macht ihn fertig! +[BM1_J:BIKE1] +Als er das letzte Mal hier war, ist er durch Fenster wieder gegangen - und zwar splitternackt. -[SALH2BA:SALH2] -~w~Hey, Toni! Warum schwimmst du nicht her und leckst mich am Arsch? +[BM1_K:BIKE1] +Seid ihr nun interessiert oder nicht? -[SALH2BB:SALH2] -~w~Hey, hier bin ich, Arschloch! +[BM1_L:BIKE1] +Gefãlligkeiten gibt's nur für Mitglieder. -[SALH2BI:SALH2] -~w~Bestell Salvatore schöne Grüße. Ich schick ihm 'ne Postkarte! +[BM1_M:BIKE1] +Wie kann ich beitreten? -[SALH2BC:SALH2] -~w~Und was machst du jetzt, Trottel? +[BM1_N:BIKE1] +Wir sind hier kein Golfklub, Kleiner. Kannst du 'n Bike fahren? -[SALH2BE:SALH2] -~w~Du bist ein toter Mann! +[BM1_O:BIKE1] +Kannst du auf 'm Barhocker sitzen und saufen? -[SALH2BF:SALH2] -~w~Du bist ein Nichts! +[BM1_P:BIKE1] +Cougar, Zeppelin, checkt mal ab, wie diese Sissy hier fãhrt. -[SALH2BG:SALH2] -~w~Überraschung! Drecksack! +[BM1_2:BIKE1] +~g~Du brauchst eine Freeway oder eine Angel, um mitzumachen! -[SALH2BH:SALH2] -~w~Ladies and gentlemen, Paulie Sindacco has left the building! +[BM1_3:BIKE1] +~r~Die Fahrer wurden angegriffen! -[SALH2BD:SALH2] -~w~Du hast keine Chance, mich zu kriegen, Arschgesicht! +[BIKE1_1:BIKE1] +Ok, Schickimickibürschchen, dann zeig mal, was du drauf hast. -[SALH2O2:SALH2] -~w~Schalte ~r~Paulie Sindacco~w~ aus. Lass ihn nicht entkommen! +[BM1_1:BIKE1] +~g~Schnapp dir eine Freeway oder eine Angel und geh in Startposition. -[SALH2O3:SALH2] -Schnapp dir einen fahrbaren Untersatz und erledige ~r~Paulie~w~ vom Ufer aus. +{=================================== MISSION TABLE BIKE2 ===================================} -{=================================== MISSION TABLE SALH3 ===================================} +[BM2_2:BIKE2] +~g~Du musst den Chaosmesser in der vorgegebenen Zeit vollmachen, um uns zu zeigen, aus welchen Holz du bist! -[SALH3_1:SALH3] -~w~Sal? Wie geht's? +[BM2_4:BIKE2] +~r~Du hast den Chaosmesser nicht rechtzeitig vollgemacht! -[SALH3_2:SALH3] -~w~Scheiß bene! Einfach super! +[BM2_1:BIKE2] +CHAOSMESSER: -[SALH3_3:SALH3] -~w~Erstens: Der neue Bürgermeister hat gedeichselt, dass ich nicht gegen Kaution rauskomme. +[BM2_A:BIKE2] +Ha, ha, ha, hab dich wieder erwischt. -[SALH3_4:SALH3] -~w~Zweitens: Wir stecken immer noch im Krieg mit den verfluchten Triaden und Diablos. +[BM2_B:BIKE2] +Hey, Vercetti. -[SALH3_5:SALH3] -~w~Drittens: Ich hab läuten hören, dass die geschissenen Yakuza die Stadt übernehmen wollen. +[BM2_C:BIKE2] +Cougar meint, du fãhrst ziemlich gut. -[SALH3_6:SALH3] -~w~Ansonsten ist alles in bester Ordnung! +[BM2_D:BIKE2] +Ja, wie lange soll ich noch hier rumgurken? -[SALH3_7:SALH3] -~w~Jahrelang hatte der Mob die Herrschaft und jetzt haben wir alles sauber verschissen! +[BM2_E:BIKE2] +Ich bin ein sehr beschãftigter Mann. -[SALH38:SALH3] -~w~Boss, ich kann das alles richten. +[BM2_F:BIKE2] +Wenn ich mich kloppen soll, damit das klar geht, dann los. -[SALH39:SALH3] -~w~Die Yakuza haben ein Riesenwaffenarsenal in Aspatria. +[BM2_G:BIKE2] +Es geht bei uns nicht nur ums dreinschlagen. Man muss zur Familie gehören. -[SALH310:SALH3] -~w~Die hält jetzt keiner mehr auf! +[BM2_H:BIKE2] +Ja, ich hab schon mal zu einer Familie gehört. Hat nicht funktioniert. -[SALH311:SALH3] -~w~Das werden wir sehen. +[BM2_I:BIKE2] +Klar. Aber unsere Familie kümmert sich um ihre Leute. -[SALH3_A:SALH3] -~w~Fahr zu dem ~y~Yakuza-Gelände. +[BM2_J:BIKE2] +Wir verlangen nicht, dass einer die Drecksarbeit macht und danach 15 Jahre einsitzt. -[SALH3C1:SALH3] -~w~Finde einen Weg auf das ~y~Gelände. +[BM2_K:BIKE2] +Ja, ganz recht. Ich hab meine Hausaufgaben gemacht. -[SALH3C2:SALH3] -~w~Heilige Scheiße! Das gibt's doch nicht! +[BM2_L:BIKE2] +Das hier ist die größte Familie von Außenseitern, Outlaws und Unruhestiftern. -[SALH3C3:SALH3] -~w~Zerstöre den ~r~Panzer! +[BM2_M:BIKE2] +Ein paar von uns wurden sogar von ihrem eigenen Land verraten. -[SALH3C4:SALH3] -~w~Verdammt, was...?! +[BM2_N:BIKE2] +Wãhrend des Vietnamkriegs war ich eingelocht. Miese Sache. -[SALH3C5:SALH3] -~w~Macht ihn fertig! +[BM2_O:BIKE2] +Drum sollst du denen ja zeigen, was Sache ist. -[SALH3C6:SALH3] -~w~Der ~r~Panzer ~w~ist gut geschützt. Normale Waffen können gegen dieses schwere Stück Material nichts ausrichten! +[BM2_P:BIKE2] +Dieses ganze verdammte Land braucht einen Arschtritt, und wir geben ihm diesen Tritt. -[SALH3G1:SALH3] -~w~Hey, Freundchen, da drin ist nichts für dich. +[BM2_Q:BIKE2] +Also los, schnapp dir ein Bike und zeig der Stadt, wie sauer du bist. -[SALH3G2:SALH3] -~w~Zugang nur für Yakuza, wenn ich das recht sehe! - -[SALH3G3:SALH3] -~w~Mach dich vom Acker! - -[SALH3_B:SALH3] -~w~Das Yakuza-Auto hat sie getäuscht! - -[SALH3_C:SALH3] -~w~Fahr auf das ~y~Gelände~w~ und sieh dich um. - -{=================================== MISSION TABLE SALH4 ===================================} - -[SALH4_1:SALH4] -~w~Sal? Bist du da? - -[SALH4_2:SALH4] -~w~Anthony! Ich komme hier raus! - -[SALH42A:SALH4] -~w~Heute ist meine Vorverhandlung! - -[SALH4_3:SALH4] -~w~Super! - -[SALH44C:SALH4] -~w~Ja, Toni. Wenn du meinst. - -[SALH44E:SALH4] -~w~Hey, da kommen die Wachen... Wir sehen uns am Eingang. - -[SALH4_5:SALH4] -~w~Beschaff dir einen Streifenwagen! - -[SALH45A:SALH4] -~w~Du brauchst einen Streifenwagen, sonst wird der Konvoi misstrauisch! - -[SALH4_6:SALH4] -~w~Bring dich vor dem ~y~Polizeirevier~w~ in Stellung. - -[SALH4_7:SALH4] -~w~Heilige Scheiße! - -[SALH4_8:SALH4] -~w~Schütze den ~b~Transporter~w~ und sorg dafür, dass er heil ankommt! - -[SALH4_9:SALH4] -~w~Entferne dich nicht zu weit von dem ~b~Transporter! - -[SALH410:SALH4] -~w~Gleich verlierst du den ~b~Transporter! - -[SALH411:SALH4] -~r~Du hast den Transporter verloren! Sal wurde hingerichtet! - -[SALH412:SALH4] -~r~Der Transporter wurde zerstört! - -[SALH413:SALH4] -~w~Reiz die Bullen nicht - sonst kommt Sal nicht gegen Kaution raus! - -[SALH416:SALH4] -~w~Gib dem ~b~Konvoi~w~ bis zu seinem Ziel Geleitschutz. - -[SALH417:SALH4] -~r~Du hast es vermasselt! Die Cops haben die Vorverhandlung abgesagt! - -[SALH420:SALH4] -~r~Sal wurde getötet! - -[SALH421:SALH4] -~r~Du hast den Transporter verloren! - -[SALH422:SALH4] -~w~Häng die Bullen ab, sonst lenkst du zu viel Aufmerksamkeit auf den Konvoi! - -[SALH424:SALH4] -~w~Zerstöre die ~y~Straßensperre! - -[SALH415:SALH4] -~w~Schön, wieder ein freier Mann zu sein. - -[SALH418:SALH4] -~w~Aber hör zu, ich fahr nach Hause und zieh mir diese stinkenden Lumpen aus, okay? - -[SALH419:SALH4] -~w~Wir treffen uns bei mir. - -[SALH414:SALH4] -~w~Illegale Straßensperre in dieser Gegend gemeldet... - -[SALH44A:SALH4] -~w~Solange ich hier drin sitze, wer soll sie aufhalten? - -[SALH4_4:SALH4] -~w~Ja, aber ich hab den Verdacht, die Sizilianer wollen nicht, dass ich im Gericht ankomme. - -[SALH44B:SALH4] -~w~Hey, da müssen sie erst mal mit mir fertig werden, Sal. - -[SALH44D:SALH4] -~w~Sorg einfach dafür, dass ich zu meinem Gerichtstermin komme! - -{=================================== MISSION TABLE SALH5 ===================================} - -[SALH51A:SALH5] -~w~Gib Gas, Toni! - -[SALH51B:SALH5] -~w~Wenn du mich fragst, haben es die Sizilianer auf den Bürgermeister abgesehen. - -[SALH51C:SALH5] -~w~Wir müssen ihnen zuvorkommen. - -[SALH511:SALH5] -~w~Das sieht nicht gut aus. - -[SALH554:SALH5] -~w~Gib Gas, Toni! - -[SALH512:SALH5] -~w~Du hast ~b~Sal~w~ zurückgelassen - hol ihn! - -[SALH513:SALH5] -~w~Verdammt! Sie sind schon da! - -[SALH560:SALH5] -~w~Mach sie fertig, Toni! - -[SALH561:SALH5] -~w~Ich schnapp mir den Bürgermeister! - -[SALH514:SALH5] -~w~Die elenden Bastarde haben ihn schon! - -[SALH555:SALH5] -~w~Komm, Toni! Hier lang! - -[SALH515:SALH5] -~w~Da sind sie! - -[SALH517:SALH5] -~w~Wo sind die Bastarde hergekommen? - -[SALH556:SALH5] -~w~Hinter uns, Toni! - -[SALH562:SALH5] -~w~Toni, da vorn! - -[SALH519:SALH5] -~w~Toni! Schalte den Hubschrauber aus! - -[SALH522:SALH5] -~w~Die denken, die können sich beim Leuchtturm verstecken! - -[SALH557:SALH5] -~w~Mach die Bastarde fertig! - -[SALH558:SALH5] -~w~Klasse geschossen, Toni! - -[SALH559:SALH5] -~w~Bringen wir die Sache zu Ende. - -[SALH526:SALH5] -~w~Ich fahre! Du hältst sie uns vom Leib! - -[SALH527:SALH5] -~w~Okay, Toni... jetzt gilt's. - -[SALH528:SALH5] -~w~Wie viele von den Bastarden sind auf diesem Felsen? - -[SALH553:SALH5] -~w~Kaum erschießt du einen, schon beißt dir der nächste in den Arsch! - -[SALH523:SALH5] -~r~Du hast Salvatore der Mordlust der Sizilianer ausgeliefert! - -[SALH524:SALH5] -~r~Salvatore wurde getötet! - -[SALH552:SALH5] -~r~Der Bürgermeister wurde getötet! - -[SALH573:SALH5] -~r~Du hast dein Boot zerstört! Du hast sie verloren! - -[SALH516:SALH5] -~w~Take out the guards and then let's get after them in that boat! - -[SALH518:SALH5] -~w~Another ~r~boat~w~ incoming... - -[SALH525:SALH5] -~w~Ha! They've left a rocket launcher on this thing! - -[SALH520:SALH5] -~y~I'll move closer to shore so we're more protected... Take it down! - -[SALH521:SALH5] -~w~Good work! Let's move out! - -[SALH53A:SALH5] -~w~Torini... typisch. - -[SALH53B:SALH5] -~w~Lass ihn los! - -[SALH53C:SALH5] -~w~Der Bürgermeister gehört mir! - -[SALH53D:SALH5] -~w~DIESE STADT gehört mir! - -[SALH53E:SALH5] -~w~Salvatore... - -[SALH53F:SALH5] -~w~Sizilien wollte nie questo schifo di citta. - -[SALH53G:SALH5] -~w~Aber als die Zahlungen ausblieben, was sollten wir machen...? - -[SALH53H:SALH5] -~w~Das war nichts Persönliches. - -[SALH53I:SALH5] -~w~Nichts Persönliches? - -[SALH53J:SALH5] -~w~Nach dem, was ihr mir angetan habt! - -[SALH53K:SALH5] -~w~Ich reiß dir das scheiß Herz aus dem Leib! - -[SALH5TD:SALH5] -~w~Schieß ~r~Massimos Helikopter~w~ ab! - -[SALH5MO:SALH5] -~r~Massimo~w~ verschwindet! - -[SALH5GO:SALH5] -~r~Massimo ist entkommen! - -[SALH571:SALH5] -~w~Du musst zum ~y~Pier. - -[SALH570:SALH5] -~w~Erledige diese ~r~sizilianischen Mafiosi! - -[SALH572:SALH5] -~w~Erledige diesen ~r~sizilianischen Gangster! - -[SALH510:SALH5] -~w~Fahr zum ~y~Rathaus~w~. Und Vorsicht vor sizilianischen Gangstern! - -[SICI_01:SALH5] -Nein, ich melde mich später... - -[SICI_04:SALH5] -Hey, wir sind beide wieder da! - -[SICI_05:SALH5] -Wir haben's geschafft, hm? - -[SICI_06:SALH5] -Stimmt. - -[SICI_07:SALH5] -Wir haben mit den Forellis aufgeräumt. - -[SICI_08:SALH5] -Die Sindaccos haben wir in die Wüste geschickt. - -[SICI_09:SALH5] -Jetzt rufen die Sizilianer an, dass sie Frieden wollen. - -[SICI_10:SALH5] -Den wollen wir alle! Aber meinen, nicht deren scheiß Frieden. - -[SICI_11:SALH5] -Jetzt bin ich am Ruder. - -[SICI_12:SALH5] -Und kein Trottel aus der alten Heimat macht mir Vorschriften. - -[SICI_13:SALH5] -Ich hab ihnen gesagt, sie sollen sich verpissen. - -[SICI_14:SALH5] -Was? War das klug? - -[SICI_15:SALH5] -Hey, ich bin jetzt der Boss. Ich! - -[SICI_16:SALH5] -Fahren wir zum Bürgermeister, damit er die Anklage gegen mich zurückzieht. - -[FIN1_01:SALH5] -Hey, Bürgermeister! - -[FIN1_03:SALH5] -Ja, danke. - -[FIN1_04:SALH5] -Und das heißt... - -[FIN1_05:SALH5] -Äh, dass die Stadt Ihnen dankbar ist? - -[FIN1_06:SALH5] -Noch mal von vorn. - -[FIN1_07:SALH5] -Dass Sie für mich arbeiten, klar? - -[FIN1_08:SALH5] -Ach ja, dass ich für Sie arbeite. - -[FIN1_09:SALH5] -Gut. Rufen Sie uns nicht an, wir rufen Sie an. - -[FIN1_10:SALH5] -Raus mit dir, du Penner. - -[FIN1_11:SALH5] -Danke, Mr. Leone. - -[FIN1_12:SALH5] -Toni, es ist geschafft. Wir zwei haben jetzt das Sagen. - -[FIN1_13:SALH5] -Wir sind ein Team, hm? - -[FIN1_14:SALH5] -Du musst nur noch eine letzte Kleinigkeit für mich tun. - -[FIN1_15:SALH5] -Ich hab ein paar Unannehmlichkeiten am Hals... - -[FIN2_01:SALH5] -Hey, Onkel! Wie geht's? - -[FIN2_02:SALH5] -Siehst gut aus. - -[FIN2_03:SALH5] -Ah, Salvatore. Wir wollten nur Klarheit schaffen. - -[FIN2_04:SALH5] -Ja, Onkel. Das finde ich gut. - -[FIN2_07:SALH5] -Gut, sehr gut. - -[FIN2_08:SALH5] -Verschlagener alter Sack. - -[FIN2_09:SALH5] -Ich trau dem Scheißkerl nicht über den Weg. - -[FIN2_23:SALH5] -Jedem lacht mal das Glück. - -[FIN2_10:SALH5] -Aber wir haben's geschafft. - -[FIN2_11:SALH5] -Ja, wir haben aufgeräumt. Hast echt gute Arbeit geleistet, Toni. - -[FIN2_12:SALH5] -Ich wusste immer, dass du was taugst. Hast mir oft die Haut gerettet. - -[FIN2_13:SALH5] -Ich weiß solche Treue zu schätzen. - -[FIN2_14:SALH5] -Danke. - -[FIN2_15:SALH5] -Ein guter Arbeiter, respektvoll. Das mag ich. - -[FIN2_19:SALH5] -Ist Freundschaft nicht unbezahlbar? - -[FIN2_20:SALH5] -Eine wie die zwischen uns beiden? - -[FIN2_21:SALH5] -Schäm dich! Komm her. - -[FIN2_22:SALH5] -Bist ein guter Junge, aber schäm dich. - -[SICI_02:SALH5] -- Hey, Toni! ~n~ - Sal! Du bist wieder da, wo du hingehörst. - -[FIN2_05:SALH5] -- Dann hast du mit der alten Heimat Frieden geschlossen? ~n~ - Klar, ich und alle meine Leute. - -[FIN2_16:SALH5] -- Also kriegst du die halbe Million, wie versprochen. ~n~ - 'ne halbe? Hast du nicht 'ein paar' gesagt? - -[FIN2_18:SALH5] -Ich habe eine Million gesagt! Aber was soll's? - -[FIN1_02:SALH5] -Wir haben Sie eben vor diesem Haufen irrer Sizilianer gerettet. - -{=================================== MISSION TABLE DONH1 ===================================} - -[DONH1JA:DONH1] -~w~Toni, mein Ex-Mentor Avery Carrington trifft heute im Flieger ein. - -[DONH1JB:DONH1] -~w~Mir ist zu Ohren gekommen, dass er für die Panlantic Corporation arbeitet. - -[DONH1JC:DONH1] -~w~Die tun alles, um an eine 1-A-Immobilie ranzukommen. - -[DONH1JD:DONH1] -~w~Wir müssen seine Grunderwerbspläne in die Finger kriegen. - -[DONH1JE:DONH1] -~w~Häng dich an ihn dran, Toni! - -[DONH1CA:DONH1] -~w~Äh, Toni, wie wär's mit einem Fahrzeug? - -[DONH1DA:DONH1] -~w~Zum Flughafen, Toni. - -[DONH1DB:DONH1] -~w~Jede Minute ist kostbar. - -[DONH1EA:DONH1] -~w~Für diesen Einfall muss ich mich selbst loben. - -[DONH1EB:DONH1] -~w~Ich übertreffe mich mal wieder. - -[DONH1EC:DONH1] -~w~Ich werde damit ein Vermögen machen. - -[DONH1ED:DONH1] -~w~Jawohl, ein Vermögen. - -[DONH1EE:DONH1] -~w~Selbst Avery wäre stolz. - -[DONH1GA:DONH1] -~w~Da ist er! - -[DONH1GB:DONH1] -~w~Leg ihn um, Toni! - -[DONH1GC:DONH1] -~w~Ich brauche die Pläne! - -[DONH1HA:DONH1] -~w~Bitte, Toni. Er entwischt! - -[DONH1IA:DONH1] -~w~Kapitale Leistung, Toni! Wortwörtlich! - -[DONH1IB:DONH1] -~w~Los, begeben wir uns damit in die Sicherheit meines, äh, Refugiums. - -[DONH1O0:DONH1] -~w~Fahr Donald Love zum ~y~Flughafen. - -[DONH1O1:DONH1] -~w~Beseitige ~r~Avery Carrington~w~ und klau die Pläne! - -[DONH1O2:DONH1] -~r~Avery~w~ haut ab! Halte ihn auf! - -[DONH1O3:DONH1] -~r~Avery~w~ nimmt ein anderes Fahrzeug. Lass ihn nicht entkommen! - -[DONH1O4:DONH1] -~r~Avery~w~ haut ab! Schnapp ihn dir! - -[DONH1O5:DONH1] -~w~Hol ~b~Donald Love~w~ ab. - -[DONH1O6:DONH1] -~w~Gute Arbeit! Nimm die ~g~Pläne~w~ auf. - -[DONH1O7:DONH1] -~w~Bring Donald und die Pläne zurück zur ~y~Absteige. - -[DONH1O8:DONH1] -~w~Du hast die ~g~Pläne~w~ verloren! Kehr um und hol sie. - -[DONH1OA:DONH1] -~w~Sie sind hinter dir her! ~r~Avery~w~ haut ab! Leg ihn um! - -[DONH1OB:DONH1] -~w~Du brauchst ein Fahrzeug. - -[DONH1OC:DONH1] -~w~Verliere ~b~Donald~w~ nicht! - -[DONH1OD:DONH1] -~w~Vorsicht! Die Pläne sind futsch, wenn ~r~Averys Auto~w~ zerstört wird, solang er drin sitzt! - -[DONH1OE:DONH1] -~r~Avery Carrington~w~ entkommt. Los, hinterher! - -[DONH1F0:DONH1] -~r~Die Pläne wurden vernichtet! - -[DONH1F1:DONH1] -~r~Avery Carrington ist entkommen! - -[DONH1F2:DONH1] -~r~Donald ist tot! - -[DONH1OF:DONH1] -~r~Avery Carrington~w~ ist fast an seinem Ziel angekommen. Halte ihn auf! - -[DONH1O9:DONH1] -~w~Lass ~b~Donald~w~ nicht zurück! Diese Kolumbianer legen ihn um! - -[DONH1FA:DONH1] -~w~Hmm, die Panlantic lässt Avery offenbar vom Kartell beschützen. - -[LAND_01:DONH1] -Ich weiß, was du denkst, Toni. Hochmut kommt vor dem Fall. - -[LAND_02:DONH1] -Aber das ist nur ein vorübergehendes Tief. - -[LAND_03:DONH1] +[BM2_R:BIKE2] Alles klar. -[LAND_04:DONH1] -Ach, tu nicht so pikiert. +[BM2_3:BIKE2] +~g~Dieser Ton zeigt an, dass du einen Teil gefüllt hast. Mach ihn immer voller. -[LAND_05:DONH1] -Ich weiß, es war ekelhaft von mir, zu sagen, dass es deine Schuld war, +{=================================== MISSION TABLE BIKE3 ===================================} -[LAND_06:DONH1] -doch Hybris ist ein ekelhafter Bettgefährte - fast so eklig wie Termiten. +[BM3_A:BIKE3] +Hi, Mitch. -[LAND_07:DONH1] -Und, glaub mir, ich habe beide genossen. +[BM3_B:BIKE3] +Ah, sieh an, 'Outlaw' Vercetti. -[LAND_08:DONH1] -Wart's ab, wir beide sind bald wieder da! +[BM3_C:BIKE3] +Jetzt will ich sehen, wie du für deine Kumpels kãmpfst. -[LAND_09:DONH1] -Ich war nie weg. +[BM3_D:BIKE3] +Eine Straßengang von hier hat den Fehler gemacht, meinen Hobel zu klauen. -[LAND_10:DONH1] -Wir sitzen in einem Boot, Amigo. +[BM3_E:BIKE3] +Wollten wahrscheinlich zeigen, was für coole Machos sie sind. -[LAND_11:DONH1] -Nein. +[BM3_F:BIKE3] +Ich und die Jungs wollten ihnen eigentlich ein bisschen Respekt einblãuen. -[LAND_12:DONH1] -Bitte! +[BM3_G:BIKE3] +Aber- -[LAND_13:DONH1] -'Bitte'? Vergessen Sie's, Freundchen. +[BM3_H:BIKE3] +-dann dachte ich mir, das wãre doch ein guter Test für dich. -[LAND_18:DONH1] -Komm - ich erzähl's dir im Auto. +[BM3_I:BIKE3] +Bring mir meine Maschine zurück und Paul kriegt seine Security. -[LAND_19:DONH1] -Du hast deins doch dabei? Meins ist, äh, in der Inspektion. +[BM3_2:BIKE3] +~r~Du solltest die Maschine zurückbringen, nicht schrotten! -[LAND_16:DONH1] -- 10% wovon? Davon? Sie sind zu gütig. ~n~ - Nein! Von 'ner richtig großen Sache. +[BM3_3:BIKE3] +~g~Bring die Maschine zur Bar! -[LAND_14:DONH1] -- 'Es war nur deine Schuld.' Erbärmlich. ~n~ - 10%? +[BM3_4:BIKE3] +~g~Setz dich auf die Maschine! -{=================================== MISSION TABLE DONH2 ===================================} +[INTRUDE:BIKE3] +~g~Man hat dich bemerkt! -[DONH2_1:DONH2] -~w~Begib dich zur ~y~Kirche~w~ auf Staunton Island. +[BM3_6:BIKE3] +~g~Sie sind Downtown hinter dem Ammu-Nation. -[DONH2_2:DONH2] -~w~Verprügle den ~r~Reporter ~w~oder erzwinge mit vorgehaltener Waffe die Fotos von ihm. +[BM3_7:BIKE3] +~g~Du brauchst eine schnelle Maschine, um auf das Dach zu gelangen. -[DONH2_3:DONH2] -~w~Du hast Fotos von mir. Wo sind sie? +[BM3_8:BIKE3] +~g~Spring mit dem Bike von diesen Stufen auf das Dach auf der anderen Seite der Straße. -[DONH2_4:DONH2] -~w~Tu mir bitte nichts! +[BM3_1:BIKE3] +~g~Eine Gang hat Mitch Bakers Maschine geklaut. Beschaff sie ihm wieder! -[DONH2_5:DONH2] -~w~Wo sind die verdammten Fotos!? +[BM3_9:BIKE3] +~g~Schnapp dir Mitchs Maschine und mach dich aus dem Staub! -[DONH2_6:DONH2] -~w~Ich weiß nicht, wovon du redest! +{=================================== MISSION TABLE BMX_1 ===================================} -[DONH2_7:DONH2] -~w~Wo sind sie? +[GETBIK2:BMX_1] +Du hast ~1~ Sekunden, um auf ein Gelãndemotorrad zu steigen! -[DONH2_8:DONH2] -~w~Bitte! Nicht! +{=================================== MISSION TABLE BOATBUY ===================================} -[DONH2_9:DONH2] -~w~Mach schon, du Memme! Rück sie raus! +[DRUG_1:BOATBUY] +Hallo? Hal-lo?! Hallo? -[DONH210:DONH2] -~w~Okay! Okay! +[DRUG_13:BOATBUY] +Meister? -[DONH2EX:DONH2] -~w~Du kriegst die Fotos! +[DRUG_2:BOATBUY] +Mach aus. Da kommt einer. -[DONH211:DONH2] -~w~Ich hab den Film in meinem Versteck! +[DRUG_3:BOATBUY] +Tag, Herr Anzugmensch. Sie müssen der neue Eigentümer sein. -[DONH212:DONH2] -~w~Fahr zum ~y~Versteck des Reporters. +[DRUG_4:BOATBUY] +Ja. Welches von den Booten ist das schnellste? -[DONH213:DONH2] -~w~Hilfe! Hilfe! Ich werde entführt! +[DRUG_5:BOATBUY] +Das ist schon im Wasser, Meister. -[DONH214:DONH2] -~w~Hilfe! Er bringt mich um! +[DRUG_6:BOATBUY] +Dachte mir, dass Sie es mal testen wollen. -[DONH215:DONH2] -~w~Ich bin zu begnadet, um zu sterben! +[DRUG_7:BOATBUY] +Das Ding hat jetzt schon 300 PS unter der Haube, Meister. -[DONH216:DONH2] -~w~Ich darf nicht sterben. Mein Roman ist nicht fertig! +[DRUG_8:BOATBUY] +Und mit dem Fiberglas-Rumpf - das Ding pfeift nur so durch die Wellen! -[DONH217:DONH2] -~w~Von so einer Scheiße hat mein Redakteur nichts gesagt! +[DRUG_9:BOATBUY] +In vier Sekunden von null auf sechzig Meilen, Meister. -[DONH218:DONH2] -~w~Rühr keinen Muskel, Arschkrätze! +[DRUG_10:BOATBUY] +Und im Rumpf kriegen Sie so 20 Ladungen vom besten jamaikanischen Gras unter. -[DONH219:DONH2] -~w~Stehen bleiben, du Flachwichser! +[DRUG_11:BOATBUY] +Nur zu, Chef, machen Sie 'ne Spritztour! -[DONH220:DONH2] -~w~Zum Kuckuck nochmal, bleib gefälligst hier! +[DRUG_12:BOATBUY] +Hey Anzugmensch, haben Sie mal Feuer? -[DONH221:DONH2] -~w~Toni! Endlich! +{=================================== MISSION TABLE CAP_1 ===================================} -[DONH222:DONH2] -~w~Ein Reporter hat Averys Exitus beobachtet! +[CAP1_B1:CAP_1] +~g~Die Mafia verlangt Schutzgeld von dir. Stöbere sie auf und erledige sie. -[DONH223:DONH2] -~w~Er hat Fotos! Herrgott, ich bin erledigt! +[CAP1_B2:CAP_1] +~g~Die Mafia verlangt von dir Schutzgeld für die Bootswerft! -[DONH224:DONH2] -~w~Regen Sie sich ab! Wo steckt dieser Reporter? +[CAP1_B3:CAP_1] +~g~Die Mafia verlangt von dir Schutzgeld für die Eiscremefabrik! -[DONH225:DONH2] -~w~Oh Toni, du bist ein Schatz! +[CAP1_B4:CAP_1] +~g~Die Mafia verlangt von dir Schutzgeld für das Autohaus! -[DONH226:DONH2] -~w~Wie es heißt, recherchiert er undercover in der Kirche auf Staunton Island. +[CAP1_B5:CAP_1] +~g~Die Mafia verlangt von dir Schutzgeld für das Taxiunternehmen! -[DONH227:DONH2] -~w~Hol die Fotos und beerdige ihn! +[CAP_01:CAP_1] +Ok, wo brennt's denn? -[DONH228:DONH2] -~r~Ned ist entwischt! +[CAP_02:CAP_1] +Wer war das? -[DONH230:DONH2] -~w~Beseitige ~r~Ned Burner. +[CAP_03:CAP_1] +Tommy... ein paar Mafia-Typen... sie wollen wiederkommen, ihren Anteil abkassieren. -[DONH231:DONH2] -~r~Ned starb, ehe du die Fotos kassiert hast! +[CAP_04:CAP_1] +Ein gewisser Mr. Forello hãtte dir Geld gegeben. Mir geht's schlecht. -[DONH229:DONH2] -Blödsinn! +[CAP_05:CAP_1] +Forelli? SONNY Forelli? -[DONCUTA:DONH2] -~w~Bitte sehr! Ich hab sie noch nicht entwickeln lassen. +[CAP_06:CAP_1] +Ja, so heißt er, glaube ich... ich konnte nichts gegen sie ausrichten. -[DONCUTB:DONH2] -~w~Du Stück Scheiße! +[CAP_07:CAP_1] +Keine Angst, mein Freund, ich mach dir keine Vorwürfe. -[DONH2SM:DONH2] -Angst +[CAP_08:CAP_1] +Bringt ihn ins Krankenhaus. -[DONH233:DONH2] -Schüchtere den Reporter weiter ein. Wenn sein Angstpegel fällt, könnte er versuchen, zu fliehen. +[CAP_09:CAP_1] +Tommy... mach den Kerl 'nen Kopf kürzer für mich... -[DONH2LB:DONH2] -~w~Du hast ~b~den Reporter ~w~zurückgelassen. Du musst ihn holen. +[CAP_10:CAP_1] +Ich mach ihn zwei Köpfe kürzer... -[DONH2LC:DONH2] -~r~Du hast den Reporter verloren. +[CAP1_2:CAP_1] +Du kennst die Regeln, Vercetti! -{=================================== MISSION TABLE DONH3 ===================================} +[CAP1_3:CAP_1] +Mr. Forelli bestellt schöne Grüße! -[DONH3I1:DONH3] -~w~Ich bin wieder da! +[CAP1_4:CAP_1] +Das ist der Harwood Butcher! -[DONH3I2:DONH3] -~w~Zurück von den Toten! Emporgestiegen wie ein Phönix aus der Asche. +[CAP1_5:CAP_1] +Sag Sonny, er soll mir vom Leib bleiben! -[DONH3I3:DONH3] -~w~Wie Lazarus. Jawohl, Lazarus Love! +[CAP1_6:CAP_1] +Vice City gehört nicht mehr ihm, sondern MIR! -[DONH3I4:DONH3] -~w~Bald bin ich wieder reich! +[CAP1_7:CAP_1] +Du glaubst, du kannst mich vom Thron stürzen, Vercetti? -[DONH3I5:DONH3] -~w~Die Panlantic wird mir ein Vermögen dafür zahlen, dass der Deal steigt! +[CAP1_8:CAP_1] +Wir jagen dich bis ans Ende deiner Tage, Vercetti. -[DONH3I6:DONH3] -~w~Wir haben es geschafft, Toni! +[CAP1_9:CAP_1] +Du hast keine Chance, du irrer Idiot! -[DONH3I7:DONH3] -~w~Kann sein. +[CAP1_10:CAP_1] +Ich mach dich fertig, Vercetti. -[DONH3I8:DONH3] -~w~Zeit für eine kleine Soiree mit einer hochexklusiven Gästeliste. +[CAP1_11:CAP_1] +Du warst schon immer ein Schwachkopf. -[DONH3I9:DONH3] -~w~Komm! +[CAP1_12:CAP_1] +Du wirst dran glauben, Vercetti. -[DONH3C1:DONH3] -~w~Wir brauchen ein Transportmittel, Toni. Wir haben nicht viel Zeit. +[CAP1_B6:CAP_1] +~g~Du hast den Eintreiber gefunden, erledige ihn. -[DONH3L1:DONH3] -~w~Du brauchst ~b~Donald.~w~ Kehr um und hol ihn! +[CAP1_B7:CAP_1] +~g~Du hast den Eintreiber verloren. -[DONH3L2:DONH3] -~w~Los, Toni! Wir müssen uns sputen! +[CAP1_B8:CAP_1] +~r~Der Eintreiber verlangt für all deine Geschãfte Schutzgeld. -[DONH3L3:DONH3] -~w~Bring die Leiche zurück! +[CAP1_B9:CAP_1] +~g~Die Mafia verlangt Schutzgeld für das Malibu! -[DONH3_5:DONH3] -~w~Toni, das wird eine todschicke Party. +[CAP1_B0:CAP_1] +~g~Die Mafia verlangt Schutzgeld für das Filmstudio! -[DONH35D:DONH3] -~w~Mit schick toten Gästen. +[CAP1_C2:CAP_1] +~g~Die Mafia ist bei der Bootswerft angekommen! -[DONH35A:DONH3] -~w~Suche eine ~b~Leiche. +[CAP1_C3:CAP_1] +~g~Die Mafia ist bei der Eiscremefabrik angekommen! -[DONH35B:DONH3] -~w~Hol ~b~Averys Leiche. +[CAP1_C4:CAP_1] +~g~Die Mafia ist bei dem Autohaus angekommen! -[DONH35C:DONH3] -~w~Hol ~b~Neds Leiche. +[CAP1_C5:CAP_1] +~g~Die Mafia ist bei dem Taxiunternehmen angekommen! -[DONH3_6:DONH3] -~w~Schaffe Donald und Avery zum ~y~Flughafen. +[CAP1_C9:CAP_1] +~g~Die Mafia ist im Malibu Club angekommen! -[DONH36A:DONH3] -~w~Hey! Bring den Krankenwagen zurück! +[CAP1_C0:CAP_1] +~g~Die Mafia ist im Filmstudio angekommen! -[DONH36B:DONH3] -~w~Avery. +[CAP1_D2:CAP_1] +~g~Die Mafia verlãsst die Bootswerft! -[DONH36C:DONH3] -~w~Was bist du seit unserem letzten Treffen gealtert! +[CAP1_D3:CAP_1] +~g~Die Mafia verlãsst die Eiscremefabrik! -[DONH36D:DONH3] -~w~Du füttertest mich stets mit Perlen der Weisheit +[CAP1_D4:CAP_1] +~g~Die Mafia verlãsst das Autohaus! -[DONH36E:DONH3] -~w~und bald werde ich wieder speisen! +[CAP1_D5:CAP_1] +~g~Die Mafia verlãsst das Taxiunternehmen! -[DONH36F:DONH3] -~w~Mein Gott! Er trägt ein Toupet! +[CAP1_D9:CAP_1] +~g~Die Mafia verlãsst den Malibu Club! -[DONH36G:DONH3] -~w~Toni, bring mich und Avery zu seinem Privatjet am Flughafen. +[CAP1_D0:CAP_1] +~g~Die Mafia verlãsst das Filmstudio! -[DONH3_7:DONH3] -~w~Bring Donald und Ned zum ~y~Flughafen. +[CAP1B10:CAP_1] +Du hast die Eintreiber erledigt. Es kommen weitere. -[DONH37F:DONH3] -~w~Toni, bring mich und Ned zum Flughafen. +{=================================== MISSION TABLE CARBUY ===================================} -[DONH37A:DONH3] -~w~Hey! Der Typ klaut die Leiche! +[CAR1_1:CARBUY] +B.J. Smith. Und Sie müssen Mr. Vercetti sein. -[DONH37B:DONH3] -~w~Ned Burner, Superreporter. +[CAR1_2:CARBUY] +Soll ich Sie herumführen? -[DONH37C:DONH3] -~w~Ach, Ned. Ich gebe Ihnen die Exklusivrechte an +[CAR1_3:CARBUY] +Warum nicht? -[DONH37D:DONH3] -~w~meiner wunderbaren Party. +[CAR1_4:CARBUY] +Tja, ich verkaufe das Autohaus ja eigentlich nur ungern. -[DONH37E:DONH3] -~w~Und ich lade längst nicht jeden auf meine kleine Sause ein. +[CAR1_5:CARBUY] +War meine erste Investition, nachdem ich Football-Profi wurde. -[DONH37G:DONH3] -~w~Die Auswahlkriterien sind tödlich. +[CAR1_6:CARBUY] +Aber es wird Zeit für eine Luftverãnderung. -[DONH3_8:DONH3] -~w~Bring Averys Leiche zum ~y~Flughafen. +[CAR1_7:CARBUY] +Sie verlassen die Stadt? -[DONH3_9:DONH3] -~w~Bring Neds Leiche zum ~y~Flughafen. +[CAR1_8:CARBUY] +Nicht in allzu großer Eile, hoffe ich doch? -[DONH3A1:DONH3] -~w~Schaff Averys gammeligen Kadaver her, ehe uns die Wachleute entdecken. +[CAR1_9:CARBUY] +Nein, ich bereite mich nur auf mein Comeback als Football-Profi vor. Ich hatte schon aufgehört. -[DONH3A2:DONH3] -~w~Seine Obduktion beginnt jeden Augenblick. +[CAR1_10:CARBUY] +Das Geschãft lief nicht allzu gut. -[DONH3N1:DONH3] -~w~Schaff Ned Burners Leiche her, ehe uns die Wachleute entdecken. Er soll jeden Augenblick bestattet werden. +[CAR1_11:CARBUY] +Da haben sich meine Angestellten was einfallen lassen, -[DONH3F1:DONH3] -~r~Love ist tot. +[CAR1_12:CARBUY] +um ein bisschen was 'nebenbei' zu erwirtschaften. -[DONH3F2:DONH3] -~r~Du hast Averys Leiche verloren! +[CAR1_13:CARBUY] +Ich könnte den Laden auch dichtmachen, bevor ich ihn Ihnen verkaufe. -[DONH3F3:DONH3] -~r~Du hast Neds Leiche verloren! +[CAR1_14:CARBUY] +Ich könnte die Bude bei Bedarf sogar abfackeln. -[DONH3C2:DONH3] -~w~Die Airport Security wird Avery Carringtons Hangar um 22:00 Uhr absperren. +[CAR1_15:CARBUY] +Das ist erstklassiger Baugrund hier. -[DONH3F4:DONH3] -~r~Zu spät - die Airport Security hat den Hangar abgesperrt! +[CAR1_16:CARBUY] +Machen Sie sich mal keine Gedanken. -[DONH3F5:DONH3] -~r~Zu spät - die Airport Security hat Donald mit Averys Leiche gefunden! +[CAR1_17:CARBUY] +Der Laden ist genau das, was ich brauche. -[DONH3W1:DONH3] -~w~Beeil dich! Die Airport Security wird Avery Carringtons Hangar um 22:00 Uhr absperren. +[CAR1_18:CARBUY] +Ja. Dann kommen wir also ins Geschãft? -[DONH3F6:DONH3] -~r~Zu spät - die Airport Security hat Donald mit Neds Leiche gefunden! +{=================================== MISSION TABLE CARPAR1 ===================================} -{=================================== MISSION TABLE DONH4 ===================================} +[MM_1_A:CARPAR1] +~g~Passiere ~y~5 checkpoints~r~ OHNE irgendwelche ~r~Hütchen ~g~umzufahren! ~g~Die ~y~REIHENFOLGE IST BELIEBIG. -[DONH4A:DONH4] -~w~Donald schickt mich, 'ne äh, Bestellung abholen. +[CONE_1:CARPAR1] +~r~Du hast ein Hütchen umgefahren!! -[DONH4B:DONH4] -~w~Alles klar. - -[DON4EX1:DONH4] -~w~Ich hab, was ihr braucht. Kostet aber was. - -[DON4EX2:DONH4] -~w~Don meinte, du streckst es vor und er gibt's dir dann zurück. - -[DONH4C:DONH4] -~w~Sicher. - -[DONH4D:DONH4] -~w~Klar! Stell ihn doch zu Händen 'Leck mich' aus. - -[DONH4E:DONH4] -~w~Wo ist die Bestellung? - -[DONH4F:DONH4] -~w~Scheiße, Kleiner. Das dauert, bis sowas zusammengebastelt ist. - -[DON4EX4:DONH4] -~w~Ich melde mich. - -[DONH4G:DONH4] -Mission erfüllt! - -[DONH4_1:DONH4] -KEIN(E) - -[DONH4PS:DONH4] -~w~8-Ball wird sich melden, sobald die Waren fertig sind. - -{=================================== MISSION TABLE DONH5 ===================================} - -[DONH5_0:DONH5] -Van - -[DNH5_A0:DONH5] -~w~Mann, die Karre ist knallvoll, verstehst du? Fahr vorsichtig. - -[DNH5_A1:DONH5] -~w~Ja? Alles bestens. - -[DNH5_A2:DONH5] -~w~Klar. Ich verbinde. - -[DNH5_A3:DONH5] -~w~Toni, noch ein kleiner Job und wir schwimmen im Geld. - -[DNH5_A4:DONH5] -~w~Wir haben Pläne von Fort Staunton studiert. Die Schwachpunkte liegen entlang der alten U-Bahn, die drunter verläuft. - -[DNH5_A5:DONH5] -~w~Super, Don! Da muss ich nur an 100 beknackten Italienern vorbei. - -[DNH5_A6:DONH5] -~w~Einfach den Porter Tunnel entlang, dann findest du den Eingang schon. - -[DNH5_B0:DONH5] -~w~Hey! Du hast hier nichts zu suchen! - -[DNH5_B1:DONH5] -~w~Verschwinde gefälligst! - -[DNH5_C0:DONH5] -~w~Steig in den ~b~Van. - -[DNH5_C4:DONH5] -~w~Bring die ~y~Sprengkörper~w~ an! - -[DNH5_C5:DONH5] -~w~Bring die übrigen ~y~Sprengkörper~w~ an! - -[DNH5_C6:DONH5] -~w~Verschwinde durch den ~y~U-Bahn-Eingang! - -[DNH5_D0:DONH5] -~w~Die Forellis? Was machen die denn hier? - -[DNH5_D1:DONH5] -~w~Lass die Forellis nicht den Van schrotten! - -[DNH5_1:DONH5] -~w~Stoß das Tor mit einem Fahrzeug auf. - -[DONH5_2:DONH5] -~w~Ramm fester gegen das Tor! - -[DNH5_X0:DONH5] -~r~Der Van ist Schrott! - -[DNH5_C1:DONH5] -~w~Steig wieder in den ~b~Van. - -[DNH5_C2:DONH5] -~w~Fahr zu einem der ~y~Eingänge~w~ des Porter Road Tunnels. - -[DNH5_C3:DONH5] -~w~Folge dem ~y~Tunnel. - -[DNH5_E0:DONH5] -~w~Erledige die ~r~Bauarbeiter. - -[DNH5_E1:DONH5] -~w~Erledige den ~r~Bauarbeiter. - -[DNH5_E2:DONH5] -~w~Die Forellis haben dir den Rückweg abgeschnitten. Finde einen anderen ~y~Ausgang. - -[DNH5_E3:DONH5] -~w~Benutze ein Fahrzeug, um durch die Tore zu brettern und den ~y~Ausgang~w~ zu erreichen. - -[DNH5_X1:DONH5] -~r~Die Forellis haben den Van geschrottet! - -[DNH5_W1:DONH5] -~w~Geh nicht zu weit von dem ~b~Van~w~ weg! - -[DNH5_E4:DONH5] -~w~Hinterlasse keine ~r~Zeugen! - -{=================================== MISSION TABLE DONH6 ===================================} - -[DONH6_V:DONH6] -~r~v1.00 - -[DONH6_1:DONH6] -~w~Begib dich zum ~y~Haus. - -[DONH6_5:DONH6] -~w~Oh mein Gott! Toni! Tu was! - -[DONH6_6:DONH6] -~w~Du hast ~1~ Sekunden, um zu dem Anwesen zurückzukehren! - -[DONH6_7:DONH6] -Rückkehrzeit - -[DONH6_8:DONH6] -~r~Du bist nicht zur Villa zurückgekehrt. Donald wurde hingerichtet! - -[DONH610:DONH6] -~w~Besorg ein Auto! - -[DONH611:DONH6] -~w~Du lieber Gott! Noch mehr von denen! - -[DONH624:DONH6] -~w~Gas geben, Toni! - -[DONH612:DONH6] -~w~Geschafft! - -[DONH623:DONH6] -~w~Fahr mich zu Averys Jet. Er und Ned sind noch an Bord, also fliege ich nicht alleine. - -[DONH622:DONH6] -~w~Begib dich zu ~y~Averys Jet. - -[DONH613:DONH6] -~w~Wir müssen zum Flughafen. - -[DONH625:DONH6] -~w~Begib dich zum ~y~Flughafen. - -[DONH615:DONH6] -~w~Du hast ~b~Donald~w~ nicht dabei! Kehr um und hol ihn! - -[DONH619:DONH6] -~r~Donald ist tot! - -[DONH6_9:DONH6] -~w~D.? Kommen Sie! Los! - -[DONH614:DONH6] -~w~Ist die Luft wirklich rein, Toni? - -[DONH616:DONH6] -~w~Oh... mein...GARTEN! - -[DOH616A:DONH6] -~w~Was hast du meinem wunderbaren Garten angetan?! - -[DONH617:DONH6] -~w~D., machen wir den Garten oder die Fliege? Es liegt bei Ihnen. - -[DONH618:DONH6] -~w~Bring mich zum Flughafen! - -[DONH620:DONH6] -~w~Abschiede sind mir zuwider, mein Freund. - -[DOH620A:DONH6] -~w~Sagen wir einfach 'Adieu'. - -[DONH621:DONH6] -~w~D., es war... lehrreich. - -[DONH66S:DONH6] -~w~Du hast ~1~ Sekunde, um zu dem Anwesen zurückzukehren! - -[DONH66A:DONH6] -~w~Beseitige diese ~r~kolumbianischen Gangster! - -[DONP_01:DONH6] -Raupen... Raupe... Raupe... Raup... Nein, das bringt nichts. - -[DONP_02:DONH6] -Ommm. Mist! - -[DONP_03:DONH6] -Es ist zum... Scheiße, hätte ich nur was Kaltes zum Kuscheln, - -[DONP_06:DONH6] -Antonio! Ach, ich bin auf der Suche nach Erleuchtung, - -[DONP_07:DONH6] -aber heute wird daraus wohl nichts. - -[DONP_08:DONH6] -Vielleicht morgen. - -[DONP_09:DONH6] -Sie klangen nervös auf dem Band. - -[DONP_10:DONH6] -Nervös? Ich meditiere. Nervös, moi? - -[DONP_11:DONH6] -Ich bin eins mit dem Universum - unmöglich! - -[DONP_12:DONH6] -Ach, Scheiße, stimmt. - -[DONP_13:DONH6] -Eine Horde Kolumbianer wollte herkommen, - -[DONP_14:DONH6] -um mich gegebenenfalls umzulegen, wenn ich nicht schweige und alle schmiere. - -[DONP_15:DONH6] -Ach so. Das erklärt dann wohl, warum draußen massenhaft Kolumbianer rumlauern. - -[DONP_16:DONH6] -Scheiße! Bitte, Antonio, du musst mich hier rausschaffen! - -[DONP_17:DONH6] -Ich will nicht... Bitte! Ich will nicht sterben! - -[DONP_18:DONH6] -Wohl doch nicht so ganz eins mit dem Universum? - -[DONP_19:DONH6] -Danke, Toni! Ich mach's dir... Ich mach's dir wieder gut, Ehrenwort. - -[DONP_04:DONH6] -- dann wär's so einfach... ~n~ - Was gibt's, D? - -{=================================== MISSION TABLE TOSH1 ===================================} - -[TOSH1AB:TOSH1] -~w~Haltet ihn auf! - -[TOSH1AC:TOSH1] -~w~Schnappt ihn! - -[TOSH1AD:TOSH1] -~w~Knallt ihn ab! - -[TOSH1AA:TOSH1] -~w~Da ist er! - -[TOSH120:TOSH1] -~w~Klau die ~b~Waffenlieferung~w~ der Yakuza in Bedford Point. - -[TOSH121:TOSH1] -~w~Du musst an den ~r~Yakuza-Wachen~w~ vorbei. - -[TOSH122:TOSH1] -~w~Achte auf weitere ~r~Yakuza-Boote. - -[TOSH130:TOSH1] -~w~Bring die Waffen zu ~y~Toshikos Kontaktperson. - -[TOSH131:TOSH1] -~w~Zurück zur ~b~Waffenlieferung. - -[TOSH1BA:TOSH1] -~w~Prima Artillerie hast du da, mein Junge! - -[TOSH1BB:TOSH1] -~w~Ich hab an diesen Docks so viel zu tun, dass ich von hier aus operieren sollte, - -[TOSH1BC:TOSH1] -~w~statt auf der anderen Seite der scheiß Insel! - -[TOSH1BD:TOSH1] -~w~War jedenfalls 'n Knaller! - -[TOSH1DB:TOSH1] -~r~Die Waffen wurden vernichtet! - -[TOSH1PH:TOSH1] -~w~Die Yakuza werden ihre Lieferung bewachen. Du wirst vielleicht erst bei Phil Cassidy vorbeifahren müssen. - -[DEAD_01:TOSH1] -Das soll der knallharte Gangster sein? - -[DEAD_02:TOSH1] -Sie wirken nicht sehr knallhart. - -[DEAD_03:TOSH1] -Danke. - -[DEAD_04:TOSH1] -Wissen Sie, was es heißt, ohne Liebe zu leben, Mr. Toni? - -[DEAD_05:TOSH1] -Dass man mit dem Hass lebt. - -[DEAD_06:TOSH1] -Ich glaub's Ihnen einfach mal. - -[DEAD_07:TOSH1] -Ich hege ernsthaft den Wunsch, einen Menschen zu zerstören, Mr. Cipriani. - -[DEAD_08:TOSH1] -Zerstören, nicht nur zu töten. - -[DEAD_09:TOSH1] -Ich will ihn und seine Organisation schwach und gedemütigt sehen, bevor er stirbt. - -[DEAD_10:TOSH1] -Ich will, dass er leidet. - -[DEAD_11:TOSH1] -Okay. - -[DEAD_12:TOSH1] -Der Mensch, den Sie zerstören sollen, ist mein Mann. Kazuki Kasen. - -[DEAD_13:TOSH1] -Keine Sorge. - -[DEAD_14:TOSH1] -Für Ihre Dienste werden Sie fürstlich entlohnt. - -[DEAD_15:TOSH1] -Und wenn ich ablehne? - -[DEAD_16:TOSH1] -Nein. Während ich seinen Tod lediglich wünsche, brauchen Sie ihn. - -[DEAD_17:TOSH1] -Sie haben ihm doch bereits einen schweren Schlag zugefügt, Mr. Cipriani. - -[DEAD_18:TOSH1] -Nun gut. Er erwartet heute eine weitere Waffenlieferung. - -[DEAD_19:TOSH1] -Ich will, dass Sie ihm diese direkt unter seiner ignoranten Nase wegstehlen. - -{=================================== MISSION TABLE TOSH2 ===================================} - -[TOSH2AA:TOSH2] -~w~Mr. Toni. - -[TOSH2AL:TOSH2] -~w~Ihre Taten haben meinen Mann in enorme Rage versetzt. - -[TOSH2AB:TOSH2] -~w~Sie haben ihn und seine Leute - -[TOSH2AM:TOSH2] -~w~so dumm aussehen lassen wie sie sind. - -[TOSH2AC:TOSH2] -~w~Ich habe mich bemüht. Und jetzt, Prinzessin? - -[TOSH2AE:TOSH2] -~w~Mein Mann transferiert eine beträchtliche Summe von seinem Casino. - -[TOSH2AF:TOSH2] -~w~Sie sollen das gesamte Geld vernichten. - -[TOSH2AG:TOSH2] -~w~Ich wüsste die Kohle verdammt gut anzulegen, Süße. - -[TOSH2AH:TOSH2] -~w~Sein Geld soll vor aller Augen auf der Straße verbrennen. - -[TOSH2AI:TOSH2] -~w~Okay, okay. Wann geht der Transport über die Bühne? - -[TOSH2AJ:TOSH2] -~w~Er ist bereits im Gange. - -[TOSH2AK:TOSH2] -~w~Sie verlassen in diesem Augenblick das Casino. Bitte! Sie haben nicht viel Zeit. - -[TOSH2O0:TOSH2] -~w~Zerstöre alle ~r~Geldtransporter.~w~ Lass keinen zum ~y~Yakuza-Komplex~w~ durch! - -[TOSH2O1:TOSH2] -~w~Sie hauen ab! Lass keinen ~r~Van~w~ entwischen! - -[TOSH2O2:TOSH2] -~w~Du hast sie verschreckt! Lass die ~r~Vans~w~ nicht entwischen! - -[TOSH2E1:TOSH2] -~w~Der ~r~Konvoi~w~ nähert sich dem ~y~Yakuza-Komplex! - -[TOSH2E2:TOSH2] -~w~Ein ~r~Van~w~ ist fast am ~y~Yakuza-Komplex! - -{=================================== MISSION TABLE TOSH3 ===================================} - -[TOSH3M1:TOSH3] -~w~Jemand zu Hause? - -[TOSH3M2:TOSH3] -~w~Mr. Toni? Augenblick, bitte. - -[TOSH3M3:TOSH3] -~w~Mein Mann kocht vor Wut. - -[TOSH3EA:TOSH3] -~w~Er fragt sich, wieso Sie ihn so präzise zu treffen wussten. - -[TOSH3M4:TOSH3] -~w~Wenn er kein Idiot ist, geht ihm bald ein Licht auf. - -[TOSH3M5:TOSH3] -~w~Helfen wir ihm doch. Seine Leute sind alte Klatschbasen. - -[TOSH3EB:TOSH3] -~w~Liefern wir ihnen Gesprächsstoff. - -[TOSH3M6:TOSH3] -~w~Wohin wollen wir? - -[TOSH3M7:TOSH3] -~w~In die Oper. - -[TOSH3M8:TOSH3] -~w~Ich und Oper? Machen Sie Witze? - -[TOSH3M9:TOSH3] -~w~Aber woher denn, Mr. Toni? In die Oper geht doch jeder gern. - -[TOSH3A:TOSH3] -~w~Wenn Sie meinen Wagen vorfahren, holen wir Ihren Smoking ab. - -[TOSH3EC:TOSH3] -~w~Schnell. Die Vorstellung fängt gleich an. - -[TOSH3B:TOSH3] -~w~Fahre ~b~Toshikos Wagen~w~ vor. - -[TOSH3C:TOSH3] -~w~Hol ~b~Toshiko~w~ ab. - -[TOSH3C2:TOSH3] -~w~Hol einen Smoking von ~y~Mr. Benz. - -[TOSH3B3:TOSH3] -~w~Fahr Toshiko zurück zu ihrer ~y~Wohnung. - -[TOSH3B4:TOSH3] -~r~Du hast Toshiko zurückgelassen. - -[TOSH3B2:TOSH3] -Steig wieder in ~b~Toshikos Wagen. - -[TOSH3C3:TOSH3] -~w~Fahr zur ~y~Oper. - -[TOSH3D:TOSH3] -~w~Wo wollen Sie hin? Wir kommen zu spät! - -[TOSH3D2:TOSH3] -~w~Lassen Sie mich bitte nicht hier, Toni-San! - -[TOSH3Z1:TOSH3] -~w~Halten sie mich für einen schlechten Menschen? - -[TOSH3Z2:TOSH3] -~w~Na ja, Prinzessin, ich bin auch kein Heiliger. - -[TOSH3Z3:TOSH3] -~w~Einen Heiligen könnte ich auch nicht brauchen. - -[TOSH3Z4:TOSH3] -~w~Mein Mann ist Samurai, Mr. Toni. - -[TOSH3Z5:TOSH3] -~w~Er ist sehr stark, aber sehr, sehr schlecht. - -[TOSH3Z6:TOSH3] -~w~Er heiratete mich nur, um Wakagashira in Liberty City zu werden. - -[TOSH3Z7:TOSH3] -~w~Geliebt hat er mich nie. Er bevorzugt die Gesellschaft seiner Männer. - -[TOSH3Z8:TOSH3] -~w~Verstehen Sie mich? - -[TOSH3Z9:TOSH3] -~w~Wenn er Ihnen auf die Schliche kommt, bringt er Sie um. Das wissen Sie. - -[TOSH3Z0:TOSH3] -~w~Mich interessiert weder Leben noch Tod, nur noch die Freiheit. - -[TOSH3ZB:TOSH3] -~w~Entspannte Einstellung. - -[TOSH3E:TOSH3] -~w~Italiener- und Japsenblut vermischt sich nicht. - -[TOSH3F:TOSH3] -~w~Außer, beide sind auf dem Pflaster verspritzt! - -[TOSH3G:TOSH3] -~w~Schütze Toshiko und fliehe in ~b~ihrem Wagen. - -[TOSH3H:TOSH3] -~w~Schütze ~b~Toshiko~w~ und bringe sie zurück in ihre ~y~Wohnung. - -[TOSH3S1:TOSH3] -~w~Mein Wagen! - -[TOSH3S2:TOSH3] -~w~Retten Sie uns, Toni! - -[TOSH3S3:TOSH3] -~w~Kommen Sie, Toni! - -[TOSH3S4:TOSH3] -~w~Bringen Sie uns hier fort! - -[TOSH3S5:TOSH3] -~w~Retten Sie mich! - -[TOSH3S6:TOSH3] -~w~Hilfe! - -[TOSH3S7:TOSH3] -~w~Wir schaffen es nicht! - -[TOSH3S8:TOSH3] -HILFE! - -[TOSH3S9:TOSH3] -~r~Toshiko ist tot! - -[TOSH310:TOSH3] -~r~Toshikos Wagen wurde zerstört! - -[TOSH311:TOSH3] -~r~Die Zeit ist um! - -[TOSH3_1:TOSH3] -KEIN(E) - -[TOS3NE1:TOSH3] -~w~Beschütze Toshiko und erledige die ~r~Forelli-Gangster. - -[TOS3NE2:TOSH3] -~w~Flüchte in ~b~Toshikos Auto. - -[TOSH3EI:TOSH3] -~w~Die Oper beginnt um 20:00 Uhr. Verspäte dich nicht! - -{=================================== MISSION TABLE TOSH4 ===================================} - -[TOSH4O2:TOSH4] -~w~Kazukis Helikopter will zum ~y~Casino! - -[TOSH4O4:TOSH4] -~w~Beseitige ~r~Kazuki! - -[TOSH4O5:TOSH4] -~w~Begib dich zu ~y~Toshikos Wohnung. - -[TOSH4_3:TOSH4] -~w~Kazuki kommt in dem Helikopter an! Begib dich zum Helipad und leg ihn um. - -[TOSH4Y1:TOSH4] -~w~Schnappt ihn! - -[TOSH4Y2:TOSH4] -~w~Legt ihn um! - -[TOSH4CA:TOSH4] -~w~Meine Leute beschämen mich, - -[TOSH4CB:TOSH4] -~w~doch es geziemt sich, dass ich dich selbst töte. - -[TOSH4CC:TOSH4] -~w~Ihr zwei! Verschwindet! - -[TOSH4CD:TOSH4] -~w~Ich stoße mein Schwert mit großer Freude in dich hinein. - -[TOSH4CE:TOSH4] -~w~Ja, hab ich auch schon gehört. - -[TOSH4K1:TOSH4] -~w~Erschießt ihn! - -[TOSH4K2:TOSH4] -~w~Legt ihn um! - -[TOSH4_7:TOSH4] -~w~Bringe Toshiko Kazukis Schwert als Beweis, dass er tot ist. - -[TOSH4_8:TOSH4] -~w~Du hast Kazuki verschreckt! Er flieht! Die Chance, ihn zu beseitigen, ist vertan! - -[TOSH4_C:TOSH4] -Kazuki - -[TOSH4AA:TOSH4] -~w~Hallo? - -[TOSH4AB:TOSH4] -~w~Ich nehme ein Bad, Toni-San. - -[TOSH4AC:TOSH4] -~w~Wir haben kaum noch Zeit. - -[TOSH4AD:TOSH4] -~w~Mein Mann weiß jetzt, wer hinter seinen Verlusten steckt. - -[TOSH4AE:TOSH4] -~w~Er kommt, um mich zu töten. Und Sie auch. - -[TOSH4AF:TOSH4] -~w~Ich hab nicht vor, auf ihn zu warten. Wo ist er? - -[TOSH4AG:TOSH4] -~w~In Belleville. Er versammelt seine Leute. - -[TOSH4AJ:TOSH4] -~w~Doch bald wird er herkommen. - -[TOSH4AH:TOSH4] -~w~Sayonara, Süße. - -[TOSH4AI:TOSH4] -~w~Mein Gebet begleitet Sie, Toni-San. Viel Glück. - -[TOSH4F1:TOSH4] -~r~Kazuki lacht dich aus! - -[TOSH4OA:TOSH4] -~w~Erledige Kazukis ~r~Wachen! - -[TOSH4OB:TOSH4] -~w~Fahr zurück zu ~y~Kazukis Casino! - -[TOSH4OC:TOSH4] -~w~Vorsicht - da kommen noch mehr ~r~Yakuza! - -[TOSH4DA:TOSH4] -~w~Erschießt ihn! - -[TOSH4DB:TOSH4] -~w~Erledigt ihn! - -[TOSH4DC:TOSH4] -~w~Erledigt ihn, ihr Arschlöcher! - -[TOSH4O1:TOSH4] -~w~Begib dich zu ~y~Kazukis Versteck~w~ und leg ihn um! - -[TOSH4O3:TOSH4] -~w~Begib dich zum ~y~Helipad! - -[CASH_01:TOSH4] -Tja, Toshiko, jetzt ist es vorbei. - -[CASH_02:TOSH4] -Ja, ja, ich weiß. Hallo, Mr. Toni. - -[CASH_03:TOSH4] -Hey. Tja, Sie haben gesiegt. - -[CASH_04:TOSH4] -Sie haben, was Sie wollten. Alles hat bestens geklappt. - -[CASH_06:TOSH4] -Schön, ja, schön. Wirklich schön. - -[CASH_07:TOSH4] -Jetzt heißt es Zahlemann und Söhne, Süßer. - -[CASH_08:TOSH4] -Beide sind wir Narren und Mörder, Mr. Toni. - -[CASH_09:TOSH4] -Kann schon sein. - -[CASH_10:TOSH4] -Die Welt hat so eine verheerende Wirkung auf die Seele, finden Sie nicht auch, Mr. Toni? - -[CASH_11:TOSH4] -Kann sein. - -[CASH_12:TOSH4] -Aber Sie sind jetzt frei. Sie können nach Costa Rica oder Aruba gehen oder so. - -[CASH_13:TOSH4] -Neu anfangen. Das wollten Sie doch immer. - -[CASH_14:TOSH4] -Ich glaube kaum, dass mir der Sinn nach einem Strandurlaub steht. - -[CASH_15:TOSH4] -Ich habe alles verloren, und das willentlich. - -[CASH_16:TOSH4] -Mir wurde alles gewährt, was ich wollte. - -[CASH_17:TOSH4] -Jetzt will ich nur noch frei sein. - -[CASH_18:TOSH4] -Leben Sie wohl, Toni-San. +[MM_1_C:CARPAR1] +~y~PASSIERE~g~ einen Checkpoint, dann lãuft die Zeit. ~g~Jeder Checkpoint bringt dir ~y~~1~ SEKUNDEN~g~. {=================================== MISSION TABLE COPCAR ===================================} [C_COMP1:COPCAR] -~w~Bürgerwehr-Mission: Level 12 abgeschlossen! Kugelsichere Westen geben dir jetzt erhöhten Schutz! +Bürgerwehr-Mission Level 12 beendet: Deine max. Panzerung erhöht sich auf 150 + +[CLEVEL:COPCAR] +Bürgerwehr-Mission Level ~1~ + +[C_PASS:COPCAR] +BEDROHUNG AUSGERÃUMT: $ ~1~ + +[KILLS:COPCAR] +HITS: [C_BREIF:COPCAR] -~r~Verdächtiger~w~ wurde zuletzt in der Gegend von ~a~ gesichtet. - -[C_BREIG:COPCAR] -~r~Verdächtige~w~ wurden zuletzt in der Gegend von ~a~ gesichtet. - -[C_RANGE:COPCAR] -~r~Du bist außer Reichweite des Polizeifunks. Fahr näher an ein Polizeirevier heran! - -[C_TIMEA:COPCAR] -~w~Zeitbonus! +~1~ Sekunden +~g~Verdãchtiger wurde zuletzt in der Gegend von ~a~ gesichtet. [COPCART:COPCAR] -~w~Du hast ~1~ Sekunden, um zu einem Polizeifahrzeug zurückzukehren, bevor die Mission endet. - -[COPCARU:COPCAR] -~w~Du hast ~1~ Sekunde, um zu einem Polizeifahrzeug zurückzukehren, bevor die Mission endet. +~g~Du hast ~1~ Sekunden, um zu einem Polizeifahrzeug zurückzukehren, bevor die Mission endet. [C_CANC:COPCAR] ~r~Bürgerwehr-Mission abgebrochen! @@ -15332,2125 +9213,5504 @@ Leben Sie wohl, Toni-San. [C_TIME:COPCAR] ~r~Deine Zeit als Gesetzeshüter ist vorbei! -[C_PASS3:COPCAR] -~w~BEDROHUNG AUSGERÄUMT! Belohnung: $~1~ +{=================================== MISSION TABLE COUNT1 ===================================} -[C_LEVEL:COPCAR] -~r~Du hast die Kriminellen entkommen lassen! +[CM1_A:COUNT1] +Mr.Vercetti? Hey. Sie haben die alte Druckerei gekauft? -[C_RANG2:COPCAR] -~r~Der Polizeifunk funktioniert nicht in der U-Bahn! +[CM1_B:COUNT1] +Ja, mein Vater hat an diesen Dingern gearbeitet. -{=================================== MISSION TABLE CARS ===================================} +[CM1_C:COUNT1] +Ich sollte in seine Fußstapfen treten, aber...es ist anders gekommen. -[CARS_10:CARS] -~w~Steig in ein Auto, um die Probefahrt zu starten, oder verlasse den Parkplatz, um die Mission zu beenden. +[CM1_D:COUNT1] +Wollen Sie die alten Maschinen verkaufen, das Werk abreißen? -[CARS_12:CARS] -~w~Verlässt du das Auto, ist die Mission fehlgeschlagen. +[CM1_E:COUNT1] +Ich denke nach, ob wir was drucken sollten. Eine Zeitung, ein Magazin... -[CARS_1:CARS] -~w~Nimm einen der Kunden auf eine Probefahrt mit. +[CM1_F:COUNT1] +Ach, Blödsinn, absoluter Blödsinn. Ich drucke lieber Geld. Ist gar nicht so schwer. -[CARS_2:CARS] -~w~Du musst herausfinden, was der jeweilige Kunde an Performance von einem Auto erwartet. +[CM1_G:COUNT1] +In kleinerem Umfang mache ich das schon seit Jahren. -[CARS_3:CARS] -~w~Zeige dann mittels deiner Fahrkünste, dass das Auto genau das zu bieten hat, was der Kunde sucht. +[CM1_H:COUNT1] +Tatsãchlich? -[CARS_5:CARS] -~w~Beeindrucke den Kunden. +[CM1_I:COUNT1] +Klar. Aber wir brãuchten gute Platten. -[CARS_6:CARS] -~w~Kunde k.o.! Nimm ein anderes Auto. +[CM1_J:COUNT1] +Natürlich! In Florida gibt es schon ein Geldfãlscher-Syndikat. -[CARS_30:CARS] -~w~Fahr zurück zum ~y~Autohandel~w~, um das Geschäft abzuschließen. +[CM1_K:COUNT1] +Ein Syndikat? -[CARS_C1:CARS] -~w~Klasse, Mann, Sie schütteln die Bullen ab, hä? +[CM1_L:COUNT1] +Ja. Hab aber nur gerüchteweise davon gehört. -[CARS_C2:CARS] -~w~Ja! Der Idiot hat's nicht anders gewollt! +[CM1_M:COUNT1] +Ich kenne einen, der kennt sich mit Gerüchten aus... -[CARS_P1:CARS] -~w~Wow! Der Schlitten geht ja Überschall! +[CM1_N:COUNT1] +Hab immer die Abende mit ihm verbracht, die Walzen reinigen. -[CARS_P2:CARS] -~w~Wuhu! +[CM1_2A:COUNT1] +Sieh dir diesen Hintern an! -[CARS_P3:CARS] -~w~Da fährt ja meine Tante schneller! +[CM1_2B:COUNT1] +Tja, Kleine, du weißt nicht, was dir entgeht! -[CARS_P4:CARS] -~w~Hat das Dings Airbags? +[CM1_2C:COUNT1] +Na, alter Freund, wie lãuft's so? -[CARS_M1:CARS] -~w~Ah, was für eine schöne, gemütliche Fahrt. +[CM1_2D:COUNT1] +Was weißt du über Geldfãlscherei? -[CARS_M2:CARS] -~w~Ist Ihnen klar, was die Höchstgeschwindigkeit hier ist?! +[CM1_2E:COUNT1] +'Oh, alles bestens, Paul, und bei dir?' -[CARS_M3:CARS] -~w~Oh, Gott! Sie bringen uns ja um! +[CM1_2F:COUNT1] +Komm her! -[CARS_O1:CARS] -~w~Oh, ja! Endlich kein blöder Asphalt mehr! +[CM1_2G:COUNT1] +Ist ja gut, ist ja gut. Anscheinend bist du schwer beschãftigt. -[CARS_O2:CARS] -~w~Ab in die Wolken, Kumpel! +[CM1_2H:COUNT1] +Über Falschgeld weiß ich nur, dass die Triaden die Platten liefern. -[CARS_O3:CARS] -~w~Cooler Salto, Mann! +[CM1_2I:COUNT1] +Die haben eine Reederei unten bei den Docks. -[CARS_SC:CARS] -~w~Verkauf getätigt. Provision: $~1~. Zeit-Bonus: ~1~ Sekunden. +[CM1_2J:COUNT1] +Der Boss weiß, wann die nãchsten Platten reinkommen. -[CARS_SD:CARS] -~w~Level ~1~ abgeschlossen. Provision: $~1~. Zeit-Bonus: ~1~ Sekunden. +[CM1_2K:COUNT1] +Danke, Paul. -[CARS_IR:CARS] -~1~ HINTEREINANDER! Bonus! $~1~. +[CM1_2L:COUNT1] +Was ist bloß los mit dir, du Wahnsinniger! -[CARS_RE:CARS] -~w~Eine kleine Vergünstigung für unseren Top-Verkäufer! +[CM1_2M:COUNT1] +Gib mir noch einen Drink, hopp! -[CARSIC1:CARS] -~w~Ich brauch einen, in dem sie mich nicht so schnell schnappen, Mann. +[CM1_3:COUNT1] +~g~Man hat dich bemerkt! -[CARSIC2:CARS] -~w~Ich brauch eins, mit dem ich's diesen Gehweg-Pennern zeigen kann. +[CM1_5:COUNT1] +~g~Begib dich zu Kent Paul in den Malibu Club! -[CARSIP1:CARS] -~w~Das Baby sieht schnell aus! +[CNT1_1:COUNT1] +Wer sind Sie? Uff! Aiiee! Nicht ins Gesicht! Nicht ins Gesicht! -[CARSIP2:CARS] -~w~Oh, Mann! Ich wette, die Kiste kann fliegen! +[CM1_1:COUNT1] +~g~Begib dich zum Schiff der Chartered Libertine Lines bei den Docks. -[CARSIM1:CARS] -~w~Es heißt, mit denen kann man schön gemütlich rollen. +[CM1_2:COUNT1] +~g~Der Reedereichef verfügt über die benötigten Informationen. -[CARSIM2:CARS] -~w~Seit meiner Operation brauch ich ein langsameres Auto. +[CNT1_2:COUNT1] +Ok, ich rede ja! Ich rede! -[CARSIO1:CARS] -~w~Geiler Off-Roader! Fahren wir Gelände! +[CM1_6:COUNT1] +~g~Begib dich mit den Informationen zurück in die Druckerei! -[CARSIO2:CARS] -~w~Mein Kumpel legt mit seiner Karre geile Saltos hin - auf so Scheiß steh ich! +{=================================== MISSION TABLE COUNT2 ===================================} -[CARS_N1:CARS] -~w~Die Schrottkarre kauf ich nicht! +[CNT2_B1:COUNT2] +Ok, der Kurier holt die Druckplatten heute vom Hafen ab. -[CARS_N2:CARS] -~w~Haben Sie allen Ernstes geglaubt, ich kauf dieses Wrack! +[CNT2_B2:COUNT2] +Ich fange ihn ab, schnapp mir die Platten, hãng die Cops ab und komm wieder hierher. -[CARS_N3:CARS] -~w~Ihr Gebrauchtwagenhändler seid alle gleich! +[CNT2_B3:COUNT2] +Also, je nachdem wie es lãuft, haben wir -[CARS_Y1:CARS] -~w~Ich nehm's! +[CNT2_B4:COUNT2] +entweder 5 Minuten zum Gelddrucken, bis das Fãlschersyndikat uns findet, oder wir haben alle Zeit der Welt. -[CARS_Y2:CARS] -~w~Das ist das ideale Auto für mich! +[CNT2_B5:COUNT2] +Jedenfalls will ich 5 Minuten nachdem ich hier bin, Scheinchen aus der Presse kommen sehen! -[CARS_Y3:CARS] -~w~Wir kommen ins Geschäft! +[CNT2_B6:COUNT2] +Keine Sorge, Tommy. Wir sind bereit. -[CARS_R1:CARS] -~w~Das Modell gefällt mir, nur die Farbe nicht. +[CNT2_B7:COUNT2] +Ich und die Jungs bleiben in der Nãhe, falls die Cops dir in die Quere kommen. -[CARS_R2:CARS] -~w~Lass das Auto umspritzen! +[CNT2_B8:COUNT2] +Ok. Jeder weiß, was er zu tun hat? Gut. Bis spãter. -[CARS_D1:CARS] -~w~Es gefällt mir, aber es ist ziemlich verbeult! +[CNT2_01:COUNT2] +~g~Der ~r~Kurier~g~ mit den Druckplatten kommt jeden Moment in einem Helikopter an den ~y~Docks~g~ an. -[CARS_D2:CARS] -~w~Lass das Auto reparieren! +[CNT2_02:COUNT2] +~r~Der Kurier mit den Platten ist im Helikopter geflohen. -[CARS_F1:CARS] -~r~Du hast das Auto zerstört! +[CNT2_03:COUNT2] +~r~Der Kurier ist an seinem Ziel angekommen. Du kommst zu spãt! -[CARS_F2:CARS] -~r~Du hast den Kunden umgebracht! +[CNT2_04:COUNT2] +~r~Du hast die Platten in der Explosion zerstört! -[CARS_F3:CARS] -~r~Du hast zu lange gebraucht! Dem Kunden wurde langweilig! +[CNT2_05:COUNT2] +~g~Du hast die Druckplatten. Bring sie in die Druckerei. -[CARS_F4:CARS] -~r~Der Kunde hasst das Auto! +[CNT2_06:COUNT2] +~g~Der Kurier ist hinüber. Hol dir die Platten, ehe dir jemand zuvorkommt. -[CARS_F5:CARS] -~r~Deine Zeit als Autohändler ist vorbei! +[CNT2_07:COUNT2] +~g~Eine der Wachen hat die Platten genommen. Lass ihn nicht entkommen! -[CARS_F6:CARS] -~r~Der Kunde hasst das Auto - du hast es geschrottet! +[CNT2_08:COUNT2] +~g~Der ~r~Kurier~g~ mit den Platten ist an den Docks eingetroffen. -[CARS_F7:CARS] -~r~Der Kunde hasst das Auto - du bist zu schnell gefahren! +[CNT2_4:COUNT2] +Privatangelegenheit. Du hast hier nichts verloren! -[CARS_F8:CARS] -~r~Der Kunde hasst das Auto - du bist zu langsam gefahren! +[CNT2_09:COUNT2] +DRUCKEREI ERWORBEN -[CARS_SA:CARS] -Verkauf +[CNT2_10:COUNT2] +~g~Die Druckerei generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. -[CARS_7:CARS] -~w~Steig in ein ~b~Auto! +[CNT2_11:COUNT2] +~r~Die Platten liegen auf dem Meeresgrund! -[CARS_RF:CARS] -~w~Capital Autos steht jetzt unter deinem 'Schutz'. Hol dir dein Schutzgeld regelmäßig ab. +{=================================== MISSION TABLE CUBAN1 ===================================} -{=================================== MISSION TABLE BIKE ===================================} +[CUB1_A:CUBAN1] +Was ist, Mann? -[BIKE_10:BIKE] -~w~Schwing dich auf ein Bike, um die Probefahrt zu starten, oder verlasse die Gasse, um die Mission zu beenden. +[CUB1_B:CUBAN1] +Hey, langsam, Paps, der ist für mich. Bist du der Bursche? -[BIKE_12:BIKE] -~w~Steigst du aus dem Sattel, ist die Mission fehlgeschlagen. +[CUB1_C:CUBAN1] +Oh ja, du bist der Bursche. Glaub schon. -[BIKE_1:BIKE] -~w~Nimm einen der Kunden auf eine Probefahrt mit. +[CUB1_D:CUBAN1] +Nein, glaub ich nicht. -[BIKE_2:BIKE] -~w~Du musst herausfinden, was der jeweilige Kunde an Performance von einem Motorrad erwartet. +[CUB1_E:CUBAN1] +Ach ja? Komm her du Großmaul. -[BIKE_3:BIKE] -~w~Zeige dann mittels deiner Fahrkünste, dass das Motorrad genau das zu bieten hat, was der Kunde sucht. +[CUB1_F:CUBAN1] +Meinst du, du kannst es mit mir aufnehmen? -[BIKE_5:BIKE] -~w~Beeindrucke den Kunden. +[CUB1_G:CUBAN1] +Meinst du, du kannst mich für blöd verkaufen? -[BIKE_30:BIKE] -~w~Fahr zurück zum ~y~Motorradhandel~w~, um das Geschäft abzuschließen. +[CUB1_H:CUBAN1] +Nein, ich glaube, deine Blödheit reicht für uns beide. -[BIKE_C1:BIKE] -~w~Klasse, Mann, Sie schütteln die Bullen ab, hä? +[CUB1_I:CUBAN1] +Hey, er sagt, du bist dumm, mein Sohn. -[BIKE_C2:BIKE] -~w~Ja! Der Idiot hat's nicht anders gewollt! +[CUB1_J:CUBAN1] +Und ich sage, er ist ein kleines Mãdchen, Paps. -[BIKE_P1:BIKE] -~w~Ja! Das Ding ist unglaublich! +[CUB1_K:CUBAN1] +Sieh dir doch an, wie er angezogen ist. -[BIKE_P2:BIKE] -~w~Super! +[CUB1_L:CUBAN1] +Was ist los? Ist heute Weiberabend? -[BIKE_P3:BIKE] -~w~Komm, können Sie nicht schneller fahren! +[CUB1_M:CUBAN1] +Du willst ein harter Kerl sein und ziehst dich an wie ein Weib? -[BIKE_P4:BIKE] -~w~Vorsicht! +[CUB1_N:CUBAN1] +Hast du auch ein Höschen an, oder was? -[BIKE_M1:BIKE] -~w~Ah, was für eine schöne, gemütliche Fahrt. +[CUB1_O:CUBAN1] +Was hast du gegen Frauen? Ziehst du Mãnner vor? -[BIKE_M2:BIKE] -~w~Ist Ihnen klar, was die Höchstgeschwindigkeit hier ist?! +[CUB1_P:CUBAN1] +Ich liebe Frauen! Ich liebe alle Frauen! Ich liebe meine Mutter, Chico. -[BIKE_M3:BIKE] -~w~Oh, Gott! Sie bringen uns ja um! +[CUB1_Q:CUBAN1] +Ok, ok, ich glaub's dir ja. -[BIKE_O1:BIKE] -~w~Oh, ja! Endlich kein blöder Asphalt mehr! +[CUB1_R:CUBAN1] +Kannst du fahren, Amigo? -[BIKE_O2:BIKE] -~w~Ab in die Wolken, Kumpel! +[CUB1_S:CUBAN1] +Ja...wie eine Frau. -[BIKE_O3:BIKE] -~w~Geile Stunts, Kumpel! +[CUB1_T:CUBAN1] +Sehr witzig. Du gefãllst mir, Großer. Vielleicht kannst du mir helfen. -[BIKE_SC:BIKE] -~w~Verkauf getätigt. Provision: $~1~. Zeit-Bonus: ~1~ Sekunden. +[CUB1_U:CUBAN1] +Vielleicht kannst du beweisen, dass du ein Mann bist. Hah? -[BIKE_IR:BIKE] -~1~ HINTEREINANDER! Bonus! $~1~. +[CUB1_V:CUBAN1] +Schnapp dir das Boot. -[BIKE_RE:BIKE] -~w~Eine kleine Vergünstigung für unseren Top-Verkäufer! +[CUB1_W:CUBAN1] +Zeig mir, dass du ein ganzer Kerl bist, -[BIKE_RF:BIKE] -~w~Hogs & Cogs steht jetzt unter deinem 'Schutz'. Hol dir dein Schutzgeld regelmäßig ab. +[CUB1_X:CUBAN1] +und kein kleines Mãdchen. -[BIKEIC1:BIKE] -~w~Ich brauch eins, mit dem sie mich nicht so schnell schnappen, Mann. +[CUB1_02:CUBAN1] +Ok Mann, behandle es wie eine Frau. -[BIKEIC2:BIKE] -~w~Ich brauch eins, mit dem ich's diesen Gehweg-Pennern zeigen kann. +[CUB1_03:CUBAN1] +Nicht schlecht, du bist ein echter Mann. -[BIKEIP1:BIKE] -~w~Der Ofen sieht schnell aus! +[CUB1_04:CUBAN1] +Mann, du bist ein ganzer Kerl, Amigo. -[BIKEIP2:BIKE] -~w~Ich will was, was Weiber beeindruckt! +[CUB1_05:CUBAN1] +Amigo, du bist ein Mann, Mann. -[BIKEIM1:BIKE] -~w~Es heißt, mit denen kann man schön gemütlich rollen. +[CUB1_06:CUBAN1] +Du willst ein Mann sein, Mann? -[BIKEIM2:BIKE] -~w~Ich hab erst heute den Führerschein gemacht, deshalb brauch ich ein langsameres Bike. +[CUB1_07:CUBAN1] +Du bist ein feiges Würstchen, Kleiner, heul dich bei Mammi aus. -[BIKEIO1:BIKE] -~w~Geile Gelände-Gurke! Fahren wir Off-road! +[CUB1_08:CUBAN1] +Du bist zu nichts zu gebrauchen. Macht einen auf harter Mann, aber fãhrt wie ein Idiot. -[BIKEIO2:BIKE] -~w~Mit dem Ding kann man coole Stunts machen, oder? +[CUB1_09:CUBAN1] +Mann, du bist der Hammer, Mann. Du gefãllst mir. Du gefãllst mir sehr. -[BIKE_N1:BIKE] -~w~Die Schrottmühle kauf ich nicht! +[CUB1_10:CUBAN1] +Du bist gut, Mann. Weil du ein ganzer Kerl bist. Alle meine Freunde sind ganze Kerle. -[BIKE_N2:BIKE] -~w~Haben Sie allen Ernstes geglaubt, ich kauf dieses Wrack! +[CUB1_11:CUBAN1] +Du hast Rico erledigt! -[BIKE_N3:BIKE] -~w~Ihr Gebrauchtmotorradhändler seid alle gleich! +[CUB1_12:CUBAN1] +Fahre durch den ersten Checkpoint, um den Test zu beginnen. -[BIKE_Y1:BIKE] -~w~Ich nehm's! +[CUB1_14:CUBAN1] +Steig wieder ins Boot! -[BIKE_Y2:BIKE] -~w~Das ist das ideale Motorrad für mich! +[CUB1_15:CUBAN1] +Du bist zu langsam, Mann. -[BIKE_Y3:BIKE] -~w~Wir kommen ins Geschäft! +[CUB1_01:CUBAN1] +Hi, ich bin Rico. Bist du der 'ganze Kerl'? -[BIKE_R1:BIKE] -~w~Das Modell gefällt mir, nur die Farbe nicht. +[CUB1_13:CUBAN1] +~g~Du hast drei Minuten, um den Rundkurs zu schaffen. -[BIKE_R2:BIKE] -~w~Lass das Motorrad umspritzen! +{=================================== MISSION TABLE CUBAN2 ===================================} -[BIKE_D1:BIKE] -~w~Es gefällt mir, aber es ist ziemlich verbeult! +[CUB2_25:CUBAN2] +ERLEDIGE ALLE HAITIANER!! -[BIKE_D2:BIKE] -~w~Lass das Motorrad reparieren! +[CUB2_M:CUBAN2] +Wer sich mit mir anlegt, hat sich den stãrksten der Stadt rausgesucht! -[BIKE_F1:BIKE] -~r~Du hast das Motorrad zerstört! +[CUB2_A:CUBAN2] +Eine Kaffee, bitte, Alberto. -[BIKE_F2:BIKE] -~r~Du hast den Kunden umgebracht! +[CUB2_N:CUBAN2] +Kein Problem, Tommy. -[BIKE_F3:BIKE] -~r~Du hast zu lange gebraucht! Dem Kunden wurde langweilig! +[CUB2_B:CUBAN2] +Paps! Es gibt ein Riesenproblem! -[BIKE_F4:BIKE] -~r~Der Kunde hasst das Motorrad! +[CUB2_O:CUBAN2] +Umberto, mein Sohn, was ist passiert? -[BIKE_F5:BIKE] -~r~Deine Zeit als Motorradhändler ist vorbei. +[CUB2_C:CUBAN2] +Die Haitianer! Ich hasse die Haitianer! -[BIKE_F6:BIKE] -~r~Der Kunde hasst das Motorrad - du hast es geschrottet! +[CUB2_D:CUBAN2] +Die haben mir das letzte Mal ans Bein gepinkelt! -[BIKE_F7:BIKE] -~r~Der Kunde hasst das Motorrad - du bist zu schnell gefahren! +[CUB2_E:CUBAN2] +Diese Haitianer. Wir machen sie fertig! -[BIKE_F8:BIKE] -~r~Der Kunde hasst das Motorrad - du bist zu langsam gefahren! +[CUB2_F:CUBAN2] +Aber dazu brauchen wir Hilfe. -[BIKE_B1:BIKE] -~w~Du hast ~1~ Sekunden, um wieder auf das ~b~Motorrad~w~ zu steigen! +[CUB2_G:CUBAN2] +Ich hab dabei schon ein paar Brüder verloren. -[BIKE_B2:BIKE] -~w~Lass den ~b~Kunden~w~ wieder auf das Motorrad steigen! +[CUB2_H:CUBAN2] +Amigo, du fãhrst gut! -[BIKE_B3:BIKE] -~w~Lass den ~b~Kunden~w~ auf das Motorrad steigen! +[CUB2_I:CUBAN2] +Für eine Frau, was? -[BIKE_SA:BIKE] -Verkauf +[CUB2_J:CUBAN2] +Jetzt ist nicht die Zeit für Witze! -[BIKE_7:BIKE] -~w~Steig auf ein ~b~Motorrad! +[CUB2_K:CUBAN2] +Komm, fahr noch mal für mich! -[BIKE_S1:BIKE] -~w~Du hast alle Freeways, die wir vorrätig hatten, verkauft! +[CUB2_L:CUBAN2] +Bring meine Jungs da rüber, und dann erledigen wir diese Haitianer! -[BIKE_S2:BIKE] -~w~Du hast alle PCJ 600, die wir vorrätig hatten, verkauft! +[CUB2_01:CUBAN2] +Da ist nicht genug Platz, Mann, du brauchst ein größeres Auto. -[BIKE_S3:BIKE] -~w~Du hast alle Faggios, die wir vorrätig hatten, verkauft! +[CUB2_02:CUBAN2] +Wir brauchen Verstãrkung aus dem Café! -[BIKE_S4:BIKE] -~w~Du hast alle Sanchez, die wir vorrätig hatten, verkauft! +[CUB2_03:CUBAN2] +~g~Besorg dir ein Auto und hole die Kubaner vor Robinas Café ab. -[BIKE_SN:BIKE] -~w~Es wurde neue Ware angeliefert! +[CUB2_04:CUBAN2] +~g~Setze die Kubaner am Kampfort ab. -{=================================== MISSION TABLE RAC1 ===================================} +[CUB2_05:CUBAN2] +Schalte den feigen Heckenschützen aus! -[RAC1_A0:RAC1] -~w~Wenn du beweisen willst, dass deine Karre keine Schrottmühle ist, dann starte beim nächsten Straßenrennen. +[CUB2_07:CUBAN2] +Die kãmpfen wie Weiber! In Deckung! -{=================================== MISSION TABLE RAC2 ===================================} +[CUB2_09:CUBAN2] +Heckenschütze auf dem Dach! -[RAC2_A0:RAC2] -~w~Hey, es heißt, es findet ein Straßenrennen statt. Fahr deine Karre an die Startlinie. +[CUB2_11:CUBAN2] +~r~Du Idiot! Das Auto hãtten wir gebraucht! -{=================================== MISSION TABLE RAC3 ===================================} +[CUB2_12:CUBAN2] +Hey, Amigo! Schön zu sehen, dass du's geschafft hast! -[RAC3_A0:RAC3] -~w~Gibt kein schnelleres Auto, gibt keinen besseren Fahrer. +[CUB2_13:CUBAN2] +Stinkendes Haitianer-Nest. Das werden wir komplett ausheben! -[RAC3_A1:RAC3] -~w~Ich seh dich dann beim nächsten Straßenrennen... im Rückspiegel. +[CUB2_14:CUBAN2] +ANGRIFF! -{=================================== MISSION TABLE BIK1 ===================================} +[CUB2_15:CUBAN2] +Los, meine Brüder, ANGRIFF!! -[BIK1_A0:BIK1] -~w~Du glaubst, du kannst mich schlagen? Keine Chance! +[CUB2_16:CUBAN2] +Tommy, wir haben unseren mannhaften Mut bewiesen! -[BIK1_A1:BIK1] -~w~Fahr dein Motorrad an die Startlinie und dann geht's los! +[CUB2_17:CUBAN2] +Lass uns diesen Wagen voller Stoff nehmen und abhauen! -{=================================== MISSION TABLE BIK2 ===================================} +[CUB2_18:CUBAN2] +~g~Besorge dir ein Auto und hole die Kubaner ab. -[BIK2_A0:BIK2] -~w~Wenn du glaubst, du kannst mich bei 'nem Rennen schlagen, dann lass deine Reifen sprechen! +[CUB2_19:CUBAN2] +Wir werden kãmpfen wie Mãnner! -[BIK2_A1:BIK2] -~w~Wir sehen uns an der Startlinie. +[CUB2_21:CUBAN2] +Kãmpfen wie ganze Kerle! -{=================================== MISSION TABLE BIK3 ===================================} +[CUB2_22:CUBAN2] +~g~Schalte die restlichen Haitianer aus, damit die Kubaner vorrücken können. -[BIK3_A0:BIK3] -~w~Es ist ganz einfach: Auf zwei Rädern schlägt mich keiner. Legen wir los. +[CUB2_23:CUBAN2] +~g~In Little Haiti wird es von Haitianern wimmeln, die sich an den Kubanern rãchen wollen. Sei vorsichtig. -{=================================== MISSION TABLE TT1 ===================================} +[CUB2_24:CUBAN2] +~g~Kehre mit dem Van zu Robinas Café zurück und parke hinter dem Haus. -[TT1_A0:TT1] -~w~~k~ ~AMBUY~ ~w~zum Teilnehmen. ~n~~k~ ~AMEXI~ ~w~zum Abbrechen. +{=================================== MISSION TABLE CUBAN3 ===================================} -[TT1_0:TT1] -Zeit +[CUB3_A:CUBAN3] +Alberto? Einen Kaffee, Senor? -[TT1_1:TT1] -~w~Neuer Rundenrekord: ~1~:~1~ +[CUB3_B:CUBAN3] +Paps, gib dieser falschen Schlange nichts. -[TT1_1A:TT1] -~w~Neuer Rundenrekord: ~1~:0~1~ +[CUB3_C:CUBAN3] +Du hast zwei Gesichter, Tommy! -[TT1_C1:TT1] -~w~3 +[CUB3_D:CUBAN3] +Du hast entweder zwei Gesichter oder du bist ein Feigling, Kleiner! -[TT1_C2:TT1] -~w~2 +[CUB3_E:CUBAN3] +Die Haitianer, Mann, die lachen mich aus. -[TT1_C3:TT1] -~w~1 +[CUB3_F:CUBAN3] +Ruhig, ruhig. Was gibt es für Probleme? -[TT1_C4:TT1] -~w~LOS! +[CUB3_G:CUBAN3] +Sie lachen mich aus, Tommy. Mich! -[TT1_D1A:TT1] -~w~Höhe: ~1~ Fuß +[CUB3_H:CUBAN3] +Umberto Robina. Die tun, was sie wollen! -[TT1_D2:TT1] -~w~Runde ~1~ - Zeit: ~1~:~1~ +[CUB3_I:CUBAN3] +Die tun nicht, was sie wollen, Umberto. Sie tun, was du sie tun lãsst. -[TT1_D3:TT1] -~w~Runde ~1~ - Zeit: ~1~:0~1~ +[CUB3_J:CUBAN3] +Was? -[TT1_D4:TT1] -~w~Runde +[CUB3_K:CUBAN3] +Soll jemand aus dem Weg gerãumt werden? -[TT1_F2:TT1] -~r~Du hast die Strecke verlassen! +[CUB3_L:CUBAN3] +Ich kann das machen, aber es kostet. -[TT1_F3:TT1] -~r~Du hast das Motorrad geschrottet! +[CUB3_M:CUBAN3] +Ich weiß, wir sind Brüder und alles, aber hier geht's um ein Geschãft. -[TT1_D5A:TT1] -~w~Höhe: ~1~ Fuß - $10 Bonus! +[CUB3_N:CUBAN3] +Tommy. Du bist ein echter Mann. Ein Geschãftsmann, ein Gentleman. -[TT1_D1:TT1] -~w~Höhe: ~1~ Meter +[CUB3_O:CUBAN3] +Die Haitianer, sie erwarten eine Schiffladung Stoff, richtig gutes Zeug. -[TT1_D5:TT1] -~w~Höhe: ~1~ Meter - $10 Bonus! +[CUB3_P:CUBAN3] +Wir schnappen es uns und erledigen sie. -[TT1_2:TT1] -~w~Du hast die Ziel-Zeit unterboten! Nächster Kurs freigeschaltet - $100 Bonus! +[CUB3_Q:CUBAN3] +Du schnappst es dir, ich passe auf dich auf. Wie auf einen Bruder, einen Sohn. -[TT1_3:TT1] -~w~Du hast die Ziel-Zeit unterboten - $100 Bonus! +[CUB3_R:CUBAN3] +Ich glaube, Cash ist mir lieber als auf deinen Knien zu reiten, Amigo. -[TTDONE:TT1] -~w~Alle Kurse absolviert! Du hast die 'Manchez' freigeschaltet. +[CUB3_01:CUBAN3] +Hey, Rico. Nettes Boot. Bist du bereit? -[TT1_2A:TT1] -~r~Du hast die Ziel-Zeit nicht erreicht. +[CUB3_03:CUBAN3] +~g~Sammle alle Aktenkoffer mit Stoff und Geld ein. -[TT1_2B:TT1] -~r~Du hast den Streckenrekord nicht unterbieten können. +[CUB3_04:CUBAN3] +~g~Bringe die Drogen und das Geld zu Umberto. -{=================================== MISSION TABLE RCR ===================================} +[CUB3_05:CUBAN3] +Ja, Tommy. Also, sei ein guter Kapitãn heute. -[RCRACE3:RCR] -~w~Schlage die anderen RC-Fahrzeuge in einem ~1~-Rundenrennen um den Park! +[CUB3_06:CUBAN3] +Mein Boot nützt mir nichts, wenn es durchlöchert ist, ok? -[RCRACE4:RCR] -~w~Schlage die anderen RC-Fahrzeuge in einem ~1~-Rundenrennen um den Flughafen! +[CUB3_07:CUBAN3] +~g~Begib dich zu Rico. Er fãhrt dich zum Treffpunkt. -[RCRACE7:RCR] -~w~Mach dich bereit... +[CUB3_02:CUBAN3] +~g~ERLEDIGE ALLE HAITIANER AUF DEN BOOTEN!! -[RCRLAP5:RCR] -~w~Neuer Rundenrekord: ~1~ Sekunden! +[CUB3_08:CUBAN3] +Oh-oh... eine Bande Kubaner. Wir werden angegriffen! -[RCRLAP6:RCR] -~w~Noch ~1~ Runden! +{=================================== MISSION TABLE CUBAN4 ===================================} -[RCRLAP7:RCR] -~w~Letzte Runde! +[CUB4_A:CUBAN4] +Hey, Ladies. Wisst ihr, was ich mache? -[RCRLTME:RCR] -Rundenzeit +[CUB4_B:CUBAN4] +Ich erledige einen Haitianer. Und dann? -[RCRLOSE:RCR] -~r~Verloren! Du bist und bleibst ein Amateur! +[CUB4_C:CUBAN4] +Dann mache ich Liebe wie ein Mann. -[RCRLOS2:RCR] -~r~Du gewinnst nie ein Rennen, wenn du nicht auf dem Kurs bleibst! +[CUB4_D:CUBAN4] +Weißt du, Kleine? So in der Art. -[RCRTIME:RCR] -~w~Du hast ~h~~1~ ~w~Sekunden, um auf die Strecke zurückzukehren! +[CUB4_E:CUBAN4] +Penner! -[RCRWIN1:RCR] -~w~Gratuliere! Du hast GESIEGT - aber den Rundenrekord nicht verbessert! +[CUB4_F:CUBAN4] +Vollidiot. -[RCRWIN2:RCR] -~w~Dein nächstes Rennen geht über ~1~ Runden! +[CUB4_G:CUBAN4] +Hey, Baby, dich würde ich nicht mit 'ner Kneifzange anfassen! -[RCRWIN3:RCR] -~w~RC-Rennen in Belleville Park, Staunton ist jetzt verfügbar. +[CUB4_H:CUBAN4] +Umberto Robina mag Frauen, keine Ziege mit Rock! -[RCRWIN4:RCR] -~w~RC-Rennen im Shoreside Airport ist jetzt verfügbar. +[CUB4_I:CUBAN4] +Tommy!! Tommy, ich liebe dich, ich liebe dich! Lass uns gehen! -[RCRWIN5:RCR] -~w~Du hast alle Levels geschafft! Jetzt verbessere noch deine Rundenbestzeiten! +[CUB4_J:CUBAN4] +Wohin denn? Kann ich nicht noch einen Kaffee trinken? -[RCR1:RCR] -~w~1 +[CUB4_K:CUBAN4] +Keine Zeit! Außerdem habe ich erst einen getrunken. -[RCR2:RCR] -~w~2 +[CUB4_L:CUBAN4] +Wir nehmen uns die Haitianer vor. -[RCR3:RCR] -~w~3 +[CUB4_M:CUBAN4] +Tommy, wie erledigt man eine Schlange? -[RCRGO:RCR] -~w~LOS! +[CUB4_N:CUBAN4] +Man beißt sie in den Hintern! Hahaha! -[RCBLAP:RCR] -Bisherige Rundenbestzeit: ~1~:~1~ +[CUB4_O:CUBAN4] +Wenn du es sagst, Umberto. -[RCBLAP1:RCR] -Bisherige Rundenbestzeit: ~1~:0~1~ +[CUB4_P:CUBAN4] +Tommy, geh und besorge uns ein kleines haitianisches Auto. -[RCBLA2:RCR] -Rundenrekord: ~1~:~1~ +[CUB4_Q:CUBAN4] +Wenn du es hast, komm zurück und hol meinen Jungen ab -[RCBLA3:RCR] -Rundenrekord: ~1~:0~1~ +[CUB4_R:CUBAN4] +Pepe, und fahre ihn zu den Haitianern. -[RCRRLA1:RCR] -~w~Neuer Rundenrekord: ~1~:~1~ +[CUB4_S:CUBAN4] +Dann begibst du dich zur Laboranlage der Haitianer und verwendest ihr Lösungsmittel als Sprengstoff. -[RCRRLA2:RCR] -~w~Neuer Rundenrekord: ~1~:0~1~ +[CUB4_T:CUBAN4] +Bumm! Bye bye! -[RCRACEA:RCR] -Thrashin' RC +[CUB4_U:CUBAN4] +Umberto, was ist mit dir? -[RCRACEB:RCR] -Ragin' RC +[CUB4_V:CUBAN4] +Oh, ich halte mich raus und passe mit Paps auf das Café auf. -[RCRACEC:RCR] -Chasin' RC +[CUB4_W:CUBAN4] +Er fühlt sich nicht besonders, weißt du. -[RCLE11:RCR] -Thrashin' RC LEVEL 1 +[CUB4_02:CUBAN4] +~g~Die Bomben werden per Zeitzünder auf 45 sek. gestellt sein. -[RCLE12:RCR] -Thrashin' RC LEVEL 2 +[CUB4_07:CUBAN4] +Zum Lösungsmittel geht's hintenrum, Amigo. -[RCLE13:RCR] -Thrashin' RC LEVEL 3 +[CUB4_08:CUBAN4] +Hola, Amigos. -[RCLE21:RCR] -Ragin' RC LEVEL 1 +[CUB4_09:CUBAN4] +Bueno. Haitian Putas. Muerte. -[RCLE22:RCR] -Ragin' RC LEVEL 2 +[CUB4_10:CUBAN4] +Vamos. -[RCLE23:RCR] -Ragin' RC LEVEL 3 +[CUB4_11:CUBAN4] +Genau, vamos. -[RCLE31:RCR] -Chasin' RC LEVEL 1 +[CUB4_12:CUBAN4] +Hey, wir brauchen ein haitianisches Gang-Auto! -[RCLE32:RCR] -Chasin' RC LEVEL 2 +[CUB4_13:CUBAN4] +Oye, suchen wir unsere Muchachos! -[RCLE33:RCR] -Chasin' RC LEVEL 3 +[CUB4_14:CUBAN4] +Folge meinen Compadres. -[RCRACE2:RCR] -~w~Schlage die anderen RC-Fahrzeuge in einem ~1~-Rundenrennen um die Baustelle! +[CUB4_15:CUBAN4] +Ok, nur immer rein... -[RCRWIN6:RCR] -~w~Fahr noch mal und versuch deine Rundenbestzeit zu verbessern. +[CUB4_16:CUBAN4] +Ich lege die Bombe. Gib mir Deckung. -[RCQUIT:RCR] -~r~Batterien gleich leer? +[CUB4_17:CUBAN4] +RENN! -[RCRFAIL:RCR] -~r~Du hast es nicht geschafft, Erster zu werden! +[CUB4_18:CUBAN4] +Mann, das ist ein schönes Viertel hier... -[RCRLAP1:RCR] -~c~1. ~w~RUNDE +[CUB4_19:CUBAN4] +Das ist doch eine Müllhalde, Mann. -[RCRLAP2:RCR] -~c~2. ~w~RUNDE +[CUB4_20:CUBAN4] +Ich kannte mal eine schöne Frau, die hat hier gewohnt. -[RCRLAP3:RCR] -~c~3. ~w~RUNDE +[CUB4_21:CUBAN4] +Die machen gute Pizza hier. -[RCRLAP4:RCR] -~c~4. ~w~RUNDE +[CUB4_22:CUBAN4] +Hey, Mann! Du fãhrst wie ein Verrückter! -[RCRWIN:RCR] -~w~Gratulation. Du hast mit einer Rundenbestzeit von ~1~:~1~ GEWONNEN! $500 Bonus! +[CUB4_23:CUBAN4] +Hast du dich verfahren, Mann? -[RCRWINB:RCR] -~w~Gratulation. Du hast mit einer Rundenbestzeit von ~1~:0~1~ GEWONNEN! $500 Bonus! +[CUB4_24:CUBAN4] +Du hast Pepe vergessen, hole ihn. -{=================================== MISSION TABLE TOUR ===================================} +[CUB4_03:CUBAN4] +~g~Bleib im Wagen, bis er sicher auf dem Gelãnde geparkt ist. -[TOUR_H1:TOUR] -~w~Foto-Tipps: Stell dich ~h~vor~w~ den Touristen, ~h~nicht zu weit weg.~w~ Achte darauf, dass sowohl der ~h~Tourist als auch die Hintergrundszenerie~w~ im Bild ist. +[CUB4_26:CUBAN4] +~g~Nimm dir Pepe, fahr Richtung Norden nach Little Haiti und klaue einen Voodoo. -[TOUR_I2:TOUR] -~w~Für besonders hochwertige Fotos erhältst du eine Bonuszahlung! +[CUB4_27:CUBAN4] +~g~Triff dich mit Rico und den anderen Kubanern. -[TOUR_S0:TOUR] -~w~Du hast noch ~h~~1~~w~ Bilder übrig. +[CUB4_28:CUBAN4] +~g~Triff dich mit den anderen Kubanern bei der haitianischen Drogenfabrik. -[TOUR_S1:TOUR] -~w~Du hast nur noch 1 Bild übrig. Sorg dafür, dass es ein gutes wird! +[CUB4_29:CUBAN4] +~g~Gehe in jede der Markierungen, um an dieser Stelle eine Bombe zu legen. -[TOUR_S2:TOUR] -~w~Verschwende deinen Film nicht! Du hast noch ~h~~1~~w~ Bilder übrig. +[CUB4_30:CUBAN4] +~g~Wenn alle drei Bomben gelegt sind, entferne dich von der Fabrik bevor sie hochgeht. -[TOUR_S4:TOUR] -~w~Du musst den ~b~Touristen~w~ richtig im Bild haben! Du hast noch ~h~~1~~w~ Bilder übrig. +[CUB4_31:CUBAN4] +~g~Mach, dass du von der Fabrik wegkommst!! -[TOUR_F1:TOUR] -~r~Der Tourist ist tot! +[CUB4_32:CUBAN4] +~g~Park den Wagen an der im Radar markierten Stelle und steig aus. -[TOUR_F2:TOUR] -~r~Du hast den Touristen verloren! +[CUB4_06:CUBAN4] +~r~Du bist nicht weit genug von der Basis weggekommen, wir mussten die Detonation abbrechen! -[TOUR_F3:TOUR] -~r~Du hast kein Foto von dem Touristen gemacht! +{=================================== MISSION TABLE FINALE ===================================} -[TOUR_F4:TOUR] -~r~Die Zeit ist um! +[FIN1_01:FINALE] +Was ist los? -[TOUR_F5:TOUR] -~r~Touristen-Mission abgebrochen. +[FIN1_02:FINALE] +Tommy! Ah, gut, gut. Hör zu. Hör zu... -[TOUR_F6:TOUR] -~r~Der Dieb ist mit der Kamera des Touristen entkommen! +[FIN1_03:FINALE] +Ich mag Fische. Ich liebe Fische. -[TOUR_O1:TOUR] -~w~Bring den Touristen zu der ~y~Sehenswürdigkeit. +[FIN1_04:FINALE] +Ich liebe sie als Haustiere oder auch lecker zubereitet. -[TOUR_O2:TOUR] -~w~Lass den ~b~Touristen~w~ nicht zurück! +[FIN1_05:FINALE] +Aber ich liebe sie nicht so sehr, dass ich als Fischfutter im Hafen enden will. -[TOUR_O3:TOUR] -~w~Begleite den ~b~Touristen~w~ zu Fuß zu der Foto-Location. +[FIN1_06:FINALE] +Und jetzt kommen auf einmal deine italienischen Brüder an und wollen mir Zementschuhe verpassen. Und ich... -[TOUR_O4:TOUR] -~w~Mach das Foto mit der Kamera des ~b~Touristen. +[FIN1_07:FINALE] +Halt den Mund, Ken. Setz dich. -[TOUR_O5:TOUR] -~w~Bring den Touristen jetzt zum ~y~Flughafen. +[FIN1_08:FINALE] +Lance, was lãuft hier, verdammt? -[TOUR_O6:TOUR] -~w~Schnell! Die Zeit wird knapp! +[FIN1_09:FINALE] +Deine Freunde aus dem Norden, Tommy. Die sind nicht sehr froh, dass du ihren Mann erledigt hast. -[TOUR_O7:TOUR] -~w~Nimm den ~b~Touristen~w~ mit. +[FIN1_10:FINALE] +Sie kommen heute, um nach dem Rechten zu sehen. -[TOUR_O8:TOUR] -~w~Nimm den nächsten ~b~Touristen~w~ mit, ehe die Zeit um ist. +[FIN1_11:FINALE] +Sie haben lãnger gebraucht, als ich dachte... -[TOUR_O9:TOUR] -~w~Du solltest wirklich den ~b~Touristen~w~ begleiten! Du verschwendest Zeit. +[FIN1_12:FINALE] +Jungs, wir müssen denen ein für alle Mal klar machen, dass das mein Laden ist. MEINER! -[TOUR_OA:TOUR] -~w~Der ~b~Tourist~w~ wartet darauf, dass du ein Foto machst. Beeil dich, die Zeit wird knapp! +[FIN1_13:FINALE] +Ken, hol die erste Ladung von dem Falschgeld und pack 20 Mios in Aktenkoffer. -[TOUR_W1:TOUR] -~w~Lohn: ~h~$~1~~w~ Sorry, kein Bonus dieses Mal. +[FIN1_14:FINALE] +Lance, du trommelst die anderen Jungs zusammen... -[TOUR_W2:TOUR] -~w~Lohn: ~h~$~1~~w~ plus ~h~$~1~~w~ Bonus für ein gutes Foto! +[FIN2_01:FINALE] +Tommy! -[TOUR_W3:TOUR] -~w~Lohn: ~h~$~1~~w~ plus ~h~$~1~~w~ Bonus für ein großartiges Foto! +[FIN2_02:FINALE] +Was ist? Keine Umarmung für deinen alten Freund? -[TOUR_W4:TOUR] -~w~Lohn: ~h~$~1~~w~ plus ~h~$~1~~w~ Bonus für ein exzellentes Foto! +[FIN2_03:FINALE] +Ich war 15 Jahre weg vom Fenster, -[TOUR_W5:TOUR] -~w~Prima! Alle 'Erst knipsen, dann starten'-Missionen abgeschlossen. Du erhältst $~1~ Vollständigkeits-Bonus! +[FIN2_04:FINALE] +bin nicht mehr auf dem Laufenden, was Manieren angeht. -[TOURDAM:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Bring diesen Touristen zum Cochrane Dam und mach ein Foto zum Beweis, dass er dort war! +[FIN2_05:FINALE] +Immer Wut im Bauch, hã, Tommy? -[TOURBRI:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Diese Dame möchte die Callahan Bridge von der Portland-Seite aus sehen. +[FIN2_06:FINALE] +Ich sag's ja, dein Temperament wird dir nochmal schlecht bekommen. -[TOURDRK:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Fotografiere diesen Filmfan vor dem Haus des Schauspielers Black Lightman, in Cedar Grove, Shoreside Vale. +[FIN2_07:FINALE] +In den Koffern sind 20 Millionen... -[TOURSTA:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Fotografiere diesen Sportfan vor dem Liberty Memorial Coliseum in Staunton. +[FIN2_08:FINALE] +Wie viele waren es denn? Zehn? Nein, elf Mãnner. -[TOURCHU:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Geleite dieses Schäfchen zur historischen Liberty Cathedral in Staunton. +[FIN2_09:FINALE] +So kommt man zu dem Spitznamen 'Harwood-Butcher'! Hehehe! -[TOURBCH:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Zeige diesem Touristen den herrlichen Anblick von Portland Rocks Leuchtturm von Portland Beach aus. +[FIN2_10:FINALE] +Ich sollte EINEN Mann für dich erledigen! Die wussten, dass ich komme, Sonny... -[TOURCHI:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Die orientalische Atmosphäre des Chinatown Plaza in Portland ist das exotische Traumziel dieses Touristen. +[FIN2_11:FINALE] +Wie redest du denn mit mir? -[TOURSHO:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Die Freundinnen dieser Touristin sollen glauben, dass sie in der exklusiven Staunton Shopping Mall shoppen war. Mach dort ein Foto von ihr. +[FIN2_12:FINALE] +Wie kommst du darauf, mich für diesen unglücklichen Zufall verantwortlich zu machen? -[TOURCAS:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Hier ist ein Spieler, der vor dem weltberühmten Casino in Staunton fotografiert werden möchte. +[FIN2_13:FINALE] +Nimm einfach das Geld... -[TOURMUS:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Diese Gelehrte möchte ein Foto, das die beeindruckenden Dimensionen des Museums in Staunton zeigt. +[FIN2_14:FINALE] +Holt das Geld! -[TOURHAL:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Dieser Tourist möchte, bevor er abreist, noch einmal das Rathaus in Staunton sehen. +[FIN2_15:FINALE] +Weißt du, Tommy, ich hab für dich getan, was nur ging. Himmel und Hölle in Bewegung gesetzt. -[TOURRED:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Seine Kumpel meinen, er traut sich nicht in einen Strip Club in Portlands Rotlichtviertel. Beweise das Gegenteil! +[FIN2_16:FINALE] +Ich war dein Freund. Ich dachte, du nimmst Vernunft an. Kapierst, was gut fürs Geschãft ist. -[TOURMU0:TOUR] -~w~Der ~r~Dieb~w~ hat die Kamera des Touristen geklaut! Beschaff sie wieder! +[FIN2_17:FINALE] +Ich hab dir vertraut, Tommy, und du hast mich enttãuscht. -[TOURMU1:TOUR] -~w~Ein Gauner weniger, der die Straßen unsicher macht! Nimm die ~g~Kamera. +[FIN2_18:FINALE] +Aber wenigstens einer in deiner mickrigen Organisation weiß, wie man Geschãfte macht. -[TOUR00:TOUR] -~w~Bring den Touristen zum ~y~Cochrane Dam~w~ in Shoreside Vale. +[FIN2_19:FINALE] +Stimmt's, Lance? -[TOUR01:TOUR] -~w~Bring den Touristen zum ~y~Liberty Memorial Coliseum~w~ in Staunton. +[FIN2_20:FINALE] +Sorry, Tommy. So lãuft's in Vice City. So lãuft das Geschãft. -[TOUR02:TOUR] -~w~Bring den Touristen zum ~y~Chinatown Plaza~w~ in Portland. +[FIN2_21:FINALE] +Du hast uns verraten... -[TOUR03:TOUR] -~w~Bring den Touristen zur ~y~Liberty Cathedral~w~ in Staunton. +[FIN2_22:FINALE] +Nein, ich hab DICH verraten, Tommy, nur DICH. -[TOUR06:TOUR] -~w~Bring den Touristen zum ~y~Strip Club~w~ in Portlands Rotlichtviertel. +[FIN2_23:FINALE] +Die echten Piepen sind oben im Safe. -[TOUR07:TOUR] -~w~Bring den Touristen zum ~y~Liberty City Museum~w~ in Staunton. +[FIN2_24:FINALE] +Tommy, wie hast du dir das denn vorgestellt? -[TOUR08:TOUR] -~w~Bring den Touristen zum ~y~Casino~w~ in Staunton. +[FIN2_25:FINALE] +Dachtest du, ich lass mich mit Blüten abspeisen? -[TOUR10:TOUR] -~w~Bring diesen Touristen zum ~y~Rathaus~w~ in Staunton. +[FIN2_26:FINALE] +Dass ich den Schwanz einziehe und abhaue, um nicht das Gesicht zu verlieren? -[TOUR11:TOUR] -~w~Bring diesen Touristen zum ~y~Portland Beach. +[FIN2_27:FINALE] +Nein. -[TOUR04:TOUR] -~w~Bring den Touristen zur ~y~Callahan Bridge~w~, Portland-Seite. +[FIN2_28:FINALE] +Ich wollte dich nur noch ein bisschen ãrgern, bevor ich dich fertig mache. -[TOUR09:TOUR] -~w~Bring den Touristen zum ~y~Haus des Schauspielers Black Lightman~w~, in Cedar Grove, Shoreside Vale. +[FIN3_01:FINALE] +Tommy? -[TOUR_I1:TOUR] -~w~Zeige Touristen Liberty Citys berühmte Sehenswürdigkeiten. +[FIN3_02:FINALE] +Oh Gott, Tommy! Was ist passiert? -[TOUR_IA:TOUR] -~w~Mach dort Andenkenfotos von ihnen. +[FIN3_03:FINALE] +Wonach sieht's denn aus? -[TOUR_IB:TOUR] -~w~Dann bring sie rechtzeitig für ihren Rückflug zum Flughafen. +[FIN3_04:FINALE] +Sieht aus, als wãr dein Anzug ruiniert! -[TOURMEM:TOUR] -~w~SEHENSWÜRDIGKEIT ~1~: ~w~Dieser Veteran will seiner gefallenen Kameraden beim Denkmal im Belleville Park, Staunton gedenken. +[FIN3_05:FINALE] +Und das war ein wunderbarer Anzug! Tommy, Herrgott, was ist passiert? -[TOUR05:TOUR] -~w~Bring den Touristen zum ~y~Liberty City War Memorial~w~ im Belleville Park, Staunton. +[FIN3_06:FINALE] +Kleine Meinungsverschiedenheit mit einem Geschãftsfreund. Wie das so ist. + +[FIN3_07:FINALE] +Wenn ich eine Meinungsverschiedenheit mit einem Geschãftsfreund habe, schick ich ihm einen bösen Brief. + +[FIN3_08:FINALE] +Oder ich pinkle ihm in den Briefkasten, aber ich fang nicht den 3. Weltkrieg an. + +[FIN3_09:FINALE] +Vielleicht solltest du mal zu meinem Therapeuten gehen... + +[FIN3_10:FINALE] +Dieser Dreckskerl von Lance... + +[FIN3_11:FINALE] +Tommy, ich konnte den Kerl ja nie leiden. + +[FIN3_12:FINALE] +Er ist neurotisch, unsicher, selbstsüchtig - Er ist ein Arschloch! + +[FIN3_13:FINALE] +Gut, dass du ihn fertig gemacht hast! + +[FIN3_14:FINALE] +Ich glaub auch nicht, dass wir nochmal Ãrger mit denen aus dem Norden kriegen... + +[FIN3_15:FINALE] +Die aus dem Norden gibt's nãmlich nicht mehr. + +[FIN3_16:FINALE] +Gibt nur noch die im Süden. + +[FIN3_17:FINALE] +Moment, verstehe ich dich richtig, Tommy, Heißt das...? + +[FIN3_18:FINALE] +Na, was meinst du, was das heißt? + +[FIN3_19:FINALE] +Dass wir jetzt die Herren im Haus sind... ich meine, dass DU der Herr im Haus bist. Oh, Tommy... + +[FIN3_20:FINALE] +Weißt du, Ken, das könnte der Beginn einer wunderbaren Geschãftsbeziehung sein... + +[FIN3_21:FINALE] +Schließlich bist du ein hinterlistiger, mieser kleiner Dieb... + +[FIN3_22:FINALE] +und ich bin ein verurteilter Psychopath und Dealer. + +[FIN3_23:FINALE] +Ich weiß. Ist das nicht wunderbar? + +[FIN_B1:FINALE] +~g~Erledige den Verrãter ~y~Vance~g~. + +[FIN_B2:FINALE] +~g~Erledige ~p~Sonny~g~, um die Sache ein für alle Mal zuende zu bringen. + +[FIN_B3:FINALE] +~g~Die Mafia will dein Geld stehlen. Verteidige den Safe. + +[FIN_B4:FINALE] +~g~Du hãltst nicht mehr lange durch. Hol dir unten ein wenig ~w~Energie~g~. + +[FIN_B5:FINALE] +~g~Die Mafia stiehlt dein Geld. Verteidige den ~c~Safe. + +[FIN_B7:FINALE] +~r~Die Mafia hat dein gesamtes Geld gestohlen. + +[DEFSAFE:FINALE] +~g~Geh zurück zum Safe und verteidige ihn. + +{=================================== MISSION TABLE FIRETRK ===================================} + +[F_PASS1:FIRETRK] +Feuer gelöscht! + +[F_FAIL2:FIRETRK] +~r~Du kommst zu spãt! + +[F_CANC:FIRETRK] +~r~Feuerwehr-Mission abgebrochen! + +[F_EXTIN:FIRETRK] +FEUER: + +[F_START:FIRETRK] +~g~Brennendes Fahrzeug in der Gegend von ~a~ gemeldet. Lösche den Brand. + +[SIREN_1:FIRETRK] +Um die Sirenen dieses Fahrzeugs einzuschalten, drücke die ~h~~k~~VEHICLE_HORN~~w~. + +[SIREN_2:FIRETRK] +Um die Sirenen dieses Fahrzeugs einzuschalten, drücke die ~h~~k~~VEHICLE_HORN~~w~. + +[FIREPRO:FIRETRK] +Feuerwehr-Mission Level 12 abgeschlossen: Du bist jetzt absolut feuerfest!! + +[F_FAIL1:FIRETRK] +Feuerwehr-Mission beendet. + +[F_STAR1:FIRETRK] +~g~Brennende Fahrzeuge in der Gegend von ~a~ gemeldet. Lösche den Brand. + +[SPRAY_4:FIRETRK] { reVC update } +Benutze die ~h~~k~~VEHICLE_FIREWEAPON~~w~-Taste, um die Wasserkanone abzufeuern und den ~h~~k~~VEHICLE_TURRETLEFT~~w~ und ~h~~k~~VEHICLE_TURRETRIGHT~~w~, um mit der Wasserkanone zu zielen. + +[SPRAY_1:FIRETRK] { reVC update } +Benutze die ~h~~k~~VEHICLE_FIREWEAPON~~w~-Taste, um die Wasserkanone abzufeuern und den ~h~~k~~VEHICLE_TURRETLEFT~~w~ und ~h~~k~~VEHICLE_TURRETRIGHT~~w~, um mit der Wasserkanone zu zielen. + +{=================================== MISSION TABLE GENERA1 ===================================} + +[GEN1_I:GENERA1] +Für diesen kleinen Gefallen werde ich Sie belohnen. Danach suchen wir Ihr Geld gemeinsam. + +[GEN1_A:GENERA1] +Mr. Vercetti! + +[GEN1_B:GENERA1] +Colonel. + +[GEN1_D:GENERA1] +Nein danke. + +[GEN1_E:GENERA1] +Es ist mir peinlich, aber es scheint, unser Problem ist zum Teil auf das lose Mundwerk einer mir vertrauten Person zurückzuführen. + +[GEN1_F:GENERA1] +Seit Jahren schleppe ich Gonzalez mit, aber nun erreicht seine Unfãhigkeit einen neuen Höhepunkt. + +[GEN1_G:GENERA1] +Es ist nur gerecht, wenn Sie Gonzalez erledigen. + +[GEN1_H:GENERA1] +War er es? Mir geht es in erster Linie um das Geld. + +[GEN1_J:GENERA1] +Er ist in seinem Penthouse, vermutlich halb betrunken. Nehmen Sie das hier. + +[GEN1_06:GENERA1] +Er hat eine Kettensãge!! + +[GEN1_07:GENERA1] +Bleib mir vom Leib, du elender Mistkerl! + +[GEN1_08:GENERA1] +Gütiger Himmel, mein Leben ist ruiniert, und mein Aussehen dazu! + +[GEN1_10:GENERA1] +Ich werd dir dein Mundwerk stopfen! + +[GEN1_11:GENERA1] +Bleib stehen, du Fettsack! + +[GEN1_12:GENERA1] +Bleib stehen, und es geht ganz schnell! + +[GEN1_13:GENERA1] +Hör auf zu jammern, das interessiert keinen, Fettsack! + +[GEN1_C:GENERA1] +Danke für Ihr Kommen. Setzen Sie sich. Hummer? + +[GEN1_04:GENERA1] +~g~Benutze den Eingang, um Zugang zu Gonzalez' Dachwohnung zu erhalten. + +[GEN1_05:GENERA1] +~g~Erledige Gonzalez! + +[GEN1_09:GENERA1] +Ich zahle dir das Doppelte, Tommy, das DOPPELTE! + +[GEN1_17:GENERA1] +~g~Gonzalez versucht zu fliehen! Folge ihm durch die Türen und erledige ihn. + +[GEN1_18:GENERA1] +~r~Gonzalez hat das Polizeirevier sicher erreicht! + +[GEN1_19:GENERA1] +~g~Die Polizei von Vice City ist hinter dir her! + +[GEN1_20:GENERA1] +~g~Steig in ein Fahrzeug. + +[GEN1_21:GENERA1] +~g~Begib dich zur~h~ Pay 'N' Spray-Lackiererei~g~ in~h~ Vice Point~g~. + +[GEN1_22:GENERA1] +~g~Bring dein Fahrzeug in die Lackiererei, um deinen ~h~Fahndungslevel~g~ loszuwerden und das Fahrzeug zu ~h~reparieren ~g~und ~h~umzuspritzen~g~. Kosten - ~h~$100~g~. Diesmal gratis. + +[GEN1_01:GENERA1] +Um im Laufen eine Nahkampfattacke vorzubereiten, die~o~ |-Taste~w~ gedrückt halten. + +[GEN1_02:GENERA1] +Um im Laufen eine Nahkampfattacke vorzubereiten, die~x~ /-Taste~w~ gedrückt halten. + +[GEN1_03:GENERA1] +Um im Laufen eine Nahkampfattacke vorzubereiten, die~h~ R1-Taste~w~ gedrückt halten. + +[GEN1_14:GENERA1] +Lass die~h~ ~k~~PED_FIREWEAPON~~w~ los, um die Attacke auszuführen. + +[GEN1_15:GENERA1] +Lasse die~h~ ~k~~PED_FIREWEAPON~~w~ los, um die Attacke auszuführen. + +[GEN1_16:GENERA1] +Lasse die~h~ ~k~~PED_FIREWEAPON~~w~ los, um die Attacke auszuführen. + +[GEN1_23:GENERA1] +~g~Geh durch die Türen zurück ins Erdgeschoss. + +{=================================== MISSION TABLE GENERA2 ===================================} + +[COL2_A:GENERA2] +Tommy! Setzen Sie sich zu mir. + +[COL2_B:GENERA2] +Sieht das nicht köstlich aus? Tapirschnauze? + +[COL2_C:GENERA2] +Ãh... Nein. Nein, danke. + +[COL2_D:GENERA2] +Tommy, Sie sind wie eine Pampas-Brise, die mich vom Gestank der Korruption befreit hat. + +[COL2_E:GENERA2] +Natürlich muss ich so tun, als trauere ich um ihn und muss wie immer meine Arbeit machen. + +[COL2_F:GENERA2] +Das bringt mich meinem Geld nicht nãher... + +[COL2_G:GENERA2] +Tommy, mein Freund, Sie sind hier nicht in Liberty. Hier regeln wir Dinge anders. + +[COL2_H:GENERA2] +Ich werde weiter nachforschen, zunãchst hãtte ich aber ein lukratives Geschãft abzuschließen. + +[COL2_I:GENERA2] +Freunden tu ich gern einen Gefallen, Cortez... + +[COL2_J:GENERA2] +Sie sind ein guter Freund, Tommy. Ich wusste, ich kann auf Sie zãhlen. + +[COL2_K:GENERA2] +Sie müssen sich mit einem Kurier treffen, der wertvolle 'Technologie' für mich beschafft hat. + +[COL2_1:GENERA2] +Die Regen ist sich sehr nass um diese Jahreszeit... + +[COL2_2:GENERA2] +Was? + +[COL2_3:GENERA2] +Ãh, comment? + +[COL2_4:GENERA2] +Hören Sie, Cortez schickt mich. Geben Sie mir die verdammten Mikrochips. + +[COL2_5:GENERA2] +Oh... ok. + +[COL2_B1:GENERA2] +~g~Triff dich mit dem Kurier im Einkaufszentrum. + +[COL2_B2:GENERA2] +~g~Der Kurier flieht mit den Lenkwaffen-Chips. Lass ihn nicht entkommen! + +[COL2_B3:GENERA2] +~g~Bring die Lenkwaffen-Chips zum Colonel. + +[COL2_F1:GENERA2] +~r~Du hast die Kontaktperson erledigt! + +[COL2_F2:GENERA2] +~r~Der Kurier ist hinüber. Schnapp dir die Lenkwaffen-Chips. + +[COL2_6A:GENERA2] +Keine Bewegung, amerikanisches Imperialistenschwein! Das ist Eigentum des französischen Staates. Her damit! + +[BLIPHLP:GENERA2] +Das Radar zeigt ein nach oben zeigendes Dreieck, das bedeutet, dass das Ziel sich in größerer Höhe befindet als der Spieler. + +[COL2_F3:GENERA2] +~r~Die Lenkwaffen-Chips liegen auf dem Meeresgrund. + +[COL2_F4:GENERA2] +~r~Der Kurier ist entkommen! Du hast dir die Chips durch die Lappen gehen lassen. + +{=================================== MISSION TABLE GENERA3 ===================================} + +[GEN3_49:GENERA3] +Lance' Gesundheitszustand: + +[GEN3_A:GENERA3] +Thomas, danke, dass Sie kommen. + +[GEN3_B:GENERA3] +Verzeihen Sie, wenn ich gleich zur Sache komme. + +[GEN3_C:GENERA3] +Diaz bat mich, eine kleinere geschãftliche Transaktion zu überwachen. + +[GEN3_D:GENERA3] +Wird hoffentlich besser laufen als die letzte, hah? + +[GEN3_E:GENERA3] +Darum habe ich an Sie gedacht, mein Freund. + +[GEN3_F:GENERA3] +Ich habe etwas zu Ihrem Schutz beim Parkhaus deponiert. + +[GEN3_G:GENERA3] +Holen Sie es ab. Und dann bewachen Sie Diaz' Mãnner bei dem Deal. + +[GEN3_H:GENERA3] +Danke, Amigo. + +[GEN3_1:GENERA3] +Reißt sich alles selbst unter den Nagel, wie ich sehe. + +[GEN3_2:GENERA3] +Sag mal, ist das alles, was du kannst, mir dauernd nachzuschnüffeln? Komm mit und zeig mir, dass du was drauf hast. + +[GEN3_3:GENERA3] +Könnte ich machen. Ich heiße übrigens Lance. + +[GEN3_5:GENERA3] +Du musst Cortez' neuer Mann sein. + +[GEN3_6:GENERA3] +Bis ich was besseres finde... + +[GEN3_7:GENERA3] +Sie müssen bald hier sein. Wir sollten uns gute Beobachtungsposten suchen. + +[GEN3_8:GENERA3] +Ok! Ich nehm den Balkon, du kletterst auf das Dach drüben im Hof. + +[GEN3_9:GENERA3] +Ich lebe! Idioten! Und das nur wegen dir! Wie heißt du? + +[GEN3_10:GENERA3] +Tommy. + +[GEN3_11:GENERA3] +Wir sehen uns bald wieder, glaube ich! + +[GEN3_12:GENERA3] +Wo steckt denn Lance? Shit... + +[GEN3_14:GENERA3] +Tommy! Ich brauch Hilfe! + +[GEN3_15:GENERA3] +Keine Sorge, ich hab alles im Griff! + +[GEN3_16:GENERA3] +Diaz' Mãnner werden umgemãht! + +[GEN3_19:GENERA3] +~g~Haitianer! Sie greifen an! Beschütze Diaz! + +[GEN3_20:GENERA3] +~g~Begib dich zum Parkhaus. Hol dir die Waffe, die der Colonel dort für dich deponiert hat. + +[GEN3_22:GENERA3] +Diaz' Gesundheitszustand: + +[GEN3_23:GENERA3] +~g~Du hast Lance vergessen. Hole ihn! + +[GEN3_25:GENERA3] +~r~Lance hat's erwischt! + +[GEN3_28:GENERA3] +~g~Bring den Aktenkoffer zu Diaz zurück. + +[GEN3_29:GENERA3] +~g~Hol dir den Aktenkoffer und bringe ihn zu Diaz zurück. + +[GEN3_30:GENERA3] +~r~Er ist mit dem Geld entwischt! Dafür macht Diaz dich kalt! + +[GEN3_33:GENERA3] +~r~Du sollst Diaz und seine Mãnner bewachen, nicht beschießen! + +[GEN3_34:GENERA3] +~r~Es gibt keinen Deal, wenn du die Kubaner erledigst! + +[GEN3_35:GENERA3] +~g~Er hat Diaz' Geld gestohlen! + +[GEN3_36:GENERA3] +~g~Schnapp dir das Motorrad, stelle ihn und hol Diaz' Geld zurück! + +[GEN3_37:GENERA3] +~g~. Die Kubaner kommen. Überwache den Deal. Pass auf Diaz und Lance auf. + +[GEN3_38:GENERA3] +~r~Diaz hat's erwischt! Du hast versagt! + +[GEN3_39:GENERA3] +~g~Begib dich zu deinem Beobachtungsposten die Treppe hoch. + +[GEN3_44:GENERA3] +~g~Begib dich mit Lance zum Übergabeort und pass auf Diaz auf. + +[GEN3_45:GENERA3] +Sie müssen bald hier sein. Wir sollten uns gute Beobachtungsposten suchen. + +[GEN3_40:GENERA3] { reVC update } +Um auf einem ~h~Motorrad ~w~sitzend ~h~geradeaus zu feuern~w~, drücke die ~h~~k~~VEHICLE_FIREWEAPON~. + +[GEN3_41:GENERA3] { reVC update } +Um auf einem ~h~Motorrad ~w~sitzend ~h~geradeaus zu feuern~w~, drücke die ~h~~k~~VEHICLE_FIREWEAPON~. + +[GEN3_46:GENERA3] +Scheiße! + +[GEN3_47:GENERA3] +Tommy! + +[GEN3_48:GENERA3] +Verdammt! + +[GEN3_50:GENERA3] +~r~Du hast Diaz' Geld verloren! Versuch das nãchste Mal, das Geld nicht zu vernichten! + +[GEN3_51:GENERA3] +Noch mehr verdammte Haitianer in einem beschissenen Van! + +[GEN3_54:GENERA3] +Steht nicht rum, ihr Idioten! Schnappt euch diesen haitianischen Mistkerl! + +[GEN3_55:GENERA3] +Tommy! Ich bleibe hier und passe auf Diaz auf! + +[GEN3_18:GENERA3] +~g~Die Kubaner kommen. Bleib in Diaz' Nãhe. Überwache den Deal. Pass auf Diaz und Lance auf. + +[GEN3_56:GENERA3] +~r~Diaz ist hinüber, er ist in einen Hinterhalt geraten. Pass das nãchste Mal auf ihn auf! + +[GEN3_57:GENERA3] +Die Kruger ist ein Sturmgewehr, das einem erlaubt, in der subjektiven Kamera-Einstellung manuell zu zielen. + +[GEN3_58:GENERA3] +Halte die~h~ R1~w~-Taste gedrückt, um mit dem Sturmgewehr zu ~h~zielen~w~. + +[GEN3_59:GENERA3] +Halte die~h~ L1~w~-Taste gedrückt, um mit dem Sturmgewehr zu ~h~zielen~w~. + +[GEN3_60:GENERA3] +Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Sturmgewehr ~h~abzufeuern~w~. + +[GEN3_61:GENERA3] +Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Sturmgewehr ~h~abzufeuern~w~. + +[GEN3_62:GENERA3] +Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Sturmgewehr ~h~abzufeuern~w~. + +[GEN3_63:GENERA3] +Auf~h~ Motorrãdern ~w~kann man nicht nur im Vorbeifahren seitlich auf Ziele schießen, man kann auch ~h~geradeaus feuern~w~. + +[GEN3_64:GENERA3] { reVC update } +Um auf einem Motorrad sitzend geradeaus zu feuern, drücke die ~h~~k~~VEHICLE_FIREWEAPON~~w~-Taste. + +[GEN3_65:GENERA3] { reVC update } +Um auf einem Motorrad sitzend geradeaus zu feuern, drücke die ~h~~k~~VEHICLE_FIREWEAPON~~w~-Taste. + +[GEN3_66:GENERA3] { reVC update } +Um auf einem Motorrad sitzend geradeaus zu feuern, drücke die ~h~~k~~VEHICLE_FIREWEAPON~~w~-Taste. + +[GEN3_67:GENERA3] +Du brauchst eine Maschinenpistole, um auf einem Motorrad sitzend geradeaus zu feuern. + +[GEN3_53:GENERA3] +MEIN GELD! + +[GEN3_52:GENERA3] +Diese Haitianer denken sie könnten RICARDO DIAZ stürzen!?! + +{=================================== MISSION TABLE GENERA4 ===================================} + +[DETON:GENERA4] +DETONATION: + +[COL4_3:GENERA4] +KONVOI HALT! + +[COL4_6:GENERA4] +WIR STEHEN UNTER FEINDLICHEM BESCHUSS! + +[COL4_7:GENERA4] +Weg da von dem Panzer, Zivilist! + +[COL4_8:GENERA4] +ICH SAGTE, WEG DA! SOFORT! + +[COL4_9:GENERA4] +AUF GEFECHTSPOSITIONEN! + +[COL4_11:GENERA4] +Schaffen Sie den Zivilisten aus dem Weg, Soldat! - Sir, zu Befehl, Sir! + +[COL4_12:GENERA4] +Zivilist im PANZER! HALTET IHN AUF! + +[COL4_13:GENERA4] +Dies ist ein Militãrkonvoi, machen Sie den Weg frei! + +[COL4_14:GENERA4] +Erledigen sie ihn, Soldat. + +[COL4_15:GENERA4] +Schaffen Sie das Zivilfahrzeug aus dem Weg! -Fahrzeug wird weggeschafft, Sir! + +[COL4_17:GENERA4] +OK, EINHEIT WEITER! + +[COL4_18:GENERA4] +Da ist jemand auf dem Panzer, Sir! + +[COL4_19:GENERA4] +Gehen Sie ein paar Donuts holen, Soldat! - Zu Befehl, Sir! + +[COL4_20:GENERA4] +Ziel erfasst, Sir. + +[COL4_21:GENERA4] +HECKENSCHÜTZE! + +[COL4_22:GENERA4] +Ich seh zu, dass ich hier wegkomme! + +[COL4_23:GENERA4] +Einsatz durchgeführt! Einheit, wegtreten! - Gehen wir ein paar Donuts essen. + +[COL4_24:GENERA4] +Sicherheitsmechanismus Delta India Echo aktiviert. Selbstzerstörung des Fahrzeugs eingeleitet! + +[COL4_26:GENERA4] +Mach dein Testament, dreckiger Kommunist! + +[COL4_B2:GENERA4] +~r~Der Panzer ist wohlbehalten an seinem Ziel angekommen! + +[COL4_B5:GENERA4] +~r~Der Panzer ist zerstört worden! + +[COL4_01:GENERA4] +Diaz war sehr angetan und würde Sie gerne wiedersehen. + +[COL4_02:GENERA4] +Ist das eine gute Nachricht? + +[COL4_03:GENERA4] +Aber sicher! Obwohl mich der Verdacht beschleicht, dass Diaz für unsere Verluste verantwortlich war... + +[COL4_04:GENERA4] +Wie kommen Sie darauf? + +[COL4_05:GENERA4] +Man erhebt keine Anschuldigungen gegen einen Mann wie Diaz. Ich habe nur laut nachgedacht. + +[COL4_06:GENERA4] +Egal. Ich habe einen Vorschlag, der lukrativ für Sie sein könnte... + +[COL4_07:GENERA4] +Ich habe keine Zeit für weitere Auftrãge, Cortez. + +[COL4_08:GENERA4] +Ein Mann mit solch bedrohlichen Schulden sollte doch um jede Verdienstmöglichkeit dankbar sein. Hören Sie mich wenigstens an. + +[COL4_09:GENERA4] +Na gut... + +[COL410:GENERA4] +Ich habe einen Kãufer für ein 'Militãrgerãt', das durch die Stadt transportiert wird. Beschaffen Sie es! + +[COL411:GENERA4] +Wenn Sie es haben, rufen Sie mich unverzüglich an... + +[COL4_B4:GENERA4] +~g~Der Panzer ist abgeschlossen. Lass dir etwas einfallen, um die Besatzung herauszulocken. + +[COL4_1:GENERA4] +Was ist mit dem Kanonier? - Weiß nicht, Sir! + +[COL4_4:GENERA4] +Los, sehen Sie nach, Soldat! - Zu Befehl, Sir! + +[COL4_B1:GENERA4] +~g~Besorge das militãrische Fahrzeug, das durch die Stadt gefahren wird. + +[COL4_B3:GENERA4] +~g~Liefere den Panzer in der Garage des Colonels ab, bevor er sich selbst zerstört. + +[COL4_B6:GENERA4] +~g~Finde einen Weg, den Panzer zu klauen! + +[COL4_B7:GENERA4] +~g~Fahr den Panzer in die Garage. + +[COL4_B8:GENERA4] +~g~Steig aus dem Panzer und verlasse die Garage. + +{=================================== MISSION TABLE GENERA5 ===================================} + +[COL5A_1:GENERA5] +Die Lage erfordert ein eiliges Verschwinden, Amigo. + +[COL5A_2:GENERA5] +Was gibt's für ein Problem? + +[COL5A_3:GENERA5] +Die Franzosen wollen ihre Lenkwaffen-Chips wieder und nach dem letzten Zwischenfall + +[COL5A_4:GENERA5] +zieht es mich in sicherere Gefilde. + +[COL5A_5:GENERA5] +Wãre es nicht sicherer zu fliegen? + +[COL5A_6:GENERA5] +Ich wãre erledigt, bevor ich eingecheckt hãtte. Außerdem muss ich Ware außer Landes schaffen. + +[COL5A_7:GENERA5] +Brauchen Sie noch einen Bodyguard? + +[COL5A_8:GENERA5] +Sie, mein Freund, sind zehn Bodyguards wert. Hahaha. + +[COL5B_1:GENERA5] +Thomas, Sie haben mich beschützt und mir treu gedient. + +[COL5B_2:GENERA5] +Aber jetzt müssen Sie uns verlassen, ehe wir das offene Meer erreichen. + +[COL5B_4:GENERA5] +Danke, Colonel. + +[COL5B_5:GENERA5] +Eine Bitte noch. Könnten Sie ein Auge auf Mercedes haben, solange ich weg bin? + +[COL5B_6:GENERA5] +Ich glaub zwar, sie kann auf sich selbst aufpassen, aber klar. + +[COL5B_7:GENERA5] +Danke, mein Freund. Bis zu meiner Rückkehr. + +[COL5B_8:GENERA5] +Adios, Amigo. + +[COL5_7:GENERA5] +Hören Sie auf, auf mich zu schießen! + +[COL5_9:GENERA5] +Tommy, die sollen aufhören, auf mich zu schießen! + +[COL5_10:GENERA5] +Ich genieße diplomatische Immunitãt. + +[COL5_11:GENERA5] +Nicht schießen, ich bin ein Colonel! + +[COL5_12:GENERA5] +Thomas, machen Sie sie fertig. Mein Land wird es Ihnen danken. + +[COL5_13:GENERA5] +Tommy, wir werden von den Franzosen überrannt! + +[COL5_14:GENERA5] +Tommy, wo ich hinsehe, überall Franzosen! Wie ich es hasse! + +[COL5_15:GENERA5] +Tommy, alles in Ordnung? + +[COL5_16:GENERA5] +Das ist für Piaf und Gainesbourg und für euer dãmliches französisches Weißbrot! + +[COL5_1:GENERA5] +Backbord! Backbord! + +[COL5_2:GENERA5] +Sie greifen von Steuerbord an! + +[COL5_3:GENERA5] +Die Brücke da vorn! + +[COL5_4:GENERA5] +Sie haben einen Helikopter! + +[COL5_B1:GENERA5] +~g~Beschütze den Colonel und seine Jacht um jeden Preis. + +[COL5_B2:GENERA5] +~g~Geh nach vorn und rãume der Jacht des Colonels den Weg frei. + +[COL5_B3:GENERA5] +~r~Der Colonel ist hinüber! + +[COL5_B4:GENERA5] +~g~Schieße den angreifenden Helikopter vom Himmel. + +[COL5B_3:GENERA5] +Ich werde meine Privatbarkasse zu Wasser lassen. Sie gehört Ihnen, als Ausdruck meiner Dankbarkeit. + +[COL5_B5:GENERA5] +~g~Schieß die Helikopter ab, gefãhrde nicht die Jacht. + +[COL5_B6:GENERA5] +~g~Du hast keine Munition mehr. Hol dir an der Treppe des Oberdecks Nachschub. + +[COL5_B7:GENERA5] +~g~Du hast nur noch wenig Energie. Hol dir an der Treppe des Oberdecks Nachschub. + +{=================================== MISSION TABLE HAIT1 ===================================} + +[HAM1_A:HAIT1] +Hallo? Hallo? + +[HAM1_B:HAIT1] +Komm rein, mein Lieber, und ruh dich aus. + +[HAM1_C:HAIT1] +Du musst der große böse Mann sein, von dem mein Großvater erzãhlt hat. + +[HAM1_D:HAIT1] +Er erzãhlte immer von dir, wenn er zu Besuch kam, + +[HAM1_E:HAIT1] +und von den anderen, die auf dich warten. + +[HAM1_F:HAIT1] +Tja, wir müssen alle mal sterben, aber du... + +[HAM1_G:HAIT1] +....in deiner Haut möchte ich dann nicht stecken. Hehehe! + +[HAM1_H:HAIT1] +Es hieß, ich soll hierher kommen. + +[HAM1_I:HAIT1] +Kannst du sie hören? + +[HAM1_J:HAIT1] +Sie rufen deinen Namen, Junge. Die müssen ziemlich scharf auf dich sein, was? + +[HAM1_K:HAIT1] +Aber wenn du der alten Tante Poulet hilfst, hilft sie dir vielleicht auch. + +[HAM1_L:HAIT1] +Vielleicht kann sie dir danach einen kleinen Talisman schenken. + +[HAM1_M:HAIT1] +Ein bisschen Magie, die den Mãnnern des Gesetzes schlechte Augen macht, hmm? + +[HAM1_N:HAIT1] +Hören Sie, das ist alles sehr, ãh... Sie geben mir was? + +[HAM1_O:HAIT1] +Ich...ich...ich glaube, ich bin hier falsch. + +[HAM1_P:HAIT1] +Erweise mir ein paar Gefãlligkeiten, Tommy... + +[HAM1_Q:HAIT1] +Die Kubaner, miese, hochnãsige Narren, hmmm, + +[HAM1_R:HAIT1] +haben meine lieben Haiti-Boys sehr geãrgert. + +[HAM1_S:HAIT1] +Jetzt haben sie den Polizisten erzãhlt, wo ich meine Pülverchen versteckt habe. + +[HAM1_T:HAIT1] +Sie denken, das sind Drogen, diese Dummköpfe. + +[HAM1_U:HAIT1] +Sei ein braver Bub, Tommy, und hole Tante Poulet die Pülverchen. + +[HAM1_V:HAIT1] +Ja, ja. Sicher, sicher. + +[HAM1_1:HAIT1] +~g~Die Cops nãhern sich dem Zeug. Hol es, bevor sie dort sind. + +[HAM1_2:HAIT1] +~r~Die Cops waren schneller bei dem Zeug! + +[HAM1_3:HAIT1] +~g~Bring das Zeug zum Unterschlupf! + +[HAM1_4:HAIT1] +~g~Gut. Jetzt das nãchste! + +[HAM1_6:HAIT1] +~r~Das Zeug wurde vernichtet, du Idiot! + +[HAM1_7:HAIT1] +~g~Die Cops haben das Zeug! Hol es dir wieder, bevor sie weg sind! + +[HAM1_8:HAIT1] +~g~Die Cops sind unterwegs, um das Zeug abzuholen. Beeil dich! + +[HAT_1A:HAIT1] +~g~Keine Bewegung, Freundchen! + +{=================================== MISSION TABLE HAIT2 ===================================} + +[HAT2_B1:HAIT2] +~g~Begib dich zu dem Wagen, in dem die fliegenden Bomben sind. + +[HAT2_B2:HAIT2] +Schalte die Kubaner aus... + +[HAT2_B4:HAIT2] +.... und zerstöre ihre Boote! + +[HAT2_B5:HAIT2] +~g~Die Kubaner hauen ab. Lass sie nicht entkommen! + +[HAT2_B6:HAIT2] +~r~Das ferngesteuerte Flugzeug ist außer Reichweite! + +[HAT2_B7:HAIT2] +~g~Einer der Kubaner flieht in einem Auto. Lass ihn nicht entkommen! + +[HAT2_B8:HAIT2] +~r~Du hast keine ferngesteuerten Flugzeuge mehr! + +[HAT2_B9:HAIT2] +Ferngesteuerte Flugzeuge: + +[HAT2_1:HAIT2] +Oh. Entschuldigung, ich muss die falsche Adresse haben... + +[HAT2_2:HAIT2] +Du kannst gern reinkommen und dich bei einer Tasse Tee ausruhen. + +[HAT2_3:HAIT2] +Hast du etwas für mich, Tommy? + +[HAT2_4:HAIT2] +Ja... + +[HAT2_5:HAIT2] +Das kommt mir so bekannt vor hier. Ein Geruch aus meiner Kindheit - das muss ein Déjà-vu sein... + +[HAT2_6:HAIT2] +Tommy, du kannst was für mich tun, ich werd's dir erklãren. Hör gut zu, ja? + +[HAT2_7:HAIT2] +Sie sehen aus wie jemand, den... + +[HAT2_8:HAIT2] +Die Kubaner haben schnelle Boote, mit denen transportieren sie Drogen übers Meer. + +[HAT2_9:HAIT2] +Davon leben sie. + +[HAT2_10:HAIT2] +Mein Neffe hat kleine fliegende Bomben gebaut, um ihnen das Handwerk zu legen. + +[HAT2_11:HAIT2] +Lass ihre Boote in die Luft fliegen. + +[HAT2_12:HAIT2] +Tja, danke für den Tee. + +[HAT2_B3:HAIT2] { reVC update } +Um eine Bombe abzuwerfen, drück die ~h~~k~~VEHICLE_FIREWEAPON~~w~-Taste. ~h~~k~~VEHICLE_ENTER_EXIT~~w~-Taste zum Beenden. + +{=================================== MISSION TABLE HAIT3 ===================================} + +[HAM3_A:HAIT3] +Hallo, hallo, ich, ãh, ich suche hier jemanden... + +[HAM3_B:HAIT3] +Du siehst hungrig aus, Tommy. + +[HAM3_C:HAIT3] +Kenne ich Sie? + +[HAM3_D:HAIT3] +Sei jetzt still. + +[HAM3_E:HAIT3] +Eine Gefãlligkeit noch, dann lasse ich dich gehen, Tommy. + +[HAM3_F:HAIT3] +Meine Jungs haben die Kubaner zum Kampf gefordert. + +[HAM3_G:HAIT3] +Aber ohne Kanonen. + +[HAM3_H:HAIT3] +Hmm, aber die Kubaner werden ihr blaues Wunder erleben. + +[HAM3_I:HAIT3] +Wenn sie in den Straßen kãmpfen, nimmst du dieses Gewehr und rãumst auf. + +[HAM3_J:HAIT3] +Keiner sieht dich, keiner hört dich. + +[HAM3_K:HAIT3] +Wenn du das für mich tust, Tommy, dann kommst frei aus meinen Schürzenbãndern. + +[HAM3_1:HAIT3] +~g~Wir müssen gewinnen. Werden alle Haitianer erledigt, haben wir verloren. + +[HAM3_3:HAIT3] +~g~Vermutlich werden die Kubaner schummeln. Sei auf der Hut! + +[HAM3_4:HAIT3] +~r~Du wurdest entdeckt! Die Mission ist fehlgeschlagen! + +[HAM3_5:HAIT3] +~g~Du musst die Kubaner aus der Distanz erwischen. Man darf dich nicht sehen. + +[HAM3_8:HAIT3] +~g~Es gibt Verluste unter den Haitianern! Du musst besser zielen! + +[HAM3_7:HAIT3] +~g~Vorsicht! Die Kubaner haben Verstãrkung mitgebracht. Schalte sie alle aus!! + +[HAM3_2:HAIT3] +~r~Die Haitianer sind weg vom Fenster! + +[HAM3_L:HAIT3] +Okay, Tantchen... + +{=================================== MISSION TABLE HOTEL ===================================} + +[INTB_A:HOTEL] +Tommy! Tommy, wir haben uns lange nicht gesehen. + +[INTB_B:HOTEL] +Hallo, Sonny. + +[INTB_C:HOTEL] +Ich weiß, ich weiß. Dir kommen vor Rührung die Trãnen. + +[INTB_D:HOTEL] +15 Jahre ist es her - dabei kommt's mir vor, als wãr's gestern gewesen. + +[INTB_E:HOTEL] +DU hast leicht reden. + +[INTB_F:HOTEL] +Hey, für die Familie in den Knast zu gehen, ist kein Zuckerschlecken, + +[INTB_G:HOTEL] +aber die Familie zeigt sich für sowas erkenntlich, ok? + +[INTB_H:HOTEL] +Also, wie ist der Deal gelaufen - hast du Schnee an der Hand? + +[INTB_I:HOTEL] +Sonny, wir sind reingelegt worden. Der Deal war eine Falle. Harry und Lee sind tot. + +[INTB_J:HOTEL] +Das ist nicht dein Ernst, Tommy. Du hast doch hoffentlich noch das Geld. + +[INTB_K:HOTEL] +Nein, Sonny... Ich hab das Geld nicht mehr. + +[INTB_L:HOTEL] +Das war mein Geld, Tommy. MEIN GELD! + +[INTB_M:HOTEL] +Versuch bloß nicht, mich reinzulegen, Tommy. Mich legt man nicht rein, das weißt du! + +[INTB_N:HOTEL] +Warte, Sonny. + +[INTB_O:HOTEL] +Du hast mein Wort darauf, dass ich dir dein Geld wiederbeschaffe. Und die Drogen. + +[INTB_P:HOTEL] +Und ich liefere dir die Kerle, die dahinterstecken. + +[INTB_Q:HOTEL] +Das weiß ich doch. Du bist kein Idiot, Tommy, aber ich warne dich - ich bin auch keiner. + +[INTB_R:HOTEL] +Wenn du's nicht wãrst - ein anderer wãr lãngst fãllig! + +[INTB_S:HOTEL] +Aber uns beide verbindet eine alte Freundschaft. Ich lasse dich das regeln. + +[INTB_T:HOTEL] +Sonny, du hast mein Ehrenwort. + +[INTB_U:HOTEL] +Du hörst von mir. + +{=================================== MISSION TABLE ICECRE1 ===================================} + +[ICC1_1:ICECRE1] +~g~Benutze deinen Eis-Wagen, um in Vice City Drogen zu verkaufen. + +[ICC1_2:ICECRE1] +~g~Parke den Eis-Wagen und drücke ~h~~k~~VEHICLE_HORN~~w~, um den Eiscreme-Jingle abzuspielen, damit deine Kunden wissen, dass du Ware zu verkaufen hast. + +[ICC1_3:ICECRE1] +~g~Für jede Transaktion bekommst du Geld. Aber je mehr Transaktionen du tãtigst, desto stãrker wird die Polizei auf dich aufmerksam. + +[ICC1_4:ICECRE1] +~g~In dieser Gegend sind keine Kunden. Versuche es woanders. + +[ICC1_5:ICECRE1] +Getãtigte Deals: + +[ICC1_6:ICECRE1] +~g~Nimm den Mr. Whopee, um in Vice City Cherry Popper-Produkte zu vertreiben. + +[ICC1_7:ICECRE1] +~g~Für jede Transaktion bekommst du Geld. Aber je mehr Transaktionen du tãtigst, desto stãrker wird die Polizei auf dich aufmerksam. + +[ICC1_8:ICECRE1] +~g~Um eine Transaktion zu tãtigen, ~h~parke deinen Wagen ~g~und drücke die ~h~~k~~VEHICLE_HORN~~g~, um den Eiscreme-Jingle abzuspielen, damit deine Kunden wissen, dass du Ware zu verkaufen hast. + +[ICC1_9:ICECRE1] +~g~Andere Gangs werden es nicht gern sehen, dass du in ihrem Revier Geschãfte machst, du musst also mit Feindseligkeiten rechnen. + +[ICC1_10:ICECRE1] +~g~Du hast ~1~ Deals getãtigt! + +[ICC1_11:ICECRE1] +~g~Du hast ~1~ Deal getãtigt. + +[ICC1_12:ICECRE1] +OBJEKT ERWORBEN! + +[ICC1_13:ICECRE1] +~r~Du hast keine Deals getãtigt! + +[ICC1_14:ICECRE1] +EISCREME-MISSIONEN ERFÜLLT + +[ICC1_15:ICECRE1] +~g~Die Eiscremefabrik generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. + +[ICC1_16:ICECRE1] +~g~Nimm den Mr. Whoopee, um in Vice City Cherry Popper-Produkte zu vertreiben. + +[ICE_AT1:ICECRE1] +EISCREMEFABRIK-MISSIONEN ERFÜLLT + +[ICE_AT2:ICECRE1] +~g~Die Cherry Popper-Fabrik generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. + +[ICC1_17:ICECRE1] +Stoff-Auslieferungs-Mission beendet + +[ICC1_18:ICECRE1] +Eiscremeverkauf insgesamt: $~1~ + +[ICC1_19:ICECRE1] +Insgesamt getãtigte Deals: ~1~ + +{=================================== MISSION TABLE ICECUT ===================================} + +[ICC1_M:ICECUT] +Sie sind schmutzige, verrotzte, verlauste, eklige, sabbernde kleine... + +[ICC1_I:ICECUT] +Ein Baby... ein widerwãrtiges, grãßliches, ekelhaftes kleines Gör! + +[ICC1_J:ICECUT] +Mammi liebt dich nicht. Du kleines Stück Scheiße! + +[ICC1_A:ICECUT] +Wer sind Sie? + +[ICC1_B:ICECUT] +Der neue Inhaber dieses Ladens. + +[ICC1_C:ICECUT] +Sind Sie, oder waren Sie je ein Kind? + +[ICC1_D:ICECUT] +Was soll denn das heißen? + +[ICC1_E:ICECUT] +Waren Sie je ein Kind? + +[ICC1_F:ICECUT] +Ja! Immer mit der Ruhe! Was ist denn mit Ihnen los? + +[ICC1_G:ICECUT] +Ich wusste es. Ein Kind. + +[ICC1_H:ICECUT] +Ein schmutziges, stinkendes, verrotztes, verlaustes, nölendes kleines Baby! + +[ICC1_K:ICECUT] +Au! Beruhigen Sie sich doch! + +[ICC1_L:ICECUT] +Ich HASSE Babies. Und ich hasse Kinder. + +[ICC1_N:ICECUT] +Es reicht jetzt! + +[ICC1_P:ICECUT] +Sie stellen doch Softeis her, oder? Das essen doch nur Kinder. + +[ICC1_Q:ICECUT] +Sind Sie komplett irre? + +[ICC1_R:ICECUT] +Erklãren Sie mir das mal - warum Kinder glücklich machen, wenn Sie sie hassen? + +[ICC1_S:ICECUT] +Oh, du dãmliches, verrotztes, verlaustes- + +[ICC1_T:ICECUT] +Schluss jetzt! + +[ICC1_U:ICECUT] +- Gör! + +[ICC1_V:ICECUT] +Das Eis ist nur Tarnung! + +[ICC1_W:ICECUT] +Wir vertreiben auch andere Waren. Nicht-Milchprodukte. + +[ICC1_X:ICECUT] +Und wenn ich ein Kind sehe, dann weiß ich, was ich mit ihm anfange. + +[ICC1_Y:ICECUT] +Nicht wahr, Kinderchen? Ja, ja. Mammi hat euch gar nicht lieb. + +[ICC1_Z:ICECUT] +Sie HASST euch! + +[ICC1_ZA:ICECUT] +OBJEKT ERWORBEN! + +{=================================== MISSION TABLE INTRO ===================================} + +[INT1_A:INTRO] +Tommy Vercetti...Hah! Shit. + +[INT1_B:INTRO] +Hãtte nicht gedacht, dass der noch mal rauskommt. + +[INT1_C:INTRO] +Er hat den Kopf eingezogen. War fast vergessen. + +[INT1_D:INTRO] +Aber bald wird man sich an ihn erinnern. + +[INT1_E:INTRO] +Wenn man ihn wieder durch ihre Viertel tigern sieht. + +[INT1_F:INTRO] +Wird schlecht fürs Geschãft sein. + +[INT1_G:INTRO] +Tja, was sollen wir machen, Sonny? + +[INT1_H:INTRO] +Wir machen auf alte Kumpels und schicken ihn woanders hin. Ok? + +[INT1_I:INTRO] +Wir wollten doch sowieso nach Süden expandieren, oder? + +[INT1_J:INTRO] +In Vice City liegt zurzeit das Geld auf der Straße. + +[INT1_K:INTRO] +Die Kolumbianer, die Mexikaner, + +[INT1_L:INTRO] +ja, sogar die kubanischen Flüchtlinge machen alle glãnzende Geschãfte. + +[INT1_M:INTRO] +Aber das geht nur mit Drogen, Sonny. + +[INT1_N:INTRO] +Aber keine der Familien rührt dieses Zeug an! + +[INT1_O:INTRO] +Die Zeiten ãndern sich. + +[INT1_P:INTRO] +Die Familien können nicht wegsehen, wãhrend unsere Feinde groß abkassieren. + +[INT1_Q:INTRO] +Also schicken wir jemanden für die Drecksarbeit da runter + +[INT1_R:INTRO] +und schneiden uns 'ne hübsche Scheibe ab. Ok? + +[INT1_S:INTRO] +Wer ist unser Kontaktmann da unten? + +[INT1_T:INTRO] +Ken Rosenberg, ein Idiot von einem Anwalt. + +[INT1_U:INTRO] +Wie soll der Vercetti im Zaum halten? + +[INT1_V:INTRO] +Muss er gar nicht. + +[INT1_W:INTRO] +Wir lassen ihn einfach auf Vice City los. + +[INT1_X:INTRO] +Wir geben ihm ein bisschen Startgeld, ok? + +[INT1_Y:INTRO] +Wir warten ein paar Monate. + +[INT1_Z:INTRO] +Dann fahren wir hin + +[INT1_A1:INTRO] +und schauen mal bei ihm rein, klar? + +[INT1_A2:INTRO] +Mal sehen, wie er sich macht. + +[INT2_A:INTRO] +Hey, hey, Jungs! Ich bin, ãh, Ken Rosenberg. Ha, ha, sehr gut, hey! + +[INT2_B:INTRO] +Tja, ãh, ich soll euch zu dem Trefffen fahren, okay? + +[INT2_C:INTRO] +Ich hab mit den Lieferanten geredet, und die würden, + +[INT2_D:INTRO] +liebend gern mit uns ins Geschãft kommen. Und, ãh, + +[INT2_E:INTRO] +wenn alles gut geht, dann dürfte da + +[INT2_F:INTRO] +ein Haufen Kohle für uns drin sein. Und das ist doch, na ja... + +[INT2_G:INTRO] +gut... + +[INT2_H:INTRO] +Okay. Es sind zwei Brüder, ok? + +[INT2_I:INTRO] +Der eine schmeißt, ãh, den Laden, + +[INT2_J:INTRO] +der andere macht die Flüge. + +[INT2_K:INTRO] +Die arbeiten von Mexiko aus, + +[INT2_M:INTRO] +Sie haben eine Farm in Panama. + +[INT2_N:INTRO] +Okay, passt auf, Jungs, + +[INT2_O:INTRO] +wenn wir dort ankommen, sollte ich im Auto bleiben, + +[INT2_P:INTRO] +oder soll ich mit reinkommen? + +[INT2_Q:INTRO] +Nein. Bleib im Wagen. + +[INT2_R:INTRO] +Wisst ihr was, ich hab's mir überlegt. + +[INT2_S:INTRO] +Ich pass auf den Wagen auf. + +[INT3_A:INTRO] +Ok, das sind sie, da im Helikopter. + +[INT3_B:INTRO] +Ok, das ganze lãuft so ab: + +[INT3_C:INTRO] +Die wollen eine saubere Übergabe auf offenem Gelãnde. + +[INT3_D:INTRO] +Alles klar? Ok, dann wollen wir mal. + +[INT3_E:INTRO] +Ok, ganz ruhig jetzt. + +[INT3_F:INTRO] +Ich bin hier. Der Wagen lãuft, Baby! + +[INT3_G:INTRO] +Hast du's? + +[INT3_H:INTRO] +100% astreines kolumbianisches Koks, mein Freund. + +[INT3_I:INTRO] +Die Kohle? + +[INT3_J:INTRO] +Zehner und Zwanziger. Gebrauchte Scheine. + +[INT3_L:INTRO] +Los, los, weg hier! Fahr los! + +[INT4_A:INTRO] +Gearscht. Wir sind voll gearscht! + +[INT4_B:INTRO] +Das ist wieder typisch. + +[INT4_C:INTRO] +Da passe ich eine einziges Mal nicht auf, + +[INT4_D:INTRO] +und prompt kriege ich eins reingewürgt. + +[INT4_E:INTRO] +Hier! + +[INT4_F:INTRO] +Hör endlich auf zu jammern. Du lebst schließlich noch, oder? + +[INT4_G:INTRO] +Lass mich hier raus. + +[INT4_H:INTRO] +Schaff das Auto weg und leg dich schlafen. + +[INT4_I:INTRO] +Ich komme morgen zu dir ins Büro, dann sehen wir weiter. + +[INT4_J:INTRO] +Ok, gute Idee. Ich leg mich erstmal hin. + +[INT4_K:INTRO] +Was hast du vor? + +[INT4_L:INTRO] +Ich geh zurück in mein Hotel. + +[INT4_M:INTRO] +Ich muss nachdenken, was schiefgelaufen ist. + +[INT4_N:INTRO] +Ok. + +[INTRO1:INTRO] +Da passe ich ein einziges Mal nicht auf, und prompt kriege ich eins reingewürgt. + +[INTRO2:INTRO] +Leg dich schlafen. + +[INTRO3:INTRO] +Was hast du vor? + +[INTRO4:INTRO] +Ich komme morgen zu dir ins Büro, dann sehen wir weiter. + +[INT3_K:INTRO] +Tja, der Deal kann steigen, mein Freund. + +[INT3_M:INTRO] +Zeig her. + +[INT2_L:INTRO] +Nein, nein, nein, wartet... + +{=================================== MISSION TABLE KENT1 ===================================} + +[KPM1_A:KENT1] +Ok, du Knallkopf, ich werde deine Haut retten. + +[KPM1_B:KENT1] +Was sagst du? + +[KPM1_C:KENT1] +Du kennst doch Diaz, den Idioten, den Koks-König? + +[KPM1_D:KENT1] +Er hat deinen Freund Lance. Es heißt, dein Kumpel wollte ihm an den Kragen. + +[KPM1_E:KENT1] +Hat ihn aber fast den eigenen gekostet hat, falls du weißt, was ich meine. + +[KPM1_F:KENT1] +Wo hat er ihn hingebracht? Im Klartext! + +[KPM1_G:KENT1] +Mach dich mal locker! Sie haben ihn beim Schrottplatz erwischt. + +[KPM1_H:KENT1] +Verdammt noch mal. Psycho. + +[KPM1_2:KENT1] +~r~Du solltest Lance lebend da rausholen! + +[KPM1_3:KENT1] +Lance' Gesundheitszustand: + +[RESC_1:KENT1] +Kannst du eine Waffe halten? + +[RESC_2:KENT1] +Klar, glaub schon. Freut mich, dich zu sehen. + +[RESC_3:KENT1] +Los, wir verschwinden von hier. + +[RESC_4:KENT1] +Dank dir ist mein ganzer schöner Plan im Eimer. Das hast du sauber vermasselt, Lance. + +[RESC_5:KENT1] +Er hat meinen Bruder auf dem Gewissen. Soll ich ihm den Rasen mãhen? + +[RESC_6:KENT1] +Wir müssen diesen Diaz erledigen bevor er uns erledigt. + +[RESC_7:KENT1] +Lass dich zusammenflicken, dann treffen wir uns auf der Brücke nach Star Island, ok? + +[RESC_8:KENT1] +Ok, alles klar. + +[KPM1_1:KENT1] +~g~Lance wird auf dem Schrottplatz gefangengehalten. Rette ihn! + +[KPM1_4:KENT1] +~g~Bring Lance ins Krankenhaus! + +[M_PASSN:KENT1] +MISSION ERFÜLLT! + +[KPM1_5:KENT1] +~g~Diaz' Leute sind hinter euch her. Bring Lance ins Krankenhaus. + +{=================================== MISSION TABLE KICKSTT ===================================} + +[KICK1_2:KICKSTT] +~r~Du warst nicht schnell genug bei der Maschine! + +[KICK1_7:KICKSTT] +~r~Du hast die Maschine geschrottet! + +[KICK1_8:KICKSTT] +~g~Setz dich auf das Motorrad! + +[KICK1_T:KICKSTT] +BENÖTIGTE ZEIT: + +[KICKTM:KICKSTT] +~b~ZEIT: ~1~:~1~ + +[KICKTM2:KICKSTT] +~b~ZEIT: ~1~:0~1~ + +[GETBIKE:KICKSTT] +~g~Du hast ~1~ Sekunden, um zu einer Gelãndemaschine zurückzukehren, bevor die Mission endet. + +[KICK1_1:KICKSTT] +~g~Absolviere den Kurs so schnell wie möglich. + +[KICK1_6:KICKSTT] +~g~Gut gemacht! + +[KICK_10:KICKSTT] +~G~Nimm den Sanchez und absolviere den Kurs, indem du alle Checkpoints passierst. + +[KICK_12:KICKSTT] +~r~Du hast es vermasselt! + +[KICK_13:KICKSTT] +~r~Du hast zu lange gebraucht! + +[KICK_11:KICKSTT] +~g~Um die Mission zu beenden, stell dich zu Fuß in die ~q~rosa Markierung~g~. + +{=================================== MISSION TABLE LAWYER1 ===================================} + +[LAW1_A:LAWYER1] +Leg dich schlafen, sagt er - + +[LAW1_B:LAWYER1] +- Ich sitz die ganze Nacht im Dunklen hier rum und trink Kaffee! + +[LAW1_C:LAWYER1] +Das ist eine Katastrophe. Wir sind so gearscht, Mann! + +[LAW1_D:LAWYER1] +Diese Gorillas, die kommen hier runter und reißen mir den Kopf ab. Es ist beinahe zum lachen! + +[LAW1_E:LAWYER1] +Dafür habe ich NICHT Jura studiert. Ok, was sollen wir jetzt machen? + +[LAW1_F:LAWYER1] +Sei still, setz dich hin und bleib ruhig. Ich sag dir, was wir machen. + +[LAW1_G:LAWYER1] +Du findest raus, wer das Koks geklaut hat - und ich nehm ihn mir vor. + +[LAW1_H:LAWYER1] +Gute Idee. SEHR gute Idee. Lass mich nachdenken, lass mich nachdenken. + +[LAW1_I:LAWYER1] +OH! Da gibt es diesen Colonel a.D., Colonel Juan Garcia Cortez. + +[LAW1_J:LAWYER1] +Der half mir, diesen Deal einzufãdeln, + +[LAW1_K:LAWYER1] +und zwar ohne Vice Citys Gangster-Establishment. Ok? + +[LAW1_L:LAWYER1] +Pass auf, der gibt eine Party in der Bucht, auf seiner Luxusjacht + +[LAW1_M:LAWYER1] +da kommt alles, was in Vice City Rang und Namen hat. + +[LAW1_N:LAWYER1] +Ich hab natürlich eine Einladung, versteht sich, + +[LAW1_O:LAWYER1] +aber mich kriegen keine zehn Pferde hier raus. Auf keinen Fall! + +[LAW1_P:LAWYER1] +Halt die Klappe! Ich geh selbst hin... + +[LAW1_Q:LAWYER1] +Moment! Hey, ich steh ja auch auf den 78er Look , aber das wird dort kein nostalgisches Saufgelage. + +[LAW1_R:LAWYER1] +Ich meine, nichts gegen dich, aber mit den Klamotten wirst du dort ziemlich blöd angeschaut. + +[LAW1_S:LAWYER1] +Wieso? Was ist mit meinen Sachen? + +[LAW1_T:LAWYER1] +Pass auf. Fahr zu Rafael. Sag ihm, ich schicke dich, und er soll dich ordentlich einkleiden. + +[LAW1_U:LAWYER1] +Ok, Los jetzt. Mach hinne... + +[LAWP_1:LAWYER1] +Guten Abend. + +[LAWP_2:LAWYER1] +Ich höre, Sie sind anstelle von Mr. Rosenberg hier. + +[LAWP_3:LAWYER1] +Ich hoffe, gewisse Vorfãlle haben seiner Gesundheit nicht geschadet, + +[LAWP_4:LAWYER1] +oder seiner Psyche, Mr...ãh? + +[LAWP_5:LAWYER1] +Vercetti. Er leidet ein wenig an...Platzangst. + +[LAWP_6:LAWYER1] +Ausgezeichnet, ausgezeichnet. Und Sie? + +[LAWP_7:LAWYER1] +Ich will nur meine Ware. + +[LAWP_8:LAWYER1] +Ah. Eine missliche Lage für alle Beteiligten. + +[LAWP_9:LAWYER1] +Natürlich stelle ich selbst Nachforschungen an, aber + +[LAWP_10:LAWYER1] +bei solch heiklen Sachen dauert das ein wenig. + +[LAWP_11:LAWYER1] +Wir sprechen uns vielleicht spãter. Hm? + +[LAWP_12:LAWYER1] +Inzwischen möchte ich Ihnen meine Tochter vorstellen, + +[LAWP_13:LAWYER1] +Mercedes! + +[LAWP_14:LAWYER1] +Könntest du dich um unseren Gast kümmern, wãhrend ich mich um andere Dinge + +[LAWP_15:LAWYER1] +Natürlich, Daddy. + +[LAWP_16:LAWYER1] +Entschuldigen Sie mich, bitte. + +[LAWP_17:LAWYER1] +Mercedes!? + +[LAWP_18:LAWYER1] +Leb du mal mit so 'nem Namen. + +[LAWP_19:LAWYER1] +Na gut, ich zeig dir mal einige unserer bekannteren Gãste... + +[LAWP_20:LAWYER1] +Das ist unser Abgeordneter Alex Shrub mit dem aufgehenden Sternchen Candy Suxx.. + +[LAWP_21:LAWYER1] +Und kennen Sie schon meine reizende Frau Laura? Nein? + +[LAWP_22:LAWYER1] +Nun, leider ist sie in Alabama. Das hier ist Candy. + +[LAWP_23:LAWYER1] +Und hier haben wir den Star-Verteidiger der Vice City Mambas, BJ. + +[LAWP_24:LAWYER1] +Immer charmant. + +[LAWP_25:LAWYER1] +Ich hab ihn voll geblockt. Der sitzt heute im Rollstuhl! + +[LAWP_26:LAWYER1] +Haha, das ist gut! + +[LAWP_27:LAWYER1] +Tja, ich bin an einem super Grundstück dran. + +[LAWP_28:LAWYER1] +Und der Schleimbold dort ist Jezz Torrent, + +[LAWP_29:LAWYER1] +Der Sãnger von 'Love Fist'. + +[LAWP_30:LAWYER1] +Wisst ihr, wie sie in Thailand Pingpong spielen? + +[LAWP_31:LAWYER1] +Ich verrat's euch, + +[LAWP_32:LAWYER1] +man spielt ohne Schlãger, wenn ihr wisst, was ich meine! + +[LAWP_33:LAWYER1] +Impotent. + +[LAWP_34:LAWYER1] +Und das schwatzhafte Trio. + +[LAWP_35:LAWYER1] +Diese schlafende Schweißfabrik ist Papas Obersklave, Gonzalez. + +[LAWP_36:LAWYER1] +und die anderen beiden sind Pastor Richards + +[LAWP_37:LAWYER1] +und der pseudo-intellektuelle Regisseur Steve Scott. + +[LAWP_38:LAWYER1] +....leidenschaftlich mit den nymphomanischen Aliens + +[LAWP_39:LAWYER1] +Da kommt der riesige Hai und + +[LAWP_40:LAWYER1] +beißt ihnen ihr Ding ab! + +[LAWP_41:LAWYER1] +Ha! So was hat doch die Welt noch nicht gesehen, oder? + +[LAWP_42:LAWYER1] +Colonel! + +[LAWP_43:LAWYER1] +Ihre Party ist wie immer fantastisch, hahahaha! + +[LAWP_44:LAWYER1] +Ich entschuldige mich für die Verspãtung. + +[LAWP_45:LAWYER1] +Ah, nicht doch, Amigo. Wie geht es ihnen? + +[LAWP_46:LAWYER1] +Unsere Geschãfte laufen schwierig - die Barbaren stehen vor den Toren. + +[LAWP_47:LAWYER1] +Eine Zeit, Freunde zu belohnen und Feinde auszuschalten, Amigo. + +[LAWP_48:LAWYER1] +Wer ist das Großmaul? + +[LAWP_49:LAWYER1] +Ricardo Diaz. Er ist Mr. Koks. + +[LAWP_50:LAWYER1] +Mercedes! + +[LAWP_51:LAWYER1] +Oh, ich will gerade meinen Freund in die Stadt bringen. + +[LAWP_52:LAWYER1] +Ein andermal, Ricardo! + +[LAWP_53:LAWYER1] +Lass uns verschwinden. + +[LAWP_54:LAWYER1] +Fahr mich zum Pole Position Club. + +[LAW1_2:LAWYER1] +~g~Begib dich zur Jacht des Colonels. + +[LAW1_4:LAWYER1] +~r~Du hast die Tochter des Colonels erledigt! + +[LAW1_5:LAWYER1] +Wirst du für meinen Vater arbeiten? + +[LAW1_6:LAWYER1] +Vielleicht. + +[LAW1_7:LAWYER1] +Darf ich meine Hand in deinen Schoß legen? + +[LAW1_8:LAWYER1] +Vielleicht... + +[LAW1_9:LAWYER1] +Es ist schwer, einen so reichen, mãchtigen Vater zu haben. Los. + +[LAW1_10:LAWYER1] +Wir sehen uns, mein Hübscher! + +[LAW1_11:LAWYER1] +Ganz bestimmt. + +[LAW1_12:LAWYER1] +Hmm, netter Ofen. + +[LAW1_13:LAWYER1] +Nein! Mein Motorrad! + +[LAW1_3:LAWYER1] +~g~Bring die Tochter des Colonels zum Pole Position Club. + +[HELP20:LAWYER1] +Folge dem ~h~T-shirt-Symbol~w~ auf dem Radar, um Rafael's zu finden. + +[LAW1_14:LAWYER1] +Wow, das ist ja wirklich ein tolles Motorrad. + +[LAW1_15:LAWYER1] +Ja, Baby, hab ich mir gerade bei Howlin' Pete's besorgt. + +{=================================== MISSION TABLE LAWYER2 ===================================} + +[LAW2_A:LAWYER2] +Ah! Tja, ich hoffe, du amüsierst dich gut, wãhrend ich hier vor Angst halb umkomme. Was hast du rausgefunden? + +[LAW2_B:LAWYER2] +Dass es in dieser Stadt mehr Gangster gibt als im Knast. Wir brauchen einen Tipp von der Straße... + +[LAW2_C:LAWYER2] +Ok, lass mich nachdenken, lass mich nachdenken - + +[LAW2_D:LAWYER2] +- AH! Ich hab's! + +[LAW2_E:LAWYER2] +Ok, es gibt da so 'n Englãnder, so 'n Idiot aus der Musikbranche. + +[LAW2_F:LAWYER2] +Er nennt sich Kent Paul. + +[LAW2_G:LAWYER2] +Und der ist in all den Kreisen von Vice City richtig dick drin. + +[LAW2_H:LAWYER2] +Wenn einer weiß, wo 20 Kilo Koks abgeblieben sind, + +[LAW2_I:LAWYER2] +dann dieser Typ. Er ist immer im Malibu. + +[LAW2_J:LAWYER2] +Ich seh ihn mir mal an. + +[LAW2B_A:LAWYER2] +Wo kommst du denn her? + +[LAW2B_B:LAWYER2] +Nach einer wie dir suche ich schon seit Ewigkeiten. + +[LAW2B_C:LAWYER2] +Kent Paul. Ja, ich bin hier die Nummer Eins. + +[LAW2B_D:LAWYER2] +Ich suche einen Englãnder... + +[LAW2B_E:LAWYER2] +Ich ziehe hier die Strippen, verstehst du? + +[LAW2B_F:LAWYER2] +Ich lade dich ein. Ich kann dir alles besorgen, Süße. + +[LAW2B_G:LAWYER2] +Mach dir keine Gedanken. + +[LAW2B_H:LAWYER2] +Verzieh dich, Schãtzchen. + +[LAW2B_I:LAWYER2] +Oi oi oi oi! + +[LAW2B_J:LAWYER2] +Bist du Kent Paul? Ich bin ein Freund von Rosenberg... + +[LAW2B_K:LAWYER2] +Rosenberg...Rosenberg... Ach, dieser abgedrehte Winkeladvokat! + +[LAW2B_L:LAWYER2] +Der bringt noch den Unschuldigsten auf den elektrischen Stuhl! + +[LAW2B_M:LAWYER2] +Mach uns noch 'nen Drink, mein Freund. + +[LAW2B_N:LAWYER2] +Bist ein echter Komiker. + +[LAW2B_O:LAWYER2] +Hör zu, ich vermisse 20 Kilo und einen Haufen Geld... + +[LAW2B_P:LAWYER2] +Drogen? Das ist doch Schwachsinn. + +[LAW2B_Q:LAWYER2] +Was weißt du darüber? + +[LAW2B_R:LAWYER2] +Oi, oi! Gerade wollte ich's sagen... + +[LAW2B_S:LAWYER2] +Es gibt da einen Koch, der verdealt Koks in der Küche eines Hotels am Ocean Drive. + +[LAW2B_T:LAWYER2] +Macht einen ziemlich zufriedenen Eindruck in letzter Zeit. Solltest du mal auschecken. + +[LAW2B_U:LAWYER2] +Mach ich. Und wir sehen uns. + +[LAW2B_V:LAWYER2] +Ja, ja. Nur zu. Hau bloß ab, du Stinktier. Dir polier ich noch die Visage! + +[LAW2B_W:LAWYER2] +Gib mir 'nen Drink. Und wo ist die Puppe? + +[LAW2C_A:LAWYER2] +Oh, sehr gut, Rambo, schlag ihn ruhig zu Brei. Dann redet er ganz bestimmt. + +[LAW2C_B:LAWYER2] +Willst du auch ein paar? + +[LAW2C_C:LAWYER2] +Hey, ruhig. Ich will das gleiche wie du, Bruder. + +[LAW2C_D:LAWYER2] +Ach ja? Und das wãre? + +[LAW2C_E:LAWYER2] +Deine Kohle und den Stoff meines toten Bruders. Aber du hast gerade unsere Spur erledigt. + +[LAW2C_F:LAWYER2] +Dumm gelaufen. Verzieh dich. + +[LAW2C_G:LAWYER2] +Hey, hey! Kein Grund, hier den dicken Mann zu spielen. + +[LAW2C_H:LAWYER2] +Sieh mal: Wir sind zwei Hombres in 'ner fremden Stadt. Wir sollten uns gegenseitig helfen. + +[LAW2C_I:LAWYER2] +Ich helf mir selbst, Bruder. + +[LAW2C_J:LAWYER2] +Bist du dir sicher? Hier nimm das. + +[LAW2C_K:LAWYER2] +Komm mit! + +[LAW2_1:LAWYER2] +Was glotzt du denn so? + +[LAW2_2:LAWYER2] +Rede endlich... + +[LAW2_3:LAWYER2] +Zwing mich doch dazu, du Pfeife! + +[LAW2_4:LAWYER2] +Mir nach! + +[LAW2_5:LAWYER2] +Ich seh zu, was ich rausfinde. Ich behalte dich im Auge, Tommy. + +[LAW2_6:LAWYER2] +~g~Begib dich zum Malibu Club und suche Kent Paul. + +[LAW2_7:LAWYER2] +~g~Suche den Küchenchef auf dem Ocean Drive. + +[LAW2_10:LAWYER2] +~g~Fahre zurück zum Hotel. + +[LAW2_11:LAWYER2] +~g~Nimm sein Handy. + +[LAW2_12:LAWYER2] +Du hast jetzt ein Handy und kannst Telefongesprãche entgegennehmen! + +[LAW2_13:LAWYER2] +~g~Du hast Lance zurückgelassen! Geh ihn holen! + +[LAW2_14:LAWYER2] +Verdammt, nichts wie weg hier! + +[GUN_2A:LAWYER2] +Halte die ~h~~k~~PED_LOCK_TARGET~ ~w~gedrückt, um ~h~automatisch zu zielen~w~. Drücke die ~h~~k~~PED_FIREWEAPON~~w~, um zu ~h~feuern! + +[GUN_2C:LAWYER2] +Halte die ~h~~k~~PED_LOCK_TARGET~ ~w~gedrückt, um ~h~automatisch zu zielen~w~. Drücke die ~h~~k~~PED_FIREWEAPON~~w~, um zu ~h~feuern! + +[GUN_2D:LAWYER2] +Halte die ~h~~k~~PED_LOCK_TARGET~ ~w~gedrückt, um ~h~automatisch zu zielen~w~. Drücke die ~h~~k~~PED_FIREWEAPON~~w~, um zu ~h~feuern! + +[HELP17:LAWYER2] +Drücke die ~h~~k~~PED_FIREWEAPON~~w~, um den Küchenchef anzugreifen. + +[HELP18:LAWYER2] +Drücke die~h~ ~k~~PED_FIREWEAPON~~w~, um den Küchenchef anzugreifen. + +[LAW3_11:LAWYER2] +Stell dich in die ~q~rosa Markierung~w~, um zu sehen, was im Angebot ist. + +[LAW3_12:LAWYER2] +Du kannst Waffen auswãhlen, indem du die ~h~linke~w~ oder ~h~rechte~w~ ~h~Richtungstaste drückst. + +[LAW3_13:LAWYER2] +Wenn du genug Geld hast, kannst du Waffen durch Drücken der ~h~~k~~PED_SPRINT~~w~ kaufen. + +[LAW3_14:LAWYER2] +Um zu gehen, drücke die ~h~~k~~VEHICLE_ENTER_EXIT~ + +[LAW3_15:LAWYER2] +Folge dem ~h~Pistolensymbol~w~ auf dem Radar, so kommst du zu AmmuNation. + +[LAW2_15:LAWYER2] +~g~Begib dich zu AmmuNation. + +[LAW2_K:LAWYER2] +Nur die Ruhe. + +[LAW2_16:LAWYER2] +Eins musst du wissen: In dieser Stadt darfst du nie unbewaffnet sein. + +[LAW2_17:LAWYER2] +Komm, der nãchste Waffenladen ist ein paar Blocks von hier. + +[LAW2_18:LAWYER2] +Tommy, jeder Mann braucht ab und zu mal ein bisschen Entspannung. + +[LAW2_19:LAWYER2] +Das ist die Pole Position Stripper-Bar. Solltest du bei Gelegenheit mal reinschauen. + +{=================================== MISSION TABLE LAWYER3 ===================================} + +[_A:LAWYER3] +Arrgh! Ach, du lieber Gott! Du! Meine Güte, ich brauch 'ne neue Hose! + +[LAW3_B:LAWYER3] +Hey, diese Psychos aus dem Norden haben angerufen. Sie kommen bald hier runter. + +[LAW3_C:LAWYER3] +Also, wo ist das verdammte Geld? + +[LAW3_D:LAWYER3] +Ganz ruhig. Soweit sind wir noch nicht. + +[LAW3_E:LAWYER3] +Ich hab wirklich gedacht, du erledigst das. + +[LAW3_F:LAWYER3] +Und jetzt sagen diese Gauner, wir sollen ihnen einen Gefallen tun. + +[LAW3_G:LAWYER3] +Du meinst, ICH soll ihnen einen Gefallen tun. + +[LAW3_H:LAWYER3] +Du sagst es. Sehe ich aus, als könnte ich Geschworene einschüchtern? + +[LAW3_I:LAWYER3] +Ich kann nicht mal ein Kind einschüchtern. Ich hab's versucht. + +[LAW3_J:LAWYER3] +Hör zu, wenn du kneifst, kriegt Forellis Cousin Georgio 5 Jahre wegen Betrugs. + +[LAW3_K:LAWYER3] +Du musst diese Typen ausschalten. + +[LAW3_L:LAWYER3] +Verstehe. Den Geschworenen helfen 'umzudenken'. Kein Problem. + +[LAW3_M:LAWYER3] +Nein, nein, nein! Das hab ich schon versucht. Das ist nicht gelaufen, + +[LAW3_N:LAWYER3] +ZWING sie dazu, umzudenken. + +[LAW3_1:LAWYER3] +Georgio lãsst grüßen. + +[LAW3_2:LAWYER3] +Denk dran, 'Schuldig' ist ein hãssliches Wort. + +[LAW3_3:LAWYER3] +'Unschuldig', bis ich was anderes sage. + +[LAW3_4:LAWYER3] +Er ist nicht schuldig. + +[LAW3_5:LAWYER3] +Du kennst Georgio? Merk dir: Er ist nicht schuldig. + +[LAW3_6:LAWYER3] +Nicht schuldig. Verstanden...gut. + +[LAW3_8:LAWYER3] +~r~Du hast einen Geschworenen erledigt! + +[LAW3_9:LAWYER3] +~g~Schrotte das Auto des Geschworenen, damit er aussteigt! + +[HELP40:LAWYER3] +Du kannst Autos mit dem Hammer oder einer ãhnlichen Waffe zertrümmern. + +[HELP41:LAWYER3] +Oder du kannst sie mit einem Fahrzeug rammen. + +[LAW3_10:LAWYER3] +~g~Eine Nahkampfwaffe kannst du im ~h~Eisenwarenladen~g~ kaufen. + +[LAW3_20:LAWYER3] +~g~Schrotte das Auto des Geschworenen! + +[LAW3_21:LAWYER3] +Das kann doch wohl nicht wahr sein! + +[LAW3_22:LAWYER3] +Unglaublich! + +[LAW3_23:LAWYER3] +Ok! Ok! Ich hab kapiert! + +[LAW3_24:LAWYER3] +~g~Dieser Hammer wãre nützlich. + +[LAW3_7:LAWYER3] +~g~Schüchtere die 2 Geschworenen ein, aber erledige sie NICHT! + +[HELP23:LAWYER3] +Folge dem ~h~Hammer-Symbol~w~ auf dem Radar, wenn du beim Eisenwarenladen Nahkampfwaffen kaufen willst. + +[LAW3_16:LAWYER3] +Dãmlicher Florida-Idiot! + +[LAW3_17:LAWYER3] +Aus dem Weg! + +{=================================== MISSION TABLE LAWYER4 ===================================} + +[LAW4_A:LAWYER4] +Avery, es versteht sich von selbst... Tommy! Tommy! Fortschritte gemacht? Nein, erzãhl's mir spãter. + +[LAW4_B:LAWYER4] +Tommy, das ist Avery Carrington. Kennt ihr euch nicht von der Party? + +[LAW4_C:LAWYER4] +Nicht persönlich. + +[LAW4_D:LAWYER4] +Tagchen. + +[LAW4_E:LAWYER4] +Avery hat einen Vorschlag für uns. + +[LAW4_F:LAWYER4] +Haben wir nicht was besseres zu tun? + +[LAW4_G:LAWYER4] +Ich versuch hier, unseren Hals zu retten. Also würdest du mich bitte ausreden lassen? + +[LAW4_H:LAWYER4] +Ich hab Angst. Aber wenn ich schon Ende der Woche sterbe, möchte ich wenigstens nicht arm sterben. + +[LAW4_I:LAWYER4] +Jetzt beruhigt euch, ihr beiden. + +[LAW4_J:LAWYER4] +Junge, wenn du mir hilfst, sorge ich dafür, dass jeder, der dir Ãrger macht, unter die Erde kommt. + +[LAW4_K:LAWYER4] +Ok, was kann ich für Sie tun? + +[LAW4_L:LAWYER4] +Eine Spedition hat ihr Lager auf einem Top-Grundstück - und will nicht verkaufen. + +[LAW4_M:LAWYER4] +Die sitzen da drauf wie die Ratten in ihren Löchern. Also müssen wir dieses Ungeziefer ausrãuchern. + +[LAW4_N:LAWYER4] +Fahr hin und stich ein wenig ins Wespennest. + +[LAW4_O:LAWYER4] +Das wird die Security beschãftigen. Dann schleichst du dich rein und machst den Laden platt. + +[LAW4_P:LAWYER4] +Und du könntest dich bei Rafael's neu einkleiden. Kann 'ne Weile dauern, aber mach das ruhig mal. + +[LAW4_Q:LAWYER4] +Das gibt ein Fest. + +[LAW4_R:LAWYER4] +Wenn alles lãuft wie geplant, komm mal zu mir ins Büro... + +[LAW4_1:LAWYER4] +Bitte, geht auseinander! Die Geschãftsleitung wird sich aller Probleme annehmen! + +[LAW4_2:LAWYER4] +Bitte, geht auseinander! Geht wieder nach Hause! + +[LAW4_3:LAWYER4] +Bitte, geht auseinander! Das ist nicht akzeptabel! + +[LAW4_4:LAWYER4] +Bitte, geht auseinander! Ihr landet alle auf der Straße! + +[LAW4_5:LAWYER4] +Die Knüppel raus, Jungs! Diesen Kommis zeigten wir's! + +[LAW4_13:LAWYER4] +Fange mit mind. 4 Arbeitern Streit an, um einen Aufruhr zu starten. + +[LAW4_14:LAWYER4] +~g~Zerstöre die Transporter auf dem Gelãnde! + +[HELP38:LAWYER4] +Wenn du jemanden ausschaltest, der eine Waffe trãgt, lãsst er sie fallen. + +[HELP39:LAWYER4] +Du kannst explosive Fãsser anvisieren und abschießen, aber bleib auf Distanz. + +{=================================== MISSION TABLE MIAMI_1 ===================================} + +[T4X4_1A:MIAMI_1] +~g~Du hast ~1~ Sekunden, um ~y~24~g~ Checkpoints abzufahren. ~g~Die ~y~REIHENFOLGE IST BELIEBIG. + +[T4X4_1B:MIAMI_1] +~y~PASSIERE~g~ den ersten Checkpoint, dann lãuft die ~r~STOPPUHR. + +[T4X4_1C:MIAMI_1] +~1~ von 24! + +[GETBIK1:MIAMI_1] +Du hast ~1~ Sekunden, um auf eine PCJ 600 zu steigen! + +[GETBIK3:MIAMI_1] +~r~Du brauchst eine PCJ 600, um diese Mission durchzuführen! + +{=================================== MISSION TABLE MM ===================================} + +[BLOD_04:MM] +ZUSTAND AUTO: + +[BLOD_05:MM] +~g~ZIELZEIT: ~1~ Minute + +[BLOD_06:MM] +~g~ZIELZEIT: ~1~ Minuten + +[BLOD_07:MM] +NEUE Bestzeit: ~1~ Sekunden + +[BLOD_08:MM] +Zerstörte Autos: ~1~ + +[BLOD_09:MM] +$~1~ + +[BLOD_10:MM] +SIEGER!! + +[BLOD_01:MM] +Fahr durch die Checkpoints, um deine Gesamtzeit zu verlãngern. + +[BLOD_02:MM] +Wenn die Gesamtzeit abgelaufen ist, hast du versagt. + +[BLOD_03:MM] +Um zu gewinnen, muss deine Gesamtzeit die Zielzeit überschreiten! + +{=================================== MISSION TABLE OVALRIG ===================================} + +[HOTR_01:OVALRIG] +~g~Das Rennen geht über 12 Runden. Nur die ersten drei Plãtze qualifizeren für einen Gewinn. + +[HOTR_02:OVALRIG] +~g~Wird dein Auto zerstört, wirst du disqualifiziert. + +[HOTR_03:OVALRIG] +~g~Wird dein Auto beschãdigt, kannst du es an der Box reparieren lassen. + +[HOTR_04:OVALRIG] +~g~Da geht es aus dem Stadion raus. + +[HOTR_05:OVALRIG] +Zustand Auto: + +[HOTR_06:OVALRIG] +Runden: + +[HOTR_07:OVALRIG] +Neue Bestzeit: ~1~:0~1~ + +[HOTR_08:OVALRIG] +Zeit: ~1~:~1~ + +[HOTR_10:OVALRIG] +Absolvierte Zeit: + +[HOTR_09:OVALRIG] +Position: + +[HOTR_12:OVALRIG] +~r~Dein Fahrzeug ist zerstört worden! + +[HOTR_13:OVALRIG] +~r~Du hast das Rennen nicht gewonnen! + +[HOTR_14:OVALRIG] +~r~Du bist disqualifiziert worden! + +[HOTR_15:OVALRIG] +Zeit: ~1~:~1~ + +[HOTR_16:OVALRIG] +Zeit: ~1~:0~1~ + +[HOTR_17:OVALRIG] +Bestzeit: ~1~:~1~ + +[HOTR_18:OVALRIG] +Bestzeit: ~1~:0~1~ + +[HOTR_19:OVALRIG] +Bestzeit: Nicht verfügbar + +[HOTR_20:OVALRIG] +Neue Bestzeit: ~1~:~1~ + +[HOTR_21:OVALRIG] +Neue Bestzeit: ~1~:0~1~ + +[HOTR_22:OVALRIG] +Beste Platzierung: Nicht verfügbar + +[HOTR_23:OVALRIG] +Beste Platzierung: 1. + +[HOTR_24:OVALRIG] +Beste Platzierung: 2. + +[HOTR_25:OVALRIG] +Beste Platzierung: 3. + +[HOTR_26:OVALRIG] +Beste Platzierung: ~1~. + +[HOTR_27:OVALRIG] +Beste Rundenzeit: ~1~.~1~ Sekunden + +[HOTR_28:OVALRIG] +Beste Rundenzeit: ~1~.0~1~ Sekunden + +[HOTR_29:OVALRIG] +$~1~ + +[HOTR_30:OVALRIG] +1. PLATZ + +[HOTR_31:OVALRIG] +2. PLATZ + +[HOTR_32:OVALRIG] +3. PLATZ + +[HOTR_33:OVALRIG] +Beste Rundenzeit: Nicht verfügbar + +[HOTR_11:OVALRIG] +Neue beste Rundenzeit: ~1~.~1~ Sekunden + +[HOTR_34:OVALRIG] +Neue beste Rundenzeit: ~1~.0~1~ Sekunden + +{=================================== MISSION TABLE PHIL1 ===================================} + +[PHI1_HP:PHIL1] +Wenn du Granaten mit Fernzünder benutzt, wirf die Granate, dann löse die Explosion zu einem beliebigen Zeitpunkt aus. + +[PHIL1_A:PHIL1] +Phil? + +[PHIL1_B:PHIL1] +SCHNELL WEG! + +[PHIL1_C:PHIL1] +Schnell weg! + +[PHIL1_E:PHIL1] +Scheiße, Phil, das Zeug trinkst du? + +[PHIL1_F:PHIL1] +Hey, du musst es nicht trinken. + +[PHIL1_G:PHIL1] +Das haut schon rein, wenn du nur dran riechst. + +[PHIL1_H:PHIL1] +Hör mal, Phil, du sagtest, du könntest mir Artillerie besorgen... + +[PHIL1_I:PHIL1] +Klar. + +[PHIL1_J:PHIL1] +In letzter Zeit macht mir ein mexikanischer Waffenschieber Konkurrenz. + +[PHIL1_K:PHIL1] +Der müsste jetzt gerade auf seiner wöchentlichen Runde sein. + +[PHIL1_L:PHIL1] +Ramm mit deiner Karre die Ware von seinem Wagen runter, bevor er wieder abtaucht. + +[PHIL1_M:PHIL1] +Tust mir einen großen Gefallen damit. + +[PHIL1_N:PHIL1] +Und dann mach ihn fertig. + +[PHI1_01:PHIL1] +~g~Ramme die Waffen von der Ladeflãche des Waffenschiebers. + +[PHI1_02:PHIL1] +~g~Der Waffenhãndler hat die Ladung verloren. Schlag die Kiste kaputt und nimm die Waffe. + +[PHI1_03:PHIL1] +~g~Sie haben anscheinend Verstãrkung gerufen. + +[PHI1_04:PHIL1] +~g~Jetzt erledige die restlichen Waffenschieber. + +[PHI1_06:PHIL1] +Pass doch auf, wo du hinfãhrst! + +[PHI1_07:PHIL1] +Hey! + +[PHIL1_O:PHIL1] +Huuuuhuuu! + +[PHIL1_D:PHIL1] +Komm nie mit 'ner offenen Flamme in die Nãhe von Phil Cassidys TNT-Whiskey! + +{=================================== MISSION TABLE PHIL2 ===================================} + +[PHIL2_A:PHIL2] +Hey, Phil, wie geht's? + +[PHIL2_B:PHIL2] +Hey, Tommy. Alles klar? Lange nicht gesehen... + +[PHIL2_C:PHIL2] +Du solltest wirklich die Finger von dem TNT-Whiskey lassen. + +[PHIL2_D:PHIL2] +Das Zeug riecht ja wie Terpentin. Mir brennen schon die Augen. + +[PHIL2_E:PHIL2] +Lass stecken, Tommy. + +[PHIL2_F:PHIL2] +Komm hier rüber, ich will dir nãmlich was zeigen. + +[PHIL2_G:PHIL2] +Wahnsinn! Das rieche ich ja schon von hier. Mir ist schon ganz schwindlig. + +[PHIL2_H:PHIL2] +Kümmer dich nicht um den Geruch. Tommy, sieh dir das an. + +[PHIL2_I:PHIL2] +Billige Schrottbatterien. Da auf der Bank sind noch welche. + +[PHIL2_J:PHIL2] +Tata! + +[PHIL2_K:PHIL2] +Oh, verflucht! + +[PHI2_01:PHIL2] +~g~Schnell, bring Phil ins Krankenhaus. + +[PHI2_03:PHIL2] +~r~Phil Cassidy ist tot!!! Wer soll Liberty nun mit Waffen versorgen? + +[PHI2_05:PHIL2] +Nicht ins Krankenhaus, Mann! Zu viele Cops und Vietcong! + +[PHI2_06:PHIL2] +Ich kenn 'nen Ex-Army-Arzt, der schuldet mir einen Gefallen und 'nen Rasenmãher. + +[PHI2_07:PHIL2] +Er hat 'ne Praxis unten in Little Havana. Uh, guck mal, ein Riesenfisch. + +[PHI2_08:PHIL2] +Achtung! Da in den Bãumen - Vietcong! + +[PHI2_09:PHIL2] +Spinn ich, oder ist die Straße aus Gummi? + +[PHI2_10:PHIL2] +Broken Spoon an Mother Hen, bitte kommen! + +[PHI2_11:PHIL2] +Spooney Wooney Woo Woo Woooo! + +[PHI2_12:PHIL2] +Er kommt mich holen, Jungchen! + +[PHI2_13:PHIL2] +Schwarze Schwingen breiten sich über mir aus... + +[PHI2_14:PHIL2] +Es ist wunderschön, Mann. Wunderschön... mir ist nur so kalt... + +[PHI2_15:PHIL2] +Roger! Wir haben einen betrunkenen Fahrer. + +[PHI2_04:PHIL2] +Phils Gesundheitszustand: + +[PHI_AS1:PHIL2] +PHIL-MISSIONEN ERFÜLLT + +[PHI_AS2:PHIL2] +~g~Bei Phil gibt es neue Waffen zu kaufen. {=================================== MISSION TABLE PIZZA ===================================} -[PIZ1_06:PIZZA] -~w~Bist du auf dem Moped, drücke~h~ ~k~ ~TGSUB~~w~, um die Mission abzubrechen. +[PIZ1_01:PIZZA] +~g~Liefere diese Pizzas aus. Du musst den Kunden die Pizzas zuwerfen, wãhrend du an ihnen vorbeifãhrst. [PIZ1_02:PIZZA] -~w~Du hast keine Pizzas mehr! Fahr zu ~y~Joe's Pizza Restaurant~w~ zurück und hol neue. - -[PIZ1_07:PIZZA] -~r~Du hast den Kunden umgebracht! Du bist gefeuert! - -[PIZ1_08:PIZZA] -~r~Du hast keine Zeit und keinen Job mehr! - -[PIZ1_09:PIZZA] -~r~Du hast unser Moped geschrottet! Verschwinde! - -[PIZ1_11:PIZZA] -~w~Du brauchst das Pizza-~b~Moped~w~, um die Bestellungen auszuliefern! - -[PIZ1_12:PIZZA] -Pizzas - -[PIZ1_13:PIZZA] -~w~Pizza! Heiß und lieferbereit! Ich liebe Pizza! - -[PIZ1_14:PIZZA] -~w~Die sind zum Liefern! ...Also liefer mal! - -[PIZ1_15:PIZZA] -~w~Die da ist extrascharf! - -[PIZ1_16:PIZZA] -~w~Nimm den Finger aus dem Arsch und liefer die aus, pronto! - -[PIZ1_17:PIZZA] -~w~Diese Pizzas sollen HEUTE ausgeliefert werden, nicht nächstes Jahr. - -[PIZ1_18:PIZZA] -~w~Ist Pizza liefern unter deiner Würde? Oh, Verzeihung, Herr Professor! - -[PIZ1_19:PIZZA] -~w~Lieferst du die jetzt aus, oder was? - -[PIZ1_20:PIZZA] -~w~Du bist gefeuert! ...War nur Spaß! Wird aber Ernst, wenn die nicht rechtzeitig ausgeliefert werden! - -[PIZ1_21:PIZZA] -~w~Pizzas! Mach schon! Da warten Fettsäcke drauf! - -[PIZ1_22:PIZZA] -~w~Hast du auf die Pizzas gespuckt? ... solltest du! Dann schmecken sie besser! - -[PIZ1_23:PIZZA] -~w~Glaubst du etwa, die liefern sich von selbst aus? - -[PIZ1_24:PIZZA] -~w~Wenn die kalt sind, bis du sie ablieferst, dann gibt's Zunder! - -[PIZ1_25:PIZZA] -~w~Beweg diesmal deinen Arsch! - -[PIZ1_26:PIZZA] -~w~Hey, liefer die aus! - -[PIZ1_27:PIZZA] -~w~Okay, liefer die aus, dann komm wieder und hol mehr. - -[PIZ1_28:PIZZA] -~w~Unsere Pizzas schlagen alles! Liefer die rechtzeitig aus, sonst schlag ich dich! - -[PIZ1_29:PIZZA] -~w~Du willst noch mehr? Hab ich dich nicht schon genug beschimpft heute? - -[PIZ1_30:PIZZA] -~w~Ich glaub, auf eine hab ich draufgeniest. Was soll's! Nimm sie mit! - -[PIZ1_31:PIZZA] -~w~Ich hasse diesen Job! Aber wenigstens kann ich dich rumkommandieren. - -[PIZ1_3A:PIZZA] -~w~Wenn die nicht rechtzeitig geliefert werden, dann ist die Holzkohle im Ofen die einzige, die du heute siehst. - -[PIZ1_32:PIZZA] -~r~Schmecken dir unsere Pizzas nicht? - -[PIZ1_33:PIZZA] -~w~Fahr zurück zu ~y~Joe's Pizza Restaurant~w~ für neue Bestellungen. - -[PIZ1_34:PIZZA] -~w~Pizza serviert, Kohle kassiert! - -[PIZ_WON:PIZZA] -~w~Pizza-Job erledigt. Prima! Der maximale Wert für deine Gesundheit wurde erhöht! - -[PIZ_WO1:PIZZA] -~w~Joe's Pizza Restaurant steht jetzt unter deinem 'Schutz'. Hol dir dein Schutzgeld regelmäßig ab. - -[PIZ1_01:PIZZA] -~w~Liefere diese Pizzas so schnell wie möglich an unsere ~b~Kunden~w~. +~g~Du hast alle Pizzas zugestellt. Fahr zurück und hole noch mehr. [PIZ1_05:PIZZA] -~w~Wirf sie den Kunden auf die gleiche Art zu, wie ein Drive-by ausgeführt wird. +~g~Du hast 5 Minuten, um die Pizzas zu liefern, sonst rufen die Kunden einen anderen Pizza-Service an. -{=================================== MISSION TABLE TAXI ===================================} +[PIZ1_07:PIZZA] +~r~Du hast den Kunden erledigt! Du bist gefeuert. -[TAXI1:TAXI] -~w~Such dir einen ~b~Fahrgast. +[PIZ1_08:PIZZA] +~r~Die Zeit ist um. Du bist gefeuert. -[TAXI1A:TAXI] -~w~Hier in der Nähe sind keine Fahrgäste - such weiter! +[PIZ1_09:PIZZA] +~r~Du hast dein Motorrad geschrottet! Du bist gefeuert. -[TAXI2:TAXI] -~r~Die Zeit ist um! +[PIZ1_11:PIZZA] +Hey! Steig wieder aufs Motorrad! -[TAXI3:TAXI] -~w~Dein Fahrgast ist entsetzt geflohen! +[PIZ1_12:PIZZA] +Verbleibende Pizzas: -[TAXI4:TAXI] -~w~Fahrt abgeschlossen: $~1~ +[PIZ1_06:PIZZA] +Drücke die ~h~ R3-Taste~w~, wenn du auf einem Bike sitzt und die Mission abbrechen willst. -[TAXI4A:TAXI] -~w~Fahrt abgeschlossen: $~1~ + ~1~ SERIEN-BONUS! $~1~ +[PIZ1_13:PIZZA] +Liefere sie schön heiß ab. -[TAXI5:TAXI] -~w~SPEED-BONUS: $~1~ +[PIZ1_14:PIZZA] +Kumpel, Pizzas für dich. -[TAXI5A:TAXI] -~w~SPEED-BONUS: $~1~ + ~1~ SERIEN-BONUS! $~1~ +[PIZ1_15:PIZZA] +Hey, na los, Mister, liefere sie schnell aus. -[TAXI7:TAXI] -~w~Dein Wagen ist Schrott, lass ihn reparieren! +[PIZ1_16:PIZZA] +Worauf wartest du, Mister? Du sollst Pizzas liefern. -[TAXI8:TAXI] -~r~Taxi-Mission abgebrochen. +[PIZ1_17:PIZZA] +Ich weiß, du wolltest kein Pizza-Lieferant sein. Na ja, mir egal. -[TAXI9:TAXI] -~r~Dein Taxi wurde zerstört! +[PIZ1_18:PIZZA] +Liefere die aus. -[FARES:TAXI] -Fahrten +[PIZ1_19:PIZZA] +Die müssen ausgeliefert werden. -[TIP:TAXI] -Trinkgeld +[PIZ1_20:PIZZA] +Na los, Mister, liefere die Dinger aus, oder du fliegst. -[FARE9:TAXI] -~w~Fahrtziel: ~y~'Portland Docks'. +[PIZ1_21:PIZZA] +Die Leute warten, Kumpel. -[FARE20:TAXI] -~w~Fahrtziel: ~y~'Der Park' ~w~in Belleville. +[PIZ1_22:PIZZA] +Wartest du auf bessere Zeiten? Die müssen ausgeliefert werden! -[FARE22:TAXI] -~w~Fahrtziel: ~y~'Cochrane Dam'. +[PIZ1_23:PIZZA] +Liefer den verdammten Fraß aus, Mister. -[FARE2:TAXI] -~w~Fahrtziel: ~y~'Head Radio'~w~, Harwood. +[PIZ1_24:PIZZA] +Die müssen ausgeliefert werden, Kumpel. -[FARE3:TAXI] -~w~Fahrtziel: ~y~'Der Fährhafen'~w~, Harwood. +[PIZ1_25:PIZZA] +Mann, kannst du die übernehmen? -[FARE4:TAXI] -~w~Fahrtziel: ~y~'Die Klinik'~w~, Portland View. +[PIZ1_26:PIZZA] +Mister, liefere die Dinger schnell ab, hopp, Amigo. -[FARE7:TAXI] -~w~Fahrtziel: ~y~'Die Baustelle'~w~, Hepburn Heights. +[PIZ1_27:PIZZA] +Komm schon, wir sind unter Druck, liefere die Dinger aus. -[FARE8:TAXI] -~w~Fahrtziel: ~y~'Cipriani Restaurant'~w~, Saint Mark's. +[PIZ1_28:PIZZA] +Du schon wieder? Liefere die hier schnell aus, Kumpel. -[FARE10:TAXI] -~w~Fahrtziel: ~y~'Punk Noodles'~w~, Chinatown. +[PIZ1_29:PIZZA] +Keine Trödelei diesmal, Kumpel. -[FARE12:TAXI] -~w~Fahrtziel: ~y~'Der Fährhafen'~w~, Rockford. +[PIZ1_30:PIZZA] +Na los, du fauler Hund, liefere den Fraß rechtzeitig aus. -[FARE13:TAXI] -~w~Fahrtziel: ~y~'Die Kirche'~w~, Bedford Point. +[PIZ1_31:PIZZA] +Du wirst nie befördert, wenn du diesmal nicht schneller machst. -[FARE14:TAXI] -~w~Fahrtziel: ~y~'Büro der Liberty Tree Zeitung'~w~, Bedford Point. +[PIZ1_32:PIZZA] +~r~Ist dir die Pizza zu heiß? -[FARE15:TAXI] -~w~Fahrtziel: ~y~'Liberty Universität'~w~, Liberty Campus. +[PIZ1_33:PIZZA] +~g~Kehre zum Restaurant zurück, um weitere Auftrãge zu bekommen. -[FARE16:TAXI] -~w~Fahrtziel: ~y~'Hogs 'n' Cogs'~w~, Gegend von Belleville Park. +[PIZ1_34:PIZZA] +~g~Pizza geliefert, hier ist dein Geld. -[FARE17:TAXI] -~w~Fahrtziel: ~y~'Gerichtsgebäude'~w~, Gegend von Belleville Park. +[PIZ_WON:PIZZA] +Pizza-Mission abgeschlossen. Deine max. Gesundheit erhöht sich auf 150 -[FARE18:TAXI] -~w~Fahrtziel: ~y~'Mr. Benz'~w~, Bedford Point. +{=================================== MISSION TABLE PORN1 ===================================} -[FARE19:TAXI] -~w~Fahrtziel: ~y~'Joe's Pizza'~w~, Bedford Point. +[POR1_15:PORN1] +Hey, Tommy, kommst du auf eine Aufwãrmrunde mit rein!? -[FARE21:TAXI] -~w~Fahrtziel: ~y~'Terminal A'~w~, Francis International Airport. +[POR1_14:PORN1] +Du bist engagiert! -[FARE23:TAXI] -~w~Fahrtziel: ~y~'Die Villa'~w~, Cedar Grove. +[POR1_A:PORN1] +Action! -[FARE24:TAXI] -~w~Fahrtziel: ~y~'Die Klinik'~w~, Pike Creek. +[POR1_B:PORN1] +Wow! Der ist aber groß! -[FARE25:TAXI] -~w~Fahrtziel: ~y~'Der Park'~w~, Shoreside Vale. +[POR1_C:PORN1] +30cm, das ist Vorschrift, Baby. -[FARE26:TAXI] -~w~Fahrtziel: ~y~'North West Towers'~w~, Wichita Gardens. +[POR1_D:PORN1] +SCHNITT! Wer ist dieser Idiot? Du da! Was machst du in meinem Studio? Was willst du? -[FARE27:TAXI] -~w~Fahrtziel: ~y~'Das Bus-Depot'~w~, Trenton. +[POR1_E:PORN1] +Was soll das alles hier? -[FARE28:TAXI] -~w~Fahrtziel: ~y~'Mr. Benz'~w~, Chinatown. +[POR1_F:PORN1] +Aliens? Angelruten? -[FARE29:TAXI] -~w~Fahrtziel: ~y~'Mr. Benz'~w~, Pike Creek. +[POR1_G:PORN1] +Wer hat jemals einen so großen Hai gesehen? -[FARE30:TAXI] -~w~Fahrtziel: ~y~'Terminal C'~w~, Francis International Airport. +[POR1_H:PORN1] +Das muss alles raus hier. -[FARE31:TAXI] -~w~Fahrtziel: ~y~'AM Petroleum'~w~, Pike Creek. +[POR1_I:PORN1] +Wieso bist du in diese Branche gegangen, du Idiot? -[FARE32:TAXI] -~w~Fahrtziel: ~y~'Liberty Pharmaceuticals'~w~, Pike Creek. +[POR1_J:PORN1] +Hah? -[FARE11:TAXI] -~w~Fahrtziel: ~y~'Phil Cassidy's Fully Cocked Gun Shop'~w~, Bedford Point. +[POR1_K:PORN1] +Wegen der Pussys, deswegen. Was ist das?? -[FARE1A:TAXI] -~w~Fahrtziel: ~y~'Paulie's Revue Bar'~w~, Rotlichtviertel. +[POR1_L:PORN1] +Das ist meine Kunst- SICHERHEITSDIENST! -[FARE1C:TAXI] -~w~Fahrtziel: ~y~'Sex Club Seven'~w~, Rotlichtviertel. +[POR1_M:PORN1] +Hör zu, du aufgeblasener Penner, du gehörst jetzt mir. Mir gehört das alles hier. -[FARE5:TAXI] -~w~Fahrtziel: ~y~'Ammu-Nation'~w~, Rotlichtviertel. +[POR1_N:PORN1] +Wir krempeln den Laden hier um. -[FARE6:TAXI] -~w~Fahrtziel: ~y~'Capital Autos',~w~ Saint Mark's. +[POR1_O:PORN1] +Ich mache dich reich. -{=================================== MISSION TABLE AMBU ===================================} +[POR1_P:PORN1] +Ãh, du...du bist Tommy Vercetti? Aber ich dachte, du wãrst... -[A_FAIL2:AMBU] -~r~Deine Trödelei war tödlich für den Patienten! +[POR1_Q:PORN1] +Ganz recht. -[A_FAIL3:AMBU] -~r~Der Patient ist tot! +[POR1_R:PORN1] +Wir ãndern hier ein paar Dinge und dann machen wir richtig Kohle. -[ATUTOR4:AMBU] -~w~Jede Erschütterung mindert die Überlebenschancen des Patienten! +[POR1_S:PORN1] +Hast du dir schon mal überlegt... -[A_TIME:AMBU] -~w~Patient eingeladen! +~1~ Sekunden +[POR1_T:PORN1] +Aber zuerst brauchen wir mal ein paar hübsche Mãdels hier. -[A_TIME2:AMBU] -~w~Bonus! +~1~ Sekunden +[POR1_U:PORN1] +Ja, Girls sind ok, aber du...wow! -[AREWARD:AMBU] -~w~Level ~1~ abgeschlossen! Belohnung: $~1~ +[POR1_02:PORN1] +~g~Schalte Candys Agent aus, dann komm wieder und hole Candy. -[A_RANGE:AMBU] -~r~Du bist außer Reichweite des Notarztfunks. Fahr näher an eine Klinik heran! +[POR1_04:PORN1] +Hey, Candy. Ich suche Filmtalente. Interessiert? -[ATUTOR5:AMBU] -~w~Sammle einen ~b~Patienten~w~ auf. +[POR1_05:PORN1] +Klar! Aber da musst du mit meinem Agenten reden. -[ATUTOR6:AMBU] -~w~Bring den Patienten zur ~y~Klinik! +[POR1_06:PORN1] +Was zum Teufel soll das? -[ATUTOR7:AMBU] -~w~Sammle noch mehr ~b~Patienten~w~ auf, oder bring diesen zur ~y~Klinik. +[POR1_07:PORN1] +Du hãttest heute zu Hause bleiben sollen! -[A_FULL:AMBU] -~w~Dein Krankenwagen ist voll! Bring deine Patienten zur ~y~Klinik! +[POR1_7B:PORN1] +Was sagt man zu so 'nem Arschloch? -[A_RANG2:AMBU] -~r~Der Notarztfunk funktioniert nicht in der U-Bahn! +[POR1_08:PORN1] +Hey, Mercedes! -{=================================== MISSION TABLE TV ===================================} +[POR1_09:PORN1] +Hi, Tommy. Na, ein bisschen feiern? -[TV_01:TV] -Slash TV +[POR1_10:PORN1] +Jetzt nicht, Süße. Bist du an Filmaufnahmen interessiert? -[TV_02:TV] -~w~Erledige alle irren Psychopathen... die greifen in einer Tour an! +[POR1_11:PORN1] +Klar. Wenn's schön billig und dreckig ist. -[TV_03:TV] -~w~Mit jedem Level wird es schwerer und es gibt mehr Gegner... und auch mehr Preise zu gewinnen! +[POR1_13:PORN1] +~g~Bring die Girls ins Studio zu Steve. -[TV_04:TV] -~w~LEVEL ~1~ +[POR1_17:PORN1] +Wow, cooler Hai! -[TV_10:TV] -~w~Du hast einen Sonderpreis gewonnen! +[POR1_18:PORN1] +~r~Mercedes ist erledigt! -[TV_09:TV] -Gesamtpreisgeld bei diesem Spiel: $~1~! +[POR1_20:PORN1] +Tommy, wo willst du hin? Komm zurück! -[TV_05:TV] -~w~LEVEL GESCHAFFT! +[POR1_21:PORN1] +Wo willst du hin? -[TV_06:TV] -~w~$~1~ Preisgeld! +[POR1_22:PORN1] +Tommy, wann sehen wir uns mal ganz allein, nur du und ich? -[TV_07:TV] -~w~MACH DICH BEREIT... +[POR1_01:PORN1] +~g~Candy Suxxx wãre perfekt für die Hauptrolle! -[TV_08:TV] -~w~LOS! +[POR1_12:PORN1] +~g~Nimm Candy mit zu deinem Treffen mit Mercedes. -{=================================== MISSION TABLE NOODLE ===================================} +[POR1_16:PORN1] +Vielleicht spãter, Schãtzchen... -[NDL1_02:NOODLE] -~w~O-oh, keine Nudelsnacks mehr! Fahr zu ~y~Punk Noodles~w~ zurück und hol neue. +[POR1_24:PORN1] +~g~Geh zurück und hole Candy. -[NDL1_06:NOODLE] -~w~Bist du auf dem Moped, drücke~h~ ~k~ ~TGSUB~~w~, um die Mission abzubrechen. +[POR1_25:PORN1] +~g~Du hast Candy vergessen. Geh sie holen. -[NDL1_07:NOODLE] -~r~Du hast den Kunden umgebracht! Du bist gefeuert! +[POR1_23:PORN1] +~g~Candy wird sich um das Geschãft in ~h~Downtown~g~ kümmern. -[NDL1_08:NOODLE] -~r~Die Zeit ist um. Du bist gefeuert! +[POR1_26:PORN1] +~g~Da ist Candy. Sie scheint wieder mit dem Kongressabgeordneten Shrub zusammen gewesen zu sein. -[NDL1_09:NOODLE] -~r~Du hast unser Moped geschrottet! Du bist gefeuert! +[POR1_27:PORN1] +Los, gehen wir. -[NDL1_11:NOODLE] -~w~Steig wieder auf das ~b~Moped! +[POR1_28:PORN1] +Tommy, sei vorsichtig! Meine Implantate sind noch nicht versichert! -[NDL1_12:NOODLE] -Nudelsnacks +[POR1_29:PORN1] +Das nennst du fahren? -[NDL1_13:NOODLE] -~w~Nudeln! Rudel von Nudeln, also ab mit Gehudel! +[POR1_30:PORN1] +Danach kann ich keinen Porno mehr machen! -[NDL1_14:NOODLE] -~w~Unsere Kunden kriegen gar nicht genug von meinen Nudeln. +[POR1_31:PORN1] +Was ist los? Willst du mich umbringen? Ich dachte, ich wãre der Star! -[NDL1_15:NOODLE] -~w~Ich hab hier Nudeln, die ausgeliefert werden müssen! +{=================================== MISSION TABLE PORN2 ===================================} -[NDL1_16:NOODLE] -~w~Versuch, die Nudeln rechtzeitig zu liefern! +[POR2_A:PORN2] +Was macht die Filmerei, Steve? -[NDL1_17:NOODLE] -~w~Hey, Dödel! Diese Nudeln müssen ausgeliefert werden! +[POR2_B:PORN2] +Tja, Candy ist ein Naturtalent, und die Neue ist unersãttlich! -[NDL1_18:NOODLE] -~w~Liefer diese Nudeln aus, aber dalli! +[POR2_C:PORN2] +Die hatte schon vor der ersten Probe das halbe Team durch. -[NDL1_19:NOODLE] -~w~Unsere Kunden wollen heiße Nudeln, keine kalten! +[POR2_D:PORN2] +Jedenfalls, morgen haben wir einen Außendreh. Wir schießen ein paar Boot-Szenen. -[NDL1_20:NOODLE] -~w~Du verträgst die Hitze in der Küche nicht? Konfuzius sagt: dann dreh den Herd runter. +[POR2_E:PORN2] +Boot-Szenen? Was für Boot-Szenen? -[NDL1_21:NOODLE] -~w~Liefere diese Nudeln aus, ja? +[POR2_F:PORN2] +Die Fischer zappeln im Netz der Leidenschaft, als ein riesiger Hai daherkommt - -[NDL1_22:NOODLE] -~w~Noch mehr Nudeln zum Ausliefern. +[POR2_G:PORN2] +Was habe ich über den Riesenhai gesagt? -[NDL1_23:NOODLE] -~w~Nudeln, Nudeln, Nudeln! Bring sie schön heiß an den Mann! +[POR2_H:PORN2] +Ich sagte, 'KEIN RIESENHAI', ok? -[NDL1_24:NOODLE] -~w~Da warten Leute drauf! ...Heiliger Bimbam! +[POR2_I:PORN2] +Halt die Kameras auf die Mãdels gerichtet! -[NDL1_25:NOODLE] -~w~Ist diese Bestellung noch nicht ausgeliefert worden? +[POR2_J:PORN2] +Ok, ok. Hey, Tommy, probieren kann ich's ja mal, oder? -[NDL1_26:NOODLE] -~w~Worauf wartest du? Auf das chinesische Neujahr? +[POR2_K:PORN2] +Habt ihr die Flyer drucken lassen? -[NDL1_27:NOODLE] -~w~Diese Nudeln werden kalt. Beeil dich! +[POR2_L:PORN2] +Ja, aber man wird uns die Dinger nicht verteilen lassen. Ich meine, -[NDL1_28:NOODLE] -~w~Ich wollte Astronaut werden. Aber der Laden gehört meinem Vater, was hätte ich machen sollen? +[POR2_M:PORN2] +die sind einfach zu, ãh, zu deutlich. -[NDL1_29:NOODLE] -~w~Wenn du deinen Job behalten willst, beweg deinen Arsch und liefer die aus. +[POR2_N:PORN2] +Mach dir darüber keine Gedanken. -[NDL1_30:NOODLE] -~w~Kross gebratene Nudeln... versteh die, wer will, aber sie schmecken! +[POR2_O:PORN2] +Ich hab da so meine Ideen, wie wir die verteilen. -[NDL1_31:NOODLE] -~w~Ich hätte gedacht, Pizzaliefern wär eher dein Ding. +[POR2_P:PORN2] +Ok. Hey, Candy, ãh, in meinen Wohnwagen. -[NDL1_3A:NOODLE] -~w~Sie wollen immer noch mehr. Also komm wieder, wenn du fertig bist. +[POR2_01:PORN2] +~g~Hinter den Studios steht ein altes Wasserflugzeug, das mal als Requisite für einen Indy-Film diente. -[NDL1_32:NOODLE] -~r~Was ist los? Magst du keine Nudeln? +[POR2_02:PORN2] +~g~Suche dir einen Checkpoint aus, um mit dem Abwurf der Flyer zu beginnen. -[NDL1_33:NOODLE] -~w~Fahr zu ~y~Punk Noodles~w~ zurück für weitere Bestellungen. +[POR2_03:PORN2] +~g~Wirf die Flyer überall bis zum End-Checkpoint ab. -[NDL1_34:NOODLE] -~w~Nudeln serviert, Kohle kassiert! +[POR2_04:PORN2] +~r~TREIBSTOFFMANGEL!!! -[NDL_WON:NOODLE] -~w~Gratuliere, Nudel-Job erledigt! Der maximale Wert für deine Gesundheit wurde erhöht! +[POR2_05:PORN2] +Benutze es, um die Flyer in der Stadt zu verteilen. -[NDL_WO1:NOODLE] -~w~Punk Noodles steht jetzt unter deinem 'Schutz'. Hol dir dein Schutzgeld regelmäßig ab. +[DILDO:PORN2] +Skimmer-Tankinhalt: -[NDL1_01:NOODLE] -~w~Liefere diese Nudelsnacks an unsere ~b~Kunden~w~ - und zwar dalli! +[POR2_Q:PORN2] +Oh, Mann. -[NDL1_05:NOODLE] -~w~Wirf sie den Kunden auf die gleiche Art zu, wie ein Drive-by ausgeführt wird. +[PORN2_9:PORN2] +~g~Du hast ~1~ Sekunden, um zu einer Skimmer zurückzukehren, bevor die Mission endet. -{=================================== MISSION TABLE MPSURV ===================================} +{=================================== MISSION TABLE PORN3 ===================================} -[SAL01:MPSURV] -~w~Maria, ich geh in die Klinik und lass mir den 'du-weißt-schon' richten. +[POR3_A:PORN3] +Ok, was ist jetzt wieder? -[SAL02:MPSURV] -~w~Danach wird mein kleiner Soldat wieder strammstehen wie eh und je... +[POR3_B:PORN3] +Schsch! -[SAL04:MPSURV] -~w~PS: Halt dich bereit fürs 'Manöver', wenn ich rauskomme, Baby. +[POR3_C:PORN3] +Nun, nach seiner Begegnung mit den Nympho-Aliens -[SAL05:MPSURV] -~w~PPS: ...Und lass diesen Brief nicht einfach herumliegen! +[POR3_D:PORN3] +kann unser Held an nichts anderes denken, als an einen riesigen Phallusberg- -[SAL03:MPSURV] -~w~Pass solange auf dich auf, denn ein Haufen Leute würde alles geben, um meinen Laden zu übernehmen. +[POR3_E:PORN3] +und da wollen wir die Szene mit dem Bottich voll Kartoffelpüree drehen, aber dann... -[SAL03A:MPSURV] -~w~Selbst ihr Leben! +[POR3_F:PORN3] +Das interessiert mich nicht die Bohne. -{=================================== MISSION TABLE JDREF ===================================} +[POR3_G:PORN3] +D-Dreh einfach weiter. Weiter, weiter. -[JDT1_BA:JDREF] -~w~Für einen Leone hab ich keine Arbeit! +[POR3_H:PORN3] +Hey, Tommy... -[JDT1_BB:JDREF] -~w~...hey, Toni, komm wieder, wenn du weniger auffällig aussiehst. +[POR3_I:PORN3] +Du hast am Telefon was von rechtlichen Problemen gesagt? -[CHNGOUT:JDREF] -~w~Zieh dein Leone-Outfit aus, sonst darf JD nicht zusammen mit dir gesehen werden. +[POR3_J:PORN3] +Ach ja! Der Kongressabgeordnete Alex Shrub ist auf Wahlkampftour und buhlt um Stimmen bei den Puritanern. -{=================================== MISSION TABLE CRED01 ===================================} +[POR3_K:PORN3] +Es heißt, er unterstützt ein Verbot der, sagen wir mal, eher -[CR01_01:CRED01] -~n~ ~n~ ~n~ ~n~CREDITS +[POR3_L:PORN3] +fleischlichen Bereiche der großartigen Unterhaltungsindustrie unseres Landes. -[CR01_02:CRED01] -~n~ ~n~ ~n~ ~n~ROCKSTAR NORTH +[POR3_M:PORN3] +Großartig. -[CR01_03:CRED01] -~n~ ~n~ ~n~ ~n~Producer ~n~Leslie Benzies +[POR3_N:PORN3] +Candy! Du kennst doch Shrub. -[CR01_04:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Aaron Garbut +[POR3_O:PORN3] +Macht ihr auch ausgefallene Sachen? -[CR01_05:CRED01] -~n~ ~n~ ~n~ ~n~Technical Direction ~n~Obbe Vermeij, Adam Fowler +[POR3_P:PORN3] +Oh ja, oh ja, oh ja! Ja, ja, ja, JA, Oooooooh! -[CR01_06:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~Written By ~n~Dan Houser, James Worrall ~n~ & David Bland +[POR3_Q:PORN3] +Bitte sag, dass du das hast. -[CR01_07:CRED01] -~n~ ~n~ ~n~ ~n~Programming ~n~Alexander Roger, Alexander Illes, ~n~Andrzej Madajczyk, Barane Chan, ~n~Derek Payne, Derek Ward, +[POR3_R:PORN3] +Gehörte das zum, ãh... oder war das die Antwort für... -[CR01_08:CRED01] -~n~ ~n~Gordon Yeoman, Graeme Williamson, ~n~Greg Smith, James Broad, ~n~John Gurney, John Whyte, +[POR3_S:PORN3] +Hey, ich kann das nie unterscheiden. Jedenfalls... -[CR01_09:CRED01] -~n~ ~n~Keith McLeman, Mark Nicholson, ~n~Shaun McKillop +[POR3_T:PORN3] +Das beste wird sein, du folgst ihr nach dem Dreh. -[CR01_10:CRED01] -~n~ ~n~ ~n~ ~n~Audio Programmer ~n~Matthew Smith +[POR3_U:PORN3] +Mal sehen, ob sie dich zu ihrem neuen Liebesnest führt. -[CR01_11:CRED01] -~n~ ~n~ ~n~ ~n~Sound Design and Mastering ~n~Allan Walker +[POR3_V:PORN3] +Hast du eine Kamera? -[CR01_12:CRED01] -~n~ ~n~ ~n~ ~n~Lead Cut Scene Animator ~n~Mondo Ghulam +[POR3_X:PORN3] +Ja. Gebt ihm eine Kamera. -[CR01_13:CRED01] -~n~ ~n~ ~n~ ~n~Cut Scene Animator ~n~Dermot Bailie +[POR3_02:PORN3] +~r~Du hast den Abgeordneten erledigt! Jetzt kannst du ihn nicht mehr erpressen. -[CR01_14:CRED01] -~n~ ~n~ ~n~ ~n~Character Animator ~n~Felipe Busquets +[POR3_03:PORN3] +~r~Du hast die Bodyguards des Abgeordneten aufgescheucht. Sie werden ihn sofort wegbringen. -[CR01_15:CRED01] -~n~ ~n~ ~n~ ~n~In-Game Animation ~n~Gus Braid, Terry Kenny +[POR3_04:PORN3] +Candy, könntest du mich Martha nennen? -[CR01_16:CRED01] -~n~ ~n~ ~n~ ~n~Characters Artist ~n~Ian McQue +[POR3_05:PORN3] +Oh, Alex - ich meine Martha - ich tu alles, was du willst. -[CR01_17:CRED01] -~n~ ~n~ ~n~ ~n~Vehicle Artist ~n~Joylon Orme +[POR3_06:PORN3] +Martha, jemand sieht uns zu. Wie erregend. -[CR01_18:CRED01] -~n~ ~n~ ~n~ ~n~Additional Art ~n~Rick Stirling, Alisdair Wood +[POR3_07:PORN3] +Sie da! Geben Sie mir die Kamera. -[CR01_19:CRED01] -~n~ ~n~ ~n~ ~n~Music Producer ~n~Craig Conner +[POR3_01:PORN3] +~g~Folge Candys ~h~Stretch-Limo~g~. -[CR01_20:CRED01] -~n~ ~n~ ~n~ ~n~Audio Design and Dialogue Editor ~n~Will Morton +[POR3_15:PORN3] +~r~Du hast Candys Stretch-Limo geschrottet! -[CR01_21:CRED01] -~n~ ~n~ ~n~ ~n~Additional Dialogue Editor ~n~Jon McCavish +[POR3_17:PORN3] +~g~Begib dich mit dem Film zurück ins Pornostudio. -[CR01_22:CRED01] -~n~ ~n~ ~n~ ~n~Development Support ~n~Milly Cottam +[POR3_19:PORN3] +~r~Der Film ist alle! -[CR01_23:CRED01] -~n~ ~n~ ~n~ ~n~Graphic Designers ~n~Stuart Petri, Steve Walsh +[POR3_21:PORN3] +~g~Du hast Candys Stretch-Limo verloren! -[CR01_24:CRED01] -~n~ ~n~ ~n~ ~n~Lead Level Design ~n~William Mills +[POR3_22:PORN3] +~g~Das WK Chariot Hotel gegenüber seines Balkons dürfte eine ideale Position zum Fotografieren bieten. -[CR01_25:CRED01] -~n~ ~n~ ~n~ ~n~Level Design ~n~Chris Rothwell, Andy Duthie, ~n~Chris McMahon, Neil Ferguson +[POR3_23:PORN3] +~g~Es gibt eine Seitentür, durch die du in das Hotel kommst. -[CR01_26:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Craig Arbuthnott +[POR3_08:PORN3] +Halte die~h~ ~k~~PED_LOCK_TARGET~ ~w~gedrückt, um mit der Kamera zu ~h~zielen~w~. -[CR01_27:CRED01] -~n~ ~n~ ~n~ ~n~Senior Lead Test ~n~Neil Corbett +[POR3_09:PORN3] +Halte die~h~ ~k~~PED_LOCK_TARGET~ ~w~gedrückt, um mit der Kamera zu ~h~zielen~w~. -[CR01_28:CRED01] -~n~ ~n~ ~n~ ~n~Lead Test ~n~David Murdoch, Neil Meikle, ~n~Alex Bazlinton, Brenda Carey +[POR3_10:PORN3] +Drücke die~h~ ~k~~PED_SNIPER_ZOOM_IN~~w~, um ~h~heranzuzoomen ~w~und die~h~ ~k~~PED_SNIPER_ZOOM_OUT~~w~, um wieder ~h~wegzuzoomen~w~. -[CR01_29:CRED01] -~n~ ~n~ ~n~ ~n~Build Engineer / Lead Test ~n~Neil Walker +[POR3_11:PORN3] +Drücke die~h~ ~k~~PED_SNIPER_ZOOM_IN~~w~, um ~h~heranzuzoomen ~w~und die~h~ ~k~~PED_SNIPER_ZOOM_OUT~~w~, um wieder ~h~wegzuzoomen~w~. -[CR01_30:CRED01] -~n~ ~n~ ~n~ ~n~Audio Test ~n~George Williamson +[POR3_12:PORN3] +Drücke die~h~ ~k~~PED_FIREWEAPON~~w~, um ein Bild zu machen. -[CR01_31:CRED01] -~n~ ~n~ ~n~ ~n~Test ~n~Brian Kelly, Lindsay Robertson, ~n~Sundram Soosay, Eugene Kuczerepa, ~n~Christopher Soosay, Ben Abbott, +[POR3_13:PORN3] +Drücke die~h~ ~k~~PED_FIREWEAPON~~w~, um ein Bild zu machen. -[CR01_32:CRED01] -~n~ ~n~Oliver Elliott, Louis Dinan, ~n~Bobby Wright, Thomas Philips, ~n~Nick Rees, Ivor Williams +[POR3_14:PORN3] +Drücke die~h~ ~k~~PED_FIREWEAPON~~w~, um ein Bild zu machen. -[CR01_33:CRED01] -~n~ ~n~ ~n~ ~n~Test Tools Programming ~n~James Whitcroft, Alex Carter +[POR3_20:PORN3] +~g~Wenn du ein Transportmittel brauchst, nimm den ~h~Sparrow~g~ hinter dem Haus. -[CR01_34:CRED01] -~n~ ~n~ ~n~ ~n~IT Manager ~n~Lorraine Roy +[POR3_16:PORN3] +~g~Du brauchst drei gute kompromittierende Fotos von Alex Shrub mit Candy. -[CR01_35:CRED01] -~n~ ~n~ ~n~ ~n~IT Support ~n~Christine Chalmers, Dave Bruce +[POR3_24:PORN3] +GESCHOSSENE FOTOS: -[CR01_36:CRED01] -~n~ ~n~ ~n~ ~n~Studio Director ~n~Andrew Semple +{=================================== MISSION TABLE PORN4 ===================================} -[CR01_37:CRED01] -~n~ ~n~ ~n~ ~n~Office Administration ~n~Kim Gurney +[POR4_A:PORN4] +Tut mir leid, ich kann das jetzt nicht schlucken. -[CR01_38:CRED01] -~n~ ~n~ ~n~ ~n~Administration Support ~n~Charlene Maguire, Kim Wilson +[POR4_B:PORN4] +Ach KOMM, Darling! -[CR02_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LEEDS +[POR4_C:PORN4] +Der ist ausgestattet wie ein Pottwal, Herrgott noch mal, -[CR02_02:CRED01] -~n~ ~n~ ~n~ ~n~Studio Director ~n~Gordon Hall +[POR4_D:PORN4] +wie kannst du dich da nicht einfühlen?! -[CR02_03:CRED01] -~n~ ~n~ ~n~ ~n~Head of Development ~n~David Box +[POR4_E:PORN4] +Aber Stevie... -[CR02_04:CRED01] -~n~ ~n~ ~n~ ~n~Lead Programming ~n~Andrew Greensmith, Matthew Shepcar ~n~ ~n~ ~n~ ~n~Console Programming ~n~Nigel Conroy, Richard Frankish, ~n~Andrew Greensmith, Robin Mangham, ~n~Damian McKenna, Finlay Munro, ~n~Stuart Roskell, Matthew Shepcar +[POR4_F:PORN4] +Wie geht's meinem Starregisseur? -[CR02_05:CRED01] -~n~ ~n~ ~n~ ~n~Programming ~n~Jon Bellamy, Ross Childs, ~n~Nigel Conroy, Neil Dodwell, ~n~Alastair Dukes, David Huebner, +[POR4_G:PORN4] +Oh Mann. Der Kampf zwischen künstlerischer Ambition und -[CR02_06:CRED01] -~n~ ~n~Robin Mangham, Jason McGann, ~n~Warren Merrifield, Stephen McGreal +[POR4_H:PORN4] +diesem Rumgenudle tobt unvermindert. -[CR02_07:CRED01] -~n~ ~n~ ~n~ ~n~Sound Programming ~n~Finlay Munro, Charles Waddington +[POR4_I:PORN4] +Und bevor du fragst: Ja, alle vier Videos werden veröffentlicht, wenn... -[CR02_08:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Ian Bowden +[POR4_J:PORN4] +Schãtzchen, kannst du BITTE die Anaconda im Bild halten, -[CR02_09:CRED01] -~n~ ~n~ ~n~ ~n~Art Department Director ~n~Chris Smart +[POR4_K:PORN4] +die kostet pro Stunde mehr als du! -[CR02_10:CRED01] -~n~ ~n~ ~n~ ~n~Lead Character Artist ~n~Paul Smith +[POR4_L:PORN4] +Oh, sorry, Steve. -[CR02_11:CRED01] -~n~ ~n~ ~n~ ~n~Character Artist ~n~Chris Allison +[POR4_M:PORN4] +Ich hab mir gedacht, als Werbung für den Start brauchen wir einen richtigen Knaller. -[CR02_12:CRED01] -~n~ ~n~ ~n~ ~n~Lead City Artist ~n~Dan Roberts +[POR4_N:PORN4] +Irgendwas, was so richtig Furore macht in der Stadt. Hast du eine Idee? -[CR02_13:CRED01] -~n~ ~n~ ~n~ ~n~City Artists ~n~Paul McKee, James McHale, ~n~Siu Lee +[POR4_O:PORN4] +Na ja, früher gab's da immer Galas, -[CR02_14:CRED01] -~n~ ~n~ ~n~ ~n~Cutscene Interiors ~n~Izzy Stewart +[POR4_P:PORN4] +Stars, Limos, riesige Suchscheinwerfer am Nachthimmel... -[CR02_15:CRED01] -~n~ ~n~ ~n~ ~n~Concept Artist ~n~John Wigley +[POR4_Q:PORN4] +Suchscheinwerfer? Ich hab eine Idee... -[CR02_16:CRED01] -~n~ ~n~ ~n~ ~n~Additional Character Animation ~n~Alan Bowker +[POR4_R:PORN4] +....ja, ja, ja. Die heißen Mãdels mit ihren Paillettenkleidern und die Limos, oh, Premieren. -[CR02_17:CRED01] -~n~ ~n~ ~n~ ~n~Additional Artists ~n~Andy Walker, Jason Gee, ~n~Chris Edwards, Lee Clark +[POR4_S:PORN4] +O ja, Ma'am, natürlich, Ma'am, -[CR02_18:CRED01] -~n~ ~n~ ~n~ ~n~Design Director ~n~David Bland +[POR4_T:PORN4] +Und die Presse und die Lichter-Flut... -[CR02_19:CRED01] -~n~ ~n~ ~n~ ~n~Lead Level Design ~n~John Li +[POR4_01:PORN4] +~g~Begib dich nach ~y~Downtown~g~und richte den Scheinwerfer auf dem Gebãude aus. -[CR02_20:CRED01] -~n~ ~n~ ~n~ ~n~Senior Level Design ~n~Tony Gowland, Martyn Bramall +[POR4_02:PORN4] +~g~Du brauchst ein schnelles Bike, um von Dach zu Dach zu springen. Der Wachmann fãhrt immer mit einer ~y~PCJ 600~g~zur Arbeit... -[CR02_21:CRED01] -~n~ ~n~ ~n~ ~n~Level Design ~n~Sam Hackett, Stephen Robertson, ~n~Tom Kingsley, Chris Edwards, ~n~Kris Gormley +[POR4_03:PORN4] +~g~Du wirst auf die Gebãudedãcher müssen. In eines der oberen Büros sollte ein Lift führen... -[CR02_22:CRED01] -~n~ ~n~ ~n~ ~n~Associate Designer ~n~Mark McGinley +[POR4_06:PORN4] +~g~Kehre in das tiefer gelegene Büro zurück, wenn du noch mal auf die Dãcher musst. -[CR02_23:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Paul Colls +[POR4_07:PORN4] +~g~Du brauchst ein Motorrad, um von Gebãude zu Gebãude zu springen. -[CR02_24:CRED01] -~n~ ~n~ ~n~ ~n~QA ~n~Jody Cobb, ~n~ ~n~Luke Brown, Nick Robey, ~n~Matthew Haven +[POR4_08:PORN4] +~g~Brich durch das Fenster, um zu starten. Du hast bis 07:00 Zeit. Dann wird es zu hell, um ungesehen hinaufzukommen. -[CR02_25:CRED01] -~n~ ~n~ ~n~ ~n~Company Secretary ~n~Naomi Martin +[POR4_09:PORN4] +~g~Die Pfeile zeigen dir, zu welchem Gebãude du als nãchstes springen musst. -[CR02_26:CRED01] -~n~ ~n~ ~n~ ~n~IT Manager ~n~Chris Waring +[POR4_10:PORN4] +~r~Es ist zu hell, um ungesehen dort hinaufzukommen. -[CR03_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR NYC +[POR4_11:PORN4] +Kehre zur Leiter zurück, wenn du noch mal auf die Dãcher musst. -[CR03_02:CRED01] -~n~ ~n~ ~n~ ~n~Executive Producer ~n~Sam Houser +[POR4_05:PORN4] +~g~Diese Treppe führt zu einem tiefer gelegenen Büro. -[CR03_03:CRED01] -~n~ ~n~ ~n~ ~n~VP of Creative ~n~Dan Houser +[POR_AS1:PORN4] +FILMSTUDIO-MISSIONEN ERFÜLLT -[CR03_04:CRED01] -~n~ ~n~ ~n~ ~n~VP of Development ~n~Jamie King +[POR_AS2:PORN4] +~g~Inter Global Films generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. -[CR03_05:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Alex Horton +{=================================== MISSION TABLE PROT1 ===================================} -[CR03_06:CRED01] -~n~ ~n~ ~n~ ~n~Chief Technology Officer ~n~Gary J. Foreman +[PRO1_A:PROT1] +Oh, wir müssen diesen Laden umbauen. Das muss ãlter aussehen. -[CR03_07:CRED01] -~n~ ~n~ ~n~ ~n~Associate Producer ~n~Rich Rosado +[PRO1_B:PROT1] +Ich kann diesen Look nicht ab, Tommy. Was meinst du, sollen wir eine Bar einbauen..? -[CR03_08:CRED01] -~n~ ~n~ ~n~ ~n~Director of Quality Assurance ~n~Jeff Rosa +[PRO1_D:PROT1] +Hört mal. -[CR03_09:CRED01] -~n~ ~n~ ~n~ ~n~Senior Lead Analyst ~n~Lance Williams +[PRO1_E:PROT1] +Die Zeit ist gekommen, die Stadt zu übernehmen. Sie wartet nur auf uns. -[CR03_10:CRED01] -~n~ ~n~ ~n~ ~n~Project Lead ~n~Jameel Vega +[PRO1_F:PROT1] +Wir müssen langsam Gebiete einnehmen. -[CR03_11:CRED01] -~n~ ~n~ ~n~ ~n~Rockstar Test Team ~n~Ethan Abeles, William Rompf, ~n~Christopher Mansfield, Chris Choi, ~n~Mike Hong, Tamara Carrion, +[PRO1_G:PROT1] +Vice City soll merken, dass wir die neuen Bosse sind, versteht ihr? -[CR03_12:CRED01] -~n~ ~n~Rich Huie, Mike Nathan, ~n~Vance Wallace, Marc Rodriguez, ~n~Adam Tetzloff +[PRO1_H:PROT1] +Jetzt beruhigt euch mal kurz. Allmãhlich kapiere ich schon, wie das ganze hier lãuft. -[CR03_13:CRED01] -~n~ ~n~ ~n~ ~n~Business Development Director ~n~Sean Macaluso +[PRO1_I:PROT1] +Was du brauchst, ist eine legale Fassade, Tommy, Immobilien. Hat mir nicht geschadet. -[CR03_14:CRED01] -~n~ ~n~ ~n~ ~n~Soundtrack Supervision ~n~Heinz Henn, Ivan Pavlovich, ~n~Tim Sweeney +[PRO1_J:PROT1] +Wir müssen die Muskeln spielen lassen, sonst war die ganze harte Arbeit umsonst. -[CR04_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~CUT SCENES & DIALOGUE +[PRO1_K:PROT1] +Die Geschãftsleute hier wissen, dass Diaz weg ist und weigern sich, Schutzgeld zu zahlen. -[CR04_02:CRED01] -~n~ ~n~ ~n~ ~n~Motion Capture Director ~n~Navid Khonsari +[PRO1_L:PROT1] +Oh, wir könnten es mit Schmiergeld versuchen... -[CR04_03:CRED01] -~n~ ~n~ ~n~ ~n~Motion Capture Performed by ~n~Danny Mastrogiorgio, Jeffrey C. Hawkins, ~n~Bruce MacVittie, David Zayas, ~n~Peter Appel, Hannah Moon, ~n~Alyssa Truppelli, Joe Lotruglio +[PRO1_M:PROT1] +Schmiergeld? Blödsinn! Ich zeig euch, wie man denen Angst macht. -[CR04_04:CRED01] -~n~ ~n~ ~n~ ~n~Voices Performed by ~n~Salvatore Leone - Frank Vincent ~n~Toni Cipriani - Danny Mastrogiorgio ~n~Donald Love - Will Janowitz +[PRO1_01:PROT1] +~g~Demoliere die Schaufenster der Lãden und die Inhaber werden darum betteln, zahlen zu dürfen. -[CR04_05:CRED01] -~n~ ~n~ Vincenzo Cilli - Joe Lotruglio ~n~Maria Latore - Fiona Gallagher ~n~JD O'Toole - Greg Wilson +[PRO1_03:PROT1] +~r~Du sollst abhauen, nicht Kaffee trinken gehen. -[CR04_06:CRED01] -~n~ ~n~Leon McAffrey - Ron Orbach ~n~Ray Machowski - Peter Appel ~n~Toshiko Kasen - Hannah Moon +[PRO1_04:PROT1] +Mein Lebenswerk! Zerstört! -[CR04_07:CRED01] -~n~ ~n~ Ned Burner - Peter Bradbury ~n~Ma Cipriani - Sondra James ~n~Giovanni Casa - Joel Jones +[PRO1_05:PROT1] +Ich bin ruiniert...RUINIERT!! -[CR04_08:CRED01] -~n~ ~n~Kazuki Kasen - Keenan Shimizu ~n~Massimo Torini - Duccio Faggella ~n~Mickey Hamfists - Chris Tardio +[PRO1_06:PROT1] +Ich zahle einen Haufen Schutzgeld! -[CR04_09:CRED01] -~n~ ~n~Jane Hopper - Gordana Rashovich ~n~Mayor O'Donovan - John Braden ~n~8 Ball - Guru +[PRO1_07:PROT1] +Mein schönes Schaufenster! -[CR04_10:CRED01] -~n~ ~n~Radio Newscaster - Sharon Washington ~n~TV Reporter - Brooke Alexander +[PRO1_08:PROT1] +Mein Laden! Mein schöner Laden! -[CR04_11:CRED01] -~n~ ~n~ ~n~ ~n~Pedestrian Dialogue ~n~Una Cruickshank, Gregory Johnson, ~n~Sanford Santacroce, Ayana Osada +[PRO1_09:PROT1] +Vercetti. Merkt euch den Namen. -[CR04_12:CRED01] -~n~ ~n~ ~n~ ~n~Pedestrian Voices ~n~Jamie Hector, Jackson Loo, ~n~Bruce MacVittie, Jeff Gurner, ~n~Jamie Hector, Andrea Kessler, +[PRO1_10:PROT1] +Ich bin jetzt der Boss in der Stadt. ICH! -[CR04_13:CRED01] -~n~ ~n~Lynne Horton, Phil Mikkelson, ~n~Koji Nonoyama, Devin Bennett, ~n~Jay Capozello, Mike Nathan, +[BUYP1:PROT1] +Du kannst jetzt in bestimmten Gegenden auf der Karte Objekte kaufen. -[CR04_14:CRED01] -~n~ ~n~Ethan Abeles, Lance Williams, ~n~Natalya Wilson, Jay Gladstone, ~n~Craig Blair, Dave Edwards, +[BUYP2:PROT1] +Wenn du ein Gebãude mit grüner Markierung siehst, kannst du dieses kaufen. -[CR04_15:CRED01] -~n~ ~n~Gregory Johnson, John Zurhellen, ~n~Blair Sadler, Georgia Sadler, ~n~Nicole Sadler, Judy Henderson, +[PRO1_N:PROT1] +Ich bin in fünf Minuten zurück... -[CR04_16:CRED01] -~n~ ~n~Kim Graham, Kerry Shaw, ~n~Tamara Carrion, Franceska Clemens, ~n~Navid Khonsari, Noelle Sadler, +[PRO1_11:PROT1] +~g~Begib dich zum ~y~North Point Einkaufszentrum~g~ in ~y~Vice Point~g~. -[CR04_17:CRED01] -~n~ ~n~Nicholas Mongomery, Anthony Macbain, ~n~Ryan Rayhill, Josh Slater, ~n~Carmelo Gaeta, Hikari Yokoyama, +[PRO1_12:PROT1] +~g~Zerbrich die Schaufenster eines jeden Ladens, und die Inhaber werden um neuen Schutz betteln. -[CR04_18:CRED01] -~n~ ~n~Chris Jobin, Michael Rothstein, ~n~Stacey Rachels, Jennifer Koontz, ~n~Dan Merrill, Ali Khonsari, +[PRO1_C:PROT1] +Du bist mein Anwalt, nicht mein Innenarchitekt. Klar? -[CR04_19:CRED01] -~n~ ~n~Ellen Rose, Chris Standal, ~n~Lorie Goodman, Neal Johnston, ~n~Son Garth, James Larsen, +[BUYP3:PROT1] +Stell dich in die Markierung und drücke die ~h~~k~~PED_ANSWER_PHONE~~w~-Taste, um das Objekt zu kaufen. -[CR04_20:CRED01] -~n~ ~n~Karl Weibel, Ramin Khonsari, ~n~Ed. Thomas Jr., Stanton Sargent, ~n~Oswald Greene, Audrey Amey, +[PRO1_13:PROT1] +~g~Du hast fünf Minuten, um alle zu demolieren. -[CR04_21:CRED01] -~n~ ~n~Sanford Santacroce, Jeff Madrick, ~n~Ben Weaver, Andrea Kessler, ~n~CS Lee, Yoshi Amao, +{=================================== MISSION TABLE PROT2 ===================================} -[CR04_22:CRED01] -~n~ ~n~ Jackson Loo, Martha Morrison, ~n~Sarah Bloodsworth, Adam Deher, ~n~Billy Gonzalez +[PRO2_01:PROT2] +~g~Schalte die Wachen aus, die die Front Page Bar beschützen und finde raus, wer hinter ihnen steckt. -[CR04_23:CRED01] -~n~ ~n~ ~n~ ~n~Additional Motion Graphics ~n~Maryam Parwana +[PRO2_08:PROT2] +~g~Die DBP Security wird wissen, dass du kommst. Schnapp sie dir, ehe sie abhauen. -[CR04_24:CRED01] -~n~ ~n~ ~n~ ~n~Dialogue Recording & Mixing ~n~Nicholas Montgomery +[PRO2_A:PROT2] +Was gibt's für Probleme? -[CR04_25:CRED01] -~n~ ~n~ ~n~ ~n~Foley Recording ~n~Bryan Scibinico +[PRO2_B:PROT2] +Eine Bar weigert sich zu zahlen. -[CR04_26:CRED01] -~n~ ~n~ ~n~ ~n~Foley recorded at Dig It Studios +[PRO2_C:PROT2] +Die glauben, die werden von so einer Schlãgerbande beschützt. -[CR04_27:CRED01] -~n~ ~n~ ~n~ ~n~Production Team ~n~Noelle Sadler, Eli Weissman, ~n~Kerry Shaw, John Zurhellen, ~n~Peter Adler, Anthony Carvalho, +[PRO2_D:PROT2] +Aber keine Sorge, Tommy, ich regle das. -[CR04_28:CRED01] -~n~ ~n~Phil Poli, Jaesun Celebre, ~n~Franceska Clemens, Anthony Litton +[PRO2_E:PROT2] +Das nennst du regeln? -[CR04_29:CRED01] -~n~ ~n~ ~n~ ~n~Casting ~n~Judy Henderson and Associates +[PRO2_F:PROT2] +Ihr zwei. Hebt mal den Hintern... -[CR04_30:CRED01] -~n~Motion Capture recorded at Perspective Studios +[PRO2_G:PROT2] +Los. -[CR05_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RADIO +[PRO2_10:PROT2] +Zwei sind abgehauen. Finde sie und bring die Sache zuende. -[CR05_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ Banter, Talk Radio, Commercials and Imaging written by ~n~Dan Houser and Lazlow +[PRO2_11:PROT2] +Steig in den Wagen, Nichtsnutz. -[CR05_03:CRED01] -~n~ ~n~ ~n~ ~n~Production by ~n~Lazlow +[PRO2_02:PROT2] +Dein Schutz braucht ein bisschen mehr Schutz. -[CR05_04:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~LCFR +[PRO2_03:PROT2] +Ach, verdammt! Nicht schon wieder! Das brauche ich wirklich nicht! -[CR05_05:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Smith Harrison, Karen Saltus +[PRO2_04:PROT2] +Diese Idioten arbeiten eigentlich für die DBP Security gleich um die Ecke. -[CR05_06:CRED01] -~n~ ~n~ ~n~ ~n~Heartland Values with Nurse Bob ~n~Nurse Bob - Chuck Montgomery +[PRO2_05:PROT2] +Macht ihr das mal unter euch aus. -[CR05_07:CRED01] -~n~ ~n~ ~n~ ~n~Guests and Callers ~n~Ayana Osada, Nick Montgomery, ~n~Russell Lewis, Nick Born, ~n~Sean Macaluso, Kerry Shaw, +[PRO2_06:PROT2] +Wir sehen uns. -[CR05_08:CRED01] -~n~ ~n~Chad Johnson, Craig Conner, ~n~Mary Elizabeth, Rob Cross, ~n~Josh Bitney +[PRO2_07:PROT2] +Ja, ja. Wenn's sein muss. -[CR05_09:CRED01] -~n~ ~n~ ~n~ ~n~Electron Zone ~n~Steve - Ptolemy Slocum ~n~Bill - Michael Urichek +[PRO2_09:PROT2] +~g~Begib dich zur Front Page Bar und sprich mit dem Besitzer. -[CR05_10:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Alice Saltzman, Jeremy Wheaton, ~n~Ryan Rayhill, Maine Anderson, ~n~Patton Oswalt, Wil Wheaton, ~n~Anthony Cumia, Madena Parwana +{=================================== MISSION TABLE PROT3 ===================================} -[CR05_11:CRED01] -~n~ ~n~ ~n~ ~n~Breathing World ~n~Lee Chowder - Ashley Albert ~n~Crow - Gregg Martin +[PRO3_A:PROT3] +Du Trottel! Was hast du dir dabei gedacht?! -[CR05_12:CRED01] -~n~ ~n~ ~n~ ~n~Coq 'O' Vin ~n~Richard Goblin - Mike Shapiro +[PRO3_B:PROT3] +Ist dir klar, was das bedeutet?! -[CR05_13:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Ben Krech +[PRO3_C:PROT3] +Das könnte das Ende für uns alle sein! -[CR05_14:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Franceska Clemins, Sarah Bloodsworth, ~n~Adam Deher, Martha Morrison, ~n~Carmelo Gaeta +[PRO3_D:PROT3] +Der Zeitzünder muss hin gewesen sein. -[CR05_15:CRED01] -~n~ ~n~ ~n~ ~n~Chatterbox ~n~Lazlow as himself +[PRO3_E:PROT3] +Der Laden war mit Sprengstoff vollgepackt wie eine Feuerwerkfabrik. -[CR05_16:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Susan Lewis, Ben Weaver, ~n~Jacky Bam Bam, Ben Sparks, ~n~Deanna Moyer, Liezl Jacinto, +[PRO3_F:PROT3] +Dann hat jemand den Cops einen Tipp gegeben... -[CR05_17:CRED01] -~n~ ~n~Joshua Batista, Gregg Opie Hughes, ~n~Sondra James, Elizabeth Satterwhite +[PRO3_G:PROT3] +Was gibt's für Probleme, Jungs? -[CR06_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~HEAD RADIO +[PRO3_H:PROT3] +Mike sollte einen Laden im Einkaufszentrum abfackeln, -[CR06_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Michael Hunt - Russ Mottla +[PRO3_I:PROT3] +aber er hat's vermasselt und jetzt wimmelt es dort von Bullen. -[CR06_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Jeff Berlin, Katelyn Hutchinson +[PRO3_J:PROT3] +Wir müssen unser Zeug holen und verschwinden! -[CR06_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jeff Berlin +[PRO3_K:PROT3] +Langsam, ihr beiden, lasst mich kurz nachdenken! -[CR06_05:CRED01] -~n~ ~n~ ~n~ ~n~"Train" ~n~Conor & Jay ~n~Written by Craig Conner & Julie Wemyss ~n~Produced by Craig Conner ~n~Guitars by Jon McCavish ~n~Vocals by Julie Wemyss and Craig Conner +[PRO3_L:PROT3] +Tommy Vercetti lãuft nicht einfach weg. -[CR06_06:CRED01] -~n~ ~n~ ~n~ ~n~"The One For Me" ~n~Cloud Nineteen ~n~Written & Produced by ~n~Will Morton ~n~Additional Lyrics by Paul Mackie ~n~Guitars by Allan Walker & Chris Morton ~n~Lead Vocals by Raff ~n~Backing Vocals by Paul Mackie & Raff +[PRO3_M:PROT3] +Die Cops werden das Gebãude sorgfãltig durchkãmmen, oder? -[CR06_07:CRED01] -~n~ ~n~ ~n~ ~n~"Take The Pain" ~n~Purser ~n~Written & Produced by ~n~Will Morton, Chris Morton ~n~Additional Lyrics by Paul Mackie ~n~Lead Vocals by Paul Mackie ~n~Additional Vocals by Will Morton +[PRO3_N:PROT3] +Aber das dauert. -[CR06_08:CRED01] -~n~ ~n~ ~n~ ~n~"Free Yourself" ~n~L-Marie featuring Raff ~n~Written & Produced by Craig Conner ~n~Vocals by L-Marie and Raff ~n~Backing Vocals by Craig Conner +[PRO3_O:PROT3] +Wir müssen den Laden selbst abfackeln. -[CR06_09:CRED01] -~n~ ~n~ ~n~ ~n~"Drive" ~n~15 Ways ~n~Written & Produced by Colin Entwistle ~n~Vocals by Paul Mackie +[PRO3_P:PROT3] +Ja, aber... -[CR06_10:CRED01] -~n~ ~n~ ~n~ ~n~"Welcome To The Real World" ~n~Rosco Stow ~n~Written & Produced by Craig Conner ~n~Guitars Written, Produced and Performed by Allan Walker ~n~Lead Vocals by Andy Dorrat ~n~Backing Vocals by Craig Conner, ~n~Anna Stuart and Kim Gurney +[PRO3_Q:PROT3] +Nur ein Cop kommt auch nur in die Nãhe von dem Laden! -[CR06_11:CRED01] -~n~ ~n~ ~n~ ~n~"Keep Dreaming" ~n~Vanilla Smoothie ~n~Written & Produced by ~n~Alastair MacGregor ~n~Guitars by Allan Walker ~n~Vocals by Fiona Stoddart +[PRO3_R:PROT3] +Dann gehen wir eben als Cops. -[CR07_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~LIPS 106 +[PRO3_S:PROT3] +Wir brauchen Uniformen und einen Streifenwagen. -[CR07_02:CRED01] -~n~ ~n~ ~n~ ~n~DJs ~n~Cliff - Ed McMann ~n~Andee - Shelley Miller +[PRO3_T:PROT3] +Und das alles nur wegen dir, Mike. -[CR07_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Jonathan Hanst +[PRO3_U:PROT3] +Tut mir leid. -[CR07_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jonathan Hanst +[PRO3_V:PROT3] +Ich hab's. -[CR07_05:CRED01] -~n~ ~n~ ~n~ ~n~"Funk In Time" ~n~Rudy La Fontaine ~n~Written & Produced by Jon McCavish ~n~Guitars by Julian Pais ~n~Vocals by Julian Pais +[PRO3_W:PROT3] +Wir müssen die Cops hereinlocken, -[CR07_06:CRED01] -~n~ ~n~ ~n~ ~n~"Love Is The Feeling" ~n~Sawarr ~n~Written by Craig Conner & Julie Wemyss ~n~Produced by Craig Conner ~n~Vocals by Julie Wemyss +[PRO3_X:PROT3] +dann sperren wir sie ein -[CR07_07:CRED01] -~n~ ~n~ ~n~ ~n~"Mine Until Monday" ~n~Sunshine Shine ~n~Written & Produced by Will Morton ~n~Additional Lyrics by Paul Mackie ~n~Vocals by Paul Mackie & Raff +[PRO3_Y:PROT3] +und überwãltigen sie. -[CR07_08:CRED01] -~n~ ~n~ ~n~ ~n~"Get Down" ~n~Credit Check ~n~Written & Produced by ~n~Alastair MacGregor ~n~Guitars by Martyn Livingstone ~n~Bass by Andy Wilson ~n~Vocals by Louise Ferrier +[PRO3_Z:PROT3] +Guter Plan. Los geht's! -[CR07_09:CRED01] -~n~ ~n~ ~n~ ~n~"Tonight" ~n~Cool Timers ~n~Written & Produced by Craig Conner ~n~Vocals by Julie Wemyss +[PRO3_A1:PROT3] +Ok. -[CR07_10:CRED01] -~n~ ~n~ ~n~ ~n~"Bassmatic" ~n~Nina Barry ~n~Written & Produced by Jon McCavish ~n~Vocals by Riz Maslen +[PRO3_01:PROT3] +Ok, Lance, machen wir die Cops auf uns aufmerksam! -[CR07_11:CRED01] -~n~ ~n~ ~n~ ~n~"Into Something (C'mon Get Down)" ~n~The Jackstars ~n~Written & Produced By ~n~Craig Conner ~n~Vocals by Lucie Danti-Juan ~n~Backing vocals by ~n~Kevin Stacey & Craig Conner +[PRO3_02:PROT3] +~g~ Nimm den Streifenwagen und lege die Bombe im Tarbrush Coffee Shop im Einkaufszentrum. -[CR08_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~DOUBLE CLEF FM +[PRO3_03:PROT3] +~g~Du hast Lance vergessen. Hole ihn. -[CR08_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Sergio Boccino - Robert Blumenfeld +[PRO3_04:PROT3] +~g~ Los geht's. -[CR08_03:CRED01] -~n~ ~n~ ~n~ ~n~Caller ~n~Gerald Cosgrove +[PRO3_05:PROT3] +~r~Du hast Lance erledigt! -[CR08_04:CRED01] -~n~ ~n~ ~n~ ~n~"Il Trovatore: Anvil Chorus" ~n~Composed by Giuseppe Verdi ~n~Performed by ~n~Nuremberg Symphonic Orchestra ~n~& Munich State Opera Choir ~n~Courtesy of Point Classics, LLC +[PRO3_07:PROT3] +~g~Die Tarnung ist aufgeflogen. Beeilung, platziere die Bombe! -[CR08_05:CRED01] -~n~ ~n~ ~n~ ~n~"Il Trovatore: Tacea la notte placida" ~n~Composed by Giuseppe Verdi ~n~Performed by ~n~Nuremberg Symphonic Orchestra & ~n~Munich State Opera Choir ~n~(Eva Illes, Soprano) ~n~Courtesy of Point Classics, LLC +[PRO3_09:PROT3] +Fessle und kneble sie! -[CR08_06:CRED01] -~n~ ~n~ ~n~ ~n~"Nabucco: Chorus of the Hebrew Slaves" ~n~Composed by Giuseppe Verdi ~n~Performed by Philharmonia Slavonica ~n~Courtesy of Point Classics, LLC +[PRO3_10:PROT3] +Uuh! Passt perfekt! -[CR08_07:CRED01] -~n~ ~n~ ~n~ ~n~"Così fan tutte: È amore un ladroncello" ~n~Composed by Wolfgang Amadeus Mozart ~n~Performed by ~n~Bratislava Opera Soloists, ~n~Choir and Orchestra ~n~(Ida Kirilova "Dorabella") ~n~Courtesy of Point Classics, LLC +[PRO3_11:PROT3] +Bisschen eng im Schritt vielleicht... -[CR08_08:CRED01] -~n~ ~n~ ~n~ ~n~"Marriage of Figaro: Overture" ~n~Composed by Wolfgang Amadeus Mozart ~n~Performed by ~n~London Philharmonic Orchestra ~n~Courtesy of Point Classics, LLC +[PRO3_12:PROT3] +Oh ja, ja. Meine auch, meine auch. -[CR08_09:CRED01] -~n~ ~n~ ~n~ ~n~"I Pagliacci: Vesti la giubba" ~n~Composed by Ruggiero Leoncavallo ~n~Performed by ~n~Nuremberg Symphonic Orchestra ~n~(José Maria Perez, Tenor) ~n~Courtesy of Point Classics, LLC +[PRO3_13:PROT3] +Vorsicht, Bruder! Kein Cop fãhrt so schlecht! -[CR09_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RISE FM +[PRO3_14:PROT3] +Denk dran, lãchle die anderen Cops an. -[CR09_02:CRED01] -~n~ ~n~ ~n~ ~n~Engineered by Mike Callaghan +[PRO3_15:PROT3] +Hallo, Officer. Hübsche Marke, hübsche Marke. -[CR09_03:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Boy Sanchez - Oliver Vaquer +[PRO3_16:PROT3] +Ganz toll, Lance. -[CR09_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~DJ Andre, Lupus Thunder, ~n~Andi Hanley, Mat Ckillz, ~n~Couzin Ed, Lazlow, +[PRO3_17:PROT3] +Ok, die Zünder sind auf 5 Sekunden gestellt. -[CR09_05:CRED01] -~n~ ~n~Terry Donovan, Bill Brissette, ~n~Juan Aller, Ed Andrews, ~n~Xeni Jardin, Matthew Orr, ~n~Jeff Berlin +[PRO3_18:PROT3] +5 Sekunden?!! Nichts wie raus hier! -[CR09_06:CRED01] -~n~ ~n~ ~n~ ~n~"Sing It Back ~n~(Boris Musical Mix)" ~n~Moloko ~n~Written by M. Brydon, R. Murphy ~n~Published by Chrysalis Music (ASCAP) ~n~Remix and Additional Production by ~n~Boris Dlugosch ~n~(p) + © 1998 The Echo Label ~n~Courtesy of Chrysalis Music Limited +[PRO3_19:PROT3] +Jetzt sind sie so richtig stocksauer. -[CR09_07:CRED01] -~n~ ~n~ ~n~ ~n~"Free" ~n~Ultra Nate ~n~Written by U. Nate, L. Springsteen, ~n~J. Ciafone ~n~Published by Warner/ Chappell Music/ BMG Music ~n~(p) + © 1997 Strictly Rhythm Records LLC ~n~Courtesy of Warner Strategic Marketing +[PRO3_20:PROT3] +~g~Bring 2 Cops dazu, dir in die Garage zu folgen. -[CR09_08:CRED01] -~n~ ~n~ ~n~ ~n~"I Believe" ~n~Happy Clappers ~n~Written by C. Scott, G. Ripley, M. Knotts, M. Topham ~n~Published by All Boys Music Ltd ~n~(p) + © 1994 C J Scott Productions ~n~Courtesy of C J Scott Productions +[PRO3_21:PROT3] +~g~Beschaff dir einen Fahndungslevel, damit dir die Cops in die Garage folgen. -[CR09_09:CRED01] -~n~ ~n~ ~n~ ~n~"House Music" ~n~Eddie Amador ~n~Written by Eddie Amador ~n~Published by ~n~Deep Dish Music ~n~(p) + © 1998 Yoshitoshi Records ~n~Courtesy of ~n~Deep Dish Recordings, Inc. ~n~by arrangement with ~n~Nasseri Music Business Solutions +[PRO3_22:PROT3] +~g~Das Garagentor ist blockiert! Du musst es freirãumen, damit es schließen kann. -[CR09_10:CRED01] -~n~ ~n~ ~n~ ~n~"Feel What You Want" ~n~Kristine W ~n~Written by R. Dougan, R. Armstrong, ~n~K. Weitz ~n~Published by BMG Music/Weitz House Publishing (ASCAP)/ EMI Music Publishing ~n~(p) + © 1996 RCA/ BMG ~n~Courtesy of Sony BMG Entertainment +[PRO3_23:PROT3] +~g~Stell dich in die Markierung, um die Bombe zu platzieren. -[CR09_11:CRED01] -~n~ ~n~ ~n~ ~n~"Hideaway ~n~(Deep Dish Vocal Remix)" ~n~De'Lacy ~n~Written by K. Hedge, J. Milan ~n~Published by ~n~Warner-Tamerlane Publishing Corp ~n~Remix and Additional Production by ~n~Deep Dish ~n~(p) 1995 Easy Street Recordings Inc ~n~© 1998 Kickin Music Ltd ~n~Courtesy of Easy Street Recordings Inc. and Slip n' Slide Records +[PRO3_24:PROT3] +~g~Verschwinde aus der Nãhe des Cafés! -[CR09_12:CRED01] -~n~ ~n~ ~n~ ~n~"Spin Spin Sugar ~n~(Armand's Dark Garage Mix)" ~n~Sneaker Pimps ~n~Written by I. Pickering, L. Coverdale Howe, C. Corner ~n~Remix and Additional Production by ~n~Armand Van Helden ~n~Published by BMG Songs, Inc ~n~(p) + © 1997 Clean Up Records Ltd ~n~Courtesy of EMI Music / ~n~One Little Indian, Ltd +[PRO_AS1:PROT3] +SCHUTZGELD-MISSIONEN ERFÜLLT -[CR09_13:CRED01] -~n~ ~n~ ~n~ ~n~"Plastic Dreams" ~n~Jaydee ~n~Written by R. Albers ~n~Published by TBM Holland ~n~(p) 1992 R & S Records ~n~© Robin Albers ~n~Courtesy of Robin "Jaydee" Albers +[PRO_AS2:PROT3] +~g~Das Vercetti Estate generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. -[CR09_14:CRED01] -~n~ ~n~ ~n~ ~n~"Altered States" ~n~Ron Trent ~n~Written by R. Trent ~n~Published by ~n~High Fashion Music/ Nanada Music ~n~(p) + © 1993 Warehouse ~n~Djax-Up Beats ~n~Courtesy of High Fashion Music/ ~n~Djax-Up Beats +[PRO3_08:PROT3] +~g~Du musst zurück zu ~h~Vercetti Estate~g~ auf ~h~Starfish Island~g~. -[CR09_15:CRED01] -~n~ ~n~ ~n~ ~n~"There Will Come A Day (Half Tab Dub)" ~n~The Absolute featuring Suzanne Palmer ~n~Written by M. Pichiotti, C.J. Snider ~n~Published by Much Noyse Music/ ~n~Hoobini Music (ASCAP) ~n~(p) + © 1995 Mark Productions, Inc ~n~Courtesy of Mark Productions, Inc +{=================================== MISSION TABLE RACES ===================================} -[CR09_16:CRED01] -~n~ ~n~ ~n~ ~n~"Positive Education" ~n~Slam ~n~Written by S. McMillan, O. Meikle, ~n~G. Gibbons, J. Muotone ~n~Published by EMI Music Publishing ~n~(p) + © 1997 Soma Recordings Ltd ~n~Courtesy of Soma Recordings Ltd +[RACES_2:RACES] +~g~Du brauchst ein Fahrzeug! Das ist kein Wettlaufen! -[CR09_17:CRED01] -~n~ ~n~ ~n~ ~n~"Flash" ~n~Green Velvet ~n~Written by C. Jones ~n~Published by Curtis A. Jones Music (ASCAP) ~n~(p) 1995 Relief Records ~n~© 2000 Warner Bros. Records and N.E.W.S. Records and Relief Records ~n~Courtesy of Warner Strategic Marketing, N.E.W.S. Records, Relief Records +[RACES_3:RACES] +3..2..1.. LOS, LOS, LOS! -[CR09_18:CRED01] -~n~ ~n~ ~n~ ~n~"Circus Bells (Hardfloor Remix)" ~n~Robert Armani ~n~Written by R. Armani ~n~Published by ~n~High Fashion Music/ Nanada Music ~n~(p) + © 1993 Warehouse/ ~n~Djax-Up Beats ~n~Courtesy of High Fashion Music/ ~n~Djax-Up Beats +[RACES_8:RACES] +~r~Du hast das Rennen nicht gewonnen! -[CR09_19:CRED01] -~n~ ~n~ ~n~ ~n~"Higher State Of Consciousness" ~n~Wink ~n~Written by J. Wink ~n~Published by Strictly Rhythm Publishing, Inc. (ASCAP) / Warner/Chappell Music / Wink Inc. (ASCAP) / EMI Music Publishing ~n~(p) + © 1995 Strictly Rhythm Records LLC ~n~Courtesy of Warner Strategic Marketing +[RACES00:RACES] +Rennen ~1~: -[CR10_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RADIO DEL MUNDO +[RACES01:RACES] +Todeskaracho -[CR10_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Panjit Gavaskar - Hajaz Akram +[RACES02:RACES] +Ocean Drive -[CR10_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Jessica Wachsman +[RACES03:RACES] +Küsten-Rallye -[CR10_04:CRED01] -~n~ ~n~ ~n~ ~n~"Raghupati (Folk Tune)" ~n~Ananda Shankar ~n~Arranged by A. Shankar, Lewinson, Hassilev ~n~Published by Warner Chappell Inc ~n~(p) + © 1970 Reprise Records for the U.S. and WEA International Inc ~n~Courtesy of Warner Strategic Marketing +[RACES04:RACES] +Capital Cruise -[CR10_05:CRED01] -~n~ ~n~ ~n~ ~n~"Dum Maro Dum" ~n~Asha Bhosle ~n~Written by RD Burman, Anand Bakshi ~n~Published by Saregama India Ltd ~n~(p) + © 1971 Saregama India Ltd ~n~Courtesy of Saregama India Ltd +[RACES05:RACES] +Tour! -[CR10_06:CRED01] -~n~ ~n~ ~n~ ~n~"Neeve Nanna (Only You Were Mine)" ~n~Vijaya Anand ~n~Written by Vijaya Anand ~n~Published by Shake Boom! (ASCAP)/ ~n~Luaka Bop Inc ~n~(p) 1988 Lahari/Audiovision ~n~© 1992 Sire Records Company ~n~Courtesy of ~n~Luaka Bop Records +[RACES06:RACES] +V.C. Endurance -[CR10_07:CRED01] -~n~ ~n~ ~n~ ~n~"Kidda" ~n~Natacha Atlas ~n~Written by N. Atlas, J. Reynolds, J. Adams ~n~Published by Warner Chappell Music Ltd ~n~(p) + © 1997 Nation Records Ltd/ ~n~Beggars Banquet Records Ltd ~n~Courtesy of Nation Records Ltd/ ~n~Beggars Banquet Records Ltd +[RACES07:RACES] +Startgebühr: $~1~ -[CR10_08:CRED01] -~n~ ~n~ ~n~ ~n~"Hebeena Hebeena" ~n~Farid El Atrache ~n~Written by Barakat, Atrache ~n~Published by Voices Of Lebanon ~n~(p) + © 1974 Voices Of Lebanon ~n~Courtesy of EMI Music/ EMI Music Arabia +[RACES08:RACES] +Bestzeit: ~1~:~1~ -[CR10_09:CRED01] -~n~ ~n~ ~n~ ~n~"Aini Bet Ref" ~n~Ahmed Mneimneh ~n~Written by A. Alishaan ~n~Published by D. Dersahakian (ASCAP) ~n~(p) + © Voice of Stars & ~n~Lys Records ~n~Courtesy of Voice of Stars & ~n~Lys Records +[RACES09:RACES] +Beste Platzierung: 1. -[CR10_10:CRED01] -~n~ ~n~ ~n~ ~n~"Im Nin'Alu" ~n~Ofra Haza ~n~Traditional, Arranged by I. Ashdot, B. Nagari ~n~Published by Blue Lake Music ~n~ (p) + © 1988 Sire Records Company ~n~Courtesy of Warner Strategic Marketing +[RACES10:RACES] +Beste Platzierung: 2. -[CR10_11:CRED01] -~n~ ~n~ ~n~ ~n~"Ballaa Tsoubou Hal Kahwa" ~n~Samira Tawfic ~n~Written by R. Al Khylani, J. Al A'ss ~n~Published by Copyright Control ~n~(p) + © Voices Of Lebanon ~n~Courtesy of EMI Music/ EMI Music Arabia +[RACES11:RACES] +Beste Platzierung: 3. -[CR11_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~K-JAH +[RACES12:RACES] +Beste Platzierung: 4. -[CR11_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Natalee Walsh Davis - Pascale Armand +[RACES13:RACES] +Streckenlãnge: ~1~.~1~ km -[CR11_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Karl Weibel, Pat McKay +[RACES15:RACES] +Bestzeit: Nicht verfügbar -[CR11_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jay Wright Productions +[RACES16:RACES] +Beste Platzierung: Nicht verfügbar -[CR11_05:CRED01] -~n~ ~n~ ~n~ ~n~"Pick a Sound" ~n~Selah Collins, Ruddy Ranks, Redeye ~n~Written by S. Collins, H. Burke, ~n~E. Donaldson ~n~Published by Copyright Control/ MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[RACES19:RACES] +Du hast nicht genug Geld, um an diesem Rennen teilzunehmen. -[CR11_06:CRED01] -~n~ ~n~ ~n~ ~n~"What a Wonderful Feeling" ~n~Errol Bellot, Ruddy Ranks, Redeye ~n~Written by E. Bellot, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[RACES22:RACES] +Bestzeit: ~1~:0~1~ -[CR11_07:CRED01] -~n~ "Watch How the People Dancing" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by K. Wright ~n~Published by Jetstar ~n~Courtesy of Honest Jons Records +[RACES23:RACES] +Streckenlãnge: ~1~.~1~ Meilen -[CR11_08:CRED01] -~n~ ~n~ ~n~ ~n~"Lean Boot" ~n~Richie Davis, Ruddy Ranks, Redeye ~n~Written by R. Davis, H. Burke, ~n~E. Donaldson ~n~Published by Westbury Music/ MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[RACES_1:RACES] +~g~Schnapp dir ein schnelles Fahrzeug und begib dich zur Startlinie. -[CR11_09:CRED01] -~n~ ~n~ ~n~ ~n~"Ready For the Dancehall Tonight" ~n~Peter Bouncer, Ruddy Ranks, Redeye ~n~Written by Peter McKenzie, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[RACEHLP:RACES] +~w~Drücke die~h~ ~k~~PED_SPRINT~~w~, um das ausgewãhlte Rennen zu starten. Drücke die~h~ ~k~~VEHICLE_ENTER_EXIT~~w~, um abzubrechen. -[CR11_10:CRED01] -~n~ ~n~ ~n~ ~n~"You Ha Fe Cool" ~n~Richie Davis, Ruddy Ranks, Redeye ~n~Written by R. Davis, H. Burke, ~n~E. Donaldson. ~n~Published by Westbury Music/MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +{=================================== MISSION TABLE RCHELI1 ===================================} -[CR11_11:CRED01] -~n~ ~n~ ~n~ ~n~"Ring My Number" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by Kenneth Wright, H. Burke, ~n~E. Donaldson. ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[WRECKED:RCHELI1] +~r~Das Fahrzeug ist Schrott! -[CR11_12:CRED01] -~n~ ~n~ ~n~ ~n~"Run Come Call Me" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by Kenneth Wright, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[RCH1_4:RCHELI1] +Verbleibende Checkpoints: -[CR12_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~THE LIBERTY JAM +[RCH1_7:RCHELI1] +~g~Es gibt insgesamt 20 Checkpoints. -[CR12_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~DJ Clue as himself +[RCH1_12:RCHELI1] +~g~Der ferngesteuerte Helikopter gerãt außer Reichweite! -[CR12_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Jay Wright, Tom Yankowski, Chris Mercado, Vanessa Grullon +[RCH1_13:RCHELI1] +~r~Der ferngesteuerte Helikopter ist außer Reichweite! -[CR12_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jay Wright Productions +[RCH1_8:RCHELI1] { reVC update } +~g~Wenn du diese Mission abbrechen willst, drücke die ~h~~k~~VEHICLE_FIREWEAPON~~g~, um deinen Heli zu sprengen. -[CR12_05:CRED01] -~n~ ~n~ ~n~ ~n~"All I Need" ~n~Method Man ~n~Written by C. Smith, R. Diggs ~n~Published by Sony BMG Music ~n~(p) + © 1994 Def Jam Recordings ~n~Courtesy of Def Jam Recordings/ UME +{=================================== MISSION TABLE RCPLNE1 ===================================} -[CR12_06:CRED01] -~n~ ~n~ ~n~ ~n~"Shook Ones Pt. II" ~n~Mobb Deep ~n~Written by A. Johnson, K. Muchita ~n~Published by ~n~BMG Songs Inc. (ASCAP) ~n~(p) + © 1995 BMG Music ~n~Courtesy of RCA Records by arrangement with Sony BMG Ent +[RCPL1_4:RCPLNE1] +~g~Miss dich mit 3 anderen ferngesteuerten Maschinen in einem CHECKPOINT RENNEN -[CR12_07:CRED01] -~n~ ~n~ ~n~ ~n~"Incarcerated Scarface" ~n~Raekwon ~n~Written by R. Diggs, C. Woods, A. Tilman ~n~Published by ~n~Careers-BMG Music Publishing Inc./ ~n~Wu Tang Publishing (BMI)/ ~n~Bridgeport Music ~n~(p) + © 1995 BMG Music +[RCPL1_5:RCPLNE1] +~g~Flieg durch die Checkpoints, die über Vice City verteilt sind. -[CR12_08:CRED01] -Courtesy of RCA Records by arrangement with Sony BMG Ent ~n~This track contains a sample of "You're Getting A Little Too Smart" as performed by The Detroit Emeralds. Courtesy of Westbound Records. Used by permission. All rights reserved +[RCPL1_6:RCPLNE1] { reVC update } +~g~Wenn du diese Mission abbrechen willst, drücke die ~h~~k~~VEHICLE_FIREWEAPON~~g~, um dein Flugzeug zu sprengen. -[CR12_09:CRED01] -~n~ ~n~ ~n~ ~n~"N.O.R.E." ~n~Noreaga ~n~Written by V. Santiago, J. Olivier, ~n~S. Barnes ~n~Published by Suite 1202 Music/ Jose Luis Gotcha Music (BMI)/ Slamuwell Productions/ Jelly's Jam LLC (ASCAP)/ ~n~12 & Under Music/ +[RCPL1_8:RCPLNE1] +~g~Dein ferngesteuertes Flugzeug gerãt außer Reichweite! -[CR12_10:CRED01] -Jumping Bean Songs LLC (BMI) ~n~(p) + © 1998 Penalty Recordings ~n~Courtesy of Warner Strategic Marketing +[RCPL1_9:RCPLNE1] +~r~Dein ferngesteuertes Flugzeug ist außer Reichweite! -[CR12_11:CRED01] -~n~ ~n~ ~n~ ~n~"Shut 'Em Down (Remix)" ~n~Onyx featuring Noreaga & Big Pun ~n~Written by F. Scruggs, K. Jones, T. Taylor, E. Hinson, E. Simmons ~n~Published by Universal Music/ ~n~Let Me Show You Music/ ~n~Jelly Jams Music/ +{=================================== MISSION TABLE RCRACE1 ===================================} -[CR12_12:CRED01] -III Posse Music/ Ill Hill Billy'z Music/ Warner-Tamerlane Music ~n~(p) + © 1998 Rush Associated Labels Recordings ~n~Courtesy of Universal Music Enterprises +[RCRC1_1:RCRACE1] +~g~Liefere dir mit 3 anderen RC Bandits ein CHECKPOINT-RENNEN über 2 RUNDEN. -[CR12_13:CRED01] -~n~ ~n~ ~n~ ~n~"Beware" ~n~Big Pun ~n~Written by C. Rios, J. Tineo ~n~Published by Let Me Show You Music/ ~n~Joe Cartegena Music (ASCAP), ~n~Administered by Jelly Jams Music (BMI)/ ~n~P.H.D. Music (ASCAP) +[RCRC1_3:RCRACE1] +~g~Letzte Runde! -[CR12_14:CRED01] -(p) + © 1998 Loud Records LLC ~n~Courtesy of Columbia Records by arrangement with Sony BMG Ent +[RCR1_4:RCRACE1] +Verbleibende Runden: -[CR12_15:CRED01] -~n~ ~n~ ~n~ ~n~"Twinz (Deep Cover 98)" ~n~Big Pun ~n~Written by C. Rios, J. Cartegena, ~n~C. Brodus, A. Young, C. Wolfe ~n~Published by Let Me Show You Music/ ~n~Joe Cartegena Music (ASCAP)/ ~n~Jelly Jams Music (BMI)/ ~n~Sony Tunes Inc. (ASCAP) +[RCR1_1:RCRACE1] +~g~Tritt in einem Checkpoint-Rennen gegen 3 andere ferngesteuerte Autos an. -[CR12_16:CRED01] -~n~(p) + © 1998 Loud Records LLC ~n~Courtesy of Columbia Records by arrangement with Sony BMG Ent ~n~This track contains a sample of "Deep Cover" as performed by Dr. Dre. Courtesy of Solar Records. Used by permission. All rights reserved +[RCR1_2:RCRACE1] +~g~Du musst als erster 2 volle Runden auf dem Kurs fahren! -[CR12_17:CRED01] -~n~ ~n~ ~n~ ~n~"Get At Me Dog" ~n~DMX featuring Sheek of The Lox ~n~Written by E. Simmons, D. Blackman, ~n~A. Fields, S. Taylor ~n~Published by Universal Music Publishing/ EMI April Music/ ~n~Sony ATV Tunes +[RCR1_6:RCRACE1] +~g~Dein ferngesteuertes Auto gerãt außer Reichweite! -[CR12_18:CRED01] -~n~(p) + © 1998 Rush Associated Labels Recordings ~n~Courtesy of Universal Music Enterprises +[RCR1_7:RCRACE1] +~r~Dein ferngesteuertes Auto ist außer Reichweite! -[CR12_19:CRED01] -~n~ ~n~ ~n~ ~n~"Ruff Ryders Anthem (Remix)" ~n~DMX featuring DJ Clue, Jadakiss, Styles, Drag-On & Eve ~n~Written by J. Phillips, M.J. Smalls, E. Shaw, K. Ifill, E. Simmons, K. Dean, E. Jeffers ~n~Published by Universal Music Publishing/ EMI Music Publishing +{=================================== MISSION TABLE ROCK1 ===================================} -[CR12_20:CRED01] -(p) + © 1998 Roc-a-Fella Records ~n~Courtesy of Universal Music Enterprises +[RBM1_A:ROCK1] +AllllllllRrrighttt! -[CR12_21:CRED01] -~n~ ~n~ ~n~ ~n~"Do What You Feel" ~n~Redman featuring Method Man ~n~Written by P. Michael, R. Noble, C. Smith ~n~Published by Careers BMG/ Sony ATV Tunes/ Famous Music ~n~(p) + © 1996 Def Jam ~n~Courtesy of Universal Music Enterprises +[RBM1_B:ROCK1] +Fantastisch, einfach fantastisch! -[CR12_22:CRED01] -~n~ ~n~ ~n~ ~n~"Chain Gang Freestyle" ~n~The Lox & Black Rob ~n~Written by Frierson, Phillips, Styles, Jacobs, Ross, Shaw ~n~Published by EMI Music Publishing ~n~Courtesy of Bad Boy Records +[RBM1_D:ROCK1] +Hey, kennst du die Jungs von Love Fist? -[CR12_23:CRED01] -~n~ ~n~ ~n~ ~n~"Chest2chest Freestyle" ~n~The Lox ~n~Written by Phillips, Styles, Jacobs, Shaw, Barnes, Lemay, Montgomery ~n~Published by Taggie Music (BMI)/ ~n~Universal Polygram Int'l. (ASCAP)/ ~n~EMI Music Publishing ~n~Courtesy of Bad Boy Records +[RBM1_E:ROCK1] +Nein, aber ihre Musik habe ich immer geliebt. -[CR12_24:CRED01] -This track contains a sample of "Next Level" as performed by Showbiz & AG. Courtesy of Universal Music Enterprises. Used by permission. All rights reserved +[RBM1_F:ROCK1] +Ich stelle dir die Band vor. -[CR13_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~MSX 98 +[RBM1_G:ROCK1] +Das ist P, Percy, Dick, und Willy ist auf dem Klo. Und das vorher in der Kabine war Jezz. -[CR13_02:CRED01] -~n~ ~n~ ~n~ ~n~MC ~n~Codebreaker as himself +[RBM1_H:ROCK1] +Jungs, ich möchte euch einen guten Freund vorstellen. -[CR13_03:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Timecode +[RBM1_I:ROCK1] +Das ist Tommy. Wir kennen uns schon ewig. -[CR13_04:CRED01] -~n~ ~n~ ~n~ ~n~Station Production ~n~Timecode +[RBM1_J:ROCK1] +Alles paletti, Mann. -[CR13_05:CRED01] -~n~ ~n~ ~n~ ~n~"Renegade Snares" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1993 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_K:ROCK1] +Und, ãh, wie war dein Name noch mal? -[CR13_06:CRED01] -~n~ ~n~ ~n~ ~n~"Terrorist" ~n~Renegade ~n~Written, Produced & Engineered by ~n~A. Dookith ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_L:ROCK1] +Lass das, Jezz. Merk dir eines, -[CR13_07:CRED01] -~n~ ~n~ ~n~ ~n~"Finest Illusion (Legal Mix)" ~n~Foul Play ~n~Written, Produced & Engineered by ~n~J. Morrow, S. Bradshaw, ~n~S. Gurley ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1993 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_M:ROCK1] +mit mir kannst du diese Spielchen nicht machen. -[CR13_08:CRED01] -~n~ ~n~ ~n~ ~n~"Living For the Future (FBD Project Remix)" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_N:ROCK1] +Ich bin dir einfach über, Sonnenscheinchen. -[CR13_09:CRED01] -~n~ ~n~ ~n~ ~n~"Stay Calm (Foul Play Remix)" ~n~DJ Pulse ~n~Written, Produced & Engineered by ~n~A. Brown ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_O:ROCK1] +Die Sache ist die, Tom, die Jungs brauchen Hilfe. -[CR13_10:CRED01] -~n~ ~n~ ~n~ ~n~"Disturbance (Tango Remix)" ~n~Hyper-On Experience ~n~Written, Produced & Engineered by ~n~A. Banks, D. Demierre ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_P:ROCK1] +Die haben hier keine Connections, kein Vitamin B. -[CR13_11:CRED01] -~n~ ~n~ ~n~ ~n~"Cold Fresh Air" ~n~Higher Sense ~n~Written, Produced & Engineered by ~n~A. Miles, DJ Rhythm ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_Q:ROCK1] +Wir brauchen Stoff, Alter. -[CR13_12:CRED01] -~n~ ~n~ ~n~ ~n~"Living For the Future" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_R:ROCK1] +Damit wir den alten Love Fist Spirit finden, verstehst du?! -[CR13_13:CRED01] -~n~ ~n~ ~n~ ~n~"Thru The Vibe (2 on 1 Mix)" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_S:ROCK1] +Wir sind hier in Vice City, Mann. Wo liegt das Problem? -[CR13_14:CRED01] -~n~ ~n~ ~n~ ~n~"The Helicopter Tune" ~n~Deep Blue ~n~Written, Produced & Engineered by ~n~S. O'Keefe ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_U:ROCK1] +Love Juice, Mann! -[CR13_15:CRED01] -~n~ ~n~ ~n~ ~n~"Dred Bass" ~n~Dead Dred ~n~Written, Produced & Engineered by ~n~W. Smith, L. Smith ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[RBM1_V:ROCK1] +Love Juice? -[CR14_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~FLASHBACK FM +[RBM1_W:ROCK1] +Genau. 2 Teile TNT-Whiskey, 1 Teil Koks, 5 Pãckchen Brause und 1 Liter Sprit. -[CR14_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Reni Wassulmaier - Barbara Rosenblatt +[RBM1_X:ROCK1] +Kannst du uns weiterhelfen, Alter? -[CR14_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Mike Shapiro +[RBM1_Y:ROCK1] +Es würde den Jungs wirklich viel bedeuten. -[CR14_04:CRED01] -~n~ ~n~ ~n~ ~n~"First Hand Experience ~n~In Second Hand Love" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Giorgio Moroder ~n~Courtesy of Giorgio Moroder +[RBM1_Z:ROCK1] +Du kannst den Jungs doch helfen, oder? -[CR14_05:CRED01] -~n~ ~n~ ~n~ ~n~"I Wanna Rock You" ~n~Giorgio ~n~Written by G. Moroder, H. Faltermeyer, ~n~K. Forsey ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1979 Giorgio Moroder ~n~Courtesy of Giorgio Moroder +[RBM1_7:ROCK1] +~r~Du hast den Love Juice nicht rechtzeitig besorgt! -[CR14_06:CRED01] -~n~ ~n~ ~n~ ~n~"E=MC2" ~n~Giorgio ~n~Written by G. Moroder, H. Faltermeyer, ~n~P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1979 Giorgio Moroder ~n~Courtesy of Giorgio Moroder +[RBM1_8:ROCK1] +~r~Mercedes ist erledigt! -[CR14_07:CRED01] -~n~ ~n~ ~n~ ~n~"Chase" ~n~Giorgio Moroder ~n~Written by G. Moroder ~n~Published by Warner/ Chappell Music ~n~(p) + © 1978 Casablanca Films/ ~n~Columbia Pictures ~n~Courtesy of Sony Pictures Entertainment +[RBM1_10:ROCK1] +~r~Du Idiot! Du hast die Ware vernichtet! -[CR14_08:CRED01] -~n~ ~n~ ~n~ ~n~"I'm Left, You're Right, She's Gone" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Giorgio Moroder ~n~Courtesy of Giorgio Moroder +[RBM1_13:ROCK1] +~g~Bring den Love Juice und Mercedes zu der Band bevor sie auf die Bühne muss. -[CR14_09:CRED01] -~n~ ~n~ ~n~ ~n~"From Here To Eternity" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Casablanca Records ~n~Courtesy of Universal Music Enterprises +[RBM1_15:ROCK1] +~r~Du hast den Dealer verloren, unser Geld und den Stoff! -[CR15_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~COMMERCIAL VOICES +[RBM1_17:ROCK1] +~g~Knöpf dir den Dealer vor und hol dir den Stoff! -[CR15_02:CRED01] -~n~ ~n~ ~n~ ~n~Alex Anthony, Anouchka Benson, ~n~Audrey Amey, Bill Smith, ~n~Billy Gonzalez, Brian Thomas, +[MOB_07A:ROCK1] +Hey, die Jungs könnten ein bisschen Gesellschaft vertragen, falls du weißt, was ich meine... -[CR15_03:CRED01] -~n~ ~n~Chris Jobin, Chris Silvestro, ~n~Craig Blair, Dan Houser, ~n~Dan Merrill, Ed Thomas, +[MOB_07B:ROCK1] +Da kenne ich genau die richtige. -[CR15_04:CRED01] -~n~ ~n~Ethan Abeles, Garth Johnston, ~n~Gregg Martin, Gregory Johnson, ~n~Hikari Yokoyama, James Ferrante, +[ROK1_5:ROCK1] +Hey, Mercedes! -[CR15_05:CRED01] -~n~ ~n~James Larson, Jay Capozello, ~n~Jayson Gladstone, Jeff Berlin, ~n~Jen Sweeney, Jessica Wachsman, +[ROK1_6:ROCK1] +Hi, Tommy. Na, wie lãuft's so? -[CR15_06:CRED01] -~n~ ~n~ JJ Adler, Jonathan Hanst, ~n~Joshua Batista, Karen Saltus, ~n~Koji Nonoyami, Lance Williams, +[ROK1_7:ROCK1] +Alles bestens. Hör mal, willst du die Jungs von Love Fist verführen? -[CR15_07:CRED01] -~n~ ~n~Lazlow, Lynne Horton, ~n~Michael Nathan, Mike Ferrante Jr., ~n~Chris Ferrante, Mike Shapiro, +[ROK1_8:ROCK1] +Ok, aber dafür bist du mir einen Gefallen schuldig. -[CR15_08:CRED01] -~n~ ~n~Natalya Wilson, Noelle Sadler, ~n~Phil Mikkelson, Ron Reeve, ~n~Smith Harrison, Stacy Rachels, +[RBM1_14:ROCK1] +~g~Du brauchst ein Auto oder Motorrad! -[CR15_09:CRED01] -~n~ ~n~ Steve Carlesi, Julie Wemyss, ~n~Kim Gurney +[RBM1_1:ROCK1] +~g~Hol Mercedes in ihrer Wohnung ab. -[CR16_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~CUTSCENE MUSIC +[RBM1_12:ROCK1] +~g~Besorg die Zutaten für den 'Love Juice' von dem Dealer. -[CR16_02:CRED01] -~n~ ~n~ ~n~ ~n~"Japanese Geisha" ~n~Sonia Slany ~n~Written by Sonia Slany ~n~Published by West One Music ~n~Courtesy of APM Music, LLC +[ROK1_2:ROCK1] +NICHT MEHR BENÖTIGT -[CR16_03:CRED01] -~n~ ~n~ ~n~ ~n~"The Heist" ~n~Bugz in the Attic ~n~Written by K. Tatham ~n~Published by Copyright Control ~n~(p) 2005 Bugz In The Attic ~n~Courtesy of Bugz In The Attic ~n~www.bugzintheattic.co.uk +[ROK1_3:ROCK1] +NICHT MEHR BENÖTIGT -[CR16_04:CRED01] -~n~ ~n~ ~n~ ~n~"A Dark March" ~n~Danger Mouse ~n~Written by Danger Mouse ~n~Published by ~n~Underground Animals (ASCAP) +[MERC_39:ROCK1] +Wir sehen uns spãter, Big Boy. -[CR17_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR NYC PUBLISHING TEAM +[RBM1_C:ROCK1] +Hey, Tommy! Schön, dass du kommen konntest. -[CR17_02:CRED01] -~n~ ~n~ ~n~ ~n~Terry Donovan, Jenefer Gross, ~n~Jennifer Kolbe, Devin Winterbottom, ~n~Adam Tedman, Michael Elkind, +[RBM1_9:ROCK1] +~g~Besorg von dem Dealer Love Juice für Love Fist! -[CR17_03:CRED01] -~n~ ~n~Paul Yeates, Hosi Simon, ~n~Daniel Einzig, Marlene Yamaguchi, ~n~Gauri Khindaria, Stanton Sarjeant, +[ROK1_1A:ROCK1] +Suchst du was Bestimmtes? Ich habe genau, was du brauchst! -[CR17_04:CRED01] -~n~ ~n~Jordan Chew, Ryan Rayhill, ~n~Devin Bennett, Todd Zuniga, ~n~Thomas O'Donnell, Maria Tabia, +[ROK1_9:ROCK1] +Danke für die Kohle, du Trottel! -[CR17_05:CRED01] -~n~ ~n~Anthony Carvalho, Lyonel Tollemache, ~n~John Notarfrancesco, Jerry Luna, ~n~Stuart Petri, Stephen Walsh, +[RBM1_T:ROCK1] +Wir brauchen Love Juice, Mann, klar? -[CR17_06:CRED01] -~n~ ~n~Michael Carnevale, Andrea Borzuku, ~n~John Schuhmann, Alice Chuang, ~n~Mike Torok, Mayumi Kobayashi, +{=================================== MISSION TABLE ROCK2 ===================================} -[CR17_07:CRED01] -~n~ ~n~Elizabeth Satterwhite, Bruce Dugan, ~n~Eli Weissman, Phil Poli, ~n~Jaesun Celebre, Russell Lewis, +[RBM2_A:ROCK2] +Tommy, Mann, bin ich froh, dich zu sehen! -[CR17_08:CRED01] -~n~ ~n~Sean Mackenzie, Megan Henretta, ~n~Angus Wong, Kristine Severson +[RBM2_B:ROCK2] +Was ist los? -[CR17_09:CRED01] -~n~ ~n~ ~n~ ~n~Cover Art ~n~Steven Olds, Stephen Bliss, ~n~Anthony Macbain +[RBM2_C:ROCK2] +Schlechte Vibes, Tommy... -[CR17_10:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LONDON PD +[RBM2_E:ROCK2] +Da ist so 'n Typ, wir kennen ihn kaum, aber er kennt uns. -[CR17_11:CRED01] -~n~ ~n~ ~n~ ~n~ Chris Madgwick, Chris Wood, ~n~Daimion Pinnock, David McCarthy, ~n~Graham Ainsley, Jurgen Mol, +[RBM2_F:ROCK2] +So wie er da. Weiß alles über uns. -[CR17_12:CRED01] -~n~ ~n~ Laura Battistuzzi, Maike Köhler, ~n~Shino Hori, Lucien King +[RBM2_G:ROCK2] +Weiß, dass Willy auf Damenunterwãsche steht, eh! -[CR18_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LINCOLN +[RBM2_H:ROCK2] +Oder dass Percy auf Duran Duran steht! -[CR18_02:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Mark Lloyd +[RBM2_K:ROCK2] +Ja, die Liebesrakete, schon gut. Aber hör zu, dieser Typ... -[CR18_03:CRED01] -~n~ ~n~ ~n~ ~n~Deputy QA Manager ~n~Tim Bates +[RBM2_L:ROCK2] +ja, ja, der Typ will Love Fist ausknipsen. -[CR18_04:CRED01] -~n~ ~n~ ~n~ ~n~QA Supervisor ~n~Kevin Hobson +[RBM2_M:ROCK2] +Ausknipsen, Tommy. -[CR18_05:CRED01] -~n~ ~n~ ~n~ ~n~Lead Tester ~n~Eddie Gibson ~n~ ~n~ ~n~ ~n~Secondary Lead Tester ~n~Mike Bennett +[RBM2_N:ROCK2] +Love Fist soll verschwinden. Wie es immer heißt: Die Besten sterben jung. -[CR18_06:CRED01] -~n~ ~n~ ~n~ ~n~Testers ~n~Jonathan Stones, Mike Emeny, ~n~Andy Mason, Lee Johnson, ~n~Carl Young, Matthew Lunnon, ~n~Dan Goddard, Steve McGagh, ~n~Craig Reeve, Joby Luckett +[RBM2_O:ROCK2] +Aber Tommy, du musst Love Fist retten! -[CR18_07:CRED01] -~n~ ~n~ ~n~ ~n~Localization Team ~n~ ~n~ ~n~ ~n~Localization Supervisor ~n~Chris Welsh +[RBM2_P:ROCK2] +Wir geben in zwei Stunden eine Autogrammstunde, und ich glaube... -[CR18_08:CRED01] -~n~ ~n~ ~n~ ~n~Testers ~n~Antoine Cabrol, Dominic Garcia, ~n~Paolo Ceccotti, Ferruccio Cinquemani, ~n~Nicolas Klimoff, Jesús Pérez Rosales ~n~ ~n~ ~n~ ~n~IT Support ~n~Nick McVey +[RBM2_Q:ROCK2] +Und die Jungs glauben, dass der Kerl dort irgendwas plant. -[CR19_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~SPECIAL THANKS +[RBM2_1:ROCK2] +~g~Fahre die Limo zum Ort der Autogrammstunde und versuche, den Irren zu finden. -[CR19_02:CRED01] -~n~ ~n~ ~n~ ~n~Scooter, Ross Wallace, ~n~Steve Taylor, Kevin Wong, ~n~Kevin Bolt, John Haime, +[RBM2_2:ROCK2] +~r~Du hast den Wagen der Band geschrottet! -[CR19_03:CRED01] -~n~ ~n~Dave Watson, Thomas French, ~n~James Arthur, Martin Connor, ~n~Brendon McDonald, Julie Wemyss, +[RBM2_3:ROCK2] +~g~Geh zu der Autogrammstunde! -[CR19_04:CRED01] -~n~ ~n~Raff Crolla, James Duffy, ~n~Kim Gurney, Andrew Ness, ~n~Andy Brooks (Gearbox), Alan Mcgregor, +[RBM2_4:ROCK2] +~g~Erledige den Irren. Lass ihn nicht entkommen! -[CR19_05:CRED01] -~n~ ~n~Chris McCallum, Fred, Narns, ~n~Alan, Taruki, Red, ~n~Big Foot, Rita Liberator, ~n~Elliot Torres +[RBM2_5:ROCK2] +~r~Du hast ihn verloren, du Idiot! -[CR19_06:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~THANKS +[RBM2_7:ROCK2] +~r~Die Fans wurden angegriffen. Der Irre wird nicht auftauchen! -[CR19_07:CRED01] -~n~ ~n~ ~n~ ~n~Deborah Mannis-Gardner ~n~and Mark Schwartz. ~n~Randy Acker, Karen Adams, ~n~Mark Ainley, Robin Albers, +[RBM2_8:ROCK2] +~r~Die Security-Leute wurden angegriffen. Der Irre wird nicht auftauchen! -[CR19_08:CRED01] -~n~ ~n~Duncan Baker, Armen Boladian, ~n~Tanya Bridges, Richard Brown, ~n~Matt Brookman, Elena Byington, +[PSYCH_1:ROCK2] +Love Fist wird in der Hölle braten! -[CR19_09:CRED01] -~n~ ~n~Ed Butts, Rob Cairns, ~n~Mike Callaghan, Joseph Carlone, ~n~Kevin Carson, Jason Chin, +[PSYCH_2:ROCK2] +Love Fist hat mein Leben zerstört! -[CR19_10:CRED01] -~n~ ~n~Allison Cipris, Alimah Deen, ~n~James Ellis, Helen English, ~n~Nasko Fejza, Scott Gardner, +[RBM2_I:ROCK2] +Halt's Maul, du Irrer! Nur weil Jezz auf Schafe steht. -[CR19_11:CRED01] -~n~ ~n~Jochem Gerrits, ~n~Laurie Goldstein Thomas Golubic, ~n~Nick Guarino, Jon Handle, ~n~Millie Hysu, Robert Jo, +[RBM2_R:ROCK2] +Hey, Schnauze! -[CR19_12:CRED01] -~n~ ~n~Paul Johannes, Gavin Johnson, ~n~Curtis A. Jones, Jennifer Justice, ~n~Rod Kotler, Diana La Pointe, +[RBM2_D:ROCK2] +Das ist kein Spaß, das ist 'ne brutale Geschichte, brutal, ok? -[CR19_13:CRED01] -~n~ ~n~Michael Lau, Jim Long, ~n~Alex De Maegd, John Massa, ~n~Kendall Minter, Steve Morgan, +[RBM2_J:ROCK2] +Ich sage nur, die Liebesrakete, ok? -[CR19_14:CRED01] -~n~ ~n~Giorgio Moroder, Suzanne Moss, ~n~Melissa Munana, Kirin Murphy, ~n~Kurosh Nasseri, +{=================================== MISSION TABLE ROCK3 ===================================} -[CR19_15:CRED01] -~n~ ~n~Gwen Niles Sean Ogden ~n~aka DJ Nightshade, ~n~Robin Orlowski, Jonathan Palmer, ~n~Tanvi Patel, Jane Peterer, +[RBM3_A:ROCK3] +Tommy! Tommy! Tommy, Mann, der Irre ist wieder da! -[CR19_16:CRED01] -~n~ ~n~Mark Picchiotti, Rob Playford, ~n~Dan Quan, R. Ramnarayan, ~n~Mary Beth Roberts, ~n~Virgil Roberts, Lindsay Rodman, +[RBM3_B:ROCK3] +Was ist denn los? -[CR19_17:CRED01] -~n~ ~n~Jim Romano, Craig Roseberry, ~n~Gerry Rosenblatt, RZA, ~n~Ali Samii, Alan Scholefield, +[RBM3_C:ROCK3] +Dieser Irre lãsst Love Fist nicht in Ruhe! -[CR19_18:CRED01] -~n~ ~n~Christopher Scott, Suzi Scott, ~n~Fredro Scruggs, Jennefer Showalter, ~n~Alan Skiena, Saskia Slegers, +[RBM3_D:ROCK3] +Du hast ihn nicht erwischt, Mann. Und jetzt ist er wieder da. -[CR19_19:CRED01] -~n~ ~n~Fran Spero, Lem Springsteen, ~n~David Steel, Jane Ventom, ~n~Christian Wiseman, Debi Wylde, +[RBM3_E:ROCK3] +Ja, ja, ja, und es ist nãmlich so... -[CR19_20:CRED01] -~n~ ~n~Donna Young, Richie Zito +[RBM3_F:ROCK3] +wir brauchen für die Limo einen Fahrer, dem wir vertrauen können, + +[RBM3_G:ROCK3] +weil der Irre uns stãndig bedroht! + +[RBM3_I:ROCK3] +Wir scheißen uns alle in die Hosen, Mann. + +[RBM3_J:ROCK3] +Ok, Jungs, nur die Ruhe. Ich mach das schon. + +[RBM3_K:ROCK3] +Normalerweise würde ich keine besoffenen, schottischen Tucken durch die Gegend kutschieren, + +[RBM3_L:ROCK3] +aber für euch mache ich eine Ausnahme. + +[ROK3_03:ROCK3] +Dann mach mir einen großen. + +[ROK3_04:ROCK3] +Hey, Tommy, nun mach mal halblang, Mann. + +[ROK3_08:ROCK3] +Langsam wird's langweilig. + +[ROK3_09:ROCK3] +Halt bloß das Pedal durchgedrückt!! + +[ROK3_61:ROCK3] +Wir müssen die Bombe finden! + +[ROK3_28:ROCK3] +Ich werd Bass in der Hölle spielen. + +[ROK3_30:ROCK3] +Tu doch einer was! + +[ROK3_32:ROCK3] +Ok, Obermacho, dann tu du doch was! + +[ROK3_34:ROCK3] +Willy könnte den TNT-Whiskey mit einem Strohhalm raussaugen. + +[ROK3_37:ROCK3] +Gebt Willy einen Strohhalm! + +[ROK3_41:ROCK3] +Welchen Draht, Tommy? + +[ROK3_42:ROCK3] +Den grünen. + +[ROK3_43:ROCK3] +Da ist kein grüner. Oder ist der hier grün? + +[ROK3_44:ROCK3] +Sieht für dich einer von den Drãhten grün aus? + +[ROK3_49:ROCK3] +Ich hab euch doch jahrelang nur mitgeschleppt. + +[ROK3_51:ROCK3] +Ein großes keifendes Weib. + +[ROK3_52:ROCK3] +Ja. + +[ROK3_53:ROCK3] +Klappe jetzt und zieht einen Draht raus. + +[ROK3_54:ROCK3] +Welchen? + +[ROK3_55:ROCK3] +Den da... + +[ROK3_56:ROCK3] +NEIN! + +[ROK3_57:ROCK3] +Mann, alles ok. Wir sind nicht hochgegangen, Alter. Tommy, Mann, gut gemacht. Rock 'n' Roll, Mann. + +[ROK3_58:ROCK3] +Müssen wir nicht zu einem Gig? Krach machen? Groupies abgreifen? + +[ROK3_59:ROCK3] +LOVE FIST! + +[ROK3_60:ROCK3] +Bist du fertig mit der Pulle? + +[RBM3_4:ROCK3] +~r~Love Fist ist Geschichte! + +[RBM3_6:ROCK3] +DETONATION: + +[RBM3_1:ROCK3] +~g~Chauffiere Love Fist zu ihrem Auftritt. + +[RBM3_2:ROCK3] +Falls du versuchst, aus dem Auto auszusteigen, wenn die Bombe scharfgemacht ist, wird sie explodieren... + +[RBM3_3:ROCK3] +Ist der Detonations-Balken am Anschlag, explodiert die Bombe. + +[RBM3_8:ROCK3] +Je schneller du fãhrst, desto niedriger der Detonations-Balken. + +[RBM3_7:ROCK3] +~g~BOMBE ENTSCHÃRFT! + +[ROK3_6A:ROCK3] +~g~Love Fist. Ihr habt den Ãther lange genug verschmutzt! + +[ROK3_6B:ROCK3] +~g~Ich wollte euer Freund sein. Jetzt will ich, dass ihr untergeht. + +[ROK3_62:ROCK3] +Wir dachten, wir zeigen dir mal unseren Rocktempel... + +[ROK3_63:ROCK3] +Kannst dir die Power von Love Fist reinziehen! + +[ROK3_64:ROCK3] +Hör sich das einer an, Mann. Das ist Pappmaché und Klebeband. + +[ROK3_65:ROCK3] +Hey, für die Kids ist es ein Tempel, und wir sind die Priester! + +[ROK3_66:ROCK3] +Tja, wenn die Kids es toll finden, dass ihre Priester dicht und unmusikalisch sind, + +[ROK3_67:ROCK3] +was soll man da sagen? + +[ROK3_68:ROCK3] +Oh, Mist, das Ding frisst schon wieder das Band. + +[ROK3_69:ROCK3] +Wenn das so ist, müssen wir live spielen. + +[ROK3_70:ROCK3] +Ooooh Shit! Mein Darm... + +[ROK3_01:ROCK3] +Endlich, Mann, Zeit für einen wohlverdienten Drink. + +[ROK3_02:ROCK3] +Die Halle ist nur 100 Meter die Straße runter. + +[ROK3_05:ROCK3] +Ich werd irre, wenn ich keinen Sprit kriege. + +[ROK3_07:ROCK3] +Tommy, mein Freund, wir müssen die Band retten! + +[ROK3_29:ROCK3] +Tommy, bleib auf dem Gas, Alter. + +[ROK3_31:ROCK3] +Ganz toll. 'Tu doch einer was.' Was ist denn das für eine Ansage? Da kenn ich mutigere Mãdels. + +[ROK3_33:ROCK3] +Alter, ich bin Musiker. Vom Bomben-Entschãrfen hab ich keinen blassen Dunst. + +[ROK3_35:ROCK3] +Eben, so was liegt dir doch, was ich so höre. + +[ROK3_38:ROCK3] +Einen Strohhalm?! Dies ist der Tour-Bus von Love Fist! + +[ROK3_39:ROCK3] +Wo zum Geier sollte hier ein Strohhalm sein? + +[ROK3_46:ROCK3] +Ich hãtte euch alle rausschmeißen sollen, als es noch ging, Mann. + +[ROK3_47:ROCK3] +Kapitalist. + +[ROK3_48:ROCK3] +Kameradenschwein. + +[ROK3_73:ROCK3] +Jezz spielt das Band ab, + +[RBM3_9:ROCK3] +Wenn du angehalten wirst oder langsam fãhrst, wãchst der Detonations-Balken. + +[ROK3_50:ROCK3] +Halt die Klappe. Du bist ein Idiot. + +[ROK3_36:ROCK3] +Hey, ich war an dem Abend vielleicht komplett zugedröhnt! + +[RBM3_H:ROCK3] +Ich scheiß mir in die Hose, Mann. Ich will zu meiner Mama! + +[ROK3_45:ROCK3] +Oh nein. Im Angesicht des Todes sieht alles grün aus. + +[ROK3_6C:ROCK3] +~g~Wenn ihr langsamer werdet, geht eure Limo hoch, IHR UND EURE HAARIGEN ÃRSCHE mit dazu! + +[ROK3_71:ROCK3] +Wir müssen uns ranhalten. Danke nochmal, Tommy, du hast es echt drauf. Ciao. + +[ROK3_1:ROCK3] +Endlich, Mann, Zeit für einen wohlverdienten Drink. Die Halle ist nur 100 Meter die Straße runter. + +[ROK3_2:ROCK3] +Mach mir mal einen großen. Hey, Tommy, leg mal 'nen anderen Sound auf, Mann. + +[ROK3_3:ROCK3] +Ich werd wirr im Kopf, wenn nichts zum Headbangen lãuft. Hey, Tommy, leg mal dieses Band ein. + +[ROK3_4:ROCK3] +Love Fist. Ihr habt den Ãther lange genug verschmutzt! Ich wollte euer Freund sein. + +[ROK3_5:ROCK3] +Jetzt will ich, dass ihr untergeht. Wenn ihr langsamer werdet, geht eure Limo hoch, IHR UND EURE HAARIGEN ÃRSCHE mit dazu! + +[ROK3_6:ROCK3] +Tommy, mein Freund, du musst die Band retten! Langsam wird's langweilig. Halt bloß das Pedal durchgedrückt!! + +[ROK3_7:ROCK3] +Wir müssen die Bombe finden! Können wir nicht einfach den ganzen Tag rumfahren? Wir haben jedenfalls jede Menge zu saufen. + +[ROK3_8:ROCK3] +Könnte die Bombe nicht unter der Motorhaube sein? Da kommen wir nie ran, ohne anzuhalten! Wir werden alle sterben! Ich besauf mich! + +[ROK3_9:ROCK3] +Hey, hier gibt's eine Warteschlange, Alter! Die Lösung liegt nicht in der Minibar! Weg da! + +[ROK3_10:ROCK3] +Hey, aus der Wodkapulle kommen Drãhte raus! Das ist kein Wodka, das ist TNT-WHISKEY! + +[ROK3_11:ROCK3] +WAAAAAAGGGHHHH!!!! Das Ding ist scharfgemacht!! WAAAAAAAAAAGGGHHHHHH!!!! + +[ROK3_12:ROCK3] +Man hat mir immer gesagt, der Alk wird mich killen... Das kenn ich aus dem Fernsehen. Du musst einen der Drãhte rausziehen. Welchen Draht? Weiß ich doch nicht, Mann. + +[ROK3_13:ROCK3] +Keinen Schimmer. Willy, sag doch mal was. Ich werd Bass in der Hölle spielen. + +[ROK3_14:ROCK3] +Tommy, bleib auf dem Gas, Mann. Tu doch einer was! Ganz toll... + +[ROK3_15:ROCK3] +'Tu doch einer was.' Was ist denn das für eine Ansage? Da kenn ich mutigere Mãdchen. Ok, Obermacho, dann tu du doch was! + +[ROK3_16:ROCK3] +Alter, ich bin Musiker. Mit Bomben kenne ich mich nicht aus. Willy könnte den TNT-Whiskey mit einem Strohhalm raussaugen. + +[ROK3_17:ROCK3] +Eben, so was liegt dir doch, was ich so höre. Hey, ich war total blau an dem Abend, das wisst ihr ganz genau! + +[ROK3_18:ROCK3] +Gebt Willy einen Strohhalm! Einen Strohhalm?! Wi sind im Band-Auto von Love Fist! + +[ROK3_19:ROCK3] +Wo zum Geier sollte hier ein Strohhalm sein? Welchen Draht, Tommy? Den grünen. Da ist kein grüner. + +[ROK3_20:ROCK3] +Oder ist der hier grün? Sieht für dich einer von den Drãhten grün aus? + +[ROK3_21:ROCK3] +Oh nein. Im Angesicht des Todes sieht alles grün aus. Ich hãtte euch alle rausschmeißen sollen, als es noch ging, Mann. + +[ROK3_22:ROCK3] +Kameradenschwein. Kapitalist. Ich hab euch doch jahrelang nur mitgeschleppt. Halt die Klappe. Du bist ein Idiot. + +[ROK3_23:ROCK3] +Ein großes keifendes Weib. Ja. Klappe jetzt und zieht einen Draht raus. Welchen? Den da... + +[ROK3_24:ROCK3] +NEIN! Mann, alles ok. Wir sind nicht hochgegangen, Alter. + +[ROK3_25:ROCK3] +Tommy, Mann, gut gemacht. Rock 'n' Roll, Mann. Müssen wir nicht zu einem Gig? + +[ROK3_26:ROCK3] +Krach machen? Groupies abgreifen? LOVE FIST! + +[ROK3_27:ROCK3] +Bist du fertig mit der Pulle? + +{=================================== MISSION TABLE SERG1 ===================================} + +[TEX1_0:SERG1] +~g~Die Zielperson ist auf der Driving Range. Sorg dafür, dass er seinen letzten Golfball geschlagen hat! + +[TEX1_A:SERG1] +Komm rein und setz dich auf deinen Hintern, Junge. + +[TEX1_B:SERG1] +Mein Daddy hat immer gesagt, einem geschenkten Gaul schaut man nicht ins Maul. Hat's auch nie getan. + +[TEX1_C:SERG1] +Ein Glãschen alter Kentucky gefãllig? + +[TEX1_D:SERG1] +Nein danke. + +[TEX1_E:SERG1] +Ein nüchterner Denker, das gefãllt mir. + +[TEX1_F:SERG1] +Im Immobiliengeschãft geht's nicht um hochtrabende Vertrãge. + +[TEX1_G:SERG1] +Es geht um Land. Und darum, dieses Land zu kriegen. Kannst du mir folgen? + +[TEX1_H:SERG1] +Oh, ja. + +[TEX1_I:SERG1] +Ich will, dass so ein sturer Hund sein Land hergibt. + +[TEX1_J:SERG1] +Mir scheint, du könntest ihn dazu überreden. + +[TEX1_K:SERG1] +Ich bin der reinste Überredungskünstler. + +[TEX1_L:SERG1] +Ja. Er wird im Country Club sein, auf dem Golfplatz. + +[TEX1_M:SERG1] +Knarren sind dort verboten. Seine Bodyguards werden also unbewaffnet sein. + +[TEX1_N:SERG1] +Du sollst ihn so richtig gründlich vermöbeln. + +[TEX1_O:SERG1] +Hier, ich hab dir einen Mitgliedsausweis besorgt. Aber du brauchst passendere Kleidung. + +[TEX1_2:SERG1] +~g~Begib dich jetzt zum Leaf Links Golf Club. + +[TEX1_3:SERG1] +Wer ist der Kerl? Jungs, nehmt ihn euch vor. + +[TEX1_6:SERG1] +Hübscher Hintern, Baby! + +[TEX1_7:SERG1] +Bin ich das? + +[TEX1_8:SERG1] +Jedesmal wenn du in einen Golfwagen steigst, erhãltst du automatisch einen Golfschlãger, vorausgesetzt, du hast nicht schon eine Nahkampfwaffe. + +[TEX1_9:SERG1] +Schnapp ihn dir! + +[TEX1_10:SERG1] +Mach den Irren fertig! + +[TEX1_1:SERG1] +~g~Besorg dir bei Jocksport Golferklamotten. + +{=================================== MISSION TABLE SERG2 ===================================} + +[TEXEXIT:SERG2] +~g~Jetzt verschwinde aus Little Haiti! + +[TEX_2A:SERG2] +~g~Großartig! Sie haben dich bemerkt! + +[TEX_2B:SERG2] +~r~Narr! Die Leute müssen SEHEN, dass der Tãter ein Kubaner ist! + +[TEX_2C:SERG2] +~g~Besorge dir bei Rafael's Kleidung in den Farben der kubanischen Gang. + +[TEX_2D:SERG2] +~g~Nimm dir jetzt den Boss der Haitianer in Romeros Beerdigungsinstitut vor. + +[TEX2_A:SERG2] +Tommy, das ist Donald Love. Donald, das ist Tommy Vercetti, + +[TEX2_B:SERG2] +der neueste Draufgãnger hier in der Stadt. + +[TEX2_C:SERG2] +Ja...ãh... + +[TEX2_D:SERG2] +Donald, sei still und hör zu. Vielleicht kannst du was lernen. + +[TEX2_E:SERG2] +Also. Nichts lãsst Immobilienpreise schneller abstürzen als ein guter alter Bandenkrieg. + +[TEX2_F:SERG2] +Außer vielleicht eine Katastrophe, eine biblische Plage oder so, + +[TEX2_G:SERG2] +aber das ginge hier wohl zu weit. + +[TEX2_H:SERG2] +Kannst du mir folgen, Brillenschlange? + +[TEX2_I:SERG2] +Jüngst starb ein haitianischer Gang-Boss. Man tippt, es waren die Kubaner, aber keiner weiß es. + +[TEX2_J:SERG2] +Aber wir wollen sicher gehen. Du verkleidest dich als kubanischer Hombre + +[TEX2_K:SERG2] +und machst Krawall bei der Beerdigung. Misch sie auf und dann verzieh dich. + +[TEX2_L:SERG2] +Kannst du mir folgen, Donald? + +[TEX2_M:SERG2] +Das dürfte das Fass zum Überlaufen bringen, was? + +[TEX2_N:SERG2] +Und wir lehnen uns zurück und sehen zu, wie die Preise purzeln. + +{=================================== MISSION TABLE SERG3 ===================================} + +[TEX3_A:SERG3] +Pass auf, Junge. Ich habe ein Problem und denke, du könntest mir weiterhelfen. + +[TEX3_B:SERG3] +Ich bin kein Bauunternehmer. + +[TEX3_C:SERG3] +Nein, ich dachte mehr an deine Talente als Abrissunternehmer. + +[TEX3_D:SERG3] +Das hier zeigt, was wir geplant haben. Und so- + +[TEX3_E:SERG3] +-so sieht der betreffende Grund heute aus. + +[TEX3_F:SERG3] +Sie wollen sagen, das neue Bürohaus da ist Ihnen im Weg. + +[TEX3_G:SERG3] +Gut mitgedacht. + +[TEX3_H:SERG3] +Also, ich verdrücke mich eine Weile aus der Stadt, + +[TEX3_I:SERG3] +und wenn dieses Bürogebãude urplötzlich irreparable Schãden aufweist, dann... + +[TEX3_J:SERG3] +....fühlen Sie sich als guter Mensch verpflichtet, einzuspringen und + +[TEX3_K:SERG3] +-für die Neugestaltung eines wichtigen Gebiets der Stadt zu sorgen? + +[TEX3_L:SERG3] +Wo finde ich mehr Mãnner wie dich? + +[TEX3_1:SERG3] +~g~Benutze den ferngesteuerten Helikopter, um Bomben zu 4 Zielen an dem zur Sprengung vorgesehenen Gebãude zu transportieren. + +[TEX3_2:SERG3] +~g~Du musst an jedem Ziel eine Bombe abwerfen. Die Reihenfolge ist beliebig. + +[TEX3_3:SERG3] +~g~Steuere den Helikopter direkt über eine Bombe, um sie aufzunehmen. Die Bombe heftet sich dann automatisch an den Helikopter. + +[TEX3_5:SERG3] +~g~Wenn eine Bombe ihr Ziel verfehlt, kannst du sie erneut aufnehmen und es nochmal versuchen. + +[TEX3_7:SERG3] +~g~Dann hast du noch 7 Minuten, um die restlichen Bomben im Ziel zu platzieren. + +[TEX3_8:SERG3] +~g~Du hast das Ziel verfehlt! Nimm die Bombe wieder auf und versuche es nochmal! + +[TEX3_10:SERG3] +~g~Wirf die Bombe über einem der Ziele ab. + +[TEX3_11:SERG3] +Verbleibende Ziele: + +[TEX3_17:SERG3] +~r~Die Zeit ist um. Du hast es nicht geschafft, das Gebãude zu sprengen. + +[TEX3_18:SERG3] +~r~Dein Helikopter wurde zerstört! Wie willst du jetzt die Bomben transportieren? + +[TEX3_19:SERG3] +~r~Deine Bombe ist im Wasser gelandet! Du brauchst ALLE 4 Bomben, um die Sprengung vorzunehmen. + +[TEX3_20:SERG3] +~g~Dein Helikopter ist fast außer Reichweite. Du musst zurück zur Baustelle, um deine Arbeit zuende zu bringen! + +[TEX3_21:SERG3] +~r~Dein Helikopter befindet sich außer Reichweite! + +[TEX3_24:SERG3] +Drücke ~h~~k~~VEHICLE_LOOKLEFT~~w~, um den Helikopter gegen den Uhrzeigersinn zu drehen. + +[TEX3_25:SERG3] +Drücke ~h~~k~~VEHICLE_LOOKLEFT~~w~, um den Helikopter im Uhrzeigersinn zu drehen. + +[TEX3_27:SERG3] +~g~Über eine Haupttreppe hat man Zugang zu allen Stockwerken des Gebãudes. + +[TEX3_31:SERG3] +~r~Du hast den Wagen mit den Bomben und dem ferngesteuerten Helikopter zerstört! + +[TEX3_32:SERG3] +Du kannst ~h~nach hinten sehen~w~, indem du ~h~gleichzeitig ~k~~VEHICLE_LOOKLEFT~ und ~k~~VEHICLE_LOOKRIGHT~ drückst~w~. + +[TEX3_4:SERG3] { reVC update } +~g~Um eine Bombe abzuwerfen, drücke die~h~ ~k~~VEHICLE_FIREWEAPON~~w~. + +[TEX3_29:SERG3] { reVC update } +Um eine Bombe abzuwerfen, drücke die~h~ ~k~~VEHICLE_FIREWEAPON~. + +[TEX3_26:SERG3] +Drücke die ~h~~k~~VEHICLE_BRAKE~~w~, um die Rotorgeschwindigkeit zu verringern, der Helikopter ~h~verliert dann an Höhe. + +[TEX3_22:SERG3] +Drücke die ~h~~k~~VEHICLE_ACCELERATE~~w~, um die Rotorgeschwindigkeit zu erhöhen, der Helikopter ~h~gewinnt dann an Höhe. + +[TEX3_16:SERG3] +~g~Begib dich zu dem ~w~TOPFUN~g~-Wagen nahe dem zum Abriss vorgesehenen Gebãude. + +[TEX3_33:SERG3] +Wenn du eine Bombe aufgenommen hast, zeigt dir das Radar die Position des Ziels in Relation zu dem ferngesteuerten Helikopter. + +[TEX3_34:SERG3] +Ein ~h~nach oben zeigendes Dreieck ~w~bedeutet, dass das Ziel sich in ~h~größerer Höhe ~w~befindet als der Helikopter. + +[TEX3_35:SERG3] +Ein ~h~nach unten zeigendes Dreieck ~w~bedeutet, dass das Ziel sich in ~h~geringerer Höhe ~w~befindet als der Helikopter. + +[TEX3_36:SERG3] +Ein ~h~Viereck ~w~ bedeutet, dass das Ziel sich auf ~h~der gleichen Höhe ~w~befindet wie der Helikopter. + +[TEX3_6:SERG3] +~g~Wenn du die erste Bombe aufgenommen hast, wird der Zeitzünder aktiviert. + +[TEX3_28:SERG3] +Um ~h~eine Bombe aufzunehmen~w~, steuere den Helikopter direkt über sie. Der Helikopter kann immer nur eine Bombe tragen. + +[TEX3_30:SERG3] +~g~Um eine Bombe aufzunehmen, steuere den Helikopter direkt über sie. Der Helikopter kann immer nur eine Bombe tragen. + +[TEX3_12:SERG3] +~g~Bombe platziert! Es bleiben nur noch 3 Ziele! Hol die nãchste Bombe. + +[TEX3_13:SERG3] +~g~Bombe platziert! Es bleiben nur noch 2 Ziele! Hol die nãchste Bombe. + +[TEX3_14:SERG3] +~g~Bombe platziert! Es bleibt nur noch 1 Ziel! Hol die nãchste Bombe. + +[TEX3_15:SERG3] +~r~Zeitzünder aktiviert! ~g~ Du musst die ~w~4 Bomben ~g~in der verbleibenden Zeit platzieren. + +[TEX3_37:SERG3] +Zieh den ~h~ Rechten Analog-Stick zurück~w~, um die Rotorgeschwindigkeit zu erhöhen, der Helikopter ~h~ gewinnt dann an Höhe. + +[TEX3_38:SERG3] { reVC update } +{Drück den ~h~ ~k~~VEHICLE_ACCELERATE~~w~, um die Rotorgeschwindigkeit zu verringern, der Helikopter ~h~ verliert dann an Höhe.} +Drück den ~h~ Rechten Analog-Stick nach vorn~w~, um die Rotorgeschwindigkeit zu verringern, der Helikopter ~h~ verliert dann an Höhe. + +[TEX3_39:SERG3] +Um eine Bombe abzuwerfen, drücke die ~h~~k~~VEHICLE_HANDBRAKE~~g~-Taste. + +[TEX3_40:SERG3] +Um eine Bombe abzuwerfen, drücke die ~h~~k~~VEHICLE_HANDBRAKE~~w~-Taste. + +[TEX3_23:SERG3] +Mit ~h~~k~~VEHICLE_TURRETUP~~w~ und ~h~~k~~VEHICLE_TURRETDOWN~~w~ neigst du den Helikopter in die Richtung, in die du ihn steuern willst. + +{=================================== MISSION TABLE TAXI1 ===================================} + +[FARES:TAXI1] +FAHRTEN: + +[TAXI1:TAXI1] +~g~Besorg dir einen Fahrgast. + +[TSCORE2:TAXI1] +$~1~ + +[IN_ROW:TAXI1] +~1~ SERIEN-Bonus! $~1~ + +[TAXI3:TAXI1] +~r~Dein Fahrgast ist entsetzt geflohen! + +[TAXI7:TAXI1] +~r~Dein Wagen ist Schrott. Repariere ihn. + +[TAXI4:TAXI1] +Fahrt abgeschlossen! + +[TAXI5:TAXI1] +SPEED BONUS!! + +[TAXI6:TAXI1] +Taxi-Mission beendet + +[TAXIH1:TAXI1] +Halte neben einem markierten Fußgãnger, um ihn einsteigen zu lassen, dann bringe ihn rechtzeitig an sein Fahrtziel. + +[FARE1:TAXI1] +~g~Fahrtziel ~w~'Pole Position Club' ~g~in Ocean Beach. + +[FARE3:TAXI1] +~g~Fahrtziel ~w~'Marina' ~g~in Ocean Beach. + +[FARE4:TAXI1] +~g~Fahrtziel ~w~'Ammu-Nation' ~g~in Ocean Beach. + +[FARE5:TAXI1] +~g~Fahrtziel ~w~'Eisenwarenladen' ~g~in Washington Beach. + +[FARE6:TAXI1] +~g~Fahrtziel ~w~'North Point Einkaufszentrum' ~g~in Vice Point. + +[MFARE1:TAXI1] +~g~Fahrtziel ~w~'Ammu-Nation' ~g~in Downtown. + +[MFARE2:TAXI1] +~g~Fahrtziel ~w~'Terminal' ~g~im Escobar International Airport. + +[WFARE3:TAXI1] +~g~Fahrtziel ~w~'Sunshine Autos' ~g~in Little Havana. + +[WFARE4:TAXI1] +~g~Fahrtziel ~w~'Kaufman-Taxis' ~g~in Little Haiti. + +[WFARE5:TAXI1] +~g~Fahrtziel ~w~'Eisenwarenladen' ~g~in Little Havana. + +[WFARE6:TAXI1] +~g~Fahrtziel ~w~'Howlin Petes Bike Emporium' ~g~in Downtown. + +[FARE7:TAXI1] +~g~Fahrtziel ~w~'die Juweliere' ~g~in Vice Point. + +[FARE8:TAXI1] +~g~Fahrtziel ~w~'der Strand' ~g~in Ocean Beach. + +[FARE9:TAXI1] +~g~Fahrtziel ~w~'der Strand' ~g~in Washington Beach. + +[FARE10:TAXI1] +~g~Fahrtziel ~w~'der Strand' ~g~in Vice Point. + +[FARE11:TAXI1] +~g~Fahrtziel ~w~'das Krankenhaus' ~g~in Ocean Beach. + +[FARE12:TAXI1] +~g~Fahrtziel ~w~'das Krankenhaus' ~g~in Vice Point. + +[FARE13:TAXI1] +~g~Fahrtziel ~w~'die Polizeistation' ~g~in Washington Beach. + +[FARE14:TAXI1] +~g~Fahrtziel ~w~'die Polizeistation' ~g~in Vice Point. + +[FARE15:TAXI1] +~g~Fahrtziel ~w~'die Pizzagaststãtte' ~g~in Vice Point. + +[WFARE7:TAXI1] +~g~Fahrtziel ~w~'die Polizeistation' ~g~in Little Havana. + +[WFARE8:TAXI1] +~g~Fahrtziel ~w~'die Polizeistation' ~g~in Downtown. + +[WFARE9:TAXI1] +~g~Fahrtziel ~w~'das Krankenhaus' ~g~in Downtown. + +[WFARE10:TAXI1] +~g~Fahrtziel ~w~'das Krankenhaus' ~g~in Little Havana. + +[WFARE11:TAXI1] +~g~Fahrtziel ~w~'der Stadium' ~g~in Downtown. + +[WFARE12:TAXI1] +~g~Fahrtziel ~w~'die Pizzagaststãtte' ~g~in Little Haiti. + +[WFARE13:TAXI1] +~g~Fahrtziel ~w~'die Pizzagaststãtte' ~g~in Downtown. + +[WFARE14:TAXI1] +~g~Fahrtziel ~w~'die Docks' ~g~in Viceport. + +[WFARE15:TAXI1] +~g~Fahrtziel ~w~'die Apotheke' ~g~in Little Haiti. + +[FARE2:TAXI1] +~g~Fahrtziel ~w~'Malibu Club' ~g~in Vice Point. + +{=================================== MISSION TABLE TAXICUT ===================================} + +[TAXC_A:TAXICUT] +Schãtze, sie sind der neue Besitzer. + +[TAXC_B:TAXICUT] +Sind Sie 'n Mafioso? Oder vom Kartell? Sehen nicht aus wie ein Mexikaner. + +[TAXC_C:TAXICUT] +Egal. Halten Sie schon endlich Ihre Predigt von wegen 'Jetzt wird alles anders', + +[TAXC_D:TAXICUT] +bedrohen Sie ein paar von den Fahrern- + +[TAXC_E:TAXICUT] +aber nicht Ted, der ist gerade an der Leiste operiert. + +[TAXC_F:TAXICUT] +Tja, also, hier wird sich einiges ãndern, Lady. + +[TAXC_G:TAXICUT] +Aber nicht doch, Jungchen. Überlassen Sie das lieber mir - + +[TAXC_H:TAXICUT] +Ich mach das schon seit Jahren. + +[TAXC_I:TAXICUT] +Alles mal herhören. + +[TAXC_J:TAXICUT] +Wir haben eine neue Geschãftsleitung, und es wird sich wieder mal einiges ãndern hier. + +[TAXC_K:TAXICUT] +Unsere neue Geschãftsleitung, die- + +[TAXC_L:TAXICUT] +Von welcher Gang sind Sie? + +[TAXC_M:TAXICUT] +Ich gehöre keiner Gang an. + +[TAXC_N:TAXICUT] +Und wie heißen Sie, junger Mann? + +[TAXC_O:TAXICUT] +Vercetti, Tommy Vercetti. + +[TAXC_P:TAXICUT] +Unsere neue Geschãftsleitung, die Vercetti Gang, + +[TAXC_Q:TAXICUT] +wird dafür sorgen, dass wir keinen Ãrger kriegen. + +[TAXC_R:TAXICUT] +Capiche? Ende! + +[TAXC_S:TAXICUT] +Wie fanden Sie das 'Capiche'? Ich fand's gut. + +[TAXC_T:TAXICUT] +Also, so ist das immer gelaufen: + +[TAXC_U:TAXICUT] +Wir führen die Firma weiter wie gewohnt. + +[TAXC_V:TAXICUT] +Wenn die Konkurrenz Ãrger macht, gebt ihr ihnen eines auf die Mütze. + +[TAXC_W:TAXICUT] +Dann geben die uns eines auf die Mütze. + +[TAXC_X:TAXICUT] +Dann geben sie denen eines auf die Mütze. + +[TAXC_Y:TAXICUT] +Und so weiter, und so fort. Kapiert? + +[TAXC_Z:TAXICUT] +Ãh, ja, ich glaub schon. + +[TAXC_A1:TAXICUT] +Schnappen Sie sich ein Taxi aus der Garage, wenn Sie Lust haben. + +{=================================== MISSION TABLE TAXIWA1 ===================================} + +[OUTTIME:TAXIWA1] +~r~Zu langsam, Mann, zu langsam! + +[TAX1_1:TAXIWA1] +Ok, eine V.I.P. müsste von Starfish Island abgeholt werden. Jemand interessiert? + +[TAX1_2:TAXIWA1] +Tommy hier. Ich übernehme das. + +[TAX1_3:TAXIWA1] +Das ist meine Fuhre. Hau ab! + +[TAX1_4:TAXIWA1] +Los, los, steigen Sie ein. Schnell! + +[TAX1_5:TAXIWA1] +Ok, ok! Aber tun Sie mir nichts! + +[TAXW1_1:TAXIWA1] +~g~Hol die V.I.P. auf Starfish Island ab. + +[TAXW1_2:TAXIWA1] +~g~Hol die V.I.P. zurück! Schalte den anderen Wagen aus! + +[TAXW1_3:TAXIWA1] +~r~Die V.I.P. ist Geschichte! + +[TAXW1_4:TAXIWA1] +~r~Die V.I.P. wurde abgesetzt! + +[TAXW1_6:TAXIWA1] +~g~Bring die V.I.P zum Flughafen! + +{=================================== MISSION TABLE TAXIWA2 ===================================} + +[TAX2_1:TAXIWA2] +An alle Wagen. Wir kriegen nirgends Fahrgãste. Was ist los mit euch? + +[TAX2_2:TAXIWA2] +VC-Taxi ist dauernd schneller als wir. Die haben einfach zu viele Autos. Keine Chance. + +[TAX2_3:TAXIWA2] +Mr. Vercetti, wenn Sie zufãllig mithören: Sie müssen ein paar VC-Taxis ausschalten, sonst sind wir pleite! + +[TAXW2_1:TAXIWA2] +~g~Schalte 3 Taxis der Konkurrenz aus! + +{=================================== MISSION TABLE TAXIWA3 ===================================} + +[TAX3_1:TAXIWA3] +Wagen 13, eine Miss Cortez möchte von Ihnen ganz persönlich in Downtown abgeholt werden. + +[TAX3_2:TAXIWA3] +Ok, verstanden. Wagen 13 Ende. + +[TAX3_3:TAXIWA3] +Hmmm, keine Spur von Mercedes... + +[TAXW3_3:TAXIWA3] +~g~Schalte das Taxi des Anführers aus! + +[TAXW3_2:TAXIWA3] +~g~Halte durch, bis die Zeit abgelaufen ist. + +[TAX_AS1:TAXIWA3] +TAXIUNTERNEHMEN ERWORBEN + +[TAX_AS2:TAXIWA3] +~g~Kaufman-Taxis generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. + +[TAX3_4:TAXIWA3] +Wird Zeit, dass der Schutzengel von Kaufman-Taxis eine vor den Latz kriegt! + +[TAX3_5:TAXIWA3] +Hey, Freundchen, dir zieh ich das Fell über die Ohren! + +{ reVC updates } +{ new languages } +[FEL_JAP] +JAPANISCH + +[FEL_POL] +POLNISCH + +[FEL_RUS] +RUSSISCH + +{ new display menus } +[FET_GFX] +GRAPHICS SETUP + +[FED_MIP] +MIP MAPPING + +[FED_AAS] +ANTI ALIASING + +[FED_FIL] +TEXTURE FILTERING + +[FED_BIL] +BILINEAR + +[FED_TRL] +TRILINEAR + +[FED_WND] +WINDOWED + +[FED_FLS] +FULLSCREEN + +[FEM_CSB] +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 + +[FEC_FRC] +FREE CAM + +{ Linux joy detection } +[FEC_JOD] +DETECT JOYSTICK + +[FEC_JPR] +Press any key on the joystick of your choice that you want to use on the game, and it will be selected. + +[FEC_JDE] +Detected joystick + +{ mission restart } +[FET_RMS] +MISSION WIEDERHOLEN + +[FESZ_RM] +WIEDERHOLEN? + +[FED_VPL] +VEHICLE PIPELINE + +[FED_PRM] +PED RIM LIGHT + +[FED_RGL] +ROAD GLOSS + +[FED_CLF] +COLOUR FILTER + +[FED_WLM] +WORLD LIGHTMAPS + +[FED_MBL] +MOTION BLUR + +[FEM_SIM] +SIMPLE + +[FEM_NRM] +NORMAL + +[FEM_MOB] +MOBILE + +[FED_MFX] +MATFX + +[FED_NEO] +NEO + +[FEM_PS2] +PS2 + +[FEM_XBX] +XBOX + +[FEC_IVP] +INVERT PAD VERTICALLY + +[FEM_NON] +NONE + +[FEC_DS2] +DUALSHOCK 2 + +[FEC_DS3] +DUALSHOCK 3 + +[FEC_DS4] +DUALSHOCK 4 + +[FEC_360] +XBOX 360 CONTROLLER + +[FEC_ONE] +XBOX ONE CONTROLLER + +[FEC_TYP] +GAMEPAD TYPE + +[FET_AGS] +GAMEPAD SETTINGS + +[FEM_AUT] { aspect ratio related } +AUTO [DUMMY] THIS LABEL NEEDS TO BE HERE !!! diff --git a/utils/gxt/italian.txt b/utils/gxt/italian.txt index c9a966a..4773cde 100644 --- a/utils/gxt/italian.txt +++ b/utils/gxt/italian.txt @@ -1,398 +1,57 @@ -[LETTER1] -abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"$,.'-?!!SDBF - -[DEFNAM] -Claude---------------------- +{ + New strings are at the bottom of file. + Do not change the order of strings. + You can fix the typos of existing translation but please refrain from + unnecessary edits like rephasing because you think it suits better for your taste. +} [IN_VEH] -~w~Ehi! Torna nel ~b~veicolo! - -[IN_VEH2] -~w~Hai bisogno di un veicolo per questo lavoro! - -[IN_BOAT] -~w~Hai bisogno di una barca per questo lavoro! +~g~Ehi! Torna nel veicolo! [HEY] -~w~Non procedere da solo, stai con i tuoi compagni! - -[HEY2] -~w~Non allontanarti, stai col tuo gruppo! - -[HEY3] -~w~Hai lasciato indietro 8-Ball! Torna a prenderlo! - -[HEY6] -~w~Hai abbandonato il tuo onore con lo Yakuza Kanbu. Devi proteggerlo! - -[HEY7] -~w~Un'arma extra potrebbe essere utile. Torna a prendere il tuo contatto! - -[HEY9] -~w~Vuoi sapere le ultime novità? Vai a trovare il contatto! - -[GATE_1] -~w~I Sindacco apriranno solamente a una delle loro macchine. - -[HELPA] -~w~Questo è il tuo ~h~rifugio. - -[HELPB] -~w~Quando non sei in missione, puoi salvare i tuoi progressi raccogliendo l'~h~icona di salvataggio~w~. Il tempo avanzerà di 6 ore. - -[HELPC] -~w~I veicoli che si trovano nel ~h~garage vicino all'ingresso~w~ verranno conservati quando salvi la partita. - -[HELPD] -Per uscire dal rifugio, cammina sul ~h~segno. - -[HELP0] -~w~Premi~h~ ~k~ ~VEEE~ ~w~per entrare o uscire da un veicolo. - -[HELP1] -~w~Fermati al centro del ~h~segno giallo. +~g~Non procedere da solo, stai insieme ai tuoi compagni! [HELP3] -~w~Puoi scattare per un breve periodo di tempo prima di stancarti. +Ricorda che puoi eseguire uno scatto solo per brevi tratti. -[HELP4] -~w~Premi~h~ ~k~ ~VEACC~ ~w~per ~h~accelerare,~h~ ~k~ ~VESTR~ ~w~per sterzare. +[HELP4_D] +Sposta la ~h~levetta analogica destra~w~ verso l'alto per ~h~accelerare~w~. -[HELP5] -~w~Premi~h~ ~k~ ~VEBRK~ ~w~per ~h~frenare~w~ oppure per fare ~h~inversione~w~ se il veicolo è fermo. +[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] -~w~Premi~h~ ~k~ ~VEHB~ ~w~per usare il ~h~freno a mano. +[HELP7_A] +Tieni premuto il ~h~~k~~PED_LOCK_TARGET~~w~ per ~h~mirare~w~ con il fucile di precisione. -[HELP7] -~w~Tieni premuto~h~ ~k~ ~PDLT~ ~w~per mirare con un fucile da cecchino. - -[HELP8] -~w~Usa~h~ ~k~ ~SNZI~ ~w~e~h~ ~k~ ~SNZO~ ~w~per ~h~ingrandire o ridurre~w~ quando stai mirando. +[HELP7_D] +Tieni premuto il ~h~~k~~PED_LOCK_TARGET~~w~ per ~h~mirare~w~ con il fucile di precisione. [HELP10] -~w~La ~h~stella gialla~w~ indica che sei ~h~ricercato~w~: gli agenti di polizia cercheranno di arrestarti. +Questa stella indica il tuo livello di sospetto. [HELP11] -~w~Quando appaiono più stelle, la polizia cerca di fermarti con più impegno. - -[HELP12] -~w~Cammina sul ~h~segno giallo~w~ per iniziare una missione. +Più stelle hai, maggiore è il tuo livello di sospetto. [HELP13] -~w~Cerca delle scorciatoie non segnalate sul ~h~radar~w~ e usale a tuo vantaggio! - -[HELP14] -~w~Usa il ~h~radar~w~ per orientarti in città: segui il ~h~segnale giallo~w~ per raggiungere il ~h~rifugio. - -[HELP16] -~w~Usa~h~ ~k~ ~VESTR~ ~w~per sterzare. - -[HELP17] -~w~Phil Cassidy: per mercanzia di grosso calibro. È in arrivo nuova merce! - -[HELP18] -~w~Consegnata nuova merce al negozio d'armi di Phil Cassidy! - -[HELP18B] -~w~Ora puoi prendere il ~h~mitragliatore~w~ da Phil Cassidy! - -[HELP19A] -~w~Per eseguire una ~h~raffica laterale~w~, tieni premuto~h~ ~k~ ~VELL~ ~w~o~h~ ~k~ ~VELR~ ~w~e spara usando~h~ ~k~ ~VEWEP~. - -[HELP19C] -~w~Puoi eseguire una raffica laterale solo se hai una ~h~mitragliatrice. - -[HELP19D] -~h~Le moto ~w~ti permettono di ~h~sparare avanti~w~ usando~h~ ~k~ ~VEWEP~. - -[HELP19F] -~w~Puoi sparare avanti solo se hai una ~h~mitragliatrice. - -[HELP20] -~w~Hai trovato una ~h~bustarella della polizia!~w~ Raccogliendole puoi ridurre il tuo ~h~livello di sospetto~w~ di una stella! - -[HELP21] -~w~Usa~h~ ~k~ ~PDCWE~ ~w~per cambiare arma quando sei a piedi. - -[HELP22] -~w~Per trovare il ~h~magazzino di Vincenzo~w~, segui la ~h~V~w~ sul radar. - -[HELP23] -~w~Se il segnale è un ~h~triangolo rivolto verso il basso~w~, ~h~l'obiettivo~w~ è sotto di te. - -[HELP24] -~w~Tieni premuto~h~ ~k~ ~VELL~ ~w~o~h~ ~k~ ~VELR~ ~w~per guardare a ~h~sinistra o destra~w~ in un veicolo. Premi entrambi per guardare ~h~indietro. - -[HELP25] -~w~Premi~h~ ~k~ ~CVEIW~ ~w~per cambiare ~h~la visuale. - -[HELP26] -~w~Salta su una barca e premi~h~ ~k~ ~VEEE~ ~w~per guidarla. - -[HELP27] -~w~Se sei nei pressi di una barca, premi~h~ ~k~ ~VEEE~ ~w~per salire a bordo. - -[HELP29] -~w~Premi~h~ ~k~ ~VEHN~ ~w~per suonare il ~h~clacson~w~. - -[HELP30] -~w~Usa~h~ ~k~ ~VECRS~ ~w~per scegliere le ~h~stazioni radio. - -[HELP33] -~w~Ora che i killer sono stati pagati, porteranno a termine il loro lavoro a qualunque costo. - -[HELP34] -~w~Tieni premuto~h~ ~k~ ~VELB~ ~w~per guardare indietro quando sei in macchina. - -[HELP38] -~w~Se uccidi qualcuno in possesso di un'arma, questa apparirà a terra. - -[HELP40] -~w~Quando sei a piedi usa~h~ ~k~ ~PDLOO~ ~w~per guardarti attorno. - -[HELP58] -~w~Tieni premuto~h~ ~k~ ~PDLT~ ~w~per ~h~agganciare un bersaglio~w~ e premi~h~ ~k~ ~PDFW~ ~w~per sparare! - -[HELP59] -~w~Quando hai agganciato, usa~h~ ~k~ ~PDCTL~ ~w~per cambiare bersaglio. - -[HELP60] -~w~Alcuni barili esplodono se colpiti, ma ricordati di stare a distanza! - -[TANK] -~w~Usa~h~ ~k~ ~VEWEA~ ~w~per mirare con il cannone del Rhino e~h~ ~k~ ~VEWEP~ ~w~per sparare. - -[ANSWER] -~w~Premi~h~ ~k~ ~ANS~ ~w~per rispondere al cellulare e~h~ ~k~ ~VEEE~ ~w~per agganciare. - -[BOMB] -~w~Portando una macchina dentro il negozio di 8-Ball, potrai montare una ~h~bomba~w~ al prezzo di ~h~500$~w~. - -[BRIDGE1] -~w~Callahan Bridge: in costruzione. Data di fine lavori: maggio 1998 - -[STRIK_1] -~w~Sarai in grado di usare il ~h~traghetto~w~ per Staunton Island al termine dello sciopero. - -[SPRAY] -~w~Guida il tuo veicolo nel ~h~Pay 'n' Spray~w~ per annullare il ~h~livello di sospetto~w~, ~h~ riparare ~w~e ~h~riverniciare ~w~la carrozzeria per ~h~100$. - -[S_TRN_1] -~w~Puoi usare le ~h~metropolitane~w~ per muoverti a Liberty City. Premi~h~ ~k~ ~VEEE~ ~w~per ~h~entrare ~w~o ~h~uscire~w~ da un treno. - -[TUBE1] -~w~All'apertura della stazione, sarai in grado di prendere la ~h~metropolitana~w~ fino a Staunton Island. - -[TUBE2] -~w~All'apertura della stazione, sarai in grado di raggiungere l'~h~aeroporto internazionale Francis~w~. - -[TUBE_2] -~w~Per salire su una ~h~metropolitana~w~, premi~h~ ~k~ ~VEEE~. - -[SPRAY1] -~w~Fermandoti al ~h~Pay 'n' Spray~w~ annullerai il tuo ~h~livello di sospetto~w~, ~h~riparerai ~w~e ~h~rivernicerai ~w~il tuo veicolo. Di solito costa ~h~100$~w~, ma questa volta è gratis. - -[HELPE31] -~w~Durante il gioco, verranno sbloccati nuovi vestiti che possono essere recuperati da Mr. Benz. - -[HELPE32] -~w~Durante il gioco, avrai l'opportunità di comprare armi più potenti presso Ammu-Nation. - -[HELPCOM] -~w~Nuovi abiti sbloccati al rifugio! - -[HELP41] -~w~Fermati dentro il ~h~Pay 'n' Spray~w~ per riverniciare e riparare la tua macchina. Segui la ~h~bomboletta spray~w~ sul radar per raggiungere il ~h~Pay 'n' Spray. - -[PAGEB1] -~w~La ~h~pistola~w~ è disponibile al tuo rifugio! - -[PAGEB10] -~w~Hai trovato tutti i pacchetti speciali! Ecco una ricompensa di ~h~50.000$! - -[EXPO_W] -~w~A Love Media serve uno di questi modelli! - -[FERRY_2] -~w~Torna quando c'è un traghetto ancorato. - -[FERRY_3] -~w~Il tuo veicolo non può salire sul traghetto! - -[FERRY_4] -~w~I criminali ricercati non possono salire sul traghetto! - -[FERRY_5] -~w~Hai bisogno di ~h~25$~w~ per il biglietto. Torna quando avrai abbastanza soldi. - -[FERRY_6] -~w~Non puoi usare un traghetto durante una missione. - -[FERR_SK] -~w~Premi~h~ ~k~ ~TRSK~ ~w~per saltare il viaggio. - -[FERR_C1] -~w~Traghetto per Staunton. Costo: ~h~25$~w~. Premi~h~ ~k~ ~TGSUB~ ~w~per comprare un biglietto. - -[FERR_C2] -~w~Traghetto per Portland. Costo: ~h~25$~w~. Premi~h~ ~k~ ~TGSUB~ ~w~per comprare un biglietto. - -[A_H1] -~w~~k~ ~AMBUY~ ~w~per comprare. ~n~~k~ ~AMEXI~ ~w~per uscire. - -[A_UZI_A] -~w~La mini-mitraglietta è disponibile da Ammu-Nation! - -[AMMU] -~w~Le armi saranno disponibili da ~h~Ammu-Nation~w~ all'arrivo di nuova merce. Mi spiace per l'inconveniente. - -[WANT_A] -~w~Se vieni ~h~'beccato'~w~, verrai portato alla più vicina stazione di polizia. - -[WANT_B] -~w~Qualsiasi missione stessi affrontando verrà considerata fallita e i poliziotti ti prenderanno tutte le armi e parte dei risparmi. - -[WANT_C] -~w~Puoi essere ~h~'beccato'~w~ solo se hai un ~h~livello di sospetto~w~, rappresentato da stelle nell'angolo superiore destro dello schermo. - -[WANT_D] -~w~Più stelle possiedi, più la polizia cercherà di fermarti. - -[WANT_E] -~w~Ci sono vari modi per ridurre il livello di sospetto: tieni gli occhi aperti. - -[WANT_F] -~w~Mentre stai guidando, entra in un ~h~Pay 'n' Spray~w~ per eliminare il tuo livello di sospetto. - -[HEAL_A] -~w~Quando vieni ~h~'massacrato'~w~, verrai trasportato al più vicino ospedale. - -[HEAL_B] -~w~Perderai tutte le tue armi e fallirai la missione in corso. Parte dei tuoi risparmi servirà per le cure mediche. - -[HEAL_C] -~w~La tua ~h~salute~w~ è indicata da una barra rossa in alto a destra sullo schermo. - -[HEAL_D] -~w~Esistono diversi modi per curarsi: tieni gli occhi aperti. - -[H_WE_01] -~w~Cammina sulle armi per raccoglierle. Puoi farlo solamente quando sei a piedi. - -[H_WE_02] -~w~Se hai già un'arma di quel tipo, premi~h~ ~k~ ~PUCF~ ~w~per rimpiazzare la tua arma con quella nuova. - -[PU_CF] -~w~Premi~h~ ~k~ ~PUCF~ ~w~per prendere quest'arma. Ogni arma dello stesso tipo andrà perduta. - -[CLOTHA] -~h~~k~ ~AMMOV~ ~w~per vedere gli abiti. ~h~~k~ ~AMBUY~ ~w~per cambiarti d'abito. ~h~~k~ ~AMEXI~ ~w~per annullare. - -[CLOTHB] -~w~Qui potrai cambiarti d'abito in qualsiasi momento. - -[SIREN_1] -~w~Puoi attivare o disattivare le ~h~sirene~w~ premendo~h~ ~k~ ~VEHN~. - -[FHOSE_1] -~w~Tieni premuto~h~ ~k~ ~VEWEP~ ~w~per usare il cannone ad acqua. - -[PHOTO1] -~w~Tieni premuto~h~ ~k~ ~PDLT~ ~w~per mirare con la macchina fotografica. - -[PHOTO2] -~w~Mentre stai mirando con la macchina fotografica, usa~h~ ~k~ ~SNZI~ ~w~e~h~ ~k~ ~SNZO~ ~w~per ~h~ingrandire e ridurre. - -[PHOTO3] -~w~Premi~h~ ~k~ ~PDFW~ ~w~per scattare una foto mentre stai mirando. - -[BENZ_H1] -~w~Segui la ~h~maglietta~w~ sul radar per trovare ~h~il negozio di vestiti Mr. Benz. - -[BENZ_LE] -~w~Il ~h~completo dei Leone~w~ è disponibile al rifugio. - -[BENZ_GU] -~w~La ~h~divisa degli Avenging Angels~w~ è disponibile al rifugio. - -[BENZ_CH] -~w~La ~h~divisa da autista~w~ è disponibile al rifugio. - -[BENZ_TU] -~w~Lo ~h~smoking~w~ è disponibile al rifugio. - -[ATUTOR] -~w~Le missioni Paramedico possono essere attivate o disattivate premendo~h~ ~k~ ~TGSUB~. - -[CTUTOR] -~w~Le missioni Vigilante possono essere attivate o disattivate premendo~h~ ~k~ ~TGSUB~. - -[FTUTOR] -~w~Le missioni Pompiere possono essere attivate o disattivate premendo~h~ ~k~ ~TGSUB~. - -[TRATUT1] -~w~Le missioni Sprint-atore ecologico possono essere attivate o disattivate premendo~h~ ~k~ ~TGSUB~. - -[TTUTOR] -~w~Le missioni Tassista possono essere attivate o disattivate premendo~h~ ~k~ ~TGSUB~. - -[A_COMP2] -~w~Missione Paramedico: livello 12 completato! Non ti stancherai mentre corri! - -[FIREPRO] -~w~Missione Pompiere: livello 12 completato! Ora sei ignifugo! - -[RCHELP] -~w~Per far ~h~esplodere~w~ la macchina radiocomandata, premi~h~ ~k~ ~VEWEP~. - -[TAXIH1] -~w~Fermati vicino a un ~h~pedone evidenziato~w~ per farlo salire a bordo e portarlo a destinazione prima che scada il tempo. - -[TIPHLP] -~h~La barra delle mance~w~ si accorcia se perdi ~h~tempo~w~ o se il taxi viene ~h~danneggiato. - -[ANG_E3] -~w~Cerca altri Avenging Angels a Chinatown. - -[ANGOUT] -~w~Torna quando avrai indossato una divisa da ~h~Avenging Angel~w~. - -[ANGCOM2] -~w~Missioni Avenging Angels di Staunton: livello 15 completato! Adesso non perderai soldi se vieni arrestato! - -[ANGCOM3] -~w~Missioni Avenging Angels di Shoreside: livello 15 completato! Troverai un veicolo 'speciale' al rifugio! - -[TVOHELP] -~w~Ritorna indossando la ~h~maschera da hockey. +In alcuni casi potresti dover utilizzare passaggi non segnati sul radar. [TIMER] Questa è una missione a tempo: devi portarla a termine prima che il contatore raggiunga lo zero. -[GARAGE] -Porta la macchina al garage, poi esci. +[HORN] +~g~Suona il clacson. -[TRASH] -~g~Hai conciato male la tua macchina! Falla riparare! - -[WRECKED] -~r~Il veicolo è a pezzi! - -[SPOOK] -SPAVENTOMETRO - -[SPOTTED] -~r~Ti sono addosso! +[NOMONEY] +~g~Ti servono più soldi! [REWARD] -~w~Ricompensa: ~1~$ +RICOMPENSA ~1~$ -[GAMEOVR] -FINE PARTITA +[M_FAIL] +MISSIONE FALLITA! -[Z] -Valore asse Z: ~1~ +[M_PASS] +MISSIONE COMPLETATA! ~1~$ [DEAD] MASSACRATO! @@ -400,17 +59,29 @@ MASSACRATO! [BUSTED] BECCATO! -[GOODBOY] -~w~50$ come bonus Buon Cittadino!! +[WEATHE1] +FORZA TEMPO SOLEGGIATO + +[WEATHE2] +FORZA TEMPO MOLTO SOLEGGIATO + +[WEATHE3] +FORZA TEMPO NUVOLOSO + +[WEATHE4] +FORZA TEMPO PIOVOSO + +[WEATHE5] +FORZA TEMPO NEBBIOSO + +[WEATHE6] +TEMPO NORMALE [NUMBER] ~1~ -[SCORE] -~1~$ - [LOADCAR] -CARICAMENTO VEICOLO... (PREMI IL TASTO L PER ANNULLARE) +CARICAMENTO VEICOLO... (PREMI L1 PER ANNULLARE) [CARSOFF] Veicoli disabilitati. @@ -430,746 +101,1271 @@ Modalità trucchi disattivata [IMPORT1] Esci fuori e aspetta il tuo veicolo. -[KE_PLYR] -Giocatore +[PAGEB11] +Lanciafiamme depositato nel nascondiglio -[KE_CTCS] -Contatti +[WANT_A] +Verrai arrestato solo se hai un ~h~livello di sospetto~w~. -[KE_WEPS] -Armi +[WANT_B] +Il tuo ~h~livello di sospetto~w~ è rappresentato da una riga di stelle nell'angolo superiore destro dello schermo. -[KE_ADR] -Adrenalina +[WANT_C] +Adesso hai un ~h~livello di sospetto~w~ pari a uno... -[KE_BRIB] -Bustarella +[WANT_D] +due... -[KE_HLTH] -Salute +[WANT_E] +tre... -[KE_KILF] -Furia omicida +[WANT_F] +Man mano che il tuo ~h~livello di sospetto~w~ aumenta, attirerai l'attenzione di forze dell'ordine sempre più potenti. -[KE_ARM] -Protezione +[WANT_G] +Se vieni ~h~'beccato'~w~, verrai portato alla più vicina stazione di polizia. -[KE_USJ] -AcU +[WANT_H] +I poliziotti prenderanno tutte le tue armi e parte dei tuoi risparmi come bustarella. -[KE_PKG] -Pacchetto speciale +[WANT_I] +Qualsiasi missione stavi affrontando verrà considerata come fallita. -[KE_INFO] -Informazioni +[WANT_J] +Scoprirai alcuni modi per ridurre il tuo livello di sospetto procedendo nel gioco. -[DAM] -Danno +[WANT_K] +Se sei in un veicolo, i ~h~carozzieri~w~ potranno ~h~azzerare il tuo livello di sospetto~w~. -[KILLS] -Uccisioni +[HEAL_B] +Quando sei ~h~'massacrato'~w~, verrai trasportato al più vicino ospedale. -[TIME] -Tempo +[HEAL_C] +Perderai tutte le tue armi e i dottori prenderanno parte dei tuoi risparmi per rimetterti in sesto. -[STOPS] -Fermate +[HEAL_E] +Scoprirai alcuni modi per curarti o per proteggerti dagli attacchi procedendo nel gioco. -[BULL] -Lingotto +[SAVE1] +Passa attraverso la corona per ~h~salvare la partita~w~. Non puoi salvare durante una missione. -[EVID] -Prove +[SAVE2] +Qualsiasi veicolo parcheggiato nel garage verrà salvato insieme alla partita. -[HEALTH] -Danni +[AMMU] +Entra in Ammu-Nation per comprare un'arma. -[COLLECT] -Raccolti +[R_TIME] +TEMPO DI GARA: -[LEVEL] -Livello +[PROP_1] +Non hai abbastanza soldi per comprare questa proprietà. -[SALES] -Vendite - -[CITYZON] -Liberty City - -[VICE_C] -Liberty City +[PROP_2] +Non puoi comprare una proprietà mentre sei in missione. [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] -Garage di 8-Ball +Vice City Beach [COM_ZON] -Staunton Island +Vice City Mainland -[STADIUM] -Aspatria +[BEACH1] +Ocean Beach -[STADIU2] -Aspatria +[BEACH2] +Washington Beach -[STADIU3] -Aspatria +[BEACH3] +Vice Point -[HOSPI_2] -Rockford +[GOLFC] +Leaf Links -[UNIVERS] -Liberty Campus +[STARI] +Starfish Island -[CONSTRU] -Fort Staunton +[DOCKS] +Porto -[PARK] -Belleville Park +[HAVANA] +Little Havana -[COM_EAS] -Newport +[HAITI] +Little Haiti -[SHOPING] -Bedford Point +[PORNI] +Prawn Island -[SHOP2] -Bedford Point +[DTOWN] +Downtown -[SHOP3] -Bedford Point +[VICE_C] +Vice City -[YAKUSA] -Torrington +[A_PORT] +Escobar International -[SUB_ZON] -Shoreside Vale +[JUNKY] +Discarica -[AIRPORT] -Aeroporto Int. Francis +[PISTOL] +Pistola -[PROJECT] -Wichita Gardens +[PYTHON] +.357 -[SUB_IND] -Pike Creek +[UZI] +Uz-1 -[SWANKS] -Cedar Grove +[TEC9] +Tec 9 -[BIG_DAM] -Cochrane Dam +[M4] +M4 -[SUB_ZO2] -Shoreside Vale +[INGRAM] +Mac -[SUB_ZO3] -Shoreside Vale +[MP5] +MP + +[RUGER] +Kruger + +[SNIPE] +Fucile di precisione + +[GRENADE] +Granate + +[SHOTGN1] +Fucile a pompa + +[SHOTGN2] +S.P.A.S. 12 + +[SHOTGN3] +Fucile a canne mozze + +[ARMOUR] +Giubbotto antiproiettile + +[LASER] +.308 Fucile di precisione + +[BASEBAT] +Mazza da baseball + +[HAMMER] +Martello + +[SCREWD] +Cacciavite + +[CLEVER] +Mannaia + +[MACHETE] +Macete + +[KNIFE] +Coltello + +[KATANA] +Katana + +[CHAINSA] +Motosega + +[G_COST] +~1~$ [CAR_1] Ambulanza -[CAR_2] -Pompieri +[MALIBU] +Il club Malibu -[CAR_3] -Polizia +[MANSION] +Villa di Diaz -[CAR_4] -Vigilante +[TMANS] +Chez Tommy -[CAR_5] -Barracks +[STRIP] +Il club Pole Position -[CAR_6] -Rhino +[MALL1] +North Point Mall -[CAR_7] -Cruiser dell'FBI +[BANKINT] +El Banco Corrupto Grande -[CAR_8] -Securicar +[RANGE] +Poligono di tiro -[CAR_9] -Moonbeam +[POL_HQ] +Polizia di VC -[CAR_10] -Pullman +[INT_B] +Un vecchio amico -[CAR_11] -Flatbed +[INTB_1] +~g~Vai all'ufficio degli avvocati. -[CAR_12] -Linerunner +[LAW_1] +Il party -[CAR_13] -Nettezza +[LAW_2] +Rissa nel vicolo -[CAR_14] -Patriot +[LAW_3] +Furia sulla giuria -[CAR_15] -Mr Whoopee +[LAW_4] +Sommossa -[CAR_16] -Mule +[COL_1] +Fottuto traditore -[CAR_17] -Yankee +[COL_2] +Sparatoria al Mall -[CAR_18] -Pony +[COL_3] +Angeli custodi -[CAR_19] -Bobcat +[COL_4] +Sissignore, signore! -[CAR_20] -Rumpo +[COL_5] +Tutti sul ponte! -[CAR_21] -Blista +[COK_1] +L'inseguimento -[CAR_22] -Dodo +[COK_2] +Phnom Penh '86 -[CAR_23] -Autobus +[COK_3] +La barca più veloce -[CAR_24] -Sentinel +[COK_4] +Domanda e offerta -[CAR_25] -Cheetah +[KENT_1] +Il braccio della morte -[CAR_26] -Banshee +[ASS_1] +Eliminazione -[CAR_27] -Stinger +[BUD_1] +Estorsione -[CAR_28] -Infernus +[BUD_2] +Rissa al bar -[CAR_29] -Esperanto +[BUD_3] +Cop Land -[CAR_30] -Kuruma +[CAP_1] +Fuori l'esattore -[CAR_31] -Limousine +[FIN_1] +Tieniti stretto gli amici... -[CAR_32] -Perennial +[BANK_1] +Senza via di fuga? -[CAR_33] -Landstalker +[BANK_2] +Il tiratore -[CAR_34] -Manana +[BANK_3] +L'autista -[CAR_35] -Idaho +[BANK_4] +La rapina -[CAR_36] -Stallion +[CNT_1] +Sfornare verdoni -[CAR_37] -Taxi +[CNT_2] +Colpire il corriere -[CAR_38] -Vecchio taxi +[PORN_1] +Giro di reclutamento -[CAR_39] -Buggy +[PORN_2] +Il dodo del dildo -[SINDACO] -Sindacco Argento +[PORN_3] +La foto di Martha -[HEARSE] -Hearse +[PORN_4] +Riflettori sul punto G -[LANDSTK] -Landstalker +[TAX_1] +Taxi di Kaufman -[IDAHO] -Idaho +[TAXI_1] +VIP -[STINGER] -Stinger +[TAXI_2] +Rivalità amichevole -[LINERUN] -Linerunner +[TAXI_3] +Cabmaggedon -[PEREN] -Perennial +[ICE_1] +Distribuzione -[SENTINL] -Sentinel +[TEX_1] +Ferro quattro -[PATRIOT] -Patriot +[TEX_2] +Due in un colpo -[FIRETRK] -Pompieri +[TEX_3] +Il demolitore -[TRASHM] -Nettezza +[PHIL_1] +Corriere delle armi -[STRETCH] -Limousine +[PHIL_2] +Broda e Saigon -[MANANA] -Manana +[BIKE_1] +Due ruote d'acciaio -[INFERNS] -Infernus +[BIKE_2] +Bollire la pentola -[BLISTA] -Blista +[BIKE_3] +Valla a prendere! -[PONY] -Pony +[ROCK_1] +Il succo dell'amore -[MULE] -Mule +[ROCK_2] +Killer psicotico -[CHEETAH] -Cheetah +[ROCK_3] +Giro pubblicitario -[AMBULAN] -Ambulanza +[ROCK_4] +Love Fist! -[FBICAR] -Cruiser dell'FBI +[HAT_1] +Le polveri della zia -[MOONBM] -Moonbeam +[HAT_2] +Bombardamento! -[ESPERAN] -Esperanto +[HAT_3] +Tutto di nascosto -[TAXI] -Taxi +[CUB_1] +Gara sull'acqua -[KURUMA] -Kuruma +[CUB_2] +Carne da cannone -[BOBCAT] -Bobcat +[CUB_3] +Battaglia navale -[WHOOPEE] -Mr Whoopee +[CUB_4] +Voodoo a doppio taglio -[BFINJC] -BF Injection +[JOB_1] +Morte per strada -[POLICAR] -Polizia +[JOB_2] +Elimina la moglie -[ENFORCR] -Vigilante +[JOB_3] +Incidente... -[SECURI] -Securicar +[JOB_4] +L'ultima partenza -[BANSHEE] -Banshee +[JOB_5] +Risoluzione -[PREDATR] -Predator +[ANSWER] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per rispondere al cellulare. -[BUS] -Autobus +[MOB_01A] +Ciao vecchio mio! Sono Paul. Potrei avere delle informazioni per te, ma ti voglio parlare in privato. -[RHINO] -Rhino +[MOB_01B] +Mi sto godendo un aperitivo al Malibu. -[BARRCKS] -Barracks OL +[MOB_01C] +Credo che mi dovrai un favore o due dopo questo, carino. Ci vediamo dopo. -[BARRACK] -Barracks OL +[MOB_02A] +Ssssnniiiiffffff! Ehi! Tommy? Ciao, Tommy! -[TRAIN] -Treno +[MOB_02B] +Ci sono dei problemi alla stamperia. Faresti meglio ad andare a controllare. -[HELI] -Elicottero +[MOB_02C] +Un qualche tipo di casino. C'è qualcosa che non va. Devo andare. -[DODO] -Dodo +[MOB_03A] +Mr. Vercetti? Ho qui davanti a me un pezzo di carta che afferma -[COACH] -Pullman +[MOB_03B] +che lei si è preso carico dei debiti di BJ's Auto. -[CABBIE] -Vecchio taxi +[MOB_03C] +Con l'improvvisa scomparsa di BJ, non ho altra scelta -[STALION] -Stallion +[MOB_03D] +che ritenerla responsabile delle sue debolezze finanziarie. -[RUMPO] -Rumpo +[MOB_03E] +Finché questo debito non sarà ripagato, -[RCBANDT] -Bandit RC +[MOB_03F] +dovrà considerare le strade di Vice City non molto amichevoli. -[BELLYUP] -Furgone Triade +[MOB_04A] +Come butta, amico? -[MRWONGS] -Mr Wongs +[MOB_04B] +Ascolta Tommy, mi sono dimenticato di dirti che avremo bisogno di qualche gorilla extra per il concerto. -[MAFIACR] -Leone Sentinel +[MOB_04C] +C'è una banda di motociclisti e sarebbero una perfetta pubblicità. -[YARDICR] -Lobo Yardie +[MOB_04D] +Occupatene tu e ti farò accedere al back stage dello spettacolo, OK? -[YAKUZCR] -Stinger Yakuza +[MOB_05A] +Ehi, sono Mitch! Ottimo lavoro, Tommy: è bello riavere indietro la mia vecchia bambina. -[DIABLCR] -Stallion Diablo +[MOB_05B] +Dì a Mr. Kent Paul che avrà la sorveglianza per lo spettacolo. -[COLOMCR] -Cruiser del Cartello +[MOB_05C] +Hai la mia parola. -[HOODSCR] -Rumpo XL degli Hood +[MOB_05D] +Adesso tieniti fuori dai guai. -[AEROPL] -Aeroplano +[MOB_06A] +Tommy, si è parlato molto di te, ragazzo. -[SPEEDER] -Speeder +[MOB_06B] +Pensavo ti servisse un po' di calore, per cui la zia Poulet ti ha preparato una bella zuppa, hmmm? -[REEFER] -Reefer +[MOB_06C] +Passa a trovarmi in cucina ogni tanto, OK Tommy? -[PANLANT] -Panlantic +[MOB_08A] +Ehi, Tommy, ho pensato che ti potessero servire dei consigli. -[FLATBED] -Flatbed +[MOB_08B] +Quando hai un'operazione in corso, dovrai passare a ritirare i soldi della settimana. -[YANKEE] -Yankee +[MOB_08C] +Lascia pensare ai ragazzi che abbiano il controllo del posto e loro cercheranno di ridurne i profitti, OK? -[BORGNIN] -Bickle'76 +[MOB_08D] +Ehi Ken, so come far funzionare le cose, OK. -[TOYZ] -TOYZ +[MOB_08E] +OK, OK! Lo so che lo sai. Lo so. Stavo solo... -[MCLARN] -Lancer MF1 +[MOB_08F] +Ti stavo solo ricordando che lo so, cioè che tu sai che io so. -[SHELBY] -Hellenbach GT +[MOB_08G] +Solo per ricordartelo! -[SUBARU] -Impreza WRX +[MOB_08H] +Sì Ken, va bene... -[SUPRA] -Supra +[MOB_09A] +Ehi Leo! Ho del lavoro per te! -[SKYLINE] -Skoiloine +[MOB_09B] +Non sono Leo! -[CYCLONE] -Cyclone GT +[MOB_09C] +Ehi, se Leo scopre che hai il suo telefono, ti farà a pezzi! -[ESPRIT] -V8 Ghost +[MOB_09D] +Forse Leo è già morto. Forse ho ucciso Leo e ho preso il suo telefono: non ci hai pensato, idiota? -[MINI] -Tommy +[MOB_09E] +Hai ucciso Leo? Devi avere due grandi cojones. Vuoi lavorare per me? -[HOTROD] -Thunder-Rodd +[MOB_09F] +Passa dal bar di mio padre a Little Havana e ne possiamo parlare. -[CAMPVAN] -Rumpo elettorale +[MOB_10A] +Tommy! Senti, devo chiederti un favore. -[BALLOT] -Furgone elettorale +[MOB_10B] +Steve! Come va il film? -[GHOST] -Ghost +[MOB_10C] +Bene, bene. Senti ho, ehm, abbiamo bisogno di una scena di inseguimento, ma siamo a corto di denaro. -[ANGEL] -Angel +[MOB_10D] +Ho lasciato qualche macchina in città. Sono certo che sai cosa fare. -[ANGEL2] -Avenger +[MOB_10E] +OK Steve, terrò un occhio aperto. Ci vediamo! -[PIZZABO] -Pizza Boy +[MOB_11A] +Ciao figliolo, t'ho chiamato per darti un consiglio. -[NOODLBO] -Noodle Boy +[MOB_11B] +Ciao Avery. Come butta? -[FAGGIO] -Faggio +[MOB_11C] +Ci sono un sacco di opportunità in questa città se possiedi le proprietà giuste, mi segui? -[FREEWAY] -Freeway +[MOB_11D] +Tutto chiaro... -[SANCHEZ] -Sanchez +[MOB_11E] +Volevo dirti di tenere gli occhi aperti: potresti trovare l'occasione giusta per far soldi. Ci becchiamo! -[SANCH2] -Manchez +[MOB_11F] +Ciao, Avery. -[F_PASS1] -~w~Incendio spento! Ricompensa: ~1~$ +[MOB12_A] +Ehi Tommy! Sono Avery! Ascolta: sono piuttosto incasinato al momento + +[MOB12_B] +e un mio rappresentante ha bisogno di un accompagnatore fino a Gator Keys. + +[MOB12_C] +Sto cercando di acquistare del terreno da quelle parti, per cui mando qualcuno in avanscoperta. + +[MOB12_D] +Mi faresti un favore? Potresti controllare che arrivi a destinazione tutto intero? + +[MOB12_E] +Certo, nessun problema Avery. Dove vuoi che lo passi a prendere? + +[MOB12_F] +Sta finendo un lavoro presso il cantiere. Gli ho detto che saresti passato lì. + +[MOB12_G] +Nessun problema. Ci vediamo, Avery. + +[MOB13_A] +Vercetti? VERCETTI!!! Maledizione, mi devi aiutare! + +[MOB13_B] +Mr. Moffat? Come sta la famiglia? + +[MOB13_C] +Brutto maledetto, BASTARDO! Mi hai sentito? + +[MOB13_D] +Beh, è stato un piacere chiacchierare... + +[MOB13_E] +ASPETTA! Aspetta Vercetti... Tommy, posso chiamarti Tommy? + +[MOB13_F] +Siamo entrambi professionisti, vero? Sono certo che sai riconoscere un affare, vero? + +[MOB13_G] +Non ho tempo da perdere, arriva al punto. + +[MOB13_H] +SOLDI. I soldi sono il punto! + +[MOB13_I] +Sono fuggito nuovamente da quei maledetti, ma non ci metteranno molto a trovarmi... Pensano si tratti di uno stupido gioco! + +[MOB13_J] +Sono a un telefono pubblico da qualche parte in questo posto di merda. + +[MOB13_K] +Aiutami a scappare prima che mi prendano e... e... oddio... + +[MOB13_L] +Beh, sono impegnato per i prossimi... + +[MOB13_M] +No! Non fare lo stronzo con me, abbi cuore! Nessuno dovrebbe fare una... una cosa simile! + +[MOB13_N] +Sono in ginocchio, Tommy: nella polvere a chiederti pietà... + +[MOB13_O] +Beh, forse potrei passare da quelle parti, vediamo se riesco a trovarti... + +[MOB13_P] +Oddio, stanno arrivando! Ti supplico, muoviti, muoviti! + +[MOB_14A] +Ehi, ciao Tommy: vedrai che mi adorerai! + +[MOB_14B] +Un piccolo uccellino mi ha detto che la divisione SWAT di Vice City ha un deposito presso un'importante banca, + +[MOB_14C] +dove tengono tutte le bustarelle intascate nel corso degli anni, + +[MOB_14D] +un po' come una pensione per gli anni a venire. + +[MOB_14E] +Logicamente, se questa informazione dovesse aiutarti a ottenere i soldi, + +[MOB_14F] +immagino che ti sentiresti obbligato a passarmene una parte... + +[MOB_14G] +Me lo ricorderò, grazie Kent. + +[MOB_14H] +Sono Paul. Vengo dal Kent, vicino a Londra, cretino. + +[MOB_14I] +Le mie conoscenze di geografia non sono mai state un gran che. + +[MOB15_A] +Tommy, amico, sono Paul, dal Kent, + +[MOB15_B] +un paio di squinzie hanno il tuo nome scritto dappertutto giù al Malibu. + +[MOB15_C] +Di cosa stai parlando? + +[MOB15_D] +Squinzie. Passere. Chiaro no? Strafighe. E anche ben messe, non credo fossero mignotte... + +[MOB15_E] +Dovresti venire a dare un'occhiata. + +[MOB16_A] +Tommy, sono Paulo, que pasa amigo? + +[MOB16_B] +Che cosa vuoi Paul: non sono interessato a vestiti di marca taroccati. + +[MOB16_C] +Molto divertente, amico, ma lo sai che non tratto merce di seconda classe. + +[MOB16_D] +Nah, ti ho chiamato per sapere se potevo avere una parte nei tuoi film, + +[MOB16_E] +quando ero in Inghilterra ho fatto un sacco di cose, sai? + +[MOB16_F] +Ho attributi più forniti di te, amico. + +[MOB16_G] +Paul, grazie per l'offerta, lo terrò presente. + +[MOB16_H] +Davvero, non scordarti di me dopo tutto quello che ho fatto per te. + +[MOB16_I] +È proprio ciò che sto cercando di dimenticare... + +[MOB17_A] +Tommy Vercetti: come va, Mr. Pezzo Grosso? + +[MOB17_B] +Ho saputo le tue novità: un vero giocatore in città, eh... + +[MOB17_C] +Paul, sei ubriaco. + +[MOB17_D] +No, idiota. Non sono ubriaco. + +[MOB17_E] +Solo un paio di bicchierini e qualche pillola: non dormo da un paio di giorni, sai... + +[MOB17_F] +Comunque, niente prediche. + +[MOB17_G] +Non sono uno stupido. Chi ti ha portato in questa città? Chi? Io, ecco chi. + +[MOB17_H] +Davvero? + +[MOB17_I] +Davvero! + +[MOB17_J] +Paul, sta' buono. Sono stato occupato, non fare l'idiota. + +[MOB17_K] +Non sono un idiota, chiaro? Questo è ciò che hanno detto in riformatorio. + +[MOB17_L] +Stai forse cercando guai, amico? Beh, stai per trovarli! + +[MOB17_M] +Tommy, amico. Per favore. Sei la mia più grande speranza! Per favore, non ridere di me. + +[MOB17_N] +Paul, cerca di dormire, davvero. + +[MOB18_A] +Tommy, sono Paulo, come butta? Bene amico, comunque, volevo farti una chiamata. + +[MOB18_B] +Ossignore, amico, non crederai mai che razza di strafiga ho appena incontrato. + +[MOB18_C] +Non so esattamente chi fosse, ma passeggiava per Little Havana. + +[MOB18_D] +Ha detto che si chiamava Mercedes o qualcosa del genere. Oddio, dovresti proprio vedere questa gnocca. + +[MOB18_E] +Riuscirebbe a succhiare via la mina da una matita. Mi ha detto che ero il migliore che avesse mai avuto e via dicendo. + +[MOB18_F] +Dovresti farci un giro. Ci vediamo! + +[MOB19_A] +Tommy V, sono KP. Kent Paul. Gira voce che ti vogliano fare a pezzi. + +[MOB19_B] +Tieni gli occhi bene aperti, amico e ricorda: io non ti ho detto niente al riguardo. + +[MOB_20A] +Ehi Tommy, sono Paul. Ho appena sentito che sei stato un ragazzaccio cattivo. + +[MOB_20B] +Qualcuno si è offeso per il tuo comportamento da grand'uomo, e adesso è davvero arrabbiato. + +[MOB_20C] +Beh, non dire che non ti ho avvertito: vantarsi è un gioco pericoloso, amico. + +[MOB_20D] +Comunque, ho anche sentito che c'è una taglia sulla tua testa e che qualcuno ti ha già preso di mira, + +[MOB_20E] +per cui guardati la schiena e ricordati di me, amico. + +[MOB71_A] +Tommy, Tommy, sono Cortez. Que pasa? + +[MOB71_B] +La situazione è interessante. A lei come va? + +[MOB71_C] +Tommy, qui è sempre una battaglia. Scusami per la battuta scontata, ma abbiamo sventato un altro golpe. + +[MOB71_D] +La gente non smette mai di pretendere di più. + +[MOB71_E] +Da quando sono tornato da Vice City, abbiamo avuto tre rivoluzioni e quattro golpe falliti. + +[MOB71_F] +Fortunatamente, sono stato promosso ogni volta. + +[MOB71_G] +Ti volevo chiedere di Mercedes. + +[MOB71_H] +Sì? Cosa vuole sapere? + +[MOB71_I] +Oh Tommy, ho sentito tutte queste storie e non so cosa pensare. + +[MOB71_J] +Forse tutti si divertono a umiliarmi. + +[MOB71_K] +Forse pensa di poter fare ciò che vuole ma dimmi, Tommy: è tutto vero? + +[MOB71_L] +ma dimmi, Tommy: è tutto vero? + +[MOB71_M] +Che cosa? + +[MOB71_N] +Le storie che ho sentito: sta pensando davvero di diventare avvocato? + +[MOB71_O] +Oh Tommy, che vergogna. Noi Cortez siamo una famiglia all'antica e non permetteremo mai che una di noi diventasse avvocato. + +[MOB71_P] +Ti prego, dimmi che non è vero. Non credo resisterei al colpo. + +[MOB71_Q] +Colonnello, le assicuro che Mercedes non diventerà mai un avvocato. Non si preoccupi. + +[MOB71_R] +Grazie Tommy, la vergogna sarebbe schiacciante. Lei è una vera dama, non una parassita, capisci? + +[MOB71_S] +Capisco, Colonnello. + +[MOB71_T] +Comunque, Tommy, devi scusarmi: è appena arrivato il nuovo ministro degli interni. + +[MOB71_U] +Qualche anno fa, ho ucciso suo padre in un golpe fallito, per cui devo essere gentile. Buona giornata, amico. + +[MOB22_A] +Tommy, ti stai rivelando molto utile, amico. + +[MOB22_B] +Grazie, Cortez. Cosa mi dice del nostro accordo? + +[MOB22_C] +Tommy, sto lavorando senza sosta nel tentativo di raggiungere il fondo di questa fossa piena di bugie e inganni, + +[MOB22_D] +hai la mia parola al riguardo, ma nel frattempo, + +[MOB22_E] +ti prego di accettare i più sinceri ringraziamenti da parte della gente per cui stai lavorando. + +[MOB_25A] +Tommy, sono Cortez. I Francesi mi stanno causando tutti i problemi possibili. + +[MOB_25B] +Maledetti ipocriti. Hanno passato secoli a derubare la povera gente e adesso osano chiamare me ladro! + +[MOB_25C] +Avrò bisogno del tuo aiuto il prima possibile. + +[MOB_25D] +Sbrigati, Tommy: ho bisogno di te. Odio questi dannati Francesi. + +[MOB_26A] +Ehi, Tommy? + +[MOB_26B] +Sì? + +[MOB_26C] +Sono Baker. Volevo dirti che ho davvero apprezzato lo show. + +[MOB_26D] +Io e i ragazzi vogliamo ringraziarti e ricordarti + +[MOB_26E] +che hai tutto il nostro rispetto. Buona giornata, continua così. + +[MOB_29A] +Salve, parlo con Mr. Tommy Vercetti? + +[MOB_29B] +Sì. + +[MOB_29C] +Beh, ho sentito dire che sei tu l'uomo da chiamare in caso di infestazione da parassiti. + +[MOB_29D] +Forse... + +[MOB_29E] +Beh, ho in corso un'infestazione davvero pesante: Haitiani da tutte le parti. + +[MOB_29F] +Mi chiamo Umberto Robina e vorrei incontrarmi con te al Cafe Robina il prima possibile, + +[MOB_29G] +perché questa volta i fottuti Haitiani sono andati troppo oltre. + +[MOB_29H] +Test + +[MOB_30A] +Tommy, sono Umberto Robina. + +[MOB_30B] +Come va al caffè? + +[MOB_30C] +Oh, meraviglioso. Incredibile, Tommy, incredibile. Niente perdenti, Tommy, solo veri uomini, sai no, e donne stupende. + +[MOB_30D] +Comunque, volevo dirti che per tutti noi adesso sei un vero Cubano. + +[MOB_30E] +Hai provato di essere all'altezza. Hai provato di avere due grandi cojones. + +[MOB_30F] +Err... grazie, Umberto. Nessuno mi ha detto una cosa simile da quando ho lasciato la galera. Ci becchiamo in giro. + +[MOB_33A] +Tommy, sono Phil: smettila di perdere tempo con le vaccate e ascoltami, intesi? + +[MOB_33B] +Bene. Ho un bel po' di broda bella forte quasi a perfetta fermentazione e mi chiedevo se ne volevi assaggiare un po'. + +[MOB_33C] +Ti assicuro, Tommy, che se ami bere, o se devi rimuovere della vernice, questa è la roba che fa per te. + +[MOB_33D] +Per me è stata una bomba, anche se non ci vedo più bene da un occhio. Ti aspetto, ciao. + +[MOB_34A] +Tommy, mi è davvero piaciuto lavorare con te. Non mi divertivo così dalle scorrerie in Vietnam, amico. + +[MOB_34B] +Se mai ti servisse qualcosa, chiamami, capito? + +[MOB_34C] +Ricordo sempre quelli coi quali ho prestato servizio, + +[MOB_34D] +e sono sicuro di poterti dare una mano, chiaro? + +[MOB_35A] +Tommy, la ferita si sta rimarginando bene. È divertente: + +[MOB_35B] +ho combattuti in sei campi di battaglia e sono sempre uscito senza un graffio... e adesso questo! + +[MOB_35C] +Phil senza un braccio. Comunque, ho una abbondante selezione di armi a una mano, per cui almeno non sarò disarmato! + +[MOB_35D] +Comunque, figliolo, lasciamo stare le stronzate sentimentali e vedi di scolarti qualcosa da parte mia! + +[MOB_36A] +Tommy, sono Phil. Ti volevo ringraziare di essere stato sul campo, figliolo. + +[MOB_36B] +Maledetti Viet, non perdono occasione per farti un attentato... + +[MOB_36C] +Comunque, la ferita sta guarendo: adesso non mi sentirò più in colpa quando riceverò il mio consueto assegno per disabili. Grazie, amico. + +[MOB_40A] +Ehi, Tommy, sono Sonny. Come va l'abbronzatura? + +[MOB_40B] +Non ho preso il sole. + +[MOB_40C] +Beh, non hai preso neanche i miei soldi, per cui mi chiedevo: + +[MOB_40D] +che cosa stai combinando? Dimmi un po', Tommy, che cosa fai? + +[MOB_40E] +Sto cercando i soldi, Sonny, non ti preoccupare. + +[MOB_40F] +Invece mi preoccupo, Tommy, è il mio stile, + +[MOB_40G] +poiché ho sempre dei problemi con gente che non ama rispettare i patti. + +[MOB_40H] +Non diventare inaffidabile, Tommy, fallo per me... + +[MOB_40I] +Fai un favore a entrambi. Non vedo l'ora di ricevere buone nuove. + +[MOB_41A] +Tommy, ti ricordi di me? + +[MOB_41B] +Ehi, Sonny. + +[MOB_41C] +Sì, sono proprio io, Sonny. Siamo vecchi amici, + +[MOB_41D] +e tu non mi scrivi mai, non mi chiami mai. Non vuoi più essere mio amico? + +[MOB_41E] +Sono stato occupato a mettere le cose a posto. Non mi hai dato un gran che di aiuto da queste parti. + +[MOB_41F] +Ah, è questa la mia colpa? Beh, ho sentito che sei stato molto occupato. + +[MOB_41G] +Occupato a uccidere i baroni della droga. Occupato a prendere il potere. + +[MOB_41H] +Non dimenticarti di noi, Tommy, poiché, te lo assicuro, io non mi sono dimenticato di te. + +[MOB_42A] +Tommy. + +[MOB_42B] +Sonny. + +[MOB_42C] +Hai di sicuro dei problemi di udito, per cui proverò ancora... + +[MOB_42D] +Tommy, dove sono i maledetti soldi, dov'è la maledetta roba e dov'è la mia parte dei tuoi ultimi guadagni? + +[MOB_42E] +Tommy, mi stai facendo fare la figura dell'idiota, e io non sto ridendo. + +[MOB_43A] +Tommy, Tommy, Tommy, avevo Sonny al telefono... OK, sei con me? + +[MOB_43B] +Non so te, ma so che qualcuno sta minacciando di morte la mia famiglia, + +[MOB_43C] +il che mi sta davvero facendo cagare sotto. Che cosa intendi fare? + +[MOB_43D] +Stai calmo, Ken, andrà tutto bene. + +[MOB_43E] +Io SONO calmo, calmo quanto un uomo in pericolo di vita! + +[MOB_43F] +Ken, ora come ora ho altre cose per la testa, + +[MOB_43G] +ci occuperemo di Forelli al momento giusto. + +[MOB_43H] +Io sono calmo. Non ti sembro calmo? Forse è la morte incombente che mi sta facendo tremare la voce. + +[MOB45_A] +Tommy, dobbiamo parlare di un po' di cose. + +[MOB45_B] +C'è qualche problema, Lance? + +[MOB45_C] +Si tratta di te, amico, non mi sembra di ricevere la fetta che merito. + +[MOB45_D] +E inoltre, mi hai imbarazzato davanti ai ragazzi. Non lo posso permettere. + +[MOB45_E] +Lance, non è andata così. Hai commesso degli errori. + +[MOB45_F] +Tommy, non sono il tuo fattorino. Non sono un tuo scagnozzo. + +[MOB45_G] +Lance, non fare casini e non avremo alcun problema. Se faccio un errore, me la puoi far pagare in qualsiasi momento. + +[MOB45_H] +Tommy, ho fatto tutto per te e mi tratti come un idiota. Non farlo. + +[MOB45_I] +Lance, non ti causerò problemi e non ti pugnalerò alle spalle, promesso. + +[MOB45_J] +Rilassati. La cosa è già abbastanza difficile senza che tu ti metta a fare il tenero con me. + +[MOB45_K] +Fidati: mi hai sentito, mi hai sentito? + +[MOB45_L] +Ti ho sentito, ma Tommy, non sopporterò ancora per lungo. + +[MOB45_M] +Lance, non fare così: adesso sono io ad avvertirti. + +[MOB45_N] +Mi hai sentito? Rilassati, prenditi qualche giorno e poi ne riparliamo, OK? + +[MOB46_A] +Tommy, sono Lance. + +[MOB46_B] +Sì? + +[MOB46_C] +Sono felice di sentirti Lance. Forza, stai tranquillo, stai tranquillo. + +[MOB46_D] +Sono nel mezzo di un problema: ho bisogno di te. + +[MOB46_E] +Niente, giusto per dire. Tommy, ce ne possiamo occupare. + +[MOB46_F] +Io e te, nessun problema. Capisci ciò che intendo? + +[MOB46_G] +Dobbiamo proprio farlo, se no siamo entrambi morti, Lance. + +[MOB46_H] +Siamo andati troppo oltre, ma grazie della chiamata. Ci sentiamo più tardi. + +[MOB_47A] +Tommy, sono Lance. Abbiamo un problema serio. Vieni qui in fretta. + +[MOB52_A] +Ehi, Leo, sembra ci sia un compratore per la roba di Diaz. + +[MOB52_B] +Devi fargli uno squillo, ragazzo, e preparare l'accordo, chiaro? + +[MOB52_C] +Dove ti trovi adesso? + +[MOB52_D] +Stai bene Leo? Mi sembri un po' strano... + +[MOB52_E] +Dimmi dove ti trovi. + +[MOB52_F] +Chi diavolo sei? Passami subito Leo! + +[MOB52_G] +Leo se ne è andato per un po' e adesso sono io in carica. + +[MOB52_H] +Fottiti, stronzo! + +[MOB54_A] +Ciao Tommy! + +[MOB54_B] +Ciao Mercedes, come butta? + +[MOB54_C] +Ho un nuovo appartamento in Vice Point... + +[MOB54_D] +magari un giorno di questi potresti farci un salto. + +[MOB54_E] +Mi piacerebbe, ci sentiamo. + +[MOB55_A] +Tommy, sono io. + +[MOB55_B] +Ciao Mercedes. + +[MOB55_C] +Tommy, sono così annoiata: perché non ci divertiamo un po' insieme? + +[MOB55_D] +Cosa intendi dire? + +[MOB55_E] +Beh, lo so che sei occupato a combattere, uccidere e corrompere gente, + +[MOB55_F] +ma io ho voglia di divertirmi un po'. Non ti scordare di me, capito? + +[MOB56_A] +Tommy, ho sentito che hai ucciso Ricardo Diaz. + +[MOB56_B] +C'è stato uno sfortunato incendio nella sua villa. + +[MOB56_C] +Credo sia morto bruciato nella sua camicia in acrilico. + +[MOB56_D] +Tommy, sono così fiera di te. Lo sapevo che eri un vero uomo. + +[MOB56_E] +Era un inutile idiota senza testa: mi rendi orgogliosa di essere tua amica. + +[MOB56_F] +No, lo so che sei impegnato a prendere il possesso di questa città, + +[MOB56_G] +ma non dimenticarti di me, capito? + +[MOB57_A] +Sono Mercedes. Non ti amo più, Tommy. + +[MOB57_B] +Proprio no, onestamente. Tu non sei più gentile con la tua Mercedes. + +[MOB57_C] +Non mi tratti più come una signora: mi ignori e io ti odio. + +[MOB57_D] +Insisto che tu venga a trovarmi immediatamente! + +[MOB58_A] +Tommy. + +[MOB58_B] +Ehi Mercedes. + +[MOB58_C] +Ehi sì, Mr. Tipo Duro. Sono davvero arrabbiata con te, Tommy. + +[MOB58_D] +Non farmi più passare le serate con Jezz Torrent. + +[MOB58_E] +È davvero patetico. A metà delle scale ha iniziato a piagnucolare per il suo cane + +[MOB58_F] +che è morto quando aveva sette anni e a ripetere che la mamma non lo ha mai amato. + +[MOB58_G] +E Tommy, indossa una parrucca e un reggiseno quando è in intimità. + +[MOB58_H] +Non sono molto felice di te! + +[MOB59_A] +Ooh Tommy, sono Mercedes. + +[MOB59_B] +Volevo solo dirti che mi sono divertita così tanto sul set del film. + +[MOB59_C] +Se hai qualcos'altro del genere, fammelo sapere. + +[MOB59_D] +Lo penso davvero. Ho sempre desiderato fare l'attrice. + +[MOB59_E] +Credo di aver imparato molto sull'approccio drammatico. + +[MOB59_F] +È così illuminante! Grazie, grazie! Spero di vederti presto! Adios. + +[MOB_99] +Raggiungi il telefono pubblico. + +[MOB_98] +Raggiungi il telefono pubblico. + +[MOB_97] +Raggiungi il telefono pubblico. + +[MOB_96] +Raggiungi il telefono pubblico. + +[MOB_95] +Raggiungi il telefono pubblico. + +[A_TIME] ++~1~ secondi [F_RANGE] -~r~La radio del camion dei pompieri è fuori campo, avvicinati a una stazione dei pompieri! +~g~Sei fuori dal raggio d'azione della radio. Avvicinati alla stazione dei pompieri! -[C0TGSUB] -tasto R3 - -[C0VESTR] -levetta analogica sinistra, oppure tasti direzionali destro e sinistro - -[C1VESTR] -levetta analogica sinistra - -[C2VESTR] -levetta analogica sinistra, oppure tasti direzionali destro e sinistro - -[C3VESTR] -levetta analogica sinistra - -[C2VEHB] -~T~ - -[C3VEHB] -tasto L1 - -[C0VEHN] -tasto L3 - -[C0VELL] -tasto L2 - -[C1VELL] -tasto L2 - -[C2VELL] -tasto L2 - -[C3VELL] -tasto L2 - -[C0VELR] -tasto R2 - -[C1VELR] -tasto R2 - -[C2VELR] -tasto R2 - -[C3VELR] -tasto R2 - -[C0VELB] -tasto L2 + tasto R2 - -[C1VELB] -tasto L2 + tasto R2 - -[C2VELB] -tasto L2 + tasto R2 - -[C3VELB] -tasto L2 + tasto R2 - -[C0VECRS] -tasto L1 - -[C1VECRS] -tasto SELECT - -[C0VEWEI] -levetta analogica sinistra in su e in giù, oppure tasti direzionali su e giù - -[C1VEWEI] -levetta analogica sinistra in su e in giù - -[C2VEWEI] -levetta analogica sinistra in su e in giù, oppure tasti direzionali su e giù - -[C3VEWEI] -levetta analogica sinistra in su e in giù - -[C0PDCWE] -tasto L2 e tasto R2 - -[C1PDCWE] -tasto L2 e tasto R2 - -[C0PUCF] -tasto L1 - -[C1PUCF] -tasto L1 - -[C2PUCF] -~T~ - -[C3PUCF] -~O~ - -[C0PDLT] -tasto R1 - -[C1PDLT] -tasto R1 - -[C2PDLT] -tasto R1 - -[C3PDLT] -tasto L1 - -[C0PDCTL] -tasto L2 e tasto R2 - -[C1PDCTL] -tasto L2 e tasto R2 - -[C2PDCTL] -tasto L2 e tasto R2 - -[C3PDCTL] -tasto L2 e tasto R2 - -[C0CVEIW] -tasto SELECT - -[C1CVEIW] -tasti direzionali su e giù - -[C2CVEIW] -tasto SELECT - -[C3CVEIW] -tasto SELECT - -[C0PDBAK] -tasto R3 - -[C1PDBAK] -tasto R3 - -[C2PDBAK] -tasto R3 - -[C3PDBAK] -tasto R3 - -[C0PDLO1] -tasto L - -[C1PDLO1] -tasto L - -[C2PDLO1] -tasto L - -[C3PDLO1] -tasto L - -[C0PDLO2] -pad analogico - -[C2PDLO2] -pad analogico - -[C0ANS] -tasto L1 - -[C1ANS] -tasto L1 - -[C2ANS] -tasto L1 - -[C3ANS] -tasto L1 - -[WEATHER] -FORZA TEMPO - -[WEATHE2] -TEMPO NORMALE - -[GA_4] -~w~Le bombe per le macchine costano 500$ - -[GA_5] -~w~Il tuo veicolo ha già una bomba installata. - -[GA_6] -~w~Parcheggia, attiva la bomba premendo~h~ ~k~ ~PED_FIREWEAPON~ ~w~ e FUGGI! - -[GA_7] -~w~Innesca la bomba premendo ~h~ ~k~ ~PED_FIREWEAPON~ ~w~. La bomba esploderà all'accensione del motore. +[DODO_FT] +Hai volato per ~1~ secondi! [GA_8] -~w~Usa il detonatore per attivare la bomba. - -[GA_9] -Macchine speciali recuperate ~1~ su 10 +Usa il detonatore per attivare la bomba. [GA_10] Non male. Eccoti ~1~$ @@ -1184,121 +1380,100 @@ Bomba innescata Un furto da manuale. Completa la lista e ci sarà un bonus per te. [GA_14] -Hai portato tutte le macchine. BENE! Eccoti un bonus. +Hai portato tutte le macchine. BENE! Eccoti un bonus... [GA_15] -~w~Spero che ti piaccia il nuovo colore. +Spero che ti piaccia il nuovo colore. -[GA_17] -~w~Motore nuovo e carrozzeria riverniciata! +[GA_16] +La riverniciatura è gratuita. [GA_19] Non siamo interessati a questo modello. [GA_20] -Di questo modello ne abbiamo in abbondanza. Non siamo interessati. +Di questo modello ne abbiamo in abbondanza. Mi dispiace, non siamo interessati. -[GA_22] -~w~Non puoi mettere una bomba su una moto. +[CHASE] +Massima attenzione dei media -[GA_23] -~w~Bomba installata. Lavoro e pezzi: 500$ +[CHASE1] +Ignoto -[GA_24] -~w~Bomba installata: questa la offre la casa! +[CHASE2] +Noioso + +[CHASE3] +Appena interessante + +[CHASE4] +Giornale locale, pagina 7 + +[CHASE5] +Giornale locale, prima pagina + +[CHASE6] +Vice Courier, 1 colonna + +[CHASE7] +Vice Courier, prima pagina + +[CHASE8] +TV locale, 3 AM + +[CHASE9] +TV locale, news + +[CHASE10] +TV locale, servizio in diretta + +[CHASE11] +UFA Today, pagina 12 + +[CHASE12] +UFA Today, pagina 4 + +[CHASE13] +Foto in UFA Today + +[CHASE14] +TV nazionale, 4 AM + +[CHASE15] +TV nazionale, news + +[CHASE16] +TV nazionale, servizio in diretta + +[CHASE17] +Avvenimento internazionale + +[CHASE18] +Crisi nazionale + +[CHASE19] +Crisi internazionale + +[CHASE20] +Evento mondiale + +[CHASE21] +Roba da leggenda [CR_1] -~w~La gru non può alzare questo veicolo. +La gru non può alzare questo veicolo. [PU_MONY] -~w~Non hai abbastanza soldi. +Non hai abbastanza soldi. -[PAUSED] -GIOCO IN PAUSA - -[FEB_STA] -Statistiche - -[FEB_MAP] -Mappa - -[FEB_BRI] -Briefing - -[FEB_CON] -Comandi - -[FEB_AUD] -Audio - -[FEB_DIS] -Video - -[FEB_LAN] -Lingua - -[FEP_STA] -STATISTICHE - -[FEP_MAP] -MAPPA - -[FEP_BRI] -BRIEFING - -[FEP_CON] -COMANDI - -[FEP_AUD] -audio - -[FEP_DIS] -video - -[FEP_LAN] -LINGUA: - -[FEF_ST1] -Chi è il più cattivo? - -[FEF_ST2] -Quanti disastri hai provocato - -[FEF_BR1] -Ti sei perso? - -[FEF_CO1] -Hai bisogno di più controllo, sfigato? - -[FEF_SA1] -Keep your place in the pile! - -[FEF_SA2] -Salva e carica le partite - -[FEF_AU1] -Pompa il volume! - -[FEF_AU2] -Seleziona una stazione radio e gli effetti audio - -[FEF_DI1] -Cambia la partita! - -[FEF_DI2] -Customize the game for your TV - -[FEF_LA1] -Che cavolo stai dicendo Willis? - -[FEF_LA2] -Choose your preferred parlance +[CO_ALL] +Li hai presi tutti. Eccoti un piccolo extra... [FEM_ON] -Sì +ON [FEM_OFF] -No +OFF [FEM_YES] Sì @@ -1306,224 +1481,20 @@ Sì [FEM_NO] No -[FEM_NON] -Nessuna - -[FEI_SEL] -Seleziona - -[FEI_TAR] -Bersaglio sì/no - -[FEI_BAC] -Indietro - -[FEI_RES] -Riprendi - -[FEI_NAV] -Muovi - -[FEI_BTX] -/ - -[FEI_BTT] -" - -[FEI_STA] -START - -[FEI_BTD] -pad analogico - -[FEI_BTU] -;= - -[FEI_R1B] -L \ R - -[FEI_SCR] -Scorri - -[FEI_ZOO] -Zoom - -[FEH_STA] -STATISTICHE - -[FEH_CON] -COMANDI - -[FEH_AUD] -AUDIO - -[FEH_LAN] -LINGUA - -[FEH_SGA] -NUOVA PARTITA - -[FET_SG] -SALVA PARTITA - -[FEH_BRI] -BRIEFING - -[FEH_DIS] -VIDEO - -[FEH_MAP] -MAPPA - -[FEM_OK] -OK - -[FEC_CRO] -Abbassarsi - -[FE_MLG] -LEGENDA MAPPA - -[MAP_LEG] -LEGENDA: - -[LG_01] -Posizione giocatore - -[LG_13] -Ammu-Nation - -[LG_16] -Rifugio - -[LG_22] -Pay 'n' Spray - -[LG_23] -Mr. Benz - -[LG_25] -Telefono - -[LG_26] -Stazione radio Wildstyle - -[LG_27] -Stazione radio Flash FM - -[LG_28] -Stazione radio KChat - -[LG_29] -Stazione radio Fever 105 - -[LG_30] -Stazione radio VROck - -[LG_31] -Stazione radio VCPR - -[LG_32] -Stazione radio Espantoso - -[LG_33] -Stazione radio Emotion 98.3 - -[LG_34] -Stazione radio Wave 103 - -[LG_35] -Destinazione - -[LG_36] -Sun Yard - -[LG_37] -Club a luci rosse - -[LG_38] -8-Ball - -[LG_39] -Confessionale della chiesa - -[LG_40] -Mamma Cipriani - -[LG_41] -Donald Love - -[LG_42] -JD O'Toole - -[LG_43] -Salvatore Leone - -[LG_44] -Maria - -[LG_45] -McAffrey - -[LG_46] -Toshiko Kasen - -[LG_47] -Vincenzo Cilli - -[LG_48] -Negozio di bombe - -[LG_49] -Negozio di vestiti - -[LG_50] -Phil Cassidy - -[LG_51] -Minaccia - -[LG_52] -Amico - -[LG_53] -Oggetto - -[LG_54] -Bersaglio - -[FEO_CON] -Impostazioni comandi - -[FEO_AUD] -Impostazioni audio - -[FEO_DIS] -Impostazioni video - -[FEO_LAN] -Impostazioni lingua - -[FEO_PLA] -Impostazioni giocatore - -[FEB_PMB] -Briefing missioni precedenti: +[FEM_RET] +Riprova [FEC_NA] ND [FEC_CWL] -Arma successiva +Scorri armi a sinistra [FEC_CWR] -Arma precedente +Scorri armi a destra -[FEC_CW] -Cambia armi - -[FEC_CT] -Cambia bersaglio +[FEC_LOF] +Guarda avanti [FEC_TAR] Bersaglio @@ -1532,40 +1503,34 @@ Bersaglio Movimento [FEC_CAM] -Cambia visuale +Modalità visuale [FEC_PAU] Pausa [FEC_ENV] -Sali sulla vettura +Sali sul veicolo [FEC_JUM] -Salto +Salta [FEC_ATT] -Attacca o spara +Attacca o fuoco con arma [FEC_RUN] Corri [FEC_FPC] -Guarda +Visuale in prima persona [FEC_LL] -Sguardo a sinistra - -[FEC_LB1] -Sguardo - -[FEC_LB2] -indietro +Guarda a sinistra [FEC_LB] -Sguardo indietro +Guarda indietro [FEC_LR] -Sguardo a destra +Guarda a destra [FEC_HOR] Clacson @@ -1573,11 +1538,8 @@ Clacson [FEC_VES] Comandi veicolo -[FEC_RSC] -Cambia stazione radio - [FEC_BRA] -Freno o retro +Freno o retromarcia [FEC_HAB] Freno a mano @@ -1588,104 +1550,47 @@ Arma vettura [FEC_ACC] Accelera -[FEC_SMT] -Missione speciale - [FEC_CCF] -CONFIGURAZIONE: +Configurazione : [FEC_CF1] -CONFIG. 1 +Config 1 [FEC_CF2] -CONFIG. 2 +Config 2 [FEC_CF3] -CONFIG. 3 +Config 3 [FEC_CF4] -CONFIG. 4 +Config 4 [FEC_CDP] -TIPO: +Schermata controller : [FEC_ONF] -A PIEDI +A piedi [FEC_INC] -IN MACCHINA +In macchina [FEC_VIB] -VIBRAZIONE: - -[FEC_ILU] -INVERTI SGUARDO: - -[FEC_SWP] -MOVIMENTO GIOCATORE: - -[FEC_AS] -pad analogico - -[FEC_DP] -tasti direzionali - -[FEA_SFX] -VOLUME EFFETTI: - -[FEA_OUT] -Uscita: - -[FEA_ST] -Stereo - -[FEA_MNO] -Mono - -[FEA_CTD] -Attenzione! Questa caratteristica richiede delle periferiche compatibili DTS. Vuoi procedere? - -[FEA_DTS] -DTS - -[FEA_RSS] -STAZIONE RADIO: - -[FEA_NON] -Radio spenta - -[FED_BRI] -LUMINOSITÀ: - -[FED_TRA] -TRACCE: - -[FED_RDR] -MODALITÀ RADAR: - -[FED_HUD] -MODALITÀ HUD: - -[FED_RDM] -MAPPA & SEGNALI - -[FED_RDB] -SOLO SEGNALI +Vibrazione : [FEL_ENG] -INGLESE +Inglese [FEL_FRE] -FRANCESE +Francese [FEL_GER] -TEDESCO +Tedesco [FEL_ITA] -ITALIANO +Italiano [FEL_SPA] -SPAGNOLO +Spagnolo [FED_DBG] Menu Debug @@ -1699,9 +1604,6 @@ Reload IPL [FED_PAH] Parse Heap -[FED_RCD] -CCullZones::RecalculateCullZoneData - [FED_DFL] CTheScripts::DbgFlag @@ -1723,90 +1625,6 @@ Debug Streaming Requests [FED_SCP] gbShowCollisionPolys -[FEM_MCM] -Menu MEMORY CARD - -[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] -Salvataggio 1 assente - -[FEM_SL2] -Salvataggio 2 assente - -[FEM_SL3] -Salvataggio 3 assente - -[FEM_SL4] -Salvataggio 4 assente - -[FEM_SL5] -Salvataggio 5 assente - -[FEM_SL6] -Salvataggio 6 assente - -[FEM_SL7] -Salvataggio 7 assente - -[FES_LOA] -CARICA PARTITA - -[ST_TIME] -Tempo di gioco attuale - -[ST_OVTI] -Tempo di gioco totale - -[NUMSHV] -Numero di salvataggi - [PL_STAT] Statistiche giocatore @@ -1816,45 +1634,15 @@ Persone massacrate [PE_WSOT] Persone massacrate da altri -[CAR_EXP] -Macchine esplose - -[BOA_EXP] -Imbarcazioni distrutte - [TM_BUST] Arresti subiti -[M_WASTE] -Uomini massacrati - -[F_WASTE] -Donne massacrate - -[PIG_WST] -Poliziotti massacrati - [GNG_WST] Membri delle gang massacrati -[MED_WST] -Infermieri massacrati - -[FIRE_WS] -Pompieri massacrati - [DED_CRI] Criminali massacrati -[DED_DED] -Vagabondi massacrati - -[DED_HOK] -Prostitute massacrate - -[HEL_DST] -Elicotteri distrutti - [PER_COM] Percentuale completata @@ -1864,17 +1652,116 @@ Kg di esplosivo utilizzati [ACCURA] Precisione -[ELBURRO] -Miglior tempo in Turismo (sec) +[ST_WEAP] +Budget armi -[CAR_CRU] -Macchine demolite +[ST_PROP] +Budget proprietà -[HED_EX] -Teste esplose +[ST_AUTO] +Budget riparazioni e colorazione auto -[ST_HEAD] -Colpi alla testa +[ST_PHOT] +Fotografie scattate + +[ST_LOAN] +Visite degli usurai + +[ST_STOR] +Edifici razziati + +[ST_MOVI] +Stunt nei film + +[ST_PIZZ] +Pizze consegnate + +[ST_GARB] +Spazzatura raccolta + +[ST_ICEC] +Gelati venduti + +[TOP_SHO] +Miglior punteggio al poligono + +[SHO_RAN] +Graduatoria al poligono + +[SEAGULL] +Gabbiani abbattuti + +[PROPOWN] +Proprietà posseduti + +[ST_TIME] +Tempo di gioco + +[ST_FTIM] +Ore di volo + +[ST_PRAN] +Graduatoria pilota + +[ST_RAN0] +Apprendista + +[ST_RAN1] +Navigatore + +[ST_RAN2] +Copilota + +[ST_RAN3] +Pratico + +[ST_RAN4] +Competente + +[ST_RAN5] +Anziano + +[ST_RAN6] +Asso + +[ST_RAN7] +Barone Rosso + +[ST_DRWN] +Pesci sfamati + +[ST_FASH] +Budget abbigliamento + +[ST_DAMA] +Proprietà distrutte + +[TM_DED] +Visite all'ospedale + +[DAYSPS] +Giorni trascorsi nel gioco + +[NUMSHV] +Visite al rifugio + +[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 + +[MXJUMP] +Numero max rotazioni FOLLI [BUL_FIR] Colpi sparati @@ -1885,152 +1772,8 @@ Colpi a segno [SPRAYIN] Riverniciature -[TM_DED] -Visite all'ospedale - -[ST_GANG] -Gang meno amata - -[ST_GNG1] -Leone - -[ST_GNG2] -Triade - -[ST_GNG3] -Diablo - -[ST_GNG4] -Yakuza - -[ST_GNG5] -Yardie - -[ST_GNG6] -Colombiani - -[ST_GNG7] -Hood - -[ST_GNG8] -Forelli - -[ST_GNG9] -Sindacco - -[DAYSPS] -Giorni trascorsi nel gioco - -[MMRAIN] -Mm di pioggia caduti - -[ST_STAR] -Totale stelle di sospetto - -[ST_STGN] -Totale stelle di sospetto evase - -[TOT_DIS] -Distanza totale percorsa (miglia) - -[TOTDISM] -Distanza totale percorsa (m) - -[DISTBIK] -Dist. percorsa in moto (miglia) - -[DISTBIM] -Distanza percorsa in moto (m) - -[DISTHEL] -Dist. percorsa in elicottero (miglia) - -[DISTHEM] -Dist. percorsa in elicottero (m) - -[DISTBOA] -Distanza percorsa in barca (miglia) - -[DISTBOM] -Distanza percorsa in barca (m) - -[ST_WHEE] -Impennata più lunga (sec) - -[ST_STOP] -Frenata in punta più lunga (sec) - -[ST_2WHE] -Permanenza su 2 ruote più lunga (sec) - -[ST_WHED] -Distanza più lunga in impennata (m) - -[ST_STOD] -Distanza più lunga in frenata (m) - -[ST_2WHD] -Distanza più lunga su 2 ruote (m) - -[ST_FAPD] -Volo più lungo in avanti (m) - -[FEST_HV] -Livello massimo 'Vigilante' - -[FIRELVL] -Livello massimo 'Pompiere' - -[ST_STOR] -Negozi rapinati - -[ST_ASSI] -Contratti da sicario completati - -[ST_FTIM] -Ore di volo - -[ST_FASH] -Budget abbigliamento - -[ST_WEAP] -Budget armi - -[ST_PROP] -Budget proprietà - -[ST_DAMA] -Proprietà distrutte - -[ST_AUTO] -Budget riparazioni e colorazione auto - -[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 - -[MXJUMP] -Massima rotazione folle in aria - -[FST_MFR] -Stazione radio preferita - -[FST_LFR] -Stazione radio meno amata - [BSTSTU] -Migliore acrobazia folle: +Migliore acrobazia FOLLE [INSTUN] Acrobazia folle @@ -2057,742 +1800,463 @@ Quadrupla acrobazia folle Quadrupla acrobazia folle perfetta [NOSTUC] -Nessuna acrobazia folle effettuata +Nessuna acrobazia FOLLE effettuata [NOUNIF] Acrobazie uniche completate -[NOUNGM] -Acrobazie uniche totali - [NMISON] Missioni provate -[NMMISP] -Missioni completate - [PASDRO] Passeggeri scaricati [MONTAX] Soldi guadagnati in taxi -[CARSLD] -Macchine vendute - -[MONCAR] -Guadagni vendita auto - -[BIKESLD] -Moto vendute - -[MONBIKE] -Guadagni vendita moto - -[CARSEXP] -Auto trovate per Love Media - -[SLTVLVL] -Livello massimo 'Slash TV' - -[SLTVKIL] -Rivali uccisi in Slash TV - -[MONTRS] -Guagagni raccolta immondizia - -[HTMKLD] -Killer uccisi - -[GDAMSP] -Numero di missioni Avenging Angels superate - -[HGAJD] -Uccisioni nelle missioni Avenging Angels - -[BNDRACE] -Gare RC - -[FSTTRT] -Tempo max rimasto in 'Alliva plima e intelo' - -[HGHTRC] -Guadagno max in 'Alliva plima e intelo' - -[FSTHRT] -Tempo migliore di gara in elicottero - -[BHLPOS] -Posizione migliore di gara in elicottero - -[TMSOUT] -Cambi d'abito - -[BSRPS0] -'Rombi assettati' - -[BSRPS1] -'Deimos-tri da sballo' - -[BSRPS2] -'Wi-Cheetah 210 e lode' - -[BSRPS3] -'Incontro a Red Light' - -[BSRPS4] -'Torrington TT' - -[BSRPS5] -'GP delle cosche' - -[DBIKE0] -Percorso 1 - -[DBIKE1] -Percorso 2 - -[DBIKE2] -Percorso 3 - -[DBIKE3] -Percorso 4 - -[DBIKE4] -Percorso 5 - -[DBIKE5] -Percorso 6 - -[DBIKE6] -Percorso 7 - -[DBIKE7] -Percorso 8 - -[DBIKE8] -Percorso 9 - -[DBIKE9] -Percorso 10 - -[DBIKEHE] -'Fossi & Ridossi' - -[DBIKEBP] -Posizione migliore - -[DBIKEFL] -Giro migliore - -[DBIKEFT] -Tempo migliore - -[ST_PHOT] -Foto scattate - -[ST_PIZZ] -Pizze consegnate - -[ST_NOOD] -Noodle consegnati - -[MO_TOUR] -Soldi guadagnati dai turisti - -[TA_TOUR] -Turisti portati in luoghi turistici - -[SC_SCRA] -Punteggio max in 'Disfida alla discarica' - -[SC_9MM] -Punteggio max in '9mm di macello' - -[SC_SCOO] -Punteggio max in 'Motorino sparacchino' - [DAYPLC] Spesa giornaliera polizia -[SEAGULL] -Gabbiani abbattuti - [CRIMRA] -LIVELLO CRIMINALITÀ +Livello criminalità: -[CHASE] -Massima attenzione dei media +[STPR_1] +Malibu -[CHASE1] -Ignoto +[STPR_2] +Tipografia -[CHASE2] -Noioso +[STPR_3] +Studio cinematografico -[CHASE3] -Appena interessante +[STPR_4] +Fabbrica di gelato -[CHASE4] -Giornale locale Pagina 7 +[STPR_5] +Lavaggio auto -[CHASE5] -Giornale locale Prima pagina +[STPR_6] +Compagnia di taxi -[CHASE8] -TV locale, 3 di mattino - -[CHASE9] -TV locale, notiziario - -[CHASE10] -TV locale, servizio in diretta - -[CHASE11] -UFA Today Pagina 23 - -[CHASE12] -UFA Today Pagina 4 - -[CHASE13] -Foto in UFA Today - -[CHASE14] -TV nazionale, 4 di mattino - -[CHASE15] -TV nazionale, notiziario - -[CHASE16] -TV nazionale, servizio in diretta - -[CHASE17] -Avvenimento internazionale - -[CHASE18] -Crisi nazionale - -[CHASE19] -Crisi internazionale - -[CHASE20] -Evento mondiale - -[CHASE21] -Roba da leggenda - -[WHEEL01] -~w~BONUS SU DUE RUOTE: ~1~$ Distanza: ~1~.~1~ m Tempo: ~1~ secondi - -[WHEEL02] -~w~BONUS SU DUE RUOTE: ~1~$ Distanza: ~1~ piedi Tempo: ~1~ secondi - -[WHEEL06] -~w~BONUS IMPENNATA: ~1~$ Distanza: ~1~.~1~ m Tempo: ~1~ secondi - -[WHEEL07] -~w~BONUS IMPENNATA: ~1~$ Distanza: ~1~ piedi Tempo: ~1~ secondi - -[WHEEL11] -BONUS FRENATA IN PUNTA: ~1~$ Distanza: ~1~.~1~ m Tempo: ~1~ secondi - -[WHEEL12] -~w~BONUS FRENATA IN PUNTA: ~1~$ Distanza: ~1~ piedi Tempo: ~1~ secondi - -[GMSTOR] -Negozio di giochi - -[PREBRF] -Briefing precedenti - -[CNTLS] -Comandi - -[MUSMEN] -Musica/Effetti - -[GAMSET] -Impostazioni di gioco - -[LANGUA] -Lingua - -[DSPLAY] -Video - -[DEBUGM] -Menu Debug - -[QUITOP] -Esci dalle opzioni - -[CONTRL] -Configurazione comandi +[STPR_7] +Cantiere navale [SET1EN] -Config. 1. abilitata - -[SET1] -Config. 1. - -[SET2EN] -Config. 2 abilitata - -[SET2] -Config. 2 - -[SET3EN] -Config. 3 abilitata - -[SET3] -Config. 3 - -[SET4EN] -Config. 4 abilitata - -[SET4] -Config. 4 - -[GOBACK] -Indietro - -[SOUND] -AUDIO - -[MUSVOL] -Volume musica - -[SFXVOL] -Volume effetti - -[SCROPT] -OPZIONI VIDEO - -[CTRSCR] -Centra schermo - -[SCRFOR] -Formato schermo - -[GMSVLQ] -SALVA-CARICA-ESCI - -[GMREST] -Riavvio del gioco - -[GMLOAD] -Carica partita +Config. 1. Abilitata. [GMSAVE] Salva partita -[NOGMSV] -Puoi salvare solamente presso il tuo nascondiglio. - -[DLFILE] -Elimina file Grand Theft Auto - -[CHFILE] -SCEGLI IL FILE DA CARICARE - -[CHFIDL] -SCEGLI IL FILE DA ELIMINARE - -[SVCONF] -CONFERMA SALVATAGGIO - -[SVFNAM] -Il nome del tuo salvataggio è - -[LANGSL] -SELEZIONE LINGUA - -[ENGLIS] -Inglese - -[GERMAN] -Tedesco - -[ITALIA] -Italiano - -[FRENCH] -Francese - -[SPAIN] -Spagnolo - -[RELIDE] -Reload IDE - -[RELIPE] -Reload IPL - -[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] -Quantità di sangue - -[SICASS] -Sick Fuck - -[SICSIC] -Sick Fucker - -[SCASSL] -Sick Fuck Selected - -[SCSCSL] -Sick Fucker Selected - -[PRVMEN] -Briefing missioni precedenti - -[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] -Sì - -[NO] -No - -[X] -x - -[LAST] -Ultimo messaggio. - -[GS_STYL] -STILE DI GIOCO: - -[GS_FFAL] -LIBERO - -[GS_LOC] -LUOGO: - -[GS_SLMT] -LIMITE PUNTI: - -[GS_KLMT] -LIMITE UCCISIONI: - -[GS_TLMT] -LIMITE TEMPO: - -[GS_ULMT] -ILLIMITATO - -[GS_PRUP] -POTENZIAMENTI: - -[GS_RACE] -GARA: - -[GS_LAPS] -GIRI: - -[GS_OK] -OK - -[FEH_MP] -MULTIGIOCATORE - -[FEMP_J] -Partecipa - -[FEMP_CS] -PERSONAGGIO: - -[FEMP_PS] -IMPOSTAZIONI GIOCATORE - -[FEMP_GS] -SELEZIONA PARTITA - -[FEMP_NG] -NUOVA PARTITA - -[SVRLIST] -ELENCO PARTITE - -[SVRINFO] -DETTAGLI PARTITE - -[SVRNAME] -NOME: - -[NO_SVRS] -RICERCA PARTITE... - -[NO_PLRS] -RICERCA GIOCATORI... - -[NO_NAME] -NESSUN NOME - -[NO_WIFI] -Per giocare partite multigiocatore, devi prima accendere l'interruttore WLAN. - -[FEMP_SG] -AVVIA PARTITA - -[FEMP_S] -Avvio - -[FEMP_WS] -In attesa dell'avvio della partita... - -[SVRLOST] -Connessione con l'host interrotta. - -[NOSVRS] -Non è stato trovato nessun host. - -[MP_WARN] -Avviando una partita multigiocatore, perderai tutti i progressi fatti dall'ultimo salvataggio. - -[FEDS_XB] -Seleziona - [FEDS_TB] Indietro -[FEDS_ST] -tasto START - RIPRENDI - [FEST_OO] su -[FED_SUB] -SOTTOTITOLI: - [FEC_TUC] Comandi torretta -[FEC_SM3] -Attiva missioni speciali (tasto R3) - [FEC_RS3] -Cambia stazione radio (tasto L3) +Stazioni radio (tasto L3) [FEC_HO3] Clacson (tasto L3) -[FIRST] -~g~1° +[C_FAIL] +Missione Vigilante terminata! -[SECOND] -~g~2° +[C_ESCP] +~r~Il sospettato è fuggito! -[THIRD] -~g~3° +[C_VIGIL] +BONUS VIGILANTE! -[FOURTH] -~g~4° - -[NOCONTE] -Inserire un controller analogico (DUALSHOCK®) oppure un controller analogico (DUALSHOCK®2) nell'ingresso controller 1 per continuare. - -[WRCONT] -Il controller inserito nell'ingresso controller 1 non è un controller supportato. GTA: Liberty City Stories necessita di un controller analogico (DUALSHOCK®) oppure di un controller analogico (DUALSHOCK®2). - -[WRCONTE] -Il controller inserito nell'ingresso controller 1 non è un controller supportato. GTA: Liberty City Stories necessita di un controller analogico (DUALSHOCK®) oppure di un controller analogico (DUALSHOCK®2). +[HEAL_A] +La tua ~h~salute~w~ è indicata in color arancione in alto a destra sullo schermo. [WRONGCD] -Disco errato. Inserisci il disco di GTA:Liberty City Stories. +Disco errato. Inserisci il disco corretto. [NOCD] -Il cassetto del disco è vuoto. Inserisci il disco di GTA:Liberty City Stories. +Il cassetto del disco è vuoto. Inserisci il disco. [OPENCD] Il cassetto del disco è aperto: è necessario chiuderlo. +[CDERROR] +Errore di lettura dal DVD Grand Theft Auto: Vice City. + [RESTART] -Avvio di una nuova partita. +Avvio di una nuova partita [GA_3] -~w~100$ per riverniciare! +Niente più sconti. $100 per la riverniciatura! + +[GA_1] +Wow! Non tocco niente di COSÌ caldo! [GA_1A] -~w~Torna quando non sarai così occupato... +Torna quando non sarai così occupato... -[AWAY] -~r~Qui non c'è proprio! +[HELP9_C] +Premi il ~h~~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~ col fucile di precisione. -[GA_6B] -~w~Parcheggia, attiva la bomba premendo~h~ ~k~ ~PDFW~ ~w~e FUGGI! +[TAXI2] +~r~Tempo scaduto! -[GA_7B] -~w~Innesca la bomba premendo ~h~ ~k~ ~PDFW~~w~. La bomba esploderà all'accensione del motore. +[PAGEB13] +Salute consegnata al nascondiglio + +[PAGEB14] +Adrenalina consegnata al nascondiglio [FESZ_CA] Annulla -[FESZ_QU] -Esci - -[FESZ_L1] -Partita salvata con successo! - -[FESZ_L2] -Il nome del tuo salvataggio è: - -[FESZ_OK] -OK - -[FES_LGA] -Carica partita - -[FES_DGA] -ELIMINA DATI SALVATI - [FES_NGA] -NUOVA PARTITA +Nuova partita [FES_CAN] Annulla [FESZ_QL] -Tutti i progressi non salvati andranno persi. Procedere con il caricamento? +Tutti i progressi della partita attuale non ancora salvati andranno perduti. Vuoi procedere con il caricamento? [FESZ_QD] -Procedere all'eliminazione del salvataggio? +Vuoi eliminare questa partita salvata? [FESZ_QO] -Procedere alla sovrascrittura del salvataggio? +Vuoi procedere con la sovrascrittura di questa partita salvata? [FESZ_QR] -Sei sicuro di voler iniziare una nuova partita? Tutti i progressi dall'ultima partita salvata andranno persi. Procedere? +Sei sicuro di voler iniziare una nuova partita? Tutti i progressi fatti fino all'ultimo salvataggio andranno perduti. Vuoi procedere? -[FESZ_QS] -VUOI SALVARE? +[T4X4_1] +'Parco divertimenti PCJ' -[T4X4_2A] -~g~Hai ~y~2 minuti~g~ per attraversare ~y~12~g~ checkpoint! ~g~Puoi attraversarli in ~y~QUALSIASI ORDINE. +[BMX_1] +'Prova del fango' -[T4X4_2B] -~1~ su 12! +[BMX_2] +'Tracciato di prova' -[T4X4_2C] -~y~SUPERA~g~ il primo checkpoint per attivare il timer. ~g~Ogni checkpoint ti fornirà ~y~10 SECONDI~g~ extra. +[BMXFAIL] +~r~Non sei riuscito a stabilire un nuovo record! + +[T4X4_3] +'TENUTA!' + +[MM_1] +'FOLLIA CONICA' [T4X4_F] ~r~Ti sei ritirato! Troppo difficile per te? -[UPSIDE] -~r~Ti sei ribaltato! +[LANDSTK] +Landstalker + +[IDAHO] +Idaho + +[STINGER] +Stinger + +[LINERUN] +Linerunner + +[PEREN] +Familiare + +[SENTINL] +Sentinel + +[RIO] +Rio + +[PATRIOT] +Patriot + +[FIRETRK] +Camion dei pompieri + +[TRASHM] +Nettezza urbana + +[STRETCH] +Stretch + +[MANANA] +Manana + +[INFERNS] +Infernus + +[VOODOO] +Voodoo + +[PONY] +Pony + +[MULE] +Mule + +[CHEETAH] +Cheetah + +[AMBULAN] +Ambulanza + +[FBICAR] +FBI Washington + +[MOONBM] +Moonbeam + +[ESPERAN] +Esperanto + +[TAXI] +Taxi + +[WASHING] +Washington + +[BOBCAT] +Bobcat + +[WHOOPEE] +Mr Whoopee + +[BFINJC] +BF a iniezione + +[HUNTER] +Hunter + +[POLICAR] +Polizia + +[ENFORCR] +Volante + +[SECURI] +Securicar + +[BANSHEE] +Banshee + +[PREDATR] +Predator + +[BUS] +Autobus + +[RHINO] +Rhino + +[BARRCKS] +Caserma OL + +[CUBAN] +Cuban Hermes + +[HELI] +Elicottero + +[DODO] +Dodo + +[COACH] +Pullman + +[CABBIE] +Vecchio taxi + +[STALION] +Stallion + +[RUMPO] +Rumpo + +[RCBANDT] +Bandit radiocomandato + +[ROMERO] +Carro funebre di Romero + +[PACKER] +Packer + +[ADMIRAL] +Admiral + +[SQUALO] +Squalo + +[SEASPAR] +Sea Sparrow + +[PIZZABO] +Pizza Boy + +[GANGBUR] +Gang Burrito + +[TROPIC] +Tropic + +[SPEEDER] +Speeder + +[REEFER] +Reefer + +[FLATBED] +Flatbed + +[YANKEE] +Yankee + +[CADDY] +Caddy + +[ZEBRA] +Taxi Zebra + +[TOPFUN] +Top Fun + +[SKIMMER] +Skimmer + +[PCJ600] +PCJ 600 + +[PHOENIX] +Phoenix + +[FAGGIO] +Faggio + +[FREEWAY] +Freeway + +[RCBARON] +Baron radiocomandato + +[RCRAIDE] +Raider radiocomandato + +[GLENDAL] +Glendale + +[OCEANIC] +Oceanic + +[SANCHEZ] +Sanchez + +[SPARROW] +Sparrow + +[LOVEFIS] +Love Fist + +[COASTG] +Coast Guard + +[DINGHY] +Dinghy + +[HERMES] +Hermes + +[SABRE] +Sabre + +[SABRETU] +Sabre Turbo + +[WALTON] +Walton + +[REGINA] +Regina + +[COMET] +Comet + +[DELUXO] +Deluxo + +[BURRITO] +Burrito + +[SPAND] +Spandex Express + +[MARQUIS] +Marquis + +[BAGGAGE] +Baggage Handler + +[KAUFMAN] +Taxi Kaufman + +[COASTMA] +Coastguard Maverick + +[MAVERIC] +Maverick + +[RANCHER] +Rancher + +[FBIRANC] +FBI Rancher + +[VIRGO] +Virgo + +[GREENWO] +Greenwood + +[HOTRING] +Hotring Racer + +[BLISTAC] +Blista Compact [FEST_DF] -Dist. percorsa a piedi (miglia) +Distanza a piedi (miglia) [FEST_DC] -Dist. percorsa in macchina (miglia) +Distanza in auto (miglia) [FESTDFM] -Distanza percorsa a piedi (m) +Distanza a piedi (metri) [FESTDCM] -Distanza percorsa in macchina (m) +Distanza in auto (metri) + +[TOT_DIS] +Distanza totale (miglia) + +[TOTDISM] +Distanza totale (metri) + +[DISTHEL] +Distanza in elicottero (miglia) + +[DISTHEM] +Distanza in elicottero (metri) + +[DISTBOA] +Distanza in barca (miglia) + +[DISTBOM] +Distanza in barca (metri) [FEST_LS] Persone salvate in ambulanza @@ -2803,440 +2267,1592 @@ Criminali uccisi in missioni Vigilante [FEST_FE] Incendi estinti -[FEST_LF] -Volo più lungo con il Dodo - -[FEST_BD] -Tempo migliore disinnesco bomba - [FEST_RP] -Violenze completate - -[FEST_CN] -Miglior tempo rimasto in 'Karmageddon' - -[FEST_TR] -Uccisioni max in 'RC contro la Triade' +Violenze eseguite [FEST_MP] Missioni completate +[FEST_BB] +Bling-bling Scramble: + [FEST_H0] -Maggior numero di checkpoint +Maggior numero di punti di controllo [FEST_GC] Auto delle gang distrutte: +[FEST_H1] +Distruzione Diablo + +[FEST_H2] +Massacro Mafioso + +[FEST_H3] +Calamità al Casinò + +[FEST_H4] +Demolizioni Rumpo + [USJ] -~w~BONUS ACROBAZIA UNICA! - -[USJ_FAL] -~w~ACROBAZIA UNICA FALLITA! - -[HM1_1] -~g~Uccidi 20 Purple Nine in 2 minuti e 30 secondi. - -[KM1_8A] -Premi~h~ ~k~ ~PDFW~ ~w~per ~h~attivare la bomba:~w~ ricorda di allontanarti! - -[KM1_8D] -Premi~h~ ~k~ ~PDFW~ ~w~per ~h~attivare la bomba:~w~ ricorda di allontanarti! +BONUS ACROBAZIA UNICA! [RATNG1] -CITTADINO ONESTO +Cittadino onesto [RATNG2] -SCONOSCIUTO +Sconosciuto [RATNG3] -PEZZENTE +Pezzente [RATNG4] -FURFANTE +Furfantello [RATNG5] -VANDALO +Vandalo [RATNG6] -FACTOTUM +Fattorino [RATNG7] -BORSEGGIATORE +Borsaiolo [RATNG8] -CLEPTOMANE +Cleptomane [RATNG9] -TEPPISTA +Teppista [RATNG10] -LADRUNCOLO +Ladruncolo + +[RATNG11] +Sanguisuga [RATNG12] -TRUFFATORE +Truffatore [RATNG13] -FARABUTTO +Farabutto [RATNG14] -INFORMATORE +Informatore [RATNG15] -IMBROGLIONE +Imbroglione [RATNG16] -BULLO +Bullo [RATNG17] -CANAGLIA +Canaglia [RATNG18] -SCAPESTRATO +Scapestrato [RATNG19] -RUFFIANO +Ruffiano [RATNG20] -FUORILEGGE +Fuorilegge [RATNG21] -DELINQUENTE +Delinquente [RATNG22] -LADRO +Ladro [RATNG23] -SCAGNOZZO +Scagnozzo [RATNG24] -TIRAPIEDI +Tirapiedi [RATNG25] -AVANZO DI GALERA +Avanzo di galera [RATNG26] -EX DETENUTO +Ex galeotto [RATNG27] -CRIMINALE +Criminale [RATNG28] -PICCHIATORE +Picchiatore [RATNG29] -SPIONE +Saggio [RATNG30] -AUTISTA +Autista [RATNG31] -GUARDIA DEL CORPO +Guardia del corpo [RATNG32] -ATTACCABRIGHE +Attaccabrighe [RATNG33] -CACCIATORE DI TAGLIE +Cacciatore di taglie [RATNG34] -VIGILANTE +Vigilante [RATNG35] -RONIN +Ronin [RATNG36] -RIPARATORE +Riparatore [RATNG37] -SICARIO +Sicario [RATNG38] -SOCIO +Socio [RATNG39] -MACELLAIO +Macellaio [RATNG40] -PULITORE +Pulitore [RATNG41] -ASSASSINO +Assassino [RATNG42] -CONSIGLIERE +Consigliere [RATNG43] -UOMO D'ONORE +Consulente [RATNG44] -BRACCIO DESTRO +Braccio destro [RATNG45] -ESECUTORE +Esecutore [RATNG46] -TENENTE +Tenente [RATNG47] -AIUTANTE DEL BOSS +Aiutante del boss [RATNG48] -CAPO +Capo [RATNG49] -BOSS +Boss [RATNG50] -INTOCCABILE +Intoccabile [RATNG51] -DON +Don [RATNG52] -PADRINO - -[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 - -[DETON] -DETONAZIONE - -[RCBOMB1] -RC contro la Triade - -[RECORD] -~w~Nuovo record: ~1~ uccisioni! - -[NRECORD] -~r~Non hai battuto il record precedente di ~1~ uccisioni! - -[RCBOMBF] -~r~Sei sceso dal furgone! - -[RC_2] -Hai 2 minuti per far esplodere il maggior numero possibile di macchine della Mafia! - -[RC_3] -Hai 2 minuti per far esplodere il maggior numero possibile di macchine della Yakuza! - -[RC_4] -Hai 2 minuti per far esplodere il maggior numero possibile di macchine degli Yardie! - -[RC_5] -Hai 2 minuti per far esplodere il maggior numero possibile di macchine degli Hood! - -[RC_6] -Hai 2 minuti per far esplodere il maggior numero possibile di macchine del Cartello! - -[RAMPKA] -~w~Hai bisogno di un veicolo per questa violenza. +Re della fottuta città [PAGE_00] . -[TURTXT] -Mobile Massacre! - -[TURPASS] -~w~Massacro completato! - -[TUR3D] -~w~Danni - -[FTFRENZ] -Furia camion dei pompieri - [WELCOME] BENVENUTO A [TSCORE] -~w~GUADAGNI TOTALI: ~1~ $ +GUADAGNI: ~1~$ -[PBOAT_1] -Premi~h~ ~k~ ~VEWEP~ ~w~per sparare con i cannoni della nave. +[PBOAT_2] { reVC update } +Premi il ~h~~k~~VEHICLE_FIREWEAPON~~w~ per sparare con i cannoni della barca. -[HM2_1] -Usa le buggy RC per distruggere le macchine blindate. Premi~h~ ~k~ ~VEWEP~ ~w~per farle esplodere. +[HJSTAT] +Distanza: ~1~.~1~m Altezza: ~1~.~1~m Ribaltamenti: ~1~ Rotazioni: ~1~_ -[HM2_1A] -Usa le buggy RC per distruggere le macchine blindate. Premi~h~ ~k~ ~VEWEP~ ~w~per farle esplodere. +[HJSTATW] +Distanza: ~1~.~1~m Altezza: ~1~.~1~m Ribaltamenti: ~1~ Rotazioni: ~1~_ E che grande atterraggio! -[HM2_2] -~r~Non sei riuscito a distruggere tutte le macchine blindate! - -[HM2_6] -~g~Macchina blindata distrutta! - -[FESZ_UC] -ANNULLA - -[FEDS_SM] -L1,R1 - CAMBIA MENU - -[FEDS_AS] -;=- CAMBIA SELEZIONE - -[FEDSAS2] -<>-CAMBIA SELEZIONE - -[FEDS_SS] -L1,R1 - CAMBIA SELEZIONE - -[FEDSSC1] -;-SCORRIMENTO VELOCE - -[FEDSSC2] -=-FERMA SCORRIMENTO - -[FES_LOF] -Caricamento fallito. - -[FES_SLO] -IL SALVATAGGIO - -[FES_ISC] -È DANNEGGIATO - -[FESZ_TI] -SALVATAGGIO Z1 - -[FESZ_SA] -Salva partita - -[MC_LDFL] -Caricamento fallito! - -[MC_NWRE] -Riavvio del gioco in corso. - -[BIFP_1] -~w~Ahia! Distanza della caduta: ~1~.~1~ m - -[BIFP_1F] -~w~Ahia! Distanza della caduta: ~1~.~1~ piedi - -[DIAB1_5] -TEMPO DI GARA: - -[F_FAIL1] -~r~Missione Pompiere terminata. - -[F_CANC] -~r~Missione Pompiere annullata! - -[F_FAIL3] -~r~Sei arrivato tardi! - -[F_FAIL4] -~r~Uno dei passeggeri è morto! - -[F_FAIL5] -~r~Una delle macchine è stata distrutta! - -[F_FAIL6] -~r~L'auto è stata distrutta! - -[F_EXTIN] -Incendi - -[A_CANC] -~r~Missione Paramedico annullata! - -[ALEVEL] -~w~Missione Paramedico livello ~1~ - -[A_FAIL1] -~r~Missione Paramedico terminata. +[ATUTOR] +Premi il ~h~~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Infermiere. [FEST_HA] -Livello massimo 'Paramedico' - -[A_SAVES] -~w~PERSONE SALVATE: ~1~ +Livello massimo della missione Infermiere [C_KILLS] -~w~CRIMINALI UCCISI: ~1~ +CRIMINALI UCCISI: ~1~ -[F_START] -~b~Veicolo in fiamme ~w~avvistato nella zona di ~a~. Vai a spegnere il fuoco. +[HJSTATF] +Distanza: ~1~ piedi Altezza: ~1~ piedi Ribaltamenti: ~1~ Rotazioni: ~1~_ -[F_STAR1] -~b~Veicoli in fiamme ~w~avvistati nella zona di ~a~. Vai a spegnere i fuochi. +[HJSTAWF] +Distanza: ~1~ piedi Altezza: ~1~ piedi Ribaltamenti: ~1~ Rotazioni: ~1~_ E che grande atterraggio! -[F_REWAR] -~w~INCENDIO SPENTO! Livello ~1~ completato. Ricompensa: ~1~$ +[CRED001] +ROCKSTAR NORTH + +[CRD001A] +DIRETTORE DELLO STUDIO + +[CRD001B] +ANDREW SEMPLE + +[CRED002] +PRODUTTORE + +[CRD002A] +DIRETTORE DI SVILUPPO + +[CRED003] +LESLIE BENZIES + +[CRED004] +DIRETTORE ARTISTICO + +[CRED005] +AARON GARBUT + +[CRED006] +DIRETTORI TECNICI + +[CRED007] +OBBE VERMEIJ + +[CRED008] +ADAM FOWLER + +[CRED010] +ANDREW DUTHIE + +[CRED011] +CRAIG FILSHIE + +[CRED012] +WILLIAM MILLS + +[CRED013] +CHRIS ROTHWELL + +[CRD013A] +IMRAN SARWAR + +[CRD013B] +JAMES WORRALL + +[CRD013C] +JOHN HAIME + +[CRED014] +SCRITTO DA + +[CRED015] +JAMES WORRALL + +[CRED016] +PAUL KUROWSKI + +[CRED017] +DAN HOUSER + +[CRED018] +PROGETTAZIONE PERSONAGGI PRINCIPALI + +[CRD018A] +PROGETTAZIONE PERSONAGGI + +[CRED019] +IAN MCQUE + +[CRD019A] +TOKS SOLARIN + +[CRD019B] +ALAN DAVIDSON + +[CRED020] +ANIMATORE CAPO + +[CRED021] +ALEX HORTON + +[CRD022A] +ANIMATORI + +[CRED022] +LEE MONTGOMERY + +[CRD022B] +DUNCAN SHIELDS + +[CRD022C] +GUS BRAID + +[CRED023] +PROGETTAZIONE VEICOLI + +[CRD023A] +JOLYON ORME + +[CRD023B] +ALAN DUNCAN + +[CRD024A] +CAPO PROGETTAZIONE VEICOLI + +[CRED024] +PAUL KUROWSKI + +[CRED025] +PROGETTAZIONE MAPPA + +[CRED026] +ADAM COCHRANE + +[CRED027] +NIK TAYLOR + +[CRED028] +GARY MCADAM + +[CRED029] +KEIRAN BAILLIE + +[CRED030] +ALISDAIR WOOD + +[CRED031] +ANDREW SOOSAY + +[CRD031A] +STEVEN MULHOLLAND + +[CRD031B] +WAYLAND STANDING + +[CRD031C] +CAMPBELL J. DICK + +[CRD031D] +PROGETTAZIONE GRAFICA + +[CRD031E] +STUART PETRI + +[CRED032] +PROGRAMMATORE CAPO + +[CRD032A] +PROGRAMMATORI + +[CRED033] +ALEXANDER ROGER + +[CRED034] +GRAEME WILLIAMSON + +[CRED035] +BARANE CHAN + +[CRED036] +DEREK PAYNE + +[CRED037] +GORDON YEOMAN + +[CRD037A] +ALAN CAMPBELL + +[CRD037B] +MARK HANLON + +[CRD037C] +ANDRZEJ MADAJCZYK + +[CRED038] +CAPO PRODUZIONE MUSICA + +[CRED039] +CRAIG CONNER + +[CRED040] +STUART ROSS + +[CRED041] +CAPO INGEGNERE AUDIO + +[CRED042] +ALLAN WALKER + +[CRD041A] +INGEGNERE AUDIO + +[CRD041B] +AUDIO + +[CRD042A] +WILL MORTON + +[CRED043] +PROGRAMMATORE AUDIO + +[CRED044] +RAYMOND USHER + +[CRED045] +RESPONSABILE TESTING + +[CRED046] +CRAIG ARBUTHNOTT + +[CRED047] +CAPO CQ + +[CRED048] +NEIL CORBETT + +[CRED049] +KEVIN WONG + +[CRED050] +CQ + +[CRED051] +DAVID BEDDOES + +[CRED052] +DAVID WATSON + +[CRED053] +BARRY CLARK + +[CRED054] +ROSS SPARROW + +[CRED055] +JAMES ALLAN + +[CRED056] +NEIL MEIKLE + +[CRD056A] +GEORGE WILLIAMSON + +[CRD056B] +MATT JONES + +[CRD056C] +ROB HARBOUR + +[CRD056D] +TOM WHITTAKER + +[CRED057] +CAPO SUPPORTO TECNICO + +[CRED058] +LORRAINE ROY + +[CRD057A] +SUPPORTO TECNICO + +[CRED059] +CHRISTINE CHALMERS + +[CRD060A] +SUPPORTO UFFICIO + +[CRD060B] +KIM GURNEY + +[CRD060C] +CASSIE OLIVER + +[CRED060] +ROCKSTAR NEW YORK + +[CRED061] +PRODUTTORE ESECUTIVO + +[CRED062] +SAM HOUSER + +[CRED063] +PRODUTTORE + +[CRED064] +DAN HOUSER + +[CRED065] +VP DI SVILUPPO + +[CRED066] +JAMIE KING + +[CRED067] +CAPO RESPONSABILE TECNOLOGICO + +[CRED068] +GARY J. FOREMAN + +[CRED069] +PRODUTTORE ASSOCIATO + +[CRED070] +JEREMY POPE + +[CRD071A] +DIRETTORE DEL CQ + +[CRD072A] +JEFF ROSA + +[CRED071] +SUPERVISORE MUSICA + +[CRED072] +TERRY DONOVAN + +[CRED073] +SQUADRA DI PRODUZIONE + +[CRED074] +TERRY DONOVAN + +[CRED075] +JENNIFER KOLBE + +[CRED076] +JENEFER GROSS + +[CRED077] +LAURA PATERSON + +[CRED078] +JEFF CASTANEDA + +[CRED079] +JERONIMO BARRERA + +[CRED080] +CARLY SLATER + +[CRED081] +JUNG KWAK + +[CRED082] +BRIAN WOOD + +[CRED083] +RENAUD SEBANNE + +[CRED084] +RICHARD KRUGER + +[CRD084A] +DANIEL EINZIG + +[CRD084B] +JACEN BURROWS + +[CRD084C] +LINN PR + +[CRD084D] +GRAFICA DI COPERTINA + +[CRD084E] +STEPHEN BLISS + +[CRED085] +KENT PAUL'S 80 NOSTALGIA ZONE + +[CRED086] +COMPOSTA DA DAN HOUSER + +[CRD086A] +PRODOTTA DA ADAM TEDMAN + +[CRED087] +WWW.KENTPAUL.COM E WWW.VICECITY.COM + +[CRED088] +CREATO DA + +[CRD088A] +ADAM TEDMAN + +[CRD088B] +DAVID YU + +[CRD088C] +JERRY LUNA + +[CRD088D] +STUART PETRI + +[CRD088E] +MICHAEL CARNEVALE + +[CRD088F] +GREG LAU + +[CRD088G] +FUTABA HAYASHI + +[CRED089] +RESPONSABILE CQ + +[CRED090] +CRAIG ARBUTHNOTT + +[CRED091] +CAPO ANALISTA + +[CRED092] +ADAM DAVIDSON + +[CRD092A] +JOE HOWELL + +[CRD092B] +MARC FERNANDEZ + +[CRED093] +ANALISTA DI GIOCO + +[CRED094] +RICHARD HUIE + +[CRED095] +SQUADRA TESTING ROCKSTAR + +[CRED096] +LANCE WILLIAMS + +[CRED097] +JOE GREENE + +[CRED098] +BRIAN PLANER + +[CRD098A] +ELIZABETH SATTERWHITE + +[CRD098B] +JAMEEL VEGA + +[CRD098C] +MIKE HONG + +[CRED099] +LEE CUMMINGS + +[CRED100] +SCENEGGIATURA + +[CRED101] +JAMES WORRALL + +[CRED102] +DAN HOUSER + +[CRED103] +ADAM TEDMAN + +[CRED104] +PAUL YEATES + +[CRED105] +JENEFER GROSS + +[CRED106] +LAURA PATERSON + +[CRED107] +SEQUENZE ANIMATE + +[CRED108] +SCRITTE DA DAN HOUSER E JAMES WORRALL + +[CRED109] +DIREZIONE AUDIO DI DAN HOUSER E NAVID KHONSARI + +[CRED110] +PRODOTTE DA JAMIE KING + +[CRD110A] +RICERCA TALENTI: JAMIE KING, SEAN MACALUSO + +[CRED111] +CAST + +[CRD111A] +PERSONAGGI PRINCIPALI + +[CRED112] +TOMMY VERCETTI - RAY LIOTTA + +[CRED113] +KEN ROSENBERG - WILLIAN FICHTNER + +[CRED114] +SONNY FORELLI - TOM SIZEMORE + +[CRED115] +STEVE SCOTT - DENNIS HOPPER + +[CRED116] +AVERY CARRINGTON - BURT REYNOLDS + +[CRED117] +RICARDO DIAZ - LUIS GUZMAN + +[CRED118] +LANCE VANCE - PHILIP MICHAEL THOMAS + +[CRED119] +COLONNELLO JUAN CORTEZ - ROBERT DAVI + +[CRED120] +UMBERTO ROBINA - DANNY TREJO + +[CRED121] +PHIL CASSIDY - GARY BUSEY + +[CRED122] +MITCH BAKER - LEE MAJORS + +[CRED123] +MERCEDES CORTEZ - FAIRUZA BALK + +[CRED124] +KENT PAUL - DANNY DYER + +[CRED125] +JEZZ TORRENT - KEVIN MCKIDD + +[CRED126] +CENTRALINISTA TAXI - DEBORAH HARRY + +[CRED127] +CANDY SUXX - JENNA JAMESON + +[CRED128] +BJ SMITH - LAWRENCE TAYLOR + +[CRED129] +AUNTIE POULET - YOUREE CLEOMILI HARRIS + +[CRED130] +SPACCIATORE - ARMANDO RIESCO + +[CRED131] +COUGAR - BLAYNE PERRY + +[CRED132] +HILARY - CHARLES TUCKER + +[CRED133] +DEPUTATO ALEX SHRUB - CHRIS LUCAS + +[CRED134] +VECCHIO KELLY - GEORGE DICENZO + +[CRD134A] +CAM JONES - GREG SIMS + +[CRD134B] +PSICOPATICO - HUNTER PLATIN + +[CRD134C] +MAUDE, LA SIGNORA DEI GELATI - JANE GENNARO + +[CRD134D] +JETHRO - JOHN ZURHELLEN + +[CRD134E] +GONZALES - JORGE PUPO + +[CRD134F] +DWAYNE - NAVID KHONSARI + +[CRD134G] +DICK - PETER MCKAY + +[CRD134H] +MIKE & PORNOSTAR - ROBERT CIHRA + +[CRD134I] +PERCY - RUSSELL FOREMAN + +[CRED135] +MOTION CAPTURE + +[CRED136] +ANIMATO DA + +[CRD136A] +DIREZIONE TECNICA DI ALEX HORTON + +[CRED137] +DIRETTO DA + +[CRD137A] +DIRETTO DA NAVID KHONSARI + +[CRED138] +PRODOTTO DA + +[CRD138A] +PRODOTTO DA JAMIE KING + +[CRD138B] +RENAUD SEBBANE + +[CRED139] +REGISTRATO PRESSO PERSPECTIVE STUDIOS, BROOKLYN + +[CRED140] +ATTORI MOTION CAPTURE + +[CRD140A] +BLAYNE PERRY + +[CRD140B] +JONATHON SALE + +[CRD140C] +CHARLES TUCKER + +[CRD140D] +EDDIE MARRERO + +[CRD140E] +WILLIAM MCCALL + +[CRD140F] +JORGE PUPO + +[CRD140G] +ROBERT JACKSON + +[CRD140H] +TARA RADCLIFFE + +[CRD140I] +JENIFER GAMBETESE + +[CRD140J] +KRIS ACHEVARRIA + +[CRD140K] +ALI ORDOUBADI + +[CRD140L] +KAHLEEM POOLE + +[CRED141] +DIALOGHI PEDONI + +[CRD141A] +SCRITTI DA DAN HOUSER, MARC FERNANDEZ, GILLIAN TELLING E NAVID KHONSARI + +[CRD141B] +CON L'AIUTO DI JEREMY POPE, LANCE WILLIAMS E JENNY JEMISON + +[CRED142] +SCRITTI DA + +[CRD142A] +DAN HOUSER E JAMES WORRALL + +[CRED143] +DIRETTI DA DAN HOUSER, CRAIG CONNER, MARC FERNANDEZ E ALLAN WALKER + +[CRED144] +PRODOTTI DA RENAUD SEBANNE + +[CRED145] +PEDONI + +[CRED146] +ADAM DAVIDSON, ADAM WATKINS, ALEJANDRO K. BROWN, ALEX ANTHONY SIOUKAS, ALEX GARCIA, + +[CRED147] +ALICE SALTZMAN, ALISON CIHRA, AMY SALIMA, AMY SALZMAN, ANDREA VIDELA, ANTHONY ATTI, + +[CRED148] +ANTHONY RIVERA, BIJAN SHAMS, BLAYNE PERRY, BRETT BISOGNO, BREYE MATA, BRIAN PANEN, + +[CRED149] +BROCK VODER, CAREY BERTINI, CHARISSE LAMBERT, CHRIS DIFAT, CHRIS REISENBERGER, + +[CRED150] +CHRISTOPHER BRODAY, CHRISTOPHER CARRO, CYNTHIA GREENE, DAMARIES LOPEZ, DAN LEE, + +[CRED151] +DAN SCHNEIDER, DAN TOYAMA, DAVID DEAN CHALTFIELD, JR., DAVID HARRISON, DAVID WILEY, + +[CRED152] +DEBORAH COLLINS, DEBRANDA CHANEY-GILES, DEMETRA KOUKOULAS, DENISE ROSADO, + +[CRED153] +DEVIN BENNETT, DEVIN WINTERBOTTOM, DORIS WOO, DOUGLAS HARRISON, DUNCAN COUTTS, + +[CRED154] +DUPE AJAYI, EDWIN AVELLANEDA, ELIZABETH HOWELL, ELIZABETH SATTERWHITE, ERIC NAGLE, + +[CRED155] +ESTEBAN KARPLUS, F. FONT, FUTABA HAYASHI, GENE HILGREEN, GERALD COSGROVE, + +[CRED156] +GERARD LUNA, GILLIAN TELLING, GREGG CARLUCCI, GREGORY CLERVOIX, GREGORY SCHWEIZER, + +[CRED157] +HADLEY TOMICKI, J. ROSSETT, JAMEEL VEGA, JASON JONES, JEFF ROSA, JENNIFER JEMISON, + +[CRED158] +JEREMY TAGGERT, JESSICA RIDER, JOSEPH GREENE,JOSEPH HOWELL, KATE DUKICH, + +[CRED159] +KEL O'NEILL, KEVIN HOPKINS, LADAWN JAMES, LANCE WILLIAMS, LAURA BUBBLES, + +[CRED160] +LAURA PATTERSON, LEE CUMMINGS, LETICIA L. YOUNG, LINDSAY KENNEDY, LISA ORITZ, + +[CRED161] +LORNA JORDAN, LUCIO AMADIO, MARCO FERNANDEZ, MARIKO TANAKA, MARLON MATTHEWS, + +[CRED162] +MARY TELLING, MASAYOSHI MITSUYAMA, MATTHEW CHUNG, MAX ALLSTADT, MAX BOGDANOV, + +[CRED163] +MELISSA ALVAREZ, MICHAEL MAY, MICHAEL ROTHSTEIN, MIGUEL VIDAL, MIKE FEDERLINE, + +[CRED164] +NATALIE DESCALZO, N'GAI MEMBERS, NICOLAS MALLO, NOELLE SADLER, NORBERT MORIVAN, + +[CRED165] +OSWALD GREENE, JR., PETER MCKAY, PETER APPEL, PRESTON SAVARESE, RAFAEL GONZALES, + +[CRED166] +RANDY JOHNSON, REY CONCEPCION, RICHARD KROGER, ROB TIBBS, ROBERT JACKSON, + +[CRED167] +ROBERT SCHULER, ROSS A. MCINTYRE, RUSSELL FOREMAN, RUTH NUNEZ, SALVADORE SUAZO, + +[CRED168] +SAM WHITE, SANTOS GONZALES, SCOTT SMITH, SEYMOUR FRAILMAN, SPELMAN BRAUMAN, + +[CRED169] +STEPHANIE TELLING, STEVE KNEZEVICH, STEVE ROBERT, SUMIKO YASUDA, SUSAN LEWIS, + +[CRED170] +SYLVIA COLACIOS, TOMOKO MIYAZAKI, TRON, VERDEL HALE, YVES MONDESIR, ZENO LEINFELDER, + +[CRED171] +DAVID BEDDOES, CHRISTINE CHALMERS, BARRY CLARK, NEIL CORBETT, KIM GURNEY, NEIL MEIKLE, + +[CRED172] +CASSIE OLIVER, LORRAINE ROY, DAVID WATSON, KEVIN WONG, WILL MORTON + +[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] +CONSULENZA MUSICALE + +[CRD218A] +HEINZ HENN + +[CRD218B] +STUART ROSS + +[CRED219] +COORDINATORE TRACCE AUDIO + +[CRED220] +TERRY DONOVAN + +[CRED221] +PRODUTTORI ROCKSTAR GAMES + +[CRED222] +DAN HOUSER E LAZLOW + +[CRED223] +PRODUTTORE ROCKSTAR NORTH + +[CRED224] +CRAIG CONNER + +[CRED225] +ALLAN WALKER + +[CRED226] +LAZLOW + +[CRED227] +DJ BANTER E IMAGING + +[CRED228] +SCRITTO DA DAN HOUSER E LAZLOW + +[CRED229] +FLASH FM + +[CRD229A] +TONI-MARIA CHAMBERS + +[CRD229B] +VOCE E PRODUZIONE IMAGING - JEFF BERLIN + +[CRED230] +UN RINGRAZIAMENTO SPECIALE A + +[CRED231] +TOMMY MOTTOLA, + +[CRED232] +MICHELLE ANTHONY, + +[CRED233] +STEVE BARNETT, + +[CRED234] +CHUCK FLECKENSTEIN, + +[CRED235] +RITA LIBERATOR + +[CRED236] +MARTIN & CLAIRE LOGAN + +[CRED237] +SANDRA HUTTON + +[CRED238] +CHRISTINE DAVIDSON + +[CRED239] +ALAN, RED & BIGFOOT + +[CRED240] +LE T + +[CRED241] +COLIN DONALD + +[CRED242] +KERRY STALLWOOD + +[CRED243] +ALAN MCGREGOR + +[CRED244] +CHRIS MORTON + +[CRED245] +EMIL BUSSE + +[CRED246] +EMILY BAILLIE + +[CRED247] +KEVIN ARCHIBALD + +[CRED248] +MORAG KERR + +[CRED249] +CATH WALKER + +[CRED250] +ISO BAR + +[CRED251] +WATERLINE + +[CRED252] +NEWS CAFE + +[CRD251A] +THE POND + +[CRD252A] +PIVO + +[CRED253] +BUDGET VIDEO RENTALS + +[CRED254] +LORNA'S SCOOTER + +[CRED255] +GARETH MURFIN + +[CRED256] +GRAFICA ADDIZIONALE + +[CRED257] +TONY PORTER + +[CRED258] +CRAIG MOORE + +[CRED259] +SINCRONIZZAZIONE LABIALE SEQUENZE + +[CRED260] +COSGROVE HALL FILMS + +[CRED261] +PRODUTTORE - OWEN BALLHATCHET + +[CRED262] +ANIMATORE SENIOR- JON TURNER + +[CRED263] +ANIMATORI - RICHARD DRUMM + +[CRED264] +DAVE BROWN + +[CRED265] +MAIR THOMAS + +[CRED266] +PRASHANT PATEL + +[CRED267] +CONSULENTE TECNOLOGICO AUDIO + +[CRED268] +RIK EDE DI GAMESOUND LTD. + +[CRED269] +SUPPORTO INTEGRAZIONE DTS + +[CRED270] +TED LAVERTY DI DTS + +[CRED271] +CHRIS GREER DI DTS + +[CRED272] +JASON PAGE DI DTS + +[CRED273] +RICERCA E ANALISI + +[CRED274] +VROCK + +[CRED275] +DJ: LAZLOW COME SE STESSO + +[CRED276] +VOCE IMAGING - JOE KELLY + +[CRED277] +PRODUZIONE IMAGING - JONATHAN HANST + +[CRED278] +WAVE 103 + +[CRED279] +DJ: ADAM FIRST - JAMIE CANFIELD + +[CRED280] +VOCE IMAGING - JEN SWEENEY + +[CRED281] +PRODUZIONE IMAGING - JONATHAN HANST + +[CRED282] +FEVER 105 + +[CRED283] +DJ: OLIVER 'LADYKILLER' BISCUIT - JULIUS DYSON + +[CRED284] +VOCE IMAGING MASCHILE - ED MCMANN + +[CRED285] +VOCE IMAGING FEMMINILE - SHAWNEE SMITH + +[CRED286] +PRODUZIONE IMAGING - LISTEN KITCHEN + +[CRED287] +EMOTION 98.3 + +[CRED288] +DJ: FERNANDO - FRANK CHAVEZ + +[CRED289] +VOCE IMAGING - JEN SWEENEY + +[CRED290] +PRODUZIONE IMAGING - JONATHAN HANST + +[CRED291] +RADIO ESPANTOSO + +[CRED292] +DJ: PEPE - TONY CHILRODES + +[CRED293] +WILDSTYLE + +[CRED294] +DJ: MISTER MAGIC COME SE STESSO + +[CRED295] +VOCE IMAGING - FRANK SILVESTRO + +[CRED296] +PRODUZIONE IMAGING - LAZLOW + +[CRED297] +KCHAT + +[CRED298] +SCRITTA DA DAN HOUSER E LAZLOW + +[CRED299] +PRODOTTA E MIXATA DA LAZLOW + +[CRED300] +DJ AMY SHECKENHAUSEN - LEYNA WEBER + +[CRED301] +JEZ TORRENT - KEVIN MCKIDD + +[CRED302] +MANDY - COLLEEN CORBETT + +[CRED303] +MICHELLE CARAPADIS - MARY BIRDSONG + +[CRED304] +MR.ZOO - CARL DOWLING + +[CRED305] +GETHSEMANEE - LYNN LIPTON + +[CRED306] +CLAUDE MAGINOT - JOHN MAUCERI + +[CRED307] +BJ SMITH - LAWRENCE TAYLOR + +[CRED308] +THOR - FRANK FAVA + +[CRED309] +VOCI PUBBLICITÀ + +[CRED310] +COUZIN ED, JOSH CLARK, JASON BUHRMESTER, JUAN ALLER, WAYNE OLIVER, SUSAN LEWIS, GILLIAN TELLING, TOM MURRAY, MIKE FERRANTE SR., EMMANUEL GOLDSTEIN, DAN HOUSER, NICK MANDELOS, GERRY COSGROVE, MIKE PALERMO, PORKCHOP, KEITH BROADAS + +[CRED311] +LEWIS, GILLIAN TELLING, TOM MURRAY, MIKE FERRANTE SR., EMMANUEL GOLDSTEIN, + +[CRED312] +DAN HOUSER, NICK MANDELOS, GERRY COSGROVE, MIKE PALERMO, PORKCHOP, + +[CRED313] +KEITH BROADAS + +[CRED314] +VCPR + +[CRED315] +SCRITTO DA DAN HOUSER E LAZLOW + +[CRED316] +PRODOTTO DA LAZLOW + +[CRED317] +MAURICE CHAVEZ - PHILLIP ANTHONY RODRIGUEZ + +[CRED318] +JONATHAN FREELOADER - PATRICK OLSEN + +[CRED319] +MICHELLE MONTANIUS - KELLY GUEST + +[CRED320] +DEP. ALEX SHRUB - CHRIS LUCAS + +[CRED321] +CALLUM CRAYSHAW - SEAN MODICA + +[CRED322] +JOHN F. HICKORY - LJ GANSEN + +[CRED323] +PASTOR RICHARDS - DAVID GREEN + +[CRED324] +JAN BROWN - MAUREEN SILLIMAN + +[CRED325] +BARRY STARK - RENAUD SEBBANE + +[CRED326] +JENNY LOUISE CRAB - MARY BIRDSONG + +[CRED327] +KONSTANTINOS SMITH - KONSTANTINOS.COM + +[CRED328] +JEREMY ROBARD - PETER SILVESTRO + +[CRED329] +PUBBLICITÀ RADIO + +[CRED330] +SCRITTE DA DAN HOUSER E LAZLOW + +[CRED331] +PRODOTTE DA LAZLOW + +[CRED332] +JINGLE AGGIUNTIVI PRODOTTI DA CRAIG CONNER + +[CRED333] +VOCI PUBBLICITÀ + +[CRED334] +ADAM DAVIDSON, ALEX ANTHONY, ALICE SALTZMAN, AMY SALZMAN, KATE DUKICH, + +[CRED335] +ARAN RONICLE, BARB JONES, BEN KRECH, BRIAN THOMAS, BROCK YODER, CHRIS + +[CRED336] +FERRANTE, CRAIG CONNER, DAVE RYAN, DAVID GREEN, DORIS WOO, DOUGLAS + +[CRED337] +HARRISON, ED MCMANN, FRANK CHAVEZ, FRANK FAVA, GENE HILGREEN, GREG + +[CRED338] +SCHWEIZER, HUNTER PLATIN, JAMES FERRANTE, JEFF BERLIN, JEFF ROSA, JOE KELLY, + +[CRED339] +JOHN MAUCERI, JOSH CLARK, JULIE WEMYSS, KEVIN STRALEY, KIM GURNEY, LANCE + +[CRED340] +WILLIAMS, LAURA PATERSON, LAZLOW, LISA ORTIZ, LORNA JORDAN, LUCIEN JONES, + +[CRED341] +MAUREEN SILLIMAN, MIKE FERRANTE JR., PETE GUSTIN, PETER SILVESTRO, RAFF + +[CRED342] +CROLLA, RANDY JOHNSON, RICHARD KRUGER, RON REEVE, SHELLEY MILLER, SKY, TJ ALLARD + +[CRD344A] +AUDIO REGISTRATO PRESSO DIGITAL ARTS STUDIOS, + +[CRED344] +NYC, TRACK 9 STUDIOS, NYC, + +[CRED345] +WEDDINGTON MULTIMEDIA, LOS ANGELES, + +[CRD345A] +SYNC SOUND, NYC E RADIO LAZLOW, LONG ISLAND. + +[CRED346] +UN RINGRAZIAMENTO A AXEL ERICSON E WON LEE DI DIGITAL ARTS, PAUL VASQUEZ DI TRACK 9 STUDIOS, JOHN BOWEN E JOHN HASSLER DI SYNC SOUND + +[CRED347] +MARK LLOYD + +[CRED348] +TIM BATES + +[CRED349] +KIT BROWN + +[CRED350] +ANDY MASON + +[CRED351] +PHIL DEANE + +[CRED352] +PHIL ALEXANDER + +[CRED353] +MATT HEWITT + +[CRED354] +DENBY GRACE + +[CRED355] +ANTOINE CABROL + +[CRED356] +JONOTHAN STONES + +[CRED357] +MIKE BLACKBURN + +[CRED358] +TIM MCGAFF [CINCAM] Camera mobile -[FEDS_AM] -<>-CAMBIA MENU +[RC4] +'LA FURIA DI RUMPO' -[KABOOM] -BOOM! - -[SPLAT] -SCHIACCHIATO! - -[PANCAK] -SPIATTELLATO! - -[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 +[LEGAL] +~g~Elimina la minaccia criminale! [GA_2] -~w~Motore nuovo e carrozzeria riverniciata: 100$ +Motore nuovo e carrozzeria riverniciata. Gli sbirri non ti riconosceranno! + +[HELP15] +Quando sei a piedi, premi il ~h~~k~~PED_LOOKBEHIND~~w~ per ~h~guardare indietro~w~. Usa la ~h~levetta analogica destra~w~ per ~h~guardarti attorno~w~. + +[FEC_LB4] +Guarda indietro (tasto R3) [PERPIC] Pacchetti speciali recuperati +[CO_ONE] +Pacchetto speciale ~1~ su ~1~ + [GA_21] -~w~Non puoi parcheggiare altri veicoli in questo garage. +Non puoi parcheggiare altri veicoli in questo garage. [CHEAT1] Trucco attivato @@ -3259,14 +3875,8 @@ Trucco soldi [CHEAT7] Trucco tempo atmosferico -[FEDS_BA] -tasto " - INDIETRO - -[FED_WIS] -PANORAMICO: - [USJ_ALL] -~w~TUTTE LE ACROBAZIE UNICHE COMPLETATE! +TUTTE LE ACROBAZIE UNICHE COMPLETATE [JAN] Gen @@ -3310,12024 +3920,5355 @@ Dic [BONUS] ~g~BONUS ~1~$ +[HORN1] +Premi il ~h~~k~~VEHICLE_HORN~~w~ per attivare il ~h~clacson~w~. + +[HORN2] +Premi il ~h~~k~~VEHICLE_HORN~~w~ per attivare il ~h~clacson~w~. + +[HORN3] +Premi il ~h~~k~~VEHICLE_HORN~~w~ per attivare il ~h~clacson~w~. + +[FEC_EXV] +Esci dal veicolo + [TAXI_M] -'Tassista' +'TAXI DRIVER' [COP_M] -'Vigilante' +'VIGILANTE' [FIRE_M] -'Pompiere' +'POMPIERE' [AMBUL_M] -'Paramedico' +'INFERMIERE' [HJ_IS] -~w~BONUS ACROBAZIA FOLLE: ~1~$ +BONUS ACROBAZIA FOLLE: ~1~$ [HJ_PIS] -~w~BONUS ACROBAZIA FOLLE PERFETTA: ~1~$ +BONUS ACROBAZIA FOLLE PERFETTA: ~1~$ [HJ_DIS] -~w~BONUS DOPPIA ACROBAZIA FOLLE: ~1~$ +BONUS DOPPIA ACROBAZIA FOLLE: ~1~$ [HJ_PDIS] -~w~BONUS DOPPIA ACROBAZIA FOLLE PERFETTA: ~1~$ +BONUS DOPPIA ACROBAZIA FOLLE PERFETTA: ~1~$ [HJ_TIS] -~w~BONUS TRIPLA ACROBAZIA FOLLE: ~1~$ +BONUS TRIPLA ACROBAZIA FOLLE: ~1~$ [HJ_PTIS] -~w~BONUS TRIPLA ACROBAZIA FOLLE PERFETTA: ~1~$ +BONUS TRIPLA ACROBAZIA FOLLE PERFETTA: ~1~$ [HJ_QIS] -~w~BONUS QUADRUPLA ACROBAZIA FOLLE: ~1~$ +BONUS QUADRUPLA ACROBAZIA FOLLE: ~1~$ [HJ_PQIS] BONUS QUADRUPLA ACROBAZIA FOLLE PERFETTA: ~1~$ -[HJBAD] -~w~Terribile atterraggio: avevi quasi guadagnato ~1~$! - -[HJUP] -Salute al decollo: ~1~ - -[HJDOWN] -Salute all'atterraggio: ~1~ - [FESZ_LS] Caricamento completato. -[CEDBUG1] -!!Debug Event!! +[HELI_1A] +Prova le tue abilità con lo Sparrow: scopri quanto velocemente riesci a completare il percorso. -[CEDBUG2] -!!Player is dead or not playing!! +[HELI_1B] +Percorso completato! -[CEDBUG3] -!!Player is in INDUSTRIAL level!! +[HELIODD] +Strani incarichi con l'elicottero -[CEDBUG4] -Trying to make COLLECTIVE with ~1~ +[INT2_M] +Hanno una fattoria in Panama. -[CEDBUG5] -Debug Value: ~1~ +[INT2_N] +OK, va bene, ascoltate: -[CEDBUG6] -Debug Values: A: ~1~ B: ~1~ +[INT2_O] +quando arriviamo volete che resti in macchina -[CEDBUG7] -Debug Values: A: ~1~ B: ~1~ C: ~1~ +[INT2_P] +o preferite che venga con voi altri? -[LINE] -This is Line ~1~ +[INT2_Q] +No, resta in macchina. -[MRACE08] -~w~Torna quando avrai un veicolo! +[INT2_R] +Lo sapete, ci ho pensato su. -[MRACE01] -~w~Aspetta dei rivali e poi suona il clacson per iniziare la gara! +[INT2_S] +Penso proprio che resterò in macchina. -[MRACE02] -~w~La gara inizierà quando il primo giocatore suonerà il clacson. +[INT4_A] +Fottuti! Siamo fottuti! -[MRACE05] -~r~HAI PERSO! +[INT4_B] +È sempre la stessa storia, -[MRACE07] -~r~Sei morto! Perdente! +[INT4_C] +metto fuori la testa per un maledetto secondo, -[MRACE06] -~r~Sei uno sfigato! Ti sei ritirato! +[INT4_D] +e il fato mi tira palate di merda in faccia! -[MRACE09] -~w~Torna in gara! +[INT4_E] +Bene, vaffanculo! -[MRACE10] -~w~Hai vinto (una fuga solitaria)! +[INT4_F] +Smettila di fare casino e di lamentarti. Siamo vivi, non è vero? -[MRACEPO] -Posizione +[INT4_G] +Fammi scendere qua. -[MRCPU03] -HAI INCENDIATO TUTTI I RIVALI! +[INT4_H] +Fai scomparire la macchina e fatti una bella dormita. -[MRCPU04] -STAI BRUCIANDO! ( ------- TRASHMASTER ODD-JOB MISSION ------- ) +[INT4_I] +Passerò domani a trovarti in ufficio e troveremo un modo per risolvere questo casino. -[TRASH1] -Sprint-atore ecologico +[INT4_J] +OK, mi sembra un'ottima idea, andrò a dormire. -[TRASH1A] -~w~Recupera i bidoni e porta l'immondizia alla discarica. +[INT4_K] +Che cosa intendi fare? -[TRASH1C] -~w~Il tempo partirà quando recuperi un bidone. Puoi recuperarli in QUALSIASI ORDINE. +[INT4_L] +Tornare nella mia stanza, -[TRASH1G] -~r~È troppo difficile per te? Sei immondizia! +[INT4_M] +schiarirmi le idee e risolvere questo casino. -[TRASH1H] -~r~Tempo scaduto! +[INT4_N] +OK. -[TRASH1J] -~r~Ti sei allontanato troppo dal tuo percorso! +[LAW] +MISSIONI DELL'AVVOCATO -[TRASH1K] -~w~Recupera i ~g~bidoni! +[LAW1_1] +~g~Vai a prendere degli abiti nuovi dal negozio di vestiti Rafael's. -[TRASH1L] -~w~Torna alla ~y~discarica! +[LAW4_6] +Brucia l'amministrazione! -[TRASH1M] -~w~Immondizia recuperata! +~1~ secondi +[LAW4_7] +Uccidi i responsabili! -[PCJINFO] -~w~Passa tutti i 25 ~y~checkpoint~w~ entro ~1~ secondi. +[LAW4_8] +Combattere, combattere, combattere, combattere,. -[PCJFAIL] -~r~Non sei riuscito a battere il tempo di ~1~ secondi! +[LAW4_9] +Più ferie, meno lavoro! -[PCJPROM] -~w~Hai ~1~ secondi per tornare sulla ~b~moto! +[LAW4_11] +Combattere, combattere, combattere, combattere,. -[PCJPRO1] -~w~Hai ~1~ secondo per tornare sulla ~b~moto! +[LAW4_12] +Viva la rivoluzione. -[PCJDEST] -~r~Moto distrutta! +[GENERAL] +MISSIONI DEL COLONNELLO -[PCJRET] -~r~Non sei riuscito a tornare alla moto. +[GEN3_4] +Tommy Vercetti. Andiamo... -[PCJTIME] -~r~Il tempo è scaduto! +[GEN3_13] +Che cosa diavolo ti prende? Vai sul tetto dall'altra parte del cortile prima che arrivino! -[PCJCHEC] -~w~Checkpoint ~1~ di ~1~ +[GEN3_17] +Meeerda! Stai cercando di ammazzarmi? -[TRRACE1] -~w~Ottieni del tempo supplementare per ogni checkpoint superato... +[GEN3_21] +~g~Ha preso i soldi di Diaz! Inseguilo e riprendili! -[TRRACE3] -~w~Hai finito risparmiando ~1~ secondi! +[GEN3_24] +~r~Diaz è morto! Non sei riuscito a proteggerlo! -[TRRACE4] -~w~Hai raggiunto per primo ~1~ checkpoint su ~1~. +[GEN3_26] +~r~Hai ucciso Diaz! -[TRRACE5] -~w~Hai guadagnato ~1~$! +[GEN3_27] +~r~Hai ucciso una guardia di Diaz! -[TRRACE6] -~w~OTTIMO! Sei arrivato primo a tutti i checkpoint! Ottieni un bonus di 1.000$! +[GEN3_31] +~g~Vai all'appuntamento e proteggi Diaz. -[TRRACE7] -~r~Hai abbandonato la pista! +[GEN3_32] +~g~Raggiungi il tetto nell'edificio di fronte a Lance e appostati. -[TRRACE8] -~r~La tua moto è stata distrutta! +[COKE] +MISSIONI DEL BARONE DELLA COCA -[TRRACE9] -~r~Non sei riuscito a tornare alla moto in tempo! +[COK1_3] +Spero tu cada e ti rompa l'osso del collo! -[TRRAC10] -~r~Hai perso la tua moto! +[COK1_6] +Sono stanco di tutto questo. -[TRRAC11] -~r~Il tempo è scaduto! +[COK2_7] +Vedi quei segnali, ragazzo? Cerca di colpire le luci! -[ANG] -Avenging Angels +[COK2_10] +Di certo sei più bravo a sparare che a parlare. -[ANG_1] -~w~Ehi amico! Vogliamo ripulire questa città dal crimine! +[COK2_11] +Grazie. Anche tu hai una bella parlantina. -[ANG_2A] -Premi~h~ ~k~ ~TGSUB~ ~w~per unirti agli Avenging Angels. +[COK2_12] +Lo so, Tommy. -[ANG_3] -~w~Io e te potremmo fare nostra questa città. Ma, ehm... meglio comunque chiedere un po' d'aiuto. +[COK2_18] +Ti diverti con Kenny Loggins. -[ANG_3A] -~w~Fermati vicino ad altri Avenging Angels per farli unire alla tua gang. +[COK2_19] +Cielo, adoro questo album! -[ANG_4] -~w~Yo! Mi sono messo questa divisa per spaccare un po' di ossa. Andiamo! +[COK2_26] +~r~Hai ucciso Lance! -[ANG_5] -~w~Conta su di me... +[COK3_1] +Non sparare, amico! -[ANG_6] -~w~Bruciamo un po' di feccia! +[COK3_2] +Che cosa sta succedendo? -[ANG_7] -~w~Pestare è il massimo! +[COK3_3] +Sta prendendo la barca. Farabutto! -[ANG_7A] -~w~Sei contento? +[COK3_4] +Aiuto! Un idiota sta rubando la barca! -[ANG_7B] -~w~Non abbiamo bisogno di bulli per le nostre strade! +[COK4_W] +Uugghh! Questo è l'ultimo. -[ANG_7C] -~w~Non nel mio quartiere! +[COK4_X] +Vado ad accendere... -[ANG_7D] -~w~È ora di contrattaccare! +[COK4_Y] +A quanto sembra abbiamo dei nuovi amici. -[ANG_7E] -~w~In questa città noi siamo la legge! +[COK4_2] +Sì. -[ANG_8] -Tempo rimasto +[COK4_6] +Sai dove stiamo andando? -[ANG_9] -~w~Tempo prolungato! +[COK4_7] +Ci siamo persi? -[ANG_10] -~r~Il tempo è scaduto! +[COK4_8] +Abbiamo un po' di competizione! -[ANG_11] -~w~C'è della gente 'sgradita' nei paraggi... diamo loro una lezione. +[COK4_9] +Falli fuori! -[ANG_12] -~w~Una folla scatenata ha invaso le strade. Riportiamo l'ordine! +[COK4_9A] +È giunta l'ora di un po' di Lance Vance Dance! -[ANG_13] -~w~Questa città sta andando a rotoli. La gente crede di poter manifestare liberamente? Gliela faremo vedere! +[COK4_10] +Sono pronti per il macero! E per sfamare i pesci. -[ANG_13A] -~w~Abbiamo avvistato una gang pericolosa che opprime la gente nelle strade.... +[COK4_11] +Ce l'abbiamo fatta! Le altre imbarcazioni non sono della nostra classe. -[ANG_14] -~w~È stato segnalato un altro crimine... Andiamo! +[COK4_17] +Stanno iniziando a pregare! -[ANG_16] -~w~Sono state avvistate alcune persone parcheggiare irregolarmente. ANDIAMO! +[COK4_18] +I miei piedi sono bagnati! STIAMO IMBARCANDO ACQUA! -[ANG_16A] -~w~Ci sono dei buoni a nulla che bighellonano in giro. È ora di fare un po' di pulizia. +[COK4_21] +Ponte in arrivo! -[ANG_OBJ] -~w~Fai fuori quella fastidiosa ~r~gang. +[COK4_22] +Lanciati, sta per esplodere! -[ANG_17] -~w~Ben fatto amico! Grazie a te, questo quartiere è stato ripulito dal crimine. Per il momento... +[COK4_23] +Bel colpo! -[ANG_18] -~w~Se la stanno svignando! +[COK4_29] +~r~Hai ucciso Lance! -[ANG_19] -~w~Cerca degli Avenging Angels e fermati vicino a loro per portarli in missione. +[ASS1_6] +Vai Tommy, andrà tutto bene! -[ANG_20] -~w~Stanno scappando! +[ASS1_7] +Beccatevi questo, maledetti assassini! -[ANG_21] -~w~Non lasciamoli fuggire! +[ASS1_8] +Sono bloccato! -[VIC1] -Casa dolce casa +[ASS1_9] +Ti copro io Tommy! -[VIC2] -Il pigro +[ASS1_10] +Ehi, questo sì che è un bel confine alberato. -[VIC3] -Vendetta spacciatrice +[ASS1_11] +Ehi Tommy, posso avere la stanza con la vista sulla baia? -[VIC4] -Snuff +[ASS1_12] +Che bel soffitto alto che c'è qui... -[VIC5] -Chi rompe paga +[ASS1_3] +Lance! Ho bisogno di copertura! -[VIC6] -Chiavi in mano +[ASS1_5] +Lance! -[VIC7] -Non aprite quel porto +[ASS1_15] +~g~Distruggi la dimora e uccidi Diaz! -[MAR1] -Shopping asfissiante +[ASS1_17] +~g~Sono disponibili più strade all'interno della villa. -[MAR2] -Portata a spasso +[TAXWAR] +MISSIONI GUERRA DEI TAXI -[MAR3] -Un premio corposo +[NOTAXI] +~g~Hai bisogno di un taxi Kaufman per attivare questa missione. -[MAR4] -Biker in calore +[TAXW1_5] +~g~Devi avere un taxi Kaufman! -[MAR5] -Overdose di problemi +[TAX2_4] +Forza, Tommy. -[SAL1] -L'offerta +[TAX2_5] +Riempilo di botte! -[SAL2] -Puttan tour! +[TAX2_6] +Non ha neppure il permesso. -[SAL3] -Strizza +[TAX2_7] +Maledetti servizi di limousine. -[SAL4] -Montagne russe +[TAXW3_1] +~g~Vai a prendere Mercedes. -[SAL5] -Contrabbando +[RACE1] +~g~3..2..1.. VIA VIA VIA! -[SAL6] -Sabotaggio Sindacco +[RACE2] +~g~3 -[SAL7] -Problema di Triade +[RACE3] +~g~2 -[SAL8] -A spasso con Leone +[RACE4] +~g~1 -[JDT1] -Il puttaniere +[RACE5] +~g~VIA! -[JDT2] -Amici in 5 minuti +[FIRST] +~b~PRIMO -[JDT3] -Una situazione esplosiva +[SECOND] +~b~SECONDO -[JDT4] -Bambole a scoppio +[THIRD] +~b~TERZO -[JDT5] -Il salvatore di Salvatore +[FOURTH] +~b~QUARTO -[JDT6] -I cannoni di Leone +[RACETM] +~b~TEMPO DI GARA: ~1~:~1~ -[JDT7] -La calma prima della tempesta +[RACETM2] +~b~TEMPO DI GARA: ~1~:0~1~ -[JDT8] -Uomo d'onore +[RACEFA] +~r~Non sei riuscito a vincere la gara! -[MAC1] -Moda bimbo +[TEX1_5] +~r~È riuscito a fuggire! -[MAC2] -Grosso casino a Chinatown +[SEG3_1] +TEMPO: -[MAC3] -Grease Sucho +[SEG3_2] +~g~Raggiungi il van che contiene il Raider radiocomandato e le bombe a tempo. -[MAC4] -Carne morta +[SEG3_3] +~g~Devi utilizzare il RAIDER RADIOCOMANDATO per trasportare le 4 bombe nelle 4 aree bersaglio all'interno del cantiere. -[MAC4_0] -Casa +[SERG3_5] +~g~Puoi trasportare solo una bomba alla volta e non puoi raccogliere dell'esplosivo correttamente posizionato. -[MAC5] -Figlio di nessuno +[SEG3_7] +~g~Una volta posizionata la PRIMA bomba con successo su di un bersaglio, partirà il conto alla rovescia, dovrai piazzare tutti gli esplosivi entro il tempo limite. -[SALH1] -Giustizia tosta +[SEG3_8] +~g~Le 4 bombe devono essere tutte posizionate su ognuno dei bersagli per passare la missione e demolire l'edificio. -[SALH2] -La morte chiama +[SEG3_9] +~g~Bomba piazzata! Ancora 3. -[SALH3] -Shogun Showdown +[SEG3_10] +~g~Bomba piazzata! Ancora 2. -[SALH4] -Un giorno da Leone +[SEG3_11] +~g~Bomba piazzata! Ne manca una sola. -[SALH4_V] -~r~v1,1 +[SEG3_12] +~g~Bomba NON piazzata! Recupera l'esplosivo! -[SALH5] -Scacco siculo +[SEG3_13] +~g~Piazza la bomba nella zona bersaglio. -[SALH5_V] -~r~v1,1 +[SEG3_14] +~r~Tempo esaurito: hai fallito nel demolire l'edificio. -[DONH1] -Arraffa l'arraffatore +[SEG3_15] +~r~Il Raider radiocomandato è stato distrutto! Come farai adesso a trasportare le bombe? -[DONH2] -Ferma la stampa +[AVERY] +MISSIONI DI AVERY -[DONH3] -Il festino cadaverico si rianima +[ASM] +MISSIONI DA SICARIO -[DONH4] -Un'offerta bomba +[ASM_1] +MISSIONE DA SICARIO 1 -[DONH5] -Disturbo della quiete pubblica +[ASM1_1] +~g~Mr. Teal, il tuo aiuto nello sradicare gli stranieri è stato inestimabile per il nostro lavoro. Ho un altro lavoro con un contatto più 'diretto'. I dettagli sono stati attaccati sotto al telefono. -[DONH6] -Love fuggiasco +[ASM1_2] +~g~Raggiungi il telefono pubblico presso il Mall in Washington Beach. -[TOSH1] -Il sesso debole +[ASM1_3] +~g~Carl Pearson, fattorino di una pizzeria. Non deve completare le sue consegne. -[TOSH2] -Scotto col botto +[ASM1_4] +~g~Uccidi il fattorino prima che possa completare le sue consegne. -[TOSH2F0] -~r~Un furgone ha raggiunto il covo della Yakuza! +[ASM_2] +MISSIONE DA SICARIO 2 -[TOSH2F1] -~r~Il convoglio ha raggiunto il covo dalla Yakuza! +[ASM_3] +MISSIONE DA SICARIO 3 -[TOSH2F2] -~r~Non hai distrutto i portavalori! +[ASM3_A] +Marcus Hammond, Franco Carter, Dick Tanner, Nick Kong e Stuntman Driver fanno tutti parte di un'associazione europea che si sta preparando a commettere una rapina. -[TOSH2M0] -~w~Fuori uno! +[ASM3_B] +Si trovano tutti nella loro posizione pronti all'azione. Voglio che vengano tutti eliminati prima che inizi il colpo. Ho disposto delle utili armi nei paraggi. -[TOSH2M1] -~w~Fuori un altro! +[ASM3_1] +~g~Recupera le armi che Mr. Black ha lasciato per te. -[TOSH3] -La morte all'opera +[ASM3_2] +~g~Non avvicinarti troppo, se no il bersaglio potrebbe vederti. -[TOSH4] -Kazuki dorme con le fishes +[ASM3_3] +~g~Per un'eliminazione più rapida, colpisci da una locazione vicino alle loro postazioni ed evita di farti vedere. -[PO_MOB1] -~w~Toni? Sono la mamma! +[ASM3_4] +~g~Ti ha visto! Fallo fuori il prima possibile! -[POMOB1A] -~w~Da quanto tempo sei tornato in città? +[ASM3_5] +~g~Marcus Hammond si trova presso dei cartelli pubblicitari in Washington. -[POMOB1B] -~w~Perché non sei ancora venuto a trovarmi? +[ASM3_6] +~g~Franco Carter si trova presso la DBP Security vicino a Ocean Drive. -[POMOB1C] -~w~Cos'hai che non va? +[ASM3_7] +~g~Dick Tanner si trova presso la gioielleria in Vice Point. -[POMOB1D] -~w~Sono tua madre, per l'amor di Dio! Forza! +[ASM3_8] +~g~Nick Kong si trova presso Washington Beach. -[PO_MOB2] -~w~Ciao Fido! Sono Maria. +[ASM3_9] +~g~Stuntman Driver si trova presso Washington Beach. -[PO_MOB3] -~w~Ehi Toni! Sono JD. +[ASM3_10] +~r~Non sei riuscito a eliminarli tutti quanti. -[POMOB3A] -~w~Ho sentito tutto, stai facendo grandi cose. +[ASM_4] +MISSIONE DA SICARIO 4 -[POMOB3B] -~w~Spero solo che non ti dimenticherai del tuo vecchio amico JD quando arriverai in vetta. Vero? +[ASM4_1] +~g~Recupera il fucile che ti abbiamo lasciato tra le foglie presso il terminal dell'aeroporto. -[POMOB4A] -~w~Che cazzo vuoi? +[ASM4_2] +~g~Non mancare il bersaglio o allarmerai le sue guardie del corpo: ricorda di tenere una certa distanza per evitare di essere visto. -[POMOB4B] -~w~Qualcuno che vada a prenderti il bucato o che ti pulisca il culo? +[ASM4_3] +~g~Osserva la donna sul balcone sopra ai banconi del check-in dentro il terminal. NON UCCIDERLA. -[POMOB4C] -~w~Non fare così, ascolta. Mi dispiace per tutto... +[ASM4_4] +~g~Elimina l'uomo a cui passa la valigetta ma solo DOPO CHE L'AVRÀ RACCOLTA. Poi recupera la valigetta e portala ad Ammu-Nation in Downtown. -[POMOB4F] -~w~Una bella fetta di torta all'arsenico? +[ASM4_5] +~g~Recupera la valigetta! -[POMOB4G] -~w~Scordatelo. +[ASM4_6] +~g~Porta la valigetta ad Ammu-Nation in Downtown -[POMOB4I] -~w~Salvatore l'ha saputo e mi ha detto che dobbiamo crescere entrambi. +[ASM4_7] +~r~Hai ucciso la donna, idiota! -[POMOB4J] -~w~Io sto facendo la mia parte, mi spiace... Dai... +[ASM4_8] +~r~Il bersaglio ha sentito il colpo d'arma da fuoco! L'accordo è saltato! -[PO_MOB5] -~w~Toni? Sono Salvatore. +[ASM4_9] +~r~Il bersaglio è salito a bordo del volo! -[POMOB5A] -~w~Siamo in guai grossi! Porta qui il tuo culo il più rapidamente possibile! +[ASM4_10] +~g~Sembra tu non sia l'unico interessato alla valigetta! Portala in fretta ad Ammu-Nation! -[PO_MOB6] -~w~Anthony? Sono Salvatore. +[ASM4_11] +~r~Il bersaglio ti ha visto! L'accordo è saltato! -[POMOB6A] -~w~Hai visto Maria? +[ASM4_13] +~g~Ti ha visto e sta scappando! Uccidilo e recupera la valigetta! -[ST_MOB8] -~w~Pronto? +[ASM4_14] +~g~L'indicatore della distanza nella parte superiore destra dello schermo ti tiene informato sulla distanza dal bersaglio. Se si riempirà, verrai avvistato. -[STMOB8A] -~w~Toni? Sono Sal. +[ASM_5] +MISSIONE DA SICARIO 5 -[STMOB8B] -~w~Devo parlarti, ma non mi fido di questi cazzo di telefoni. +[KICK] +KICKSTART -[STMOB8C] -~w~Ti chiamerò dal telefono pubblico fuori dal palazzo di giustizia. +[KICK1_3] +~g~Numero di volte che hai appoggiato i piedi: ~1~ -[ST_MOB1] -~w~Toni. Sono Donald. +[KICK1_4] +~g~Penalità: ~1~ secondi -[STMOB1A] -~w~Ho delle questioni in sospeso che richiedono le tue... particolari abilità. +[BANK] +MISSIONI RAPINA -[STMOB1B] -~w~Vieni nel mio ufficio appena puoi. +[BANK1] +MISSIONE RAPINA 1 -[ST_MOB2] -~w~Pronto? +[BANK2] +MISSIONE RAPINA 2 -[STMOB2A] -~w~Cipriani? Sono io, McAffrey. +[BJM2_3] +PERCENTUALE DI CENTRI: ~1~% -[STMOB2B] -~w~Ho delle novità che Salvatore potrebbe gradire. +[BJM2_15] +PUNTEGGIO: -[STMOB2C] -~w~Vediamoci al solito posto. +[BJM2_18] +PUNTEGGIO DA BATTERE: -[ST_MOB3] -~w~Pronto? +[BJM2_19] +~g~Colpisci il maggior numero di bersagli entro il tempo limite! -[STMOB3A] -~w~Sono Sal. +[BJM2_21] +~g~Colpisci il maggior numero di bersagli finché hai ancora colpi. -[STMOB3B] -~w~Ascolta, i Forelli avevano in pugno il sindaco Hole. +[BANK3] +MISSIONE RAPINA 3 -[STMOB3D] -~w~Conosco un pezzo grosso che farebbe qualsiasi cosa per una poltrona. +[BJM3_1] +~g~Trova una macchina da corsa e posizionati sulla griglia di partenza. -[STMOB3E] -~w~È uno stronzo fatto e finito, quindi qualificato per il ruolo in questione. +[BNK4_2A] +I ragazzi dell'officina hanno fatto un ottimo lavoro su questa piccola. -[STMOB3F] -~w~Gli ho detto che lo avresti aiutato a vincere le elezioni... per noi! +[BNK4_3G] +Ommerda, abbiamo la polizia alle calcagna! -[ST_MOB4] -~w~Pronto. +[BNK4_3H] +...e non siamo ancora neanche arrivati. -[STMOB4A] -~w~Toni. Sono io, Sal. +[BNK4_3K] +Dobbiamo seminare prima la polizia... -[STMOB4B] -~w~Sento puzza di merda dei Forelli dietro a tutto questo. +[BNK4_3L] +Cristo Tommy, stai cercando di farci fuori? -[STMOB4C] -~w~Ciò che voglio sapere è perché hanno convinto il sindaco a mettermi braci bollenti sotto al culo. +[BNK4_3N] +Tutto ciò che amo finisce a pezzi! -[STMOB4D] -~w~Ascolta, dobbiamo vederci al molo. +[BNK422A] +Cam, quanto tempo? -[STMOB4E] -~w~Dobbiamo fare un po' di ricerche. +[BK4_23A] +Mi bastano 3 minuti! -[ST_MOB5] -~w~Pronto! +[BNK4_26] +Maledizione! Ecco che arrivano! -[STMOB5B] -~w~Dirigiti verso il telefono pubblico di Torrington. +[BNK4_32] +Usa l'esplosivo per aprire le cassette di sicurezza! -[STMOB5C] -~w~Ti devo parlare +[BNK4_43] +Vi copro io il culo, PARTI! -[STMOB5D] -~w~Sulla strada, voglio che ti incontri con un mio socio ad Aspatria. +[BNK4_51] +A me sembri a posto. -[STMOB5E] -~w~Ci aiuterà ad aumentare la pressione sui Forelli e sui Sindacco. +[KENT] +MISSIONI DI KENT PAUL -[ST_MOB6] -~w~Pronto? +[KENT1] +MISSIONE DI KENT PAUL 1 -[STMOB6A] -~w~Toni? Sono Sal. +[COUNT] +MISSIONI DI FALSIFICAZIONE -[STMOB6B] -~w~Vai al telefono pubblico di Liberty Campus. +[COUNT1] +MISSIONE DI FALSIFICAZIONE 1 -[STMOB6C] -~w~È importante. - -[ST_MOB7] -~w~Pronto? - -[STMOB7A] -~w~Toni? Sal. - -[STMOB7B] -~w~Vai a Belleville e cerca il telefono pubblico. - -[STMOB7C] -~w~Ci sono delle faccende urgenti da sbrigare. - -[ST_MOB9] -~w~Toni Cipriani. - -[STMOB9A] -~w~Toni? Sono la tua mamma! - -[STMOB9B] -~w~Ho sentito che sei diventato un piccolo boss! - -[STMOB9C] -~w~...non ho mai dubitato di te per un secondo, figliolo! - -[STMOB9D] -~w~...e viste le circostanze, - -[STMOB9E] -~w~ho deciso di ritirare la taglia che avevo messo su di te. - -[STMOB9F] -~w~Lasciamoci alle spalle questa faccenda. - -[STMOB9G] -~w~Dopo tutto l'ho fatto per amore. - -[STMOB9H] -~w~Ah, quale razza di figlio può spingere la propria madre fino a questo punto? - -[STMOB9I] -~w~Ci vediamo presto, non dimenticarti della tua vecchia mamma. - -[STMO10] -~w~Pronto? - -[STMO10A] -~w~Ehi osso duro, sono McAffrey. - -[STMO10B] -~w~I federali hanno catturato il tuo capo, Salvatore. - -[STMO10C] -~w~E sono veramente incazzati neri. - -[STMO10D] -~w~Gli daranno la responsabilità di qualunque crimine in questa città. - -[STMO10E] -~w~Per questo motivo, noi non ci siamo mai visti. Capito? - -[SH_MOB1] -~w~Toni...? - -[SHMOB1A] -~w~Sal? È lei? - -[SHMOB1B] -~w~Chiudete la bocca! Sto parlando con il mio avvocato! - -[SHMOB1C] -~w~Toni? ...ehm, voglio dire ...Lionel? - -[SHMOB1D] -~w~Ascolta, mi hanno preso. Incredibile. - -[SHMOB1E] -~w~Sono in un fiume di merda in piena e non ho una pagaia. - -[SHMOB1F] -~w~Perciò vieni subito qui, ci sono delle faccende che devi sbrigare. - -[SHMOB1G] -~w~...Lionel? - -[SH_MOB2] -~w~Pronto? - -[SHMOB2A] -~w~Toni? Sono Donald. - -[SHMOB2B] -~w~No, aspetta, non agganciare! - -[SHMOB2C] -~w~Ho una proposta molto eccitante da farti... - -[SHMOB2D] -~w~Passa a trovarmi alla mia attuale... um... residenza e ti spiegherò tutto. - -[SHMOB2E] -~w~Toni...? - -[SHMOB2F] -~w~Ti prego Toni, sii buono, ti sto chiamando con gli ultimi spicc... - -[SH_MOB3] -~w~Parlo con il signor Cipriani? - -[SHMOB3A] -~w~Chi è? Come ha fatto ad avere il mio numero? - -[SHMOB3B] -~w~Chi impiega saggiamente le proprie risorse, ottiene ciò che vuole. - -[SHMOB3C] -~w~Non dovrei dirglielo io, signor Cipriani. - -[SHMOB3D] -~w~Ho bisogno del suo aiuto per risolvere una faccenda delicata. - -[SHMOB3E] -~w~Aiuto che le sarà retribuito lautamente. - -[SHMOB3F] -~w~Le spiegherò tutto quando raggiungerà il mio appartamento a Torrington. - -[SH_MOB4] -~w~Toni! Sono Sal! - -[SHMOB4A] -~w~Ce l'hai fatta! Non ci posso credere, ragazzo! - -[SHMOB4B] -~w~Ci siamo quasi! - -[SHMOB4C] -~w~Vieni a trovarmi, abbiamo alcune faccende in sospeso. - -[SH_MOB5] -~w~Toni? Donald. - -[SHMOB5A] -~w~Per gestire a nostro vantaggio l'affare Panlantic dobbiamo... uhm... - -[SHMOB5B] -~w~come posso dirlo in maniera delicata... - -[SHMOB5C] -~w~'ripulire' una piccola zona di Fort Staunton. - -[SHMOB5D] -~w~Quando dici 'noi', vuoi dire 'io' vero? - -[SHMOB5E] -~w~Toni, sono un libro aperto per te. - -[SHMOB5F] -~w~Vai a trovare 8-Ball. Sono certo che potrà fornirci il materiale necessario. - -[SHMOB5G] -~w~Sono certo che potrà fornirci il materiale necessario. - -[SH_MOB6] -~w~Amico? Sono 8-Ball. - -[SHMOB6A] -~w~Il materiale è pronto per la consegna. - -[AHIT_H0] -~w~Tutto qui, testa di cazzo? - -[AHIT_H1] -~w~Al diavolo! Quando si arrederanno questi coglioni? - -[AHIT_H2] -~w~Baciami il culo, cazzone! - -[AHIT_H3] -~w~Ragazzi, mi state facendo incazzare! - -[AHIT_BI] -~w~Risparmiati le battute! Uno dei killer di mamma è vicino! - -[AHIT_TA] -~w~Tieni gli occhi aperti! Uno dei killer di mamma è vicino! - -[AHIT_BU] -~w~Attenzione! Uno dei killer di mamma sta venendo a prenderti! - -[AHIT_AM] -~w~Attenzione! Uno dei sicari di mamma ti ha avvistato! - -[AHIT_VA] -~w~Stai in guardia! Uno dei sicari di mamma è in zona! - -[AHIT_PO] -~w~Occhi aperti! Uno dei killer di mamma sta arrivando per ucciderti! - -[AHIT_CA] -~w~Attento! Uno dei sicari di mamma si sta avvicinando! - -[K_TKT] -Disfida alla discarica - -[K_TK2] -~w~Passa attraverso le mete per conquistare punti. - -[K_TK4] -~w~Conquista il maggior numero di punti prima che scada il tempo! - -[K_CD] -~w~Hai ~1~ secondi per tornare sulla tua ~b~moto! - -[K_TKP1] -~w~1 punto! - -[K_TKP2] -~w~2 punti! - -[K_TKP3] -~W~3 punti! - -[K_SC] -Punti - -[K_SCX] -~w~Hai realizzato ~1~ punti! - -[K_SCX1] -~w~Hai realizzato 1 punto! - -[K_HSC1] -~w~Nuovo record di ~1~ punti! - -[K_HSC2] -~r~Non sei riuscito a battere il record di ~1~ punti. - -[KRUSH] -Adesso guadagnerai il quadruplo dei soldi usando il demolitore! - -[KRUSH2] -Adesso guadagnerai l'ottuplo dei soldi usando il demolitore! - -[TURFAIL] -~r~LAVORO COMPLETATO! - -[TKR1] -9mm di macello - -[TKR2] -Motorino sparacchino - -[TCKILL] -Uccisioni - -[TCHEAL] -Danni - -[TC2_1] -~r~Hai ucciso il tuo autista! - -[TC2_2] -~r~Veicolo distrutto! - -[TC2_3] -~r~Tempo scaduto! - -[TC_T_E] -~w~Bersaglio eliminato! ~1~$ - -[TUP_BR] -~w~Elimina più ~r~bersagli ~w~ possibili entro il tempo limite. - -[TUP_BR2] -~w~Elimina più di ~1~ ~r~bersagli ~w~per ottenere un nuovo record! - -[TUP_AD] -~w~Hai 3 pillole di adrenalina, premi il tasto R1 per usarne una. - -[TUPSC1] -~w~Nuovo record di ~1~ uccisioni! - -[TUPSC2] -~r~Non sei riuscito a battere il record di ~1~ uccisioni. - -[MPWCS1] -The Wedding List - -[MPWCS2] -Ehi, dove sei stato? - -[MPWCS3] -Ascolta, mio figlio Joey sta per sposarsi! - -[MPWCS4] -Gli ho trovato una ragazza davvero di classe, proprio come la mia Maria... non vedo l'ora di vederli assieme! - -[MPWCS5] -Però non voglio che lei lo veda alla guida di uno di quei catorci che ripara nella sua officina. - -[MPWCS6] -Perciò dovrai cercare un veicolo degno per l'occasione. - -[MPWCS7] -Mi assicurerò che valga il tuo tempo. - -[MPTCS1] -TANKS FOR THE MEMORIES - -[MPTCS2] -Sono Sal. Ho bisogno di creare un diversivo e tu mi darai una mano. - -[MPTCS3] -C'è un carro armato parcheggiato in città. Semina il caos, non fare complimenti! - -[MPTCS4] -Voglio che la gente creda di aver pisciato per sbaglio sulla tomba di Patton. - -[MPTCS5] -Ascolta, questo diversivo è molto importante, perciò ci saranno altre persone che tenteranno di partecipare. - -[MPTCS6] -... E pagherò solamente quello che starà alla guida più tempo degli altri. - -[MPRCS1] -Street Rage - -[MPRCS2] -Sono Salvatore Leone! Il vostro benefattore pubblico. - -[MPRCS3] -...non date retta a quello che dice il ministero della giustizia! - -[MPRCS4] -Sono amico di Liberty City, sono buono e generoso. Ecco perché ho sponsorizzato la gara odierna. - -[MPRCS5] -Quanto mi costerà questa stronzata? - -[MPRCS6] -COSA? Portami al pronto soccorso, sento un dolore al petto! - -[MPHPCS2] -Sono Sal... i federali stanno controllando il mio telefono perciò devo stare attento. - -[MPHPCS3] -Ci sono una valigetta piena di bigliettoni da 100 e un elenco di nomi sotto al telefono. Indovina di cosa ho bisogno... - -[MPHPCS4] -...Aspetta! Non voglio dividere i soldi con questi stronzi. - -[MPHPCS5] -Sai cosa fare... salda il conto. - -[MPHPCS6] -Aspetta, non volevo dire 'salda il tuo di conto'... intendevo... uhm... - -[MPHPCS7] -Ascolta, uccidi tutti gli stronzi sull'elenco e basta! - -[DEB0] -DEBUG 0 - -[DEB1] -DEBUG 1 - -[DEB2] -DEBUG 2 - -[DEB3] -DEBUG 3 - -[DEB4] -DEBUG 4 - -[NUM0] -DEBUG 0 (~1~) - -[NUM1] -DEBUG 1 (~1~) - -[NUM2] -DEBUG 2 (~1~) - -[NUM3] -DEBUG 3 (~1~) - -[NUM4] -DEBUG 4 (~1~) - -[CARS] -'Venditore di macchine' +[COUNT2] +MISSIONE DI FALSIFICAZIONE 2 [BIKE] -'Venditore di moto' +MISSIONI DEI MOTOCICLISTI -[RACE_0] -Posizione +[BIKE1] +MISSIONE DEI MOTOCICLISTI 1 -[RACE_FL] -~w~GIRO FINALE +[BIKE2] +MISSIONE DEI MOTOCICLISTI 2 -[RACE_X0] -~w~Recupera una macchina e vai alla ~y~partenza! +[BIKE3] +MISSIONE DEI MOTOCICLISTI 3 -[RACE_X1] -~w~Recupera una moto e vai alla ~y~partenza! +[GOAWAY1] +Ritorna quando avrai completato le missioni per la gang di Haiti. -[RACE_X2] -~w~Hai bisogno di una macchina per correre questa gara! +[HAIT] +MISSIONI DEGLI HAITIANI -[RACE_X3] -~w~Hai bisogno di una moto per correre questa gara! +[HAIT1] +MISSIONE DEGLI HAITIANI 1 -[RACE_X4] -~w~Hai ~1~ secondi per trovare una macchina. +[HAIT2] +MISSIONE DEGLI HAITIANI 2 -[RACE_X5] -~w~Hai ~1~ secondi per trovare una moto. +[HAIT3] +MISSIONE DEGLI HAITIANI 3 -[RACE_X6] -~w~Hai 1 secondo per trovare una macchina. +[HAM3_6] +~g~Utilizza il fucile di precisione che ti ho lasciato per completare la missione. -[RACE_X7] -~w~Hai 1 secondo per trovare una moto. +[ROCK] +MISSIONI DELLA BAND -[RACE_T0] -~r~Non sei arrivato primo! +[ROK1_4] +~g~OK, credo tu stessi cercando questo... -[RACE_T1] -~r~Sei stato squalificato per aver lasciato la tua macchina. +[ROK1_1E] +~g~Ti costerà di più di quanto hai! -[RACE_T2] -~r~Uno dei rivali è morto, la gara è stata annullata! +[ROK1_1F] +~g~Ritorna quando avrai i soldi. -[RACE_T3] -~r~Sei stato squalificato per aver lasciato la tua moto. +[RBM2_6] +~g~Wow! È un uomo, bloccalo! -[RACE_Y3] -~w~3... +[ROCK3] +MISSIONE DELLA BAND 3 -[RACE_Y2] -~w~2... +[ROK3_6D] +~r~insieme alle vostre GROSSE TESTE DA CAPELLONI! -[RACE_Y1] -~w~1... +[ROK3_40] +Vicino al fottuto minibar? -[RACE_Y] -~w~VIA! +[RBM3_5] +~g~Porta i Love Fist allo spettacolo. -[RACE_Z1] -~w~1° POSTO! +[CUBANM] +MISSIONI DEI CUBANI -[RACE_Z2] -~w~2° POSTO! +[CUBAN1] +MISSIONE DEI CUBANI 1 -[RACE_Z3] -~w~3° POSTO! +[CUBAN2] +MISSIONE DEI CUBANI 2 -[RACE_Z4] -~w~ULTIMO POSTO! +[CUB2_10] +~r~Dovresti uccidere gli Haitiani, non i Cubani. -[RACE_R1] -~w~RECORD: ~1~:~1~~1~ NUOVO RECORD! +[CUBAN3] +MISSIONE DEI CUBANI 3 -[RACE_R2] -~w~NUOVO RECORD! +[CUBAN4] +MISSIONE DEI CUBANI 4 -[RACE_S0] -~w~TEMPO: ~1~:~1~~1~ +[CUB4_05] +~r~Ti avevo detto di restare in macchina! Adesso non riusciremo mai a entrare! -[RACE_S1] -~w~MIGLIOR GIRO: ~1~:~1~~1~ +[CUB4_25] +OK, andiamo. -[RAC1] -Rombi assettati +[PROT] +MISSIONI DI PROTEZIONE -[RAC2] -Deimos-tri da sballo +[PRO1_H] +Perché non ti calmi per un secondo, sto finalmente cominciando a capire come funzionano le cose da queste parti. -[RAC3] -Wi-Cheetah 210 e lode +[PRO1_02] +~g~Esci dal Mall. -[BIK1] -Incontro a Red Light +[PRO3_06] +~g~Fai perdere le tracce. -[BIK2] -Torrington TT +[PORN] +MISSIONI PORNOGRAFIA -[BIK3] -GP delle cosche +[PORN1] +MISSIONE PORNOGRAFIA 1 -[TT1] -'Fossi & Ridossi' +[POR1_03] +~r~Candy è morta! -[TT1_A1] -~w~< PERCORSO ~1~ > +[PORN2] +MISSIONE PORNOGRAFIA 2 -[TT1_B1] -~w~Obiettivo del percorso: ~1~:~1~ +[PORN3] +MISSIONE PORNOGRAFIA 3 -[TT1_B1A] -~w~Obiettivo del percorso: ~1~:0~1~ +[POR3_18] +Sei stato visto! -[TT1_B2] -~w~Miglior tempo del percorso: ~1~:~1~ +[PORN4] +MISSIONE PORNOGRAFIA 4 -[TT1_B2A] -~w~Miglior tempo del percorso: ~1~:0~1~ +[POR4_04] +~g~Gli uffici sono dall'altra parte di questo cancello. -[TT1_B3] -~w~Miglior tempo del giro: ~1~:~1~ +[PHIL] +MISSIONI DI PHIL -[TT1_B3A] -~w~Miglior tempo del giro: ~1~:0~1~ +[PHIL1] +MISSIONE DI PHIL 1 -[TT1_B4] -~w~~1~:~1~ +[PHI1_06] +Ma che combini, come diavolo guidi? -[TT1_B4A] -~w~~1~:0~1~ +[PHI1_07] +Ehi! -[TT1_B5] -~w~Nuovo record del percorso! ~1~:~1~ +[PHIL2] +MISSIONE DI PHIL 2 -[TT1_B5A] -~w~Nuovo record del percorso! ~1~:0~1~ +[PIZ1_A] +MISSIONE RECAPITO PIZZE -[TT1_L] -~r~ Non disponibile. +[PIZ1_03] +~g~Ritorna alla pizzeria e prendi le nuove ordinazioni. -[A_PISTO] -~w~< Pistola > +[PIZ1_04] +~g~Ecco le nuove ordinazioni. -[A_UZI] -~w~< Mini-mitraglietta > +[PIZ1_10] +Premi il ~h~tasto R3~w~ per annullare la missione. -[A_AK] -~w~< AK47 > +[CNTBUY1] +Tipografia acquistata: ~1~$ -[A_SNIPE] -~w~< Fucile di precisione > +[CARBUY] +Concessionario acquistato: ~1~$ -[A_GRENA] -~w~< Granate > +[PORNBUY] +Studio cinematografico acquistato: ~1~$ -[A_ARMOU] -~w~< Giubbotto antiproiettile > +[ICEBUY] +Fabbrica di gelato acquistata: ~1~$ -[A_ROCKE] -~w~< Lanciarazzi > +[TAXIBUY] +Compagnia di taxi acquistata: ~1~$ -[A_SHOTG] -~w~< Fucile a pompa > +[BANKBUY] +Malibu acquistato: ~1~$ -[A_M4] -~w~< M4 > +[BOATBUY] +Cantiere navale acquistato: ~1~$ -[A_FLAME] -~w~< Lanciafiamme > +[PRNT_NO] +Non puoi ancora comprare la tipografia, prova più tardi. -[A_MINIG] -~w~< Mitragliatore > +[CAR_NO] +Non puoi ancora comprare il concessionario, prova più tardi. -[A_COST] -~w~Costo: ~h~~1~$ +[PORN_NO] +Non puoi ancora comprare lo studio cinematografico, prova più tardi. -[A_COST2] -~w~Costo: ~h~~1~$ ~n~ ~r~Comprando quest'arma sostituirai quella in uso. +[ICE_NO] +Non puoi ancora comprare la fabbrica di gelato, prova più tardi. -[A_COST3] -~w~Costo: ~h~~1~$ ~n~ ~r~Il tuo giubbotto antiproiettile è in buone condizioni. +[TAXI_NO] +Non puoi ancora comprare la compagnia di taxi, prova più tardi. -[A_COST4] -~w~Costo: ~h~~1~$ ~n~ ~r~Non puoi acquistare questo oggetto. +[BANK_NO] +Non puoi ancora comprare il Malibu, prova più tardi. -[A_STOCK] -~r~Scorte esaurite. +[BOAT_NO] +Non puoi ancora comprare il cantiere navale, prova più tardi. -[A_VIC4] -~w~Normalmente una pistola costa 240$, ma questa l'ha pagata Vincenzo. +[PRNT_R3] +Premi il tasto R3 per acquistare la tipografia per ~1~$ -[A_DONS4] -~w~Donald Love ha già pagato per questo. +[CAR_R3] +Premi il tasto R3 per acquistare il concessionario per ~1~$ -[A_NEDS4] -~w~Un tizio della chiesa ti ha prenotato uno di questi. +[PORN_R3] +Premi il tasto R3 per acquistare lo studio cinematografico per ~1~$ -[A_TALK1] -~w~Ho tutte le armi da difesa domestica di cui hai bisogno. +[ICE_R3] +Premi il tasto R3 per acquistare la fabbrica di gelato per ~1~$ -[A_TALK2] -~w~Vuoi anche una licenza? +[TAXI_R3] +Premi il tasto R3 per acquistare la compagnia di taxi per ~1~$ -[A_TALK3] -~w~Non devo vedere nessun documento, mi sembri una persona fidata. +[BANK_R3] +Premi il tasto R3 per acquistare il Malibu per ~1~$ -[A_TALK4] -~w~Puoi provare il poligono di tiro sul retro, sei il benvenuto. +[BOAT_R3] +Premi il tasto R3 per acquistare il cantiere navale per ~1~$ -[BENZ_GO] -~w~Cambiati d'abito! +[COL2_6] +Fermo, brutto maiale imperialista americano! -[PIZ_B01] -~w~Hai ~1~ secondo per tornare sul ~b~motorino delle pizze! +[COL2_6B] +Questa è proprietà del governo francese. -[PIZ_B02] -~w~Hai ~1~ secondi per tornare sul ~b~motorino delle pizze! +[COL2_6C] +È finita! -[PIZ_F04] -~r~Non sei riuscito a tornare al motorino delle pizze! +[COL3_A] +Thomas, grazie per essere venuto. -[NDL_B01] -~w~Hai ~1~ secondo per tornare sul ~b~motorino dei noodle! +[COL3_B] +Scusami se giungo subito al punto. -[NDL_B02] -~w~Hai ~1~ secondi per tornare sul ~b~motorino dei noodle! +[COL3_C] +Diaz mi ha chiesto di sovrintendere una piccola transizione di lavoro. -[NDL_F04] -~r~Non sei riuscito a tornare al motorino dei noodle! +[COL3_D] +Speriamo vada meglio dell'ultima... -[EXPO_D] -~w~Ecco un premio: ~1~$! Completa l'elenco per un ottenere un bonus! +[COL3_E] +Ed è per questo che ho pensato a te, amico. -[PUPSPN] -~w~POTENZIAMENTO DISPONIBILE! +[COL3_F] +Ho lasciato un po' di supporto al parcheggio multipiano. -[PUPMEGA] -~y~SUPER DANNO! +[COL3_G] +Raccogli il materiale, poi raggiungi e sorveglia gli uomini di Diaz all'incontro. -[PUPREGN] -~y~AUMENTO DELLA SALUTE! +[COL4_2] +Non so signore! -[PUPINVS] -~y~INVISIBILITÀ! +[COL4_5] +Signorsì, signore! -[PUPFREZ] -~y~FURIA! +[COL4_10] +Andiamo a prendere delle ciambelle. -[MPK] -ha ucciso +[COL4_16] +Signore! Sposto il veicolo, signore! -[MPKHEAD] -con un colpo alla testa! +[COL4_25] +Autodistruzione del veicolo attivata! -[MPNEED] -ha bisogno di +[COL5_6] +Mercedes, quella ragazza sarà la mia rovina. -[MPNAME] -Nome +[COL5_8] +Maledetti scarafaggi! -[MPSCORE] -Punteg. +[COL5_5] +Morite, maiali Francesi! -[MPPING] -Ping +[CNT2_1] +Uccidetelo -[MPCPS] -Checkpoint +[CNT2_2] +Recuperate le matrici! -[MPTIME] +[CNT2_3] +Proteggete il corriere. + +[FINKILL] +OK ragazzi, uccidetelo! + +[FIN_6] +Sonny è interessato alla mia cassaforte e ai miei soldi... + +[FIN_10] +Sonny? SONNY! Sto venendo a prenderti! + +[RACES_4] +3 + +[RACES_5] +2 + +[RACES_6] +1 + +[RACES_7] +VIA! + +[RACES_9] +Tempo: ~1~:~1~ + +[RACES] +TEMPO: + +[RACES17] +Nuovo miglior tempo: ~1~:~1~ + +[RACES20] +Nuovo miglior tempo: ~1~:0~1~ + +[RACES21] +Tempo: ~1~:0~1~ + +[RCH1_1] +~g~Usa l'elicottero radiocomandato, il Raider, per PASSARE ATTRAVERSO i punti di controllo. + +[RCH1_2] +~g~I punti di controllo sono sparsi per tutto l'aeroporto. + +[RCH1_3] +~g~Hai ~c~8 MINUTI~g~ per attraversarli tutti e ~c~20~g~! + +[RCH1_5] Tempo -[MPBONUS] -Bonus +[RCRC1_1] +~g~Sfida nella GARA A TAPPE altri 3 Bandit radiocomandati su 2 GIRI. -[MPQG] -Abbandonare la partita? +[RCRC1_2] +~g~Raggiungi subito la griglia di partenza! -[MPQUIT] -Esci +[RCRC1_3] +~g~Giro finale! -[MPCONT] -Continua +[RCRC1_4] +~g~3 -[MPHIGH] -Tempo maggiore +[RCRC1_5] +~g~2 -[MPBY] -da +[RCRC1_6] +~g~1 -[MPOVER] -Fine partita +[RCRC1_7] +~g~VIA! -[MPFIRST] -è arrivato primo +[RCRC1_8] +~g~Tempo di gara: ~1~ secondi -[MPWITH] -vince con $ +[RCPL1_1] +~g~Sfida nella GARA A TAPPE altri 3 Baron radiocomandati. -[MPHP05] -~w~5 secondi al prossimo obiettivo. +[RCPL1_2] +~g~Devi attraversare la ~o~CORONA CENTRALE~g~ per passare con successo un punto di controllo. -[MPHP04] -~w~4 secondi al prossimo obiettivo. +[RCPL1_3] +~g~Raggiungi subito la griglia di partenza! -[MPHP03] -~w~3 secondi al prossimo obiettivo. +[FEA_2SP] +2 altoparlanti -[MPHP02] -~w~2 secondi al prossimo obiettivo. +[FEA_4SP] +Più di 2 altoparlanti -[MPHP01] -~w~1 secondo al prossimo obiettivo. +[FEA_EAR] +Cuffie -[RCRANGE] -~w~Fuori campo! +[FEA_NAH] +NESSUNA PERIFERICA AUDIO -[CAD5_AA] -Sono Sal. +[FET_APP] +APPLICA -[CAD5_AB] -I Forelli mi hanno fatto incazzare! Devono pagare! +[FES_SKN] +NOME SKIN -[CAD5_AC] -Recupera le loro macchine più prestigiose... +[FES_DAT] +DATA -[CAD5_AD] -...e portale al parcheggio dei Sindacco, i loro principali competitori. +[FES_SET] +Usa skin -[CAD5_AE] -Assicurati che i Forelli non rubino le macchine dei Sindacco per rappresaglia. +[FET_DEF] +Ripristina predefiniti -[CAD5_AF] -'O capisti? +[FESZ_QZ] +Sei sicuro di voler salvare la partita? -[CAD4_AA] -Sono io, Sal. +[FES_SCG] +Salvare la partita? -[CAD4_AB] -Devo un favore a Franco Forelli, e tu mi aiuterai a ripagarlo. +[FES_LCG] +Vuoi caricare e continuare la partita? -[CAD4_AC] -i Sindacco hanno delle macchine davvero eleganti nel loro parcheggio. +[FEC_FIR] +Fuoco -[CAD4_AD] -Voglio che tu le prenda e le porti al parcheggio dei Forelli. +[FEC_NWE] +Arma successiva -[CAD4_AE] -Assicurati che non vengano rubate macchine dei Forelli mentre sei in azione. +[FEC_PWE] +Arma precedente -[CAD4_AF] -Mi raccomando, niente cazzate. +[FEC_FOR] +Avanti -[MPC_000] -Toni +[FEC_BAC] +Indietro -[MPC_001] -'Lionel' +[FEC_LEF] +Sinistra -[MPC_002] -Cipriani +[FEC_RIG] +Destra -[MPC_003] -Chauffeur +[FEC_ZIN] +Ingrandisci -[MPC_004] -13th +[FEC_ZOT] +Riduci -[MPC_005] -Toni the Tux +[FEC_EEX] +Entra o esci -[MPC_006] -Fury +[FEC_RAD] +Radio -[MPC_007] -The King +[FEC_SUB] +Sottomissione -[MPC_008] -Cocks +[FEC_CMR] +Cambia visuale -[MPC_009] -Streak +[FEC_JMP] +Salto -[MPC_010] -'T' +[FEC_SPN] +Scatto -[MPC_011] -Dragon +[FEC_HND] +Freno a mano -[MPC_012] -JD +[FEC_LOL] +Sguardo a sinistra -[MPC_013] -The Gimp +[FEC_LOR] +Sguardo a destra -[MPC_014] -Avery +[FEC_NTR] +Bersaglio successivo -[MPC_015] -Choc-Choc +[FEC_PTT] +Bersaglio precedente -[MPC_016] -8-Ball +[FEC_LBA] +Sguardo indietro -[MPC_017] -Maria +[FEC_CEN] +Centra visuale -[MPC_018] -'Hamfists' +[FET_CCN] +Classico -[MPC_021] -No.1 +[FET_SCN] +Predefinito -[MPC_023] -Hung Lo +[FET_CFT] +A PIEDI -[MPC_025] -Yamazaki +[FET_CCR] +IN MACCHINA -[MPC_031] -Officer '69' +[FET_CAC] +AZIONE -[MPC_032] -The Specialist +[FEC_IBT] +- -[MPC_034] -G.I. Jones +[FEC_MXO] +MXB1 -[MPC_035] -Sam +[FEC_MXT] +MXB2 + +[FEC_UNB] +NON ASSEGNATO + +[FEC_TFL] +Sguardo+Torretta a SX + +[FEC_TFR] +Sguardo+Torretta a DX + +[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 SX+DX + +[LAW_1A] +law_1a + +[LAW_1B] +law_1b + +[LAW_2A] +law_2a + +[LAW_2B] +law_2b + +[FEH_STA] +STATISTICHE + +[FEH_LOA] +CARICA + +[FEH_CON] +COMANDI + +[FEH_AUD] +AUDIO + +[FEH_DIS] +VIDEO + +[FEH_LAN] +LINGUA + +[FEH_SGA] +NUOVA PARTITA + +[FEO_CON] +Impostazioni controller + +[FEO_AUD] +Impostazioni audio + +[FEO_DIS] +Impostazioni video + +[FEO_LAN] +Impostazioni lingua + +[FEO_PLA] +Impostazioni giocatore + +[FEA_OUT] +Uscita + +[FEA_ST] +Stereo + +[FEA_DTS] +DTS + +[FEA_RSS] +Stazione radio + +[FEA_NON] +NO RADIO [FEA_FM0] -HEAD RADIO +WILDSTYLE [FEA_FM1] -DOUBLE CLEF FM +FLASH FM [FEA_FM2] -K-JAH +KCHAT [FEA_FM3] -RISE FM +FEVER 105 [FEA_FM4] -LIPS 106 +VROCK [FEA_FM5] -RADIO DEL MUNDO - -[FEA_FM6] -MSX 98 +VCPR [FEA_FM7] -FLASHBACK FM +EMOTION 98.3 [FEA_FM8] -THE LIBERTY JAM +WAVE 103 -[FEA_FM9] -LCFR +[FED_BRI] +Luminosità -[MRACELA] -Giro +[FED_TRA] +Tracce : -[DTB_01] -~w~Difendi la tua base dagli attacchi avversari. +[FED_SUB] +Sottotitoli -[DTB_02] -~w~Proteggi a tutti i costi le tue macchine. +[FED_WIS] +Panoramico -[CAD2_AB] -~w~Buone nuove, i Forelli e i Sindacco sono nuovamente ai ferri corti. +[FED_POS] +Posizione schermo -[CAD2_AC] -~w~Entrambi vogliono il monopolio della vendita delle automobili a Liberty. +[FEP_RES] +Riprendi -[CAD2_AD] -~w~Visto che abbiamo 'aiutato' i Forelli la settimana scorsa... +[FEP_STG] +Avvia partita -[CAD2_AE] -~w~...è giunta l'ora di bilanciare la situazione. +[FEP_STA] +Statistiche -[CAD2_AF] -~w~Aiuta i Sindacco a ripulire il parcheggio dei Forelli. +[FEP_BRI] +Briefing -[POMOB6B] -~w~Vedo quella cagna solamente quando ha bisogno di soldi! +[FEP_OPT] +Opzioni -[POMOB2A] -~w~Salvatore mi ha dato il tuo numero... beh, diciamo che l'ho trovato nella sua rubrica! Ma, vabbè! +[FEP_QUI] +Esci -[POMOB2B] -~w~Sei il suo nuovo tirapiedi, vero? Beh, voglio andare un po' a spasso. +[FES_LOA] +Carica partita -[POMOB2C] -~w~Ti aspetto quanto prima. +[FES_DEL] +Elimina partita -[GS_RGUN] -INIZIA CON ARMI: +[FEC_CSU] +Impostazioni controller -[TUSHTK] -Angelo ingiustificato +[FEC_RED] +Ridefinisci comandi -[SC_WICH] -Punteggio max 'Angelo ingiustificato' +[FEC_MOU] +Impostazioni mouse -[NE_WIFI] -Errore di rete. L'interruttore WLAN è spento. Accendi l'interruttore WLAN per affrontare partite multigiocatore. +[DISTGOL] +Distanza percorsa su cart da golf (miglia) -[BNDRAC0] -RC allo sbando +[DISTGOM] +Distanza percorsa su cart da golf (metri) -[BNDRAC1] -RC allo scozzo +[ST_FAVR] +Stazione radio preferita -[BNDRAC2] -RC all'inseguimento +[ST_WSTR] +Stazione radio meno amata -[GS_G1] -LIBERTY CITY SURVIVOR +[ST_FAVV] +Veicolo preferito -[GS_G2] -STREET RAGE +[ST_STAR] +Totale stelle di sospetto -[GS_G3] -PROTECTION RACKET +[ST_HEAD] +Colpi alla testa -[GS_G4] -GET STRETCH +[ST_GANG] +Gang meno amata -[GS_G5] -TANKS FOR THE MEMORIES - -[GS_G6] -THE HIT LIST - -[GS_G7] -THE WEDDING LIST - -[TRCR1] -~w~1... - -[TRCR2] -~w~2... - -[TRCR3] -~w~3... - -[TRCRGO] -~w~VIA! - -[GA_16] -~w~La riverniciatura è in omaggio. - -[NEW_TAX] -~w~Missioni Tassista completate! È stato consegnato un nuovo modello ai taxi Mean Street di Trenton! - -[EXPO_2] -~w~Se fornirai loro in buone condizioni i veicoli dei quali hanno bisogno, verrai ben ricompensato. - -[FEMP_NC] -Connessione di rete in corso... Attendere... - -[C1TGSUB] -tasto R3 - -[C2TGSUB] -tasto R3 - -[C3TGSUB] -~S~ - -[C2VEHN] -tasto R1 - -[C2VECRS] -tasto L3 - -[C3VECRS] -~O~ - -[C2PDCWE] -tasto L2 e tasto R2 - -[C3PDCWE] -tasto L2 e tasto R2 - -[BENZ_LA] -~w~La ~h~divisa da avvocato~w~ è disponibile al rifugio. - -[BENZ_TR] -~w~Gli ~h~abiti casual~w~ sono disponibili al rifugio. - -[SLH1_OU] -~w~Hai bisogno di un ~h~abito da avvocato~w~ per poter visitare Sal. - -[SLH1_OR] -~w~Devi vestirti da avvocato per incontrare Sal. - -[L_TRN_1] -~w~Puoi usare la ~h~sopraelevata~w~ per muoverti a Portland. Premi~h~ ~k~ ~VEEE~ ~w~per entrare o uscire dal treno. - -[HELP2] -~w~Premi~h~ ~k~ ~PDSPR~ ~w~mentre stai correndo per compiere ~h~uno scatto. - -[STMOB5A] -~w~Toni, Sal. - -[SCH_TK7] -~r~Hai abbandonato la discarica. - -[STMOB3C] -~w~Ma dobbiamo prendere noi il controllo del municipio. - -[SALH3A] -~w~Recupera un mezzo di trasposto per Donald. - -[MPCASH] -Soldi - -[MPCARS] -Auto - -[CRUSHED] -Valore rottamazione ~1~$ - -[BENZ_BO] -~w~Recupera un cambio di ~h~biancheria~w~ dal rifugio. - -[BENZ_EL] -~w~L'~h~abito 'The King'~w~ è disponibile al rifugio. - -[BENZ_CO] -~w~L'~h~abito mascotte dei Cox~w~ è disponibile al rifugio. - -[BENZ_HE] -~w~Missioni Avenging Angels di Shoreside: livello 15 completato! L'~h~abito da supereroe~w~ è disponibile al rifugio. - -[BENZ_DR] -~w~L'~h~abito 'Dragon'~w~ è disponibile al rifugio. - -[TRTIT] -Alliva plima e intelo - -[TRRACE2] -~w~Attento! I fratelli Wong non promettono nulla di buono... - -[MPTOTAL] -Tempo - -[TOUR_W6] -~w~Esclusiva Landstalker blindata consegnata al rifugio. Vedi di tenerla al sicuro in garage! - -[OUTFITS] -Abiti sbloccati - -[MPHPMAR] -è stato condannato a morte. - -[FEC_CWT] -Cambia armi/bersagli - -[EXPO_1] -~w~Love Media ha bisogno di premi da distribuire nelle sue competizioni 'Car-razy Give Away'! - -[PCJLAP] -~w~Nuovo giro migliore di ~1~ secondi! - -[MPBLCAR] -Macchina blu: - -[MPRDCAR] -Macchina rossa: - -[RAMP_A] -~w~VIOLENZE COMPLETATE! ~1~$ - -[FET_SAV] -Salva partita - -[FET_WRN] -Attenzione! Sono stati attivati uno o più trucchi e ciò potrebbe influire sul salvataggio. Si consiglia di non salvare questa partita. - -[HELP39] -~w~Usa~h~ ~k~ ~VEWEI~ ~w~per spostare il peso quando sei su una moto. - -[FEC_EXV] -Scendi dal veicolo - -[MPCOLL] -AUTO NECESSARIE: - -[FEMP_HG] -OSPITA PARTITA - -[FEMP_JG] -PARTECIPA - -[K_TK3] -~w~1 punto per le mete ~g~verdi~w~, 2 punti per quelle ~y~gialle~w~ e 3 punti per le ~r~rosse. - -[FEMP_GJ] -SCEGLI LA PARTITA - -[FEMP_H] -HOST: - -[FEMP_P] -GIOCATORI: - -[FEMP_HN] -OSPITA NUOVA PARTITA - -[PO_MOB4] -~w~Ehi... sono io, Vincenzo. - -[POMOB4D] -~w~Ehi. Passa a trovarmi, ho qualcosa per te. - -[POMOB4E] -~w~Sì? Cosa? Un paio di scarpe di cemento? - -[POMOB4H] -~w~No. Andiamo Toni, mi dispiace per come sono andate le cose. - -[FEMP_F] -PIENO - -[FEMP_R] -RIPRISTINA PREDEFINITI - -[YOU] -TU - -[NE_POW] -Si è verificato un errore di rete. È stato spento l'interruttore POWER/HOLD (accensione/blocco funzioni). - -[FEMP_SQ] -Sei sicuro di voler iniziare una partita multigiocatore? - -[BIKETXT] -~w~Hogs & Cogs è aperto dalle 08:00 alle 18:00. Torna quando è aperto! - -[RACE_2] -Tempo - -[FEF_CO2] -Scegli la configurazione dei comandi più adatta al tuo stile di gioco. +[ST_STGN] +Totale stelle di sospetto evase [TYREPOP] Pneumatici esplosi con proiettili -[FE_INIP] -Inizializzazione menu di pausa... Attendi... +[TYRESLA] +Pneumatici tagliati con una lama -[DON4EX3] -~w~Accetti un assegno? +[ST_BRK] +Numero di uccisioni nel Bloodring -[CRUSH] -~w~Guadagna soldi con la rottamazione! Alcuni veicoli possono essere demoliti se lasciati nella zona con gli pneumatici. +[ST_LTBR] +Permanenza massima nel Bloodring (sec) -[ANG_15] -~w~Una banda di fannulloni ha appena rubato la macchina di un poveraccio, facciamoli fuori! +[ST_GNG1] +Cubani -[CDERROR] -Attendere prego... +[ST_GNG2] +Haitiani -[FEC_LOF] -Guarda avanti +[ST_GNG3] +Teppistelli -[FEC_LFA] -Sguardo/Mira precisa +[ST_GNG4] +Gang di Diaz -[MPHELP] -AIUTO +[ST_GNG5] +Sorveglianza -[C1VEHN] -tasto L1 +[ST_GNG6] +Gang di motociclisti -[C3VEHN] -tasto L3 +[ST_GNG7] +Gang di Vercetti -[MPOBJ] -OBIETTIVO: +[ST_GNG8] +Giocatori di golf -[MPLEG] -LEGENDA RADAR: +[FEA_FM6] +ESPANTOSO -[GS_O1] -Ciascuno per sé! Uccidi tutti gli altri giocatori! +[ST_ASSI] +Contratti da sicario completati -[GS_O2] -Guida attraverso i checkpoint e raggiungi per primo il traguardo. +[DISTBIK] +Distanza percorsa in moto (miglia) -[GS_OD3] -Difendi quattro limousine nella tua base dagli attacchi. +[DISTBIM] +Distanza percorsa in moto (metri) -[GS_O6] -Uccidi il giocatore 'condannato' il più velocemente possibile. Se sei il 'condannato', resisti. +[HOTEL] +Hotel Ocean View -[GS_O7] -Recupera le macchine disseminate in città, poi portale negli appositi container. +[ICC1_1] +~g~Utilizza il camioncino dei gelati per distribuire droga in Vice City. -[FHOSE_2] -~h~~k~ ~VEWEA~ ~w~corregge la mira del cannone. +[ICC1_2] +~g~Parcheggia il camioncino e premi ~h~~k~~VEHICLE_HORN~~w~ per attivare il campanello e attrarre i clienti. -[MPI01] -POTENZIAM. +[ICC1_3] +~g~Riceverai soldi per ogni transizione, ma più ne esegui, maggiori saranno le probabilità di attirare l'attenzione della polizia. -[MPI02] -SALUTE +[KICK1_9] +PUNTI DI CONTROLLO RIMANENTI: -[MPI03] -PROTEZIONE +[FIN_B6] +Non hai abbastanza soldi per avviare questa missione. -[MPI04] -ARMA +[TEX3_3] +~g~Per raccogliere una bomba, avvicinati con l'elicottero: la bomba verrà automaticamente raccolta. -[SPIDER] -Deimos SP +[TEX3_9] +~g~Raccogli una bomba avvicinandole l'elicottero. -[PONTIAC] -Phobos Vt +[HELP22] +Raggiungi la casa verde sul radar. -[FORELLI] -Forelli ExSess - -[AHIT_LO] -Per il momento l'hai seminato, ma tornerà per finire il lavoro. - -[FEM_ROF] -Radio spenta - -[GA_1] -~ w~Stai scherzando! Non ho intenzione di toccarla! - -[TRA_NEX] -Prossima fermata: - -[TRA_CUR] -Fermata attuale: - -[PAGEB2] -~w~Il ~h~fucile a pompa~w~ è disponibile al tuo rifugio! - -[PAGEB3] -Il ~h~giubbotto antiproiettile~w~ è disponibile al tuo rifugio! - -[PAGEB4] -~w~La ~h~mitraglietta~w~ è disponibile al tuo rifugio! - -[PAGEB5] -~w~Il ~h~calibro .357~w~ è disponibile al tuo rifugio! - -[PAGEB6] -~w~L'~h~M4~w~ è disponibile al tuo rifugio! - -[PAGEB7] -~w~Il ~h~fucile di precisione con laser ~w~è disponibile al tuo rifugio! - -[PAGEB8] -~w~Il ~h~lanciafiamme~w~ è disponibile al tuo rifugio! - -[PAGEB9] -~w~Il ~h~lanciarazzi~w~ è disponibile al tuo rifugio! - -[PAGE_01] -Crivella ~1~ membri della Triade in 2 minuti! - -[PAGE_02] -Fai esplodere ~1~ veicoli in 2 minuti! - -[PAGE_03] -Incenerisci ~1~ Diablo in 2 minuti! - -[PAGE_04] -Uccidi ~1~ mafiosi di Leone in 2 minuti! - -[PAGE_05] -Brucia ~1~ veicoli in 2 minuti! - -[PAGE_06] -Investi ~1~ pedoni in 2 minuti! - -[PAGE_07] -Distruggi ~1~ veicoli in 2 minuti! - -[PAGE_08] -Massacra ~1~ pedoni in 2 minuti! - -[PAGE_09] -Brucia ~1~ membri della Yakuza in 2 minuti! - -[PAGE_10] -Assassina ~1~ Forelli in 2 minuti! - -[PAGE_11] -Investi ~1~ pedoni in 2 minuti! - -[PAGE_12] -Ammazza ~1~ pedoni in 2 minuti! - -[PAGE_13] -Uccidi ~1~ membri della Yakuza in 2 minuti! - -[PAGE_15] -Massacra ~1~ pedoni in 2 minuti! - -[PAGE_16] -Distruggi ~1~ veicoli in 2 minuti! - -[PAGE_17] -Cecchina ~1~ pedoni in 2 minuti! - -[PAGE_18] -Distruggi ~1~ veicoli in 2 minuti! - -[PAGE_20] -Brucia ~1~ pedoni in 2 minuti! - -[MPI05] -NEMICO - -[MPI07] -CHECKPOINT - -[MPI08] -PROSSIMO - -[MPI09] -TRAGUARDO - -[MPI10] -PILOTA - -[MPI11] -BASE - -[MPI12] -BASE NEMICA - -[MPI13] -CARRO ARMATO - -[MPI14] -OBIETTIVO - -[MPI15] -MACCHINA - -[MPI16] -CONTAINER - -[FEI_LEG] -Legenda sì/no - -[SR_ON] -Ora che ti sei fatto un nome nei circuiti cittadini, fai attenzione ad altri sfidanti intenzionati a contattarti. - -[FEC_FRA] -Mira libera - -[KAR_ON] -Torna quando vuoi al camion dei pompieri per tentare di battere il tuo miglior tempo! - -[DON2EX5] -~w~8-ball non cambierà idea finché non pagherai 20.000$. - -[PCJTIT] -GO GO Faggio - -[FEA_MUS] -VOLUME RADIO: - -[FEST_GO] -Tempo migliore nella missione Go Go Faggio - -[RC_1] -~w~Uccidi più di ~1~ membri della Triade: riceverai tempo bonus per ogni eliminazione! - -[EXPO_C] -~w~Grazie! Quella era l'ultima! Ti abbiamo lasciato un bel regalo davanti al tuo appartamento di Newport! - -[TRRACE0] -~w~Passa attraverso i ~y~checkpoint~w~ e arriva vivo alla fine del percorso! - -[RACE_P1] -~w~1° - -[RACE_P2] -~w~2° - -[RACE_P3] -~w~3° - -[RACE_P4] -~w~4° - -[OUTF_00] -~w~Abito casual - -[OUTF_01] -~w~Vestito dei Leone - -[OUTF_03] -~w~Uniforme degli Avenging Angels - -[OUTF_04] -~w~Abito da autista - -[OUTF_05] -~w~Abito da avvocato - -[OUTF_06] -~w~Smoking - -[OUTF_07] -~w~Abito 'The King' - -[OUTF_08] -~w~Abito mascotte dei Cox - -[OUTF_09] -~w~Biancheria - -[OUTF_10] -~w~Abito da supereroe - -[OUTF_11] -~w~Abito 'Dragon' - -[SLTVMON] -Soldi guadagnati con Slash TV - -[DBIKEAI] -Miglior salto realizzato (m) - -[MPC_039] -Vincenzo - -[MPC_040] -Salvatore - -[MPC_041] -Toshi - -[MPC_042] -Toshiko - -[MPC_043] -Ophelia Lardaz - -[MPC_044] -Ed Banger - -[MPC_045] -Robin Emblind - -[MPC_046] -Mrs. Menalot - -[MPC_047] -Hugh Jazz - -[MPC_048] -Wayne - -[MPC_049] -Paulie - -[MPC_050] -Anne Job - -[MPC_051] -Randy Boner - -[MPC_052] -Owen Monie - -[MPC_053] -Ekant Sing - -[MPC_054] -M.T.Head - -[MPC_055] -Rick O'Shea - -[MPC_056] -Arden Long - -[MPC_057] -Ann Thrax - -[MPC_058] -Fay Slift - -[MPC_059] -Mona Lott - -[C0VEACC] -~X~ - -[C1VEACC] -~X~ - -[C2VEACC] -~X~ - -[C3VEACC] -levetta analogica destra in su - -[C0VEBRK] -~S~ - -[C1VEBRK] -~S~ - -[C2VEBRK] -~S~ - -[C3VEBRK] -levetta analogica destra in giù - -[C0VEHB] -tasto R1 - -[C1VEHB] -tasto R1 - -[C0VEEE] -~T~ - -[C1VEEE] -~T~ - -[C2VEEE] -tasto L1 - -[C3VEEE] -~T~ - -[C0VEWEP] -~O~ - -[C1VEWEP] -~O~ - -[C2VEWEP] -~O~ - -[C3VEWEP] -tasto R1 - -[C0PDSPR] -~X~ - -[C1PDSPR] -~X~ - -[C0SNZI] -~S~ - -[C1SNZI] -~S~ - -[C0SNZO] -~X~ - -[C1SNZO] -~X~ - -[C0PDFW] -~O~ - -[C1PDFW] -~O~ - -[C0TRSK] -~X~ - -[C1TRSK] -~X~ - -[C2TRSK] -~X~ - -[C3TRSK] -~X~ - -[C0AMBUY] -~X~ - -[C1AMBUY] -~X~ - -[C2AMBUY] -~X~ - -[C3AMBUY] -~X~ - -[C0AMEXI] -~T~ - -[C1AMEXI] -~T~ - -[C2AMEXI] -~T~ - -[C3AMEXI] -~T~ - -[C2PDSPR] -~O~ - -[C3PDSPR] -~X~ - -[C2SNZI] -~T~ - -[C3SNZI] -~S~ - -[C2SNZO] -~S~ - -[C3SNZO] -~X~ - -[C2PDFW] -~X~ - -[C3PDFW] -tasto R1 - -[MPC_020] -Rico Garlik - -[MPC_022] -Lou Scannon - -[MPC_024] -Cruz Vormen - -[MPC_026] -Busta Moves - -[MPC_027] -Juan Kerr - -[MPC_028] -Nick Yakar - -[MPC_029] -Lou Bricant - -[MPC_030] -Lance Urwell - -[MPC_033] -Agent Ochre - -[MPC_036] -Papi Love - -[MPC_037] -Lucy Lastic - -[MPC_038] -Bill Durzbum - -[MPISCOL] -Oggetto raccolto - -[MPSTART] -Avvio partita... - -[MRACEC1] -~w~1... - -[MRACEC2] -~w~2... - -[MRACEC3] -~w~3... - -[MPC_019] -Phil DeGirth - -[GDA_HL] -Livello massimo 'Avenging Angel' - -[MP_SNEW] -Carica o avvia una nuova partita a giocatore singolo o multigiocatore. - -[DON2EX9] -~r~Ned~w~ sta scappando! Non perderlo! - -[FEI_CHA] -Cambia squadra - -[FES_RES] -RIPRISTINA IMPOSTAZIONI - -[FESZ_QT] -Sei sicuro di voler ripristinare le impostazioni audio, video e dei comandi? Procedere? - -[FEH_LOA] -PARTITA - -[MPEMPTY] -Vuota - -[FEMP_SN] -AVVIA PARTITA (2 o più giocatori richiesti) - -[JD_SUIT] -~w~JD non può affidarti lavori se sei vestito come uno dei Leone! - -[SAVD_SH] -- rifugio. - -[SAVD_DY] -Giorno - -[SAVD_CO] -completato. - -[SAVD_AL] -Portland - rifugio. Giorno 71, $57640. 17% completato. - -[SAV_SLT] -Nuovo salvataggio - -[POMOB6C] -~w~Passa al più presto a trovarmi. Ho del lavoro per te. - -[ANG_2] -~w~Premi~h~ ~k~ ~TGSUB~ ~w~per attivare o disattivare le missioni Avenging Angels. - -[TVHELP] -~w~Premi~h~ ~k~ ~TGSUB~ ~w~per attivare o disattivare le missioni Slash TV. - -[PAGERA] -~w~L'~h~M60~w~ è disponibile al tuo rifugio! - -[CO_ALL] -~w~Raccolti tutti i pacchetti speciali! - -[CO_ONE] -~w~Pacchetto speciale: ~1~ su ~1~ raccolto! - -[PAGE_14] -Spazza via ~1~ gangster Colombiani in 2 minuti! - -[PAGE_19] -Investi ~1~ gangster Colombiani in 2 minuti! - -[ANG_22] -~r~Missione Avenging Angel annullata. - -[SLATVQO] -~r~Missione Slash TV annullata. - -[C0FREE1] -tasto L3 - -[C1FREE1] -tasto L3 - -[C2FREE1] -tasto L3 - -[C3FREE1] -tasto L3 - -[C0FREE2] -levetta analogica sinistra - -[C2FREE2] -levetta analogica sinistra - -[ANGCOM1] -~w~Missioni Avenging Angels di Portland: livello 15 completato! La motocicletta esclusiva 'Avenger' ti attende al rifugio! - -[K_CE] -~w~Hai ~1~ secondo per tornare sulla tua ~b~moto! - -[HELP31] -~w~Se vieni ~h~'beccato'~w~ o ~h~'massacrato'~w~ durante una missione, apparirà questo ~h~taxi~w~. - -[LOSER] -~y~SCONFITTA! - -[RCRHELP] -~w~Premi~h~ ~k~ ~TGSUB~ ~w~per ~h~abbandonare la gara~w~.~h~ ~k~ ~VEWEP~ ~w~per riposizionare la macchina radiocomandata all'ultimo checkpoint. - -[SRC_ON] -Ora che ti sei fatto un nome nelle gare di macchine illegali, altri sfidanti proveranno a contattarti. - -[SRB_ON] -Ora che ti sei fatto un nome nelle gare di moto illegali, altri sfidanti proveranno a contattarti. - -[RACE_R0] -~w~RECORD PRECEDENTE: ~1~:~1~~1~ - -[POMOB3C] -~w~Ehi, passa di qua quando vuoi amico. - -[MPHPCS1] -The Hit List - -[MPWLGOC] -Esci dalla macchina. - -[MPWLLTC] -Esci dal container. - -[MPWLDTC] -Consegna la macchina. - -[MPWLCD] -Macchina consegnata. - -[MPWLNGC] -Ora prendi le macchine. - -[MPAUTO] -MOSTRA 1 VOLTA - -[MRACEGO] -~w~VIA - -[MRACE04] -HAI VINTO - -[MRACEWI] -ha vinto la gara - -[MRCPU01] -~y~RIPARAZIONE ISTANTANEA - -[DTB01] -difendi le macchine - -[DTB02] -distruggi le macchine - -[DTB03] -hanno perso una macchina - -[DTB04] -hanno distrutto una macchina - -[MPWIN] -ha vinto - -[MPKSELF] -è stato ucciso - -[MPMORE] -uccisioni - -[MP1MORE] -uccisione - -[MPSTRT] -Inizia - -[MPTANK] -ha il carro armato - -[MPONE] -deve recuperare solo una macchina - -[MPDEL] -ha consegnato una macchina - -[MPGOCAR] -Cerca la macchina - -[MPGOGAR] -Consegna la macchina - -[MPDEST] -Veicolo bersaglio distrutto - -[MPLEFT] -ha abbandonato la partita - -[MPHPGO2] -~w~Sei stato condannato a morte - -[MPHPKI] -~w~Hai ucciso un sicario - -[LOCKON] -Agganciato - -[MPHPGO] -~w~Elimina il bersaglio - -[MPTNK] -Prendi il carro armato - -[MRCPU02] -HAI FATTO ESPLODERE I PNEUMATICI DEI RIVALI - -[MRCPU05] -I TUOI PNEUMATICI SONO ESPLOSI - -[MRCPU06] -~y~Pneumatici aderenti - -[WINNER] -~Y~VITTORIA - -[MPDRAW] -~w~PATTA - -[MPDADDY] -SEI IL NUOVO CAPO IN CITTÀ. - -[MPRUN] -ORA GOVERNANO LA CITTÀ. - -[MPBITCH] -CHI È IL TUO NUOVO CAPO, EH STRONZO? - -[FEMP_SM] -Gioca a Grand Theft Auto con gli amici o con qualche losco sconosciuto nei dintorni. - -[MPYL] -SCONFITTA! - -[MPTMWIN] -SONO I MIGLIORI - -[GS_SCAR] -VEICOLO: - -[GS_MIN] -minuto - -[GS_MINS] -minuti - -[MPTNKGA] -Hai il carro armato, sei un duro. - -[MPTNKGB] -Non perderlo. - -[GS_TYPE] -SCENARIO: - -[CLILOST] -Connessione interrotta con gli altri giocatori. - -[ONEHPC] -Completato al 100 percento! Un piccolo regalo ti attende a Fort Staunton. - -[MPBLTM] -sindacco - -[MPRDTM] -forelli - -[MTN_1] -Sindacco - -[MTN_2] -Forelli - -[MPRDCAP] -Macchina catturata - -[MPBLCAP] -Macchina catturata - -[MPRDST] -Macchina rubata - -[MPBLST] -Macchina rubata - -[MPBLEST] -Macchina rubata - -[MPRDRET] -Macchina riportata - -[MPBLRET] -Macchina riportata - -[MPRDPOS] -Macchina fuori posizione - -[MPBLPOS] -Macchina fuori posizione - -[GS_TEAM] -ALLEATI CON: - -[FEMP_TS] -ALLEATI CON: - -[MPTEAM] -Gang - -[GS_OA3] -Distruggi quattro limousine nella base rivale. - -[GS_O4] -Ruba l'auto dell'altra gang e riportala alla tua base. Nel mentre, proteggi la tua di auto. - -[MPI06] -MEMBRO GANG - -[FEMP_ST] -AVVIA PARTITA (sono necessari uno o più giocatori per gang) - -[HELP32] -~w~Per una modica cifra (o gratuitamente se non hai soldi), verrai trasportato sul ~h~luogo del contatto~w~ della tua ultima missione. - -[BENZ_HO] -La ~h~salopette~w~ è disponibile al rifugio. Indossala e torna di notte per partecipare a Slash TV. - -[SLATXT] -~w~Torna indossando la 'salopette' tra le 18:00 e le 05:00 per partecipare a Slash TV. - -[OUTF_02] -~w~Salopette - -[CAN_CON] -~w~Premi nuovamente~h~ ~k~ ~TGSUB~ ~w~per annullare la missione. - -[GNG1] -I LEONE - -[GNG2] -LA TRIADE - -[GNG3] -I DIABLO - -[GNG4] -I YAKUZA - -[GNG5] -GLI YARDIE - -[GNG6] -I COLOMBIANI - -[GNG7] -GLI HOOD - -[GNG8] -I SINDACCO - -[GNG9] -I FORELLI - -[GNG0] -I SICILIANI - -[MP_GNG1] -GANG 1 SCELTA: - -[MP_GNG2] -GANG 2 SCELTA: - -[GS_TEMS] -GUERRA DI GANG - -[CARS_O] -~w~Se vuoi guadagnare un po' di soldi, la Capital Autos di Harwood sta cercando un nuovo venditore. - -[CARTXT] -~w~Capital Autos è aperto dalle 08:00 alle 18:00. Torna quando è aperto! - -[GS_TO1] -Elimina la gang rivale! - -[MPTNEED] -hanno bisogno di - -[MPTWIN] -vincono - -[BADTEAM] -Una delle gang è rimasta senza giocatori. - -[RACELAP] -Giro - -[GS_D1] -RIVIVI LO SPETTACOLO CLASSICO! IL RITORNO DEL DARWINISMO URBANO! - -[GS_D2] -CHI È IL MIGLIORE ALLA GUIDA (O A INGANNARE)? - -[GS_D3] -PROTEGGI LE TUE MACCHINE DA FARABUTTI E VANDALI. - -[GS_D4] -RUBA LA MACCHINA DELLA GANG NEMICA E DERIDILI. - -[GS_D5] -CHI VUOLE DAVVERO IL CARRO ARMATO? - -[GS_D6] -IL CONDANNATO DEV'ESSERE MASSACRATO. - -[GS_D7] -RECUPERA LE MACCHINE PER CONTANTI. - -[HELP61] -~w~Quando il ~h~segnale triangolare è rivolto verso l'alto~w~ il ~h~bersaglio si trova sopra di te~w~. Un ~h~segnale quadrato~w~ indica che il ~h~bersaglio è alla tua stessa altezza. - -[ST_DRWN] -Pesci sfamati - -[RACE_T4] -~r~Sei stato squalificato per non aver trovato una macchina. - -[RACE_T5] -~r~Sei stato squalificato per non aver trovato una moto. - -[PCJ600] -PCJ-600 - -[FEC_HBB] -Freno a mano~h~ ~k~ ~VEACC~ ~w~e~h~ ~k~ ~VEBRK~ - -[HJSTAT] -~w~Distanza: ~1~.~1~ m Altezza: ~1~.~1~ m Ribaltamenti: ~1~ Rotazione: ~1~° - -[HJSTATW] -~w~Distanza: ~1~.~1~ m Altezza: ~1~.~1~ m Ribaltamenti: ~1~ Rotazione: ~1~° ...e che grande atterraggio! - -[HJSTATF] -~w~Distanza: ~1~ piedi Altezza: ~1~ piedi Ribaltamenti: ~1~ Rotazione: ~1~° - -[HJSTAWF] -~w~Distanza: ~1~ piedi Altezza: ~1~ piedi Ribaltamenti: ~1~ Rotazione: ~1~° ...e che grande atterraggio! - -[MPUNLK] -Nuovi contenuti multigiocatore sbloccati. Umilia gli altri giocatori con i nuovi oggetti a tua disposizione! - -[MPUNLKA] -Tutti i contenuti multigiocatore sbloccati. Umilia gli altri giocatori con i nuovi oggetti a tua disposizione! - -[TOUR] -Soddisfatti o non pagati - -[NDL1_A] -Spaghi pirati - -[PIZ1_A] -Pizza da trambusto - -[GS_SCUT] -MOSTRA INTRO: - -[TR_00] -GARA UNO - -[TR_01] -GARA DUE - -[TR_02] -GARA TRE - -[TR_03] -GARA QUATTRO - -[TR_04] -GARA CINQUE - -[TR_05] -GARA SEI - -[TR_06] -GARA SETTE - -[TR_07] -GARA OTTO - -[CHSE] -INSEGUIMENTO - -[NOCHANG] -Non puoi cambiare abito durante questa missione. - -[OUTF_12] -Antonio - -[OUTF_13] -Tuta - -[OUTF_14] -Bravo ragazzo - -[OUTF_15] -Anticonformista - -[BENZ_AN] -~w~L'~h~abito 'Antonio'~w~ è disponibile al rifugio. - -[BENZ_SW] -~w~L'~h~abito 'Tuta'~w~ è disponibile al rifugio. - -[BENZ_GD] -~w~L'~h~abito 'Bravo ragazzo'~w~ è disponibile al rifugio. - -[BENZ_WI] -~w~L'~h~abito 'Anticonformista'~w~ è disponibile al rifugio. - -[RAMPAGE] -VIOLENZA - -[GS_TTGT] -TEMPO SUL CARRO: - -[GS_O5] -Per vincere, devi sopravvivere il più a lungo possibile nel carro armato. Danneggia il carro armato per rubarlo a un altro giocatore. - -[HELP28] -~w~Per lanciare un'~h~arma esplosiva~w~ premi~h~ ~k~ ~PDFW~. ~w~Più a lungo tieni premuto~h~ ~k~ ~PDFW~ ~w~più lontano l'arma verrà lanciata. - -[RATNG53] -Disonorevole - -[RATNG54] -Ratto ingannevole - -[RATNG55] -Pescecane - -[RATNG56] -Artista del raggiro - -[RATNG57] -Il Don di tutti i bugiardi - -[RATNG11] -SANGUISUGA - -[CHASE6] -Liberty Tree Pagina 2 - -[CHASE7] -Liberty Tree Prima pagina - -[AUTOLD] -Caricamento dal Memory Stick™ in corso... Non rimuovere il Memory Stick™ o spegnere il sistema. - -[LDFAIL] -Caricamento fallito. Il salvataggio è danneggiato. - -[MEMCHKA] -Memory Stick™ non trovato. Sono richiesti almeno - -[MEMCHKB] -per salvare la partita. - -[MEMCHKC] -Spazio insufficiente sul Memory Stick™ per salvare la partita. Sono richiesti almeno - -[MEMCHKD] -per salvare la partita. - -[M_FAIL] -MISSIONE FALLITA! - -[M_OVER] -MISSIONE TERMINATA! - -[M_PASS] -~Y~MISSIONE COMPLETATA! ~n~~1~$ - -[M_PASSN] -~Y~MISSIONE COMPLETATA! - -[MRACE11] -~w~Torna su un veicolo per finire la gara - -[FEI_LE1] -Mostra legenda - -[FEI_LE2] -Nascondi legenda - -[FEI_TA1] -Metti bersaglio - -[FEI_TA2] -Togli bersaglio - -[C1FREE2] -levetta analogica sinistra - -[C3FREE2] -levetta analogica sinistra - -[FEA_MP3] -TRACCE SCELTE: - -[FEA_NA] -NON DISPONIBILE - -[MPC_060] -Antonio - -[MPC_061] -Tuta - -[MPC_062] -Bravo ragazzo - -[MPC_063] -Anticonformista - -[MPC_064] -Kazuki - -[NUMDBL1] -DEBUG 1 (~1~) (~1~) - -[SVRMBRS] -GIOCATORI: - -[RAMP_P] -VIOLENZA SUPERATA! - -[RAMP_F] -VIOLENZA FALLITA! - -[MPWLPAC] -ha preso una macchina bersaglio. - -[MPWLDAC] -ha consegnato una macchina bersaglio. - -[LDWAIT] -Premi ~X~ per continuare. - -[LOADING] -Caricamento in corso... - -[RACEP1] -1° - -[RACEP2] -2° - -[RACEP3] -3° - -[RACEP4] -4° - -[RACEP5] -5° - -[RACEP6] -6° - -[FEA_UT] -TRACCIA SCONOSCIUTA - -[LOADIN2] -Caricamento... - -[DNH5_X2] -~r~Non hai piazzato tutte le bombe. - -[MRACE12] -HAI - -[MRACE13] -SECONDI PER TROVARE UN VEICOLO - -[MRACE14] -SECONDO PER TROVARE UN VEICOLO - -[DTB_03] -~w~Vince la squadra che protegge più a lungo le sue macchine. - -[PUPCOL] -ha raccolto un potenziamento - -[TNKCSE] -Danneggia il carro armato per rubarlo a un altro giocatore. - -[TNKTM] -Per vincere, devi sopravvivere il più a lungo possibile nel carro armato. - -[MPFAIL] -FALLIMENTO - -[GS_LOC2] -LUOGO: - -[DTBSWPA] -Hai respinto i Sindacco per - -[DTBSWPB] -Ora distruggi le loro macchine in un tempo minore. - -[DTBSWPC] -Hai distrutto le macchine dei Forelli in - -[DTBSWPD] -Ora proteggi le tue macchine per più tempo. - -[CHANOP] -Cambia opzione - -[MPSSCT] -LIMITE SOLDI: - -[F_RANG2] -~r~La radio del camion dei pompieri non funziona in metropolitana! - -[T_RANG2] -~r~Non ci sono rifiuti da raccogliere in metropolitana! - -[T_RANGE] -~r~Qui non ci sono rifiuti da raccogliere! - -[FEU_YES] -SÌ - -[FEU_NO] -NO - -[HELP43] -~w~Usa il freno a mano per far virare più rapidamente la barca. - -[RACE_T6] -~r~Uno dei veicoli è a pezzi, la gara è stata annullata! - -[FED_POS] -POSIZIONE SCHERMO - -[FES_DSS] -Seleziona il salvataggio da eliminare: - -[FES_LSS] -Seleziona il salvataggio da caricare: - -[FES_DSC] -Eliminazione completata. Seleziona OK per continuare. - -[FES_DEL] -Elimina salvataggio - -[FES_DGM] -ELIMINA SALVATAGGIO - -[ITBEG] -In principio... - -[FET_LG] -CARICA PARTITA - -[FES_SCG] -Salvare la partita attuale? - -[FESZ_QZ] -Sei sicuro di voler salvare questa partita? +[FES_FMS] +Formattazione completata. Seleziona OK per continuare. [FES_SSC] Salvataggio completato. Seleziona OK per continuare. -[FEM_NTF] -La memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1 non è formattata. - -[FES_CFM] -Formattazione della memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1 in corso... Non rimuovere la memory card (8MB) (per PlayStation®2) né il controller e non resettare/spegnere la console! - -[FES_LOQ] -Caricamento fallito! Il salvataggio sulla memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1 non è compatibile con questo gioco. Provare a caricare un salvataggio differente. Riavvio del gioco in corso... - -[FEM_NTH] -Nessuna memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1. - -[FES_CMP] -Salvataggio fallito! Controllare la memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1 e riprovare. - -[FESZ_FO] -La memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1 non è formattata. Vuoi formattarla adesso? - -[FES_NOC] -Nessuna memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1. - -[FES_LOE] -Caricamento fallito! Controllare la memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1 e riprovare. Riavvio del gioco in corso... - -[FES_DEE] -Eliminazione fallita! Controllare la memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1 e riprovare. - -[SLONFM] -Formattazione fallita! Controllare la memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1 e riprovare. - -[SLONDR] -Spazio libero insufficiente sulla memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1. Inserire una memory card (8MB) (per PlayStation®2) nell'ingresso MEMORY CARD 1 con almeno 330 KB di spazio libero per salvare questa partita. - -[SLNSP] -Spazio libero insufficiente sulla memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1. Per salvare questa partita sono richiesti almeno altri 101 KB di spazio libero sulla memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1. - -[SLONNF] -La memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1 non è formattata. Vuoi formattarla adesso? - -[FESZ_FF] -Formattazione fallita! Controllare la memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1 e riprovare. - -[MCDNSP] -Nessuna memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1. Per poter salvare la tua partita, inserire una memory card (8MB) (per PlayStation®2) con almeno 330 KB di spazio libero. Iniziare comunque? - -[MCGNDP] -Spazio libero insufficiente sulla memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1. Sono richiesti almeno 330 KB di spazio libero per salvare questa partita. Iniziare comunque? - -[MCGNSP] -Spazio libero insufficiente sulla memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1. Per salvare questa partita sono richiesti almeno altri 101 KB di spazio libero sulla memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1. Iniziare comunque? - -[FESZ_WR] -Salvataggio dati in corso... Non rimuovere la memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1, né il controller e non resettare/spegnere la console! - -[FELD_WR] -Caricamento dati in corso... Non rimuovere la memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1, né il controller e non resettare/spegnere la console! - -[FEDL_WR] -Eliminazione dati in corso... Non rimuovere la memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1, né il controller e non resettare/spegnere la console! - -[C0VEWEA] -levetta analogica destra - -[C1VEWEA] -levetta analogica destra - -[C2VEWEA] -levetta analogica destra - -[C3VEWEA] -tasti direzionali - -[C0PDLOO] -levetta analogica destra - -[C1PDLOO] -levetta analogica destra - -[C2PDLOO] -levetta analogica destra - -[C3PDLOO] -levetta analogica destra - -[C0AMMOV] -levetta analogica sinistra o tasti direzionali - -[C1AMMOV] -levetta analogica sinistra o tasti direzionali - -[C2AMMOV] -levetta analogica sinistra o tasti direzionali - -[C3AMMOV] -levetta analogica sinistra o tasti direzionali - -[FEC_ACB] -Accelera/Frena - -[FEM_SL8] -Salvataggio 8 assente - -[FES_SAV] -SALVA PARTITA - -[FES_FMS] -Formattazione completata. - -[MCDNCK] -Controllo della memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1 in corso... Non rimuovere la memory card (8MB) (per PlayStation®2) né i controller e non resettare/spegnere la console. +[FES_DSC] +Eliminazione completata. Seleziona OK per continuare. [FESZ_QC] -Vuoi sovrascrivere questo salvataggio danneggiato? +Vuoi sovrascrivere il salvataggio corrotto? -[NOCONT] -Inserire un controller analogico (DUALSHOCK®) oppure un controller analogico (DUALSHOCK®2) nell'ingresso controller 1 per continuare. +[FES_CHE] +Attenzione! Uno o più trucchi sono stati attivati: ciò influenzerà il salvataggio. Si consiglia di non salvare questa partita. -[FES_LCF] -Caricamento fallito! Controllare la memory card (8MB) (per PlayStation®2) inserita nell'ingresso MEMORY CARD 1 e riprovare. +[FET_SG] +SALVA PARTITA -[DBGHELP] -~h~DEBUG MENU~w~ Select Item with ~h~left button & right button. ~w~Press ~h~X button ~w~to launch. Press ~h~TRIANGLE button ~w~to quit menu. +[FEH_BRI] +BRIEFING -[DBGSEL1] -Level Skip Menu +[FEH_MAP] +MAPPA -[DBGSEL2] -Car Viewer +[FEM_OK] +OK -[DBGSEL3] -Character Viewer +[FEC_CRO] +Abbassarsi -[DBGSEL4] -Building Viewer +[FEC_CR3] +Abbassarsi (tasto L3) -[DBGSEL5] -Weapon Cheat +[FEC_SMT] +Sottomissione -[DBGSEL6] -Player Cheat +[FEC_SM3] +Sottomissione (tasto R3) -[DBGSEL7] -Weather and Time Changer +[FEC_RSC] +Stazioni radio -[DBGSEL8] -Marketing Camera +[ST_PR01] +Apprendista -[DBGSEL9] -MoCap Menu +[ST_PR02] +Aviere -[DBGSE10] -USJ Editor +[ST_PR03] +Ufficiale -[DBGSE11] -Toggle Player Coordinates +[ST_PR04] +Caporale -[DBGFIL0] -Ped Selector +[ST_PR05] +Tenente -[DBGFIL1] -Car Selector +[ST_PR06] +Sergente -[PLCHLD] -Placeholder: mission will complete in 5 seconds +[ST_PR07] +Capitano -[PLCHLD2] -Placeholder Cutscene +[ST_PR08] +Biggs -[PLCHLD3] -Placeholder (MOCAP) Cutscene +[ST_PR09] +Wedge -[LS_MAC] -Ma Cipriani stream +[ST_PR10] +Barone rosso -[LS_JDT] -J.D. O'Toole stream +[ST_PR11] +Goose -[LS_SAL] -Salvatore stream +[ST_PR12] +Viper -[LS_COMP] -Completed all Missions in this stream +[ST_PR13] +Jester -[TEMP1] -Number: ~1~ +[ST_PR14] +Chappy -[LS2_H1] -Use ~h~analog up & down ~w~to select story stream. Use ~h~analog left & right ~w~to select mission. Use ~h~L button & R button ~w~to select an island. Press ~h~X button ~w~to start mission. Press ~h~TRIANGLE button ~w~to exit. +[ST_PR15] +Iceman -[LS2_H2] -You cannot use levelskip when you are ~h~on a mission. +[ST_PR16] +Maverick -[LS2_VIC] -~y~Vincenzo Cilli -~g~ ~a~ +[ST_PR17] +Noops -[LS2_MAC] -~y~Ma Cipriani -~g~ ~a~ +[ST_PR18] +Maresciallo -[LS2_JDT] -~y~J.D. O'Toole -~g~ ~a~ +[ST_PR19] +Asso -[LS2_SAL] -~y~Salvatore -~g~ ~a~ +[FET_LG] +CARICA PARTITA -[LS2_MAR] -~y~Maria -~g~ ~a~ +[CAR_EXP] +Veicoli distrutti -[LS2_NED] -~y~Ned Burner -~g~ ~a~ +[BOA_EXP] +Imbarcazioni distrutte -[LS2_DON] -~y~Donald Love -~g~ ~a~ +[HEL_DST] +Velivoli distrutti -[LS2_RAY] -~y~Ray Machowski -~g~ ~a~ +[STFT_01] +Tempo migliore in 'Due ruote d'acciaio' -[LS2_TOS] -~y~Toshiko Kasen -~g~ ~a~ +[STFT_02] +Tempo migliore in 'L'autista' -[FREEON] -Time Frozen +[STFT_03] +Tempo migliore nella prova del fango -[FREEOFF] -Time Unfrozen +[STFT_04] +Tempo migliore con gli aerei radiocomandati -[WTC_INS] -Use ~h~analog up & down ~w~to change weather. Use ~h~analog left & right ~w~to change hour. Press ~h~TRIANGLE button ~w~to exit. Press ~h~SQUARE button ~w~to freeze time. +[STFT_05] +Tempo migliore con le macchine radiocomandate -[WTC_TIM] -TIME: ~1~:00 +[STFT_06] +Tempo migliore di raccolta con l'elicottero -[WTC_WE0] -WEATHER: CLOUDY +[STFT_07] +Tempo migliore in 'Terminal Velocity' -[WTC_WE1] -WEATHER: EXTRA COLOURS +[STFT_08] +Tempo migliore in 'Ocean Drive' -[WTC_WE2] -WEATHER: EXTRA SUNNY +[STFT_09] +Tempo migliore in 'Border Run' -[WTC_WE3] -WEATHER: FOGGY +[STFT_10] +Tempo migliore in 'Capital Cruise' -[WTC_WE4] -WEATHER: HURRICANE +[STFT_11] +Tempo migliore in 'Tour!' -[WTC_WE5] -WEATHER: RAINY +[STFT_12] +Tempo migliore in 'V.C. Endurance' -[WTC_WE6] -WEATHER: SNOW +[STHC_01] +Punteggio migliore al poligono -[WTC_WE7] -WEATHER: SUNNY +[STHC_02] +Miglior percentuale di colpi al poligono -[CVHELP] -Use ~h~up button and down button ~w~to change character. Use ~h~left button and right button ~w~to rotate camera. HOLD ~h~SQUARE ~w~to zoom in (toggles upper and lower body). Press ~h~TRIANGLE ~w~to quit character viewer. +[STHC_03] +Numero di traffici di droga -[VMENU1] ---------- Select a Viewer --------- --- ~h~Car~w~ - Character - Building -- +[HELP24] +Adesso puoi accettare le missioni del Colonnello. -[VMENU2] ---------- Select a Viewer --------- --- Car - ~h~Character~w~ - Building -- +[HELP25] +Adesso puoi accettare le missioni di Avery Carrington. -[VMENU3] ---------- Select a Viewer --------- --- Car - Character - ~h~Building~w~ -- +[HELP29] +Puoi far visita al negozio di abbigliamento quando non sei in missione. -[CV_C] -COMPARISON MODEL +[HELP30] +Quando compri nuovi abiti, il tuo livello di sospetto scenderà a zero. -[CV_0] -ROW: -- MODEL: player +[BJM2_22] +~r~Sei uscito dal poligono di tiro! -[CV_1] -ROW: 114 MODEL: cop +[BJM2_23] +~g~Se esci dal poligono di tiro durante la competizione, fallirai la missione. -[CV_2] -ROW: 115 MODEL: swat +[ASM4_24] +Distanza: -[CV_3] -ROW: 116 MODEL: fbi +[RBM1_6] +~g~Porta Mercedes e la 'Love Juice' al gruppo nello studio di registrazione. -[CV_4] -ROW: 117 MODEL: army +[RBM1_3] +NON NECESSARIO -[CV_5] -ROW: 118 MODEL: medic +[HAM1_5] +NON NECESSARIO -[CV_6] -ROW: 119 MODEL: fireman +[RBM1_11] +NON NECESSARIO -[CV_7] -ROW: 71 MODEL: male01 +[HELP31] +Per eseguire un assalto in macchina, guarda a destra o a sinistra premendo il tasto L2 o il tasto R2. -[CV_9] -ROW: 120 MODEL: taxi_d +[HELP34] +Hai bisogno di una mitragliatrice per eseguire un assalto in macchina. -[CV_10] -ROW: 2 MODEL: pimp +[STRIP_1] +~r~Soldi insufficienti, brutto idiota. -[CV_11] -ROW: 13 MODEL: criminal01 +[EXIT_1] +Premi ~k~~PED_SPRINT~ per uscire. -[CV_12] -ROW: 14 MODEL: criminal02 +[ASM1_A] +Mr. Teal, il tuo aiuto nello sradicare gli stranieri è stato inestimabile per il nostro lavoro. Ho un altro compito con un contatto più 'diretto'. -[CV_13] -ROW: 15 MODEL: male02 +[ASM1_B] +I dettagli per il prossimo colpo sono stati attaccati sotto al telefono. -[CV_14] -ROW: 16 MODEL: male03 +[ASM1_C] +Ho un altro compito con un contatto più 'diretto'. -[CV_15] -ROW: 121 MODEL: fatmale01 +[SCARF] +Appartamento 3c -[CV_16] -ROW: 17 MODEL: fatmale02 +[LAW4_10] +La ricca amministrazione ci ha rotto! -[CV_17] -ROW: 18 MODEL: female01 +[GEN1_04] +~g~Attraversa la porta per accedere alla piattaforma sul tetto di Gonzalez. -[CV_18] -ROW: 19 MODEL: female02 +[GEN1_17] +~g~Gonzalez sta fuggendo! Seguilo attraverso le porte e finiscilo! -[CV_19] -ROW: 20 MODEL: female03 +[RCH1_9] +~b~TEMPO TOTALE: ~1~:~1~ -[CV_20] -ROW: 21 MODEL: fatfemale01 +[RCH1_10] +~b~TEMPO TOTALE: ~1~:0~1~ -[CV_21] -ROW: 22 MODEL: fatfemale02 +[WHEEL01] +BONUS DOPPIO SU DUE RUOTE: ~1~$ Distanza: ~1~.~1~ m Tempo: ~1~ secondi -[CV_22] -ROW: 23 MODEL: prostitute +[WHEEL02] +BONUS DOPPIO SU DUE RUOTE: ~1~$ Distanza: ~1~ piedi Tempo: ~1~ secondi -[CV_23] -ROW: 24 MODEL: prostitute2 +[WHEEL03] +BONUS SU DUE RUOTE: ~1~$ Tempo: ~1~ secondi -[CV_24] -ROW: 25 MODEL: p_man1 +[WHEEL04] +BONUS SU DUE RUOTE: ~1~$ Distanza: ~1~.~1~ m -[CV_25] -ROW: 26 MODEL: p_man2 +[WHEEL05] +BONUS SU DUE RUOTE: ~1~$ Distanza: ~1~ piedi -[CV_26] -ROW: 27 MODEL: p_wom1 +[WHEEL06] +BONUS IMPENNATA: ~1~$ Distanza: ~1~.~1~ m Tempo: ~1~ secondi -[CV_27] -ROW: 28 MODEL: p_wom2 +[WHEEL07] +BONUS IMPENNATA: ~1~$ Distanza: ~1~ piedi Tempo: ~1~ secondi -[CV_28] -ROW: 29 MODEL: ct_man1 +[WHEEL08] +BONUS IMPENNATA: ~1~$ Tempo: ~1~ secondi -[CV_29] -ROW: 30 MODEL: ct_man2 +[WHEEL09] +BONUS IMPENNATA: ~1~$ Distanza: ~1~.~1~ m -[CV_30] -ROW: 31 MODEL: ct_wom1 +[WHEEL10] +BONUS IMPENNATA: ~1~$ Distanza: ~1~ piedi -[CV_31] -ROW: 32 MODEL: ct_wom2 +[WHEEL11] +BONUS FRENATA IN PUNTA: ~1~$ Distanza: ~1~.~1~ m Tempo: ~1~ secondi -[CV_32] -ROW: 33 MODEL: li_man1 +[WHEEL12] +BONUS FRENATA IN PUNTA: ~1~$ Distanza: ~1~ piedi Tempo: ~1~ secondi -[CV_33] -ROW: 34 MODEL: li_man2 +[WHEEL13] +BONUS FRENATA IN PUNTA: ~1~$ Tempo: ~1~ secondi -[CV_34] -ROW: 35 MODEL: li_wom1 +[WHEEL14] +BONUS FRENATA IN PUNTA: ~1~$ Distanza: ~1~.~1~ m -[CV_35] -ROW: 36 MODEL: li_wom2 +[WHEEL15] +BONUS FRENATA IN PUNTA: ~1~$ Distanza: ~1~ piedi -[CV_36] -ROW: 37 MODEL: docker1 +[ROK3_72] +Love Fist! -[CV_37] -ROW: 38 MODEL: docker2 - -[CV_38] -ROW: 39 MODEL: scum_man - -[CV_39] -ROW: 40 MODEL: scum_wom - -[CV_40] -ROW: 41 MODEL: worker1 - -[CV_41] -ROW: 42 MODEL: worker2 - -[CV_42] -ROW: 43 MODEL: b_man1 - -[CV_43] -ROW: 44 MODEL: b_man2 - -[CV_44] -ROW: 67 MODEL: b_man3 - -[CV_45] -ROW: 45 MODEL: b_wom1 - -[CV_46] -ROW: 46 MODEL: b_wom2 - -[CV_47] -ROW: 70 MODEL: b_wom3 - -[CV_48] -ROW: 47 MODEL: mod_man - -[CV_49] -ROW: 48 MODEL: mod_wom - -[CV_50] -ROW: 49 MODEL: st_man - -[CV_51] -ROW: 50 MODEL: st_wom - -[CV_52] -ROW: 51 MODEL: fan_man1 - -[CV_53] -ROW: 52 MODEL: fan_man2 - -[CV_54] -ROW: 53 MODEL: fan_wom - -[CV_55] -ROW: 54 MODEL: hos_man - -[CV_56] -ROW: 55 MODEL: hos_wom - -[CV_57] -ROW: 56 MODEL: const1 - -[CV_58] -ROW: 57 MODEL: const2 - -[CV_59] -ROW: 58 MODEL: shopper1 - -[CV_60] -ROW: 59 MODEL: shopper2 - -[CV_61] -ROW: 60 MODEL: shopper3 - -[CV_62] -ROW: 61 MODEL: stud_man - -[CV_63] -ROW: 62 MODEL: stud_wom - -[CV_64] -ROW: 63 MODEL: cas_man - -[CV_65] -ROW: 64 MODEL: cas_wom - -[CV_79] -ROW: 123 MODEL: gang01 LEONE_A - -[CV_80] -ROW: 124 MODEL: gang02 LEONE_B - -[CV_81] -ROW: 69 MODEL: gang03 TRIAD_A - -[CV_82] -ROW: 3 MODEL: gang04 TRIAD_B - -[CV_83] -ROW: 4 MODEL: gang05 DIABLO_A - -[CV_84] -ROW: 5 MODEL: gang06 DIABLO_B - -[CV_85] -ROW: 68 MODEL: gang07 YAKUZA_A - -[CV_86] -ROW: 6 MODEL: gang08 YAKUZA_B - -[CV_87] -ROW: 7 MODEL: gang09 YARDIE_A - -[CV_88] -ROW: 8 MODEL: gang10 YARDIE_B - -[CV_89] -ROW: 9 MODEL: gang11 COLOMBIAN_A - -[CV_90] -ROW: 10 MODEL: gang12 COLOMBIAN_B - -[CV_91] -ROW: 11 MODEL: gang13 HOOD_A - -[CV_92] -ROW: 12 MODEL: gang14 HOOD_B - -[CV_93] -ROW: 89 MODEL: gang15 Forelli thug1 - -[CV_94] -ROW: 90 MODEL: gang16 Forelli thug2 - -[CV_95] -ROW: 88 MODEL: gang17 Sindacco thug1 - -[CV_96] -ROW: 89 MODEL: gang18 Sindacco thug2 - -[CV_109] -ROW: 65 MODEL: SAL_01 Salvatore (Mob Don) - -[CV_110] -ROW: 66 MODEL: RAY_01 Ray (Bad Cop) - -[CV_111] -ROW: 72 MODEL: VINC_01 Vincenzo Cilli - -[CV_112] -ROW: 73 MODEL: GRDANG1 Avenging Angel - -[CV_113] -ROW: 74 MODEL: NED_01 Ned Burner (Reporter) - -[CV_114] -ROW: 75 MODEL: MASTOR Massimo Torrini (Assassin) - -[CV_115] -ROW: 76 MODEL: TOOL_01 JD O'Toole - -[CV_116] -ROW: 77 MODEL: Not used Fthr Kenny - -[CV_117] -ROW: 78 MODEL: GRDANG2 Avenging Angel 2 - -[CV_118] -ROW: 79 MODEL: M_HOLE Mayor RC Hole - -[CV_119] -ROW: 80 MODEL: FRANFOR Franco Forelli - -[CV_120] -ROW: 81 MODEL: KAZUKI Kazuki Kasen - -[CV_121] -ROW: 82 MODEL: PAULIE Paulie Sindacco - -[CV_122] -ROW: 83 MODEL: HOPPER Jane Hopper - -[CV_123] -ROW: 84 MODEL: AVERY Avery Carrington - -[CV_124] -ROW: 85 MODEL: CASA Giovanni Casa - -[CV_125] -ROW: 86 MODEL: BABY Giovanni Casa (baby) - -[CV_126] -ROW: 87 MODEL: MCAFFRY Det. Leon McAffrey - -[CV_127] -ROW: 92 MODEL: EIGHT 8Ball - -[CV_128] -ROW: 93 MODEL: MAR_01 Maria - -[CV_129] -ROW: 94 MODEL: LOVE_01 Donald Love - -[CV_130] -ROW: 95 MODEL: MICKEYH Mickey H - -[CV_131] -ROW: 96 MODEL: WAYNE Wayne (Biker Dude) - -[CV_132] -ROW: 97 MODEL: BIKER1 Biker Dude 1 - -[CV_133] -ROW: 98 MODEL: BIKER2 Biker Dude 2 - -[CV_134] -ROW: 99 MODEL: DONOVAN O'Donovan - -[CV_135] -ROW: 100 MODEL: KAS_01 Toshiko Kasen (kimono) - -[CV_136] -ROW: 101 MODEL: WKAS_01 Toshiko Kasen (western) - -[CV_137] -ROW: 104 MODEL: JDMADE JD O'Toole - Made Man - -[CV_138] -ROW: 106 MODEL: THUG_01 Sicilian Thug 1 - -[CV_139] -ROW: 107 MODEL: THUG_02 Sicilian Thug 2 - -[CV_140] -ROW: 109 MODEL: CAMP_MAN Campaign Worker - -[CV_141] -ROW: 110 MODEL: CAMP_WOM Campaign Worker 2 - -[CV_142] -ROW: 111 MODEL: MIGUEL Miguel - -[CV_143] -ROW: 112 MODEL: DELIASS Deli Assistant - -[CV_144] -ROW: 113 MODEL: HOBO_01 Donald Love 2 - -[CV_68] -ROW: 122 MODEL: HITMAN Hitman - -[CV_146] -ROW: 125 MODEL: HOLEJOG Mayor RC Hole (Jogging outfit) - -[CV_147] -ROW: 126 MODEL: Chauff Chauffeur - -[CV_148] -ROW: 128 MODEL: plr2 (Lawyer) - -[CV_149] -ROW: 129 MODEL: plr3 (Travel clothes) - -[CV_150] -ROW: 130 MODEL: plr4 (Chauffeur) - -[CV_151] -ROW: 131 MODEL: plr5 (Hockey mask) - -[CV_152] -ROW: 132 MODEL: plr6 (Tuxedo) - -[CV_153] -ROW: 133 MODEL: plr7 (Avenging Angel) - -[CV_154] -ROW: 134 MODEL: plr8 (The King of Rock'n Roll) - -[CV_155] -ROW: 135 MODEL: plr9 (Cock's Mascot) - -[CV_156] -ROW: 136 MODEL: plr10 (Boxer Shorts) - -[CV_157] -ROW: 137 MODEL: plr11 (Bad Super Hero) - -[CV_158] -ROW: 138 MODEL: plr12 (Dragon) - -[CV_159] -ROW: 139 MODEL: PHILC Phil Cassidy - -[CV_160] -ROW: 140 MODEL: GREASE Grease Zuko - -[CV_161] -ROW: 141 MODEL: GUN_ASS Gun assistant - -[CV_162] -ROW: -- MODEL: JD_shot JD shot dead - -[CV_163] -ROW: -- MODEL: BODYBAG bodybag - -[CV_164] -ROW: 142 MODEL: SAL_CON Sal Convict - -[VV_131] -ID:131 MODEL: Landstalker (TBC) - -[VV_135] -ID:135 MODEL: Perenial (TBC) - -[VV_138] -ID:138 MODEL: Firetruck - -[VV_141] -ID:141 MODEL: Manana (TBC) - -[VV_148] -ID:148 MODEL: FBI Car (TBC) - -[VV_152] -ID:152 MODEL: Kuruma (TBC) - -[VV_164] -ID:164 MODEL: Dodo (TBC) - -[VV_169] -ID:169 MODELL: Rc Bandit - -[VV_170] -ID:170 MODEL: BellyUp (Triad) (TBC) - -[VV_172] -ID:172 MODEL: Leone Sentinel (TBC) - -[VV_174] -ID: 174 MODEL: Yakuza (TBC) - -[VV_179] -ID:179 MODEL: Flatbed (TBC) - -[VV_181] -ID:181 MODEL: Borgnine Taxi (TBC) - -[VV_188] -ID: 188 MODEL: Sindacco Argento (TBC) - -[VV_189] -ID: 189 MODEL: Forelli Lexcess (TBC) - -[VV_192] -ID:192 MODEL: Speeder (TBC) - -[BV_H1] -Press CIRCLE to swap building model. - -[BV_0A] -ROW: 2 - Portland. Safehouse Exterior. Press CIRCLE to swap. - -[BV_0B] -ROW:24 - Portland. Safehouse Interior. Press CIRCLE to swap. - -[BV_1] -ROW: 3 - Portland. Ferry Terminal. - -[BV_2A] -ROW: 4 - Portland. Callahan Bridge 1. Press CIRCLE to swap. - -[BV_2B] -ROW: 4 - Portland. Callahan Bridge 2. Press CIRCLE to swap. - -[BV_3] -ROW: 5 - Portland. Les Cargo Freighter. - -[BV_4A] -ROW: 6 - Portland. Doll's House Brothel 1. Press CIRCLE to swap. - -[BV_4B] -ROW: 6 - Portland. Doll's House Brothel 2. Press CIRCLE to swap. - -[BV_5] -ROW: 7 - Portland. Tower Block. - -[BV_6] -ROW: 8 - Portland. Eddie's Garage. - -[BV_7] -ROW: 9 - Portland. Bowler's Fist Pub. - -[BV_8] -ROW:10 - Portland. Hepburn Heights. - -[BV_9] -ROW:11 - Portland. Short Stay Hotel. - -[BV_10] -ROW:12 - Portland. Car Dealership. - -[BV_11] -ROW:13 - Portland. Bus Graveyard. - -[BV_12A] -ROW:14 - Portland. Drugs Warehouse 1 (awaiting approval). Press CIRCLE to swap. - -[BV_12B] -ROW:14 - Portland. Drugs Warehouse 2 (awaiting approval). Press CIRCLE to swap. - -[BV_13] -ROW:15 - Portland. Ma Cipriani's Restaurant. - -[BV_14] -ROW:17 - Portland. Basketball Court, Callahan. - -[BV_15] -ROW:18 - Portland. Bike Shop. - -[BV_16] -ROW:19 - Portland. Building near Basketball Court. - -[BV_17A] -ROW:20 - Portland. Luigi's Nightclub 1. - -[BV_17B] -ROW:20 - Portland. Luigi's Nightclub 2. - -[BV_17C] -ROW:20 - Portland. Luigi's Nightclub 3. - -[BV_18] -ROW:21 - Portland. Casa's Gourmet Deli. - -[BV_19] -ROW:22 - Portland. Rusty Ship. - -[BV_20] -ROW:23 - Portland. Door for Shopfront. - -[BV_21] -ROW:25 - Staunton. Casino. - -[BV_22] -ROW:26 - Staunton. Phil Cassidy's Store. - -[BV_23] -ROW:27 - Staunton. Zip store. - -[BV_24] -ROW:28 - Staunton. Container Park. - -[BV_25] -ROW:29 - Staunton. Ferry Terminal. - -[BV_26A] -ROW:30 - Staunton. Fort Staunton 1 NORTH. - -[BV_26B] -ROW:30 - Staunton. Fort Staunton 2 NORTH. - -[BV_27A] -ROW:30 - Staunton. Fort Staunton 1 SOUTH. - -[BV_27B] -ROW:30 - Staunton. Fort Staunton 2 SOUTH. - -[BV_28] -ROW:31 - Ferry - Not Visible At Present. - -[BV_29A] -ROW:32 - Staunton. Safehouse Exterior (unchanged). Press CIRCLE to swap. - -[BV_29B] -ROW:32 - Staunton. Safehouse Interior. Press CIRCLE to swap. - -[BV_30] -ROW:33 - Staunton. Steps Added To Building. - -[BV_31] -ROW:34 - Portland. Outbuilding. - -[BV_32A] -ROW:34 - Shoreside. Safehouse Exterior (unchanged). Press CIRCLE to swap. - -[BV_32B] -ROW:34 - Shoreside. Safehouse Interior. Press CIRCLE to swap. - -[BV_33] -Not in Doc - Staunton - Warehouse Interior (not internally approved). - -[BV_34A] -Not in Doc - Staunton - Church Exterior. Press CIRCLE to swap. - -[BV_34B] -Not in Doc - Staunton - Church Interior for scripted cutscene. Press CIRCLE to swap. - -[MODWOR] -Modify World Speed - -[MODTIT] -Changing World Speed - -[NEDS2] -La passione del colpo - -[NEDS3] -Karmageddon - -[NEDS4] -Falsi idoli - -[DONS1] -Il candidato del festino cadaverico - -[GAR_WIL] -Porta la macchina al garage. - -[DONS2] -Guida il voto - -[DONS3] -Pene elettorali - -[DONS4] -Elezioni infuocate - -[DONS5] -Love & pallottole - -[DONS6] -La contraffazione conta - -[DONS7] -Love agli sgoccioli - -[DONS7AA] -Toni, devi aiutarmi! - -[DONS7AB] -O'Donovan ha le prove che mi associano a Salvatore, siamo fottuti! - -[DONS7AC] -Calmati, le prove spariscono tutti i giorni. - -[DONS7AD] -Per non parlare di giudici, testimoni, giurati... - -[DONS7AE] -Speravo che la vedessi così. - -[DONS7AF] -Uno dei miei uomini ha seguito il tipo con le prove. - -[DONS7AG] -L'appuntamento è sotto il cavalcavia di Newport. - -[SALS1] -Una passeggiata nel parco - -[SALS2] -Toni d'onore - -[SALS3] -Colto sul fatto - -[SALS4] -Ricerca e salvataggio - -[SALS5] -Negoziazione pacifica - -[SALS6] -Ambasciator porta pena - -[RAYS1] -Sayonara Sindacco - -[RAYS2] -Ga-Yardie! - -[RAYS3] -Crazy '69' - -[RAYS4] -La notte dei rastoni viventi - -[RAYS5] -Scarica abusiva - -[MC_01] -MOCAP Scenes - -[MC_02] -Non puoi andare in missione quando stai usando il selettore di sequenze. - -[MC_04] -Seleziona la scena che preferisci e premi CROCE. Premi TRIANGOLO per uscire. - -[MC_03] -~g~nome sequenza - nome script ~w~ - -[MC_S01] -1. Biker - mar4 - -[MC_S02] -2. Bonevoy - jdt1 - -[MC_S03] -3. Campain - dons3 - -[MC_S04] -4. Cashchp - tosh4 - -[MC_S05] -5. Contban - sal5 - -[MC_S06] -6. Crazy69 - rays3 - -[MC_S07] -7. Cuttest - none - -[MC_S08] -8. Deadly - tosh1 - -[MC_S09] -9. Donprob - donh6 - -[MC_S10] -10. Drivnmr - sal8 - -[MC_S11] -11. Electon - dons7 - -[MC_S12] -12. Homswet - vic1 - -[MC_S13] -13. Hotwhel - vic6 - -[MC_S14] -14. Kidnapp - jdt5 - -[MC_S15] -15. Landgrb - donh1 - -[MC_S16] -16. Morgue - dons1 - -[MC_S17] -17. Overdos - mar5 - -[MC_S18] -18. Rufjust - salh1 - -[MC_S19] -19. Sayonar - rays1 - -[MC_S20] -20. sicilan - salh5 - -[MC_S21] -21. Theofer - sal1 - -[MC_S22] -22. Intro - -[MC_S23] -23. Final - -[MC_S24] -24. Final_2 - -[NEDS1] -L.C. Confidential - -[WILGAR2] -Abbandona la macchina ed esci. - -{=================================== MISSION TABLE SAL1 ===================================} - -[SAL1_M1:SAL1] -~w~Salvatore vuole parlare. - -[SAL1_M2:SAL1] -~w~Non sto al gioco di Salvatore. - -[SAL1_M3:SAL1] -~w~Grazie per la donazione, ragazzo... ci si vede. - -[SAL1_M5:SAL1] -~w~Ehi! - -[SAL1_D1:SAL1] -~w~Ehi! Crumiro! - -[SAL1_D2:SAL1] -~w~Prendiamolo! - -[SAL1_D3:SAL1] -~w~Eccolo! - -[SAL1_D4:SAL1] -~w~È andato di là! - -[SAL1_E1:SAL1] -~w~Fuggi dal porto! - -[SAL1_A1:SAL1] -~w~Incontrati con la sindacalista, Jane Hopper, a ~y~Portland Docks. - -[THEO_01:SAL1] -Ehi capo, tutto bene? - -[THEO_02:SAL1] -Ti pare che stia bene? - -[THEO_03:SAL1] -No. - -[THEO_04:SAL1] -E allora perché fai domande da coglione? - -[THEO_05:SAL1] -Perché apri la bocca per dire ovvietà? - -[THEO_06:SAL1] -Non posso credere di essere circondato da gente come te. - -[THEO_07:SAL1] -Mi dispiace. - -[THEO_08:SAL1] -Ascolta Toni, scusami. Sei uno dei miei più fidati alleati. - -[THEO_09:SAL1] -Dopo quello che hai fatto, sei diventato come un figlio per me, anzi di più, - -[THEO_10:SAL1] -meglio di qualsiasi figlio. - -[THEO_11:SAL1] -Tua madre è una donna fortunata. - -[THEO_12:SAL1] -Così si dice. - -[THEO_13:SAL1] -Anthony, è la fine per i tipi come noi. - -[THEO_14:SAL1] -Siamo dinosauri, dei dildo... dei dodo, come diavolo si chiamano... - -[THEO_15:SAL1] -Persino nella mia famiglia mi sento come Gesù circondato da dodici Giuda. - -[THEO_16:SAL1] -Senti questa. - -[THEO_17:SAL1] -C'è una sindacalista, una puttana, che mi deve fare un favore, - -[THEO_18:SAL1] -e questa mi chiede dei soldi. - -[THEO_19:SAL1] -Mi serviva solamente l'accesso al porto per 24 ore durante lo sciopero, - -[THEO_20:SAL1] -sciopero che io ho contribuito a organizzare, per far scaricare della droga... - -[THEO_21:SAL1] -e in cambio ottengo questa merdosa richiesta! - -[THEO_22:SAL1] -Sono persone per le quali ho lottato personalmente, - -[THEO_23:SAL1] -persone per le quali ho ucciso, persone oneste. - -[THEO_26:SAL1] -È una disgrazia. È la fine per gli uomini d'onore come me e te. - -[THEO_27:SAL1] -Ascoltami Toni, voglio che le porti una cosa. - -[THEO_28:SAL1] -Vuole stare al gioco di una puttana? - -[THEO_29:SAL1] -Al momento che scelta abbiamo? - -[THEO_30:SAL1] -Ascolta: vai là, pagala e dille che vorrei fare due chiacchiere. - -[THEO_31:SAL1] -Vai. - -[THEO_24:SAL1] -- E come vengo ripagato? ~n~ - È un insulto. - -{=================================== MISSION TABLE SAL2 ===================================} - -[SAL2_N:SAL2] -Donne - -[SAL2_A0:SAL2] -~w~È uno dei tuoi nuovi tirapiedi, Sal? - -[SAL2_A1:SAL2] -~w~Signor Leone? - -[SAL2_A2:SAL2] -~w~Toni! Come stai? - -[SAL2_A3:SAL2] -~w~Sono felice che sei passato. Devi fare un lavoretto per me... - -[SAL2_A4:SAL2] -~w~Se non riesco a portare quella cagna di sindacalista dalla mia parte, di certo posso farcela con i suoi uomini. 'O capisti? - -[SAL2_A:SAL2] -~w~Raccogli sei ~b~prostitute~w~ e portale al picchetto presso il porto di Portland. - -[SAL2_B0:SAL2] -~w~Tesoro! Non ci sto a fare le cose di gruppo, idiota! - -[SAL2_B1:SAL2] -~w~Quando riuscirai a fare più posto, ti farò posto io! Non intendo viaggiare sul tetto, tesoro! - -[SAL2_D0:SAL2] -~w~Sei da solo, tesoro? - -[SAL2_D1:SAL2] -~w~Ehi, bel fusto! Vuoi divertirti un po'? - -[SAL2_D2:SAL2] -~w~Dolcezza... io e te potremmo divertirci! - -[SAL2_D3:SAL2] -~w~Dov'è la festa, tesoro? - -[SAL2_D4:SAL2] -~w~Ehi, baby! Vuoi divertirti con me? - -[SAL2_D5:SAL2] -~w~Ciao, zuccherino! ...Sono Candy! - -[SAL2_F0:SAL2] -~w~Ehi! Vengo anch'io! - -[SAL2_F1:SAL2] -~w~Ora siamo solo io e te, vero? - -[SAL2_F2:SAL2] -~w~Ci diamo dentro o cosa, tesoro? - -[SAL2_F3:SAL2] -~w~Allora, dov'è la festa? - -[SAL2_F4:SAL2] -~w~Eh dai! Non fare così. - -[SAL2_F5:SAL2] -~w~Voglio solo divertirmi con te! - -[SAL2_G0:SAL2] -~w~Portala al ~y~picchetto! - -[SAL2_G1:SAL2] -~w~Porta le ragazze al ~y~picchetto! - -[SAL2_G2:SAL2] -~w~Occupati del ~r~cliente! - -[SAL2_G3:SAL2] -~w~Occupati dei ~r~clienti! - -[SAL2_G4:SAL2] -~w~Trova altre ~b~ragazze! - -[SAL2_H:SAL2] -~w~Dov'è la festa, tesoro? - -[SAL2_P:SAL2] -~w~Divertitevi, ragazzi! Omaggio di Salvatore Leone! - -[SAL2_I0:SAL2] -~w~Trovatene un'altra, idiota! Questa è mia! - -[SAL2_I1:SAL2] -~w~Ehi! Tu chi sei, un dannato guardone? - -[SAL2_I3:SAL2] -~w~Ehi! Chi diavolo sei? Prendiamolo! - -[SAL2_I5:SAL2] -~w~Ehi amico! Mettiti in coda! Noi siamo arrivati prima. - -[SAL2_I7:SAL2] -~w~Sei il migliore! Non fermarti... oh sì, paparino! - -[SAL2_I9:SAL2] -~w~Per cui dacci dentro... - -[SAL2_K0:SAL2] -~w~Mai fare gli stronzi con Toni Cipriani! - -[SAL2_K1:SAL2] -~w~Forza! Andiamo! - -[SAL2_K2:SAL2] -~w~Forza bella! Muovi il culo! - -[SAL2_C0:SAL2] -~w~Ehi! Torna qua, bellezza! ...non mordo mica! - -[SAL2_C1:SAL2] -~w~Ehi, dolcezza! Dove stai andando? - -[SAL2_L0:SAL2] -~w~Non ho intenzione di aspettarti tutto il giorno, stronzo! - -[SAL2_L1:SAL2] -~w~Bello, guarda che lavoro a ore! - -[SAL2_X0:SAL2] -~r~Tempo scaduto! - -[SAL2_X1:SAL2] -~r~Hai ucciso troppe prostitute! - -[SAL2_X2:SAL2] -~r~Hai attaccato gli scaricatori di porto. Non si fideranno più di te! - -[SAL2_X3:SAL2] -~r~Hai attaccato le ragazze degli scaricatori di porto. Non si fideranno più di te! - -[SAL2_G5:SAL2] -~w~Sembra tu abbia un ammiratore. - -[SAL2_I8:SAL2] -~w~Non vuoi finire in galera, vero dolcezza? - -[SAL2_I6:SAL2] -~w~Sì! Sì!... - -[SAL2_M:SAL2] -~w~Cerca di non ucciderle! Trova un'altra ~b~ragazza. - -[SAL2_W1:SAL2] -~w~Hai solo fino alle 0~1~:~1~ prima che il picchetto cambi turno! - -[SAL2_W2:SAL2] -~w~Hai solo fino alle ~1~:~1~ prima che il picchetto cambi turno! - -[SAL2_G6:SAL2] -~w~Fermati sul ~y~segnale giallo~w~ per scaricare le ragazze. - -[SAL2_G7:SAL2] -~w~Disturba il cliente per far uscire la ~b~ragazza~w~ dalla macchina. - -[SAL2_B:SAL2] -~w~Non puoi far entrare altre ragazze nella tua macchina. - -{=================================== MISSION TABLE SAL3 ===================================} - -[SAL3_A0:SAL3] -~w~Toni! Come sta il mio ragazzo? - -[SAL3_A1:SAL3] -~w~Mi sembri un po' magro. La mamma ti fa da mangiare come si deve? - -[SAL3_A2:SAL3] -~w~Sto bene, signor Leone. - -[SAL3_A3:SAL3] -~w~Ascolta, questi sindacalisti, mi hanno davvero scocciato. - -[SAL3_A5:SAL3] -~w~...ma dobbiamo dare una scossa ad alcuni pezzi grossi 'meno ricettivi'. - -[SAL3_B0:SAL3] -~w~Spaventa i ~r~sindacalisti importanti.~w~ Assicurati che capiscano la lezione! - -[SAL3_B3:SAL3] -~w~D'ora in poi faranno come viene loro ordinato. - -[SAL3_BA:SAL3] -~w~Sei un pazzo! Non voglio problemi! - -[SAL3_CA:SAL3] -~w~Cosa diavolo combini? Sei matto?!? - -[SAL3_DA:SAL3] -~w~Mi mancavano ancora due rate! Brutto figlio di puttana! - -[SAL3_BB:SAL3] -~w~D'ora in avanti vedi di fare come ti viene ordinato! - -[SAL3_CB:SAL3] -~w~Stai fuori dagli affari di Leone! - -[SAL3_A4:SAL3] -~w~Alcuni iniziano a vedere le cose a modo mio... - -[SAL3_A6:SAL3] -~w~Hai capito cosa intendo? - -[SAL3_B1:SAL3] -~w~Da morti non impareranno la lezione. Non uccidere altri ~r~sindacalisti! - -[SAL3_B2:SAL3] -~r~Dovevi spaventarli, non ucciderli! - -[SAL3_B4:SAL3] -~w~Trova un altro ~r~sindacalista~w~ da raddrizzare. - -{=================================== MISSION TABLE SAL5 ===================================} - -[SAL5_D3:SAL5] -~w~Porta il ~h~veicolo ~w~nel garage. - -[SAL5_D4:SAL5] -~w~Esci dal veicolo e abbandona il ~h~garage. - -[SAL5_B:SAL5] -~w~Recupera un veicolo con quattro posti e carica dei ~b~rinforzi. - -[SAL5_C:SAL5] -~w~Ti serve un veicolo con quattro posti. - -[SAL5_C0:SAL5] -~w~Carica i ~b~rinforzi. - -[SAL5_C1:SAL5] -~w~Hai bisogno di un veicolo con più posti per caricare i ~b~rinforzi. - -[SAL5_C2:SAL5] -~w~Raggiungi i ~y~Portland Docks. - -[SAL5_AA:SAL5] -~w~Ehi... Ese... dovevi arrivare ore fa! - -[SAL5_AB:SAL5] -~w~Basta lagne, Miguel. Hai la roba? - -[SAL5_AG:SAL5] -~w~...hai i soldi? - -[SAL5_AH:SAL5] -~w~Certo... - -[SAL5_AI:SAL5] -~w~Cosa? - -[SAL5_AJ:SAL5] -~w~Brutto bastardo! - -[SAL5_C8:SAL5] -~w~Entra nel ~b~veicolo~w~ con la droga e scappa via! - -[SAL5_C9:SAL5] -~w~Porta il veicolo al ~y~garage di Salvatore. - -[SAL5_D1:SAL5] -~w~Torna sul ~b~veicolo! - -[SAL5_D2:SAL5] -~r~La droga è stata distrutta! - -[SAL5_AF:SAL5] -~w~Eh eh ah ah! Mi piaci, Toni. Hai due grosse palle, come un toro! - -[SAL5_C3:SAL5] -~w~Semina la polizia! - -[SAL5_D5:SAL5] -~r~La droga è stata sequestrata! - -[SAL5_AD:SAL5] -~w~Ehi, anch'io ho i miei impegni, Toni. La prossima volta mi trovo un altro compratore! - -[SAL5_AE:SAL5] -~w~Non troveresti qualcun altro pronto a pagare tanto quanto noi. - -[SAL5_D6:SAL5] -~w~Fai fuori gli ~r~spacciatori! - -[CONT_01:SAL5] -Stai zitta, puttana ingrata. - -[CONT_06:SAL5] -È l'unico modo nel quale riuscirai a toccarmi in questa vita. - -[CONT_07:SAL5] -Perché cazzo dovrei aver voglia di toccarti? - -[CONT_08:SAL5] -Non mi piace la roba usata. - -[CONT_09:SAL5] -Mi fai schifo. - -[CONT_12:SAL5] -Oh, ti prego. Sai una cosa? - -[CONT_15:SAL5] -Ciao, Toni... - -[CONT_16:SAL5] -Voglio i miei soldi, vecchio! - -[CONT_17:SAL5] -Fuori di qui, puttana. - -[CONT_18:SAL5] -Ehi, Anthony, sei troppo buono. - -[CONT_19:SAL5] -Donne, che vuoi farci, eh? - -[CONT_20:SAL5] -Fortunatamente c'è qualcuno di cui posso fidarmi... tu, Toni. - -[CONT_21:SAL5] -Sei molto importante per me, te l'ho mai detto? - -[CONT_22:SAL5] -Non ti si drizza nemmeno più, vecchio bastardo. - -[CONT_23:SAL5] -Non con te. Non mi piace usare i cessi pubblici, brutta zoccola! - -[CONT_24:SAL5] -È molto importante. Ascolta, adesso ci siamo solo io e te al comando. - -[CONT_25:SAL5] -Abbiamo sbaragliato quegli imbecilli. - -[CONT_26:SAL5] -Come fai a saperlo? Sei più interessato a uscire con gli uomini! - -[CONT_27:SAL5] -E tu sei felice solamente quando hai le mutande calate fino alle caviglie - -[CONT_28:SAL5] -e la schiena contro un muro! - -[CONT_29:SAL5] -Merda, ho conosciuto dei conigli cui piace scopare meno di te! - -[CONT_33:SAL5] -Allora, sta arrivando una spedizione di quello che sai. - -[CONT_34:SAL5] -Questa operazione ci farà diventare entrambi importanti. - -[CONT_35:SAL5] -Deve filare tutto liscio. - -[CONT_36:SAL5] -Ho solo bisogno di una persona di cui fidarmi, che segua alcuni miei affari. - -[CONT_37:SAL5] -Va bene Toni, ci sentiamo più tardi. - -[CONT_38:SAL5] -Un'altra cosa. Non ho mai conosciuto una ragazza con le mutande idrauliche. - -[CONT_39:SAL5] -Cristo, è stupefacente! Perché l'ho sposata? - -[CONT_40:SAL5] -Volevo una troia e ho sposato una zoccola! - -[CONT_41:SAL5] -Nella mia vita precedente devo aver veramente fatto incazzare qualcuno, - -[CONT_42:SAL5] -oramai ne sono certo. - -[CONT_02:SAL5] -- Se sento ancora una sola parola uscire dalla tua bocca... ~n~ - Dai, forza cazzone. - -[CONT_04:SAL5] -- Cosa vuoi fare? Picchiarmi? ~n~ - Perché dovrei... - -[CONT_10:SAL5] -- Io? Ti faccio schifo? Cosa? ~n~ - Sì! Schifo! - -[CONT_13:SAL5] -- Mio padre aveva ragione quando diceva che sei solo un ciccione maleducato... ~n~ - Certo, certo, certo... - -[CONT_43:SAL5] -- Ascolta, è importante... ~n~ - Vai a farti fottere, Salvatore Leone! - -[CONT_31:SAL5] -- Sei solo una testa di cazzo, un povero stronzo italiano. ~n~ - Vai TU a farti fottere! E infatti l'hai data a tutti! - -{=================================== MISSION TABLE SAL4 ===================================} - -[SAL4_I1:SAL4] -~w~Questo sciopero continuerà fin quando non riceverò delle garanzie dalla città! - -[SAL4_I2:SAL4] -~w~Mafiosi: pensano di poter pilotare il sindacato... si sbagliano! - -[SAL4_I3:SAL4] -~w~Non mi spaventano! - -[SAL4_I4:SAL4] -~w~Sono più uomo io di tutti loro messi assieme! - -[SAL4_I5:SAL4] -~w~Ascolta questa merda. - -[SAL4_I6:SAL4] -~w~Dovrei far uccidere questa puttana. Sta tirando troppo la corda! - -[SAL4_I7:SAL4] -~w~...beh, possiamo sempre giocare in due. - -[SAL4_I8:SAL4] -~w~Toni, devi portarle un messaggio a mio nome! - -[SAL4_A2:SAL4] -~w~Rimuovi l'~r~autista~w~ dall'equazione. - -[SAL4_A3:SAL4] -~w~Ehi! - -[SAL4_A4:SAL4] -~w~Sali sulla ~b~limousine. - -[SAL4_A5:SAL4] -~w~Riporta la limousine alla ~y~stazione radio! - -[SAL4_A6:SAL4] -~w~Ora aspetta la Hopper. - -[SAL4_A7:SAL4] -~w~Parcheggia la limousine nel posto giusto. Hopper non deve sospettare di nulla. - -[SAL4_B1:SAL4] -~w~Al molo dei traghetti di Harwood, a tutto gas! - -[SAL4_B2:SAL4] -~w~Agli ordini! - -[SAL4_C1:SAL4] -~w~Spaventa a morte la Hopper! - -[SAL4_C2:SAL4] -Terrore - -[SAL4S1:SAL4] -~w~Ehi, fai con calma, non è mica una gara! - -[SAL4S2:SAL4] -~w~Stai andando dalla parte giusta? - -[SAL4S3:SAL4] -~w~Ehi, non sei il mio autista! - -[SAL4S4:SAL4] -~w~Chi diavolo sei?!? - -[SAL4S5:SAL4] -~w~Taci! - -[SAL4S6:SAL4] -~w~D'ora in avanti farai tutto ciò che ti dice Salvatore Leone! - -[SAL4S7:SAL4] -~w~'O capisti? - -[SAL4S8:SAL4] -~w~Io... mi rifiuto di farmi ricattare così! - -[SAL4S9:SAL4] -~w~Vedremo! - -[SAL4S10:SAL4] -~w~Fammi subito uscire! - -[SAL4S11:SAL4] -~w~Ti prego! Ci ucciderai entrambi! - -[SAL4S12:SAL4] -~w~Noooooo! - -[SAL4S13:SAL4] -~w~Cos'ho fatto per meritarmi questo? - -[SAL4_F1:SAL4] -~w~Dov'è la mia limousine? - -[SAL4_F2:SAL4] -~w~Non sei il mio autista, chiamo la polizia! - -[SAL4_F3:SAL4] -~r~Troppo tardi, Hopper ti ha visto! - -[SAL4_F4:SAL4] -~w~Salvatore può andare a farsi fottere! - -[SAL4_F5:SAL4] -~r~La limousine è a pezzi! - -[SAL4_F6:SAL4] -~r~Hopper è morta! - -[SAL4_F7:SAL4] -~r~Hopper è fuggita! - -[SAL4_F8:SAL4] -~r~La limousine rovinata ha spaventato Hopper. - -[SAL4_F9:SAL4] -~r~Hopper è stata spaventata. - -[SAL4_P1:SAL4] -~w~OK! OK! Ne ho avuto abbastanza! - -[SAL4P1A:SAL4] -~w~Farò ciò che vuoi. - -[SAL4_P2:SAL4] -~w~Porta Hopper al ~y~picchetto presso al molo dei traghetti. - -[SAL4_P3:SAL4] -~w~E non scordi il nostro accordo, signora! - -[SAL4_H1:SAL4] -~w~Un eccesso di velocità, qualche collisione e un paio di salti dovrebbero spaventare Hopper. - -[SAL4_F0:SAL4] -~r~Troppo tardi! La Hopper ha lasciato la stazione radio! - -[SAL4_A:SAL4] -~w~Raggiungi la ~y~stazione radio~w~ prima delle 0~1~:00, quando Hopper si allontanerà. - -[SAL4_A1:SAL4] -~w~Raggiungi la ~y~stazione radio~w~ prima delle ~1~:00, quando Hopper si allontanerà. - -{=================================== MISSION TABLE SAL6 ===================================} - -[SAL6_A0:SAL6] -~w~Toni, abbiamo problemi. Grossi problemi! - -[SAL6_A1:SAL6] -~w~Che succede, Sal? - -[SAL6_A3:SAL6] -~w~Ci stanno massacrando! - -[SAL6_A4:SAL6] -~w~Abbiamo appena finito una guerra e... BANG! Siamo nel mezzo di un'altra! - -[SAL6_A5:SAL6] -~w~Lo giuro, quando le cose vanno bene... mi hanno fatto il malocchio! Un fottuto malocchio! - -[SAL6_A6:SAL6] -~w~Ehi! Non si preoccupi, boss! Ci penserò io. - -[SAL6_AA:SAL6] -~w~Sal ha lasciato nel garage le armi di cui avrai bisogno. - -[SAL6_B:SAL6] -~w~Ferma l'assalto dei ~r~Diablo~w~ prima che tutti gli uomini di Leone vengano uccisi! - -[SAL6_1:SAL6] -~w~~1~ uomini di Leone ancora vivi! - -[SAL6_2:SAL6] -~w~1 uomo di Leone ancora vivo! - -[SAL6_C1:SAL6] -~w~Toni, ci stanno massacrando! - -[SAL6_C2:SAL6] -~w~Non mi pagano abbastanza per questo! - -[SAL6_C3:SAL6] -~w~Toni, sei pazzo! Ti farai ammazzare! - -[SAL6_E1:SAL6] -~w~Sal? - -[SAL6_E2:SAL6] -~w~Toni! È finita? Com'è andata? - -[SAL6_E3:SAL6] -~w~Direi male, Sal. - -[SAL6_E4:SAL6] -~w~Ho salvato un po' di uomini, ma ne abbiamo persi molti prima che arrivassi. - -[SAL6_E5:SAL6] -~w~Ho paura che perderemo questa parte della città. - -[SAL6_E6:SAL6] -~w~Dovranno passare sul mio cadavere! Non è ancora finita! - -[SAL6_E7:SAL6] -~w~Non voglio perdere niente! I Leone non si ritirano mai! - -[SAL6_E8:SAL6] -~w~Mi hai sentito, Toni? - -[SAL6_E9:SAL6] -~w~Come desidera, Sal. - -[SAL6_G0:SAL6] -~r~Tutti gli uomini di Leone sono morti. - -[SAL6_Z1:SAL6] -Leone - -[SAL6_Z2:SAL6] -Diablo - -[SAL6_X0:SAL6] -Got threat - -[SAL6_X1:SAL6] -Had threat - -[SAL6_X2:SAL6] -Find threat - -[SAL6_X3:SAL6] -Complain - -[SAL6_C0:SAL6] -~w~Che si fottano! Andiamocene da qui! - -[SAL6_A2:SAL6] -~w~Dove andremo a finire? I Diablo ci hanno assalito in Hepburn! - -{=================================== MISSION TABLE SAL7 ===================================} - -[SAL7_01:SAL7] -~w~Salve, Sal! - -[SAL7_02:SAL7] -~w~Toni! Cosa ne pensi della mia nuova macchina? - -[SAL7_05:SAL7] -~w~È una meraviglia, vero? Super accessoriata, il massimo in circolazione. - -[SAL7_A6:SAL7] -~w~...oh, sì... crisi di mezz'età! - -[SAL7_07:SAL7] -~w~Sta' zitta! Toni, ascolta. - -[SAL7_08:SAL7] -~w~Ho una valanga di soldi che devono essere raccolti dal mio magazzino presso Callahan Point. - -[SAL7_10:SAL7] -~w~Mi fido solo di te per questo lavoro. - -[SAL7_11:SAL7] -~w~Voi ragazze volete parlare tutto il giorno? Possiamo andare? - -[SAL7_12:SAL7] -~w~Maledizione, donna! Ti ho dato il permesso di parlare? - -[SAL7_20:SAL7] -~w~Forza! muoversi! - -[SAL7_21:SAL7] -~w~OK... - -[SAL7_22:SAL7] -~w~Andiamo! - -[SAL7_23:SAL7] -~w~Ehi, Toni! Come stai? - -[SAL7_30:SAL7] -~w~Raggiungi il ~y~magazzino. - -[SAL7_40:SAL7] -~w~Raccogli tutti i soldi di Salvatore prima che vadano in fumo! - -[SAL7_50:SAL7] -~w~Riporta il malloppo da ~y~Salvatore. - -[SAL7_NM:SAL7] -~w~Ritorna dentro! Non hai raccolto tutti i ~g~soldi. - -[SAL7_E1:SAL7] -~w~Uccidiamolo! - -[SAL7_E2:SAL7] -~w~Muori! - -[SAL7_E3:SAL7] -~w~Eccone uno! - -[SAL7_E4:SAL7] -~w~Non riesco a vederlo! - -[SAL7_T1:SAL7] -~w~Indietro! - -[SAL7_T2:SAL7] -~w~Come ti senti adesso! - -[SAL7_T3:SAL7] -~w~Fatevi sotto! - -[SAL7_T4:SAL7] -~w~Prendi questo! - -[SAL7_F1:SAL7] -~r~Non hai recuperato tutti i soldi di Salvatore in tempo! - -[SAL7_06:SAL7] -~w~Cos'è questo odore? - -[SAL7_42:SAL7] -~w~Raccogli i ~g~soldi~w~ prima che vadano in fumo! - -{=================================== MISSION TABLE SAL8 ===================================} - -[SAL8_VE:SAL8] -~r~v1,2 - -[SAL8_11:SAL8] -~w~Prendi una macchina e facciamo un giro... - -[SAL8_12:SAL8] -~w~Raggiungi il terminal dei traghetti. - -[SAL812A:SAL8] -~w~Ma c'è lo sciopero in corso... non ci saranno traghetti. - -[SAL812B:SAL8] -~w~Tu guida, io mi occupo di pensare. - -[SAL8_14:SAL8] -~w~Dio santo! I poliziotti sono dappertutto! Via da qui, in fretta! - -[SAL8_15:SAL8] -~w~Dove stiamo andando? - -[SAL8_16:SAL8] -~w~Il ponte Callahan! - -[SAL816A:SAL8] -~w~...Il ponte Callahan non è ancora stato terminato! - -[SAL816B:SAL8] -~w~Termineranno noi se non ti dai una mossa! Forza, sbrigati! - -[SAL816C:SAL8] -~w~Raggiungi ~y~Callahan Bridge. - -[SAL8_17:SAL8] -~w~Cosa diavolo stai combinando? - -[SAL8_18:SAL8] -~w~Toni! Abbiamo bisogno di una macchina! - -[SAL818A:SAL8] -~w~Non ho intenzione di camminare per strada! - -[SAL8_19:SAL8] -~w~Hai lasciato indietro ~b~Salvatore~w~. Torna a prenderlo! - -[SAL8_20:SAL8] -~w~Portaci fuori di qui! - -[SAL8_22:SAL8] -~w~Toni, ce l'hai fatta! Sapevo di potermi fidare di te! - -[SAL822B:SAL8] -Ora ascolta: conosco un posto sicuro dove possiamo nasconderci per un po'. - -[SAL822C:SAL8] -Forza, andiamo. - -[SAL8_25:SAL8] -~w~Avremo bisogno di tutti i cavalli di questo affare! Premi il pedale, Toni! - -[SAL825A:SAL8] -~w~OMMERDAAAAAA! - -[SAL8_26:SAL8] -Velocità di salto - -[SAL8_27:SAL8] -~w~Bene, questo è il posto. - -[SAL8_28:SAL8] -~w~Darò un'occhiata in giro. Voglio controllare delle cose. - -[SAL828A:SAL8] -~w~Ci vediamo qui più tardi. - -[SAL8_29:SAL8] -~r~Sal è stato ucciso! - -[SAL829A:SAL8] -~w~I poliziotti vi hanno visto! - -[SAL831:SAL8] -~w~Rifugio di Staunton ora disponibile! - -[SAL833:SAL8] -~w~Stai lontano dai poliziotti! - -[SAL823A:SAL8] -~w~O forse no? - -[SAL8_24:SAL8] -~w~Benché la metropolitana e il servizio di traghetti siano ufficialmente aperti, - -[SAL824A:SAL8] -~w~i militanti dei lavoratori continuano a ostruire parti della città. - -[SAL824B:SAL8] -~w~Il ponte mobile che connette Staunton Island e Shoreside Vale è stato chiuso. - -[SAL824C:SAL8] -~w~Gli scioperanti si rifiutano di credere alle promesse delle autorità sul futuro dei traghetti. - -[SAL824D:SAL8] -~w~Come nota positiva, il nuovo ponte Callahan è ormai quasi completato. - -[SAL824E:SAL8] -~w~Ma il completamento di questo collegamento di Liberty City non può essere rimandato ulteriormente. - -[SAL8_23:SAL8] -~w~Lo sciopero che ha tagliato Portland dal resto della città è finalmente terminato. - -[SAL812C:SAL8] -~w~Raggiungi il ~y~molo dei traghetti. - -[SAL8WAN:SAL8] -I poliziotti vogliono DAVVERO prendere Salvatore! Riverniciando il veicolo farai perdere le tue tracce solo momentaneamente. - -[SAL8_21:SAL8] -~w~Raggiungi il ~y~ponte! - -[SAL830:SAL8] -~w~Raggiungi il ~y~rifugio. - -[SAL822A:SAL8] -~w~Ti bacerei se ti fossi fatto la barba! - -[SAL832:SAL8] -~w~Ti serve un mezzo! - -[DRIV_01:SAL8] -Allora? - -[DRIV_02:SAL8] -Allora cosa? - -[DRIV_03:SAL8] -Non fare l'ingenuo con me, ragazzino. - -[DRIV_06:SAL8] -Ho sentito cosa hai detto in giro sul mio conto. - -[DRIV_07:SAL8] -Credi che sia un'idiota? Eh? - -[DRIV_08:SAL8] -È questo quello che pensi? - -[DRIV_09:SAL8] -Capo, non ho detto una sola parola su di lei. - -[DRIV_10:SAL8] -Ma che cazzo, non so cosa mi stia succedendo. - -[DRIV_11:SAL8] -Gesù. - -[DRIV_12:SAL8] -Sto diventando paranoico, Toni. Un fottuto paranoico. - -[DRIV_13:SAL8] -Solo perché credo che mi odiano tutti, non vuol dire che non sia così, non so se mi spiego... - -[DRIV_14:SAL8] -C'è qualcuno che mi sta addosso: quel fottuto sindaco! - -[DRIV_15:SAL8] -Mi accuserà di tutte quelle stronzate che stanno accadendo giù nel quartiere. - -[DRIV_16:SAL8] -Tutte! Comprese quelle che ho fatto davvero. - -[DRIV_17:SAL8] -Coraggio, dobbiamo occuparci di questa faccenda. - -[DRIV_04:SAL8] -- Facevo lo stesso quando tua madre batteva ancora. ~n~ - Qual è il problema? - -{=================================== MISSION TABLE JDT1 ===================================} - -[JDT1_CA:JDT1] -~w~Sono sicuro che le ragazze mi stiano fregando. - -[JDT1_CB:JDT1] -~w~Ci conviene perlustrare il quartiere e vedere di persona. - -[JDT1_DA:JDT1] -~w~Quella è una delle mie ragazze! - -[JDT1_DB:JDT1] -~w~Ehi! Riconosco quella ragazza. - -[JDT1_DC:JDT1] -~w~È una delle mie ragazze. - -[JDT1_DD:JDT1] -~w~Quella è una delle nostre. - -[JDT1_DE:JDT1] -~w~Quella ragazza lì... - -[JDT1_DF:JDT1] -~w~Fermati vicino a lei. - -[JDT1_DG:JDT1] -~w~Accosta vicino a lei. - -[JDT1_DH:JDT1] -~w~Carichiamola in macchina. - -[JDT1_DI:JDT1] -~w~Parcheggia vicino a lei. - -[JDT1_DJ:JDT1] -~w~Avvicinati a lei. - -[JDT1_MA:JDT1] -~w~Ciao JD. Stavo giusto per portarti questi, davvero! - -[JDT1_MB:JDT1] -~w~Ehi! Non ti fidi più di me, JD? - -[JDT1_MC:JDT1] -~w~Ehi JD. Poco movimento... ecco tutto quello che ho. - -[JDT1_MD:JDT1] -~w~Parli del diavolo... Ecco i tuoi fottuti soldi! - -[JDT1_ME:JDT1] -~w~Ehi JD. Ho i tuoi soldi proprio qui. - -[JDT1_MF:JDT1] -~w~Non credevi mica che mi sarei tenuta questi soldi, vero? - -[JDT1_MG:JDT1] -~w~Stai controllando noi ragazze, JD? - -[JDT1_MH:JDT1] -~w~Eccoli qua... contali pure se vuoi! - -[JDT1_EA:JDT1] -~w~Ehi! Quel pappone sta derubando una mia ragazza! - -[JDT1_EB:JDT1] -~w~Toni, recupera i soldi! - -[JDT1_EC:JDT1] -~w~Cosa diavolo sta facendo quel pappone? - -[JDT1_ED:JDT1] -~w~Sta rubando i miei soldi! - -[JDT1_EE:JDT1] -~w~Prendilo, Toni! - -[JDT1_45:JDT1] -~w~Riprendi al pappone i ~g~soldi. - -[JDT1_46:JDT1] -~w~Il pappone è scappato! - -[JDT1_FA:JDT1] -~w~In quella macchina c'è una mia ragazza! - -[JDT1_FB:JDT1] -~w~Avvicinati in retromarcia alla ~b~macchina~w~, così posso dare una sbirciata. - -[JDT1_FC:JDT1] -~w~...piano adesso, non vogliamo disturbarli! - -[JDT1_FD:JDT1] -~w~Più vicino... - -[JDT1_FE:JDT1] -~w~Più vicino... - -[JDT1_FF:JDT1] -~w~Piano... - -[JDT1_IA:JDT1] -~w~Ma che cazzo, Toni! Li hai spaventati! - -[JDT1_GA:JDT1] -~w~Maledizione, Toni! Non vedo un accidente! - -[JDT1_75:JDT1] -~w~Aspetta che la ~b~ragazza~w~ dia i soldi a JD! - -[JDT1_HA:JDT1] -~w~...oh sì! - -[JDT1_HB:JDT1] -~w~Forza, baby! - -[JDT1_HC:JDT1] -~w~Vengo, vengo! - -[JDT1_HD:JDT1] -~w~...oh Sì! - -[JDT1_HE:JDT1] -~w~È stato meraviglioso! - -[JDT1_HF:JDT1] -~w~Abbiamo finito? - -[JDT1_JA:JDT1] -~w~Bel lavoro, Toni! - -[JDT1_JB:JDT1] -~w~Non credo che le ragazze di questo turno mi causeranno altri problemi. - -[JDT1_LA:JDT1] -~w~Toni! Hai fatto davvero una bella cazzata! - -[JDT1_LB:JDT1] -~w~Me ne torno al club! - -[JDT1_ML:JDT1] -~w~Ancora ~1~$ da raccogliere! - -[JDT1O01:JDT1] -~w~Sali sul ~b~furgone di JD. - -[JDT1O02:JDT1] -~w~Hai lasciato indietro ~b~JD~w~. Torna a prenderlo! - -[JDT1O03:JDT1] -~w~Aspetta che ~b~JD~w~ salga su. - -[JDT1O04:JDT1] -~w~Cerca le ragazze di JD nel Red Light District. - -[JDT1O05:JDT1] -~w~Ritorna al ~y~club di JD. - -[JDT1O07:JDT1] -~w~Fermati vicino alla ~b~ragazza. - -[JDT1O08:JDT1] -~w~Uccidi il ~r~pappone. - -[JDT1O09:JDT1] -~w~Raccogli i soldi da una delle ~b~ragazze di JD. - -[JDT1_F1:JDT1] -~r~Il furgone di JD è stato distrutto! - -[JDT1_F2:JDT1] -~r~JD è morto! - -[JDT1_F3:JDT1] -~r~Non hai raccolto abbastanza soldi durante il turno! - -[JDT1_D1:JDT1] -~w~Le ragazze di JD lavorano nel ~y~Red Light District.~w~ Ritorna lì! - -[JDT1_F4:JDT1] -~r~Sono morte troppe ragazze di JD! - -[JDT1_KA:JDT1] -~w~Cosa diavolo era? - -[JDT1_KB:JDT1] -~w~Abbiamo colpito qualcosa? - -[JDT1_KC:JDT1] -~w~Attento a come guidi, Toni! - -[JDT1_81:JDT1] -~w~Hai spaventato il tipo! Non vuole di certo un pubblico! - -[JDT1O10:JDT1] -~w~Avvicinati alla ~b~macchina~w~ nel vicolo. - -[JDT1O11:JDT1] -~w~Suona il clacson per attirare la loro attenzione! - -[JDT1O12:JDT1] -~w~Più a lungo lascerai lavorare la ragazza, maggiori saranno i guadagni. - -[JDT1_MO:JDT1] -Debito - -[JDT1_H1:JDT1] -~w~Usa ~k~ ~VEHN~ per suonare il clacson. - -[JDT1_WA:JDT1] -~w~Muoviti! Il turno delle ~b~ragazze~w~ finisce alle ~1~:~1~! - -[JDT1_WB:JDT1] -~w~Muoviti! Il turno delle ragazze finisce alle ~1~:~1~! - -[JDT1O06:JDT1] -~w~Raccogli i soldi di JD dalle sue prostitute. Fai in fretta, il loro turno finisce alle ~1~:~1~. - -[JDT1_WC:JDT1] -~w~Muoviti! Il turno delle ~b~ragazze~w~ finisce alle ~1~:0~1~! - -[JDT1_WD:JDT1] -~w~Muoviti! Il turno delle ragazze finisce alle ~1~:0~1~! - -[JDT1P06:JDT1] -~w~Raccogli i soldi di JD dalle sue prostitute. Fai in fretta, il loro turno finisce alle ~1~:0~1~. - -[BONE_01:JDT1] -Ehi JD! Vieni fuori! - -[BONE_02:JDT1] -Ehi JD, fottuto depravato, esci da questo cazzo di posto - -[BONE_03:JDT1] -prima che entri io e ti spezzi le gambe. - -[BONE_04:JDT1] -Sto venendo... ma non in quel senso, ah ah ah! - -[BONE_05:JDT1] -Ehi Toni, que pasa? Abbracciami. - -[BONE_06:JDT1] -Woah, sei tutto appiccicoso! - -[BONE_07:JDT1] -Oh è quella roba che si spalmano le spogliarelliste, sai... - -[BONE_08:JDT1] -Ne vanno matte, sai. La mettono dappertutto e uh... allora, come andiamo? - -[BONE_09:JDT1] -Ma come cazzo sei vestito? - -[BONE_10:JDT1] -Cosa, questo? Sono l'esploratore del sesso. - -[BONE_11:JDT1] -Sai che mi piace... sperimentare, no? - -[BONE_16:JDT1] -Sai, questo è un problema. Ci stanno fregando. - -[BONE_17:JDT1] -Bene, aspetta qui. - -[BONE_18:JDT1] -Devo andare a cambiarmi... questa cosa, sai... - -[BONE_19:JDT1] -Ehi Raven, fine della festa, metti via il doppio vibratore. - -[BONE_20:JDT1] -Ehi Toni, andiamo a fare un giro insieme. - -[BONE_21:JDT1] -Dobbiamo andare a controllare delle cose... OK! OK! - -[BONE_12:JDT1] -- Non c'è niente di male, eh? Puoi guardare se vuoi. ~n~ - Sei davvero malato, non dire un'altra parola. - -[BONE_14:JDT1] -- OK, rilassati Toni... ~n~ - Dove sono i miei soldi? - -{=================================== MISSION TABLE JDT2 ===================================} - -[JDT2_I1:JDT2] -~w~Grazie a Dio sei qua, Toni! - -[JDT2_I2:JDT2] -~w~Ho appena ricevuto la soffiata che stanno arrivando i poliziotti! - -[JDT2_I3:JDT2] -~w~Allora? Hai un permesso. - -[JDT2_I4:JDT2] -~w~Non per alcune delle cose che avvengono qua dentro! - -[JDT2_I5:JDT2] -~w~Salvatore è dentro, sta facendo una... visita 'speciale'... alle ragazze... - -[JDT2_I6:JDT2] -~w~Dobbiamo farlo uscire prima che arrivino i poliziotti! - -[JDT2_I7:JDT2] -~w~Aspettalo sul davanti! - -[JDT2_I8:JDT2] -~w~Mai un momento di tregua... - -[JDT2_05:JDT2] -~w~Portami subito via di qui! - -[JDT2_06:JDT2] -~w~Toni? Semina i poliziotti! Non portare quegli idioti a casa mia! - -[JDT2_A1:JDT2] -~w~Sali in ~b~macchina. - -[JDT2_A2:JDT2] -~w~Non abbandonare ~b~Salvatore!~w~ Torna a prenderlo! - -[JDT2_A3:JDT2] -~w~Porta Salvatore a ~y~casa. - -[JDT2_A5:JDT2] -~r~Salvatore è morto! - -[JDT2_C1:JDT2] -~w~Oggi hai fatto un bel lavoro, ragazzo. Mi è sempre piaciuto il tuo stile. - -[JDT2_C2:JDT2] -~w~Grazie, signor Leone. - -[JDT2_C3:JDT2] -~w~Sai, credo che Vincenzo stia approfittando troppo del tuo tempo. - -[JDT2_C4:JDT2] -~w~Ho bisogno di un bravo ragazzo come te. - -[JDT2_C5:JDT2] -~w~Chiamami ogni tanto. Zio Sal si occuperà di te. - -[JDT2_A9:JDT2] -~r~Salvatore è stato beccato! - -[JDT2_B2:JDT2] -~w~Semina la polizia! - -[JDT2_A6:JDT2] -~w~Torna alla ~b~macchina~w~ di Salvatore prima che i poliziotti lo becchino! - -[JDT2_F1:JDT2] -~r~Hai abbandonato Salvatore! - -[JDT2_A4:JDT2] -~w~Porta Salvatore lontano dal club e semina i poliziotti! - -{=================================== MISSION TABLE JDT3 ===================================} - -[JDT3_AA:JDT3] -~w~Ehi Toni... non posso uscire adesso, sono occupato... sai, no? - -[JDT3_AB:JDT3] -~w~Cosa? Cosa succede lì dentro? ...e cos'è questo odore? - -[JDT3_AC:JDT3] -~w~Senti, Toni... oggi abbiamo per le mani dei veri, ah... specialisti. - -[JDT3_AD:JDT3] -~w~Questa roba vale oro su internet! - -[JDT3_AE:JDT3] -~w~Comunque, dovresti preoccuparti della bisca dei Leone a Saint Mark's. - -[JDT3_AG:JDT3] -~w~I Sindacco sono furenti al riguardo. - -[JDT3_AH:JDT3] -~w~Ho sentito che vogliono far saltare in aria il posto. - -[JDT3_B:JDT3] -~w~Fai fuori i ~r~sabotatori dei Sindacco! - -[JDT3_C:JDT3] -~r~Hanno ~w~piazzato una bomba fuori dal ~y~casinò! - -[JDT3_D:JDT3] -Esplode in - -[JDT3_E:JDT3] -~w~Ancora un paio di esplosioni e il ~y~casinò~w~ sarà a pezzi! - -[JDT3_F:JDT3] -~w~Ancora una e il ~y~casinò~w~ verrà distrutto! - -[JDT3_H:JDT3] -~w~Altri ~r~Sindacco~w~ in avvicinamento! Fermali! - -[JDT3_I:JDT3] -~w~La bomba sul camion è innescata! - -[JDT3_J:JDT3] -~w~Il ~y~casinò~w~ è salvo. Allontanati! - -[JDT3_K:JDT3] -~w~Devono aver sabotato il camion, è bloccato con la marcia più bassa! - -[JDT3_L:JDT3] -~r~Rinforzi dei Sindacco~w~ in avvicinamento al ~y~casinò! - -[JDT3_M:JDT3] -~w~I ~r~Sindacco~w~ non vogliono arrendersi! Ne arrivano degli altri! - -[JDT3_N:JDT3] -~w~Stanno ritirandosi. Non lasciar fuggire nessun ~r~Sindacco! - -[JDT3_O:JDT3] -Dist. di sicurezza - -[JDT3_P:JDT3] -~w~I Sindacco hanno preparato un immenso camion bomba! Vogliono eliminare il casinò in un colpo solo! - -[JDT3_Q:JDT3] -~w~Defendi il ~y~casinò. - -[JDT3_R:JDT3] -~w~Vai a controllare il ~y~casinò. - -[JDT3_S:JDT3] -~w~Ferma il ~r~camion bomba~w~ prima che distrugga il ~y~casinò! - -[JDT3_T:JDT3] -~w~Sposta il ~r~camion~w~ lontano dal ~y~casinò~w~ prima che esploda! - -[JDT3_BA:JDT3] -~w~Toni? Sono JD. - -[JDT3_BB:JDT3] -~w~Ho sentito che degli uomini dei Sindacco si stanno dirigendo verso di te. - -[JDT3_BC:JDT3] -~w~E hanno degli esplosivi, un mucchio di esplosivi! - -[JDT3_BD:JDT3] -~w~Fai attenzione! - -[JDT3_BE:JDT3] -~w~Grazie JD! - -[JDT3_BF:JDT3] -~w~Apprezzo il gesto. - -[JDT3_G:JDT3] -~r~Il casinò è stato distrutto! - -{=================================== MISSION TABLE JDT4 ===================================} - -[JDT4_3:JDT4] -~w~Le guardie del bordello si fideranno solo di ~h~macchine dei Sindacco. - -[JDT4_A1:JDT4] -~w~Di classe: se perdi al tavolo, puoi incassare nel culo! - -[JDT4_B0:JDT4] -~w~Trova un veicolo adatto e montaci su una bomba. - -[JDT4_B1:JDT4] -~w~Torna nel ~b~veicolo~w~ con la bomba. - -[JDT4_B3:JDT4] -~w~Esci dal veicolo e dattela a gambe. - -[JDT4_B4:JDT4] -~w~Fai esplodere la bomba! - -[JDT4_B5:JDT4] -~w~Porta il veicolo nel ~h~negozio di bombe~w~ e fanne montare una. - -[JDT4_B6:JDT4] -~w~Non avvicinarti troppo! - -[JDT4_C0:JDT4] -~r~Eri troppo vicino all'esplosione. - -[JDT4_C1:JDT4] -~w~Mettilo sul conto di JD! - -[JDT4_D0:JDT4] -~w~Chi va là? - -[JDT4_D2:JDT4] -~w~Deve essere uno nuovo. - -[JDT4_0:JDT4] -CONTO ALLA ROVESCIA - -[JDT4_1:JDT4] -~w~Non puoi mettere una bomba su questo veicolo! - -[JDT4_2:JDT4] -~w~Segui la ~h~bomba~w~ sul radar per raggiungere il negozio di ~h~8-Ball. - -[JDT4_A0:JDT4] -~w~Senti Toni, i Sindacco hanno questo posto, 'The Dolls House'. - -[JDT4_AA:JDT4] -~w~Un casinò e un bordello in uno. - -[JDT4_A2:JDT4] -~w~Eh eh! Beh, il posto è la chiave della loro posizione. - -[JDT4_A3:JDT4] -~w~Se riuscissi a, uh... metterlo fuori gioco... cioè, uh... farlo esplodere o altro... - -[JDT4_A4:JDT4] -~w~Ti assicuro che Salvatore ci coprirà di soldi! - -[JDT4_D1:JDT4] -~w~Non lo riconosco... - -[JDT4_B2:JDT4] -~w~Parcheggia il veicolo nel ~y~garage~w~ del 'The Doll's House'. - -[JDT4_B7:JDT4] -~w~Guida con attenzione, se lo danneggi troppo, esploderà! - -[JDT4_B8:JDT4] -~w~Parcheggia il veicolo nel ~y~garage~w~ del 'The Doll's House'. - -[JDT4_4:JDT4] -~w~Premi~h~ ~k~ ~PDFW~ ~w~per ~h~detonare~w~ la bomba. - -[JDT4_B9:JDT4] -~w~I Sindacco hanno disinnescato la bomba! - -{=================================== MISSION TABLE JDT5 ===================================} - -[JDT5_B0:JDT5] -~w~Quello è uno dei tipi che ha rapito Salvatore! - -[JDT5_D0:JDT5] -~w~Dove si trova? Nel bagagliaio? - -[JDT5_D1:JDT5] -~w~Bene. Portiamolo al demolitore. Il capo lo vuole più piatto di una pizza. - -[JDT5_E:JDT5] -~w~Libera Salvatore dalla ~b~macchina~w~ prima che venga demolita! - -[JDT5_E0:JDT5] -~w~Ti hanno visto! - -[JDT5_E1:JDT5] -~w~La ~b~macchina~w~ è incustodita! Prendila! - -[JDT5_E2:JDT5] -~w~Porta la macchina alla ~y~villa di Salvatore. - -[JDT5_E3:JDT5] -~w~Torna in ~b~macchina. - -[JDT5_F0:JDT5] -~w~Mmmphhh... mmmphhh... mpphh! - -[JDT5_F3:JDT5] -~w~Mmpphh... Arrgghh... mmpphh! - -[JDT5_F4:JDT5] -~w~Mmpphh... Arrgghh... Arrggghh... Arrg! - -[JDT5_F5:JDT5] -~w~Yarrgghh... Yarragh... Mmpphh! - -[JDT5_G0:JDT5] -~w~Ma come cazzo guidi? Volevi uccidermi? - -[JDT5_G1:JDT5] -~w~Signor Leone. Boss. Mi dispiace. - -[JDT5_G2:JDT5] -~w~Cosa posso dire? - -[JDT5_G4:JDT5] -~w~Faccio esplodere le loro teste! Non finisce qui! - -[JDT5_G5:JDT5] -~w~...Dio santo, Toni... mi hai salvato il culo. Chiamami Sal! - -[JDT5_X0:JDT5] -~r~Non è facile inseguire un cadavere! - -[JDT5_X1:JDT5] -~r~Lo hai perso! - -[JDT5_F1:JDT5] -~w~È lei, signor Leone? Sono io, Toni. - -[JDT5_F2:JDT5] -~w~Non si preoccupi, la faccio uscire immediatamente! - -[JDT5_G3:JDT5] -~w~Figli di puttana! Credono di potermi fare questo? - -[JDT5_X2:JDT5] -~r~Sal non ce l'ha fatta. - -[JDT5_X4:JDT5] -~r~Ti ha visto. Ora non troverai più Sal! - -[JDT5_X3:JDT5] -~r~Salvatore è stato spappolato! - -[JDT5_C:JDT5] -~w~Segui la ~r~macchina~w~, ma tieniti a distanza. - -[JDT5_0:JDT5] -~w~Se spari alla macchina, potresti colpire Salvatore! - -[JDT5_H0:JDT5] -~w~Segui la ~r~macchina~w~, ma non avvicinarti troppo. - -[JDT5_H1:JDT5] -~w~Sei troppo vicino! - -[JDT5_H2:JDT5] -~w~Non allontanarti troppo dalla ~r~macchina. - -[JDT5_H3:JDT5] -~w~Sei troppo lontano! - -[KIDN_01:JDT5] -JD! - -[KIDN_02:JDT5] -Toni, grazie al cielo sei qui. - -[KIDN_03:JDT5] -Sto sudando come una vacca al macello... sto impazzendo. - -[KIDN_06:JDT5] -Oddio non ci posso credere, mi strapperà le palle - -[KIDN_07:JDT5] -e le metterà in una teca, non necessariamente in quest'ordine. - -[KIDN_08:JDT5] -Oddio! Mi sento come il giorno in cui l'FBI ha sequestrato il mio hard disk! - -[KIDN_13:JDT5] -Oddio non ci posso credere... - -[KIDN_14:JDT5] -Perché a me? Non è colpa mia. - -[KIDN_15:JDT5] -Ma conosci Salvatore: mi metterà alle calcagna la buoncostume. - -[KIDN_16:JDT5] -Oddio, mi accuseranno di essermi fatto una minorenne. - -[KIDN_17:JDT5] -Sei mai stato in prigione per quello, amico? - -[KIDN_18:JDT5] -Ti fanno un culo così sotto le docce! - -[KIDN_19:JDT5] -Oddio, e aveva 18 anni! Omioddio! Sarà anche peggio! - -[KIDN_20:JDT5] -Ascolta un po', coglione: mi dici che cazzo sta succedendo? - -[KIDN_04:JDT5] -- Ora cosa facciamo? ~n~ - In che senso? - -[KIDN_11:JDT5] -- No, no... ho già preso troppe pasticche... ~n~ - Cosa sta succedendo? - -[KIDN_09:JDT5] -Oddio, ho il cuore che pompa a mille. Hai del Valiom? - -[KIDN_10:JDT5] -O del Rohapnin? Hai del... - -[KIDN_21:JDT5] -È Salvatore. È stato rapito all'uscita del club. - -[KIDN_23:JDT5] -Beh, non facevi prima a dirmelo invece di stordirmi con tutte queste stronzate? Dai, andiamo. - -{=================================== MISSION TABLE JDT6 ===================================} - -[JDT6_A0:JDT6] -~w~Grazie a Dio! Toni. - -[JDT6_A1:JDT6] -~w~JD? Ehi, sono sul retro del... - -[JDT6_A2:JDT6] -~w~Lo so. Ti ho visto arrivare. Pregavo che ti facessi vivo! - -[JDT6_A3:JDT6] -~w~Salvatore è impazzito! - -[JDT6_A6:JDT6] -~w~Assicurati che nessuno ferisca Salvatore. - -[JDT6_0:JDT6] -Salvatore - -[JDT6_1:JDT6] -~r~Salvatore non ce l'ha fatta. - -[JDT6_3:JDT6] -~w~Salvatore arriverà fra ~1~ secondi. - -[JDT6_5:JDT6] -~w~Proteggi ~b~Salvatore~w~ dai ~r~Sindacco. - -[JDT6_6:JDT6] -~w~Una delle ~b~guardie di Salvatore~w~ è stata uccisa! - -[JDT6_7:JDT6] -~w~Entrambe le ~b~guardie di Salvatore~w~ sono state uccise! - -[JDT6_8:JDT6] -~w~I poliziotti! - -[JDT6_10:JDT6] -~w~Trova una posizione tattica prima che arrivi Salvatore. - -[JDT6_11:JDT6] -~w~Dove stai andando? Salvatore ha bisogno di protezione nel Red Light District! - -[JDT6_12:JDT6] -Salvatore è arrivato - -[JDT6_D1:JDT6] -~w~Ehi... - -[JDT6_D4:JDT6] -~w~Qualcuno ha fatto cadere un dollaro! - -[JDT6_C0:JDT6] -~w~È il meglio che sapete fare? - -[JDT6_C1:JDT6] -~w~Fatevi sotto! - -[JDT6_C2:JDT6] -~w~Siete delle checche! - -[JDT6_C3:JDT6] -~w~Oh, ne vuoi anche tu! - -[JDT6_C4:JDT6] -~w~Prendi questo! - -[JDT6_C5:JDT6] -~w~Brutti topi bastardi! - -[JDT6_C6:JDT6] -~w~Sono il migliore! - -[JDT6_A4:JDT6] -~w~Sta venendo quaggiù di persona per uccidere qualsiasi Sindacco riesca a trovare... - -[JDT6_A5:JDT6] -~w~...per cui mi sono preparato. Ho lasciato un fucile sul tetto dall'altra parte della strada. - -[JDT6_9:JDT6] -~w~Raccogli il ~g~fucile di precisione~w~ sul tetto. - -{=================================== MISSION TABLE JDT7 ===================================} - -[JDT7_VE:JDT7] -~r~v1,00 - -[JDT7_02:JDT7] -~w~Allora Salvatore ha fatto pulizia... e ora sta rassettando anche casa tua! - -[JDT7_03:JDT7] -~w~Toni, ora è tutta mia! - -[JDT703A:JDT7] -~w~Quei fottuti Sindacco sono stati scacciati a calci. - -[JDT7_04:JDT7] -~w~Ascolta, ho sentito che i Siciliani stanno cercando di mettere pace tra le famiglie. - -[JDT7_4A:JDT7] -~w~C'è un pezzo grosso in questo momento a casa di Sal. - -[JDT7_4B:JDT7] -~w~Il problema è che sente puzza di bruciato. - -[JDT7_4C:JDT7] -~w~Vuole che qualcuno lo raggiunga, segua questo tipo e scopra cosa combina. - -[JDT7_06:JDT7] -~r~Non hai raggiunto l'elicottero in tempo: Massimo se n'è già andato! - -[JDT7_07:JDT7] -~w~Segui ~r~Massimo.~w~ Non perderlo! - -[JDT7_08:JDT7] -~r~Massimo~w~ si sta allontanando! - -[JDT7_09:JDT7] -~r~Hai fatto scappare Massimo! - -[JDT7_10:JDT7] -~w~L'elicottero sta per atterrare: non avvicinarti troppo o li allarmerai... - -[JDT7_11:JDT7] -~r~Ti sei avvicinato troppo. Sei stato visto! - -[JDT7_14:JDT7] -~r~Massimo~w~ sta muovendosi... seguilo nuovamente... - -[JDT7_15:JDT7] -~w~Massimo~w~ sta per atterrare lassù... - -[JDT7_16:JDT7] -~w~Devi ~y~avvicinarti~w~ di più... - -[JDT7_17:JDT7] -~r~Ti sei fatto scoprire! - -[JDT7_21:JDT7] -~w~Ti hanno visto! Fai fuori i membri della ~r~Triade! - -[JDT7_12:JDT7] -~w~Come siamo rimasti d'accordo, - -[JDT712A:JDT7] -~w~se farai il lavoro dei miei soci, verrai ben ricompensato. - -[JDT7_13:JDT7] -~w~...Hepburn Heights apparterrà ai Diablo. - -[JDT7_18:JDT7] -~w~...per cui, tieni quei bastardi dei Leone a Portland, - -[JDT718A:JDT7] -e quando i miei soci controlleranno la città, ci ricorderemo di te. - -[JDT718B:JDT7] -Ci pensiamo noi. - -[JDT7_20:JDT7] -~w~Da quella parte! Un Leone! - -[JDT7_22:JDT7] -Distanza - -[JD_FIN:JDT7] -~w~Elimina tutti i membri della ~r~Triade! - -[JDT7_05:JDT7] -~w~Raggiungi la ~y~villa di Salvatore~w~ prima che Massimo si allontani! - -[JDT7O07:JDT7] -~w~Raggiungi la ~y~villa di Salvatore~w~. Massimo la lascerà alle ~1~:~1~. - -[JDT7O08:JDT7] -~w~Sono quasi le ~1~:~1~. Massimo sta per andarsene! - -{=================================== MISSION TABLE JDT8 ===================================} - -[JDT8_A0:JDT8] -~w~Toni... oggi succederà! Oggi diventerò un 'uomo d'onore'! - -[JDT8_A1:JDT8] -~w~JD l'intoccabile? Che Dio ci aiuti! - -[JDT8_A2:JDT8] -~w~Ho atteso tanto questo momento... non si sarebbe mai avverato senza di te, Toni. - -[JDT8_A3:JDT8] -~w~Ehi! Mi scendono le lacrime! Forza! - -[JDT8_A4:JDT8] -~w~Ehi Mickey! Come va? - -[JDT8_A5:JDT8] -~w~Siederò di dietro... OK. - -[JDT8_C:JDT8] -~w~Entra nella ~b~macchina~w~ e porta JD al suo 'battesimo'. - -[JDT8_C2:JDT8] -~w~Torna in ~b~macchina. - -[JDT8_C3:JDT8] -~w~Guida verso la ~y~cerimonia. - -[JDT8_B0:JDT8] -~w~Ah, Toni, sai cosa? Non ci credo che stia per succedere. - -[JDT8_B1:JDT8] -~w~Ho atteso così a lungo. - -[JDT8_B2:JDT8] -~w~Mi sono fatto il culo per i Sindacco per anni e niente! - -[JDT8_B3:JDT8] -~w~I bastardi non mi hanno dato la possibilità - -[JDT8_B5:JDT8] -~w~Ma Salvatore, Dio lo benedica, non si è fatto influenzare da queste sciocchezze. - -[JDT8_B6:JDT8] -~w~Sai cosa ti dico? - -[JDT8_B7:JDT8] -~w~È meraviglioso! - -[JDT8_B8:JDT8] -~w~Toni, sono così emozionato! - -[JDT8_B9:JDT8] -~w~Toni, non so neanche cosa fare... sono così emozionato! - -[JDT8_BA:JDT8] -~w~Guardami, non posso credere che stia per succedere! - -[JDT8_BB:JDT8] -~w~Finalmente, eh Toni? Oggi diventerò un 'uomo d'onore'! - -[JDT8_D1:JDT8] -~w~Dov'è Salvatore? - -[JDT8_D2:JDT8] -~w~Toni, ti offro il primo giro... - -[JDT8_D3:JDT8] -~w~(PLACEHOLDER SFX) BANG! - -[JDT8_H0:JDT8] -~w~Ehi, quel tipo era un fottuto cane. - -[JDT8_H1:JDT8] -~w~Ha fottuto il suo stesso boss! Disgrazia'. - -[JDT8_H2:JDT8] -~w~Salvatore non si sarebbe mai fidato di quel fottuto bastardo. - -[JDT8_H3:JDT8] -~w~Scarica la fottuta macchina nel fiume. - -[JDT8_H4:JDT8] -~w~Dammi un passaggio lungo la strada. - -[JDT8_J:JDT8] -~w~Entra in ~b~macchina~w~ e porta Mickey a casa. - -[JDT8_J1:JDT8] -~w~I poliziotti ti hanno visto con la macchina! - -[JDT8_J2:JDT8] -~w~I poliziotti ti hanno visto con la ~b~macchina! - -[JDT8_J3:JDT8] -~w~Torna in ~b~macchina! - -[JDT8_J4:JDT8] -~w~Scarica Mickey a ~y~casa sua. - -[JDT8_K0:JDT8] -~w~Me ne vado da qui! - -[JDT8_K1:JDT8] -~w~Ricorda. Scarica la macchina nel fiume. - -[JDT8_F:JDT8] -~w~Scarica la macchina nel fiume. - -[JDT8_F1:JDT8] -~w~Scarica la ~b~macchina~w~ nel fiume. - -[JDT8_G5:JDT8] -~r~JD è morto! - -[JDT8_G6:JDT8] -~r~Mickey è morto! - -[JDT8_G8:JDT8] -~r~Dovevi scaricare la macchina nel fiume. - -[JDT8_X0:JDT8] -~w~Toni, dove stai andando? - -[JDT8_X3:JDT8] -~w~Faremo tardi. - -[JDT8_X1:JDT8] -~w~Se i poliziotti vedono una macchina in questo stato, ci fermano di sicuro! - -[JDT8_X2:JDT8] -~w~La cerimonia è ad Harwood. - -[JDT8_A6:JDT8] -~w~Toni... oggi succederà! - -[JDT8_A7:JDT8] -~w~Oggi diventerò un 'uomo d'onore'! - -[JDT8_A8:JDT8] -~w~JD l'intoccabile? - -[JDT8__1:JDT8] -~w~Ho atteso tanto questo momento... - -[JDT8__2:JDT8] -~w~Non si sarebbe mai avverato senza di te, Toni. - -[JDT8_A9:JDT8] -~w~Che Dio ci aiuti! - -[JDT8_D0:JDT8] -~w~Ehi, ci siamo? - -[JDT8_B4:JDT8] -~w~solo per un po' di sangue irlandese nelle mie vene. - -[JDT8_G7:JDT8] -~r~I tuoi passeggeri sono morti! - -[JDT8_C4:JDT8] -~w~Elimina i ~r~sicari dei Sindacco~w~ prima che uccidano JD! - -[JDT8_0:JDT8] -~w~Riverniciando il veicolo guadagnerai un po' di tempo, ma se i poliziotti vedranno il cadavere sul posto del passeggero, ricominceranno l'inseguimento. - -[JDT8_K:JDT8] -~w~Oddio, no! - -[JDT8_BC:JDT8] -~w~Toni, amico, devi darti una calmata. - -[JDT8_C5:JDT8] -~w~Fai fuori i ~r~sicari dei Sindacco. - -{=================================== MISSION TABLE MAC1 ===================================} - -[MAC1_AA:MAC1] -~w~Ma? - -[MAC1_AB:MAC1] -~w~Sono io! Sono tornato! - -[MAC1_AC:MAC1] -~w~Toni? Dove diavolo sei stato? - -[MAC1_AM:MAC1] -~w~Neanche una chiamata durante tutto questo tempo! - -[MAC1_AD:MAC1] -~w~Non avevano i telefoni nel posto in cui eri? - -[MAC1_AE:MAC1] -~w~Dai Ma, andiamo, sai che non potevo chiamare! - -[MAC1_AF:MAC1] -~w~Un vero uomo avrebbe chiamato la sua mamma. - -[MAC1_AG:MAC1] -~w~Dovresti prendere esempio da Giovanni Casa. - -[MAC1_AN:MAC1] -~w~Chiama sua madre tutti i giorni. - -[MAC1_AH:MAC1] -~w~Lui sì che è un brav'uomo. - -[MAC1_AO:MAC1] -~w~...e la sua salsiccia siciliana è la migliore della città! - -[MAC1_AI:MAC1] -~w~Casa! Ma mamma! Casa non è un brav'uomo, è un pervertito! - -[MAC1_AJ:MAC1] -~w~Sono solo delle fandonie! Che razza di uomo sei, Toni? - -[MAC1_AK:MAC1] -~w~Va bene mamma, come dici tu. - -[MAC1_AL:MAC1] -~w~Magari telefono a Giovanni... chissà come sta. - -[MAC1_HA:MAC1] -~w~Sono dell'umore giusto per del vero amore... - -[MAC1_17:MAC1] -~w~Prova a tua mamma che Giovanni Casa non è un tipo a posto! - -[MAC1_B:MAC1] -~w~Vai al tuo ~y~appartamento ~w~per prendere la macchina fotografica. - -[MAC1_B0:MAC1] -~w~Vai al ~y~negozio di Casa. - -[MAC1B2:MAC1] -~w~Bello scatto! Ora porta la foto a ~y~casa di mamma. - -[MAC1_B3:MAC1] -~w~Avvicinati furtivamente a ~r~Casa, ~w~poi scatta una foto significativa! - -[MAC1_B5:MAC1] -~w~Non spaventarlo. - -[MAC1_B6:MAC1] -~r~Hai finito la pellicola! E non hai ancora scattato una foto da portare come prova a tua madre. - -[MAC1_B7:MAC1] -~w~Prendi la ~g~macchina fotografica. - -[MAC1_C0:MAC1] -~w~Non avvicinarti troppo a ~r~Casa~w~ o diventerà sospettoso! - -[MAC1_C1:MAC1] -~r~L'hai spaventato! Adesso non riuscirai più a scattare quella foto! - -[MAC1_C2:MAC1] -~r~Qualcosa ha spaventato Casa! - -[MAC1_C3:MAC1] -~r~Hai perso le tracce di Casa! - -[MAC1_C4:MAC1] -~r~Casa è stato massacrato! - -[MAC1_C5:MAC1] -~w~Sei troppo vicino a ~r~Casa! - -[MAC1_C6:MAC1] -~w~Non perdere di vista ~r~Casa! - -[MAC1_D0:MAC1] -~w~Pare che Casa abbia trovato un po' di azione. - -[MAC1_JA:MAC1] -~w~OK signore! È l'ora della poppata! - -[MAC1_JB:MAC1] -~w~Chi vuole essere la mia mamma? - -[MAC1_JC:MAC1] -~w~Oddio! - -[MAC1_IA:MAC1] -~w~OK signore, datemi un minuto e sarò da voi. - -[MAC1_IB:MAC1] -~w~Mi metterò qualcosa di più... comodo. - -[MAC1_CA:MAC1] -~w~Stringimi forte forte! - -[MAC1_CB:MAC1] -~w~Ho bisogno di coccole! - -[MAC1_DA:MAC1] -~w~Lecca il mio pupazzo! Leccalo! - -[MAC1_EA:MAC1] -~w~Andiamo ragazze! Venite a giocare! - -[MAC1_FA:MAC1] -~w~MERDA! C'è qualcuno qui! - -[MAC1_FB:MAC1] -~w~Veloci! Salite sul furgone! - -[MAC1_GA:MAC1] -~w~Oddio! Oddio! - -[MAC1_GB:MAC1] -~w~NON GUAR-DAR-MI! - -[MAC1_BA:MAC1] -~w~Ehi Ma! - -[MAC1_BB:MAC1] -~w~Guarda questa foto! È quel 'brav'uomo' di Giovanni Casa... che indossa un fottuto pannolino! - -[MAC1_BC:MAC1] -~w~È così che passi il tuo tempo? - -[MAC1_BD:MAC1] -~w~Nascondendoti dietro gli alberi facendo foto agli uomini? - -[MAC1_BE:MAC1] -~w~Che hai che non va Antonio? Mi vuoi disonorare! - -[MAC1_BF:MAC1] -~w~Ma... - -[MAC1_BG:MAC1] -~w~E, pannolino o non pannolino, rimane un uomo migliore di te! - -[MAC1_B8:MAC1] -~w~Adesso esci. - -[MAC1_B1:MAC1] -~w~Segui ~r~Casa~w~, ma non avvicinarti troppo. - -[MAC1_C7:MAC1] -~w~Effettua uno zoom su ~r~Casa ~w~per scattare la foto che lo coprirà di ~r~vergogna. - -[MAC1_D1:MAC1] -~w~Continua a seguire ~r~Casa~w~. Potresti scattare una bella foto. - -{=================================== MISSION TABLE MAC2 ===================================} - -[MAC2_AA:MAC2] -~w~Ma!... Ma!... andiamo Ma... parlami. - -[MAC2_AB:MAC2] -~w~Non c'è più nessuna 'Ma' per te, codardo! - -[MAC2_AC:MAC2] -~w~Non puoi prendermi in giro... so perché non vuoi più tornare qui. - -[MAC2_AD:MAC2] -~w~Ti stai facendo spaventare da alcuni membri della Triade! - -[MAC2_AE:MAC2] -~w~Tuo padre, Dio l'abbia in gloria, non si sarebbe mai fatto cacciare da casa sua. - -[MAC2_AF:MAC2] -~w~Ma mamma! - -[MAC2_AG:MAC2] -~w~Al contrario di te, tuo padre non era un pisciasotto! - -[MAC2_AH:MAC2] -~w~Finché la Triade non ti porterà rispetto, non sarai più mio figlio! - -[MAC2_AI:MAC2] -~w~Forse una figlia, ma di sicuro non un figlio. - -[MAC2_B1:MAC2] -~w~Dimostra a mamma che non hai paura della Triade. Prenditi cura delle ~r~due gang della Triade~w~ a Chinatown! - -[MAC2_I1:MAC2] -~w~Un capobanda della Triade si trova in quel ~r~furgone del pesce~w~ blindato. Mandalo fuori strada! - -[MAC2_I2:MAC2] -~w~Il ~r~furgone ~w~sta scappando e sta lasciando cadere il carico! Attento! - -[MAC2_I3:MAC2] -~w~Stanno scappando! Elimina la feccia della ~r~Triade ~w~! - -[MAC2_I4:MAC2] -~w~Ti hanno visto! Massacra tutti i membri della ~r~Triade! - -[MAC2_I5:MAC2] -~w~Sei nel territorio della ~r~Triade~w~. Fai attenzione! - -[MAC2_I6:MAC2] -~w~Fuori una. Adesso elimina l'altra ~r~gang! - -[MAC2_BA:MAC2] -~w~Sì! Stai guardando Ma? - -[MAC2_BB:MAC2] -~w~Toni Cipriani vi sta prendendo a calci nel culo! - -[MAC2_BC:MAC2] -~w~Ricordatevi questo nome, teste di pesce! - -{=================================== MISSION TABLE MAC3 ===================================} - -[MAC3_A0:MAC3] -~w~Ma? Sono tornato... - -[MAC3_A1:MAC3] -~w~Guarda come sei magro! - -[MAC3_A2:MAC3] -~w~Se vivessi ancora qui con tua madre, come dovrebbe fare ogni figlio, mangeresti bene! - -[MAC3_A3:MAC3] -~w~E guarda con che macchine vai in giro! - -[MAC3_A4:MAC3] -~w~Mi fai vergognare di te Antonio, davvero. - -[MAC3_A5:MAC3] -~w~La gente crede che ti abbia cresciuto male! - -[MAC3_A6:MAC3] -~w~Che posso fare, Ma? Sai che farei qualsiasi cosa per te. - -[MAC3_A7:MAC3] -~w~Oggi quel Sucho correrà in centro. - -[MAC3_A8:MAC3] -~w~Se solo potessi essere come lui! - -[MAC3_A9:MAC3] -~w~Lui sì che tratta sua madre con rispetto. - -[MAC3_AA:MAC3] -~w~Naturalmente, se tuo padre fosse qui, avrebbe di sicuro vinto la gara, - -[MAC3_AB:MAC3] -~w~...e tolto dalla faccia di Sucho quel sorrisino da imbecille! - -[MAC3_AC:MAC3] -~w~Sì, gli avrebbe fatto ingoiare un po' di piombo! - -[MAC3_AD:MAC3] -~w~Ah, tuo padre era un grand'uomo, con due palle così! - -[MAC3_B0:MAC3] -~w~Dimostra di essere all'altezza di Sucho. Vinci la gara e poi fallo fuori. - -[MAC3_C0:MAC3] -~w~Hai battuto ~r~Sucho~w~, adesso fallo fuori! - -[MAC3_C1:MAC3] -~r~Sucho~w~ sta tentando di scappare - -[MAC3_X0:MAC3] -~r~Hai fatto fuggire Sucho! - -[MAC3_C2:MAC3] -~r~Sucho~w~ sta scappando! - -{=================================== MISSION TABLE MAC4 ===================================} - -[MAC4_A0:MAC4] -~w~Ma!... Ma!... ci sei? - -[MAC4_A1:MAC4] -~w~Non ho intenzione di rivolgerti la parola, Toni! - -[MAC4_A2:MAC4] -~w~Sei una vergogna per le tue radici siciliane! - -[MAC4_A3:MAC4] -~w~Dopo aver scattato quella foto a Casa, ha smesso di pagare il pizzo. - -[MAC4_A4:MAC4] -~w~E tu cosa hai fatto per rimediare? - -[MAC4_A5:MAC4] -~w~NULLA! - -[MAC4_A6:MAC4] -~w~Tuo padre l'avrebbe ridotto in polpette con le sue mani! - -[MAC4_A8:MAC4] -~w~ma ci vuole del fegato per offendere un membro della famiglia Cipriani! - -[MAC4_A9:MAC4] -~w~Mi piacerebbe che tu avessi le sue palle! - -[MAC4_AA:MAC4] -~w~Ti piacerebbe che avessi le sue palle? - -[MAC4_AB:MAC4] -~w~OK Ma! L'hai voluto te! - -[MAC4_B:MAC4] -~w~Passa dal ~y~negozio di Giovanni Casa~w~ e 'convincilo' a fare un giretto con te. - -[MAC4_B0:MAC4] -~w~Ciao, Toni... come butta? - -[MAC4_B1:MAC4] -~w~Che succede? - -[MAC4_B2:MAC4] -~w~Un gatto ti ha mangiato la lingua? - -[MAC4_B3:MAC4] -~w~Casa, io e te dobbiamo parlare... - -[MAC4_B4:MAC4] -~w~Da qualche parte, in privato. - -[MAC4_C:MAC4] -~w~Non lasciare che ~r~Casa~w~ esca vivo. - -[MAC4_C1:MAC4] -~w~Pagherò il pizzo, Toni! Lo giuro! - -[MAC4_C2:MAC4] -~w~Oh, andiamo Toni! Ti darò tutto quello che vuoi! - -[MAC4_C3:MAC4] -~w~Farò qualsiasi cosa Toni! Qualsiasi cosa! Non farmi del male! - -[MAC4_D1:MAC4] -~w~OK! OK! Mi hai convinto! - -[MAC4_D2:MAC4] -~w~OK! OK! Mi arrendo! Mi arrendo! Non farmi più del male! - -[MAC4_D3:MAC4] -~w~Vieni con me, testa di cazzo! - -[MAC4_E0:MAC4] -~w~Porta Casa alla ~y~segheria. - -[MAC4_E1:MAC4] -~w~Non abbandonare ~b~Casa! - -[MAC4_F0:MAC4] -~w~Quindi... ehm... dove siamo diretti? - -[MAC4_F1:MAC4] -~w~Posso stare tranquillo vero, Toni? - -[MAC4_F2:MAC4] -~w~...ti darò i soldi che vi devo... lo giuro! - -[MAC4_F3:MAC4] -Ho bisogno di un po' di tempo! - -[MAC4_F4:MAC4] -~w~A tua mamma piace ancora la salsiccia piccante? - -[MAC4_F5:MAC4] -Posso dargliene un po', nessun problema! - -[MAC4_G0:MAC4] -~w~Quindi... ehm... di cosa vuoi parlare Toni? - -[MAC4_G1:MAC4] -~w~Dei soldi della protezione? - -[MAC4_G2:MAC4] -~w~Vero? - -[MAC4_G3:MAC4] -~w~...Toni? - -[MAC4_G4:MAC4] -~w~Possiamo parlarne, vero Toni? - -[MAC4_G6:MAC4] -~w~Di questi tempi la gente non parla molto, Toni. - -[MAC4_G7:MAC4] -~w~Fermati lì e chiudi quella cazzo di bocca, Casa. - -[MAC4_G8:MAC4] -~w~OK Toni! Ma io... - -[MAC4_G9:MAC4] -~w~Ehi Toni! Stai attento con quella roba! È l'interruttore per... - -[MAC4_GA:MAC4] -~w~AAARRRGGGHHHHHHHH! - -[MAC4_GB:MAC4] -~w~Vattene immediatamente! - -[MAC4_H:MAC4] -~w~La 'salsiccia di Casa' è sul ~b~furgone~w~ e deve essere consegnata al negozio. - -[MAC4_H1:MAC4] -~w~Fai la consegna al ~y~negozio di Casa. - -[MAC4_H2:MAC4] -~w~Non abbandonare il ~b~furgone~w~! - -[MAC4_H3:MAC4] -~w~Semina i poliziotti! - -[MAC4_I0:MAC4] -~w~Una consegna speciale di carne per la salsiccia? - -[MAC4_I1:MAC4] -~w~Non mi ha avvertito nessuno! - -[MAC4_I2:MAC4] -~w~Wow! Quale zoo abbiamo rapinato questa volta? - -[MAC4_I3:MAC4] -~w~C'è un mucchio di carne qui! - -[MAC4_I4:MAC4] -~w~...Mmmm! Buona! OK, la prendo. - -[MAC4_I6:MAC4] -~w~Se dovesse scoprirlo, andrà fuori di testa! - -[MAC4_I7:MAC4] -~w~E io sarò fottuto! - -[MAC4_X0:MAC4] -~r~Troppo rapido e indolore per essere una vera operazione siciliana! - -[MAC4_X1:MAC4] -~r~Dovevi consegnare il furgone! - -[MAC4_X2:MAC4] -~r~Hai abbandonato Casa! - -[MAC4_E2:MAC4] -~w~Non uscire dalla ~y~segheria! - -[MAC4_I5:MAC4] -~w~È un bene che Casa non sia qui. - -[MAC4_G5:MAC4] -~w~Sì sì, parlare fa bene. - -[MAC4_CN:MAC4] -~w~Chiamate i poliziotti! - -[MAC4_CO:MAC4] -~w~Aiuto! - -[MAC4_CP:MAC4] -~w~Qualcuno mi aiuti! - -[MAC4_CQ:MAC4] -~w~Aiuto! - -[MAC4_CR:MAC4] -~w~Qualcuno mi aiuti! - -[MAC4_CS:MAC4] -~w~Fatemi uscire da qui! - -[MAC4_A7:MAC4] -~w~Casa è un tipo divertente, - -[MAC4_C0:MAC4] -~w~Non possiamo risolvere civilmente la faccenda, Toni? - -[MAC4_1:MAC4] -~w~Raggiungi ~r~Casa~w~ avvicinandoti di soppiatto dietro di ~r~lui. - -{=================================== MISSION TABLE MAC5 ===================================} - -[MAC5_AA:MAC5] -~w~Ma? Ci sei? - -[MAC5_AB:MAC5] -~w~Toni? ...Sono al telefono... - -[MAC5_AC:MAC5] -~w~...sì, sì è qui... OK... OK... lo terrò impegnato... addio. - -[MAC5_AD:MAC5] -~w~Toni? Sei venuto a far arrabbiare di nuovo la tua mamma eh? - -[MAC5_AE:MAC5] -~w~Passi le giornate a fare il duro. - -[MAC5_AF:MAC5] -~w~Non vieni mai a trovarmi e non mi presenti le tue fidanzate. - -[MAC5_AG:MAC5] -~w~Cosa vuoi? Sei dimagrito e così pallido! - -[MAC5_AH:MAC5] -~w~Mi stai uccidendo ricoprendomi di vergogna e disonore. ~w~Beh, non più. - -[MAC5_AI:MAC5] -~w~Da questo momento in poi.... è finita. - -[MAC5_AJ:MAC5] -~w~Ho messo una taglia sulla tua testa Antonio, è l'unica maniera... - -[MAC5_AK:MAC5] -~w~...sei sempre stato un ragazzo disobbediente. - -[MAC5_AL:MAC5] -~w~Cosa? Ma! - -[MAC5_AM:MAC5] -~w~È la cosa migliore figliolo... almeno cerca di morire come un vero uomo! - -[MAC5_AN:MAC5] -~w~Devi finirla di disonorarmi! - -[MAC5_B1:MAC5] -~w~I sicari di mamma sono qui! - -[MAC5_B2:MAC5] -~w~Dimostra a mamma che vali di più dei suoi ~r~sicari.~w~ Uccidili tutti! - -[MAC5_B3:MAC5] -~w~Adesso sono infuriati! ~r~Eliminali! - -[MAC5_B4:MAC5] -~w~I ~r~sicari~w~ sanno che sei qui. Devi allontanarti da Saint Mark's! - -[MAC4_B6:MAC5] -~w~Stanno arrivando altri ~r~sicari~w~! Allontanati da Saint Mark's. Sanno dove sei! - -[MAC4_B7:MAC5] -~w~GRANATA! CORRI! - -[MAC5_C1:MAC5] -~w~Questo li ha messi fuori gioco... ma ora che i killer sono stati pagati, porteranno a termine il loro lavoro a qualunque costo. - -[MAC5_C2:MAC5] -~w~Ricorda... TORNERANNO! - -[HM1:MAC5] -~w~Non hanno intenzione di mollare! Stanno arrivando altri ~r~sicari~w~. Falli fuori! - -[HM2:MAC5] -~w~Attento! Dei ~r~sicari~w~ si stanno avvicinando. Ammazzali! - -[HM3:MAC5] -~w~Stanno arrivando altri ~r~sicari~w~. Spazzali via! - -[HM4:MAC5] -~w~Altri ~r~sicari~w~ in avvicinamento! Eliminali! - -[MAC5_B5:MAC5] -~w~Occupati dei rimanenti ~r~sicari~w~, ma rimani fuori da Saint Mark's! - -{=================================== MISSION TABLE MAR1 ===================================} - -[MAR1M1:MAR1] -~w~Sei in ritardo! Tipico degli uomini. - -[MAR1M2:MAR1] -~w~Voglio andare a fare shopping... e tu farai da autista. - -[MAR1M3:MAR1] -~w~Per cui sii disponibile: oggi voglio divertirmi, a costo di vederti morto! - -[MAR1M4:MAR1] -~w~Devo solo finire di prepararmi.... - -[MAR1M5:MAR1] -~w~Chi se ne frega! Sono bellissima. Andiamo, Toni! - -[MAR1_B:MAR1] -~w~Porta Maria al ~y~negozio. - -[MAR1_D:MAR1] -~w~Aspettami qua, dolcezza... non ci metterò molto... - -[MAR1_D2:MAR1] -~w~Volevo solo vedere com'era alla luce del sole! - -[MAR1_E:MAR1] -~w~Andiamocene da qui! - -[MAR1_E3:MAR1] -~w~Torna indietro e prendi ~b~Maria. - -[MAR1_F:MAR1] -~W~Divertente! Ma ho bisogno di comprare dell'altra roba. - -[MAR1_G:MAR1] -~w~Tieni il motore acceso... - -[MAR1_GB:MAR1] -~w~Eddai Maria! Basta con i furti! - -[MAR1_GC:MAR1] -~w~Ehi, silenzio bambino! Prima c'è stato un piccolo malinteso! - -[MAR1_G2:MAR1] -~w~Te l'ho detto, non ho niente nascosto qua sotto! - -[MAR1_H:MAR1] -~w~Riportami a casa! - -[MAR1_I:MAR1] -~w~Se mi lasci qui, Salvatore ti farà tagliare le palle! - -[MAR1_J:MAR1] -~r~Maria è morta! Oh, che disastro per l'umanità! - -[MAR1_K:MAR1] -~w~Toni, tesoro, oggi mi sono davvero divertita. - -[MAR1_K2:MAR1] -~w~Magari potresti passare più tardi, così potremo divertirci ancora... - -[MAR1_K3:MAR1] -~w~Ci vediamo dopo, carino! - -[MAR1_L:MAR1] -~w~Abbiamo i poliziotti alle calcagna! Liberati di loro! - -[MAR1_L2:MAR1] -~w~Credo tu li abbia seminati! Andiamo a fare shopping! - -[MAR1_M:MAR1] -~w~FERMA, LADRA! - -[MAR1EXT:MAR1] -~w~Riporta Maria al suo ~y~appartamento. - -[MAR1_1:MAR1] -NESSUNO - -[MAR1_D3:MAR1] -~w~Tieni giù le mani! - -[MAR1_G3:MAR1] -~w~Toglimi quelle manacce di dosso! - -[MAR1_E2:MAR1] -~w~Cerca di far perdere le tue tracce! - -{=================================== MISSION TABLE MAR2 ===================================} - -[MAR2_AA:MAR2] -~w~Basta! Uno dei tirapiedi di Salvatore sta per portarmi da te... - -[MAR2_AB:MAR2] -~w~...oh, è davvero un bel tipo - -[MAR2_AC:MAR2] -~w~Forse un po' magro. - -[MAR2_AE:MAR2] -~w~Comunque... voglio qualcosa per far baldoria, ma la dispensa è vuota. - -[MAR2_AF:MAR2] -~w~Hai della neve? Pura? - -[MAR2_AG:MAR2] -~w~Ottimo. Ciao! - -[MAR2_AH:MAR2] -~w~Forza Toni. Devi portarmi in un posto. - -[MAR2_BA:MAR2] -~w~Non hai una macchina? - -[MAR2_BB:MAR2] -~w~Muoviamoci. Il mio pusher non mi aspetterà tutto il giorno. - -[MAR2_3F:MAR2] -~w~Porta Maria all'incontro col suo ~y~pusher. - -[MAR2_BC:MAR2] -~w~Eccoli là. Parcheggia dietro di loro, bravo ragazzino. - -[MAR2_GA:MAR2] -~w~Aspettami qui. - -[MAR2_GB:MAR2] -~w~Non mi piace la situazione. - -[MAR2_GC:MAR2] -~w~Grazie per l'interessamento, ma sono la donna di Salvatore, andrà tutto bene. - -[MAR2_GE:MAR2] -~w~Non vado da nessuna parte con te! Chi diavolo credi di essere? - -[MAR2_GF:MAR2] -~w~Guida! - -[MAR2_GG:MAR2] -~w~Toni! - -[MAR2_GH:MAR2] -~w~Oh merda! - -[MAR2_19:MAR2] -~w~Uccidi i ~r~Sindacco! - -[MAR2_EA:MAR2] -~w~Sei felice? - -[MAR2_EB:MAR2] -~w~Toni Cipriani. Mio eroe! - -[MAR2_EC:MAR2] -~w~Sai cosa? Mi sono divertita abbastanza. Portami a casa, bello. - -[MAR2_HA:MAR2] -~w~Senti, uh, vuoi salire per un... uh... un caffè e un dolcetto? - -[MAR2_HB:MAR2] -~w~La prossima volta. - -[MAR2_HC:MAR2] -~w~Sicuro? Beh, chiamami. - -[MAR2_O2:MAR2] -~w~Riporta Maria al suo ~y~appartamento. - -[MAR2_CA:MAR2] -~w~Forza, Toni! - -[MAR2_CB:MAR2] -~w~Accidenti Toni, muoviti! - -[MAR2_CC:MAR2] -~w~Salvami, Toni! - -[MAR2_CD:MAR2] -~w~Aiuto! - -[MAR2_CE:MAR2] -~w~Muoooooovitiiiii! - -[MAR2_FA:MAR2] -~w~Ora da chi comprerò la roba? - -[MAR2_FB:MAR2] -~w~Sei un idiota, Toni! - -[MAR2_LM:MAR2] -~w~Hai lasciato indietro ~b~Maria~w~. Torna a prenderla. - -[MAR2_MD:MAR2] -~r~Maria è morta. - -[MAR2_WA:MAR2] -~w~Gli ~r~spacciatori~w~ stanno fuggendo! - -[MAR2_DM:MAR2] -~r~Hai perso gli spacciatori! - -[MAR2_DA:MAR2] -~w~Bell'eroe che sei! - -[MAR2_DF:MAR2] -~r~Hai fatto scappare i pusher di Maria! - -[MAR2_18:MAR2] -~w~Per salvare Maria, tampona la ~r~macchina dei Sindacco~w~! - -[MAR2_AD:MAR2] -~w~...certo. - -{=================================== MISSION TABLE MAR3 ===================================} - -[MAR3_A0:MAR3] -~w~Caro Toni, mi sono offerta come primo premio in una gara su strada. - -[MAR3_A1:MAR3] -~w~Se Salvatore lo scopre, saremo entrambi in un mare di guai. - -[MAR3_A2:MAR3] -~w~Per cui ti conviene venire a salvarmi il culo... magari potrebbe diventare tuo! - -[MAR3_A3:MAR3] -~w~Tua per sempre, Maria. - -[MAR3_E0:MAR3] -~w~Forza, Maria. Andiamo. - -[MAR3_E1:MAR3] -~w~Finalmente! Mr. Osso Duro fa la sua mossa. - -[MAR3_E2:MAR3] -~w~Senti, Maria... sei la donna di Salvatore... - -[MAR3_E3:MAR3] -~w~Non sono di nessuno! - -[MAR3_E4:MAR3] -~w~...sei così fottutamente bigotto! - -[MAR3_E5:MAR3] -~w~Forza Wayne! Andiamo a divertirci! - -{=================================== MISSION TABLE MAR4 ===================================} - -[MAR4_B1:MAR4] -~w~Wayne si trova con la sua banda a ~y~Chinatown. - -[MAR4_B2:MAR4] -~w~Raggiungilo e concialo per le feste! - -[MAR4_C1:MAR4] -~r~Wayne~w~ sta fuggendo! Ruba una moto e uccidilo! - -[MAR4_C3:MAR4] -~w~Lo stai perdendo! Non far fuggire ~r~Wayne! - -[MAR4_D1:MAR4] -~w~Sei Wayne? - -[MAR4_D2:MAR4] -~w~Chi vuole saperlo? - -[MAR4_D3:MAR4] -~w~Sono un amico di Maria. - -[MAR4_D4:MAR4] -~w~...picchiare le ragazze ti fa andare su di giri, vero? - -[MAR4_D5:MAR4] -~w~Quella puttana se l'è cercata! - -[MAR4_D6:MAR4] -~w~Davvero? Beh, ora è il tuo turno! - -[MAR4_D7:MAR4] -~w~Prendiamolo! - -[MAR4_T1:MAR4] -~w~Forza, osso duro! - -[MAR4_T2:MAR4] -~w~Sei un perdente! - -[MAR4_T3:MAR4] -~w~Non sai neanche guidare una moto! - -[MAR4_T4:MAR4] -~w~Se ti avvicini abbastanza, potrai baciarmi il culo! - -[MAR4_F1:MAR4] -~r~Hai fatto scappare Wayne! - -[MAR4_P1:MAR4] -~w~Hai preso il coglione! - -[MAR4_H1:MAR4] -Wayne - -[MAR4_C4:MAR4] -~w~Non perdere ~r~Wayne. ~w~Inseguilo e fallo fuori! - -[BIK_01:MAR4] -Cos'hai preso questa volta? - -[BIK_02:MAR4] -Niente. - -[BIK_03:MAR4] -Di cosa ti sei fatta, eh? - -[BIK_04:MAR4] -Eroina? Sedativi? Allucinogeni? Troppa coca? - -[BIK_08:MAR4] -Chi è stato a ridurti così? - -[BIK_09:MAR4] -Nessuno. - -[BIK_10:MAR4] -Chi è stato? - -[BIK_11:MAR4] -Il tipo col quale mi sto vedendo, Wayne. - -[BIK_12:MAR4] -Il tipo col quale ti stai vedendo? Sei la donna del capo! - -[BIK_13:MAR4] -Andiamo Toni, non essere bigotto... malgrado tutto mi fa andare su di giri, hai presente? - -[BIK_14:MAR4] -Una ragazza ne ha bisogno. - -[BIK_15:MAR4] -In più ti rende una belva a letto. - -[BIK_16:MAR4] -Zitta. Perché quella testa di cazzo - -[BIK_17:MAR4] -ti ha conciato così? - -[BIK_18:MAR4] -Gli ho detto che ero innamorata di un altro. - -[BIK_19:MAR4] -Gli ho detto di noi, Toni. - -[BIK_22:MAR4] -Dove si trova questo Wayne? - -[BIK_23:MAR4] -Bazzica in un bar di Chinatown. - -[BIK_24:MAR4] -Ti amo, Toni Cipriani. - -[BIK_06:MAR4] -- Troppo storta o troppo poco carica? ~n~ - Stai zitto, Toni! - -[BIK_05:MAR4] -Carenza di Diceypam? - -[BIK_20:MAR4] -- E poi mi ha colpita! ~n~ - Non c'è nessun noi, cazzo! Mi farai uccidere. - -{=================================== MISSION TABLE MAR5 ===================================} - -[MAR5_EA:MAR5] -~w~Perché mi hai portato qui? - -[MAR5_EB:MAR5] -~w~Non è qui la mia roba... questa è la zona dove bazzicava Wayne. - -[MAR5_EC:MAR5] -~w~...Ora ricordo! Ho lasciato delle 'bombe' in Hepburn Heights! - -[MAR5_ED:MAR5] -~w~Ehi, è quella puttana di Maria! E quello è lo stronzo che ha ucciso Wayne! - -[MAR5_AA:MAR5] -~w~Ho nascosto la 'bomba' dietro al cestino! - -[MAR5_AB:MAR5] -~w~Merda! Hanno portato via il cestino! - -[MAR5_AC:MAR5] -~w~Aspetta! Ora ricordo! Ne ho lasciata una dose nel mio appartamento! - -[MAR5_AD:MAR5] -~w~Sei sicura? - -[MAR5_AE:MAR5] -~w~Certo che sì! - -[MAR5_BA:MAR5] -~w~Volevo dire l'appartamento di Salvatore! Sì, quello di Salvatore! - -[MAR5_BB:MAR5] -~w~Accidenti, Maria! - -[MAR5_FA:MAR5] -~w~Che autista sei? Ci hai messo una vita! Potevo morire di overdose! - -[MAR5_FB:MAR5] -~w~Sono a pezzi! Mi serve un nuovo guardaroba, qualche piccolo ritocco qua è là! - -[MAR5_FC:MAR5] -~w~Tesoro... hai dei soldi da parte? - -[MAR5_FD:MAR5] -~w~Er... non proprio... - -[MAR5_FE:MAR5] -~w~Allora perché ci hai provato con me? Sono la donna di Salvatore! - -[MAR5_FF:MAR5] -~w~Lui è ricco sfondato! Non avvicinarti più a me! - -[MAR5_CA:MAR5] -~w~(groan) - -[MAR5_CB:MAR5] -~w~Oh merda, mi sa che sto per vomitare... - -[MAR5_CC:MAR5] -~w~Sono davvero a pezzi, Toni! - -[MAR5_CD:MAR5] -~w~Non mi sento per niente bene. - -[MAR5_CE:MAR5] -~w~Stai guidando troppo veloce! E troppo lento! - -[MAR5_NC:MAR5] -~b~Maria~w~ può a mala pena camminare. Trova un mezzo! - -[MAR5_ND:MAR5] -~w~Maria può a mala pena camminare. Trova un mezzo! - -[MAR5_DA:MAR5] -~w~Ti facciamo a pezzi, stronzo! - -[MAR5_DB:MAR5] -~w~Tu e la puttana morirete stanotte! - -[MAR5_DC:MAR5] -~w~Hai fatto un grande errore a metterti contro di noi! - -[MAR5_LM:MAR5] -~w~Hai lasciato indietro ~b~Maria~w~. Torna a prenderla. - -[MAR5_O1:MAR5] -~w~Porta Maria al ristorante a ~y~Callahan Point. - -[MAR5_O2:MAR5] -~w~Porta Maria a ~y~Hepburn Heights. - -[MAR5_O3:MAR5] -~w~Porta Maria al ~y~suo appartamento. - -[MAR5_O4:MAR5] -~w~Porta Maria alla ~y~villa di Salvatore. - -[MAR5_O5:MAR5] -~w~Torna a prendere ~b~Maria. - -[MAR5_MD:MAR5] -~r~Maria è morta. - -[MAR5_O6:MAR5] -~w~Carica ~b~Maria~w~. - -[OVER_01:MAR5] -Oh, ehi bello... pensavo non ce l'avresti fatta. - -[OVER_02:MAR5] -Ma che diavolo hai? - -[OVER_03:MAR5] -Oops! Niente dolcezza, va tutto bene. - -[OVER_04:MAR5] -Alzati, stupida puttana. Di cosa ti sei fatta? - -[OVER_05:MAR5] -Fatta? Nulla... - -[OVER_06:MAR5] -Sai, un paio di queste, un paio di quelle, un paio di verdi, un paio di rosse... - -[OVER_07:MAR5] -Oh e queste pasticcone che mi faccio spedire dall'Olanda. - -[OVER_08:MAR5] -Intense come l'inferno! Sto da Dio. - -[OVER_09:MAR5] -No... non è vero. - -[OVER_10:MAR5] -Ho bisogno di una bomba e starò bene! - -[OVER_11:MAR5] -Sono qui da qualche parte. - -[OVER_12:MAR5] -Cos'è una bomba? - -[OVER_13:MAR5] -Una bomba? Non sai cos'è una bomba? - -[OVER_14:MAR5] -Oh Toni, sei così all'antica! - -[OVER_17:MAR5] -Ho bisogno di una bomba, Toni! Morirò! - -[OVER_18:MAR5] -Mi sono già sentita così male, sono in overdose. - -[OVER_19:MAR5] -Portami una bomba, Toni! - -[OVER_20:MAR5] -Le ho lasciate in un ristorante a Callahan Point. - -[OVER_21:MAR5] -Allora andiamo, forza! - -[OVER_15:MAR5] -- Toni, ti amo. ~n~ - Dici cose senza senso. - -{=================================== MISSION TABLE VIC1 ===================================} - -[VIC1I11:VIC1] -~w~Ti ho trovato un posticino dove stare, Toni. - -[VIC1I12:VIC1] -~w~Sembra fatto apposta per te. - -[VIC1I13:VIC1] -~w~Andremo prima là. - -[VIC1I14:VIC1] -~w~Sei molto generoso... - -[VIC1_3:VIC1] -~w~Porta Vincenzo al suo ~y~magazzino. - -[VIC1_4:VIC1] -~w~Torna in ~b~macchina. - -[VIC1_5:VIC1] -~w~Porta Vincenzo al ~y~rifugio. - -[VIC1_6:VIC1] -~w~Cammina sul segnale giallo all'~y~ingresso. - -[VIC1_7:VIC1] -~w~Cammina sull'icona dei vestiti per cambiarti d'abito. - -[VIC1_8:VIC1] -~w~Torna fuori da Vincenzo. - -[VIC1_9:VIC1] -~w~Porta Vincenzo ad ~y~Atlantic Quays. - -[VIC1_9A:VIC1] -~w~Adesso portami a casa. - -[VIC1_10:VIC1] -~w~Sali in ~b~macchina. - -[VIC1_D1:VIC1] -~w~Cazzo Toni! Guidi come una puledra imbizzarrita! - -[VIC1_D2:VIC1] -~w~Attento a questa cazzo di macchina! - -[VIC1_D3:VIC1] -~w~Toni, smettila di mancarmi di rispetto e guida come un vero uomo! - -[VIC1_C1:VIC1] -~w~Eccoci qui, Toni, 'casa dolce casa'. Non male, vero? - -[VIC1_C2:VIC1] -~w~E questo cesso schifoso dovrebbe essere casa mia? - -[VIC1_C3:VIC1] -~w~Oh! Ti si addice molto. - -[VIC1_C4:VIC1] -~w~Stai mancando di rispetto al vecchio Vincenzo. - -[VIC1_C5:VIC1] -~w~Ora, osso duro, porta le tue chiappe di sopra e mettiti dei vestiti decenti. - -[VIC1_C6:VIC1] -~w~Non ho tempo da perdere, perciò muoviti. - -[VIC1_C7:VIC1] -~w~Ehi Toni, gli appartamenti costano cari. - -[VIC1_C8:VIC1] -~w~Ricordati sempre chi paga le bollette da queste parti. - -[VIC1_C9:VIC1] -~w~IO! Babbo Vincenzo! - -[VIC1C10:VIC1] -~w~Quindi, da adesso in poi lavori per me. - -[VIC1C11:VIC1] -~w~Perciò sarà meglio che torni qui il prima possibile. - -[VIC1_F:VIC1] -~r~Vincenzo è morto. - -[HOMS_01:VIC1] -Ehi, eccoci qui... - -[HOMS_02:VIC1] -Ascolta Toni, so che ci hai fatto un favore, - -[HOMS_03:VIC1] -e so anche che sei fuori da molto tempo, - -[HOMS_04:VIC1] -perciò voglio che te la prenda con calma, OK? - -[HOMS_05:VIC1] -Vincenzo si prenderà cura di te. - -[HOMS_06:VIC1] -Se hai bisogno di soldi, chiedili a lui. - -[HOMS_07:VIC1] -Se ti serve un lavoro, Lucky si prenderà cura di te. - -[HOMS_08:VIC1] -Cos'altro può chiedere un membro della famiglia? - -[HOMS_09:VIC1] -Persino mio figlio non viene trattato così bene. - -[HOMS_10:VIC1] -Ma signor Leone, ne è passata di acqua, - -[HOMS_11:VIC1] -voglio dire, ho fatto molto per questa famiglia. - -[HOMS_12:VIC1] -E adesso vi aspettate che prenda gli ordini da questo... questo... questo... - -[HOMS_13:VIC1] -Beh, non mi sembra... giusto. - -[HOMS_14:VIC1] -Toni, so cosa hai fatto e nessuno ti è più riconoscente di me, davvero, - -[HOMS_15:VIC1] -ma l'idea che tu venga qui - -[HOMS_16:VIC1] -e ti metta a discutere i miei ordini è, francamente, - -[HOMS_17:VIC1] -fuori luogo. 'O capisti? - -[HOMS_18:VIC1] -Capisco, capo. - -[HOMS_19:VIC1] -Perciò, quando hai bisogno di qualcosa, senti Vincenzo ad Atlantic Quay. - -[HOMS_20:VIC1] -Si prenderà cura di te, vero Lucky? - -[HOMS_21:VIC1] -Naturalmente capo, tutto quello che vuole. - -[HOMS_22:VIC1] -Bene, possiamo andare adesso. - -{=================================== MISSION TABLE VIC2 ===================================} - -[VIC2M2:VIC2] -Quel pigro bastardo non consegna un soldo da troppo tempo. - -[VIC2M3:VIC2] -Forse ha bisogno di un po' di incoraggiamento per mettersi al lavoro. - -[VIC2M4:VIC2] -Si comporta da stronzo... mi ricorda un po' te. - -[VIC2M5:VIC2] -~w~Cosa stai insinuando? - -[VIC2M6:VIC2] -Non sto INSINUANDO nulla! - -[VIC2M7:VIC2] -Ti sto dicendo di andare là e assicurarti che lo stronzo cominci a incassare qualche fottuto dollaro! - -[VIC2_B:VIC2] -~W~Recupera un veicolo. - -[VIC2OB1:VIC2] -~w~Porta lo spacciatore a ~y~lavoro. - -[VIC2_C:VIC2] -~w~Avrai bisogno di un veicolo per portarlo nella sua zona di competenza! - -[VIC2_D:VIC2] -~w~Vai a prendere lo spacciatore di Vincenzo a ~y~St. Mark's. - -[VIC2_E:VIC2] -~w~Vincenzo mi ha detto che stai facendo lo stronzo e non stai lavorando... - -[VIC2_E2:VIC2] -~w~Ehi amico! Non sono uno stronzo! - -[VIC2_EX:VIC2] -~w~Io... ehm... ho avuto la febbre! - -[VIC2_E3:VIC2] -~w~Tornerò al lavoro domani... o, forse, dopodomani. - -[VIC2_E4:VIC2] -~w~Oh, io credo che ci andrai oggi... che ti piaccia o no! - -[VIC2_F:VIC2] -~w~Ehi! Non lasciarmi qui! Questo è un bruttissimo quartiere, amico! - -[VIC2_F2:VIC2] -~w~Hai lasciato indietro lo ~b~spacciatore di Vincenzo,~w~ torna a prenderlo. - -[VIC2_G:VIC2] -~w~Ascolta amico! L'ho già detto a Vinnie... Chinatown non è più una zona per i Leone! - -[VIC2_G2:VIC2] -~w~Stanno arrivando i Sindacco! Se torno là, sarò un uomo morto! - -[VIC2_G3:VIC2] -~w~Certo... certo... - -[VIC2_G4:VIC2] -~w~Te l'ho detto amico, ci sono i Sindacco a spacciare. - -[VIC2_G5:VIC2] -~w~Non mi sento troppo bene... credo di avere la febbre o qualcosa del genere. - -[VIC2_H:VIC2] -~w~Fermati vicino allo ~b~spacciatore. - -[VIC2_I:VIC2] -~w~Oh cazzo... - -[VIC2_J:VIC2] -~r~Lo spacciatore di Vincenzo è stato massacrato! - -[VIC2_K:VIC2] -~w~Porta lo spacciatore di Vincenzo a ~y~Chinatown. - -[VIC2_1:VIC2] -NESSUNO - -[VIC2M1:VIC2] -C'è un nostro spacciatore che lavora nella zona nord di Chinatown. - -{=================================== MISSION TABLE VIC3 ===================================} - -[VIC3_H1:VIC3] -~w~Tieni premuto~h~ ~k~ ~PDLT~ ~w~per ~h~agganciare un bersaglio~w~ e premi~h~ ~k~ ~PDFW~ ~w~per attaccare! - -[VIC3_H2:VIC3] -~w~Premi~h~ ~k~ ~PDFW~ ~w~per attaccare lo ~h~spacciatore. - -[VIC3O2:VIC3] -~w~Raggiungi ~y~Chinatown. - -[VIC3O3:VIC3] -~w~Elimina lo ~r~spacciatore. - -[VIC3_1:VIC3] -~w~Vincenzo ti ha lasciato un regalo che tornerà utile. - -[VIC3_BA:VIC3] -~w~Stai lontano dal territorio di Leone, stronzo! - -[VIC3_BB:VIC3] -~w~Ne vuoi ancora, faccia da culo? - -[VIC3_BC:VIC3] -~w~Lo spaccio in questa città è dei Leone! Di nessun altro! Sindacco del cazzo, avete capito? - -[VIC3_6:VIC3] -~w~I Sindacco stanno spacciando in tutta Chinatown. - -[VIC3_AA:VIC3] -~w~Vinnie? - -[VIC3_AB:VIC3] -~w~Ma cazzo, Toni! Un minimo di decenza! - -[VIC3_AD:VIC3] -~w~Sono già tutto intasato, l'ultima cosa che voglio è averti tra le palle. - -[VIC3_AE:VIC3] -~w~Comunque, già che ci sei, sappi che non ho ancora visto soldi - -[VIC3_AF:VIC3] -~w~dal mio spacciatore. E sai perché? - -[VIC3_AG:VIC3] -~w~Illuminami. - -[VIC3_AJ:VIC3] -~w~I Sindacco hanno cominciato a spacciare, persino sul territorio dei Leone! - -[VIC3_AK:VIC3] -~w~E tu resti a guardare, Toni? - -[VIC3_AL:VIC3] -~w~Voglio che tu vada a Chinatown! - -[VIC3_AM:VIC3] -~w~Va bene, 'Boss', vado subito. - -[VIC3_AN:VIC3] -~w~Ma merda! Perché non c'è mai la fottuta carta igienica quando serve? - -[VIC3_AH:VIC3] -~w~Perché è morto, idiota! Qualche stronzo l'ha fatto fuori. - -[VIC3O4:VIC3] -~w~I Sindacco stanno spacciando in tutta Chinatown. Insegna loro una lezione che non scorderanno. - -{=================================== MISSION TABLE VIC4 ===================================} - -[VIC4_H2:VIC4] -~w~Segui la ~h~bomboletta spray~w~ sul radar per trovare il ~h~Pay 'n' Spray. - -[VIC4_A2:VIC4] -~w~Posizionati sul ~h~segno~w~ per vedere le armi disponibili. - -[VIC4_A3:VIC4] -~w~Scegli armi differenti usando~h~ ~k~ ~AMMOV~. - -[VIC4_A4:VIC4] -~w~Compra l'arma selezionata premendo~h~ ~k~ ~AMBUY~ ~w~. Assicurati di avere abbastanza soldi! - -[VIC4_A6:VIC4] -~w~Esistono otto tipi di arma. - -[VIC4_A7:VIC4] -~w~Puoi portare solamente un tipo di arma alla volta: un tipo di pistola, un tipo di fucile, eccetera. - -[VIC4_H1:VIC4] -~w~Segui la ~h~pistola~w~ sul radar per raggiungere ~h~Ammu-Nation~w~. - -[VIC4_H3:VIC4] -~w~Segui la ~h~pistola~w~ sul radar per raggiungere ~h~Ammu-Nation~w~. - -[VIC4_AB:VIC4] -~w~Difficile dimenticarselo... - -[VIC4_AD:VIC4] -~w~La cosa interessante è che vuole far parte dei Leone. - -[VIC4_AE:VIC4] -~w~Che crepi! Ha fatto la sua scelta. - -[VIC4_AG:VIC4] -~w~Pronto, cervellone? Merda, Toni... Sal dice sempre che non sei una cima, - -[VIC4_AH:VIC4] -~w~ma non ti credevo così stupido. - -[VIC4_AJ:VIC4] -~w~Sarà il nostro infiltrato speciale. - -[VIC4_AK:VIC4] -~w~Devi fare una cosa sola. - -[VIC4_AL:VIC4] -~w~È intimidito da un certo gorilla dei Sindacco. - -[VIC4_AM:VIC4] -~w~Voglio che tu rimuova quest'ostacolo - -[VIC4_AN:VIC4] -~w~e porti JD dalla nostra parte. 'O capisti? - -[VIC4_2:VIC4] -~w~Raccogli il ~g~cellulare~w~ come prova del tuo lavoro. - -[VIC4_BA:VIC4] -~w~Toni... oh mi hai fornito ottimo materiale per i miei filmini snuff! - -[VIC4_BB:VIC4] -~w~JD? Hai visto tutto? MI STAVI RIPRENDENDO?!? - -[VIC4_BC:VIC4] -~w~Ehm, stavo solo... solo per uso personale! - -[VIC4_BD:VIC4] -~w~Non vedo l'ora di far parte della stessa squadra! - -[VIC4_BE:VIC4] -~w~Non eccitarti troppo. Mi devi ancora dei soldi. - -[VIC4_BF:VIC4] -~w~Prendi quella macchina dei Sindacco come deposito, OK? - -[VIC4_BG:VIC4] -~w~Falla riverniciare, così nessuno la riconoscerà. - -[VIC4_BH:VIC4] -~w~Io mi occuperò del corpo. - -[VIC4_CA:VIC4] -~w~Ehi! Vattene da qui! - -[VIC4_CB:VIC4] -~w~Non c'è niente da vedere per te! - -[VIC4_61:VIC4] -~w~Sali in ~b~macchina. - -[VIC4_62:VIC4] -~w~Guida fino al Pay 'n' Spray. - -[VIC4_DC:VIC4] -~r~JD ti ha detto di riverniciare la macchina! - -[VIC4_PR:VIC4] ---driiin driiin-- - -[VIC4O1A:VIC4] -~w~Entra ~y~dentro. - -[VIC4_O2:VIC4] -~w~Compra una pistola. - -[VIC4_O4:VIC4] -~w~Uccidi il ~r~gorilla dei Sindacco. - -[VIC4_FA:VIC4] -~r~Adesso di certo non ci venderà un'arma! - -[VIC4_O3:VIC4] -~w~Raggiungi il ~y~cantiere edile. - -[VIC4_AC:VIC4] -~w~Attualmente gestisce un bar bordello dei Sindacco... cioè, un club per gentiluomini. - -[VIC4_AA:VIC4] -~w~Ehi, ti ricordi di JD O'Toole? - -[VIC4_AI:VIC4] -~w~Possiamo usare JD per ottenere informazioni sui piani dei Sindacco. - -[HELP42:VIC4] -~w~Mentre stai mirando, premi rapidamente~h~ ~k~ ~FREE1~ ~w~per attivare la ~h~modalità mira libera~w~, poi usa~h~ ~k~ ~FREE2~ ~w~per correggere la mira. - -[VIC4_A1:VIC4] -~w~Fermati al negozio locale di ~y~Ammu-Nation~w~ per comprare una pistola. - -[VIC4_O1:VIC4] -~w~Torna da ~y~Ammu-Nation~w~ e compra una pistola. - -[VIC4_1:VIC4] -~w~Il ~r~pezzo grosso dei Sindacco~w~ è sul retro del cantiere edile. Uccidilo! - -{=================================== MISSION TABLE VIC5 ===================================} - -[VIC5_H:VIC5] -Leone - -[VIC5_I0:VIC5] -~w~Oh, sei tu. - -[VIC5_I1:VIC5] -~w~Sì, proprio così. Sono io. Che mi dici? - -[VIC5_I2:VIC5] -~w~Ti dico quello che so, osso duro. - -[VIC5_I3:VIC5] -~w~Alcuni dei nostri ragazzi hanno mandato a puttane un lavoro per decerebrati. - -[VIC5_I4:VIC5] -~w~Stupidi coglioni, non sanno neanche fare una cazzo di rapina. - -[VIC5_I5:VIC5] -~w~Ora i poliziotti li tengono sotto tiro a Chinatown. - -[VIC5_I6:VIC5] -~w~Coglioni! Perché sono circondato da fottuti idioti? - -[VIC5_I7:VIC5] -~w~Non saprei... affinità elettiva? - -[VIC5_I8:VIC5] -~w~Oh, sei davvero un cabarettista! - -[VIC5_I9:VIC5] -~w~Beh, divertiti a risolvere il problema. - -[VIC5I10:VIC5] -~w~Tocca a te togliere le castagne dal fuoco al posto mio! - -[VIC5I11:VIC5] -~w~Raggiungi quei coglioni e riportali qui il prima possibile! - -[VIC5_F1:VIC5] -~r~Uno dei membri della gang è morto. - -[VIC5_G0:VIC5] -~w~Trova una macchina per quattro persone. - -[VIC5_O1:VIC5] -~w~Vai a salvare gli ~b~uomini di Vincenzo. - -[VIC5_O2:VIC5] -~w~Porta la ~b~gang~w~ fuori di lì! - -[VIC5_O3:VIC5] -~w~Semina la polizia! - -[VIC5_O4:VIC5] -~w~Porta la gang da ~y~Vincenzo. - -[VIC5_O5:VIC5] -~w~Non disperdere la ~b~gang! - -[VIC5_O6:VIC5] -~w~Hai bisogno di una macchina con più posti! - -[VIC5_G1:VIC5] -~w~Adesso cosa facciamo? - -[VIC5_G2:VIC5] -~w~Siamo fottuti! - -[VIC5_G3:VIC5] -~w~Non voglio finire dentro per quello stronzo di Vincenzo! - -[VIC5_G4:VIC5] -~w~Andiamocene via di qua! - -[VIC5_G5:VIC5] -~w~Aspettatemi! - -[VIC5_G6:VIC5] -~w~Parti a razzo, Toni! - -[VIC5_E1:VIC5] -~w~Allora, avete preso i soldi? - -[VIC5_E2:VIC5] -~w~Li abbiamo con noi, boss... - -[VIC5_E3:VIC5] -~w~Ehi, ascolta, non ci potevamo fare niente... - -[VIC5_E4:VIC5] -~w~...non potevate farci niente. - -[VIC5_E5:VIC5] -~w~Le cose sono andate a puttane... poteva andare peggio. - -[VIC5_E6:VIC5] -~w~Cosa dici... la situazione è migliorata o peggiorata? - -[VIC5_E7:VIC5] -~w~Se fate nuovamente una cazzata simile, le cose peggioreranno anche per voi! - -[VIC5_E8:VIC5] -~w~Ora ripulite questa merda e sparite dalla mia vista. - -[VIC5_E9:VIC5] -~w~Devo fare una chiamata. - -[VIC5E10:VIC5] -~w~Lo giuro su Dio, Toni: da quando sei tornato, mi perseguita la sfiga. - -[VIC5E11:VIC5] -~w~Sei un fottuto uccello del malaugurio. - -{=================================== MISSION TABLE VIC6 ===================================} - -[VIC6_BA:VIC6] -~w~Fermo! - -[VIC6_BB:VIC6] -~w~Non muoverti, stronzo! - -[VIC6_P0:VIC6] -~w~Recupera la ~b~macchina di Vincenzo. - -[VIC6_P1:VIC6] -~w~È una trappola della polizia! Scappa con la macchina! - -[VIC6_P2:VIC6] -~w~Semina la polizia! - -[VIC6_P3:VIC6] -~w~Hai seminato i poliziotti! Ora porta la macchina al ~y~garage di Vincenzo. - -[VIC6_P4:VIC6] -~w~Dai una lezione a Vincenzo: distruggi la sua ~b~macchina! - -[VIC6_P5:VIC6] -~w~Torna nella ~b~macchina di Vincenzo! - -[VIC6_P6:VIC6] -~w~Porta la macchina al ~y~garage di Vincenzo. - -[VIC6_PA:VIC6] -~r~Hai distrutto la macchina! - -[VIC6_D1:VIC6] -~w~Sali in ~b~macchina. - -[VIC6_D3:VIC6] -~w~Guida fino al ~y~demolitore. - -[VIC6_D4:VIC6] -~w~Esci e attendi che il demolitore finisca il suo lavoro. - -[VIC6_D5:VIC6] -~r~Dovevi distruggere la macchina! - -[VIC6_AA:VIC6] -~w~Ehi, Toni: come va la macchina? - -[VIC6_AB:VIC6] -~w~Vinnie, figlio di puttana! Hai tentato di incastrarmi! - -[VIC6_AC:VIC6] -~w~Incastrarti? INCASTRARTI? - -[VIC6_AD:VIC6] -~w~Quando sei tornato, non avevi niente! NIENTE! - -[VIC6_AE:VIC6] -~w~E io avrei tentato di incastrarti, bastardo ingrato! - -[VIC6_AF:VIC6] -~w~Con un appartamento e un lavoro! - -[VIC6_AG:VIC6] -~w~E per la mia generosità mi aspetto che tu prenda qualche rischio per me. - -[VIC6_AH:VIC6] -~w~Non faccio beneficenza, capito amico? E non sono il tuo pappone. - -[VIC6_AI:VIC6] -~w~La polizia teneva d'occhio la macchina? Che si fottano! - -[VIC6_AJ:VIC6] -~w~Quando ti dico di fare una cosa, la devi fare. 'O capisti? - -[VIC6_AK:VIC6] -~w~Oh certo, capisco benissimo, Vinnie. - -[VIC6_AL:VIC6] -~w~Capisco che finché lavorerò per te, verrò trattato come una puttana. - -[VIC6_AM:VIC6] -~w~Facevo i soldi quando tu guardavi ancora sotto le gonne delle ragazzine. - -[VIC6_AN:VIC6] -~w~Tieniti il tuo lavoro da puttana, 'boss'. Me ne vado. - -[VIC6_AO:VIC6] -~w~Toni, stai facendo un grande... - -[VIC6_D2:VIC6] -~w~Fermati sul ~y~segno. - -[HOTW_01:VIC6] -Certo mamma, ti chiamerò più tardi. - -[HOTW_28:VIC6] -Vincenzo! - -[HOTW_02:VIC6] -Certo che mi sto comportando bene, naturalmente. - -[HOTW_03:VIC6] -Ti voglio bene. - -[HOTW_04:VIC6] -Ehi Cheryl, dolcezza, dacci un taglio adesso. - -[HOTW_05:VIC6] -Ecco, adesso vattene. - -[HOTW_06:VIC6] -Un piccolo omaggio della casa. - -[HOTW_11:VIC6] -Sei disgustoso, non hai un briciolo di rispetto. - -[HOTW_12:VIC6] -Rispetto? Io lo chiamo 'multi-tasking', Antonio. - -[HOTW_15:VIC6] -Perché se il problema è questo, potrei chiedere a Ray di aiutarti. - -[HOTW_16:VIC6] -Ma vaffanculo. - -[HOTW_17:VIC6] -Ti sto solo stuzzicando, rilassati. - -[HOTW_18:VIC6] -Ascolta bene osso duro, ho bisogno che tu mi faccia un favore. - -[HOTW_19:VIC6] -Ho delle amiche che vanno matte per la bamba; ne ho una macchina piena a Trenton. - -[HOTW_20:VIC6] -Vai a prenderla... poi chiamami. - -[HOTW_21:VIC6] -Chi sono? Il tuo cazzo di autista? Fottiti. - -[HOTW_22:VIC6] -Ehi, ehi, ehi, ehi... - -[HOTW_23:VIC6] -Lo farei da me, ma i federali mi tengono d'occhio. - -[HOTW_24:VIC6] -Sai che ti coprirò le spalle. Fidati. - -[HOTW_25:VIC6] -- Inoltre, ricordati che qui abbiamo una gerarchia. 'O capisti? Ora fai il bravo ragazzo! - -[HOTW_07:VIC6] -- Ehi angelo, chi è che ti vuole bene? ~n~ - Tu, Vinnie. - -[HOTW_09:VIC6] -- Era tua madre al telefono? ~n~ - Certo. - -[HOTW_13:VIC6] -- Ma come, non ti piacerebbe farti risucchiare da una puttana in calore? ~n~ - Cosa? - -{=================================== MISSION TABLE VIC7 ===================================} - -[VIC7_VE:VIC7] -~r~v1,01 - -[VIC7_1:VIC7] -~w~Vinnie, sono arrivato! Dove diavolo sei? Ma che cazzo... - -[VIC7_2:VIC7] -~w~Toni? Come stai? ...Sapevo che avresti chiamato. - -[VIC7_3:VIC7] -~w~Ascolta, sono al porto di Portland. - -[VIC7_3A:VIC7] -~w~Abbiamo un grosso carico in arrivo. Raggiungimi, io sto salendo sulla grossa nave da carico. - -[VIC7_3B:VIC7] -~w~Non lo so Vinnie... ho delle cose da sbrigare. - -[VIC7_3D:VIC7] -~w~Ma d'ora in avanti saremo soci... anzi, più che soci... fratelli! - -[VIC7_3E:VIC7] -~w~Forza, che ne dici? È ciò che vuole Salvatore. - -[VIC7_3F:VIC7] -~w~OK. Per Salvatore. - -[VIC7_3G:VIC7] -~w~Ma se mi prendi ancora per il culo, sei un uomo morto. - -[VIC7_4:VIC7] -~w~Wahaahha! Ti faccio a pezzettini, piccoletto! - -[VIC7_4A:VIC7] -~w~Raggiungi Vincenzo alla ~y~nave da carico. - -[VIC7_5:VIC7] -~w~Muoooooriiiii! - -[VIC7_6:VIC7] -~w~Ahahahahahah! - -[VIC7_7:VIC7] -~w~Hai già fatto a fette quel brutto stronzo? - -[VIC7_8:VIC7] -~w~Mi dispiace deluderti, Vinnie. - -[VIC7_9:VIC7] -~w~Figlio di puttana! Perché non muori e basta? - -[VIC7_10:VIC7] -~w~Non avresti mai dovuto tornare, Toni. - -[VIC710A:VIC7] -~w~Mi sono spezzato la schiena per Salvatore. - -[VIC710B:VIC7] -~w~E ora che sei tornato in città, non fa altro che dire Toni qua e Toni là! - -[VIC7_11:VIC7] -~w~Questa è la mia città, Toni! LA MIA CITTÀ! - -[VIC711A:VIC7] -~w~Non me la porterai via! - -[VIC7_12:VIC7] -~w~Questa me la godrò davvero... - -[VIC7_4B:VIC7] -~w~Il posto sembra deserto. Sali a bordo della ~y~nave. - -[VIC7_13:VIC7] -~w~Raggiungi l'~y~uscita. - -[VIC7_3C:VIC7] -~w~Senti, so di essere stato uno stronzo con te, Toni. Sono davvero dispiaciuto. - -[VIC7HUL:VIC7] -~w~Raggiungi lo ~y~scafo. - -{=================================== MISSION TABLE SALS1 ===================================} - -[SALS1_1:SALS1] -NONE - -[SALS1_6:SALS1] -Uccidi il ~r~sindaco R.C. Hole! - -[SALS1_7:SALS1] -Recupera il ~g~cellulare del sindaco! - -[SALS1_8:SALS1] -~r~Il sindaco ha terminato la sua corsa. - -[SALS1_9:SALS1] -~r~Il sindaco è fuggito. - -[SALS110:SALS1] -Porta il telefono a ~y~Salvatore. - -[SALS111:SALS1] -Getta l'arma o sparo! - -[SALS112:SALS1] -Ti sono addosso! Il ~r~sindaco~w~ sta scappando! - -[SS1_AA:SALS1] -Sì, sono Toni. - -[SS1_AB:SALS1] -Quel bastardo di un sindaco si sta comportando da stronzo, ma io non mi faccio fregare! - -[SS1_AC:SALS1] -Calmati Sal. Vedrò di metterlo fuori gioco per te. - -[SS1_AD:SALS1] -Sei un bravo ragazzo Toni, rendi onore alla memoria di tuo padre. - -[SS1_AE:SALS1] -Ascolta, quel fottuto ciccione di un sindaco tutti i giorni si fa una corsetta nel parco. - -[SS1_AF:SALS1] -Lascialo senza fiato... per sempre! - -[SS1_AG:SALS1] -E recupera il suo cellulare! - -[SS1_AH:SALS1] -Così vedremo con chi parlava. - -[SALS1AA:SALS1] -Sì, sono Toni. - -[SALS1AB:SALS1] -Quel bastardo di un sindaco sta facendo lo stronzo. - -[SALS1AC:SALS1] -Non posso permetterlo! - -[SALS1AD:SALS1] -Rilassati. Lo metterò fuori gioco per te. - -[SALS1AE:SALS1] -Sei un bravo ragazzo Toni. - -[SALS1AF:SALS1] -Quel ciccione bastardo tutti i giorni fa una corsetta nel parco. - -[SALS1AG:SALS1] -Lascialo senza fiato. Per sempre! - -[SALS1AH:SALS1] -Ah sì... e recupera il suo cellulare! - -[SALS1AI:SALS1] -Così vedremo con chi stava parlando... - -[SALS1C1:SALS1] -Metta giù quell'arma, signore! - -[SALS1C2:SALS1] -Fermo o sparo! - -[SALS1C3:SALS1] -Fermo! - -[SALS1C4:SALS1] -Non fare sciocchezze! - -[SALS113:SALS1] -~r~Il telefono del sindaco è stato distrutto. - -[SALS114:SALS1] -Stai attento! Ti spareranno se entri nel parco con un'arma. - -{=================================== MISSION TABLE SALS2 ===================================} - -[SALS2_1:SALS2] -~w~Prendi la ~b~macchina. - -[SALS2_2:SALS2] -~w~Vai al ~y~luogo dell'appuntamento. - -[SALS2_3:SALS2] -~w~Torna in ~b~macchina. - -[SALS2_4:SALS2] -~r~Mickey è stato ucciso! - -[SALS2_5:SALS2] -~r~Uno degli uomini di Salvatore è stato ucciso! - -[SALS2AA:SALS2] -Toni, - -[SALS2AB:SALS2] -alcuni dei ragazzi ti contatteranno più tardi. - -[SALS2AC:SALS2] -Fatti trovare nei paraggi quando arriveranno. - -[SALS2AD:SALS2] -Ciao, Salvatore. - -[SALS2CA:SALS2] -Toni? - -[SALS2CC:SALS2] -Forza sali, guida tu. - -[SALS2CD:SALS2] -Mickey, cosa, ehm, cosa succede? - -[SALS2CE:SALS2] -Forza Cipriani, credi che sia qui per farti saltare le cervella? - -[SALS2BA:SALS2] -Salvatore è laggiù... - -[SALS2BC:SALS2] -Toni, figliolo, - -[SALS2BD:SALS2] -oggi è il giorno del tuo battesimo! - -[SALS2BE:SALS2] -Oh, Salvatore. Signor Leone. - -[SALS2BF:SALS2] -Mamma attendeva questo giorno. - -[SALS2CB:SALS2] -Sali, forza, andiamo a fare un giro. - -[SALS2BB:SALS2] -Madonn' mia, cosa stai aspettando? - -[SALS2AF:SALS2] -Grazie, Toni... mi farò vivo. - -{=================================== MISSION TABLE SALS3 ===================================} - -[SALS3_1:SALS3] -NONE - -[SALS3_2:SALS3] -Danni - -[SALS313:SALS3] -~r~Il consigliere del sindaco è morto! - -[SALS314:SALS3] -~r~Salvatore è morto! - -[SALS3AA:SALS3] -Toni, salta su! - -[SALS3AB:SALS3] -Dove stiamo andando? - -[SALS3AC:SALS3] -Dobbiamo fare due chiacchiere con l'assistente del sindaco a proposito di Franco Forelli. - -[SALS3BA:SALS3] -Ehi, scendete dalla mia barca! - -[SALS3BB:SALS3] -Tu verrai con me. - -[SALS3BC:SALS3] -Non potete farlo! - -[SALS3BD:SALS3] -Sbrighiamoci, i servizi segreti ci staranno osservando! - -[SALS3CA:SALS3] -Toni, attento a quegli uomini armati sulle rocce! - -[SALS3CB:SALS3] -Uomini armati davanti a noi! - -[SALS3CC:SALS3] -Attento a destra, Toni! - -[SALS3CD:SALS3] -A sinistra Toni, a sinistra! - -[SALS3CE:SALS3] -Ci stanno sparando da quel molo! - -[SALS3CF:SALS3] -Merda, i servizi segreti stanno arrivando in elicottero! - -[SALS3DA:SALS3] -Il sindaco non cagava neanche se Franco non glielo diceva! - -[SALS3DB:SALS3] -Nessuno ha manovrato il sindaco! - -[SALS3DC:SALS3] -Aargh! Aspetta, aspetta, hai ragione! - -[SALS3DE:SALS3] -I Siciliani? Perché? - -[SALS3DF:SALS3] -Hanno Franco in pugno e vogliono scatenare una guerra tra le famiglie di Liberty City. - -[SALS3DG:SALS3] -Quando la situazione si sarà calmata, assumeranno il comando. - -[SALS3DH:SALS3] -Toni, ti chiamerò più tardi. - -[SALS3DI:SALS3] -Prima devo scaricare questo stronzo nella baia! - -[SALS3DD:SALS3] -Sono stati quei Siciliani... hanno spinto Franco a farlo. - -{=================================== MISSION TABLE SALS4 ===================================} - -[SALS4_1:SALS4] -NONE - -[SALS4BA:SALS4] -Sì. - -[SALS4BB:SALS4] -Grazie a Dio hai risposto! - -[SALS4BC:SALS4] -Che succede, Sal? - -[SALS4BD:SALS4] -Stavo spiando i Forelli a Fort Staunton quando improvvisamente si è scatenato l'inferno! - -[SALS4BE:SALS4] -I Sindacco hanno dichiarato guerra ai Forelli, - -[SALS4BF:SALS4] -e io sono bloccato qui, nel mezzo di una battaglia! - -[SALS4BG:SALS4] -Arrivo subito. - -[SALS4BH:SALS4] -Porta la mia limousine, è antiproiettile. Ne avremo bisogno! - -[SALS4AA:SALS4] -Toni, andiamocene da qui! - -[SALS4AB:SALS4] -Riportami alla limousine! - -[SALS4AE:SALS4] -Senti, ho un rifugio a Newport... portami là! - -[SALS4AF:SALS4] -Grazie, Toni... mi farò vivo. - -[SAL4_1:SALS4] -Vai a prendere la ~b~limousine di Leone. - -[SAL4_2:SALS4] -~r~Hai distrutto la macchina! - -[SAL4_3:SALS4] -Porta la macchina a ~y~Fort Staunton. - -[SAL4_4:SALS4] -~r~Hai fatto morire Salvatore! - -[SAL4_6:SALS4] -~b~Salvatore~w~ si trova in fondo al viale. - -[SAL4_9:SALS4] -Vai al ~y~garage. - -[SAL4_11:SALS4] -Hai lasciato ~b~Salvatore~w~ indietro! - -[SAL4_12:SALS4] -È bloccato, abbandona qui la limousine e procedi a piedi. - -[SAL4_13:SALS4] -Torna nella ~b~limousine. - -[SAL4_14:SALS4] -Porta Salvatore e la limousine al ~y~garage~w~ a Newport. - -[SAL4_15:SALS4] -Trova ~b~Salvatore! - -[SAL4_16:SALS4] -Porta Salvatore alla ~b~limousine. - -[SAL4_17:SALS4] -Attendi che ~b~Salvatore~w~ salga sulla limousine! - -{=================================== MISSION TABLE SALS5 ===================================} - -[SALS5_1:SALS5] -~w~Premi~h~ ~k~ ~VEACC~ ~w~per prendere il controllo della macchina di Paul Sindacco. - -[SALS5_2:SALS5] -~w~Fai fuori i ~r~Forelli~w~ all'appuntamento prima che Sindacco trovi il sistema di comando. - -[SALS5_3:SALS5] -~r~Paul Sindacco è stato ucciso! - -[SALS5_4:SALS5] -~r~Il furgone di Salvatore è stato distrutto! - -[SALS5_5:SALS5] -~r~Sindacco ha raggiunto l'appuntamento! - -[SALS5_6:SALS5] -~w~Vai al ~b~furgone. - -[SALS5_7:SALS5] -~w~Tempo rimasto - -[SALS5_8:SALS5] -~r~Sindacco ha trovato il sistema di comando! - -[SALS5_9:SALS5] -~w~I comandi satellitari della macchina di Sindacco risponderanno lentamente. - -[SALS510:SALS5] -Danni - -[SALS5AA:SALS5] +[POR1_19] Ehi! -[SALS5AB:SALS5] -Toni, sono io, ho qualcosa per te... +[DESPERA] +Desperado -[SALS5AC:SALS5] -L'adorerai, sarà divertente. +[MOB_99A] +Raggiungi il telefono pubblico vicino al Mall in Washington. -[SALS5AD:SALS5] -Cosa vuoi che faccia, Sal? +[MOB_98A] +Raggiungi il telefono pubblico in Vice Point. -[SALS5AE:SALS5] -C'è un furgone nei paraggi. +[MOB_96A] +Raggiungi il telefono pubblico al terminal dell'aeroporto. -[SALS5AF:SALS5] -Chiamami quando lo troverai. +[MOB_95A] +Raggiungi il telefono pubblico in Little Havana. -[SALS5BA:SALS5] -OK Sal, sono nel furgone. +[BNK1_1] +La posso aiutare, signore? -[SALS5BB:SALS5] -Ottimo. Abbiamo manomesso la macchina di Sindacco. +[BNK1_2] +Un impostore! -[SALS5BC:SALS5] -Quindi cosa vuoi che faccia? +[BNK1_3] +È impazzito! -[SALS5BD:SALS5] -Paulie sta andando a un appuntamento con i Forelli... +[BNK1_4] +Ma chi diavolo sei? -[SALS5BE:SALS5] -nel tentativo di mediare una tregua. +[BNK1_5] +Dov'è il tuo distintivo? -[SALS5BF:SALS5] -Usa l'equipaggiamento nel furgone per prendere il controllo dell'auto di Paulie +[BNK1_6] +Eccoli là! Sparate per uccidere! -[SALS5BG:SALS5] -e manda all'aria l'appuntamento. +[MOB_24A] +Salve: Mr Vercetti? -[SALS5CA:SALS5] -Che diavolo? +[MOB_24B] +Sì. -[SALS5CC:SALS5] -Oddio, aiuto! +[MOB_24C] +Sono Cortez. Eri invitato al mio party. -[SALS5CD:SALS5] -Fuori dai piedi. +[MOB_24D] +Sì, ricordo. -[SALS5CF:SALS5] +[MOB_24E] +Mr. Vercetti, è stato davvero uno sfortunato incidente quello avvenuto al tuo accordo. + +[MOB_24F] +Lo so. + +[MOB_24G] +Sappi che io e la mia gente stiamo facendo il massimo per scoprire cosa è successo. + +[MOB_24H] +Se vuoi parlarne in prima persona, mi troverai sulla mia barca. Buona giornata, senor. + +[BNK2_2] +MIRARE 3-2-1 FUOCO! + +[BNK2_3] +AREA RIPULITA! + +[BNK2_6] +Questo tipo è pazzo! + +[ANGEL] +Angel + +[CUBJET] +Jetmax Cubano + +[SANDKIN] +Sandking + +[POLMAV] +Maverick della polizia + +[BOXVILL] +Boxville + +[BENSON] +Benson + +[HOTRINA] +Hotring Racer + +[HOTRINB] +Hotring Racer + +[BLOODRA] +Bloodring Banger + +[BLOODRB] +Bloodring Banger + +[MAFIACR] +Cruiser della Mafia + +[COP_M2] +'VICE SQUAD' + +[COP_M3] +'BROWN THUNDER' + +[BJM2_20] +~g~Quando finisci il ~w~tempo~g~ o i ~w~colpi~g~, il turno è finito! + +[BNK3_2] +Non intendo guidare per te, per niente, e lo dirò ai miei compagni di terapia. + +[FEM_SL1] +Salvataggio 1 non trovato + +[FEM_SL2] +Salvataggio 2 non trovato + +[FEM_SL3] +Salvataggio 3 non trovato + +[FEM_SL4] +Salvataggio 4 non trovato + +[FEM_SL5] +Salvataggio 5 non trovato + +[FEM_SL6] +Salvataggio 6 non trovato + +[FEM_SL7] +Salvataggio 7 non trovato + +[FEM_SL8] +Salvataggio 8 non trovato + +[FEA_CHA] +Modifica uscita audio in STEREO. Attendere... + +[FEA_CHD] +Attenzione! Modifica uscita audio da STEREO a DTS. Attendere... + +[FEI_SEL] +Seleziona + +[FEI_BAC] +Indietro + +[FEI_RES] +Riprendi + +[FEI_NAV] +Naviga + +[FEI_BTX] +Tasto / - + +[FEI_BTT] +Tasto " - + +[FEI_STA] +Tasto START - + +[FEI_BTD] +; = > < - + +[FEI_STO] +Stop + +[MOB_68A] +Ehi Tommy, ho una sorpresa per te. + +[MOB_68B] +Sono allo studio cinematografico con dei grandi artisti. + +[MOB_68C] +Perché non vieni a farci visita? + +[MOB_68D] +Lo sai che è una buona idea, vero? Ci vediamo. + +[OUTFT1] +Da strada + +[OUTFT2] +Eleganti + +[OUTFT3] +Tuta + +[OUTFT4] +Sportivo + +[OUTFT5] +Havana + +[OUTFT6] +Da poliziotto + +[OUTFT7] +Da rapina + +[OUTFT8] +Casual + +[OUTFT9] +Mr. Vercetti + +[OUTFT10] +Da corsa + +[OUTFT13] +MC Tommy + +[HOTR_07] +Nuovo miglior tempo: ~1~:0~1~ + +[HOTR_08] +Tempo: ~1~:~1~ + +[GEN3_45] +Arriveranno fra pochi minuti: troviamo un buon punto dove appostarci... + +[CAR_AS1] +BENI CONCESSIONARIA ACQUISITI + +[CAR_AS2] +~g~La concessionaria d'ora in poi genererà introiti per un massimo di ~1~$. Ricordati di recuperarli regolarmente. + +[BUYSAVE] +~g~Se non sei in missione, potrai ora salvare la partita da qui gratuitamente. + +[BUYGARG] +~g~Potrai anche depositare i mezzi in questo garage. + +[STRPBUY] +Club Pole Position acquistato: ~1~$ + +[STRP_R3] +Premi il tasto R3 per acquistare il club Pole Position per ~1~$ + +[NBMN_R3] +Premi il tasto R3 per acquistare Elswanko Casa per ~1~$ + +[GA_4] +Le bombe per le macchine costano 1000$ + +[GA_5] +La tua macchina ha già una bomba installata. + +[GA_6] { reVC update } +Parcheggiala, attivala premendo il ~h~~k~~VEHICLE_FIREWEAPON~~w~ e DATTELA A GAMBE! + +[GA_7] { reVC update } +Arma la bomba con il ~h~~k~~VEHICLE_FIREWEAPON~~w~: esploderà non appena qualcuno cercherà di avviarla. + +[GA_6B] { reVC update } +Parcheggiala, attivala premendo il ~h~~k~~VEHICLE_FIREWEAPON~~w~ e DATTELA A GAMBE! + +[GA_7B] { reVC update } +Arma la bomba con il ~h~~k~~VEHICLE_FIREWEAPON~~w~: esploderà non appena qualcuno cercherà di avviarla. + +[MOB_70A] +Tommy, sono io, il Colonnello Cortez. Ascolta senor, credo tu sia una persona capace di risolvere i problemi. + +[MOB_70B] +Mi troverai sulla mia barca. + +[PICK1] +Giubbotto antiproiettile consegnato all'hotel Ocean View! + +[PICK2] +.357 consegnato al nascondiglio! + +[PICK3] +Motosega consegnata al nascondiglio! + +[PICK4] +Lanciafiamme consegnato al nascondiglio! + +[PICK5] +.308 Fucile di precisione consegnato al nascondiglio! + +[PICK6] +Mitragliatore consegnato al nascondiglio! + +[PICK7] +Lanciamissili consegnato al nascondiglio! + +[PICK8] +Sea Sparrow adesso disponibile alla villa! + +[PICK9] +Carro armato adesso disponibile alle caserme! + +[PICK10] +Hunter adesso disponibile alle caserme! + +[HELP41] +o puoi speronarli con il tuo mezzo + +[ICC1_6] +~g~Utilizza il Mr. Whopee per distribuire i prodotti Cherry Poppers per Vice City. + +[ICC1_12] +PROPRIETÀ ACQUISTATA! + +[CLOTH1] +Abiti eleganti consegnati a Rafaels in Ocean Beach. + +[CLOTH2] +Abiti da strada consegnati al nascondiglio. + +[CLOTH3] +Tuta consegnata a Tooled Up nel Mall North Point. + +[CLOTH4] +Abiti sportivi consegnati al club di Golf in Leafs Links. + +[CLOTH5] +Abiti havana consegnati a Little Havana Streetwear in Little Havana. + +[CLOTH6] +Abiti da poliziotto consegnati alla stazione di polizia in Washington Beach. + +[CLOTH7] +Abiti casual consegnati a Gash nel Mall North Point. + +[CLOTH8] +Abiti Mr. Vercetti consegnati a Collar & Cuffs in Ocean Beach. + +[CLOTH9] +Abiti da corsa consegnati a Jocksport in Downtown. + +[CLOTH10] +Abiti da rapina consegnati al club Malibu in Vice Point. + +[RBM1_9] +~g~Recupera della Love Juice dallo spacciatore per i Love Fist! + +[MOB_62A] +Tommy, sono Ricardo Diaz. Ti volevo ringraziare per l'aiuto ai miei uomini. + +[MOB_62B] +Ho chiesto a quel coglione di Cortez e mi ha detto che il vero affare sei tu. Amico, vienimi a trovare. + +[MOB_62C] +Ho bisogno di un tipo come te. Sono circondato da coglioni, + +[MOB_62D] +coglioni dappertutto, davvero. Ti farò diventare ricco. + +[GOAWAY2] +~g~Ritorna quando avrai completato le missioni dei motociclisti. + +[COL2_9] +Idiota di un americano! Ti sei fatto seguire! + +[LOADCOL] +Caricamento... + +[STFT_17] +Tempo migliore in 'Parco divertimenti PCJ' + +[STFT_18] +Tempo migliore in 'Prova del fango' + +[STFT_19] +Tempo migliore in 'Tracciato di prova' + +[NEW_REC] +Nuovo record!!! ~1~ minuti e ~1~ secondi. + +[BMX_HOW] +~g~Fai due giri sul tracciato sterrato, ~y~passando attraverso~g~ i ~y~PUNTI DI CONTROLLO~g~! + +[BMXREW1] +~g~Ogni volta che batti il tuo record precedente per i due giri, + +[BMXREW2] +~g~otterrai una ~y~RICOMPENSA~g~ più cospicua! + +[BMXRAIN] +~g~È come se piovesse... + +[ITBEG] +All'inizio... + +[NBMNBUY] +El Swanko Casa acquistata: ~1~$ + +[LNKVBUY] +Appartamento Links View acquistato: ~1~$ + +[HYCOBUY] +Condominio Hyman acquistato: ~1~$ + +[BUYGARS] +~g~Puoi parcheggiare altri veicoli in questi garage. + +[OCHEBUY] +Appartamento Ocean Heights acquistato: ~1~$ + +[WASHBUY] +1102 Washington Street acquistata: ~1~$ + +[VCPTBUY] +3321 Vice Point acquistata: ~1~$ + +[SKUMBUY] +Skumole Shack acquistato: ~1~$ + +[HELP6_C] +Premi il ~h~~k~~VEHICLE_HANDBRAKE~~w~ per tirare il freno a mano. + +[HELP2_A] +Premi il ~h~~k~~PED_SPRINT~~w~ mentre corri per effettuare uno ~h~scatto~w~. + +[HELP4_A] +Premi il ~h~~k~~VEHICLE_ACCELERATE~~w~ per ~h~accelerare~w~. + +[HELP5_A] +Premi il ~h~~k~~VEHICLE_BRAKE~~w~ per frenare o, se il veicolo è fermo, per inserire la retromarcia. + +[HELP8_A] +Premi il ~h~~k~~PED_SNIPER_ZOOM_IN~~w~ per zoomare col fucile e il ~x~tasto /~w~ per allargare il campo. + +[PBOAT_1] { reVC update } +Premi il ~h~~k~~VEHICLE_FIREWEAPON~~w~ per sparare con i cannoni della barca. + +[SEG3_4] { reVC update } +~g~Puoi raccogliere una bomba avvicinando il Raider telecomandato. Per posizionare la bomba, premi il ~h~~k~~VEHICLE_FIREWEAPON~. + +[RCR1_3] { reVC update } +~g~Se desideri interrompere la missione, premi il ~h~~k~~VEHICLE_FIREWEAPON~~g~ per far esplodere la macchina. + +[HELP32] { reVC update } +Poi spara con il ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[HELP33] { reVC update } +Poi spara con il ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[TTUTOR] +Premi il ~h~~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Taxi. + +[TTUTOR2] +Premi il ~h~~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Taxi. + +[FTUTOR] +Premi il ~h~~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Camion dei pompieri. + +[FTUTOR2] +Premi il ~h~~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Camion dei pompieri. + +[CTUTOR] +Premi il ~h~~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Vigilante. + +[CTUTOR2] +Premi il ~h~~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Vigilante. + +[HELP8_B] +Premi il ~h~~k~~PED_SNIPER_ZOOM_IN~~w~ per ~h~zoomare~w~ col fucile e il ~h~~k~~PED_SNIPER_ZOOM_OUT~~w~ per ~h~allargare~w~ il campo. + +[ATUTOR3] +Premi il ~h~~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Infermiere. + +[GUN_H1] +~w~Premi il ~h~~k~~PED_SPRINT~~w~ per comprare. ~w~Premi il ~h~~k~~VEHICLE_ENTER_EXIT~~w~ per uscire. + +[PU_CF3] { reVC update } +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per sostituire l'arma attuale con quella presente in questo slot. + +[PU_CF4] { reVC update } +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per sostituire l'arma attuale con quella presente in questo slot. + +[HELP9_B] +Premi il ~h~~k~~PED_FIREWEAPON~~w~ per sparare con il fucile di precisione. + +[HELP37] +Se non vuoi entrare in un veicolo mentre stai assalendo un guidatore, premi il ~h~~k~~PED_SPRINT~~w~. + +[HELP6_A] +Premi il ~h~~k~~VEHICLE_HANDBRAKE~~w~ per tirare il freno a mano. + +[HELP6_D] +Premi il ~h~~k~~VEHICLE_HANDBRAKE~~w~ per tirare il freno a mano. + +[HELP26] +Premi il ~h~~k~~VEHICLE_ENTER_EXIT~~w~ per entrare o uscire da un veicolo. + +[HELP27] +Premi il ~h~~k~~VEHICLE_TURRETUP~~w~ o ~h~~k~~VEHICLE_TURRETDOWN~~w~ per spostare il peso sulla moto. + +[HELP28] +Premi il ~h~~k~~VEHICLE_TURRETUP~~w~ o ~h~~k~~VEHICLE_TURRETDOWN~~w~ per spostare il peso sulla moto. + +[HELP35] +Premi il ~h~~k~~GO_LEFT~~w~ o la ~h~~k~~GO_RIGHT~~w~ per sterzare. + +[HELP36] +Premi il ~h~~k~~GO_LEFT~~w~ o la ~h~~k~~GO_RIGHT~~w~ per sterzare. + +[HELP42] +Segui il ~q~segnalino rosa~w~ per trovare l'hotel. + +[HELP19] +Cammina sul ~q~segnalino rosa~w~ per continuare. + +[HELP1] +Fermati al centro del ~q~segnalino rosa~w~. + +[HELP12] +Cammina nel centro del ~q~segnalino rosa~w~ per attivare una missione. + +[SEG3_6] +~g~Per colpire con successo un bersaglio, devi sganciare la bomba nell'area con un ~q~segnalino rosa~g~. Puoi posizionare le bombe in un ordine qualsiasi. + +[S_PROMP] +Quando non sei in missione, puoi salvare la partita raccogliendo il bonus ~h~audiocassetta~w~. + +[HELP16] +Passa attraverso la porta principale dell'hotel ~h~Ocean View~w~ per entrare nell'edificio. + +[HELP43] +~g~Raggiungi l'hotel ~h~Ocean View~g~ in Ocean Drive. + +[HELI_F1] +~r~Gara a tappe con l'elicottero annullata! + +[AMMUHLP] +Se hai bisogno di armi, fai un salto ad ~h~Ammu-Nation~w~. Segui il ~h~segnale a forma di pistola~w~ sul radar. + +[HELI_1] +Tappa elicottero Downtown + +[HELI_2] +Tappa elicottero Ocean Beach + +[HELI_3] +Tappa elicottero Vice Point + +[HELI_4] +Tappa elicottero Little Haiti + +[FST_MFR] +Stazione radio preferita + +[FST_LFR] +Stazione radio meno amata + +[FEI_HOL] +Trattieni + +[FEI_ZOO] +Zoom + +[FEI_BTR] +> < - + +[FEI_NA] +N\D + +[MESA] +Mesa Grande + +[STRP_NO] +Non puoi ancora comprare il club a luci rosse, prova più tardi. + +[CHSE] +INSEGUI + +[NBMN_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare El Swanko Casa per ~1~$ + +[NBMN_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare El Swanko Casa per ~1~$ + +[NBMN_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare El Swanko Casa per ~1~$ + +[LNKV_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare l'appartamento Links View per ~1~$ + +[LNKV_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare l'appartamento Links View per ~1~$ + +[LNKV_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare l'appartamento Links View per ~1~$ + +[HYCO_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il condominio Hyman per ~1~$ + +[HYCO_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il condominio Hyman per ~1~$ + +[HYCO_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il condominio Hyman per ~1~$ + +[OCHE_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare l'appartamento Ocean Heights per ~1~$ + +[OCHE_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare l'appartamento Ocean Heights per ~1~$ + +[OCHE_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare l'appartamento Ocean Heights per ~1~$ + +[WASH_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare 1102 Washington Street per ~1~$ + +[WASH_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare 1102 Washington Street per ~1~$ + +[WASH_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare 1102 Washington Street per ~1~$ + +[VCPT_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare 3321 Vice Point per ~1~$ + +[VCPT_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare 3321 Vice Point per ~1~$ + +[VCPT_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare 3321 Vice Point per ~1~$ + +[SKUM_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare lo Skumole Shack per ~1~$ + +[SKUM_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare lo Skumole Shack per ~1~$ + +[SKUM_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare lo Skumole Shack per ~1~$ + +[PRNT_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare la tipografia per ~1~$ + +[PRNT_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare la tipografia per ~1~$ + +[PRNT_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare la tipografia per ~1~$ + +[CAR_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il concessionario per ~1~$ + +[CAR_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il concessionario per ~1~$ + +[CAR_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il concessionario per ~1~$ + +[PORN_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare lo studio cinematografico per ~1~$ + +[PORN_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare lo studio cinematografico per ~1~$ + +[PORN_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare lo studio cinematografico per ~1~$ + +[ICE_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare la fabbrica di gelato per ~1~$ + +[ICE_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare la fabbrica di gelato per ~1~$ + +[ICE_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare la fabbrica di gelato per ~1~$ + +[TAXI_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare la compagnia di taxi per ~1~$ + +[TAXI_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare la compagnia di taxi per ~1~$ + +[TAXI_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare la compagnia di taxi per ~1~$ + +[BANK_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il Malibu per ~1~$ + +[BANK_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il Malibu per ~1~$ + +[BANK_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il Malibu per ~1~$ + +[BOAT_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il cantiere navale per ~1~$ + +[BOAT_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il cantiere navale per ~1~$ + +[BOAT_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il cantiere navale per ~1~$ + +[STRP_L] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il club Pole Position per ~1~$ + +[STRP_T] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il club Pole Position per ~1~$ + +[STRP_C] +Premi il ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare il club Pole Position per ~1~$ + +[STOCK] +~r~scorte esaurite + +[HELP14] +Per trovare l'ufficio dell'avvocato, segui la ~h~L~w~ sul radar. + +[RAMPAGE] +VIOLENZA! + +[RAMP_F] +VIOLENZA FALLITA! + +[RAMP_P] +VIOLENZA COMPIUTA! + +[RAMP_A] +TUTTE LE VIOLENZE COMPIUTE! + +[PAGE_01] +Uccidi ~1~ membri della gang in 2 minuti! + +[PAGE_02] +Distruggi ~1~ veicoli in 2 minuti! + +[PAGE_03] +Uccidi sparando in corsa ~1~ membri della gang in 2 minuti! + +[PAGE_04] +Travolgi ~1~ membri della gang in 2 minuti! + +[PAGE_05] +Fai saltare la testa a ~1~ membri della gang in 2 minuti! + +[SENTXS] +Sentinel XS + +[MAP_LEG] +Legenda + +[VCNMAV] +VCN Maverick + +[LG_01] +Posizione giocatore + +[LG_02] +Avery Carrington + +[LG_03] +Contatto motociclisti + +[LG_04] +Colonnello Cortez + +[LG_05] +Ricardo Diaz + +[LG_06] +Kent Paul + +[LG_07] +Avvocato + +[LG_08] +Phil Cassidy + +[LG_09] +Cantiere navale + +[LG_10] +Club Malibu + +[LG_11] +Cubani + +[LG_12] +Studio cinematografico + +[LG_13] +AmmuNation + +[LG_14] +Haitiani + +[LG_15] +Ferramenta + +[LG_16] +Nascondiglio + +[LG_17] +Fabbrica di gelato + +[LG_18] +Taxi Kaufman + +[LG_19] +Love Fist + +[LG_20] +Tipografia + +[LG_21] +Proprietà + +[LG_22] +Pay 'n' Spray + +[LG_23] +Negozio di vestiario + +[LG_24] +Dimora di Tommy + +[LG_25] +Telefono + +[LG_26] +Stazione radio Wildstyle + +[LG_27] +Stazione radio Flash FM + +[LG_28] +Stazione radio KChat + +[LG_29] +Stazione radio Fever 105 + +[LG_30] +Stazione radio VROck + +[LG_31] +Stazione radio VCPR + +[LG_32] +Stazione radio Espantoso + +[LG_33] +Stazione radio Emotion 98.3 + +[LG_34] +Stazione radio Wave 103 + +[LG_36] +Sun Yard + +[LG_37] +Club a luci rosse + +[MAP_YAH] +TU SEI QUI + +[TAXSHRT] +~g~Puoi utilizzare questo taxi Kaufman per arrivare a destinazione invece di guidare. Ti costerà 9$. + +[FE_MLG] +LEGENDA MAPPA + +[FED_RDR] +RADAR + +[FED_HUD] +INTERFACCIA + +[FED_RDL] +GRANDE + +[FED_RDB] +SOLO SEGNALI + +[FED_HUF] +DISSOLVENZA + +[FEST_HV] +Massimo livello missione Vigilante + +[BRIBE1] +Hai appena raccolto una bustarella della polizia: il tuo livello di sospetto è sceso di una stella. + +[CLOHELP] +Abiti puliti! + +[SUNSHIN] +Sunshine Autos + +[CHERRYP] +Gelateria Cherry Popper + +[KAUFCAB] +Taxi Kaufman + +[BOATYAR] +Cantiere navale + +[WANT_L] +Il tuo livello di sospetto è sospeso: se commetterai un crimine mentre le stelle lampeggiano, il tuo livello di sospetto verrà ripristinato. + +[HOTRNG] +HOTRING + +[BLODRNG] +BLOODRING + +[DIRTRNG] +DIRTRING + +[FEC_ABR] +Accelera, frena o inverti marcia + +[FEI_BTU] +; = - + +[FEI_SCR] +Scorri + +[LG_35] +Destinazione + +[BOAT_AS] +~g~Il cantiere navale d'ora in poi genererà introiti per un massimo di ~1~$. Ricordati di recuperarli regolarmente. + +[BOAT_A2] +CANTIERE NAVALE COMPLETATO + +[BOAT_N] +Tappa Charlie + +[BOAT_P] +~g~Raccogli i pacchi prima dello scadere del tempo. + +[FEI_R1B] +Tasto R1 \ R2 - + +[HELP9_A] +Premi il tasto ~h~~k~~PED_FIREWEAPON~~w~ per sparare con il fucile di precisione. + +[HELP21] +Premi il tasto ~h~~k~~VEHICLE_ENTER_EXIT~~w~ per entrare o uscire da un veicolo. + +[CREAM] +Distribuzione + +[UMBERTO] +Cafe Robina + +[PU_CF1] +Premi il tasto ~h~~k~~PED_ANSWER_PHONE~~w~ per raccogliere quest'arma e sostituirla con qualsiasi altra dello stesso tipo in tuo possesso. + +[FED_RDM] +MAPPA E INDICATORI + +[FEC_ILU] +Sguardo invertito in prima persona : + +[NITRO] +Tutti i taxi adesso hanno il super salto! Premi il pulsante del clacson. + +[RATNG53] +Inaffidabile + +[RATNG54] +Imbarazzante + +[RATNG55] +Hacker + +[RATNG56] +Baro + +[RATNG57] +Bugiardo assoluto + +[STHC_04] +Miglior punteggio con la palla sulla spiaggia + +[STHC_05] +Miglior risultato Hotring + +[STFT_13] +Tempo migliore corsa in elicottero a Downtown + +[STFT_14] +Tempo migliore corsa in elicottero a Ocean Beach + +[STFT_15] +Tempo migliore corsa in elicottero a Vice Point + +[STFT_16] +Tempo migliore corsa in elicottero a Little Haiti + +[STFT_21] +Tempo migliore nell'Hotring + +[STFT_22] +Giro migliore nell'Hotring + +[STFT_20] +Tempo migliore in 'Cone Crazy' + +[HELP44] +Fermati nel ~q~ segnalino rosa. + +[HELP45] +Premi il ~h~~k~~PED_DUCK~~w~ per abbassarti. In questo modo migliorerai la precisione con le armi da fuoco. + +[RCR1_5] +Corsa Bandit radiocomandati + +[RCPL1_7] +Corsa Baron radiocomandati + +[RCH1_11] +Raccolta Raider radiocomandato + +[FEA_CTD] +Attenzione! Questa caratteristica richiede delle periferiche compatibili DTS. Vuoi procedere? + +[FEM_STE] +USA STEREO + +[FEM_UDY] +USA DTS + +[GREET] +Saluti da... + +[LANCE_1] +Ehi bello, guida con più prudenza! + +[LANCE_2] +Ehi, guarda cosa hai combinato! + +[LANCE_3] +Ehi, ma dove stai andando adesso? + +[LANCE_4] +Cosa diavolo stai facendo? + +[LAW4_15] +Più soldi! + +[MERC_5] +Bella machina, Mr. Vercetti. + +[MERC_26] +PIÙ VELOCE, PIÙ VELOCE, PIÙ VELOCE! + +[MERC_27] +Attento Tommy, mi hanno rifatto il naso il mese scorso. + +[MERC_28] +Tommy, guida con attenzione. + +[MERC_29] +Tommy, vai più piano! + +[MERC_30] +Tommy per favore, fai fuori qualcun altro! + +[MERC_31] +Tommy, baby, non farmi fuori! + +[MERC_32] +Tommy, sono felice che hai rubato questa macchina! + +[MERC_40] +Mi sono davvero divertita. + +[MERC_43] +Adios, angioletto. + +[MERC_44] +Continua a lavorarci, capito? + +[MERC_45] +Ciao, bellezza. + +[COL5_17] +Oddio, hanno un elicottero! + +[COL5_18] +Abbatti l'elicottero! + +[COL5_19] +Tommy, abbatti quell'elicottero! + +[COL5_20] +Sta tornando! Distruggi l'elicottero! + +[COL5_21] +Ma guarda quanto è grosso! + +[COL5_22] +Sta tornando di nuovo! + +[FEA_DSM] +Attenzione! Questo salvataggio utilizza il DTS e richiede periferiche compatibili. Scegli se vuoi procedere utilizzando l'uscita DTS o quella STEREO. + +[STFT_23] +Tempo migliore per la tappa Charlie + +[HELP50] +Premi il tasto ~h~~k~~PED_ANSWER_PHONE~~w~ per posizionare la visuale da dietro. + +[HELP51] +Premi il tasto ~h~~k~~PED_ANSWER_PHONE~~w ~ per posizionare la visuale da dietro. + +[HELP52] +Premi il tasto ~h~~k~~PED_ANSWER_PHONE~~w ~ per posizionare la visuale da dietro. + +[HELP53] +Premi il tasto ~h~~k~~PED_CYCLE_WEAPON_LEFT~~w~ o il tasto ~h~~k~~PED_CYCLE_WEAPON_RIGHT~~w~ per passare in rassegna le armi disponibili. + +[HELP46] +Sono disponibili otto diversi tipi di arma. + +[HELP47] +Puoi trasportare una sola arma per tipo alla volta: un tipo di pistola, un tipo di fucile a pompa... + +[HELP54] +~w~Costo: ~1~$ ~r~Comprando quest'arma sostituirai quella in uso. + +[HELP2A2] +Premi il tasto ~h~~k~~PED_SPRINT~~w~ mentre corri per effettuare uno ~h~scatto~w~. + +[HLPSN_A] +Il fucile di precisione ti permette di ingrandire l'immagine e colpire i bersagli con precisione dalla distanza. + +[HLPSN_B] +Tieni premuto il tasto ~h~~k~~PED_LOCK_TARGET~~w~ per ~h~mirare~w~ col fucile di precisione. + +[HLPSN_C] +Tieni premuto il tasto ~h~L1~w~ per ~h~mirare~w~ col fucile di precisione. + +[HLPSN_D] +Premi il tasto ~h~~k~~PED_SNIPER_ZOOM_IN~~w~ per ~h~zoomare~w~ col fucile e il tasto ~h~~k~~PED_SNIPER_ZOOM_OUT~~w~ per ~h~allargare il campo~w~. + +[HLPSN_E] +Premi il tasto ~h~~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~ col fucile di precisione. + +[HLPSN_F] +Premi il tasto ~h~~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~ col fucile di precisione. + +[HLPSN_G] +Premi il tasto ~h~~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~ col fucile di precisione. + +[PLANE_H] +Usa il tasto ~h~~k~~VEHICLE_ACCELERATE~~w~ per accelerare e a sinistra e a destra per curvare. + +[PLANE_4] { reVC update } +{Usa il tasto ~h~~k~~VEHICLE_ACCELERATE~~w~ per accelerare e a sinistra e a destra per curvare.} +Usa la levetta analogica destra per accelerare, premi la levetta analogica sinistra in basso per salire, in alto per scendere e a sinistra e a destra per curvare. + +[HELP55] +Premi il tasto ~h~~k~~PED_FIREWEAPON~~w~ per attaccare lo chef. + +[STPR_8] +Club Pole Position + +[STPR_9] +3321 Vice Point + +[STPR_10] +Appartamento Links View + +[STPR_11] +El Swanko Casa + +[STPR_12] +1102 Washington Street + +[STPR_13] +Appartamento Ocean Heights + +[STPR_14] +Skumole Shack + +[STPR_15] +Condominio Hyman + +[RCCANX] +~r~Aereo radiocomandato annullato. + +[CLT_HL2] +Quando viene raccolto un bonus vestiti, vengono rimosse una o due stelle del livello di sospetto. + +[CRED009] +PROGETTAZIONE MISSIONI + +[CRED359] +LEE JOHNSON + +[CRED360] +HENDRIK LESSER + +[CRED361] +PASQUALE STACCHIOTTI + +[CRED362] +ENRIQUE FERNANDEZ + +[CRED363] +PAUL BYERS + +[CRED364] +MIKE EMENY + +[CRED365] +ROB DUNKIN + +[CRED366] +CHARLIE KINLOCH + +[CRED367] +KEVIN HOBSON + +[CRED368] +JIM CREE + +[MOB_66A] +Tommy, Tommy, Tommy, perché sei tornato qua? + +[MOB_66B] +Te l'avevo detto che non vi volevamo più vedere. + +[MOB_67A] +Tommy, credo che dovresti andartene, capito? + +[MOB_67B] +I ragazzi Haitiani non sono molto felici di te. + +[MOB_18A] +Tommy, sono Paulo, come stai? Bene amico, ascolta: volevo farti una chiamata. + +[MOB_18B] +Ossignore, amico, non crederai mai che razza di strafiga ho appena incontrato. + +[MOB_18C] +Una prostituta forse, passeggiava per Little Havana. + +[MOB_18D] +Ha detto che si chiamava Mercedes o qualcosa del genere. + +[MOB_18E] +Oddio, dovresti proprio vedere questa gnocca. + +[MOB_18F] +Riuscirebbe a succhiare via la mina da una matita. Mi detto che ero il migliore che avesse mai avuto e via dicendo. + +[MOB_18G] +Dovresti farci un giro. Ci vediamo! + +[MOB_72A] +Tommy, sono io, Lance. Tieni la bocca chiusa Tommy, perché non ho tempo da perdere. + +[MOB_72B] +Non mi importa cos'hai da dire. Perché dovrei? Non te ne frega niente di me, non è vero? + +[MOB_72C] +Dovresti fare più attenzione a me. Dovresti darmi la fetta che merito. Lo sai... + +[MOB_72D] +Tommy... senti amico, mi dispiace. È solo che... + +[MOB_72E] +La gente mi ha sempre trattato con accondiscenda, come se fossi un bambino. + +[MOB_72F] +Mio fratello lo farebbe. Per favore, amico, tu non farlo. + +[MOB_72G] +Devo andare. + +[MOB_63A] +Tommy, sono Earnest. Earnest Kelly. + +[MOB_63B] +Come stai? + +[MOB_63C] +Non male. Avrò bisogno di un bastone per camminare, ma dovrei tornare al lavoro ben presto. + +[MOB_63D] +Bene. + +[MOB_63E] +Ho sentito di Lance. Che brutto storno, eh? + +[MOB_63F] +Sì. + +[MOB_63G] +Mai fidarsi di qualcuno che cammina per strada in pigiama. Ecco cosa dico. Sono felice che l'hai fatto fuori. Spero che sia stato doloroso per lui. + +[MOB_63H] +Credo di sì. Non credevo fosse quel genere di persona... + +[MOB_63I] +Tommy, per essere un pazzo violento, sei piuttosto ingenuo. Tornerò presto al lavoro e ti insegnerò un paio di cose sulla vita. Ci sentiamo. + +[MOB_63J] +Fai con calma, Earnest. Abbi cura di te. + +[MOB_16A] +Tommy, sono Paulo, que pasa amigo? + +[MOB_16B] +Che cosa vuoi Paul: non sono interessato a vestiti di marca taroccati. + +[MOB_16C] +Molto divertente, amico, ma lo sai che non tratto merce di seconda classe. Nah, ti ho chiamato per sapere se potevo avere una parte nei tuoi film. + +[MOB_16D] +Quando ero in Inghilterra ho fatto un sacco di cose, sai? Ho attributi più forniti di te, amico. + +[MOB_16E] +Paul, grazie per l'offerta, lo terrò presente. + +[MOB_16F] +Davvero, non scordarti di me dopo tutto quello che ho fatto per te. + +[MOB_16G] +È proprio ciò che sto cercando di dimenticare... + +[MOB_17A] +Tommy Vercetti: come va, Mr. Pezzo Grosso? Ho saputo le tue novità: un vero giocatore in città, eh... + +[MOB_17B] +Paul, sei ubriaco. + +[MOB_17C] +No, idiota. Non sono ubriaco. Solo un paio di bicchierini e qualche pillola: non dormo da un paio di giorni, sai... + +[MOB_17D] +Comunque, niente prediche. Non sono uno stupido. Chi ti ha portato in questa città? Chi? Io, ecco chi. + +[MOB_17F] +Davvero? + +[MOB_17G] +Niente prediche, smettila! Ti ho fatto conoscere la gente giusta, ti ho mostrato che corde tirare. Ho fatto molto per te e questo è il modo con cui mi ringrazi. + +[MOB_17H] +Mi ignori. Non mi aiuti a entrare dopo tutto ciò che ho fatto per te! Cosa credi che sia? Un idiota? + +[MOB_17I] +Paul, sta' buono. Sono stato occupato, non fare l'idiota. + +[MOB_17J] +Non sono un idiota, chiaro? Questo è ciò che hanno detto in riformatorio. Stai forse cercando guai, amico? Beh, stai per trovarli! + +[MOB_17K] +Tommy, amico. Per favore. Sei la mia più grande speranza! Per favore, non ridere di me. + +[MOB_17L] +Paul, cerca di dormire, davvero. + +[MOB_73A] +Tommy, sono Steve. + +[MOB_73B] +Ehi Steve. + +[MOB_73C] +Ehi, ciao genio. Sei uno spettacolo! Anch'io sono uno spettacolo! Ci adorano. Stiamo battendo tutti i record, amico. + +[MOB_73D] +Stiamo ottenendo dei grandi riconoscimenti. Finalmente posso comprare una casa al mio vecchio così se ne starà zitto. + +[MOB_73E] +Eeer, mi sembra perfetto, Steve. + +[MOB_73F] +Perfetto? È meraviglioso! Meraviglioso, MERAVIGLIOSO! Non ha mai creduto in me. Non pensava fossi un artista, ma adesso ce l'ho fatta. + +[MOB_73G] +Sono il miglior direttore sadomaso di tutti i tempi, amico. Volevo solo dirti che è stato un piacere averti incontrato. + +[MOB_73H] +Grazie Steve. + +[MOB_73I] +Ti voglio bene, amico. Non cambiare, capito? + +[MOB_73J] +Capito. Ci sentiamo Steve. + +[BOLLOX] +Premi il tasto ~o~R1~w~ per sganciare una bomba. Premi il tasto ~t~"~w~ per annullare. + +[BRID_OP] +Pericolo uragano terminato: tutti i ponti per la terra ferma sono nuovamente aperti. + +[BRID_CL] +Pericolo uragano: tutti i ponti per la terra ferma sono chiusi. + +[LG_38] +Bersaglio + +[ASSET_C] +POLE POSITION COMPLETATA! + +[ASSET_D] +~g~ Il Club Pole Position generera' un reddito fino ad un massimo di $~1~ al giorno. Ritira il denaro regolarmente! + +[ST_WHEE] +Impennata più lunga (sec) + +[ST_STOP] +Frenata in punta più lunga (sec) + +[ST_2WHE] +Permanenza su 2 ruote più lunga (sec) + +[ST_WHED] +Distanza piu' lunga in impennata (m) + +[ST_STOD] +Distanza piu' lunga in frenata (m) + +[ST_2WHD] +Distanza piu' lunga su 2 ruote (m) + +[OUTFT11] +Tuta da ginnastica + +[OUTFT12] +Frankie + +[RELOAD] +~g~Hai vinto l'abilita' di ricarica veloce! + +[APACHE] +Hunter consegnato all'eliporto di Ocean Beach + +[CRED369] +JOHN MCCARDLE + +[CRED370] +DAVID MURDOCH + +[CRED371] +CHRIS BROWN + +[CRED372] +PAUL GREEN + +[CRED373] +KYLE MILNE + +[CUNTY] +Nuovi vestiti consegnati alla Proprieta' di Vercetti! + +[GOODBOY] +$50 Come Bonus Buon Cittadino! + +[NEWCONT] +Nuovo ~h~Punto di Contatto~w~ disponibile alla Marina di Ocean Beach!! + +[FIRELVL] +Missione Camion dei pompieri livello ~1~ + +[HELP56] +Premi il tasto ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~ per cambiare la modalità di visuale. + +[HELP57] +Premi il tasto ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~ per cambiare la modalità di visuale. + +[HELP58] +Mentre prendi la mira, premi il ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~, ~h~~k~~PED_CYCLE_TARGET_RIGHT~~w~ per cambiare bersaglio. + +[HELP59] +Mentre prendi la mira, premi il ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~, ~h~~k~~PED_CYCLE_TARGET_RIGHT~~w~ per cambiare bersaglio. + +[HELP60] +Se premi il tasto ~h~~k~~PED_SPRINT~~w~ mentre assalti una macchina, non entrerai nel veicolo. + +[HELP61] +Adesso hai colpi infiniti e il doppio dell'energia su tutti i veicoli. + +[CRED374] +KEVIN YUN + +[CRED375] +ERICK COBBS + +[CRED376] +RANDY BLAKE + +[CRED377] +BRANDON LIM + +[CRED378] +BRANDON FENOL + +[CRED379] +MICHAEL MANOLE + +[CRED380] +ALETHEIA SIMONSON + +[CRED381] +JOHN JANSEN + +[FEC_LB1] +Guarda + +[FEC_LB2] +indietro + +[FEC_LB3] +Guarda indietro + +[FEC_R3] +(tasto R3) + +[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 + +[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~ + +[FEC_WAR] +Attenzione + +[FEC_OKK] +OK + +[FEC_DLF] +Eliminazione fallita. + +[FEC_SVU] +Salvataggio fallito. + +[FEC_LUN] +Caricamento fallito. File corrotto: è necessario eliminarlo. + +[FEC_PAD] +Gamepad + +[FEC_JOY] +Joystick + +[FES_CSA] +Seleziona una skin dalla seguente lista: + +[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_DSN] +Skin predefinita.bmp + +[FET_RSO] +RIPRISTINATE IMPOSTAZIONI ORIGINALI + +[FET_RSC] +HARDWARE NON DISPONIBILE - RIPRISTINATE IMPOSTAZIONI ORIGINALI + +[FEA_3DH] +HARDWARE AUDIO + +[FEA_SPK] +CONFIGURAZIONE ALTOPARLANTI + +[FEM_LOD] +DISTANZA VISUALE + +[FEM_VSC] +SINCRONIA FRAME + +[FEM_FRM] +LIMITATORE FRAME + +[FEM_MM] +MENU PRINCIPALE + +[FED_RES] +RISOLUZIONE + +[FET_CTL] +IMPOSTAZIONI DEI COMANDI + +[FET_OPT] +OPZIONI + +[FEC_MSH] +SENSIBILITÀ MOUSE + +[FEC_IVV] +INVERTI MOUSE VERTICALMENTE + +[FET_MTI] +CONFIGURAZIONE COL MOUSE + +[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 + +[FEC_SPC] +BARRA + +[WIN_TTL] +Grand Theft Auto VC + +[WIN_95] +Grand Theft Auto VC non è supportato da Windows 95 + +[WIN_DX] +Grand Theft Auto VC richiede DirectX versione 8.1 o superiore + +[FET_EIG] +IMPOSSIBILE ASSEGNARE UN COMANDO A QUESTA AZIONE + +[FET_DAM] +MODELLAZIONE ACUSTICA DINAMICA + +[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? + +[FET_QG] +ESCI DAL GIOCO + +[FEN_STA] +AVVIA LA PARTITA + +[FET_PAU] +MENU PAUSA + +[REPLAY] +REPLAY + +[FEC_ANS] +Azione + +[CVT_MSG] +Conversione texture per prestazioni ottimali con la tua scheda video + +[FEC_SFT] +MAIUSC + +[FEH_VMP] +VEDI MAPPA + +[FES_DEE] +Eliminazione fallita! Prova nuovamente. + +[FES_CMP] +Salvataggio fallito! Prova nuovamente. + +[FESZ_WR] +Salvataggio partita. Un momento... + +[FELD_WR] +Caricamento partita. Un momento... + +[FEDL_WR] +Eliminazione salvataggio. Un momento... + +[PCRESRT] +Avvio nuova partita. Un momento... + +[FET_STI] +Configurazione standard + +[FET_CTI] +Configurazione classica + +[FET_PS] +IMPOSTAZIONE SKIN GIOCATORE + +[FEH_NA] +OPZIONE NON DISPONIBILE + +[FEH_MPH] +MOUSE, FRECCE PER MUOVERSI - PAGSU, PAGGIÙ, ROTELLINA PER LO ZOOM, L - LEGENDA + +[FEA_MP3] +RIPRODUTTORE MP3 + +[NO_PCCD] +Inserisci il CD di GTA Vice City o premi Esc per annullare + +[FEH_SSA] +FRECCE PER MUOVERSI - S PER SALVARE + +[FES_CMI] +ULTIMA MISSIONE COMPLETATA + +[FET_STS] +STATISTICHE SALVATE NEL FILE 'STATS.HTML' + 'STATS.TXT' + +[WIN_VDM] +Memoria video insufficiente per eseguire Grand Theft Auto VC + +[FEC_ERI] +Errore! Uno o più azioni non sono assegnate a nessun tasto o pulsante. Assicurati che a tutte le azioni corrisponda un comando. + +[FEC_TFU] +Torretta + Inclina in su + +[FEC_TFD] +Torretta + Inclina in giù + +[FET_RIG] +SELEZIONA IL NUOVO COMANDO PER QUESTA AZIONE + +[FEA_NM3] +NESSUN FILE MP3 TROVATO + +[FEA_MPB] +INCREMENTO VOLUME MP3 + +[FEA_MUS] +VOLUME MUSICA + +[FEA_SFX] +VOLUME EFFETTI + +[CVT_ERR] +Spazio su disco esaurito; è necessario liberare dello spazio prima di poter procedere. Premi ESC per annullare. + +[FEA_ADP] +RILEVAMENTO AUTOMATICO + +{=================================== MISSION TABLE AMBULAE ===================================} + +[ATUTOR2:AMBULAE] +~g~Conduci i pazienti all'ospedale guidando CON PRUDENZA! Qualsiasi scossone può ucciderli. + +[A_FULL:AMBULAE] +~r~Ambulanza piena! + +[A_FAIL2:AMBULAE] +~r~La tua scarsa sollecitudine è stata fatale al paziente! + +[A_FAIL3:AMBULAE] +~r~Il paziente è morto! + +[A_PASS:AMBULAE] +Salvato! + +[A_COMP2:AMBULAE] +Non ti stancherai mai! + +[A_COMP1:AMBULAE] +Missioni Infermiere completate: ~1~$ + +[A_CANC:AMBULAE] +~r~Missione Infermiere annullata! + +[A_COMP3:AMBULAE] +Missione Infermiere completata! Non ti stancherai mentre corri! + +[ALEVEL:AMBULAE] +Missione Infermiere livello ~1~ + +[A_FAIL1:AMBULAE] +Missione Infermiere terminata. + +[A_SAVES:AMBULAE] +PERSONE SALVATE: ~1~ + +{=================================== MISSION TABLE ASSIN1 ===================================} + +[ASM1_5:ASSIN1] +~r~Ha completato le sue consegne! + +[ASM1_6:ASSIN1] +Consegne rimanenti: + +[ASM1_7:ASSIN1] +~g~Carl Pearson, fattorino di una pizzeria. Uccidilo prima che completi le sue consegne. + +[ASM1_D:ASSIN1] +Mr. Teal, il tuo aiuto nello sradicare gli stranieri è stato inestimabile per il nostro lavoro. + +{=================================== MISSION TABLE ASSIN2 ===================================} + +[ASM2_1:ASSIN2] +~g~Mrs. Dawson lascerà presto la gioielleria in Vice Point. Devi ucciderla. Deve sembrare un incidente d'auto. + +[ASM2_3:ASSIN2] +~g~Sta per esplodere! Allontanati! + +[ASM2_4:ASSIN2] +~r~Hai danneggiato la sua auto, ma lei non è sopra! Adesso non ci entrerà di sicuro! + +[ASM2_5:ASSIN2] +~r~È riuscita a scappare! + +[ASM2_6:ASSIN2] +~r~Sei stato visto troppo vicino alla scena dell'incidente! + +[ASM2_7:ASSIN2] +~g~Non utilizzare armi! Deve sembrare un incidente! Spingila fuori strada! + +[ASM2_8:ASSIN2] +~g~La morte di Mrs. Dawson deve sembrare un incidente. Non utilizzare armi. + +[ASM2_9:ASSIN2] +~g~Avrai bisogno di una vettura per questo lavoro! + +[ASM2_10:ASSIN2] +~g~Quando la sua macchina prende fuoco, allontanati il più possibile dal luogo dell'incidente. + +[ASM2_11:ASSIN2] +Aiuto! + +[ASM2_12:ASSIN2] Qualcuno mi aiuti! -[SALS5CG:SALS5] -La mia auto è posseduta! +[ASM2_13:ASSIN2] +Oddio! -[SALS5CE:SALS5] -Questa macchina sta cercando di uccidermi! +[ASM2_A:ASSIN2] +Complimenti per l'ottimo lavoro, Mr. Teal. Il mio cliente è molto soddisfatto. -[SALS5CB:SALS5] -Ehi, cosa sta succedendo? +[ASM2_2:ASSIN2] +Salute: -{=================================== MISSION TABLE SALS6 ===================================} +{=================================== MISSION TABLE ASSIN3 ===================================} -[SALS601:SALS6] -~w~Sal ti ha lasciato una ~b~barca ~w~al molo sud occidentale: ferma l'informatore. +[ASM3_11:ASSIN3] +TEMPO: -[SALS602:SALS6] -~w~Si sta dirigendo verso la costa. Vai a ~r~prenderlo! +[ASM3_C:ASSIN3] +Una gang europea ha pianificato un furto in banca a Vice City. I miei clienti preferirebbero che il colpo non vada a segno. -[SALS603:SALS6] -L'~r~informatore~w~ sta tornando da Franco Forelli! +[ASM3_D:ASSIN3] +Ogni membro della gang ha un nascondiglio nella città: alcuni hanno dei lavori di copertura, altri sono in vacanza. -[SALS604:SALS6] -~r~L'informatore è riuscito a tornare a Fort Staunton. +[ASM3_E:ASSIN3] +Dettagli e posizione più probabile di ogni bersaglio sono riportati nel nastro sotto al telefono. -[SALS605:SALS6] -~r~È riuscito a fuggire! +[ASM3_14:ASSIN3] +~g~Dick Tanner si trova presso la DBP Security in Ocean Drive. -[SALS606:SALS6] -~r~Sta ~w~scappando a piedi! +[ASM3_15:ASSIN3] +~g~Marcus Hammond e Franco Carter si trovano presso la gioielleria in Vice Point. -[SALS607:SALS6] -~w~Sta scappando con un'~r~auto rubata! +[ASM3_16:ASSIN3] +~g~Nick Kong si trova presso Washington Beach. -[SALS608:SALS6] -~r~Non puoi inseguirlo senza una barca! +[ASM3_18:ASSIN3] +~g~Non avvicinarti troppo, se no il bersaglio potrebbe vederti e sarai costretto a inseguirlo! -[SALS6AA:SALS6] -Pronto. +[ASM3_19:ASSIN3] +~g~Ti ha visto! Fallo fuori! -[SALS6AC:SALS6] -La faida Forelli-Sindacco. +[ASM3_20:ASSIN3] +~g~Ti hanno visto! Falli fuori entrambi! -[SALS6AD:SALS6] -Si sta recando a un incontro con Franco Forelli. +[ASM3_21:ASSIN3] +~r~Non hai ucciso tutti i membri della gang in tempo! -[SALS6AE:SALS6] -È un grosso vantaggio per noi che Franco non sappia nulla, +[ASM3_22:ASSIN3] +~g~Non avvicinarti troppo, se no i bersagli potrebbero vederti e cercare di scappare! -[SALS6AF:SALS6] -e che questa guerra continui. +[ASM3_12:ASSIN3] +~g~Un assortimento di armi è stato lasciato per te nel caso di bisogno. Hai ~h~9 MINUTI~g~ per uccidere tutti i membri della gang. -[SALS6AG:SALS6] -Fai fuori quel chiacchierone. +[ASM3_13:ASSIN3] +~g~Mike Griffin lavora su un cartello pubblicitario in Washington. -[SALS6AH:SALS6] -Sarà fatto, Sal. +[ASM3_17:ASSIN3] +~g~Charlie Dilson è in macchina in Washington. -[SALS6AB:SALS6] -Toni, un informatore ha scoperto che c'è la cosca siciliana dietro la faida Forelli-Sindacco. +{=================================== MISSION TABLE ASSIN4 ===================================} -[SLS6_20:SALS6] -~w~Sta ritornando da Franco Forelli, fallo ~r~fuori~w~! +[ASM4_12:ASSIN4] +Distanza: -[SLS6_21:SALS6] -~w~Fallo ~r~fuori~w~! +[ASM4_15:ASSIN4] +~g~Recupera il fucile di precisione alla tua destra. -{=================================== MISSION TABLE NEDS1 ===================================} +[ASM4_16:ASSIN4] +~g~Osserva la donna sul balcone: scenderà per le scale e chiederà l'ora a un uomo. -[NEDS1_1:NEDS1] -L'FBI sta andando a recuperare dei falsi documenti inerenti il doping di alcune stelle dello sport. +[ASM4_17:ASSIN4] +~g~Solo quando la conversazione avrà termine, dovrai uccidere l'uomo con cui ha parlato ma NON la donna. -[NEDS1_2:NEDS1] -Se i documenti verranno consegnati all'FBI, saranno accusati degli innocenti. +[ASM4_18:ASSIN4] +~g~Una volta eliminato il bersaglio, recupera la sua valigetta e portala ad Ammu-Nation in Downtown. -[NEDS1_3:NEDS1] -Devi recuperare questi documenti e consegnarmeli, li terrò al sicuro io. +[ASM4_19:ASSIN4] +~g~Tieni la distanza dal bersaglio: la barra nella parte superiore destra dello schermo indica quanto gli sei vicino. -[NEDS1_4:NEDS1] -Avrai bisogno di un veicolo dell'FBI. +[ASM4_20:ASSIN4] +~g~Se si riempirà, verrai avvistato. -[NEDS1_5:NEDS1] -C'è stato un tentativo di rapina sull'autostrada. L'FBI è sulla scena del crimine. +[ASM4_21:ASSIN4] +~g~Recupera la valigetta! -[NEDS1_6:NEDS1] -Ruba la loro macchina e raggiungi il luogo dell'incontro prima che sia troppo tardi. +[ASM4_22:ASSIN4] +~g~Porta la valigetta ad Ammu-Nation in Downtown. -[NEDS1_8:NEDS1] -Torna nella macchina dell'~b~FBI! +[ASM4_23:ASSIN4] +~g~Ti ha visto e sta fuggendo! Uccidilo e recupera la valigetta! -[NEDS1_9:NEDS1] -Vai al ~y~luogo dell'incontro. +[ASM4_25:ASSIN4] +~r~Hai ucciso la donna, idiota! -[NEDS111:NEDS1] -Semina la polizia! +[ASM4_26:ASSIN4] +~r~Il bersaglio è salito a bordo del volo! -[NEDS113:NEDS1] -Ecco i documenti, come da accordi... +[ASM4_27:ASSIN4] +~r~Il bersaglio ti ha visto! Avresti dovuto tenerti a distanza! -[NEDS114:NEDS1] -Ma che diavolo... è già arrivato un agente! +[ASM4_28:ASSIN4] +~r~Il bersaglio ti ha visto! Ti ha sentito sparare! -[NEDS115:NEDS1] -Un'altra macchina dell'FBI? Ehi! Sei un impostore! +[ASM4_29:ASSIN4] +~r~Dovevi ucciderlo solo dopo che aveva parlato con la donna! -[NEDS116:NEDS1] -Ferma l'~r~informatore! +[ASM4_A:ASSIN4] +È giunta l'ora di occuparsi di pesci più grossi, Mr Teal. Troverai un fucile tra le foglie alla tua destra. -[NEDS117:NEDS1] -Recupera i ~g~documenti. +[ASM4_B:ASSIN4] +Osserva la donna sul balcone sopra i banchi dei check-in: scenderà per le scale e chiederà l'ora a un uomo. -[NEDS118:NEDS1] -Consegna i documenti al ~y~Liberty Tree. +[ASM4_C:ASSIN4] +Dovrai uccidere questa persona, recuperare la sua valigetta e portarla nella locazione riportata sotto al telefono. -[NEDS119:NEDS1] -~r~La macchina dell'FBI è a pezzi. +{=================================== MISSION TABLE ASSIN5 ===================================} -[NEDS120:NEDS1] -~r~Sei arrivato tardi! L'informatore ha consegnato i documenti all'FBI! +[ASM5_A:ASSIN5] +C'è uno scambio di beni sopra il tetto della fabbrica di gelato Cherry Popper. -[NEDS121:NEDS1] -Ottimo lavoro Toni, il Signore sarà orgoglioso di te. +[ASM5_B:ASSIN5] +Uccidi tutti gli elementi coinvolti, recupera la merce e portala all'eliporto presso l'aeroporto. -[NEDS122:NEDS1] -Mi accerterò che finiscano in buone mani. +[ASM5_C:ASSIN5] +Alla tua sinistra troverai un cancello che porta al retro della fabbrica. -[NEDS123:NEDS1] -Arrivederci. +[ASM5_1:ASSIN5] +~g~Entra nel cortile dietro alla fabbrica di gelato Cherry Popper e apriti la strada fino al luogo dello scambio. -[NEDS124:NEDS1] -~r~Il rapporto è rovinato! +[ASM5_2:ASSIN5] +~g~Recupera la merce e portala all'eliporto presso l'aeroporto. -[NEDS1AA:NEDS1] -Mi perdoni, padre, perché ho peccato... +[ASM5_3:ASSIN5] +~g~Porta la merce all'eliporto presso l'aeroporto! -[NEDS1AB:NEDS1] -Merda, il diavolo gioca sporco quanto te, Antonio. +{=================================== MISSION TABLE BANKJ1 ===================================} -[NEDS1AE:NEDS1] -Un peccatore ha confessato di aver falsificato dei documenti che accusano di doping i migliori atleti della nazione. +[WANTED1:BANKJ1] +~g~Semina i poliziotti per perdere il tuo livello di sospetto. -[NEDS1AF:NEDS1] -Se riuscissi a impedirgli di consegnarli all'FBI, potremmo salvare le carriere di molti innocenti. +[BJM1_A:BANKJ1] +Tommy! Ehi Tommy, guarda qua, è grandioso! Ho fatto installare un minibar! -[NEDS1AG:NEDS1] -Lo consideri già fatto, padre. +[BJM1_B:BANKJ1] +Abbiamo un intero bar al piano di sotto, Ken. -[NEDS1BA:NEDS1] -Sei in anticipo. +[BJM1_C:BANKJ1] +Sì, sì, certo. Beh, ho portato quella lavagna che mi avevi richiesto. -[NEDS1BB:NEDS1] -Ehi, non ti conosco, dov'è John-O? +[BJM1_D:BANKJ1] +Ah, questi sono i benefici della scuola dell'obbligo: l'abilità di seguire le istruzioni. -[NEDS1BC:NEDS1] -John-O? Non è potuto venire. +[BJM1_E:BANKJ1] +Adesso mi serve uno scassinatore. -[NEDS1BD:NEDS1] -Ehi, ma quello è John-O! +[BJM1_F:BANKJ1] +Oh, va bene, beh, fammi pensare... scassinatore, scassinatore, scassinatore... Trovato! Questo tipo ti farà impazzire! -[NEDS1BE:NEDS1] -Dammeli! +[BJM1_G:BANKJ1] +Ahh, nah, quello schmuck. È dentro. -[NEDS1BF:NEDS1] -Vaffanculo! +[BJM1_H:BANKJ1] +Dentro dove? -[NEDS1AD:NEDS1] -Direi che andrò per la seconda... +[BJM1_I:BANKJ1] +In una cella nel quartier generale della polizia in attesa di trasferimento. -[NEDS1AC:NEDS1] -Puoi dire un'Ave Maria oppure andare a fare il lavoro sporco per conto di Dio. +[BJM1_J:BANKJ1] +Credo stia per essere rilasciato sulla parola... -[NEDS1_7:NEDS1] -Vai sulla scena del crimine e ruba una ~b~macchina dell'FBI~w~, poi raggiungi il luogo dell'incontro prima delle ~1~:~1~. +[BJM1_1:BANKJ1] +~g~Fai fuggire Cam Jones dalla custodia della polizia! -[NEDS125:NEDS1] -Vai sulla scena del crimine e ruba una ~b~macchina dell'FBI~w~, poi raggiungi il luogo dell'incontro prima delle 0~1~:~1~. +[BJM1_3:BANKJ1] +~g~Troverai ciò che ti serve nello spogliatoio della stazione. -[NEDS126:NEDS1] -Vai sulla scena del crimine e ruba una ~b~macchina dell'FBI~w~, poi raggiungi il luogo dell'incontro prima delle 0~1~:0~1~. +[BJM1_21:BANKJ1] +~g~La tessera per le celle si trova nel piano superiore della stazione. -[NEDS127:NEDS1] -Vai sulla scena del crimine e ruba una ~b~macchina dell'FBI~w~, poi raggiungi il luogo dell'incontro prima delle ~1~:0~1~. +[BNK1_7:BANKJ1] +Cam Jones? -{=================================== MISSION TABLE NEDS2 ===================================} +[BNK1_8:BANKJ1] +Ti sto facendo scappare! -[NEDS2_1:NEDS2] -NONE +[BNK1_10:BANKJ1] +Sì, sono io... -[NEDS2AA:NEDS2] -Mi perdoni, padre, perché ho peccato... +[BNK1_11:BANKJ1] +Come vuoi! -[NEDS2AB:NEDS2] -Merda, Toni, cos'hai combinato ancora? +[BNK1_13:BANKJ1] +Devo fare un lavoro e tu sarai il mio scassinatore. -[NEDS2AC:NEDS2] -Ehi padre, moderi il linguaggio! +[BNK1_14:BANKJ1] +Sempre meglio che restare col culo in galera! -[NEDS2AD:NEDS2] -Hai ragione, Ave Maria piena di qualche cosa. +[BJM1_22:BANKJ1] +~g~Riporta Cam a casa sua! -[NEDS2AE:NEDS2] -Un'anima ribelle ha confessato di aver rubato dei diamanti. +[BJM1_23:BANKJ1] +~g~Prima devi recuperare la tessera! -[NEDS2AF:NEDS2] -Aiuta questo pellegrino nel cammino verso la redenzione: recupera il malloppo e io mi occuperò di restituire i diamanti... +[BNK1_12:BANKJ1] +Fai perdere le tracce e riportami a casa! -[NB2_2:NEDS2] -Recupera la ~g~valigetta~w~ e uccidi tutti i membri della gang. +[BJM1_20:BANKJ1] +Metti via l'arma o ne pagherai le conseguenze! -[NB2_3:NEDS2] -Consegna la valigetta agli uffici del ~y~Liberty Tree. +[BJM1_5:BANKJ1] +Solo personale autorizzato oltre a questo punto! -[NB2_4:NEDS2] -Recupera la ~g~valigetta! +[BJM1_2:BANKJ1] +~r~Dovevi far fuggire Cam, non farlo morire! -[NB2_1:NEDS2] -Questa è una trappola! +[BJM1_4:BANKJ1] +È armato! Uccidetelo! -[NB2_6:NEDS2] -Uccidi tutte le ~r~guardie! +{=================================== MISSION TABLE BANKJ2 ===================================} -[NB2_7:NEDS2] -Distruggi l'~r~elicottero! +[BJM2_A:BANKJ2] +Abbiamo bisogno di un tiratore. Ne conosci uno? -[NB2_5:NEDS2] -Elimina l'~r~elicottero~w~ e le ~r~guardie~w~, e recupera la ~g~valigetta. +[BJM2_B:BANKJ2] +Ehi Tommy, Tommy, Tommy, questa roba ti tiene in forma, amico. -{=================================== MISSION TABLE NEDS3 ===================================} +[BJM2_C:BANKJ2] +WoooOOOooo! -[NEDS3AA:NEDS3] -Mi perdoni, padre, perché ho peccato... +[BJM2_D:BANKJ2] +Potrei essere io il tuo tiratore! Spara! Spara! -[NEDS3AB:NEDS3] -Toni, figliolo, in confronto ai degenerati di questa città, tu sei un santo! +[BJM2_E:BANKJ2] +Non sei un tiratore, sei un idiota. -[NEDS3AC:NEDS3] -Le loro macchine scaricano le scoregge del diavolo nei polmoni dei nostri bambini! Stanno insozzando il paradiso! +[BJM2_F:BANKJ2] +Fatti un drink e sta zitto. -[NEDS3AD:NEDS3] -Va', mostra a questi peccatori il loro errore! +[BJM2_G:BANKJ2] +Ehi, via dai miei piedi! Ye ye ye ow ow. -[NEDS3_1:NEDS3] -Guida l'autopompa in giro per la città e scatena il caos, tamponando le auto e provocando incidenti. +[BJM2_H:BANKJ2] +Cam, cosa mi dici? -[NEDS3_2:NEDS3] -~w~Ruba l'~b~autopompa. +[BJM2_I:BANKJ2] +Beh, il miglior tiratore in città è un tipo chiamato Cassidy. -[NEDS3_3:NEDS3] -~w~Hai ~1~ secondi per tornare all'~b~autopompa. +[BJM2_J:BANKJ2] +Davvero? -[NEDS3_4:NEDS3] -Valutazione +[BJM2_K:BANKJ2] +Sì. Un militare, o per lo meno crede di esserlo. -[NEDS3_5:NEDS3] -Adesso scatena il caos, provoca il maggior numero possibile di incidenti e collisioni! +[BJM2_L:BANKJ2] +Non credo sia mai stato nell'esercito, ma sicuramente sa come tenere in mano un'arma. -[NEDS3_6:NEDS3] -Pedone investito! +[BJM2_M:BANKJ2] +Lo troverai di sicuro al poligono di tiro. -[NEDS3_7:NEDS3] -Veicolo affondato! +[BJM2_2A:BANKJ2] +Sei Phil Cassidy? -[NEDS3_8:NEDS3] -Veicolo distrutto! +[BJM2_2B:BANKJ2] +Perché? -[NEDS3_9:NEDS3] -Veicolo capottato! +[BJM2_2C:BANKJ2] +Sto cercando un uomo che sappia come sparare. Da quello che vedo, non sono molto convinto... -[NEDS310:NEDS3] -~r~L'autopompa è stata distrutta. +[BJM2_2D:BANKJ2] +Figliolo, potrei colpire una mosca sulla tua testa a 30 metri di distanza. -[NEDS311:NEDS3] -Rotazione di 360°! +[BJM2_2E:BANKJ2] +Davvero? -[NEDS312:NEDS3] -Rotazione di 720°! +[BJM2_2F:BANKJ2] +Certo. Ho fatto pratica nell'esercito. -[NEDS313:NEDS3] -Rotazione di 1080°! +[BJM2_2G:BANKJ2] +Lo sparo alla mosca è così popolare nell'esercito? Per fortuna non pago le tasse. -[NEDS314:NEDS3] -~r~Hai abbandonato l'autopompa. +[BJM2_2H:BANKJ2] +Stai cercando di fare lo spiritoso? -[NEDS315:NEDS3] -Veicolo ribaltato! +[BJM2_2I:BANKJ2] +Ah ah ah ah ah! -[NEDS316:NEDS3] -Tre incidenti consecutivi! +[BJM2_2J:BANKJ2] +Spariamo. -[NEDS317:NEDS3] -Quattro incidenti consecutivi! +[BJM2_1:BANKJ2] +~g~Raggiungi Ammu-Nation in Downtown e parla con Phil Cassidy. -[NEDS318:NEDS3] -Cinque incidenti consecutivi! +[BJM2_4:BANKJ2] +PUNTEGGIO PRIMO TURNO: ~1~ -[NEDS319:NEDS3] -Bonus tamponamento estremo! +[BJM2_6:BANKJ2] +PUNTEGGIO SECONDO TURNO: ~1~ -[NEDS320:NEDS3] -~r~Non hai ottenuto una valutazione sufficiente in tempo. +[BJM2_7:BANKJ2] +PUNTEGGIO TOTALE: ~1~ -[NEDS321:NEDS3] -Bonus disarcionamento! +[BJM2_9:BANKJ2] +~G~Raggiungi il punto di partenza del secondo turno. -[NEDS322:NEDS3] -Bonus disarcionamento e morte! +[BJM2_11:BANKJ2] +~r~Phil è morto! -[NEDS323:NEDS3] -Bonus volo! +[BJM2_12:BANKJ2] +~r~Uno dei tiratori è morto! -[NEDS324:NEDS3] -Bonus volo estremo! +[BJM2_14:BANKJ2] +~g~Raggiungi la prossima area! -[NEDS325:NEDS3] -~w~Hai 0 secondi per tornare all'~b~autopompa. +[BJM2_17:BANKJ2] +~g~Vai a parlare con Phil. -[NEDS326:NEDS3] -Congratulazioni! Ce l'hai fatta risparmiando ~1~ secondi. +[BJM2_24:BANKJ2] +~g~Il bersaglio più vicino vale un punto. -[NEDS327:NEDS3] -~w~Ora distruggi l'~r~autopompa.~w~ Non lasciare nessuna prova. +[BJM2_25:BANKJ2] +~g~Il bersaglio centrale vale due punti. -[NEDS328:NEDS3] -I punti bonus si conquistano causando incidenti spettacolari, oppure ribaltando, capottando o distruggendo altri veicoli. +[BJM2_27:BANKJ2] +~g~In questo turno, tutti i bersagli valgono un punto. -[NEDS329:NEDS3] -Veicolo capottato x ~1~ +[BNK2_4:BANKJ2] +Hoooeee! -[NEDS330:NEDS3] -Veicolo ribaltato x ~1~ +[BNK2_5:BANKJ2] +Non riusciresti a colpire neanche un elefante! -[NEDS332:NEDS3] -~w~Hai 1 secondo per tornare all'~b~autopompa. +[BNK2_7:BANKJ2] +Fammi un favore, aiutami a mettere a segno un colpo. -[NEDS333:NEDS3] -Congratulazioni! NUOVO MIGLIOR TEMPO con ~1~ secondi rimasti. +[BNK2_8:BANKJ2] +Figliolo, da come hai sparato, se mi chiedessi di sposarti direi di sì. -[NEDS334:NEDS3] -~w~Ora distruggi l'autopompa. Non lasciare nessuna prova. +[BNK2_9A:BANKJ2] +Figliolo, ficcati la tua parlata e le tue grandi idee là dove non batte il sole. Non sai sparare per niente. -[NEDS335:NEDS3] -Rotazione di 180°! +[BNK2_9B:BANKJ2] +Non sai sparare per niente. -[NEDS337:NEDS3] -Guida l'autopompa in giro per la città e scatena il caos, tamponando le auto e provocando incidenti prima delle ~1~:~1~. +[BJM2_28:BANKJ2] +PUNTEGGIO TERZO TURNO: ~1~ -[NEDS338:NEDS3] -Guida l'autopompa in giro per la città e scatena il caos, tamponando le auto e provocando incidenti prima delle ~1~:0~1~. +[BJM2_26:BANKJ2] +~g~Il bersaglio più lontano vale tre punti. -[NEDS339:NEDS3] -Guida l'autopompa in giro per la città e scatena il caos, tamponando le auto e provocando incidenti prima delle 0~1~:~1~. +[BNK2_1:BANKJ2] +MUNIZIONI VERE -[NEDS340:NEDS3] -Guida l'autopompa in giro per la città e scatena il caos, tamponando le auto e provocando incidenti prima delle 0~1~:0~1~. +[RANGE_1:BANKJ2] +PUNTEGGIO PER COLPO: ~1~ -[NEDS341:NEDS3] -Causa il maggior numero di tamponamenti e incidenti prima delle ~1~:~1~. +[BJM2_2:BANKJ2] +~g~Per interrompere il turno, premi il ~h~~k~~PED_JUMPING~~g~. -[NEDS342:NEDS3] -Causa il maggior numero di tamponamenti e incidenti prima delle ~1~:0~1~. +[BJM2_N:BANKJ2] +Rilassati. -[NEDS343:NEDS3] -Causa il maggior numero di tamponamenti e incidenti prima delle 0~1~:~1~. +{=================================== MISSION TABLE BANKJ3 ===================================} -[NEDS344:NEDS3] -Causa il maggior numero di tamponamenti e incidenti prima delle 0~1~:0~1~. +[BJM3_A:BANKJ3] +Le cose stanno iniziando a prendere forma. -[NEDS331:NEDS3] -Causa il maggior numero di tamponamenti e incidenti! +[BJM3_B:BANKJ3] +Qual è il piano Tommy? Que pasa, amigo? -{=================================== MISSION TABLE NEDS4 ===================================} +[BJM3_C:BANKJ3] +La tua parte consiste nel continuare a fare l'idiota. Comunque, adesso abbiamo bisogno di un pilota. -[NEDS4_1:NEDS4] -NONE +[BJM3_D:BANKJ3] +Tommy, lo farò io. Io so guidare bene. -[NEDS4_2:NEDS4] -~w~Le tre celebrità si stanno dirigendo verso una stazione radio del centro per un'intervista per la prima di stasera. +[BJM3_E:BANKJ3] +Ti serve Hilary, capo. Di certo non un sapientone avvocato del cazzo. -[NEDS4_3:NEDS4] -~w~L'attrice Faith W sta arrivando con il suo elicottero privato dall'aeroporto Francis. +[BJM3_F:BANKJ3] +Hilary è la persona giusta. Non troverai nessuno capace di guidare così veloce. Gli posso fare una chiamata. -[NEDS4_4:NEDS4] -~w~Il gangster diventato attore, DB-P, arriverà in barca da Portland. +[BJM3_G:BANKJ3] +Ehi Hil, sono Phil. Come butta? No, lascia stare, ne parliamo un'altra volta. Mi faresti un favore? -[NEDS4_5:NEDS4] -~w~Il vecchio attore alcolizzato Black Lightman uscirà dal centro di riabilitazione e arriverà in limousine. +[BJM3_H:BANKJ3] +Ho qui un tipo del nord... No, no, non credo abbia fatto il servizio militare, ma ha bisogno di un guidatore. -[NEDS4_8:NEDS4] -~w~Faith è morta. +[BJM3_I:BANKJ3] +Per un po' di azione. OK, capisco. -[NEDS4_9:NEDS4] -~w~DB-P è morto. +[BJM3_J:BANKJ3] +Che cosa ha detto? -[NEDS410:NEDS4] -~w~Black Lightman è morto. +[BJM3_K:BANKJ3] +Beh, ci sta, nessun problema. Beh, un piccolo problema c'è: ha subito uno shock da abbandono. -[NEDS411:NEDS4] -~w~Hai eliminato le tre celebrità. Torna alla ~y~chiesa~w~ e dillo al padre. +[BJM3_L:BANKJ3] +Sembra non voglia lavorare con nessuno che non sia capace di batterlo. Qualcosa che ha a che fare con la sua vecchia. -[NEDS412:NEDS4] -~r~Faith è arrivata alla radio! +[BJM3_M:BANKJ3] +Comunque, vuole prima sfidarti in una corsa, ha detto che ci aspettava fuori... -[NEDS413:NEDS4] -~r~DB-P è arrivato alla radio! +[BJM3_2A:BANKJ3] +Sei Tommy? Beh, certo che sei Tommy, cioè... -[NEDS414:NEDS4] -~r~Black Lightman è arrivato alla radio! +[BJM3_2B:BANKJ3] +Per quale altro motivo qualcuno vorrebbe parlare con me? -[NEDS415:NEDS4] -~w~Salirà su una patriot antiproiettile. +[BJM3_2C:BANKJ3] +OK, vedila in questo modo... -[NEDS417:NEDS4] -~w~La patriot è antiproiettile. +[BJM3_2D:BANKJ3] +Io guiderò SE, e solo SE, tu sai guidare come si deve. -[NEDS418:NEDS4] -~w~Attenzione alla guardia del corpo. +[BJM3_2E:BANKJ3] +Lasciami solo... e non te lo perdonerò mai. -[NEDS421:NEDS4] -~w~Il negozio d'armi di Phil Cassidy è indicato da una bandiera sul radar. +[BJM3_2:BANKJ3] +~r~Hilary è morto! -[NEDS4AA:NEDS4] -Mi perdoni padre, perché ho peccato... di nuovo. +[BJM3_4:BANKJ3] +~g~Hai bisogno di una vettura per partecipare! -[NEDS4AB:NEDS4] -E ancora una volta verrai perdonato, figliolo. +[BNK3_1:BANKJ3] +OK. Guiderò per te, ma per favore trattami male! -[NEDS4AC:NEDS4] -Il culto della celebrità è andato troppo oltre! +[BNK3_3A:BANKJ3] +Corsa illegale in corso presso Vice Point. -[NEDS4AD:NEDS4] -Che genere di donnaccia può concedere un'intervista a una radio negando l'esclusiva a un volenteroso redattore? +[BNK3_3B:BANKJ3] +A tutte le pattuglie. -[NEDS4AF:NEDS4] -Distruggi questi falsi idoli! +[BNK3_3C:BANKJ3] +Queste corse sono illegali e vietate! -[NEDS4BA:NEDS4] -Ho fatto quello che mi ha chiesto, padre. +{=================================== MISSION TABLE BANKJ4 ===================================} -[NEDS4BB:NEDS4] -Bene, le vendite del giornale hanno triplicato da quando hai trovato la via. +[BNK4_A:BANKJ4] +~w~Come potete vedere, signori, questi saranno i soldi più facili della storia. -[NEDS4BC:NEDS4] +[BNK4_B:BANKJ4] +~w~Tommy, seriamente, dovresti pensare di fare l'avvocato. + +[BNK4_C:BANKJ4] +~w~Ma che cosa ti fumi, amico? Non è per niente un piano semplice! + +[BNK4_D:BANKJ4] +~w~Beh, chi ha bisogno di un piano semplice? + +[BNK4_E:BANKJ4] +~w~Prendi il comunismo, beh, quello era un piano semplice. Non ha fatto così bene alla Russia, no? + +[BNK4_F:BANKJ4] +~w~Rilassatevi, OK? Con una squadra come la nostra, non ci saranno problemi. + +[BNK4_G:BANKJ4] +~w~Abbiamo Cam per la cassaforte. Phil? Noi ci occuperemo della sorveglianza, mentre Hilary guiderà l'auto per la fuga. + +[BNK4_H:BANKJ4] +~w~Uh, eh eh, non ti stai dimenticando qualcuno? Qualcuno che ti ha costantemente aiutato in questa città? Qualcuno...? + +[BNK4_I:BANKJ4] +~w~Ken... Ken, ma certo. Il nostro Ken si occuperà di lavare il denaro sporco e di tenere le birre al fresco. + +[BNK4_J:BANKJ4] +~w~Non ho ancora capito cosa ci sto a fare io qua. + +[BNK4_K:BANKJ4] +~w~Beh, è semplice: non hai mai visto un film d'azione? + +[BNK4_L:BANKJ4] +~w~Entriamo nella banca, sventoliamo in giro l'arma e usciamo molto ricchi. + +[P_DEAD:BANKJ4] +~r~Phil è morto! + +[C_DEAD:BANKJ4] +~r~Cam è morto! + +[H_DEAD:BANKJ4] +~r~Hilary è morto! + +[P_HIND:BANKJ4] +~r~Hai perso Phil! + +[C_HIND:BANKJ4] +~r~Cam è restato indietro! + +[H_HIND:BANKJ4] +~r~Hai abbandonato Hilary! + +[GETCAR:BANKJ4] +~g~Entra nell'auto e preparati alla rapina! + +[TRASHED:BANKJ4] +~r~HAI DISTRUTTO L'AUTO PER LA FUGA!!! + +[BNK4_1:BANKJ4] +Guido io. + +[BNK4_2:BANKJ4] +Ottimo. Un passeggero. Aspetta che lo dica al resto del gruppo. + +[BNK4_3A:BANKJ4] +Ehi, fai attenzione alla macchina, Tommy! + +[BNK4_3B:BANKJ4] +Tommy, Hilary occupa troppo spazio! + +[BNK4_3C:BANKJ4] +Non è vero! + +[BNK4_3D:BANKJ4] +Invece sì! + +[BNK4_3E:BANKJ4] +Ehi, state entrambi zitti o ve ne andate a piedi. + +[BNK4_3F:BANKJ4] +Sì Hilary. + +[BNK4_3I:BANKJ4] +Perdio, Phil, smettila di sventolare quell'affare in giro! + +[BNK4_3J:BANKJ4] +Sì, finirai col cavare un occhio a qualcuno! + +[BNK4_3M:BANKJ4] +La mia bambina! È a pezzi! + +[BNK4_3O:BANKJ4] +Sei accecato dall'illusione di permanenza. + +[BNK4_3P:BANKJ4] Cosa? -[NEDS4BD:NEDS4] -Grazie ancora per il tuo aiuto, Toni! +[BNK4_3Q:BANKJ4] +Pensi che tutto duri per sempre. -[NEDS4BE:NEDS4] -Ehi, ma che cazzo? +[BNK4_3R:BANKJ4] +La giovinezza, le persone care, la pizza... -[NEDS4BF:NEDS4] -CHI DIAVOLO SEI? +[BNK4_3S:BANKJ4] +Ma tutto passa e finisce e tu lo devi accettare. -[NEDS422:NEDS4] -Recupera un lanciarazzi dal negozio d'armi di Phil Cassidy. +[BNK4_3T:BANKJ4] +Ehi, hai ragione. Grazie Cam. -[NEDS4_7:NEDS4] -~w~Non permettere a nessuna delle ~r~celebrità~w~ di raggiungere la radio LCFR! +[BNK4_3U:BANKJ4] +È un piacere. -[NEDS416:NEDS4] -~w~Non permettere a nessuna delle ~r~celebrità~w~ di raggiungere la radio LCFR! +[BNK4_3V:BANKJ4] +Ehi Tommy, perché ci siamo fermati? -[NEDS419:NEDS4] -~w~Troverai dell'armamento pesante al negozio d'armi di Phil Cassidy. +[BNK4_4A:BANKJ4] +~w~Hilary, continua a guidare attorno al quartiere. -[NEDS420:NEDS4] -~w~Padre Ned ha comprato un lanciarazzi. Recuperalo al negozio d'armi di Phil Cassidy. +[BNK4_5:BANKJ4] +~w~OK Tommy, OK. -[NEDS4_6:NEDS4] -~w~Se hai bisogno di armi, vai al negozio di Phil Cassidy. +[BNK4_6:BANKJ4] +~w~QUESTA È UNA RAPINA! -{=================================== MISSION TABLE DONS1 ===================================} +[BNK4_7:BANKJ4] +~w~NESSUNO SI MUOVA! -[MORG_01:DONS1] -2-2-3, 3-2-3, 4-2-3, 5-2-3-... +[BNK4_8:BANKJ4] +~w~TUTTI CONTRO QUEL MURO! -[MORG_02:DONS1] -Antonio! Che piacere vederti! +[BNK4_9:BANKJ4] +Phil, mantieni il controllo! -[MORG_03:DONS1] -Cosa sta succedendo? +[BNK4_10:BANKJ4] +Ricevuto capo! -[MORG_04:DONS1] -Ci stiamo preparando per un festa, ragazzo mio. +[BNK4_11:BANKJ4] +Vieni Cam, la cassaforte è di sopra... -[MORG_05:DONS1] -Sì, una festa cadaverica! +[BK4_12A:BANKJ4] +Maledizione! È una Flange 9000! -[MORG_08:DONS1] -Che cazzo stai dicendo, una festa cadaverica? +[BK4_12B:BANKJ4] +Potrei impiegare ore ad aprirla, -[MORG_09:DONS1] -Stasera ci divertiremo. +[BK4_12C:BANKJ4] +o cinque minuti se trovi l'amministratore. -[MORG_10:DONS1] -Ma prima, dobbiamo andare a prendere gli ospiti... +[BNK4_13:BANKJ4] +Vado a scoprire dove si è rintanato. -[MORG_11:DONS1] -Andiamo, prima che i nostri invitati si annoino a morte. +[BK4_14A:BANKJ4] +Phil, va tutto bene? -[MORG_12:DONS1] -Scusa il gioco di parole! +[BNK4_15:BANKJ4] +Certo. Tutto liscio come l'olio. -[MORG_13:DONS1] -Perché sono morti, sai... +[BNK4_16:BANKJ4] +Tu, tu vieni con me! -[MORG_14:DONS1] -Il nostro ospite d'onore sta per fare un salto ai laboratori di patologia. +[BNK4_17:BANKJ4] +OK, OK! Ti prego, non sparare! -[MORG_15:DONS1] -Non facciamolo aspettare. +[BNK4_18:BANKJ4] +HO DETTO NESSUNO SI MUOVA! -[MORG_06:DONS1] -- La prima della stagione! ~n~ - Woah, woah, woah, woah... +[BK4_19A:BANKJ4] +L'apertura è temporizzata, -[DONS1_1:DONS1] -Nessuno +[BK4_19B:BANKJ4] +potete anche rinunciarci! -[DL1_A:DONS1] -Voglio dare una festa cadaverica e ho bisogno che recuperi gli 'ospiti'. +[BK4_20A:BANKJ4] +Diamine, posso aggirare l'apertura a tempo, -[DL1_2:DONS1] -~r~Hai distrutto la macchina. +[BK4_20B:BANKJ4] +ma poi avremo bisogno del tuo codice per spalancarla! -[DL1_3:DONS1] -I poliziotti sono stati allertati, perdi il tuo livello di sospetto! +[BNK4_21:BANKJ4] +Sta qua. Se fai uno scherzo diventi cibo per pesci. Chiaro? -[DL1_4:DONS1] -Porta la macchina al ~y~garage di Donald. +[BK4_24A:BANKJ4] +Vado a controllare Phil, torno subito. -[DL1_6:DONS1] -~r~Il carro funebre ha raggiunto la stazione di polizia. +[BK4_24B:BANKJ4] +Te l'avevo detto di non toccare l'allarme! -[DL1_9:DONS1] -Porta la macchina al negozio di riverniciatura. +[BNK4_25:BANKJ4] +La squadra SWAT sarà qui fra pochi minuti! -[DL1_5:DONS1] -Ruba il ~b~carro funebre~w~ prima che giunga a destinazione. +[BNK4_27:BANKJ4] +Un po' di aiuto non farebbe male, Tommy. -{=================================== MISSION TABLE DONS2 ===================================} +[BNK4_28:BANKJ4] +SWAT di Vice City! Siete completamente circondati! -[DONS2AA:DONS2] -DL? +[BNK4_29:BANKJ4] +Circondati? AH AH AH Aaaaaaaaaah! -[DONS2AB:DONS2] -Toni! +[BNK4_30:BANKJ4] +Si stanno cagando addosso, corrotti bastardi! -[DONS2AC:DONS2] -Come va la campagna elettorale? +[BK4_31A:BANKJ4] +Tommy! La cassaforte è aperta! -[DONS2AD:DONS2] -È una lotta serrata e ogni singolo voto farà la differenza! +[BK4_34A:BANKJ4] +OK, abbiamo i fondi pensione della SWAT. Andiamocene da qui! -[DONS2AE:DONS2] -I sostenitori di O'Donovan stanno lavorando sodo sui seggi periferici. +[BK4_34B:BANKJ4] +OK, l'avete voluto voi! Il tempo è scaduto! -[DONS2AF:DONS2] -Bene, ecco il nostro veicolo propagandistico: vai e diffondi il verbo! +[BK4_35A:BANKJ4] +Stanno assalendo l'edificio! -[DONS2BA:DONS2] -Vota O'Donovan come sindaco! +[BK4_35B:BANKJ4] +Al riparo! -[DONS2BB:DONS2] -Vota O'Donovan per stroncare la corruzione! +[BNK4_36:BANKJ4] +Dov'è Cam? -[DONS2BC:DONS2] -Riponi la tua fiducia nel sindaco O'Donovan! +[BNK4_37:BANKJ4] +Non ce l'ha fatta... -[DONS2BD:DONS2] -La fine della criminalità! Vota O'Donovan! +[BNK4_38:BANKJ4] +Questo è l'ultimo. VIA! VIA! VIA! -[DONS2BE:DONS2] -Vota per la giustizia! Vota O'Donovan! +[BNK_39:BANKJ4] +Merda! Dov'è Hilary? -[DONS2CA:DONS2] -O'Donovan ha tre mogli! +[BK4_40A:BANKJ4] +Gliela do io l'illusione di permanenza! -[DONS2CB:DONS2] -Chi ha mangiato la marmellata? O'Donovan! +[BNK4_42:BANKJ4] +Ehi, ragazzi! Entrate, vi copro io! -[DONS2CC:DONS2] -O'Donovan è un tossico! +[BNK4_44:BANKJ4] +Ce l'abbiamo fatta! Siamo ricchi, RICCHI! -[DONS2CD:DONS2] -O'Donovan crede nella sodomia coercitiva! +[BNK4_45:BANKJ4] +Peccato che Cam non ce l'ha fatta, era un bravo ragazzo! -[DONS2CE:DONS2] -O'Donovan è un comunista! +[BNK4_46:BANKJ4] +Sì, comunque... ora ce n'è più per noi! -[DONS2CF:DONS2] -O'Donovan indossa l'intimo di sua figlia! +[BNK4_47:BANKJ4] +Maledettamente vero! YEEEEHAAAH! -[DONS2CG:DONS2] -O'Donovan gode nudo tra i maiali! +[BNK4_48:BANKJ4] +Tommy, vuoi un massaggio? -[DONS2CH:DONS2] -O'Donovan odia l'America! +[BNK4_49:BANKJ4] +Ciao Mercedes! Sì, effettivamente sono un po' teso... -[DONS2CI:DONS2] -Love non tasserà i benestanti! +[BNK450A:BANKJ4] +Sai cosa ti dico Tommy? Sai cosa ti dico? I membri corrotti della SWAT faranno meglio a fare attenzione finché Kent Paul è in città. -[DONS2CJ:DONS2] -Vota Love per corsi di patologia nelle scuole! +[BNK450B:BANKJ4] +Eddai, dammene una fetta più grande! Amico, dai! Mi devo comprare dei vestiti nuovi! -[DONS2CK:DONS2] -Donald Love: un posto all'obitorio per tutti! +[BNK4_94:BANKJ4] +~w~OK, ragazzi. Procediamo come pianificato. -[DONS2CL:DONS2] -Donald Love è un eroe di guerra! +[BM_DEAD:BANKJ4] +~r~Hai bisogno dell'amministratore vivo! -[DONS2CM:DONS2] -Un voto per Love è un voto per la vostra felicità! +[ASSET_A:BANKJ4] +RAPINA ALLA BANCA COMPLETATA! -[DONS2CN:DONS2] -Donald Love: duro con i vegetariani! +[ASSET_B:BANKJ4] +~g~Il Malibu d'ora in poi genererà introiti per un massimo di ~1~$. Ricordati di recuperarli regolarmente. -[DONS2_1:DONS2] -~w~Sali sul ~b~furgone. +[IDIOT:BANKJ4] +~r~Vai in giro vestito come un pazzo e attiri l'attenzione! Sei un IDIOTA! -[DONS2_3:DONS2] -~w~O'Donovan ha mandato fuori i suoi ~r~furgoni~w~ per riprendersi i voti! +{=================================== MISSION TABLE BARON1 ===================================} -[DONS2_4:DONS2] -~r~Non sei riuscito a conquistare abbastanza voti! +[COK1_A:BARON1] +Forza, dai, forza! Yeh yeh aaaah... -[DONS2_6:DONS2] -~w~Tempo rimasto +[COK1_B:BARON1] +Stupido cavallo! Ti taglierò la testa! -[DONS2_7:DONS2] -~w~Torna sul ~b~furgone~w~ e continua la missione. +[COK1_C:BARON1] +Chi è questo stronzo? -[DONS2_9:DONS2] -~w~O'Donovan ha mandato fuori un altro ~r~furgone~w~! +[COK1_D:BARON1] +Tommy Vercetti, ti ricorderai di me. -[DONS210:DONS2] -~w~Zone +[COK1_E:BARON1] +Scusami, sono un po' ansioso. Mai fidarsi di un fottuto cavallo! -[DONS211:DONS2] -~r~Hai perso tutte le aree di votazione! +[COK1_F:BARON1] +Hai fatto un bel lavoro: adesso lavori per me. -[DONS212:DONS2] -~r~Non sei riuscito a eliminare l'opposizione! +[COK1_H:BARON1] +Come ti ho detto, amigo, lavori per me. Adesso sta zitto. Un qualche giuda mi ha tradito. -[DONS2_2:DONS2] -~w~Guida nei ~y~checkpoint delle aree di votazione~w~ per conquistare il loro voto. +[COK1_I:BARON1] +Pensava non sapessi quanti soldi stessi facendo, ma rubarmi il 3% è come rubarmi il 100%. -[DONS215:DONS2] -~w~Hai ceduto un'~y~area~w~ a O'Donovan! +[COK1_J:BARON1] +Nessuno fa questo a me. NESSUNO!!! -[DONS216:DONS2] -~w~Non permettere che O'Donovan riconquisti tutte le ~y~aree~w~! +[COK1_K:BARON1] +Seguilo nel suo appartamento e scopri dove va! Successivamente, lo elimineremo noi. -[DONS213:DONS2] -~w~Adesso che controlli abbastanza aree, elimina i ~r~furgoni dell'opposizione~w~ per impedire a O'Donovan di conquistarne altre. +[COK1_1:BARON1] +Ommerda! -[DONS2_8:DONS2] -~w~Conquista almeno 5 delle ~y~aree di votazione. +[COK1_2:BARON1] +Troppo lento, nonnino! -[DONS214:DONS2] -~w~Controlli meno di 5 ~y~aree~w~: riconquistale! +[COK1_4:BARON1] +Perdente. -[DONS217:DONS2] -~w~Conquista altre aree per aumentare il bonus di completamento. +[COK1_5:BARON1] +Ti conviene continuare a correre, stronzo! -[DONS2_5:DONS2] -~r~Il furgone elettorale è stato distrutto. +[COK1_8:BARON1] +~g~Svelto! Recupera un mezzo e inseguilo! -[DONS218:DONS2] -~w~Conquista almeno 5 ~y~aree di votazione~w~ prima delle ~1~:~1~. +[COK1_9:BARON1] +~r~Dovevi inseguirlo, non ucciderlo! -[DONS219:DONS2] -~w~Conquista almeno 5 ~y~aree di votazione~w~ prima delle 0~1~:~1~. +[COK1_10:BARON1] +~r~Entra nella casa del ladro e scopri dove ha nascosto il denaro. -[DONS220:DONS2] -~w~Conquista almeno 5 ~y~aree di votazione~w~ prima delle 0~1~:0~1~. +[COK1_11:BARON1] +~g~Dai un'occhiata da questa finestra. -[DONS221:DONS2] -~w~Conquista almeno 5 ~y~aree di votazione~w~ prima delle ~1~:0~1~. +[COK1_7:BARON1] +~g~È scappato sul tetto: stagli dietro ma non ucciderlo! -[DONS230:DONS2] -~w~Adesso che controlli abbastanza aree, elimina il ~r~furgone dell'opposizione~w~ per impedire a O'Donovan di conquistarne altre. +[COK1_G:BARON1] +Lavoro per soldi. -{=================================== MISSION TABLE DONS3 ===================================} +{=================================== MISSION TABLE BARON2 ===================================} -[CAMP_01:DONS3] -Antonio! Que pasa, amigo? +[COK2_A:BARON2] +Ma che fottuti incompetenti non siete? -[CAMP_02:DONS3] -Sai che sono italiano e non spagnolo, vero? +[COK2_B:BARON2] +IDIOTI! IDIOTI! IDIOTI! IDIOTI! -[CAMP_03:DONS3] -Ma certo, che stupido! È che adoro tutte le lingue romanze... +[COK2_C:BARON2] +Tommy, -[CAMP_04:DONS3] -Oddio che buono. +[COK2_D:BARON2] +questi idioti... cercano sempre di fregarti. -[CAMP_05:DONS3] -Sa di pollo, ma è, come dire... più intelligente. +[COK2_E:BARON2] +È questo il problema in questo business. -[CAMP_06:DONS3] +[COK2_F:BARON2] +Che cosa credi di fare? Aaaaah! + +[COK2_G:BARON2] +Questi stronzi hanno fallito miseramente. + +[COK2_H:BARON2] +Ben presto anche i papà e le mamme penseranno di poter spacciare coca in Vice City. + +[COK2_I:BARON2] +Chi sarà il prossimo adesso? La fottuta mafia? + +[COK2_J:BARON2] +La base della loro banda è una fortezza al piano terra, + +[COK2_K:BARON2] +per cui Quentin... Quentin! QUENTIN! + +[COK2_L:BARON2] +Lui ti porterà in volo sull'area! + +[COK2_M:BARON2] +Sradicateli! + +[COK2_N:BARON2] +Che cosa credi di fare? + +[COK2_O:BARON2] +Che cosa fai qua? + +[COK2_P:BARON2] +Ehi, ho chiesto in giro ed è ovvio + +[COK2_Q:BARON2] +che Diaz ha fatto saltare l'accordo e ha freddato mio fratello. + +[COK2_R:BARON2] +E ucciderà anche te! + +[COK2_S:BARON2] +Io posso far fuori Diaz! + +[COK2_T:BARON2] +No, ascoltami! Io mi occuperò di Diaz: + +[COK2_U:BARON2] +sta cominciando a fidarsi di me. + +[COK2_1:BARON2] +Ho una domanda, però: perché 'Quentin'? + +[COK2_2:BARON2] +Non lo so, mi è sempre piaciuto... Quentin Vance... + +[COK2_3:BARON2] +Vance? Tu sei Lance Vance? + +[COK2_4:BARON2] +Ehi, ne ho avuto abbastanza a scuola! + +[COK2_5:BARON2] +Hai mai provato a sparare con quelli da un elicottero? + +[COK2_8:BARON2] +Dove ci stiamo dirigendo? + +[COK2_9:BARON2] +Prawn Island. + +[COK2_13:BARON2] +Lance Vance. Brutto bastardo. + +[COK2_14:BARON2] +OK, siamo quasi arrivati. + +[COK2_15:BARON2] +Faremo un paio di passaggi. + +[COK2_16:BARON2] +Cerca di colpire il maggior numero di nemici possibile. + +[COK2_17:BARON2] +Poi ti scarico e dovrai cavartela da solo. + +[COK2_20:BARON2] +Merda! Siamo in una zona di guerra! Abbatti un po' di gente! + +[COK2_21:BARON2] +Stiamo sotto tiro, amico! + +[COK2_22:BARON2] +Questo affare è maledettamente costoso da riparare! Falli fuori! + +[COK2_23:BARON2] +OK, adesso dovrai cavartela da solo... Buona fortuna, fratello! + +[COK2_24:BARON2] +Condizioni elicottero: + +[COK2_25:BARON2] +~g~Recupera i soldi sul tetto. + +[COK2_27:BARON2] +Sei nel MIO territorio, stronzo! + +[COK2_28:BARON2] +Stai per affondare! + +[COK2_6:BARON2] +No. Farò un po' di pratica lungo la strada. + +[OPEN_B:BARON2] +Il blocco stradale per la terraferma è stato rimosso. + +[COK2_V:BARON2] +sta cominciando a fidarsi di me. + +{=================================== MISSION TABLE BARON3 ===================================} + +[COK3_A:BARON3] +Scommetto che adesso non vi divertite più! + +[COK3_B:BARON3] +Ah ah ah ah! + +[COK3_C:BARON3] +Woh! Fai attenzione a dove punti quel coso. + +[COK3_D:BARON3] +Basta con merda di piccione sulla MIA macchina, vero Tommy? + +[COK3_E:BARON3] +Direi di sì. + +[COK3_F:BARON3] +Hai proprio ragione. Adesso ascolta: + +[COK3_G:BARON3] +sai chi possiede la barca più veloce della costa est? + +[COK3_H:BARON3] +Non così su due piedi. + +[COK3_I:BARON3] +IO. E voglio che la situazione non cambi. + +[COK3_J:BARON3] +Ogni contrabbandiere da qui a Caracas ha un solo sogno: un'imbarcazione più veloce. + +[COK3_K:BARON3] +Si mormora che il cantiere Hull-o-Caust ha appena finito di costruirne una + +[COK3_L:BARON3] +per una testa di cazzo del Costa Rica. + +[COK3_M:BARON3] +E Tommy... IO VOGLIO QUELLA BARCA!!! + +[COK3_N:BARON3] +Credo che siano tornati i tuoi piccioni. + +[COK3_O:BARON3] +Ah! Pensavo di averti preso. Da dove salti fuori? + +[COK3_P:BARON3] +Piccioni! Boom! Ah ah ah! + +[COK3_5:BARON3] +~g~Trova l'interruttore per abbassare l'imbarcazione. + +[COK3_6:BARON3] +~g~Porta la barca alla villa di Diaz. + +[COK3_7:BARON3] +~r~Hai distrutto la barca! + +[COK3_8:BARON3] +~g~Raggiungi il cantiere al porto e ruba la barca più veloce. + +[COK3_9:BARON3] +~g~Adesso entra nella barca. + +{=================================== MISSION TABLE BARON4 ===================================} + +[COK4_A:BARON4] +Sputa fuori! CATORCIO DI PLASTICA! + +[COK4_B:BARON4] +Come osi farmi questo? + +[COK4_C:BARON4] +Chi credi di essere, brutto pezzo di merdosa plastica! Aaarrgh! + +[COK4_D:BARON4] +VAFFANCULO! + +[COK4_E:BARON4] +Se hai distrutto il mio film favorito di El Burro ti spacco! + +[COK4_F:BARON4] +Che altro posso fare? + +[COK4_G:BARON4] +Forse non è collegato... + +[COK4_H:BARON4] +Cosa? + +[COK4_I:BARON4] +Merda... non importa, ne posso comprare a centinaia. + +[COK4_J:BARON4] +Adesso Tommy, + +[COK4_K:BARON4] +ogni mese un freelance naviga fino a Vice City e ormeggia il suo yacht. + +[COK4_L:BARON4] +Vende il suo carico alla prima imbarcazione. + +[COK4_M:BARON4] +Voglio che tu prenda la barca più veloce, + +[COK4_N:BARON4] +batta tutti gli altri stronzi + +[COK4_O:BARON4] +e riporti qui il carico, OK? + +[COK4_P:BARON4] +Fammi indovinare, pensavi mi avrebbe fatto comodo un angelo custode? + +[COK4_Q:BARON4] +Vorrei solo che mi lasciassi venire, amico mio. + +[COK4_R:BARON4] +Puoi continuare con queste stronzate alla rambo, + +[COK4_S:BARON4] +ma sono sicuro che un giorno o l'altro ti salverò il culo. + +[COK4_T:BARON4] +e allora vorrai baciarmi! + +[COK4_U:BARON4] +Sei pazzo. + +[COK4_V:BARON4] +Ah ah ah! + +[COK4_1:BARON4] +Allora Tommy, sappiamo che è stato Diaz a far saltare il nostro affare... + +[COK4_3:BARON4] +Allora per quale motivo continuiamo a lavorare per lui? + +[COK4_4:BARON4] +Più cose scopriamo adesso, meno dovremo imparare quando ci impossesseremo di questa città! + +[COK4_5:BARON4] +Mi piace il tuo stile, amico. Molto fico. + +[COK4_12:BARON4] +Attento, stanno arrivando da tutte le parti! + +[COK4_13:BARON4] +Preso! Torniamo da Diaz il più velocemente possibile! + +[COK4_14:BARON4] Ne vuoi un po'? -[CAMP_07:DONS3] -Ho già mangiato, grazie.. +[COK4_15:BARON4] +Salutami i pesci! -[CAMP_08:DONS3] -Peccato, è fantastico. +[COK4_16:BARON4] +Prendi questo! E questo! -[CAMP_09:DONS3] -Ci sono altre prelibatezze in arrivo... +[COK4_19:BARON4] +Altri guai in arrivo! -[CAMP_10:DONS3] -i liberali si divertono con le scampagnate, +[COK4_20:BARON4] +Ci stanno sparando da quel molo! -[CAMP_11:DONS3] -ma non sanno nulla dei veri piaceri della vita! +[COK4_24:BARON4] +Bel colpo, amico. Sei un vero pazzo di prima classe. -[CAMP_12:DONS3] -Raffinatezza e democrazia sono due concetti che non vanno d'accordo. +[COK4_25:BARON4] +Beh, grazie. -[CAMP_13:DONS3] -Ascolta Don, dobbiamo vincere queste elezioni. +[COK4_26:BARON4] +Ci vediamo, Tommy. -[CAMP_14:DONS3] -Per cui dobbiamo essere sicuri di non avere scheletri nell'armadio, +[COK4_27:BARON4] +OK, Mr. Lance Vance Dance. -[CAMP_15:DONS3] -non so se hai capito... +[COK4_28:BARON4] +~g~Raggiungi lo yacht prima delle altre imbarcazioni! -[CAMP_16:DONS3] -Giusto. +[COK4_31:BARON4] +~g~Raggiungi la barca più veloce attraccata al molo! -[CAMP_17:DONS3] -Ciò che voglio dire è... +[COK4_32:BARON4] +~r~Troppo lento! -[CAMP_18:DONS3] -come ci liberiamo di questo O'Donovan, il rappresentante... +[COK4_33:BARON4] +~r~Hai distrutto la barca! -[CAMP_19:DONS3] -dei Forelli? +[COK4_34:BARON4] +~g~Affonda quelle imbarcazioni! -[CAMP_20:DONS3] -Il tizio può contare sul supporto di molta gente, +[COK4_35:BARON4] +Condizioni barca: -[CAMP_21:DONS3] -sai tutta quella gente 'delusa', se sai cosa intendo. +{=================================== MISSION TABLE BARON5 ===================================} -[CAMP_22:DONS3] -Credo che dovremo turbare la loro fede nella democrazia, non so se mi spiego. +[PROP_A:BARON5] +PROPRIETÀ ACQUISITA! -[CAMP_23:DONS3] -Vuoi dire che devo andare a gonfiarli di botte? +[COK4_30:BARON5] +~r~Lance è morto! -[CAMP_24:DONS3] -Oh, Antonio, la tua passione è... ammirevole! +[ASS1_A:BARON5] +Ho messo un po' di cannoni nel bagagliaio. -[CAMP_25:DONS3] -È così um... um...um... wagneriana! Hai presente? Arrivederci, amigo. +[ASS1_B:BARON5] +Accidenti! Dove hai trovato tutta questa roba? -[CAMP_26:DONS3] -Humphries, porta via gli avanzi! +[ASS1_C:BARON5] +La tenevo da parte per una giornata di pioggia. -[DONS3_1:DONS3] -Toni deve liberarsi dei sostenitori dell'opposizione per indebolire l'efficienza della campagna elettorale del candidato dei Forelli, O'Donovan. +[ASS1_D:BARON5] +Ti piace? -[DONS3_2:DONS3] -~w~Uccidi i ~r~sostenitori~w~ dell'opposizione. +[ASS1_E:BARON5] +Sì, mi piace. -[DONS3_3:DONS3] -~r~Tempo scaduto. +[ASS1_F:BARON5] +Brutto idiota... -[DONS3_4:DONS3] -Questi ~r~sostenitori~w~ sono stati sistemati. Elimina il prossimo gruppo. +[ASS1_G:BARON5] +La mia bellissima casa... -[DONS3_5:DONS3] -~w~Uccidi i ~r~sostenitori~w~ dell'opposizione ~w~prima delle ~1~:~1~. +[ASS1_H:BARON5] +Guarda cosa hai combinato! -[DONS3_6:DONS3] -~w~Uccidi i ~r~sostenitori~w~ dell'opposizione ~w~prima delle ~1~:0~1~. +[ASS1_I:BARON5] +Questo è per mio fratello! -[DONS3_7:DONS3] -~w~Uccidi i ~r~sostenitori~w~ dell'opposizione ~w~prima delle 0~1~:~1~. +[ASS1_J:BARON5] +Mi fidavo di te, Tommy! -[DONS3_8:DONS3] -~w~Uccidi i ~r~sostenitori~w~ dell'opposizione ~w~prima delle 0~1~:0~1~. +[ASS1_K:BARON5] +Ti avrei fatto diventare... -{=================================== MISSION TABLE DONS4 ===================================} +[ASS1_L:BARON5] +Buona notte, Mr. Diaz. -[DONS410:DONS4] -Vai al ~y~magazzino dei Forelli~w~ e dai fuoco alle schede elettorali! +[ASS1_1:BARON5] +Questo posto sarà zeppo di stronzi... fai attenzione... -[DONS411:DONS4] -Brucia le ~r~schede elettorali~w~ e distruggi le ~r~stampatrici! +[ASS1_2:BARON5] +Non preoccuparti, Tommy, ti copro io. -[DONS412:DONS4] -Distruggi la ~r~stampatrice! +[ASS1_4:BARON5] +Diaz deve essere qui dentro! -[DONS413:DONS4] -Brucia TUTTE le ~r~schede elettorali! +[ASS1_13:BARON5] +DIAZ? Sono venuto a prendermi il tuo business! -[DONS414:DONS4] -Distruggi gli ultimi ~r~furgoni dei Forelli! +[ASS1_14:BARON5] +TOMMY! Mi hai tradito... Idiota! Ti ucciderò fra un attimo! -[DONS416:DONS4] -~r~Ti è sfuggito un furgone dei Forelli! Ora possono manipolare le elezioni! +[ASS1_16:BARON5] +~g~Uccidi Diaz! -[DONS418:DONS4] -Ci sono ancora ~r~~1~ pacchi~w~ di schede contraffatte. +[BUD1:BARON5] +Lance -[DONS419:DONS4] -Rimane ~r~1 pacco~w~ di schede contraffatte. +[ASS1_18:BARON5] +~g~La porta è chiusa: trova un percorso alternativo. -[DONS420:DONS4] -Distruggi l'ultimo ~r~furgone dei Forelli! +[ASS1_19:BARON5] +Di qua! -[DONS421:DONS4] -Una stampatrice è a pezzi! Adesso distruggi l'altra ~r~stampatrice! +[ASS1_20:BARON5] +Tommy, ho un problema con Quentin, non con te! -[DONS422:DONS4] -La stampatrice è distrutta! +{=================================== MISSION TABLE BIKE1 ===================================} -[DONS423:DONS4] -Adesso esci di qui! +[BM1_A:BIKE1] +Dov'è Baker? -[DONS424:DONS4] -Distruggi le ~r~stampatrici! +[BM1_B:BIKE1] +Sto cercando Big Mitch Baker... -[DS4_AA:DONS4] -Così tanta gente... e così tanti soldi da intascare. +[BM1_C:BIKE1] +Chi lo cerca? -[DS4_AB:DONS4] -Non ho la pretesa di capire la politica. +[BM1_D:BIKE1] +Tommy Vercetti. -[DS4_AC:DONS4] -Nessuno lo fa davvero. È solo menzogna e corruzione. +[BM1_E:BIKE1] +Vercetti. -[DS4_AD:DONS4] -I Forelli possiedono delle quote della società che fabbrica le nuove stampatrici. +[BM1_F:BIKE1] +Non mi sembri della polizia, il che ti ha fatto guadagnare un minuto. -[DS4_AE:DONS4] -Ed è un male, vero? +[BM1_G:BIKE1] +Ti conviene parlare in fretta. -[DS4_AF:DONS4] -Beh, di certo non possiamo fidarci di loro. +[BM1_H:BIKE1] +Kent Paul mi ha detto che saresti stato interessato a occuparti della sorveglianza di uno spettacolo che sta allestendo. -[DS4_AG:DONS4] -Sarebbe meglio se incappassero in SERI problemi tecnici, intesi? +[BM1_I:BIKE1] +Kent Paul? Sheesh! Non mi stupisce abbia mandato te. -[DONS4H1:DONS4] -Troverai dell'armamento pesante al negozio di Phil Cassidy. +[BM1_J:BIKE1] +L'ultima volta che è stato qui è uscito dalla finestra con il vestitino che gli hanno dato alla nascita. -[DONS4AA:DONS4] -Antonio, che bello vederti! +[BM1_K:BIKE1] +Sei interessato o no? -[DONS4AB:DONS4] -Non sono un democratico, ma non arrivo a falsificare i voti. +[BM1_L:BIKE1] +Facciamo solo favori tra compagni. -[DONS4AC:DONS4] -Sapevi che i Forelli possiedono delle quote della società che fabbrica le nuove stampatrici? +[BM1_M:BIKE1] +Come faccio a diventarlo? -[DONS4AD:DONS4] -Ed è un male, vero? +[BM1_N:BIKE1] +Non è uno circolo sportivo, amico. Sai guidare una moto? -[DONS4AE:DONS4] -Beh, di certo non possiamo fidarci di loro. +[BM1_O:BIKE1] +Sai sederti su uno sgabello e bere birra? -[DONS4AF:DONS4] -Sarebbe meglio se incappassero in SERI problemi tecnici, intesi? +[BM1_P:BIKE1] +Cougar, Zeppelin, scoprite se questa ragazzina sa portare una moto... -[DONS4_8:DONS4] -Vai al negozio d'armi di Phil Cassidy. +[BM1_2:BIKE1] +~g~Hai bisogno di una Freeway o di un'Angel per gareggiare! -[DONS4H2:DONS4] -Il negozio d'armi di Phil Cassidy è indicato da una bandiera sul radar. +[BM1_3:BIKE1] +~r~I partecipanti sono stati attaccati! -[DONS427:DONS4] -Adesso vattene da Fort Staunton! +[BIKE1_1:BIKE1] +Bene, bei vestiti. Vediamo cosa sai fare. -[DONS4_9:DONS4] -Il negozio di Phil Cassidy ti fornirà gli strumenti per danneggiare la campagna dei Forelli. +[BM1_1:BIKE1] +~g~Recupera una Freeway o un'Angel e posizionati sulla griglia di partenza. -[DONS417:DONS4] -C'è un altro lanciafiamme al negozio d'armi di Phil Cassidy. +{=================================== MISSION TABLE BIKE2 ===================================} -[DONS425:DONS4] -Recupera il lanciafiamme al negozio d'armi di Phil Cassidy. +[BM2_1:BIKE2] +CAOS: -[DONS426:DONS4] -~r~Il commesso è morto! +[BM2_A:BIKE2] +Ah ah ah, ti ho preso di nuovo! -[DONS4H3:DONS4] -Donald Love ha comprato un lanciafiamme. Vai alla cassa per recuperarlo. +[BM2_B:BIKE2] +Ehi, Vercetti. -{=================================== MISSION TABLE DONS5 ===================================} +[BM2_C:BIKE2] +Cougar ha detto che sai portare la moto come si deve. -[DONS5_7:DONS5] -Proteggi la limousine di Donald! +[BM2_D:BIKE2] +Già, quanti altri giretti devo ancora fare? -[DONS5_9:DONS5] -~r~Donald Love è morto! +[BM2_E:BIKE2] +Sono un uomo molto impegnato. -[DONS513:DONS5] -Danni limousine +[BM2_F:BIKE2] +Se serve una bella scazzottata per mettere le cose a posto, dillo chiaramente. -[DONS516:DONS5] -Sali sulla ~b~limousine. +[BM2_G:BIKE2] +Essere uno di noi non significa solo azzuffarsi. Si tratta di far parte di una famiglia. -[DONS517:DONS5] -Hai lasciato indietro ~b~Donald Love~w~! +[BM2_H:BIKE2] +Sì, sono già stato parte di una famiglia. Non ha funzionato. -[DONS519:DONS5] -Porta Donald al ~y~rifugio! +[BM2_I:BIKE2] +Sì, certo, ma questa famiglia si occupa dei suoi membri. -[DONS520:DONS5] -Uccidi gli ~r~aggressori! +[BM2_J:BIKE2] +Non chiediamo a uno di fare il lavoro sporco per poi lasciarlo marcire quindici anni ai lavori forzati. -[DONS521:DONS5] -Sali sulla ~b~limousine! +[BM2_K:BIKE2] +Sì, esatto. Ho fatto la mia parte. -[DS5_AA:DONS5] -Odio la pubblicità, ma credo faccia parte del gioco, vero? +[BM2_L:BIKE2] +Questa è la più grande famiglia di disadattati, reietti e derelitti. -[DS5_AB:DONS5] -Temo di sì. +[BM2_M:BIKE2] +Merda, alcuni di noi sono stati persino traditi dalla propria nazione. -[DS5_AC:DONS5] -I Forelli cercheranno di farmi fuori, vero? +[BM2_N:BIKE2] +Sono stato imprigionato durante il Vietnam. Brutta storia. -[DS5_AD:DONS5] -Non preoccuparti, resto di guardia io. +[BM2_O:BIKE2] +Ed è per questo che ti chiedo di far bollire la pentola. -[DS5_AE:DONS5] -Oh bene. Prepariamoci al peggio. +[BM2_P:BIKE2] +Questa fottuta nazione ha bisogno di un bel calcio nel culo, e saremo noi a darglielo. -[DS5_BA:DONS5] -Merda! Tutto questo è ridicolo! +[BM2_Q:BIKE2] +Per cui esci, prendi una moto e mostra a questa città quanto siamo arrabbiati! -[DS5_BB:DONS5] -Non temere, ci penso io a questi stronzi! +[BM2_R:BIKE2] +Va bene. -[DS5_BC:DONS5] -C'è un fucile nel bagagliaio! +[BM2_2:BIKE2] +~g~Devi riempire l'indicatore del caos entro il tempo stabilito per mostrare quanto sei arrabbiato! -[DS5_BD:DONS5] -Chiudi le porte, non ci vorrà molto! +[BM2_3:BIKE2] +~g~Questo suono indica che hai riempito parte dell'indicatore, continua così. -[DS5_CA:DONS5] -OK, possiamo andare. +[BM2_4:BIKE2] +~r~Non sei riuscito a riempire l'indicatore del caos in tempo! -[DS5_CB:DONS5] -Un altro killer ci sta inseguendo! +{=================================== MISSION TABLE BIKE3 ===================================} -[DS5_DA:DONS5] -Non posso affrontare le elezioni da recluso. +[BM3_A:BIKE3] +Ehi, ciao Mitch. -[DS5_DB:DONS5] -Dobbiamo studiare una nuova tattica. +[BM3_B:BIKE3] +Accidenti Vercetti, hai davvero le palle. -[DONS522:DONS5] -Riporta Donald al suo ~y~edificio! +[BM3_C:BIKE3] +Adesso voglio vedere se sei pronto a combattere per la tua famiglia. -{=================================== MISSION TABLE DONS6 ===================================} +[BM3_D:BIKE3] +Una gang locale ha fatto l'errore di rubare il mio mezzo... -[DONS6_1:DONS6] -NONE +[BM3_E:BIKE3] +probabilmente come prova di coraggio o qualcosa del genere. -[DS6_00:DONS6] -Segui il ~b~furgone elettorale. +[BM3_F:BIKE3] +Io e i miei uomini stavamo per andare a dar loro una lezione sul rispetto. -[DS6_01:DONS6] -Aspetta che il ~b~corriere~w~ effettui lo scambio. +[BM3_G:BIKE3] +Comunque, -[DS6_02:DONS6] -Recupera le schede elettorali dal ~r~corriere. +[BM3_H:BIKE3] +ho pensato che sarebbe stata un'ottima occasione per la tua iniziazione. -[DS6_03:DONS6] -Uccidi il ~r~corriere. +[BM3_I:BIKE3] +Riportami indietro la mia moto e potrai dire a Paul che avrà la sua sorveglianza. -[DS6_04:DONS6] -Prendi il ~g~pacco. +[BM3_2:BIKE3] +~r~Dovevi riportare indietro la moto, non distruggerla! -[DS6_05:DONS6] -Segui nuovamente il ~b~furgone elettorale. +[BM3_3:BIKE3] +~g~Riporta la moto al bar! -[DS6_06:DONS6] -~r~Hai ucciso un corriere prima dello scambio! +[BM3_4:BIKE3] +~g~Sali sulla moto! -[DS6_07:DONS6] -Hai mancato uno degli scambi, non puoi sbagliare di nuovo! +[INTRUDE:BIKE3] +~g~Ti hanno visto! -[DS6_08:DONS6] -~r~Hai perso due scambi, la votazione non può essere truccata! +[BM3_6:BIKE3] +~g~Si sono rintanati dietro Ammu-Nation in Downtown. -[DS6_09:DONS6] -~r~L'hai spaventato! +[BM3_7:BIKE3] +~g~Avrai bisogno di una moto più veloce per accedere al tetto. -[DS6_10:DONS6] -~r~Il furgone è stato distrutto! +[BM3_8:BIKE3] +~g~Usa la moto per saltare da queste scale fino al tetto nella parte più lontana della strada. -[DS6_11:DONS6] -Hai esaurito il tempo! +[BM3_1:BIKE3] +~g~Una gang locale ha rubato la Angel di Mitch Baker: riportala indietro! -[DS6_12:DONS6] -~r~Non hai fermato il furgone! +[BM3_9:BIKE3] +~g~Recupera l'Angel di Mitch Baker e vattene! -[DS6_13:DONS6] -~r~Il furgone non può muoversi senza l'autista! +{=================================== MISSION TABLE BMX_1 ===================================} -[DS6_15:DONS6] -~r~Hai spaventato l'autista, non lo prenderai più ora! +[BMX_REC:BMX_1] +~g~Nuovo record stabilito: ~1~!! -[DS6_16:DONS6] -~1~ +[GETBIK2:BMX_1] +Hai ~1~ secondi per salire su una Dirt Bike! -[DS6_17:DONS6] -~w~L'autista è morto, porta il furgone al ~y~garage di Donald. +{=================================== MISSION TABLE BOATBUY ===================================} -[DONS6AA:DONS6] -Brutte notizie Toni! +[DRUG_1:BOATBUY] +Salve? Saaalve? Salve? -[DONS6AB:DONS6] -Cosa? +[DRUG_2:BOATBUY] +Tranquillo amico, sono qua. -[DONS6AC:DONS6] -Gli exit polls dicono che c'è un testa a testa. +[DRUG_3:BOATBUY] +Ehi, damerino! Dimmi, sei il nuovo proprietario? -[DONS6AD:DONS6] -È l'ora del piano B. +[DRUG_4:BOATBUY] +Sì. Qual è la barca più veloce? -[DONS6AE:DONS6] -Rubiamo alcuni dei voti non ancora conteggiati e li sostituiamo con i nostri. +[DRUG_5:BOATBUY] +È già in acqua, amico, -[DONS6AF:DONS6] -Cosa avevi detto a proposito della falsificazione dei voti? +[DRUG_6:BOATBUY] +pensavo che la volessi provare. -[DONS6AG:DONS6] -Oh, stai zitto! +[DRUG_7:BOATBUY] +Amico, ha già sopra un bel motore da 300 cavalli... -[DS6_14:DONS6] -Torna a prendere le ~g~schede elettorali~w~, non puoi lasciarle indietro! +[DRUG_8:BOATBUY] +...e la struttura in vetroresina: vola davvero sull'acqua! -[DS6_66:DONS6] -~r~Hai distrutto la macchina di un corriere prima dello scambio! +[DRUG_9:BOATBUY] +Può andare da zero a sessanta in quattro secondi spaccati... -[DS6_18:DONS6] -Hai ucciso un corriere prima dello scambio! Non ucciderne altri! +[DRUG_10:BOATBUY] +e può tenere venti pacchi della migliore erba giamaicana nella stiva! -[DS6_21:DONS6] -Muoviti! C'è un altro scambio in corso! +[DRUG_11:BOATBUY] +Dacci dentro, amico, è pronta a volare! -[DS6_22:DONS6] -Hai mancato il primo scambio, non puoi perderne un altro! +[DRUG_12:BOATBUY] +Yo yo, uh, ehi amico, hai da accendere? -[DS6_23:DONS6] -Hai mancato il secondo scambio, non puoi perderne un altro! +[DRUG_13:BOATBUY] +Amico? -[DS6_24:DONS6] -Hai mancato il terzo scambio, non puoi perderne un altro! +{=================================== MISSION TABLE CAP_1 ===================================} -[DS6_25:DONS6] -Hai mancato il quarto scambio, non puoi perderne un altro! +[CAP1_B1:CAP_1] +~g~La Mafia sta tassando il tuo business. Trovali e falli fuori. -[DS6_26:DONS6] -Hai spaventato un corriere prima dello scambio! Non spaventarne altri! +[CAP1_B2:CAP_1] +~g~La Mafia ha tassato il tuo cantiere navale! -[DS6_28:DONS6] -~r~Hai fatto un casino! La votazione non può più essere truccata! +[CAP1_B3:CAP_1] +~g~La Mafia ha tassato la tua fabbrica di gelato! -{=================================== MISSION TABLE DONS7 ===================================} +[CAP1_B4:CAP_1] +~g~La Mafia ha tassato la concessionaria! -[ELEC_01:DONS7] -Ehi Don, ho risolto quel problemino per conto tuo. +[CAP1_B5:CAP_1] +~g~La Mafia ha tassato la tua compagnia di taxi! -[ELEC_02:DONS7] -Adesso tutto filerà liscio come l'olio. +[CAP_01:CAP_1] +OK, qual è l'emergenza? -[ELEC_03:DONS7] -Ottimo. +[CAP_02:CAP_1] +CHI? -[ELEC_04:DONS7] -Non hai più collegamenti con il crimine organizzato. +[CAP_03:CAP_1] +Tommy... dei maledetti mafiosi... dicevano di essere venuti a prendere la loro fetta... -[ELEC_05:DONS7] -Sei candido come un bimbo in fasce. Potresti diventare papa. +[CAP_04:CAP_1] +...dicevano che erano soldi di Mr. Forello... mi sento di merda. -[ELEC_07:DONS7] -Malgrado non ci siano le prove di collegamenti tra Donald Love +[CAP_05:CAP_1] +Forelli? SONNY Forelli? -[ELEC_08:DONS7] -e il crimine organizzato di Liberty City, +[CAP_06:CAP_1] +Sì, quel nome... credo... hanno davvero insistito... -[ELEC_09:DONS7] -pare che le sue amicizie con mafiosi del calibro di Toni Cipriani +[CAP_07:CAP_1] +Non preoccuparti amico, non sono arrabbiato con te. -[ELEC_11:DONS7] -abbiano pesato parecchio sul giudizio degli elettori. +[CAP_08:CAP_1] +Portalo all'ospedale. -[ELEC_12:DONS7] -Nelle ultime ore, la sua popolarità è precipitata. +[CAP_09:CAP_1] +Tommy... fai a quel tipo un nuovo buco da cui cagare... -[ELEC_13:DONS7] -Sembra proprio che sia stato giudicato inadatto per governare... +[CAP_10:CAP_1] +Ho intenzione di fargliene due. -[ELEC_14:DONS7] -Inadatto! A causa tua... +[CAP1_2:CAP_1] +Conosci le regole, Vercetti! -[ELEC_15:DONS7] -Sì, è tutta colpa tua! +[CAP1_3:CAP_1] +Mr. Forelli manda i suoi saluti! -[ELEC_16:DONS7] -Colpa mia? +[CAP1_4:CAP_1] +È il macellaio di Harwood! -[ELEC_17:DONS7] -Sì, certo. +[CAP1_5:CAP_1] +Dì a Sonny di stare alla larga! -[ELEC_18:DONS7] -Colpa mia? +[CAP1_6:CAP_1] +Vice City è MIA adesso, NON sua. -[ELEC_19:DONS7] -Con tutti i sacrifici che ho fatto per questa città... +[CAP1_7:CAP_1] +Pensi di potermi tagliar fuori, Vercetti? -[ELEC_20:DONS7] -E sai qual è stata la mia più grande debolezza? +[CAP1_8:CAP_1] +Ti inseguiremo fino a farti fuori, Vercetti. -[ELEC_21:DONS7] -L'umiltà! E adesso sono rovinato. +[CAP1_9:CAP_1] +Non hai nessuna possibilità, brutto cazzone psicopatico. -[ELEC_22:DONS7] -BANCAROTTA! Un buco da 20 milioni di dollari! +[CAP1_10:CAP_1] +Ti ucciderò, Vercetti. -[ELEC_23:DONS7] -Finito in... bancarotta. Arrivederci! BANCAROTTA! +[CAP1_11:CAP_1] +Sei sempre stato uno stronzo. -[ELEC_06:DONS7] -Il papa! Guarda qui. +[CAP1_12:CAP_1] +Ti ammazzo, Vercetti. -[DONS7_1:DONS7] -O'Donovan ha collegato Donald Love a Salvatore Leone. La carriera politica di Donald Love è in bilico. Toni deve distruggere le prove. +[CAP1_B6:CAP_1] +~g~Hai trovato l'esattore: uccidilo! -[DONS7_2:DONS7] -~w~Ruba il ~b~furgone~w~ contenente le prove. +[CAP1_B7:CAP_1] +~g~Hai perso l'esattore. -[DONS7_3:DONS7] -~r~Hai ucciso il contatto. +[CAP1_B8:CAP_1] +~r~L'esattore ha tassato tutte le tue proprietà. -[DONS7_4:DONS7] -~w~Porta il furgone al ~y~punto di consegna. +[CAP1_B9:CAP_1] +~g~La Mafia ha tassato il Malibu! -[DONS7_5:DONS7] -~w~Torna sul ~b~furgone. +[CAP1_B0:CAP_1] +~g~La Mafia ha tassato lo studio cinematografico! -[DONS7_7:DONS7] -Sali sulla ~b~macchina del contatto. +[CAP1_C2:CAP_1] +~g~La Mafia è arrivata al cantiere navale! -[DONS7CA:DONS7] -Ah, Toni. +[CAP1_C3:CAP_1] +~g~La Mafia è arrivata alla fabbrica di gelato! -[DONS7CB:DONS7] -Le prove sono nel furgone qui davanti. +[CAP1_C4:CAP_1] +~g~La Mafia è arrivata al concessionario! -[DONS7CC:DONS7] -Dovrai farti strada con la forza. +[CAP1_C5:CAP_1] +~g~La Mafia è arrivata alla compagnia di taxi! -[DONS7CD:DONS7] -Riporta il furgone da DL. +[CAP1_C9:CAP_1] +~g~La Mafia è arrivata al Malibu! -[DONS7CE:DONS7] -Buona fortuna! +[CAP1_C0:CAP_1] +~g~La Mafia è arrivata allo studio cinematografico! -[DONS713:DONS7] -~w~Parcheggia dentro il ~y~garage. +[CAP1_D2:CAP_1] +~g~La Mafia sta abbandonando il cantiere navale! -[DONS714:DONS7] -~r~Hai distrutto il furgone! +[CAP1_D3:CAP_1] +~g~La Mafia sta abbandonando la fabbrica di gelato! -[RMN_AA:DONS7] -Questa sera c'è da festeggiare poiché lo sciopero che ha bloccato Liberty City +[CAP1_D4:CAP_1] +~g~La Mafia sta abbandonando il concessionario! -[RMN_AB:DONS7] -è finalmente giunto al termine. +[CAP1_D5:CAP_1] +~g~La Mafia sta abbandonando la compagnia di taxi! -[RMN_AC:DONS7] -Sono stati ripristinati i percorsi della metropolitana e dei traghetti. +[CAP1_D9:CAP_1] +~g~La Mafia sta abbandonando il Malibu! -[RMN_AD:DONS7] -Persino il ponte mobile che collega Staunton Island con Shoreside Vale ha riaperto. +[CAP1_D0:CAP_1] +~g~La Mafia sta abbandonando lo studio cinematografico! -[RMN_AE:DONS7] -Gli scioperanti hanno finalmente posato i loro cartelloni e sono tornati ai propri posti di lavoro +[CAP1B10:CAP_1] +Hai beccato gli esattori. Altri stanno arrivando. -[RMN_AF:DONS7] -dopo che il nuovo sindaco O'Donovan ha fatto delle promesse al raduno locale. +{=================================== MISSION TABLE CARBUY ===================================} -[RMN_AG:DONS7] -Come vostro sindaco posso garantirvi che esisterà SEMPRE un servizio di traghetti a Liberty City. +[CAR1_1:CARBUY] +B.J. Smith. E tu devi essere Mr. Vercetti. -[RMN_AH:DONS7] -Ma alcuni potrebbero pensare che le sue siano promesse a vuoto, +[CAR1_2:CARBUY] +Ti andrebbe un giro? -[RMN_AI:DONS7] -poiché i lavori nel nuovo tunnel di Porter Road continuano senza sosta. +[CAR1_3:CARBUY] +Perché no. -[DONS7_6:DONS7] -~w~Incontrati con l'~b~uomo~w~ di Donald Love sotto il cavalcavia di Newport. +[CAR1_4:CARBUY] +Bene, mi dispiace un po' vendere il concessionario. -{=================================== MISSION TABLE RAYS1 ===================================} +[CAR1_5:CARBUY] +È stato il mio primo investimento da quando mi sono messo in proprio. -[SAYO_01:RAYS1] -Quindi tu saresti il cazzone su per il culo, eh? +[CAR1_6:CARBUY] +Ma adesso è giunta l'ora di andare avanti. -[SAYO_02:RAYS1] -Scusa? +[CAR1_7:CARBUY] +Lasci la città? -[SAYO_03:RAYS1] -Tutta la gente che conta è veramente incazzata con te. +[CAR1_8:CARBUY] +Non troppo in fretta, spero? -[SAYO_04:RAYS1] -Leon McAffrey, LCPD. +[CAR1_9:CARBUY] +No. Sto per prepararmi al pensionamento e ai miei futuri investimenti. -[SAYO_05:RAYS1] -Non so di cosa stai parlando. +[CAR1_10:CARBUY] +Il mercato non tirava molto, -[SAYO_06:RAYS1] -Mi occupo di ristorazione. +[CAR1_11:CARBUY] +e la mia squadra si è preoccupata personalmente di diventare -[SAYO_07:RAYS1] -Ma certo, osso duro. +[CAR1_12:CARBUY] +più creativa nella produzione di contanti. -[SAYO_08:RAYS1] -A me non frega un cazzo se voi coglioni vi riempite di piombo a vicenda. +[CAR1_13:CARBUY] +Logicamente, potrei smantellare l'organizzazione prima di vendere. -[SAYO_09:RAYS1] -Mi interessa solo la mia parte. +[CAR1_14:CARBUY] +Diamine, potrei radere al suolo tutto quanto se volessi. -[SAYO_12:RAYS1] -La mia parte. Dov'è? +[CAR1_15:CARBUY] +Quest'area è in pieno sviluppo. -[SAYO_13:RAYS1] -Tra le tue chiappe, amico. Non farmi ridere. +[CAR1_16:CARBUY] +Oh, non mi preoccuperei di ciò. -[SAYO_14:RAYS1] -Se continui a fare lo stronzo con me, giuro che farò la pelle a te, ai tuoi amici, +[CAR1_17:CARBUY] +Il posto mi sembra perfetto. -[SAYO_15:RAYS1] -e alle vostre fottute famiglie. +[CAR1_18:CARBUY] +Sì, lo è, allora siamo d'accordo? -[SAYO_16:RAYS1] -Rilassati, datti una calmata. +{=================================== MISSION TABLE CARPAR1 ===================================} -[SAYO_17:RAYS1] -Questi sono affari, diciamo una specie di società. +[MM_1_A:CARPAR1] +~g~Attraversa ~y~5 punti di controllo ~r~SENZA~g~ abbattere i ~r~CONI~g~! ~g~Puoi attraversarli in ~y~QUALSIASI ORDINE~g~. -[SAYO_18:RAYS1] -Io ti terrò la legge fuori dai piedi, federali, Rico... +[CONE_1:CARPAR1] +~r~Hai abbattuto un cono! -[SAYO_19:RAYS1] -e tu continuerai a tenermi nel giro. - -[SAYO_20:RAYS1] -Chi mi assicura che non verrò preso a calci nelle palle - -[SAYO_21:RAYS1] -da ogni sbirro corrotto da qui a Vice City? - -[SAYO_22:RAYS1] -Ti aiuterò a prendere il controllo di questa città. - -[SAYO_23:RAYS1] -In cambio voglio un po' di soldi e alcuni favori. - -[SAYO_24:RAYS1] -Forza Toni, andiamo a fare un giro... - -[SAYO_25:RAYS1] -andiamo a far visita ai tuoi vecchi amici, i Sindacco. - -[SAYO_10:RAYS1] -- Adoro gli uomini con dei principi. ~n~ - Beh, anch'io. Vado ai loro funerali con auto sportive e pupe bollenti. - -[RS1_YK:RAYS1] -Danni - -[RS1_01:RAYS1] -Fai fuori i ~r~Sindacco. - -[RS1_02:RAYS1] -~r~La macchina è stata distrutta! - -[RS1_03:RAYS1] -~r~La Yakuza è stata massacrata! - -[RS1_04:RAYS1] -~w~Uccidi alcuni dei ~r~Sindacco~w~ per attirare la loro attenzione. - -[RS1_05:RAYS1] -~w~Sali sull'~b~auto di Leon. - -[RS1_06:RAYS1] -~w~Dirigiti nel ~y~territorio dei Sindacco. - -[RS1_07:RAYS1] -~w~Torna alla ~b~macchina. - -[RS1_10:RAYS1] -~r~Hai ucciso Leon! - -[RAYS1AA:RAYS1] -Io mi metterò al volante, tu pensa a sparare! - -[RAYS1AB:RAYS1] -Non doveva occuparsi la Yakuza del lavoro pesante? - -[RAYS1AC:RAYS1] -Adattarsi e sopravvivere, Cipriani. Adattarsi e sopravvivere. - -[RAYS1BA:RAYS1] -Merda, questo sta diventando pericoloso. - -[RAYS1BB:RAYS1] -Meglio che sparisca per un po'... ci vediamo in giro, Toni. - -[RAYS1CA:RAYS1] -Davanti a noi, Toni! - -[RAYS1CB:RAYS1] -Dietro di noi Toni, dietro di noi! - -[RAYS1CC:RAYS1] -Attento a sinistra! - -[RAYS1CD:RAYS1] -A destra Toni, a destra! - -[RAYS1CE:RAYS1] -Torna in macchina! - -[RAYS1CF:RAYS1] -Attento a quello che fai! - -[RAYS1OS:RAYS1] -Oh merda! - -{=================================== MISSION TABLE RAYS2 ===================================} - -[RS2_02:RAYS2] -~w~Veloce, sali su una ~b~moto! - -[RS2_03:RAYS2] -~w~Attira i motociclisti nella ~y~zona mortale! - -[RS2_04:RAYS2] -~w~Torna indietro, non puoi lasciare nessuno dei ~r~Forelli ~w~alle tue spalle! - -[RS2_05:RAYS2] -~w~Torna sulla ~b~motocicletta! - -[RS2_06:RAYS2] -~r~Hai bisogno di una motocicletta per attirare i Forelli. - -[RS2_07:RAYS2] -~r~Gli Yardie vogliono far fuori personalmente i Forelli. - -[RS2_08:RAYS2] -~r~Non è sopravvissuto un solo Yardie! - -[RS2_09:RAYS2] -~1~ - -[RS2_10:RAYS2] -~r~Non possono inseguirti se non hanno le moto! - -[RAYS2AA:RAYS2] -Te la sei presa comoda, Toni. - -[RAYS2AB:RAYS2] -Hai detto 'sbrigati' e io ti ho risposto 'fanculo'. - -[RAYS2AD:RAYS2] -Simpatico. Adesso apri le orecchie. - -[RAYS2AE:RAYS2] -Gli Yardie hanno messo i loro avidi occhi sul territorio di Forelli a Newport. - -[RAYS2AF:RAYS2] -Vai là e attira i soldati dei Forelli fino all'ospedale di Rockford. - -[RAYS2AG:RAYS2] -Gli Yardie li aspetteranno là. - -[RAYS2AH:RAYS2] -Cosa ti viene in tasca? - -[RAYS2AI:RAYS2] -Glielo devo. Ci becchiamo dopo. - -[RS2_11:RAYS2] -Non uccidere nessuno dei Forelli! - -[RS2_12:RAYS2] -Falli ~r~fuori~w~! - -[RS2_01:RAYS2] -~w~Ruba una delle ~b~moto~w~ dei Forelli, ma non uccidere nessuno di loro. - -[RAYS2DB:RAYS2] -Sì, forza. Facciamoli fuori! - -[RS2_13:RAYS2] -~r~Sono stati uccisi troppi Yardie! - -{=================================== MISSION TABLE RAYS3 ===================================} - -[CRAZ_01:RAYS3] -Chissà cosa ho fatto nella mia vita precedente per meritarmi questo. - -[CRAZ_02:RAYS3] -Ray, hai 40 anni e non hai la minima idea di quello che sta succedendo. - -[CRAZ_03:RAYS3] -Non so come hai fatto a campare così a lungo. - -[CRAZ_04:RAYS3] -Non capisco come nessuno ti abbia ancora piantato una pallottola in fronte. - -[CRAZ_05:RAYS3] -Ehi Leon, stai attento a quello che dici. - -[CRAZ_06:RAYS3] -Non posso credere alle mie fottute orecchie. - -[CRAZ_07:RAYS3] -Cosa vuoi fare, correre dalla mamma? - -[CRAZ_08:RAYS3] -Vuoi saltare in braccio a papà? - -[CRAZ_09:RAYS3] -Vuoi un bacio con la lingua? - -[CRAZ_10:RAYS3] -Ehi Toni! - -[CRAZ_14:RAYS3] -Lui si accerterà che tutto venga fatto secondo le regole! - -[CRAZ_15:RAYS3] -Toni Cipriani, Ray Machowski. - -[CRAZ_16:RAYS3] -È dalla nostra parte. Ehi, adesso dovremo combattere contro il crimine organizzato. - -[CRAZ_17:RAYS3] -Ora corri al distretto e compila un rapporto. - -[CRAZ_18:RAYS3] -Sei un bravo ragazzo... andiamo, Toni. - -[CRAZ_19:RAYS3] -Leon, sei un pezzo di merda. - -[CRAZ_11:RAYS3] -- Fermo, stronzo. ~n~ - Ehi! Ehi! Ehi! Calmo! Ti presento il mio nuovo amico! - -[RAYS3_1:RAYS3] -Aiuta la Yakuza a prendere possesso del territorio dei Forelli a Belleville Park. Devi uccidere ~1~ Forelli usando solo la katana. - -[RAYS3_2:RAYS3] -~w~Uccidi ~1~ ~r~Forelli~w~ usando solamente la katana. - -[RAYS3_3:RAYS3] -Uccisioni - -[RAYS3_4:RAYS3] -~w~Devi uccidere i ~r~Forelli~w~ usando la katana. - -[RAYS3_5:RAYS3] -~w~Non hai una katana. Raccogli un'~g~arma sostitutiva. - -[RAYS3_6:RAYS3] -~r~Hai esaurito il tempo. - -[RAYS3_7:RAYS3] -~w~Uccidi ~1~ ~r~Forelli~w~ usando solamente la katana prima delle ~1~:~1~ - -[RAYS3_8:RAYS3] -~w~Uccidi ~1~ ~r~Forelli~w~ usando solamente la katana prima delle ~1~:0~1~ - -[RAYS3_9:RAYS3] -~w~Uccidi ~1~ ~r~Forelli~w~ usando solamente la katana prima delle 0~1~:~1~ - -[RAYS310:RAYS3] -~w~Uccidi ~1~ ~r~Forelli~w~ usando solamente la katana prima delle 0~1~:0~1~ - -{=================================== MISSION TABLE RAYS4 ===================================} - -[RAYS4_1:RAYS4] -~w~Gli Yardie sono sotto attacco a Newport. Elimina i ~r~Sindacco. - -[RAYS4_2:RAYS4] -~w~Parla con il ~b~capo degli Yardie. - -[RAYS4_3:RAYS4] -~w~Segui il ~b~capo degli Yardie. - -[RAYS4_4:RAYS4] -~r~Uno degli Yardie è stato ucciso! - -[RAYS4_5:RAYS4] -~w~Proteggi gli Yardie fino all'arrivo dell'ambulanza. - -[RAYS4_6:RAYS4] -~w~Torna a proteggere gli Yardie. - -[RAYS4_7:RAYS4] -~w~Apri la strada verso l'ambulanza agli Yardie. - -[RAYS4_8:RAYS4] -~w~Vai incontro all'~y~ambulanza. - -[RAYS4AA:RAYS4] -Cipriani, dobbiamo smetterla di incontrarci così. - -[RAYS4AB:RAYS4] -Concordo. - -[RAYS4AC:RAYS4] -Forza, rilassati un po'. - -[RAYS4AD:RAYS4] -Cos'hai per me, McAffrey? - -[RAYS4AE:RAYS4] -Gli Yardie stanno avendo un po' di problemi a mantenere il controllo del nuovo territorio a Newport. - -[RAYS4AF:RAYS4] -Pare che i Sindacco lo rivogliano. - -[RAYS4BA:RAYS4] -Rudyard, il mio ragazzo, è stato ferito! - -[RAYS4BB:RAYS4] -Forza, dobbiamo caricarlo su un'ambulanza! - -[RAYS4BC:RAYS4] -Merda, altri Sindacco! - -[RAYS4BD:RAYS4] -Io prenderò l'ambulanza, tu aiuta i miei uomini! - -[RAYS4BE:RAYS4] -Andiamocene da qui! - -[RAYS4BF:RAYS4] -Ecco l'ambulanza! - -[RAYS4BG:RAYS4] -Grazie signor Cipriani, ti dobbiamo un favore! - -{=================================== MISSION TABLE RAYS5 ===================================} - -[RAYS5_1:RAYS5] -NONE - -[RAYS5AA:RAYS5] -Niente fiori? - -[RAYS5AB:RAYS5] -Non sapevo fosse il tuo funerale. - -[RAYS5AC:RAYS5] -Sei un cabarettista Toni, molto divertente. - -[RAYS5AD:RAYS5] -I Forelli stanno facendo sul serio. - -[RAYS5AE:RAYS5] -Trafficano armi e tengono una parte del campionario per loro... - -[RAYS5AF:RAYS5] -...in caso di guai. - -[RAYS5AG:RAYS5] -Stanno spostando le armi a Fort Staunton con dei camion. - -[RAYS5AH:RAYS5] -È stato un piacere. - -[RAYS5AI:RAYS5] -Al solito. - -[RAY5_2:RAYS5] -Hanno chiamato i rinforzi. - -[RAY5_3:RAYS5] -~r~I Forelli hanno preso le munizioni! - -[RAY5_4:RAYS5] -Ehi, è Cipriani! - -[RAY5_5:RAYS5] -Facciamolo fuori! - -[RAY5_6:RAYS5] -Uno è andato, ora distruggi l'altro ~r~camion. - -[RAY5_1:RAYS5] -Distruggi i ~r~camion~w~ prima che arrivino a destinazione! - -[RAY5_7:RAYS5] -Distruggi il ~r~camion~w~ prima che possano recuperare le munizioni. - -[RAY5_8:RAYS5] -~r~Non sei riuscito a distruggere il camion in tempo! - -{=================================== MISSION TABLE SALH1 ===================================} - -[SLH1_F1:SALH1] -~r~Hai ucciso uno degli Hood. - -[SLH1_F2:SALH1] -~w~Attira i Forelli sfasciando le loro ~r~macchine. - -[SLH1_F3:SALH1] -~w~Vendicati dei ~r~Forelli. - -[SLH1_F4:SALH1] -~w~Attira fuori altri Forelli sfasciando un'altra ~r~macchina. - -[SLH1_F5:SALH1] -~w~Non lasciare indietro gli ~b~Hood~w~. - -[SLH1_B0:SALH1] -~w~OK amico, mettiamo la città a ferro e fuoco. - -[SLH1_B1:SALH1] -~w~Ehi! Torna qui, idiota! - -[SLH1_B2:SALH1] -~w~Dai coglione! Non ci entrerò mai qui dentro! - -[SLH1_B3:SALH1] -~w~Hai fatto bene! Non ti conviene andare in giro senza di me. - -[SLH1_B4:SALH1] -~w~Dannazione amico! È stata dura! - -[SLH1_B6:SALH1] -~w~...senza offesa eh, Toni. - -[SLH1_B7:SALH1] -~w~È giunta l'ora che gli Hood si rialzino e facciano la cosa giusta! - -[SLH1_B8:SALH1] -~w~Coraggio! Facciamoli fuori! - -[SLH1_C0:SALH1] -~w~Fratello mio! - -[SLH1_C1:SALH1] -~w~Ehi idiota, dove stai andando? - -[SLH1_C2:SALH1] -~w~E dove cazzo dovrei sedermi? - -[SLH1_C3:SALH1] -~w~Hai fatto bene! Non ti conviene andare in giro senza di me. - -[SLH1_C4:SALH1] -~w~Meeeeerda! Ce la siamo vista brutta! - -[SLH1_D0:SALH1] -~w~Ehi! Quella è la mia macchina! - -[SLH1_D1:SALH1] -~w~Così mi piace di più! - -[SLH1_E0:SALH1] -~w~Ma che cazzo succede? - -[SLH1_E1:SALH1] -~w~Succede che vi stiamo per prendere a calci nelle palle! - -[SLH1_X0:SALH1] -Got threat - -[SLH1_X1:SALH1] -Had threat - -[SLH1_X2:SALH1] -Find threat - -[SLH1_F0:SALH1] -~w~Raccogli gli ~b~Hood~w~ e poi attira l'attenzione dei ~r~Forelli~w~. - -[RUFJ_01:SALH1] -Ecco il suo avvocato, signor Leone. - -[RUFJ_02:SALH1] -Ehi amico, so chi è... - -[RUFJ_03:SALH1] -Coraggio, dammi un attimo di respiro. - -[RUFJ_04:SALH1] -Vai ragazzino, corri da mamma e salutamela tanto, 'o capisti? - -[RUFJ_05:SALH1] -Bene... hai cinque minuti di tempo. - -[RUFJ_06:SALH1] -Ehi, uh, Lionel, ti trovo in forma. - -[RUFJ_07:SALH1] -Guarda me invece! - -[RUFJ_08:SALH1] -Divento un onesto membro della comunità e finisco subito al fresco. - -[RUFJ_09:SALH1] -Sta mettendo a dura prova la mia natura di filantropo! - -[RUFJ_10:SALH1] -Naturalmente, signor Leone. - -[RUFJ_11:SALH1] -Stiamo facendo tutto il possibile per tirarla fuori di qui e uh... - -[RUFJ_12:SALH1] -farla tornare ad aiutare la comunità il prima possibile. - -[RUFJ_13:SALH1] -Certo. - -[RUFJ_14:SALH1] -Qualcuno deve pagare per questo oltraggio. - -[RUFJ_15:SALH1] -Sono stati quei bastardi dei Sindacco o quei succhiacazzi dei Forelli? Chi è stato? - -[RUFJ_16:SALH1] -Chi mi ha fregato? - -[RUFJ_18:SALH1] -Facciamo il culo a entrambi. - -[RUFJ_19:SALH1] -Per come la vedo io, delle sane mazzate vendicheranno questo oltraggio. - -[RUFJ_22:SALH1] -Grazie Toni, significhi tanto per me, lo sai. - -[RUFJ_23:SALH1] -Ascolta, avrai bisogno di un po' di rinforzi. - -[RUFJ_24:SALH1] -Chiama gli Hood, OK? - -[RUFJ_25:SALH1] -Come preferisce, signor Leone. - -[RUFJ_26:SALH1] -Va bene... adesso vattene... Lionel. - -[RUFJ_20:SALH1] -- Bastardi. ~n~ - Per me sarà un piacere. - -{=================================== MISSION TABLE SALH2 ===================================} - -[SALH2AA:SALH2] -~w~Ehi Sal! Sono io... Toni. - -[SALH2AB:SALH2] -~w~Toni! Che bello sentirti ragazzo! - -[SALH2AC:SALH2] -~w~Questi cazzoni non mi permettono di vedere nessuno! - -[SALH2AD:SALH2] -~w~Ascolta, ho un sacco di faccende di cui occuparmi. - -[SALH2AE:SALH2] -~w~Uccidi Paulie Sindacco. La sua famiglia è finita in questa città. - -[SALH2AF:SALH2] -~w~Crede di potersene andare come se non avesse debiti da saldare. - -[SALH2AG:SALH2] -~w~Sono in galera per colpa di quel bastardo! - -[SALH2AH:SALH2] -~w~Quel figlio di puttana deve pagare. - -[SALH2O1:SALH2] -~w~Intercetta Paulie Sindacco all'edificio di controllo della ~y~Cochrane Dam. - -[SALH2F1:SALH2] -~r~È scappato! Salvatore non sarà contento! - -[SALH2CA:SALH2] -~w~Idioti! Quello è Toni Cipriani! Fatelo fuori! - -[SALH2BA:SALH2] -~w~Ehi Toni! Perché non nuoti fin qui e mi baci il culo? - -[SALH2BB:SALH2] -~w~Ehi stronzo, quaggiù! - -[SALH2BI:SALH2] -~w~Porta i miei saluti a Salvatore. Gli spedirò una cartolina! - -[SALH2BC:SALH2] -~w~Ehi babbeo, cos'hai intenzione di fare adesso? - -[SALH2BE:SALH2] -~w~Sei carne morta! - -[SALH2BF:SALH2] -~w~Sei fottuto! - -[SALH2BG:SALH2] -~w~Sorpresa, sacco di merda! - -[SALH2BH:SALH2] -~w~Signore e signori, Paulie Sindacco ha lasciato l'edificio! - -[SALH2BD:SALH2] -~w~Testa di cazzo, non ce la farai mai a prendermi! - -[SALH2O2:SALH2] -~w~Uccidi ~r~Paulie Sindacco~w~. Non farlo fuggire! - -[SALH2O3:SALH2] -Recupera un mezzo e tendi un'imboscata a ~r~Paulie~w~ dalla riva. - -{=================================== MISSION TABLE SALH3 ===================================} - -[SALH3_1:SALH3] -~w~Sal? Come va? - -[SALH3_2:SALH3] -~w~Fottutamente bene! Da Dio! - -[SALH3_3:SALH3] -~w~Punto uno. Il nuovo sindaco sta facendo di tutto per impedirmi la libertà provvisoria. - -[SALH3_4:SALH3] -~w~Punto due. Siamo in guerra con la stramaledetta Triade e i Diablo. - -[SALH3_5:SALH3] -~w~Punto tre. Ho sentito che la Yakuza vuole approfittarne per conquistare la città. - -[SALH3_6:SALH3] -~w~A parte queste piccole sciocchezze, va tutto bene! - -[SALH3_7:SALH3] -~w~Dopo tutti questi anni al potere, siamo stati scaricati come merda nel cesso! - -[SALH38:SALH3] -~w~Capo, posso occuparmi io di tutto quanto. - -[SALH39:SALH3] -~w~La Yakuza ha ricevuto un carico d'armi ad Aspatria. - -[SALH310:SALH3] -~w~Adesso niente potrà fermarla. - -[SALH311:SALH3] -~w~Vedremo. - -[SALH3_A:SALH3] -~w~Controlla il ~y~covo della Yakuza. - -[SALH3C1:SALH3] -~w~Trova un modo per entrare nel ~y~covo. - -[SALH3C2:SALH3] -~w~Ma cazzo! Non ci posso credere! - -[SALH3C3:SALH3] -~w~Distruggi il ~r~carro armato! - -[SALH3C4:SALH3] -~w~Ma che cazzo succede? - -[SALH3C5:SALH3] -~w~Uccidiamolo! - -[SALH3C6:SALH3] -~w~Il ~r~carro armato ~w~è blindato. Le armi convenzionali gli faranno il solletico a questo mostro! - -[SALH3G1:SALH3] -~w~Ehi 'amico', non c'è niente da vedere qui! - -[SALH3G2:SALH3] -~w~Sembra che l'ingresso sia riservato ai soli membri della Yakuza. - -[SALH3G3:SALH3] -~w~Porta le chiappe fuori da lì! - -[SALH3_B:SALH3] -~w~La macchina della Yakuza li ha ingannati! - -[SALH3_C:SALH3] -~w~Guida fino al ~y~covo~w~ e dai un'occhiata. - -{=================================== MISSION TABLE SALH4 ===================================} - -[SALH4_1:SALH4] -~w~Sal? - -[SALH4_2:SALH4] -~w~Anthony! Sto per uscire! - -[SALH42A:SALH4] -~w~Oggi c'è il mio ricorso in appello! - -[SALH4_3:SALH4] -~w~Ottimo! - -[SALH44C:SALH4] -~w~Certo Toni. - -[SALH44E:SALH4] -~w~Ehi, stanno arrivando le guardie... Ci vediamo sul davanti. - -[SALH4_5:SALH4] -~w~Recupera una macchina della polizia! - -[SALH45A:SALH4] -~w~Hai bisogno di una macchina della polizia o spaventerai il convoglio! - -[SALH4_6:SALH4] -~w~Vai a prendere posizione alla ~y~stazione di polizia. - -[SALH4_7:SALH4] -~w~Porca puttana! - -[SALH4_8:SALH4] -~w~Proteggi il ~b~furgone cellulare~w~ e fallo arrivare intero a destinazione! - -[SALH4_9:SALH4] -~w~Non allontanarti troppo dal ~b~furgone cellulare! - -[SALH410:SALH4] -~w~Stai perdendo il ~b~furgone cellulare! - -[SALH411:SALH4] -~r~Hai perso il furgone cellulare! Sal è stato giustiziato! - -[SALH412:SALH4] -~r~Il furgone cellulare è stato distrutto! - -[SALH413:SALH4] -~w~Non far incazzare i poliziotti, rovinerai i piani di Sal per la libertà provvisoria! - -[SALH416:SALH4] -~w~Scorta il ~b~convoglio~w~ a destinazione. - -[SALH417:SALH4] -~r~Hai fallito! I poliziotti hanno annullato l'udienza! - -[SALH420:SALH4] -~r~Sal è stato ucciso! - -[SALH421:SALH4] -~r~Hai perso il furgone cellulare! - -[SALH422:SALH4] -~w~Seminali o attirerai troppa attenzione sul convoglio! - -[SALH424:SALH4] -~w~Elimina il ~y~posto di blocco! - -[SALH415:SALH4] -~w~È bello essere di nuovo liberi. - -[SALH418:SALH4] -~w~Ascolta, voglio fare un salto a casa e cambiarmi questi stracci, va bene? - -[SALH419:SALH4] -~w~Ci vediamo là. - -[SALH414:SALH4] -~w~Posto di blocco illegale segnalato in zona... - -[SALH44A:SALH4] -~w~Se io sono qui dentro, chi li fermerà? - -[SALH4_4:SALH4] -~w~Sì, ma questi Siciliani non vogliono che arrivi davanti alla corte. - -[SALH44B:SALH4] -~w~Ehi, prima dovranno passare sul mio cadavere, Sal. - -[SALH44D:SALH4] -~w~Assicurati che riesca ad arrivare davanti alla corte! - -{=================================== MISSION TABLE SALH5 ===================================} - -[SALH51A:SALH5] -~w~Sbrigati, Toni. - -[SALH51B:SALH5] -~w~Se ho ragione, i Siciliani staranno andando dal sindaco. - -[SALH51C:SALH5] -~w~Dobbiamo arrivare prima di loro. - -[SALH511:SALH5] -~w~Brutta storia. - -[SALH554:SALH5] -~w~Accelera Toni! - -[SALH512:SALH5] -~w~Hai lasciato indietro ~b~Sal~w~. Torna a prenderlo. - -[SALH513:SALH5] -~w~Maledizione! Sono già qui! - -[SALH560:SALH5] -~w~Falli fuori Toni! - -[SALH561:SALH5] -~w~Io mi occuperò del sindaco! - -[SALH514:SALH5] -~w~Schifosi bastardi, l'hanno già preso! - -[SALH555:SALH5] -~w~Forza Toni! Da questa parte! - -[SALH515:SALH5] -~w~Eccoli! - -[SALH517:SALH5] -~w~Da dove arrivano quei bastardi? - -[SALH556:SALH5] -~w~Dietro di noi Toni! - -[SALH562:SALH5] -~w~Toni, davanti! - -[SALH519:SALH5] -~w~Toni! Elimina l'elicottero! - -[SALH522:SALH5] -~w~Pensano di potersi nascondere intorno al faro! - -[SALH557:SALH5] -~w~Fai fuori quei bastardi! - -[SALH558:SALH5] -~w~Bel colpo Toni! - -[SALH559:SALH5] -~w~Facciamola finita. - -[SALH526:SALH5] -~w~Io guido, tu coprici. - -[SALH527:SALH5] -~w~OK Toni... eccoci qui. - -[SALH528:SALH5] -~w~Quanti bastardi ci sono su questo scoglio? - -[SALH553:SALH5] -~w~Spari a un bastardo e ne arriva subito un altro che ti morde il culo! - -[SALH523:SALH5] -~r~Hai fatto uccidere Salvatore dai Siciliani! - -[SALH524:SALH5] -~r~Salvatore è stato ucciso! - -[SALH552:SALH5] -~r~Il sindaco è stato ucciso! - -[SALH573:SALH5] -~r~Hai distrutto la tua barca! Li hai persi! - -[SALH516:SALH5] -~w~Take out the guards and then let's get after them in that boat! - -[SALH518:SALH5] -~w~Another ~r~boat~w~ incoming... - -[SALH525:SALH5] -~w~Ha! They've left a rocket launcher on this thing! - -[SALH520:SALH5] -~y~I'll move closer to shore so we're more protected... Take it down! - -[SALH521:SALH5] -~w~Good work! Let's move out! - -[SALH53A:SALH5] -~w~Torini... torna tutto. - -[SALH53B:SALH5] -~w~Lascialo andare! - -[SALH53C:SALH5] -~w~Il sindaco è mio! - -[SALH53D:SALH5] -~w~QUESTA CITTÀ è mia! - -[SALH53E:SALH5] -~w~Salvatore... - -[SALH53F:SALH5] -~w~La Sicilia non ha mai voluto questo schifo di città. - -[SALH53G:SALH5] -~w~Ma finiti i contributi, cos'altro potevamo fare? - -[SALH53H:SALH5] -~w~Niente di personale. - -[SALH53I:SALH5] -~w~Niente di personale? - -[SALH53J:SALH5] -~w~Dopo quello che mi avete fatto passare! - -[SALH53K:SALH5] -~w~Ti strapperò il cuore! - -[SALH5TD:SALH5] -~w~Abbatti l'~r~elicottero di Massimo! - -[SALH5MO:SALH5] -~r~Massimo~w~ si sta muovendo! - -[SALH5GO:SALH5] -~r~Massimo è scappato! - -[SALH571:SALH5] -~w~Raggiungi il ~y~molo. - -[SALH570:SALH5] -~w~Fai fuori quei ~r~criminali Siciliani! - -[SALH572:SALH5] -~w~Elimina l'~r~informatore Siciliano! - -[SALH510:SALH5] -~w~Raggiungi il ~y~municipio~w~. Fai attenzione ai criminali Siciliani! - -[SICI_01:SALH5] -No, ti richiamo dopo... - -[SICI_04:SALH5] -Ehi, siamo tornati entrambi. Tu ed io! - -[SICI_05:SALH5] -Ce l'abbiamo fatta, eh? - -[SICI_06:SALH5] -Certamente. - -[SICI_07:SALH5] -Abbiamo sistemato i Forelli... - -[SICI_08:SALH5] -e spedito i Sindacco in fondo al fottuto oceano. - -[SICI_09:SALH5] -Adesso sono al telefono con i Siciliani, vogliono la pace. - -[SICI_10:SALH5] -Tutti vogliamo la pace! Ma a modo mio, non a modo loro. - -[SICI_11:SALH5] -Adesso comando io il gioco. - -[SICI_12:SALH5] -Nessun coglione del vecchio continente mi dirà più cosa devo fare. - -[SICI_13:SALH5] -Ho detto loro di andare a farsi fottere. - -[SICI_14:SALH5] -Davvero? Crede sia stato saggio? - -[SICI_15:SALH5] -Ehi, adesso sono il capo! IO! - -[SICI_16:SALH5] -Andiamo a fare una visitina al sindaco a proposito delle accuse a mio carico... - -[FIN1_01:SALH5] -Ehi, signor sindaco! - -[FIN1_03:SALH5] -Certo, grazie. - -[FIN1_04:SALH5] -E ciò vuol dire... - -[FIN1_05:SALH5] -Uh... che la città vi è grata? - -[FIN1_06:SALH5] -Riprova. - -[FIN1_07:SALH5] -Che lavora per me, giusto? - -[FIN1_08:SALH5] -Certamente, lavoro per lei. - -[FIN1_09:SALH5] -Bene, non ci richiami. Ci faremo vivi noi. - -[FIN1_10:SALH5] -E adesso fuori dalle palle. - -[FIN1_11:SALH5] -Grazie, signor Leone. - -[FIN1_12:SALH5] -Toni, ce l'abbiamo fatta: siamo noi al comando. Tu ed io. - -[FIN1_13:SALH5] -Siamo una bella squadra, vero? - -[FIN1_14:SALH5] -Ora ho bisogno che tu faccia ancora una cosetta per me: - -[FIN1_15:SALH5] -ho alcuni problemi da risolvere... - -[FIN2_01:SALH5] -Ehi Zio! Come va? - -[FIN2_02:SALH5] -Mi sembri in forma. - -[FIN2_03:SALH5] -Ahhhh Salvatore, volevamo solamente fare chiarezza. - -[FIN2_04:SALH5] -Sì Zio, lo apprezzo davvero. - -[FIN2_07:SALH5] -Bene, molto bene. - -[FIN2_08:SALH5] -Piccolo schifoso bastardo. - -[FIN2_09:SALH5] -Non mi fiderei mai di uno stronzo come lui. - -[FIN2_23:SALH5] -Giorno di gloria per i cani rognosi... - -[FIN2_10:SALH5] -Sì, ma ce l’abbiamo fatta. - -[FIN2_11:SALH5] -Sì, abbiamo fatto pulizia, sei stato in gamba Toni, sei stato davvero in gamba. - -[FIN2_12:SALH5] -Ho sempre saputo che sei un bravo ragazzo, mi hai salvato il culo un po' di volte. - -[FIN2_13:SALH5] -E io apprezzo questo tipo di lealtà. - -[FIN2_14:SALH5] -Grazie. - -[FIN2_15:SALH5] -Un gran lavoratore, mi piace. Merita rispetto. - -[FIN2_19:SALH5] -Vuoi dare un prezzo all'amicizia? - -[FIN2_20:SALH5] -Il tipo di amicizia che abbiamo tra noi? - -[FIN2_21:SALH5] -Vergogna! Vieni qui. - -[FIN2_22:SALH5] -Sei un bravo ragazzo, ma vergognati. - -[SICI_02:SALH5] -- Ehi Toni! ~n~ - Sal! Finalmente è tornato al suo posto. - -[FIN2_05:SALH5] -- Quindi siamo in pace ora, tu e il vecchio continente? ~n~ - Certamente. Io e tutta la mia gente. - -[FIN2_16:SALH5] -- Perciò ti ho portato quel mezzo milione promesso. ~n~ - Mezzo? Ma come, pensavo avesse detto un paio... - -[FIN2_18:SALH5] -Ho detto un milione di dollari! Ma come... - -[FIN1_02:SALH5] -Le abbiamo appena salvato la vita da un branco di Siciliani impazziti. - -{=================================== MISSION TABLE DONH1 ===================================} - -[DONH1JA:DONH1] -~w~Toni, il mio vecchio mentore, Avery Carrington, arriverà oggi in città... - -[DONH1JB:DONH1] -~w~Ho scoperto che sta lavorando per la Panlantic Corporation. - -[DONH1JC:DONH1] -~w~Farebbero qualsiasi cosa per appropriarsi di alcuni immobili. - -[DONH1JD:DONH1] -~w~DOBBIAMO recuperare i suoi progetti per acquisire le zone giuste. - -[DONH1JE:DONH1] -~w~Coraggio Toni! Stagli dietro! - -[DONH1CA:DONH1] -~w~Uh Toni, se recuperassi un veicolo mi faresti un favore. - -[DONH1DA:DONH1] -~w~All'aeroporto, Toni. - -[DONH1DB:DONH1] -~w~Non abbiamo tempo da perdere - -[DONH1EA:DONH1] -~w~Oh sì, questo è uno dei miei piani migliori... - -[DONH1EB:DONH1] -~w~Non credevo di essere così in gamba... - -[DONH1EC:DONH1] -~w~Con questo, guadagnerò una fortuna... - -[DONH1ED:DONH1] -~w~Sissignore, una fortuna... - -[DONH1EE:DONH1] -~w~Persino Avery sarebbe orgoglioso di me. - -[DONH1GA:DONH1] -~w~Eccolo! - -[DONH1GB:DONH1] -~w~Uccidilo Toni! - -[DONH1GC:DONH1] -~w~Ho bisogno di quei progetti! - -[DONH1HA:DONH1] -~w~Coraggio Toni! Sta scappando! - -[DONH1IA:DONH1] -~w~Toni, sei stato grandioso! - -[DONH1IB:DONH1] -~w~E ora torniamo alla mia dimora per stare al sicuro... - -[DONH1O0:DONH1] -~w~Porta Donald Love all'~y~aeroporto. - -[DONH1O1:DONH1] -~w~Uccidi ~r~Avery Carrington~w~ e recupera i suoi progetti! - -[DONH1O2:DONH1] -~r~Avery~w~ sta fuggendo! Fermalo! - -[DONH1O3:DONH1] -~r~Avery~w~ è salito su un altro veicolo. Non lasciarlo fuggire! - -[DONH1O4:DONH1] -~r~Avery~w~ sta scappando! Prendilo! - -[DONH1O5:DONH1] -~w~Vai a prendere ~b~Donald Love. - -[DONH1O6:DONH1] -~w~Ottimo lavoro! Recupera i ~g~progetti. - -[DONH1O7:DONH1] -~w~Porta Donald e i progetti al ~y~centro d'accoglienza. - -[DONH1O8:DONH1] -~w~Hai perso i ~g~progetti~w~! Torna indietro a prenderli. - -[DONH1OA:DONH1] -~w~Ti sono addosso! ~r~Avery~w~ sta fuggendo! Uccidilo! - -[DONH1OB:DONH1] -~w~Hai bisogno di un veicolo. - -[DONH1OC:DONH1] -~w~Non lasciare indietro ~b~Donald! - -[DONH1OD:DONH1] -~w~Attento! I progetti andranno perduti se la ~r~macchina di Avery~w~ verrà distrutta con lui a bordo! - -[DONH1OE:DONH1] -~r~Avery Carrington~w~ sta fuggendo. Inseguilo! - -[DONH1F0:DONH1] -~r~I progetti sono stati distrutti! - -[DONH1F1:DONH1] -~r~Avery Carrington è fuggito! - -[DONH1F2:DONH1] -~r~Donald è stato ucciso! - -[DONH1OF:DONH1] -~r~Avery Carrington~w~ è quasi giunto a destinazione. Fermalo! - -[DONH1O9:DONH1] -~w~Non lasciare indietro ~b~Donald~w~! Quei Colombiani lo uccideranno! - -[DONH1FA:DONH1] -~w~Hmmm, la Panlantic deve aver assunto il Cartello per proteggere Avery. - -[LAND_01:DONH1] -So a cosa stai pensando Toni: la caduta dei potenti, - -[LAND_02:DONH1] -ma è solo una pausa temporanea, amico mio. - -[LAND_03:DONH1] -OK. - -[LAND_04:DONH1] -Oh, non fare il permaloso. - -[LAND_05:DONH1] -So che ho detto delle brutte cose sul fatto che fosse colpa tua e tutto il resto, - -[LAND_06:DONH1] -ma l'arroganza è una brutta bestia, almeno quanto le termiti. - -[LAND_07:DONH1] -E credimi, ultimamente convivo con entrambi. - -[LAND_08:DONH1] -Adesso, tu e io... stiamo tornando! - -[LAND_09:DONH1] -Io non me ne sono mai andato... - -[LAND_10:DONH1] -Siamo in questa storia insieme, amigo. - -[LAND_11:DONH1] -No, non lo siamo. - -[LAND_12:DONH1] -Ti prego! - -[LAND_13:DONH1] -Ti prego... ti prego... scordatelo, amico. - -[LAND_18:DONH1] -Andiamo, te ne parlerò in macchina. - -[LAND_19:DONH1] -Spero tu abbia una macchina, la mia è... ehm... dal meccanico! - -[LAND_16:DONH1] -- 10% di cosa? Di questo cesso? Oh, sei troppo gentile. ~n~ - No... di una torta più grossa. - -[LAND_14:DONH1] -- 'È tutta colpa tua'. Patetico. ~n~ - 10%? - -{=================================== MISSION TABLE DONH2 ===================================} - -[DONH2_1:DONH2] -~w~Vai alla ~y~chiesa~w~ di Staunton Island. - -[DONH2_2:DONH2] -~w~Picchia il ~r~reporter ~w~oppure minaccialo con una pistola per farti dare le foto. - -[DONH2_3:DONH2] -~w~Hai delle foto per me. Dove sono? - -[DONH2_4:DONH2] -~w~Non farmi del male! - -[DONH2_5:DONH2] -~w~Dove sono quelle cazzo di foto? - -[DONH2_6:DONH2] -~w~Non so di cosa tu stia parlando! - -[DONH2_7:DONH2] -~w~Dove sono? - -[DONH2_8:DONH2] -~w~Ti prego, no! - -[DONH2_9:DONH2] -~w~Avanti fighetta! Dammele! - -[DONH210:DONH2] -~w~OK! OK! - -[DONH2EX:DONH2] -~w~Ti dirò dove sono le foto! - -[DONH211:DONH2] -~w~...sono nel mio garage! - -[DONH212:DONH2] -~w~Vai al ~y~garage del reporter. - -[DONH213:DONH2] -~w~Aiuto! Aiuto! Mi stanno rapendo! - -[DONH214:DONH2] -~w~Aiuto! Vuole uccidermi! - -[DONH215:DONH2] -~w~...Sono troppo intelligente per morire! - -[DONH216:DONH2] -~w~...Non posso morire, sto ancora lavorando sul mio romanzo! - -[DONH217:DONH2] -~w~Il mio editore non ha mai avvertito di questi problemi! - -[DONH218:DONH2] -~w~Non muovere un dito, faccia da culo! - -[DONH219:DONH2] -~w~Fermati, testa di cazzo! - -[DONH220:DONH2] -~w~Cazzo, smettila di tentare di scappare! - -[DONH221:DONH2] -~w~Toni! Finalmente! - -[DONH222:DONH2] -~w~Un giornalista ci ha visti mentre uccidevamo Avery! - -[DONH223:DONH2] -~w~Ha delle foto! Oddio! Sono finito! - -[DONH224:DONH2] -~w~Datti una calmata! Dov'è il reporter? - -[DONH225:DONH2] -~w~Oh, Toni, sei un uomo meraviglioso! - -[DONH226:DONH2] -~w~Apparentemente sembra lavori sotto copertura in una chiesa di Staunton Island. - -[DONH227:DONH2] -~w~Recupera le foto e mandalo al Creatore! - -[DONH228:DONH2] -~r~Ned è scappato! - -[DONH230:DONH2] -~w~Uccidi ~r~Ned Burner. - -[DONH231:DONH2] -~r~Ned è morto prima che tu potessi recuperare le foto! - -[DONH229:DONH2] -STRONZATE! - -[DONCUTA:DONH2] -~w~Eccole... prendile! Non le ho ancora sviluppate! - -[DONCUTB:DONH2] -~w~Sei un pezzo di merda! - -[DONH2SM:DONH2] -Terrore - -[DONH233:DONH2] -Continua a intimidire il reporter: se il suo indicatore di terrore scenderà troppo, potrebbe tentare di scappare. - -[DONH2LB:DONH2] -~w~Hai lasciato indietro il ~b~reporter~w~, torna a prenderlo. - -[DONH2LC:DONH2] -~r~Hai abbandonato il reporter. - -{=================================== MISSION TABLE DONH3 ===================================} - -[DONH3I1:DONH3] -~w~Sono tornato! - -[DONH3I2:DONH3] -~w~Resuscitato, Toni! Rinato, come la fenice che risorge dalle sue ceneri. - -[DONH3I3:DONH3] -~w~Come Lazzaro... sì... Lazarus Love! - -[DONH3I4:DONH3] -~w~Ah, sarò di nuovo ricco! - -[DONH3I5:DONH3] -~w~La Panlantic mi pagherà una fortuna per completare questo affare! - -[DONH3I6:DONH3] -~w~Ce l'abbiamo fatta Toni! - -[DONH3I7:DONH3] -~w~Se lo dici te. - -[DONH3I8:DONH3] -~w~È l'ora di organizzare una festicciola con un elenco di invitati esclusivi. - -[DONH3I9:DONH3] -~w~Andiamo! - -[DONH3C1:DONH3] -~w~Toni, abbiamo bisogno di un mezzo, non abbiamo troppo tempo. - -[DONH3L1:DONH3] -~w~Hai bisogno di ~b~Donald.~w~ Torna a prenderlo! - -[DONH3L2:DONH3] -~w~Forza Toni! Non ci rimane molto tempo! - -[DONH3L3:DONH3] -~w~Rimetti a posto quel cadavere! - -[DONH3_5:DONH3] -~w~Toni, morivo dalla voglia di organizzare questa festa. - -[DONH35D:DONH3] -~w~Proprio come i miei ospiti. - -[DONH35A:DONH3] -~w~Trova un ~b~cadavere. - -[DONH35B:DONH3] -~w~Recupera il ~b~cadavere di Avery. - -[DONH35C:DONH3] -~w~Recupera ~b~il cadavere di Ned. - -[DONH3_6:DONH3] -~w~Porta Donald e Avery all'~y~aeroporto. - -[DONH36A:DONH3] -~w~Ehi, riporta qui quell'ambulanza! - -[DONH36B:DONH3] -~w~Avery. - -[DONH36C:DONH3] -~w~Oh, Avery! Sei invecchiato dall'ultima volta che ci siamo visti. - -[DONH36D:DONH3] -~w~...mi hai regalato delle perle di saggezza. - -[DONH36E:DONH3] -~w~...e presto pasteggerò ancora! - -[DONH36F:DONH3] -~w~...Oddio! Ha una parrucca! - -[DONH36G:DONH3] -~w~Toni. Portaci al jet privato di Avery all'aeroporto. - -[DONH3_7:DONH3] -~w~Porta Donald e Ned all'~y~aeroporto. - -[DONH37F:DONH3] -~w~Toni. Porta me e Ned all'aeroporto. - -[DONH37A:DONH3] -~w~Ehi! Quel tipo sta rubando il cadavere! - -[DONH37B:DONH3] -~w~Ah, Ned Burner, reporter d'assalto. - -[DONH37C:DONH3] -~w~Ah, Ned. Ti darò l'esclusiva per la - -[DONH37D:DONH3] -~w~mia meravigliosa festa. - -[DONH37E:DONH3] -~w~Non è roba da tutti. - -[DONH37G:DONH3] -~w~C'è da morire per avere un invito. - -[DONH3_8:DONH3] -~w~Porta il cadavere di Avery all'~y~aeroporto. - -[DONH3_9:DONH3] -~w~Porta il cadavere di Ned all'~y~aeroporto. - -[DONH3A1:DONH3] -~w~Porta qui le vecchie ossa di Avery prima che la sicurezza ci scopra. - -[DONH3A2:DONH3] -~w~È quasi l'ora della sua autopsia. - -[DONH3N1:DONH3] -~w~Porta qui il cadavere di Ned prima che la sicurezza ci scopra. È quasi l'ora della sepoltura. - -[DONH3F1:DONH3] -~r~Love è morto. - -[DONH3F2:DONH3] -~r~Hai perso il corpo di Avery! - -[DONH3F3:DONH3] -~r~Hai perso il corpo di Ned! - -[DONH3C2:DONH3] -~w~La sicurezza dell'aeroporto chiuderà l'hangar di Avery Carrington alle 22:00. - -[DONH3F4:DONH3] -~r~Troppo tardi! La sicurezza dell'aeroporto ha chiuso l'hangar! - -[DONH3F5:DONH3] -~r~Troppo tardi! La sicurezza dell'aeroporto ha trovato Donald con il cadavere di Avery! - -[DONH3W1:DONH3] -~w~Muoviti! La sicurezza dell'aeroporto chiuderà l'hangar di Avery Carrington alle 22:00. - -[DONH3F6:DONH3] -~r~Troppo tardi! La sicurezza dell'aeroporto ha trovato Donald con il cadavere di Ned! - -{=================================== MISSION TABLE DONH4 ===================================} - -[DONH4A:DONH4] -~w~Donald mi ha mandato qui per prelevare un po' di ehm... roba. - -[DONH4B:DONH4] -~w~Perfetto. - -[DON4EX1:DONH4] -~w~Ho quello che vi serve ragazzi, ma vi costerà un po' di soldi. - -[DON4EX2:DONH4] -~w~Don ha detto che mi avresti pagato subito. Ti rimborserà più tardi. - -[DONH4C:DONH4] -~w~...ci avrei scommesso. - -[DONH4D:DONH4] -~w~Sì, come no! Intestalo a 'Super cazzone'! - -[DONH4E:DONH4] -~w~Dov'è la merce? - -[DONH4F:DONH4] -~w~Calma amico! Roba del genere necessita di tempo per essere assemblata. - -[DON4EX4:DONH4] -~w~Mi farò vivo. - -[DONH4G:DONH4] -Missione completata! - -[DONH4_1:DONH4] -NESSUNO - -[DONH4PS:DONH4] -~w~8-Ball ti farà sapere quando il materiale è pronto. - -{=================================== MISSION TABLE DONH5 ===================================} - -[DONH5_0:DONH5] -Furgone - -[DNH5_A0:DONH5] -~w~Ascolta amico, questo furgone è carico di brutto, perciò fai attenzione - -[DNH5_A1:DONH5] -~w~Pronto? Tutto a posto. - -[DNH5_A2:DONH5] -~w~Certo, te lo passo subito. - -[DNH5_A3:DONH5] -~w~Toni, siamo a un passo dal diventare clamorosamente ricchi. - -[DNH5_A4:DONH5] -~w~Abbiamo esaminato i progetti di Fort Staunton. Il suo punto debole è la vecchia metropolitana che passa nel sottosuolo. - -[DNH5_A5:DONH5] -~w~Ottimo lavoro, Don... ora devo solo occuparmi di un centinaio di italiani pazzi. - -[DNH5_A6:DONH5] -~w~Vai verso il tunnel Porter e troverai facilmente l'ingresso. - -[DNH5_B0:DONH5] -~w~Ehi! Tu non dovresti essere qui! - -[DNH5_B1:DONH5] -~w~Vattene immediatamente! - -[DNH5_C0:DONH5] -~w~Sali sul ~b~furgone. - -[DNH5_C4:DONH5] -~w~Piazza gli ~y~esplosivi! - -[DNH5_C5:DONH5] -~w~Piazza i rimanenti ~y~esplosivi! - -[DNH5_C6:DONH5] -~w~Fuggi dall'~y~ingresso della metropolitana! - -[DNH5_D0:DONH5] -~w~I Forelli? Cosa ci fanno qui? - -[DNH5_D1:DONH5] -~w~Non permettere che i Forelli distruggano il furgone! - -[DNH5_1:DONH5] -~w~Usa un veicolo per superare le barriere. - -[DONH5_2:DONH5] -~w~Sfonda le barriere a maggiore velocità! - -[DNH5_X0:DONH5] -~r~Hai distrutto il furgone! - -[DNH5_C1:DONH5] -~w~Torna sul ~b~furgone. - -[DNH5_C2:DONH5] -~w~Vai a una delle ~y~entrate~w~ del tunnel di Porter Road. - -[DNH5_C3:DONH5] -~w~Segui il ~y~tunnel. - -[DNH5_E0:DONH5] -~w~Uccidi quei ~r~lavoratori del cantiere. - -[DNH5_E1:DONH5] -~w~Uccidi quel ~r~lavoratore del cantiere. - -[DNH5_E2:DONH5] -~w~I Forelli hanno bloccato la via di ritorno. Trova un'altra ~y~uscita. - -[DNH5_E3:DONH5] -~w~Usa un veicolo per superare le barriere e raggiungi l'~y~uscita. - -[DNH5_X1:DONH5] -~r~I Forelli hanno distrutto il furgone! - -[DNH5_W1:DONH5] -~w~Non allontanarti troppo dal ~b~furgone! - -[DNH5_E4:DONH5] -~w~Non lasciare alcun ~r~testimone. - -{=================================== MISSION TABLE DONH6 ===================================} - -[DONH6_V:DONH6] -~r~v1,00 - -[DONH6_1:DONH6] -~w~Raggiungi l'~y~abitazione. - -[DONH6_5:DONH6] -~w~Oddio Toni! Fai qualcosa! - -[DONH6_6:DONH6] -~w~Hai ~1~ secondi per tornare nella proprietà! - -[DONH6_7:DONH6] -Tempo Di Ritorno - -[DONH6_8:DONH6] -~r~Non sei riuscito a tornare in tempo alla villa... Donald è stato giustiziato! - -[DONH610:DONH6] -~w~Recupera una macchina! - -[DONH611:DONH6] -~w~Oddio! Ce ne sono ancora! - -[DONH624:DONH6] -~W~Parti a razzo Toni! - -[DONH612:DONH6] -~w~Ce l'abbiamo fatta! - -[DONH623:DONH6] -~w~Portami al jet di Avery. Lui e Ned sono ancora a bordo, quindi non viaggerò da solo. - -[DONH622:DONH6] -~w~Vai al ~y~jet di Avery. - -[DONH613:DONH6] -~w~Andiamo all'aeroporto. - -[DONH625:DONH6] -~w~Vai all'~y~aeroporto. - -[DONH615:DONH6] -~w~Hai lasciato indietro ~b~Donald~w~! Torna a prenderlo! - -[DONH619:DONH6] -~r~Donald è stato ucciso! - -[DONH6_9:DONH6] -~w~D? Forza! Andiamo! - -[DONH614:DONH6] -~w~Sei sicuro che sia tutto a posto, Toni? - -[DONH616:DONH6] -~w~Oh... il mio... GIARDINO! - -[DOH616A:DONH6] -~w~Guarda cos'hai fatto al mio bellissimo giardino! - -[DONH617:DONH6] -~w~D... o pensi ai fiori, o eviti i fori. Scegli tu. - -[DONH618:DONH6] -~w~Portami all'aeroporto! - -[DONH620:DONH6] -~w~Amico, non sai quanto odio i saluti. - -[DOH620A:DONH6] -~w~'Adieu'. - -[DONH621:DONH6] -~w~D... è stato istruttivo. - -[DONH66S:DONH6] -~w~Hai ~1~ secondo per tornare nella proprietà! - -[DONH66A:DONH6] -~w~Elimina quei ~r~gangster Colombiani! - -[DONP_01:DONH6] -Bruuuchi... bruuuchi... bruuu... bruu... br... No, non va bene. - -[DONP_02:DONH6] -Ohmmmmmmmm. Maledizione. - -[DONP_03:DONH6] -È così... Oh merda, se avessi qualcosa di freddo da stringere, - -[DONP_06:DONH6] -Antonio! Oh, sono alla ricerca dell'illuminazione spirituale, - -[DONP_07:DONH6] -purtroppo oggi non è giornata... - -[DONP_08:DONH6] -Forse domani. - -[DONP_09:DONH6] -Nel messaggio sembravi un po' preoccupato. - -[DONP_10:DONH6] -Preoccupato? Sto meditando. Preoccupato, moi? - -[DONP_11:DONH6] -Sono in armonia con il cosmo. È praticamente impossibile. - -[DONP_12:DONH6] -Oh merda, hai ragione. - -[DONP_13:DONH6] -Uhm, stanno arrivando un mucchio di Colombiani - -[DONP_14:DONH6] -che potrebbero uccidermi se non terrò la bocca chiusa e non li pagherò. - -[DONP_15:DONH6] -Oh! Questo spiega tutti quei Colombiani che si aggirano qua fuori. - -[DONP_16:DONH6] -Oh merda! Ti prego Antonio, devi portarmi fuori di qui! - -[DONP_17:DONH6] -Non voglio... ti prego! Non voglio morire! Non voglio... - -[DONP_18:DONH6] -Ma non eri in armonia con il cosmo, eh? - -[DONP_19:DONH6] -Grazie Toni! Non te ne pentirai, te lo prometto. - -[DONP_04:DONH6] -- sarebbe tutto più semplice... ~n~ - Che succede, D? - -{=================================== MISSION TABLE TOSH1 ===================================} - -[TOSH1AB:TOSH1] -~w~Fermatelo! - -[TOSH1AC:TOSH1] -~w~Prendetelo! - -[TOSH1AD:TOSH1] -~w~Sparategli! - -[TOSH1AA:TOSH1] -~w~Eccolo! - -[TOSH120:TOSH1] -~w~Ruba ~b~il carico d'armi~w~ della Yakuza a Bedford Point. - -[TOSH121:TOSH1] -~w~Dovrai superare le ~r~guardie della Yakuza. - -[TOSH122:TOSH1] -~w~Attento alle altre ~r~barche della Yakuza. - -[TOSH130:TOSH1] -~w~Porta le armi al ~y~contatto di Toshiko. - -[TOSH131:TOSH1] -~w~Torna al ~b~carico d'armi. - -[TOSH1BA:TOSH1] -~w~Ehi ragazzo, questa sì che è roba coi fiocchi! - -[TOSH1BB:TOSH1] -~w~Sai, faccio così tanti affari qui al porto che dovrei trasferirmi, invece di - -[TOSH1BC:TOSH1] -~w~stare a sud della fottuta isola! - -[TOSH1BD:TOSH1] -~w~Bene, è stato divertente! - -[TOSH1DB:TOSH1] -~r~Le armi sono state distrutte! - -[TOSH1PH:TOSH1] -~w~La Yakuza sarà di guardia. Forse dovresti passare da Phil Cassidy strada facendo. - -[DEAD_01:TOSH1] -Quindi lei sarebbe il gangster grosso e cattivo? - -[DEAD_02:TOSH1] -Non mi sembra un duro. - -[DEAD_03:TOSH1] -...Grazie - -[DEAD_04:TOSH1] -Sa cosa vuol dire vivere senza amore, signor Toni? - -[DEAD_05:TOSH1] -Significa vivere nell'odio... - -[DEAD_06:TOSH1] -Le credo sulla parola. - -[DEAD_07:TOSH1] -Bramo dal desiderio di uccidere un uomo, signor Cipriani. - -[DEAD_08:TOSH1] -Distruggere... ucciderlo non basterebbe. - -[DEAD_09:TOSH1] -Voglio vedere lui e la sua organizzazione umiliati prima della sua morte. - -[DEAD_10:TOSH1] -Voglio che soffra. - -[DEAD_11:TOSH1] -OK. - -[DEAD_12:TOSH1] -L'uomo che deve distruggere è mio marito: Kazuki Kasen. - -[DEAD_13:TOSH1] -Non si preoccupi. - -[DEAD_14:TOSH1] -Verrà ricompensato profumatamente per i suoi servizi. - -[DEAD_15:TOSH1] -E se dicessi no? - -[DEAD_16:TOSH1] -Non lo farà... perché se a me interessa che muoia, per lei è una necessità. - -[DEAD_17:TOSH1] -In realtà, gli ha già inferto un duro colpo, signor Cipriani. - -[DEAD_18:TOSH1] -Tuttavia, oggi prenderà in consegna un nuovo carico di munizioni. - -[DEAD_19:TOSH1] -Voglio che rubi le armi da sotto il suo naso da idiota. - -{=================================== MISSION TABLE TOSH2 ===================================} - -[TOSH2AA:TOSH2] -~w~Signor Toni. - -[TOSH2AL:TOSH2] -~w~Mio marito si è molto infuriato in seguito alle sue azioni. - -[TOSH2AB:TOSH2] -~w~Ha mostrato a lui e ai suoi uomini - -[TOSH2AM:TOSH2] -~w~la loro stupidità. - -[TOSH2AC:TOSH2] -~w~Mi piace fare il mio lavoro. E ora, principessa? - -[TOSH2AE:TOSH2] -~w~Mio marito sposterà una grande quantità di denaro dal suo casinò. - -[TOSH2AF:TOSH2] -~w~Voglio che lei distrugga quei soldi. - -[TOSH2AG:TOSH2] -~w~Potrei utilizzare quei soldi in un altro modo, se non le dispiace. - -[TOSH2AH:TOSH2] -~w~Voglio che tutti vedano i suoi soldi bruciare in mezzo alla strada. - -[TOSH2AI:TOSH2] -~w~OK... OK... quando avverrà il trasferimento? - -[TOSH2AJ:TOSH2] -~w~È già iniziato. - -[TOSH2AK:TOSH2] -~w~Stanno andando via dal casinò in questo istante, non ha molto tempo. - -[TOSH2O0:TOSH2] -~w~Distruggi TUTTI i ~r~portavalori.~w~ Non permettere che raggiungano il ~y~covo della Yakuza! - -[TOSH2O1:TOSH2] -~w~Stanno scappando! Non lasciar fuggire nessun ~r~furgone! - -[TOSH2O2:TOSH2] -~w~Li hai spaventati! Non permettere che i loro ~r~furgoni ~w~scappino! - -[TOSH2E1:TOSH2] -~w~Il ~r~convoglio~w~ si sta avvicinando al ~y~covo della Yakuza! - -[TOSH2E2:TOSH2] -~w~Un ~r~furgone~w~ è quasi arrivato al ~y~covo della Yakuza! - -{=================================== MISSION TABLE TOSH3 ===================================} - -[TOSH3M1:TOSH3] -~w~C'è qualcuno in casa? - -[TOSH3M2:TOSH3] -~w~Signor Toni? Un momento, prego... - -[TOSH3M3:TOSH3] -~w~Mio marito è furioso. - -[TOSH3EA:TOSH3] -~w~Si sta domandando come sia stato possibile un attacco così preciso e mirato. - -[TOSH3M4:TOSH3] -~w~Se non è stupido, lo scoprirà presto. - -[TOSH3M5:TOSH3] -~w~Forse potremmo aiutarlo. Ai suoi uomini piace spettegolare. - -[TOSH3EB:TOSH3] -~w~Diamo loro un motivo per farlo. - -[TOSH3M6:TOSH3] -~w~Dove stiamo andando? - -[TOSH3M7:TOSH3] -~w~All'opera. - -[TOSH3M8:TOSH3] -~w~All'opera? Io? Sta scherzando? - -[TOSH3M9:TOSH3] -~w~Non sia ridicolo signor Toni, tutti amano l'opera. - -[TOSH3A:TOSH3] -~w~Se prende la mia macchina potremo andare a ritirare il suo smoking. - -[TOSH3EC:TOSH3] -~w~Non abbiamo molto tempo, lo spettacolo inizierà tra poco. - -[TOSH3B:TOSH3] -~w~Porta fuori la ~b~macchina di Tohisko~w~. - -[TOSH3C:TOSH3] -~w~Passa a prendere ~b~Toshiko. - -[TOSH3C2:TOSH3] -~w~Prendi lo smoking da ~y~Mr. Benz. - -[TOSH3B3:TOSH3] -~w~Riporta Toshiko al suo ~y~appartamento. - -[TOSH3B4:TOSH3] -~r~Hai lasciato indietro Toshiko. - -[TOSH3B2:TOSH3] -Torna nella ~b~macchina di Toshiko. - -[TOSH3C3:TOSH3] -~w~Vai all'~y~opera. - -[TOSH3D:TOSH3] -~w~Dove sta andando? Arriveremo tardi! - -[TOSH3D2:TOSH3] -~w~Non mi lasci indietro Toni san, la prego! - -[TOSH3Z1:TOSH3] -~w~Signor Toni, lei crede che io sia una persona cattiva? - -[TOSH3Z2:TOSH3] -~w~Beh principessa, non sono proprio un santo. - -[TOSH3Z3:TOSH3] -~w~No... non saprei che farmene di un santo. - -[TOSH3Z4:TOSH3] -~w~Mio marito è un samurai, signor Toni. - -[TOSH3Z5:TOSH3] -~w~È molto forte... ma anche molto, molto cattivo. - -[TOSH3Z6:TOSH3] -~w~Mi ha sposata solo per diventare il waka-gashira di Liberty City. - -[TOSH3Z7:TOSH3] -~w~Non mi ha mai amata... preferisce la compagnia dei suoi uomini. - -[TOSH3Z8:TOSH3] -~w~Capisce? - -[TOSH3Z9:TOSH3] -~w~Quando scoprirà quello che sta facendo, la vorrà uccidere. - -[TOSH3Z0:TOSH3] -~w~La vita e la morte non hanno più importanza, conta solo la libertà. - -[TOSH3ZB:TOSH3] -~w~Che rilassante visione del mondo... - -[TOSH3E:TOSH3] -~w~Il sangue italiano non si deve mischiare con quello giapponese. - -[TOSH3F:TOSH3] -~w~A meno che non si trovi sul marciapiede. - -[TOSH3G:TOSH3] -~w~Proteggi Toshiko e fuggi con la ~b~sua macchina. - -[TOSH3H:TOSH3] -~w~Proteggi ~b~Toshiko~w~ e riportala al suo ~y~appartamento. - -[TOSH3S1:TOSH3] -~w~La mia macchina! - -[TOSH3S2:TOSH3] -~w~Ci salvi, Toni! - -[TOSH3S3:TOSH3] -~w~Coraggio, Toni! - -[TOSH3S4:TOSH3] -~w~Ci porti fuori di qui! - -[TOSH3S5:TOSH3] -~w~MI SALVI! - -[TOSH3S6:TOSH3] -~w~AIUTO! - -[TOSH3S7:TOSH3] -~w~Non ce la faremo mai! - -[TOSH3S8:TOSH3] -~w~AIUTO! - -[TOSH3S9:TOSH3] -~r~Toshiko è morta! - -[TOSH310:TOSH3] -~r~La macchina di Toshiko è stata distrutta! - -[TOSH311:TOSH3] -~r~Il tempo è scaduto! - -[TOSH3_1:TOSH3] -NESSUNO - -[TOS3NE1:TOSH3] -~w~Proteggi Toshiko e uccidi i ~r~Forelli. - -[TOS3NE2:TOSH3] -~w~Scappa con la ~b~macchina di Toshiko. - -[TOSH3EI:TOSH3] -~w~L'opera comincia alle 20:00. Non fare tardi! - -{=================================== MISSION TABLE TOSH4 ===================================} - -[TOSH4O2:TOSH4] -~w~L'elicottero di Kazuki si sta dirigendo verso il ~y~casinò! - -[TOSH4O4:TOSH4] -~w~Uccidi ~r~Kazuki! - -[TOSH4O5:TOSH4] -~w~Vai all'~y~appartamento di Toshiko. - -[TOSH4_3:TOSH4] -~w~Kazuki sta arrivando su quell'elicottero! Raggiungi l'eliporto e uccidilo. - -[TOSH4Y1:TOSH4] -~w~Prendiamolo! - -[TOSH4Y2:TOSH4] -~w~Uccidiamolo! - -[TOSH4CA:TOSH4] -~w~I miei uomini mi hanno disonorato... - -[TOSH4CB:TOSH4] -~w~ma sono pronto a ucciderti con le mie mani. - -[TOSH4CC:TOSH4] -~w~Voi due! Lasciateci soli! - -[TOSH4CD:TOSH4] -~w~Godrò nell'infilzarti con la mia spada! - -[TOSH4CE:TOSH4] -~w~Sì, l'ho sentito dire in giro. - -[TOSH4K1:TOSH4] -~w~Sparategli! - -[TOSH4K2:TOSH4] -~w~Uccidiamolo! - -[TOSH4_7:TOSH4] -~w~Porta la spada di Kazuki a Toshiko come prova della sua morte. - -[TOSH4_8:TOSH4] -~w~Hai spaventato Kazuki! Sta scappando! Hai perso l'opportunità di ucciderlo! - -[TOSH4_C:TOSH4] -Kazuki - -[TOSH4AA:TOSH4] -~w~Permesso? - -[TOSH4AB:TOSH4] -~w~Sto facendo il bagno, Toni san. - -[TOSH4AC:TOSH4] -~w~Ci è rimasto poco tempo. - -[TOSH4AD:TOSH4] -~w~Ora mio marito sa chi c'è veramente dietro le sue perdite. - -[TOSH4AE:TOSH4] -~w~Sta venendo per uccidere me e lei. - -[TOSH4AF:TOSH4] -~w~Beh, non rimarrò qui ad aspettarlo. Dove si trova? - -[TOSH4AG:TOSH4] -~w~È a Belleville, sta radunando i suoi uomini. - -[TOSH4AJ:TOSH4] -~w~Ma presto sarà qui. - -[TOSH4AH:TOSH4] -~w~Sayonara, dolcezza. - -[TOSH4AI:TOSH4] -~w~Pregherò per lei, Toni san. Buona fortuna. - -[TOSH4F1:TOSH4] -~r~Kazuki ti sta ridendo in faccia! - -[TOSH4OA:TOSH4] -~w~Uccidi le ~r~guardie~w~ di Kazuki! - -[TOSH4OB:TOSH4] -~w~Ritorna da ~y~Kazuki! - -[TOSH4OC:TOSH4] -~w~Attento, arrivano altri uomini della ~r~Yakuza! - -[TOSH4DA:TOSH4] -~w~Sparategli! - -[TOSH4DB:TOSH4] -~w~Uccidetelo! - -[TOSH4DC:TOSH4] -~w~Uccidetelo, brutti stronzi! - -[TOSH4O1:TOSH4] -~w~Raggiungi ~y~l'appartamento di Kazuki~w~ e uccidilo! - -[TOSH4O3:TOSH4] -~w~Raggiungi l'~y~eliporto! - -[CASH_01:TOSH4] -Quindi, uh... Toshiko. È finita. - -[CASH_02:TOSH4] -Sì sì, lo sapevo... salve signor Toni. - -[CASH_03:TOSH4] -Salve. Quindi, uhh... ha vinto. - -[CASH_04:TOSH4] -Ha ottenuto quello che voleva, è andato tutto alla perfezione. - -[CASH_06:TOSH4] -Grande, davvero grande. - -[CASH_07:TOSH4] -Bene... È il momento della paga, dolcezza... - -[CASH_08:TOSH4] -Siamo entrambi dei pazzi e degli assassini, signor Toni. - -[CASH_09:TOSH4] -Credo di sì. - -[CASH_10:TOSH4] -Il mondo richiede un dazio tremendo all'anima, non è d'accordo signor Toni? - -[CASH_11:TOSH4] -Sì, certo. - -[CASH_12:TOSH4] -Ma adesso è libera, può andare in Costa Rica, Aruba, roba del genere. - -[CASH_13:TOSH4] -Ricominciare da zero, è quello che ha sempre desiderato. - -[CASH_14:TOSH4] -Non credo di essere pronta per una vacanza al mare, signor Toni. - -[CASH_15:TOSH4] -Ho perso tutto... e l'ho fatto deliberatamente. - -[CASH_16:TOSH4] -Mi è stato concesso tutto ciò che volevo. - -[CASH_17:TOSH4] -Adesso voglio essere veramente libera. - -[CASH_18:TOSH4] -Arrivederci, Toni-san. +[MM_1_C:CARPAR1] +~y~ATTRAVERSA~g~ un punto di controllo per attivare il TIMER. ~g~Ogni punto di controllo ti fornirà ~y~~1~ SECONDI~g~ extra. {=================================== MISSION TABLE COPCAR ===================================} -[C_COMP1:COPCAR] -~w~Missione Vigilante: livello 12 completato! Aumentata la protezione del giubbotto antiproiettile! +[KILLS:COPCAR] +UCCISIONI: [C_BREIF:COPCAR] -~r~Sospetto~w~ visto in prossimità della zona ~a~. +~g~Sospettato visto in prossimità dell'area ~a~. -[C_BREIG:COPCAR] -~r~Sospetti~w~ visti in prossimità della zona ~a~. - -[C_RANGE:COPCAR] -~r~La radio della polizia è fuori campo, avvicinati a una stazione di polizia! - -[C_TIMEA:COPCAR] -~w~Tempo bonus! +~1~ secondi +[C_PASS:COPCAR] +MINACCIA ELIMINATA: ~1~$ [COPCART:COPCAR] -~w~Hai ~1~ secondi per tornare a un veicolo della polizia prima che la missione abbia termine. - -[COPCARU:COPCAR] -~w~Hai ~1~ secondo per tornare a un veicolo della polizia prima che la missione abbia termine. +~g~Hai ~1~ secondi per tornare a un veicolo della polizia prima che la missione abbia termine. [C_CANC:COPCAR] ~r~Missione Vigilante annullata! @@ -15335,2125 +9276,5450 @@ Arrivederci, Toni-san. [C_TIME:COPCAR] ~r~È scaduto il tuo tempo come tutore della legge! -[C_PASS3:COPCAR] -~w~MINACCIA ELIMINATA! Ricompensa: ~1~$ +[C_COMP1:COPCAR] +Missione Vigilante livello 12 completata: valore massimo dell'armatura aumentato a 150. -[C_LEVEL:COPCAR] -~r~Hai lasciato fuggire i criminali! +[CLEVEL:COPCAR] +Missione Vigilante livello ~1~ -[C_RANG2:COPCAR] -~r~La radio della polizia non funziona in metropolitana! +{=================================== MISSION TABLE COUNT1 ===================================} -{=================================== MISSION TABLE CARS ===================================} +[CM1_A:COUNT1] +Mr. Vercetti? Ehi, hai comprato la vecchia tipografia? -[CARS_10:CARS] -~w~Sali su una macchina per iniziare la prova di guida o abbandona il parcheggio per annullare la missione. +[CM1_B:COUNT1] +Sì, il mio vecchio un tempo lavorava nel campo. -[CARS_12:CARS] -~w~Se abbandoni la macchina, fallirai la missione +[CM1_C:COUNT1] +Avrei voluto seguire le sue orme, ma... ho deciso di vivere diversamente. -[CARS_1:CARS] -~w~Porta uno dei clienti a fare un giro di prova. +[CM1_D:COUNT1] +Stai progettando di vendere il vecchio macchinario smontandolo in pezzi? -[CARS_2:CARS] -~w~Dovrai cercare di capire le esigenze di ogni cliente. +[CM1_E:COUNT1] +Ho pensato che potremmo stampare ancora qualcosa... un giornale, una rivista... -[CARS_3:CARS] -~w~E poi usare le tue abilità di guida per mostrare al cliente che la macchina è esattamente ciò che sta cercando. +[CM1_F:COUNT1] +Che merda, figliolo, roba di bassa qualità. Ho sempre sognato stampare soldi. Non è poi così difficile. -[CARS_5:CARS] -~w~Impressiona il cliente. +[CM1_G:COUNT1] +Sai, l'ho fatto su scala ridotta per anni. -[CARS_6:CARS] -~w~Il cliente è a terra! Scegli un'altra macchina! +[CM1_H:COUNT1] +Davvero? -[CARS_30:CARS] -~w~Torna al ~y~parcheggio~w~ per concludere l'affare! +[CM1_I:COUNT1] +Certo. Ma prima abbiamo bisogno di matrici di buona qualità. -[CARS_C1:CARS] -~w~Va bene amico, vuoi rompere le scatole agli sbirri eh? +[CM1_J:COUNT1] +Ma certo! C'è già un'organizzazione di falsificatori in azione in Florida. -[CARS_C2:CARS] -~w~Sì, quel tipo se l'è meritata! +[CM1_K:COUNT1] +Un'organizzazione? -[CARS_P1:CARS] -~w~Wow! Questa macchina è una bomba! +[CM1_L:COUNT1] +Sì. Beh, ho sentito solo delle voci. -[CARS_P2:CARS] -~w~Woohoo! +[CM1_M:COUNT1] +Conosco un tipo che si intende di voci... -[CARS_P3:CARS] -~w~La mia vecchia zia guida così! +[CM1_N:COUNT1] +Un tempo passavo le serate con lui, mentre pulivo i rulli... -[CARS_P4:CARS] -~w~Ci sono gli airbag? +[CM1_2A:COUNT1] +Accidenti che culo incredibile! -[CARS_M1:CARS] -~w~Ah, che bella guida tranquilla. +[CM1_2B:COUNT1] +Va bene, bellezza, sei tu che ci perdi! -[CARS_M2:CARS] -~w~Sai qual è il limite di velocità? +[CM1_2C:COUNT1] +Ehi, ciao amico, come butta? -[CARS_M3:CARS] -~w~Oddio! Finirai col farci morire! +[CM1_2D:COUNT1] +Che cosa sai della falsificazione? -[CARS_O1:CARS] -~w~Grandioso! Nessuna strada asfaltata ci può fermare! +[CM1_2E:COUNT1] +Oh, sto bene Paul, e a te? -[CARS_O2:CARS] -~w~Amico, tocchiamo il cielo con un dito! +[CM1_2F:COUNT1] +Vieni qua. -[CARS_O3:CARS] -~w~Che volo amico! +[CM1_2G:COUNT1] +Va bene! Va bene! Va bene! Sei ovviamente un tipo impegnato. -[CARS_SC:CARS] -~w~Vendita completata. Percentuale: ~1~$ Bonus di tempo: ~1~ secondi. +[CM1_2H:COUNT1] +Tutto ciò che so sul campo è che la Triade fornisce le matrici. -[CARS_SD:CARS] -~w~Livello ~1~ completato. Percentuale: ~1~$ Bonus di tempo: ~1~ secondi. +[CM1_2I:COUNT1] +Hanno una società di spedizioni nel porto, -[CARS_IR:CARS] -~1~ DI FILA! Bonus! ~1~$. +[CM1_2J:COUNT1] +il capo di certo saprà quando passeranno nuovamente delle matrici! -[CARS_RE:CARS] -~w~Un piccolo extra per il nostro miglior venditore! +[CM1_2K:COUNT1] +Grazie Paul. -[CARSIC1:CARS] -~w~Ho bisogno di qualcosa che sia molto difficile da inseguire, amico. +[CM1_2L:COUNT1] +Qual è il tuo problema, sei un maniaco! -[CARSIC2:CARS] -~w~Ho bisogno di un mezzo per stirare questi pedoni del cazzo. +[CM1_2M:COUNT1] +Dammi un altro drink, in fretta! -[CARSIP1:CARS] -~w~Questa bimba sembra un fulmine! +[CM1_3:COUNT1] +~g~Ti hanno visto! -[CARSIP2:CARS] -~w~Ragazzi, credo che questa bestia sappia persino volare! +[CM1_5:COUNT1] +~g~Incontrati con Kent Paul al Malibu Club! -[CARSIM1:CARS] -~w~Ho sentito che questi aggeggi sono facili da guidare. +[CNT1_1:COUNT1] +Chi sei? Oooof! Aaiieee! Non il viso! Non il viso! -[CARSIM2:CARS] -~w~Siccome sono stato operato, ho bisogno di una utilitaria. +[CM1_1:COUNT1] +~g~Vai alla compagnia marittima Chartered Libertine nel porto. -[CARSIO1:CARS] -~w~Ottima per andare fuoristrada! +[CM1_2:COUNT1] +~g~L'ufficiale delle spedizioni è in possesso delle informazioni che ti servono. -[CARSIO2:CARS] -~w~Un mio amico compie dei bei numeri con questa, l'adoro! +[CNT1_2:COUNT1] +OK, parlerò, parlerò! -[CARS_N1:CARS] -~w~Non ho intenzione di comprare questa ferraglia! +[CM1_6:COUNT1] +~g~Ritorna con le informazioni alla tipografia! -[CARS_N2:CARS] -~w~Davvero credevi che avrei comprato questo rottame? +{=================================== MISSION TABLE COUNT2 ===================================} -[CARS_N3:CARS] -~w~I venditori di macchine usate sono tutti uguali! +[CNT2_B1:COUNT2] +Bene, il corriere porterà le matrici al porto oggi stesso. -[CARS_Y1:CARS] -~w~La prendo! +[CNT2_B2:COUNT2] +Ho intenzione di intercettare il corriere, recuperare le matrici, far perdere le tracce e tornare qua. -[CARS_Y2:CARS] -~w~È perfetta! +[CNT2_B3:COUNT2] +Bene. A seconda di quanto bene vadano le cose, -[CARS_Y3:CARS] -~w~Hai appena fatto un affare! +[CNT2_B4:COUNT2] +potremmo avere cinque minuti per stampare soldi prima che l'associazione dei falsificatori ci trovi, o potremmo avere tutto l'anno. -[CARS_R1:CARS] -~w~Mi piace la macchina, ma non il colore. +[CNT2_B5:COUNT2] +In ogni caso, voglio veder bigliettoni verdi uscire cinque minuti dopo che sarò tornato. Tutto chiaro? -[CARS_R2:CARS] -~w~Vai a riverniciare la macchina! +[CNT2_B6:COUNT2] +Non preoccuparti, Tommy. Saremo pronti. -[CARS_D1:CARS] -~w~Mi piace, ma è conciata male! +[CNT2_B7:COUNT2] +Io e i ragazzi saremo in giro per il quartiere se mai dovessi avere bisogno di una mano con gli inseguitori. -[CARS_D2:CARS] -~w~Vai a riparare la macchina! +[CNT2_B8:COUNT2] +Ottimo: siete tutti pronti? Perfetto. Ci vediamo più tardi... -[CARS_F1:CARS] -~r~Hai distrutto la macchina! +[CNT2_01:COUNT2] +~g~Il ~r~corriere~g~ con le matrici arriverà fra pochi attimi al ~y~porto~g~ in elicottero. -[CARS_F2:CARS] -~r~Hai ucciso il cliente! +[CNT2_02:COUNT2] +~r~Il corriere è scappato con l'elicottero. -[CARS_F3:CARS] -~r~Ci hai messo troppo! Il cliente si è stufato! +[CNT2_03:COUNT2] +~r~Il corriere è arrivato a destinazione sano e salvo. Sei in ritardo! -[CARS_F4:CARS] -~r~Il cliente odia questa macchina! +[CNT2_04:COUNT2] +~r~Hai distrutto le matrici nell'esplosione! -[CARS_F5:CARS] -~r~Hai chiuso con la vendita delle macchine. +[CNT2_05:COUNT2] +~g~Hai preso le matrici. Riportale alla tipografia. -[CARS_F6:CARS] -~r~Il cliente odia la macchina, l'hai distrutta! +[CNT2_06:COUNT2] +~g~Il corriere è morto e ha lasciato cadere le matrici: raccoglile prima che lo faccia qualcun altro. -[CARS_F7:CARS] -~r~Il cliente odia la macchina, sei andato troppo veloce! +[CNT2_07:COUNT2] +~g~Una delle guardie ha raccolto le matrici: non lasciarlo scappare! -[CARS_F8:CARS] -~r~Il cliente odia la macchina, sei andato troppo piano! +[CNT2_08:COUNT2] +~g~Il ~r~corriere~g~ con le matrici è arrivato al porto. -[CARS_SA:CARS] -Vendita +[CNT2_4:COUNT2] +Faccende private, non sei il ben venuto. -[CARS_7:CARS] -~w~Sali su una ~b~macchina! +[CNT2_09:COUNT2] +BENI TIPOGRAFIA ACQUISITI -[CARS_RF:CARS] -~w~Capital Autos è sotto la tua 'protezione'. Ricordati di passare a prendere i pagamenti regolarmente. +[CNT2_10:COUNT2] +~g~La tipografia d'ora in poi genererà introiti per un massimo di ~1~$. Ricordati di recuperarli regolarmente. -{=================================== MISSION TABLE BIKE ===================================} +[CNT2_11:COUNT2] +~r~Le matrici adesso sono in fondo all'oceano! -[BIKE_10:BIKE] -~w~Sali su una moto per iniziare la prova di guida o abbandona il vicolo per annullare la missione. +{=================================== MISSION TABLE CUBAN1 ===================================} -[BIKE_12:BIKE] -~w~Se abbandoni la moto, fallirai la missione. +[CUB1_A:CUBAN1] +Sì amico? -[BIKE_1:BIKE] -~w~Porta uno dei clienti a fare un giro di prova. +[CUB1_B:CUBAN1] +Ehi, tranquillo papà, è venuto per me. Sei tu l'uomo? -[BIKE_2:BIKE] -~w~Dovrai cercare di capire le esigenze di ogni cliente. +[CUB1_C:CUBAN1] +Oh sì, sei tu l'uomo. Credo per lo meno, vero? -[BIKE_3:BIKE] -~w~E poi usare le tue abilità di guida per mostrare al cliente che la moto è esattamente ciò che sta cercando. +[CUB1_D:CUBAN1] +No, non credo. -[BIKE_5:BIKE] -~w~Impressiona il cliente. +[CUB1_E:CUBAN1] +Ah sì? Vieni qua, osso duro. -[BIKE_30:BIKE] -~w~Torna al ~y~negozio di moto~w~ per concludere l'affare! +[CUB1_F:CUBAN1] +Pensi di potermi prendere in giro? -[BIKE_C1:BIKE] -~w~Va bene amico, vuoi rompere le scatole agli sbirri eh? +[CUB1_G:CUBAN1] +Credi di poter fare lo stupido con me? -[BIKE_C2:BIKE] -~w~Sì, quel tipo se l'è meritata! +[CUB1_H:CUBAN1] +No, credo tu stia facendo abbastanza lo stupido per entrambi. -[BIKE_P1:BIKE] -~w~Sì! Questa moto è stupefacente! +[CUB1_I:CUBAN1] +Ehi figliolo, ha detto che sei stupido. -[BIKE_P2:BIKE] -~w~Bene! +[CUB1_J:CUBAN1] +E io lo chiamo femminuccia, papà. -[BIKE_P3:BIKE] -~w~Forza, non sai andare più veloce di così? +[CUB1_K:CUBAN1] +Guarda un po' come va in giro vestito. -[BIKE_P4:BIKE] -~w~Attento! +[CUB1_L:CUBAN1] +Che cos'è questa? L'ultima moda femminile per la notte? -[BIKE_M1:BIKE] -~w~Ah, che bella guida tranquilla. +[CUB1_M:CUBAN1] +Perché un osso duro come te si veste da donnina? -[BIKE_M2:BIKE] -~w~Sai qual è il limite di velocità? +[CUB1_N:CUBAN1] +Hai le mutandine come le signorine, eh? -[BIKE_M3:BIKE] -~w~Oddio! Finirai col farci morire! +[CUB1_O:CUBAN1] +Cos'hai contro le donne? Preferisci gli uomini, amico? -[BIKE_O1:BIKE] -~w~Grandioso! Nessuna strada asfaltata ci può fermare! +[CUB1_P:CUBAN1] +Mi piacciono le donne! Tutte le donne! Adoro mia madre, chico. -[BIKE_O2:BIKE] -~w~Amico, tocchiamo il cielo con un dito! +[CUB1_Q:CUBAN1] +Va bene, va bene, ti credo sulla parola. -[BIKE_O3:BIKE] -~w~Che acrobazie da pazzi amico! +[CUB1_R:CUBAN1] +Sai guidare, amigo? -[BIKE_SC:BIKE] -~w~Vendita completata. Percentuale: ~1~$ Bonus di tempo: ~1~ secondi. +[CUB1_S:CUBAN1] +Certo... come una donna. -[BIKE_IR:BIKE] -~1~ DI FILA! Bonus! ~1~$. +[CUB1_T:CUBAN1] +Molto divertente. Mi piaci, ragazzo. Forse ci puoi aiutare. -[BIKE_RE:BIKE] -~w~Un piccolo extra per il nostro miglior venditore! +[CUB1_U:CUBAN1] +Potresti provare di essere un uomo. Huh? -[BIKE_RF:BIKE] -~w~Hogs & Cogs è sotto la tua 'protezione'. Ricordati di passare a prendere i pagamenti regolarmente. +[CUB1_V:CUBAN1] +Porta fuori la barca. -[BIKEIC1:BIKE] -~w~Ho bisogno di qualcosa che sia molto difficile da inseguire, amico. +[CUB1_W:CUBAN1] +Mostra di avere due grossi cojones, -[BIKEIC2:BIKE] -~w~Ho bisogno di un mezzo per fargliela pagare a quei fottuti pedoni. +[CUB1_X:CUBAN1] +e non piccoli minuscoli chiquita. -[BIKEIP1:BIKE] -~w~Questo razzo sembra veloce! +[CUB1_02:CUBAN1] +OK amico, trattala come una vera signora. -[BIKEIP2:BIKE] -~w~Voglio qualcosa che impressioni le tipe! +[CUB1_03:CUBAN1] +Non male, sei un vero uomo. -[BIKEIM1:BIKE] -~w~Ho sentito che questi aggeggi sono facili da guidare. +[CUB1_04:CUBAN1] +Accidenti, hai davvero due grossi cojones, amigo. -[BIKEIM2:BIKE] -~w~Sono ancora alle prime armi, ho bisogno di una moto meno potente. +[CUB1_05:CUBAN1] +Amigo, sei un vero uomo. -[BIKEIO1:BIKE] -~w~Ottima per andare fuoristrada! +[CUB1_06:CUBAN1] +E tu ti reputi un uomo? -[BIKEIO2:BIKE] -~w~Questi affari possono fare delle acrobazie impressionanti, vero? +[CUB1_07:CUBAN1] +Sei un piccolo gattino impaurito, bamboccio: vai a piangere dalla mamma! -[BIKE_N1:BIKE] -~w~Non ho intenzione di comprare questa ferraglia! +[CUB1_08:CUBAN1] +Sei un grande spreco di spazio. Cammini come un uomo, parli come un uomo, ma guidi come un idiota. -[BIKE_N2:BIKE] -~w~Davvero credevi che avrei comprato questo rottame? +[CUB1_09:CUBAN1] +Amico, sei tu l'uomo. Mi piaci, amico. Mi piaci molto. -[BIKE_N3:BIKE] -~w~I venditori di moto usate sono tutti uguali! +[CUB1_10:CUBAN1] +A qualsiasi ora, amico, perché tu hai i cojones e tutti i miei amici hanno grandi cajones. -[BIKE_Y1:BIKE] -~w~La prendo! +[CUB1_11:CUBAN1] +~r~Hai ucciso Rico! -[BIKE_Y2:BIKE] -~w~È la moto perfetta per me! +[CUB1_12:CUBAN1] +Passa per il primo punto di controllo per cominciare il test. -[BIKE_Y3:BIKE] -~w~Hai appena fatto un affare! +[CUB1_14:CUBAN1] +Torna alla barca! -[BIKE_R1:BIKE] -~w~Mi piace la moto ma non il colore. +[CUB1_15:CUBAN1] +~r~Sei troppo lento, amico. -[BIKE_R2:BIKE] -~w~Vai a riverniciare la moto! +[CUB1_01:CUBAN1] +Ehi, sono Rico. Sei tu l'uomo con i grandi cojones? -[BIKE_D1:BIKE] -~w~Mi piace, ma è conciata male! +[CUB1_13:CUBAN1] +~g~Hai tre minuti per completare il percorso. -[BIKE_D2:BIKE] -~w~Fai riparare la moto! +{=================================== MISSION TABLE CUBAN2 ===================================} -[BIKE_F1:BIKE] +[CUB2_A:CUBAN2] +Un cafecito, por favor, Alberto... + +[CUB2_N:CUBAN2] +Nessun problema, Tommy. + +[CUB2_B:CUBAN2] +Papà! Un gran problema! + +[CUB2_O:CUBAN2] +Umberto, figlio mio, cosa succede? + +[CUB2_C:CUBAN2] +Gli Haitiani! Odio quei maledetti Haitiani! + +[CUB2_D:CUBAN2] +Hanno osato crearmi problemi per l'ultima vota! + +[CUB2_E:CUBAN2] +Questi Haitiani. Facciamoli fuori! + +[CUB2_F:CUBAN2] +Avremo bisogno di supporto. + +[CUB2_G:CUBAN2] +Ho già perso degli hermanos là fuori. + +[CUB2_H:CUBAN2] +Amigo, tu guidi bene! + +[CUB2_I:CUBAN2] +Per una donna, giusto? + +[CUB2_J:CUBAN2] +Non è il momento degli scherzi! + +[CUB2_K:CUBAN2] +Forza, guida nuovamente per me! + +[CUB2_L:CUBAN2] +Porta i miei ragazzi in posizione e faremo fuori quegli Haitiani! + +[CUB2_M:CUBAN2] +Si sono messi contro me, hanno scherzato con il pezzo grosso della città! + +[CUB2_01:CUBAN2] +Troppo piccola, amico, devi prendere una macchina più grande. + +[CUB2_02:CUBAN2] +Abbiamo bisogno di rinforzi dal café! + +[CUB2_03:CUBAN2] +~g~Prendi una macchina e recupera i Cubani di fronte al café Robina. + +[CUB2_04:CUBAN2] +~g~Scarica i Cubani sul luogo dello scontro. + +[CUB2_05:CUBAN2] +Fai fuori quel codardo di un cecchino! + +[CUB2_07:CUBAN2] +Combattono come donnicciole! Mettetevi al riparo! + +[CUB2_09:CUBAN2] +Cecchino sul tetto! + +[CUB2_11:CUBAN2] +~r~Idiota, avevamo bisogno della macchina. + +[CUB2_12:CUBAN2] +Ehi amigo! Sono felice che ce l'hai fatta. + +[CUB2_13:CUBAN2] +Covo puzzolente di Haitiani, li uccideremo tutti! + +[CUB2_14:CUBAN2] +CAAARICAAAA! + +[CUB2_15:CUBAN2] +Adesso, fratelli, CAAARICAAAA! + +[CUB2_16:CUBAN2] +Tommy, abbiamo provato il nostro coraggio! + +[CUB2_17:CUBAN2] +Rubiamo quel van pieno di droga e scappiamo in fretta! + +[CUB2_18:CUBAN2] +~g~Recupera una macchina per caricare i Cubani. + +[CUB2_19:CUBAN2] +Combatteremo come uomini! + +[CUB2_21:CUBAN2] +Combattiamo come uomini con grandi cojones! + +[CUB2_22:CUBAN2] +~g~Elimina il resto degli Haitiani così i Cubani potranno avanzare. + +[CUB2_23:CUBAN2] +~g~Little Haiti sarà piena di Haitiani desiderosi di pareggiare il conto con i Cubani. Guardati la schiena. + +[CUB2_24:CUBAN2] +~g~Torna al Café Robina con il van e parcheggialo sul retro. + +[CUB2_25:CUBAN2] +UCCIDI TUTTI GLI HAITIANI!!! + +{=================================== MISSION TABLE CUBAN3 ===================================} + +[CUB3_A:CUBAN3] +Alberto. Un caffè, senor. + +[CUB3_B:CUBAN3] +Papà, non servire questo serpente nascosto nella paglia. + +[CUB3_C:CUBAN3] +Sei un doppiogiochista, Tommy! + +[CUB3_D:CUBAN3] +O fai il doppio gioco o sei un perdente, ragazzo! + +[CUB3_E:CUBAN3] +Gli Haitiani! Merda, stanno ridendo di me. + +[CUB3_F:CUBAN3] +Ehi. Calmati. Qual è il tuo problema? + +[CUB3_G:CUBAN3] +Ridono di me, Tommy! Di me! + +[CUB3_H:CUBAN3] +Umberto Robina! Fanno tutto ciò che vogliono! + +[CUB3_I:CUBAN3] +Nessuno fa ciò che vuole, Umberto, fanno ciò che tu permetti loro di fare. + +[CUB3_J:CUBAN3] +Cosa? + +[CUB3_K:CUBAN3] +Vuoi che mi occupi di qualcuno? + +[CUB3_L:CUBAN3] +Posso pensarci io, ma ti costerà. + +[CUB3_M:CUBAN3] +Lo so che siamo come fratelli, ma stiamo parlando di affari. + +[CUB3_N:CUBAN3] +Tommy, sei un vero uomo. Un vero businessman, un gentleman. + +[CUB3_O:CUBAN3] +Questi Haitiani. Hanno un carico di merce in arrivo via mare, roba di prima qualità. + +[CUB3_P:CUBAN3] +La prendiamo e li facciamo fuori. + +[CUB3_Q:CUBAN3] +Tu la prendi, io ti copro. Come mio fratello, come mio figlio. + +[CUB3_R:CUBAN3] +Preferisco i soldi che saltellare sulle tue gambe, amigo. + +[CUB3_01:CUBAN3] +Ehi Rico, bella barca. Sei pronto? + +[CUB3_03:CUBAN3] +~g~Raccogli tutte le valigette piene di soldi e droga. + +[CUB3_04:CUBAN3] +~g~Riporta la droga e i soldi a Umberto. + +[CUB3_05:CUBAN3] +Sì Tommy. Vedi di sparare come si deve oggi, + +[CUB3_06:CUBAN3] +non voglio riempire la mia barca di buchi, OK? + +[CUB3_07:CUBAN3] +~g~Incontrati con Rico, lui ti porterà fino alla locazione dell'incontro. + +[CUB3_02:CUBAN3] +~g~UCCIDI TUTTI GLI HAITIANI SULLE BARCHE!!! + +[CUB3_08:CUBAN3] +Uh oh... un gruppo di Cubani. Siamo sotto attacco! + +{=================================== MISSION TABLE CUBAN4 ===================================} + +[CUB4_A:CUBAN4] +Ehi signorine, sapete che cosa voglio fare? + +[CUB4_B:CUBAN4] +Voglio far fuori un Haitiano. E poi? + +[CUB4_C:CUBAN4] +Poi voglio fare l'amore come un vero uomo. + +[CUB4_D:CUBAN4] +Capito chica? Proprio così. + +[CUB4_E:CUBAN4] +Fallito! + +[CUB4_F:CUBAN4] +Cafone. + +[CUB4_G:CUBAN4] +Ehi bella, non ti toccherei neanche con un bastone da lontano! + +[CUB4_H:CUBAN4] +Umberto Robina, a lui piacciono le vere donne! Non delle capre in minigonna! + +[CUB4_I:CUBAN4] +Tommy! Tommy, ti voglio bene, davvero! Andiamo! + +[CUB4_J:CUBAN4] +Dove? Non posso prendere prima una tazza di caffè? + +[CUB4_K:CUBAN4] +Non c'è tempo per il caffè! Inoltre, io l'ho già preso. + +[CUB4_L:CUBAN4] +Dobbiamo far fuori gli Haitiani. + +[CUB4_M:CUBAN4] +Tommy, come fai a uccidere un serpente? + +[CUB4_N:CUBAN4] +Lo mordi sul culo! Ah ah ah! + +[CUB4_O:CUBAN4] +Se lo dici te, Umberto. + +[CUB4_P:CUBAN4] +Tommy, recupera una piccola auto Haitiana. + +[CUB4_Q:CUBAN4] +Quando ce l'hai, torna qui e carica il mio ragazzo, + +[CUB4_R:CUBAN4] +Pepe, e portalo fino agli Haitiani. + +[CUB4_S:CUBAN4] +Poi aggiri l'impianto di lavorazione degli Haitiani e utilizzi il solvente come esplosivo. + +[CUB4_T:CUBAN4] +Boom! Bye bye! + +[CUB4_U:CUBAN4] +Umberto, e tu? + +[CUB4_V:CUBAN4] +Oh, io resto nelle retrovie e controllo il café con papà. + +[CUB4_W:CUBAN4] +Non si sente molto bene, sai? + +[CUB4_02:CUBAN4] +~g~Le bombe verranno piazzate con un timer di 45 secondi. + +[CUB4_04:CUBAN4] +~r~Hai allarmato la base, adesso non riusciremo mai a entrare! + +[CUB4_07:CUBAN4] +Il solvente è sul retro, amigo. + +[CUB4_08:CUBAN4] +Hola, Amigos. + +[CUB4_09:CUBAN4] +Bueno. Haitiane Putas. Muerte. + +[CUB4_10:CUBAN4] +Vamos. + +[CUB4_11:CUBAN4] +Vamos davvero. + +[CUB4_12:CUBAN4] +Ehi, abbiamo bisogno di un'auto degli Haitiani! + +[CUB4_13:CUBAN4] +Oye, andiamo a trovare i nostri muchachos! + +[CUB4_14:CUBAN4] +Seguimi, compadres. + +[CUB4_15:CUBAN4] +OK, vai dentro... + +[CUB4_16:CUBAN4] +Io posizionerò le bombe, coprimi! + +[CUB4_17:CUBAN4] +CORRI! + +[CUB4_18:CUBAN4] +Amico, questa sì che è una bella parte della città... + +[CUB4_19:CUBAN4] +Questo luogo è una fogna. + +[CUB4_20:CUBAN4] +Avevo una bella donna... viveva da queste parti. + +[CUB4_21:CUBAN4] +Lo sai, fanno delle buone pizze da queste parti. + +[CUB4_22:CUBAN4] +Whoa, amico. Guidi come un cavallo impazzito! + +[CUB4_23:CUBAN4] +Ti sei perso, amico? + +[CUB4_24:CUBAN4] +Hai lasciato indietro Pepe, vai a riprenderlo! + +[CUB4_03:CUBAN4] +~g~Resta in macchina fino a quando questa non sarà parcheggiata all'interno. + +[CUB4_26:CUBAN4] +~g~Prendi Pepe, dirigiti a nord verso Little Haiti e ruba una macchina Voodoo. + +[CUB4_27:CUBAN4] +~g~Raggiungi Rico e gli altri Cubani. + +[CUB4_28:CUBAN4] +~g~Unisciti agli altri Cubani presso la fabbrica di droga Haitiana. + +[CUB4_29:CUBAN4] +~g~Cammina su ogni segnalino per posizionare una bomba. + +[CUB4_30:CUBAN4] +~g~Dopo aver posizionato tutte e tre le bombe, scappa dalla fabbrica prima che esploda. + +[CUB4_31:CUBAN4] +~g~Scappa dalla fabbrica!!! + +[CUB4_32:CUBAN4] +~g~Parcheggia l'auto nel punto segnalato ed esci. + +[CUB4_06:CUBAN4] +~r~Non ti sei allontanato a sufficienza dalla base e abbiamo dovuto interrompere l'esplosione! + +{=================================== MISSION TABLE FINALE ===================================} + +[FIN_1A:FINALE] +Vieni qui brutto doppiogiochista di merda! + +[FIN_1B:FINALE] +Ti faccio a pezzi, traditore del cazzo! + +[FIN_1C:FINALE] +Questo è l'ultimo ballo per Lance Vance! + +[FIN_2B:FINALE] +Oh, ma davvero! + +[FIN_2C:FINALE] +Te l'avevo detto che ne avevo avuto abbastanza a scuola! + +[FIN_3:FINALE] +Adesso chi ti coprirà il culo, eh Tommy? + +[FIN_4:FINALE] +Sei storia, Tommy, storia! + +[FIN_5:FINALE] +Hai scelto il lato sbagliato, Lance... + +[FIN_11A:FINALE] +Sonny, mi hai rubato quindici anni di vita... + +[FIN_11B:FINALE] +E adesso te la farò pagare! + +[FIN_12A:FINALE] +Non hai ancora capito, vero? + +[FIN_12B:FINALE] +Io ti POSSIEDO, Tommy. + +[FIN_12C:FINALE] +Quei quindici anni erano miei! + +[FIN_13:FINALE] +Prendetelo ragazzi, non ha mai capito niente. + +[FIN1_01:FINALE] +Cosa sta succedendo? + +[FIN1_02:FINALE] +Tommy! Oh bene, bene. Ascolta, ascolta. Uh, ascolta. + +[FIN1_03:FINALE] +A me piacciono i pesci. Adoro i pesci. + +[FIN1_04:FINALE] +Mi piacciono quando nuotano in una boccia o come cibo in un piatto, + +[FIN1_05:FINALE] +ma per quanto li ami, non voglio dormire in loro compagnia. + +[FIN1_06:FINALE] +Va bene, ma adesso i tuoi fratelli italiani stanno venendo per mettermi ai piedi delle belle scarpe in cemento e io... + +[FIN1_07:FINALE] +Sta zitto Ken. Siediti. + +[FIN1_08:FINALE] +Lance, di che diavolo stai parlando? + +[FIN1_09:FINALE] +Sono i tuoi amici del nord, Tommy. Non sono felici di cosa hai fatto al loro uomo. + +[FIN1_10:FINALE] +Oggi verranno giù per questioni di lavoro. + +[FIN1_11:FINALE] +Ci hanno messo di più di quanto credessi... + +[FIN1_12:FINALE] +Ragazzi, dobbiamo essere molto chiari. Non voglio che ci siano dubbi sul fatto che questa è la mia operazione. MIA! + +[FIN1_13:FINALE] +Ken, recupera la prima partita di soldi falsi e metti venti milioni in delle valigette. + +[FIN1_14:FINALE] +Lance, raduna i ragazzi... + +[FIN2_01:FINALE] +Tommy! + +[FIN2_02:FINALE] +Cosa? Niente abbraccio per un vecchio amico? + +[FIN2_03:FINALE] +Sono stato per quindici anni fuori dal giro, + +[FIN2_04:FINALE] +sono un po' arrugginito in fatto di etichetta familiare. + +[FIN2_05:FINALE] +Sempre arrabbiato, vero Tommy? + +[FIN2_06:FINALE] +Non ti avevo detto che il tuo carattere ti avrebbe messo nei guai, eh? + +[FIN2_07:FINALE] +Ci sono venti milioni in quelle valigette... + +[FIN2_08:FINALE] +Quanti hai detto? Dieci? No, undici uomini. + +[FIN2_09:FINALE] +È così che sei diventato il macellaio di Harwood! Eh eh eh! + +[FIN2_10:FINALE] +Mi hai inviato per uccidere un uomo, UN UOMO. Sapevano che stavo arrivando Sonny... + +[FIN2_11:FINALE] +Modera il tono. + +[FIN2_12:FINALE] +Qualcuno potrebbe pensare che stai incolpando me per le sfortunate circostanze. + +[FIN2_13:FINALE] +Prendi i fottuti soldi... + +[FIN2_14:FINALE] +Prendi i fottuti soldi? + +[FIN2_15:FINALE] +Lo sai, Tommy? Ho fatto quello che ho potuto per te. Ho tirato i fili, ho chiesto favori. + +[FIN2_16:FINALE] +Ero tuo amico, Tommy. Pensavo che avresti avuto buon senso, che avresti capito cosa è bene per il business. + +[FIN2_17:FINALE] +Mi fidavo di te, Tommy. E tu mi hai deluso. + +[FIN2_18:FINALE] +Ma alla fine qualcuno nella tua organizzazione del cazzo ha capito come si fa il business. + +[FIN2_19:FINALE] +Non è vero, Lance? + +[FIN2_20:FINALE] +Mi dispiace Tommy. Questa è Vice City. Questo è il suo business. + +[FIN2_21:FINALE] +Ci hai venduto... + +[FIN2_22:FINALE] +No. Ho venduto TE, Tommy, ho venduto TE. + +[FIN2_23:FINALE] +I soldi veri sono di sopra nella cassaforte. + +[FIN2_24:FINALE] +Allora Tommy, questo era il grande piano? + +[FIN2_25:FINALE] +Pensavi davvero che avrei preso i soldi finti? + +[FIN2_26:FINALE] +Salva la faccia e scappa con la coda tra le gambe! + +[FIN2_27:FINALE] +No. + +[FIN2_28:FINALE] +Volevo solo farti incazzare prima di ucciderti. + +[FIN3_01:FINALE] +Tommy? + +[FIN3_02:FINALE] +Oh mio Dio, Tommy! Che cosa è successo? + +[FIN3_03:FINALE] +Che cosa ti sembra sia successo? + +[FIN3_04:FINALE] +Mi sembra ti si sia rovinato l'abito! + +[FIN3_05:FINALE] +Accidenti, Tommy, era così bello! Tommy, che diavolo è successo? + +[FIN3_06:FINALE] +Ho avuto una divergenza di vedute con un socio in affari, sai come vanno queste cose. + +[FIN3_07:FINALE] +Tommy, se io ho una divergenza con un socio, gli mando una lettera di insulti. + +[FIN3_08:FINALE] +Forse gli piscio nella casella della posta. Ma non do il via alla terza guerra mondiale! + +[FIN3_09:FINALE] +Lo sai, forse dovresti parlare con il mio strizzacervelli... + +[FIN3_10:FINALE] +Quello stupido idiota, Lance... + +[FIN3_11:FINALE] +Tommy, non mi è mai piaciuto quel tipo, OK? + +[FIN3_12:FINALE] +È nevrotico, insicuro, egocentrico... quel tipo è un vero stronzo! + +[FIN3_13:FINALE] +Sono felice che l'hai fatto fuori! + +[FIN3_14:FINALE] +Non penso che riceveremo ulteriori problemi dal nord... + +[FIN3_15:FINALE] +...fondamentalmente perché non c'è più un 'nord'. + +[FIN3_16:FINALE] +Adesso è tutto a sud. + +[FIN3_17:FINALE] +Aspetta, vuoi forse dire ciò che penso io, caro il mio Tommy? + +[FIN3_18:FINALE] +Cosa credi che significhi? + +[FIN3_19:FINALE] +Che siamo in carica... cioè, che sei in carica! Oh Tommy... + +[FIN3_20:FINALE] +Lo sai, Ken, questo potrebbe essere l'inizio di uno splendido rapporto lavorativo... + +[FIN3_21:FINALE] +Dopo tutto, tu sei un convincente, diffamante, fottuto ladro. + +[FIN3_22:FINALE] +e io sono uno psicopatico assassino convinto e uno spacciatore. + +[FIN3_23:FINALE] +Lo so, non è meraviglioso? + +[FIN_B1:FINALE] +~g~Uccidi ~y~Vance~g~, il fottuto traditore. + +[FIN_B2:FINALE] +~g~Trova ~p~Sonny~g~ e metti la parola fine a questa storia. + +[FIN_B3:FINALE] +~g~La Mafia sta cercando di rubare i tuoi soldi. Difendi la cassaforte. + +[FIN_B4:FINALE] +~g~Sei prossimo alla morte: recupera della ~w~salute~g~ dal basso. + +[FIN_B5:FINALE] +~g~La Mafia sta rubando i tuoi soldi. Difendi la ~c~cassaforte~g~. + +[FIN_B7:FINALE] +~r~La Mafia ha rubato i tuoi soldi! + +[DEFSAFE:FINALE] +~g~Ritorna alla cassaforte e difendila. + +{=================================== MISSION TABLE FIRETRK ===================================} + +[F_PASS1:FIRETRK] +Incendio spento! + +[F_FAIL2:FIRETRK] +~r~Sei arrivato tardi! + +[F_CANC:FIRETRK] +~r~Missione Pompieri annullata! + +[F_EXTIN:FIRETRK] +INCENDI: + +[F_START:FIRETRK] +~g~Veicolo in fiamme avvistato in ~a~. Vai a spegnere il fuoco. + +[SIREN_1:FIRETRK] +Per attivare la sirena di questo veicolo premi il ~h~~k~~VEHICLE_HORN~~w~. + +[SIREN_2:FIRETRK] +Per attivare la sirena di questo veicolo premi il ~h~~k~~VEHICLE_HORN~~w~. + +[FIREPRO:FIRETRK] +Missione Camion dei pompieri livello 12 completata: adesso sei permanentemente ignifugo!!! + +[F_FAIL1:FIRETRK] +Missione Camion dei pompieri terminata. + +[F_STAR1:FIRETRK] +~g~Veicoli in fiamme presso l'area ~a~. Vai a spegnere l'incendio. + +[SPRAY_4:FIRETRK] { reVC update } +Premi il tasto ~h~~k~~VEHICLE_FIREWEAPON~~w~ per sparare con il cannone ad acqua e la ~h~~k~~VEHICLE_TURRETLEFT~~w~ e ~h~~k~~VEHICLE_TURRETRIGHT~~w~ per mirare. + +[SPRAY_1:FIRETRK] { reVC update } +Premi il tasto ~h~~k~~VEHICLE_FIREWEAPON~~w~ per sparare con il cannone ad acqua e la ~h~~k~~VEHICLE_TURRETLEFT~~w~ e ~h~~k~~VEHICLE_TURRETRIGHT~~w~ per mirare. + +{=================================== MISSION TABLE GENERA1 ===================================} + +[GEN1_A:GENERA1] +Mr. Vercetti! + +[GEN1_B:GENERA1] +Colonnello. + +[GEN1_D:GENERA1] +No, grazie. + +[GEN1_E:GENERA1] +Mi vergogno ad ammettere che una delle cause dei nostri problemi comuni sembra sia stata la linguaccia di una persona di cui credevo di potermi fidare. + +[GEN1_F:GENERA1] +Mi sono tenuto Gonzalez per anni, ma ora la sua incompetenza ha raggiunto il fondo. + +[GEN1_G:GENERA1] +Sarebbe solo un bene se eliminassi Gonzalez... + +[GEN1_H:GENERA1] +È stato lui? A me importa solo dei miei soldi. + +[GEN1_I:GENERA1] +Questa gentilezza verrà ricompensata dopo troveremo insieme i tuoi soldi. + +[GEN1_J:GENERA1] +Lo troverai nella sua Penthouse, probabilmente mezzo ubriaco. Usa questo... + +[GEN1_06:GENERA1] +Eeek! Ha una motosega! + +[GEN1_07:GENERA1] +Stammi lontano, brutto bastardo! + +[GEN1_08:GENERA1] +Oddio santo, ho distrutto la mia vita e il mio look! + +[GEN1_10:GENERA1] +Ho deciso di chiudere quella tua maledetta boccaccia! + +[GEN1_11:GENERA1] +Smettila di correre, brutto grassone! + +[GEN1_12:GENERA1] +Stai fermo, così la facciamo finita! + +[GEN1_13:GENERA1] +Smettila di strillare, non gliene frega a nessuno, grassone! + +[GEN1_C:GENERA1] +Grazie per essere venuto. Siediti. Vuoi dell'aragosta? + +[GEN1_05:GENERA1] +~g~Uccidi Gonzalez! + +[GEN1_09:GENERA1] +Ti pagherò doppio, Tommy, DOPPIO! + +[GEN1_18:GENERA1] +~r~Gonzalez ha raggiunto sano e salvo la stazione di polizia! + +[GEN1_19:GENERA1] +~g~La polizia di Vice City ti sta inseguendo! + +[GEN1_20:GENERA1] +~g~Prendi un veicolo. + +[GEN1_21:GENERA1] +~g~Raggiungi il ~h~Pay 'N' Spray~g~ in ~h~Vice Point~g~. + +[GEN1_22:GENERA1] +~g~Guida il tuo veicolo attraverso il carrozziere per perdere il ~h~livello di sospetto~g~, ~h~riparare~g~ e ~h~ricolorare~g~ il mezzo. Costo: ~h~100$~g~. Questa volta è gratis. + +[GEN1_01:GENERA1] +Quando corri, tieni premuto il ~o~tasto |~w~ per preparare un attacco corpo a corpo. + +[GEN1_02:GENERA1] +Quando corri, tieni premuto il ~x~tasto /~w~ per preparare un attacco corpo a corpo. + +[GEN1_03:GENERA1] +Quando corri, tieni premuto il ~h~tasto R1~w~ per preparare un attacco corpo a corpo. + +[GEN1_14:GENERA1] +Rilascia il ~h~~k~~PED_FIREWEAPON~~w~ per eseguire l'attacco. + +[GEN1_15:GENERA1] +Rilascia il ~h~~k~~PED_FIREWEAPON~~w~ per eseguire l'attacco. + +[GEN1_16:GENERA1] +Rilascia il ~h~~k~~PED_FIREWEAPON~~w~ per eseguire l'attacco. + +[GEN1_23:GENERA1] +~g~Passa per le porte per tornare al piano terra. + +{=================================== MISSION TABLE GENERA2 ===================================} + +[COL2_A:GENERA2] +Tommy! Vieni qui da me. + +[COL2_B:GENERA2] +Non ti sembra delizioso, vero? Lingua di Tapia? + +[COL2_C:GENERA2] +Eerr... No, no grazie. + +[COL2_D:GENERA2] +Tommy, sei come un vento fresco della pampa che mi libera dall'olezzo della corruzione, + +[COL2_E:GENERA2] +benché mi addolori la recente dipartita, devo continuare come sempre con il mio lavoro. + +[COL2_F:GENERA2] +Non mi sembra ci stiamo avvicinando ai miei soldi... + +[COL2_G:GENERA2] +Tommy, amico mio, non sei più a Liberty. Qui le cose vanno in modo diverso. + +[COL2_H:GENERA2] +Continuerò le mie ricerche, ma nel frattempo ho un interessante accordo da proporti. + +[COL2_I:GENERA2] +Un favore per un amico, Cortez. + +[COL2_J:GENERA2] +Sei un vero amico, Tommy, Ero certo che non mi avresti deluso. + +[COL2_K:GENERA2] +Ho bisogno che tu incontri un corriere che mi ha recuperato una tecnologia di cui ho bisogno... + +[COL2_1:GENERA2] +La pioggia, è così très umido in questo periodo dell'anno... + +[COL2_2:GENERA2] +Cosa? + +[COL2_3:GENERA2] +Ah, comment? + +[COL2_4:GENERA2] +Ascolta, mi manda Cortez. Dammi quei maledetti chip. + +[COL2_5:GENERA2] +Oh... d'accord. + +[COL2_B1:GENERA2] +~g~Incontra il corriere al Mall. + +[COL2_B2:GENERA2] +~g~Il correre sta scappando con i chip: non farlo scappare! + +[COL2_B3:GENERA2] +~g~Porta i chip al Colonnello. + +[COL2_F1:GENERA2] +~r~Hai ucciso il contatto! + +[COL2_F2:GENERA2] +~r~Il corriere è morto. Raccogli i chip. + +[COL2_6A:GENERA2] +Fermo, brutto maiale imperialista americano! Questa è proprietà del governo francese. Passamela! + +[BLIPHLP:GENERA2] +Se il segnale sul radar è un triangolo verso l'alto, significa che il bersaglio è in posizione più elevata rispetto al giocatore. + +[COL2_F3:GENERA2] +~r~I chip adesso riposano in fondo all'oceano. + +[COL2_F4:GENERA2] +~r~Il corriere è scappato! Non sei riuscito a recuperare i chip. + +{=================================== MISSION TABLE GENERA3 ===================================} + +[GEN3_A:GENERA3] +Thomas, grazie per essere venuto. + +[GEN3_B:GENERA3] +Perdonami se giungo subito al punto. + +[GEN3_C:GENERA3] +Diaz mi ha chiesto di sovrintendere una piccola transizione di lavoro. + +[GEN3_D:GENERA3] +Speriamo vada meglio dell'ultima... + +[GEN3_E:GENERA3] +Ed è per questo che ho pensato a te, amico. + +[GEN3_F:GENERA3] +Ho lasciato un po' di supporto al parcheggio multipiano. + +[GEN3_G:GENERA3] +Raccogli il materiale, poi raggiungi e sorveglia gli uomini di Diaz all'incontro. + +[GEN3_H:GENERA3] +Gracias, amigo. + +[GEN3_1:GENERA3] +Ami l'azione, vedo... + +[GEN3_2:GENERA3] +Senti, ti capita mai di fare qualcos'altro che non sia seguirmi dappertutto? Perché non vieni con me e mi dimostri di servire a qualcosa? + +[GEN3_3:GENERA3] +Potrei anche farlo. A proposito, mi chiamo Lance. + +[GEN3_5:GENERA3] +Devi essere il nuovo uomo di Cortez. + +[GEN3_6:GENERA3] +Fino a quando non mi capiteranno opportunità più lucrose. + +[GEN3_7:GENERA3] +Arriveranno fra pochi minuti: meglio trovare un buon punto dove appostarsi... + +[GEN3_8:GENERA3] +OK! Io prendo il balcone, tu prendi il tetto dall'altra parte del cortile. + +[GEN3_9:GENERA3] +Sono vivo, brutti stronzi! E tutto grazie a te! Come ti chiami? + +[GEN3_10:GENERA3] +Tommy. + +[GEN3_11:GENERA3] +Ci incontreremo di nuovo, credo! + +[GEN3_12:GENERA3] +Dove diavolo è andato Lance? Merda... + +[GEN3_14:GENERA3] +Tommy! Ho bisogno di aiuto! + +[GEN3_15:GENERA3] +Non preoccuparti, ti copro io! + +[GEN3_16:GENERA3] +Gli uomini di Diaz si stanno facendo massacrare! + +[GEN3_19:GENERA3] +~g~Haitiani! Stanno mandando a monte l'affare! Proteggi Diaz! + +[GEN3_20:GENERA3] +~g~Entra nel parcheggio multipiano e recupera ciò che il Colonnello ha lasciato per te. + +[GEN3_22:GENERA3] +Salute di Diaz: + +[GEN3_23:GENERA3] +~g~Hai lasciato Lance indietro! Vallo a prendere! + +[GEN3_25:GENERA3] +~r~Lance è morto! + +[GEN3_28:GENERA3] +~g~Riporta la valigetta a Diaz. + +[GEN3_29:GENERA3] +~g~Raccogli la valigetta e riportala a Diaz. + +[GEN3_30:GENERA3] +~r~È scappato con i soldi! Diaz ti strapperà le palle per questo! + +[GEN3_33:GENERA3] +~r~Dovresti proteggere Diaz e i suoi uomini, non sparargli addosso! + +[GEN3_34:GENERA3] +~r~Non ci sarà nessun accordo se spari ai Cubani! + +[GEN3_35:GENERA3] +~g~Ha rubato i soldi di Diaz! + +[GEN3_36:GENERA3] +~g~Prendi la moto, inseguilo e recupera i soldi di Diaz! + +[GEN3_37:GENERA3] +~g~Stanno arrivando i Cubani. Assicurati che niente vada storto e proteggi Diaz e Lance. + +[GEN3_38:GENERA3] +~r~Diaz è morto! Non sei riuscito a proteggerlo! + +[GEN3_39:GENERA3] +~g~Raggiungi la tua postazione sopra alle scale. + +[GEN3_44:GENERA3] +~g~Vai con Lance all'appuntamento e proteggi Diaz. + +[GEN3_40:GENERA3] { reVC update } +Per ~h~sparare davanti~w~ su una ~h~moto~w~ premi il ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[GEN3_41:GENERA3] { reVC update } +Per ~h~sparare davanti~w~ su una ~h~moto~w~ premi il ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[GEN3_46:GENERA3] +Meerda! + +[GEN3_47:GENERA3] +Tommy! + +[GEN3_48:GENERA3] +Maledizione! + +[GEN3_49:GENERA3] +SALUTE DI LANCE: + +[GEN3_50:GENERA3] +~r~Hai distrutto i soldi di Diaz! La prossima volta cerca di non ridurre le banconote in cenere! + +[GEN3_51:GENERA3] +Altri fottuti Haitiani in un merdoso van! + +[GEN3_54:GENERA3] +Non restare lì impalato, idiota, insegui quello stronzo di un Haitiano! + +[GEN3_55:GENERA3] +Tommy! Io resto qua a proteggere Diaz! + +[GEN3_18:GENERA3] +~g~Stanno arrivando i Cubani, resta vicino a Diaz. Assicurati che niente vada storto e proteggi Diaz e Lance. + +[GEN3_56:GENERA3] +~r~Diaz è stato assalito e ucciso! La prossima volta, cerca di proteggerlo! + +[GEN3_57:GENERA3] +Il Kruger è un fucile d'assalto che permette di mirare in prima persona. + +[GEN3_58:GENERA3] +Tieni premuto il tasto ~h~R1~w~ per ~h~mirare~w~ con il fucile d'assalto. + +[GEN3_59:GENERA3] +Tieni premuto il tasto ~h~L1~w~ per ~h~mirare~w~ col fucile d'assalto. + +[GEN3_60:GENERA3] +Premi il tasto ~h~~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~ col fucile d'assalto. + +[GEN3_61:GENERA3] +Premi il tasto ~h~~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~ col fucile d'assalto. + +[GEN3_62:GENERA3] +Premi il tasto ~h~~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~ col fucile d'assalto. + +[GEN3_63:GENERA3] +Oltre a permetterti di sparare in corsa, con le ~h~moto~w~ puoi anche ~h~sparare in avanti~w~. + +[GEN3_64:GENERA3] { reVC update } +Per sparare in avanti quando sei su una moto, premi il tasto ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[GEN3_65:GENERA3] { reVC update } +Per sparare in avanti quando sei su una moto, premi il tasto ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[GEN3_66:GENERA3] { reVC update } +Per sparare in avanti quando sei su una moto, premi il tasto ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[GEN3_67:GENERA3] +Hai bisogno di una mitragliatrice per poter sparare in avanti. + +[GEN3_53:GENERA3] +I MIEI SOLDI! + +[GEN3_52:GENERA3] +Questi Haitiani pensano che possono farsi RICARDO DIAZ!?! + +{=================================== MISSION TABLE GENERA4 ===================================} + +[DETON:GENERA4] +DETONAZIONE: + +[COL4_3:GENERA4] +CONVOGLIO ALT! + +[COL4_6:GENERA4] +SIAMO SOTTO FUOCO NEMICO! + +[COL4_7:GENERA4] +Civile, si allontani dal carro armato! + +[COL4_8:GENERA4] +HO DETTO, si allontani, IMMEDIATAMENTE! + +[COL4_9:GENERA4] +POSIZIONI DIFENSIVE! + +[COL4_11:GENERA4] +Porta via quel civile, soldato! - Signorsì, signore! + +[COL4_12:GENERA4] +Civile nel CARRO ARMATO! FERMATELO! + +[COL4_13:GENERA4] +Questo è un convoglio militare, non ostacoli il passaggio. + +[COL4_14:GENERA4] +Fallo fuori, soldato. + +[COL4_15:GENERA4] +Spostate quel veicolo civile via dalla strada! -Signore! Sposto il veicolo, signore! + +[COL4_17:GENERA4] +OK, PLOTONE, IN MARCIA! + +[COL4_18:GENERA4] +Qualcuno è entrato nel carro armato, signore! + +[COL4_19:GENERA4] +Vai a prendere delle ciambelle, soldato! - Signorsì, signore! + +[COL4_20:GENERA4] +Bersaglio acquisito, signore! + +[COL4_21:GENERA4] +CECCHINO! + +[COL4_22:GENERA4] +Io me la squaglio. + +[COL4_23:GENERA4] +Obiettivo completato! Plotone riposo! -Andiamo a mangiarci qualche ciambella. + +[COL4_24:GENERA4] +Protocollo di sicurezza Delta India Echo attivato! Autodistruzione del veicolo attivata! + +[COL4_26:GENERA4] +Preparati a morire, maledetto comunista! + +[COL4_B2:GENERA4] +~r~Il carro armato è arrivato con successo a destinazione! + +[COL4_B5:GENERA4] +~r~Il carro armato è stato distrutto! + +[COL4_01:GENERA4] +Diaz era soddisfatto e vorrebbe incontrarti nuovamente. + +[COL4_02:GENERA4] +È un buon segno? + +[COL4_03:GENERA4] +Ma certo! Benché credo che Diaz sia il responsabile della nostra sfortunata perdita... + +[COL4_04:GENERA4] +Che cosa glielo fa pensare? + +[COL4_05:GENERA4] +Nessuno accusa direttamente un uomo come Diaz... sto solo pensando a voce altra... + +[COL4_06:GENERA4] +Non importa. Ho una proposta che potrebbe interessarti... + +[COL4_07:GENERA4] +Non ho più tempo per i suoi lavori, Cortez. + +[COL4_08:GENERA4] +Pensavo che un uomo con dei debiti così pericolosi fosse desideroso di opportunità. Per favore, Tommy, almeno ascoltami. + +[COL4_09:GENERA4] +Mi dica... + +[COL410:GENERA4] +Ho un acquirente per un mezzo militare che sta attraversando la città. Recuperalo per me... + +[COL411:GENERA4] +e, quando lo avrai, vorrei che mi chiamassi immediatamente. Poi... + +[COL4_B4:GENERA4] +~g~Il carro armato è chiuso. Trova un modo per far uscire gli occupanti. + +[COL4_1:GENERA4] +Che cos'ha il mitragliatore? -Non so signore! + +[COL4_4:GENERA4] +-Vai di sopra, soldato. -Signorsì, signore! + +[COL4_B1:GENERA4] +~g~Impadronisciti del mezzo militare che sta attraversando la città. + +[COL4_B3:GENERA4] +~g~Porta il carro armato al garage del Colonnello prima che si autodistrugga. + +[COL4_B6:GENERA4] +~g~Trova un modo per rubare il carro armato! + +[COL4_B7:GENERA4] +~g~Porta il carro armato dentro al garage. + +[COL4_B8:GENERA4] +~g~Esci dal carro armato e abbandona il garage. + +{=================================== MISSION TABLE GENERA5 ===================================} + +[COL5A_1:GENERA5] +Le circostanze richiedono una rapida partenza, amigo. + +[COL5A_2:GENERA5] +Qual è il problema? + +[COL5A_3:GENERA5] +Uh, i Francesi rivogliono la loro tecnologia missilistica indietro dopo quell'incidente... + +[COL5A_4:GENERA5] +Sento che è giunta l'ora di partire per porti più sicuri. + +[COL5A_5:GENERA5] +Non sarebbe meglio via aria? + +[COL5A_6:GENERA5] +Sarei morto ancor prima di raggiungere il check-in. Inoltre, devo portare la mia merce fuori dal paese. + +[COL5A_7:GENERA5] +Serve un'altra pistola? + +[COL5A_8:GENERA5] +Tu, amico, vali come dieci pistole... ah ah ah! + +[COL5B_1:GENERA5] +Thomas, mi hai protetto e servito bene. + +[COL5B_2:GENERA5] +Ma adesso devi abbandonarci prima che raggiungiamo il mare aperto. + +[COL5B_4:GENERA5] +Grazie mille, Colonnello. + +[COL5B_5:GENERA5] +Un'ultima richiesta, mentre sono via: terresti un occhio su Mercedes per me? + +[COL5B_6:GENERA5] +Credo sappia badare a sé stessa, ma certo, la terrò sott'occhio. + +[COL5B_7:GENERA5] +Grazie mille, amico. A presto! + +[COL5B_8:GENERA5] +Adios, amigo. + +[COL5_7:GENERA5] +Smettila di spararmi! + +[COL5_9:GENERA5] +Tommy, falli smettere di sparare! + +[COL5_10:GENERA5] +Ho l'immunità diplomatica! + +[COL5_11:GENERA5] +Non sparare, sono il Colonnello! + +[COL5_12:GENERA5] +Thomas, uccidili: la mia nazione ti sarà riconoscente. + +[COL5_13:GENERA5] +Tommy, siamo assaliti dai Francesi! + +[COL5_14:GENERA5] +Tommy, dovunque guardo vedo dei Francesi. Io li odio! + +[COL5_15:GENERA5] +Tommy, come stai? + +[COL5_16:GENERA5] +Questo è per la Piaf e Gainesbourg e per le vostre stupide baguette! + +[COL5_1:GENERA5] +A babordo! A babordo! + +[COL5_2:GENERA5] +Ci attaccano da tribordo! + +[COL5_3:GENERA5] +Il ponte qui davanti! + +[COL5_4:GENERA5] +Hanno un elicottero! + +[COL5_B1:GENERA5] +~g~Difendi a tutti i costi il Colonnello e il suo yacht. + +[COL5_B2:GENERA5] +~g~Vai a prua e libera la strada per il passaggio dello yacht del Colonnello. + +[COL5_B3:GENERA5] +~r~Il Colonnello è morto! + +[COL5_B4:GENERA5] +~g~Abbatti l'elicottero! + +[COL5B_3:GENERA5] +Farò calare la mia lancia personale. Tienila, amico, un pegno della mia gratitudine. + +[COL5_B5:GENERA5] +~g~Abbatti gli elicotteri e proteggi lo yacht. + +[COL5_B6:GENERA5] +~g~Hai finito i colpi: recuperane altri dalle scale al ponte superiore. + +[COL5_B7:GENERA5] +~g~Sei a corto di salute: recuperane altra dalle scale al ponte superiore + +{=================================== MISSION TABLE HAIT1 ===================================} + +[HAM1_A:HAIT1] +Permesso? + +[HAM1_B:HAIT1] +Entra pure, caro, e riposa l'anima. + +[HAM1_C:HAIT1] +Devi essere il grande uomo cattivo di cui parlava mio nonno. + +[HAM1_D:HAIT1] +Mi ha raccontato di te, sai, quando mi fa visita, + +[HAM1_E:HAIT1] +e degli altri che ti aspettano. + +[HAM1_F:HAIT1] +Adesso, siamo tutti morti da tempo, ma tu sai, + +[HAM1_G:HAIT1] +non vorrei essere nei tuoi panni, eh eh eh! + +[HAM1_H:HAIT1] +Ho ricevuto un messaggio. Sono venuto. + +[HAM1_I:HAIT1] +Li puoi sentire? + +[HAM1_J:HAIT1] +Stanno chiamando il tuo nome, devono proprio volerti, non credi? + +[HAM1_K:HAIT1] +Magari adesso dai una mano alla zia Poulet, uh, e forse lei ti aiuta. + +[HAM1_L:HAIT1] +Forse potrà darti un piccolo juju dopo tutto questo. + +[HAM1_M:HAIT1] +Un po' di magia per dare all'uomo di legge il malocchio, hmmm? + +[HAM1_N:HAIT1] +Ascolta, tutto questo è, uhm... darmi cosa? + +[HAM1_O:HAIT1] +Credo, credo proprio di aver sbagliato indirizzo... + +[HAM1_P:HAIT1] +Fai per me questo favore, Tommy... + +[HAM1_Q:HAIT1] +I Cubani, foofoo molto orgogliosi, hmmm, + +[HAM1_R:HAIT1] +hanno dato molti grattacapi ai miei ragazzi Haitiani. + +[HAM1_S:HAIT1] +Adesso hanno detto alla polizia dove nascondo le mie polveri. + +[HAM1_T:HAIT1] +Pensano sia droga, gli stupidi. + +[HAM1_U:HAIT1] +Adesso fai il bravo, Tommy, e vai a prendere le polveri per la zia Poulet. + +[HAM1_V:HAIT1] +Sì, sì, certo, vado. + +[HAM1_1:HAIT1] +~g~I poliziotti si stanno avvicinando alle nostre riserve. Fermali prima che ci riescano. + +[HAM1_2:HAIT1] +~r~I poliziotti sono arrivati per primi alla riserva! + +[HAM1_3:HAIT1] +~g~Riporta questa roba al nascondiglio! + +[HAM1_4:HAIT1] +~g~Ottimo! Adesso pensa al prossimo! + +[HAM1_6:HAIT1] +~r~La riserva è stata distrutta, idiota! + +[HAM1_7:HAIT1] +~g~La polizia ha preso la nostra riserva! Recuperala prima che se ne vada! + +[HAM1_8:HAIT1] +~g~I poliziotti sono vicini alla riserva: datti una mossa! + +[HAT_1A:HAIT1] +~g~Non muoverti, allocco! + +{=================================== MISSION TABLE HAIT2 ===================================} + +[HAT2_B1:HAIT2] +~g~Raggiungi il van che contiene le bombe volanti. + +[HAT2_B2:HAIT2] +Uccidi i Cubani... + +[HAT2_B4:HAIT2] +...e distruggi le loro imbarcazioni! + +[HAT2_B5:HAIT2] +~g~I Cubani stanno fuggendo: non lasciarli scappare! + +[HAT2_B6:HAIT2] +~r~L'aereo radiocomandato si sta allontanando dal raggio d'azione! + +[HAT2_B7:HAIT2] +~g~Uno dei Cubani sta fuggendo in macchina. Non lasciare nessun testimone! + +[HAT2_B8:HAIT2] +~g~Non hai più aerei radiocomandati! + +[HAT2_B9:HAIT2] +Aerei radiocomandati: + +[HAT2_1:HAIT2] +Oh. Scusa, devo aver sbagliato indirizzo... + +[HAT2_2:HAIT2] +Puoi entrare comunque a riposare i piedi e a bere un po' di tè. + +[HAT2_3:HAIT2] +Hai qualcosa per me, Tommy? + +[HAT2_4:HAIT2] +Sì... + +[HAT2_5:HAIT2] +Questo posto mi sembra familiare. Un odore della mia gioventù... un deja vu... + +[HAT2_6:HAIT2] +Adesso Tommy, ti sussurrerò una piccola commissione che devi farmi. Ascoltami attentamente, va bene? + +[HAT2_7:HAIT2] +Mi ricordi qualcuno che... + +[HAT2_8:HAIT2] +I Cubani hanno imbarcazioni molto veloci che utilizzano per trasportare la droga via mare. + +[HAT2_9:HAIT2] +È il loro modo di vivere. + +[HAT2_10:HAIT2] +Mio nipote ha costruito delle simpatiche bombe per farli fuori. + +[HAT2_11:HAIT2] +Fai esplodere le barche e inchioda le loro bare. + +[HAT2_12:HAIT2] +Beh, grazie per il tè. + +[HAT2_B3:HAIT2] { reVC update } +Premi il ~h~~k~~VEHICLE_FIREWEAPON~~w~ per sganciare una bomba. Premi il ~h~~k~~VEHICLE_ENTER_EXIT~ "~w~ per annullare. + +{=================================== MISSION TABLE HAIT3 ===================================} + +[HAM3_A:HAIT3] +Salve, salve, io, uh... Stavo cercando qualcuno... + +[HAM3_B:HAIT3] +Mi sembri affamato, Tommy. + +[HAM3_C:HAIT3] +Ci conosciamo? + +[HAM3_D:HAIT3] +Zitto ora. + +[HAM3_E:HAIT3] +Un'ultima cosa e potrai andare, Tommy. + +[HAM3_F:HAIT3] +I miei ragazzi sono in guerra con i Cubani. + +[HAM3_G:HAIT3] +Ma niente pistole. + +[HAM3_H:HAIT3] +Hmmm, ma i Cubani hanno una sorpresa in serbo. + +[HAM3_I:HAIT3] +Mentre combattono per la strada, tu prendi questo fucile e li elimini durante la confusione. + +[HAM3_J:HAIT3] +Nessuno ti vede, nessuno ti sente. + +[HAM3_K:HAIT3] +Adesso, Tommy, fai questo per me e non sarai più aggrappato al mio grembiule. + +[HAM3_1:HAIT3] +~g~Dobbiamo vincere questa battaglia. Se tutti gli Haitiani muoiono, sarà la fine. + +[HAM3_3:HAIT3] +~g~Sospetto che i Cubani bareranno, per cui stai in guardia. + +[HAM3_4:HAIT3] +~r~Ti hanno visto! La missione è fallita! + +[HAM3_5:HAIT3] +~g~Devi eliminare i Cubani da lontano. Non devono vederti. + +[HAM3_8:HAIT3] +~g~Gli Haitiani stanno morendo! Migliora la tua mira! + +[HAM3_7:HAIT3] +~g~Attento! I Cubani hanno chiamato rinforzi. Uccidili tutti quanti! + +[HAM3_2:HAIT3] +~r~Gli Haitiani sono morti! + +[HAM3_L:HAIT3] +Sssì zia... + +{=================================== MISSION TABLE HOTEL ===================================} + +[INTB_A:HOTEL] +Tommy! Tommy, quanto tempo è passato! + +[INTB_B:HOTEL] +Ciao Sonny. + +[INTB_C:HOTEL] +Lo so, lo so, sei sopraffatto dall'emozione. + +[INTB_D:HOTEL] +Quindici anni... sembra come se fosse ieri. + +[INTB_E:HOTEL] +Credo dipenda dal punto di vista. + +[INTB_F:HOTEL] +Ehi, stare dentro per la famiglia non è una passeggiata, + +[INTB_G:HOTEL] +ma la famiglia si preoccupa dei suoi, OK? + +[INTB_H:HOTEL] +Allora, raccontami come è andata... Eri in ballo con l'oro bianco? + +[INTB_I:HOTEL] +Ascolta Sonny, ci avevano incastrato. L'incontro era un'imboscata. Harry e Lee sono morti. + +[INTB_J:HOTEL] +Basta con queste storie, Tommy. Hai ancora i soldi, vero? + +[INTB_K:HOTEL] +...no Sonny... non ho i soldi. + +[INTB_L:HOTEL] +Quelli erano i miei soldi, Tommy, I MIEI SOLDI! + +[INTB_M:HOTEL] +Non cercare di fottermi, Tommy, perché sai che non sono una persona a cui piace essere presa per il culo! + +[INTB_N:HOTEL] +Aspetta Sonny. + +[INTB_O:HOTEL] +Hai la mia parola che recupererò i tuoi soldi e la droga. + +[INTB_P:HOTEL] +E ti farò avere per posta l'uccello dei responsabili. + +[INTB_Q:HOTEL] +Ehi, ne sono certo. Non sei uno stupido, Tommy, ma ti avverto: non lo sono neanch'io. + +[INTB_R:HOTEL] +Se fosse stato qualcun altro, adesso sarebbe già MORTO. + +[INTB_S:HOTEL] +Ma visto che sei tu, che ci conosciamo da tempo, ti permetterò di gestire la situazione. + +[INTB_T:HOTEL] +Ehi, Sonny, hai la mia parola. + +[INTB_U:HOTEL] +Mi farò vivo. + +{=================================== MISSION TABLE ICECRE1 ===================================} + +[ICC1_4:ICECRE1] +~g~Non ci sono clienti in quest'area, prova in un'altra. + +[ICC1_5:ICECRE1] +Transazioni effettuate: + +[ICC1_7:ICECRE1] +~g~Riceverai soldi per ogni transazione, ma più ne esegui, maggiori saranno le probabilità di attirare l'attenzione della polizia. + +[ICC1_8:ICECRE1] +~g~Per eseguire una transazione, ~h~parcheggia il camioncino~g~ e premi il ~h~~k~~VEHICLE_HORN~~g~ per suonare il campanello e attrarre i clienti. + +[ICC1_9:ICECRE1] +~g~Le gang locali non apprezzeranno il tuo lavoro nel loro territorio, per cui aspettati azioni ostili. + +[ICC1_10:ICECRE1] +~g~Hai portato a termine ~1~ transazioni! + +[ICC1_11:ICECRE1] +~g~Hai portato a termine ~1~ transazione! + +[ICC1_13:ICECRE1] +~r~Non hai portato a termine nessuna transazione. + +[ICC1_14:ICECRE1] +BENI FABBRICA DI GELATO ACQUISITI + +[ICC1_15:ICECRE1] +~g~La fabbrica di gelato d'ora in poi genererà introiti per un massimo di ~1~$. Ricordati di recuperarli regolarmente. + +[ICC1_16:ICECRE1] +~g~Utilizza il Mr. Whoopee per distribuire i prodotti Cherry Poppers per Vice City. + +[ICE_AT1:ICECRE1] +FABBRICA DI GELATO COMPLETATA + +[ICE_AT2:ICECRE1] +~g~La fabbrica Cherry Popper d'ora in poi genererà introiti per un massimo di ~1~$. Ricordati di recuperarli regolarmente. + +[ICC1_17:ICECRE1] +Missione di distribuzione terminata. + +[ICC1_18:ICECRE1] +Vendita totale gelati: ~1~$ + +[ICC1_19:ICECRE1] +Transizioni totali eseguite: ~1~ + +{=================================== MISSION TABLE ICECUT ===================================} + +[ICC1_A:ICECUT] +Chi sei? + +[ICC1_B:ICECUT] +Il nuovo proprietario. + +[ICC1_C:ICECUT] +Sei per caso, o lo sei mai stato, un bambino? + +[ICC1_D:ICECUT] +Ma di cosa stai parlando? + +[ICC1_E:ICECUT] +Sei stato un bambino? + +[ICC1_F:ICECUT] +Certo! Calmati! Che ti prende? + +[ICC1_G:ICECUT] +Lo sapevo. Un bambino. + +[ICC1_H:ICECUT] +Uno sporco, puzzolente, moccioso, lamentoso, vile, vomitevole, piagnucoloso piccolo bambino! + +[ICC1_I:ICECUT] +Un bambino... un mostruoso, orribile disgustoso piccolo bambino. Boo hoo. + +[ICC1_J:ICECUT] +La mamma non ti ama, brutto piccolo avanzo! + +[ICC1_K:ICECUT] +Ow! Accidenti, calmati! + +[ICC1_L:ICECUT] +Io ODIO i bambini, odio i poppanti. + +[ICC1_M:ICECUT] +Sono sporchi, puzzolenti, mocciosi, vomitevoli piccoli... + +[ICC1_N:ICECUT] +Ne ho avuto abbastanza! + +[ICC1_O:ICECUT] +Ma che diavolo hai? + +[ICC1_P:ICECUT] +Tu fai gelati, vero? Sono solo per bambini. + +[ICC1_Q:ICECUT] +Ma che psicopatica sei? + +[ICC1_R:ICECUT] +È così mi sono chiesta: perché fare felici i bambini se li odio? + +[ICC1_S:ICECUT] +Oh, stupidi, schifosi, mocciosi... + +[ICC1_T:ICECUT] +Sta zitta! + +[ICC1_U:ICECUT] +...Monellaccio! + +[ICC1_V:ICECUT] +La gelateria è solo una facciata. + +[ICC1_W:ICECUT] +Noi distribuiamo altro, prodotti non caseari. + +[ICC1_X:ICECUT] +E se vedo un bambino, non perdo occasione. + +[ICC1_Y:ICECUT] +Non è vero, bambini? Sì, sì, lo faccio. La mamma non vi ama. + +[ICC1_Z:ICECUT] +Lei vi ODIA! + +[ICC1_ZA:ICECUT] +PROPRIETÀ ACQUISTATA! + +{=================================== MISSION TABLE INTRO ===================================} + +[INT1_A:INTRO] +Tommy Vercetti... Ommerda! + +[INT1_B:INTRO] +Pensavo non lo avrebbero mai rilasciato. + +[INT1_C:INTRO] +Ha tenuto la testa bassa... molta gente ha dimenticato. + +[INT1_D:INTRO] +Ma molti ricorderanno ben presto... + +[INT1_E:INTRO] +Quando lo vedranno camminare per le strade del loro vicinato. + +[INT1_F:INTRO] +Non sarà una cosa positiva per il business. + +[INT1_G:INTRO] +Beh, che cosa facciamo, Sonny? + +[INT1_H:INTRO] +Lo trattiamo come un amico e lo teniamo impegnato fuori città, OK? + +[INT1_I:INTRO] +Parlavamo di espanderci verso sud, vero? + +[INT1_J:INTRO] +Vice City è oro puro in questi giorni. + +[INT1_K:INTRO] +I Colombiani, i Messicani, che diamine, + +[INT1_L:INTRO] +anche i rifugiati Cubani si sono ritagliati una bella fetta della torta. + +[INT1_M:INTRO] +Ma si tratta di droga, Sonny, + +[INT1_N:INTRO] +nessuno delle famiglie toccherà quella merda! + +[INT1_O:INTRO] +I tempi cambiano. + +[INT1_P:INTRO] +Le famiglie non possono girare le spalle mentre i nostri nemici si godono il raccolto. + +[INT1_Q:INTRO] +Per cui mandiamo qualcuno a fare il lavoro sporco + +[INT1_R:INTRO] +e a prendere una bella fetta per noi, OK? + +[INT1_S:INTRO] +Chi è il nostro contatto laggiù? + +[INT1_T:INTRO] +Ken Rosenberg, uno schmuck di un avvocato. + +[INT1_U:INTRO] +Come farà a tenere al guinzaglio Vercetti? + +[INT1_V:INTRO] +Non dovrà farlo. + +[INT1_W:INTRO] +Mandiamolo alla ribalta a Vice City + +[INT1_X:INTRO] +con un po' di denaro per cominciare, OK? + +[INT1_Y:INTRO] +Lasciamogli qualche mese. + +[INT1_Z:INTRO] +Poi andiamo giù, + +[INT1_A1:INTRO] +gli facciamo visita, giusto? + +[INT1_A2:INTRO] +E vediamo come se la sta cavando... + +[INT2_A:INTRO] +Ehi, ehi, amici! Sono, uh, Ken Rosenberg! Eh, eh, ottimo, ehi! + +[INT2_B:INTRO] +Bene, uh, vi accompagno in auto all'appuntamento, OK? + +[INT2_C:INTRO] +Ho parlato con i fornitori e loro sono molto, ehm, + +[INT2_D:INTRO] +desiderosi di avviare una relazione commerciale, per cui, uh, + +[INT2_E:INTRO] +se tutto dovesse andare come deve, noi, dovremmo, uh, + +[INT2_F:INTRO] +ottenere dei buoni risultati economici, il che, cioè... + +[INT2_G:INTRO] +è bene... + +[INT2_H:INTRO] +OK allora. Sono fratelli, OK. + +[INT2_I:INTRO] +Uno si occupa del, uh, business, + +[INT2_J:INTRO] +mentre l'altro si occupa dei voli. + +[INT2_K:INTRO] +Adesso operano dal Messico, + +[INT3_A:INTRO] +OK, sono loro sull'elicottero. + +[INT3_B:INTRO] +Bene, questo è l'accordo. + +[INT3_C:INTRO] +Vogliono uno scambio diretto in campo aperto. + +[INT3_D:INTRO] +Va bene? OK, nervi saldi, andiamo. + +[INT3_E:INTRO] +Vedi di star calmo. + +[INT3_F:INTRO] +Resto qui con l'auto pronta a partire! + +[INT3_G:INTRO] +Chiaro? + +[INT3_H:INTRO] +Colombiana 100% pura di prima classe, amici miei. + +[INT3_I:INTRO] +I verdoni? + +[INT3_J:INTRO] +Da dieci e da venti... usati. + +[INT3_L:INTRO] +Forza, vieni qua! Muoviti! + +[INTRO1:INTRO] +metto fuori la testa per un maledetto secondo, e il fato mi tira palate di merda in faccia! + +[INTRO2:INTRO] +Vai a riposarti. + +[INTRO3:INTRO] +Che cosa intendi fare? + +[INTRO4:INTRO] +Passerò domani a trovarti in ufficio e troveremo un modo per risolvere questo casino. + +[INT3_K:INTRO] +Siamo d'accordo allora, amico. AH AH! + +[INT3_M:INTRO] +Fammi dare un'occhiata. + +[INT2_L:INTRO] +no, no, no, aspetta... + +{=================================== MISSION TABLE KENT1 ===================================} + +[KPM1_A:KENT1] +Ehi bello, ho delle informazioni sul tuo amico. + +[KPM1_B:KENT1] +Ma di cosa stai parlando? + +[KPM1_C:KENT1] +Conosci quel fallito di Diaz, il signore degli spacciatori? + +[KPM1_D:KENT1] +Ha preso il tuo amico, Lance. Sembra che abbia cercato di scavalcarlo... + +[KPM1_E:KENT1] +ma non ha saltato abbastanza in alto, se capisci cosa intendo. + +[KPM1_F:KENT1] +Dove lo hanno portato? Senza giri di parole! + +[KPM1_G:KENT1] +Stai calmo! Lo hanno trasportato attraverso la città fino alla discarica. + +[KPM1_H:KENT1] +Maledizione... Brutto idiota. + +[KPM1_2:KENT1] +~r~Dovevi portare Lance fuori vivo da lì! + +[KPM1_3:KENT1] +SALUTE DI LANCE: + +[RESC_1:KENT1] +Ce la fai a usare un'arma? + +[RESC_2:KENT1] +Certo... credo... È bello rivederti! + +[RESC_3:KENT1] +Andiamocene da qua. + +[RESC_4:KENT1] +Bene, con questo hai mandato a puttane tutti i miei bei piani. L'hai proprio fatta grossa, Lance. + +[RESC_5:KENT1] +Ha ucciso mio fratello. Che cosa ti aspettavi facessi, che gli tagliassi il prato? + +[RESC_6:KENT1] +Dobbiamo far fuori quello stronzo di Diaz prima che sia lui a farlo. + +[RESC_7:KENT1] +Preparati e incontriamoci al ponte di Star Island, OK? + +[RESC_8:KENT1] +OK, ricevuto. + +[KPM1_1:KENT1] +~g~Lance viene tenuto nella discarica: vai a salvarlo! + +[KPM1_4:KENT1] +~g~Porta Lance all'ospedale! + +[M_PASSN:KENT1] +MISSIONE COMPLETATA! + +[KPM1_5:KENT1] +~g~Gli uomini di Diaz ti stanno dietro: porta Lance all'ospedale. + +{=================================== MISSION TABLE KICKSTT ===================================} + +[KICK1_2:KICKSTT] +~r~Non sei tornato abbastanza velocemente alla tua moto! + +[KICK1_7:KICKSTT] ~r~Hai distrutto la moto! -[BIKE_F2:BIKE] -~r~Hai ucciso il cliente! +[KICK1_8:KICKSTT] +~g~Ritorna sulla moto! -[BIKE_F3:BIKE] -~r~Ci hai messo troppo! Il cliente si è stufato! +[KICK1_T:KICKSTT] +TEMPO IMPIEGATO: -[BIKE_F4:BIKE] -~r~Il cliente odia questa moto! +[KICKTM:KICKSTT] +~b~DURATA EVENTO: ~1~:~1~ -[BIKE_F5:BIKE] -~r~Hai chiuso con la vendita delle moto. +[KICKTM2:KICKSTT] +~b~DURATA EVENTO: ~1~:0~1~ -[BIKE_F6:BIKE] -~r~Il cliente odia la moto, l'hai distrutta! +[GETBIKE:KICKSTT] +~g~Hai ~1~ secondi per tornare sulla tua moto prima che la missione abbia termine. -[BIKE_F7:BIKE] -~r~Il cliente odia la moto, sei andato troppo veloce! +[KICK1_1:KICKSTT] +~g~Completa il tracciato il più velocemente possibile. -[BIKE_F8:BIKE] -~r~Il cliente odia la moto, sei andato troppo piano! +[KICK1_6:KICKSTT] +~g~Complimenti! -[BIKE_B1:BIKE] -~w~Hai ~1~ secondi per tornare sulla ~b~moto! +[KICK_10:KICKSTT] +~g~Usa il Sanchez per completare il percorso passando per tutti i punti di controllo. -[BIKE_B2:BIKE] -~w~Riprendi il ~b~cliente~w~ sulla moto! +[KICK_12:KICKSTT] +~g~Ti sei bloccato! -[BIKE_B3:BIKE] -~w~Lascia salire il ~b~cliente~w~ sulla moto! +[KICK_13:KICKSTT] +~g~Ci hai messo troppo tempo! -[BIKE_SA:BIKE] -Vendita +[KICK_11:KICKSTT] +~g~Per abbandonare la missione, posizionati a piedi sul ~q~segnalino rosa~g~. -[BIKE_7:BIKE] -~w~Sali su una ~b~moto! +{=================================== MISSION TABLE LAWYER1 ===================================} -[BIKE_S1:BIKE] -~w~Hai venduto tutte le Freeway in magazzino! +[LAW1_A:LAWYER1] +Vai a riposarti un po', ha detto... -[BIKE_S2:BIKE] -~w~Hai venduto tutte le PCJ 600 in magazzino! +[LAW1_B:LAWYER1] +...ho passato tutta la sera su questa seggiola a bere caffè con la luce spenta. -[BIKE_S3:BIKE] -~w~Hai venduto tutte le Faggio in magazzino! +[LAW1_C:LAWYER1] +È un disastro. Siamo veramente fottuti, amico! -[BIKE_S4:BIKE] -~w~Hai venduto tutte le Sanchez in magazzino! +[LAW1_D:LAWYER1] +Quei gorilla, non sto scherzando, verranno qui da me e mi staccheranno la testa. È ridicolo! -[BIKE_SN:BIKE] -~w~È stata consegnata della nuova merce! +[LAW1_E:LAWYER1] +NON mi sono laureato in giurisprudenza per questo! Bene, dimmi un po': che cosa hai intenzione di fare? -{=================================== MISSION TABLE RAC1 ===================================} +[LAW1_F:LAWYER1] +Sta zitto, siediti e rilassati. Ti dirò che cosa faremo. -[RAC1_A0:RAC1] -~w~Se vuoi provare di essere un pilota modello, presentati alla partenza della prossima gara. +[LAW1_G:LAWYER1] +Tu dovrai scoprire chi ha preso la nostra cocaina... e io li farò fuori. -{=================================== MISSION TABLE RAC2 ===================================} +[LAW1_H:LAWYER1] +È una buona idea. Anzi, è un'OTTIMA idea. Fammici pensare, fammici pensare, fammici pensare. -[RAC2_A0:RAC2] -~w~Ehi, si sta per tenere una corsa su strada. Porta il tuo veicolo alla partenza. +[LAW1_I:LAWYER1] +Ah! C'è quel Colonnello in pensione, il Colonnello Juan Garcia Cortez. -{=================================== MISSION TABLE RAC3 ===================================} +[LAW1_J:LAWYER1] +È stato lui che mi ha aiutato a preparare il piano -[RAC3_A0:RAC3] -~w~Non ci sono macchine più veloci e guidatori più abili. +[LAW1_K:LAWYER1] +ben lontano dai criminali di Vice City. OK? -[RAC3_A1:RAC3] -~w~Ci vediamo alla prossima gara... ti guarderò dal mio specchietto retrovisore. +[LAW1_L:LAWYER1] +Adesso ascolta: sta organizzando un party nella baia sul suo costoso yacht -{=================================== MISSION TABLE BIK1 ===================================} +[LAW1_M:LAWYER1] +e tutte le personalità di spicco di Vice City saranno presenti. -[BIK1_A0:BIK1] -~w~Pensi di potermi battere? Ti farò un culo così! +[LAW1_N:LAWYER1] +Io ho un invito, chiaramente ne ho uno... -[BIK1_A1:BIK1] -~w~Porta la tua moto sulla griglia di partenza e vediamo cosa sai fare! +[LAW1_O:LAWYER1] +ma non ho la minima intenzione di mettere la testa fuori dalla porta, per nessun motivo! -{=================================== MISSION TABLE BIK2 ===================================} +[LAW1_P:LAWYER1] +Te l'ho detto, sta zitto! Ci andrò io... -[BIK2_A0:BIK2] -~w~Se pensi di potermi battere in una gara, fatti sotto! +[LAW1_Q:LAWYER1] +Whoa, whoa, whoa! Ehi, anche a me piace lo stile del 78, ma, lo sai, non si tratta di una festa con birra e spogliarelliste. -[BIK2_A1:BIK2] -~w~Ci vediamo alla linea di partenza. +[LAW1_R:LAWYER1] +Intendo dire, senza offesa, che molta gente potrebbe girarsi a guardarti per la ragione sbagliata... -{=================================== MISSION TABLE BIK3 ===================================} +[LAW1_S:LAWYER1] +Vuoi dire che c'è qualcosa che non va in come mi vesto? -[BIK3_A0:BIK3] -~w~È semplice. Su due ruote non mi batte nessuno. E te lo dimostrerò. +[LAW1_T:LAWYER1] +OK, ascolta. Fermati da Rafael's, digli che ti mando io e lui si occuperà di renderti presentabile. -{=================================== MISSION TABLE TT1 ===================================} +[LAW1_U:LAWYER1] +OK, forza, andiamo... -[TT1_A0:TT1] -~w~~k~ ~AMBUY~ ~w~per gareggiare. ~n~~k~ ~AMEXI~ ~w~per uscire. +[LAWP_1:LAWYER1] +Buenas noches. -[TT1_0:TT1] -Tempo +[LAWP_2:LAWYER1] +Da quanto ho capito, è qui per conto di Mr. Rosenberg. -[TT1_1:TT1] -~w~Nuovo giro record: ~1~:~1~ +[LAWP_3:LAWYER1] +Spero che gli avvenimenti recenti non abbiano avuto effetti sulla sua salute o, uh, -[TT1_1A:TT1] -~w~Nuovo giro record: ~1~:0~1~ +[LAWP_4:LAWYER1] +sulla sua sanità mentale, Mr...? -[TT1_C1:TT1] -~w~3... +[LAWP_5:LAWYER1] +Vercetti. Ha solo avuto un attacco di... agorafobia. -[TT1_C2:TT1] -~w~2... +[LAWP_6:LAWYER1] +Eccellente, eccellente. E lei? -[TT1_C3:TT1] -~w~1... +[LAWP_7:LAWYER1] +Voglio solo la mia merce. -[TT1_C4:TT1] -~w~VIA! +[LAWP_8:LAWYER1] +Ah. Si è trattato di sfortunate circostanze per tutte le persone coinvolte. -[TT1_D1A:TT1] -~w~Salto: ~1~ piedi +[LAWP_9:LAWYER1] +Chiaramente, ho dato il via a delle ricerche personali -[TT1_D2:TT1] -~w~Giro ~1~ Tempo ~1~:~1~ +[LAWP_10:LAWYER1] +ma una situazione così delicata richiede tempo. -[TT1_D3:TT1] -~w~Giro ~1~ Tempo ~1~:0~1~ +[LAWP_11:LAWYER1] +Magari ne parleremo più tardi, va bene? -[TT1_D4:TT1] -~w~Giro +[LAWP_12:LAWYER1] +Nel frattempo, le presento mia figlia, -[TT1_F2:TT1] -~r~Hai abbandonato il percorso! +[LAWP_13:LAWYER1] +Mercedes! -[TT1_F3:TT1] -~r~Hai distrutto la moto! +[LAWP_14:LAWYER1] +Cara mia, perché non ti prendi cura del nostro ospite mentre io mi occupo delle mie cose? -[TT1_D5A:TT1] -~w~Salto: ~1~ piedi - 10$ bonus! +[LAWP_15:LAWYER1] +Certamente, papà. -[TT1_D1:TT1] -~w~Salto: ~1~ metri +[LAWP_16:LAWYER1] +Mi scusi. -[TT1_D5:TT1] -~w~Salto: ~1~ metri - 10$ bonus! +[LAWP_17:LAWYER1] +Mercedes? -[TT1_2:TT1] -~w~Hai battuto il tempo limite! Hai sbloccato il percorso successivo: bonus 100$! +[LAWP_18:LAWYER1] +Non è facile portare questo nome. -[TT1_3:TT1] -~w~Hai battuto il tempo limite: bonus 100$! +[LAWP_19:LAWYER1] +Comunque, lasci che le presenti alcuni dei nostri distinti ospiti... -[TTDONE:TT1] -~w~Tutti i percorsi completati! Hai sbloccato la 'Manchez'. +[LAWP_20:LAWYER1] +Lui è Alex Shrub, il nostro deputato, con Candy Suxxx, la famosa star siliconata... -[TT1_2A:TT1] -~r~Non sei riuscito a battere il tempo limite. +[LAWP_21:LAWYER1] +Avete conosciuto la mia dolce moglie, Laura? -[TT1_2B:TT1] -~r~Non sei riuscito a battere il record del percorso. +[LAWP_22:LAWYER1] +Veramente questa è Candy, mia moglie si trova in Alabama ora. -{=================================== MISSION TABLE RCR ===================================} +[LAWP_23:LAWYER1] +E da quella parte abbiamo la stella dei Vice City Mambas, BJ. -[RCRACE3:RCR] -~w~Batti gli altri veicoli radiocomandati in una gara di ~1~ giri attorno al parco! +[LAWP_24:LAWYER1] +un vero ammaliatore -[RCRACE4:RCR] -~w~Batti gli altri veicoli radiocomandati in una gara di ~1~ giri attorno all'aeroporto! +[LAWP_25:LAWYER1] +L'ho placcato, davvero, e l'ho fatto finire su una sedia a rotelle! -[RCRACE7:RCR] -~w~Pronti... +[LAWP_26:LAWYER1] +Ah, ah, questa è buona! -[RCRLAP5:RCR] -~w~Nuovo giro migliore di ~1~ secondi! +[LAWP_27:LAWYER1] +Beh, adesso sto cercando di acquistare dei terreni di qualità. -[RCRLAP6:RCR] -~w~~1~ giri rimanenti! +[LAWP_28:LAWYER1] +E quella specie di anfibio da piscina è Jezz Torrent, -[RCRLAP7:RCR] -~w~Giro finale! +[LAWP_29:LAWYER1] +voce solista dei Love Fist. -[RCRLTME:RCR] -Tempo del giro +[LAWP_30:LAWYER1] +Ve lo posso dire... sapete come giocano a ping-pong in Tailandia? -[RCRLOSE:RCR] -~r~Hai perso! Non sarai mai il numero uno! +[LAWP_31:LAWYER1] +Da non crederci... -[RCRLOS2:RCR] -~r~Non vincerai mai una gara se non riesci a rimanere in pista! +[LAWP_32:LAWYER1] +di certo, non richiede l'uso della racchetta, se capite cosa intendo! -[RCRTIME:RCR] -~w~Hai ~h~~1~ ~w~secondi per tornare in pista! +[LAWP_33:LAWYER1] +Impotente. -[RCRWIN1:RCR] -~w~Congratulazioni hai VINTO, ma non hai battuto il giro più veloce. +[LAWP_34:LAWYER1] +E il loquace trio. -[RCRWIN2:RCR] -~w~La prossima gara sarà composta da ~1~ giri! +[LAWP_35:LAWYER1] +Quella pustola sudata e addormentata è il braccio destro di papà, Gonzalez, -[RCRWIN3:RCR] -~w~È disponibile la RC Race a Belleville Park, Staunton. +[LAWP_36:LAWYER1] +mentre gli altri due sono il pastore Richards -[RCRWIN4:RCR] -~w~È disponibile la RC Race all'aeroporto di Shoreside. +[LAWP_37:LAWYER1] +e il regista pseudo-intellettuale, Steve Scott. -[RCRWIN5:RCR] -~w~Hai superato tutti i livelli! Ritornaci e batti i tuoi giri più veloci! +[LAWP_38:LAWYER1] +...pare che abbiano una passione per le ninfomani... -[RCR1:RCR] -~w~1... +[LAWP_39:LAWYER1] +...quando lo squalo gigante arriva e -[RCR2:RCR] -~w~2... +[LAWP_40:LAWYER1] +strappa a morsi i loro uccelli! -[RCR3:RCR] -~w~3... +[LAWP_41:LAWYER1] +Ah! Non si è mai visto qualcosa del genere prima, vero? -[RCRGO:RCR] -~w~VIA! +[LAWP_42:LAWYER1] +Colonnello! -[RCBLAP:RCR] -Il giro più veloce attuale: ~1~:~1~ +[LAWP_43:LAWYER1] +I suoi party sono sempre un successo! Ah ah ah! -[RCBLAP1:RCR] -Il giro più veloce attuale: ~1~:0~1~ +[LAWP_44:LAWYER1] +Posso solo chiedere scusa per il mio ritardo. -[RCBLA2:RCR] -Giro record: ~1~:~1~ +[LAWP_45:LAWYER1] +Ah, de nada amigo. E come vanno gli affari? -[RCBLA3:RCR] -Giro record: ~1~:0~1~ +[LAWP_46:LAWYER1] +Sai, sono molto difficili...i nemici sono sempre alle costole. -[RCRRLA1:RCR] -~w~Nuovo giro record: ~1~:~1~ +[LAWP_47:LAWYER1] +Il tempo di ricompensare gli amici e liquidare i nemici, amigo. -[RCRRLA2:RCR] -~w~Nuovo giro record: ~1~:0~1~ +[LAWP_48:LAWYER1] +Chi è il chiacchierone? -[RCRACEA:RCR] -RC allo sbando +[LAWP_49:LAWYER1] +Ricardo Diaz. È Mr. Coca. -[RCRACEB:RCR] -RC allo scozzo +[LAWP_50:LAWYER1] +Mercedes! -[RCRACEC:RCR] -RC all'inseguimento +[LAWP_51:LAWYER1] +Oh, stavo giusto riaccompagnando i miei amici in città. -[RCLE11:RCR] -RC allo sbando LIVELLO UNO +[LAWP_52:LAWYER1] +Un'altra volta, Ricardo! -[RCLE12:RCR] -RC allo sbando LIVELLO DUE +[LAWP_53:LAWYER1] +Andiamocene. -[RCLE13:RCR] -RC allo sbando LIVELLO TRE +[LAWP_54:LAWYER1] +Anzi, portatemi al club Pole Position. -[RCLE21:RCR] -RC allo scozzo LIVELLO UNO +[LAW1_2:LAWYER1] +~g~Raggiungi lo yacht del Colonnello. -[RCLE22:RCR] -RC allo scozzo LIVELLO DUE +[LAW1_4:LAWYER1] +~r~Hai ucciso la figlia del Colonnello! -[RCLE23:RCR] -RC allo scozzo LIVELLO TRE +[LAW1_5:LAWYER1] +Lavorerai per mio padre? -[RCLE31:RCR] -RC all'inseguimento LIVELLO UNO +[LAW1_6:LAWYER1] +Forse. -[RCLE32:RCR] -RC all'inseguimento LIVELLO DUE +[LAW1_7:LAWYER1] +Ti dispiace se appoggio la mano tra le tue gambe? -[RCLE33:RCR] -RC all'inseguimento LIVELLO TRE +[LAW1_8:LAWYER1] +Forse... -[RCRACE2:RCR] -~w~Batti gli altri veicoli radiocomandati in una gara di ~1~ giri attorno al cantiere edile! +[LAW1_9:LAWYER1] +È così difficile avere un padre ricco e potente. Vamos. -[RCRWIN6:RCR] -~w~Gareggia di nuovo e tenta di battere il giro più veloce! +[LAW1_10:LAWYER1] +Ci vediamo in giro, stallone! -[RCQUIT:RCR] -~r~Si stanno scaricando le batterie? +[LAW1_11:LAWYER1] +Sono sicuro di sì. -[RCRFAIL:RCR] -~r~Non sei riuscito ad arrivare primo! +[LAW1_12:LAWYER1] +Hmmm... bella moto. -[RCRLAP1:RCR] -~c~1° ~w~GIRO +[LAW1_13:LAWYER1] +No! La mia moto! -[RCRLAP2:RCR] -~c~2° ~w~GIRO +[LAW1_3:LAWYER1] +~g~Porta la figlia del Colonnello al club Pole Position. -[RCRLAP3:RCR] -~c~3° ~w~GIRO +[HELP20:LAWYER1] +Segui il ~h~segnale a forma di maglietta~w~ per trovare Rafael's. -[RCRLAP4:RCR] -~c~4° ~w~GIRO +[LAW1_14:LAWYER1] +Accidenti, mi piace: la tua moto va alla grande. -[RCRWIN:RCR] -~w~Congratulazioni hai VINTO con il giro più veloce di ~1~:~1~! Bonus 500$! +[LAW1_15:LAWYER1] +Eh sì, l'ho appena presa da Howlin' Pete's. -[RCRWINB:RCR] -~w~Congratulazioni hai VINTO con il giro più veloce di ~1~:0~1~! Bonus 500$! +{=================================== MISSION TABLE LAWYER2 ===================================} -{=================================== MISSION TABLE TOUR ===================================} +[LAW2_A:LAWYER2] +Ah! Beh, spero tu ti sia divertito. Io stavo quasi per impazzire dalla preoccupazione. Che cos'hai scoperto? -[TOUR_H1:TOUR] -~w~Suggerimenti: mettiti ~h~davanti~w~ al turista, ~h~non troppo lontano.~w~ Assicurati che sia ~h~il turista che lo sfondo ~w~ siano nella foto. +[LAW2_B:LAWYER2] +Che ci sono più criminali a piede libero in città che nella prigione. Abbiamo bisogno di qualcuno di strada... -[TOUR_I2:TOUR] -~w~Riceverai un'extra per le foto di alta qualità! +[LAW2_C:LAWYER2] +OK, fammici pensare, fammici pensare, fammici pensare... -[TOUR_S0:TOUR] -~w~Ti sono rimaste ~h~~1~~w~ fotografie. +[LAW2_D:LAWYER2] +Ah! Trovato! -[TOUR_S1:TOUR] -~w~Ti rimane una sola foto. Assicurati che sia un buono scatto! +[LAW2_E:LAWYER2] +OK, c'è questo inglese, un tizio legato al campo della musica, -[TOUR_S2:TOUR] -~w~Non sprecare scatti! Ti rimangono ~h~~1~~w~ fotografie. +[LAW2_F:LAWYER2] +mi sembra si chiami Kent Paul. -[TOUR_S4:TOUR] -~w~Devi inquadrare bene il ~b~turista~w~ nell'immagine! Ti rimangono ~h~~1~~w~ fotografie. +[LAW2_G:LAWYER2] +Comunque, ha ficcato il naso nelle chiappe di metà della gente di Vice City -[TOUR_F1:TOUR] -~r~Il turista è morto! +[LAW2_H:LAWYER2] +per cui, se qualcuno sa dove sono questi 20 chili di coca, -[TOUR_F2:TOUR] -~r~Hai perso il turista! +[LAW2_I:LAWYER2] +è sicuramente lui, chiaro? È sempre al Malibu. -[TOUR_F3:TOUR] -~r~Non sei riuscito a scattare una foto del turista! +[LAW2_J:LAWYER2] +Andrò a trovarlo. -[TOUR_F4:TOUR] -~r~Il tempo è scaduto! +[LAW2B_A:LAWYER2] +Ehi, da dove sbuchi? -[TOUR_F5:TOUR] -~r~Missione annullata. +[LAW2B_B:LAWYER2] +Ho cercato per anni un fiorellino come te, bellezza... -[TOUR_F6:TOUR] -~r~Il rapinatore è scappato con la macchina fotografica del turista! +[LAW2B_C:LAWYER2] +Kent Paul, tesoro. Sì, sono il capo da queste parti. -[TOUR_O1:TOUR] -~w~Porta il turista in un ~y~punto famoso. +[LAW2B_D:LAWYER2] +Sto cercando un tipo inglese... -[TOUR_O2:TOUR] -~w~Non lasciare indietro il ~b~turista~w~! +[LAW2B_E:LAWYER2] +Risolvo i problemi, capisci cosa intendo? -[TOUR_O3:TOUR] -~w~Segui il ~b~turista~w~ a piedi nel luogo della foto. +[LAW2B_F:LAWYER2] +Ti tratterò bene: qualsiasi cosa tu voglia, te la farò avere, cara. -[TOUR_O4:TOUR] -~w~Usa la macchina fotografica dei ~b~turisti~w~ per scattare le immagini. +[LAW2B_G:LAWYER2] +Non preoccuparti di niente, bellezza. -[TOUR_O5:TOUR] -~w~Riporta il turista all'~y~aeroporto. +[LAW2B_H:LAWYER2] +Vattene, tesoro. -[TOUR_O6:TOUR] -~w~Veloce! Il tempo sta per scadere! +[LAW2B_I:LAWYER2] +Oi oi oi oi oi! -[TOUR_O7:TOUR] -~w~Prendi il ~b~turista. +[LAW2B_J:LAWYER2] +Sei Kent Paul? Sono un amico di Rosenberg... -[TOUR_O8:TOUR] -~w~Prendi il prossimo ~b~turista~w~ prima che scada il tempo. +[LAW2B_K:LAWYER2] +Rosenberg... Rosenberg... Oh, l'avvocato matto! -[TOUR_O9:TOUR] -~w~Dovresti seguire il ~b~turista!~w~ Stai perdendo tempo. +[LAW2B_L:LAWYER2] +Quel tipo potrebbe difendere un innocente fino alla sedia elettrica! -[TOUR_OA:TOUR] -~w~Il ~b~turista~w~ ti sta aspettando per prendere una foto. Muoviti, il tempo sta per scadere! +[LAW2B_M:LAWYER2] +Dacci un altro drink, amico. -[TOUR_W1:TOUR] -~w~Guadagno: ~h~~1~$~w~ Spiacente, nessun bonus questa volta. +[LAW2B_N:LAWYER2] +Un altro comico. -[TOUR_W2:TOUR] -~w~Guadagno: ~h~~1~$~w~ più ~h~~1~$~w~ per aver scattato una bella foto! +[LAW2B_O:LAWYER2] +Ascoltami: mi hanno soffiato venti chili e un sacco di contanti... -[TOUR_W3:TOUR] -~w~Guadagno: ~h~~1~$~w~ più ~h~~1~$~w~ per aver scattato un'ottima foto! +[LAW2B_P:LAWYER2] +Droga amico? È roba da delinquenti. -[TOUR_W4:TOUR] -~w~Guadagno: ~h~~1~$~w~ più ~h~~1~$~w~ per aver scattato una foto eccezionale! +[LAW2B_Q:LAWYER2] +Che cosa ne sai? -[TOUR_W5:TOUR] -~w~Ben fatto! Tutte le missioni 'Soddisfatti o non pagati' sono state completate. ~1~$ per il completamento! +[LAW2B_R:LAWYER2] +Oi oi! Ciò che volevo dire è -[TOURDAM:TOUR] -~w~VISTA ~1~: ~w~Porta questo turista alla Cochrane Dam e scatta una foto per provare che è stato lì! +[LAW2B_S:LAWYER2] +che c'è uno chef che spaccia sottobanco nella cucina di un hotel su Ocean Drive. -[TOURBRI:TOUR] -~w~VISTA ~1~: ~w~Questa signora vuole vedere Callahan Bridge dal lato di Portland. +[LAW2B_T:LAWYER2] +Recentemente, mi è sembrato molto felice di come gli buttava... Potresti passare a trovarlo e investigare... -[TOURDRK:TOUR] -VISTA ~1~: ~w~Scatta una foto di questa fan davanti alla casa di Black Lightman a Cedar Grove, Shoreside Vale. +[LAW2B_U:LAWYER2] +Lo farò... ci becchiamo in giro. -[TOURSTA:TOUR] -~w~VISTA ~1~: ~w~Scatta una foto di questa fanatica sportiva davanti al Liberty Memorial Coliseum di Staunton. +[LAW2B_V:LAWYER2] +Beh, sì certo! Vai, vai pure idiota. Ci penserò io a tenerti a bada! -[TOURCHU:TOUR] -~w~VISTA ~1~: ~w~Accompagna questo pellegrino alla storica cattedrale di Liberty a Staunton. +[LAW2B_W:LAWYER2] +Dammi un bicchiere... e dov'è finita quella sgualdrina? -[TOURBCH:TOUR] -~w~VISTA ~1~: ~w~Mostra alla turista la splendida visuale di Portland Rock e del faro da Portland Beach. +[LAW2C_A:LAWYER2] +Oh, ottimo lavoro, sei proprio un duro. Riducilo in poltiglia, questo sicuramente lo aiuterà a diventare più loquace! -[TOURCHI:TOUR] -~w~VISTA ~1~: ~w~L'ambientazione orientale di Chinatown Plaza a Portland è una destinazione fondamentale per i turisti. +[LAW2C_B:LAWYER2] +Ne vuoi anche tu? -[TOURSHO:TOUR] -~w~VISTA ~1~: ~w~Questa turista vuole che le sue amiche pensino che ha fatto compere nell'esclusivo Staunton Shopping Mall. Portala là e scatta una foto. +[LAW2C_C:LAWYER2] +Ehi, calma. Quel che va bene a te, va bene a me, amico. -[TOURCAS:TOUR] -~w~VISTA ~1~: ~w~C'è un giocatore d'azzardo che vuole farsi scattare una foto davanti al casinò di Staunton. +[LAW2C_D:LAWYER2] +Ah sì? E di cosa si tratta? -[TOURMUS:TOUR] -~w~VISTA ~1~: ~w~Questa studente vuole visitare il museo di Liberty City a Staunton e vuole una foto che mostri l'imponenza dell'edificio. +[LAW2C_E:LAWYER2] +I verdoni... e l'amica bianca del mio povero fratello. Sfortunatamente, hai appena fatto fuori il nostro contatto. -[TOURHAL:TOUR] -~w~VISTA ~1~: ~w~Questo turista vuole visitare il municipio a Staunton ancora una volta prima di andarsene. +[LAW2C_F:LAWYER2] +Gli incidenti capitano. Scompari. -[TOURRED:TOUR] -~w~VISTA ~1~: ~w~Gli amici dicono che non è abbastanza uomo da farsi un giro nel Red Light District di Portland! Mostra loro il contrario! +[LAW2C_G:LAWYER2] +Ehi, ehi, whoa. Non c'è bisogno di recitare la parte del 'Giustiziere solitario'. -[TOURMU0:TOUR] -~w~Il ~r~rapinatore~w~ ha rubato la macchina fotografica del turista! +[LAW2C_H:LAWYER2] +Io la vedo così: siamo due hombres in una strana città. Dobbiamo guardarci a vicenda le spalle. -[TOURMU1:TOUR] -~w~Un criminale in meno del quale preoccuparsi! Raccogli la ~g~macchina fotografica. +[LAW2C_I:LAWYER2] +Le mie spalle stanno benissimo, fratello... -[TOUR00:TOUR] -~w~Porta il turista alla ~y~Cochrane Dam~w~ a Shoreside Vale. +[LAW2C_J:LAWYER2] +Ne sei sicuro? Ehi, prendi questa. -[TOUR01:TOUR] -~w~Porta la turista al ~y~Liberty Memorial Coliseum~w~ di Staunton. +[LAW2C_K:LAWYER2] +Seguimi! -[TOUR02:TOUR] -~w~Porta il turista a ~y~Chinatown Plaza~w~ a Portland. +[LAW2_1:LAWYER2] +Che cos'hai da guardare? -[TOUR03:TOUR] -~w~Porta il turista alla ~y~cattedrale di Liberty~w~ a Staunton. +[LAW2_2:LAWYER2] +Ti conviene iniziare a parlare... -[TOUR06:TOUR] -~w~Porta il turista allo ~y~Strip Club~w~ nel Red Light District di Portland. +[LAW2_3:LAWYER2] +Maledetto stronzo! -[TOUR07:TOUR] -~w~Porta la turista al ~y~Liberty City Museum~w~ di Staunton. +[LAW2_4:LAWYER2] +Da questa parte! -[TOUR08:TOUR] -~w~Porta il turista al ~y~casinò~w~ di Staunton. +[LAW2_5:LAWYER2] +Vediamo cosa riesco a scoprire. Ci vediamo, Tommy. -[TOUR10:TOUR] -~w~Porta il turista al ~y~municipio~w~ a Staunton. +[LAW2_6:LAWYER2] +~g~Vai al Malibu e trova Kent Paul. -[TOUR11:TOUR] -~w~Porta il turista alla spiaggia di ~y~Portland. +[LAW2_7:LAWYER2] +~g~Trova lo chef in Ocean Drive. -[TOUR04:TOUR] -~w~Porta la turista al ~y~Callahan Bridge~w~, dal lato di Portland. +[LAW2_10:LAWYER2] +~g~Torna in macchina all'hotel. -[TOUR09:TOUR] -~w~Porta il turista alla ~y~casa di Black Lightman~w~ a Cedar Grove, Shoreside Vale. +[LAW2_11:LAWYER2] +~g~Raccogli il suo cellulare. -[TOUR_I1:TOUR] -~w~Scorta i turisti nei punti famosi di Liberty City. +[LAW2_12:LAWYER2] +Cellulare acquisito! Adesso potrai ricevere telefonate! -[TOUR_IA:TOUR] -~w~Quando arrivi a destinazione, scatta delle foto ricordo per loro. +[LAW2_13:LAWYER2] +~g~Hai lasciato Lance indietro! Vallo a prendere! -[TOUR_IB:TOUR] -~w~Poi portali indietro prima che l'aereo decolli. +[LAW2_14:LAWYER2] +Andiamocene da qui! -[TOURMEM:TOUR] -~w~VEDUTA ~1~: ~w~Questo veterano vuole rendere omaggio ai suoi commilitoni al Liberty City War Memorial a Belleville Park, Staunton. +[GUN_2A:LAWYER2] +Tieni premuto il ~h~~k~~PED_LOCK_TARGET~~w~ per la ~h~mira automatica~w~ e premi il ~h~~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~! -[TOUR05:TOUR] -~w~Porta il turista al ~y~Liberty City War Memorial~w~ a Belleville Park, Staunton. +[GUN_2C:LAWYER2] +Tieni premuto il ~h~~k~~PED_LOCK_TARGET~~w~ per la ~h~mira automatica~w~ e premi il ~h~~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~! + +[GUN_2D:LAWYER2] +Tieni premuto il ~h~~k~~PED_LOCK_TARGET~~w~ per la ~h~mira automatica~w~ e premi il ~h~~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~! + +[HELP17:LAWYER2] +Premi il ~h~~k~~PED_FIREWEAPON~~w~ per attaccare lo chef. + +[HELP18:LAWYER2] +Premi il ~h~~k~~PED_FIREWEAPON~~w~ per attaccare lo chef. + +[LAW3_11:LAWYER2] +Posizionati sul ~q~segnalino rosa~w~ per vedere le armi in offerta. + +[LAW3_12:LAWYER2] +Puoi selezionare l'arma premendo il ~h~tasto direzionale~w~ a ~h~sinistra~w~ o a ~h~destra~w~. + +[LAW3_13:LAWYER2] +Se hai denaro a sufficienza puoi comprare armi premendo il ~h~~k~~PED_SPRINT~~w~. + +[LAW3_14:LAWYER2] +Puoi uscire da un negozio premendo il ~h~~k~~VEHICLE_ENTER_EXIT~~w~. + +[LAW3_15:LAWYER2] +Segui il ~h~segnale a forma di pistola~w~ per trovare ~h~Ammu-Nation~w~. + +[LAW2_15:LAWYER2] +~g~Raggiungi Ammu-Nation. + +[LAW2_K:LAWYER2] +Vedi di star calmo. + +[LAW2_16:LAWYER2] +Devi sapere qualcosa su questa città: hai bisogno di potenza di fuoco. + +[LAW2_17:LAWYER2] +Forza, l'armaiolo locale è solo a qualche isolato di distanza. + +[LAW2_18:LAWYER2] +Tommy, tutti quanti hanno bisogno di un po' di relax ogni tanto. + +[LAW2_19:LAWYER2] +Ecco il club a luci rosse Pole Position. Facci un salto ogni tanto. + +{=================================== MISSION TABLE LAWYER3 ===================================} + +[LAW3_A:LAWYER3] +Aarrgh! Maledizione, sei tu! Oddio, avrò bisogno di un nuovo paio di pantaloni! + +[LAW3_B:LAWYER3] +Ehi, quei psicopatici del nord hanno drizzato le orecchie e verranno a visitarci molto presto. + +[LAW3_C:LAWYER3] +Dove diavolo sono i fottuti soldi? + +[LAW3_D:LAWYER3] +Rilassati, rilassati. Non siamo ancora arrivati a questa parte. + +[LAW3_E:LAWYER3] +Pensavo ti stessi prendendo cura di questo aspetto, davvero. + +[LAW3_F:LAWYER3] +E adesso quei delinquenti si aspettano addirittura da noi un favore. + +[LAW3_G:LAWYER3] +Vuoi dire che io devo far loro un favore. + +[LAW3_H:LAWYER3] +Oh, beh, certo, proprio così. Credi davvero che potrei intimidire una giuria? + +[LAW3_I:LAWYER3] +Non riuscirei a intimidire neppure un bambino... e credimi, ci ho provato. + +[LAW3_J:LAWYER3] +Adesso o ci riusciamo, oppure il cugino di Forelli, Giorgio, si becca cinque anni per frode. + +[LAW3_K:LAWYER3] +Devi CONVINCERE questi tipi! + +[LAW3_L:LAWYER3] +Capisco. Devo aiutare la giuria a cambiare idea. Non preoccuparti... + +[LAW3_M:LAWYER3] +No no no no NO! Ci ho provato. Le cose con la giuria non sono andate per il meglio, + +[LAW3_N:LAWYER3] +per cui ASSICURATI che cambino davvero idea. + +[LAW3_1:LAWYER3] +Giorgio ti manda i suoi saluti. + +[LAW3_2:LAWYER3] +Ricorda: colpevole è una parolaccia. + +[LAW3_3:LAWYER3] +Innocente fino a prova contraria... ecco cosa dire. + +[LAW3_4:LAWYER3] +Lo sai che non è colpevole. + +[LAW3_5:LAWYER3] +Ti ricordi di Giorgio? Ricordati che è innocente. + +[LAW3_6:LAWYER3] +Non colpevole... Capito? Bene. + +[LAW3_8:LAWYER3] +~r~Hai ucciso un giurato! + +[LAW3_9:LAWYER3] +~g~Distruggi l'auto del giurato per farlo uscire! + +[HELP40:LAWYER3] +Puoi distruggere le macchine utilizzando un martello o un'arma simile. + +[LAW3_10:LAWYER3] +~g~Visita il ~h~ferramenta~g~ per comprare un'arma corpo a corpo. + +[LAW3_20:LAWYER3] +~g~Distruggi la macchina del giurato! + +[LAW3_21:LAWYER3] +Non posso credere che sta succedendo! + +[LAW3_22:LAWYER3] +Incredibile! + +[LAW3_23:LAWYER3] +OK! OK! Ho compreso il messaggio! + +[LAW3_24:LAWYER3] +~g~Quel martello potrebbe tornare utile. + +[LAW3_7:LAWYER3] +~g~Minaccia i due giurati, ma NON ucciderli! + +[HELP23:LAWYER3] +Segui il ~h~segnale a forma di martello~w~ se vuoi comprare delle armi corpo a copro dal ferramenta. + +[LAW3_16:LAWYER3] +Stupidi idioti del Florida. + +[LAW3_17:LAWYER3] +Via dai piedi. + +{=================================== MISSION TABLE LAWYER4 ===================================} + +[LAW4_A:LAWYER4] +Avery, è chiaro che... Tommy! Tommy! Qualche progresso? No no no, parliamone dopo, mi racconti dopo. + +[LAW4_B:LAWYER4] +Tommy, ti presento Avery Carrington: credo tu lo abbia incontrato al party. + +[LAW4_C:LAWYER4] +Non di persona. + +[LAW4_D:LAWYER4] +Piacere. + +[LAW4_E:LAWYER4] +Avery ha una proposta da farci. + +[LAW4_F:LAWYER4] +Non ti sembra che abbiamo già altro da fare? + +[LAW4_G:LAWYER4] +Sto cercando di tenere lontani i lupi dalla porta, per cui apprezzerei un po' di collaborazione. + +[LAW4_H:LAWYER4] +Sono tirato come un filo e, anche se dovessi morire alla fine della settimana, desidererei non farlo da povero! + +[LAW4_I:LAWYER4] +Adesso calmatevi, tutti e due. + +[LAW4_J:LAWYER4] +Figliolo, dammi una mano e vedrò di mettere a nanna sottoterra qualsiasi stronzo vi stia dando problemi. + +[LAW4_K:LAWYER4] +OK, cosa posso fare? + +[LAW4_L:LAWYER4] +Questa società di consegne ha un deposito su un terreno di prima qualità. Non vogliono vendere. + +[LAW4_M:LAWYER4] +Si sono rintanati come dei ratti di prateria, per cui vorrei andassi a trovarli e li facessi uscire con un po' di fumo. + +[LAW4_N:LAWYER4] +Raggiungi il posto e fai scoppiare un vespaio: + +[LAW4_O:LAWYER4] +mentre la sorveglianza sarà impegnata, entra dentro e mettili fuori gioco. + +[LAW4_P:LAWYER4] +Passa pure da Rafael's per un cambio d'abito: ci potresti mettere un po', ma va bene lo stesso. + +[LAW4_Q:LAWYER4] +Potrebbe funzionare una sommossa. + +[LAW4_R:LAWYER4] +Se le cose vanno come devono, passa a trovarmi nel mio ufficio... + +[LAW4_1:LAWYER4] +Disperdetevi! L'amministrazione discuterà qualsiasi rimostranza in modo appropriato! + +[LAW4_2:LAWYER4] +Disperdetevi! Tornate a casa! + +[LAW4_3:LAWYER4] +Disperdetevi! Questo comportamento è inaccettabile! + +[LAW4_4:LAWYER4] +Disperdetevi! Rischiate di finire tutti per strada! + +[LAW4_5:LAWYER4] +Forza, ragazzi! Spacchiamo il cranio a qualche rosso! + +[LAW4_13:LAWYER4] +~g~Comincia a combattere con almeno 4 lavoratori per avviare la sommossa. + +[LAW4_14:LAWYER4] +~g~Distruggi i van nell'autorimessa! + +[HELP38:LAWYER4] +Se uccidi qualcuno con un'arma, la lascerà cadere. + +[HELP39:LAWYER4] +Puoi far esplodere i barili di esplosivo, ma tieni la distanza! + +{=================================== MISSION TABLE MIAMI_1 ===================================} + +[T4X4_1A:MIAMI_1] +~g~Hai ~1~ secondi per attraversare ~y~24~g~ punti di controllo. ~g~Puoi attraversarli in ~y~QUALSIASI ORDINE~g~. + +[T4X4_1B:MIAMI_1] +~y~ATTRAVERSA~g~ il primo punto di controllo per attivare il ~r~TIMER~g~. + +[T4X4_1C:MIAMI_1] +~1~ su 24! + +[GETBIK1:MIAMI_1] +Hai ~1~ secondi per salire su una PCJ 600! + +[GETBIK3:MIAMI_1] +~r~Hai bisogno di una PCJ 600 per affrontare questa missione! + +{=================================== MISSION TABLE MM ===================================} + +[BLOD_04:MM] +CONDIZIONI MACCHINA: + +[BLOD_05:MM] +~g~TEMPO BERSAGLIO: ~1~ minuto + +[BLOD_06:MM] +~g~TEMPO BERSAGLIO: ~1~ minuti + +[BLOD_07:MM] +NUOVO miglior tempo: ~1~ secondi + +[BLOD_08:MM] +Veicoli distrutti: ~1~ + +[BLOD_09:MM] +~1~$ + +[BLOD_10:MM] +VINCITORE!!! + +[BLOD_01:MM] +Guida attraverso i punti di controllo per aumentare il tuo tempo globale. + +[BLOD_02:MM] +Fallirai se il tempo globale scadrà a zero. + +[BLOD_03:MM] +Porta il tuo tempo globale sopra a quello bersaglio per vincere! + +{=================================== MISSION TABLE OVALRIG ===================================} + +[HOTR_01:OVALRIG] +~g~La gara dura 12 giri: solo il primo, il secondo e il terzo si qualificheranno come vincitori. + +[HOTR_02:OVALRIG] +~g~Se il tuo mezzo viene distrutto, sarai squalificato. + +[HOTR_03:OVALRIG] +~g~Se danneggi il mezzo, potrai ripararlo ai box. + +[HOTR_04:OVALRIG] +~g~Da qui potrai uscire dallo stadio. + +[HOTR_05:OVALRIG] +Condizioni macchina: + +[HOTR_06:OVALRIG] +Giri: + +[HOTR_10:OVALRIG] +Tempo di gara: + +[HOTR_09:OVALRIG] +Posizione: + +[HOTR_12:OVALRIG] +~r~La tua macchina è stata distrutta! + +[HOTR_13:OVALRIG] +~r~Non hai vinto la gara! + +[HOTR_14:OVALRIG] +~r~Sei stato squalificato! + +[HOTR_15:OVALRIG] +Tempo: ~1~:~1~ + +[HOTR_16:OVALRIG] +Tempo: ~1~:0~1~ + +[HOTR_17:OVALRIG] +Tempo migliore: ~1~:~1~ + +[HOTR_18:OVALRIG] +Tempo migliore: ~1~:0~1~ + +[HOTR_19:OVALRIG] +Tempo migliore: NA + +[HOTR_20:OVALRIG] +Nuovo tempo migliore: ~1~:~1~ + +[HOTR_21:OVALRIG] +Nuovo tempo migliore: ~1~:0~1~ + +[HOTR_22:OVALRIG] +Miglior risultato: NA + +[HOTR_23:OVALRIG] +Miglior risultato: PRIMO + +[HOTR_24:OVALRIG] +Miglior risultato: SECONDO + +[HOTR_25:OVALRIG] +Miglior risultato: TERZO + +[HOTR_26:OVALRIG] +Miglior risultato: ~1~ + +[HOTR_27:OVALRIG] +Miglior giro: ~1~.~1~ secondi + +[HOTR_28:OVALRIG] +Miglior giro: ~1~.0~1~ secondi + +[HOTR_29:OVALRIG] +~1~$ + +[HOTR_30:OVALRIG] +PRIMA POSIZIONE + +[HOTR_31:OVALRIG] +SECONDA POSIZIONE + +[HOTR_32:OVALRIG] +TERZA POSIZIONE + +[HOTR_33:OVALRIG] +Miglior giro: NA + +[HOTR_11:OVALRIG] +Nuovo giro migliore: ~1~.~1~ secondi + +[HOTR_34:OVALRIG] +Nuovo giro migliore: ~1~.0~1~ secondi + +{=================================== MISSION TABLE PHIL1 ===================================} + +[PHIL1_A:PHIL1] +Phil? + +[PHIL1_B:PHIL1] +CORRI! + +[PHIL1_C:PHIL1] +Corri! + +[PHIL1_E:PHIL1] +Merda Phil, tu bevi quella schifezza? + +[PHIL1_F:PHIL1] +Accidenti, non la devi mica bere... + +[PHIL1_G:PHIL1] +basta una sniffata per sballare. + +[PHIL1_H:PHIL1] +Ascoltami Phil, mi hai detto che potevi fornirmi delle armi... + +[PHIL1_I:PHIL1] +Stanne certo! + +[PHIL1_J:PHIL1] +C'è un trafficante d'armi Messicano con cui ho fatto un po' di affari. + +[PHIL1_K:PHIL1] +Fa la sua consegna settimanale più o meno adesso. + +[PHIL1_L:PHIL1] +Sperona il suo camion e fai cadere le armi prima che scappi. + +[PHIL1_M:PHIL1] +E già che ci sei, fammi un favore: + +[PHIL1_N:PHIL1] +fallo fuori. + +[PHI1_01:PHIL1] +~g~Fai cadere le armi dal camion del trafficante. + +[PHI1_02:PHIL1] +~g~Il trafficante ha lasciato cadere il carico. Distruggi le casse e recupera le armi. + +[PHI1_03:PHIL1] +~g~Sembra abbiano chiesto rinforzi. + +[PHI1_04:PHIL1] +~g~Adesso finisci i trafficanti ancora vivi. + +[PHI1_HP:PHIL1] +Quando utilizzi una granata a tempo, lanciala e poi falla esplodere in un secondo momento. + +[PHIL1_O:PHIL1] +Hoooooweeeeee! + +[PHIL1_D:PHIL1] +Nona avvicinare mai una fiamma alla broda di Phil Cassidy! + +{=================================== MISSION TABLE PHIL2 ===================================} + +[PHIL2_A:PHIL2] +Ehi Phil, come butta? + +[PHIL2_B:PHIL2] +Eeeeehi Tommy, Come va? E passcato moolto tempo... + +[PHIL2_C:PHIL2] +Devi davvero smetterla con quella broda, + +[PHIL2_D:PHIL2] +accidenti, puzza di solvente. Mi fa bruciare gli occhi... + +[PHIL2_E:PHIL2] +Shshs shhh silenzio Tommy, + +[PHIL2_F:PHIL2] +e vieni qua che ho qualcoscia da farti vedere... qualcoscia... + +[PHIL2_G:PHIL2] +Woof! Oddio! Riuscirei a sniffarlo da qui in fondo! Mi gira già la testa! + +[PHIL2_H:PHIL2] +Non preoccuparti per l'odore, Tommy, guarda quescto... + +[PHIL2_I:PHIL2] +La fottuta batteria o qualcosc'altro... Scen'è un altra sulla mensola... + +[PHIL2_J:PHIL2] +TA-DAAA! + +[PHIL2_K:PHIL2] +Ommerda! + +[PHI2_01:PHIL2] +~g~Forza, porta Phil all'ospedale. + +[PHI2_03:PHIL2] +~r~Phil Cassidy è morto!!! Adesso chi ti rifornirà di armi? + +[PHI2_05:PHIL2] +Non all'ospedale, amico! Troppi poliziotti e Viet Cong! + +[PHI2_06:PHIL2] +C'è un vecchio ex-medico militare che mi deve qualche favore e una falciatrice. + +[PHI2_07:PHIL2] +Si trova lungo Little Havana, oooh guarda, un pesce gigante. + +[PHI2_08:PHIL2] +Attento! Nemico tra gli alberi! + +[PHI2_09:PHIL2] +Mi sbaglio o le strade sono di gelatina? + +[PHI2_10:PHIL2] +Cucchiaio Storto a Mamma Gallina, mi ricevi? + +[PHI2_11:PHIL2] +Cucchiaione-ione Woo Woo Woooo! + +[PHI2_12:PHIL2] +Sta venendo per me, amico! + +[PHI2_13:PHIL2] +Piume nere che svolazzano dappertutto... + +[PHI2_14:PHIL2] +È così bello, amico... così bello... ma così freddo... + +[PHI2_15:PHIL2] +10-4, abbiamo un guidatore ubriaco. + +[PHI2_04:PHIL2] +SALUTE DI PHIL: + +[PHI_AS1:PHIL2] +PHILS PLACE COMPLETATO + +[PHI_AS2:PHIL2] +~g~Nuove armi disponibili presso Phils Place. {=================================== MISSION TABLE PIZZA ===================================} -[PIZ1_06:PIZZA] -~w~Premi~h~ ~k~ ~TGSUB~ ~w~quando sei in moto per annullare la missione. +[PIZ1_01:PIZZA] +~g~Vai a consegnare queste pizze: devi lanciarle ai clienti. Fai un giro e tira le pizze. [PIZ1_02:PIZZA] -~w~Hai finito le pizze! Torna da ~y~Joe's~w~ per recuperarne altre. +~g~Hai lanciato tutte le pizze, torna indietro e prendine altre. + +[PIZ1_05:PIZZA] +~g~Hai cinque minuti per consegnare le pizze prima che i clienti chiamino un altro negozio di consegne. [PIZ1_07:PIZZA] ~r~Hai ucciso un cliente! Sei licenziato! [PIZ1_08:PIZZA] -~r~Tempo scaduto, sei licenziato! - -[PIZ1_09:PIZZA] -~r~Hai distrutto il nostro motorino! Fuori di qui! - -[PIZ1_11:PIZZA] -~w~Devi usare il ~b~motorino~w~ delle pizze per consegnare gli ordini! - -[PIZ1_12:PIZZA] -Pizze - -[PIZ1_13:PIZZA] -~w~Pizza! Calda e pronta a partire! L'adoro! - -[PIZ1_14:PIZZA] -~w~Queste sono già pronte... Fila! - -[PIZ1_15:PIZZA] -~w~Questa è bella piccante! - -[PIZ1_16:PIZZA] -~w~Togliti le mani dal culo e corri a consegnare le pizze, spicciati! - -[PIZ1_17:PIZZA] -~w~Queste pizze devono essere consegnate oggi, non l'anno prossimo! - -[PIZ1_18:PIZZA] -~w~Consegnare le pizze è un brutto lavoro? Beh, scusami tanto, professore! - -[PIZ1_19:PIZZA] -~w~Hai intenzione di fare queste consegne o no? - -[PIZ1_20:PIZZA] -~w~Sei licenziato! ...Scherzavo, ma nemmeno tanto, se non farai queste consegne in tempo! - -[PIZ1_21:PIZZA] -~w~Pizze! Forza! I grassoni ci stanno aspettando! - -[PIZ1_22:PIZZA] -~w~Hai sputato sulle pizze? Avresti dovuto, aggiunge quel tocco di gusto in più! - -[PIZ1_23:PIZZA] -~w~Pensi che si consegneranno da sole? - -[PIZ1_24:PIZZA] -~w~Se le consegni fredde, difficilmente ti pagheranno! - -[PIZ1_25:PIZZA] -~w~Sbrigati! - -[PIZ1_26:PIZZA] -~w~Ehi, consegna queste! - -[PIZ1_27:PIZZA] -~w~OK, fai la consegna e torna a prenderne altre. - -[PIZ1_28:PIZZA] -~w~Le nostre pizze sono le migliori! Consegnale in tempo o ti prenderò a calci! - -[PIZ1_29:PIZZA] -~w~Ne vuoi ancora? Non so più come insultarti! - -[PIZ1_30:PIZZA] -~w~Ci ho starnutito sopra! Non importa, consegnale lo stesso! - -[PIZ1_31:PIZZA] -~w~Odio questo lavoro, ma almeno ti faccio sgobbare in giro. - -[PIZ1_3A:PIZZA] -~w~Se non le consegnerai in tempo, non ti darò un soldo! - -[PIZ1_32:PIZZA] -~r~Non sopporti la nostra pizza? - -[PIZ1_33:PIZZA] -~w~Torna da ~y~Joe's~w~ per nuovi ordini. - -[PIZ1_34:PIZZA] -~w~Consegna effettuata, soldi incassati! - -[PIZ_WON:PIZZA] -~w~Lavoro di consegna delle pizze completato! Il tuo livello massimo di salute è aumentato! - -[PIZ_WO1:PIZZA] -~w~Il ristorante di Joe's è sotto la tua 'protezione'. Ricordati di passare a prendere i pagamenti regolarmente. - -[PIZ1_01:PIZZA] -~w~Vai a consegnare queste pizze ai nostri ~b~clienti~w~ il più rapidamente possibile. - -[PIZ1_05:PIZZA] -~w~Per lanciare una pizza a un cliente, usa la visuale laterale. - -{=================================== MISSION TABLE TAXI ===================================} - -[TAXI1:TAXI] -~w~Cerca un ~b~passeggero. - -[TAXI1A:TAXI] -~w~Non ci sono passeggeri da queste parti, continua a cercare! - -[TAXI2:TAXI] -~r~Tempo scaduto! - -[TAXI3:TAXI] -~w~Il passeggero è fuggito terrorizzato! - -[TAXI4:TAXI] -~w~Corsa completata: ~1~$ - -[TAXI4A:TAXI] -~w~Corsa completata: bonus ~1~$ + ~1~ DI FILA! ~1~$ - -[TAXI5:TAXI] -~w~BONUS VELOCITÀ: ~1~$ - -[TAXI5A:TAXI] -~w~BONUS VELOCITÀ: bonus ~1~$ + ~1~ DI FILA! ~1~$ - -[TAXI7:TAXI] -~w~La tua macchina è distrutta, falla riparare! - -[TAXI8:TAXI] -~r~Missione taxi annullata. - -[TAXI9:TAXI] -~r~Il tuo taxi è stato distrutto! - -[FARES:TAXI] -Corse - -[TIP:TAXI] -Mancia - -[FARE9:TAXI] -~w~Destinazione ~y~'Portland docks'. - -[FARE20:TAXI] -~w~Destinazione ~y~'il parco' ~w~a Belleville. - -[FARE22:TAXI] -~w~Destinazione ~y~'Cochrane Dam'. - -[FARE2:TAXI] -~w~Destinazione ~y~'Head Radio'~w~, Harwood. - -[FARE3:TAXI] -~w~Destinazione ~y~'porto dei traghetti'~w~, Harwood. - -[FARE4:TAXI] -~w~Destinazione ~y~'ospedale'~w~, Portland View. - -[FARE7:TAXI] -~w~Destinazione ~y~'cantiere edile'~w~, Hepburn Heights. - -[FARE8:TAXI] -~w~Destinazione ~y~'ristorante di Cipriani'~w~, Saint Mark's. - -[FARE10:TAXI] -~w~Destinazione ~y~'Punk Noodles'~w~, Chinatown. - -[FARE12:TAXI] -~w~Destinazione ~y~'porto dei traghetti'~w~, Rockford. - -[FARE13:TAXI] -~w~Destinazione ~y~'la chiesa'~w~, Bedford Point. - -[FARE14:TAXI] -~w~Destinazione ~y~'uffici del Liberty Tree'~w~, Bedford Point. - -[FARE15:TAXI] -~w~Destinazione ~y~'università di Liberty'~w~, Liberty Campus. - -[FARE16:TAXI] -~w~Destinazione ~y~'Hogs 'n' Cogs'~w~, Belleville Park Area. - -[FARE17:TAXI] -~w~Destinazione ~y~'palazzo di giustizia'~w~, Belleville Park Area. - -[FARE18:TAXI] -~w~Destinazione ~y~'Mr. Benz'~w~, Bedford Point. - -[FARE19:TAXI] -~w~Destinazione ~y~'Joe's Pizza'~w~, Bedford Point. - -[FARE21:TAXI] -~w~Destinazione ~y~'Terminal A'~w~, aeroporto internazionale Francis. - -[FARE23:TAXI] -~w~Destinazione ~y~'la villa'~w~, Cedar Grove. - -[FARE24:TAXI] -~w~Destinazione ~y~'l'ospedale'~w~, Pike Creek. - -[FARE25:TAXI] -~w~Destinazione ~y~'il parco'~w~, Shoreside Vale. - -[FARE26:TAXI] -~w~Destinazione ~y~'North West Towers'~w~, Wichita Gardens. - -[FARE27:TAXI] -~w~Destinazione ~y~'deposito dei pullman'~w~, Trenton. - -[FARE28:TAXI] -~w~Destinazione ~y~'Mr. Benz'~w~, Chinatown. - -[FARE29:TAXI] -~w~Destinazione ~y~'Mr. Benz'~w~, Pike Creek. - -[FARE30:TAXI] -~w~Destinazione ~y~'Terminal C'~w~, aeroporto internazionale Francis. - -[FARE31:TAXI] -~w~Destinazione ~y~'AM Petroleum'~w~, Pike Creek. - -[FARE32:TAXI] -~w~Destinazione ~y~'Liberty Pharmaceuticals'~w~, Pike Creek. - -[FARE11:TAXI] -~w~Destinazione ~y~'negozio di Phil Cassidy'~w~, Bedford Point. - -[FARE1A:TAXI] -~w~Destinazione ~y~'Paulie's Revue Bar'~w~, Red Light District. - -[FARE1C:TAXI] -~w~Destinazione ~y~'Sex Club Seven'~w~, Red Light District. - -[FARE5:TAXI] -~w~Destinazione ~y~'Ammu-Nation'~w~, Red Light District. - -[FARE6:TAXI] -~w~Destinazione ~y~'Capital Autos'~w~, Saint Mark's. - -{=================================== MISSION TABLE AMBU ===================================} - -[A_FAIL2:AMBU] -~r~La tua scarsa sollecitudine è stata fatale al paziente! - -[A_FAIL3:AMBU] -~r~Il paziente è morto! - -[ATUTOR4:AMBU] -~w~Ogni impatto riduce le speranze di sopravvivenza del paziente. - -[A_TIME:AMBU] -~w~Paziente recuperato +~1~ secondi - -[A_TIME2:AMBU] -~w~Bonus! +~1~ secondi - -[AREWARD:AMBU] -~w~Livello ~1~ completato! Ricompensa: ~1~$ - -[A_RANGE:AMBU] -~r~La radio dell'ambulanza è fuori campo, avvicinati a un ospedale! - -[ATUTOR5:AMBU] -~w~Carica un ~b~paziente. - -[ATUTOR6:AMBU] -~w~Porta il paziente all'~y~ospedale! - -[ATUTOR7:AMBU] -~w~Carica altri ~b~pazienti~w~, o porta questo all'~y~ospedale. - -[A_FULL:AMBU] -~w~L'ambulanza è piena! Scarica i pazienti all'~y~ospedale! - -[A_RANG2:AMBU] -~r~La radio dell'ambulanza non funziona in metropolitana! - -{=================================== MISSION TABLE TV ===================================} - -[TV_01:TV] -Slash TV - -[TV_02:TV] -~w~Uccidi tutti gli psicopatici... continuano ad arrivare! - -[TV_03:TV] -~w~Ogni livello diventa sempre più difficile per via del maggior numero di nemici... con maggiori premi in palio! - -[TV_04:TV] -~w~LIVELLO ~1~ - -[TV_10:TV] -~w~Hai vinto un premio extra! - -[TV_09:TV] -Soldi totali guadagnati nell'episodio: ~1~$! - -[TV_05:TV] -~w~LIVELLO COMPLETATO! - -[TV_06:TV] -~w~Hai vinto ~1~$ in premi! - -[TV_07:TV] -~w~PRONTI... - -[TV_08:TV] -~w~VIA! - -{=================================== MISSION TABLE NOODLE ===================================} - -[NDL1_02:NOODLE] -~w~Uh oh, hai finito i noodle! Torna da ~y~Punk Noodles~w~ per recuperarne altri. - -[NDL1_06:NOODLE] -~w~Premi~h~ ~k~ ~TGSUB~ ~w~quando sei in moto per annullare la missione. - -[NDL1_07:NOODLE] -~r~Hai ucciso un cliente! Sei licenziato! - -[NDL1_08:NOODLE] ~r~Tempo scaduto. Sei licenziato! -[NDL1_09:NOODLE] -~r~Hai distrutto il nostro motorino! Sei licenziato! +[PIZ1_09:PIZZA] +~r~Hai distrutto il nostro mezzo! Sei licenziato! -[NDL1_11:NOODLE] -~w~Torna sul ~b~motorino! +[PIZ1_11:PIZZA] +Ehi! Rimettiti in sella! -[NDL1_12:NOODLE] -Noodle +[PIZ1_12:PIZZA] +Pizze mancanti: -[NDL1_13:NOODLE] -~w~Noodle! Un bel po' di noodle da consegnare! +[PIZ1_06:PIZZA] +Premi il ~h~~k~~TOGGLE_SUBMISSIONS~~w~ mentre sei in moto per interrompere la missione. -[NDL1_14:NOODLE] -~w~I nostri clienti non sono mai sazi dei miei noodle. +[PIZ1_13:PIZZA] +Consegnale belle calde e fragranti. -[NDL1_15:NOODLE] -~w~Ci sono dei noodle da consegnare! +[PIZ1_14:PIZZA] +Amico, eccoti le pizze. -[NDL1_16:NOODLE] -~w~Proviamo a consegnare questi noodle in tempo! +[PIZ1_15:PIZZA] +Ehi, amico, consegnale in fretta. -[NDL1_17:NOODLE] -~w~Ehi amico! Questi noodle sono pronti! +[PIZ1_16:PIZZA] +Che cosa stai aspettando, amico? Hai delle pizze da consegnare! -[NDL1_18:NOODLE] -~w~Consegna questi noodle! +[PIZ1_17:PIZZA] +So che non volevi fare il fattorino delle pizze, ma non me ne frega niente. -[NDL1_19:NOODLE] -~w~I nostri clienti vogliono noodle caldi, non freddi! +[PIZ1_18:PIZZA] +Consegna queste. -[NDL1_20:NOODLE] -~w~In cucina fa troppo caldo? Confucio dice 'spegni il forno'. +[PIZ1_19:PIZZA] +Devi consegnare queste. -[NDL1_21:NOODLE] -~w~Consegnerai questi noodle, vero? +[PIZ1_20:PIZZA] +Forza, ragazzo, consegna queste o sei licenziato. -[NDL1_22:NOODLE] -~w~Altri noodle pronti per essere consegnati. +[PIZ1_21:PIZZA] +C'è gente in attesa, amico. -[NDL1_23:NOODLE] -~w~Noodle, noodle, noodle! Consegnali belli caldi! +[PIZ1_22:PIZZA] +Che cosa stai aspettando? Devono essere consegnate! -[NDL1_24:NOODLE] -~w~C'è gente che sta aspettando! Oh, che fine faremo... +[PIZ1_23:PIZZA] +Consegna queste maledette pizze. -[NDL1_25:NOODLE] -~w~Perché quest'ordine non è ancora stato consegnato? +[PIZ1_24:PIZZA] +Forza, consegnale calde. -[NDL1_26:NOODLE] -~w~Cosa stai aspettando? Il capodanno cinese? +[PIZ1_25:PIZZA] +Ehi, ti occuperesti di queste? -[NDL1_27:NOODLE] -~w~Questi noodle si stanno raffreddando. Sbrigati! +[PIZ1_26:PIZZA] +Ehi, consegna subito queste: forza amico. -[NDL1_28:NOODLE] -~w~Volevo fare l'astronauta, ma ho ereditato questo posto da mio padre... cosa potevo fare? +[PIZ1_27:PIZZA] +Forza, siamo di fretta: consegnale subito. -[NDL1_29:NOODLE] -~w~Se vuoi mantenere il tuo posto di lavoro, sbrigati a fare le consegne. +[PIZ1_28:PIZZA] +Ancora tu? Bene, consegnale in fretta, amico. -[NDL1_30:NOODLE] -~w~Noodle fritti croccanti... Non li capisco, ma li adoro. +[PIZ1_29:PIZZA] +Non c'è tempo da perdere, consegnale tutte. -[NDL1_31:NOODLE] -~w~Avrei detto che consegnare pizze era più nel tuo stile. +[PIZ1_30:PIZZA] +Muoviti, brutto pelandrone, consegna questa roba in tempo. -[NDL1_3A:NOODLE] -~w~Ne vogliono sempre di più. Torna quando avrai finito. +[PIZ1_31:PIZZA] +Non otterrai una promozione se non ti muoverai più in fretta. -[NDL1_32:NOODLE] -~r~Qual è il tuo problema? Non ti piacciono i noodle? +[PIZ1_32:PIZZA] +~r~La pizza è troppo calda per te? -[NDL1_33:NOODLE] -~w~Torna da ~y~Punk Noodles~w~ per altre ordinazioni. +[PIZ1_33:PIZZA] +~g~Torna alla pizzeria per altre ordinazioni. -[NDL1_34:NOODLE] -~w~Noodle consegnati, soldi incassati! +[PIZ1_34:PIZZA] +~g~Pizze consegnate, ecco i soldi. -[NDL_WON:NOODLE] -~w~Complimenti, lavoro di consegna dei noodle completato! Il tuo livello massimo di salute è aumentato! +[PIZ_WON:PIZZA] +Missione Pizza completata. Valore massimo dell'salute aumentato a 150. -[NDL_WO1:NOODLE] -~w~Punk Noodles è sotto la tua 'protezione'. Ricordati di passare a prendere i pagamenti regolarmente. +{=================================== MISSION TABLE PORN1 ===================================} -[NDL1_01:NOODLE] -~w~Consegna questi noodle ai nostri ~b~clienti~w~! +[POR1_A:PORN1] +Azione! -[NDL1_05:NOODLE] -~w~Per lanciare i noodle a un cliente, usa la visuale laterale. +[POR1_B:PORN1] +Whoa! Questo sì che è un bel... -{=================================== MISSION TABLE MPSURV ===================================} +[POR1_C:PORN1] +30 centimetri, è questa la norma, baby. -[SAL01:MPSURV] -~w~Maria, sto andando in ospedale per quella 'cosa' che sai. +[POR1_D:PORN1] +TAGLIA! Chi è quell'idiota? Tu! TU! Che cosa stai facendo sul mio set? PERCHÉ? -[SAL02:MPSURV] -~w~Quando sarà fuori, questo vecchio stallone riprenderà a galoppare come al solito... +[POR1_E:PORN1] +Cosa sono tute queste stronzate? -[SAL04:MPSURV] -~w~PS: prepara la sella per quando sarò fuori, pupa! +[POR1_F:PORN1] +Alieni? Canne da pesca? -[SAL05:MPSURV] -~w~PPS: ...non lasciare questo foglio in giro! +[POR1_G:PORN1] +Chi ha mai visto uno squalo così grande? -[SAL03:MPSURV] -~w~Stai lontana dai guai perché sarà pieno di scagnozzi che tenteranno di prendere il controllo! +[POR1_H:PORN1] +Tutta questa roba deve andarsene. -[SAL03A:MPSURV] -~w~Letteralmente! +[POR1_I:PORN1] +Perché sei venuto a rompere, idiota? -{=================================== MISSION TABLE JDREF ===================================} +[POR1_J:PORN1] +Eh? -[JDT1_BA:JDREF] -~w~Non c'è lavoro per uno dei Leone! +[POR1_K:PORN1] +Per la passera, ecco perché! Che cos'è questo? -[JDT1_BB:JDREF] -~w~...Ehi Toni, torna quando darai meno nell'occhio. +[POR1_L:PORN1] +Questa è la mia arte. SORVEGLIANZA! -[CHNGOUT:JDREF] -~w~Cambiati l'abito dei Leone, altrimenti JD non ti potrà parlare. +[POR1_M:PORN1] +Ascolta, lurido fighettino, ti ho comprato. Ho comprato tutto questo. -{=================================== MISSION TABLE CRED01 ===================================} +[POR1_N:PORN1] +E ho intenzione di cambiare le cose da queste parti... -[CR01_01:CRED01] -~n~ ~n~ ~n~ ~n~CREDITS +[POR1_O:PORN1] +Ti farò ricco. -[CR01_02:CRED01] -~n~ ~n~ ~n~ ~n~ROCKSTAR NORTH +[POR1_P:PORN1] +Uh. Tu sei... tu... tu sei Tommy Vercetti? Pensavo che tu fossi... -[CR01_03:CRED01] -~n~ ~n~ ~n~ ~n~Producer ~n~Leslie Benzies +[POR1_Q:PORN1] +Esatto. -[CR01_04:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Aaron Garbut +[POR1_R:PORN1] +Faremo numerosi cambiamenti da queste parte e inizieremo a fare soldi veri. -[CR01_05:CRED01] -~n~ ~n~ ~n~ ~n~Technical Direction ~n~Obbe Vermeij, Adam Fowler +[POR1_S:PORN1] +Effettivamente, hai mai pensato che... -[CR01_06:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~Written By ~n~Dan Houser, James Worrall ~n~ & David Bland +[POR1_T:PORN1] +Ma prima dobbiamo trovare delle tope che meritino. -[CR01_07:CRED01] -~n~ ~n~ ~n~ ~n~Programming ~n~Alexander Roger, Alexander Illes, ~n~Andrzej Madajczyk, Barane Chan, ~n~Derek Payne, Derek Ward, +[POR1_U:PORN1] +Sì. Le ragazze sono carine, ma sai... Wow! -[CR01_08:CRED01] -~n~ ~n~Gordon Yeoman, Graeme Williamson, ~n~Greg Smith, James Broad, ~n~John Gurney, John Whyte, +[POR1_02:PORN1] +~g~Metti fuori gioco il pappone di Candy e poi passa a prenderla. -[CR01_09:CRED01] -~n~ ~n~Keith McLeman, Mark Nicholson, ~n~Shaun McKillop +[POR1_04:PORN1] +Yo, Candy. Sto cercando delle attrici talentuose: sei interessata? -[CR01_10:CRED01] -~n~ ~n~ ~n~ ~n~Audio Programmer ~n~Matthew Smith +[POR1_05:PORN1] +Certo! Ma prima dovrai parlare con il mio agente... -[CR01_11:CRED01] -~n~ ~n~ ~n~ ~n~Sound Design and Mastering ~n~Allan Walker +[POR1_06:PORN1] +Che DIAVOLO stai facendo? -[CR01_12:CRED01] -~n~ ~n~ ~n~ ~n~Lead Cut Scene Animator ~n~Mondo Ghulam +[POR1_07:PORN1] +Avresti fatto meglio a stare a casa oggi! -[CR01_13:CRED01] -~n~ ~n~ ~n~ ~n~Cut Scene Animator ~n~Dermot Bailie +[POR1_7B:PORN1] +Ma hai visto questo stronzo? -[CR01_14:CRED01] -~n~ ~n~ ~n~ ~n~Character Animator ~n~Felipe Busquets +[POR1_08:PORN1] +Ehi Mercedes! -[CR01_15:CRED01] -~n~ ~n~ ~n~ ~n~In-Game Animation ~n~Gus Braid, Terry Kenny +[POR1_09:PORN1] +Ehi Tommy, vuoi divertirti? -[CR01_16:CRED01] -~n~ ~n~ ~n~ ~n~Characters Artist ~n~Ian McQue +[POR1_10:PORN1] +Non adesso, tesoro. Sei interessata a fare dei film? -[CR01_17:CRED01] -~n~ ~n~ ~n~ ~n~Vehicle Artist ~n~Joylon Orme +[POR1_11:PORN1] +Certo, sempre che possano premiare il mio talento. -[CR01_18:CRED01] -~n~ ~n~ ~n~ ~n~Additional Art ~n~Rick Stirling, Alisdair Wood +[POR1_13:PORN1] +~g~Porta le ragazze allo studio e presentale a Steve. -[CR01_19:CRED01] -~n~ ~n~ ~n~ ~n~Music Producer ~n~Craig Conner +[POR1_14:PORN1] +Sei assunta! -[CR01_20:CRED01] -~n~ ~n~ ~n~ ~n~Audio Design and Dialogue Editor ~n~Will Morton +[POR1_15:PORN1] +Ehi Tommy, vieni anche tu per un riscaldamento? -[CR01_21:CRED01] -~n~ ~n~ ~n~ ~n~Additional Dialogue Editor ~n~Jon McCavish +[POR1_17:PORN1] +Whoa, che bello squalo! -[CR01_22:CRED01] -~n~ ~n~ ~n~ ~n~Development Support ~n~Milly Cottam +[POR1_18:PORN1] +~r~Mercedes è morta! -[CR01_23:CRED01] -~n~ ~n~ ~n~ ~n~Graphic Designers ~n~Stuart Petri, Steve Walsh +[POR1_20:PORN1] +Tommy, dove stai andando? Torna qui! -[CR01_24:CRED01] -~n~ ~n~ ~n~ ~n~Lead Level Design ~n~William Mills +[POR1_21:PORN1] +Dove stai andando? -[CR01_25:CRED01] -~n~ ~n~ ~n~ ~n~Level Design ~n~Chris Rothwell, Andy Duthie, ~n~Chris McMahon, Neil Ferguson +[POR1_22:PORN1] +Tommy, quando passeremo un po' di tempo io e te da soli? -[CR01_26:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Craig Arbuthnott +[POR1_01:PORN1] +~g~Candy Suxxx sarebbe perfetta per il ruolo da protagonista! -[CR01_27:CRED01] -~n~ ~n~ ~n~ ~n~Senior Lead Test ~n~Neil Corbett +[POR1_12:PORN1] +~g~Porta Candy con te all'appuntamento con Mercedes. -[CR01_28:CRED01] -~n~ ~n~ ~n~ ~n~Lead Test ~n~David Murdoch, Neil Meikle, ~n~Alex Bazlinton, Brenda Carey +[POR1_16:PORN1] +Magari più tardi... -[CR01_29:CRED01] -~n~ ~n~ ~n~ ~n~Build Engineer / Lead Test ~n~Neil Walker +[POR1_24:PORN1] +~g~Torna indietro e prendi Candy. -[CR01_30:CRED01] -~n~ ~n~ ~n~ ~n~Audio Test ~n~George Williamson +[POR1_25:PORN1] +~g~Hai lasciato Candy indietro, torna a prenderla. -[CR01_31:CRED01] -~n~ ~n~ ~n~ ~n~Test ~n~Brian Kelly, Lindsay Robertson, ~n~Sundram Soosay, Eugene Kuczerepa, ~n~Christopher Soosay, Ben Abbott, +[POR1_23:PORN1] +~g~Candy starà lavorando in ~h~Downtown~g~. -[CR01_32:CRED01] -~n~ ~n~Oliver Elliott, Louis Dinan, ~n~Bobby Wright, Thomas Philips, ~n~Nick Rees, Ivor Williams +[POR1_26:PORN1] +~g~Ecco Candy, sembra sia stata ancora con il deputato Shrub. -[CR01_33:CRED01] -~n~ ~n~ ~n~ ~n~Test Tools Programming ~n~James Whitcroft, Alex Carter +[POR1_27:PORN1] +Forza, andiamo. -[CR01_34:CRED01] -~n~ ~n~ ~n~ ~n~IT Manager ~n~Lorraine Roy +[POR1_28:PORN1] +Tommy, fai attenzione! Il mio seno siliconato non è ancora assicurato! -[CR01_35:CRED01] -~n~ ~n~ ~n~ ~n~IT Support ~n~Christine Chalmers, Dave Bruce +[POR1_29:PORN1] +È questo il modo di guidare? -[CR01_36:CRED01] -~n~ ~n~ ~n~ ~n~Studio Director ~n~Andrew Semple +[POR1_30:PORN1] +Non posso recitare dopo tutto questo! -[CR01_37:CRED01] -~n~ ~n~ ~n~ ~n~Office Administration ~n~Kim Gurney +[POR1_31:PORN1] +Cosa? Stai cercando di uccidermi? Credevo di essere una star! -[CR01_38:CRED01] -~n~ ~n~ ~n~ ~n~Administration Support ~n~Charlene Maguire, Kim Wilson +{=================================== MISSION TABLE PORN2 ===================================} -[CR02_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LEEDS +[POR2_A:PORN2] +Come stanno andando le riprese, Steve? -[CR02_02:CRED01] -~n~ ~n~ ~n~ ~n~Studio Director ~n~Gordon Hall +[POR2_B:PORN2] +Beh, Candy è un talento naturale e l'altra ragazza... è insaziabile! -[CR02_03:CRED01] -~n~ ~n~ ~n~ ~n~Head of Development ~n~David Box +[POR2_C:PORN2] +Si è passata metà del cast e dello staff prima ancora che iniziassi a fare i controlli delle luci. -[CR02_04:CRED01] -~n~ ~n~ ~n~ ~n~Lead Programming ~n~Andrew Greensmith, Matthew Shepcar ~n~ ~n~ ~n~ ~n~Console Programming ~n~Nigel Conroy, Richard Frankish, ~n~Andrew Greensmith, Robin Mangham, ~n~Damian McKenna, Finlay Munro, ~n~Stuart Roskell, Matthew Shepcar +[POR2_D:PORN2] +Comunque, eh, domani andiamo fuori a registrare le scene sulla barca... -[CR02_05:CRED01] -~n~ ~n~ ~n~ ~n~Programming ~n~Jon Bellamy, Ross Childs, ~n~Nigel Conroy, Neil Dodwell, ~n~Alastair Dukes, David Huebner, +[POR2_E:PORN2] +Scene sulla barca? Quali scene sulla barca? -[CR02_06:CRED01] -~n~ ~n~Robin Mangham, Jason McGann, ~n~Warren Merrifield, Stephen McGreal +[POR2_F:PORN2] +I pescatori sono presi dalla passione quando lo squalo gigante arriva e... -[CR02_07:CRED01] -~n~ ~n~ ~n~ ~n~Sound Programming ~n~Finlay Munro, Charles Waddington +[POR2_G:PORN2] +Che cosa ho detto sullo squalo gigante? -[CR02_08:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Ian Bowden +[POR2_H:PORN2] +Ho detto: 'NIENTE SQUALO GIGANTE', tutto chiaro? -[CR02_09:CRED01] -~n~ ~n~ ~n~ ~n~Art Department Director ~n~Chris Smart +[POR2_I:PORN2] +Lascia semplicemente le telecamere puntate sull'azione! -[CR02_10:CRED01] -~n~ ~n~ ~n~ ~n~Lead Character Artist ~n~Paul Smith +[POR2_J:PORN2] +OK, OK. Ehi Tommy, ci devo pure provare, no? -[CR02_11:CRED01] -~n~ ~n~ ~n~ ~n~Character Artist ~n~Chris Allison +[POR2_K:PORN2] +Hai fatto stampare quei volantini? -[CR02_12:CRED01] -~n~ ~n~ ~n~ ~n~Lead City Artist ~n~Dan Roberts +[POR2_L:PORN2] +Sì, ma nessuno ci farà distribuire quella roba, cioè... -[CR02_13:CRED01] -~n~ ~n~ ~n~ ~n~City Artists ~n~Paul McKee, James McHale, ~n~Siu Lee +[POR2_M:PORN2] +Lasciano semplicemente troppo, uh... poco all'immaginazione. -[CR02_14:CRED01] -~n~ ~n~ ~n~ ~n~Cutscene Interiors ~n~Izzy Stewart +[POR2_N:PORN2] +Non preoccuparti per quello. -[CR02_15:CRED01] -~n~ ~n~ ~n~ ~n~Concept Artist ~n~John Wigley +[POR2_O:PORN2] +Ho le mie idee sulla distribuzione. -[CR02_16:CRED01] -~n~ ~n~ ~n~ ~n~Additional Character Animation ~n~Alan Bowker +[POR2_P:PORN2] +OK. Ehi Candy, uh, nella mia roulotte. -[CR02_17:CRED01] -~n~ ~n~ ~n~ ~n~Additional Artists ~n~Andy Walker, Jason Gee, ~n~Chris Edwards, Lee Clark +[POR2_01:PORN2] +~g~C'è un idrovolante che è stato utilizzato nelle scene di alcuni vecchi film di Indy nel retro degli studi. -[CR02_18:CRED01] -~n~ ~n~ ~n~ ~n~Design Director ~n~David Bland +[POR2_02:PORN2] +~g~Passa sopra uno dei punti di controllo per cominciare a distribuire volantini. -[CR02_19:CRED01] -~n~ ~n~ ~n~ ~n~Lead Level Design ~n~John Li +[POR2_03:PORN2] +~g~Lancia i volantini fino alla fine del punto di controllo. -[CR02_20:CRED01] -~n~ ~n~ ~n~ ~n~Senior Level Design ~n~Tony Gowland, Martyn Bramall +[POR2_04:PORN2] +~r~CARBURANTE AL MINIMO!!! -[CR02_21:CRED01] -~n~ ~n~ ~n~ ~n~Level Design ~n~Sam Hackett, Stephen Robertson, ~n~Tom Kingsley, Chris Edwards, ~n~Kris Gormley +[POR2_05:PORN2] +Usalo per distribuire i volantini per la città. -[CR02_22:CRED01] -~n~ ~n~ ~n~ ~n~Associate Designer ~n~Mark McGinley +[DILDO:PORN2] +Carburante: -[CR02_23:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Paul Colls +[POR2_Q:PORN2] +Accidenti. -[CR02_24:CRED01] -~n~ ~n~ ~n~ ~n~QA ~n~Jody Cobb, ~n~ ~n~Luke Brown, Nick Robey, ~n~Matthew Haven +[PORN2_9:PORN2] +~g~Hai ~1~ secondi per tornare sulla tua Skimmer prima che la missione abbia termine. -[CR02_25:CRED01] -~n~ ~n~ ~n~ ~n~Company Secretary ~n~Naomi Martin +{=================================== MISSION TABLE PORN3 ===================================} -[CR02_26:CRED01] -~n~ ~n~ ~n~ ~n~IT Manager ~n~Chris Waring +[POR3_A:PORN3] +OK, qual è il problema adesso? -[CR03_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR NYC +[POR3_B:PORN3] +SSShhhh! -[CR03_02:CRED01] -~n~ ~n~ ~n~ ~n~Executive Producer ~n~Sam Houser +[POR3_C:PORN3] +Beh, dopo il suo incontro ravvicinato con le ninfo-invasori, -[CR03_03:CRED01] -~n~ ~n~ ~n~ ~n~VP of Creative ~n~Dan Houser +[POR3_D:PORN3] +il nostro eroe non riesce a pensare ad altro che a questa immensa montagna fallica... -[CR03_04:CRED01] -~n~ ~n~ ~n~ ~n~VP of Development ~n~Jamie King +[POR3_E:PORN3] +ed è qui che vogliamo girare la scena con la tinozza piena di puré, ma poi noi... -[CR03_05:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Alex Horton +[POR3_F:PORN3] +Non me ne può fregar di meno, -[CR03_06:CRED01] -~n~ ~n~ ~n~ ~n~Chief Technology Officer ~n~Gary J. Foreman +[POR3_G:PORN3] +Basta che continui, continui, continui. -[CR03_07:CRED01] -~n~ ~n~ ~n~ ~n~Associate Producer ~n~Rich Rosado +[POR3_H:PORN3] +Ehi Tommy... -[CR03_08:CRED01] -~n~ ~n~ ~n~ ~n~Director of Quality Assurance ~n~Jeff Rosa +[POR3_I:PORN3] +mi hai accennato qualcosa al telefono riguardo dei problemi legali... -[CR03_09:CRED01] -~n~ ~n~ ~n~ ~n~Senior Lead Analyst ~n~Lance Williams +[POR3_J:PORN3] +Ah sì! Il deputato Alex Shrub, lanciato verso la cattura di nuovi elettori, ha deciso di conquistare i puritani. -[CR03_10:CRED01] -~n~ ~n~ ~n~ ~n~Project Lead ~n~Jameel Vega +[POR3_K:PORN3] +Si mormora che voglia supportare delle misure per limitare, diciamo, -[CR03_11:CRED01] -~n~ ~n~ ~n~ ~n~Rockstar Test Team ~n~Ethan Abeles, William Rompf, ~n~Christopher Mansfield, Chris Choi, ~n~Mike Hong, Tamara Carrion, +[POR3_L:PORN3] +l'aspetto più carnale della grande industria nazionale dell'intrattenimento. -[CR03_12:CRED01] -~n~ ~n~Rich Huie, Mike Nathan, ~n~Vance Wallace, Marc Rodriguez, ~n~Adam Tetzloff +[POR3_M:PORN3] +Ottimo. -[CR03_13:CRED01] -~n~ ~n~ ~n~ ~n~Business Development Director ~n~Sean Macaluso +[POR3_N:PORN3] +Candy! Conosci Shrub, -[CR03_14:CRED01] -~n~ ~n~ ~n~ ~n~Soundtrack Supervision ~n~Heinz Henn, Ivan Pavlovich, ~n~Tim Sweeney +[POR3_O:PORN3] +voi ragazzi vi siete lanciati in qualcosa di perverso? -[CR04_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~CUT SCENES & DIALOGUE +[POR3_P:PORN3] +Oh sì, oh sì, oh sì! Sì sì sì SÌ OOOoooh! -[CR04_02:CRED01] -~n~ ~n~ ~n~ ~n~Motion Capture Director ~n~Navid Khonsari +[POR3_Q:PORN3] +Ti prego, dimmi che lo hai ripreso. -[CR04_03:CRED01] -~n~ ~n~ ~n~ ~n~Motion Capture Performed by ~n~Danny Mastrogiorgio, Jeffrey C. Hawkins, ~n~Bruce MacVittie, David Zayas, ~n~Peter Appel, Hannah Moon, ~n~Alyssa Truppelli, Joe Lotruglio +[POR3_R:PORN3] +Faceva parte del... uh... o stava parlando con... -[CR04_04:CRED01] -~n~ ~n~ ~n~ ~n~Voices Performed by ~n~Salvatore Leone - Frank Vincent ~n~Toni Cipriani - Danny Mastrogiorgio ~n~Donald Love - Will Janowitz +[POR3_S:PORN3] +Ehi, non saprei dire. Comunque... -[CR04_05:CRED01] -~n~ ~n~ Vincenzo Cilli - Joe Lotruglio ~n~Maria Latore - Fiona Gallagher ~n~JD O'Toole - Greg Wilson +[POR3_T:PORN3] +Ti consiglio vivamente di seguirla dopo le riprese, -[CR04_06:CRED01] -~n~ ~n~Leon McAffrey - Ron Orbach ~n~Ray Machowski - Peter Appel ~n~Toshiko Kasen - Hannah Moon +[POR3_U:PORN3] +vedi se va dritta al suo nuovo nido d'amore. -[CR04_07:CRED01] -~n~ ~n~ Ned Burner - Peter Bradbury ~n~Ma Cipriani - Sondra James ~n~Giovanni Casa - Joel Jones +[POR3_V:PORN3] +Hai una macchina fotografica? -[CR04_08:CRED01] -~n~ ~n~Kazuki Kasen - Keenan Shimizu, ~n~Massimo Torini - Duccio Faggella ~n~Mickey Hamfists - Chris Tardio +[POR3_X:PORN3] +Certo, dategliene una. -[CR04_09:CRED01] -~n~ ~n~Jane Hopper - Gordana Rashovich ~n~Mayor O'Donovan - John Braden ~n~8 Ball - Guru +[POR3_02:PORN3] +~r~Hai ucciso il deputato! Adesso come farai a ricattarlo? -[CR04_10:CRED01] -~n~ ~n~Radio Newscaster - Sharon Washington ~n~TV Reporter - Brooke Alexander +[POR3_03:PORN3] +~r~Hai allarmato la sorveglianza del deputato: lo porteranno immediatamente via. -[CR04_11:CRED01] -~n~ ~n~ ~n~ ~n~Pedestrian Dialogue ~n~Una Cruickshank, Gregory Johnson, ~n~Sanford Santacroce, Ayana Osada +[POR3_04:PORN3] +Candy, mi chiameresti Martha? -[CR04_12:CRED01] -~n~ ~n~ ~n~ ~n~Pedestrian Voices ~n~Jamie Hector, Jackson Loo, ~n~Bruce MacVittie, Jeff Gurner, ~n~Jamie Hector, Andrea Kessler, +[POR3_05:PORN3] +Oh Alex, cioè Martha. Tutto ciò che vuoi! -[CR04_13:CRED01] -~n~ ~n~Lynne Horton, Phil Mikkelson, ~n~Koji Nonoyama, Devin Bennett, ~n~Jay Capozello, Mike Nathan, +[POR3_06:PORN3] +Martha, qualcuno ci sta osservando... che cosa perversa. -[CR04_14:CRED01] -~n~ ~n~Ethan Abeles, Lance Williams, ~n~Natalya Wilson, Jay Gladstone, ~n~Craig Blair, Dave Edwards, +[POR3_07:PORN3] +Ehi tu. Dammi quella macchina fotografica! -[CR04_15:CRED01] -~n~ ~n~Gregory Johnson, John Zurhellen, ~n~Blair Sadler, Georgia Sadler, ~n~Nicole Sadler, Judy Henderson, +[POR3_01:PORN3] +~g~Segui la ~h~limousine~g~ di Candy. -[CR04_16:CRED01] -~n~ ~n~Kim Graham, Kerry Shaw, ~n~Tamara Carrion, Franceska Clemens, ~n~Navid Khonsari, Noelle Sadler, +[POR3_15:PORN3] +~r~Hai distrutto la limousine di Candy! -[CR04_17:CRED01] -~n~ ~n~Nicholas Mongomery, Anthony Macbain, ~n~Ryan Rayhill, Josh Slater, ~n~Carmelo Gaeta, Hikari Yokoyama, +[POR3_17:PORN3] +~g~Torna allo studio con il rullino. -[CR04_18:CRED01] -~n~ ~n~Chris Jobin, Michael Rothstein, ~n~Stacey Rachels, Jennifer Koontz, ~n~Dan Merrill, Ali Khonsari, +[POR3_19:PORN3] +~r~Hai finito il rullino! -[CR04_19:CRED01] -~n~ ~n~Ellen Rose, Chris Standal, ~n~Lorie Goodman, Neal Johnston, ~n~Son Garth, James Larsen, +[POR3_21:PORN3] +~g~Hai perso la limousine di Candy! -[CR04_20:CRED01] -~n~ ~n~Karl Weibel, Ramin Khonsari, ~n~Ed. Thomas Jr., Stanton Sargent, ~n~Oswald Greene, Audrey Amey, +[POR3_22:PORN3] +~g~L'hotel WR Chariot di fronte al balcone dovrebbe essere un luogo ideale per scattare le foto. -[CR04_21:CRED01] -~n~ ~n~Sanford Santacroce, Jeff Madrick, ~n~Ben Weaver, Andrea Kessler, ~n~CS Lee, Yoshi Amao, +[POR3_23:PORN3] +~g~C'è un ingresso laterale che ti permetterà di entrare nell'hotel. -[CR04_22:CRED01] -~n~ ~n~ Jackson Loo, Martha Morrison, ~n~Sarah Bloodsworth, Adam Deher, ~n~Billy Gonzalez +[POR3_08:PORN3] +Tieni premuto il ~h~~k~~PED_LOCK_TARGET~~w~ per ~h~mirare~w~ con la macchina fotografica. -[CR04_23:CRED01] -~n~ ~n~ ~n~ ~n~Additional Motion Graphics ~n~Maryam Parwana +[POR3_09:PORN3] +Tieni premuto il ~h~~k~~PED_LOCK_TARGET~~w~ per ~h~mirare~w~ con la macchina fotografica. -[CR04_24:CRED01] -~n~ ~n~ ~n~ ~n~Dialogue Recording & Mixing ~n~Nicholas Montgomery +[POR3_10:PORN3] +Premi il ~h~~k~~PED_SNIPER_ZOOM_IN~~w~ per ~h~zoomare~w~ con la macchina fotografica e il ~h~~k~~PED_SNIPER_ZOOM_OUT~~w~ per ~h~allargare il campo~w~. -[CR04_25:CRED01] -~n~ ~n~ ~n~ ~n~Foley Recording ~n~Bryan Scibinico +[POR3_11:PORN3] +Premi il ~h~~k~~PED_SNIPER_ZOOM_IN~~w~ per ~h~zoomare~w~ con la macchina fotografica e il ~h~~k~~PED_SNIPER_ZOOM_OUT~~w~ per ~h~allargare il campo~w~. -[CR04_26:CRED01] -~n~ ~n~ ~n~ ~n~Foley recorded at Dig It Studios +[POR3_12:PORN3] +Premi il ~h~~k~~PED_FIREWEAPON~~w~ per scattare una foto. -[CR04_27:CRED01] -~n~ ~n~ ~n~ ~n~Production Team ~n~Noelle Sadler, Eli Weissman, ~n~Kerry Shaw, John Zurhellen, ~n~Peter Adler, Anthony Carvalho, +[POR3_13:PORN3] +Premi il ~h~~k~~PED_FIREWEAPON~~w~ per scattare una foto. -[CR04_28:CRED01] -~n~ ~n~Phil Poli, Jaesun Celebre, ~n~Franceska Clemens, Anthony Litton +[POR3_14:PORN3] +Premi il ~h~~k~~PED_FIREWEAPON~~w~ per scattare una foto. -[CR04_29:CRED01] -~n~ ~n~ ~n~ ~n~Casting ~n~Judy Henderson and Associates +[POR3_20:PORN3] +~g~Se hai bisogno di un mezzo, usa lo ~h~Sparrow~g~ sul retro. -[CR04_30:CRED01] -~n~Motion Capture recorded at Perspective Studios +[POR3_16:PORN3] +~g~Hai bisogno di tre foto di qualità di Alex Shrub con Candy. -[CR05_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RADIO +[POR3_24:PORN3] +FOTO SCATTATE: -[CR05_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ Banter, Talk Radio, Commercials and Imaging written by ~n~Dan Houser and Lazlow +{=================================== MISSION TABLE PORN4 ===================================} -[CR05_03:CRED01] -~n~ ~n~ ~n~ ~n~Production by ~n~Lazlow +[POR4_A:PORN4] +Mi dispiace, ma adesso proprio non riesco ad ingoiarlo. -[CR05_04:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~LCFR +[POR4_B:PORN4] +Oh EDDAI tesoro! -[CR05_05:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Smith Harrison, Karen Saltus +[POR4_C:PORN4] +È inalberato come un capodoglio, accidenti, -[CR05_06:CRED01] -~n~ ~n~ ~n~ ~n~Heartland Values with Nurse Bob ~n~Nurse Bob - Chuck Montgomery +[POR4_D:PORN4] +come fai a non farti coinvolgere dalla parte? -[CR05_07:CRED01] -~n~ ~n~ ~n~ ~n~Guests and Callers ~n~Ayana Osada, Nick Montgomery, ~n~Russell Lewis, Nick Born, ~n~Sean Macaluso, Kerry Shaw, +[POR4_E:PORN4] +Ma Stevie... -[CR05_08:CRED01] -~n~ ~n~Chad Johnson, Craig Conner, ~n~Mary Elizabeth, Rob Cross, ~n~Josh Bitney +[POR4_F:PORN4] +Come sta andando il mio regista? -[CR05_09:CRED01] -~n~ ~n~ ~n~ ~n~Electron Zone ~n~Steve - Ptolemy Slocum ~n~Bill - Michael Urichek +[POR4_G:PORN4] +Oh, accidenti. Lo scontro tra l'integrità artistica e -[CR05_10:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Alice Saltzman, Jeremy Wheaton, ~n~Ryan Rayhill, Maine Anderson, ~n~Patton Oswalt, Wil Wheaton, ~n~Anthony Cumia, Madena Parwana +[POR4_H:PORN4] +i sobbalzi e le pompanti azioni continua senza sosta. -[CR05_11:CRED01] -~n~ ~n~ ~n~ ~n~Breathing World ~n~Lee Chowder - Ashley Albert ~n~Crow - Gregg Martin +[POR4_I:PORN4] +E, prima che tu me lo chieda, sì, tutti e quattro i film saranno pronti per... -[CR05_12:CRED01] -~n~ ~n~ ~n~ ~n~Coq 'O' Vin ~n~Richard Goblin - Mike Shapiro +[POR4_J:PORN4] +Dolcezza, potresti PER FAVORE tenere l'anaconda nell'inquadratura, -[CR05_13:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Ben Krech +[POR4_K:PORN4] +mi costa più lei all'ora di te! -[CR05_14:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Franceska Clemins, Sarah Bloodsworth, ~n~Adam Deher, Martha Morrison, ~n~Carmelo Gaeta +[POR4_L:PORN4] +Oh, scusa Steve. -[CR05_15:CRED01] -~n~ ~n~ ~n~ ~n~Chatterbox ~n~Lazlow as himself +[POR4_M:PORN4] +Pensavo, abbiamo bisogno di qualche grossa acrobazia per promuovere il lancio. -[CR05_16:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Susan Lewis, Ben Weaver, ~n~Jacky Bam Bam, Ben Sparks, ~n~Deanna Moyer, Liezl Jacinto, +[POR4_N:PORN4] +Qualcosa che farà davvero impatto sulla città... ti viene in mente niente? -[CR05_17:CRED01] -~n~ ~n~Joshua Batista, Gregg Opie Hughes, ~n~Sondra James, Elizabeth Satterwhite +[POR4_O:PORN4] +Beh, nei vecchio tempi si facevano le feste di gala, -[CR06_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~HEAD RADIO +[POR4_P:PORN4] +attori, limousine, il cielo notturno illuminato dai riflettori... -[CR06_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Michael Hunt - Russ Mottla +[POR4_Q:PORN4] +Riflettori? Mi è venuta un'idea... -[CR06_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Jeff Berlin, Katelyn Hutchinson +[POR4_R:PORN4] +...sì, sì, sì. I vestiti pieni di lustrini, e le limousine, oh, le prime visioni... -[CR06_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jeff Berlin +[POR4_S:PORN4] +Oh, sì signora, certo signora, -[CR06_05:CRED01] -~n~ ~n~ ~n~ ~n~"Train" ~n~Conor & Jay ~n~Written by Craig Conner & Julie Wemyss ~n~Produced by Craig Conner ~n~Guitars by Jon McCavish ~n~Vocals by Julie Wemyss and Craig Conner +[POR4_T:PORN4] +e la stampa, e gli sbarramenti di luci... -[CR06_06:CRED01] -~n~ ~n~ ~n~ ~n~"The One For Me" ~n~Cloud Nineteen ~n~Written & Produced by ~n~Will Morton ~n~Additional Lyrics by Paul Mackie ~n~Guitars by Allan Walker & Chris Morton ~n~Lead Vocals by Raff ~n~Backing Vocals by Paul Mackie & Raff +[POR4_01:PORN4] +~g~Raggiungi ~y~Downtown~g~ e posiziona i riflettori sopra l'edificio. -[CR06_07:CRED01] -~n~ ~n~ ~n~ ~n~"Take The Pain" ~n~Purser ~n~Written & Produced by ~n~Will Morton, Chris Morton ~n~Additional Lyrics by Paul Mackie ~n~Lead Vocals by Paul Mackie ~n~Additional Vocals by Will Morton +[POR4_02:PORN4] +~g~Avrai bisogno di una moto veloce per saltare da un tetto all'altro. La guardia della sorveglianza possiede una ~y~PCJ 600~g~... -[CR06_08:CRED01] -~n~ ~n~ ~n~ ~n~"Free Yourself" ~n~L-Marie featuring Raff ~n~Written & Produced by Craig Conner ~n~Vocals by L-Marie and Raff ~n~Backing Vocals by Craig Conner +[POR4_03:PORN4] +~g~Devi raggiungere i tetti degli edifici. Ci dovrebbe essere un ascensore in uno degli uffici ai piani superiori... -[CR06_09:CRED01] -~n~ ~n~ ~n~ ~n~"Drive" ~n~15 Ways ~n~Written & Produced by Colin Entwistle ~n~Vocals by Paul Mackie +[POR4_06:PORN4] +~g~Torna all'ufficio ai piani inferiori se vuoi accedere nuovamente ai tetti. -[CR06_10:CRED01] -~n~ ~n~ ~n~ ~n~"Welcome To The Real World" ~n~Rosco Stow ~n~Written & Produced by Craig Conner ~n~Guitars Written, Produced and Performed by Allan Walker ~n~Lead Vocals by Andy Dorrat ~n~Backing Vocals by Craig Conner, ~n~Anna Stuart and Kim Gurney +[POR4_07:PORN4] +~g~Avrai bisogno di una moto per saltare da un edificio all'altro. -[CR06_11:CRED01] -~n~ ~n~ ~n~ ~n~"Keep Dreaming" ~n~Vanilla Smoothie ~n~Written & Produced by ~n~Alastair MacGregor ~n~Guitars by Allan Walker ~n~Vocals by Fiona Stoddart +[POR4_08:PORN4] +~g~Lanciati attraverso la finestra per avviare il percorso. Avrai tempo fino alle 07:00 prima che diventi troppo luminoso per muoverti non visto. -[CR07_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~LIPS 106 +[POR4_09:PORN4] +~g~I bonus ti mostreranno il successivo edificio su cui saltare. -[CR07_02:CRED01] -~n~ ~n~ ~n~ ~n~DJs ~n~Cliff - Ed McMann ~n~Andee - Shelley Miller +[POR4_10:PORN4] +~r~È troppo tardi per arrivare in cima non visto. -[CR07_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Jonathan Hanst +[POR4_11:PORN4] +Ritorna alla scala se vuoi accedere nuovamente ai tetti. -[CR07_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jonathan Hanst +[POR4_05:PORN4] +~g~Queste scale portano a un ufficio ai piani inferiori. -[CR07_05:CRED01] -~n~ ~n~ ~n~ ~n~"Funk In Time" ~n~Rudy La Fontaine ~n~Written & Produced by Jon McCavish ~n~Guitars by Julian Pais ~n~Vocals by Julian Pais +[POR_AS1:PORN4] +STUDIO CINEMATOGRAFICO COMPLETATO -[CR07_06:CRED01] -~n~ ~n~ ~n~ ~n~"Love Is The Feeling" ~n~Sawarr ~n~Written by Craig Conner & Julie Wemyss ~n~Produced by Craig Conner ~n~Vocals by Julie Wemyss +[POR_AS2:PORN4] +~g~L'Inter Global Films d'ora in poi genererà introiti per un massimo di ~1~$. Ricordati di recuperarli regolarmente. -[CR07_07:CRED01] -~n~ ~n~ ~n~ ~n~"Mine Until Monday" ~n~Sunshine Shine ~n~Written & Produced by Will Morton ~n~Additional Lyrics by Paul Mackie ~n~Vocals by Paul Mackie & Raff +{=================================== MISSION TABLE PROT1 ===================================} -[CR07_08:CRED01] -~n~ ~n~ ~n~ ~n~"Get Down" ~n~Credit Check ~n~Written & Produced by ~n~Alastair MacGregor ~n~Guitars by Martyn Livingstone ~n~Bass by Andy Wilson ~n~Vocals by Louise Ferrier +[PRO1_B:PROT1] +Non sopporto più questo aspetto. Tommy, che ne dici? E se mettessimo un bar... -[CR07_09:CRED01] -~n~ ~n~ ~n~ ~n~"Tonight" ~n~Cool Timers ~n~Written & Produced by Craig Conner ~n~Vocals by Julie Wemyss +[PRO1_D:PROT1] +Ascoltami, -[CR07_10:CRED01] -~n~ ~n~ ~n~ ~n~"Bassmatic" ~n~Nina Barry ~n~Written & Produced by Jon McCavish ~n~Vocals by Riz Maslen +[PRO1_E:PROT1] +è giunta l'ora di prendere in mano questa città. È tutto pronto per questo. -[CR07_11:CRED01] -~n~ ~n~ ~n~ ~n~"Into Something (C'mon Get Down)" ~n~The Jackstars ~n~Written & Produced By ~n~Craig Conner ~n~Vocals by Lucie Danti-Juan ~n~Backing vocals by ~n~Kevin Stacey & Craig Conner +[PRO1_F:PROT1] +Dobbiamo cominciare a impadronirci del territorio -[CR08_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~DOUBLE CLEF FM +[PRO1_G:PROT1] +e far sapere a Vice City che ci sono nuovi giocatori in città, mi segui? -[CR08_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Sergio Boccino - Robert Blumenfeld +[PRO1_I:PROT1] +Tommy, ciò di cui hai bisogno è una facciata legale, delle proprietà. A me ha sempre fatto comodo. -[CR08_03:CRED01] -~n~ ~n~ ~n~ ~n~Caller ~n~Gerald Cosgrove +[PRO1_J:PROT1] +Dobbiamo iniziare a mostrare i denti o tutto questo lavoro sarà stato vano. -[CR08_04:CRED01] -~n~ ~n~ ~n~ ~n~"Il Trovatore: Anvil Chorus" ~n~Composed by Giuseppe Verdi ~n~Performed by ~n~Nuremberg Symphonic Orchestra ~n~& Munich State Opera Choir ~n~Courtesy of Point Classics, LLC +[PRO1_K:PROT1] +I gruppi locali sanno che Diaz è morto e si rifiutano di pagare per la protezione! -[CR08_05:CRED01] -~n~ ~n~ ~n~ ~n~"Il Trovatore: Tacea la notte placida" ~n~Composed by Giuseppe Verdi ~n~Performed by ~n~Nuremberg Symphonic Orchestra & ~n~Munich State Opera Choir ~n~(Eva Illes, Soprano) ~n~Courtesy of Point Classics, LLC +[PRO1_L:PROT1] +Potremmo provare con la corruzione... -[CR08_06:CRED01] -~n~ ~n~ ~n~ ~n~"Nabucco: Chorus of the Hebrew Slaves" ~n~Composed by Giuseppe Verdi ~n~Performed by Philharmonia Slavonica ~n~Courtesy of Point Classics, LLC +[PRO1_M:PROT1] +Corruzione? A fanculo la corruzione! Ti mostrerò io come si fa a spaventarli. -[CR08_07:CRED01] -~n~ ~n~ ~n~ ~n~"Così fan tutte: È amore un ladroncello" ~n~Composed by Wolfgang Amadeus Mozart ~n~Performed by ~n~Bratislava Opera Soloists, ~n~Choir and Orchestra ~n~(Ida Kirilova "Dorabella") ~n~Courtesy of Point Classics, LLC +[PRO1_01:PROT1] +~g~Assali i negozi e fuggi: i proprietari chiederanno la tua protezione. -[CR08_08:CRED01] -~n~ ~n~ ~n~ ~n~"Marriage of Figaro: Overture" ~n~Composed by Wolfgang Amadeus Mozart ~n~Performed by ~n~London Philharmonic Orchestra ~n~Courtesy of Point Classics, LLC +[PRO1_03:PROT1] +~r~Si trattava di un assali e fuggi, non di un assali e bevi un caffè. -[CR08_09:CRED01] -~n~ ~n~ ~n~ ~n~"I Pagliacci: Vesti la giubba" ~n~Composed by Ruggiero Leoncavallo ~n~Performed by ~n~Nuremberg Symphonic Orchestra ~n~(José Maria Perez, Tenor) ~n~Courtesy of Point Classics, LLC +[PRO1_04:PROT1] +Tutti i miei beni, distrutti! -[CR09_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RISE FM +[PRO1_05:PROT1] +Rovinato... ROVINATO! -[CR09_02:CRED01] -~n~ ~n~ ~n~ ~n~Engineered by Mike Callaghan +[PRO1_06:PROT1] +Maledizione, devo pagare la protezione! -[CR09_03:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Boy Sanchez - Oliver Vaquer +[PRO1_07:PROT1] +La mia meravigliosa vetrina! -[CR09_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~DJ Andre, Lupus Thunder, ~n~Andi Hanley, Mat Ckillz, ~n~Couzin Ed, Lazlow, +[PRO1_08:PROT1] +Il mio negozio, il mio bellissimo negozio. -[CR09_05:CRED01] -~n~ ~n~Terry Donovan, Bill Brissette, ~n~Juan Aller, Ed Andrews, ~n~Xeni Jardin, Matthew Orr, ~n~Jeff Berlin +[PRO1_09:PROT1] +Vercetti, ricorda questo nome. -[CR09_06:CRED01] -~n~ ~n~ ~n~ ~n~"Sing It Back ~n~(Boris Musical Mix)" ~n~Moloko ~n~Written by M. Brydon, R. Murphy ~n~Published by Chrysalis Music (ASCAP) ~n~Remix and Additional Production by ~n~Boris Dlugosch ~n~(p) + © 1998 The Echo Label ~n~Courtesy of Chrysalis Music Limited +[PRO1_10:PROT1] +Adesso gestisco io questa città. IO! -[CR09_07:CRED01] -~n~ ~n~ ~n~ ~n~"Free" ~n~Ultra Nate ~n~Written by U. Nate, L. Springsteen, ~n~J. Ciafone ~n~Published by Warner/ Chappell Music/ BMG Music ~n~(p) + © 1997 Strictly Rhythm Records LLC ~n~Courtesy of Warner Strategic Marketing +[BUYP1:PROT1] +Non puoi comprare proprietà in certe aree della mappa. -[CR09_08:CRED01] -~n~ ~n~ ~n~ ~n~"I Believe" ~n~Happy Clappers ~n~Written by C. Scott, G. Ripley, M. Knotts, M. Topham ~n~Published by All Boys Music Ltd ~n~(p) + © 1994 C J Scott Productions ~n~Courtesy of C J Scott Productions +[BUYP2:PROT1] +Se vedi un'icona a forma di casa verde, puoi comprare quella proprietà. -[CR09_09:CRED01] -~n~ ~n~ ~n~ ~n~"House Music" ~n~Eddie Amador ~n~Written by Eddie Amador ~n~Published by ~n~Deep Dish Music ~n~(p) + © 1998 Yoshitoshi Records ~n~Courtesy of ~n~Deep Dish Recordings, Inc. ~n~by arrangement with ~n~Nasseri Music Business Solutions +[PRO1_N:PROT1] +Sarò di ritorno fra cinque minuti... -[CR09_10:CRED01] -~n~ ~n~ ~n~ ~n~"Feel What You Want" ~n~Kristine W ~n~Written by R. Dougan, R. Armstrong, ~n~K. Weitz ~n~Published by BMG Music/Weitz House Publishing (ASCAP)/ EMI Music Publishing ~n~(p) + © 1996 RCA/ BMG ~n~Courtesy of Sony BMG Entertainment +[PRO1_11:PROT1] +~g~Raggiungi il ~y~Mall North Point~g~ in ~y~Vice Point~g~. -[CR09_11:CRED01] -~n~ ~n~ ~n~ ~n~"Hideaway ~n~(Deep Dish Vocal Remix)" ~n~De'Lacy ~n~Written by K. Hedge, J. Milan ~n~Published by ~n~Warner-Tamerlane Publishing Corp ~n~Remix and Additional Production by ~n~Deep Dish ~n~(p) 1995 Easy Street Recordings Inc ~n~© 1998 Kickin Music Ltd ~n~Courtesy of Easy Street Recordings Inc. and Slip n' Slide Records +[PRO1_12:PROT1] +~g~Distruggi le vetrine di tutti i negozi e i proprietari saranno pronti a chiederti protezione. -[CR09_12:CRED01] -~n~ ~n~ ~n~ ~n~"Spin Spin Sugar ~n~(Armand's Dark Garage Mix)" ~n~Sneaker Pimps ~n~Written by I. Pickering, L. Coverdale Howe, C. Corner ~n~Remix and Additional Production by ~n~Armand Van Helden ~n~Published by BMG Songs, Inc ~n~(p) + © 1997 Clean Up Records Ltd ~n~Courtesy of EMI Music / ~n~One Little Indian, Ltd +[PRO1_A:PROT1] +Oh, dobbiamo ridecorare questo posto, deve sembrare più vecchio. -[CR09_13:CRED01] -~n~ ~n~ ~n~ ~n~"Plastic Dreams" ~n~Jaydee ~n~Written by R. Albers ~n~Published by TBM Holland ~n~(p) 1992 R & S Records ~n~© Robin Albers ~n~Courtesy of Robin "Jaydee" Albers +[PRO1_C:PROT1] +Sei il mio avvocato, Rosenberg, non il mio arredatore. Chiaro? -[CR09_14:CRED01] -~n~ ~n~ ~n~ ~n~"Altered States" ~n~Ron Trent ~n~Written by R. Trent ~n~Published by ~n~High Fashion Music/ Nanada Music ~n~(p) + © 1993 Warehouse ~n~Djax-Up Beats ~n~Courtesy of High Fashion Music/ ~n~Djax-Up Beats +[BUYP3:PROT1] +Posizionati all'interno del simbolo e premi il tasto ~h~~k~~PED_ANSWER_PHONE~~w~ per acquistare la proprietà. -[CR09_15:CRED01] -~n~ ~n~ ~n~ ~n~"There Will Come A Day (Half Tab Dub)" ~n~The Absolute featuring Suzanne Palmer ~n~Written by M. Pichiotti, C.J. Snider ~n~Published by Much Noyse Music/ ~n~Hoobini Music (ASCAP) ~n~(p) + © 1995 Mark Productions, Inc ~n~Courtesy of Mark Productions, Inc +[PRO1_13:PROT1] +~g~Hai cinque minuti per distruggerli tutti. -[CR09_16:CRED01] -~n~ ~n~ ~n~ ~n~"Positive Education" ~n~Slam ~n~Written by S. McMillan, O. Meikle, ~n~G. Gibbons, J. Muotone ~n~Published by EMI Music Publishing ~n~(p) + © 1997 Soma Recordings Ltd ~n~Courtesy of Soma Recordings Ltd +{=================================== MISSION TABLE PROT2 ===================================} -[CR09_17:CRED01] -~n~ ~n~ ~n~ ~n~"Flash" ~n~Green Velvet ~n~Written by C. Jones ~n~Published by Curtis A. Jones Music (ASCAP) ~n~(p) 1995 Relief Records ~n~© 2000 Warner Bros. Records and N.E.W.S. Records and Relief Records ~n~Courtesy of Warner Strategic Marketing, N.E.W.S. Records, Relief Records +[PRO2_A:PROT2] +Qual è il problema? -[CR09_18:CRED01] -~n~ ~n~ ~n~ ~n~"Circus Bells (Hardfloor Remix)" ~n~Robert Armani ~n~Written by R. Armani ~n~Published by ~n~High Fashion Music/ Nanada Music ~n~(p) + © 1993 Warehouse/ ~n~Djax-Up Beats ~n~Courtesy of High Fashion Music/ ~n~Djax-Up Beats +[PRO2_B:PROT2] +Alcuni bar si rifiutano di pagare. -[CR09_19:CRED01] -~n~ ~n~ ~n~ ~n~"Higher State Of Consciousness" ~n~Wink ~n~Written by J. Wink ~n~Published by Strictly Rhythm Publishing, Inc. (ASCAP) / Warner/Chappell Music / Wink Inc. (ASCAP) / EMI Music Publishing ~n~(p) + © 1995 Strictly Rhythm Records LLC ~n~Courtesy of Warner Strategic Marketing +[PRO2_C:PROT2] +Dicono di essere protetti da una gang locale di malviventi. -[CR10_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RADIO DEL MUNDO +[PRO2_D:PROT2] +Ma non preoccuparti, Tommy, me ne occupo io. -[CR10_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Panjit Gavaskar - Hajaz Akram +[PRO2_E:PROT2] +E tu te ne occupi in questo modo? -[CR10_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Jessica Wachsman +[PRO2_F:PROT2] +Voi due, alzate il culo... -[CR10_04:CRED01] -~n~ ~n~ ~n~ ~n~"Raghupati (Folk Tune)" ~n~Ananda Shankar ~n~Arranged by A. Shankar, Lewinson, Hassilev ~n~Published by Warner Chappell Inc ~n~(p) + © 1970 Reprise Records for the U.S. and WEA International Inc ~n~Courtesy of Warner Strategic Marketing +[PRO2_G:PROT2] +Andiamo. -[CR10_05:CRED01] -~n~ ~n~ ~n~ ~n~"Dum Maro Dum" ~n~Asha Bhosle ~n~Written by RD Burman, Anand Bakshi ~n~Published by Saregama India Ltd ~n~(p) + © 1971 Saregama India Ltd ~n~Courtesy of Saregama India Ltd +[PRO2_01:PROT2] +~g~Fai fuori le guardie che sorvegliano il Front Page Bar e scopri chi le ha rifornite. -[CR10_06:CRED01] -~n~ ~n~ ~n~ ~n~"Neeve Nanna (Only You Were Mine)" ~n~Vijaya Anand ~n~Written by Vijaya Anand ~n~Published by Shake Boom! (ASCAP)/ ~n~Luaka Bop Inc ~n~(p) 1988 Lahari/Audiovision ~n~© 1992 Sire Records Company ~n~Courtesy of ~n~Luaka Bop Records +[PRO2_10:PROT2] +~g~Altri due sono riusciti a scappare. Rintracciali e finisci questa storia. -[CR10_07:CRED01] -~n~ ~n~ ~n~ ~n~"Kidda" ~n~Natacha Atlas ~n~Written by N. Atlas, J. Reynolds, J. Adams ~n~Published by Warner Chappell Music Ltd ~n~(p) + © 1997 Nation Records Ltd/ ~n~Beggars Banquet Records Ltd ~n~Courtesy of Nation Records Ltd/ ~n~Beggars Banquet Records Ltd +[PRO2_11:PROT2] +Entra in macchina, idiota. -[CR10_08:CRED01] -~n~ ~n~ ~n~ ~n~"Hebeena Hebeena" ~n~Farid El Atrache ~n~Written by Barakat, Atrache ~n~Published by Voices Of Lebanon ~n~(p) + © 1974 Voices Of Lebanon ~n~Courtesy of EMI Music/ EMI Music Arabia +[PRO2_02:PROT2] +La tua protezione ha bisogno di più protezione. -[CR10_09:CRED01] -~n~ ~n~ ~n~ ~n~"Aini Bet Ref" ~n~Ahmed Mneimneh ~n~Written by A. Alishaan ~n~Published by D. Dersahakian (ASCAP) ~n~(p) + © Voice of Stars & ~n~Lys Records ~n~Courtesy of Voice of Stars & ~n~Lys Records +[PRO2_03:PROT2] +Maledizione, non ancora! Non ne voglio sapere! -[CR10_10:CRED01] -~n~ ~n~ ~n~ ~n~"Im Nin'Alu" ~n~Ofra Haza ~n~Traditional, Arranged by I. Ashdot, B. Nagari ~n~Published by Blue Lake Music ~n~ (p) + © 1988 Sire Records Company ~n~Courtesy of Warner Strategic Marketing +[PRO2_04:PROT2] +Questi idioti operano per la DBP Security, con sede dietro all'isolato. -[CR10_11:CRED01] -~n~ ~n~ ~n~ ~n~"Ballaa Tsoubou Hal Kahwa" ~n~Samira Tawfic ~n~Written by R. Al Khylani, J. Al A'ss ~n~Published by Copyright Control ~n~(p) + © Voices Of Lebanon ~n~Courtesy of EMI Music/ EMI Music Arabia +[PRO2_05:PROT2] +Vedete di risolverla per i fatti vostri. -[CR11_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~K-JAH +[PRO2_06:PROT2] +Ci si vede più tardi. -[CR11_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Natalee Walsh Davis - Pascale Armand +[PRO2_07:PROT2] +Sì, sì, certo. -[CR11_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Karl Weibel, Pat McKay +[PRO2_08:PROT2] +~g~La DBP Security presto scoprirà le tue intenzioni: attacca prima che si ritiri. -[CR11_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jay Wright Productions +[PRO2_09:PROT2] +~g~Vai a parlare con il proprietario del Front Page. -[CR11_05:CRED01] -~n~ ~n~ ~n~ ~n~"Pick a Sound" ~n~Selah Collins, Ruddy Ranks, Redeye ~n~Written by S. Collins, H. Burke, ~n~E. Donaldson ~n~Published by Copyright Control/ MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +{=================================== MISSION TABLE PROT3 ===================================} -[CR11_06:CRED01] -~n~ ~n~ ~n~ ~n~"What a Wonderful Feeling" ~n~Errol Bellot, Ruddy Ranks, Redeye ~n~Written by E. Bellot, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[PRO3_A:PROT3] +Cretino! Ma a cosa pensavi? -[CR11_07:CRED01] -~n~ "Watch How the People Dancing" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by K. Wright ~n~Published by Jetstar ~n~Courtesy of Honest Jons Records +[PRO3_B:PROT3] +Ti rendi conto che cosa hai combinato? -[CR11_08:CRED01] -~n~ ~n~ ~n~ ~n~"Lean Boot" ~n~Richie Davis, Ruddy Ranks, Redeye ~n~Written by R. Davis, H. Burke, ~n~E. Donaldson ~n~Published by Westbury Music/ MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[PRO3_C:PROT3] +Potremmo essere tutti rovinati! -[CR11_09:CRED01] -~n~ ~n~ ~n~ ~n~"Ready For the Dancehall Tonight" ~n~Peter Bouncer, Ruddy Ranks, Redeye ~n~Written by Peter McKenzie, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[PRO3_D:PROT3] +Il timer deve essersi inceppato. -[CR11_10:CRED01] -~n~ ~n~ ~n~ ~n~"You Ha Fe Cool" ~n~Richie Davis, Ruddy Ranks, Redeye ~n~Written by R. Davis, H. Burke, ~n~E. Donaldson. ~n~Published by Westbury Music/MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[PRO3_E:PROT3] +Quel posto era stato minato per saltare come una fabbrica di fuochi d'artificio. -[CR11_11:CRED01] -~n~ ~n~ ~n~ ~n~"Ring My Number" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by Kenneth Wright, H. Burke, ~n~E. Donaldson. ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[PRO3_F:PROT3] +Ma qualcuno ha informato i poliziotti... -[CR11_12:CRED01] -~n~ ~n~ ~n~ ~n~"Run Come Call Me" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by Kenneth Wright, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records +[PRO3_G:PROT3] +Qual è il problema, ragazzi? -[CR12_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~THE LIBERTY JAM +[PRO3_H:PROT3] +Mike doveva dar fuoco a un locale del Mall, -[CR12_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~DJ Clue as himself +[PRO3_I:PROT3] +ma ha fatto casino con i fusibili e adesso la polizia sta indagando. -[CR12_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Jay Wright, Tom Yankowski, Chris Mercado, Vanessa Grullon +[PRO3_J:PROT3] +Dobbiamo preparare la nostra roba e andarcene da qui! -[CR12_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jay Wright Productions +[PRO3_K:PROT3] +Rilassatevi, tutti e due: fatemi pensare per un attimo! -[CR12_05:CRED01] -~n~ ~n~ ~n~ ~n~"All I Need" ~n~Method Man ~n~Written by C. Smith, R. Diggs ~n~Published by Sony BMG Music ~n~(p) + © 1994 Def Jam Recordings ~n~Courtesy of Def Jam Recordings/ UME +[PRO3_L:PROT3] +Tommy Vercetti non scappa con la coda fra le gambe. -[CR12_06:CRED01] -~n~ ~n~ ~n~ ~n~"Shook Ones Pt. II" ~n~Mobb Deep ~n~Written by A. Johnson, K. Muchita ~n~Published by ~n~BMG Songs Inc. (ASCAP) ~n~(p) + © 1995 BMG Music ~n~Courtesy of RCA Records by arrangement with Sony BMG Ent +[PRO3_M:PROT3] +I poliziotti passeranno al setaccio l'intero edificio, giusto? -[CR12_07:CRED01] -~n~ ~n~ ~n~ ~n~"Incarcerated Scarface" ~n~Raekwon ~n~Written by R. Diggs, C. Woods, A. Tilman ~n~Published by ~n~Careers-BMG Music Publishing Inc./ ~n~Wu Tang Publishing (BMI)/ ~n~Bridgeport Music ~n~(p) + © 1995 BMG Music +[PRO3_N:PROT3] +Ma tutto ciò richiede tempo. -[CR12_08:CRED01] -Courtesy of RCA Records by arrangement with Sony BMG Ent ~n~This track contains a sample of "You're Getting A Little Too Smart" as performed by The Detroit Emeralds. Courtesy of Westbound Records. Used by permission. All rights reserved +[PRO3_O:PROT3] +Dobbiamo entrare e dar fuoco noi stessi al locale. -[CR12_09:CRED01] -~n~ ~n~ ~n~ ~n~"N.O.R.E." ~n~Noreaga ~n~Written by V. Santiago, J. Olivier, ~n~S. Barnes ~n~Published by Suite 1202 Music/ Jose Luis Gotcha Music (BMI)/ Slamuwell Productions/ Jelly's Jam LLC (ASCAP)/ ~n~12 & Under Music/ +[PRO3_P:PROT3] +Sì, ma... -[CR12_10:CRED01] -Jumping Bean Songs LLC (BMI) ~n~(p) + © 1998 Penalty Recordings ~n~Courtesy of Warner Strategic Marketing +[PRO3_Q:PROT3] +Solo un poliziotto potrebbe avvicinarsi a meno di un chilometro dal luogo! -[CR12_11:CRED01] -~n~ ~n~ ~n~ ~n~"Shut 'Em Down (Remix)" ~n~Onyx featuring Noreaga & Big Pun ~n~Written by F. Scruggs, K. Jones, T. Taylor, E. Hinson, E. Simmons ~n~Published by Universal Music/ ~n~Let Me Show You Music/ ~n~Jelly Jams Music/ +[PRO3_R:PROT3] +Allora andiamo come poliziotti. -[CR12_12:CRED01] -III Posse Music/ Ill Hill Billy'z Music/ Warner-Tamerlane Music ~n~(p) + © 1998 Rush Associated Labels Recordings ~n~Courtesy of Universal Music Enterprises +[PRO3_S:PROT3] +Recupereremo delle uniformi... e avremo bisogno di una volante. -[CR12_13:CRED01] -~n~ ~n~ ~n~ ~n~"Beware" ~n~Big Pun ~n~Written by C. Rios, J. Tineo ~n~Published by Let Me Show You Music/ ~n~Joe Cartegena Music (ASCAP), ~n~Administered by Jelly Jams Music (BMI)/ ~n~P.H.D. Music (ASCAP) +[PRO3_T:PROT3] +Tutto questo grazie a te, Mike. -[CR12_14:CRED01] -(p) + © 1998 Loud Records LLC ~n~Courtesy of Columbia Records by arrangement with Sony BMG Ent +[PRO3_U:PROT3] +Mi dispiace. -[CR12_15:CRED01] -~n~ ~n~ ~n~ ~n~"Twinz (Deep Cover 98)" ~n~Big Pun ~n~Written by C. Rios, J. Cartegena, ~n~C. Brodus, A. Young, C. Wolfe ~n~Published by Let Me Show You Music/ ~n~Joe Cartegena Music (ASCAP)/ ~n~Jelly Jams Music (BMI)/ ~n~Sony Tunes Inc. (ASCAP) +[PRO3_V:PROT3] +Ho capito. -[CR12_16:CRED01] -~n~(p) + © 1998 Loud Records LLC ~n~Courtesy of Columbia Records by arrangement with Sony BMG Ent ~n~This track contains a sample of "Deep Cover" as performed by Dr. Dre. Courtesy of Solar Records. Used by permission. All rights reserved +[PRO3_W:PROT3] +Quello che dobbiamo fare è attirare i poliziotti con un gestaccio, -[CR12_17:CRED01] -~n~ ~n~ ~n~ ~n~"Get At Me Dog" ~n~DMX featuring Sheek of The Lox ~n~Written by E. Simmons, D. Blackman, ~n~A. Fields, S. Taylor ~n~Published by Universal Music Publishing/ EMI April Music/ ~n~Sony ATV Tunes +[PRO3_X:PROT3] +Metterli con le spalle al muro -[CR12_18:CRED01] -~n~(p) + © 1998 Rush Associated Labels Recordings ~n~Courtesy of Universal Music Enterprises +[PRO3_Y:PROT3] +e sopraffarli. -[CR12_19:CRED01] -~n~ ~n~ ~n~ ~n~"Ruff Ryders Anthem (Remix)" ~n~DMX featuring DJ Clue, Jadakiss, Styles, Drag-On & Eve ~n~Written by J. Phillips, M.J. Smalls, E. Shaw, K. Ifill, E. Simmons, K. Dean, E. Jeffers ~n~Published by Universal Music Publishing/ EMI Music Publishing +[PRO3_Z:PROT3] +Ottimo piano, andiamo! -[CR12_20:CRED01] -(p) + © 1998 Roc-a-Fella Records ~n~Courtesy of Universal Music Enterprises +[PRO3_A1:PROT3] +Bene. -[CR12_21:CRED01] -~n~ ~n~ ~n~ ~n~"Do What You Feel" ~n~Redman featuring Method Man ~n~Written by P. Michael, R. Noble, C. Smith ~n~Published by Careers BMG/ Sony ATV Tunes/ Famous Music ~n~(p) + © 1996 Def Jam ~n~Courtesy of Universal Music Enterprises +[PRO3_01:PROT3] +OK Lance, attira l'attenzione dei poliziotti! -[CR12_22:CRED01] -~n~ ~n~ ~n~ ~n~"Chain Gang Freestyle" ~n~The Lox & Black Rob ~n~Written by Frierson, Phillips, Styles, Jacobs, Ross, Shaw ~n~Published by EMI Music Publishing ~n~Courtesy of Bad Boy Records +[PRO3_02:PROT3] +~g~Prendi la macchina della polizia e vai a posizionare la bomba nel Tarbrush Café dentro al Mall. -[CR12_23:CRED01] -~n~ ~n~ ~n~ ~n~"Chest2chest Freestyle" ~n~The Lox ~n~Written by Phillips, Styles, Jacobs, Shaw, Barnes, Lemay, Montgomery ~n~Published by Taggie Music (BMI)/ ~n~Universal Polygram Int'l. (ASCAP)/ ~n~EMI Music Publishing ~n~Courtesy of Bad Boy Records +[PRO3_03:PROT3] +~g~Hai lasciato Lance indietro, torna a prenderlo. -[CR12_24:CRED01] -This track contains a sample of "Next Level" as performed by Showbiz & AG. Courtesy of Universal Music Enterprises. Used by permission. All rights reserved +[PRO3_04:PROT3] +~g~Andiamo. -[CR13_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~MSX 98 +[PRO3_05:PROT3] +~r~Hai ucciso Lance! -[CR13_02:CRED01] -~n~ ~n~ ~n~ ~n~MC ~n~Codebreaker as himself +[PRO3_07:PROT3] +~g~È saltata la vostra copertura. Muoviti a piazzare la bomba! -[CR13_03:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Timecode +[PRO3_09:PROT3] +Legali e imbavagliali! -[CR13_04:CRED01] -~n~ ~n~ ~n~ ~n~Station Production ~n~Timecode +[PRO3_10:PROT3] +Oooh. Mi calza a pennello! -[CR13_05:CRED01] -~n~ ~n~ ~n~ ~n~"Renegade Snares" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1993 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[PRO3_11:PROT3] +Un po' stretto sul pacco... -[CR13_06:CRED01] -~n~ ~n~ ~n~ ~n~"Terrorist" ~n~Renegade ~n~Written, Produced & Engineered by ~n~A. Dookith ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[PRO3_12:PROT3] +Oh sì, hai ragione, anche a me! -[CR13_07:CRED01] -~n~ ~n~ ~n~ ~n~"Finest Illusion (Legal Mix)" ~n~Foul Play ~n~Written, Produced & Engineered by ~n~J. Morrow, S. Bradshaw, ~n~S. Gurley ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1993 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[PRO3_13:PROT3] +Tranquillo fratello: nessun poliziotto guida così male! -[CR13_08:CRED01] -~n~ ~n~ ~n~ ~n~"Living For the Future (FBD Project Remix)" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[PRO3_14:PROT3] +Ricorda: sorridi agli altri poliziotti! -[CR13_09:CRED01] -~n~ ~n~ ~n~ ~n~"Stay Calm (Foul Play Remix)" ~n~DJ Pulse ~n~Written, Produced & Engineered by ~n~A. Brown ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[PRO3_15:PROT3] +Ehi agente, bel distintivo, bel distintivo. -[CR13_10:CRED01] -~n~ ~n~ ~n~ ~n~"Disturbance (Tango Remix)" ~n~Hyper-On Experience ~n~Written, Produced & Engineered by ~n~A. Banks, D. Demierre ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[PRO3_16:PROT3] +Un po' più sciolto, Lance. -[CR13_11:CRED01] -~n~ ~n~ ~n~ ~n~"Cold Fresh Air" ~n~Higher Sense ~n~Written, Produced & Engineered by ~n~A. Miles, DJ Rhythm ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[PRO3_17:PROT3] +OK, i timer sono pronti, 5 secondi alla scadenza. -[CR13_12:CRED01] -~n~ ~n~ ~n~ ~n~"Living For the Future" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[PRO3_18:PROT3] +5 secondi? Dobbiamo scappare di corsa da qua! -[CR13_13:CRED01] -~n~ ~n~ ~n~ ~n~"Thru The Vibe (2 on 1 Mix)" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[PRO3_19:PROT3] +Questo deve davvero averli irritati. -[CR13_14:CRED01] -~n~ ~n~ ~n~ ~n~"The Helicopter Tune" ~n~Deep Blue ~n~Written, Produced & Engineered by ~n~S. O'Keefe ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[PRO3_20:PROT3] +~g~Fatevi inseguire dai due poliziotti nel garage. -[CR13_15:CRED01] -~n~ ~n~ ~n~ ~n~"Dred Bass" ~n~Dead Dred ~n~Written, Produced & Engineered by ~n~W. Smith, L. Smith ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd +[PRO3_21:PROT3] +~g~Ottieni un livello di sospetto così i poliziotti ti inseguiranno fino al garage. -[CR14_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~FLASHBACK FM +[PRO3_22:PROT3] +~g~La porta del garage è bloccata! Liberala così potrai chiuderla. -[CR14_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Reni Wassulmaier - Barbara Rosenblatt +[PRO3_23:PROT3] +~g~Cammina sul segnalino per piazzare la bomba. -[CR14_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Mike Shapiro +[PRO3_24:PROT3] +~g~Allontanati dal Café! -[CR14_04:CRED01] -~n~ ~n~ ~n~ ~n~"First Hand Experience ~n~In Second Hand Love" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Giorgio Moroder ~n~Courtesy of Giorgio Moroder +[PRO_AS1:PROT3] +CIRCOLO DI PROTEZIONE COMPLETATO -[CR14_05:CRED01] -~n~ ~n~ ~n~ ~n~"I Wanna Rock You" ~n~Giorgio ~n~Written by G. Moroder, H. Faltermeyer, ~n~K. Forsey ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1979 Giorgio Moroder ~n~Courtesy of Giorgio Moroder +[PRO_AS2:PROT3] +~g~La proprietà di Vercetti d'ora in poi genererà introiti per un massimo di ~1~$. Ricordati di recuperarli regolarmente. -[CR14_06:CRED01] -~n~ ~n~ ~n~ ~n~"E=MC2" ~n~Giorgio ~n~Written by G. Moroder, H. Faltermeyer, ~n~P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1979 Giorgio Moroder ~n~Courtesy of Giorgio Moroder +[PRO3_08:PROT3] +~g~Torna alla ~h~proprietà di Vercetti~g~ su ~h~Starfish Island~g~. -[CR14_07:CRED01] -~n~ ~n~ ~n~ ~n~"Chase" ~n~Giorgio Moroder ~n~Written by G. Moroder ~n~Published by Warner/ Chappell Music ~n~(p) + © 1978 Casablanca Films/ ~n~Columbia Pictures ~n~Courtesy of Sony Pictures Entertainment +{=================================== MISSION TABLE RACES ===================================} -[CR14_08:CRED01] -~n~ ~n~ ~n~ ~n~"I'm Left, You're Right, She's Gone" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Giorgio Moroder ~n~Courtesy of Giorgio Moroder +[RACES_2:RACES] +~g~Hai bisogno di un veicolo per partecipare, non è mica una maratona! -[CR14_09:CRED01] -~n~ ~n~ ~n~ ~n~"From Here To Eternity" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Casablanca Records ~n~Courtesy of Universal Music Enterprises +[RACES_3:RACES] +3..2..1.. VIA VIA VIA! -[CR15_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~COMMERCIAL VOICES +[RACES_8:RACES] +~r~Non hai vinto la corsa! -[CR15_02:CRED01] -~n~ ~n~ ~n~ ~n~Alex Anthony, Anouchka Benson, ~n~Audrey Amey, Bill Smith, ~n~Billy Gonzalez, Brian Thomas, +[RACES00:RACES] +Corsa ~1~: -[CR15_03:CRED01] -~n~ ~n~Chris Jobin, Chris Silvestro, ~n~Craig Blair, Dan Houser, ~n~Dan Merrill, Ed Thomas, +[RACES01:RACES] +Terminal Velocity -[CR15_04:CRED01] -~n~ ~n~Ethan Abeles, Garth Johnston, ~n~Gregg Martin, Gregory Johnson, ~n~Hikari Yokoyama, James Ferrante, +[RACES02:RACES] +Ocean Drive -[CR15_05:CRED01] -~n~ ~n~James Larson, Jay Capozello, ~n~Jayson Gladstone, Jeff Berlin, ~n~Jen Sweeney, Jessica Wachsman, +[RACES03:RACES] +Border Run -[CR15_06:CRED01] -~n~ ~n~ JJ Adler, Jonathan Hanst, ~n~Joshua Batista, Karen Saltus, ~n~Koji Nonoyami, Lance Williams, +[RACES04:RACES] +Capital Cruise -[CR15_07:CRED01] -~n~ ~n~Lazlow, Lynne Horton, ~n~Michael Nathan, Mike Ferrante Jr., ~n~Chris Ferrante, Mike Shapiro, +[RACES05:RACES] +Tour! -[CR15_08:CRED01] -~n~ ~n~Natalya Wilson, Noelle Sadler, ~n~Phil Mikkelson, Ron Reeve, ~n~Smith Harrison, Stacy Rachels, +[RACES06:RACES] +V.C. Endurance -[CR15_09:CRED01] -~n~ ~n~ Steve Carlesi, Julie Wemyss, ~n~Kim Gurney +[RACES07:RACES] +Costo d'ingresso: ~1~$ -[CR16_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~CUTSCENE MUSIC +[RACES08:RACES] +Tempo migliore: ~1~:~1~ -[CR16_02:CRED01] -~n~ ~n~ ~n~ ~n~"Japanese Geisha" ~n~Sonia Slany ~n~Written by Sonia Slany ~n~Published by West One Music ~n~Courtesy of APM Music, LLC +[RACES09:RACES] +Miglior risultato: PRIMO -[CR16_03:CRED01] -~n~ ~n~ ~n~ ~n~"The Heist" ~n~Bugz in the Attic ~n~Written by K. Tatham ~n~Published by Copyright Control ~n~(p) 2005 Bugz In The Attic ~n~Courtesy of Bugz In The Attic ~n~www.bugzintheattic.co.uk +[RACES10:RACES] +Miglior risultato: SECONDO -[CR16_04:CRED01] -~n~ ~n~ ~n~ ~n~"A Dark March" ~n~Danger Mouse ~n~Written by Danger Mouse ~n~Published by ~n~Underground Animals (ASCAP) +[RACES11:RACES] +Miglior risultato: TERZO -[CR17_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR NYC PUBLISHING TEAM +[RACES12:RACES] +Miglior risultato: QUARTO -[CR17_02:CRED01] -~n~ ~n~ ~n~ ~n~Terry Donovan, Jenefer Gross, ~n~Jennifer Kolbe, Devin Winterbottom, ~n~Adam Tedman, Michael Elkind, +[RACES13:RACES] +Lunghezza tracciato: ~1~.~1~ km -[CR17_03:CRED01] -~n~ ~n~Paul Yeates, Hosi Simon, ~n~Daniel Einzig, Marlene Yamaguchi, ~n~Gauri Khindaria, Stanton Sarjeant, +[RACES15:RACES] +Miglior tempo: ND -[CR17_04:CRED01] -~n~ ~n~Jordan Chew, Ryan Rayhill, ~n~Devin Bennett, Todd Zuniga, ~n~Thomas O'Donnell, Maria Tabia, +[RACES16:RACES] +Miglior risultato: ND -[CR17_05:CRED01] -~n~ ~n~Anthony Carvalho, Lyonel Tollemache, ~n~John Notarfrancesco, Jerry Luna, ~n~Stuart Petri, Stephen Walsh, +[RACES18:RACES] +HAI VINTO: ~1~$ -[CR17_06:CRED01] -~n~ ~n~Michael Carnevale, Andrea Borzuku, ~n~John Schuhmann, Alice Chuang, ~n~Mike Torok, Mayumi Kobayashi, +[RACES19:RACES] +Non puoi permetterti di partecipare a questa gara. -[CR17_07:CRED01] -~n~ ~n~Elizabeth Satterwhite, Bruce Dugan, ~n~Eli Weissman, Phil Poli, ~n~Jaesun Celebre, Russell Lewis, +[RACES22:RACES] +Tempo migliore: ~1~:0~1~ -[CR17_08:CRED01] -~n~ ~n~Sean Mackenzie, Megan Henretta, ~n~Angus Wong, Kristine Severson +[RACES23:RACES] +Lunghezza tracciato: ~1~.~1~ miglia -[CR17_09:CRED01] -~n~ ~n~ ~n~ ~n~Cover Art ~n~Steven Olds, Stephen Bliss, ~n~Anthony Macbain +[RACES_1:RACES] +~g~Recupera un veicolo veloce e raggiungi la griglia di partenza. -[CR17_10:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LONDON PD +[RACEHLP:RACES] +~w~Premi il ~h~~k~~PED_SPRINT~~w~ per avviare la corsa selezionata. ~w~Premi il ~h~~k~~VEHICLE_ENTER_EXIT~~w~ per uscire. -[CR17_11:CRED01] -~n~ ~n~ ~n~ ~n~ Chris Madgwick, Chris Wood, ~n~Daimion Pinnock, David McCarthy, ~n~Graham Ainsley, Jurgen Mol, +{=================================== MISSION TABLE RCHELI1 ===================================} -[CR17_12:CRED01] -~n~ ~n~ Laura Battistuzzi, Maike Köhler, ~n~Shino Hori, Lucien King +[WRECKED:RCHELI1] +~r~Il veicolo è a pezzi! -[CR18_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LINCOLN +[RCH1_4:RCHELI1] +Punti di controllo rimanenti: -[CR18_02:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Mark Lloyd +[RCH1_6:RCHELI1] +~g~Usa l'elicottero radiocomandato per attraversare i punti di controllo nella zona dell'aeroporto. -[CR18_03:CRED01] -~n~ ~n~ ~n~ ~n~Deputy QA Manager ~n~Tim Bates +[RCH1_7:RCHELI1] +~g~In totale ci sono 20 punti di controllo. -[CR18_04:CRED01] -~n~ ~n~ ~n~ ~n~QA Supervisor ~n~Kevin Hobson +[RCH1_12:RCHELI1] +~r~L'elicottero radiocomandato si sta allontanando dal raggio d'azione! -[CR18_05:CRED01] -~n~ ~n~ ~n~ ~n~Lead Tester ~n~Eddie Gibson ~n~ ~n~ ~n~ ~n~Secondary Lead Tester ~n~Mike Bennett +[RCH1_13:RCHELI1] +~r~L'elicottero radiocomandato è fuori portata! -[CR18_06:CRED01] -~n~ ~n~ ~n~ ~n~Testers ~n~Jonathan Stones, Mike Emeny, ~n~Andy Mason, Lee Johnson, ~n~Carl Young, Matthew Lunnon, ~n~Dan Goddard, Steve McGagh, ~n~Craig Reeve, Joby Luckett +[RCH1_8:RCHELI1] { reVC update } +~g~Se desideri interrompere la missione, premi il ~h~~k~~VEHICLE_FIREWEAPON~~g~ per far esplodere l'elicottero. -[CR18_07:CRED01] -~n~ ~n~ ~n~ ~n~Localization Team ~n~ ~n~ ~n~ ~n~Localization Supervisor ~n~Chris Welsh +{=================================== MISSION TABLE RCPLNE1 ===================================} -[CR18_08:CRED01] -~n~ ~n~ ~n~ ~n~Testers ~n~Antoine Cabrol, Dominic Garcia, ~n~Paolo Ceccotti, Ferruccio Cinquemani, ~n~Nicolas Klimoff, Jesús Pérez Rosales ~n~ ~n~ ~n~ ~n~IT Support ~n~Nick McVey +[RCPL1_4:RCPLNE1] +~g~Sfida nella GARA A TAPPE altri 3 aerei radiocomandati. -[CR19_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~SPECIAL THANKS +[RCPL1_5:RCPLNE1] +~g~Vola attraverso i punti di controllo in Vice City. -[CR19_02:CRED01] -~n~ ~n~ ~n~ ~n~Scooter, Ross Wallace, ~n~Steve Taylor, Kevin Wong, ~n~Kevin Bolt, John Haime, +[RCPL1_6:RCPLNE1] { reVC update } +~g~Se desideri interrompere la missione, premi il ~h~~k~~VEHICLE_FIREWEAPON~~g~ per far esplodere l'aereo. -[CR19_03:CRED01] -~n~ ~n~Dave Watson, Thomas French, ~n~James Arthur, Martin Connor, ~n~Brendon McDonald, Julie Wemyss, +[RCPL1_8:RCPLNE1] +~g~L'aereo radiocomandato è quasi fuori portata! -[CR19_04:CRED01] -~n~ ~n~Raff Crolla, James Duffy, ~n~Kim Gurney, Andrew Ness, ~n~Andy Brooks (Gearbox), Alan Mcgregor, +[RCPL1_9:RCPLNE1] +~r~L'aereo radiocomandato è fuori portata! -[CR19_05:CRED01] -~n~ ~n~Chris McCallum, Fred, Narns, ~n~Alan, Taruki, Red, ~n~Big Foot, Rita Liberator, ~n~Elliot Torres +{=================================== MISSION TABLE RCRACE1 ===================================} -[CR19_06:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~THANKS +[RCR1_4:RCRACE1] +Giri rimanenti: -[CR19_07:CRED01] -~n~ ~n~ ~n~ ~n~Deborah Mannis-Gardner ~n~and Mark Schwartz. ~n~Randy Acker, Karen Adams, ~n~Mark Ainley, Robin Albers, +[RCR1_1:RCRACE1] +~g~Sfida in una gara a tappe altre 3 macchine radiocomandate. -[CR19_08:CRED01] -~n~ ~n~Duncan Baker, Armen Boladian, ~n~Tanya Bridges, Richard Brown, ~n~Matt Brookman, Elena Byington, +[RCR1_2:RCRACE1] +~g~Per vincere, completa per primo due giri del tracciato! -[CR19_09:CRED01] -~n~ ~n~Ed Butts, Rob Cairns, ~n~Mike Callaghan, Joseph Carlone, ~n~Kevin Carson, Jason Chin, +[RCR1_6:RCRACE1] +~g~La macchina radiocomandata è quasi fuori portata! -[CR19_10:CRED01] -~n~ ~n~Allison Cipris, Alimah Deen, ~n~James Ellis, Helen English, ~n~Nasko Fejza, Scott Gardner, +[RCR1_7:RCRACE1] +~r~La macchina radiocomandata è fuori portata! -[CR19_11:CRED01] -~n~ ~n~Jochem Gerrits, ~n~Laurie Goldstein Thomas Golubic, ~n~Nick Guarino, Jon Handle, ~n~Millie Hysu, Robert Jo, +{=================================== MISSION TABLE ROCK1 ===================================} -[CR19_12:CRED01] -~n~ ~n~Paul Johannes, Gavin Johnson, ~n~Curtis A. Jones, Jennifer Justice, ~n~Rod Kotler, Diana La Pointe, +[RBM1_A:ROCK1] +AllllllllRrrighttt! -[CR19_13:CRED01] -~n~ ~n~Michael Lau, Jim Long, ~n~Alex De Maegd, John Massa, ~n~Kendall Minter, Steve Morgan, +[RBM1_B:ROCK1] +Brillante, davvero brillante! -[CR19_14:CRED01] -~n~ ~n~Giorgio Moroder, Suzanne Moss, ~n~Melissa Munana, Kirin Murphy, ~n~Kurosh Nasseri, +[RBM1_D:ROCK1] +Ehi, hai già incontrato i Love Fist? -[CR19_15:CRED01] -~n~ ~n~Gwen Niles Sean Ogden ~n~aka DJ Nightshade, ~n~Robin Orlowski, Jonathan Palmer, ~n~Tanvi Patel, Jane Peterer, +[RBM1_E:ROCK1] +No, non ancora, ma mi piace molto la vostra musica. -[CR19_16:CRED01] -~n~ ~n~Mark Picchiotti, Rob Playford, ~n~Dan Quan, R. Ramnarayan, ~n~Mary Beth Roberts, ~n~Virgil Roberts, Lindsay Rodman, +[RBM1_F:ROCK1] +Lascia che ti presenti la band. -[CR19_17:CRED01] -~n~ ~n~Jim Romano, Craig Roseberry, ~n~Gerry Rosenblatt, RZA, ~n~Ali Samii, Alan Scholefield, +[RBM1_G:ROCK1] +Questo è P, Percy, Dick. Willy è nel cesso! Jezz è invece il tipo che hai visto prima nella cabina di registrazione. -[CR19_18:CRED01] -~n~ ~n~Christopher Scott, Suzi Scott, ~n~Fredro Scruggs, Jennefer Showalter, ~n~Alan Skiena, Saskia Slegers, +[RBM1_H:ROCK1] +Ragazzi, vorrei presentarvi un mio carissimo amico. -[CR19_19:CRED01] -~n~ ~n~Fran Spero, Lem Springsteen, ~n~David Steel, Jane Ventom, ~n~Christian Wiseman, Debi Wylde, +[RBM1_I:ROCK1] +Si chiama Tommy. Ci conosciamo da tempo. -[CR19_20:CRED01] -~n~ ~n~Donna Young, Richie Zito +[RBM1_J:ROCK1] +Ciao amico. + +[RBM1_K:ROCK1] +E, ehm, qual era il tuo nome? + +[RBM1_L:ROCK1] +Eddai Jezz che lo sai, + +[RBM1_M:ROCK1] +non fare questi scherzetti con me, amico, + +[RBM1_N:ROCK1] +sono troppo furbo per cascarci, tesoro! + +[RBM1_O:ROCK1] +Vedi, la situazione Tom è che i ragazzi hanno bisogno di aiuto. + +[RBM1_P:ROCK1] +Non hanno i contatti giusti da questa parte, del tipo 'come sta tuo padre'. + +[RBM1_Q:ROCK1] +Abbiamo bisogno di droga, amico! + +[RBM1_R:ROCK1] +Dobbiamo fare un po' di casino alla Love Fist, capito? + +[RBM1_S:ROCK1] +Beh, questa è Vice City. Qual è il problema? + +[RBM1_U:ROCK1] +Love Juice, sì! + +[RBM1_V:ROCK1] +Love Juice? + +[RBM1_W:ROCK1] +Sì, due parti di broda, una parte di polvere, cinque bombe effervescenti e un litro di petrolio. + +[RBM1_X:ROCK1] +Ci puoi aiutare, amico? + +[RBM1_Y:ROCK1] +Beh, significherebbe molto per i ragazzi. + +[RBM1_Z:ROCK1] +Lo farai per loro, vero? + +[RBM1_7:ROCK1] +~r~Non hai portato la Love Juice in tempo! + +[RBM1_8:ROCK1] +~r~Mercedes è morta! + +[RBM1_10:ROCK1] +~r~Idiota! Hai distrutto la merce! + +[RBM1_13:ROCK1] +~g~Porta la 'Love Juice' e Mercedes alla band prima che salgano sul palco. + +[RBM1_15:ROCK1] +~r~Hai perso lo spacciatore, i soldi e la droga! + +[RBM1_17:ROCK1] +~g~Uccidi lo spacciatore e recupera la droga! + +[MOB_07A:ROCK1] +Ehi amico, ai ragazzi non dispiacerebbe un po' di compagnia, se capisci cosa intendo... + +[MOB_07B:ROCK1] +Conosco la ragazza giusta. + +[ROK1_5:ROCK1] +Ehi Mercedes! + +[ROK1_6:ROCK1] +Ciao Tommy, come stai? + +[ROK1_7:ROCK1] +Non male. Senti, ti piacerebbe intrattenere i Love Fist? + +[ROK1_8:ROCK1] +OK, ma per questo favore voglio una ricompensa... + +[RBM1_14:ROCK1] +~g~Hai bisogno di una macchina o di una moto! + +[RBM1_1:ROCK1] +~g~Vai a prendere Mercedes al suo appartamento. + +[RBM1_12:ROCK1] +~g~Raccogli gli ingredienti per la 'Love Juice' dallo spacciatore. + +[ROK1_2:ROCK1] +NON NECESSARIO + +[ROK1_3:ROCK1] +NON NECESSARIO + +[MERC_39:ROCK1] +Ci vediamo più tardi, tesoro. + +[RBM1_C:ROCK1] +Ehi, Tommy! Sono felice che ce tu l'abbia fatta. + +[ROK1_1A:ROCK1] +Stai cercando qualcosa di speciale? Ho proprio ciò che ti serve! + +[ROK1_9:ROCK1] +Grazie per i soldi, idiota! + +[RBM1_T:ROCK1] +Abbiamo bisogno di Love Juice, hai presente? + +{=================================== MISSION TABLE ROCK2 ===================================} + +[RBM2_A:ROCK2] +Tommy, amico, sono felice di vederti! + +[RBM2_B:ROCK2] +Cosa succede? + +[RBM2_C:ROCK2] +Brutte vibrazioni, Tommy... + +[RBM2_E:ROCK2] +C'è questo tipo, lo conosciamo appena, ma lui la sa lunga su di noi. + +[RBM2_F:ROCK2] +Come questo tipo. Sa tutto su di noi. + +[RBM2_G:ROCK2] +Sa che Willy ama la biancheria intima femminile, eh! + +[RBM2_H:ROCK2] +O che a Percy piacciono i Duran Duran! + +[RBM2_K:ROCK2] +Sì, come nella storia dei missili, esatto. Ma ascolta, questo bastardo... + +[RBM2_L:ROCK2] +cioè, sì, questo tipo, vuole vedere i Love Fist morti. + +[RBM2_M:ROCK2] +Morti, Tommy. + +[RBM2_N:ROCK2] +Love Fist morti. Lo sai come si dice, i buoni muoiono giovani. + +[RBM2_O:ROCK2] +Ma Tommy, devi salvare i Love Fist! + +[RBM2_P:ROCK2] +Abbiamo un concerto fra due ore e credo... + +[RBM2_Q:ROCK2] +I ragazzi credono che il maniaco stia architettando qualcosa di losco. + +[RBM2_1:ROCK2] +~g~Guida la limousine al concerto e cerca di attirare allo scoperto lo psicopatico. + +[RBM2_2:ROCK2] +~r~Hai distrutto l'auto della band! + +[RBM2_3:ROCK2] +~g~Vai al concerto! + +[RBM2_4:ROCK2] +~g~Becca lo psicopatico! Non farlo scappare! + +[RBM2_5:ROCK2] +~r~Lo hai perso, idiota! + +[RBM2_7:ROCK2] +~r~I fan sono stati attaccati: lo psicopatico non si farà vivo! + +[RBM2_8:ROCK2] +~r~Le guardie della sorveglianza sono state attaccate: lo psicopatico non si farà vivo! + +[PSYCH_1:ROCK2] +Vedrò i Love Fist bruciare! + +[PSYCH_2:ROCK2] +I Love Fist hanno rovinato la mia vita! + +[RBM2_I:ROCK2] +Sta zitto, idiota. Solo perché a Jezz piacciono le pecore. + +[RBM2_R:ROCK2] +Ma sta' zitto! + +[RBM2_D:ROCK2] +Certo, niente scherzi, è roba forte, davvero forte sai? + +[RBM2_J:ROCK2] +È una questione di passione, sai? + +{=================================== MISSION TABLE ROCK3 ===================================} + +[RBM3_A:ROCK3] +Tommy! Tommy! Tommy amico, lo psicopatico è tornato! + +[RBM3_B:ROCK3] +Che succede? + +[RBM3_C:ROCK3] +Quello psicopatico non vuole lasciar stare i Love Fist! + +[RBM3_D:ROCK3] +Non lo hai ucciso, amico. E adesso è tornato. + +[RBM3_E:ROCK3] +Sì, sì, sì e il problema è che... + +[RBM3_F:ROCK3] +Il problema è che abbiamo bisogno di qualcuno di cui ci fidiamo per guidare la limousine, + +[RBM3_G:ROCK3] +poiché il pazzo continua a minacciarci! + +[RBM3_I:ROCK3] +Stiamo letteralmente cadendo a pezzi. + +[RBM3_J:ROCK3] +OK ragazzi, calmatevi. Me ne occuperò io. + +[RBM3_K:ROCK3] +Generalmente non perdo tempo a portare in giro un gruppo di ubriaconi scozzesi bisessuali, + +[RBM3_L:ROCK3] +ma, nel vostro caso, farò un'eccezione. + +[ROK3_03:ROCK3] +Conviene fare un giro più lungo. + +[ROK3_04:ROCK3] +Ehi Tommy, cambia la stazione. + +[ROK3_08:ROCK3] +Mi sto annoiando di tutto questo. + +[ROK3_09:ROCK3] +Tieni premuto il maledetto pedale! + +[ROK3_61:ROCK3] +Dobbiamo trovare la bomba! + +[ROK3_28:ROCK3] +Suonerò il basso all'inferno. + +[ROK3_30:ROCK3] +Qualcuno faccia qualcosa. + +[ROK3_32:ROCK3] +OK, osso duro, fai qualcosa tu allora. + +[ROK3_34:ROCK3] +Willy, potresti succhiare la broda con una cannuccia. + +[ROK3_37:ROCK3] +Passa una cannuccia a Willy! + +[ROK3_41:ROCK3] +Quale filo, Tommy? + +[ROK3_42:ROCK3] +Quello verde. + +[ROK3_43:ROCK3] +Non c'è un filo verde! Questo forse è verde... + +[ROK3_44:ROCK3] +Qualcuno di questi fili ti sembra verde? + +[ROK3_49:ROCK3] +Ti ho tenuto con me per anni. + +[ROK3_51:ROCK3] +Una ragazzina isterica. + +[ROK3_52:ROCK3] +Sì. + +[ROK3_53:ROCK3] +Taci e taglia un filo. + +[ROK3_54:ROCK3] +Quale filo? + +[ROK3_55:ROCK3] +Questo qua... + +[ROK3_56:ROCK3] +NO! + +[ROK3_57:ROCK3] +Oddio, siamo vivi. Non siamo esplosi, amico. Tommy, bel lavoro. Rock and roll, ragazzi. + +[ROK3_58:ROCK3] +Non abbiamo uno spettacolo a cui andare? Del casino da fare? Fans di cui abusare? + +[ROK3_59:ROCK3] +LOVE FIST! + +[ROK3_60:ROCK3] +Hai finito con quella bottiglia? + +[RBM3_4:ROCK3] +~r~Hai ucciso i Love Fist! + +[RBM3_6:ROCK3] +DETONAZIONE: + +[RBM3_1:ROCK3] +~g~Trasporta i Love Fist al concerto. + +[RBM3_2:ROCK3] +Mentre la bomba è innescata, esploderà se cercherai di lasciare la macchina... + +[RBM3_3:ROCK3] +Se la barra di detonazione si riempie completamente, la bomba esploderà. + +[RBM3_8:ROCK3] +Più velocemente guidi, più lentamente si riempirà. + +[RBM3_7:ROCK3] +~g~BOMBA DISINNESCATA! + +[ROK3_6A:ROCK3] +~g~Love Fist. Avete finito di inquinare l'etere. + +[ROK3_6B:ROCK3] +~g~Vi ho dato la possibilità di essere amici. Adesso vi darò la possibilità di morire. + +[ROK3_62:ROCK3] +Per cui abbiamo pensato di mostrarti il nostro Tempio del Rock. + +[ROK3_63:ROCK3] +Per percepire il furore alla Love Fist! + +[ROK3_64:ROCK3] +Ascolta come parli, amico. Si tratta di carta pesta e adesivo. + +[ROK3_65:ROCK3] +Ehi, ragazzi, questo è il tempio e noi siamo i sacerdoti. + +[ROK3_66:ROCK3] +Beh, se i ragazzi amano i loro sacerdoti a pezzi e mezzi sordi, + +[ROK3_67:ROCK3] +chi sono per discutere? + +[ROK3_68:ROCK3] +Oddio, si è rovinato nuovamente il nastro. + +[ROK3_69:ROCK3] +Se andiamo avanti così, dovremo suonare dal vivo. + +[ROK3_70:ROCK3] +Oooh merda! La pancia... + +[ROK3_74:ROCK3] +Ah guarda: che cos'è? Ehi Tommy, metti su questo nastro. + +[ROK3_01:ROCK3] +Finalmente, amico: è l'ora di un bel drink. + +[ROK3_02:ROCK3] +Il concerto è a cento metri lungo la strada. + +[ROK3_05:ROCK3] +Mi rimbambisco se non agito la testa. + +[ROK3_07:ROCK3] +Tommy, amico, devi salvare la band! + +[ROK3_29:ROCK3] +Tommy, continua a guidare senza rallentare! + +[ROK3_31:ROCK3] +Bella: 'Qualcuno faccia qualcosa'. Ma che idiozia è questa? Ho conosciuto froci più coraggiosi. + +[ROK3_33:ROCK3] +Ascolta, sono un musicista. Non ho la minima idea di come disarmare una bomba. + +[ROK3_35:ROCK3] +Sì, mi è giunta voce che sei bravo in queste cose. + +[ROK3_38:ROCK3] +Una cannuccia? Questo è il furgone da tour dei Love Fist! + +[ROK3_39:ROCK3] +Dove diavolo la trovo una cannuccia, amico? + +[ROK3_46:ROCK3] +Avrei dovuto scaricarti quando ne ho avuto la possibilità. + +[ROK3_47:ROCK3] +Capitalista. + +[ROK3_48:ROCK3] +Schiavo dalla gloria. + +[ROK3_73:ROCK3] +Jezz sta riproducendo il nastro. + +[RBM3_9:ROCK3] +Se ti fermi o guidi lentamente, la barra di detonazione aumenterà. + +[ROK3_50:ROCK3] +Sta zitto. Sei un idiota. + +[ROK3_36:ROCK3] +Ehi, ero completamente fuori di testa quella notte, e voi lo sapete! + +[RBM3_H:ROCK3] +Mi sto cagando addosso, amico. Voglio la mamma! + +[ROK3_45:ROCK3] +La fine imminente mi fa vedere tutto verde. + +[ROK3_6C:ROCK3] +~g~Rallenta e la limousine esploderà, insieme ai vostri GROSSI CULI PELOSI! + +[ROK3_71:ROCK3] +Dobbiamo andare avanti con quello che abbiamo. Grazie ancora Tommy. Cioè, sai cosa intendo, ciao! + +[ROK3_1:ROCK3] +Alla fine è giunta l'ora di un meritato bicchierino. Lo spettacolo si tiene a circa cento metri lungo la strada. + +[ROK3_2:ROCK3] +Conviene fare un giro più lungo. Ehi Tommy, cambia la stazione. + +[ROK3_3:ROCK3] +Sì Tommy, mi rimbambisco se non agito la testa. Ehi guarda, cos'è questo? Ehi Tommy, metti su questa cassetta. + +[ROK3_4:ROCK3] +Love Fist. Avete finito di inquinare l'etere. Vi ho dato la possibilità di essere amici. + +[ROK3_5:ROCK3] +Adesso vi darò la possibilità di morire. Se rallentate, la vostra limousine esploderà, insieme ai vostri GROSSI CULI PELOSI! + +[ROK3_6:ROCK3] +Tommy, devi salvare la band! Mi sto annoiando di tutto questo. Tieni premuto il maledetto pedale! + +[ROK3_7:ROCK3] +Dobbiamo trovare la bomba! Perché? Non possiamo guidare tutto il giorno? È vero, c'è un sacco di roba da bere... + +[ROK3_8:ROCK3] +La bomba non sarà nel motore? Dovremmo fermarci per prenderla! Moriremo tutti quanti! Credo che mi ubriacherò! + +[ROK3_9:ROCK3] +Ehi, c'è una coda da rispettare, amico! La risposta non è nel minibar! Spostati! + +[ROK3_10:ROCK3] +Ehi, dalla bottiglia di vodka escono un sacco di fili! Non è vodka, quella è BRODA! + +[ROK3_11:ROCK3] +WAAAAAAGGGHHHH!!! Ed è predisposta per esplodere! WAAAAAAAAAAAAGGGHHHHHHHH!!! + +[ROK3_12:ROCK3] +Lo dicevano che l'alcol mi avrebbe fatto fuori... L'ho visto in televisione, devi tagliare uno dei fili. Quale? Non lo so, amico. + +[ROK3_13:ROCK3] +Non ne ho idea. Willy, dimmi qualcosa. Suonerò il basso all'inferno. + +[ROK3_14:ROCK3] +Tommy, continua a guidare senza rallentare! Qualcuno faccia qualcosa. Bella! + +[ROK3_15:ROCK3] +'Qualcuno faccia qualcosa'. Ma che idiozia è questa? Ho conosciuto froci più coraggiosi. OK, osso duro, fai qualcosa tu allora. + +[ROK3_16:ROCK3] +Ascolta, io sono un musicista. Non ho la minima idea di come disarmare una bomba. Willy, potresti succhiare la broda con una cannuccia. + +[ROK3_17:ROCK3] +Sì, mi è giunta voce che sei bravo in queste cose. Ehi, ero completamente fuori di testa quella notte, e voi lo sapete! + +[ROK3_18:ROCK3] +Passa una cannuccia a Willy! Una cannuccia? Questo è il furgone da tour di Love Fist! + +[ROK3_19:ROCK3] +Dove diavolo la trovo una cannuccia, non so se mi spiego? Quale filo, Tommy? Quello verde. Non c'è un filo verde! + +[ROK3_20:ROCK3] +Questo forse è verde... Qualcuno di questi fili ti sembra verde? + +[ROK3_21:ROCK3] +Ih no! La fine imminente mi fa vedere tutto verde! Avrei dovuto scaricarti quando ne ho avuto la possibilità. + +[ROK3_22:ROCK3] +Accecato dalla gloria. Capitalista. Ti ho tenuto con me per anni. Sta zitto. Sei un idiota. + +[ROK3_23:ROCK3] +Una ragazzina isterica. Sì. Taci e taglia un filo. Quale filo? Questo qua... + +[ROK3_24:ROCK3] +NO! Oddio, siamo vivi. Non siamo esplosi, amico. + +[ROK3_25:ROCK3] +Tommy, bel lavoro. Rock and roll, ragazzi. Non abbiamo uno spettacolo a cui andare? + +[ROK3_26:ROCK3] +Del casino da fare? Fans di cui abusare? LOVE FIST! + +[ROK3_27:ROCK3] +Hai finito con quella bottiglia? + +{=================================== MISSION TABLE SERG1 ===================================} + +[TEX1_A:SERG1] +Vieni a metterti qui vicino a me, figliolo. + +[TEX1_B:SERG1] +Diamine, mio padre diceva sempre 'A caval donato non si guarda in bocca' ed effettivamente non lo ha mai fatto. + +[TEX1_C:SERG1] +Vuoi un goccio di sano Kentucky? + +[TEX1_D:SERG1] +No, grazie. + +[TEX1_E:SERG1] +Sei uno dalla testa lucida, mi piace. + +[TEX1_F:SERG1] +Ora, il business dei terreni non ha niente a che fare con quello che dicono i giornali. + +[TEX1_G:SERG1] +Si tratta solo di polvere! E la volontà di possederla! Mi segui, figliolo? + +[TEX1_H:SERG1] +Sì, certo. + +[TEX1_J:SERG1] +Tu mi sembri la persona giusta per convincerlo. + +[TEX1_K:SERG1] +La persuasione è il mio forte. + +[TEX1_L:SERG1] +Bene. Lo troverai al circolo sportivo, presso il campo da golf. + +[TEX1_M:SERG1] +Non permettono di entrare con le armi, per cui le sue guardie del corpo non saranno armate. + +[TEX1_N:SERG1] +Vai e riempilo di santissime mazzate. + +[TEX1_O:SERG1] +Prendi, ti ho iscritto al club, inoltre, credo proprio avrai bisogno di abiti più adeguati. + +[TEX1_2:SERG1] +~g~Raggiungi il club di golf Leaf Links. + +[TEX1_0:SERG1] +~g~Il bersaglio si sta allenando a golf: assicurati che sia la sua ultima partita. + +[TEX1_3:SERG1] +Chi è questo tipo? Ragazzi, occupatevene voi. + +[TEX1_6:SERG1] +Bel culo bimba! + +[TEX1_7:SERG1] +Ma sono io? + +[TEX1_I:SERG1] +Bene, c'è un tenace bastardo che non si decide a vendere. + +[TEX1_8:SERG1] +Ogni volta che entri su un cart da golf, ottieni automaticamente una mazza da golf, sempre se lo spazio per l'arma corpo a corpo è disponibile. + +[TEX1_9:SERG1] +Prendilo! + +[TEX1_10:SERG1] +Uccidi lo psicopatico! + +[TEX1_1:SERG1] +~g~Recupera degli abiti da golf presso Jocksport's. + +{=================================== MISSION TABLE SERG2 ===================================} + +[TEX_2A:SERG2] +~g~Eccellente! Ti hanno visto! + +[TEX_2B:SERG2] +~r~Pazzo! La gente deve essere TESTIMONE di un attacco da parte di un Cubano! + +[TEX_2C:SERG2] +~g~Vai a recuperare dei vestiti con i colori della gang dei Cubani da Rafael's! + +[TEX_2D:SERG2] +~g~Adesso metti fuori gioco il capo della gang degli Haitiani presso l'impresa di pompe funebri Romero's. + +[TEX2_A:SERG2] +Tommy, questo è Donald Love. Donald, questo è Tommy Vercetti, + +[TEX2_B:SERG2] +l'ultimo cowboy arrivato da queste parti. + +[TEX2_C:SERG2] +Yeh... uh... + +[TEX2_D:SERG2] +Donald, sta zitto e ascoltami, potresti imparare qualcosa. + +[TEX2_E:SERG2] +Adesso, niente fa calare i prezzi dei terreni come una bella guerra tra gang rivali. + +[TEX2_F:SERG2] +Eccetto, forse, un disastro, come una piaga biblica o qualcosa del genere. + +[TEX2_G:SERG2] +Ma per il caso in questione mi sembra un po' troppo. + +[TEX2_H:SERG2] +Capisci, brutto idiota quattr'occhi? + +[TEX2_I:SERG2] +Recentemente è morto un capo gang degli Haitiani e, a quanto sembra, sono stati i Cubani. + +[TEX2_J:SERG2] +Togliamo loro qualsiasi dubbio, allora! Vestiti da ombre Cubano + +[TEX2_K:SERG2] +e vai a disturbare il funerale. Fai un bel casino e dattela a gambe. + +[TEX2_L:SERG2] +Hai capito, Donald? + +[TEX2_M:SERG2] +Questo dovrebbe mettere il coyote nel pollaio, vero? + +[TEX2_N:SERG2] +Dopodiché dovremo solo attendere e veder crollare i prezzi. + +[TEXEXIT:SERG2] +~g~Vattene da Little Haiti! + +{=================================== MISSION TABLE SERG3 ===================================} + +[TEX3_A:SERG3] +Guarda qua, figliolo. Ho un problema e sono certo tu possa darmi una mano. + +[TEX3_B:SERG3] +Non sono un geometra. + +[TEX3_C:SERG3] +No, mi riferivo principalmente alle tue doti di demolitore. + +[TEX3_D:SERG3] +Ecco la faccenda: questo è il progetto approvato, e questo, + +[TEX3_E:SERG3] +questo è il terreno che stiamo seguendo. + +[TEX3_F:SERG3] +Stai cercando di dirmi che questo nuovo isolato di uffici è nel posto sbagliato. + +[TEX3_G:SERG3] +Capisci al volo. + +[TEX3_H:SERG3] +Adesso devo allontanarmi per un po' dalla città... + +[TEX3_I:SERG3] +...e se la costruzione di quegli uffici dovesse subire un improvviso e insormontabile problema strutturale, beh, allora... + +[TEX3_J:SERG3] +come ogni civile e ragionevole individuo, ti sentiresti obbligato a intervenire + +[TEX3_K:SERG3] +per favorire il ringiovanimento di un'area così importante della città? + +[TEX3_L:SERG3] +Dove posso ordinare altra gente come te? + +[TEX3_1:SERG3] +~g~Utilizza l'elicottero radiocomandato per trasportare le bombe nelle quattro aree bersaglio dell'edificio. + +[TEX3_2:SERG3] +~g~Devi posizionare una bomba su ogni bersaglio. Puoi piazzare l'esplosivo in qualsiasi ordine. + +[TEX3_5:SERG3] +~g~Se fai cadere una bomba senza successo, potrai raccoglierla nuovamente e riprovare. + +[TEX3_7:SERG3] +~g~Dovrai piazzare tutti gli esplosivi rimanenti in 7 minuti! + +[TEX3_8:SERG3] +~g~Hai mancato il bersaglio! Raccogli la bomba e riprova! + +[TEX3_10:SERG3] +~g~Fai cadere la bomba sul bersaglio. + +[TEX3_11:SERG3] +Bersagli rimanenti: + +[TEX3_17:SERG3] +~r~Il tempo è scaduto: non sei riuscito a demolire l'edificio! + +[TEX3_18:SERG3] +~r~L'elicottero radiocomandato è stato distrutto! Come farai adesso a trasportare le bombe? + +[TEX3_19:SERG3] +~r~Hai fatto cadere la bomba in acqua! Hai bisogno di tutte le 4 bombe per demolire il cantiere! + +[TEX3_20:SERG3] +~g~L'elicottero radiocomandato è quasi fuori portata. Torna indietro al cantiere e completa il lavoro! + +[TEX3_21:SERG3] +~r~L'elicottero radiocomandato è fuori portata! + +[TEX3_24:SERG3] +Premi il ~h~~k~~VEHICLE_LOOKLEFT~~w~ per ruotare l'elicottero in senso antiorario. + +[TEX3_25:SERG3] +Premi il ~h~~k~~VEHICLE_LOOKLEFT~~w~ per ruotare l'elicottero in senso orario. + +[TEX3_27:SERG3] +~g~Le scale centrali ti permetteranno di accedere a tutti i piani dell'edificio. + +[TEX3_31:SERG3] +~r~Hai distrutto il van contenente le bombe e l'elicottero radiocomandato! + +[TEX3_32:SERG3] +Puoi ~h~guardare indietro~w~ premendo ~h~simultaneamente ~k~~VEHICLE_LOOKLEFT~ e ~k~~VEHICLE_LOOKRIGHT~~w~. + +[TEX3_4:SERG3] { reVC update } +~g~Per sganciare una bomba, premi il ~h~~k~~VEHICLE_FIREWEAPON~~g~. + +[TEX3_29:SERG3] { reVC update } +Per sganciare una bomba, premi il ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[TEX3_26:SERG3] +Premi il ~h~~k~~VEHICLE_BRAKE~~w~ per ridurre la velocità del rotore dell'elicottero in modo da farlo abbassare. + +[TEX3_22:SERG3] +Premi il ~h~~k~~VEHICLE_ACCELERATE~~w~ per aumentare la velocità del rotore dell'elicottero in modo da ~h~farlo alzare. + +[TEX3_16:SERG3] +~g~Raggiungi il van ~w~TOPFUN~g~ presso il cantiere edile da demolire. + +[TEX3_33:SERG3] +Una volta raccolta una bomba, il radar mostrerà la pozione del bersaglio rispetto all'elicottero radiocomandato. + +[TEX3_34:SERG3] +Un ~h~triangolo verso l'alto~w~ indica che il bersaglio si trova ~h~più in alto~w~ dell'elicottero. + +[TEX3_35:SERG3] +Un ~h~triangolo verso il basso~w~ indica che il bersaglio si trova ~h~più in basso~w~ dell'elicottero. + +[TEX3_36:SERG3] +Un ~h~quadrato~w~ indica che il bersaglio si trova alla ~h~stessa altezza~w~ dell'elicottero. + +[TEX3_6:SERG3] +~g~Una volta raccolta la prima bomba, comincerà il conto alla rovescia. + +[TEX3_28:SERG3] +Per ~h~raccogliere una bomba~w~, avvicinaci l'elicottero radiocomandato. L'elicottero può trasportare una sola bomba alla volta. + +[TEX3_30:SERG3] +Per raccogliere una bomba, avvicinaci l'elicottero radiocomandato. L'elicottero può trasportare una sola bomba alla volta. + +[TEX3_12:SERG3] +~g~Bomba posizionata! Ancora 3 bersagli! Torna indietro e recupera un'altra bomba. + +[TEX3_13:SERG3] +~g~Bomba posizionata! Ancora 2 bersagli! Torna indietro e recupera un'altra bomba. + +[TEX3_14:SERG3] +~g~Bomba posizionata! Ancora 1 bersaglio! Torna indietro e recupera un'altra bomba. + +[TEX3_15:SERG3] +~r~Conto alla rovescia avviato! ~g~Devi posizionare le ~w~4 bombe~g~ in tempo! + +[TEX3_37:SERG3] +Sposta ~h~in basso la levetta analogica destra~w~ per aumentare la velocità del rotore e ~h~far salire~w~ l'elicottero. + +[TEX3_38:SERG3] { reVC update } +{Sposta ~h~~k~~VEHICLE_ACCELERATE~~w~ per ridurre la velocità del rotore e ~h~far scendere~w~ l'elicottero.} +Sposta ~h~in alto la levetta analogica destra~w~ per ridurre la velocità del rotore e ~h~far scendere~w~ l'elicottero. + +[TEX3_39:SERG3] +~g~Per sganciare una bomba, premi il tasto ~h~~k~~VEHICLE_HANDBRAKE~~g~. + +[TEX3_40:SERG3] +Per sganciare una bomba, premi il tasto ~h~~k~~VEHICLE_HANDBRAKE~~w~. + +[TEX3_23:SERG3] +Premi i tasti ~h~~k~~VEHICLE_TURRETUP~~w~ e ~h~~k~~VEHICLE_TURRETDOWN~~w~ per inclinare l'elicottero nella direzione desiderata. + +{=================================== MISSION TABLE TAXI1 ===================================} + +[FARES:TAXI1] +CLIENTI: + +[TAXI1:TAXI1] +~g~Trova un passeggero. + +[TSCORE2:TAXI1] +~1~$ + +[IN_ROW:TAXI1] +Bonus ~1~ DI SEGUITO! ~1~$ + +[TAXI3:TAXI1] +~r~Il passeggero è fuggito terrorizzato! + +[TAXI7:TAXI1] +~r~La tua auto è distrutta, falla riparare. + +[TAXI4:TAXI1] +Corsa completata! + +[TAXI5:TAXI1] +BONUS VELOCITÀ! + +[TAXI6:TAXI1] +Missione taxi terminata + +[TAXIH1:TAXI1] +Fermati vicino a un pedone evidenziato per farlo salire a bordo e portarlo a destinazione prima che scada il tempo. + +[FARE1:TAXI1] +~g~Destinazione: ~w~'Club Pole Position'~g~ in Ocean Beach. + +[FARE3:TAXI1] +~g~Destinazione: ~w~'Marina'~g~ in Ocean Beach. + +[FARE4:TAXI1] +~g~Destinazione: ~w~'Ammu-Nation'~g~ in Ocean Beach. + +[FARE5:TAXI1] +~g~Destinazione: ~w~'Hardware store'~g~ in Washington Beach. + +[FARE6:TAXI1] +~g~Destinazione: ~w~'Mall North Point'~g~ in Vice Point. + +[MFARE1:TAXI1] +~g~Destinazione: ~w~'Ammu-Nation'~g~ in Downtown. + +[MFARE2:TAXI1] +~g~Destinazione: ~w~'il terminal'~g~ all'aeroporto internazionale Escobar. + +[WFARE3:TAXI1] +~g~Destinazione: ~w~'Sunshine Autos'~g~ in Little Havana. + +[WFARE4:TAXI1] +~g~Destinazione: ~w~'Taxi Kaufman'~g~ in Little Haiti. + +[WFARE5:TAXI1] +~g~Destinazione: ~w~'Hardware store'~g~ in Little Havana. + +[WFARE6:TAXI1] +~g~Destinazione: ~w~'Howlin Petes Bike'~g~ in Downtown. + +[FARE7:TAXI1] +~g~Destinazione: ~w~'il negozio dei gioiellieri'~g~ in Vice Point. + +[FARE8:TAXI1] +~g~Destinazione: ~w~'la spiaggia'~g~ in Ocean Beach. + +[FARE9:TAXI1] +~g~Destinazione: ~w~'la spiaggia'~g~ in Washington Beach. + +[FARE10:TAXI1] +~g~Destinazione: ~w~'la spiaggia'~g~ in Vice Point. + +[FARE11:TAXI1] +~g~Destinazione: ~w~'l'ospedale'~g~ in Ocean Beach. + +[FARE12:TAXI1] +~g~Destinazione: ~w~'l'ospedale'~g~ in Vice Point. + +[FARE13:TAXI1] +~g~Destinazione: ~w~'la stazione di polizia'~g~ in Washington Beach. + +[FARE14:TAXI1] +~g~Destinazione: ~w~'la stazione di polizia'~g~ in Vice Point. + +[FARE15:TAXI1] +~g~Destinazione: ~w~'il ristorante della pizza'~g~ in Vice Point. + +[WFARE7:TAXI1] +~g~Destinazione: ~w~'la stazione di polizia'~g~ in Little Havana. + +[WFARE8:TAXI1] +~g~Destinazione: ~w~'la stazione di polizia'~g~ in Downtown. + +[WFARE9:TAXI1] +~g~Destinazione: ~w~'l'ospedale'~g~ in Downtown. + +[WFARE10:TAXI1] +~g~Destinazione: ~w~'l'ospedale'~g~ in Little Havana. + +[WFARE11:TAXI1] +~g~Destinazione: ~w~'lo stadio'~g~ in Downtown. + +[WFARE12:TAXI1] +~g~Destinazione: ~w~'il ristorante della pizza'~g~ in Little Haiti. + +[WFARE13:TAXI1] +~g~Destinazione: ~w~'il ristorante della pizza'~g~ in Downtown. + +[WFARE14:TAXI1] +~g~Destinazione: ~w~'i bacini'~g~ in Viceport. + +[WFARE15:TAXI1] +~g~Destinazione: ~w~'la farmacia'~g~ in Little Haiti. + +[FARE2:TAXI1] +~g~Destinazione: ~w~'Club Malibu'~g~ in Vice Point. + +{=================================== MISSION TABLE TAXICUT ===================================} + +[TAXC_A:TAXICUT] +Immagino tu sia il nuovo proprietario. + +[TAXC_B:TAXICUT] +Di chi fai parte? Mafia? Cartello? Non sembri Messicano... + +[TAXC_C:TAXICUT] +Comunque, immagino ora comincerai con la vecchia frase 'le cose stanno per cambiare da queste parti', + +[TAXC_D:TAXICUT] +magari minaccerai uno degli autisti... + +[TAXC_E:TAXICUT] +vacci piano con quello là, Ted, ha appena avuto un'ernia al disco. + +[TAXC_F:TAXICUT] +Beh, sì. Le cose stanno per cambiare da queste parti, signora. + +[TAXC_G:TAXICUT] +Che felicità, figliolo. Me ne occupo io... + +[TAXC_H:TAXICUT] +Ormai lo faccio da anni. + +[TAXC_I:TAXICUT] +Attenzione a tutti: + +[TAXC_J:TAXICUT] +è cambiata la gestione e le cose stanno nuovamente per cambiare da queste parti. + +[TAXC_K:TAXICUT] +Il nostro nuovo direttore, della... + +[TAXC_L:TAXICUT] +Di quale gang fai parte? + +[TAXC_M:TAXICUT] +Beh, non faccio parte di nessuna gang. + +[TAXC_N:TAXICUT] +Allora qual è il tuo maledetto nome, ragazzo? + +[TAXC_O:TAXICUT] +Vercetti, Tommy Vercetti. + +[TAXC_P:TAXICUT] +In nostro nuovo direttore, della Vercetti Gang, + +[TAXC_Q:TAXICUT] +si assicurerà che non ci succedano incidenti. + +[TAXC_R:TAXICUT] +Capisce? Fine! + +[TAXC_S:TAXICUT] +Ti è piaciuto il 'Capisce'? A me è piaciuto il 'Capisce'. + +[TAXC_T:TAXICUT] +Allora è così che ha funzionato nel passato: + +[TAXC_U:TAXICUT] +noi portiamo avanti l'azienda come sempre. + +[TAXC_V:TAXICUT] +Se abbiamo problemi con la concorrenza, tu ti occupi di riempirli di botte. + +[TAXC_W:TAXICUT] +Poi loro ci riempiono di botte, + +[TAXC_X:TAXICUT] +poi tu riempi loro di botte nuovamente, + +[TAXC_Y:TAXICUT] +eccetera, eccetera. Tutto chiaro? + +[TAXC_Z:TAXICUT] +Uh, sì, almeno credo... + +[TAXC_A1:TAXICUT] +Prendi un taxi dal garage se ti senti di lanciarti subito nella mischia. + +{=================================== MISSION TABLE TAXIWA1 ===================================} + +[OUTTIME:TAXIWA1] +~r~Troppo lento, troppo lento! + +[TAX1_1:TAXIWA1] +OK, abbiamo un cliente danaroso che richiede un taxi da Starfish Island: qualche volontario? + +[TAX1_2:TAXIWA1] +Qui Tommy, lo prendo io! + +[TAX1_3:TAXIWA1] +Questo cliente è mio, indietro! + +[TAX1_4:TAXIWA1] +Forza, forza, entra in fretta! + +[TAX1_5:TAXIWA1] +OK, OK! Ti prego, non farmi male! + +[TAXW1_1:TAXIWA1] +~g~Passa a prendere il VIP su Starfish Island. + +[TAXW1_2:TAXIWA1] +~g~Porta indietro il VIP! Metti fuori gioco l'altra macchina! + +[TAXW1_3:TAXIWA1] +~r~Il VIP è morto! + +[TAXW1_4:TAXIWA1] +~r~Il VIP è arrivato a destinazione! + +[TAXW1_6:TAXIWA1] +~g~Porta il VIP all'aeroporto! + +{=================================== MISSION TABLE TAXIWA2 ===================================} + +[TAX2_1:TAXIWA2] +Chiamata a tutti i veicoli: stiamo perdendo clienti in tutta la città. Che cosa sta succedendo? + +[TAX2_2:TAXIWA2] +I taxi VC continuano a batterci sul tempo. Sono in troppi, non possiamo competere! + +[TAX2_3:TAXIWA2] +Mr. Vercetti, se sei in ascolto, devi mettere fuori gioco un po' dei taxi VC, se no falliamo! + +[TAXW2_1:TAXIWA2] +~g~Distruggi 3 taxi rivali! + +{=================================== MISSION TABLE TAXIWA3 ===================================} + +[TAX3_1:TAXIWA3] +Taxi 13, la signorina Cortez ha bisogno di essere prelevata da Down Town e ha richiesto esplicitamente di te. + +[TAX3_2:TAXIWA3] +OK, ricevuto. Taxi 13 chiudo. + +[TAX3_3:TAXIWA3] +Hmmm, nessun segno di Mercedes... + +[TAXW3_3:TAXIWA3] +~g~Metti fuori combattimento il capo dei taxisti! + +[TAXW3_2:TAXIWA3] +~g~Resta vivo fino allo scadere del tempo. + +[TAX_AS1:TAXIWA3] +BENI COMPAGNIA DEI TAXI ACQUISITI + +[TAX_AS2:TAXIWA3] +La compagnia dei taxi d'ora in poi genererà introiti per un massimo di ~1~$. Ricordati di recuperarli regolarmente. + +[TAX3_4:TAXIWA3] +È giunta l'ora che l'angelo custode dei Taxi Kaufman entri in azione! + +[TAX3_5:TAXIWA3] +Ehi ragazzo, ti abbronzo il fondoschiena! + +{ re3 updates } +{ new languages } +[FEL_JAP] +GIAPPONESE + +[FEL_POL] +POLACCO + +[FEL_RUS] +RUSSO + +{ new display menus } +[FET_GFX] +GRAPHICS SETUP + +[FED_MIP] +MIP MAPPING + +[FED_AAS] +ANTI ALIASING + +[FED_FIL] +TEXTURE FILTERING + +[FED_BIL] +BILINEAR + +[FED_TRL] +TRILINEAR + +[FED_WND] +WINDOWED + +[FED_FLS] +FULLSCREEN + +[FEM_CSB] +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 + +[FEC_FRC] +FREE CAM + +{ Linux joy detection } +[FEC_JOD] +DETECT JOYSTICK + +[FEC_JPR] +Press any key on the joystick of your choice that you want to use on the game, and it will be selected. + +[FEC_JDE] +Detected joystick + +{ mission restart } +[FET_RMS] +RIGIOCA MISSIONE + +[FESZ_RM] +RIGIOCA? + +[FED_VPL] +VEHICLE PIPELINE + +[FED_PRM] +PED RIM LIGHT + +[FED_RGL] +ROAD GLOSS + +[FED_CLF] +COLOUR FILTER + +[FED_WLM] +WORLD LIGHTMAPS + +[FED_MBL] +MOTION BLUR + +[FEM_SIM] +SIMPLE + +[FEM_NRM] +NORMAL + +[FEM_MOB] +MOBILE + +[FED_MFX] +MATFX + +[FED_NEO] +NEO + +[FEM_PS2] +PS2 + +[FEM_XBX] +XBOX + +[FEC_IVP] +INVERT PAD VERTICALLY + +[FEM_NON] +NONE + +[FEC_DS2] +DUALSHOCK 2 + +[FEC_DS3] +DUALSHOCK 3 + +[FEC_DS4] +DUALSHOCK 4 + +[FEC_360] +XBOX 360 CONTROLLER + +[FEC_ONE] +XBOX ONE CONTROLLER + +[FEC_TYP] +GAMEPAD TYPE + +[FET_AGS] +GAMEPAD SETTINGS + +[FEM_AUT] { aspect ratio related } +AUTO [DUMMY] THIS LABEL NEEDS TO BE HERE !!! diff --git a/utils/gxt/spanish.txt b/utils/gxt/spanish.txt index 3f57b1a..82c1958 100644 --- a/utils/gxt/spanish.txt +++ b/utils/gxt/spanish.txt @@ -1,413 +1,95 @@ -[LETTER1] -abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"$,.'-?!!SDBF +{ + New strings are at the bottom of file. + Do not change the order of strings. + You can fix the typos of existing translation but please refrain from + unnecessary edits like rephasing because you think it suits better for your taste. -[DEFNAM] -Claude---------------------- + SPANISH NOTE: + This is European Spanish, do not mix it with Latin American Spanish. + If you want the Latin American Spanish translation you'd have to create + a separate txt for it. +} +{ Grand Theft Auto Vice City Spanish (Spain) Translation } +{ Contains some of the official fixes made by Rockstar for the iOS port } +{ Additional translation rewrites, corrections and fixes by IlDucci } [IN_VEH] -~w~¡Eh! ¡Vuelve al ~b~vehículo~w~! - -[IN_VEH2] -~w~Para este trabajo necesitas un carro. - -[IN_BOAT] -~w~Para esto necesitas una embarcación. +~g~¡Eh! ¡Vuelve al vehículo! [HEY] -~w~No vayas solo, mantén al grupo unido. - -[HEY2] -~w~No te separes, mantén al grupo unido. - -[HEY3] -~w~You've dropped your main man, go back and get 8-Ball! - -[HEY6] -~w~You left your honor with the Yakuza Kanbu. You must protect him! - -[HEY7] -~w~Un arma más podría ser útil. ¡Vuelve y recoge al contacto! - -[HEY9] -~w~¿Quieres que se corra la voz? ¡Ve a ver al contacto! - -[GATE_1] -~w~Los Sindacco solo abrirán las puertas a sus coches. - -[HELPA] -~w~Éste es tu ~h~piso franco~w~. - -[HELPB] -~w~Mientras no estés en una misión, guarda el progreso pasando por el ~h~icono de guardar~w~. El tiempo avanzará 6 horas. - -[HELPC] -~w~Los vehículos que dejes en el ~h~garaje de al lado~w~ se conservarán al guardar la partida. - -[HELPD] -Para salir del piso franco, camina hasta la ~h~señal~w~. - -[HELP0] -~w~Pulsa~h~ ~k~ ~VEEE~ ~w~para entrar o salir de un vehículo. - -[HELP1] -~w~Párate en el centro de la ~h~señal amarilla~w~. +~g~¡No vayas solo, mantén tu grupo unido! [HELP3] -~w~Solo esprintarás un tiempo limitado antes de cansarte. +Solo puedes esprintar durante cortos periodos de tiempo, antes de cansarte. -[HELP4] -~w~Pulsa~h~ ~k~ ~VEACC~ ~w~para ~h~acelerar,~h~ ~k~ ~VESTR~ ~w~para dirigir. +[HELP4_D] +Mueve el ~h~joystick analógico derecho~w~ hacia arriba para ~h~acelerar. -[HELP5] -~w~Pulsa~h~ ~k~ ~VEBRK~ ~w~para ~h~frenar~w~ o para ~h~dar marcha atrás~w~ si el vehículo se ha parado. +[HELP5_D] +Tira del ~h~joystick analógico derecho~w~ hacia atrás para ~h~frenar~w~, o para ~h~dar marcha atrás~w~ si el vehículo se ha detenido. -[HELP6] -~w~Pulsa~h~ ~k~ ~VEHB~ ~w~para usar el ~h~freno de mano~w~. +[HELP7_A] +Pulsa y mantén pulsado el ~h~~k~~PED_LOCK_TARGET~ ~w~para ~h~apuntar~w~ con el rifle de francotirador. -[HELP7] -~w~Mantén pulsado~h~ ~k~ ~PDLT~ ~w~para apuntar con un rifle de francotirador. - -[HELP8] -~w~Usa~h~ ~k~ ~SNZI~ ~w~y~h~ ~k~ ~SNZO~ ~w~para ~h~acercar y alejar el zoom~w~ mientras apuntas. +[HELP7_D] +Pulsa y mantén pulsado el ~h~~k~~PED_LOCK_TARGET~ ~w~para ~h~apuntar~w~ con el rifle de francotirador. [HELP10] -~w~La ~h~placa amarilla~w~ indica que estás ~h~buscado~w~. La policía intentará detenerte. +Esta insignia indica que tienes un nivel de se busca por la policía. [HELP11] -~w~Cuantas más placas se muestren, más se empeñará la ley en detenerte. - -[HELP12] -~w~Camina hasta la ~h~señal amarilla~w~ para empezar una misión. +Cuantas más insignias tengas, mayor es tu nivel de se busca. [HELP13] -~w~Busca los caminos que no aparecen en el ~h~radar~w~ y aprovéchalos. - -[HELP14] -~w~Usa el ~h~radar~w~ para trazar la ruta por la ciudad y sigue el ~h~punto amarillo~w~ para encontrar el ~h~piso franco~w~. ~w~Usa el ~h~radar~w~, en la parte inferior de la pantalla, para orientarte por la ciudad y encontrar los objetivos. - -[HELP16] -~w~Usa~h~ ~k~ ~VESTR~ ~w~para dirigir. - -[HELP17] -~w~Phil Cassidy's, la mercancía de más calibre: ¡pronto nuevas existencias! - -[HELP18] -~w~¡Nuevas existencias en la armería Phil Cassidy's Fully Cocked! - -[HELP18B] -~w~¡Phil Cassidy's ya tiene existencias de la ~h~minigun~w~! - -[HELP19A] -~w~Para ~h~disparar en marcha~w~, mantén pulsado~h~ ~k~ ~VELL~ ~w~o~h~ ~k~ ~VELR~ ~w~y dispara con~h~ ~k~ ~VEWEP~~w~. - -[HELP19C] -~w~Solo puedes disparar en marcha si tienes un ~h~subfusil~w~. - -[HELP19D] -~h~Las motos ~w~te permiten ~h~disparar hacia adelante~w~ si pulsas~h~ ~k~ ~VEWEP~~w~. - -[HELP19F] -Solo puedes disparar hacia adelante si tienes un ~h~subfusil~w~. - -[HELP20] -~w~¡Has encontrado un ~h~soborno policial~w~! Al recogerlos, reduces el ~h~nivel de búsqueda~w~ en una estrella. - -[HELP21] -~w~Usa~h~ ~k~ ~PDCWE~ ~w~para cambiar de arma mientras vas a pie. - -[HELP22] -~w~Para encontrar el ~h~almacén de Vincenzo~w~, sigue el ~h~punto "V"~w~ en el radar. - -[HELP23] -~w~El punto es un ~h~triángulo hacia abajo~w~; esto indica que el ~h~objetivo está por debajo~w~ de ti. - -[HELP24] -~w~Mantén pulsado~h~ ~k~ ~VELL~ ~w~o~h~ ~k~ ~VELR~ ~w~para mirar a ~h~derecha o izquierda~w~ en un vehículo. Mantén pulsados ambos para mirar ~h~hacia atrás~w~. - -[HELP25] -~w~Pulsa~h~ ~k~ ~CVEIW~ ~w~para cambiar los ~h~modos de cámara~w~. - -[HELP26] -~w~Salta a una embarcación y pulsa~h~ ~k~ ~VEEE~ ~w~para subir. - -[HELP27] -~w~Si estás cerca de una embarcación, pulsa~h~ ~k~ ~VEEE~ ~w~para abordarla. - -[HELP29] -~w~Pulsa~h~ ~k~ ~VEHN~ ~w~para tocar el ~h~claxon~w~ del vehículo. - -[HELP30] -~w~Usa~h~ ~k~ ~VECRS~ ~w~para cambiar de ~h~emisora de radio~w~. - -[HELP33] -~w~Ahora que los sicarios han cobrado, harán su trabajo por mucho que tarden. - -[HELP34] -~w~Mantén pulsado~h~ ~k~ ~VELB~ ~w~para mirar hacia atrás cuando estés en un coche. - -[HELP38] -~w~Si matas a alguien que tenga un arma, la dejará caer. - -[HELP40] -~w~Cuando vayas a pie, usa~h~ ~k~ ~PDLOO~ ~w~para mirar alrededor. - -[HELP58] -~w~Mantén pulsado~h~ ~k~ ~PDLT~ ~w~para ~h~fijar un blanco~w~ y pulsa~h~ ~k~ ~PDFW~ ~w~para disparar. - -[HELP59] -~w~Con el blanco fijado, pulsa~h~ ~k~ ~PDCTL~ ~w~para cambiar de objetivo. - -[HELP60] -~w~Algunos bidones explotarán si les disparas, pero acuérdate de guardar la distancia. - -[TANK] -~w~Usa~h~ ~k~ ~VEWEA~ ~w~para apuntar con el cañón del Rhino y~h~ ~k~ ~VEWEP~ ~w~para disparar. - -[ANSWER] -~w~Pulsa~h~ ~k~ ~ANS~ ~w~para responder al teléfono móvil y~h~ ~k~ ~VEEE~ ~w~para colgar. - -[BOMB] -~w~Si llevas un coche al taller de ~h~bombas~w~, 8-Ball te cobrará ~h~500 $~w~ por ponerle una. - -[BRIDGE1] -~w~Puente Callahan: en construcción. Fecha estimada de finalización: mayo de 1998 - -[STRIK_1] -~w~Cuando la huelga haya acabado, podrás coger el ~h~ferry~w~ a Staunton Island. - -[SPRAY] -~w~Si llevas un vehículo a un ~h~Pay 'n' Spray~w~ te quitarán el ~h~nivel de búsqueda~w~ y te lo ~h~repararán~w~ y ~h~repintarán~w~ por ~h~100 $~w~. - -[S_TRN_1] -~w~Puedes usar el ~h~metro~w~ para ir por Liberty City. Pulsa~h~ ~k~ ~VEEE~ ~w~para ~h~entrar ~w~o ~h~salir~w~ de él. - -[TUBE1] -~w~Cuando abran la estación, podrás coger el ~h~metro~w~ a Staunton Island. - -[TUBE2] -~w~Podrás ir al ~h~aeropuerto internacional Francis ~w~cuando abran esta estación. - -[TUBE_2] -~w~Para subirte al ~h~metro~w~, pulsa~h~ ~k~ ~VEEE~~w~. - -[SPRAY1] -~w~Al aparcar en un ~h~Pay 'n' Spray~w~ te quitarán el ~h~nivel de búsqueda~w~ y ~h~repararán~w~ y ~h~repintarán~w~ el vehículo. Suele costar ~h~100 $~w~, pero esta vez es gratis. - -[HELPE31] -~w~El jugador irá teniendo a su disposición nuevas prendas durante la partida que tendrá que recoger en Mr. Benz. - -[HELPE32] -~w~Durante la partida, el jugador tendrá oportunidad de comprar armas más potentes en Ammu-Nation. - -[HELPCOM] -~w~Desbloqueadas nuevas prendas en el piso franco. - -[HELP41] -~w~Aparca en el ~h~Pay 'n' Spray~w~ para reparar y repintar el coche. Sigue el ~h~punto del bote de spray~w~ en el radar para encontrar el sitio. - -[PAGEB1] -~w~La ~h~pistola~w~ ya está disponible en el piso franco. - -[PAGEB10] -~w~Has encontrado todos los paquetes ocultos. ¡Tienes una ~h~gratificación de 50.000 $~w~! - -[EXPO_W] -~w~Love Media necesita uno de esos. - -[FERRY_2] -~w~Vuelve cuando el ferry esté atracado. - -[FERRY_3] -~w~¡Tu vehículo no cabe en el ferry! - -[FERRY_4] -~w~¡Los delincuentes buscados no pueden subir al ferry! - -[FERRY_5] -~w~Necesitas ~h~25 $~w~ para un pasaje en el ferry. Vuelve cuando tengas dinero suficiente. - -[FERRY_6] -~w~No puedes usar el ferry mientras estás en una misión. - -[FERR_SK] -~w~Pulsa~h~ ~k~ ~TRSK~ ~w~para saltar al final del viaje. - -[FERR_C1] -~w~Ferry a Staunton. Tarifa: ~h~25 $~w~. Pulsa~h~ ~k~ ~TGSUB~ ~w~para comprar el pasaje. - -[FERR_C2] -~w~Ferry a Portland. Tarifa: ~h~25 $~w~. Pulsa~h~ ~k~ ~TGSUB~ ~w~para comprar el pasaje. - -[A_H1] -~w~~k~ ~AMBUY~ ~w~comprar. ~n~~k~ ~AMEXI~ ~w~salir. - -[A_UZI_A] -~w~Ammu-Nation ya dispone de micro subfusiles. - -[AMMU] -~w~Las armas estarán disponibles en ~h~Ammu-Nation~w~ cuando lleguen existencias. Disculpen las molestias. - -[WANT_A] -~w~Cuando te hayan ~h~'trincado'~w~, te llevarán a la comisaría más cercana. - -[WANT_B] -~w~Fracasará cualquier misión en la que estuvieras y la poli se quedará con tus armas y un dinero para el soborno. - -[WANT_C] -~w~Solo acabarás ~h~'trincado'~w~ si tienes un ~h~nivel de búsqueda~w~ en forma de fila de estrellas en la esquina superior de la pantalla. - -[WANT_D] -~w~Cuantas más estrellas tengas, con más empeño te perseguirá la ley. - -[WANT_E] -~w~Hay maneras de reducir el nivel de búsqueda. Mantén los ojos abiertos para encontrarlas. - -[WANT_F] -~w~Cuando vayas en un vehículo, pásate por un ~h~Pay 'n' Spray~w~ para quitarte el nivel de búsqueda. - -[HEAL_A] -~w~Cuando estés ~h~'eliminado'~w~, te llevarán al hospital más próximo. - -[HEAL_B] -~w~Perderás todas las armas y fallarás cualquier misión en la que estuvieras. También te cobrarán por curarte. - -[HEAL_C] -~w~Tu ~h~salud~w~ se indica en la barra roja de la parte superior derecha de la pantalla. - -[HEAL_D] -~w~Hay maneras de curarte o protegerte. Mantén los ojos abiertos para encontrarlas. - -[H_WE_01] -~w~Camina por encima de las armas para recogerlas. Solo puedes hacerlo si vas a pie. - -[H_WE_02] -~w~Si ya tienes un arma de ese tipo, pulsa~h~ ~k~ ~PUCF~ ~w~para sustituirla por la nueva. - -[PU_CF] -~w~Pulsa~h~ ~k~ ~PUCF~ ~w~para coger esta arma. Se perderá cualquier otra del mismo tipo. - -[CLOTHA] -~h~~k~ ~AMMOV~ ~w~para ver prendas. ~h~~k~ ~AMBUY~ ~w~ cambiar de ropa. ~h~~k~ ~AMEXI~ ~w~ cancelar. - -[CLOTHB] -~w~Aquí puedes cambiar de ropa cuando quieras. - -[SIREN_1] -~w~Para encender o apagar la ~h~sirena de un vehículo de emergencia~w~, pulsa~h~ ~k~ ~VEHN~~w~. - -[FHOSE_1] -~w~Mantén pulsado~h~ ~k~ ~VEWEP~ ~w~para disparar el cañón de agua. - -[PHOTO1] -~w~Mantén pulsado~h~ ~k~ ~PDLT~ ~w~para enfocar con la cámara. - -[PHOTO2] -~w~Mientras enfocas con la cámara, usa~h~ ~k~ ~SNZI~ ~w~y~h~ ~k~ ~SNZO~ ~w~para ~h~acercar y alejar el zoom~w~. - -[PHOTO3] -~w~Pulsa~h~ ~k~ ~PDFW~ ~w~para hacer una foto mientras enfocas con la cámara. - -[BENZ_H1] -~w~Sigue el ~h~punto de la camisa~w~ en el radar para encontrar ~h~la tienda de ropa Mr. Benz~w~. - -[BENZ_LE] -~w~El ~h~traje de Leone~w~ ya está disponible en el piso franco. - -[BENZ_GU] -~w~La ~h~ropa de Ángel Vengador~w~ ya está disponible en el piso franco. - -[BENZ_CH] -~w~La ~h~ropa de chófer~w~ ya está disponible en el piso franco. - -[BENZ_TU] -~w~El ~h~esmoquin~w~ ya está disponible en el piso franco. - -[ATUTOR] -~w~Alterna la activación de las misiones de médico ATS pulsando~h~ ~k~ ~TGSUB~~w~. - -[CTUTOR] -~w~Alterna la activación de las misiones de vigilante pulsando~h~ ~k~ ~TGSUB~~w~. - -[FTUTOR] -~w~Alterna la activación de las misiones de bombero pulsando~h~ ~k~ ~TGSUB~~w~. - -[TRATUT1] -~w~Alterna la activación de las misiones de basurero pulsando~h~ ~k~ ~TGSUB~~w~. - -[TTUTOR] -~w~Alterna la activación de las misiones de taxista pulsando~h~ ~k~ ~TGSUB~~w~. - -[A_COMP2] -~w~Misión de médico ATS: nivel 12 completado. Ya no te cansarás al correr. - -[FIREPRO] -~w~Misión de bombero: nivel 12 completado. Ya eres ignífugo. - -[RCHELP] -~w~Para ~h~detonar~w~ el coche de radiocontrol, pulsa~h~ ~k~ ~VEWEP~~w~. - -[TAXIH1] -~w~Para cerca de un ~h~peatón resaltado~w~ para recogerlo y luego llévalo rápido a su destino. - -[TIPHLP] -~w~La ~h~barra de propinas~w~ desciende con el ~h~tiempo~w~ y cuando el taxi sufre ~h~daños~w~. - -[ANG_E3] -~w~Ve y busca otros Ángeles Vengadores por Chinatown. - -[ANGOUT] -~w~Vuelve cuando lleves la ropa de ~h~Ángel Vengador~w~. - -[ANGCOM2] -~w~Misiones de Ángel Vengador, Staunton: nivel 15 completado. Ya no perderás dinero si te trincan. - -[ANGCOM3] -~w~Misiones de Ángel Vengador, Shoreside: nivel 15 completado. Tienes un vehículo "especial" en el piso franco. - -[TVOHELP] -~w~Prueba a volver cuando lleves la ~h~máscara de hockey~w~. +Algunas veces puedes necesitar ir por caminos que el radar no detecta. [TIMER] Ésta es una misión cronometrada, debes completarla antes de que el cronómetro llegue a cero. -[GARAGE] -Mete el vehículo en el garaje y sal a pie. +[HORN] +~g~Toca la bocina. -[TRASH] -~g~¡El vehículo está hecho fosfatina! ¡Haz que lo reparen! - -[WRECKED] -~r~¡El vehículo está destrozado! - -[SPOOK] -SUSTÓMETRO - -[SPOTTED] -~r~¡Te persiguen! +[NOMONEY] +~g~¡Necesitas más dinero! [REWARD] -~w~Recompensa: ~1~ $ +RECOMPENSA ~1~ $ -[GAMEOVR] -FIN DE LA PARTIDA +[M_FAIL] +¡MISIÓN FALLIDA! -[Z] -Valor del eje Z: ~1~ +[M_PASS] +¡MISIÓN SUPERADA! ~1~ $ [DEAD] ¡ELIMINADO! -[GOODBOY] -~w~¡Bonificación de 50 $ por buen ciudadano! +[BUSTED] +¡ARRESTADO! + +[WEATHE1] +FORZAR TIEMPO SOLEADO + +[WEATHE2] +FORZAR TIEMPO EXTREMADAMENTE SOLEADO + +[WEATHE3] +FORZAR TIEMPO NUBLADO + +[WEATHE4] +FORZAR TIEMPO LLUVIOSO + +[WEATHE5] +FORZAR TIEMPO CON NIEBLA + +[WEATHE6] +TIEMPO NORMAL [NUMBER] ~1~ -[SCORE] -~1~ $ - [LOADCAR] -CARGANDO VEHÍCULO... (PULSA EL botón L PARA CANCELAR) +CARGANDO VEHÍCULO... (PULSA L1 PARA CANCELAR) [CARSOFF] Coches desactivados. @@ -416,319 +98,1813 @@ Coches desactivados. Coches activados. [TEXTXYZ] -Escribiendo coordenadas en archivo... +Escribiendo coordenadas en el archivo... [CHEATON] -Modo trucos SÍ +Modo trucos ACTIVADO [CHEATOF] -Modo trucos NO +Modo trucos DESACTIVADO [IMPORT1] -Sal y espera a que llegue el vehículo. +Ve fuera y espera tu vehículo. -[KE_PLYR] -Jugador +[PAGEB11] +Entregado lanzallamas en el escondite -[KE_CTCS] -Contactos +[WANT_A] +Sólo serás arrestado si tienes un ~h~nivel de se busca. -[KE_WEPS] -Armas +[WANT_B] +Tu ~h~nivel de se busca~w~ viene representado por la fila de estrellas en la parte superior derecha de la pantalla. -[KE_ADR] -Adrenalina +[WANT_C] +Ahora tienes un ~h~nivel de se busca~w~ de una... -[KE_BRIB] -Soborno +[WANT_D] +dos... -[KE_HLTH] -Salud +[WANT_E] +tres... -[KE_KILF] -Frenesí +[WANT_F] +A medida que tu ~h~nivel de se busca~w~ aumente, atraerás a representantes más poderosos de las fuerzas policiales. -[KE_ARM] -Blindaje +[WANT_G] +Cuando te hayan ~h~''arrestado''~w~ serás conducido a la comisaría más cercana. -[KE_USJ] -AU +[WANT_H] +Los polis te quitarán todas las armas y parte de tu dinero como soborno. -[KE_PKG] -Paquete oculto +[WANT_I] +Cualquier misión en la que estuvieses habrá fracasado. -[KE_INFO] -Información +[WANT_J] +Encontrarás modos de reducir tu nivel de se busca cuanto más juegues. -[DAM] -Daño +[WANT_K] +Si estás en un coche, el ~h~TALLER DE PINTURA~w~ limpiará ~h~tu nivel de búsqueda. -[KILLS] -Abat. +[HEAL_B] +Cuando seas ~h~''eliminado''~w~ serás conducido al hospital más cercano. -[TIME] -Crono +[HEAL_C] +Perderás tus armas y los médicos te quitarán algo de dinero por recomponerte. -[STOPS] -Paradas +[HEAL_E] +Encontrarás modos de curarte o de protegerte cuanto más juegues al juego. -[BULL] -Bullion +[BRIBE1] +Acabas de recoger un soborno de la policía, esto disminuirá en una estrella tu nivel de se busca. -[EVID] -Prueba +[SAVE1] +Entra al corona para ~h~guardar la partida~w~. No puedes guardar durante una misión. -[HEALTH] -Integridad coche +[SAVE2] +Cualquier vehículo que quede en este garaje será almacenado cuando se guarde la partida. -[COLLECT] -Recogido +[AMMU] +Ve dentro de Ammu-Nation para comprar un arma. -[LEVEL] -Nivel +[R_TIME] +TIEMPO DE CARRERA: -[SALES] -Ventas +[PROP_1] +No tienes suficiente dinero para adquirir esta propiedad -[CITYZON] -Liberty City - -[VICE_C] -Liberty City +[PROP_2] +No puedes comprar propiedades mientras estás en una misión. [IND_ZON] -Portland - -[PORT_W] -Callahan Point - -[PORT_S] -Atlantic Quays - -[PORT_E] -Puerto de Portland - -[PORT_I] -Trenton - -[S_VIEW] -Portland View - -[CHINA] -Chinatown - -[EASTBAY] -Playa de Portland - -[LITTLEI] -Saint Mark's - -[REDLIGH] -Red Light District - -[TOWERS] -Hepburn Heights - -[HARWOOD] -Harwood - -[ROADBR1] -Puente Callahan - -[ROADBR2] -Puente Callahan - -[TUNNELP] -Túnel de Porter - -[BOMB1] -Taller de 8-Ball +Vice City Beach [COM_ZON] -Staunton Island +Península de Vice City -[STADIUM] -Aspatria +[BEACH1] +Ocean Beach -[STADIU2] -Aspatria +[BEACH2] +Washington Beach -[STADIU3] -Aspatria +[BEACH3] +Vice Point -[HOSPI_2] -Rockford +[GOLFC] +Leaf Links -[UNIVERS] -Liberty Campus +[STARI] +Starfish Island -[CONSTRU] -Fort Staunton +[DOCKS] +Viceport -[PARK] -Parque de Belleville +[HAVANA] +Little Havana -[COM_EAS] -Newport +[HAITI] +Little Haiti -[SHOPING] -Bedford Point +[PORNI] +Prawn Island -[SHOP2] -Bedford Point +[DTOWN] +Centro de la ciudad -[SHOP3] -Bedford Point +[VICE_C] +Vice City -[YAKUSA] -Torrington +[A_PORT] +Escobar International -[SUB_ZON] -Shoreside Vale +[JUNKY] +Vertedero -[AIRPORT] -Aerop. Intnal. Francis +[PISTOL] +Pistola -[PROJECT] -Wichita Gardens +[PYTHON] +.357 -[SUB_IND] -Pike Creek +[UZI] +Uz-1 -[SWANKS] -Cedar Grove +[TEC9] +Tec 9 -[BIG_DAM] -Presa de Cochrane +[M4] +M4 -[SUB_ZO2] -Shoreside Vale +[INGRAM] +Mac -[SUB_ZO3] -Shoreside Vale +[MP5] +MP + +[RUGER] +Kruger + +[SNIPE] +Rifle de francotirador + +[GRENADE] +Granadas + +[SHOTGN1] +Escopeta + +[SHOTGN2] +S.P.A.S. 12 + +[SHOTGN3] +Escopeta de cañones recortados + +[ARMOUR] +Chaleco antibalas + +[LASER] +.308 Rifle de francotirador + +[BASEBAT] +Bate de béisbol + +[HAMMER] +Martillo + +[SCREWD] +Destornillador + +[CLEVER] +Cuchillo de carnicero + +[MACHETE] +Machete + +[KNIFE] +Cuchillo + +[KATANA] +Katana + +[CHAINSA] +Sierra eléctrica + +[G_COST] +~1~ $ [CAR_1] Ambulancia -[CAR_2] -Coche de bomberos +[MALIBU] +El Club Malibú -[CAR_3] -Policía +[MANSION] +Mansión de Díaz -[CAR_4] -Furgón policial +[TMANS] +Finca de Vercetti -[CAR_5] -Barracks +[STRIP] +El Club Pole Position -[CAR_6] -Rhino +[MALL1] +Centro comercial North Point -[CAR_7] -Coche del FBI +[BANKINT] +El Banco Corrupto Grande -[CAR_8] -Securicar +[RANGE] +Campo de tiro con rifle -[CAR_9] -Moonbeam +[POL_HQ] +Cuartel general de VCPD -[CAR_10] -Autocar +[INT_B] +Un viejo amigo -[CAR_11] -Camión remolcador +[INTB_1] +~g~Ve a la oficina del Abogado. -[CAR_12] -Camión articulado +[LAW_1] +La fiesta -[CAR_13] -Camión de la basura +[LAW_2] +Pelea en el callejón trasero -[CAR_14] -Patriot +[LAW_3] +Furia en el jurado -[CAR_15] -Mr. Whoopee +[LAW_4] +Disturbios -[CAR_16] -Mule +[COL_1] +Cerdo traidor -[CAR_17] -Yankee +[COL_2] +Tiros en el centro comercial -[CAR_18] -Pony +[COL_3] +Ángeles guardianes -[CAR_19] -Bobcat +[COL_4] +¡Señor, sí, señor! -[CAR_20] -Rumpo +[COL_5] +¡Todos con las manos arriba! -[CAR_21] -Blista +[COK_1] +La caza -[CAR_22] -Dodo +[COK_2] +Phnom Penh '86 -[CAR_23] -Autobús +[COK_3] +El barco más rápido -[CAR_24] -Sentinel +[COK_4] +Oferta y demanda -[CAR_25] -Cheetah +[KENT_1] +El corredor de la muerte -[CAR_26] -Banshee +[ASS_1] +Borrar -[CAR_27] -Stinger +[BUD_1] +Extorsión -[CAR_28] -Infernus +[BUD_2] +Pelea en el bar -[CAR_29] -Esperanto +[BUD_3] +Tierra de polis -[CAR_30] -Kuruma +[CAP_1] +Liquida al cobrador -[CAR_31] -Stretch +[FIN_1] +Mantén cerca a tus amigos... -[CAR_32] -Perennial +[BANK_1] +¿Sin escapatoria? -[CAR_33] -Landstalker +[BANK_2] +El tirador -[CAR_34] -Manana +[BANK_3] +El conductor -[CAR_35] -Idaho +[BANK_4] +El atraco -[CAR_36] -Stallion +[CNT_1] +Descubriendo el pastel -[CAR_37] -Taxi +[CNT_2] +Ataca al mensajero -[CAR_38] -'Cabbie' +[PORN_1] +Campaña de reclutamiento -[CAR_39] -Buggy +[PORN_2] +Consolador Dodo -[SINDACO] -Argento de Sindacco +[PORN_3] +La foto policial de Marta -[HEARSE] -Hearse +[PORN_4] +Punto G + +[TAX_1] +Taxis Kaufman + +[TAXI_1] +V.I.P. + +[TAXI_2] +Rivalidad amistosa + +[TAXI_3] +Taxigedón + +[ICE_1] +Distribución + +[TEX_1] +Hierro número cuatro + +[TEX_2] +Dos leves impactos + +[TEX_3] +Demoledor + +[PHIL_1] +Traficante de armas + +[PHIL_2] +Boomshine Saigon + +[BIKE_1] +Moto con llantas de aleación + +[BIKE_2] +Incitando al macho + +[BIKE_3] +Moto robada + +[ROCK_1] +Love Juice + +[ROCK_2] +Asesino psicópata + +[ROCK_3] +Gira publicitaria + +[ROCK_4] +¡Love Fist! + +[HAT_1] +Poción mágica + +[HAT_2] +¡Bombas fuera! + +[HAT_3] +Juego sucio + +[CUB_1] +El desafío del barco trucado + +[CUB_2] +Carne de cañón + +[CUB_3] +Encuentro naval + +[CUB_4] +Vudú troyano + +[JOB_1] +Muerte en la carretera + +[JOB_2] +Elimina a la esposa + +[JOB_3] +Autocidio + +[JOB_4] +Comprobar el registro + +[JOB_5] +Cabos sueltos + +[ANSWER] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para responder a una llamada a tu teléfono móvil. + +[MOB_01A] +¡Estás bien figura! Soy Paul. Puede que tenga algún resultado para ti, pero necesito hablar contigo cara a cara. + +[MOB_01B] +Estoy de relax en el Malibu. + +[MOB_01C] +Creo que después de esto me vas a deber un favor o dos, guapo. Hasta luego. + +[MOB_02A] +Ssssnniiiiffffff... ¡Eh! Hola, ¿Tommy? ¡Tommy! + +[MOB_02B] +Tenemos un problema en la imprenta. Mejor que vayas y lo compruebes. + +[MOB_02C] +Algún tipo de lío. Las cosas andan revueltas. Tengo que irme. + +[MOB_03A] +¿Sr. Vercetti? Tengo un trozo de mierda firmada que dice + +[MOB_03B] +que usted ha asumido todas las deudas de BJ's Auto. + +[MOB_03C] +Con la repentina desaparición de BJ no tengo más remedio + +[MOB_03D] +que hacerle responsable de su inestabilidad financiera + +[MOB_03E] +Hasta que esta cuenta quede completamente saldada + +[MOB_03F] +debería considerar que las calles de Vice City son poco seguras. + +[MOB_04A] +¿Cómo estás, tío? Soy Paulo. + +[MOB_04B] +Mira, Tommy, me olvidé de mencionar que vamos a necesitar más seguridad para el concierto. + +[MOB_04C] +Hay una banda de moteros liderada por Mitch Baker que serían la publicidad ideal. + +[MOB_04D] +Solucióname esto y te conseguiré un pase para la actuación, ¿vale? + +[MOB_05A] +Soy Mitch. Hiciste un buen trabajo, Tommy. Es bueno volver a tener a mi pequeña en casa. + +[MOB_05B] +Dile al Sr. Kent Paul que dispondrá de seguridad para la actuación. + +[MOB_05C] +Tiene mi palabra de ello. + +[MOB_05D] +Intenta no meterte en problemas. + +[MOB_06A] +Tommy, esos de abajo han estado rajando sobre ti, chico. + +[MOB_06B] +Pensé que podrías necesitar consuelo casero así que la tía Poulet te preparará una sopa, ¿hmmm? + +[MOB_06C] +Pásate por mi cocina alguna vez, ¿de acuerdo Tommy? + +[MOB_08A] +Eh Tommy, pensé que podrías necesitar algún asesoramiento financiero. + +[MOB_08B] +Una vez que tengas la operación en marcha, tendrás que pasarte a recoger la recaudación de la semana. + +[MOB_08C] +Deja que esos tipos crean que son los amos del lugar e intentarán cepillarse los beneficios... ¿vale? + +[MOB_08D] +Eh, sé como llevar el negocio, Ken. + +[MOB_08E] +Vale, vale. Lo sé, ya sabes. Lo sé. Estaba, + +[MOB_08F] +Sólo estaba, ya sabes, diciéndote que sé, que tú sabes que yo lo sé. + +[MOB_08G] +¡Solo manteniéndolo a punto, nene! + +[MOB_08H] +Lo que sea, Ken, lo que sea... + +[MOB_09A] +¡Eh, Leo! ¡Tengo trabajo para ti! + +[MOB_09B] +No soy Leo. + +[MOB_09C] +¡Eh, como Leo sepa que tienes su teléfono, te va a liquidar! + +[MOB_09D] +Quizás Leo ya esté muerto. Quizás yo le maté y cogí su teléfono, ¿te has parado a pensar eso, gilipollas? + +[MOB_09E] +¿Mataste a Leo? Debes tener unas pelotas muy grandes... ¿quieres trabajar para mí? + +[MOB_09F] +Pásate por el café de mi padre en Little Havana y podremos hablar de tú a tú. + +[MOB_10A] +¡Tommy! Mira, tengo que pedirte un favor. + +[MOB_10B] +¡Steve! ¿Cómo van con el rodaje? + +[MOB_10C] +Bien, bien. Yo, je, NOSOTROS necesitamos una escena con una persecución de coches, pero nuestro presupuesto no da para más. + +[MOB_10D] +Me han dejado un coche en la ciudad. Tú sabrás qué hacer. + +[MOB_10E] +De acuerdo, Steve, estaré al tanto. Te veo luego. + +[MOB_11A] +¿Qué hay, hijo? Pensé sólo en llamarte para darte algún consejo. + +[MOB_11B] +Hola, Avery. ¿Qué te preocupa? + +[MOB_11C] +Hay muchas oportunidades en esta ciudad si dispones de las propiedades adecuadas, ¿entiendes lo que quiero decir? + +[MOB_11D] +Creo que sí... + +[MOB_11E] +Lo que digo es que mantengas los ojos abiertos y podrás encontrar la oportunidad de negocio perfecta. Te veré luego. + +[MOB_11F] +Nos vemos, Avery. + +[MOB12_A] +¡Eh, Tommy, soy Avery! Ahora escucha, estoy muy liado en este momento + +[MOB12_B] +y uno de mis representantes necesita carabina para ir a Gator Keys. + +[MOB12_C] +Estoy detrás de unas tierras por allí, así que voy a enviar alguien a que ablande el trato. + +[MOB12_D] +Podrías hacerme un favor y asegurarte de que llega allí, ¿entendido? + +[MOB12_E] +Sí, eso está hecho, Avery. ¿Dónde te gustaría que le recogiese? + +[MOB12_F] +Está terminando algunos negocios en la obra. Le dije que le recogerías allí. + +[MOB12_G] +Ningún problema. Nos vemos, Avery. + +[MOB13_A] +¿Vercetti? ¡VERCETTI! ¡Maldito seas, tío, tienes que ayudarme! + +[MOB13_B] +¿Sr. Moffat? ¿Cómo le va la vida en familia? + +[MOB13_C] +Maldito seas, DEMONIOS, ¿me oyes? + +[MOB13_D] +Bueno, fue agradable charlar... + +[MOB13_E] +¡ESPERA! Espera, Vercetti Tommy, ¿Puedo llamarte Tommy? + +[MOB13_F] +Los dos somos hombres de negocios, ¿verdad? Reconoces un buen negocio cuando lo ves. + +[MOB13_G] +No tengo tiempo para charlar, vaya al grano. + +[MOB13_H] +DINERO. El dinero es el maldito asunto. + +[MOB13_I] +Me escapado de la trena otra vez, pero nunca tardan mucho en encontrarme... ¡creen que es un maldito juego! + +[MOB13_J] +Estoy en un teléfono público en alguna parte de este agujero de mierda olvidado de la mano de Dios. + +[MOB13_K] +Sácame de aquí antes de que me lleven de vuelta y... oh... Dios... + +[MOB13_L] +Bueno, estoy ocupado durante las próximas... + +[MOB13_M] +¡No! ¡No me jodas, ten piedad! Ningún hombre debería tener que hacer esas, esas cosas. + +[MOB13_N] +Estoy de rodillas, Tommy, en el fango, rogándote, por favor... + +[MOB13_O] +Supongo que podría desviarme hacia allí, veré si puedo localizarte... + +[MOB13_P] +Oh, Dios, ya vienen. Por el amor de Dios, date prisa, ¡date prisa! + +[MOB_14A] +Hola, Tommy, me vas a adorar, amigo. + +[MOB_14B] +Un pajarito me ha dicho que la división SWAT de Vice City tiene un depósito en una entidad bancaria ciertamente grande, + +[MOB_14C] +donde guardan todos los sobornos que han recibido durante estos años, + +[MOB_14D] +¡como una especie de fondo de retiro para los veteranos! + +[MOB_14E] +Por supuesto, si esta información te ayudase a adquirir parte de ese dinero, + +[MOB_14F] +¿Supongo que te sentirías obligado a mandarme algo? + +[MOB_14G] +Lo tendré en mente, gracias Kent. + +[MOB_14H] +Es Paul. Soy de Kent, cerca de Londres, idiota. + +[MOB_14I] +Mi conocimiento de la geografía provincial inglesa ya no es lo que era. + +[MOB15_A] +Tommy, colega, soy Paul, de Kent, + +[MOB15_B] +un par de titis han escrito tu nombre por todas partes, en el Malibú. + +[MOB15_C] +¿De qué estás hablando? + +[MOB15_D] +Tías. Palomitas. Ya sabes. Chicas. De las buenas, no creas que son furcias ni nada por el estilo. + +[MOB15_E] +Tienes que venir a echarles un vistazo. + +[MOB16_A] +Tommy, aquí Paulo, ¿qué pasa amigo? + +[MOB16_B] +¿Qué quieres Paul? No quiero ropa de imitación. + +[MOB16_C] +Muy divertido, colega, pero yo no toco la ropa falsificada. + +[MOB16_D] +Nada, sólo llamaba para ver si consigo un papel en una de tus películas, + +[MOB16_E] +en Inglaterra hice un montón de porno, colega. + +[MOB16_F] +Guardo más fuego que tu, hijo mío. + +[MOB16_G] +Paul, gracias por la oferta, lo tendré en mente. + +[MOB16_H] +En serio, no te olvides de mí, después de todo lo que he hecho por ti. + +[MOB16_I] +Eso es lo que estoy intentando olvidar. + +[MOB19_A] +Tommy V, aquí KP. Kent Paul. En las calles se dice que hay gente que te quiere despellejar. + +[MOB19_B] +Mantén los ojos abiertos. Y recuerda, yo no te he dicho nada de esto. + +[MOB_20A] +De acuerdo, Tommy, soy Paul. Me ha dicho un pajarito que has sido un chico muy malo. + +[MOB_20B] +A alguien le ha ofendido que de repente estés actuando como si fueses el mandamás, dándote aires de grandeza. + +[MOB_20C] +Bueno, no digas que nunca te advertí. Presumir es un juego de tontos, hijo. + +[MOB_20D] +En cualquier caso, oí que se ha puesto un precio a tu cabeza y que alguien te la va a partir, + +[MOB_20E] +así que ten cuidado, y acuérdate de mí, colega. + +[MOB21_A] +Tommy, Thomas, soy Cortez. ¿Qué pasa? + +[MOB21_B] +Las cosas van bien. ¿Cómo estás? + +[MOB21_G] +De todos modos, Tommy, quisiera preguntarte algo sobre Mercedes. + +[MOB21_H] +¿Sí? ¿Qué pasa con ella? + +[MOB21_I] +Oh Tommy, Tommy, oigo todas esas historias y no sé qué pensar. + +[MOB21_K] +Quizás ella piense que puede hacer lo que quiera ahora que pero dime, Tommy, ¿es verdad? + +[MOB21_M] +¿El qué es verdad? + +[MOB21_N] +Las historias que he oído. ¿De verdad va a ser abogada? + +[MOB21_O] +Oh Tommy, la vergüenza. Los Cortez somos una familia orgullosa + +[MOB21_P] +y nunca permitiríamos que una hija nuestra se convirtiese en abogada. Por favor, dime que no es así. No creo que pudiese soportarlo. + +[MOB21_Q] +Coronel, puedo asegurarle que Mercedes nunca será abogada. No tema. + +[MOB21_R] +Gracias, Tommy, gracias. La vergüenza sería insoportable. + +[MOB21_S] +Lo sé, coronel. + +[MOB21_T] +Bueno, Tommy, debes perdonarme, ha llegado el nuevo ministro de interior. + +[MOB21_U] +Hace muchos años, yo maté a su padre en un golpe fallido así que debo ser cortés. Buenos días, amigo. + +[MOB21_C] +Tommy, aquí siempre es una lucha. Siento el ruido, acabamos de tener otro golpe fallido. + +[MOB21_D] +La gente es la señora más exigente de todas. + +[MOB21_E] +Desde que he vuelto de Vice City y hasta ahora, hemos tenido tres revoluciones y cuatro golpes. + +[MOB21_F] +Afortunadamente, me han ascendido cada vez. + +[MOB21_J] +Quizás todo el mundo me está humillando. + +[MOB21_L] +pero dime, Tommy, ¿es verdad? + +[MOB22_A] +Tommy, estás demostrando ser muy útil, amigo mío. + +[MOB22_B] +Gracias, Cortez. ¿Qué hay de mi asunto? + +[MOB22_C] +Tommy, estoy trabajando infatigablemente en tu nombre para conseguir llegar al fondo de esta zanja de apestosas mentiras y engaños, + +[MOB22_D] +tienes mi palabra al respecto, pero mientras tanto, + +[MOB22_E] +por favor, acepta el estimable agradecimiento de mi gente por tu trabajo para nosotros. + +[MOB_25A] +Tommy, soy Cortez. Los franceses me están causando todo tipo de problemas. + +[MOB_25B] +Malditos hipócritas. ¡Se pasan cien años robando a países pobres y me llaman ladrón a mí! + +[MOB_25C] +Voy a necesitar tu ayuda tan pronto como sea posible. + +[MOB_25D] +Por favor, Tommy, date prisa, te necesito, ¿de acuerdo? Odio a esos malditos franceses. + +[MOB_26A] +Hola, ¿Tommy? + +[MOB_26B] +¿Sí? + +[MOB_26C] +Soy Baker. Sólo quería decirte que verdaderamente disfruté con el espectáculo. + +[MOB_26D] +Los chicos y yo queremos darte las gracias, y recordarte, + +[MOB_26E] +que te tienes nuestro respeto. Buenos días. Sigue cabalgando duro, chico. + +[MOB_29A] +Hola, ¿hablo con el Sr. Tommy Vercetti? + +[MOB_29B] +Sí. + +[MOB_29C] +Bueno, he oído por radio macuto que usted es el hombre que hay que buscar cuando alguien tiene una plaga de bichos. + +[MOB_29D] +Puede... + +[MOB_29E] +Bueno, yo tengo una plaga de bichos de verdad. Haitianos, por todas partes. + +[MOB_29F] +Mi nombre es Umberto Robina y quiero que nos reunamos en el Café Robina lo antes posible, + +[MOB_29G] +porque, como le digo, estos malditos haitianos se han pasado de la raya esta vez. + +[MOB_29H] +Prueba + +[MOB_30A] +Tommy, soy Umberto Robina. + +[MOB_30B] +¿Cómo está el café? + +[MOB_30C] +Oh, maravilloso. Increíble. Tommy, increíble. Sin blandengues, Tommy, sólo hombres de verdad, ya sabes, ¡y las mujeres hermosas! + +[MOB_30D] +De todos modos, quería decirte que para papá y para mí, para nosotros, ahora eres un cubano. + +[MOB_30E] +Has demostrado que tienes unas pelotas de cojones, tío. + +[MOB_30F] +Gracias, Umberto. Nadie me había dicho eso desde que salí de la cárcel. Nos vemos. + +[MOB_33A] +Tommy, soy Phil, olvida toda esa mierda del pasado y escúchame, ¿me oyes? + +[MOB_33B] +Bien. Tengo un pelotazo extra a punto de fermentar y me preguntaba si te apetecería probarlo. + +[MOB_33C] +En serio, Tommy, si quieres una copa, o si necesitas ponerte a tono, este material hará de ti un hombre. + +[MOB_33D] +A mí me pasó aunque todavía no puedo ver por un ojo. Te estaré esperando, lo que oyes. + +[MOB_34A] +Tommy, de verdad que he disfrutado trabajando contigo. No me había divertido tanto desde la loma en Vietnam, colega. + +[MOB_34B] +De todas formas, si necesitas algo, llámame, ¿me oyes? + +[MOB_34C] +Siempre me acuerdo de aquellos con los que he servido, + +[MOB_34D] +y estoy seguro de que puedo ayudarte, ¿me oyes? + +[MOB_35A] +Tommy, la herida está cicatrizando bien. Lo gracioso es + +[MOB_35B] +que he luchado en 6 zonas de combate y siempre he salido sin un rasguño, ¡y ahora esto! + +[MOB_35C] +Phil el manco. Aún así, tengo una buena selección armas de fuego para mancos, así que nunca seré Phil el desarmado, lo que oyes. + +[MOB_35D] +Venga, hijo, corta con esa mierda sentimental y pídete una copa, ¡me oyes! + +[MOB_36A] +Tommy, soy Phil, quiero darte las gracias por ayudarme allí, hijo, + +[MOB_36B] +maldito Charlie, siempre te tenderá una emboscada de un modo o de otro. + +[MOB_36C] +Bueno, la herida está cicatrizando bien, y eso quiere decir que voy a dejar de estafar al gobierno con mi cheque de incapacidad. Gracias, colega. + +[MOB_40A] +Eh, Tommy, soy Sonny. ¿Qué tal el bronceado? + +[MOB_40B] +No tengo bronceado. + +[MOB_40C] +Bueno, tampoco tienes mi dinero, así que me estoy preguntando, + +[MOB_40D] +¿qué estás haciendo? Así que, dime Tommy ¿qué estás haciendo? + +[MOB_40E] +Estoy buscando el dinero, Sonny. No te preocupes. + +[MOB_40F] +Me estoy preocupando, Tommy, ese es mi estilo, + +[MOB_40G] +porque parece que en mi vida tengo este problema con gente que no es de confianza. + +[MOB_40H] +No seas una persona poco fiable, Tommy, por favor. + +[MOB_40I] +Haznos un favor. Tengo muchas ganas de tener noticias tuyas. + +[MOB_41A] +Tommy, ¿te acuerdas de mí? + +[MOB_41B] +Hola, Sonny. + +[MOB_41C] +Sí, está bien, Sonny. Somos viejos amigos, + +[MOB_41D] +y nunca me escribes, nunca llamas. ¿No quieres que sigamos siendo amigos? + +[MOB_41E] +He estado muy ocupado intentando arreglar las cosas. No me diste mucho apoyo. + +[MOB_41F] +Oh, y es culpa mía, ¿verdad? Bueno, he oído que has estado muy ocupado. + +[MOB_41G] +Ocupado matando a capos. Ocupado tomando el poder. + +[MOB_41H] +No te olvides de nosotros, Tommy, porque puedo asegurarte que yo no me he olvidado de ti. + +[MOB_42A] +Tommy. + +[MOB_42B] +Sonny. + +[MOB_42C] +Obviamente tienes un problema a la hora de escuchar a los demás, de modo que lo intentaré de nuevo. + +[MOB_42D] +Tommy, ¿dónde está el maldito dinero, dónde está el maldito material y dónde está mi parte de tus nuevos golpes? + +[MOB_42E] +Me estás haciendo quedar como un idiota, Tommy, y no me hace gracia. + +[MOB_43A] +Tommy, Tommy, Tommy, tenía a Sonny al teléfono, de acuerdo, ¿me sigues? + +[MOB_43B] +No sé tú, pero hay algo sobre un hombre que amenaza con asesinar a mi familia + +[MOB_43C] +que realmente me pone enfermo. ¿Qué vas a hacer? + +[MOB_43D] +Ten calma, Ken, todo irá bien. + +[MOB_43E] +¡ESTOY calmado, todo lo calmado que puede estar un hombre cuando teme por su vida! + +[MOB_43F] +Ken, ahora mismo tengo otras cosas en la cabeza, + +[MOB_43G] +nos ocuparemos de Forelli cuando llegue el momento. + +[MOB_43H] +Estoy calmado. ¿No te lo parece? Debe ser la muerte inminente la que le hace esto a mi voz. + +[MOB45_A] +Tommy, tenemos cosas de las que hablar. + +[MOB45_B] +¿Cuál es el problema, Lance? + +[MOB45_C] +Eres tú, amigo, creo que no me estás dando una tajada justa. + +[MOB45_D] +Y lo que es más, me estás avergonzando delante de los chicos. No puedo permitirlo. + +[MOB45_E] +Lance, las cosas no son así. Has estado cometiendo errores. + +[MOB45_F] +Tommy, no soy tu chico de los recados. No soy tu emisario. + +[MOB45_G] +Lance, no la cagues, y no tendremos ningún problema. Si la cago yo, entonces podrás venir a reprochármelo en cualquier momento. + +[MOB45_H] +Tommy, he hecho de todo por ti, pero me tratas como si fuese estúpido. No hagas eso. + +[MOB45_I] +Lance no te voy a timar ni a apuñalarte por la espalda, de acuerdo. + +[MOB45_J] +Tómatelo con calma. Esto ya es lo suficientemente duro sin que te me pongas sentimental. + +[MOB45_K] +Confía en mí. ¿Me oyes, me oyes? + +[MOB45_L] +Te oigo, pero Tommy, no puedo aguantar esto por más tiempo. + +[MOB45_M] +Lance, no seas así. Ahora te estoy dando un aviso. + +[MOB45_N] +¿Me oyes? Relájate, tómate unos días libres, y luego hablaremos, ¿vale? + +[MOB46_A] +¡Eh, Tommy! Soy Lance. + +[MOB46_B] +¿Sí? + +[MOB46_C] +Me alegro tanto de tener noticias tuyas, Lance. Venga, tío, enróllate, enróllate. + +[MOB46_D] +Estoy ocupado. ¿Qué quieres? + +[MOB46_E] +Nada. Solo llamo para decirte, ya sabes. Mira Tommy, podemos hacer esto. + +[MOB46_F] +Tú y yo, sin ningún problema. ¿Sabes lo que quiero decir? + +[MOB46_G] +Vamos a tener que hacerlo, porque de otro modo, estaremos muertos, Lance. + +[MOB46_H] +Ya hemos ido demasiado lejos. Pero gracias por llamar. Hablaré contigo más tarde. + +[MOB_47A] +Tommy, Lance, tenemos problemas serios. Ven aquí. Enseguida. + +[MOB52_A] +Eh, Leo, creo que tengo un comprador para la mercancía de Díaz. + +[MOB52_B] +Tienes que llamarle, tío, montar el trato, ¿sabes? + +[MOB52_C] +¿Dónde estás? + +[MOB52_D] +¿Estás bien, Leo? Te noto un tanto diferente. + +[MOB52_E] +Simplemente dime dónde estás. + +[MOB52_F] +¿Quién demonios eres? ¡Que se ponga Leo! + +[MOB52_G] +Leo se ha ido de viaje unos días, me dejó al cargo de todo. + +[MOB52_H] +¡Que te jodan, tío! + +[MOB54_A] +¡Hola, Tommy! + +[MOB54_B] +Hola, Mercedes, ¿cómo te va? + +[MOB54_C] +Tengo un apartamento nuevo en Vice Point, + +[MOB54_D] +pensé que quizás querrías pasarte en algún momento. + +[MOB54_E] +Me encantaría. Te veo luego. + +[MOB55_A] +Tommy, soy yo. + +[MOB55_B] +Hola, Mercedes. + +[MOB55_C] +Tommy, estoy tan aburrida, ¿cuándo vamos a divertirnos un poco? + +[MOB55_D] +¿Qué quieres decir? + +[MOB55_E] +Bueno, sé que estás ocupado luchando y matando y sobornando a gente, + +[MOB55_F] +pero yo sólo quiero divertirme un poco. Así que no te olvides de mí, ¿me oyes? + +[MOB56_A] +Tommy, oí que te cargaste a Ricardo Díaz. + +[MOB56_B] +Hubo un desafortunado tiroteo en su mansión. + +[MOB56_C] +Creo que se quemó hasta morir en su camisa acrílica. + +[MOB56_D] +Tommy, estoy tan orgullosa de ti. Sabía que eras un hombre de verdad. + +[MOB56_E] +Era un marrano en pantalones, me haces sentir muy orgullosa de ser tu amiga. + +[MOB56_F] +No, sé que vas a estar ocupado intentando tomar las riendas de esta ciudad, + +[MOB56_G] +pero no te olvides de mí, ¿me oyes? + +[MOB57_A] +Soy Mercedes. Ya no te amo, Tommy. + +[MOB57_B] +Ya no lo hago. De verdad. Porque ya no eres amable con Mercedes. + +[MOB57_C] +Ya no la tratas como una dama. Me ignoras y te odio. + +[MOB57_D] +¡Insisto en que vengas a verme enseguida! + +[MOB58_A] +Tommy. + +[MOB58_B] +Hola, Mercedes. + +[MOB58_C] +Hola, tipo duro. Estoy muy enfadada contigo, Tommy. + +[MOB58_D] +No me hagas ir nunca más por ahí con Jezz Torrent otra vez. + +[MOB58_E] +Es patético. A mitad de camino, empieza a llorar por su perrito + +[MOB58_F] +que murió cuando él tenía siete años y que si su madre nunca le había querido. + +[MOB58_G] +Y Tommy. En privado lleva peluca y sostén. + +[MOB58_H] +¡No estoy muy contenta contigo! + +[MOB59_A] +Ooh Tommy, soy Mercedes. + +[MOB59_B] +Sólo quería decirte que me divertí mucho en el plató de rodaje. + +[MOB59_C] +Cualquier otra cosa que tengas así, me lo dices. + +[MOB59_D] +Lo digo de verdad. Siempre quise ser actriz. + +[MOB59_E] +Creo que aprendí mucho sobre el proceso dramático. + +[MOB59_F] +¡Es tan instructivo! Gracias. Gracias. Hasta muy, muy pronto. Adiós. + +[MOB_99] +Ve al teléfono público del lugar. + +[MOB_98] +Ve al teléfono público del lugar. + +[MOB_97] +Ve al teléfono público del lugar. + +[MOB_96] +Ve al teléfono público del lugar. + +[MOB_95] +Ve al teléfono público del lugar. + +[A_TIME] ++~1~ segundos + +[DODO_FT] +¡Volaste durante ~1~ segundos! + +[GA_8] +Utiliza el detonador para activar la bomba. + +[GA_10] +Muy bien. Aquí están tus ~1~ $. + +[GA_11] +Ya tenemos ese coche. ¡No nos sirve! + +[GA_12] +Bomba activada. + +[GA_13] +Entregado como un profesional. Completa la lista y habrá una bonificación para ti. + +[GA_14] +Todos los coches. ¡ESTUPENDO! Aquí tienes una cosilla. + +[GA_15] +Espero que te guste el nuevo color. + +[GA_16] +Volver a pintarlo es gratis. + +[GA_19] +No estamos interesados en este modelo. + +[GA_20] +Tenemos más de eso de los que podemos colocar. Lo siento, tío, no hay trato. + +[CHASE] +Atención de la prensa + +[CHASE1] +Ignorado + +[CHASE2] +Aburrido + +[CHASE3] +Algo interesante + +[CHASE4] +Página 7 del periódico local + +[CHASE5] +Portada del periódico local + +[CHASE6] +Página 2 del Vice Courier + +[CHASE7] +Portada del Vice Courier + +[CHASE8] +TV Local a las 3 de la mañana + +[CHASE9] +Noticias locales en TV + +[CHASE10] +Cobertura en directo de la TV Local + +[CHASE11] +Página 12 del UFA Today + +[CHASE12] +Página 4 del UFA Today + +[CHASE13] +Imagen en UFA Today + +[CHASE14] +TV Nacional a las 4 de la mañana + +[CHASE15] +Noticias de la TV Nacional + +[CHASE16] +Cobertura en directo de la TV Nacional + +[CHASE17] +Noticias internacionales + +[CHASE18] +Crisis nacional + +[CHASE19] +Crisis internacional + +[CHASE20] +Acontecimiento mundial + +[CHASE21] +Leyenda + +[CR_1] +La grúa no puede levantar este vehículo + +[PU_MONY] +No tienes suficiente dinero. + +[CO_ALL] +Los tienes todos. Aquí tienes una cosilla... + +[FEM_ON] +SÍ + +[FEM_OFF] +NO + +[FEM_YES] +Sí + +[FEM_NO] +No + +[FEM_RET] +REINTENTAR + +[FEC_NA] +NO DISPONIBLE + +[FEC_CWL] +Escoger arma hacia la izquierda + +[FEC_CWR] +Escoger arma hacia la derecha + +[FEC_LOF] +Mirar hacia adelante + +[FEC_TAR] +Objetivo + +[FEC_MOV] +Movimiento + +[FEC_CAM] +Modos de cámara + +[FEC_PAU] +Pausa + +[FEC_ENV] +Entrar en el vehículo + +[FEC_JUM] +Saltar + +[FEC_ATT] +Atacar o disparar arma + +[FEC_RUN] +Correr + +[FEC_FPC] +Cámara en primera persona + +[FEC_LL] +Mirar a la izquierda + +[FEC_LB] +Retrovisor + +[FEC_LR] +Mirar a la derecha + +[FEC_ABR] +Acelerar, frenar o dar marcha atrás + +[FEC_HOR] +Bocina + +[FEC_VES] +Control del vehículo + +[FEC_BRA] +Freno o marcha atrás + +[FEC_HAB] +Freno de mano + +[FEC_CAW] +Arma del vehículo + +[FEC_ACC] +Acelerar + +[FEC_CCF] +Configuración: + +[FEC_CF1] +Configuración 1 + +[FEC_CF2] +Configuración 2 + +[FEC_CF3] +Configuración 3 + +[FEC_CF4] +Configuración 4 + +[FEC_CDP] +Pantalla del mando + +[FEC_ONF] +A pie + +[FEC_INC] +En coche + +[FEC_VIB] +Vibración : + +[FEL_ENG] +Inglés + +[FEL_FRE] +Francés + +[FEL_GER] +Alemán + +[FEL_ITA] +Italiano + +[FEL_SPA] +Español + +[FED_DBG] +Menú de soluciones técnicas + +[FED_RID] +Recargar IDE + +[FED_RIP] +Recargar IPL + +[FED_PAH] +Parse Heap + +[FED_DFL] +CLos guiones::DbgBandera + +[FED_DLS] +Gran luz blanca de solución técnica encendida + +[FED_SPR] +Mostrar grupos de aceras + +[FED_SCR] +Mostrar grupos de carreteras + +[FED_SCZ] +Mostrar zonas de desechos + +[FED_DSR] +Solicitud de solución técnica del streaming + +[FED_SCP] +gbMostrarcolisiónPolys + +[PL_STAT] +Estadísticas del jugador + +[PE_WAST] +Gente que te has cargado + +[PE_WSOT] +Gente eliminada por otros + +[TM_BUST] +Veces detenido + +[GNG_WST] +Miembros de la banda liquidados + +[DED_CRI] +Criminales liquidados + +[PER_COM] +Porcentaje completado + +[KGS_EXP] +Kilogramos de explosivos empleados + +[ACCURA] +Precisión + +[ST_WEAP] +Presupuesto armamentístico + +[ST_PROP] +Presupuesto de propiedades + +[ST_AUTO] +Presupuesto para reparación de coches y pintura + +[ST_PHOT] +Fotografías tomadas + +[ST_LOAN] +Visitas de usureros prestamistas + +[ST_STOR] +Almacenes desvalijados + +[ST_MOVI] +Escenas de especialista + +[ST_PIZZ] +Pizzas entregadas + +[ST_GARB] +Recogidas de basura efectuadas + +[ST_ICEC] +''Helado'' vendido + +[TOP_SHO] +Puntuación máxima en el campo de tiro + +[SHO_RAN] +Clasificación del campo de tiro + +[SEAGULL] +Gaviotas disparadas + +[PROPOWN] +Propiedad en posesión + +[ST_TIME] +Tiempo de juego + +[ST_FTIM] +Horas de vuelo + +[ST_PRAN] +Clasificación de los pilotos + +[ST_RAN0] +Aprendiz + +[ST_RAN1] +Navegante + +[ST_RAN2] +Copiloto + +[ST_RAN3] +Junior + +[ST_RAN4] +Competente + +[ST_RAN5] +Senior + +[ST_RAN6] +As + +[ST_RAN7] +Barón rojo + +[ST_DRWN] +Peces alimentados + +[ST_FASH] +Presupuesto para moda + +[ST_DAMA] +Coste de propiedades destruidas + +[TM_DED] +Visitas al hospital + +[DAYSPS] +Días transcurridos en el juego + +[NUMSHV] +Visitas a pisos francos + +[MXCARD] +Max. Distancia de salto LOCO (pies) + +[MXCARJ] +Max. Altura de salto LOCO (pies) + +[MXCARDM] +Máxima distancia de salto LOCO (m) + +[MXCARJM] +Máxima altura de salto LOCO (m) + +[MXFLIP] +Máximas vueltas de salto LOCO + +[MXJUMP] +Máxima rotación de salto LOCO + +[BUL_FIR] +Balas disparadas + +[BUL_HIT] +Aciertos + +[SPRAYIN] +Pintura + +[BSTSTU] +Mejor maniobra LOCA hasta ahora + +[INSTUN] +Maniobra loca + +[PRINST] +Maniobra loca perfecta + +[DBINST] +Maniobra loca doble + +[DBPINS] +Maniobra loca doble perfecta + +[TRINST] +Maniobra loca triple + +[PRTRST] +Maniobra loca triple perfecta + +[QUINST] +Maniobra loca cuádruple + +[PQUINS] +Maniobra loca cuádruple perfecta + +[NOSTUC] +No se ha completado ninguna + +[NOUNIF] +Saltos únicos completados + +[NMISON] +Intentos de misión + +[PASDRO] +Pasajeros en destino + +[MONTAX] +Dinero conseguido con el taxi + +[DAYPLC] +Gastos diarios provocados a la policía + +[CRIMRA] +Tasa criminal: + +[STPR_1] +El Malibú + +[STPR_2] +Imprenta + +[STPR_3] +Estudio de cine + +[STPR_4] +Fábrica de helados + +[STPR_5] +Salón de coches + +[STPR_6] +Compañía de taxis + +[STPR_7] +Astillero + +[SET1EN] +Configuración 1. Activada + +[GMSAVE] +Guardar partida + +[FEDS_TB] +Volver + +[FEST_OO] +de + +[FEC_TUC] +Control de la torreta + +[FEC_RS3] +Cambiar emisora de radio (Botón L3) + +[FEC_HO3] +Bocina (Botón L3) + +[C_FAIL] +¡Misión de justiciero terminada! + +[C_ESCP] +~r~¡El sospechoso ha escapado! + +[C_VIGIL] +¡BONIFICACIÓN DE JUSTICIERO! + +[HEAL_A] +Tu ~h~salud~w~ aparece en naranja en la parte superior derecha de la pantalla. + +[WRONGCD] +Disco incorrecto. Introduce el disco correcto. + +[NOCD] +La bandeja del disco está vacía. Por favor, inserta el disco. + +[OPENCD] +La bandeja del disco está abierta. Por favor, cierra la bandeja de disco. + +[CDERROR] +Error al leer el DVD de Grand Theft Auto: Vice City + +[RESTART] +Iniciando nueva partida + +[GA_3] +No hay más regalitos. ¡100 $ para volver a pintar! + +[GA_1] +¡Hala! ¡Demasiado peligroso para mi gusto! + +[GA_1A] +Vuelve cuando no estés tan ocupado... + +[HELP9_C] +Pulsa ~h~~k~~k~~PED_FIREWEAPON~~w~para ~h~disparar~w~ el fusil de francotirador. + +[TAXI2] +~r~¡Te has quedado sin tiempo! + +[PAGEB13] +Salud entregada en el escondite + +[PAGEB14] +Adrenalina entregada en el escondite + +[FESZ_CA] +Cancelar + +[FES_NGA] +Nueva partida + +[FES_CAN] +Cancelar + +[FESZ_QL] +Todo el progreso no guardado de tu partida actual se perderá. ¿Continuar cargando? + +[FESZ_QD] +¿Proceder a borrar esta partida guardada? + +[FESZ_QO] +¿Proceder para sobrescribir esta partida guardada? + +[FESZ_QR] +¿Seguro que quieres empezar una nueva partida? Todo el progreso desde la última partida guardada se perderá. ¿Continuar? + +[T4X4_1] +Prueba de PCJ + +[BMX_1] +Trial de tierra + +[BMX_2] +Pista de pruebas + +[BMXFAIL] +~r~¡No has conseguido un nuevo récord! + +[BMX_REC] +~g~¡Nuevo récord establecido: ~1~! + +[T4X4_3] +¡AGARRADO! + +[MM_1] +CONOCIRCUITO + +[T4X4_F] +~r~¡Te rajaste! ¿Demasiado duro para ti? [LANDSTK] Landstalker @@ -740,7 +1916,7 @@ Idaho Stinger [LINERUN] -Camión articulado +Linerunner [PEREN] Perennial @@ -748,26 +1924,29 @@ Perennial [SENTINL] Sentinel +[RIO] +Río + [PATRIOT] Patriot [FIRETRK] -Coche de bomberos +Camión de bomberos [TRASHM] -Camión de la basura +Trashmaster [STRETCH] -Stretch +Limusina [MANANA] -Manana +Mañana [INFERNS] Infernus -[BLISTA] -Blista +[VOODOO] +Voodoo [PONY] Pony @@ -782,7 +1961,7 @@ Cheetah Ambulancia [FBICAR] -Coche del FBI +FBI Washington [MOONBM] Moonbeam @@ -793,23 +1972,26 @@ Esperanto [TAXI] Taxi -[KURUMA] -Kuruma +[WASHING] +Washington [BOBCAT] Bobcat [WHOOPEE] -Mr. Whoopee +Mr Whoopee [BFINJC] -BF Inyección +BF Injection + +[HUNTER] +Hunter [POLICAR] Policía [ENFORCR] -Furgón policial +Enforcer [SECURI] Securicar @@ -829,11 +2011,8 @@ Rhino [BARRCKS] Barracks OL -[BARRACK] -Barracks OL - -[TRAIN] -Tren +[CUBAN] +Cuban Hermes [HELI] Helicóptero @@ -845,7 +2024,7 @@ Dodo Autocar [CABBIE] -'Cabbie' +Taxi clásico [STALION] Stallion @@ -856,101 +2035,59 @@ Rumpo [RCBANDT] Bandit RC -[BELLYUP] -Furgón de pescado de la Tríada +[ROMERO] +Romero's Hearse -[MRWONGS] -Mr. Wongs +[PACKER] +Packer -[MAFIACR] -Sentinel de Leone +[ADMIRAL] +Admiral -[YARDICR] -Lobo de los Yardies +[SQUALO] +Squalo -[YAKUZCR] -Stinger de la Yakuza +[SEASPAR] +Sea Sparrow -[DIABLCR] -Stallion de los Diablos +[PIZZABO] +Pizza Boy -[COLOMCR] -Cruiser del Cártel +[GANGBUR] +Gang Burrito -[HOODSCR] -Rumpo XL de los Hoods - -[AEROPL] -Avión +[TROPIC] +Tropic [SPEEDER] -Planeadora +Speeder [REEFER] Reefer -[PANLANT] -Panlantic - [FLATBED] -Camión remolcador +Flatbed [YANKEE] Yankee -[BORGNIN] -Bickle'76 +[CADDY] +Caddy -[TOYZ] -TOYZ +[ZEBRA] +Taxi cebra -[MCLARN] -Lancer MF1 +[TOPFUN] +Top Fun -[SHELBY] -Hellenbach GT +[SKIMMER] +Skimmer -[SUBARU] -Impreza WRX +[PCJ600] +PCJ 600 -[SUPRA] -Supra - -[SKYLINE] -Skoiloine - -[CYCLONE] -Cyclone GT - -[ESPRIT] -V8 Ghost - -[MINI] -Tommy - -[HOTROD] -Thunder-Rodd - -[CAMPVAN] -Rumpo de la campaña - -[BALLOT] -Camioneta electoral - -[GHOST] -Ghost - -[ANGEL] -Angel - -[ANGEL2] -Avenger - -[PIZZABO] -Repartidor de pizzas - -[NOODLBO] -Repartidor del chino +[PHOENIX] +Phoenix [FAGGIO] Faggio @@ -958,1763 +2095,92 @@ Faggio [FREEWAY] Freeway +[RCBARON] +Barón RC + +[RCRAIDE] +Raider RC + +[GLENDAL] +Glendale + +[OCEANIC] +Oceanic + [SANCHEZ] -Sánchez +Sanchez -[SANCH2] -Mánchez +[SPARROW] +Sparrow -[F_PASS1] -~w~¡Fuego apagado! Recompensa: ~1~ $ +[LOVEFIS] +Love Fist -[F_RANGE] -~r~La radio del coche de bomberos no recibe nada, ¡acércate a un parque de bomberos! +[COASTG] +Guardacostas -[C0TGSUB] -botón R3 +[DINGHY] +Dinghy -[C0VESTR] -joystick analógico izquierdo, o botones de dirección izquierdo y derecho +[HERMES] +Hermes -[C1VESTR] -joystick analógico izquierdo +[SABRE] +Sabre -[C2VESTR] -joystick analógico izquierdo, o botones de dirección izquierdo y derecho +[SABRETU] +Sabre Turbo -[C3VESTR] -joystick analógico izquierdo +[WALTON] +Walton -[C2VEHB] -~T~ +[REGINA] +Regina -[C3VEHB] -botón L1 +[COMET] +Comet -[C0VEHN] -botón L3 +[DELUXO] +Deluxo -[C0VELL] -botón L2 +[BURRITO] +Burrito -[C1VELL] -botón L2 +[SPAND] +Spand Express -[C2VELL] -botón L2 +[MARQUIS] +Marquis -[C3VELL] -botón L2 +[BAGGAGE] +Mozo de equipaje -[C0VELR] -botón R2 +[KAUFMAN] +Taxi Kaufman -[C1VELR] -botón R2 +[COASTMA] +Guardacostas Maverick -[C2VELR] -botón R2 +[MAVERIC] +Maverick -[C3VELR] -botón R2 +[RANCHER] +Rancher -[C0VELB] -botón L2 y botón R2 +[FBIRANC] +FBI Rancher -[C1VELB] -botón L2 y botón R2 +[VIRGO] +Virgo -[C2VELB] -botón L2 y botón R2 +[GREENWO] +Greenwood -[C3VELB] -botón L2 y botón R2 +[HOTRING] +Hotring Racer -[C0VECRS] -botón L1 - -[C1VECRS] -botón SELECT - -[C0VEWEI] -joystick analógico izquierdo hacia arriba y abajo, o pulsa botones de dirección arriba y abajo - -[C1VEWEI] -joystick analógico izquierdo hacia arriba y abajo - -[C2VEWEI] -joystick analógico izquierdo hacia arriba y abajo, o pulsa botones de dirección arriba y abajo - -[C3VEWEI] -joystick analógico izquierdo hacia arriba y abajo - -[C0PDCWE] -botón L2 y botón R2 - -[C1PDCWE] -botón L2 y botón R2 - -[C0PUCF] -botón L1 - -[C1PUCF] -botón L1 - -[C2PUCF] -~T~ - -[C3PUCF] -~O~ - -[C0PDLT] -botón R1 - -[C1PDLT] -botón R1 - -[C2PDLT] -botón R1 - -[C3PDLT] -botón L1 - -[C0PDCTL] -botón L2 y botón R2 - -[C1PDCTL] -botón L2 y botón R2 - -[C2PDCTL] -botón L2 y botón R2 - -[C3PDCTL] -botón L2 y botón R2 - -[C0CVEIW] -botón SELECT - -[C1CVEIW] -botones de dirección arriba y abajo - -[C2CVEIW] -botón SELECT - -[C3CVEIW] -botón SELECT - -[C0PDBAK] -botón R3 - -[C1PDBAK] -botón R3 - -[C2PDBAK] -botón R3 - -[C3PDBAK] -botón R3 - -[C0PDLO1] -botón L - -[C1PDLO1] -botón L - -[C2PDLO1] -botón L - -[C3PDLO1] -botón L - -[C0PDLO2] -pad analógico - -[C2PDLO2] -pad analógico - -[C0ANS] -botón L1 - -[C1ANS] -botón L1 - -[C2ANS] -botón L1 - -[C3ANS] -botón L1 - -[WEATHER] -FORCE WEATHER - -[WEATHE2] -CLIMA NORMAL - -[GA_4] -~w~Las bombas de coche cuestan 500 $ c/u. - -[GA_5] -~w~Tu vehículo ya va equipado con una bomba. - -[GA_6] -Aparca, activa la bomba pulsando~h~ ~k~ ~PED_FIREWEAPON~ ~w~¡y A CORRER! - -[GA_7] -~w~Activa la bomba con ~h~ ~k~ ~PED_FIREWEAPON~ ~w~. Estallará cuando el motor arranque. - -[GA_8] -~w~Usa el detonador para activar la bomba. - -[GA_9] -Has reunido ~1~ de 10 coches especiales. - -[GA_10] -Muy bien. Aquí tienes tus ~1~ $. - -[GA_11] -Ya tenemos ese vehículo. ¡Éste no nos sirve de nada! - -[GA_12] -Bomba activada - -[GA_13] -Eres todo un profesional. Completa la lista y tendrás una bonificación. - -[GA_14] -Todos los coches. ¡BIEN! Toma una pequeña recompensa. - -[GA_15] -~w~Espero que te guste el nuevo color. - -[GA_17] -~w~¡Nuevo motor y capa de pintura! - -[GA_19] -No nos interesa ese modelo. - -[GA_20] -Tenemos más de ésos de los que queremos. Tío, no hay trato. - -[GA_22] -~w~No puedes poner una bomba en una moto. - -[GA_23] -~w~Bomba colocada. Piezas y mano de obra: 500 $ - -[GA_24] -~w~Bomba colocada. ¡Ésta corre a cuenta de la casa! - -[CR_1] -~w~La grúa no puede levantar este vehículo. - -[PU_MONY] -~w~No tienes suficiente dinero. - -[PAUSED] -PARTIDA EN PAUSA - -[FEB_STA] -Estad. - -[FEB_MAP] -Mapa - -[FEB_BRI] -Instrucc. - -[FEB_CON] -Controles - -[FEB_DIS] -Pantalla - -[FEB_LAN] -Idioma - -[FEP_STA] -ESTADÍSTICAS - -[FEP_MAP] -MAPA - -[FEP_BRI] -INSTRUCCIONES - -[FEP_CON] -CONTROLES - -[FEP_DIS] -PANTALLA - -[FEP_LAN] -IDIOMA: - -[FEF_ST1] -¿Quién es el malo? - -[FEF_ST2] -Cuánta destrucción has causado. - -[FEF_BR1] -¿Has perdido el hilo? - -[FEF_CO1] -¿Necesitas más control, pringao? - -[FEF_SA1] -Keep your place in the pile! - -[FEF_SA2] -Guarda y carga las partidas. - -[FEF_AU1] -¡Dale caña! - -[FEF_AU2] -Elige una emisora y un efecto de sonido. - -[FEF_DI1] -¡Cambia el juego! - -[FEF_DI2] -Ajusta el juego a tu tele. - -[FEF_LA1] -¿Me estás hablando en chino? - -[FEF_LA2] -Elige el idioma que prefieras. - -[FEM_ON] -SÍ - -[FEM_OFF] -NO - -[FEM_YES] -Sí - -[FEM_NO] -No - -[FEM_NON] -Nada - -[FEI_SEL] -Seleccionar - -[FEI_TAR] -Objetivo Sí/No - -[FEI_BAC] -Atrás - -[FEI_RES] -Reanudar - -[FEI_NAV] -Mover - -[FEI_BTX] -/ - -[FEI_BTT] -" - -[FEI_STA] -START (inicio) - -[FEI_BTD] -pad analógico - -[FEI_BTU] -;= - -[FEI_R1B] -L \ R - -[FEI_SCR] -Desplazar - -[FEI_ZOO] -Zoom - -[FEH_STA] -ESTADÍSTICAS - -[FEH_CON] -CONTROLES - -[FEH_LAN] -IDIOMA - -[FET_SG] -GUARDAR PARTIDA - -[FEH_BRI] -INSTRUCCIONES - -[FEH_DIS] -PANTALLA - -[FEH_MAP] -MAPA - -[FEM_OK] -ACEPTAR - -[FEC_CRO] -Agacharse - -[FE_MLG] -LEYENDA DEL MAPA - -[MAP_LEG] -LEYENDA: - -[LG_01] -Posición del jugador - -[LG_13] -Ammu-Nation - -[LG_16] -Piso franco - -[LG_22] -Pay 'n' Spray - -[LG_23] -Mr. Benz - -[LG_25] -Teléfono - -[LG_26] -Emisora Wildstyle - -[LG_27] -Emisora Flash FM - -[LG_28] -Emisora KChat - -[LG_29] -Emisora Fever 105 - -[LG_30] -Emisora VROck - -[LG_31] -Emisora VCPR - -[LG_32] -Emisora Espantoso - -[LG_33] -Emisora Emotion 98.3 - -[LG_34] -Emisora Wave 103 - -[LG_35] -Destino - -[LG_36] -Sun Yard - -[LG_37] -Club de striptease - -[LG_38] -8-Ball - -[LG_39] -Confesionario - -[LG_40] -Mamá Cipriani - -[LG_41] -Donald Love - -[LG_42] -J.D. O'Toole - -[LG_43] -Salvatore Leone - -[LG_44] -María - -[LG_45] -McAffrey - -[LG_46] -Toshiko Kasen - -[LG_47] -Vincenzo Cilli - -[LG_48] -Taller de bombas - -[LG_49] -Tienda de ropa - -[LG_50] -Phil Cassidy's - -[LG_51] -Amenaza - -[LG_52] -Amigo - -[LG_53] -Objeto - -[LG_54] -Objetivo del jugador - -[FEB_PMB] -Instrucciones de misiones previas: - -[FEC_NA] -N/D - -[FEC_CWL] -Cambiar de arma (izq.) - -[FEC_CWR] -Cambiar de arma (der.) - -[FEC_CW] -Cambiar de arma - -[FEC_CT] -Cambiar de objetivo - -[FEC_TAR] -Apuntar - -[FEC_MOV] -Movimiento - -[FEC_CAM] -Modos de cámara - -[FEC_PAU] -Pausa - -[FEC_ENV] -Entrar en vehículo - -[FEC_JUM] -Saltar - -[FEC_ATT] -Atacar/disparar - -[FEC_RUN] -Correr - -[FEC_FPC] -Mirar - -[FEC_LL] -Mirar a la izquierda - -[FEC_LB1] -Mirar - -[FEC_LB2] -atrás - -[FEC_LB] -Mirar atrás - -[FEC_LR] -Mirar a la derecha - -[FEC_HOR] -Claxon - -[FEC_VES] -Control del vehículo - -[FEC_RSC] -Cambiar de emisora - -[FEC_BRA] -Freno o marcha atrás - -[FEC_HAB] -Freno de mano - -[FEC_CAW] -Arma del vehículo - -[FEC_ACC] -Acelerar - -[FEC_SMT] -Misión especial - -[FEC_CCF] -CONFIGURACIÓN: - -[FEC_CF1] -CONFIG. 1 - -[FEC_CF2] -CONFIG. 2 - -[FEC_CF3] -CONFIG. 3 - -[FEC_CF4] -CONFIG. 4 - -[FEC_CDP] -TIPO: - -[FEC_ONF] -A PIE - -[FEC_INC] -EN VEHÍCULO - -[FEC_VIB] -VIBRACIÓN: - -[FEC_ILU] -INVERTIR VISTA: - -[FEC_SWP] -MOVIM. DEL JUGADOR: - -[FEC_AS] -pad analógico - -[FEC_DP] -botones de dirección - -[FEA_OUT] -Salida: - -[FEA_ST] -Estéreo - -[FEA_MNO] -Mono - -[FEA_CTD] -¡Atención! Esta prestación necesita que se conecte hardware compatible con DTS. ¿Seguir? - -[FEA_DTS] -DTS - -[FEA_RSS] -EMISORA: - -[FEA_NON] -Radio apagada - -[FED_BRI] -BRILLO: - -[FED_TRA] -RASTROS: - -[FED_RDR] -MODO RADAR: - -[FEL_ENG] -INGLÉS - -[FEL_FRE] -FRANCÉS - -[FEL_GER] -ALEMÁN - -[FEL_ITA] -ITALIANO - -[FEL_SPA] -ESPAÑOL - -[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] -Guardar la partida - -[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] -Ranura0 - -[FES_LOA] -CARGAR PARTIDA - -[ST_TIME] -Tiempo de juego actual - -[ST_OVTI] -Tiempo de juego total - -[NUMSHV] -Número de guardados - -[PL_STAT] -Estadísticas del jugador - -[PE_WAST] -Gente abatida por ti - -[PE_WSOT] -Gente abatida por otros - -[CAR_EXP] -Coches explotados - -[BOA_EXP] -Embarcaciones destruidas - -[TM_BUST] -Veces que te han trincado - -[M_WASTE] -Civiles liquidados (hombres) - -[F_WASTE] -Civiles liquidados (mujeres) - -[PIG_WST] -Polis liquidados - -[GNG_WST] -Miembros de bandas liquidados - -[MED_WST] -Médicos liquidados - -[FIRE_WS] -Bomberos liquidados - -[DED_CRI] -Criminales liquidados - -[DED_DED] -Vagabundos liquidados - -[DED_HOK] -Prostitutas liquidadas - -[HEL_DST] -Helicópteros destruidos - -[PER_COM] -Porcentaje completado - -[KGS_EXP] -Kg de explosivos empleados - -[ACCURA] -Precisión - -[ELBURRO] -Best Turismo time in secs - -[CAR_CRU] -Coches triturados - -[HED_EX] -Cabezas reventadas - -[ST_HEAD] -Disparos en la cabeza - -[BUL_FIR] -Balas disparadas - -[BUL_HIT] -Balas en el blanco - -[SPRAYIN] -Manos de pintura - -[TM_DED] -Visitas al hospital - -[ST_GANG] -Banda más odiada - -[ST_GNG1] -Leone - -[ST_GNG2] -Tríadas - -[ST_GNG3] -Diablos - -[ST_GNG4] -Yakuza - -[ST_GNG5] -Yardies - -[ST_GNG6] -Colombianos - -[ST_GNG7] -Hoods - -[ST_GNG8] -Sindacco - -[ST_GNG9] -Forelli - -[DAYSPS] -Días transcurridos en el juego - -[MMRAIN] -Lluvia caída - -[ST_STAR] -Estrellas de búsqueda obtenidas - -[ST_STGN] -Estrellas de búsqueda eludidas - -[TOT_DIS] -Distancia total recorrida (millas) - -[TOTDISM] -Distancia total recorrida (m) - -[DISTBIK] -Dist. recorrida en moto (millas) - -[DISTBIM] -Distancia recorrida en moto (m) - -[DISTHEL] -Dist. recorrida en helicóptero (millas) - -[DISTHEM] -Distancia recorrida en helicóptero (m) - -[DISTBOA] -Dist. recorrida en embarcación (millas) - -[DISTBOM] -Distancia recorrida en embarcación (m) - -[ST_WHEE] -Mayor tiempo a caballito (s) - -[ST_STOP] -Mayor tiempo sobre rueda delantera (s) - -[ST_2WHE] -Mayor tiempo sobre 2 ruedas (s) - -[ST_WHED] -Mayor distancia a caballito (m) - -[ST_STOD] -Mayor distancia rueda delantera (m) - -[ST_2WHD] -Mayor distancia sobre 2 ruedas (m) - -[ST_FAPD] -Caída de morros más larga (m) - -[FEST_HV] -Mayor nivel de vigilante - -[FIRELVL] -Mayor nivel de bombero - -[ST_STOR] -Stores Knocked Off - -[ST_ASSI] -Trabajos de asesinato completados - -[ST_FTIM] -Horas de vuelo - -[ST_FASH] -Fashion Budget - -[ST_WEAP] -Gasto en armas - -[ST_PROP] -Gasto en propiedades - -[ST_DAMA] -Bienes destruidos - -[ST_AUTO] -Gasto en reparación de coches y pintura - -[MXCARD] -Dist. máx. en salto demencial (pies) - -[MXCARJ] -Altura máx. en salto demencial (pies) - -[MXCARDM] -Dist. máx. en salto demencial (m) - -[MXCARJM] -Altura máx. en salto demencial (m) - -[MXFLIP] -Vueltas máx. en salto demencial - -[MXJUMP] -Rotación máx. en salto demencial - -[FST_MFR] -Emisora favorita - -[FST_LFR] -Emisora menos usada - -[BSTSTU] -La mejor acrobacia demencial: - -[INSTUN] -Acrobacia demencial - -[PRINST] -Acrobacia demencial perfecta - -[DBINST] -Acrobacia demencial doble - -[DBPINS] -Acrobacia demencial doble perfecta - -[TRINST] -Acrobacia demencial triple - -[PRTRST] -Acrobacia demencial triple perfecta - -[QUINST] -Acrobacia demencial cuádruple - -[PQUINS] -Acrobacia demencial cuádruple perfecta - -[NOSTUC] -No hay acrobacias demenciales completadas - -[NOUNIF] -Saltos únicos completados - -[NOUNGM] -Total de saltos únicos - -[NMISON] -Intentos de misión - -[NMMISP] -Misiones superadas - -[PASDRO] -Pasajeros llevados a su destino - -[MONTAX] -Dinero ganado en taxi - -[CARSLD] -Coches vendidos - -[MONCAR] -Dinero ganado vendiendo coches - -[BIKESLD] -Motos vendidas - -[MONBIKE] -Dinero ganado vendiendo motos - -[CARSEXP] -Coches encontrados para Love Media - -[SLTVLVL] -Mayor nivel en Slash TV - -[SLTVKIL] -Oponentes muertos en Slash TV - -[MONTRS] -Dinero ganado recogiendo basura - -[HTMKLD] -Sicarios liquidados - -[GDAMSP] -Misiones de Ángel Vengador superadas - -[HGAJD] -Justicia total de Ángel Vengador impartida - -[BNDRACE] -Carreras de RC - -[FSTTRT] -Mayor tiempo pasado en Wong Side of the Track - -[HGHTRC] -Mayor suma ganada en Wong Side of the Track - -[FSTHRT] -Carrera más rápida en helicóptero - -[BHLPOS] -Mejor posición en carrera de helicópteros - -[TMSOUT] -Cambios de ropa - -[BSRPS0] -Low-rider Rumble - -[BSRPS1] -Deimos Dash - -[BSRPS2] -Wi-Cheetah Run - -[BSRPS3] -Red Light Racing - -[BSRPS4] -Torrington TT - -[BSRPS5] -Gangsta GP - -[DBIKE0] -Trazado 1 - -[DBIKE1] -Trazado 2 - -[DBIKE2] -Trazado 3 - -[DBIKE3] -Trazado 4 - -[DBIKE4] -Trazado 5 - -[DBIKE5] -Trazado 6 - -[DBIKE6] -Trazado 7 - -[DBIKE7] -Trazado 8 - -[DBIKE8] -Trazado 9 - -[DBIKE9] -Trazado 10 - -[DBIKEHE] -Bump & Grinds - -[DBIKEBP] -Mejor posición - -[DBIKEFL] -Vuelta más rápida - -[DBIKEFT] -Mejor tiempo - -[ST_PHOT] -Fotos tomadas - -[ST_PIZZ] -Pizzas entregadas - -[ST_NOOD] -Fideos entregados - -[MO_TOUR] -Dinero ganado con turistas - -[TA_TOUR] -Turistas llevados a lugares turísticos - -[SC_SCRA] -Récord en Scrapyard Challenge - -[SC_9MM] -Récord en 9mm Mayhem - -[SC_SCOO] -Récord en Scooter Shooter - -[DAYPLC] -Gasto diario de la policía - -[SEAGULL] -Gaviotas abatidas - -[CRIMRA] -ÍNDICE DELICTIVO - -[CHASE] -Atención mediática - -[CHASE1] -"¿Quién es ése?" - -[CHASE2] -"¡Qué aburrimiento!" - -[CHASE3] -Vagamente interesados - -[CHASE4] -Periódico local, página 7 - -[CHASE5] -Primera plana del periódico local - -[CHASE8] -TV local, 3:00 - -[CHASE9] -Noticias TV local - -[CHASE10] -En directo TV local - -[CHASE11] -El UFA Today, página 12 - -[CHASE12] -El UFA Today, página 4 - -[CHASE13] -Foto en el UFA Today - -[CHASE14] -Tele nacional, 4:00 - -[CHASE15] -Noticias TV nacional - -[CHASE16] -En directo TV nacional - -[CHASE17] -Noticias internacionales - -[CHASE18] -Crisis nacional - -[CHASE19] -Crisis internacional - -[CHASE20] -Suceso mundial - -[CHASE21] -Leyenda viva - -[WHEEL01] -~w~BONIF. POR IR A DOS RUEDAS: ~1~ $ Distancia: ~1~,~1~ m. Tiempo: ~1~ s. - -[WHEEL02] -~w~BONIF. POR IR A DOS RUEDAS: ~1~ $ Distancia: ~1~ pies Tiempo: ~1~ s. - -[WHEEL06] -~w~BONIF. POR CABALLITO: ~1~ $ Distancia: ~1~,~1~ m. Tiempo: ~1~ s. - -[WHEEL07] -~w~BONIF. POR CABALLITO: ~1~ $ Distancia: ~1~ pies Tiempo: ~1~ s. - -[WHEEL11] -~w~BONIF. RUEDA DELANTERA: ~1~ $ Distancia: ~1~,~1~ m. Tiempo: ~1~ s. - -[WHEEL12] -~w~BONIF. RUEDA DELANTERA: ~1~ $ Distancia: ~1~ pies Tiempo: ~1~ s. - -[GMSTOR] -Game Store - -[PREBRF] -Instrucciones previas - -[CNTLS] -Controles - -[MUSMEN] -Música/efectos - -[GAMSET] -Ajustes del juego - -[LANGUA] -Idioma - -[DSPLAY] -Pantalla - -[DEBUGM] -Debug Menu - -[QUITOP] -Salir de opciones - -[CONTRL] -Config. de controles - -[SET1EN] -Config. 1 activada - -[SET1] -Config. 1 - -[SET2EN] -Config. 2 activada - -[SET2] -Config. 2 - -[SET3EN] -Config. 3 activada - -[SET3] -Config. 3 - -[SET4EN] -Config. 4 activada - -[SET4] -Config. 4 - -[GOBACK] -Volver - -[MUSVOL] -Volumen música - -[SFXVOL] -Volumen efectos - -[SCROPT] -OPCIONES DE PANTALLA - -[CTRSCR] -Centrar pantalla - -[SCRFOR] -Formato de pantalla - -[GMSVLQ] -PARTIDA: GUARDAR-CARGAR-SALIR - -[GMREST] -Reiniciar partida - -[GMLOAD] -Cargar partida - -[GMSAVE] -Guardar partida - -[NOGMSV] -Solo puedes guardar en tu escondite. - -[DLFILE] -Borrar archivos de Grand Theft Auto - -[CHFILE] -ESCOGER ARCHIVO PARA CARGAR - -[CHFIDL] -ESCOGER ARCHIVO PARA BORRAR - -[SVCONF] -CONFIRMACIÓN DE GUARDADO - -[SVFNAM] -El nombre del archivo guardado es - -[LANGSL] -SELECCIÓN DE IDIOMA - -[ENGLIS] -Inglés - -[GERMAN] -Alemán - -[ITALIA] -Italiano - -[FRENCH] -Francés - -[SPAIN] -Español - -[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] -No se puede guardar. Estás en una misión. - -[CNCSAV] -No se puede guardar. Estás en un vehículo. - -[CRMGSV] -Create copy protected mag directory - -[MGSVCN] -MagazineDirectory Created - -[MGSVNC] -MagazineDirectory Not Created - -[YES] -Sí - -[NO] -No - -[X] -x - -[LAST] -Last message. - -[GS_STYL] -ESTILO: - -[GS_FFAL] -TODOS CONTRA TODOS - -[GS_LOC] -LUGAR: - -[GS_SLMT] -LÍMITE DE PUNTOS: - -[GS_KLMT] -MÁX. ABAT.: - -[GS_TLMT] -LÍMITE DE TIEMPO: - -[GS_ULMT] -SIN LÍMITE - -[GS_PRUP] -MEJORAS: - -[GS_RACE] -CARRERA: - -[GS_LAPS] -VUELTAS: - -[GS_OK] -ACEPTAR - -[FEH_MP] -MULTIJUGADOR - -[FEMP_J] -Unirse - -[FEMP_CS] -PERSONAJE: - -[FEMP_PS] -AJUSTES DEL JUGADOR - -[FEMP_GS] -ELEGIR PARTIDA - -[FEMP_NG] -INICIAR NUEVA PARTIDA - -[SVRLIST] -LISTA DE ANFITRIONES - -[SVRINFO] -DETALLES DEL ANFITRIÓN - -[SVRNAME] -NOMBRE: - -[NO_SVRS] -BUSCANDO ANFITRIONES - -[NO_PLRS] -BUSCANDO JUGADORES - -[NO_NAME] -SIN NOMBRE - -[NO_WIFI] -Para jugar partidas multijugador, debes tener el interruptor WLAN activado. - -[FEMP_SG] -INICIAR PARTIDA - -[FEMP_S] -Inicio - -[FEMP_WS] -Esperando al anfitrión... - -[SVRLOST] -Se ha perdido la comunicación con el anfitrión. - -[NOSVRS] -No se ha podido encontrar al anfitrión. - -[MP_WARN] -Iniciar una partida multijugador hará que pierdas todo el progreso desde la última vez que guardaste. - -[FEDS_XB] -Seleccionar - -[FEDS_TB] -Atrás - -[FEDS_ST] -botón START (inicio): REANUDAR - -[FEST_OO] -de - -[FED_SUB] -SUBTÍTULOS: - -[FEC_TUC] -Control de torreta - -[FEC_SM3] -Activar misión especial (botón R3) - -[FEC_RS3] -Cambiar de emisora (botón L3) - -[FEC_HO3] -Claxon (botón L3) - -[FIRST] -~g~1° - -[SECOND] -~g~2° - -[THIRD] -~g~3° - -[FOURTH] -~g~4° - -[NOCONTE] -Por favor conectar un mando analógico (DUALSHOCK®) o un mando analógico (DUALSHOCK®2) en el puerto de mando 1 para continuar. - -[WRCONT] -El mando conectado al puerto de mando 1 es incompatible. GTA: Liberty City Stories requiere un mando analógico (DUALSHOCK®) o un mando analógico (DUALSHOCK®2). - -[WRCONTE] -El mando conectado al puerto de mando 1 es incompatible. GTA: Liberty City Stories requiere un mando analógico (DUALSHOCK®) or un mando analógico (DUALSHOCK®2). - -[WRONGCD] -Disco incorrecto. Inserta el disco de GTA: Liberty City Stories. - -[NOCD] -La bandeja del disco está vacia. Inserta el disco de GTA: Liberty City Stories. - -[OPENCD] -La bandeja del disco está abierta. Cierra la bandeja del disco. - -[RESTART] -Iniciando nueva partida. - -[GA_3] -~w~¡100 $ por repintar! - -[GA_1A] -~w~Vuelve cuando no estés tan ocupado... - -[AWAY] -~r~¡Se ha largado de aquí! - -[GA_6B] -Aparca, activa la bomba pulsando~h~ ~k~ ~PDFW~ ~w~¡y A CORRER! - -[GA_7B] -~w~Activa la bomba con~h~ ~k~ ~PDFW~ ~w~. Estallará cuando el motor arranque. - -[FESZ_CA] -Cancelar - -[FESZ_QU] -Salir - -[FESZ_L1] -La partida se ha cargado. - -[FESZ_L2] -Nombre del archivo guardado: - -[FESZ_OK] -ACEPTAR - -[FES_LGA] -Cargar partida - -[FES_DGA] -BORRAR DATOS GUARDADOS - -[FES_NGA] -NUEVA PARTIDA - -[FES_CAN] -Cancelar - -[FESZ_QL] -Todo el progreso no guardado de la partida se perderá. ¿Seguro que quieres cargar? - -[FESZ_QD] -¿Seguro que quieres borrar esta partida guardada? - -[FESZ_QO] -¿Seguro que quieres sobrescribir esta partida guardada? - -[FESZ_QR] -¿Quieres empezar una nueva partida? Se perderá todo el progreso desde la última partida guardada. ¿Continuar? - -[FESZ_QS] -¿SEGURO QUE QUIERES GUARDAR? - -[T4X4_2A] -~g~Tienes ~y~2 minutos~g~ para pasar por ~y~12~g~ puntos de control. ~g~Puedes pasar por ellos en ~y~CUALQUIER ORDEN~g~. - -[T4X4_2B] -¡~1~ de 12! - -[T4X4_2C] -~y~PASA POR~g~ el primer punto de control para activar el cronómetro. ~g~Cada punto de control te concederá ~y~10 SEGUNDOS~g~. - -[T4X4_F] -~r~¡Has abandonado! ¿Demasiado duro para ti? - -[UPSIDE] -~r~¡Has volcado! +[BLISTAC] +Blista Compact [FEST_DF] Dist. recorrida a pie (millas) @@ -2728,449 +2194,1622 @@ Distancia recorrida a pie (m) [FESTDCM] Distancia recorrida en coche (m) +[TOT_DIS] +Distancia total recorrida (millas) + +[TOTDISM] +Distancia total recorrida (m) + +[DISTHEL] +Dist. recorrida en helicóptero (millas) + +[DISTHEM] +Distancia recorrida en helicóptero (m) + +[DISTBOA] +Dist. recorrida en barco (millas) + +[DISTBOM] +Distancia recorrida en barco (m) + [FEST_LS] -Gente salvada en ambulancia +Gente salvada en una ambulancia [FEST_CC] -Criminales abatidos misión Vigilante +Criminales asesinados en misión Vigilante [FEST_FE] -Fuegos totales apagados - -[FEST_LF] -Vuelo más largo en Dodo - -[FEST_BD] -Mejor tiempo desactivando una bomba +Total de fuegos extinguidos [FEST_RP] -Destrucciones superadas - -[FEST_CN] -Mayor tiempo en Karmageddon - -[FEST_TR] -Máx. abatidos RC Triad Take-Down +Masacres superadas [FEST_MP] Misiones superadas +[FEST_BB] +Bling-bling Scramble: + [FEST_H0] Mayoría de puntos de control [FEST_GC] Total de coches de bandas: +[FEST_H1] +Destrucción del diablo + +[FEST_H2] +Masacre de la mafia + +[FEST_H3] +Casino Calamity + +[FEST_H4] +Rumpo Wrecker + [USJ] -~w~¡BONIF. ACROBACIA ÚNICA! +¡BONIFICACIÓN POR MANIOBRA ÚNICA! -[USJ_FAL] -~w~¡ACROBACIA ÚNICA FALLADA! - -[HM1_1] -~g~Fríe a 20 Purple Nines en 2 min. y 30 s. - -[KM1_8A] -Pulsa~h~ ~k~ ~PDFW~ ~w~para ~h~activar la bomba~w~ y no olvides apartarte. - -[KM1_8D] -Pulsa~h~ ~k~ ~PDFW~ ~w~para ~h~activar la bomba~w~ y no olvides apartarte. +[USJ_DUN] +MANIOBRA YA COMPLETADA [RATNG1] -CIUDADANO DE A PIE +Ciudadano honrado [RATNG2] -NADIE EN ESPECIAL +Nadie en especial [RATNG3] -PUERCO INCÍVICO +Basurero [RATNG4] -CHORICILLO +Cleptómano [RATNG5] -VÁNDALO +Vándalo [RATNG6] -RECADERO +Chico de los recados [RATNG7] -RATERO +Carterista [RATNG8] -MANGUI +Cleptómano [RATNG9] -LADRÓN +Chivato [RATNG10] -RATA +Rata + +[RATNG11] +Lince [RATNG12] -CHANCHULLERO +Estafador [RATNG13] -TRAMPOSO +Timador [RATNG14] -TIMADOR +Corredor de apuestas [RATNG15] -ESTAFADOR +Buscavidas [RATNG16] -BRAVUCÓN +Matón [RATNG17] -MALEANTE +Chusma [RATNG18] -GRANUJA +Bribón [RATNG19] -RUFIÁN +Rufián [RATNG20] -PROSCRITO +Proscrito [RATNG21] -MATÓN +Malhechor [RATNG22] -SACAMANTECAS +Asesino [RATNG23] -GORILILLA +Super matón [RATNG24] -GORILÓN +Matón [RATNG25] -REINCIDENTE +Presidiario [RATNG26] -EX PRESIDIARIO +Exconvicto [RATNG27] -DELINCUENTE +Criminal [RATNG28] -EXTORSIONADOR +Saqueador [RATNG29] -CEREBRO +Mafioso [RATNG30] -CHÓFER +Conductor [RATNG31] -GUARDAESPALDAS +Gorila [RATNG32] -HOMICIDA +Asesino profesional [RATNG33] -CAZARRECOMPENSAS +Asuntos internos [RATNG34] -AJUSTICIADOR +Agente [RATNG35] -RONIN +Ronin [RATNG36] -AMAÑADOR +Manitas [RATNG37] -SICARIO +Asesino a sueldo [RATNG38] -ASOCIADO +Asociado [RATNG39] -CARNICERO +Carnicero [RATNG40] -LIMPIADOR +Encargado de la limpieza [RATNG41] -ASESINO +Asesino [RATNG42] -CONSIGLIERE +Consigliere [RATNG43] -"BAUTIZADO" +Maleante [RATNG44] -MANO DERECHA +Mano derecha [RATNG45] -VERDUGO +Ejecutor [RATNG46] -LUGARTENIENTE +Teniente [RATNG47] -JEFECILLO +Subjefe [RATNG48] -CAPO +Capo [RATNG49] -BOSS +Jefe [RATNG50] -CEREBRO CRIMINAL +Negado [RATNG51] -DON +Don [RATNG52] -PADRINO - -[TRAIN_1] -Estación de Kurowski - -[TRAIN_2] -Estación de Rothwell - -[TRAIN_3] -Estación de Baillie - -[SUBWAY1] -Estación de Portland - -[SUBWAY2] -Estación de Rockford - -[SUBWAY3] -Estación de Staunton South - -[SUBWAY4] -Terminal de Shoreside - -[DETON] -DETONACIÓN - -[RCBOMB1] -RC Triad Take-Down - -[RECORD] -~w~Nuevo récord: ¡~1~ muertos! - -[NRECORD] -~r~¡No has batido el récord anterior de ~1~ muertos! - -[RCBOMBF] -~r~¡Has salido de la furgoneta! - -[RC_2] -Tienes 2 min. para volar tantos coches de la Mafia como puedas. - -[RC_3] -Tienes 2 min. para volar tantos coches de la Yakuza como puedas. - -[RC_4] -Tienes 2 min. para volar tantos coches de los Yardies como puedas. - -[RC_5] -Tienes 2 min. para volar tantos coches de los Hoods como puedas. - -[RC_6] -Tienes 2 min. para volar tantos coches del Cártel como puedas. - -[RAMPKA] -~w~Necesitas un vehículo para esta destrucción. +Rey de la Jodida Ciudad [PAGE_00] . -[TURTXT] -¡Aniquilación móvil! - -[TURPASS] -~w~¡Aniquilación superada! - -[TUR3D] -~w~Integridad coche - -[FTFRENZ] -Firetruck Frenzy - [WELCOME] BIENVENIDO A [TSCORE] -~w~GANANCIAS TOTALES: ~1~ $ +GANANCIAS: ~1~ $ -[PBOAT_1] -Pulsa~h~ ~k~ ~VEWEP~ ~w~para disparar los cañones de la embarcación. +[PBOAT_2] { reVC update } +Pulsa ~h~~k~~VEHICLE_FIREWEAPON~~w~ para disparar los cañones del barco. -[HM2_1] -Usa los buggies de RC para destruir los coches blindados. Pulsa~h~ ~k~ ~VEWEP~ ~w~para detonar. +[HJSTAT] +Distancia: ~1~.~1~m Altura: ~1~.~1~m Vueltas: ~1~ Rotación: ~1~_ -[HM2_1A] -Usa los buggies de RC para destruir los coches blindados. Pulsa~h~ ~k~ ~VEWEP~ ~w~para detonar. +[HJSTATW] +Distancia: ~1~.~1~m Altura: ~1~.~1~m Vueltas: ~1~ Rotación: ~1~_ ¡qué gran aterrizaje! -[HM2_2] -~r~¡No has destruido todos los coches blindados! - -[HM2_6] -~g~¡Coche blindado destruido! - -[FESZ_UC] -CANCELAR - -[FEDS_SM] -L1, R1: CAMBIAR MENÚ - -[FEDS_AS] -;=: CAMBIAR SELECCIÓN - -[FEDSAS2] -<>: CAMBIAR SELECCIÓN - -[FEDS_SS] -L1,R1: CAMBIAR SELECCIÓN - -[FEDSSC1] -;: DESPLAZAM. MÁS RÁPIDO - -[FEDSSC2] -=: DETENER DESPLAZAM. - -[FES_LOF] -Error al cargar. - -[FES_SLO] -EL ARCHIVO GUARDADO - -[FES_ISC] -ESTÁ DAÑADO - -[FESZ_TI] -GUARDAR Z1 - -[FESZ_SA] -Guardar partida - -[MC_LDFL] -Error al cargar. - -[MC_NWRE] -Se está reiniciando la partida. - -[BIFP_1] -~w~¡Auu! Distancia de la caída de morros: ~1~,~1~ m - -[BIFP_1F] -~w~¡Auu! Distancia de la caída de morros: ~1~ pies - -[DIAB1_5] -TIEMPO DE CARRERA: - -[F_FAIL1] -~r~Misión de bombero terminada. - -[F_CANC] -~r~¡Misión de bombero cancelada! - -[F_FAIL3] -~r~¡Demasiado tarde! - -[F_FAIL4] -~r~¡Ha muerto uno de los pasajeros! - -[F_FAIL5] -~r~¡Uno de los coches ha sido destruido! - -[F_FAIL6] -~r~¡El coche ha sido destruido! - -[F_EXTIN] -Incendios - -[A_CANC] -~r~¡Misión de médico ATS cancelada! - -[ALEVEL] -~w~Nivel de misión de médico ATS ~1~ - -[A_FAIL1] -~r~Misión de médico ATS terminada. +[ATUTOR] +Pulsa ~h~~k~~TOGGLE_SUBMISSIONS~~w~ para activar o desactivar las misiones de ATS. [FEST_HA] -Mayor nivel de médico ATS - -[A_SAVES] -~w~GENTE SALVADA: ~1~ +Nivel más alto de misión de ATS [C_KILLS] -~w~CRIMINALES LIQUIDADOS: ~1~ +CRIMINALES ASESINADOS: ~1~ -[F_START] -Se ha informado de un ~b~vehículo en llamas~w~ en la zona de ~a~. Ve y apaga el incendio. +[HJSTATF] +Distancia: ~1~ pies Altura: ~1~ pies Vueltas: ~1~ Rotación: ~1~_ -[F_STAR1] -Se ha informado de varios ~b~vehículos en llamas~w~ en la zona de ~a~. Ve y apaga los incendios. +[HJSTAWF] +Distancia: ~1~ pies Altura: ~1~ pies Vueltas: ~1~ Rotación: ~1~_, ¡y qué gran aterrizaje! -[F_REWAR] -~w~¡FUEGO APAGADO! ¡Completado el nivel ~1~! Recompensa: ~1~ $ +[CRED001] +ROCKSTAR NORTH + +[CRD001A] +DIRECTOR DEL ESTUDIO + +[CRD001B] +ANDREW SEMPLE + +[CRED002] +PRODUCTOR + +[CRD002A] +DIRECTOR DE DESARROLLO + +[CRED003] +LESLIE BENZIES + +[CRED004] +DIRECTOR DE ARTE + +[CRED005] +AARON GARBUT + +[CRED006] +DIRECTORES TÉCNICOS + +[CRED007] +OBBE VERMEIJ + +[CRED008] +ADAM FOWLER + +[CRED010] +ANDREW DUTHIE + +[CRED011] +CRAIG FILSHIE + +[CRED012] +WILLIAM MILLS + +[CRED013] +CHRIS ROTHWELL + +[CRD013A] +IMRAN SARWAR + +[CRD013B] +JAMES WORRALL + +[CRD013C] +JOHN HAIME + +[CRED014] +ESCRITO POR + +[CRED015] +JAMES WORRALL + +[CRED016] +PAUL KUROWSKI + +[CRED017] +DAN HOUSER + +[CRED018] +DISEÑO DEL PERSONAJE PRINCIPAL + +[CRD018A] +DISEÑO DE PERSONAJES + +[CRED019] +IAN MCQUE + +[CRD019A] +TOKS SOLARIN + +[CRD019B] +ALAN DAVIDSON + +[CRED020] +ANIMACIÓN PRINCIPAL + +[CRED021] +ALEX HORTON + +[CRD022A] +ANIMACIÓN + +[CRED022] +LEE MONTGOMERY + +[CRD022B] +DUNCAN SHIELDS + +[CRD022C] +GUS BRAID + +[CRED023] +DISEÑO DE VEHÍCULOS + +[CRD023A] +JOLYON ORME + +[CRD023B] +ALAN DUNCAN + +[CRD024A] +DISEÑO DEL VEHÍCULO PRINCIPAL + +[CRED024] +PAUL KUROWSKI + +[CRED025] +DISEÑO DE MAPAS + +[CRED026] +ADAM COCHRANE + +[CRED027] +NIK TAYLOR + +[CRED028] +GARY MCADAM + +[CRED029] +KEIRAN BAILLIE + +[CRED030] +ALISDAIR WOOD + +[CRED031] +ANDREW SOOSAY + +[CRD031A] +STEVEN MULHOLLAND + +[CRD031B] +WAYLAND STANDING + +[CRD031C] +CAMPBELL J. DICK + +[CRD031D] +DISEÑO GRÁFICO + +[CRD031E] +STUART PETRI + +[CRED032] +PROGRAMADOR JEFE + +[CRD032A] +PROGRAMADORES + +[CRED033] +ALEXANDER ROGER + +[CRED034] +GRAEME WILLIAMSON + +[CRED035] +BARANE CHAN + +[CRED036] +DEREK PAYNE + +[CRED037] +GORDON YEOMAN + +[CRD037A] +ALAN CAMPBELL + +[CRD037B] +MARK HANLON + +[CRD037C] +ANDRZEJ MADAJCZYK + +[CRED038] +PRODUCTOR JEFE MUSICAL + +[CRED039] +CRAIG CONNER + +[CRED040] +STUART ROSS + +[CRED041] +INGENIERO JEFE DE AUDIO + +[CRED042] +ALLAN WALKER + +[CRD041A] +INGENIERO DE AUDIO + +[CRD041B] +AUDIO + +[CRD042A] +WILL MORTON + +[CRED043] +PROGRAMADOR DE AUDIO + +[CRED044] +RAYMOND USHER + +[CRED045] +JEFE DE PRUEBAS + +[CRED046] +CRAIG ARBUTHNOTT + +[CRED047] +CONTROL DE CALIDAD PRINCIPAL + +[CRED048] +NEIL CORBETT + +[CRED049] +KEVIN WONG + +[CRED050] +CONTROL DE CALIDAD + +[CRED051] +DAVID BEDDOES + +[CRED052] +DAVID WATSON + +[CRED053] +BARRY CLARK + +[CRED054] +ROSS SPARROW + +[CRED055] +JAMES ALLAN + +[CRED056] +NEIL MEIKLE + +[CRD056A] +GEORGE WILLIAMSON + +[CRD056B] +MATT JONES + +[CRD056C] +ROB HARBOUR + +[CRD056D] +TOM WHITTAKER + +[CRED057] +SOPORTE TÉCNICO PRINCIPAL + +[CRED058] +LORRAINE ROY + +[CRD057A] +SOPORTE TÉCNICO + +[CRED059] +CHRISTINE CHALMERS + +[CRD060A] +SOPORTE DE OFICINA + +[CRD060B] +KIM GURNEY + +[CRD060C] +CASSIE OLIVER + +[CRED060] +ROCKSTAR NUEVA YORK + +[CRED061] +GABINETE DE APOYO + +[CRED062] +SAM HOUSER + +[CRED063] +PRODUCTOR + +[CRED064] +DAN HOUSER + +[CRED065] +VICEPRESIDENTE DE DESARROLLO + +[CRED066] +JAMIE KING + +[CRED067] +OFICIAL JEFE DE TECNOLOGÍA + +[CRED068] +GARY J. FOREMAN + +[CRED069] +PRODUCTOR ASOCIADO + +[CRED070] +JEREMY POPE + +[CRD071A] +DIRECTOR DE CONTROL DE CALIDAD + +[CRD072A] +JEFF ROSA + +[CRED071] +SUPERVISOR MUSICAL + +[CRED072] +TERRY DONOVAN + +[CRED073] +EQUIPO DE PRODUCCIÓN + +[CRED074] +TERRY DONOVAN + +[CRED075] +JENNIFER KOLBE + +[CRED076] +JENEFER GROSS + +[CRED077] +LAURA PATERSON + +[CRED078] +JEFF CASTANEDA + +[CRED079] +JERONIMO BARRERA + +[CRED080] +CARLY SLATER + +[CRED081] +JUNG KWAK + +[CRED082] +BRIAN WOOD + +[CRED083] +RENAUD SEBANNE + +[CRED084] +RICHARD KRUGER + +[CRD084A] +DANIEL EINZIG + +[CRD084B] +JACEN BURROWS + +[CRD084C] +LINN PR + +[CRD084D] +DISEÑO DE PORTADA + +[CRD084E] +STEPHEN BLISS + +[CRED085] +KENT PAUL'S 80 NOSTALGIA ZONE + +[CRED086] +ESCRITO POR DAN HOUSER + +[CRD086A] +PRODUCIDO POR ADAM TEDMAN + +[CRED087] +WWW.KENTPAUL.COM AND WWW.VICECITY.COM + +[CRED088] +CREADO POR + +[CRD088A] +ADAM TEDMAN + +[CRD088B] +DAVID YU + +[CRD088C] +JERRY LUNA + +[CRD088D] +STUART PETRI + +[CRD088E] +MICHAEL CARNEVALE + +[CRD088F] +GREG LAU + +[CRD088G] +FUTABA HAYASHI + +[CRED089] +JEFE DE CONTROL DE CALIDAD + +[CRED090] +CRAIG ARBUTHNOTT + +[CRED091] +ANALISTA JEFE + +[CRED092] +ADAM DAVIDSON + +[CRD092A] +JOE HOWELL + +[CRD092B] +MARC FERNANDEZ + +[CRED093] +ANALISTA DEL JUEGO + +[CRED094] +RICHARD HUIE + +[CRED095] +EQUIPO DE PRUEBAS DE ROCKSTAR + +[CRED096] +LANCE WILLIAMS + +[CRED097] +JOE GREENE + +[CRED098] +BRIAN PLANER + +[CRD098A] +ELIZABETH SATTERWHITE + +[CRD098B] +JAMEEL VEGA + +[CRD098C] +MIKE HONG + +[CRED099] +LEE CUMMINGS + +[CRED100] +HISTORIA + +[CRED101] +JAMES WORRALL + +[CRED102] +DAN HOUSER + +[CRED103] +ADAM TEDMAN + +[CRED104] +PAUL YEATES + +[CRED105] +JENEFER GROSS + +[CRED106] +LAURA PATERSON + +[CRED107] +SECUENCIAS + +[CRED108] +ESCRITAS POR DAN HOUSER Y JAMES WORRALL + +[CRED109] +DIRECCIÓN DE AUDIO DE DAN HOUSER Y NAVID KHONSARI + +[CRED110] +PRODUCIDAS POR JAMIE KING + +[CRD110A] +SELECCIÓN DE ACTORES: JAMIE KING, SEAN MACALUSO + +[CRED111] +REPARTO + +[CRD111A] +PERSONAJES DE REPARTO + +[CRED112] +TOMMY VERCETTI - RAY LIOTTA + +[CRED113] +KEN ROSENBERG - WILLIAN FICHTNER + +[CRED114] +SONNY FORELLI - TOM SIZEMORE + +[CRED115] +STEVE SCOTT - DENNIS HOPPER + +[CRED116] +AVERY CARRINGTON - BURT REYNOLDS + +[CRED117] +RICARDO DÍAZ - LUIS GUZMÁN + +[CRED118] +LANCE VANCE - PHILIP MICHAEL THOMAS + +[CRED119] +CORONEL JUAN CORTEZ - ROBERT DAVI + +[CRED120] +UMBERTO ROBINA - DANNY TREJO + +[CRED121] +PHIL CASSIDY - GARY BUSEY + +[CRED122] +MITCH BAKER - LEE MAJORS + +[CRED123] +MERCEDES CORTEZ - FAIRUZA BALK + +[CRED124] +KENT PAUL - DANNY DYER + +[CRED125] +JEZZ TORRENT - KEVIN MCKIDD + +[CRED126] +SUPERVISOR TAXIS - DEBORAH HARRY + +[CRED127] +CANDY SUXX - JENNA JAMESON + +[CRED128] +BJ SMITH - LAWRENCE TAYLOR + +[CRED129] +TÍA POULET - YOUREE CLEOMILI HARRIS + +[CRED130] +PROVEEDOR - ARMANDO RIESCO + +[CRED131] +COUGAR - BLAYNE PERRY + +[CRED132] +HILARY - CHARLES TUCKER + +[CRED133] +CONGRESISTA ALEX SHRUB - CHRIS LUCAS + +[CRED134] +VIEJO KELLY - GEORGE DICENZO + +[CRD134A] +CAM JONES - GREG SIMS + +[CRD134B] +PSICÓPATA - HUNTER PLATIN + +[CRD134C] +MAUDE LA VENDEDORA DE HELADOS - JANE GENNARO + +[CRD134D] +JETHRO - JOHN ZURHELLEN + +[CRD134E] +GONZÁLEZ - JORGE PUPO + +[CRD134F] +DWAYNE - NAVID KHONSARI + +[CRD134G] +DICK - PETER MCKAY + +[CRD134H] +MIKE EL MATÓN & CHICO PORNO - ROBERT CIHRA + +[CRD134I] +PERCY - RUSSELL FOREMAN + +[CRED135] +CAPTURA DE MOVIMIENTOS + +[CRED136] +ANIMACIÓN DE + +[CRD136A] +DIRECCIÓN TÉCNICA DE ALEX HORTON + +[CRED137] +DIRIGIDO POR + +[CRD137A] +DIRIGIDO POR NAVID KHONSARI + +[CRED138] +PRODUCIDO POR + +[CRD138A] +PRODUCIDO POR JAMIE KING + +[CRD138B] +RENAUD SEBBANE + +[CRED139] +GRABADO EN PERSPECTIVE STUDIOS, BROOKLYN + +[CRED140] +ACTORES DE CAPTURA DE MOVIMIENTOS + +[CRD140A] +BLAYNE PERRY + +[CRD140B] +JONATHON SALE + +[CRD140C] +CHARLES TUCKER + +[CRD140D] +EDDIE MARRERO + +[CRD140E] +WILLIAM MCCALL + +[CRD140F] +JORGE PUPO + +[CRD140G] +ROBERT JACKSON + +[CRD140H] +TARA RADCLIFFE + +[CRD140I] +JENIFER GAMBETESE + +[CRD140J] +KRIS ACHEVARRIA + +[CRD140K] +ALI ORDOUBADI + +[CRD140L] +KAHLEEM POOLE + +[CRED141] +DIÁLOGOS DE LOS PEATONES + +[CRD141A] +ESCRITOS POR DAN HOUSER, MARC FERNÁNDEZ, GILLIAN TELLING Y NAVID KHONSARI + +[CRD141B] +CON LA AYUDA DE JEREMY POPE, LANCE WILLIAMS, Y JENNY JEMISON + +[CRED142] +ESCRITO POR + +[CRD142A] +DAN HOUSER Y JAMES WORRALL + +[CRED143] +DIRIGIDO POR DAN HOUSER, CRAIG CONNER, MARC FERNÁNDEZ, Y ALLAN WALKER + +[CRED144] +PRODUCIDO POR RENAUD SEBANNE + +[CRED145] +PEATONES + +[CRED146] +ADAM DAVIDSON, ADAM WATKINS, ALEJANDRO K. BROWN, ALEX ANTHONY SIOUKAS, ALEX GARCÍA, + +[CRED147] +ALICE SALTZMAN, ALISON CIHRA, AMY SALIMA, AMY SALZMAN, ANDREA VIDELA, ANTHONY ATTI, + +[CRED148] +ANTHONY RIVERA, BIJAN SHAMS, BLAYNE PERRY, BRETT BISOGNO, BREYE MATA, BRIAN PANEN, + +[CRED149] +BROCK VODER, CAREY BERTINI, CHARISSE LAMBERT, CHRIS DIFAT, CHRIS REISENBERGER, + +[CRED150] +CHRISTOPHER BRODAY, CHRISTOPHER CARRO, CYNTHIA GREENE, DAMARIES LÓPEZ, DAN LEE, + +[CRED151] +DAN SCHNEIDER, DAN TOYAMA, DAVID DEAN CHALTFIELD, JR., DAVID HARRISON, DAVID WILEY, + +[CRED152] +DEBORAH COLLINS, DEBRANDA CHANEY-GILES, DEMETRA KOUKOULAS, DENISE ROSADO, + +[CRED153] +DEVIN BENNETT, DEVIN WINTERBOTTOM, DORIS WOO, DOUGLAS HARRISON, DUNCAN COUTTS, + +[CRED154] +DUPE AJAYI, EDWIN AVELLANEDA, ELIZABETH HOWELL, ELIZABETH SATTERWHITE, ERIC NAGLE, + +[CRED155] +ESTEBAN KARPLUS, F. FONT, FUTABA HAYASHI, GENE HILGREEN, GERALD COSGROVE, + +[CRED156] +GERARD LUNA, GILLIAN TELLING, GREGG CARLUCCI, GREGORY CLERVOIX, GREGORY SCHWEIZER, + +[CRED157] +HADLEY TOMICKI, J. ROSSETT, JAMEEL VEGA, JASON JONES, JEFF ROSA, JENNIFER JEMISON, + +[CRED158] +JEREMY TAGGERT, JESSICA RIDER, JOSEPH GREENE,JOSEPH HOWELL, KATE DUKICH, + +[CRED159] +KEL O'NEILL, KEVIN HOPKINS, LADAWN JAMES, LANCE WILLIAMS, LAURA BUBBLES, + +[CRED160] +LAURA PATTERSON, LEE CUMMINGS, LETICIA L. YOUNG, LINDSAY KENNEDY, LISA ORITZ, + +[CRED161] +LORNA JORDAN, LUCIO AMADIO, MARCO FERNÁNDEZ, MARIKO TANAKA, MARLON MATTHEWS, + +[CRED162] +MARY TELLING, MASAYOSHI MITSUYAMA, MATTHEW CHUNG, MAX ALLSTADT, MAX BOGDANOV, + +[CRED163] +MELISSA ÁLVAREZ, MICHAEL MAY, MICHAEL ROTHSTEIN, MIGUEL VIDAL, MIKE FEDERLINE, + +[CRED164] +NATALIE DESCALZO, N'GAI MEMBERS, NICOLAS MALLO, NOELLE SADLER, NORBERT MORIVAN, + +[CRED165] +OSWALD GREENE, JR., PETER MCKAY, PETER APPEL, PRESTON SAVARESE, RAFAEL GONZÁLEZ, + +[CRED166] +RANDY JOHNSON, REY CONCEPCIÓN, RICHARD KROGER, ROB TIBBS, ROBERT JACKSON, + +[CRED167] +ROBERT SCHULER, ROSS A. MCINTYRE, RUSSELL FOREMAN, RUTH NÚÑEZ, SALVADORE SUAZO, + +[CRED168] +SAM WHITE, SANTOS GONZÁLEZ, SCOTT SMITH, SEYMOUR FRAILMAN, SPELMAN BRAUMAN, + +[CRED169] +STEPHANIE TELLING, STEVE KNEZEVICH, STEVE ROBERT, SUMIKO YASUDA, SUSAN LEWIS, + +[CRED170] +SYLVIA COLACIOS, TOMOKO MIYAZAKI, TRON, VERDEL HALE, YVES MONDESIR, ZENO LEINFELDER, + +[CRED171] +DAVID BEDDOES, CHRISTINE CHALMERS, BARRY CLARK, NEIL CORBETT, KIM GURNEY, NEIL MEIKLE, + +[CRED172] +CASSIE OLIVER, LORRAINE ROY, DAVID WATSON, KEVIN WONG, WILL MORTON + +[CRED175] +ADAM DAVIDSON + +[CRED176] +LANCE WILLIAMS + +[CRED177] +NEIL MCCAFFREY + +[CRED178] +LAURA PATERSON + +[CRED179] +REY CONCEPCIÓN + +[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 HÉRCULES + +[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] +EMISORAS DE RADIO Y MÚSICA + +[CRED218] +ASESOR MUSICAL + +[CRD218A] +HEINZ HENN + +[CRD218B] +STUART ROSS + +[CRED219] +COORDINADOR DE LA BANDA SONORA + +[CRED220] +TERRY DONOVAN + +[CRED221] +PRODUCTOR DE ROCKSTAR GAMES + +[CRED222] +DAN HOUSER Y LAZLOW + +[CRED223] +PRODUCTOR DE ROCKSTAR NORTH + +[CRED224] +CRAIG CONNER + +[CRED225] +ALLAN WALKER + +[CRED226] +LAZLOW + +[CRED227] +DJ BANTER E IMÁGENES + +[CRED228] +ESCRITO POR DAN HOUSER Y LAZLOW + +[CRED229] +FLASH FM + +[CRD229A] +TONI-MARIA CHAMBERS + +[CRD229B] +VOCES FICTICIAS Y PRODUCCIÓN-JEFF BERLIN + +[CRED230] +GRACIAS ESPECIALES A + +[CRED231] +TOMMY MOTTOLA, + +[CRED232] +MICHELLE ANTHONY, + +[CRED233] +STEVE BARNETT, + +[CRED234] +CHUCK FLECKENSTEIN, + +[CRED235] +RITA LIBERATOR + +[CRED236] +MARTIN & CLAIRE LOGAN + +[CRED237] +SANDRA HUTTON + +[CRED238] +CHRISTINE DAVIDSON + +[CRED239] +ALAN, RED & BIGFOOT + +[CRED240] +LE T + +[CRED241] +COLIN DONALD + +[CRED242] +KERRY STALLWOOD + +[CRED243] +ALAN MCGREGOR + +[CRED244] +CHRIS MORTON + +[CRED245] +EMIL BUSSE + +[CRED246] +EMILY BAILLIE + +[CRED247] +KEVIN ARCHIBALD + +[CRED248] +MORAG KERR + +[CRED249] +CATH WALKER + +[CRED250] +ISO BAR + +[CRED251] +WATERLINE + +[CRED252] +NEWS CAFE + +[CRD251A] +THE POND + +[CRD252A] +PIVO + +[CRED253] +BUDGET VIDEO RENTALS + +[CRED254] +LORNA'S SCOOTER + +[CRED255] +GARETH MURFIN + +[CRED256] +ARTE ADICIONAL + +[CRED257] +TONY PORTER + +[CRED258] +CRAIG MOORE + +[CRED259] +ANIMACIÓN DE SINCRONIZACIÓN LABIAL DE LAS SECUENCIAS + +[CRED260] +COSGROVE HALL FILMS + +[CRED261] +PRODUCTOR - OWEN BALLHATCHET + +[CRED262] +ANIMADOR SENIOR - JON TURNER + +[CRED263] +ANIMADORES - RICHARD DRUMM + +[CRED264] +DAVE BROWN + +[CRED265] +MAIR THOMAS + +[CRED266] +PRASHANT PATEL + +[CRED267] +ASESOR TECNOLOGÍA DE AUDIO + +[CRED268] +RIK EDE PARA GAMESOUND LTD. + +[CRED269] +SOPORTE DTS INTEGRATION + +[CRED270] +TED LAVERTY DE DTS + +[CRED271] +CHRIS GREER DE DTS + +[CRED272] +JASON PAGE DE SCEE + +[CRED273] +INVESTIGACIÓN Y ANÁLISIS + +[CRED274] +VROCK + +[CRED275] +DJ: LAZLOW COMO ÉL MISMO + +[CRED276] +VOZ-JOE KELLY + +[CRED277] +PRODUCCIÓN-JONATHAN HANST + +[CRED278] +WAVE 103 + +[CRED279] +DJ: ADAM FIRST-JAMIE CANFIELD + +[CRED280] +VOZ-JEN SWEENEY + +[CRED281] +PRODUCCIÓN-JONATHAN HANST + +[CRED282] +FEVER 105 + +[CRED283] +DJ: OLIVER 'LADYKILLER' BISCUIT-JULIUS DYSON + +[CRED284] +VOZ MASCULINA-ED MCMANN + +[CRED285] +VOZ FEMENINA-SHAWNEE SMITH + +[CRED286] +PRODUCCIÓN- LISTEN KITCHEN + +[CRED287] +EMOTION 98.3 + +[CRED288] +DJ: FERNANDO- FRANK CHAVEZ + +[CRED289] +VOZ-JEN SWEENEY + +[CRED290] +PRODUCCIÓN-JONATHAN HANST + +[CRED291] +RADIO ESPANTOSO + +[CRED292] +DJ: PEPE-TONY CHILRODES + +[CRED293] +WILDSTYLE + +[CRED294] +DJ: MISTER MAGIC AS HIMSELF + +[CRED295] +VOZ-FRANK SILVESTRO + +[CRED296] +PRODUCCIÓN-LAZLOW + +[CRED297] +KCHAT + +[CRED298] +ESCRITO POR DAN HOUSER Y LAZLOW + +[CRED299] +PRODUCIDO Y EDITADO POR LAZLOW + +[CRED300] +DJ AMY SHECKENHAUSEN -LEYNA WEBER + +[CRED301] +JEZ TORRENT-KEVIN MCKIDD + +[CRED302] +MANDY -COLLEEN CORBETT + +[CRED303] +MICHELLE CARAPADIS-MARY BIRDSONG + +[CRED304] +MR.ZOO-CARL DOWLING + +[CRED305] +GETHSEMANEE-LYNN LIPTON + +[CRED306] +CLAUDE MAGINOT-JOHN MAUCERI + +[CRED307] +BJ SMITH-LAWRENCE TAYLOR + +[CRED308] +THOR-FRANK FAVA + +[CRED309] +PERSONAS LLAMANDO A LA RADIO + +[CRED310] +COUZIN ED, JOSH CLARK, JASON BUHRMESTER, JUAN ALLER, WAYNE OLIVER, SUSAN LEWIS, GILLIAN TELLING, TOM MURRAY, MIKE FERRANTE SR., EMMANUEL GOLDSTEIN, DAN HOUSER, NICK MANDELOS, GERRY COSGROVE, MIKE PALERMO, PORKCHOP, KEITH BROADAS + +[CRED311] +LEWIS, GILLIAN TELLING, TOM MURRAY, MIKE FERRANTE SR., EMMANUEL GOLDSTEIN, + +[CRED312] +DAN HOUSER, NICK MANDELOS, GERRY COSGROVE, MIKE PALERMO, PORKCHOP, + +[CRED313] +KEITH BROADAS + +[CRED314] +VCPR + +[CRED315] +ESCRITO POR DAN HOUSER Y LAZLOW + +[CRED316] +PRODUCIDO POR LAZLOW + +[CRED317] +MAURICE CHAVEZ-PHILLIP ANTHONY RODRIGUEZ + +[CRED318] +JONATHAN FREELOADER- PATRICK OLSEN + +[CRED319] +MICHELLE MONTANIUS-KELLY GUEST + +[CRED320] +REP. ALEX SHRUB- CHRIS LUCAS + +[CRED321] +CALLUM CRAYSHAW- SEAN MODICA + +[CRED322] +JOHN F. HICKORY- LJ GANSEN + +[CRED323] +PASTOR RICHARDS- DAVID GREEN + +[CRED324] +JAN BROWN- MAUREEN SILLIMAN + +[CRED325] +BARRY STARK- RENAUD SEBBANE + +[CRED326] +JENNY LOUISE CRAB- MARY BIRDSONG + +[CRED327] +KONSTANTINOS SMITH- KONSTANTINOS.COM + +[CRED328] +JEREMY ROBARD-PETER SILVESTRO + +[CRED329] +ANUNCIOS DE RADIO + +[CRED330] +ESCRITOS POR DAN HOUSER Y LAZLOW + +[CRED331] +PRODUCIDOS POR LAZLOW + +[CRED332] +JINGLES ADICIONALES PRODUCIDOS POR CRAIG CONNER + +[CRED333] +VOCES EN LOS ANUNCIOS: + +[CRED334] +ADAM DAVIDSON, ALEX ANTHONY, ALICE SALTZMAN, AMY SALZMAN, KATE DUKICH, + +[CRED335] +ARAN RONICLE, BARB JONES, BEN KRECH, BRIAN THOMAS, BROCK YODER, CHRIS + +[CRED336] +FERRANTE, CRAIG CONNER, DAVE RYAN, DAVID GREEN, DORIS WOO, DOUGLAS + +[CRED337] +HARRISON, ED MCMANN, FRANK CHÁVEZ, FRANK FAVA, GENE HILGREEN, GREG + +[CRED338] +SCHWEIZER, HUNTER PLATIN, JAMES FERRANTE, JEFF BERLIN, JEFF ROSA, JOE KELLY, + +[CRED339] +JOHN MAUCERI, JOSH CLARK, JULIE WEMYSS, KEVIN STRALEY, KIM GURNEY, LANCE + +[CRED340] +WILLIAMS, LAURA PATERSON, LAZLOW, LISA ORTIZ, LORNA JORDAN, LUCIEN JONES, + +[CRED341] +MAUREEN SILLIMAN, MIKE FERRANTE JR., PETE GUSTIN, PETER SILVESTRO, RAFF + +[CRED342] +CROLLA, RANDY JOHNSON, RICHARD KRUGER, RON REEVE, SHELLEY MILLER, SKY, TJ ALLARD + +[CRD344A] +AUDIO GRABADO EN DIGITAL ARTS STUDIOS, + +[CRED344] +NYC, TRACK 9 STUDIOS, NYC, + +[CRED345] +WEDDINGTON MULTIMEDIA, LOS ANGELES, + +[CRD345A] +SYNC SOUND, NYC Y RADIO LAZLOW, LONG ISLAND. + +[CRED346] +GRACIAS A AXEL ERICSON Y WON LEE EN DIGITAL ARTS, PAUL VÁSQUEZ EN TRACK 9 STUDIOS, JOHN BOWEN Y JOHN HASSLER EN SYNC SOUND + +[CRED347] +MARK LLOYD + +[CRED348] +TIM BATES + +[CRED349] +KIT BROWN + +[CRED350] +ANDY MASON + +[CRED351] +PHIL DEANE + +[CRED352] +PHIL ALEXANDER + +[CRED353] +MATT HEWITT + +[CRED354] +DENBY GRACE + +[CRED355] +ANTOINE CABROL + +[CRED356] +JONOTHAN STONES + +[CRED357] +MIKE BLACKBURN + +[CRED358] +TIM MCGAFF [CINCAM] -Cámara cinematográfica +Cámara cinemática -[FEDS_AM] -<>: CAMBIAR MENÚ +[RC4] +MASACRES RUMPO -[KABOOM] -¡BUUUUM! - -[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 +[LEGAL] +~g~¡Elimina la amenaza criminal! [GA_2] -~w~Nuevo motor y capa de pintura: 100 $ +Nuevo motor y trabajo de pintura. ¡Los policías no te reconocerán! + +[HELP15] +Cuando vayas a pie, pulsa ~h~~k~~PED_LOOKBEHIND~~w~ para ~h~mirar detrás~w~. Utiliza el ~h~joystick analógico derecho~w~ para ~h~mirar a tu alrededor~w~. + +[FEC_LB4] +Mirar detrás (botón R3) [PERPIC] -Paquetes ocultos encontrados +Objetos ocultos encontrados + +[CO_ONE] +Objeto oculto ~1~ de ~1~ [GA_21] -~w~No puedes guardar más vehículos en este garaje. +No puedes almacenar más coches en este garaje. [CHEAT1] Truco activado @@ -3185,14355 +3824,959 @@ Truco de salud Truco de blindaje [CHEAT5] -Truco de nivel de búsqueda +Truco de nivel de se busca [CHEAT6] Truco de dinero [CHEAT7] -Truco de clima - -[FEDS_BA] -botón ": ATRÁS - -[FED_WIS] -PANTALLA PANORÁMICA: +Truco de tiempo [USJ_ALL] -~w~¡ACROBACIAS ÚNICAS COMPLETADAS! +¡TODAS LAS MANIOBRAS ÚNICAS COMPLETADAS! [JAN] -Ene. +Ene [FEB] -Feb. +Feb [MAR] -Mar. +Mar [APR] -Abr. +Abr [MAY] -May. +May [JUN] -Jun. +Jun [JUL] -Jul. +Jul [AUG] -Ago. +Ago [SEP] -Sep. +Sep [OCT] -Oct. +Oct [NOV] -Nov. +Nov [DEC] -Dic. +Dic [DEFDT] --:---:---- --:--:-- [BONUS] -~g~BONIF. DE ~1~ $ +~g~BONIFICACIÓN ~1~ $ -[TAXI_M] -Taxista +[HORN1] +Pulsa ~h~~k~~VEHICLE_HORN~~w~para tocar el ~h~claxon. -[COP_M] -Vigilante +[HORN2] +Pulsa ~h~~k~~VEHICLE_HORN~~w~para tocar el ~h~claxon. -[FIRE_M] -Bombero - -[AMBUL_M] -Médico ATS - -[HJ_IS] -~w~BONIF. ACROBACIA DEMENCIAL: ~1~ $ - -[HJ_PIS] -~w~BONIF. ACROBACIA DEMENCIAL PERFECTA: ~1~ $ - -[HJ_DIS] -~w~BONIF. ACROBACIA DEMENCIAL DOBLE: ~1~ $ - -[HJ_PDIS] -~w~BONIF. ACROBACIA DEMENCIAL DOBLE PERFECTA: ~1~ $ - -[HJ_TIS] -~w~BONIF. ACROBACIA DEMENCIAL TRIPLE: ~1~ $ - -[HJ_PTIS] -~w~BONIF. ACROBACIA DEMENCIAL TRIPLE PERFECTA: ~1~ $ - -[HJ_QIS] -~w~BONIF. ACROBACIA DEMENCIAL CUÁDRUPLE: ~1~ $ - -[HJ_PQIS] -~w~BONIF. ACROBACIA DEMENCIAL CUÁDRUPLE PERFECTA: ~1~ $ - -[HJBAD] -~w~¡Un aterrizaje penoso! Casi ganas ~1~ $ - -[HJUP] -Takeoff health: ~1~ - -[HJDOWN] -Landing health: ~1~ - -[FESZ_LS] -Éxito al cargar. - -[CEDBUG1] -!!Debug Event!! - -[CEDBUG2] -!!Player is dead or not playing!! - -[CEDBUG3] -!!Player is in INDUSTRIAL level!! - -[CEDBUG4] -Trying to make COLLECTIVE with ~1~ - -[CEDBUG5] -Debug Value: ~1~ - -[CEDBUG6] -Debug Values: A: ~1~ B: ~1~ - -[CEDBUG7] -Debug Values: A: ~1~ B: ~1~ C: ~1~ - -[LINE] -This is Line ~1~ - -[MRACE08] -~w~¡Vuelve cuando tengas un vehículo! - -[MRACE01] -~w~Espera a que venga algún rival y toca el claxon para empezar la carrera. - -[MRACE02] -~w~La carrera empezará cuando el primer jugador toque el claxon. - -[MRACE05] -~r~¡HAS PERDIDO! - -[MRACE07] -~r~¡Estás muerto! ¡Eres un perdedor! - -[MRACE06] -~r~¡Cobarde! ¡Te has retirado! - -[MRACE09] -~w~¡Vuelve a la carrera! - -[MRACE10] -~w~¡Has ganado (aunque ibas solo)! - -[MRACEPO] -Posición - -[MRCPU03] -¡HAS PRENDIDO FUEGO A TODOS! - -[MRCPU04] -¡ESTÁS ARDIENDO! ( ------- TRASHMASTER ODD-JOB MISSION ------- ) - -[TRASH1] -Basurero - -[TRASH1A] -~w~Recoge los cubos de basura y llévalos al vertedero. - -[TRASH1C] -~w~El cronómetro empezará cuando recojas un cubo. Puedes recogerlos en CUALQUIER ORDEN. - -[TRASH1G] -~r~¿Demasiado duro para ti? ¡Basura! - -[TRASH1H] -~r~¡Has agotado el tiempo! - -[TRASH1J] -~r~¡Te has alejado demasiado de la ruta! - -[TRASH1K] -~w~Recoge los ~g~cubos~w~. - -[TRASH1L] -~w~Vuelve al ~y~vertedero~w~. - -[TRASH1M] -~w~¡Basura recogida! + ~1~ s. - -[PCJINFO] -~w~Pasa por los 25 ~y~puntos de control~w~ en menos de ~1~ s. - -[PCJFAIL] -~r~¡No has conseguido hacerlo en menos de ~1~ s.! - -[PCJPROM] -~w~¡Tienes ~1~ s. para volver a subir a la ~b~moto~w~! - -[PCJPRO1] -~w~¡Tienes ~1~ s. para volver a subir a la ~b~moto~w~! - -[PCJDEST] -~r~¡Moto destrozada! - -[PCJRET] -~r~No has vuelto a la moto. - -[PCJTIME] -~r~¡Se te ha acabado el tiempo! - -[PCJCHEC] -~w~~1~ de ~1~ puntos de control - -[TRRACE1] -~w~Conseguirás más tiempo por cada punto de control que pases... - -[TRRACE3] -~w~Has terminado con ~1~ s. de sobra. - -[TRRACE4] -~w~You reached ~1~ checkpoints out of ~1~ checkpoints first. - -[TRRACE5] -~w~¡Eso te da ~1~ $! - -[TRRACE6] -~w~¡BIEN HECHO! ¡Has pasado el primero por todos los puntos de control! ¡Bonif. de 1.000 $! - -[TRRACE7] -~r~¡Te has salido de la pista! - -[TRRACE8] -~r~¡Tu moto está destrozada! - -[TRRACE9] -~r~No has vuelto a la moto a tiempo. - -[TRRAC10] -~r~¡Te has quedado sin moto! - -[TRRAC11] -~r~¡Se te ha acabado el tiempo! - -[ANG] -Ángeles Vengadores - -[ANG_1] -~w~¡Eh, amigo! ¡Vamos a limpiar de chorizos esta ciudad! - -[ANG_2A] -Pulsa~h~ ~k~ ~TGSUB~ ~w~para unirte a los Ángeles Vengadores. - -[ANG_3] -~w~Tú y yo nos podríamos adueñar de esta ciudad solitos. Pero, esto... mejor buscamos ayuda por si acaso. - -[ANG_3A] -~w~Para cerca de otros Ángeles Vengadores para que se unan a tu banda. - -[ANG_4] -~w~¡Eo! ¡Me he unido a esta panda de gallinas para dar hostias! ¡Así que vamos! - -[ANG_5] -~w~Yo soy tu hombre... - -[ANG_6] -~w~¡Vamos a quemar chusma! - -[ANG_7] -~w~¡Mola dar hostias! - -[ANG_7A] -~w~¿Os dais cuenta? - -[ANG_7B] -~w~¡No queremos bandas de chuloputas en nuestras calles! - -[ANG_7C] -~w~¡No en mi vecindario! - -[ANG_7D] -~w~¡Es hora de devolvérsela! - -[ANG_7E] -~w~¡Somos la ley en esta ciudad! - -[ANG_8] -Tiempo restante - -[ANG_9] -~w~¡Tiempo prorrogado! - -[ANG_10] -~r~¡Se te ha acabado el tiempo! - -[ANG_11] -~w~Hay un grupo de 'indeseables' pululando por aquí... Vamos a darles una lección. - -[ANG_12] -~w~Hay unos linchadores montando jarana por la calle. ¡Pacifiquemos a esos idiotas! - -[ANG_13] -~w~¿Adónde va a ir a parar esta ciudad? ¿Acaso creen que pueden reunirse libremente? ¡Démosles una lección! - -[ANG_13A] -~w~Han visto a una banda muy chunga pegando a la gente por la calle... - -[ANG_14] -~w~Han informado de otro delito... ¡En marcha! - -[ANG_16] -~w~Han visto a gente aparcar en zona prohibida. ¡ADELANTE! - -[ANG_16A] -~w~Sé de unos tíos que siempre están tramando algo. Ya es hora de que les demos una buena tunda. - -[ANG_OBJ] -~w~Acaba con la ~r~banda~w~ problemática. - -[ANG_17] -~w~¡Bien hecho, amigo! Gracias a ti, no hay delincuentes en este barrio. Al menos por ahora... - -[ANG_18] -~w~¡Se están abriendo! - -[ANG_19] -~w~Encuentra a un Ángel Vengador y párate a su lado para la próxima misión. - -[ANG_20] -~w~¡Se están largando! - -[ANG_21] -~w~¡Que no escapen! - -[VIC1] -Home Sweet Home - -[VIC2] -Slacker - -[VIC3] -Dealing Revenge - -[VIC4] -Snuff - -[VIC5] -Smash and Grab - -[VIC6] -Hot Wheels - -[VIC7] -The Portland Chainsaw Masquerade - -[MAR1] -Shop 'til you Strop - -[MAR2] -Taken for a Ride - -[MAR3] -Booby Prize - -[MAR4] -Biker Heat - -[MAR5] -Overdose of Trouble - -[SAL1] -The Offer - -[SAL2] -Ho Selecta! - -[SAL3] -Frighteners - -[SAL4] -Rollercoaster Ride - -[SAL5] -Contra-Banned - -[SAL6] -Sindacco Sabotage - -[SAL7] -The Trouble with Triads - -[SAL8] -Driving Mr. Leone - -[JDT1] -Bone Voyeur! - -[JDT2] -Don in 60 Seconds - -[JDT3] -A Volatile Situation - -[JDT4] -Blow up 'Dolls' - -[JDT5] -Salvatore's Salvation - -[JDT6] -The Guns of Leone - -[JDT7] -Calm before the Storm - -[JDT8] -The Made Man - -[MAC1] -Snappy Dresser - -[MAC2] -Big Rumble in Little China - -[MAC3] -Grease Sucho - -[MAC4] -Dead Meat - -[MAC4_0] -Casa - -[MAC5] -No Son of Mine - -[SALH1] -Rough Justice - -[SALH2] -Dead Reckoning - -[SALH3] -Shogun Showdown - -[SALH4] -The Shoreside Redemption - -[SALH4_V] -~r~v1.1 - -[SALH5] -The Sicilian Gambit - -[SALH5_V] -~r~v1.1 - -[DONH1] -Panlantic Land Grab - -[DONH2] -Stop the Press - -[DONH3] -Morgue Party Resurrection - -[DONH4] -No Money, Mo' Problems - -[DONH5] -Bringing the House Down - -[DONH6] -Love on the Run - -[TOSH1] -More Deadly than the Male - -[TOSH2] -Cash Clash - -[TOSH2F0] -~r~¡Un furgón ha llegado al recinto de los yakuza! - -[TOSH2F1] -~r~¡El convoy ha llegado al recinto de los yakuza! - -[TOSH2F2] -~r~¡No has destruido los furgones! - -[TOSH2M0] -~w~¡Uno menos! - -[TOSH2M1] -~w~¡Otro menos! - -[TOSH3] -A Date with Death - -[TOSH4] -Cash in Kazuki's Chips - -[PO_MOB1] -~w~¿Toni? ¡Soy tu madre! - -[POMOB1A] -~w~¿Cuánto hace que has vuelto a la ciudad? - -[POMOB1B] -~w~¿Cómo es que no has venido a verme? - -[POMOB1C] -~w~¿Qué te pasa? - -[POMOB1D] -~w~¡Virgen Santa! ¡Soy tu madre! Vamos. - -[PO_MOB2] -~w~¡Hola, Toby! Soy María. - -[PO_MOB3] -~w~¡Eh, Toni! Soy J.D. - -[POMOB3A] -~w~Ya me he enterado de que vas a hacer cosas importantes. - -[POMOB3B] -~w~Espero que no te olvides de tu viejo amigo J.D. cuando estés en la cresta de la ola. ¿Vale? - -[POMOB4A] -~w~¿Qué cojones quieres? - -[POMOB4B] -~w~¿Alguien que limpie tus trapos sucios? ¿O quizá el culito? - -[POMOB4C] -~w~No seas así. Escucha, siento todo lo que ha pasado... - -[POMOB4F] -~w~¿Un pastel de arsénico? - -[POMOB4G] -~w~Olvídalo. - -[POMOB4I] -~w~Salvatore se ha enterado y me ha dicho que debemos hacer las paces. - -[POMOB4J] -~w~Así que te tiendo la mano y te pido perdón. Venga, ven. - -[PO_MOB5] -~w~¿Toni? Soy Salvatore. - -[POMOB5A] -~w~¡Tenemos un marrón del quince! ¡Ven aquí corriendo! - -[PO_MOB6] -~w~¿Anthony? Soy Salvatore. - -[POMOB6A] -~w~¿Has visto a María? - -[ST_MOB8] -~w~¿Sí...? - -[STMOB8A] -~w~¿Toni? Soy Sal. - -[STMOB8B] -~w~Tenemos que hablar, pero no me fío de los móviles. - -[STMOB8C] -~w~Te llamaré al teléfono público que hay delante de los juzgados. - -[ST_MOB1] -~w~Toni. Soy Donald. - -[STMOB1A] -~w~Tengo algo urgente que requiere de tus... habilidades especiales. - -[STMOB1B] -~w~Pásate por mi despacho en cuanto puedas. - -[ST_MOB2] -~w~¿Diga? - -[STMOB2A] -~w~¿Cipriani? Soy yo, McAffrey. - -[STMOB2B] -~w~Tengo unas noticias que le gustarán a Salvatore. - -[STMOB2C] -~w~Ven a verme al sitio de siempre. - -[ST_MOB3] -~w~¿Diga? - -[STMOB3A] -~w~Soy Sal. - -[STMOB3B] -~w~Escucha, los Forelli tenían al alcalde Hole en el bolsillo. - -[STMOB3D] -~w~Sé de un pez gordo de los negocios que haría cualquier cosa por conseguir el cargo. - -[STMOB3E] -~w~Es un capullo integral, así que es ideal para el puesto. - -[STMOB3F] -~w~Le he dicho que le ayudarías a ganar las elecciones... ¡por nosotros! - -[ST_MOB4] -~w~Hola. - -[STMOB4A] -~w~Toni. Soy yo, Sal. - -[STMOB4B] -~w~Huelo a los Forelli detrás del marrón en el que estoy. - -[STMOB4C] -~w~Lo que quiero saber es, ¿por qué querían que el alcalde me la metiera doblada? - -[STMOB4D] -~w~Escucha, ve a verme al embarcadero. - -[STMOB4E] -~w~Vamos a hacer unas averiguaciones. - -[ST_MOB5] -~w~¡Hola! - -[STMOB5B] -~w~Ve a la cabina de teléfono de Torrington. - -[STMOB5C] -~w~Tenemos que hablar. - -[STMOB5D] -~w~De camino, quiero que vayas a ver a un socio mío en Aspatria. - -[STMOB5E] -~w~Nos ayudará a meterles presión a los Sindacco y los Forelli. - -[ST_MOB6] -~w~¿Sí...? - -[STMOB6A] -~w~¿Toni? Soy Sal. - -[STMOB6B] -~w~Ve a la cabina de teléfono de Liberty Campus. - -[STMOB6C] -~w~Es importante. - -[ST_MOB7] -~w~¿Diga? - -[STMOB7A] -~w~¿Toni? Aquí Sal. - -[STMOB7B] -~w~Ve a Belleville y busca la cabina de teléfono. - -[STMOB7C] -~w~Necesito que hagas algo urgente. - -[ST_MOB9] -~w~Toni Cipriani al aparato. - -[STMOB9A] -~w~¿Toni? Soy tu madre. - -[STMOB9B] -~w~¡He oído que te han 'bautizado'! - -[STMOB9C] -~w~¡Nunca dudé de ti, hijo! - -[STMOB9D] -~w~Y ver cómo al final has demostrado lo que vales... - -[STMOB9E] -~w~Voy a retirar el encarguito que hice contra ti. - -[STMOB9F] -~w~Pelillos a la mar. - -[STMOB9G] -~w~Al fin y al cabo, lo hice pensando en lo que más te convenía. - -[STMOB9H] -~w~Ah, ¿qué clase de hijo hace que su madre llegue a tales extremos? - -[STMOB9I] -~w~Nos vemos pronto, hijo. No te olvides de tu vieja madre. - -[STMO10] -~w~¿Diga? - -[STMO10A] -~w~Eh, tío duro. Soy McAffrey. - -[STMO10B] -~w~Los federales han trincado a tu jefe, Salvatore. - -[STMO10C] -~w~Y están cabreadísimos. - -[STMO10D] -~w~Le van a cargar a Sal todos los marrones de esta ciudad. - -[STMO10E] -~w~Así que nunca nos hemos visto, ¿eh? - -[SH_MOB1] -~w~¿Toni...? - -[SHMOB1A] -~w~¿Sal? ¿Eres tú? - -[SHMOB1B] -~w~¡Eh, callad! ¡Que estoy hablando con mi abogado...! - -[SHMOB1C] -~w~¿Toni...? Digo... eeh... ¿Lionel? - -[SHMOB1D] -~w~Escucha. Me han trincado. ¿Te lo puedes creer? - -[SHMOB1E] -~w~Me la han metido hasta el fondo. - -[SHMOB1F] -~w~Ven a toda hostia, necesito que te encargues de una cosa. - -[SHMOB1G] -~w~¿Lionel...? - -[SH_MOB2] -~w~¿Diga? - -[SHMOB2A] -~w~¿Toni? Soy Donald. - -[SHMOB2B] -~w~No, espera, ¡no cuelgues! - -[SHMOB2C] -~w~Tengo una proposición muy cachonda que hacerte... - -[SHMOB2D] -~w~Pasa por mi... em... residencia actual, y te pongo al tanto. - -[SHMOB2E] -~w~¿Toni...? - -[SHMOB2F] -~w~Por favor, Toni, ten piedad. Te llamo con mi última mo... - -[SH_MOB3] -~w~¿Es el Sr. Cipriani? - -[SHMOB3A] -~w~¿Quién es? ¿Cómo ha conseguido este número? - -[SHMOB3B] -~w~Si uno pone todo su empeño, puede conseguir mucho. - -[SHMOB3C] -~w~Creo que usted ya lo sabe, Sr. Cipriani. - -[SHMOB3D] -~w~Necesito su ayuda con algo muy delicado. - -[SHMOB3E] -~w~A cambio, será recompensado con generosidad. - -[SHMOB3F] -~w~Se lo explicaré cuando venga a mi apartamento, en Torrington. - -[SH_MOB4] -~w~¡Toni! ¡Soy Sal! - -[SHMOB4A] -~w~¡Lo has logrado! ¡Casi ni me lo creo, chico! - -[SHMOB4B] -~w~¡Apenas hay ratas en casa! - -[SHMOB4C] -~w~Ven a verme. Nos quedan por atar unos cabos sueltos. - -[SH_MOB5] -~w~¿Toni? Aquí Donald. - -[SHMOB5A] -~w~Si lo de Panlantic sale adelante, vamos a necesitar, ejem... - -[SHMOB5B] -~w~¿Cómo decirlo sin que suene mal...? - -[SHMOB5C] -~w~'Limpiar' una pequeña parcela en Fort Staunton. - -[SHMOB5D] -~w~Cuando dices 'vamos' quieres decir 'voy', ¿no? - -[SHMOB5E] -~w~Toni, tú y yo nos entendemos bien. - -[SHMOB5F] -~w~Ve a ver a 8-Ball. Seguro que nos podrá facilitar el material necesario. - -[SHMOB5G] -~w~Seguro que nos podrá facilitar el material necesario. - -[SH_MOB6] -~w~¿Tío? Soy 8-Ball. - -[SHMOB6A] -~w~Los petardos ya están listos. - -[AHIT_H0] -~w~¿No sabes nada mejor, capullo? - -[AHIT_H1] -~w~¡Por el amor de Dios! ¿Cuándo se rendirán estos capullos? - -[AHIT_H2] -~w~¡Bésame el culo, gilipollas! - -[AHIT_H3] -~w~¡Estos chicos empiezan a cabrearme! - -[AHIT_BI] -~w~¡Estate alerta! ¡Uno de los sicarios de mamá está cerca! - -[AHIT_TA] -~w~¡Mucho ojo! ¡Uno de los asesinos a sueldo de mamá anda por aquí! - -[AHIT_BU] -~w~¡Cuidado! ¡Un sicario de mamá va a por ti! - -[AHIT_AM] -~w~¡Ojo! ¡Uno de los asesinos contratados por mamá te ha visto! - -[AHIT_VA] -~w~¡Ojo avizor! ¡Uno de los asesinos a sueldo de mamá está en la zona! - -[AHIT_PO] -~w~¡Ojito! ¡Uno de los sicarios de mamá se dispone a matar! - -[AHIT_CA] -~w~¡Cuidado! ¡Uno de los asesinos de mamá se te está acercando! - -[K_TKT] -Scrapyard Challenge - -[K_TK2] -~w~Pasa por las anillas para conseguir puntos. - -[K_TK4] -~w~¡Consigue tantos puntos como puedas antes de que se acabe el tiempo! - -[K_CD] -~s~Tienes ~1~ s. para volver a la ~b~moto~s~. - -[K_TKP1] -~w~¡1 punto! - -[K_TKP2] -~w~¡2 puntos! - -[K_TKP3] -~w~¡3 puntos! - -[K_SC] -Puntuación - -[K_SCX] -~w~¡Has conseguido ~1~ puntos! - -[K_SCX1] -~w~¡Has conseguido 1 punto! - -[K_HSC1] -~w~¡Nuevo récord de ~1~ puntos! - -[K_HSC2] -~r~No has conseguido batir el récord de ~1~ puntos. - -[KRUSH] -¡Ahora ganarás cuatro veces más dinero al usar la trituradora de coches! - -[KRUSH2] -¡Ahora ganarás ocho veces más dinero al usar la trituradora de coches! - -[TURFAIL] -~r~¡FIN DE LA MISIÓN EVENTUAL! - -[TKR1] -9mm Mayhem - -[TKR2] -Scooter Shooter - -[TCKILL] -Abatidos - -[TCHEAL] -Daño - -[TC2_1] -~r~¡Has matado al conductor! - -[TC2_2] -~r~¡Vehículo destruido! - -[TC2_3] -~r~¡Se acabó el tiempo! - -[TC_T_E] -~w~¡Objetivo eliminado! ~1~ $ - -[TUP_BR] -~w~Elimina tantos ~r~objetivos~w~ como puedas antes de que se acabe el tiempo. - -[TUP_BR2] -~w~¡Elimina a más de ~1~ ~r~objetivos~w~ para conseguir un nuevo récord! - -[TUP_AD] -~w~Tienes 3 pastillas de adrenalina. Pulsa el botón R1 para usar una. - -[TUPSC1] -~w~¡Nuevo récord de ~1~ abatidos! - -[TUPSC2] -~r~No has conseguido superar el récord de ~1~ abatidos. - -[MPWCS1] -The Wedding List - -[MPWCS2] -Eh, ¿qué te cuentas? - -[MPWCS3] -Oye, mi hijo Joey va a dar un braguetazo. - -[MPWCS4] -Le he buscado a una chica con clase, igualita a mi María... ¡Ganas tengo de que se conozcan! - -[MPWCS5] -Pero no quiero que ella lo vea conducir uno de esos trastos que arregla en su taller. - -[MPWCS6] -Así que peina esta ciudad y búscale un buga decente. - -[MPWCS7] -Te aseguro que te recompensaré. - -[MPTCS1] -Tanks for the Memories - -[MPTCS2] -Aquí Sal. Necesito distraer a la poli y tú vas a ayudarme. - -[MPTCS3] -Tengo un tanque aparcado al otro lado de la ciudad. ¡Cógelo y arrasa con todo! - -[MPTCS4] -Quiero que la gente crea que se han meado en la tumba de Patton. - -[MPTCS5] -Escucha, esta distracción es muy importante, así que he avisado también a otros hombres de confianza. - -[MPTCS6] -Solo pienso pagar al que esté a los mandos más tiempo. - -[MPRCS1] -Street Rage - -[MPRCS2] -Soy Salvatore Leone, el benefactor público consagrado. - -[MPRCS3] -¡No hagan caso de lo que dice el fiscal general! - -[MPRCS4] -Soy un amigo bueno y generoso de Liberty City. Por eso hoy patrocino esta gran carrera. - -[MPRCS5] -¿Cuánto me cuesta esta mierda? - -[MPRCS6] -¡¿QUÉ?! Llévenme a urgencias. ¡Tengo un dolor en el pecho! - -[MPHPCS2] -Aquí Sal... Los federales me han pinchado el teléfono, así que seré sutil. - -[MPHPCS3] -Hay un maletín lleno de 'lechugas' debajo del teléfono y una lista de nombres. Adivina qué quiero... - -[MPHPCS4] -¡Aguarda...! No, no quiero que repartas la pasta entre esos cabrones. - -[MPHPCS5] -Ya sabes... Apártalos de mi vista. - -[MPHPCS6] -Espera, no quería decir 'apartar' en el sentido de 'alejar'. Quería decir... um... - -[MPHPCS7] -¡Mira, mata a todos los cabrones de esa lista! - -[DEB0] -DEBUG 0 - -[DEB1] -DEBUG 1 - -[DEB2] -DEBUG 2 - -[DEB3] -DEBUG 3 - -[DEB4] -DEBUG 4 - -[NUM0] -DEBUG 0 (~1~) - -[NUM1] -DEBUG 1 (~1~) - -[NUM2] -DEBUG 2 (~1~) - -[NUM3] -DEBUG 3 (~1~) - -[NUM4] -DEBUG 4 (~1~) - -[CARS] -Vendedor de coches - -[BIKE] -Vendedor de motos - -[RACE_0] -Posición - -[RACE_FL] -~w~ÚLTIMA VUELTA - -[RACE_X0] -~w~Consigue un coche y ponte en la ~y~línea de salida~w~. - -[RACE_X1] -~w~Consigue una moto y ponte en la ~y~línea de salida~w~. - -[RACE_X2] -~w~¡Necesitas un coche para participar! - -[RACE_X3] -~w~¡Necesitas una moto para participar! - -[RACE_X4] -~w~Tienes ~1~ s. para encontrar un coche. - -[RACE_X5] -~w~Tienes ~1~ s. para encontrar una moto. - -[RACE_X6] -~w~Tienes 1 s. para encontrar un coche. - -[RACE_X7] -~w~Tienes 1 s. para encontrar una moto. - -[RACE_T0] -~r~¡No has quedado el primero! - -[RACE_T1] -~r~Te han descalificado por abandonar el coche. - -[RACE_T2] -~r~Ha muerto uno de los corredores - se ha cancelado la carrera. - -[RACE_T3] -~r~Te han descalificado por abandonar la moto. - -[RACE_Y3] -~w~3 - -[RACE_Y2] -~w~2 - -[RACE_Y1] -~w~1 - -[RACE_Y] -~w~¡YA! - -[RACE_Z1] -~w~¡1ª POSICIÓN! - -[RACE_Z2] -~w~¡2ª POSICIÓN! - -[RACE_Z3] -~w~¡3ª POSICIÓN! - -[RACE_Z4] -~w~¡ÚLTIMA POSICIÓN! - -[RACE_R1] -~w~RÉCORD: ~1~:~1~~1~ ¡NUEVO RÉCORD! - -[RACE_R2] -~w~¡NUEVO RÉCORD! - -[RACE_S0] -~w~TIEMPO: ~1~:~1~~1~ - -[RACE_S1] -~w~MEJOR VUELTA: ~1~:~1~~1~ - -[RAC1] -Low-Rider Rumble - -[RAC2] -Deimos Dash - -[RAC3] -Wi-Cheetah Run - -[BIK1] -Red Light Racing - -[BIK2] -Torrington TT - -[BIK3] -Gangsta GP - -[TT1] -Bumps & Grinds - -[TT1_A1] -~w~< TRAZADO ~1~ > - -[TT1_B1] -~w~Objetivo del trazado: ~1~:~1~ - -[TT1_B1A] -~w~Objetivo del trazado: ~1~:0~1~ - -[TT1_B2] -~w~Mejor tiempo de trazado: ~1~:~1~ - -[TT1_B2A] -~w~Mejor tiempo de trazado: ~1~:0~1~ - -[TT1_B3] -~w~Mejor tiempo de vuelta: ~1~:~1~ - -[TT1_B3A] -~w~Mejor tiempo de vuelta: ~1~:0~1~ - -[TT1_B4] -~w~~1~:~1~ - -[TT1_B4A] -~w~~1~:0~1~ - -[TT1_B5] -~w~¡Nuevo récord de trazado! ~1~:~1~ - -[TT1_B5A] -~w~¡Nuevo récord de trazado! ~1~:0~1~ - -[TT1_L] -~r~ Bloqueado. - -[A_PISTO] -~w~< Pistola > - -[A_UZI] -~w~< Micro subfusil > - -[A_AK] -~w~< AK 47 > - -[A_SNIPE] -~w~< Rifle de francotirador > - -[A_GRENA] -~w~< Granadas > - -[A_ARMOU] -~w~< Blindaje corporal > - -[A_ROCKE] -~w~< Lanzacohetes > - -[A_SHOTG] -~w~< Escopeta > - -[A_M4] -~w~< M-4 > - -[A_FLAME] -~w~< Lanzallamas > - -[A_MINIG] -~w~< Minigun > - -[A_COST] -~w~Precio: ~h~~1~ $ - -[A_COST2] -~w~Precio: ~h~~1~ $ ~n~ ~r~Esto sustituirá a tu arma actual. - -[A_COST3] -~w~Precio: ~h~~1~ $ ~n~ ~r~Tu blindaje corporal está en buen estado. - -[A_COST4] -~w~Precio: ~h~~1~ $ ~n~ ~r~No puedes permitirte esto. - -[A_STOCK] -~r~Sin existencias - -[A_VIC4] -~w~Una pistola suele valer 240 $, pero ésta va a cuenta de Vincenzo. - -[A_DONS4] -~w~Donald Love ya ha pagado esto. - -[A_NEDS4] -~w~Un 'santo varón' reservó esto para usted. - -[A_TALK1] -~w~Tengo todo lo que necesita para defenderse. - -[A_TALK2] -~w~¿Quiere también un permiso? - -[A_TALK3] -~w~No necesito pedirle el carné. Usted parece de confianza. - -[A_TALK4] -~w~Bienvenido. Pruebe el campo de tiro en la trastienda. - -[BENZ_GO] -~w~¡Cámbiate de ropa! - -[PIZ_B01] -~w~¡Tienes ~1~ s. para volver a subir a la ~b~moto de repartidor~w~! - -[PIZ_B02] -~w~¡Tienes ~1~ s. para volver a subir a la ~b~moto de repartidor~w~! - -[PIZ_F04] -~r~¡No has vuelto a la moto de repartidor! - -[NDL_B01] -~w~¡Tienes ~1~ s. para volver a subir a la ~b~moto de repartidor~w~! - -[NDL_B02] -~w~¡Tienes ~1~ s. para volver a subir a la ~b~moto de repartidor~w~! - -[NDL_F04] -~r~¡No has vuelto a la moto de repartidor! - -[EXPO_D] -~w~Tarifa por objeto encontrado: ~1~ $ ¡Acaba la lista para conseguir un extra! - -[PUPSPN] -~w~¡MEJORA GENERADA! - -[PUPMEGA] -~y~¡MEGADAÑO! - -[PUPREGN] -~y~¡REFUERZO DE SALUD! - -[PUPINVS] -~y~¡INVISIBILIDAD! - -[PUPFREZ] -~y~¡FRENESÍ! - -[MPK] -ha matado a - -[MPKHEAD] -ha recibido un tiro en la cabeza - -[MPNEED] -solo necesita - -[MPNAME] -Nombre - -[MPSCORE] -Punt. - -[MPPING] -Ping - -[MPCPS] -Puntos de control - -[MPTIME] -Tiempo - -[MPBONUS] -Bonificación - -[MPQG] -¿Salir de la partida? - -[MPQUIT] -Salir - -[MPCONT] -Continuar - -[MPHIGH] -Tiempo más alto - -[MPBY] -por - -[MPOVER] -Game Over - -[MPFIRST] -ha terminado primero - -[MPWITH] -gana con ($): - -[MPHP05] -~w~5 s. para el siguiente objetivo. - -[MPHP04] -~w~4 s. para el siguiente objetivo. - -[MPHP03] -~w~3 s. para el siguiente objetivo. - -[MPHP02] -~w~2 s. para el siguiente objetivo. - -[MPHP01] -~w~1 s. para el siguiente objetivo. - -[RCRANGE] -~w~¡Está demasiado lejos! - -[CAD5_AA] -Aquí Sal. - -[CAD5_AB] -¡Esos Forelli me han tocado los huevos! ¡Y van pagarlo! - -[CAD5_AC] -Quiero que cojas sus coches más fardones... - -[CAD5_AD] -... y los lleves al depósito de coches de los Sindacco, sus mayores rivales. - -[CAD5_AE] -Asegúrate de que los Forelli no roben ningún coche de los Sindacco como represalia. - -[CAD5_AF] -¿Capisci? - -[CAD4_AA] -Soy yo, Sal. - -[CAD4_AB] -Le debo una a Franco Forelli, y tú me vas a ayudar a devolvérsela. - -[CAD4_AC] -En el depósito de coches de los Sindacco tienen algunos bugas muy fardones. - -[CAD4_AD] -Quiero que los robes todos y los lleves al aparcamiento de los Forelli. - -[CAD4_AE] -Asegúrate de que no roben ningún vehículo de los Forelli mientras estés por allí. - -[CAD4_AF] -Eh, y no la cagues. - -[MPC_000] -Toni - -[MPC_001] -'Lionel' - -[MPC_002] -Cipriani - -[MPC_003] -Chófer - -[MPC_004] -Mono - -[MPC_005] -Toni Esmoquin - -[MPC_006] -Furía - -[MPC_007] -El Rey - -[MPC_008] -Cocks - -[MPC_009] -Streak - -[MPC_010] -'T' - -[MPC_011] -Dragón - -[MPC_012] -J.D. - -[MPC_013] -El Masoca - -[MPC_014] -Avery - -[MPC_015] -Choc-Choc - -[MPC_016] -8-Ball - -[MPC_017] -Maria - -[MPC_018] -'Hamfists' - -[MPC_021] -Número 1 - -[MPC_023] -Hung Lo - -[MPC_025] -Yamazaki - -[MPC_031] -Agente '69' - -[MPC_032] -El Especialista - -[MPC_034] -G.I. Jones - -[MPC_035] -Sam - -[FEA_FM0] -HEAD RADIO - -[FEA_FM1] -DOUBLE CLEF FM - -[FEA_FM2] -K-JAH - -[FEA_FM3] -RISE FM - -[FEA_FM4] -LIPS 106 - -[FEA_FM5] -RADIO DEL MUNDO - -[FEA_FM6] -MSX 98 - -[FEA_FM7] -FLASHBACK FM - -[FEA_FM8] -THE LIBERTY JAM - -[FEA_FM9] -LCFR - -[MRACELA] -Vuelta - -[DTB_01] -~w~Defiende tu base de los enemigos que la ataquen. - -[DTB_02] -~w~Protege tus coches a toda costa. - -[CAD2_AB] -~w~Buenas noticias: los Forelli y los Sindacco vuelven a llevarse a matar. - -[CAD2_AC] -~w~Los dos quieren hacerse con toda la venta de coches de Liberty. - -[CAD2_AD] -~w~Como ya 'ayudamos' a los Forelli la semana pasada... - -[CAD2_AE] -~w~... es hora de que equilibremos las cosas. - -[CAD2_AF] -~w~Ayuda a los Sindacco a arrasar el aparcamiento de los Forelli. - -[POMOB6B] -~w~Te juro que yo solo la veo cuando necesita pasta. - -[POMOB2A] -~w~Salvatore me ha dado tu número... Bueno, lo miré en su agenda. ¡Qué más da! - -[POMOB2B] -~w~Tú eres su nuevo perrito, ¿no? Bueno, pues me apetece un paseo. - -[POMOB2C] -~w~Te quiero ver aquí enseguida. - -[GS_RGUN] -EMPEZAR CON ARMAS: - -[TUSHTK] -AWOL Angel - -[SC_WICH] -Récord en AWOL Angel - -[NE_WIFI] -Ha ocurrido un error de red. Se ha apagado el interruptor WLAN. Enciéndelo para jugar las partidas multijugador. - -[BNDRAC0] -Thrashin' RC - -[BNDRAC1] -Ragin' RC - -[BNDRAC2] -Chasin' RC - -[GS_G1] -LIBERTY CITY SURVIVOR - -[GS_G2] -STREET RAGE - -[GS_G3] -PROTECTION RACKET - -[GS_G4] -GET STRETCH - -[GS_G5] -TANKS FOR THE MEMORIES - -[GS_G6] -THE HIT LIST - -[GS_G7] -THE WEDDING LIST - -[TRCR1] -~w~1 - -[TRCR2] -~w~2 - -[TRCR3] -~w~3 - -[TRCRGO] -~w~¡YA! - -[GA_16] -~w~La mano de pintura va incluida. - -[NEW_TAX] -~w~Misión de taxista completada. Mean Street Taxis acaba de recibir un nuevo vehículo en las cocheras de Trenton. - -[EXPO_2] -~w~Si les proporcionas en buen estado los vehículos que quieren, te recompensarán bien. - -[FEMP_NC] -Estableciendo conexiones de red... Espera. - -[C1TGSUB] -botón R3 - -[C2TGSUB] -botón R3 - -[C3TGSUB] -~S~ - -[C2VEHN] -botón R1 - -[C2VECRS] -botón L3 - -[C3VECRS] -~O~ - -[C2PDCWE] -botón L2 y botón R2 - -[C3PDCWE] -botón L2 y botón R2 - -[BENZ_LA] -~w~El ~h~traje de abogado~w~ ya está disponible en el piso franco. - -[BENZ_TR] -~w~La ~h~ropa informal~w~ ya está disponible en el piso franco. - -[SLH1_OU] -~w~Necesitas un ~h~traje de abogado~w~ para entrar a ver a Sal. - -[SLH1_OR] -~w~Debes llevar un traje de abogado para ver a Sal. - -[L_TRN_1] -~w~Puedes usar el ~h~tren elevado~w~ para viajar por Portland. Pulsa~h~ ~k~ ~VEEE~ ~w~para entrar o salir de él. - -[HELP2] -~w~Pulsa~h~ ~k~ ~PDSPR~ ~w~al correr para ~h~esprintar~w~. - -[STMOB5A] -~w~Toni, soy Sal. - -[SCH_TK7] -~r~Has abandonado el vertedero. - -[STMOB3C] -~w~Pero nosotros nos haremos con el control del ayuntamiento. - -[SALH3A] -~w~Consigue un medio de transporte para Donald. - -[MPCASH] -Dinero - -[MPCARS] -Coches - -[CRUSHED] -Valor de la chatarra: ~1~ $ - -[BENZ_BO] -~w~Coge una muda de ~h~ropa interior~w~ en el piso franco. - -[BENZ_EL] -~w~El ~h~mono de 'el Rey'~w~ ya está disponible en el piso franco. - -[BENZ_CO] -~w~El ~h~disfraz de mascota de los Cox~w~ ya está disponible en el piso franco. - -[BENZ_HE] -~w~Misiones de Ángel Vengador, Shoreside: nivel 15 completado. La ~h~ropa de superhéroe~w~ ya está disponible en el piso franco. - -[BENZ_DR] -~w~El ~h~mono de Dragón~w~ ya está disponible en el piso franco. - -[TRTIT] -Wong Side Of The Tracks - -[TRRACE2] -~w~¡Cuidado! Los hermanos Wong parecen muy duros... - -[MPTOTAL] -Tiempo - -[TOUR_W6] -~w~Han dejado un Landstalker blindado exclusivo junto a tu piso franco. Guárdalo bien en tu garaje. - -[OUTFITS] -Ropa desbloqueada - -[MPHPMAR] -es el señalado y debe morir. - -[FEC_CWT] -Cambiar de arma\objetivo - -[EXPO_1] -~w~Love Media necesita premios que dar en sus competiciones 'Car-razy Car Give Away'. - -[PCJLAP] -~w~Nuevo récord de vuelta: ~1~ s. - -[MPBLCAR] -Coche azul: - -[MPRDCAR] -Coche rojo: - -[RAMP_A] -~w~¡DESTRUCCIONES COMPLETADAS! ~1~ $ - -[FET_SAV] -Guardar partida - -[FET_WRN] -¡Aviso! Se han activado uno o más trucos. Esto puede afectar a la partida guardada. Se recomienda que no guardes esta partida. - -[HELP39] -~w~Mueve~h~ ~k~ ~VEWEI~ ~w~para desplazar tu peso en la moto. +[HORN3] +Pulsa ~h~~k~~VEHICLE_HORN~~w~para tocar el ~h~claxon. [FEC_EXV] -Salir del vehículo +Entrar y salir de vehículo -[MPCOLL] -COCHES RECOGER: +[TAXI_M] +'TAXISTA' -[FEMP_HG] -ANFITRIÓN DE PARTIDA +[COP_M] +'JUSTICIERO' -[FEMP_JG] -UNIRSE A PARTIDA +[FIRE_M] +'BOMBERO' -[K_TK3] -~w~1 punto por las ~g~verdes~w~, 2 por las de color ~y~ámbar~w~ y 3 por las ~r~rojas~w~. +[AMBUL_M] +'ATS' -[FEMP_GJ] -ELIGE LA PARTIDA A UNIRSE +[HJ_IS] +BONIFICACIÓN POR ACROBACIA: ~1~ $ -[FEMP_H] -ANFITRIÓN: +[HJ_PIS] +BONIFICACIÓN POR ACROBACIA PERFECTA: ~1~ $ -[FEMP_P] -JUGADORES: +[HJ_DIS] +BONIFICACIÓN POR ACROBACIA DOBLE: ~1~ $ -[FEMP_HN] -SER ANFITRIÓN DE NUEVA PARTIDA +[HJ_PDIS] +BONIFICACIÓN POR ACROBACIA DOBLE PERFECTA: ~1~ $ -[PO_MOB4] -~w~Eh, soy yo, Vincenzo. +[HJ_TIS] +BONIFICACIÓN POR ACROBACIA TRIPLE: ~1~ $ -[POMOB4D] -~w~Venga, pásate por mi casa, tengo algo para ti. +[HJ_PTIS] +BONIFICACIÓN POR ACROBACIA TRIPLE PERFECTA: ~1~ $ -[POMOB4E] -~w~¿Sí? ¿Y de qué se trata? ¿Unos zapatos de cemento? +[HJ_QIS] +BONIFICACIÓN POR ACROBACIA CUÁDRUPLE: ~1~ $ -[POMOB4H] -~w~No. Vamos, Toni, estoy muy arrepentido... +[HJ_PQIS] +BONIFICACIÓN POR ACROBACIA CUÁDRUPLE PERFECTA: ~1~ $ -[FEMP_F] -COMPLETO +[FESZ_LS] +Carga completada con éxito. -[FEMP_R] -RESTAURAR PREDETERMINADOS +[HELI_1A] +Prueba tus habilidades con el Sparrow, comprueba lo rápido que puedes completar el circuito. -[YOU] -TÚ +[HELI_1B] +¡Circuito completado! ~1~ $ -[NE_POW] -Ha ocurrido un error de red. Se ha apagado el interruptor POWER/HOLD (alimentación/bloqueo). +[HELIODD] +Trabajos esporádicos del helicóptero -[FEMP_SQ] -¿Seguro que quieres empezar una partida multijugador? +[LAW] +LAS MISIONES DEL ABOGADO -[BIKETXT] -~w~Hogs & Cogs solo está abierto entre las 08:00 y las 18:00. Vuelve entonces. +[LAW1_1] +~g~Consigue unos trapos nuevos en la tienda de ropa de Rafael. -[RACE_2] -Tiempo +[LAW4_6] +¡Quemad la dirección! -[FEF_CO2] -Elige la mejor configuración de los controles para tu estilo de juego. +[LAW4_7] +¡Matad a los jefes! -[TYREPOP] -Neumáticos reventados a tiros +[LAW4_8] +Luchad, luchad, luchad, luchad. -[FE_INIP] -Iniciando y cargando el MENÚ PAUSA... Espera. +[LAW4_9] +¡Más vacaciones, menos trabajo! -[DON4EX3] -~w~¿Aceptas cheques? +[LAW4_11] +¡Luchad! ¡Luchad! ¡Luchad! ¡Luchad! -[CRUSH] -~w~Convierte la chatarra en dinero. Ciertos vehículos serán triturados si los dejas en el área señalada con neumáticos. +[LAW4_12] +¡Viva la revolución! -[ANG_15] -~w~Unos idiotas le han robado el coche a un pobre hombre... ¡A por ellos! +[GENERAL] +LAS MISIONES DEL CORONEL -[CDERROR] -Por favor, espera... +[GEN3_4] +Tommy Vercetti. Vamos... -[FEC_LOF] -Mirar hacia delante +[GEN3_13] +¿Cuál es tu problema, tío? ¡Sube al tejado al otro lado del patio antes de que aparezcan! -[MPHELP] -AYUDA +[GEN3_17] +¡Mierda! ¿Intentas matarme? -[C1VEHN] -botón L1 +[GEN3_21] +~g~¡Tiene el dinero de Díaz! ¡Ve tras él y recupéralo! -[C3VEHN] -botón L3 +[GEN3_24] +~r~¡Díaz murió! ¡Has fracasado al protegerle! -[MPOBJ] -OBJETIVO: +[GEN3_26] +~r~¡Le pegaste un tiro a Díaz! -[MPLEG] -LEYENDA DEL RADAR: +[GEN3_27] +~r~¡Disparaste a los guardaespaldas de Díaz! -[GS_O1] -¡Cada uno a lo suyo! ¡Mata a los demás jugadores! +[GEN3_31] +~g~Ahora ve al punto de entrega y cuida de Díaz. -[GS_O2] -Pasa por los puntos de control para llegar el primero a la línea de meta. +[GEN3_32] +~g~Ve a tu posición elevada en el tejado del edificio opuesto a donde está Lance. -[GS_OD3] -Defiende de los atacantes enemigos las cuatro limusinas que hay en tu base. +[COKE] +LAS MISIONES DEL BARÓN DE LA NIEVE -[GS_O6] -Mata al jugador "señalado" lo más rápido posible. Si eres tú el "señalado", sobrevive cuanto puedas. +[COK1_3] +¡Espero que te caigas y te rompas el cuello! -[GS_O7] -Recoge coches por la ciudad y llévalos a los contenedores que te esperan. +[COK1_6] +Estoy cansado de estos mamones. -[FHOSE_2] -~w~El~h~ ~k~ ~VEWEA~ ~w~ajustará la posición del cañón de agua. +[COK2_7] +¿Veis esos marcadores chicos? ¡Probad a dar a las luces! -[MPI01] -MEJORA +[COK2_10] +Desde luego eres mejor disparando que charlando. -[MPI02] -SALUD +[COK2_11] +Gracias. Eres un verdadero encanto. -[MPI03] -BLINDAJE +[COK2_12] +Lo sé, Tommy. -[MPI04] -ARMA +[COK2_18] +¿Te gusta Kenny Loggins? -[SPIDER] -Deimos SP +[COK2_19] +Dios, ¡me encanta este disco! -[PONTIAC] -Phobos Vt +[COK2_26] +~r~¡Mataste a Lance! -[FORELLI] -Forelli ExSess +[COK3_1] +¡No dispares tío! -[AHIT_LO] -Puede que se haya largado, pero volverá para terminar su trabajo. +[COK3_2] +¿Qué hay ahí? -[FEM_ROF] -Radio apagada +[COK3_3] +Se está llevando el barco. Gorrón. -[GA_1] -~w~¿Estás de broma? ¡No pienso tocar eso! +[COK3_4] +¡Ayuda! ¡Un tipo me está robando el barco, tío! -[TRA_NEX] -Próxima parada: +[COK4_W] +¡Uugghh! Ése era el último. -[TRA_CUR] -Parada actual: +[COK4_X] +Voy a arrancarlo -[PAGEB2] -~w~La ~h~escopeta~w~ ya está disponible en el piso franco. +[COK4_Y] +Creo que tenemos algunos amigos nuevos. -[PAGEB3] -El ~h~blindaje corporal~w~ ya está disponible en el piso franco. - -[PAGEB4] -~w~El ~h~subfusil~w~ ya está disponible en el piso franco. - -[PAGEB5] -~w~El ~h~.357~w~ ya está disponible en el piso franco. - -[PAGEB6] -~w~El ~h~M4~w~ ya está disponible en el piso franco. - -[PAGEB7] -~w~El ~h~rifle de francotirador con mira láser~w~ ya está disponible en el piso franco. - -[PAGEB8] -~w~El ~h~lanzallamas~w~ ya está disponible en el piso franco. - -[PAGEB9] -~w~El ~h~lanzacohetes~w~ ya está disponible en el piso franco. - -[PAGE_01] -Mata a tiros a ~1~ de la Tríada en 2 min. - -[PAGE_02] -Vuela ~1~ vehículos en 2 min. - -[PAGE_03] -Incinera a ~1~ Diablos en 2 min. - -[PAGE_04] -Mata a ~1~ mafiosos Leone en 2 min. - -[PAGE_05] -Quema ~1~ vehículos en 2 min. - -[PAGE_06] -Atropella a ~1~ peatones en 2 min. - -[PAGE_07] -Destroza ~1~ vehículos en 2 min. - -[PAGE_08] -Aniquila a ~1~ peatones en 2 min. - -[PAGE_09] -Quema a ~1~ yakuza en 2 min. - -[PAGE_10] -Asesina a ~1~ Forelli en 2 min. - -[PAGE_11] -Atropella a ~1~ peatones en 2 min. - -[PAGE_12] -Mata a ~1~ peatones en 2 min. - -[PAGE_13] -Mata a ~1~ yakuza en 2 min. - -[PAGE_15] -Aniquila a ~1~ peatones en 2 min. - -[PAGE_16] -Destroza ~1~ vehículos en 2 min. - -[PAGE_17] -Abate a ~1~ peatones como francotirador en 2 min. - -[PAGE_18] -Destroza ~1~ vehículos en 2 min. - -[PAGE_20] -Achicharra a ~1~ peatones en 2 min. - -[MPI05] -ENEMIGO - -[MPI07] -PTO. CONTROL - -[MPI08] -SIGUIENTE - -[MPI09] -LÍNEA DE META - -[MPI10] -CORREDOR - -[MPI11] -BASE - -[MPI12] -BASE ENEMIGA - -[MPI13] -TANQUE - -[MPI14] -SEÑALADO - -[MPI15] -COCHE - -[MPI16] -CONTENEDOR - -[FEI_LEG] -Leyenda Sí/No - -[SR_ON] -Ahora que ya te has hecho un nombre en el circuito de carreras callejeras, busca a los rivales que intentan contactar contigo. - -[FEC_FRA] -Puntería libre - -[KAR_ON] -Vuelve al coche de bomberos siempre que quieras e intenta batir tu mejor tiempo. - -[DON2EX5] -~w~8-Ball no cederá a menos que le pagues 20.000 $ del ala. - -[PCJTIT] -GO GO Faggio - -[FEST_GO] -Mejor tiempo en "Go Go Faggio" - -[RC_1] -~w~Mata a más de ~1~ de la Tríada. Cada muerto te dará una bonificación al tiempo. - -[EXPO_C] -~w~¡Gracias! ¡Ya están todos! Tienes una bonificación alucinante a la puerta de tu piso de Newport. - -[TRRACE0] -~w~Pasa por los ~y~puntos de control~w~ y llega vivo al final de la carrera. - -[RACE_P1] -~w~1° - -[RACE_P2] -~w~2° - -[RACE_P3] -~w~3° - -[RACE_P4] -~w~4° - -[OUTF_00] -~w~Ropa informal - -[OUTF_01] -~w~Traje de Leone - -[OUTF_03] -~w~Uniforme de Ángel Vengador - -[OUTF_04] -~w~Ropa de chófer - -[OUTF_05] -~w~Traje de abogado - -[OUTF_06] -~w~Esmoquin - -[OUTF_07] -~w~Mono de 'el Rey' - -[OUTF_08] -~w~Disfraz de mascota de los Cox - -[OUTF_09] -~w~Ropa interior - -[OUTF_10] -~w~Ropa de superhéroe - -[OUTF_11] -~w~Mono de Dragón - -[SLTVMON] -Dinero total ganado en Slash TV - -[DBIKEAI] -Mayor altura alcanzada (m) - -[MPC_039] -Vincenzo - -[MPC_040] -Salvatore - -[MPC_041] -Toshi - -[MPC_042] -Toshiko - -[MPC_043] -Ophelia Lardaz - -[MPC_044] -Ed Banger - -[MPC_045] -Robin Emblind - -[MPC_046] -Sra. Menalot - -[MPC_047] -Hugh Jazz - -[MPC_048] -Wayne - -[MPC_049] -Paulie - -[MPC_050] -Anne Job - -[MPC_051] -Randy Boner - -[MPC_052] -Owen Monie - -[MPC_053] -Ekant Sing - -[MPC_054] -M.T. Head - -[MPC_055] -Rick O'Shea - -[MPC_056] -Arden Long - -[MPC_057] -Ann Thrax - -[MPC_058] -Fay Slift - -[MPC_059] -Mona Lott - -[C0VEACC] -~X~ - -[C1VEACC] -~X~ - -[C2VEACC] -~X~ - -[C3VEACC] -joystick analógico derecho hacia arriba - -[C0VEBRK] -~S~ - -[C1VEBRK] -~S~ - -[C2VEBRK] -~S~ - -[C3VEBRK] -joystick analógico derecho hacia abajo - -[C0VEHB] -botón R1 - -[C1VEHB] -botón R1 - -[C0VEEE] -~T~ - -[C1VEEE] -~T~ - -[C2VEEE] -botón L1 - -[C3VEEE] -~T~ - -[C0VEWEP] -~O~ - -[C1VEWEP] -~O~ - -[C2VEWEP] -~O~ - -[C3VEWEP] -botón R1 - -[C0PDSPR] -~X~ - -[C1PDSPR] -~X~ - -[C0SNZI] -~S~ - -[C1SNZI] -~S~ - -[C0SNZO] -~X~ - -[C1SNZO] -~X~ - -[C0PDFW] -~O~ - -[C1PDFW] -~O~ - -[C0TRSK] -~X~ - -[C1TRSK] -~X~ - -[C2TRSK] -~X~ - -[C3TRSK] -~X~ - -[C0AMBUY] -~X~ - -[C1AMBUY] -~X~ - -[C2AMBUY] -~X~ - -[C3AMBUY] -~X~ - -[C0AMEXI] -~T~ - -[C1AMEXI] -~T~ - -[C2AMEXI] -~T~ - -[C3AMEXI] -~T~ - -[C2PDSPR] -~O~ - -[C3PDSPR] -~X~ - -[C2SNZI] -~T~ - -[C3SNZI] -~S~ - -[C2SNZO] -~S~ - -[C3SNZO] -~X~ - -[C2PDFW] -~X~ - -[C3PDFW] -botón R1 - -[MPC_020] -Rico Garlik - -[MPC_022] -Lou Scannon - -[MPC_024] -Cruz Vormen - -[MPC_026] -Busta Moves - -[MPC_027] -Juan Kerr - -[MPC_028] -Nick Yakar - -[MPC_029] -Lou Bricant - -[MPC_030] -Lance Urwell - -[MPC_033] -Agente Ochre - -[MPC_036] -Papi Love - -[MPC_037] -Lucy Lastic - -[MPC_038] -Bill Durzbum - -[MPISCOL] -Objeto recogido - -[MPSTART] -Iniciando partida... - -[MRACEC1] -~w~1... - -[MRACEC2] -~w~2... - -[MRACEC3] -~w~3... - -[MPC_019] -Phil DeGirth - -[GDA_HL] -Mayor nivel de Ángel Vengador - -[MP_SNEW] -Carga o inicia una nueva partida para un jugador o multijugador. - -[DON2EX9] -~w~¡~r~Ned~w~ se está escapando! No lo pierdas. - -[FEI_CHA] -Cambiar de equipo - -[FES_RES] -RESTAURAR AJUSTES DEL JUEGO - -[FESZ_QT] -¿Seguro que quieres restaurar todos los ajustes de controles, sonido y pantalla? - -[FEH_LOA] -JUEGO - -[MPEMPTY] -Vacío - -[FEMP_SN] -INICIAR PARTIDA (se necesitan 2 o más jugadores) - -[JD_SUIT] -~w~J.D. no te dará trabajo mientras vistas como un Leone. - -[SAVD_SH] -(piso franco). - -[SAVD_DY] -Día - -[SAVD_CO] -completado. - -[SAVD_AL] -Portland safehouse. Day 71, $57640. 17% complete. - -[SAV_SLT] -Nueva partida guardada - -[POMOB6C] -~w~Pásate a verme pronto. Tengo un trabajo para ti. - -[ANG_2] -~w~Pulsa~h~ ~k~ ~TGSUB~ ~w~para alternar la activación de las misiones de Ángel Vengador. - -[TVHELP] -~w~Pulsa~h~ ~k~ ~TGSUB~ ~w~para alternar la activación de las misiones de SLASH TV. - -[PAGERA] -~w~El ~h~M60~w~ ya está disponible en el piso franco. - -[CO_ALL] -~w~¡Recogidos todos los paquetes ocultos! - -[CO_ONE] -~w~¡Has recogido ~1~ de ~1~ paquetes ocultos! - -[PAGE_14] -Fríe a ~1~ gánsteres colombianos en 2 min. - -[PAGE_19] -Atropella a ~1~ gánsteres colombianos en 2 min. - -[ANG_22] -~r~Canceladas las misiones de Ángel Vengador. - -[SLATVQO] -~r~Cancelada la misión de Slash TV. - -[C0FREE1] -botón L3 - -[C1FREE1] -botón L3 - -[C2FREE1] -botón L3 - -[C3FREE1] -botón L3 - -[C0FREE2] -joystick analógico izquierdo - -[C2FREE2] -joystick analógico izquierdo - -[ANGCOM1] -~w~¡Has superado la misión de Ángel Vengador de nivel 15 de Portland! ¡Han dejado la moto única 'Avenger' junto a tu piso franco! - -[K_CE] -~w~Tienes ~1~ s. para volver a la ~b~moto~w~. - -[HELP31] -~w~Si te han ~h~'trincado'~w~ o ~h~'eliminado'~w~ durante una misión, aparecerá este ~h~taxi~w~. - -[LOSER] -~y~¡HAS PERDIDO! - -[RCRHELP] -~w~Pulsa~h~ ~k~ ~TGSUB~ ~w~para ~h~salir de la carrera~w~. Pulsa~h~ ~k~ ~VEWEP~ ~w~para devolver el coche de RC al último punto de control. - -[SRC_ON] -Ahora que ya te has hecho un nombre en el circuito ilegal de carreras de coches, los rivales intentarán contactar contigo. - -[SRB_ON] -Ahora que ya te has hecho un nombre en el circuito ilegal de carreras de motos, los rivales intentarán contactar contigo. - -[RACE_R0] -~w~RÉCORD ANTERIOR: ~1~:~1~~1~ - -[POMOB3C] -~w~Eh, pásate por aquí algún día, colega. ¿Vale? - -[MPHPCS1] -The Hit List - -[MPWLGOC] -Sal del coche. - -[MPWLLTC] -Sal del contenedor. - -[MPWLDTC] -Entrega el coche. - -[MPWLCD] -Coche entregado. - -[MPWLNGC] -Ahora coge los coches. - -[MPAUTO] -NO REPETIR - -[MRACEGO] -~w~YA - -[MRACE04] -HAS GANADO - -[MRACEWI] -ha ganado la carrera. - -[MRCPU01] -~y~REPARACIÓN AL INSTANTE - -[DTB01] -Defiende los coches - -[DTB02] -Destruye los coches - -[DTB03] -Coche perdido - -[DTB04] -Coche destruido - -[MPWIN] -ha ganado. - -[MPKSELF] -ha caído. - -[MPMORE] -abatidos más. - -[MP1MORE] -abatido más. - -[MPSTRT] -Empezamos - -[MPTANK] -tiene el tanque. - -[MPONE] -solo tiene que coger un coche más. - -[MPDEL] -ha entregado un coche. - -[MPGOCAR] -Ve a buscar el coche. - -[MPGOGAR] -Entrega el coche. - -[MPDEST] -Vehículo objetivo destruido. - -[MPLEFT] -ha dejado la partida. - -[MPHPGO2] -~w~Eres el blanco a matar. - -[MPHPKI] -~w~Has matado a un asesino. - -[LOCKON] -Te están apuntando. - -[MPHPGO] -~w~Elimina al señalado. - -[MPTNK] -Métete en el tanque. - -[MRCPU02] -HAS REVENTADO LOS NEUMÁTICOS DE TODOS - -[MRCPU05] -TE HAN REVENTADO LOS NEUMÁTICOS - -[MRCPU06] -~y~Neumáticos adherentes - -[WINNER] -~Y~HAS GANADO. - -[MPDRAW] -~w~EMPATE - -[MPDADDY] -ERES EL PUTO AMO. - -[MPRUN] -GOBIERNAN LAS CALLES. - -[MPBITCH] -¿QUIÉN ES AHORA EL AMO, CAPULLO? - -[FEMP_SM] -Juega a Grand Theft Auto con tus amigos o con frikis desconocidos que pasen por ahí. - -[MPYL] -¡PERDEDOR! - -[MPTMWIN] -SON LOS PUTOS AMOS. - -[GS_SCAR] -VEHÍCULO: - -[GS_MIN] -min. - -[GS_MINS] -min. - -[MPTNKGA] -Ya tienes el tanque, tío duro. - -[MPTNKGB] -Ahora, consérvalo. - -[GS_TYPE] -ESCENARIO: - -[CLILOST] -Se ha perdido la comunicación con los demás jugadores. - -[ONEHPC] -¡Completado el 100 por cien! En Fort Staunton te espera un regalito. - -[MPBLTM] -Los Sindacco - -[MPRDTM] -Los Forelli - -[MTN_1] -Los Sindacco - -[MTN_2] -Los Forelli - -[MPRDCAP] -Coche ha sido capturado - -[MPBLCAP] -Coche ha sido capturado - -[MPRDST] -Coche ha sido robado - -[MPBLST] -Coche ha sido robado - -[MPBLEST] -Coche ha sido robado - -[MPRDRET] -Coche ha sido devuelto - -[MPBLRET] -Coche ha sido devuelto - -[MPRDPOS] -Coche no está en posición - -[MPBLPOS] -Coche no está en posición - -[GS_TEAM] -UNIRSE A: - -[FEMP_TS] -UNIRSE A: - -[MPTEAM] -Banda - -[GS_OA3] -Destruye cuatro limusinas en la base de la banda rival. - -[GS_O4] -Roba el coche de la banda rival y llévalo a tu base. A la vez, protege el coche de tu banda. - -[MPI06] -MIEMBRO BANDA - -[FEMP_ST] -INICIAR PARTIDA (se necesitan 1 o más jugadores por banda) - -[HELP32] -~w~Por una pequeña suma (o gratis si no tienes dinero), te llevará al ~h~lugar de contacto~w~ de la última misión. - -[BENZ_HO] -El ~h~mono~w~ ya está disponible en el piso franco. Vuelve aquí de noche con él para jugar a Slash TV. - -[SLATXT] -~w~Vuelve aquí vestido con el mono entre las 18:00 y las 05:00 para jugar a Slash TV. - -[OUTF_02] -~w~Mono - -[CAN_CON] -~w~Pulsa~h~ ~k~ ~TGSUB~ ~w~de nuevo para cancelar la misión. - -[GNG1] -LEONES - -[GNG2] -TRIADS - -[GNG3] -DIABLOS - -[GNG4] -YAKUZA - -[GNG5] -YARDIES - -[GNG6] -COLOMBIANS - -[GNG7] -HOODS - -[GNG8] -SINDACCOS - -[GNG9] -FORELLIS - -[GNG0] -SICILIANS - -[MP_GNG1] -BANDA 1: - -[MP_GNG2] -BANDA 2: - -[GS_TEMS] -GUERRA DE BANDAS - -[CARS_O] -~w~Capital Autos en Harwood busca nuevos vendedores, por si quieres ganar un dinerillo extra. - -[CARTXT] -~w~Capital Autos solo está abierto entre las 08:00 y las 18:00. Vuelve entonces. - -[GS_TO1] -¡Mata a la banda rival! - -[MPTNEED] -solo necesitan - -[MPTWIN] -win - -[BADTEAM] -A una de las bandas ya no le quedan jugadores. - -[RACELAP] -Vuelta - -[GS_D1] -¡UN CLÁSICO DE LOS JUEGOS! CON USTEDES, EL 'DARWINISMO URBANO'. - -[GS_D2] -¿QUIÉN ES EL MEJOR CONDUCTOR (O TRAMPOSO)? - -[GS_D3] -PROTEGE TUS COCHES DE LOS GRANUJAS Y VÁNDALOS. - -[GS_D4] -ROBA EL COCHE DE LA BANDA RIVAL Y RÍETE EN SU CARA. - -[GS_D5] -¿QUIÉN QUIERE ESTE TANQUECITO? - -[GS_D6] -EL HOMBRE SEÑALADO HA DE SER ELIMINADO. - -[GS_D7] -CAMBIA COCHES POR DINERO. - -[HELP61] -~w~Si el ~h~punto luminoso señala hacia arriba~w~, el ~h~objetivo está por encima de ti~w~. Un ~h~punto luminoso cuadrado~w~ indica que ~h~el blanco está a tu altura~w~. - -[ST_DRWN] -Peces 'alimentados' - -[RACE_T4] -~r~Te han descalificado por no haber encontrado un coche. - -[RACE_T5] -~r~Te han descalificado por no haber encontrado una moto. - -[PCJ600] -PCJ-600 - -[FEC_HBB] -Freno de mano~h~ ~k~ ~VEACC~ ~w~y~h~ ~k~ ~VEBRK~ - -[HJSTAT] -~w~Distancia: ~1~,~1~ m. Altura: ~1~,~1~ m. Vueltas: ~1~ Rotación: ~1~° - -[HJSTATW] -~w~Distancia: ~1~,~1~ m. Altura: ~1~,~1~ m. Vueltas: ~1~ Rotación: ~1~° ¡Y vaya aterrizaje! - -[HJSTATF] -~w~Distancia: ~1~ pies Altura: ~1~ pies Vueltas: ~1~ Rotación: ~1~° - -[HJSTAWF] -~w~Distancia: ~1~ pies Altura: ~1~ pies Vueltas: ~1~ Rotación: ~1~° ¡Y qué estupendo aterrizaje! - -[MPUNLK] -Se ha desbloqueado nuevo contenido multijugador. ¡Dales envidia a los demás jugadores con todas las cositas que has conseguido! - -[MPUNLKA] -Se ha desbloqueado todo el contenido multijugador. ¡Dales envidia a los demás jugadores con todas las cositas que has conseguido! - -[TOUR] -See the Sight Before your Flight - -[NDL1_A] -Noodle Punk - -[PIZ1_A] -Well Snacked Pizza - -[GS_SCUT] -REPR. ESCENA: - -[TR_00] -CARRERA UNO - -[TR_01] -CARRERA DOS - -[TR_02] -CARRERA TRES - -[TR_03] -CARRERA CUATRO - -[TR_04] -CARRERA CINCO - -[TR_05] -CARRERA SEIS - -[TR_06] -CARRERA SIETE - -[TR_07] -CARRERA OCHO - -[CHSE] -PERSECUCIÓN - -[NOCHANG] -No puedes cambiar de ropa durante esta misión. - -[OUTF_12] -Antonio - -[OUTF_13] -Chándal - -[OUTF_14] -Gánster - -[OUTF_15] -Consejero - -[BENZ_AN] -~w~El ~h~traje de Antonio~w~ ya está disponible en el piso franco. - -[BENZ_SW] -~w~El ~h~chándal~w~ ya está disponible en el piso franco. - -[BENZ_GD] -~w~El ~h~traje de gánster~w~ ya está disponible en el piso franco. - -[BENZ_WI] -~w~El ~h~traje de consejero~w~ ya está disponible en el piso franco. - -[RAMPAGE] -DESTRUCCIÓN - -[GS_TTGT] -TIEMPO TANQUE: - -[GS_O5] -Para ganar, sobrevive el máximo posible en el tanque. Provócale daños al tanque para quitárselo a otro jugador. - -[HELP28] -~w~Para lanzar un ~h~explosivo~w~ pulsa~h~ ~k~ ~PDFW~~w~. Cuanto más lo mantengas pulsado más lejos llegará. - -[RATNG53] -Deshonroso - -[RATNG54] -Rata tramposa - -[RATNG55] -Tiburón - -[RATNG56] -Timador - -[RATNG57] -El padrino de la trola - -[RATNG11] -SANGUIJUELA - -[CHASE6] -Liberty Tree Página 2 - -[CHASE7] -Liberty Tree Primera plana - -[AUTOLD] -Cargando desde el Memory Stick™. No extraigas el Memory Stick™ ni apagues el sistema. - -[LDFAIL] -Error al cargar. Los datos guardados están dañados. - -[MEMCHKA] -No hay Memory Stick™. Se necesitan - -[MEMCHKB] -por lo menos para guardar los datos del juego. - -[MEMCHKC] -No hay espacio suficiente libre en el Memory Stick™. Se necesitan - -[MEMCHKD] -por lo menos para guardar los datos del juego. - -[M_FAIL] -¡MISIÓN FRACASADA! - -[M_OVER] -¡MISIÓN FALLIDA! - -[M_PASS] -~Y~¡MISIÓN SUPERADA! ~n~~1~ $ - -[M_PASSN] -~Y~¡MISIÓN SUPERADA! - -[MRACE11] -~w~Vuelve a un vehículo para terminar la carrera. - -[FEI_LE1] -Leyenda - Sí - -[FEI_LE2] -Leyenda - No - -[FEI_TA1] -Objetivo - Sí - -[FEI_TA2] -Objetivo - No - -[C1FREE2] -joystick analógico izquierdo - -[C3FREE2] -joystick analógico izquierdo - -[FEA_MP3] -PISTAS PERSONALIZ.: - -[FEA_NA] -NO DISPONIBLE - -[MPC_060] -Antonio - -[MPC_061] -Chándal - -[MPC_062] -Gánster - -[MPC_063] -Consejero - -[MPC_064] -Kazuki - -[NUMDBL1] -DEBUG 1 (~1~) (~1~) - -[SVRMBRS] -JUGADORES: - -[RAMP_P] -¡DESTRUCCIÓN SUPERADA! - -[RAMP_F] -¡DESTRUCCIÓN FRACASADA! - -[MPWLPAC] -ha recogido un coche objetivo. - -[MPWLDAC] -ha entregado un coche objetivo. - -[LDWAIT] -Pulsa ~X~ para continuar. - -[LOADING] -Cargando, espera... - -[RACEP1] -1° - -[RACEP2] -2° - -[RACEP3] -3° - -[RACEP4] -4° - -[RACEP5] -5° - -[RACEP6] -6° - -[FEA_UT] -Pista desconocida - -[LOADIN2] -Cargando... - -[DNH5_X2] -~r~No has activado todas las bombas. - -[MRACE12] -TIENES - -[MRACE13] -S. PARA ENCONTRAR UN VEHÍCULO - -[MRACE14] -S. PARA ENCONTRAR UN VEHÍCULO - -[DTB_03] -~w~Ganará el equipo que defienda más tiempo sus coches. - -[PUPCOL] -ha recogido una mejora. - -[TNKCSE] -Provócale daños al tanque para quitárselo a otro jugador. - -[TNKTM] -Para ganar, sobrevive el máximo posible en el tanque. - -[MPFAIL] -FRACASO - -[GS_LOC2] -LUGAR: - -[DTBSWPA] -Has rechazado a los Sindacco durante - -[DTBSWPB] -Ahora, destroza sus coches en menos tiempo. - -[DTBSWPC] -Has destrozado los coches de los Forelli en - -[DTBSWPD] -Ahora, protege tus vehículos durante más tiempo. - -[CHANOP] -Cambiar opciones - -[MPSSCT] -DINERO A OBTENER: - -[F_RANG2] -~r~La radio del coche de bomberos no funciona en el metro. - -[T_RANG2] -~r~En el metro no hay basura que recoger. - -[T_RANGE] -~r~Aquí no hay basura que recoger. - -[FEU_YES] -SÍ - -[FEU_NO] -NO - -[HELP43] -~w~Si usas el freno de mano podrás girar la embarcación con más rapidez. - -[RACE_T6] -~r~Uno de los vehículos ha quedado destrozado - se ha cancelado la carrera. - -[FED_POS] -POSICIÓN DE LA PANTALLA - -[FES_DSS] -Selecciona partida guardada para borrar: - -[FES_LSS] -Selecciona partida guardada para cargar: - -[FES_DSC] -Éxito al borrar. Selecciona ACEPTAR para continuar. - -[FES_DGM] -BORRAR PARTIDA - -[ITBEG] -Al principio... - -[FET_LG] -CARGAR PARTIDA - -[FES_SCG] -¿Deseas guardar la partida? - -[FESZ_QZ] -¿Seguro que quieres guardar la partida? - -[FES_SSC] -Éxito al guardar. Selecciona ACEPTAR para continuar. - -[FEM_NTF] -La memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1 no tiene formato. - -[FES_CFM] -Formateando la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1. No extraigas la memory card (8MB) (para PlayStation®2) ni el mando. No reinicies ni apagues la consola. - -[FES_LOQ] -¡Error al cargar! La partida guardada en la memory card (8MB) (para PlayStation®2) no es compatible con este juego. Intenta cargar una partida guardada diferente. El juego va a reiniciarse. - -[FEM_NTH] -No hay memory card (8MB) (para PlayStation®2) en la ranura para MEMORY CARD 1. - -[FES_CMP] -¡Error al guardar! Comprueba la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1 e inténtalo de nuevo. - -[FESZ_FO] -La memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1 no tiene formato. ¿Deseas formatearla ahora? - -[FES_NOC] -No hay memory card (8MB) (para PlayStation®2) en la ranura para MEMORY CARD 1. - -[FES_LOE] -¡Error al cargar! Comprueba la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1 e inténtalo de nuevo. El juego va a reiniciarse. - -[FES_DEE] -¡Fallo al borrar! Comprueba la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1 e inténtalo de nuevo. - -[SLONFM] -¡Error al formatear! Comprueba la memory card (8MB) (para PlayStation®2) en la ranura para MEMORY CARD 1 e inténtalo de nuevo. - -[SLONDR] -No hay espacio suficiente libre en la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1. Si deseas guardar datos del juego, inserta una memory card (8MB) (para PlayStation®2) con al menos 330 KB de espacio libre en la ranura para MEMORY CARD 1. - -[SLNSP] -No hay espacio suficiente libre en la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1. Se necesitan al menos 101 KB adicionales de espacio libre en la memory card (8MB) (para PlayStation®2) en la ranura para MEMORY CARD 1 para guardar datos del juego. - -[SLONNF] -La memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1 no tiene formato. ¿Deseas formatearla ahora? - -[FESZ_FF] -¡Error al formatear! Comprueba la memory card (8MB) (para PlayStation®2) en la ranura para MEMORY CARD 1 e inténtalo de nuevo. - -[MCDNSP] -No hay memory card (8MB) (para PlayStation®2) en la ranura para MEMORY CARD 1. Si deseas guardar datos del juego, inserta una memory card (8MB) (para PlayStation®2) en la ranura para MEMORY CARD 1 con al menos 330 KB de espacio libre. ¿Deseas empezar el juego de todos modos? - -[MCGNDP] -No hay espacio suficiente libre en la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1. Se necesitan al menos 330 KB de espacio libre para guardar datos del juego. ¿Deseas empezar el juego de todos modos? - -[MCGNSP] -No hay espacio suficiente libre en la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1. Se necesitan al menos 101 KB adicionales de espacio libre para guardar datos del juego. ¿Deseas empezar el juego de todos modos? - -[FESZ_WR] -Guardando datos. No extraigas la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1, ni el mando. No reinicies ni apagues la consola. - -[FELD_WR] -Cargando datos. No extraigas la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1, ni el mando. No reinicies ni apagues la consola. - -[FEDL_WR] -Borrando datos. No extraigas la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1, ni el mando. No reinicies ni apagues la consola. - -[C0VEWEA] -joystick analógico derecho - -[C1VEWEA] -joystick analógico derecho - -[C2VEWEA] -joystick analógico derecho - -[C3VEWEA] -botones de dirección - -[C0PDLOO] -joystick analógico derecho - -[C1PDLOO] -joystick analógico derecho - -[C2PDLOO] -joystick analógico derecho - -[C3PDLOO] -joystick analógico derecho - -[C0AMMOV] -joystick analógico izquierdo o botones de dirección - -[C1AMMOV] -joystick analógico izquierdo o botones de dirección - -[C2AMMOV] -joystick analógico izquierdo o botones de dirección - -[C3AMMOV] -joystick analógico izquierdo o botones de dirección - -[FEC_ACB] -Acelerar/Frenar - -[FES_SAV] -GUARDAR PARTIDA - -[FES_FMS] -Éxito al formatear. - -[MCDNCK] -Comprobando la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1. No extraigas la memory card (8MB) (para PlayStation®2) ni el mando. No reinicies ni apagues la consola. - -[FESZ_QC] -¿Sobrescribir esta partida guardada dañada? - -[NOCONT] -Conecta un control analógico (DUALSHOCK®) o un control analógico (DUALSHOCK®2) al puerto de control 1 para continuar. - -[FES_LCF] -¡Error al cargar! Comprueba la memory card (8MB) (para PlayStation®2) de la ranura para MEMORY CARD 1 e inténtalo de nuevo. - -[DBGHELP] -~h~DEBUG MENU~w~ Select Item with ~h~left button & right button. ~w~Press ~h~X button ~w~to launch. Press ~h~TRIANGLE button ~w~to quit menu. - -[DBGSEL1] -Level Skip Menu - -[DBGSEL2] -Car Viewer - -[DBGSEL3] -Character Viewer - -[DBGSEL4] -Building Viewer - -[DBGSEL5] -Weapon Cheat - -[DBGSEL6] -Player Cheat - -[DBGSEL7] -Weather and Time Changer - -[DBGSEL8] -Marketing Camera - -[DBGSEL9] -MoCap Menu - -[DBGSE10] -USJ Editor - -[DBGSE11] -Toggle Player Coordinates - -[DBGFIL0] -Ped Selector - -[DBGFIL1] -Car Selector - -[PLCHLD] -Placeholder: mission will complete in 5 seconds - -[PLCHLD2] -Placeholder Cutscene - -[PLCHLD3] -Placeholder (MOCAP) Cutscene - -[LS_MAC] -Ma Cipriani stream - -[LS_JDT] -J.D. O'Toole stream - -[LS_SAL] -Salvatore stream - -[LS_COMP] -Completed all Missions in this stream - -[TEMP1] -Number: ~1~ - -[LS2_H1] -Use ~h~analog up & down ~w~to select story stream. Use ~h~analog left & right ~w~to select mission. Use ~h~L button & R button ~w~to select an island. Press ~h~X button ~w~to start mission. Press ~h~TRIANGLE button ~w~to exit. - -[LS2_H2] -You cannot use levelskip when you are ~h~on a mission. - -[LS2_VIC] -~y~Vincenzo Cilli -~g~ ~a~ - -[LS2_MAC] -~y~Ma Cipriani -~g~ ~a~ - -[LS2_JDT] -~y~J.D. O'Toole -~g~ ~a~ - -[LS2_SAL] -~y~Salvatore -~g~ ~a~ - -[LS2_MAR] -~y~Maria -~g~ ~a~ - -[LS2_NED] -~y~Ned Burner -~g~ ~a~ - -[LS2_DON] -~y~Donald Love -~g~ ~a~ - -[LS2_RAY] -~y~Ray Machowski -~g~ ~a~ - -[LS2_TOS] -~y~Toshiko Kasen -~g~ ~a~ - -[FREEON] -Time Frozen - -[FREEOFF] -Time Unfrozen - -[WTC_INS] -Use ~h~analog up & down ~w~to change weather. Use ~h~analog left & right ~w~to change hour. Press ~h~TRIANGLE button ~w~to exit. Press ~h~SQUARE button ~w~to freeze time. - -[WTC_TIM] -TIME: ~1~:00 - -[WTC_WE0] -WEATHER: CLOUDY - -[WTC_WE1] -WEATHER: EXTRA COLOURS - -[WTC_WE2] -WEATHER: EXTRA SUNNY - -[WTC_WE3] -WEATHER: FOGGY - -[WTC_WE4] -WEATHER: HURRICANE - -[WTC_WE5] -WEATHER: RAINY - -[WTC_WE6] -WEATHER: SNOW - -[WTC_WE7] -WEATHER: SUNNY - -[CVHELP] -Use ~h~up button and down button ~w~to change character. Use ~h~left button and right button ~w~to rotate camera. HOLD ~h~SQUARE ~w~to zoom in (toggles upper and lower body). Press ~h~TRIANGLE ~w~to quit character viewer. - -[VMENU1] ---------- Select a Viewer --------- --- ~h~Car~w~ - Character - Building -- - -[VMENU2] ---------- Select a Viewer --------- --- Car - ~h~Character~w~ - Building -- - -[VMENU3] ---------- Select a Viewer --------- --- Car - Character - ~h~Building~w~ -- - -[CV_C] -COMPARISON MODEL - -[CV_0] -ROW: -- MODEL: player - -[CV_1] -ROW: 114 MODEL: cop - -[CV_2] -ROW: 115 MODEL: swat - -[CV_3] -ROW: 116 MODEL: fbi - -[CV_4] -ROW: 117 MODEL: army - -[CV_5] -ROW: 118 MODEL: medic - -[CV_6] -ROW: 119 MODEL: fireman - -[CV_7] -ROW: 71 MODEL: male01 - -[CV_9] -ROW: 120 MODEL: taxi_d - -[CV_10] -ROW: 2 MODEL: pimp - -[CV_11] -ROW: 13 MODEL: criminal01 - -[CV_12] -ROW: 14 MODEL: criminal02 - -[CV_13] -ROW: 15 MODEL: male02 - -[CV_14] -ROW: 16 MODEL: male03 - -[CV_15] -ROW: 121 MODEL: fatmale01 - -[CV_16] -ROW: 17 MODEL: fatmale02 - -[CV_17] -ROW: 18 MODEL: female01 - -[CV_18] -ROW: 19 MODEL: female02 - -[CV_19] -ROW: 20 MODEL: female03 - -[CV_20] -ROW: 21 MODEL: fatfemale01 - -[CV_21] -ROW: 22 MODEL: fatfemale02 - -[CV_22] -ROW: 23 MODEL: prostitute - -[CV_23] -ROW: 24 MODEL: prostitute2 - -[CV_24] -ROW: 25 MODEL: p_man1 - -[CV_25] -ROW: 26 MODEL: p_man2 - -[CV_26] -ROW: 27 MODEL: p_wom1 - -[CV_27] -ROW: 28 MODEL: p_wom2 - -[CV_28] -ROW: 29 MODEL: ct_man1 - -[CV_29] -ROW: 30 MODEL: ct_man2 - -[CV_30] -ROW: 31 MODEL: ct_wom1 - -[CV_31] -ROW: 32 MODEL: ct_wom2 - -[CV_32] -ROW: 33 MODEL: li_man1 - -[CV_33] -ROW: 34 MODEL: li_man2 - -[CV_34] -ROW: 35 MODEL: li_wom1 - -[CV_35] -ROW: 36 MODEL: li_wom2 - -[CV_36] -ROW: 37 MODEL: docker1 - -[CV_37] -ROW: 38 MODEL: docker2 - -[CV_38] -ROW: 39 MODEL: scum_man - -[CV_39] -ROW: 40 MODEL: scum_wom - -[CV_40] -ROW: 41 MODEL: worker1 - -[CV_41] -ROW: 42 MODEL: worker2 - -[CV_42] -ROW: 43 MODEL: b_man1 - -[CV_43] -ROW: 44 MODEL: b_man2 - -[CV_44] -ROW: 67 MODEL: b_man3 - -[CV_45] -ROW: 45 MODEL: b_wom1 - -[CV_46] -ROW: 46 MODEL: b_wom2 - -[CV_47] -ROW: 70 MODEL: b_wom3 - -[CV_48] -ROW: 47 MODEL: mod_man - -[CV_49] -ROW: 48 MODEL: mod_wom - -[CV_50] -ROW: 49 MODEL: st_man - -[CV_51] -ROW: 50 MODEL: st_wom - -[CV_52] -ROW: 51 MODEL: fan_man1 - -[CV_53] -ROW: 52 MODEL: fan_man2 - -[CV_54] -ROW: 53 MODEL: fan_wom - -[CV_55] -ROW: 54 MODEL: hos_man - -[CV_56] -ROW: 55 MODEL: hos_wom - -[CV_57] -ROW: 56 MODEL: const1 - -[CV_58] -ROW: 57 MODEL: const2 - -[CV_59] -ROW: 58 MODEL: shopper1 - -[CV_60] -ROW: 59 MODEL: shopper2 - -[CV_61] -ROW: 60 MODEL: shopper3 - -[CV_62] -ROW: 61 MODEL: stud_man - -[CV_63] -ROW: 62 MODEL: stud_wom - -[CV_64] -ROW: 63 MODEL: cas_man - -[CV_65] -ROW: 64 MODEL: cas_wom - -[CV_79] -ROW: 123 MODEL: gang01 LEONE_A - -[CV_80] -ROW: 124 MODEL: gang02 LEONE_B - -[CV_81] -ROW: 69 MODEL: gang03 TRIAD_A - -[CV_82] -ROW: 3 MODEL: gang04 TRIAD_B - -[CV_83] -ROW: 4 MODEL: gang05 DIABLO_A - -[CV_84] -ROW: 5 MODEL: gang06 DIABLO_B - -[CV_85] -ROW: 68 MODEL: gang07 YAKUZA_A - -[CV_86] -ROW: 6 MODEL: gang08 YAKUZA_B - -[CV_87] -ROW: 7 MODEL: gang09 YARDIE_A - -[CV_88] -ROW: 8 MODEL: gang10 YARDIE_B - -[CV_89] -ROW: 9 MODEL: gang11 COLOMBIAN_A - -[CV_90] -ROW: 10 MODEL: gang12 COLOMBIAN_B - -[CV_91] -ROW: 11 MODEL: gang13 HOOD_A - -[CV_92] -ROW: 12 MODEL: gang14 HOOD_B - -[CV_93] -ROW: 89 MODEL: gang15 Forelli thug1 - -[CV_94] -ROW: 90 MODEL: gang16 Forelli thug2 - -[CV_95] -ROW: 88 MODEL: gang17 Sindacco thug1 - -[CV_96] -ROW: 89 MODEL: gang18 Sindacco thug2 - -[CV_109] -ROW: 65 MODEL: SAL_01 Salvatore (Mob Don) - -[CV_110] -ROW: 66 MODEL: RAY_01 Ray (Bad Cop) - -[CV_111] -ROW: 72 MODEL: VINC_01 Vincenzo Cilli - -[CV_112] -ROW: 73 MODEL: GRDANG1 Avenging Angel - -[CV_113] -ROW: 74 MODEL: NED_01 Ned Burner (Reporter) - -[CV_114] -ROW: 75 MODEL: MASTOR Massimo Torrini (Assassin) - -[CV_115] -ROW: 76 MODEL: TOOL_01 JD O'Toole - -[CV_116] -ROW: 77 MODEL: Not used Fthr Kenny - -[CV_117] -ROW: 78 MODEL: GRDANG2 Avenging Angel 2 - -[CV_118] -ROW: 79 MODEL: M_HOLE Mayor RC Hole - -[CV_119] -ROW: 80 MODEL: FRANFOR Franco Forelli - -[CV_120] -ROW: 81 MODEL: KAZUKI Kazuki Kasen - -[CV_121] -ROW: 82 MODEL: PAULIE Paulie Sindacco - -[CV_122] -ROW: 83 MODEL: HOPPER Jane Hopper - -[CV_123] -ROW: 84 MODEL: AVERY Avery Carrington - -[CV_124] -ROW: 85 MODEL: CASA Giovanni Casa - -[CV_125] -ROW: 86 MODEL: BABY Giovanni Casa (baby) - -[CV_126] -ROW: 87 MODEL: MCAFFRY Det. Leon McAffrey - -[CV_127] -ROW: 92 MODEL: EIGHT 8Ball - -[CV_128] -ROW: 93 MODEL: MAR_01 Maria - -[CV_129] -ROW: 94 MODEL: LOVE_01 Donald Love - -[CV_130] -ROW: 95 MODEL: MICKEYH Mickey H - -[CV_131] -ROW: 96 MODEL: WAYNE Wayne (Biker Dude) - -[CV_132] -ROW: 97 MODEL: BIKER1 Biker Dude 1 - -[CV_133] -ROW: 98 MODEL: BIKER2 Biker Dude 2 - -[CV_134] -ROW: 99 MODEL: DONOVAN O'Donovan - -[CV_135] -ROW: 100 MODEL: KAS_01 Toshiko Kasen (kimono) - -[CV_136] -ROW: 101 MODEL: WKAS_01 Toshiko Kasen (western) - -[CV_137] -ROW: 104 MODEL: JDMADE JD O'Toole - Made Man - -[CV_138] -ROW: 106 MODEL: THUG_01 Sicilian Thug 1 - -[CV_139] -ROW: 107 MODEL: THUG_02 Sicilian Thug 2 - -[CV_140] -ROW: 109 MODEL: CAMP_MAN Campaign Worker - -[CV_141] -ROW: 110 MODEL: CAMP_WOM Campaign Worker 2 - -[CV_142] -ROW: 111 MODEL: MIGUEL Miguel - -[CV_143] -ROW: 112 MODEL: DELIASS Deli Assistant - -[CV_144] -ROW: 113 MODEL: HOBO_01 Donald Love 2 - -[CV_68] -ROW: 122 MODEL: HITMAN Hitman - -[CV_146] -ROW: 125 MODEL: HOLEJOG Mayor RC Hole (Jogging outfit) - -[CV_147] -ROW: 126 MODEL: Chauff Chauffeur - -[CV_148] -ROW: 128 MODEL: plr2 (Lawyer) - -[CV_149] -ROW: 129 MODEL: plr3 (Travel clothes) - -[CV_150] -ROW: 130 MODEL: plr4 (Chauffeur) - -[CV_151] -ROW: 131 MODEL: plr5 (Hockey mask) - -[CV_152] -ROW: 132 MODEL: plr6 (Tuxedo) - -[CV_153] -ROW: 133 MODEL: plr7 (Avenging Angel) - -[CV_154] -ROW: 134 MODEL: plr8 (The King of Rock'n Roll) - -[CV_155] -ROW: 135 MODEL: plr9 (Cock's Mascot) - -[CV_156] -ROW: 136 MODEL: plr10 (Boxer Shorts) - -[CV_157] -ROW: 137 MODEL: plr11 (Bad Super Hero) - -[CV_158] -ROW: 138 MODEL: plr12 (Dragon) - -[CV_159] -ROW: 139 MODEL: PHILC Phil Cassidy - -[CV_160] -ROW: 140 MODEL: GREASE Grease Zuko - -[CV_161] -ROW: 141 MODEL: GUN_ASS Gun assistant - -[CV_162] -ROW: -- MODEL: JD_shot JD shot dead - -[CV_163] -ROW: -- MODEL: BODYBAG bodybag - -[CV_164] -ROW: 142 MODEL: SAL_CON Sal Convict - -[VV_131] -ID:131 MODEL: Landstalker (TBC) - -[VV_135] -ID:135 MODEL: Perenial (TBC) - -[VV_138] -ID:138 MODEL: Firetruck - -[VV_141] -ID:141 MODEL: Manana (TBC) - -[VV_148] -ID:148 MODEL: FBI Car (TBC) - -[VV_152] -ID:152 MODEL: Kuruma (TBC) - -[VV_164] -ID:164 MODEL: Dodo (TBC) - -[VV_169] -ID:169 MODELL: Rc Bandit - -[VV_170] -ID:170 MODEL: BellyUp (Triad) (TBC) - -[VV_172] -ID:172 MODEL: Leone Sentinel (TBC) - -[VV_174] -ID: 174 MODEL: Yakuza (TBC) - -[VV_179] -ID:179 MODEL: Flatbed (TBC) - -[VV_181] -ID:181 MODEL: Borgnine Taxi (TBC) - -[VV_188] -ID: 188 MODEL: Sindacco Argento (TBC) - -[VV_189] -ID: 189 MODEL: Forelli Lexcess (TBC) - -[VV_192] -ID:192 MODEL: Speeder (TBC) - -[BV_H1] -Press CIRCLE to swap building model. - -[BV_0A] -ROW: 2 - Portland. Safehouse Exterior. Press CIRCLE to swap. - -[BV_0B] -ROW:24 - Portland. Safehouse Interior. Press CIRCLE to swap. - -[BV_1] -ROW: 3 - Portland. Ferry Terminal. - -[BV_2A] -ROW: 4 - Portland. Callahan Bridge 1. Press CIRCLE to swap. - -[BV_2B] -ROW: 4 - Portland. Callahan Bridge 2. Press CIRCLE to swap. - -[BV_3] -ROW: 5 - Portland. Les Cargo Freighter. - -[BV_4A] -ROW: 6 - Portland. Doll's House Brothel 1. Press CIRCLE to swap. - -[BV_4B] -ROW: 6 - Portland. Doll's House Brothel 2. Press CIRCLE to swap. - -[BV_5] -ROW: 7 - Portland. Tower Block. - -[BV_6] -ROW: 8 - Portland. Eddie's Garage. - -[BV_7] -ROW: 9 - Portland. Bowler's Fist Pub. - -[BV_8] -ROW:10 - Portland. Hepburn Heights. - -[BV_9] -ROW:11 - Portland. Short Stay Hotel. - -[BV_10] -ROW:12 - Portland. Car Dealership. - -[BV_11] -ROW:13 - Portland. Bus Graveyard. - -[BV_12A] -ROW:14 - Portland. Drugs Warehouse 1 (awaiting approval). Press CIRCLE to swap. - -[BV_12B] -ROW:14 - Portland. Drugs Warehouse 2 (awaiting approval). Press CIRCLE to swap. - -[BV_13] -ROW:15 - Portland. Ma Cipriani's Restaurant. - -[BV_14] -ROW:17 - Portland. Basketball Court, Callahan. - -[BV_15] -ROW:18 - Portland. Bike Shop. - -[BV_16] -ROW:19 - Portland. Building near Basketball Court. - -[BV_17A] -ROW:20 - Portland. Luigi's Nightclub 1. - -[BV_17B] -ROW:20 - Portland. Luigi's Nightclub 2. - -[BV_17C] -ROW:20 - Portland. Luigi's Nightclub 3. - -[BV_18] -ROW:21 - Portland. Casa's Gourmet Deli. - -[BV_19] -ROW:22 - Portland. Rusty Ship. - -[BV_20] -ROW:23 - Portland. Door for Shopfront. - -[BV_21] -ROW:25 - Staunton. Casino. - -[BV_22] -ROW:26 - Staunton. Phil Cassidy's Store. - -[BV_23] -ROW:27 - Staunton. Zip store. - -[BV_24] -ROW:28 - Staunton. Container Park. - -[BV_25] -ROW:29 - Staunton. Ferry Terminal. - -[BV_26A] -ROW:30 - Staunton. Fort Staunton 1 NORTH. - -[BV_26B] -ROW:30 - Staunton. Fort Staunton 2 NORTH. - -[BV_27A] -ROW:30 - Staunton. Fort Staunton 1 SOUTH. - -[BV_27B] -ROW:30 - Staunton. Fort Staunton 2 SOUTH. - -[BV_28] -ROW:31 - Ferry - Not Visible At Present. - -[BV_29A] -ROW:32 - Staunton. Safehouse Exterior (unchanged). Press CIRCLE to swap. - -[BV_29B] -ROW:32 - Staunton. Safehouse Interior. Press CIRCLE to swap. - -[BV_30] -ROW:33 - Staunton. Steps Added To Building. - -[BV_31] -ROW:34 - Portland. Outbuilding. - -[BV_32A] -ROW:34 - Shoreside. Safehouse Exterior (unchanged). Press CIRCLE to swap. - -[BV_32B] -ROW:34 - Shoreside. Safehouse Interior. Press CIRCLE to swap. - -[BV_33] -Not in Doc - Staunton - Warehouse Interior (not internally approved). - -[BV_34A] -Not in Doc - Staunton - Church Exterior. Press CIRCLE to swap. - -[BV_34B] -Not in Doc - Staunton - Church Interior for scripted cutscene. Press CIRCLE to swap. - -[MODWOR] -Modify World Speed - -[MODTIT] -Changing World Speed - -[NEDS2] -The Passion Of The Heist - -[NEDS3] -Karmageddon - -[NEDS4] -False Idols - -[DONS1] -The Morgue Party Candidate - -[GAR_WIL] -Mete el coche en el garaje. - -[DONS2] -Steering The Vote - -[DONS3] -Cam-Pain - -[DONS4] -Friggin' The Riggin' - -[DONS5] -Love & Bullets - -[DONS6] -Counterfeit Count - -[DONS7] -Love On The Rocks - -[DONS7AA] -¡Toni, tienes que ayudarme! - -[DONS7AB] -O'Donovan tiene pruebas que me relacionan con Salvatore, ¡es el fin! - -[DONS7AC] -Tranquilo, todos los días desaparecen pruebas. - -[DONS7AD] -Por no mencionar jueces, testigos y miembros del jurado... - -[DONS7AE] -Esperaba que lo vieras así. - -[DONS7AF] -Uno de mis hombres ha seguido al tipo que tiene las pruebas. - -[DONS7AG] -Os veréis en el paso elevado de Newport. - -[SALS1] -A Walk In The Park - -[SALS2] -Making Toni - -[SALS3] -Caught In The Act - -[SALS4] -Search And Rescue - -[SALS5] -Taking The Peace - -[SALS6] -Shoot The Messenger - -[RAYS1] -Sayonara Sindaccos - -[RAYS2] -The Whole 9 Yardies - -[RAYS3] -Crazy '69' - -[RAYS4] -Night Of The Livid Dreads - -[RAYS5] -Munitions Dump - -[MC_01] -MOCAP Scenes - -[MC_02] -You cannot be on a mission when using the cutscene selector. - -[MC_04] -Select the scene you want and press CROSS. Press TRIANGLE to exit. - -[MC_03] -~g~scene name - script name~w~ - -[MC_S01] -1. Biker - mar4 - -[MC_S02] -2. Bonevoy - jdt1 - -[MC_S03] -3. Campain - dons3 - -[MC_S04] -4. Cashchp - tosh4 - -[MC_S05] -5. Contban - sal5 - -[MC_S06] -6. Crazy69 - rays3 - -[MC_S07] -7. Cuttest - none - -[MC_S08] -8. Deadly - tosh1 - -[MC_S09] -9. Donprob - donh6 - -[MC_S10] -10. Drivnmr - sal8 - -[MC_S11] -11. Electon - dons7 - -[MC_S12] -12. Homswet - vic1 - -[MC_S13] -13. Hotwhel - vic6 - -[MC_S14] -14. Kidnapp - jdt5 - -[MC_S15] -15. Landgrb - donh1 - -[MC_S16] -16. Morgue - dons1 - -[MC_S17] -17. Overdos - mar5 - -[MC_S18] -18. Rufjust - salh1 - -[MC_S19] -19. Sayonar - rays1 - -[MC_S20] -20. sicilan - salh5 - -[MC_S21] -21. Theofer - sal1 - -[MC_S22] -22. Intro - -[MC_S23] -23. Final - -[MC_S24] -24. Final_2 - -[NEDS1] -L.C. Confidential - -[WILGAR2] -Deja el coche y sal afuera. - -{=================================== MISSION TABLE SAL1 ===================================} - -[SAL1_M1:SAL1] -~w~Salvatore quiere hablar. - -[SAL1_M2:SAL1] -~w~Yo no le sigo el juego a Salvatore. - -[SAL1_M3:SAL1] -~w~Gracias por el donativo, chico... Nos vemos. - -[SAL1_M5:SAL1] -~w~¡Eh! - -[SAL1_D1:SAL1] -~w~¡Eh! ¡Esquirol! - -[SAL1_D2:SAL1] -~w~¡A por él! - -[SAL1_D3:SAL1] -~w~¡Ahí está! - -[SAL1_D4:SAL1] -~w~¡Va por allí! - -[SAL1_E1:SAL1] -~w~¡Escapa de los muelles! - -[SAL1_A1:SAL1] -~w~Reúnete con la líder sindical, Jane Hopper, en los ~y~muelles de Portland~w~. - -[THEO_01:SAL1] -Eh, jefe, ¿está bien? - -[THEO_02:SAL1] -¿A ti te lo parece? - -[THEO_03:SAL1] -No. - -[THEO_04:SAL1] -Entonces ¿por qué preguntas, capullo? - -[THEO_05:SAL1] -Siempre estás diciendo obviedades. - -[THEO_06:SAL1] -No puedo creer que esté rodeado de gente como tú. - -[THEO_07:SAL1] -Perdón. - -[THEO_08:SAL1] -Mira, lo siento. Toni, eres uno de mis aliados de más confianza. - -[THEO_09:SAL1] -Después de lo que has hecho, eres más que un hijo. Mejor que mi hijo, - -[THEO_10:SAL1] -mejor que cualquier hijo. - -[THEO_11:SAL1] -Tu madre tiene mucha suerte. - -[THEO_12:SAL1] -Eso me dicen. - -[THEO_13:SAL1] -Anthony, estamos acabados. - -[THEO_14:SAL1] -Somos como los dinos pepinos esos... o como se llamen. - -[THEO_15:SAL1] -Mira, hasta en mi propia familia me siento como Jesús rodeado de doce Judas. - -[THEO_16:SAL1] -Escucha, para que veas. - -[THEO_17:SAL1] -Hay una líder sindical -sí, una tía- que necesito que me haga un favor. - -[THEO_18:SAL1] -¿Y qué me pide? Dinero... - -[THEO_19:SAL1] -Solo quiero acceso permanente a los muelles mientras sigan las huelgas, - -[THEO_20:SAL1] -que yo ayudé a organizar, para que los chicos descarguen algunas drogas, - -[THEO_21:SAL1] -¡y ahora me sale con esta mierda! - -[THEO_22:SAL1] -Mira, son gente por la que me he dejado la piel, - -[THEO_23:SAL1] -por la que he matado, gente honrada. - -[THEO_26:SAL1] -Es una desgracia. Los hombres de honor como tú y yo estamos acabados. - -[THEO_27:SAL1] -Escucha, Toni, quiero que le lleves algo. - -[THEO_28:SAL1] -¿Le va a tolerar esto a una mujer? - -[THEO_29:SAL1] -¿Qué remedio me queda de momento? - -[THEO_30:SAL1] -Mira, vas allí, le pagas y le dices que me gustaría tener una charla con ella. - -[THEO_31:SAL1] -Venga. - -[THEO_24:SAL1] -- ¿Y así me lo pagan? ~n~ - Es un insulto. - -{=================================== MISSION TABLE SAL2 ===================================} - -[SAL2_N:SAL2] -Chicas - -[SAL2_A0:SAL2] -~w~¿Uno de tus nuevos cachorritos, Sal? - -[SAL2_A1:SAL2] -~w~¿Sr. Leone? - -[SAL2_A2:SAL2] -~w~¡Toni! ¿Come stai? - -[SAL2_A3:SAL2] -~w~Encantado de verte. Quiero que hagas algo por mí... - -[SAL2_A4:SAL2] -~w~Si no puedo tener a esa puta líder sindical de mi lado, por mi madre que me meto en el bolsillo a sus chicos. ¿Capisci? - -[SAL2_A:SAL2] -~w~Recoge a seis ~b~putas~w~ y llévalas al piquete de los muelles de Portland. - -[SAL2_B0:SAL2] -~w~¡Mira encanto, no me gusta eso de los tríos! - -[SAL2_B1:SAL2] -~w~¡Cuando tengas más sitio, hablamos de follar! ¡No me subo a un descapotable, chato! - -[SAL2_D0:SAL2] -~w~¿Estás solito, bombón? - -[SAL2_D1:SAL2] -~w~¡Eh, guapetón! ¿Quieres divertirte un poco? - -[SAL2_D2:SAL2] -~w~Cariño... ¡Vamos a montar una fiesta tú y yo! - -[SAL2_D3:SAL2] -~w~¿Dónde es la fiesta, corazón? - -[SAL2_D4:SAL2] -~w~¡Eh, tete! ¿Pasamos un buen rato? - -[SAL2_D5:SAL2] -~w~Tú eres la sal... Y yo la pimienta. - -[SAL2_F0:SAL2] -~w~¡Eh! ¡Yo también voy! - -[SAL2_F1:SAL2] -~w~Así que solos tú y yo, ¿eh? - -[SAL2_F2:SAL2] -~w~¿Hace un ñiqui ñiqui o qué? - -[SAL2_F3:SAL2] -~w~Eh, ¿dónde es la fiesta? - -[SAL2_F4:SAL2] -~w~¡Ay, bueno! No te pongas así. - -[SAL2_F5:SAL2] -~w~¡Solo quiero una fiestecita contigo! - -[SAL2_G0:SAL2] -~w~Llévala al ~y~piquete~w~. - -[SAL2_G1:SAL2] -~w~Lleva a las chicas al ~y~piquete~w~. - -[SAL2_G2:SAL2] -~w~Encárgate del ~r~cliente~w~. - -[SAL2_G3:SAL2] -~w~Encárgate de los ~r~clientes~w~. - -[SAL2_G4:SAL2] -~w~¡Recoge a más ~b~chicas~w~! - -[SAL2_H:SAL2] -~w~¿Dónde es la fiesta, corazón? - -[SAL2_P:SAL2] -~w~¡Divertíos, chicos! Cortesía de Salvatore Leone... - -[SAL2_I0:SAL2] -~w~¡Búscate otra chica, caraculo! ¡Ésta es mía! - -[SAL2_I1:SAL2] -~w~¡Eh! ¿Es que eres un mirón o qué? - -[SAL2_I3:SAL2] -~w~¡Eh! ¿Quién diablos es ése? ¡A por él! - -[SAL2_I5:SAL2] -~w~¡Eh, colega! ¡A la cola! Nosotros vamos primero. - -[SAL2_I7:SAL2] -~w~¡Eres el mejor! ¡No pares...! ¡Ay, sí, cariño! - -[SAL2_I9:SAL2] -~w~Pues ponte a trabajar... - -[SAL2_K0:SAL2] -~w~¡No se juega con Toni Cipriani! - -[SAL2_K1:SAL2] -~w~Venga. Vámonos. - -[SAL2_K2:SAL2] -~w~¡Vamos, tía! ¡Mueve el pandero! - -[SAL2_C0:SAL2] -~w~¡Eh! ¡Vuelve, cielo! Que no muerdo... - -[SAL2_C1:SAL2] -~w~¡Eh, chico! ¿Adónde vas? - -[SAL2_L0:SAL2] -~w~No voy a tirarme aquí todo el día, capullo. - -[SAL2_L1:SAL2] -~w~Voy a poner el taxímetro en marcha. - -[SAL2_X0:SAL2] -~r~¡Se acabó el tiempo! - -[SAL2_X1:SAL2] -~r~¡Has matado a demasiadas putas! - -[SAL2_X2:SAL2] -~r~Has atacado a los estibadores. ¡Ahora no se fiarán de ti! - -[SAL2_X3:SAL2] -~r~Has atacado a las chicas de los estibadores. ¡Ahora no se fiarán de ti! - -[SAL2_G5:SAL2] -~w~Parece que te ha salido un admirador. - -[SAL2_I8:SAL2] -~w~No querrás ir a la cárcel, ¿verdad, encanto? - -[SAL2_I6:SAL2] -~w~¡Sí! ¡Sí...! - -[SAL2_M:SAL2] -~w~¡Intenta no matarlas! Busca a otra ~b~chica~w~. - -[SAL2_W1:SAL2] -~w~¡Solo tienes hasta las 0~1~:~1~ antes de que el piquete cambie de turno! - -[SAL2_W2:SAL2] -~w~¡Solo tienes hasta las ~1~:~1~ antes de que el piquete cambie de turno! - -[SAL2_G6:SAL2] -~w~Detente en la ~y~señal amarilla~w~ para dejar a las chicas. - -[SAL2_G7:SAL2] -~w~Molesta al cliente para que la ~b~chica~w~ salga del coche. - -[SAL2_B:SAL2] -~w~Ya no caben más chicas en el coche. - -{=================================== MISSION TABLE SAL3 ===================================} - -[SAL3_A0:SAL3] -~w~¡Toni! ¿Cómo estás, chico? - -[SAL3_A1:SAL3] -~w~Pareces un poco delgado. ¿Tu mamá no te da bien de comer? - -[SAL3_A2:SAL3] -~w~Estoy bien, Sr. Leone. - -[SAL3_A3:SAL3] -~w~Escucha, esos sindicalistas ya me están cabreando. - -[SAL3_A5:SAL3] -~w~pero tenemos que presionar un poco a los mandamases del sindicato, que son 'menos receptivos'. - -[SAL3_B0:SAL3] -~w~Acojona a los ~r~mandamases~w~. Asegúrate de que capten la idea. - -[SAL3_B3:SAL3] -~w~Así harán lo que les digamos a partir de ahora. - -[SAL3_BA:SAL3] -~w~¡Estás loco, tío! ¡No quiero más marrones! - -[SAL3_CA:SAL3] -~w~¿Qué haces? ¿Estás loco? - -[SAL3_DA:SAL3] -~w~¡Solo me quedaba pagar dos letras del coche! ¡Hijo de puta! - -[SAL3_BB:SAL3] -~w~¡Desde ahora harás lo que te digamos! - -[SAL3_CB:SAL3] -~w~¡No te metas en los asuntos de los Leone! - -[SAL3_A4:SAL3] -~w~Parece que algunos empiezan a ver las cosas a mi manera... - -[SAL3_A6:SAL3] -~w~¿Sabes a qué me refiero? - -[SAL3_B1:SAL3] -~w~No te puedes dejar entender si están muertos. No mates a más ~r~líderes sindicales~w~. - -[SAL3_B2:SAL3] -~r~¡Se supone que debes asustarlos, no matarlos! - -[SAL3_B4:SAL3] -~w~Busca a otro ~r~líder sindical~w~ al que dejarle las cosas claras. - -{=================================== MISSION TABLE SAL5 ===================================} - -[SAL5_D3:SAL5] -~w~Mete el ~h~vehículo ~w~en el garaje. - -[SAL5_D4:SAL5] -~w~Baja del vehículo y sal del ~h~garaje~w~. - -[SAL5_B:SAL5] -~w~Consigue un vehículo de cuatro plazas y busca ~b~refuerzos~w~. - -[SAL5_C:SAL5] -~w~Necesitas un vehículo con cuatro plazas. - -[SAL5_C0:SAL5] -~w~Recoge a los ~b~refuerzos~w~. - -[SAL5_C1:SAL5] -~w~Necesitas un vehículo con más plazas para llevar más ~b~refuerzos~w~. - -[SAL5_C2:SAL5] -~w~Ve a los ~y~muelles de Portland~w~. - -[SAL5_AA:SAL5] -~w~Eh, colega... ¡Tenías que estar aquí hace horas! - -[SAL5_AB:SAL5] -~w~Basta de quejas, Miguel. ¿Tienes la mercancía? - -[SAL5_AG:SAL5] -~w~¿Tienes el dinero? - -[SAL5_AH:SAL5] -~w~Claro... - -[SAL5_AI:SAL5] -~w~¿Qué? - -[SAL5_AJ:SAL5] -~w~¡Puto chicano! - -[SAL5_C8:SAL5] -~w~¡Métete en el ~b~vehículo~w~ de las drogas y sal escopetado! - -[SAL5_C9:SAL5] -~w~Lleva el vehículo al ~y~garaje de Salvatore~w~. - -[SAL5_D1:SAL5] -~w~¡Vuelve al ~b~vehículo~w~! - -[SAL5_D2:SAL5] -~r~¡Las drogas se han echado a perder! - -[SAL5_AF:SAL5] -~w~¡Je, je, ja! Me gustas, Toni. ¡Tienes los huevos de un toro! - -[SAL5_C3:SAL5] -~w~¡Despista a la poli! - -[SAL5_D5:SAL5] -~r~¡Han incautado las drogas! - -[SAL5_AD:SAL5] -~w~Eh, soy un hombre ocupado, Toni. ¡La próxima buscaré a otro comprador! - -[SAL5_AE:SAL5] -~w~Sí, pues no creo que encuentres a nadie que te pague lo que nosotros. - -[SAL5_D6:SAL5] -~w~Acaba con los ~r~traficantes~w~. - -[CONT_01:SAL5] -Cierra la boca, puta desagradecida. - -[CONT_06:SAL5] -Sería la primera vez que me tocases en un mes. - -[CONT_07:SAL5] -¿Y por qué cojones iba a tocarte? - -[CONT_08:SAL5] -No me gusta el género usado. - -[CONT_09:SAL5] -Me das asco. - -[CONT_12:SAL5] -Ay, por favor. ¿Sabes qué? - -[CONT_15:SAL5] -Hola, Toni... - -[CONT_16:SAL5] -¡Quiero mi dinero, viejo! - -[CONT_17:SAL5] -Largo de aquí, pordiosera. - -[CONT_18:SAL5] -Eh, Anthony, eres mi ángel de la guarda. - -[CONT_19:SAL5] -Mujeres, ¿qué se puede esperar de ellas, eh? - -[CONT_20:SAL5] -Por suerte, al menos puedo confiar en alguien. En ti, Toni. - -[CONT_21:SAL5] -Eres muy importante para mí. ¿Alguna vez te lo he dicho? - -[CONT_22:SAL5] -¡No se te levanta ni con grúa, viejo de mierda! - -[CONT_23:SAL5] -Contigo no. No me van los retretes públicos, so zorra. - -[CONT_24:SAL5] -Muy importante, escucha bien. Ahora mandamos tú y yo. - -[CONT_25:SAL5] -Estamos echando a esos gilipollas. - -[CONT_26:SAL5] -¿Echándolos? ¿Con lo que a ti te gusta pasar el rato con hombres? - -[CONT_27:SAL5] -Y tú solo estás contenta cuando tienes las bragas en los tobillos... - -[CONT_28:SAL5] -¡y la espalda apoyada en la pared! - -[CONT_29:SAL5] -Dios. ¡Sé de conejos que follarían menos que tú! - -[CONT_33:SAL5] -En fin, está al llegar un cargamento de lo que tú ya sabes. - -[CONT_34:SAL5] -Esto nos va a poner a ti y a mí en la cresta de la ola. - -[CONT_35:SAL5] -Todo tendría que ir como la seda. - -[CONT_36:SAL5] -Pero necesito a alguien, alguien de confianza, que se encargue de esto. - -[CONT_37:SAL5] -Muy bien, Toni, luego hablamos. - -[CONT_38:SAL5] -Además, nunca había visto a nadie con ropa interior con suspensión. - -[CONT_39:SAL5] -¡Diablos! ¿Por qué me casaría con ella? - -[CONT_40:SAL5] -¡Buscaba una guarra y me casé con una puta! - -[CONT_41:SAL5] -Tengo que haber puteado bien a alguien en mi otra vida, - -[CONT_42:SAL5] -vaya que sí. - -[CONT_02:SAL5] -- Si vuelves a abrirla, te vas a enterar de lo que vale un peine. ~n~ - Vaya, muy bien, machote. - -[CONT_04:SAL5] -- ¿Y qué harás? ¿Pegarme? ~n~ - Debería hacerlo... - -[CONT_10:SAL5] -- ¿Que te doy asco? ~n~ - ¡Sí, asco! - -[CONT_13:SAL5] -- Papá tenía razón cuando decía que no eras más que un cerdo... ~n~ - Sí, sí, sí, sí... - -[CONT_43:SAL5] -- Así que escucha, es importante... ~n~ - Que te jodan, Salvatore Leone, - -[CONT_31:SAL5] -eunuco italianini, maltratador de mierda. ~n~ - ¿Que me jodan? ¡Que te jodan a ti! ¡Ya lo habrán hecho todos! - -{=================================== MISSION TABLE SAL4 ===================================} - -[SAL4_I1:SAL4] -~w~Esta huelga continuará hasta que la ciudad me dé más garantías. - -[SAL4_I2:SAL4] -~w~Las mafias creen que pueden controlar el sindicato. ¡Ya pueden decir misa! - -[SAL4_I3:SAL4] -~w~¡No me asustan! - -[SAL4_I4:SAL4] -~w~¡Tengo más huevos que todos ellos juntos! - -[SAL4_I5:SAL4] -~w~Lo que hay que oír... - -[SAL4_I6:SAL4] -~w~Debería liquidar a esa zorra. ¡Me está haciendo la cama! - -[SAL4_I7:SAL4] -~w~Bueno, a eso pueden jugar dos... - -[SAL4_I8:SAL4] -~w~Toni, vas entregar un mensaje de mi parte. - -[SAL4_A2:SAL4] -~w~Ahora quita al ~r~chófer~w~ de la ecuación... - -[SAL4_A3:SAL4] -~w~¡Eh! - -[SAL4_A4:SAL4] -~w~Sube a la ~b~limusina~w~. - -[SAL4_A5:SAL4] -~w~Lleva la limusina a la ~y~emisora~w~. - -[SAL4_A6:SAL4] -~w~Espera a que salga Hopper. - -[SAL4_A7:SAL4] -~w~Vuelve a poner la limusina en la posición correcta. Hopper no debe sospechar nada. - -[SAL4_B1:SAL4] -~w~Al ferry de Harwood, ¡y pise a fondo! - -[SAL4_B2:SAL4] -~w~¡Como mande! - -[SAL4_C1:SAL4] -~w~¡Acojona a Hopper! - -[SAL4_C2:SAL4] -Susto - -[SAL4S1:SAL4] -~w~¡Tranquilo, esto no es una carrera! - -[SAL4S2:SAL4] -~w~¿Seguro que se va por aquí? - -[SAL4S3:SAL4] -~w~¡Usted no es el chófer de siempre! - -[SAL4S4:SAL4] -~w~¿Quién diablos es usted? - -[SAL4S5:SAL4] -~w~¡Cierra la boca! - -[SAL4S6:SAL4] -~w~Desde ahora, harás exactamente lo que te diga Salvatore Leone. - -[SAL4S7:SAL4] -~w~¿Capisci? - -[SAL4S8:SAL4] -~w~¡Me... me niego a asustarme por esto! - -[SAL4S9:SAL4] -~w~¡Ya veremos! - -[SAL4S10:SAL4] -~w~¡Déjeme salir ahora mismo! - -[SAL4S11:SAL4] -~w~¡Por favor! ¡Nos vamos a matar! - -[SAL4S12:SAL4] -~w~¡Noooooo! - -[SAL4S13:SAL4] -~w~¿Qué he hecho yo para merecer esto? - -[SAL4_F1:SAL4] -~w~¿Dónde está mi limusina? - -[SAL4_F2:SAL4] -~w~Usted no es mi chófer, ¡voy a llamar a la policía! - -[SAL4_F3:SAL4] -~r~¡Es tarde, Hopper te ha descubierto! - -[SAL4_F4:SAL4] -~w~¡Que se joda Salvatore! - -[SAL4_F5:SAL4] -~r~¡La limusina está destrozada! - -[SAL4_F6:SAL4] -~r~¡Hopper ha muerto! - -[SAL4_F7:SAL4] -~r~¡Hopper se ha escapado! - -[SAL4_F8:SAL4] -~r~Los golpes han asustado a Hopper. - -[SAL4_F9:SAL4] -~r~Hopper se ha asustado. - -[SAL4_P1:SAL4] -~w~¡Vale! ¡Vale! ¡Ya tengo bastante! - -[SAL4P1A:SAL4] -~w~Haré lo que queráis. - -[SAL4_P2:SAL4] -~w~Lleva a Hopper al ~y~piquete del ferry~w~. - -[SAL4_P3:SAL4] -~w~Y no olvide nuestro pequeño trato, señorita... - -[SAL4_H1:SAL4] -~w~Una combinación de velocidad, choques y saltos acrobáticos asustará a Hopper y la hará entrar en razón. - -[SAL4_F0:SAL4] -~r~¡Demasiado tarde! ¡Hopper ya ha salido de la emisora! - -[SAL4_A:SAL4] -~w~Llega a la ~y~emisora de radio~w~ antes de que Hopper salga a las 0~1~:00. - -[SAL4_A1:SAL4] -~w~Llega a la ~y~emisora de radio~w~ antes de que Hopper salga a las ~1~:00. - -{=================================== MISSION TABLE SAL6 ===================================} - -[SAL6_A0:SAL6] -~w~Toni, tenemos problemas, ¡y gordos! - -[SAL6_A1:SAL6] -~w~¿Qué pasa, Sal? - -[SAL6_A3:SAL6] -~w~¡Nos están dando una buena! - -[SAL6_A4:SAL6] -~w~Acabamos una maldita guerra y ¡BANG, nos vemos metidos en otra! - -[SAL6_A5:SAL6] -~w~Hay que ver, justo cuando la cosa empezaba a marchar. ¡Tengo la negra! ¡La puta negra! - -[SAL6_A6:SAL6] -~w~¡Eh! No se preocupe ni un pelo, jefe. Yo me encargo. - -[SAL6_AA:SAL6] -~w~Sal te ha dejado armas en el garaje. - -[SAL6_B:SAL6] -~w~¡Detén el ataque de los ~r~Diablos~w~ antes de que mueran todos los Leone! - -[SAL6_1:SAL6] -~w~¡Solo quedan con vida ~1~ Leone! - -[SAL6_2:SAL6] -~w~¡Solo queda con vida 1 Leone! - -[SAL6_C1:SAL6] -~w~¡Nos están masacrando, Toni! - -[SAL6_C2:SAL6] -~w~¡No me pagan bastante para esta mierda, tío! - -[SAL6_C3:SAL6] -~w~¡Estás loco, Toni! ¡Vamos a morir todos! - -[SAL6_E1:SAL6] -~w~¿Sal? - -[SAL6_E2:SAL6] -~w~¡Toni! ¿Ya está? ¿Cómo ha ido? - -[SAL6_E3:SAL6] -~w~No muy bien, Sal. - -[SAL6_E4:SAL6] -~w~He salvado a unos cuantos, pero perdimos a muchos antes de llegar yo. - -[SAL6_E5:SAL6] -~w~Creo que vamos a perder esa parte de la ciudad. - -[SAL6_E6:SAL6] -~w~¡Por encima de mi cadáver! ¡Esto no ha terminado! - -[SAL6_E7:SAL6] -~w~¡No perderé una mierda! ¡Los Leone no se retiran! - -[SAL6_E8:SAL6] -~w~¿Me oyes, Toni? - -[SAL6_E9:SAL6] -~w~Lo que tú digas, Sal. - -[SAL6_G0:SAL6] -~r~Han muerto todos los Leone. - -[SAL6_Z1:SAL6] -Leone - -[SAL6_Z2:SAL6] -Diablos - -[SAL6_X0:SAL6] -Got threat - -[SAL6_X1:SAL6] -Had threat - -[SAL6_X2:SAL6] -Find threat - -[SAL6_X3:SAL6] -Complain - -[SAL6_C0:SAL6] -~w~¡Que les jodan! ¡Salgamos de aquí cagando leches! - -[SAL6_A2:SAL6] -~w~¿Adónde iremos a parar? ¡Los Diablos nos atacan por todas partes en Hepburn! - -{=================================== MISSION TABLE SAL7 ===================================} - -[SAL7_01:SAL7] -~w~¡Eh, Sal! - -[SAL7_02:SAL7] -~w~¡Toni! ¿Qué te parece el nuevo coche? - -[SAL7_05:SAL7] -~w~Una belleza, ¿no? Todo lujo, el mejor de la serie... - -[SAL7_A6:SAL7] -~w~¡Ah! ¡La crisis de los cincuenta! - -[SAL7_07:SAL7] -~w~¡Cállate! Escucha, Toni. - -[SAL7_08:SAL7] -~w~Tengo la polla de dinero que hay que recoger en mi almacén, en Callahan Point. - -[SAL7_10:SAL7] -~w~No me fío de otro para esto. - -[SAL7_11:SAL7] -~w~Chicas, ¿charlamos todo el día o nos vamos? - -[SAL7_12:SAL7] -~w~¡Que te zurzan, mujer! ¿Quién te ha dicho que podías hablar? - -[SAL7_20:SAL7] -~w~¡Vamos! ¡Deprisa! - -[SAL7_21:SAL7] -~w~Vale... - -[SAL7_22:SAL7] -~w~¡Venga! - -[SAL7_23:SAL7] -~w~¡Eh, Toni! ¿Come stai? - -[SAL7_30:SAL7] -~w~Ve al ~y~almacén~w~. - -[SAL7_40:SAL7] -~w~¡Recoge el dinero de Salvatore antes de que se queme! - -[SAL7_50:SAL7] -~w~Lleva el botín a casa de ~y~Salvatore~w~. - -[SAL7_NM:SAL7] -~w~¡Vuelve! Aún no tienes todo el ~g~dinero~w~. - -[SAL7_E1:SAL7] -~w~¡Matadlo! - -[SAL7_E2:SAL7] -~w~¡Muere! - -[SAL7_E3:SAL7] -~w~¡Solo es uno! - -[SAL7_E4:SAL7] -~w~¡Ya le veo! - -[SAL7_T1:SAL7] -~w~¡Atrás! - -[SAL7_T2:SAL7] -~w~¿Y ahora cómo te sientes? - -[SAL7_T3:SAL7] -~w~¡Vamos! - -[SAL7_T4:SAL7] -~w~¡Chúpate ésa! - -[SAL7_F1:SAL7] -~r~¡No has recogido todo el dinero de Salvatore a tiempo! - -[SAL7_06:SAL7] -~w~¿Qué es ese olor? - -[SAL7_42:SAL7] -~w~¡Recoge el ~g~dinero~w~ antes de que se queme! - -{=================================== MISSION TABLE SAL8 ===================================} - -[SAL8_VE:SAL8] -~r~V 1.2 - -[SAL8_11:SAL8] -~w~Toni, consigue un coche y vámonos... - -[SAL8_12:SAL8] -~w~Dirígete a la terminal del ferry. - -[SAL812A:SAL8] -~w~Pero la huelga sigue... No habrá ferris. - -[SAL812B:SAL8] -~w~Tú conduces. Yo pienso. - -[SAL8_14:SAL8] -~w~¡Dios Santo! ¡Está infestado de policías! ¡Salgamos cagando leches! - -[SAL8_15:SAL8] -~w~¿Adónde vamos? - -[SAL8_16:SAL8] -~w~¡Al puente Callahan! - -[SAL816A:SAL8] -~w~Pero si el puente aún no está acabado... - -[SAL816B:SAL8] -~w~¡Nosotros sí que estaremos acabados si no conduces! ¡Písale! - -[SAL816C:SAL8] -~w~Dirígete al ~y~puente Callahan~w~. - -[SAL8_17:SAL8] -~w~¿Qué diablos haces? - -[SAL8_18:SAL8] -~w~¡Toni! ¡Vamos a necesitar un coche! - -[SAL818A:SAL8] -~w~¡No pienso ir andando! - -[SAL8_19:SAL8] -~w~Has dejado atrás a ~b~Salvatore~w~. ¡Vuelve y recógelo! - -[SAL8_20:SAL8] -~w~¡Sácanos de aquí! - -[SAL8_22:SAL8] -~w~¡Lo has logrado, Toni! ¡Sabía que podía confiar en ti! - -[SAL822B:SAL8] -Escucha, sé de un lugar seguro donde podemos escondernos un tiempo. - -[SAL822C:SAL8] -Venga, en marcha. - -[SAL8_25:SAL8] -~w~¡Vamos a necesitar que este trasto lo dé todo de sí! ¡Pisa a fondo, Toni! - -[SAL825A:SAL8] -~w~¡OH, MIEEEERDA! - -[SAL8_26:SAL8] -Velocidad del salto - -[SAL8_27:SAL8] -~w~Sí, aquí es. - -[SAL8_28:SAL8] -~w~Voy a echar un vistazo, a ver qué se cuece. - -[SAL828A:SAL8] -~w~Puede que luego nos veamos. - -[SAL8_29:SAL8] -~r~¡Sal ha muerto! - -[SAL829A:SAL8] -~w~¡La poli te ha descubierto! - -[SAL831:SAL8] -~w~Ya está disponible el piso franco de Staunton. - -[SAL833:SAL8] -~w~¡Escapa de la poli! - -[SAL823A:SAL8] -~w~¿O no? - -[SAL8_24:SAL8] -~w~Aunque las líneas del metro y el ferry ya están abiertas oficialmente, - -[SAL824A:SAL8] -~w~trabajadores militantes siguen con el bloqueo en partes de la ciudad. - -[SAL824B:SAL8] -~w~El puente levadizo que conecta Staunton Island y Shoreside Vale permanece cerrado. - -[SAL824C:SAL8] -~w~Los huelguistas se niegan a dar crédito a las garantías dadas por el ayuntamiento sobre el futuro de los ferris. - -[SAL824D:SAL8] -~w~Como nota positiva, el nuevo puente Callahan está casi a punto. - -[SAL824E:SAL8] -~w~Pero este viajero de Liberty City no puede permitirse más retrasos. - -[SAL8_23:SAL8] -~w~Las protestas de los trabajadores, que habían aislado Portland del resto de la ciudad, han terminado por fin. - -[SAL812C:SAL8] -~w~Ve a la ~y~terminal del ferry~w~. - -[SAL8WAN:SAL8] -¡La poli se ha emperrado con Salvatore! Repintar el vehículo solo la despistará un rato. - -[SAL8_21:SAL8] -~w~Ve al ~y~puente~w~. - -[SAL830:SAL8] -~w~Ve al ~y~piso franco~w~. - -[SAL822A:SAL8] -~w~¡Te besaría si te hubieras afeitado! - -[SAL832:SAL8] -~w~¡Necesitas un vehículo! - -[DRIV_01:SAL8] -¿Y bien? - -[DRIV_02:SAL8] -¿Y bien qué? - -[DRIV_03:SAL8] -No te hagas el tonto conmigo, chico. - -[DRIV_06:SAL8] -Sé lo que has ido diciendo de mí. - -[DRIV_07:SAL8] -Crees que me chupo el dedo, ¿eh? - -[DRIV_08:SAL8] -¿Eso te crees? - -[DRIV_09:SAL8] -Jefe, yo no he ido diciendo nada de usted. - -[DRIV_10:SAL8] -Qué cojones. Ni yo sé qué me está pasando. - -[DRIV_11:SAL8] -Jesús. - -[DRIV_12:SAL8] -Me estoy volviendo paranoico, Toni. Un puto paranoico. - -[DRIV_13:SAL8] -Que yo crea que todos me odian no significa que no sea así, ¿sabes a qué me refiero? - -[DRIV_14:SAL8] -Alguien viene a por mí. ¡Es ese maldito alcalde! - -[DRIV_15:SAL8] -Quiere cargarme el muerto por toda la mierda que corre por el barrio. - -[DRIV_16:SAL8] -¡Por toda! No solo la mía, sino la de todos. - -[DRIV_17:SAL8] -Venga, vamos a ocuparnos de esto. - -[DRIV_04:SAL8] -- Yo ya sabía de eso cuando tu madre hacía la calle. ~n~ - ¿Qué mosca le ha picado? - -{=================================== MISSION TABLE JDT1 ===================================} - -[JDT1_CA:JDT1] -~w~Creo que las chicas me están robando. - -[JDT1_CB:JDT1] -~w~Vamos a 'apatrullar' el barrio, a ver qué pescamos. - -[JDT1_DA:JDT1] -~w~¡Ésa es una de mis chicas! - -[JDT1_DB:JDT1] -~w~¡Eh! Reconozco a esa chica. - -[JDT1_DC:JDT1] -~w~¡Es una de mis chicas! - -[JDT1_DD:JDT1] -~w~Esa chica es de las nuestras. - -[JDT1_DE:JDT1] -~w~Esa chica de allí... - -[JDT1_DF:JDT1] -~w~Para cerca de ella. - -[JDT1_DG:JDT1] -~w~Ponte a su lado. - -[JDT1_DH:JDT1] -~w~Vamos hasta ella. - -[JDT1_DI:JDT1] -~w~Aparca junto a ella. - -[JDT1_DJ:JDT1] -~w~Ve hasta ella. - -[JDT1_MA:JDT1] -~w~Hola, J.D. ¡Iba a llevarte esto, de verdad! - -[JDT1_MB:JDT1] -~w~¡Dios! ¿Es que ya no te fías de mí, J.D.? - -[JDT1_MC:JDT1] -~w~Eh, J.D. Ha sido un día muy malo... Esto es todo lo que tengo. - -[JDT1_MD:JDT1] -~w~¡"El Gran Hermano te vigila"! ¡Toma el puto dinero! - -[JDT1_ME:JDT1] -~w~Eh, J.D. Tengo el dinero justo aquí. - -[JDT1_MF:JDT1] -~w~¿Pensabas que no te lo iba a dar o algo así? - -[JDT1_MG:JDT1] -~w~¿Nos estás controlando, J.D.? - -[JDT1_MH:JDT1] -~w~Está todo... ¡Cuéntalo si quieres! - -[JDT1_EA:JDT1] -~w~¡Eh! ¡Ese chulo le está mangando a una de mis chicas! - -[JDT1_EB:JDT1] -~w~¡Recupera el dinero, Toni! - -[JDT1_EC:JDT1] -~w~¿Qué demonios hace ese chulito? - -[JDT1_ED:JDT1] -~w~¡Se está llevando mi pasta! - -[JDT1_EE:JDT1] -~w~¡A por él, Toni! - -[JDT1_45:JDT1] -~w~Quítale el ~g~dinero~w~ al chulo. - -[JDT1_46:JDT1] -~w~¡El chulo se ha escapado! - -[JDT1_FA:JDT1] -~w~¡En ese coche va una de mis chicas! - -[JDT1_FB:JDT1] -~w~Da marcha atrás hasta el ~b~coche~w~ y acércate para que eche un vistazo. - -[JDT1_FC:JDT1] -~w~Poco a poco... No queremos molestarles. - -[JDT1_FD:JDT1] -~w~Más cerca... - -[JDT1_FE:JDT1] -~w~Más cerca... - -[JDT1_FF:JDT1] -~w~Tranquilo... - -[JDT1_IA:JDT1] -~w~¡Por el amor de Dios, Toni! ¡Los has espantado! - -[JDT1_GA:JDT1] -~w~¡Dios, Toni! ¡No veo una leche! - -[JDT1_75:JDT1] -~w~Espera a que la ~b~chica~w~ le dé a J.D. su dinero. - -[JDT1_HA:JDT1] -~w~¡Oh, sí...! - -[JDT1_HB:JDT1] -~w~¡Vamos, nena! - -[JDT1_HC:JDT1] -~w~Así, así... - -[JDT1_HD:JDT1] -~w~¡Oh, SÍ...! - -[JDT1_HE:JDT1] -~w~¡Qué pasada! - -[JDT1_HF:JDT1] -~w~¿Ya hemos terminado aquí? - -[JDT1_JA:JDT1] -~w~¡Buen trabajo, Toni! - -[JDT1_JB:JDT1] -~w~No creo que las chicas de este turno me vayan a dar más problemas. - -[JDT1_LA:JDT1] -~w~¡Toni! ¡Esta vez la has cagado bien! - -[JDT1_LB:JDT1] -~w~¡Me vuelvo al club! - -[JDT1_ML:JDT1] -~w~ Quedan ~1~ $ por recaudar. - -[JDT1O01:JDT1] -~w~Sube a la ~b~furgoneta~w~ de J.D. - -[JDT1O02:JDT1] -~w~Has dejado atrás a ~b~J.D.~w~. ¡Vuelve y recógelo! - -[JDT1O03:JDT1] -~w~Espera a que suba ~b~J.D.~w~. - -[JDT1O04:JDT1] -~w~Busca a las chicas de J.D. en el Red Light District. - -[JDT1O05:JDT1] -~w~Vuelve al ~y~club de J.D.~w~. - -[JDT1O07:JDT1] -~w~Para cerca de la ~b~chica~w~. - -[JDT1O08:JDT1] -~w~Mata al ~r~chulo~w~. - -[JDT1O09:JDT1] -~w~Recauda el dinero de una de las ~b~chicas~w~ de J.D. - -[JDT1_F1:JDT1] -~r~La furgoneta de J.D. está destrozada. - -[JDT1_F2:JDT1] -~r~¡J.D. ha muerto! - -[JDT1_F3:JDT1] -~r~¡No has recaudado dinero suficiente en este turno! - -[JDT1_D1:JDT1] -~w~Las chicas de J.D. trabajan en el ~y~Red Light District~w~. ¡Vuelve allí! - -[JDT1_F4:JDT1] -~r~¡Han muerto demasiadas chicas de J.D.! - -[JDT1_KA:JDT1] -~w~¿Qué diablos ha sido eso? - -[JDT1_KB:JDT1] -~w~¿Le hemos dado a algo? - -[JDT1_KC:JDT1] -~w~¡Conduce con cuidado, Toni! - -[JDT1_81:JDT1] -~w~¡Has asustado al putero! ¡No quiere que haya mirones! - -[JDT1O10:JDT1] -~w~Lleva el ~b~coche~w~ hasta el callejón. - -[JDT1O11:JDT1] -~w~Toca el claxon para llamarles la atención. - -[JDT1O12:JDT1] -~w~Cuanto más dejes trabajar a la chica, más dinero ganará. - -[JDT1_MO:JDT1] -Deuda - -[JDT1_H1:JDT1] -~w~Usa ~k~ ~VEHN~ para tocar el claxon. - -[JDT1_WA:JDT1] -~w~¡Date prisa! ¡El turno de las ~b~chicas~w~ termina a las ~1~:~1~! - -[JDT1_WB:JDT1] -~w~¡Date prisa! ¡El turno de las chicas termina a las ~1~:~1~! - -[JDT1O06:JDT1] -~w~Recauda el dinero de J.D. entre sus prostitutas. Ve rápido, el turno acaba a las ~1~:~1~. - -[JDT1_WC:JDT1] -~w~¡Deprisa! ¡El turno de las ~b~chicas~w~ termina a las ~1~:0~1~! - -[JDT1_WD:JDT1] -~w~¡Deprisa! ¡El turno de las chicas termina a las ~1~:0~1~! - -[JDT1P06:JDT1] -~w~Ve a pedirles el dinero a las putas de J.D. Date prisa, porque su turno termina a las ~1~:0~1~. - -[BONE_01:JDT1] -¡Eh, J.D., sal un momento! - -[BONE_02:JDT1] -Eh, J.D., pervertido, ven cagando leches, - -[BONE_03:JDT1] -¡o entro ahí y te parto las piernas! - -[BONE_04:JDT1] -Voy corriendo... pero sin correrme, ¡ja, ja, ja! - -[BONE_05:JDT1] -Eh, Toni, ¿'qué pasa'? Un abrazote. - -[BONE_06:JDT1] -¡Puaj, estás pegajoso! - -[BONE_07:JDT1] -La porquería que se ponen las strippers, que se me pega. - -[BONE_08:JDT1] -Les gusta, ya sabes. Se la ponen por todas partes y... Bueno, ¿cómo te va? - -[BONE_09:JDT1] -¿Qué cojones llevas puesto? - -[BONE_10:JDT1] -¿El qué, esto? Soy un amante creativo. - -[BONE_11:JDT1] -Ya sabes, me gusta... experimentar, ¿no? - -[BONE_16:JDT1] -Mira, ése es el problema. Nos lo están mangando. - -[BONE_17:JDT1] -Bueno, tú espera aquí. - -[BONE_18:JDT1] -Tengo que quitarme... uh... esto, ¿sabes? - -[BONE_19:JDT1] -Eh, Raven, hora de guardar el consolador doble. - -[BONE_20:JDT1] -Eh, Toni, vamos a dar una vuelta en la furgoneta. - -[BONE_21:JDT1] -Tenemos que revisar unas cosas... ¡Vale! ¡Vale! - -[BONE_12:JDT1] -- No hay nada malo en ello, ¿no? Puedes mirar si quieres. ~n~ - Oh, eres un enfermo. Cierra la bocaza de una vez. - -[BONE_14:JDT1] -- Vale, cálmate, Toni... ~n~ - ¿Y mi dinero? - -{=================================== MISSION TABLE JDT2 ===================================} - -[JDT2_I1:JDT2] -~w~¡Gracias a Dios que has venido, Toni! - -[JDT2_I2:JDT2] -~w~¡Me han soplado que la poli va a hacernos una redada! - -[JDT2_I3:JDT2] -~w~¿Y...? Tienes los permisos... - -[JDT2_I4:JDT2] -~w~¡No para algunas cosas que se hacen aquí! - -[JDT2_I5:JDT2] -~w~Salvatore está aquí. Haciendo a las chicas una... 'visita especial', ¿sabes? - -[JDT2_I6:JDT2] -~w~¡Tenemos que sacarlo de aquí antes de que llegue la poli! - -[JDT2_I7:JDT2] -~w~¡Reúnete con él ahí delante! - -[JDT2_I8:JDT2] -~w~Ni un momento de respiro... - -[JDT2_05:JDT2] -~w~¡Sácame de aquí cagando leches! - -[JDT2_06:JDT2] -~w~¿Toni? ¡Despista a la poli! ¡Que no quiero llevármelos a casita! - -[JDT2_A1:JDT2] -~w~Sube al ~b~coche~w~. - -[JDT2_A2:JDT2] -~w~¡No pierdas a ~b~Salvatore~w~! ¡Vuelve y recógelo! - -[JDT2_A3:JDT2] -~w~Lleva a Salvatore a ~y~casa~w~. - -[JDT2_A5:JDT2] -~r~¡Salvatore ha muerto! - -[JDT2_C1:JDT2] -~w~Lo has hecho muy bien, hijo. Me gusta tu estilo. Siempre me ha gustado. - -[JDT2_C2:JDT2] -~w~Gracias, Sr. Leone. - -[JDT2_C3:JDT2] -~w~Mira, creo que Vincenzo abusa demasiado de tu tiempo. - -[JDT2_C4:JDT2] -~w~Me vendría bien un buen tipo como tú. - -[JDT2_C5:JDT2] -~w~Llámame un día de éstos. El tío Sal cuidará de ti. - -[JDT2_A9:JDT2] -~r~¡Han trincado a Salvatore! - -[JDT2_B2:JDT2] -~w~¡Despista a la poli! - -[JDT2_A6:JDT2] -~w~Vuelve al ~b~coche~w~ de Salvatore antes de que lo trinque la poli. - -[JDT2_F1:JDT2] -~r~¡Has perdido a Salvatore! - -[JDT2_A4:JDT2] -~w~¡Aleja a Salvatore del club y despista a la poli! - -{=================================== MISSION TABLE JDT3 ===================================} - -[JDT3_AA:JDT3] -~w~Eh, Toni. Ahora no puedo salir, estoy ocupado... ¿sabes? - -[JDT3_AB:JDT3] -~w~¿Por qué? ¿Qué está pasando ahí? ¿Y qué diablos es ese olor...? - -[JDT3_AC:JDT3] -~w~Mira, Toni, hoy estamos haciendo... auténticos 'servicios especiales'. - -[JDT3_AD:JDT3] -~w~¡Esto vale su peso en oro en Internet! - -[JDT3_AE:JDT3] -~w~Lo que debe preocuparte es esa casa de juego de los Leone, en Saint Mark's. - -[JDT3_AG:JDT3] -~w~A los Sindacco les toca mucho las narices. - -[JDT3_AH:JDT3] -~w~He oído que quieren borrarla del mapa, volándola. - -[JDT3_B:JDT3] -~w~¡Elimina a los ~r~saboteadores de los Sindacco~w~! - -[JDT3_C:JDT3] -~w~Han puesto una ~r~bomba~w~ fuera del ~y~casino~w~. - -[JDT3_D:JDT3] -La bomba explota - -[JDT3_E:JDT3] -~w~Un par como éstas y adiós muy buenas al ~y~casino~w~. - -[JDT3_F:JDT3] -~w~Una más y el ~y~casino~w~ será historia. - -[JDT3_H:JDT3] -~w~¡Hay más ~r~Sindacco~w~ de camino! ¡Páralos! - -[JDT3_I:JDT3] -~w~¡La bomba de la furgoneta está activada! - -[JDT3_J:JDT3] -~w~El ~y~casino~w~ está a salvo. ¡Sal de allí! - -[JDT3_K:JDT3] -~w~¡Deben de haber manipulado la furgoneta! ¡Está atascada en primera! - -[JDT3_L:JDT3] -~w~¡Los ~r~refuerzos de los Sindacco~w~ van al ~y~casino~w~! - -[JDT3_M:JDT3] -~w~Los ~r~Sindacco~w~ aún no se rinden, ¡vienen más! - -[JDT3_N:JDT3] -~w~Se están retirando. ¡Que no escape ni uno de los ~r~Sindacco~w~! - -[JDT3_O:JDT3] -Distancia segura - -[JDT3_P:JDT3] -~w~¡Los Sindacco han cargado una enorme furgoneta bomba! ¡Van a volar el casino de un solo golpe! - -[JDT3_Q:JDT3] -~w~Defiende el ~y~casino~w~. - -[JDT3_R:JDT3] -~w~Inspecciona el ~y~Casino~w~. - -[JDT3_S:JDT3] -~w~¡Impide que la ~r~furgoneta bomba~w~ destruya el ~y~casino~w~! - -[JDT3_T:JDT3] -~w~¡Aleja la ~r~furgoneta~w~ del ~y~casino~w~ antes de que estalle! - -[JDT3_BA:JDT3] -~w~¿Toni? Soy J.D. - -[JDT3_BB:JDT3] -~w~Mira, acabo de oír que un puñado de gorilas de los Sindacco van a por ti. - -[JDT3_BC:JDT3] -~w~¡Son duros y van bien armados! - -[JDT3_BD:JDT3] -~w~¡Ten cuidado! - -[JDT3_BE:JDT3] -~w~Gracias, J.D. - -[JDT3_BF:JDT3] -~w~Te debo una. - -[JDT3_G:JDT3] -~r~¡El casino está destruido! - -{=================================== MISSION TABLE JDT4 ===================================} - -[JDT4_3:JDT4] -~w~Los Sindacco que vigilan The Doll's House solo confiarán en ~h~sus coches~w~. - -[JDT4_A1:JDT4] -~w~¡Eso es clase! Si pierdes en la mesa, ¡puedes desquitarte en la cama! - -[JDT4_B0:JDT4] -~w~Busca un vehículo apropiado y ponle una bomba. - -[JDT4_B1:JDT4] -~w~Súbete al ~b~vehículo~w~ con la bomba. - -[JDT4_B3:JDT4] -~w~Ahora, baja y sal de aquí. - -[JDT4_B4:JDT4] -~w~¡Detona la bomba! - -[JDT4_B5:JDT4] -~w~Lleva el vehículo al ~h~taller de bombas~w~ y haz que lo equipen con una. - -[JDT4_B6:JDT4] -~w~¡No te acerques demasiado! - -[JDT4_C0:JDT4] -~r~Estabas muy cerca de la explosión. - -[JDT4_C1:JDT4] -~w~¡Esto es de parte de J.D.! - -[JDT4_D0:JDT4] -~w~¿Quién es ése? - -[JDT4_D2:JDT4] -~w~Debe de ser uno de los nuevos. - -[JDT4_0:JDT4] -CUENTA ATRÁS - -[JDT4_1:JDT4] -~w~No puedes ponerle una bomba a esto. - -[JDT4_2:JDT4] -~w~Sigue el ~h~punto de la bomba~w~ en el radar hasta ~h~el taller de 8-Ball~w~. - -[JDT4_A0:JDT4] -~w~Mira, Toni, los Sindacco tienen un local, The Doll's House. - -[JDT4_AA:JDT4] -~w~Es a la vez un casino y un burdel. - -[JDT4_A2:JDT4] -~w~¡Je, je! Bueno, el lugar es clave para su despliegue por aquí. - -[JDT4_A3:JDT4] -~w~Si lo dejaras, eh... fuera de juego... ya sabes, eh... volándolo o algo así... - -[JDT4_A4:JDT4] -~w~... mira lo que te digo: ¡le caeríamos en gracia a Salvatore! - -[JDT4_D1:JDT4] -~w~No me suena... - -[JDT4_B2:JDT4] -~w~Ve hasta el ~y~garaje~w~ de The Doll's House y aparca allí el vehículo. - -[JDT4_B7:JDT4] -~w~Conduce con cuidado porque si recibe demasiado daño explotará. - -[JDT4_B8:JDT4] -~w~Aparca el vehículo en el ~y~garaje~w~ de The Doll's House. - -[JDT4_4:JDT4] -~w~Pulsa~h~ ~k~ ~PDFW~ ~w~para ~h~detonar~w~ la bomba. - -[JDT4_B9:JDT4] -~w~¡Los Sindacco han desactivado la bomba! - -{=================================== MISSION TABLE JDT5 ===================================} - -[JDT5_B0:JDT5] -~w~¡Es uno de los tipos que se llevaron a Salvatore! - -[JDT5_D0:JDT5] -~w~¿Y él dónde está? ¿En el maletero? - -[JDT5_D1:JDT5] -~w~Bien. Nos lo llevamos a la trituradora. El jefe lo quiere más plano que una pizza. - -[JDT5_E:JDT5] -~w~¡Rescata a Salvatore del ~b~coche~w~ antes de que lo trituren! - -[JDT5_E0:JDT5] -~w~¡Te han calado! - -[JDT5_E1:JDT5] -~w~¡Nadie vigila el ~b~coche~w~! ¡Cógelo! - -[JDT5_E2:JDT5] -~w~Lleva el coche a ~y~casa de Salvatore~w~. - -[JDT5_E3:JDT5] -~w~¡Vuelve a meterte en el ~b~coche~w~! - -[JDT5_F0:JDT5] -~w~Mmmfff... mmmfff... mffff. - -[JDT5_F3:JDT5] -~w~Mmfff... arrgghh... mmffff. - -[JDT5_F4:JDT5] -~w~Mmmfff... arrgghh... arrggghh... arrg. - -[JDT5_F5:JDT5] -~w~Yarrgghh... yarragh... mmffff. - -[JDT5_G0:JDT5] -~w~¿Qué manera de conducir es ésa? ¿Intentabas matarme? - -[JDT5_G1:JDT5] -~w~Sr. Leone. Jefe. Lo siento. - -[JDT5_G2:JDT5] -~w~¿Qué puedo decirle? - -[JDT5_G4:JDT5] -~w~¡Les voy a sacar los ojos! ¡Esto no va quedar así! - -[JDT5_G5:JDT5] -~w~Por los clavos de Cristo, Toni. ¡Me has salvado! ¡Llámame Sal! - -[JDT5_X0:JDT5] -~r~Es difícil seguir a un muerto. - -[JDT5_X1:JDT5] -~r~¡Lo has perdido! - -[JDT5_F1:JDT5] -~w~¿Es usted, Sr. Leone? Soy yo, Toni. - -[JDT5_F2:JDT5] -~w~No se preocupe. Voy a sacarle de ahí. - -[JDT5_G3:JDT5] -~w~¡Hijos de la grandísima! ¿Creen que pueden hacerme esto a mí? - -[JDT5_X2:JDT5] -~r~¡Sal no ha sobrevivido! - -[JDT5_X4:JDT5] -~r~Te ha calado. Ahora nunca encontrarás a Sal. - -[JDT5_X3:JDT5] -~r~¡Salvatore ha sido triturado! - -[JDT5_C:JDT5] -~w~Sigue al ~r~coche~w~, pero que no te vean. - -[JDT5_0:JDT5] -~w~Si disparas al coche, podrías darle a Salvatore. - -[JDT5_H0:JDT5] -~w~Sigue al ~r~coche~w~ pero no te acerques mucho. - -[JDT5_H1:JDT5] -~w~¡Estás demasiado cerca! - -[JDT5_H2:JDT5] -~w~Evita alejarte demasiado y perder el ~r~coche~w~. - -[JDT5_H3:JDT5] -~w~¡Te has retrasado demasiado! - -[KIDN_01:JDT5] -¡J.D.! - -[KIDN_02:JDT5] -Toni, gracias a Dios que has venido. - -[KIDN_03:JDT5] -Estoy sudando más que mi tío en un patio de recreo. ¡Me voy a volver loco! - -[KIDN_06:JDT5] -Ay, Dios. No me lo puedo creer... Me va a cortar las pelotas. - -[KIDN_07:JDT5] -¡Y las colgará en la pared! Y no necesariamente en ese orden. - -[KIDN_08:JDT5] -¡Dios! Me siento como el día que el FBI me registró el disco duro. - -[KIDN_13:JDT5] -Ay, Dios, no me lo puedo creer... - -[KIDN_14:JDT5] -¿Por qué yo? ¡Yo no tengo la culpa! - -[KIDN_15:JDT5] -Pero con eso de Salvatore, los de antivicio me la meterán doblada. - -[KIDN_16:JDT5] -Dios, va a ser peor que aquellas acusaciones por abuso de menores. - -[KIDN_17:JDT5] -¿Has estado alguna vez en la trena por abuso de menores, tío? - -[KIDN_18:JDT5] -¡Te dan por el culo en las duchas! - -[KIDN_19:JDT5] -¡Pero si la tía ya tenía los 18! ¡Dios! Esto va a ser peor. - -[KIDN_20:JDT5] -Escucha, tarado chupapollas. Por el amor de Dios, ¿qué pasa? - -[KIDN_04:JDT5] -- ¿Qué vamos a hacer? ~n~ - ¿Con qué? - -[KIDN_11:JDT5] -- No, no... De eso ya voy hasta el culo... ~n~ - Pero ¿qué te pasa? - -[KIDN_09:JDT5] -Ay, el corazón me va a mil. ¿Tienes un Bellium? - -[KIDN_10:JDT5] -¿O un Rohiphop? Lo que sea... - -[KIDN_21:JDT5] -Se trata de Salvatore. Lo han secuestrado cuando salía del club. - -[KIDN_23:JDT5] -¿Y por qué no me lo has dicho, en vez de contarme tanta chorrada? - -{=================================== MISSION TABLE JDT6 ===================================} - -[JDT6_A0:JDT6] -~w~¡Gracias a Dios, Toni! - -[JDT6_A1:JDT6] -~w~¿J.D.? Eh, estoy aquí atrás... - -[JDT6_A2:JDT6] -~w~Ya lo sé. Te he visto entrar. ¡Rezaba para que aparecieras! - -[JDT6_A3:JDT6] -~w~¡Salvatore ha perdido la chaveta! - -[JDT6_A6:JDT6] -~w~Asegúrate de que no le pase nada a Salvatore. - -[JDT6_0:JDT6] -Salud de Sal - -[JDT6_1:JDT6] -~r~Salvatore no ha sobrevivido. - -[JDT6_3:JDT6] -~w~Salvatore estará aquí en ~1~ s. - -[JDT6_5:JDT6] -~w~Protege a ~b~Salvatore~w~ de los ~r~Sindacco~w~. - -[JDT6_6:JDT6] -~w~¡Ha muerto uno de los ~b~guardias de Salvatore~w~! - -[JDT6_7:JDT6] -~w~¡Han matado a ambos ~b~guardias de Salvatore~w~! - -[JDT6_8:JDT6] -~w~¡Es la poli! - -[JDT6_10:JDT6] -~w~Apóstate en un buen lugar antes de que llegue Salvatore. - -[JDT6_11:JDT6] -~w~¿Adónde vas? Salvatore necesita protección en el Red Light District. - -[JDT6_12:JDT6] -Llega Salvatore - -[JDT6_D1:JDT6] -~w~Eh... - -[JDT6_D4:JDT6] -~w~¡A alguien se le ha caído un dólar! - -[JDT6_C0:JDT6] -~w~¿Esto es lo mejor que tenéis? - -[JDT6_C1:JDT6] -~w~¡Vamos! - -[JDT6_C2:JDT6] -~w~¡Lucháis como mariconas! - -[JDT6_C3:JDT6] -~w~Oh, ¿tú también quieres un poco? - -[JDT6_C4:JDT6] -~w~¡Chúpate ésa! - -[JDT6_C5:JDT6] -~w~¡Sois unas putas ratas! - -[JDT6_C6:JDT6] -~w~Mami, ¡esto es la leche puta! - -[JDT6_A4:JDT6] -~w~Va a bajar aquí en persona para cargarse a todo Sindacco que vea... - -[JDT6_A5:JDT6] -~w~Así que yo he escurrido el bulto. Mira, he dejado un rifle en el tejado, al otro lado de la calle. - -[JDT6_9:JDT6] -~w~Coge el ~g~rifle de francotirador~w~ del tejado. - -{=================================== MISSION TABLE JDT7 ===================================} - -[JDT7_VE:JDT7] -~r~v1.00 - -[JDT7_02:JDT7] -~w~Así que Salvatore ya ha limpiado su casa... ¡y ahora está arreglando la tuya! - -[JDT7_03:JDT7] -~w~¡Ahora es todo mío, Toni! - -[JDT703A:JDT7] -~w~Hemos echado a esos chupapollas de los Sindacco. - -[JDT7_04:JDT7] -~w~He oído que los sicilianos intentan negociar la paz entre las familias. - -[JDT7_4A:JDT7] -~w~Ahora mismo hay un pez gordo en casa de Sal. - -[JDT7_4B:JDT7] -~w~Pero le huele a gato encerrado. - -[JDT7_4C:JDT7] -~w~Quiere que alguien se acerque allí y lo siga, a ver adónde va. - -[JDT7_06:JDT7] -~r~No has alcanzado el helicóptero a tiempo, ¡Massimo ya se ha ido! - -[JDT7_07:JDT7] -~w~Sigue a ~r~Massimo~w~ y no lo pierdas. - -[JDT7_08:JDT7] -~r~Está a punto de~w~ escaparse. - -[JDT7_09:JDT7] -~r~¡Massimo se te ha escapado! - -[JDT7_10:JDT7] -~w~Parece que el helicóptero aterriza. No te acerques demasiado o los espantarás... - -[JDT7_11:JDT7] -~r~Te has acercado demasiado. ¡Te han descubierto! - -[JDT7_14:JDT7] -~r~Se está~w~ yendo... ~r~Síguele~w~ otra vez... - -[JDT7_15:JDT7] -Parece que ~w~Massimo~w~ está aterrizando allá arriba... - -[JDT7_16:JDT7] -~w~Tienes que ~y~acercarte más~w~... - -[JDT7_17:JDT7] -~r~¡Te has cargado la tapadera! - -[JDT7_21:JDT7] -~w~¡Te han visto! ¡Liquida a ~r~los de la Tríada~w~! - -[JDT7_12:JDT7] -~w~Come siamo rimasti d'accordo, - -[JDT712A:JDT7] -~w~si haces que mis socios trabajen para ellos, se te recompensará bien. - -[JDT7_13:JDT7] -~w~Hepburn Heights será para los Diablos. - -[JDT7_18:JDT7] -~w~Así que sigue acorralando a quei bastardi dei Leone en Portland... - -[JDT718A:JDT7] -y cuando mis socios controlen esta ciudad, se cuidará de ti. - -[JDT718B:JDT7] -Ci pensiamo noi. - -[JDT7_20:JDT7] -~w~¡Por allí! ¡Es un Leone! - -[JDT7_22:JDT7] -Distancia - -[JD_FIN:JDT7] -~w~¡Termina con los de la ~r~Tríada~w~! - -[JDT7_05:JDT7] -~w~Llega a la ~y~mansión de Salvatore~w~ antes de que se marche Massimo. - -[JDT7O07:JDT7] -~w~Ve a la ~y~mansión de Salvatore~w~. Massimo se irá a las ~1~:~1~. - -[JDT7O08:JDT7] -~w~Son casi las ~1~:~1~. ¡Massimo está a punto de irse! - -{=================================== MISSION TABLE JDT8 ===================================} - -[JDT8_A0:JDT8] -~w~Toni... ¡hoy es un gran día! ¡Me van a tomar juramento, seré un "bautizado"! - -[JDT8_A1:JDT8] -~w~¿J.D., un intocable? ¡Que Dios nos coja confesados! - -[JDT8_A2:JDT8] -~w~He esperado mucho para esto... y nunca lo habría conseguido sin ti, Toni. - -[JDT8_A3:JDT8] -~w~¡Eh! ¡Que me voy a echar a llorar! - -[JDT8_A4:JDT8] -~w~¡Eh, Mickey! ¿Cómo va? - -[JDT8_A5:JDT8] -~w~Bien... Yo me sentaré atrás... - -[JDT8_C:JDT8] -~w~Sube al ~b~coche~w~ y lleva a J.D. a su 'bautizo'. - -[JDT8_C2:JDT8] -~w~¡Métete en el ~b~coche~w~! - -[JDT8_C3:JDT8] -~w~Ve hasta la ~y~ceremonia~w~. - -[JDT8_B0:JDT8] -~w~¡Eh, Toni, ya te digo! No puedo creerme que esté ocurriendo. - -[JDT8_B1:JDT8] -~w~He esperado tanto... - -[JDT8_B2:JDT8] -~w~¡Trabajé como un negro para los Sindacco durante años y nada! - -[JDT8_B3:JDT8] -~w~Esos cabrones me mantuvieron al margen... - -[JDT8_B5:JDT8] -~w~Pero Salvatore, Dios lo bendiga, no ha permitido que una minucia así sea un obstáculo. - -[JDT8_B6:JDT8] -~w~¡Ya te digo! - -[JDT8_B7:JDT8] -~w~¡Es genial! - -[JDT8_B8:JDT8] -~w~Toni, ¡estoy tan emocionado! - -[JDT8_B9:JDT8] -~w~Toni, nunca sé qué hacer cuando me pongo tan nervioso. - -[JDT8_BA:JDT8] -~w~Mírame, no puedo creer lo que me está ocurriendo. - -[JDT8_BB:JDT8] -~w~Al fin, ¿eh, Toni? ¡Seré un 'bautizado'! - -[JDT8_D1:JDT8] -~w~¿Dónde está Salvatore? - -[JDT8_D2:JDT8] -~w~Toni, la primera ronda es mía... - -[JDT8_D3:JDT8] -~w~¡BANG! - -[JDT8_H0:JDT8] -~w~Eh, ese tipo era una puta rata. - -[JDT8_H1:JDT8] -~w~¡Se la jugó a su propio jefe! Disgrazia'. - -[JDT8_H2:JDT8] -~w~Salvatore nunca podría haber confiado en ese capullo. - -[JDT8_H3:JDT8] -~w~Hunde el puto coche en el río. - -[JDT8_H4:JDT8] -~w~Puedes dejarme de camino. - -[JDT8_J:JDT8] -~w~Sube al ~b~coche~w~ y lleva a Mickey a casa. - -[JDT8_J1:JDT8] -~w~¡La poli te ha visto con el coche! - -[JDT8_J2:JDT8] -~w~¡La poli te ha visto con el ~b~coche~w~! - -[JDT8_J3:JDT8] -~w~¡Vuelve a meterte en el ~b~coche~w~! - -[JDT8_J4:JDT8] -~w~Deja a Mickey en ~y~su casa~w~. - -[JDT8_K0:JDT8] -~w~¡Yo salgo de aquí a toda hostia! - -[JDT8_K1:JDT8] -~w~Recuerda. Hunde el coche en el río. - -[JDT8_F:JDT8] -~w~Hunde el coche en el río. - -[JDT8_F1:JDT8] -~w~Hunde el ~b~coche~w~ en el río. - -[JDT8_G5:JDT8] -~r~¡J.D. ha muerto! - -[JDT8_G6:JDT8] -~r~¡Mickey ha muerto! - -[JDT8_G8:JDT8] -~r~Se supone que tenías que llevar el coche al río. - -[JDT8_X0:JDT8] -~w~¿Adónde vas, Toni? - -[JDT8_X3:JDT8] -~w~Vamos a llegar tarde. - -[JDT8_X1:JDT8] -~w~Si la poli ve el coche así, fijo que nos buscará las cosquillas. - -[JDT8_X2:JDT8] -~w~La ceremonia es en Harwood. - -[JDT8_A6:JDT8] -~w~Toni... ¡Hoy es un gran día! - -[JDT8_A7:JDT8] -~w~¡Van a tomarme juramento, seré un 'bautizado'! - -[JDT8_A8:JDT8] -~w~¿J.D., un intocable? - -[JDT8__1:JDT8] -~w~He esperado mucho para esto... - -[JDT8__2:JDT8] -~w~Y nunca lo habría logrado sin ti, Toni. - -[JDT8_A9:JDT8] -~w~¡Que Dios nos coja confesados! - -[JDT8_D0:JDT8] -~w~¿Eh, es aquí? - -[JDT8_B4:JDT8] -~w~solo por tener sangre irlandesa en las venas. - -[JDT8_G7:JDT8] -~r~¡Los pasajeros han muerto! - -[JDT8_C4:JDT8] -~w~¡Acaba con los ~r~sicarios de los Sindacco~w~ antes de que se carguen a J.D.! - -[JDT8_0:JDT8] -~w~Repintar el coche te hará ganar algo de tiempo, pero la poli volverá a pisarte los talones en cuanto vea el fiambre en el asiento del copiloto. - -[JDT8_K:JDT8] -~w~¡Oh, no, tío! - -[JDT8_BC:JDT8] -~w~Toni, colega, tienes que tranquilizarte. - -[JDT8_C5:JDT8] -~w~Acaba con los ~r~sicarios de los Sindacco~w~. - -{=================================== MISSION TABLE MAC1 ===================================} - -[MAC1_AA:MAC1] -~w~¿Mamá? - -[MAC1_AB:MAC1] -~w~¡Soy yo! ¡He vuelto! - -[MAC1_AC:MAC1] -~w~¿Toni...? ¿Dónde diablos te habías metido? - -[MAC1_AM:MAC1] -~w~¡Ni una llamada mientras estabas desaparecido! - -[MAC1_AD:MAC1] -~w~¿No tenían teléfono donde estabas? - -[MAC1_AE:MAC1] -~w~¡Vamos, mamá! Sabes que no podía llamarte. - -[MAC1_AF:MAC1] -~w~Un hombre de verdad habría llamado a su madre. - -[MAC1_AG:MAC1] -~w~Podrías tomar ejemplo de Giovanni Casa. - -[MAC1_AN:MAC1] -~w~Él llama a su madre cada día, - -[MAC1_AH:MAC1] -~w~se ha reformado... - -[MAC1_AO:MAC1] -~w~¡y sus salchichas sicilianas son las mejores de la ciudad! - -[MAC1_AI:MAC1] -~w~¡Casa! Pero mamá, Casa no se ha reformado. ¡Es un pervertido! - -[MAC1_AJ:MAC1] -~w~¡Eso no es más que un marujeo! ¿Qué clase de hombre eres, Toni? - -[MAC1_AK:MAC1] -~w~Muy bien, mamá, lo que tú digas. - -[MAC1_AL:MAC1] -~w~Igual le hago a Giovanni una visita... a ver en qué anda metido. - -[MAC1_HA:MAC1] -~w~Creo que tengo ganas de mimitos. - -[MAC1_17:MAC1] -~w~Demuéstrale a mamá que Giovanni Casa no es un buen tipo. - -[MAC1_B:MAC1] -~w~Ve a tu ~y~piso~w~ a recoger la cámara. - -[MAC1_B0:MAC1] -~w~Ve a la ~y~charcutería de Casa~w~. - -[MAC1B2:MAC1] -~w~¡Buen disparo! Ahora lleva la foto a ~y~casa de mamá~w~. - -[MAC1_B3:MAC1] -~w~Acércate en silencio a ~r~Casa~w~ y sácale una foto comprometedora. - -[MAC1_B5:MAC1] -~w~No espantes a ~r~Casa~w~. - -[MAC1_B6:MAC1] -~r~¡Se te ha acabado el carrete! No has conseguido la foto comprometedora de Casa para llevársela a mamá. - -[MAC1_B7:MAC1] -~w~Recoge la ~g~cámara~w~. - -[MAC1_C0:MAC1] -~w~No te acerques demasiado o ~r~Casa~w~ se olerá algo. - -[MAC1_C1:MAC1] -~r~¡Le has espantado! ¡Ya nunca conseguirás esa foto! - -[MAC1_C2:MAC1] -~r~¡Algo ha espantado a Casa! - -[MAC1_C3:MAC1] -~r~¡Has perdido a Casa! - -[MAC1_C4:MAC1] -~r~¡Casa la ha diñado! - -[MAC1_C5:MAC1] -~w~¡Estás muy cerca de ~r~Casa~w~! - -[MAC1_C6:MAC1] -~w~¡No pierdas a ~r~Casa~w~! - -[MAC1_D0:MAC1] -~w~Parece que Casa ha encontrado un poco de acción. - -[MAC1_JA:MAC1] -~w~Bien, señoritas, hora del biberón. - -[MAC1_JB:MAC1] -~w~¿Quién va a hacer de mamá? - -[MAC1_JC:MAC1] -~w~¡Ay, la...! - -[MAC1_IA:MAC1] -~w~Bien, señoritas. Un segundo y estoy con vosotras. - -[MAC1_IB:MAC1] -~w~Me voy a poner algo un poco más... propio de mí. - -[MAC1_CA:MAC1] -~w~¡El nene quiere un abrazo! - -[MAC1_CB:MAC1] -~w~¡Me he hecho popó! - -[MAC1_DA:MAC1] -~w~¡Chupa mi muñequito! ¡Chúpalo! - -[MAC1_EA:MAC1] -~w~¡Eh, venga, chicas! ¡Seguidme el rollo! - -[MAC1_FA:MAC1] -~w~¡MIERDA! ¡Aquí hay alguien! - -[MAC1_FB:MAC1] -~w~¡Rápido! ¡Meteos en la furgo! - -[MAC1_GA:MAC1] -~w~¡Ay, Dios! ¡Ay, Dios! - -[MAC1_GB:MAC1] -~w~¡NO... ME... MIRES! - -[MAC1_BA:MAC1] -~w~Eh, mamá. - -[MAC1_BB:MAC1] -~w~¡Mira esta foto! El 'bueno' de Giovanni Casa... en pañales, nunca mejor dicho. - -[MAC1_BC:MAC1] -~w~¿Así es como pasas el tiempo? - -[MAC1_BD:MAC1] -~w~¿Arrastrándote por el suelo para sacar fotos de hombres? - -[MAC1_BE:MAC1] -~w~¿Qué te pasa, Antonio? ¡Me avergüenzas! - -[MAC1_BF:MAC1] -~w~¡Pero...! - -[MAC1_BG:MAC1] -~w~Y, con pañales o sin ellos, es mucho más bueno que tú. - -[MAC1_B8:MAC1] -~w~Ahora sal. - -[MAC1_B1:MAC1] -~w~Sigue a ~r~Casa~w~ pero no te acerques mucho. - -[MAC1_C7:MAC1] -~w~Acerca el zoom a ~r~Casa~w~ para hacerle la foto de la ~r~vergüenza~w~. - -[MAC1_D1:MAC1] -~w~No te despegues de ~r~Casa~w~. Podría ser una oportunidad para una foto. - -{=================================== MISSION TABLE MAC2 ===================================} - -[MAC2_AA:MAC2] -~w~¡Mamá...! ¡Mamá...! Vamos, mamá... háblame. - -[MAC2_AB:MAC2] -~w~¡Yo ya no soy tu 'mamá', cobarde, gallina...! - -[MAC2_AC:MAC2] -~w~A mí no me engañas... Sé muy bien por qué no has vuelto a vivir aquí. - -[MAC2_AD:MAC2] -~w~¡Te dan miedo los de la Tríada! - -[MAC2_AE:MAC2] -~w~Tu padre, que el Señor lo guarde, no habría dejado que nadie le echara de su propia casa. - -[MAC2_AF:MAC2] -~w~¡Pero mamá...! - -[MAC2_AG:MAC2] -~w~Pero, a diferencia de ti, tu padre no era un cagueta. - -[MAC2_AH:MAC2] -~w~¡Hasta que los de la Tríada no te muestren respeto, no eres mi hijo! - -[MAC2_AI:MAC2] -~w~Mi hija quizás, pero no mi hijo... - -[MAC2_B1:MAC2] -~w~Demuéstrale a mamá que esa gente no te asusta. ¡Ocúpate de las ~r~dos bandas de la Tríada~w~ de Chinatown! - -[MAC2_I1:MAC2] -~w~Hay un líder de la Tríada en esa ~r~furgoneta blindada~w~ del pescado. ¡Échalo de la carretera! - -[MAC2_I2:MAC2] -~w~La ~r~furgoneta~w~ está huyendo... ¡Y se le cae la carga! ¡Cuidado! - -[MAC2_I3:MAC2] -~w~¡Están saliendo! ¡Acaba con esa escoria de la ~r~Tríada~w~! - -[MAC2_I4:MAC2] -~w~¡Te han descubierto! ¡Cárgate a todos los ~r~miembros de la Tríada~w~! - -[MAC2_I5:MAC2] -~w~Estás en territorio de la ~r~Tríada~w~. ¡Ten cuidado! - -[MAC2_I6:MAC2] -~w~Una menos, queda otra más. ¡Acaba con la otra ~r~banda~w~! - -[MAC2_BA:MAC2] -~w~¡Sí! ¿Me estás viendo, mamá? - -[MAC2_BB:MAC2] -~w~¡Aquí Toni Cipriani, dándoos para el pelo! - -[MAC2_BC:MAC2] -~w~¡Recordad este nombre, merluzos! - -{=================================== MISSION TABLE MAC3 ===================================} - -[MAC3_A0:MAC3] -~w~¿Mamá? Ya he vuelto... - -[MAC3_A1:MAC3] -~w~¡Pero mírate! ¡Estás hecho un fideo! - -[MAC3_A2:MAC3] -~w~Si aún vivieras aquí, con tu madre, como un hijo de verdad, ¡estarías comiendo bien! - -[MAC3_A3:MAC3] -~w~¡Y mira esos coches que llevas! - -[MAC3_A4:MAC3] -~w~Me avergüenzo de ti, Antonio, de verdad. - -[MAC3_A5:MAC3] -~w~¡La gente va a creer que te he educado mal! - -[MAC3_A6:MAC3] -~w~¿Qué puedo hacer, mamá? Sabes que haría cualquier cosa por ti. - -[MAC3_A7:MAC3] -~w~Ese chico de los Sucho corre hoy en el centro. - -[MAC3_A8:MAC3] -~w~¡Si fueras un poco más como él! - -[MAC3_A9:MAC3] -~w~Él respeta a su madre de verdad. - -[MAC3_AA:MAC3] -~w~Claro que, si tu padre estuviera aquí, ganaría la carrera... - -[MAC3_AB:MAC3] -~w~¡Y borraría de la cara esa sonrisa de chuleta a Sucho! - -[MAC3_AC:MAC3] -~w~Sí, haría que tragase plomo. - -[MAC3_AD:MAC3] -~w~¡Tu padre sí que era un hombre! ¡Los tenía bien puestos! - -[MAC3_B0:MAC3] -~w~Demuestra que ningún Sucho es rival para ti. Gana la carrera y acaba con él. - -[MAC3_C0:MAC3] -~w~Has derrotado al ~r~Sucho~w~, ¡ahora acaba con él! - -[MAC3_C1:MAC3] -~w~¡~r~El Sucho~w~ se está largando! - -[MAC3_X0:MAC3] -~r~¡Has dejado que el Sucho se escape! - -[MAC3_C2:MAC3] -~w~¡~r~Sucho~w~ se está escapando! - -{=================================== MISSION TABLE MAC4 ===================================} - -[MAC4_A0:MAC4] -~w~¡Mamá...! ¡Mamá...! ¿Estás ahí? - -[MAC4_A1:MAC4] -~w~¡No pienso dirigirte la palabra, Toni! - -[MAC4_A2:MAC4] -~w~¡Traicionas tus raíces sicilianas! - -[MAC4_A3:MAC4] -~w~Cuando le hiciste esa foto a Casa, dejó de pagarnos por la protección. - -[MAC4_A4:MAC4] -~w~¿Y qué haces tú al respecto? - -[MAC4_A5:MAC4] -~w~¡NADA! - -[MAC4_A6:MAC4] -~w~¡Tu padre ya lo habría hecho picadillo! - -[MAC4_A8:MAC4] -~w~¡pero hace falta valor para ofender a un Cipriani! - -[MAC4_A9:MAC4] -~w~¡Ojalá tuvieras tú tantas pelotas! - -[MAC4_AA:MAC4] -~w~¿Quieres que tenga las pelotas de Casa? - -[MAC4_AB:MAC4] -~w~¡Vale, mamá! ¡Tú lo has querido! - -[MAC4_B:MAC4] -~w~Pasa por la ~y~charcutería de Giovanni Casa~w~ y convéncelo de que dé una vuelta en coche contigo. - -[MAC4_B0:MAC4] -~w~Hola, Toni... ¿Cómo estás? - -[MAC4_B1:MAC4] -~w~¿Qué pasa? - -[MAC4_B2:MAC4] -~w~¿Se te ha comido la lengua el gato? - -[MAC4_B3:MAC4] -~w~Tú y yo tenemos que hablar, Casa... - -[MAC4_B4:MAC4] -~w~Pero en un lugar más discreto. - -[MAC4_C:MAC4] -~w~No dejes que ~r~Casa~w~ salga con vida. - -[MAC4_C1:MAC4] -~w~¡Pagaré por la protección, Toni! ¡Te juro que lo haré! - -[MAC4_C2:MAC4] -~w~¡Au! ¡Venga, Toni! ¡Te daré todo lo que quieras! - -[MAC4_C3:MAC4] -~w~¡Haré lo que sea, Toni! ¡Lo que sea! ¡Pero no me hagas daño! - -[MAC4_D1:MAC4] -~w~¡Vale! ¡Vale! ¡Tú ganas! - -[MAC4_D2:MAC4] -~w~¡Vale! ¡Vale! ¡Me rindo! ¡Me rindo! ¡Pero no me pegues más! - -[MAC4_D3:MAC4] -~w~¡Ven conmigo, caraculo! - -[MAC4_E0:MAC4] -~w~Lleva a Casa al ~y~aserradero~w~. - -[MAC4_E1:MAC4] -~w~¡No dejes a ~b~Casa~w~! - -[MAC4_F0:MAC4] -~w~Bueno y... eeh... ¿Adónde vamos? - -[MAC4_F1:MAC4] -~w~Aún somos amigos, ¿no, Toni? - -[MAC4_F2:MAC4] -~w~Te daré el dinero que te debo... De verdad. - -[MAC4_F3:MAC4] -¡Solo necesito un poco más de tiempo! - -[MAC4_F4:MAC4] -~w~¿Aún le gustan a tu mamá las salchichas picantes? - -[MAC4_F5:MAC4] -¡Le llevaré algunas, no hay problema! - -[MAC4_G0:MAC4] -~w~Bueno... ejem... ¿Y de qué querías hablarme, Toni? - -[MAC4_G1:MAC4] -~w~¿Es del dinero de la protección? - -[MAC4_G2:MAC4] -~w~¿Es eso o no? - -[MAC4_G3:MAC4] -~w~¿... Toni? - -[MAC4_G4:MAC4] -~w~Podemos hablarlo. ¿No, Toni? - -[MAC4_G6:MAC4] -~w~Y la gente no habla mucho estos días, Toni. - -[MAC4_G7:MAC4] -~w~Ponte allí y cierra la bocaza, Casa. - -[MAC4_G8:MAC4] -~w~Vale, Toni. Pero esto... esto me da muy mala espina. - -[MAC4_G9:MAC4] -~w~¡Eh! ¡Cuidado con eso, Toni! Es el interruptor de... - -[MAC4_GA:MAC4] -~w~¡AAARRRGGGHHHHHHHH! - -[MAC4_GB:MAC4] -~w~¡Sal de aquí a toda pastilla! - -[MAC4_H:MAC4] -~w~El picadillo para las 'salchichas a la Casa' está en la ~b~furgoneta~w~, listo para llevarlo a la charcutería. - -[MAC4_H1:MAC4] -~w~Lleva la mercancía a la ~y~charcutería de Casa~w~. - -[MAC4_H2:MAC4] -~w~¡No dejes la ~b~furgoneta~w~ ahí! - -[MAC4_H3:MAC4] -¡Líbrate de la poli! - -[MAC4_I0:MAC4] -~w~¿Una entrega especial de picadillo...? - -[MAC4_I1:MAC4] -~w~Nadie me había avisado. - -[MAC4_I2:MAC4] -~w~¡Guau! ¿Qué zoo hemos asaltado esta vez? - -[MAC4_I3:MAC4] -~w~¡Ahí atrás hay un montón de carne! - -[MAC4_I4:MAC4] -~w~¡Mm! ¡Deliciosa! Vale, me la llevo. - -[MAC4_I6:MAC4] -~w~Si lo descubre, se pondrá hecho una furia. - -[MAC4_I7:MAC4] -~w~¡Y yo estaré jodido! - -[MAC4_X0:MAC4] -~r~¡Demasiado rápido e indoloro para ser un castigo siciliano! - -[MAC4_X1:MAC4] -~r~Se supone que tenías que entregar la furgoneta. - -[MAC4_X2:MAC4] -~r~¡Has perdido a Casa! - -[MAC4_E2:MAC4] -~w~¡No te largues del ~y~aserradero~w~! - -[MAC4_I5:MAC4] -~w~Es una suerte que Casa no esté aquí. - -[MAC4_G5:MAC4] -~w~¡Sí! ¡Sí! Hablando se entiende la gente. - -[MAC4_CN:MAC4] -~w~¡Policía! - -[MAC4_CO:MAC4] -~w~¡Ayuda! - -[MAC4_CP:MAC4] -~w~¡Que alguien pida ayuda! - -[MAC4_CQ:MAC4] -~w~¡Socorro! - -[MAC4_CR:MAC4] -~w~¡Que alguien me ayude! - -[MAC4_CS:MAC4] -~w~¡Que alguien me saque de aquí! - -[MAC4_A7:MAC4] -~w~Puede que Casa sea un payasete, - -[MAC4_C0:MAC4] -~w~¿No podemos hablarlo civilizadamente, Toni? - -[MAC4_1:MAC4] -~w~Acércate sigilosamente a ~r~Casa~w~ por la espalda. - -{=================================== MISSION TABLE MAC5 ===================================} - -[MAC5_AA:MAC5] -~w~¿Mamá? ¿Estás ahí? - -[MAC5_AB:MAC5] -~w~¿Toni? Estoy al teléfono... - -[MAC5_AC:MAC5] -~w~Si, sí. Está aquí. Vale, de acuerdo. No se irá. Adiós. - -[MAC5_AD:MAC5] -~w~¿Toni? Has venido a enfadar a tu madre otra vez, ¿no? - -[MAC5_AE:MAC5] -~w~Te pasas todo el día haciéndote el duro. - -[MAC5_AF:MAC5] -~w~No vienes a verme ni me presentas a ninguna chica apañadita. - -[MAC5_AG:MAC5] -~w~Pero, ¿quién iba a quererte? ¡Si estás pálido y en los huesos! - -[MAC5_AH:MAC5] -~w~Intentas matarme a disgustos y bochornos. ~w~Pero se acabó. - -[MAC5_AI:MAC5] -~w~Desde ya... hemos terminado. - -[MAC5_AJ:MAC5] -~w~He encargado que te maten. Ésa es la única manera, Antonio... - -[MAC5_AK:MAC5] -~w~Siempre has sido un chico desobediente. - -[MAC5_AL:MAC5] -~w~¿Qué? ¡Mamá! - -[MAC5_AM:MAC5] -~w~Es lo mejor, hijo... ¡Al menos intenta morir como un hombre! - -[MAC5_AN:MAC5] -~w~¡Y deja de avergonzarme! - -[MAC5_B1:MAC5] -~w~¡Los sicarios de mamá ya están aquí! - -[MAC5_B2:MAC5] -~w~Demuéstrale a mamá que sus ~r~sicarios~w~ no son rivales para ti. ¡Mátalos! - -[MAC5_B3:MAC5] -~w~¡Ahora sí que se han enfadado! ~r~Elimínalos~w~. - -[MAC5_B4:MAC5] -~w~Los ~r~sicarios~w~ saben que estás aquí. Debes alejarte de Saint Mark's. - -[MAC4_B6:MAC5] -~w~¡Vienen más ~r~sicarios~w~! Sal de Saint Mark's. ¡Saben dónde estás! - -[MAC4_B7:MAC5] -~w~¡GRANADA! ¡CORRE! - -[MAC5_C1:MAC5] -~w~Te has librado de ellos... pero ahora que les han pagado, harán su trabajo, por mucho que cueste. - -[MAC5_C2:MAC5] -~w~Quedas avisado... ¡Volverán! - -[HM1:MAC5] -~w~¡No se rinden! Más ~r~sicarios~w~ van a por ti. ¡Cárgatelos! - -[HM2:MAC5] -~w~¡Cuidado! Los ~r~sicarios~w~ se te acercan. ¡Liquídalos! - -[HM3:MAC5] -~w~Se acercan más ~r~sicarios~w~. ¡Acaba con ellos! - -[HM4:MAC5] -~w~¡Hay más ~r~sicarios~w~ en camino! ¡Elimínalos! - -[MAC5_B5:MAC5] -~w~Encárgate de los ~r~sicarios~w~ restantes pero no te acerques a Saint Mark's. - -{=================================== MISSION TABLE MAR1 ===================================} - -[MAR1M1:MAR1] -~w~¡Llegas tarde! Típico de los hombres. - -[MAR1M2:MAR1] -~w~Quiero ir de compras y tú vas a conducir. - -[MAR1M3:MAR1] -~w~Así que ayúdame. Hoy quiero divertirme. ¡Aunque te dejes la piel! - -[MAR1M4:MAR1] -~w~Solo tengo que acabar de arreglarme. - -[MAR1M5:MAR1] -~w~¡Joder! Estoy divina. Vamos, Toni. - -[MAR1_B:MAR1] -~w~Lleva a María a la ~y~tienda~w~. - -[MAR1_D:MAR1] -~w~Espera aquí, corazón, no tardo mucho... - -[MAR1_D2:MAR1] -~w~Solo quería ver qué aspecto tenía a la luz del día. - -[MAR1_E:MAR1] -~w~¡Salgamos de aquí! - -[MAR1_E3:MAR1] -~w~Vuelve y recoge a ~b~María~w~. - -[MAR1_F:MAR1] -~w~¡Qué divertido! Pero ahora tengo que coger algunas cosas más. - -[MAR1_G:MAR1] -~w~No apagues el motor... - -[MAR1_GB:MAR1] -~w~¡Vamos, María! ¡Basta de mangar! - -[MAR1_GC:MAR1] -~w~Ay, tranquilo, nene. ¡Solo ha sido un malentendido! - -[MAR1_G2:MAR1] -~w~¡Te digo que aquí no llevo nada escondido! - -[MAR1_H:MAR1] -~w~¡Llévame a casa! - -[MAR1_I:MAR1] -~w~¡Si me dejas aquí, haré que Salvatore te corte las pelotas! - -[MAR1_J:MAR1] -~r~¡María ha muerto! ¡Madre del amor hermoso! - -[MAR1_K:MAR1] -~w~Toni, cariño, hoy me lo he pasado pipa. - -[MAR1_K2:MAR1] -~w~Igual podrías pasarte más tarde y lo pasaríamos mejor. - -[MAR1_K3:MAR1] -~w~¡Nos vemos luego, guapetón! - -[MAR1_L:MAR1] -~w~¡Nos sigue la poli! ¡Será mejor que la despistes! - -[MAR1_L2:MAR1] -~w~¡Creo que les has despistado! ¡Vamos de compras! - -[MAR1_M:MAR1] -~w~¡QUE ME ROBA! - -[MAR1EXT:MAR1] -~w~Lleva a María a su ~y~apartamento~w~. - -[MAR1_1:MAR1] -NONE - -[MAR1_D3:MAR1] -~w~¡Quítame tus sucias manos de encima! - -[MAR1_G3:MAR1] -~w~¡Que me dejes en paz! - -[MAR1_E2:MAR1] -~w~¡Líbrate de la presión policial! - -{=================================== MISSION TABLE MAR2 ===================================} - -[MAR2_AA:MAR2] -~w~¡Corta! Uno de los perros de Salvatore me llevará... - -[MAR2_AB:MAR2] -~w~Ay, es un encanto... - -[MAR2_AC:MAR2] -~w~aunque un poco delgadito. - -[MAR2_AE:MAR2] -~w~Escucha. Quiero dar una fiesta, pero tengo el armario vacío. - -[MAR2_AF:MAR2] -~w~¿Tienes 'harina'? De la fina, ¿eh? - -[MAR2_AG:MAR2] -~w~Estupendo. ¡Ciao! - -[MAR2_AH:MAR2] -~w~Vamos, Toni. Tengo que ir a un sitio. - -[MAR2_BA:MAR2] -~w~¿No tienes coche? - -[MAR2_BB:MAR2] -~w~En marcha. El camello no me esperará todo el día. - -[MAR2_3F:MAR2] -~w~Lleva a María a ver a los ~y~camellos~w~. - -[MAR2_BC:MAR2] -~w~Allí están. Ponte detrás de ellos. Buen chico. - -[MAR2_GA:MAR2] -~w~Tú espérame aquí. - -[MAR2_GB:MAR2] -~w~Esto no me gusta... - -[MAR2_GC:MAR2] -~w~Qué detalle que te preocupes. Pero soy la chica de Salvatore, tranqui. - -[MAR2_GE:MAR2] -~w~¡No voy a ir a ningún sitio contigo! ¿Quién diablos te crees que eres? - -[MAR2_GF:MAR2] -~w~¡En marcha! - -[MAR2_GG:MAR2] -~w~¡Toni! - -[MAR2_GH:MAR2] -~w~¡Oh, mierda! - -[MAR2_19:MAR2] -~w~¡Mata a los ~r~Sindacco~w~! - -[MAR2_EA:MAR2] -~w~¿Ya estás contenta? - -[MAR2_EB:MAR2] -~w~Toni Cipriani. ¡Mi héroe! - -[MAR2_EC:MAR2] -~w~¿Sabes qué? Estoy rota. Llévame a casa, machote. - -[MAR2_HA:MAR2] -~w~¿No quieres pasarte a... hacer... eh... un café o algo? - -[MAR2_HB:MAR2] -~w~Paso. - -[MAR2_HC:MAR2] -~w~¿Seguro? Bueno, llámame. - -[MAR2_O2:MAR2] -~w~Lleva a María a su ~y~apartamento~w~. - -[MAR2_CA:MAR2] -~w~¡Vamos, Toni! - -[MAR2_CB:MAR2] -~w~¡Por Dios, Toni, ven! - -[MAR2_CC:MAR2] -~w~¡Sálvame, Toni! - -[MAR2_CD:MAR2] -~w~¡Socorro! - -[MAR2_CE:MAR2] -~w~¡Veeeengaaaa! - -[MAR2_FA:MAR2] -~w~¿Y ahora de dónde se supone que sacaré la droga? - -[MAR2_FB:MAR2] -~w~¡Eres el colmo, Toni! - -[MAR2_LM:MAR2] -~w~Has dejado atrás a ~b~María~w~. Vuelve a por ella. - -[MAR2_MD:MAR2] -~r~María ha muerto. - -[MAR2_WA:MAR2] -~w~¡Los ~r~camellos~w~ se están escapando! - -[MAR2_DM:MAR2] -~r~¡Has perdido a los camellos! - -[MAR2_DA:MAR2] -~w~¡Vaya héroe estás hecho! - -[MAR2_DF:MAR2] -~r~¡Has asustado a los camellos de María! - -[MAR2_18:MAR2] -~w~Embiste el ~r~coche de los Sindacco~w~ para rescatar a María. - -[MAR2_AD:MAR2] -~w~... sí. - -{=================================== MISSION TABLE MAR3 ===================================} - -[MAR3_A0:MAR3] -~w~'Querido Toni, me he puesto como primer premio de una carrera callejera. - -[MAR3_A1:MAR3] -~w~Si Salvatore lo descubre, los dos nos vamos a meter en un marrón. - -[MAR3_A2:MAR3] -~w~Así que ven y sálvame el culo... Entonces puede que sea para ti... - -[MAR3_A3:MAR3] -~w~Tuya para siempre, María.' - -[MAR3_E0:MAR3] -~w~Venga, María. Vámonos. - -[MAR3_E1:MAR3] -~w~¡Por fin! El señor Tipo Duro mueve ficha. - -[MAR3_E2:MAR3] -~w~María, eres la chica de Salvatore... - -[MAR3_E3:MAR3] -~w~¡Yo no tengo dueño! - -[MAR3_E4:MAR3] -~w~¡Menudo carca estás hecho! - -[MAR3_E5:MAR3] -~w~¡Vámonos de marcha, Wayne! - -{=================================== MISSION TABLE MAR4 ===================================} - -[MAR4_B1:MAR4] -~w~Wayne está con su banda en ~y~Chinatown~w~. - -[MAR4_B2:MAR4] -~w~¡Plántate allí y bórralo del mapa! - -[MAR4_C1:MAR4] -¡~r~Wayne~w~ se escapa! ¡Pilla una moto y mátalo! - -[MAR4_C3:MAR4] -~w~¡Lo estás perdiendo! ¡No dejes que ~r~Wayne~w~ escape! - -[MAR4_D1:MAR4] -~w~¿Eres Wayne? - -[MAR4_D2:MAR4] -~w~¿Quién lo pregunta? - -[MAR4_D3:MAR4] -~w~Soy un amigo de María. - -[MAR4_D4:MAR4] -~w~Pegar a las mujeres te pone a cien... ¿eh? - -[MAR4_D5:MAR4] -~w~¡Esa perra se lo buscó! - -[MAR4_D6:MAR4] -~w~¿Sí? Bueno, pues tú también. - -[MAR4_D7:MAR4] -~w~¡A por él! - -[MAR4_T1:MAR4] -~w~¡Vamos, tío duro! - -[MAR4_T2:MAR4] -~w~¡No tienes huevos! - -[MAR4_T3:MAR4] -~w~¡Conduces la moto con el culo! - -[MAR4_T4:MAR4] -~w~¡Bésame el culo, si es que logras acercarte! - -[MAR4_F1:MAR4] -~r~¡Has dejado que Wayne se escape! - -[MAR4_P1:MAR4] -~w~¡Has liquidado al chulito! - -[MAR4_H1:MAR4] -Salud de Wayne - -[MAR4_C4:MAR4] -~w~No pierdas a ~r~Wayne~w~. ¡Persíguelo y acaba con él! - -[BIK_01:MAR4] -Y ahora ¿qué te ha dado? - -[BIK_02:MAR4] -Nada. - -[BIK_03:MAR4] -¿De qué se trata esta vez, eh? - -[BIK_04:MAR4] -¿Jaco? ¿Somníferos? ¿Anfetas? ¿Demasiada coca? - -[BIK_08:MAR4] -¿Quién te ha hecho esto? - -[BIK_09:MAR4] -Nadie. - -[BIK_10:MAR4] -¿Quién ha sido? - -[BIK_11:MAR4] -Ese tío con el que salgo, Wayne. - -[BIK_12:MAR4] -¿Sales con un tío? ¡Pero si eres la chica de mi jefe! - -[BIK_13:MAR4] -Vamos, Toni, no seas tan carroza. Además, me pasa un 'speed' que flipo, ¿sabes? - -[BIK_14:MAR4] -Me levanta la moral. - -[BIK_15:MAR4] -Y me pone muy perra en la cama. - -[BIK_16:MAR4] -Cállate. ¿Por qué te ha hecho esto... - -[BIK_17:MAR4] -ese picha floja de Wayne? - -[BIK_18:MAR4] -Le he dicho que estaba enamorada de otro. - -[BIK_19:MAR4] -Le he hablado de ti y de mí, Toni. - -[BIK_22:MAR4] -¿Dónde está ese Wayne? - -[BIK_23:MAR4] -Pasa lo suyo en un bar de Chinatown. - -[BIK_24:MAR4] -Te amo, Toni Cipriani. - -[BIK_06:MAR4] -- ¿No estás lo bastante colgada? ~n~ - ¡Cállate, Toni! - -[BIK_05:MAR4] -¿No has tomado bastante Ducepán? - -[BIK_20:MAR4] -- ¡Y entonces me ha pegado! ~n~- ¡Pero si no tenemos nada! Dios, vas a acabar conmigo. - -{=================================== MISSION TABLE MAR5 ===================================} - -[MAR5_EA:MAR5] -~w~¿Por qué me has traído aquí? - -[MAR5_EB:MAR5] -~w~No tengo aquí las pastis... Aquí es por donde Wayne solía pasarse. - -[MAR5_EC:MAR5] -~w~¡Ya me acuerdo! ¡Tengo algún Zap escondido en Hepburn Heights! - -[MAR5_ED:MAR5] -~w~¡Eh, es esa perra de María! ¡Y ése es el cabrón que mató a Wayne! - -[MAR5_AA:MAR5] -~w~¡Escondí el Zap detrás del cubo de basura! - -[MAR5_AB:MAR5] -~w~¡Mierda! ¡Se han llevado la basura! - -[MAR5_AC:MAR5] -~w~¡Espera! ¡Ya me acuerdo! ¡Aún tengo una reserva en el piso! - -[MAR5_AD:MAR5] -~w~¿Esta vez estás segura? - -[MAR5_AE:MAR5] -~w~¡Claro que sí! - -[MAR5_BA:MAR5] -~w~¡Quería decir en casa de Salvatore! ¡Sí, allí! - -[MAR5_BB:MAR5] -~w~¡Por el amor de Dios, María! - -[MAR5_FA:MAR5] -~w~¿Por qué conduces tan lento? ¡Podría haber muerto de sobredosis! - -[MAR5_FB:MAR5] -~w~¡Estoy hecha un desastre! Necesito ropa nueva, un planchado de cara... Todo... - -[MAR5_FC:MAR5] -~w~Cariño... ¿tienes algo de dinero? - -[MAR5_FD:MAR5] -~w~Eh... No, la verdad... - -[MAR5_FE:MAR5] -~w~¿Por qué leches te me has estado insinuando? ¡Soy la chica de Salvatore! - -[MAR5_FF:MAR5] -~w~¡Él está forrado! ¡No vuelvas a tirarme los trastos! - -[MAR5_CA:MAR5] -~w~(Gemido) - -[MAR5_CB:MAR5] -~w~Mierda, creo que voy a potar. - -[MAR5_CC:MAR5] -~w~¡Voy hasta los ojos, Toni! - -[MAR5_CD:MAR5] -~w~No me encuentro muy bien. - -[MAR5_CE:MAR5] -~w~¡Vas muy rápido! ¡Y muy lento! - -[MAR5_NC:MAR5] -~b~María~w~ apenas puede andar. ¡Consigue un coche! - -[MAR5_ND:MAR5] -~w~María apenas puede andar. ¡Consigue un vehículo! - -[MAR5_DA:MAR5] -~w~¡Te vamos a matar, cabronazo! - -[MAR5_DB:MAR5] -~w~¡Tú y tu putita moriréis esta noche! - -[MAR5_DC:MAR5] -~w~¡La has cagado bien por tocarnos los cojones! - -[MAR5_LM:MAR5] -~w~Has dejado atrás a ~b~María~w~. Vuelve a por ella. - -[MAR5_O1:MAR5] -~w~Lleva a María al restaurante de ~y~Callahan Point~w~. - -[MAR5_O2:MAR5] -~w~Lleva a María a ~y~Hepburn Heights~w~. - -[MAR5_O3:MAR5] -~w~Lleva a María a ~y~su piso~w~. - -[MAR5_O4:MAR5] -~w~Lleva a María a la ~y~mansión de Salvatore~w~. - -[MAR5_O5:MAR5] -~w~Vuelve a por ~b~María~w~. - -[MAR5_MD:MAR5] -~r~¡María ha muerto! - -[MAR5_O6:MAR5] -~w~Recoge a ~b~María~w~. - -[OVER_01:MAR5] -Oh, eh, cariño... Creía que nunca vendrías. - -[OVER_02:MAR5] -Pero ¿qué pasa contigo? - -[OVER_03:MAR5] -¡Ay! Nada, cariño. Va todo bien. - -[OVER_04:MAR5] -Levántate, sonada de mierda. ¿Qué te has metido ahora? - -[OVER_05:MAR5] -¿Metido, ahora? No gran cosa. - -[OVER_06:MAR5] -Un par de... un par de las verdes... un par de las rojas fuertes. - -[OVER_07:MAR5] -Y esas pastillas tan guays que me traen de Holanda. - -[OVER_08:MAR5] -¡Pura dinamita! Estoy de puta madre. - -[OVER_09:MAR5] -No, qué va. - -[OVER_10:MAR5] -¡Necesito un Zap y estaré como nueva! - -[OVER_11:MAR5] -Los tengo por aquí. - -[OVER_12:MAR5] -¿Qué es un Zap? - -[OVER_13:MAR5] -¿Un Zap? ¿No sabes lo que es un Zap? - -[OVER_14:MAR5] -Ay, Toni, eres tan carroza... - -[OVER_17:MAR5] -¡Necesito un Zap, Toni! ¡Me muero! - -[OVER_18:MAR5] -Ya he estado así, es una sobredosis. - -[OVER_19:MAR5] -¡Consígueme un Zap, Toni! - -[OVER_20:MAR5] -Los dejé en un restaurante de Callahan Point. - -[OVER_21:MAR5] -No te quedes ahí sentada, venga. - -[OVER_15:MAR5] -- Toni, te quiero. ~n~ - Vamos, no digas chorradas. - -{=================================== MISSION TABLE VIC1 ===================================} - -[VIC1I11:VIC1] -~w~Te he buscado un buen rincón donde vivir, Toni. - -[VIC1I12:VIC1] -~w~Parece hecho a tu medida. - -[VIC1I13:VIC1] -~w~Vamos primero allí. - -[VIC1I14:VIC1] -~w~Eres un pedazo de pan. - -[VIC1_3:VIC1] -~w~Lleva a Vincenzo a su ~y~almacén~w~. - -[VIC1_4:VIC1] -~w~¡Vuelve a meterte en el ~b~coche~w~! - -[VIC1_5:VIC1] -~w~Lleva a Vincenzo al ~y~piso franco~w~. - -[VIC1_6:VIC1] -~w~Camina hasta la señal amarilla, en la ~y~entrada~w~. - -[VIC1_7:VIC1] -~w~Ve hasta el icono de la ropa para cambiarte. - -[VIC1_8:VIC1] -~w~Vuelve afuera con Vincenzo. - -[VIC1_9:VIC1] -~w~Lleva a Vincenzo a ~y~Atlantic Quays~w~. - -[VIC1_9A:VIC1] -~w~Y ahora, llévame a mi casa. - -[VIC1_10:VIC1] -~w~Sube al ~b~coche~w~. - -[VIC1_D1:VIC1] -~w~¡Joder, Toni! ¡Conduces como una mujer! - -[VIC1_D2:VIC1] -~w~¡Cuidado con el puto coche! - -[VIC1_D3:VIC1] -~w~Toni, deja de faltarme el respeto y conduce como un hombre, ¡capullo! - -[VIC1_C1:VIC1] -~w~Es aquí, Toni. Hogar, dulce hogar. Bonito, ¿no? - -[VIC1_C2:VIC1] -~w~¿Se supone que este agujero va a ser mi casa? - -[VIC1_C3:VIC1] -~w~¡Venga! Si te va que ni pintado... - -[VIC1_C4:VIC1] -~w~Ya le estás faltando el respeto al bueno de Vincenzo. - -[VIC1_C5:VIC1] -~w~Venga, tipo duro, sube cagando leches y ponte algo de ropa decente. - -[VIC1_C6:VIC1] -~w~No tengo todo el día, espabila. - -[VIC1_C7:VIC1] -~w~Eh, los pisos no los regalan, Toni. - -[VIC1_C8:VIC1] -~w~No olvides quién paga las facturas. - -[VIC1_C9:VIC1] -~w~¡YO! Papá Vincenzo, un servidor. - -[VIC1C10:VIC1] -~w~A partir de ahora, trabajas para mí. - -[VIC1C11:VIC1] -~w~Espero volver a verte bien pronto por aquí. - -[VIC1_F:VIC1] -~r~Vincenzo ha muerto. - -[HOMS_01:VIC1] -Eh... ahí lo tenemos, ¿no? - -[HOMS_02:VIC1] -Escucha, Toni, sé que te has portado muy bien con nosotros, - -[HOMS_03:VIC1] -y que has estado mucho tiempo pasando inadvertido, - -[HOMS_04:VIC1] -así que tómatelo con calma un tiempo, ¿eh? - -[HOMS_05:VIC1] -Vincenzo cuidará de ti. - -[HOMS_06:VIC1] -Si necesitas pasta, pídesela. - -[HOMS_07:VIC1] -Necesitas un trabajo. Lucky se encargará de ti. - -[HOMS_08:VIC1] -¿Qué más puede pedir alguien de la familia? - -[HOMS_09:VIC1] -Ni mi hijo tiene tanta suerte. - -[HOMS_10:VIC1] -Sr. Leone, yo me esperaba otra cosa. - -[HOMS_11:VIC1] -Es decir, he hecho mucho por esta familia. - -[HOMS_12:VIC1] -Y ahora, quiere que acepte órdenes de este... este... este... - -[HOMS_13:VIC1] -Bueno, es que no me parece... justo. - -[HOMS_14:VIC1] -Toni, sé lo que has hecho, y nadie te está más agradecido que yo, de verdad, - -[HOMS_15:VIC1] -pero la idea de que vengas aquí... - -[HOMS_16:VIC1] -y te pongas a cuestionar mi liderazgo es, francamente, - -[HOMS_17:VIC1] -improcedente. ¿Capisci? - -[HOMS_18:VIC1] -Entendido, jefe. - -[HOMS_19:VIC1] -Bueno, cuando necesites algo, llama a Vincenzo a Atlantic Quay. - -[HOMS_20:VIC1] -Él se encargará de ti. ¿No, Lucky? - -[HOMS_21:VIC1] -Por supuesto, jefe. Lo que usted diga. - -[HOMS_22:VIC1] -¿Qué tal si vamos para allá? - -{=================================== MISSION TABLE VIC2 ===================================} - -[VIC2M2:VIC2] -Pero hace días que ese colgado no nos trae pasta. - -[VIC2M3:VIC2] -Igual hay que meterle una patada en el culo para espabilarlo y que trabaje. - -[VIC2M4:VIC2] -Es como una zorra... Me recuerda un poco a ti. - -[VIC2M5:VIC2] -~w~¿Qué insinúas? - -[VIC2M6:VIC2] -¡No INSINÚO nada! - -[VIC2M7:VIC2] -Te digo directamente que vayas allí y te asegures de que ese capullo empiece a traer el puto dinero. - -[VIC2_B:VIC2] -~W~Consigue un coche. - -[VIC2OB1:VIC2] -~w~Lleva al camello a ~y~trabajar~w~. - -[VIC2_C:VIC2] -~w~¡Necesitas un coche para llevarlo a su zona habitual! - -[VIC2_D:VIC2] -~w~Recoge al camello de Vincenzo en el distrito de ~y~St. Mark~w~. - -[VIC2_E:VIC2] -~w~Vincenzo dice que eres un rajado de mierda que no se curra su zona... - -[VIC2_E2:VIC2] -~w~¡Eh! No soy ningún rajado. - -[VIC2_EX:VIC2] -~w~He... estado enfermo, nada más. - -[VIC2_E3:VIC2] -~w~Volveré a currar mañana... o puede que pasado. - -[VIC2_E4:VIC2] -~w~Creo que vas a ir ahora mismo... ¡Te guste o no! - -[VIC2_F:VIC2] -~w~¡Eh! ¡No me dejes aquí! ¡Este barrio es muy chungo, colega! - -[VIC2_F2:VIC2] -~w~Has dejado atrás al ~b~camello de Vincenzo~w~, vuelve y recógelo. - -[VIC2_G:VIC2] -~w~¡Escucha, tío! Se lo dije a Vinnie... ¡Chinatown ya no es de los Leone! - -[VIC2_G2:VIC2] -~w~¡Están entrando los Sindacco! Si voy allí, soy hombre muerto. - -[VIC2_G3:VIC2] -~w~Claro... claro... - -[VIC2_G4:VIC2] -~w~¡Lo que yo te diga! Los Sindacco están en el ajo. - -[VIC2_G5:VIC2] -~w~No me encuentro muy bien... Creo que estoy destemplado o algo. - -[VIC2_H:VIC2] -~w~Para cerca del ~b~camello~w~. - -[VIC2_I:VIC2] -~w~Ay, tío... - -[VIC2_J:VIC2] -~r~¡El camello de Vincenzo la ha diñado! - -[VIC2_K:VIC2] -~w~Lleva al camello de Vincenzo a ~y~Chinatown~w~. - -[VIC2_1:VIC2] -NONE - -[VIC2M1:VIC2] -Tenemos a un camello trabajando en la zona norte de Chinatown. - -{=================================== MISSION TABLE VIC3 ===================================} - -[VIC3_H1:VIC3] -~w~Mantén pulsado~h~ ~k~ ~PDLT~ ~w~para ~h~fijar un blanco~w~ y pulsa~h~ ~k~ ~PDFW~ ~w~para atacar. - -[VIC3_H2:VIC3] -~w~Pulsa~h~ ~k~ ~PDFW~ ~w~para atacar al ~h~camello~w~. - -[VIC3O2:VIC3] -~w~Dirígete a ~y~Chinatown~w~. - -[VIC3O3:VIC3] -~w~Cárgate al ~r~camello~w~. - -[VIC3_1:VIC3] -~w~Vincenzo te ha dejado un regalito que puede ayudarte. - -[VIC3_BA:VIC3] -~w~¡Fuera del territorio de los Leone, pringado! - -[VIC3_BB:VIC3] -~w~¿Quieres más, caraculo? - -[VIC3_BC:VIC3] -~w~¡Aquí solo trafican los Leone! ¡Y nadie más! ¿Me oís, putos Sindacco? - -[VIC3_6:VIC3] -~w~Los Sindacco están traficando por toda Chinatown. - -[VIC3_AA:VIC3] -~w~¿Vinnie? - -[VIC3_AB:VIC3] -~w~¡Por Dios, Toni! ¿Es que no puedo tener ni un respiro? - -[VIC3_AD:VIC3] -~w~Bastantes 'aprietos' tengo para que encima aparezcas por mi queli... - -[VIC3_AE:VIC3] -~w~Pero ya que estás aquí, que sepas que no he visto nada de pasta... - -[VIC3_AF:VIC3] -~w~... de ese camello. ¿Y sabes por qué? - -[VIC3_AG:VIC3] -~w~Ilústrame... - -[VIC3_AJ:VIC3] -~w~Los Sindacco han empezado a traficar, ¡y encima en nuestro territorio! - -[VIC3_AK:VIC3] -~w~¿Vas a permitirlo, Toni? - -[VIC3_AL:VIC3] -~w~¡Quiero que vayas para Chinatown! - -[VIC3_AM:VIC3] -~w~Muy bien, 'jefe', voy para allá. - -[VIC3_AN:VIC3] -~w~¡Santo Dios! ¿Es que nunca está el puto papel a mano? - -[VIC3_AH:VIC3] -~w~¡Porque está muerto, idiota! Alguien se lo ha cargado. - -[VIC3O4:VIC3] -~r~Los Sindacco~w~ están traficando por toda Chinatown. ¡Dales una lección que no olviden! - -{=================================== MISSION TABLE VIC4 ===================================} - -[VIC4_H2:VIC4] -~w~Sigue el ~h~punto del bote de spray~w~ en el radar para encontrar el ~h~Pay 'n' Spray~w~. - -[VIC4_A2:VIC4] -~w~Ponte en la ~h~señal~w~ para ver las armas disponibles. - -[VIC4_A3:VIC4] -Selecciona diferentes armas usando~h~ ~k~ ~AMMOV~. - -[VIC4_A4:VIC4] -~w~Compra el arma seleccionada pulsando~h~ ~k~ ~AMBUY~ ~w~, pero solo si tienes el dinero suficiente. - -[VIC4_A6:VIC4] -~w~Hay ocho tipos de armas que puedes usar. - -[VIC4_A7:VIC4] -~w~Solo puedes llevar una de cada tipo a la vez: un tipo de pistola, un tipo de escopeta, etc. - -[VIC4_H1:VIC4] -~w~Sigue el ~h~punto de la pistola~w~ en el radar para encontrar ~h~Ammu-Nation~w~. - -[VIC4_H3:VIC4] -~w~Sigue el ~h~punto de la pistola~w~ en el radar para volver a encontrar ~h~Ammu-Nation~w~. - -[VIC4_AB:VIC4] -~w~Es difícil de olvidar... - -[VIC4_AD:VIC4] -~w~Lo interesante es que ahora quiere ser un Leone. - -[VIC4_AE:VIC4] -~w~¡Que le den! Ya eligió en su momento. - -[VIC4_AG:VIC4] -~w~Hola, ¿cerebrito? Dios, Toni, Sal dice que eres un matón lerdo, - -[VIC4_AH:VIC4] -~w~pero no me imaginaba que tanto. - -[VIC4_AJ:VIC4] -~w~Va a ser nuestro infiltrado. - -[VIC4_AK:VIC4] -~w~Solo hay un detalle. - -[VIC4_AL:VIC4] -~w~Un gorila de los Sindacco no le deja ni respirar. - -[VIC4_AM:VIC4] -~w~Quiero que elimines ese pequeño obstáculo... - -[VIC4_AN:VIC4] -~w~y pongas a J.D. de nuestra parte. ¿Capisci? - -[VIC4_2:VIC4] -~w~Coge el ~g~móvil~w~ como prueba de que has hecho el trabajo. - -[VIC4_BA:VIC4] -~w~Toni... ¡me has dado material para una 'snuff' del copón! - -[VIC4_BB:VIC4] -~w~¿J.D.? ¿Lo has visto? ¿ME HAS ESTADO FILMANDO? - -[VIC4_BC:VIC4] -~w~Ay, solo estaba... ¡Es para uso privado! - -[VIC4_BD:VIC4] -~w~¡Qué ganas tengo de que estemos en el mismo equipo! - -[VIC4_BE:VIC4] -~w~No te emociones demasiado. Aún me debes dinero. - -[VIC4_BF:VIC4] -~w~Quédate en prenda el coche del tarugo de los Sindacco, ¿eh? - -[VIC4_BG:VIC4] -~w~Lo repintas un poco, y nadie lo reconocerá. - -[VIC4_BH:VIC4] -~w~Ya me encargo yo del fiambre. - -[VIC4_CA:VIC4] -~w~¡Eh! ¡Fuera de aquí! - -[VIC4_CB:VIC4] -~w~¡Aquí no se te ha perdido nada! - -[VIC4_61:VIC4] -~w~Sube al ~b~coche~w~. - -[VIC4_62:VIC4] -~w~Ve hasta el Pay 'n' Spray. - -[VIC4_DC:VIC4] -~r~¡J.D. te ha dicho que repintes el buga! - -[VIC4_PR:VIC4] -(Ring, ring...) - -[VIC4O1A:VIC4] -~w~Ve ~y~adentro. - -[VIC4_O2:VIC4] -~w~Compra una pistola. - -[VIC4_O4:VIC4] -~w~Mata al ~r~gorila de los Sindacco~w~. - -[VIC4_FA:VIC4] -~r~¡Ahora no te venderá armas! - -[VIC4_O3:VIC4] -~w~Dirígete a las ~y~obras~w~. - -[VIC4_AC:VIC4] -~w~Ahora lleva un bar de guarras controlado por los Sindacco, quiero decir... un 'club de alterne'. - -[VIC4_AA:VIC4] -~w~Eh, ¿te acuerdas de J.D. O'Toole? - -[VIC4_AI:VIC4] -~w~Usemos a J.D. para sacar ventaja de los planes de los Sindacco. - -[HELP42:VIC4] -~w~Cuando apuntes, pulsa ~h~ ~k~ ~FREE1~ ~w~para entrar en el ~h~modo puntería libre~w~ y luego usa ~h~ ~k~ ~FREE2~ ~w~para mover el punto de mira. - -[VIC4_A1:VIC4] -~w~Ve a la tienda ~y~Ammu-Nation~w~ más cercana para conseguir un arma. - -[VIC4_O1:VIC4] -~w~Vuelve a ~y~Ammu-Nation~w~ y consigue un arma. - -[VIC4_1:VIC4] -~w~El ~r~capo de los Sindacco~w~ está detrás de las obras. ¡Mátalo! - -{=================================== MISSION TABLE VIC5 ===================================} - -[VIC5_H:VIC5] -Leone - -[VIC5_I0:VIC5] -~w~Ah, eres tú. - -[VIC5_I1:VIC5] -~w~Sí, soy yo. ¡Qué te parece! ¿Qué sabes tú? - -[VIC5_I2:VIC5] -~w~Te diré lo que sé, tío duro. - -[VIC5_I3:VIC5] -~w~Unos chicos nuestros han cagado un puto trabajo que era para imbéciles. - -[VIC5_I4:VIC5] -~w~Capullos de mierda, no pueden ni con un simple atraco. - -[VIC5_I5:VIC5] -~w~Y ahora la poli los ha acorralado en Chinatown. - -[VIC5_I6:VIC5] -~w~¡Pardillos! ¿Por qué estoy rodeado de tantos putos idiotas? - -[VIC5_I7:VIC5] -~w~No sé... ¿'Dime con quién andas...'? - -[VIC5_I8:VIC5] -~w~¡Vaya, así que eres un payaso! - -[VIC5_I9:VIC5] -~w~Bueno, pues ríete de esto, listillo: - -[VIC5I10:VIC5] -~w~¡Vas a limpiarme el culito en este asunto! - -[VIC5I11:VIC5] -~w~Venga, ve allí y trae de vuelta a esos capullos. - -[VIC5_F1:VIC5] -~r~Ha muerto uno de la banda. - -[VIC5_G0:VIC5] -~w~Consigue un coche de 4 plazas. - -[VIC5_O1:VIC5] -~w~Rescata a los ~b~hombres de Vincenzo~w~. - -[VIC5_O2:VIC5] -~w~¡Saca a ~b~la banda~w~ de aquí! - -[VIC5_O3:VIC5] -~w~¡Despista a la poli! - -[VIC5_O4:VIC5] -~w~Lleva a la banda con ~y~Vincenzo~w~. - -[VIC5_O5:VIC5] -~w~¡Mantén a ~b~la banda~w~ unida! - -[VIC5_O6:VIC5] -~w~Necesitas un vehículo con más espacio. - -[VIC5_G1:VIC5] -~w~¿Qué vamos a hacer? - -[VIC5_G2:VIC5] -~w~¡La cagamos! - -[VIC5_G3:VIC5] -~w~¡No pienso ir a la trena por ese bastardo de Vincenzo! - -[VIC5_G4:VIC5] -~w~¡Salgamos cagando leches! - -[VIC5_G5:VIC5] -~w~¡Espérame! - -[VIC5_G6:VIC5] -~w~¡Pisa a fondo, Toni! - -[VIC5_E1:VIC5] -~w~¿Habéis traído el botín o qué? - -[VIC5_E2:VIC5] -~w~Lo teníamos todo, jefe... - -[VIC5_E3:VIC5] -~w~Oye, mira, no pudimos hacer nada... - -[VIC5_E4:VIC5] -~w~No pudisteis hacer nada... - -[VIC5_E5:VIC5] -~w~Las cosas se torcieron... No podría haber salido peor. - -[VIC5_E6:VIC5] -~w~¿Qué te parece...? ¿Están mejor las cosas ahora, o peor? - -[VIC5_E7:VIC5] -~w~Si la volvéis a cagar alguna vez, las cosas también os irán peor. - -[VIC5_E8:VIC5] -~w~Y ahora limpiad esta mierda y fuera de mi vista. - -[VIC5_E9:VIC5] -~w~Tengo que hacer una llamada. - -[VIC5E10:VIC5] -~w~Te lo juro, Toni, el día que volviste, mi suerte se fue a tomar por culo. - -[VIC5E11:VIC5] -~w~Eres un puto gafe. - -{=================================== MISSION TABLE VIC6 ===================================} - -[VIC6_BA:VIC6] -~w~¡Alto! - -[VIC6_BB:VIC6] -~w~¡Quieto, capullo! - -[VIC6_P0:VIC6] -~w~Recoge el ~b~coche de Vincenzo~w~. - -[VIC6_P1:VIC6] -~w~¡Es una trampa de la poli! ¡Saca el coche de aquí! - -[VIC6_P2:VIC6] -~w~¡Despista a la poli! - -[VIC6_P3:VIC6] -~w~¡Has despistado a la poli! ¡Lleva el coche al ~y~garaje de Vincenzo~w~. - -[VIC6_P4:VIC6] -~w~Haz que Vincenzo no vuelva a tomarte el pelo. ¡Tritúrale el ~b~coche~w~! - -[VIC6_P5:VIC6] -~w~¡Súbete al ~b~coche~w~ de Vincenzo! - -[VIC6_P6:VIC6] -~w~Lleva el coche al ~y~garaje de Vincenzo~w~. - -[VIC6_PA:VIC6] -~r~¡Has destruido el coche! - -[VIC6_D1:VIC6] -~w~Sube al ~b~coche~w~. - -[VIC6_D3:VIC6] -~w~Lleva el coche a la ~y~trituradora~w~. - -[VIC6_D4:VIC6] -~w~Sal y espera a que la trituradora haga su trabajo. - -[VIC6_D5:VIC6] -~r~¡Tenías que haber triturado el coche! - -[VIC6_AA:VIC6] -~w~¡Eh! Toni, ¿y el coche? - -[VIC6_AB:VIC6] -~w~¡Eres un hijo de puta, Vinnie! ¡Me la has jugado! - -[VIC6_AC:VIC6] -~w~¿Que te la he jugado? ¿JUGÁRTELA? - -[VIC6_AD:VIC6] -~w~¡Cuando volviste a la ciudad no tenías nada! ¡NADA! - -[VIC6_AE:VIC6] -~w~¿Eso es jugártela, cabrón desagradecido? - -[VIC6_AF:VIC6] -~w~¡Te di un piso y un trabajo! - -[VIC6_AG:VIC6] -~w~Y por tanta generosidad solo espero que asumas algunos riesgos. - -[VIC6_AH:VIC6] -~w~No soy una hermanita de la caridad, ¿vale? Ni tu querido papá. - -[VIC6_AI:VIC6] -~w~¿Que había unos polis vigilando el coche? ¡Pues que les jodan! - -[VIC6_AJ:VIC6] -~w~Cuando te diga que hagas algo, lo haces. ¿Capisci? - -[VIC6_AK:VIC6] -~w~Oh, sí. Ya lo entiendo, Vinnie. - -[VIC6_AL:VIC6] -~w~Entiendo que mientras trabaje para ti seré el pito del sereno. - -[VIC6_AM:VIC6] -~w~Yo ya estaba en el ajo cuando tú aún te comías los mocos. - -[VIC6_AN:VIC6] -~w~Quédate con tu trabajo de mierda, 'jefe'. Lo dejo. - -[VIC6_AO:VIC6] -~w~Toni, te vas a arrepentir de... - -[VIC6_D2:VIC6] -~w~Para en la ~y~señal~w~. - -[HOTW_01:VIC6] -Claro, mamá. Luego te llamo. - -[HOTW_28:VIC6] -¡Vincenzo! - -[HOTW_02:VIC6] -Por supuesto que me estoy portando bien. - -[HOTW_03:VIC6] -Te quiero. - -[HOTW_04:VIC6] -Eh, Cheryl, encanto, date un respiro. - -[HOTW_05:VIC6] -Y ahora vete de aquí. - -[HOTW_06:VIC6] -Toma, para que te empolves. - -[HOTW_11:VIC6] -Das asco. ¿Es que no tienes respeto? - -[HOTW_12:VIC6] -¿Respeto? Esto es 'multitarea', Antonio. - -[HOTW_15:VIC6] -Si para ti es un problema, le pido a Ray que te ayude. - -[HOTW_16:VIC6] -Que te jodan. - -[HOTW_17:VIC6] -Solo te estaba tocando los huevos, cálmate. - -[HOTW_18:VIC6] -Escucha, tío duro. Necesito que me hagas un favor. - -[HOTW_19:VIC6] -Las chicas están locas por la coca. Tengo un coche lleno aparcado en Trenton. - -[HOTW_20:VIC6] -Ve a recogerlo... y dame un telefonazo. - -[HOTW_21:VIC6] -¿Acaso soy tu chófer? Que te den. - -[HOTW_22:VIC6] -Escucha, escucha, escucha... - -[HOTW_23:VIC6] -Lo haría yo, pero los federales me vigilan. - -[HOTW_24:VIC6] -Sabes que no te dejaré colgado. Confía en mí. - -[HOTW_25:VIC6] -Y recuerda que aquí tenemos una jerarquía. ¿Capisci? Ahora sé un buen chico. - -[HOTW_07:VIC6] -- Eh, ¿quién te quiere a ti, ángel? ~n~ - Tú, Vinnie. - -[HOTW_09:VIC6] -- ¿Hablabas con tu madre? ~n~ - Claro. - -[HOTW_13:VIC6] -- ¿Qué, es que a ti no te gusta que una tía buena te la chupe? ~n~ - ¿Qué? - -{=================================== MISSION TABLE VIC7 ===================================} - -[VIC7_VE:VIC7] -~r~V 1.01 - -[VIC7_1:VIC7] -~w~¡Vinnie, estoy aquí! ¿Dónde diablos te metes? ¿Qué es esto? - -[VIC7_2:VIC7] -~w~¿Toni? ¿Come stai...? Sabía que llamarías. - -[VIC7_3:VIC7] -~w~Escucha, estoy en los muelles de Portland. - -[VIC7_3A:VIC7] -~w~Nos está llegando un gran cargamento. Pásate. Estoy a bordo del carguero grande. - -[VIC7_3B:VIC7] -~w~No sé, Vinnie... Tengo cosas que hacer. - -[VIC7_3D:VIC7] -~w~Pero a partir de ahora seremos como socios. Más que socios... ¡Hermanos! - -[VIC7_3E:VIC7] -~w~Venga, vamos. ¿Qué me dices? Es lo que quiere Salvatore. - -[VIC7_3F:VIC7] -~w~Vale. Por Salvatore. - -[VIC7_3G:VIC7] -~w~Pero si me vuelves a salir con el rollo paternalista, te mato. - -[VIC7_4:VIC7] -~w~¡Buaja, ja, ja! ¡Te voy a descuartizar, hombrecillo! - -[VIC7_4A:VIC7] -~w~Reúnete con Vincenzo en el ~y~carguero~w~. - -[VIC7_5:VIC7] -~w~¡Mueeeeere! - -[VIC7_6:VIC7] -~w~¡Ja, ja, ja, ja, ja, ja, ja, ja! - -[VIC7_7:VIC7] -~w~¿Ya está muerto ese baboso tontolculo? - -[VIC7_8:VIC7] -~w~Odio decepcionarte, Vinnie. - -[VIC7_9:VIC7] -~w~¡Hijo de puta! ¿Es que ni siquiera sabes morirte? - -[VIC7_10:VIC7] -~w~No deberías haber vuelto, Toni. - -[VIC710A:VIC7] -~w~Yo me he dejado los riñones por Salvatore. - -[VIC710B:VIC7] -~w~Y tú simplemente vuelves a la ciudad y, hala, él que si 'Toni esto', que si 'Toni aquello'... - -[VIC7_11:VIC7] -~w~¡Ésta es mi ciudad, Toni! ¡MI CIUDAD! - -[VIC711A:VIC7] -~w~¡No me la vas a quitar! - -[VIC7_12:VIC7] -~w~Voy a disfrutar con esto. - -[VIC7_4B:VIC7] -~w~El lugar parece desierto. Sube al ~y~barco~w~. - -[VIC7_13:VIC7] -~w~Dirígete a la ~y~salida~w~. - -[VIC7_3C:VIC7] -~w~Mira, sé que he sido muy capullo contigo, Toni. Y lo siento mucho. - -[VIC7HUL:VIC7] -~w~Baja a la ~y~bodega~w~. - -{=================================== MISSION TABLE SALS1 ===================================} - -[SALS1_1:SALS1] -NONE - -[SALS1_6:SALS1] -Mata al ~r~alcalde R.C. Hole~w~. - -[SALS1_7:SALS1] -Hazte con el ~g~teléfono móvil~r~ del alcalde. - -[SALS1_8:SALS1] -~r~El alcalde ha terminado sus ejercicios. - -[SALS1_9:SALS1] -~r~El alcalde ha escapado. - -[SALS110:SALS1] -Llévale el teléfono a ~y~Salvatore~w~. - -[SALS111:SALS1] -¡Suelta el arma o disparo! - -[SALS112:SALS1] -¡Te persiguen! ¡El ~r~alcalde~w~ se está largando! - -[SS1_AA:SALS1] -¿Sí? Soy Toni. - -[SS1_AB:SALS1] -¡Ese bastardo del alcalde me está jodiendo y no pienso tolerarlo! - -[SS1_AC:SALS1] -Cálmate, Sal. Veré si puedo resolver el problema por ti. - -[SS1_AD:SALS1] -Eres un buen chico, Toni, tu padre se sentiría orgulloso de ti. - -[SS1_AE:SALS1] -Escucha, ese puto gordo del alcalde suele ir a correr a diario por el parque. - -[SS1_AF:SALS1] -Asegúrate de que pierda el aliento... ¡para siempre! - -[SS1_AG:SALS1] -¡Y trae su teléfono! - -[SS1_AH:SALS1] -A ver con quién ha estado hablando. - -[SALS1AA:SALS1] -¿Sí? Soy Toni. - -[SALS1AB:SALS1] -Ese puto alcalde me está jodiendo. - -[SALS1AC:SALS1] -¡Y no pienso tolerarlo! - -[SALS1AD:SALS1] -Tranquilo. Yo lo quitaré de en medio. - -[SALS1AE:SALS1] -Eres un buen chico, Toni. - -[SALS1AF:SALS1] -Ese puto gordo suele ir a correr a diario por el parque. - -[SALS1AG:SALS1] -Que pierda el aliento... ¡para siempre! - -[SALS1AH:SALS1] -Ah sí, y trae su teléfono. - -[SALS1AI:SALS1] -A ver con quién ha estado hablando... - -[SALS1C1:SALS1] -¡Suelte al arma, señor! - -[SALS1C2:SALS1] -¡Alto o disparo! - -[SALS1C3:SALS1] -¡Quieto! - -[SALS1C4:SALS1] -¡No haga una estupidez! - -[SALS113:SALS1] -~r~El teléfono del alcalde ha sido destruido. - -[SALS114:SALS1] -¡Cuidado! Te dispararán si te ven entrar armado en el parque. - -{=================================== MISSION TABLE SALS2 ===================================} - -[SALS2_1:SALS2] -~w~Sube al ~b~coche~w~. - -[SALS2_2:SALS2] -~w~Ve al ~y~lugar de reunión~w~. - -[SALS2_3:SALS2] -~w~Vuelve al ~b~coche~w~. - -[SALS2_4:SALS2] -~r~¡Han matado a Mickey! - -[SALS2_5:SALS2] -~r~¡Han matado a un hombre de Salvatore! - -[SALS2AA:SALS2] -'Toni. - -[SALS2AB:SALS2] -Unos cuantos chicos pasarán a recogerte. - -[SALS2AC:SALS2] -Asegúrate de estar cuando lleguen. - -[SALS2AD:SALS2] -Ciao, Salvatore.' - -[SALS2CA:SALS2] -Eh, ¿Toni? - -[SALS2CC:SALS2] -Vamos, sube, tú conduces. - -[SALS2CD:SALS2] -Mickey, qué... eeh... ¿qué pasa? - -[SALS2CE:SALS2] -Vamos, Cipriani. ¿Qué, te crees que he venido a liquidarte? - -[SALS2BA:SALS2] -Salvatore está ahí abajo... - -[SALS2BC:SALS2] -Toni, hijo mío, - -[SALS2BD:SALS2] -¡hoy es el día en que te bautizaremos! - -[SALS2BE:SALS2] -Oh, Salvatore. Sr. Leone. - -[SALS2BF:SALS2] -Mamá ha estado esperando este día. - -[SALS2CB:SALS2] -Venga, sube, vamos a dar una vuelta. - -[SALS2BB:SALS2] -Madonna mia, ¿a qué estás esperando? - -[SALS2AF:SALS2] -Eh, Toni, gracias. Estamos en contacto. - -{=================================== MISSION TABLE SALS3 ===================================} - -[SALS3_1:SALS3] -NONE - -[SALS3_2:SALS3] -Daño - -[SALS313:SALS3] -~r~¡El consejero del alcalde es historia! - -[SALS314:SALS3] -~r~¡Salvatore es historia! - -[SALS3AA:SALS3] -Toni, ¡sube! - -[SALS3AB:SALS3] -¿Adónde vamos? - -[SALS3AC:SALS3] -Vamos a tener una charlita con el ayudante del alcalde sobre Franco Forelli. - -[SALS3BA:SALS3] -¡Eh, fuera de mi barco! - -[SALS3BB:SALS3] -Usted se viene conmigo. - -[SALS3BC:SALS3] -¡No puede hacerme esto! - -[SALS3BD:SALS3] -Rápido, ¡el servicio secreto estará vigilando! - -[SALS3CA:SALS3] -Toni, cuidado, ¡hay pistoleros en esas rocas! - -[SALS3CB:SALS3] -¡Pistoleros al frente! - -[SALS3CC:SALS3] -¡Cuidado a la derecha, Toni! - -[SALS3CD:SALS3] -¡A la izquierda, Toni, izquierda! - -[SALS3CE:SALS3] -¡Hay más en el embarcadero! - -[SALS3CF:SALS3] -Hostia puta, ¡el servicio secreto viene en helicóptero! - -[SALS3DA:SALS3] -¡... El alcalde no hacía una mierda sin el beneplácito de Franco! - -[SALS3DB:SALS3] -¡Al alcalde nadie le daba órdenes! - -[SALS3DC:SALS3] -¡Aargh! ¡Espere, espere, tiene razón! - -[SALS3DE:SALS3] -¿Los sicilianos? ¿Por qué? - -[SALS3DF:SALS3] -Son los amos de Franco y quieren una guerra entre las Familias de Liberty. - -[SALS3DG:SALS3] -Cuando las cosas se apacigüen, se harán con todo. - -[SALS3DH:SALS3] -Toni, te llamo luego. - -[SALS3DI:SALS3] -Ahora voy a echar a este truño a la bahía. - -[SALS3DD:SALS3] -Esos sicilianos... Ellos forzaron a Franco a hacerlo. - -{=================================== MISSION TABLE SALS4 ===================================} - -[SALS4_1:SALS4] -NONE - -[SALS4BA:SALS4] +[COK4_2] Sí. -[SALS4BB:SALS4] -¡Gracias a Dios que lo has cogido! +[COK4_6] +¿A dónde crees que vamos? -[SALS4BC:SALS4] -¿Qué pasa, Sal? +[COK4_7] +¿Nos hemos perdido? -[SALS4BD:SALS4] -¡He ido a espiar a los Forelli a Fort Staunton y se ha montado un pollo! +[COK4_8] +¡Tenemos competencia! -[SALS4BE:SALS4] -Los Sindacco han declarado la guerra a los Forelli, +[COK4_9] +¡Elimínales! -[SALS4BF:SALS4] -¡y estoy en medio de este Cristo! +[COK4_9A] +¡Es hora del baile de Lance Vance! -[SALS4BG:SALS4] -Voy para allá. +[COK4_10] +¡Ya son astillas! Y comida para los peces. -[SALS4BH:SALS4] -Trae la limusina, está blindada. ¡Vamos a necesitarla! +[COK4_11] +¡Lo conseguimos! Esos otros barcos no son de la clase VIP. -[SALS4AA:SALS4] -¡Larguémonos de aquí, Toni! +[COK4_17] +¡Se están desesperando! -[SALS4AB:SALS4] -¡Llévame a la limusina! +[COK4_18] +¡Mis malditos pies están mojados! ¡NOS ESTÁ ENTRANDO AGUA! -[SALS4AE:SALS4] -Vale, tengo un sitio en Newport. ¡Llévame allí! +[COK4_21] +¡Subiendo el puente! -[SALS4AF:SALS4] -Eh, Toni, gracias. Estamos en contacto. +[COK4_22] +¡Salta, está apunto de estallar! -[SAL4_1:SALS4] -Recoge la ~b~limusina~w~ del Sr. Leone. +[COK4_23] +Buen disparo. -[SAL4_2:SALS4] -~r~¡Has destruido el coche! +[COK4_29] +~r~¡Mataste a Lance! -[SAL4_3:SALS4] -Lleva el coche a ~y~Fort Staunton~w~. +[ASS1_6] +¡Adelante Tommy, yo estaré bien! -[SAL4_4:SALS4] -~r~¡Has dejado que Salvatore muera! +[ASS1_7] +¡Comeos esto, asesinos hijos de puta! -[SAL4_6:SALS4] -~b~Salvatore~w~ está en el callejón. +[ASS1_8] +¡Me han dado! -[SAL4_9:SALS4] -Ve al ~y~garaje~w~. +[ASS1_9] +¡Te tengo cubierto, Tommy! -[SAL4_11:SALS4] -Has dejado atrás a ~b~Salvatore~w~. +[ASS1_10] +Eh, este seto es precioso. -[SAL4_12:SALS4] -Está bloqueada, deja la limusina aquí y sigue a pie. +[ASS1_11] +Tommy, ¿puedo tener una habitación con vistas a la bahía? -[SAL4_13:SALS4] -Vuelve a la ~b~limusina~w~. +[ASS1_12] +Unos techos altos muy bonitos... -[SAL4_14:SALS4] -Lleva a Salvatore y la limusina al ~y~garaje~w~ de Newport. +[ASS1_3] +¡Lance! ¡Necesito que me cubras! -[SAL4_15:SALS4] -¡Encuentra a ~b~Salvatore~w~! +[ASS1_4] +¡Díaz debe de estar dentro! -[SAL4_16:SALS4] -Lleva a Salvatore a la ~b~limusina~w~. +[ASS1_5] +¡Lance! -[SAL4_17:SALS4] -Espera a que ~b~Salvatore~w~ se meta en la limusina. +[TAXWAR] +MISIONES DE LA GUERRA DE TAXIS -{=================================== MISSION TABLE SALS5 ===================================} +[NOTAXI] +~g~Necesitas un Taxi Kaufman para activar esta misión. -[SALS5_1:SALS5] -~w~Pulsa~h~ ~k~ ~VEACC~ ~w~para controlar el coche de Paul Sindacco. +[TAXW1_5] +~g~¡Necesitas estar en un taxi Kaufman! -[SALS5_2:SALS5] -~w~Acaba con los ~r~Forelli~w~ en la reunión antes de que Sindacco encuentre el sistema de control. +[TAX2_4] +Adelante, Tommy. -[SALS5_3:SALS5] -~r~¡Paul Sindacco ha muerto! +[TAX2_5] +Dale una buena paliza. -[SALS5_4:SALS5] -~r~La furgoneta de Salvatore ha sido destruida. +[TAX2_6] +Ni siquiera tiene licencia. -[SALS5_5:SALS5] -~r~Sindacco ha llegado a la reunión. +[TAX2_7] +Malditos servicios de limusina. -[SALS5_6:SALS5] -~w~Ve a la ~b~furgoneta~w~. +[TAXW3_1] +~g~Ve y recoge a Mercedes. -[SALS5_7:SALS5] -~w~Tiempo restante +[RACE1] +~g~3..2..1.. ¡VAMOS VAMOS VAMOS! -[SALS5_8:SALS5] -~r~¡Sindacco ha encontrado el sistema de control! +[RACE2] +~g~3 -[SALS5_9:SALS5] -~w~El control por satélite del coche de Sindacco tendrá una respuesta lenta. +[RACE3] +~g~2 -[SALS510:SALS5] -~w~Daño +[RACE4] +~g~1 -[SALS5AA:SALS5] -¡Eh! +[RACE5] +~g~¡ADELANTE! -[SALS5AB:SALS5] -Toni, soy yo, tengo algo para ti... +[FIRST] +~b~1 -[SALS5AC:SALS5] -Te va a encantar, te lo pasarás pipa. +[SECOND] +~b~2 -[SALS5AD:SALS5] -¿Qué quiere que haga, Sal? +[THIRD] +~b~3 -[SALS5AE:SALS5] -Hay una furgoneta por allí. +[FOURTH] +~b~4 -[SALS5AF:SALS5] -Llámame cuando la encuentres. +[RACETM] +~b~TIEMPO DE CARRERA: ~1~:~1~ -[SALS5BA:SALS5] -Vale, Sal, ya estoy en la furgoneta. +[RACETM2] +~b~TIEMPO DE CARRERA: ~1~:0~1~ -[SALS5BB:SALS5] -Bien. Hemos estado trasteando en el coche de Paulie Sindacco. +[RACEFA] +~r~¡Has fracasado en ganar la carrera! -[SALS5BC:SALS5] -¿Y qué quiere que haga? +[HOTRNG] +HOTRING -[SALS5BD:SALS5] -Paulie se va a reunir con los Forelli. +[BLODRNG] +BLOODRING -[SALS5BE:SALS5] -Está intentando negociar una tregua. +[DIRTRNG] +DIRTRING -[SALS5BF:SALS5] -Usa el equipo de la furgoneta para controlar el coche de Paulie... +[TEX1_5] +~r~¡Se escapó! -[SALS5BG:SALS5] -y joder la reunión. +[SEG3_1] +TIEMPO: -[SALS5CA:SALS5] -Pero ¿qué...? +[SEG3_2] +~g~Ve a la camioneta que contiene el Helicótero RC y las bombas por control remoto con temporizador. -[SALS5CC:SALS5] -¡Dios, socorro! +[SEG3_3] +~g~Debes emplear el Helicótero RC para transportar 4 bombas hasta 4 objetivos en lugar del edificio. -[SALS5CD:SALS5] -¡Quita de en medio! +[SERG3_5] +~g~Sólo puedes llevar una bomba en cada ocasión y no puedes recoger bombas colocadas con éxito. -[SALS5CF:SALS5] -¡Que alguien me ayude! +[SEG3_7] +~g~Una vez que hayas soltado con éxito la PRIMERA bomba sobre una zona del objetivo, el cronómetro de detonación se pondrá en marcha; de modo que tendrás que soltar todas las bombas dentro de este período de tiempo. -[SALS5CG:SALS5] -¡Mi coche está poseíííídooo! +[SEG3_8] +~g~Las 4 bombas deben estar colocadas en las 4 zonas objetivo para superar la misión y demoler el edificio. -[SALS5CE:SALS5] -¡Este coche intenta matarme! +[SEG3_9] +~g~¡Alcanzaste el objetivo! Quedan 3. -[SALS5CB:SALS5] -Eh, ¿qué está pasando aquí? +[SEG3_10] +~g~¡Alcanzaste el objetivo! Quedan 2. -{=================================== MISSION TABLE SALS6 ===================================} +[SEG3_11] +~g~¡Alcanzaste el objetivo! ¡Sólo queda 1! -[SALS601:SALS6] -~w~Sal ha dejado una ~b~embarcación ~w~en el muelle sudoeste, detén al consejero. +[SEG3_12] +~r~¡Fallaste el blanco! ¡Ve a por una bomba! -[SALS602:SALS6] -~w~Va por la costa. ¡A por ~r~él~w~! +[SEG3_13] +~g~Deja caer la bomba en una zona del objetivo. -[SALS603:SALS6] -~r~Está volviendo ~w~con Franco Forelli. +[SEG3_14] +~r~Te quedaste sin tiempo y fracasaste en demoler el edificio. -[SALS604:SALS6] -~r~El consejero ha regresado a Fort Staunton. +[SEG3_15] +~r~¡Tu Helicótero RC ha sido destruido! ¿Cómo vas a transportar las bombas ahora? -[SALS605:SALS6] -~r~¡Se ha escapado! +[AVERY] +MISIONES DE AVERY -[SALS606:SALS6] -¡~r~Se escapa ~w~a pie! +[ASM] +MISIONES DE ASESINO -[SALS607:SALS6] -~w~Se escapa en un ~r~coche robado~w~. +[ASM_1] +MISIÓN DE ASESINO 1 -[SALS608:SALS6] -~r~¡No puedes perseguirle sin una embarcación! +[ASM1_1] +~g~Sr. Teal, su ayuda en la eliminación de los forasteros fue inestimablemente buena para el negocio. Tengo más trabajo para usted y más próximo a la ''intervención''. Encontrará su siguiente trabajo pegado con cinta adhesiva bajo el teléfono. -[SALS6AA:SALS6] -Hola. +[ASM1_2] +~g~Ve a la cabina telefónica que hay frente al centro comercial de Washington. -[SALS6AC:SALS6] -Forelli-Sindacco feud. +[ASM1_3] +~g~Carl Pearson, un repartidor de pizza. No debe finalizar sus entregas. -[SALS6AD:SALS6] -Se dirige a ver a Franco Forelli justo ahora. +[ASM1_4] +~g~Elimina al repartidor de pizza antes de que complete sus entregas. -[SALS6AE:SALS6] -A nosotros nos iría muy bien que Franco no se enterara de nada, +[ASM_2] +MISIÓN DE ASESINO 2 -[SALS6AF:SALS6] -y que esta guerra continuara. +[ASM_3] +MISIÓN DE ASESINO 3 -[SALS6AG:SALS6] -Encárgate de ese charlatán. +[ASM3_1] +~g~Ve a coger el arma que el Sr. Black ha dejado para ti. -[SALS6AH:SALS6] -Dalo por hecho, Sal. +[ASM3_2] +~g~No te acerques demasiado al objetivo o podría verte. -[SALS6AB:SALS6] -Toni, un consejero ha descubierto que la Mafia siciliana está tras la guerra entre los Forelli y los Sindacco. +[ASM3_3] +~g~Para un trabajo más rápido, colócate en lugares cercanos a su ubicación y evita ser visto. Esto te proporcionará una buena posición para eliminarles. -[SLS6_20:SALS6] -~w~Está volviendo con Franco Forelli, ¡acaba con ~r~él~w~! +[ASM3_4] +~g~¡Te ha visto! ¡Mejor elimínale de cualquier modo que puedas! -[SLS6_21:SALS6] -~w~¡Acaba con ~r~él~w~! +[ASM3_5] +~g~Marcus Hammond está situado cerca de los anuncios de Washington. -{=================================== MISSION TABLE NEDS1 ===================================} +[ASM3_6] +~g~Franco Carter está situado en el DBP de Seguridad, cerca de Ocean Drive. -[NEDS1_1:NEDS1] -El FBI va de camino a recoger un informe manipulado que salpica a estrellas del deporte. +[ASM3_7] +~g~Dick Tanner está cerca de la joyería de Vice Point. -[NEDS1_2:NEDS1] -Si el informe llega a manos de los federales, encerrarán a gente inocente. +[ASM3_8] +~g~Nick Kong está colocado cerca de Washington Beach. -[NEDS1_3:NEDS1] -Quiero que lo interceptes y me lo entregues, yo lo esconderé. +[ASM3_9] +~g~El conductor está situado en Washington. -[NEDS1_4:NEDS1] -Necesitarás un vehículo del FBI. +[ASM3_10] +~r~Fallaste en matarles a todos. -[NEDS1_5:NEDS1] -Ha habido un atraco a mano armada frustrado. El FBI está en la escena del crimen. +[ASM_4] +MISIÓN DE ASESINO 4 -[NEDS1_6:NEDS1] -Róbales el coche y ve al lugar de reunión antes de que sea tarde. +[ASM4_1] +~g~Ve a por el rifle que te han dejado entre el follaje que hay en las cercanías de la terminal del aeropuerto. -[NEDS1_8:NEDS1] -Vuelve al ~b~coche del FBI~w~. +[ASM4_2] +~g~No falles tu blanco o podrías alertar a sus guardaespaldas, y recuerda mantener las distancias para que no te detecte. -[NEDS1_9:NEDS1] -Ve al ~y~lugar de reunión~w~. +[ASM4_3] +~g~Vigila a la mujer de la galería que hay sobre los mostradores de facturación, dentro de la terminal del aeropuerto. PERO NO LA MATES. -[NEDS111:NEDS1] -¡Líbrate de la poli! +[ASM4_4] +~g~Mata al hombre al que ella dé el maletín, pero sólo DESPUÉS DE QUE ÉSTE LO RECOJA. Entonces recupera el maletín y llévalo a Ammu-Nation en el centro de la ciudad. -[NEDS113:NEDS1] -Aquí tengo el informe que prometí... +[ASM4_5] +~g~¡Consigue el maletín! -[NEDS114:NEDS1] -¡Qué...! ¿Ya hay un agente aquí? +[ASM4_6] +~g~Lleva al maletín a Ammu-Nation en el centro de la ciudad. -[NEDS115:NEDS1] -¿Otro coche del FBI? ¡Espera! ¡Eres un impostor! +[ASM4_7] +~r~¡Estúpido, has matado a la mujer! -[NEDS116:NEDS1] -¡Detén al ~r~confidente~w~! +[ASM4_8] +~r~¡El blanco te oyó disparar el arma! ¡El trato queda anulado! -[NEDS117:NEDS1] -Recupera el ~g~informe~w~. +[ASM4_9] +~r~¡El blanco ha embarcado en su vuelo! -[NEDS118:NEDS1] -Entrega el informe en el ~y~Liberty Tree~w~. +[ASM4_11] +~r~¡El blanco te ha visto! ¡El trato queda anulado! -[NEDS119:NEDS1] -~r~El coche del FBI que necesitabas es historia. +[ASM4_13] +~g~Te ha visto y está huyendo, ¡atrápale y consigue el maletín! -[NEDS120:NEDS1] -~r~¡Has llegado demasiado tarde! ¡El confidente le ha dado el informe al FBI! +[ASM4_14] +~g~La barra de distancia en la parte superior derecha de la pantalla te proporciona una indicación de lo cerca que estás de tu blanco. No permitas que se llene o éste te verá. -[NEDS121:NEDS1] -Buen trabajo, Toni. Dios estará muy contento contigo. +[ASM_5] +MISIÓN DE ASESINO 5 -[NEDS122:NEDS1] -Me aseguraré de que quede en buenas manos. +[KICK] +ARRANQUE -[NEDS123:NEDS1] -"Taluego". +[KICK1_3] +~g~Número de veces que pusiste el pie: ~1~ -[NEDS124:NEDS1] -~r~¡El informe se ha estropeado! +[KICK1_4] +~g~Tiempo de penalización: ~1~ segundos -[NEDS1AA:NEDS1] -Perdóneme, padre, porque he pecado... +[BANK] +MISIONES DEL ATRACO AL BANCO -[NEDS1AB:NEDS1] -Mierda, el diablo se va a poner las botas contigo, Antonio. +[BANK1] +MISIÓN DE ATRACO AL BANCO 1 -[NEDS1AE:NEDS1] -Un pobre diablo me ha confesado que ha falsificado un informe de dopaje sobre los mejores atletas del país. +[BANK2] +MISIÓN DE ATRACO AL BANCO 2 -[NEDS1AF:NEDS1] -Si impides que se lo dé al FBI, salvarás la carrera de muchos inocentes. +[BJM2_21] +~g~Acierta a tantos blancos como puedas mientras te quede munición. -[NEDS1AG:NEDS1] -Considérelo hecho, padre. +[BANK3] +MISIÓN DE ATRACO AL BANCO 3 -[NEDS1BA:NEDS1] -Llegas pronto. +[BJM3_1] +~g~Consigue un coche rápido y ve a la parrilla de salida. -[NEDS1BB:NEDS1] -No te conozco, ¿dónde está John-O? +[BNK4_2A] +Los chicos hicieron un trabajo genial con este pequeño. -[NEDS1BC:NEDS1] -¿John-O? No ha podido venir. +[BNK4_3G] +¡Oh, mierda, ahora los polis andan tras nosotros! -[NEDS1BD:NEDS1] -Eh, ¡ahí está John-O! +[BNK4_3H] +Y ni siquiera hemos llegado. -[NEDS1BE:NEDS1] -¡Dame eso! +[BNK4_3K] +Primero tendremos que despistar a los polis... -[NEDS1BF:NEDS1] -¡Que te den! +[BNK4_3L] +Joder, Tommy, ¿intentas matarnos a todos? -[NEDS1AD:NEDS1] -Ah, la segunda opción va más con mi estilo... +[BNK4_3N] +¡Todo lo que me importa acaba destrozado! -[NEDS1AC:NEDS1] -Ahora puedes irte y rezar un rosario, o hacer el trabajo sucio del Señor. +[BNK4_26] +¡Maldición! ¡Aquí vienen! -[NEDS1_7:NEDS1] -Ve a la escena del crimen, roba un ~b~coche del FBI~w~ y llega al punto de reunión antes de las ~1~:~1~. +[BNK4_32] +¡Usa los explosivos para abrir las cajas de depósito! -[NEDS125:NEDS1] -Ve a la escena del crimen, roba un ~b~coche del FBI~w~ y llega al punto de reunión antes de las 0~1~:~1~. +[BNK4_36] +¿Dónde está Cam? -[NEDS126:NEDS1] -Ve a la escena del crimen, roba un ~b~coche del FBI~w~ y llega al punto de reunión antes de las 0~1~:0~1~. +[BNK4_37] +Es historia... -[NEDS127:NEDS1] -Ve a la escena del crimen, roba un ~b~coche del FBI~w~ y llega al punto de reunión antes de las ~1~:0~1~. +[BNK4_38] +Ése era el último. ¡Vamos! ¡Vamos! ¡Vamos! -{=================================== MISSION TABLE NEDS2 ===================================} +[BNK_39] +¡Mierda! ¿Dónde está Hilary? -[NEDS2_1:NEDS2] -NONE +[BK4_40A] +¡Ya le daré yo miedo al abandono! -[NEDS2AA:NEDS2] -Perdóneme, padre, porque he pecado... +[BNK4_42] +¡Eh, tíos! ¡Subid! ¡Yo os cubro! -[NEDS2AB:NEDS2] -Hostia puta, Toni, ¿qué has hecho ahora? +[BNK4_43] +¡Ya cubro yo nuestros culos, tú conduce! -[NEDS2AC:NEDS2] -¡Eh! Esa boca, padre... +[BNK4_44] +¡Lo conseguimos! ¡Somos ricos! ¡Ricos! -[NEDS2AD:NEDS2] -Ah sí, Ave María, llena eres de lo que sea... +[BNK4_45] +Es una pena que Cam no lo consiguiese, ¡era un buen tipo! -[NEDS2AE:NEDS2] -Un alma descarriada ha confesado ser un perista de diamantes. +[BNK4_46] +Sí. Pero aún así... ¡más tajada para nosotros! -[NEDS2AF:NEDS2] -Ayuda a esa oveja descarriada a redimirse, quítale el botín y devolveremos los diamantes... +[BNK4_47] +¡Claro que sí! ¡Sí! -[NB2_2:NEDS2] -Coge el ~g~maletín~w~ y mata a todos los miembros de la banda. +[BNK4_48] +Tommy, ¿te gustaría un masaje? -[NB2_3:NEDS2] -Lleva el maletín a las ~y~oficinas del Liberty Tree~w~. +[BNK4_49] +¡Hola, Mercedes! Sí, estoy un poco tenso... -[NB2_4:NEDS2] -¡Hazte con el ~g~maletín~w~! +[BNK450A] +¿Qué te dije, Tommy? ¿Qué te dije? Maldito SWAT, será mejor que tengas cuidado cuando Kent Paul esté en la ciudad. -[NB2_1:NEDS2] -¡Esto es una encerrona! +[BNK450B] +Vamos, dame una tajada más grande, colega, venga. Tengo que comprarme ropa nueva. -[NB2_6:NEDS2] -¡Mata a todos los ~r~guardias~w~! +[BNK4_51] +Yo creo que tienes buen aspecto. -[NB2_7:NEDS2] -¡Destruye el ~r~helicóptero~w~! +[KENT] +MISIONES DE KENT PAUL -[NB2_5:NEDS2] -Acaba con el ~r~helicóptero~w~ y los ~r~guardias~w~ y coge el ~g~maletín~w~. +[KENT1] +MISIÓN DE KENT PAUL 1 -{=================================== MISSION TABLE NEDS3 ===================================} +[COUNT] +MISIONES DE FALSIFICACIÓN -[NEDS3AA:NEDS3] -Perdóneme, padre, porque he pecado... +[COUNT1] +MISIÓN DE FALSIFICACIÓN 1 -[NEDS3AB:NEDS3] -Toni, comparado con los degenerados que hay en esta ciudad, eres un santo. +[COUNT2] +MISIÓN DE FALSIFICACIÓN 2 -[NEDS3AC:NEDS3] -Sus coches sueltan el nocivo gas del diablo en los pulmones de nuestros hijos. ¡Están profanando el Edén! +[BIKE] +LAS MISIONES DE LA PANDILLA DE MOTEROS -[NEDS3AD:NEDS3] -Demuéstrales a esos pecadores lo equivocados que están. +[BIKE1] +MISIÓN DE MOTORISTA 1 -[NEDS3_1:NEDS3] -Coge el coche de bomberos y causa tantos choques en cadena, accidentes y actos de destrucción como puedas. +[BIKE2] +MISIÓN DE MOTORISTA 2 -[NEDS3_2:NEDS3] -~w~Roba el ~b~coche de bomberos~w~. +[BIKE3] +MISIÓN DE MOTORISTA 3 -[NEDS3_3:NEDS3] -~w~Tienes ~1~ s. para volver al ~b~coche de bomberos~w~. +[GOAWAY1] +Vuelve cuando hayas terminado con las misiones de la banda haitiana. -[NEDS3_4:NEDS3] -Puntuación +[HAIT] +LAS MISIONES DE LA BANDA HAITIANA -[NEDS3_5:NEDS3] -¡Ve a provocar tantos choques en cadena, accidentes y actos de destrucción como puedas! +[HAIT1] +MISIÓN HAITIANA 1 -[NEDS3_6:NEDS3] -¡Peatón chafado! +[HAIT2] +MISIÓN HAITIANA 2 -[NEDS3_7:NEDS3] -¡Vehículo hundido! +[HAIT3] +MISIÓN HAITIANA 3 -[NEDS3_8:NEDS3] -¡Vehículo destruido! +[HAM3_6] +~g~Utiliza el rifle de francotirador que te he dejado para cumplir tu tarea. -[NEDS3_9:NEDS3] -¡Vehículo volcado! +[ROCK] +LAS MISIONES DE LA BANDA DE ROCK -[NEDS310:NEDS3] -~r~El coche de bomberos está destrozado. +[ROK1_4] +~g~De acuerdo, creo que esto es lo que andabais buscando... -[NEDS311:NEDS3] -¡Trompo de 360°! +[ROK1_1E] +~g~¡Costará más de lo que tienes! -[NEDS312:NEDS3] -¡Trompo de 720°! +[ROK1_1F] +~g~Vuelve cuando tengas el dinero. -[NEDS313:NEDS3] -¡Trompo de 1080°! +[RBM2_6] +~g~¡Guau! ¡Ella es un tío, detenle! -[NEDS314:NEDS3] -~r~Has bajado del coche de bomberos. +[ROCK3] +MISIONES DE LA BANDA DE ROCK 3 -[NEDS315:NEDS3] -¡Vueltas de campana! +[RBM3_5] +~g~Lleva a los Love Fist al escenario. -[NEDS316:NEDS3] -¡Tres choques de una tacada! +[CUBANM] +LAS MISIONES DE LA BANDA CUBANA -[NEDS317:NEDS3] -¡Cuatro choques de una tacada! +[CUBAN1] +MISIÓN CUBANA 1 -[NEDS318:NEDS3] -¡Cinco choques de una tacada! +[CUBAN2] +MISIÓN CUBANA 2 -[NEDS319:NEDS3] -¡Bonif. por choque en cadena masivo! +[CUB2_10] +~r~¡Se supone que debes matar a haitianos, no a cubanos! -[NEDS320:NEDS3] -~r~¡No has conseguido suficientes puntos a tiempo! +[CUBAN3] +MISIÓN CUBANA 3 -[NEDS321:NEDS3] -¡Bonif. por desmontar! +[CUBAN4] +MISIÓN CUBANA 4 -[NEDS322:NEDS3] -¡Bonif. por desmontar y chafar! +[PROT] +MISIONES DE PROTECCIÓN -[NEDS323:NEDS3] -¡Bonif. por salto de altura! +[PORN] +MISIONES PORNO -[NEDS324:NEDS3] -¡Bonif. por salto de altura masivo! +[PORN1] +MISIÓN PORNO 1 -[NEDS325:NEDS3] -~w~Tienes menos de 1 s. para volver al ~b~coche de bomberos~w~. +[POR1_03] +~r~¡Candy está muerta! -[NEDS326:NEDS3] -¡Felicidades! Lo has conseguido con ~1~ s. de sobra. +[PORN2] +MISIÓN PORNO 2 -[NEDS327:NEDS3] -~w~Ahora destruye el ~r~coche de bomberos~w~. No dejes pruebas. +[PORN3] +MISIÓN PORNO 3 -[NEDS328:NEDS3] -Puntúa más cada choque espectacular, o cada vehículo que vuelque, dé vueltas de campana o quede destruido. +[PORN4] +MISIÓN PORNO 4 -[NEDS329:NEDS3] -Vehículo volcado x ~1~ +[PHIL] +MISIONES DE PHIL -[NEDS330:NEDS3] -Vueltas de campana x ~1~ +[PHIL1] +MISIÓN DE PHIL 1 -[NEDS332:NEDS3] -~w~Tienes 1 s. para volver al ~b~coche de bomberos~w~. +[PHIL2] +MISIÓN DE PHIL 2 -[NEDS333:NEDS3] -¡Felicidades! NUEVO MEJOR TIEMPO con ~1~ s. de sobra. +[PIZ1_A] +MISIÓN DEL REPARTIDOR DE PIZZAS -[NEDS334:NEDS3] -~w~Ahora destruye el coche de bomberos. No dejes pruebas. +[CNTBUY1] +Compra de la imprenta: ~1~ $ -[NEDS335:NEDS3] -¡Trompo de 180°! +[CARBUY] +Compra del salón de coches: ~1~ $ -[NEDS337:NEDS3] -Coge el coche de bomberos y causa choques en cadena, accidentes y destrucción antes de las ~1~:~1~. +[PORNBUY] +Compra del estudio cinematográfico: ~1~ $ -[NEDS338:NEDS3] -Coge el coche de bomberos y causa choques en cadena, accidentes y destrucción antes de las ~1~:0~1~. +[ICEBUY] +Compra de la fábrica de helados: ~1~ $ -[NEDS339:NEDS3] -Coge el coche de bomberos y causa choques en cadena, accidentes y destrucción antes de las 0~1~:~1~. +[TAXIBUY] +Compra de la empresa de taxis: ~1~ $ -[NEDS340:NEDS3] -Coge el coche de bomberos y causa choques en cadena, accidentes y destrucción antes de las 0~1~:0~1~. +[BANKBUY] +Compra del Malibú: ~1~ $ -[NEDS341:NEDS3] -Causa tantos choques en cadena, accidentes y actos de destrucción antes de las ~1~:~1~. +[BOATBUY] +Compra del astillero: ~1~ $ -[NEDS342:NEDS3] -Causa tantos choques en cadena, accidentes y actos de destrucción antes de las ~1~:0~1~. +[PRNT_NO] +No puedes comprar la imprenta en este momento, vuelve más tarde. -[NEDS343:NEDS3] -Causa tantos choques en cadena, accidentes y actos de destrucción como puedas antes de las 0~1~:~1~. +[CAR_NO] +No puedes comprar el salón de coches en este momento, vuelve más tarde. -[NEDS344:NEDS3] -Causa tantos choques en cadena, accidentes y actos de destrucción como puedas antes de las 0~1~:0~1~. +[PORN_NO] +No puedes comprar el estudio cinematográfico en este momento, vuelve más tarde. -[NEDS331:NEDS3] -¡Causa tantos choques en cadena, accidentes y actos de destrucción como puedas! +[ICE_NO] +No puedes comprar la fábrica de helados en este momento, vuelve más tarde. -{=================================== MISSION TABLE NEDS4 ===================================} +[TAXI_NO] +No puedes comprar la compañía de taxis en este momento, vuelve más tarde. -[NEDS4_1:NEDS4] -NONE +[BANK_NO] +No puedes comprar el Malibú en este momento, vuelve más tarde. -[NEDS4_2:NEDS4] -~w~Tres estrellas se dirigen a la radio del centro para una entrevista antes del estreno de esta noche. +[BOAT_NO] +No puedes comprar el astillero en este momento, vuelve más tarde. -[NEDS4_3:NEDS4] -~w~La actriz, Faith W, vuela desde el aeropuerto Francis en un helicóptero privado. +[COL2_6] +¡Alto, cerdo imperialista americano! -[NEDS4_4:NEDS4] -~w~DB-P, el gánster convertido en actor, viene en barco desde Portland. +[COL2_6B] +Eso es propiedad del gobierno francés. -[NEDS4_5:NEDS4] -~w~Black Lightman, un actor alcohólico y envejecido, saldrá de rehabilitación e irá en una limusina. +[COL2_6C] +¡y se acabó! -[NEDS4_8:NEDS4] -~w~Faith ha caído. +[COL3_A] +Thomas, aprecio que vinieses. -[NEDS4_9:NEDS4] -~w~DB-P ha caído. +[COL3_B] +Perdóname por ir directamente al asunto. -[NEDS410:NEDS4] -~w~Black Lightman ha caído. +[COL3_C] +Diaz me ha pedido que supervise una transacción de un negocio menor. -[NEDS411:NEDS4] -~w~Todas las estrellas han sido eliminadas. Vuelve a la ~y~iglesia~w~ y díselo al padre. +[COL3_D] +Esperemos que vaya mejor que la última vez. -[NEDS412:NEDS4] -~r~¡Faith ha llegado a la emisora! +[COL3_E] +Por eso es por lo que pensé en ti, amigo mío. -[NEDS413:NEDS4] -~r~¡DB-P ha llegado a la emisora! +[COL3_F] +He dejado algo de protección en el aparcamiento. -[NEDS414:NEDS4] -~r~¡Black Lightman ha llegado a la emisora! +[COL3_G] +Recógele y luego id a ver a los hombres de Diaz en el punto de entrega. -[NEDS415:NEDS4] -~w~Se subirá a un Patriot blindado. +[COL4_2] +¡No lo sé, señor! -[NEDS417:NEDS4] -~w~El Patriot está blindado. +[COL4_5] +¡Señor, sí, señor! -[NEDS418:NEDS4] -~w~Cuidado con el tirador. +[COL4_10] +Vamos a comer unos donuts. -[NEDS421:NEDS4] -~w~La armería Phil Cassidy's tiene el icono de una bandera en el radar. +[COL4_16] +¡Señor! ¡Moviendo el vehículo, señor! -[NEDS4AA:NEDS4] -Perdóneme, padre, porque he vuelto a pecar... +[COL4_25] +¡Iniciada autodestrucción del vehículo! -[NEDS4AB:NEDS4] -Y una vez más serás redimido, hijo mío. +[COL5_6] +Mercedes, esa chica me matará. -[NEDS4AC:NEDS4] -¡El culto a la celebridad ha llegado demasiado lejos! +[COL5_8] +¡Maldita cucaracha! -[NEDS4AD:NEDS4] -¿Qué clase de zorra le da una exclusiva a una emisora de radio en vez de al diligente periodista de un diario? +[COL5_5] +¡Morid, cerdos franceses! -[NEDS4AF:NEDS4] -¡Destruye a esos falsos ídolos! +[CNT2_1] +Matadle. -[NEDS4BA:NEDS4] -He hecho lo que me pidió, padre. +[CNT2_2] +¡Conseguid las planchas! -[NEDS4BB:NEDS4] -¡Estupendo! El diario ha triplicado su tirada desde que encontraste el camino. +[CNT2_3] +¡Proteged al mensajero! -[NEDS4BC:NEDS4] -¿Qué? +[FINKILL] +¡De acuerdo, chicos, matadle! -[NEDS4BD:NEDS4] -¡Gracias de nuevo por toda tu ayuda, Toni! +[FIN_1A] +¡Ven aquí, traidor, pedazo de mierda! -[NEDS4BE:NEDS4] -Eh, ¿qué carajo? +[FIN_1B] +¡Vas a caer, mamón traicionero! -[NEDS4BF:NEDS4] -¿QUIÉN ERES? +[FIN_1C] +¡Éste es el último baile para Lance Vance! -[NEDS422:NEDS4] -Consigue un lanzacohetes en la armería Phil Cassidy's Fully Cocked. +[FIN_2B] +¡Oh, eso crees tú! -[NEDS4_7:NEDS4] -~w~No dejes que ninguna ~r~estrella~w~ llegue a la emisora LCFR. +[FIN_2C] +¡Ya tuve suficiente de eso en la escuela! -[NEDS416:NEDS4] -~w~No dejes que ninguna ~r~estrella~w~ llegue a la emisora LCFR. +[FIN_3] +Ahora no hay nadie para cubrirte el trasero, ¿eh, Tommy? -[NEDS419:NEDS4] -~w~Encontrarás armamento pesado en la armería Phil Cassidy's Fully Cocked. +[FIN_4] +Eres historia, Tommy, historia. -[NEDS420:NEDS4] -~w~El padre Ned ha pagado un lanzacohetes. Recógelo en la armería Phil Cassidy's Fully Cocked. +[FIN_5] +Escogiste el lado equivocado, Lance... -[NEDS4_6:NEDS4] -~w~Si necesitas armas pesadas, ve a la armería Phil Cassidy's Fully Cocked. +[FIN_6] +Sonny está arriba con la caja fuerte y mi dinero... -{=================================== MISSION TABLE DONS1 ===================================} +[FIN_10] +¿Sonny? ¡Sonny! ¡Voy por ti! -[MORG_01:DONS1] -2-2-3, 3-2-3, 4-2-3, 5-2-3... +[FIN_11A] +Me arrebataste quince años, Sonny... -[MORG_02:DONS1] -¡Antonio! ¡Cómo me alegro de verte! +[FIN_11B] +¡Y ahora voy a hacértelo pagar! -[MORG_03:DONS1] -¿Qué está pasando? +[FIN_12A] +Todavía no lo captas, ¿verdad? -[MORG_04:DONS1] -Estamos dando una fiesta, chico, una fiesta. +[FIN_12B] +Eres de mi propiedad, Tommy. -[MORG_05:DONS1] -¡Sí, una fiesta de fiambres! +[FIN_12C] +¡Esos quince años eran míos para gastarlos! -[MORG_08:DONS1] -¿Una fiesta de fiambres? ¿De qué cojones hablas? +[FIN_13] +Atrapadle chicos, nunca comprendió nada. -[MORG_09:DONS1] -Vamos a tener una nochecita de las buenas. +[RACES_4] +3 -[MORG_10:DONS1] -Pero primero tenemos que ir a recoger a los invitados... +[RACES_5] +2 -[MORG_11:DONS1] -Venga, antes de que se mueran de aburrimiento. +[RACES_6] +1 -[MORG_12:DONS1] -Y no lo decía con segundas... +[RACES_7] +¡ADELANTE! -[MORG_13:DONS1] -Porque ya están muertos, ¿sabes...? +[RACES_9] +Tiempo: ~1~:~1~ -[MORG_14:DONS1] -El invitado de honor va camino del instituto forense. +[RACES] +TIEMPO: -[MORG_15:DONS1] -No le hagamos esperar. +[RACES17] +Nuevo mejor tiempo: ~1~:~1~ -[MORG_06:DONS1] -- ¡La primera de la temporada! ~n~ - Epa, epa, epa, epa... +[RACES18] +HAS GANADO: ~1~ $ -[DONS1_1:DONS1] -Nada +[RACES20] +Nuevo mejor tiempo: ~1~:0~1~ -[DL1_A:DONS1] -Voy a dar una fiesta de fiambres y quiero que recojas a los "invitados". +[RACES21] +Tiempo: ~1~:0~1~ -[DL1_2:DONS1] -~r~Has destruido el coche. -[DL1_3:DONS1] -La poli ha sido alertada, ¡quítate el nivel de búsqueda! +[RCH1_2] +~g~Los CONTROLES están esparcidos a lo largo del aeropuerto. -[DL1_4:DONS1] -Lleva el coche al ~y~garaje~w~ de Donald. +[RCH1_5] +Tiempo: -[DL1_6:DONS1] -~r~El coche fúnebre ha llegado a la comisaría. +[RCRC1_2] +~g~¡Ve a la parrilla de salida! -[DL1_9:DONS1] -Mete el coche en el taller de pintura. +[RCRC1_4] +~g~3 -[DL1_5:DONS1] -Roba el ~b~coche fúnebre~w~ antes de que llegue a su destino. +[RCRC1_5] +~g~2 -{=================================== MISSION TABLE DONS2 ===================================} +[RCRC1_6] +~g~1 -[DONS2AA:DONS2] -¿D.L.? +[RCRC1_7] +~g~¡ADELANTE! -[DONS2AB:DONS2] -¡Toni! +[RCRC1_8] +~g~Tiempo de carrera: ~1~ segundos -[DONS2AC:DONS2] -¿Cómo va la campaña? +[RCPL1_1] +~g~Compite en una CARRERA DE PUNTOS DE CONTROL con otros tres Barón RC. -[DONS2AD:DONS2] -Pende de un hilo. ¡Hasta el último voto va a contar! +[RCPL1_2] +~g~Debes atravesar la ~o~CORONA DEL CENTRO ~g~para pasar con éxito un punto de control. -[DONS2AE:DONS2] -Los militantes de O'Donovan trabajan duro en las zonas de voto indeciso. +[RCPL1_3] +~g~¡Ve ahora a la parrilla de salida! -[DONS2AF:DONS2] -Bueno, tenemos nuestro vehículo de megafonía, ¡hagamos contracampaña! - -[DONS2BA:DONS2] -¡Vota a O'Donovan para alcalde! - -[DONS2BB:DONS2] -¡Vota a O'Donovan para acabar con la corrupción! - -[DONS2BC:DONS2] -¡Dale tu confianza a O'Donovan para alcalde! - -[DONS2BD:DONS2] -¡Basta de delincuencia! ¡Vota a O'Donovan! - -[DONS2BE:DONS2] -¡Vota a la justicia! ¡Vota a O'Donovan! - -[DONS2CA:DONS2] -¡O'Donovan tiene tres concubinas! - -[DONS2CB:DONS2] -¿Quién se comió todas las galletitas? ¡O'Donovan! - -[DONS2CC:DONS2] -¡O'Donovan es un yonqui! - -[DONS2CD:DONS2] -¡O'Donovan es un sodomita compulsivo! - -[DONS2CE:DONS2] -¡O'Donovan es comunista! - -[DONS2CF:DONS2] -¡O'Donovan se pone la ropa interior de su hija! - -[DONS2CG:DONS2] -¡A O'Donovan se la ponen dura los gorrinos! - -[DONS2CH:DONS2] -¡O'Donovan odia a América! - -[DONS2CI:DONS2] -¡Love no gravará a los ricos! - -[DONS2CJ:DONS2] -¡Vota a Love para tener clases de medicina forense en el cole! - -[DONS2CK:DONS2] -¡Donald Love cree en el acceso a la morgue para todos! - -[DONS2CL:DONS2] -¡Donald Love es un héroe de guerra! - -[DONS2CM:DONS2] -¡Votar por Love es votar por la felicidad! - -[DONS2CN:DONS2] -Donald Love, ¡duro con los vegetarianos! - -[DONS2_1:DONS2] -~w~Sube a la ~b~camioneta~w~. - -[DONS2_3:DONS2] -~w~¡O'Donovan ha sacado sus ~r~camionetas~w~ para recuperar votos! - -[DONS2_4:DONS2] -~r~¡No has conseguido votos suficientes! - -[DONS2_6:DONS2] -~w~Tiempo restante - -[DONS2_7:DONS2] -~w~Vuelve a la ~b~camioneta~w~ y prosigue la misión. - -[DONS2_9:DONS2] -~w~¡O'Donovan ha sacado otra ~r~camioneta~w~! - -[DONS210:DONS2] -~w~Zonas - -[DONS211:DONS2] -~r~¡Has perdido todas las zonas de voto! - -[DONS212:DONS2] -~r~¡No has conseguido acabar con la oposición! - -[DONS2_2:DONS2] -~w~Pasa por los ~y~puntos de control de las zonas de voto indeciso~w~ para conseguir su apoyo. - -[DONS215:DONS2] -~w~¡O'Donovan te ha arrebatado una ~y~zona~w~! - -[DONS216:DONS2] -~w~¡No dejes que O'Donovan recupere todas las ~y~zonas~w~! - -[DONS213:DONS2] -~w~Ya tienes zonas suficientes, ahora acaba con las ~r~camionetas de la oposición~w~ para impedir que O'Donovan consiga más. - -[DONS2_8:DONS2] -~w~Consigue al menos cinco ~y~zonas de voto~w~. - -[DONS214:DONS2] -~w~Tienes menos de cinco ~y~zonas~w~, ¡recupéralas! - -[DONS217:DONS2] -~w~Hazte con más zonas para que aumente la gratificación por terminar. - -[DONS2_5:DONS2] -~r~La camioneta electoral ha sido destruida. - -[DONS218:DONS2] -~w~Consigue al menos 5 ~y~zonas de voto~w~ antes de las ~1~:~1~. - -[DONS219:DONS2] -~w~Consigue al menos 5 ~y~zonas de voto~w~ antes de las 0~1~:~1~. - -[DONS220:DONS2] -~w~Consigue al menos 5 ~y~zonas de voto~w~ antes de las 0~1~:0~1~. - -[DONS221:DONS2] -~w~Consigue al menos 5 ~y~zonas de voto~w~ antes de las ~1~:0~1~. - -[DONS230:DONS2] -~w~Ya tienes zonas suficientes, ahora acaba con la ~r~camioneta de la oposición~w~ para impedir que O'Donovan consiga más. - -{=================================== MISSION TABLE DONS3 ===================================} - -[CAMP_01:DONS3] -¡Antonio! '¿Qué pasa, amigo?' - -[CAMP_02:DONS3] -Sabes muy bien que soy italiano, Don, no español. - -[CAMP_03:DONS3] -Claro, qué despiste el mío. Es que me encantan todas las lenguas romances. - -[CAMP_04:DONS3] -Dios mío, qué bueno está. - -[CAMP_05:DONS3] -Sabe como el pollo, pero es como algo más... eeh... inteligente. - -[CAMP_06:DONS3] -¿Quieres un poco? - -[CAMP_07:DONS3] -Ya he comido, gracias. - -[CAMP_08:DONS3] -Muy mal. Está de muerte. - -[CAMP_09:DONS3] -Y están a punto de servirme más exquisiteces... - -[CAMP_10:DONS3] -Los liberales disfrutarán de lo suyo, por supuesto, - -[CAMP_11:DONS3] -¡pero qué poco saben de los verdaderos placeres de la vida! - -[CAMP_12:DONS3] -La sofisticación y la democracia nunca han sido buenos compañeros de cama. - -[CAMP_13:DONS3] -Escucha, Don, tenemos que ganar estas elecciones. - -[CAMP_14:DONS3] -Vale, tenemos que asegurarnos de que no haya huesos que desenterrar, - -[CAMP_15:DONS3] -si sabes a lo que me refiero... - -[CAMP_16:DONS3] -Claro. - -[CAMP_17:DONS3] -Lo que quiero decir es... - -[CAMP_18:DONS3] -¿cómo podemos ocuparnos de ese O'Donovan que encubre... - -[CAMP_19:DONS3] -digo... representa a los Forelli? - -[CAMP_20:DONS3] -El tío tiene un montón de gente que le hace campaña, - -[CAMP_21:DONS3] -toda clase de gente 'ilusa', no sé si me explico. - -[CAMP_22:DONS3] -Creo que debemos socavar la fe que tienen en la democracia, no sé si me entiendes. - -[CAMP_23:DONS3] -¿Quieres decir que tengo que espabilarlos a hostias? - -[CAMP_24:DONS3] -Ah, esa pasión tuya, Antonio, es... es... magnífica. - -[CAMP_25:DONS3] -Es tan... um... um...um... ¡wagneriana! ¿Sabes? Arriverdici, 'amigo'. - -[CAMP_26:DONS3] -Humphries, ¡traiga las asaduras! - -[DONS3_1:DONS3] -Toni debe librarse de los militantes de la oposición, debilitando así la eficacia de la campaña electoral de O'Donovan, candidato de los Forelli. - -[DONS3_2:DONS3] -~w~Mata a los ~r~militantes~w~ de la oposición. - -[DONS3_3:DONS3] -~r~Se te ha acabado el tiempo. - -[DONS3_4:DONS3] -Ya has terminado con estos ~r~militantes~w~. Ocúpate de los siguientes. - -[DONS3_5:DONS3] -~w~Mata a los ~r~militantes~w~ de la oposición antes de las ~1~:~1~. - -[DONS3_6:DONS3] -~w~Mata a los ~r~militantes~w~ de la oposición antes de las ~1~:0~1~. - -[DONS3_7:DONS3] -~w~Mata a los ~r~militantes~w~ de la oposición antes de las 0~1~:~1~. - -[DONS3_8:DONS3] -~w~Mata a los ~r~militantes~w~ de la oposición antes de las 0~1~:0~1~. - -{=================================== MISSION TABLE DONS4 ===================================} - -[DONS410:DONS4] -Ve al ~y~almacén de los Forelli~w~ y quema sus papeletas. - -[DONS411:DONS4] -Quema las ~r~papeletas~w~ y destroza las ~r~imprentas~w~. - -[DONS412:DONS4] -Destroza la ~r~imprenta~w~. - -[DONS413:DONS4] -Quema TODAS las ~r~papeletas~w~. - -[DONS414:DONS4] -Destruye las ~r~camionetas de los Forelli~w~ restantes. - -[DONS416:DONS4] -~r~¡Has perdido una camioneta de los Forelli! ¡Amañarán las elecciones! - -[DONS418:DONS4] -Quedan ~r~~1~ palés~w~ de votos falsos. - -[DONS419:DONS4] -Solo queda ~r~1 palé~w~ de votos falsos. - -[DONS420:DONS4] -Destruye la ~r~camioneta de los Forelli~w~ restante. - -[DONS421:DONS4] -¡Ya has destruido una! Ahora destroza la otra ~r~imprenta~w~. - -[DONS422:DONS4] -¡Imprenta destrozada! - -[DONS423:DONS4] -¡Ahora sal de aquí! - -[DONS424:DONS4] -¡Destroza las ~r~imprentas~w~! - -[DS4_AA:DONS4] -Tanta gente. Tanto dinero esperando a que le echen mano. - -[DS4_AB:DONS4] -No pretendo entender de política. - -[DS4_AC:DONS4] -Nadie la entiende. Todo es charlatanería y corrupción. - -[DS4_AD:DONS4] -Los Forelli tienen en secreto una participación en la compañía que hace las máquinas de votar. - -[DS4_AE:DONS4] -Eso es malo, ¿no? - -[DS4_AF:DONS4] -Está claro que no podemos fiarnos de ellos. - -[DS4_AG:DONS4] -No, es mejor que se estropeen, y así "menuda papeleta". Tú ya me entiendes. - -[DONS4H1:DONS4] -Encontrarás armamento pesado en la armería Phil Cassidy's Fully Cocked. - -[DONS4AA:DONS4] -¡Antonio, me alegro de verte! - -[DONS4AB:DONS4] -No soy un demócrata, pero lo de amañar las votaciones no va conmigo. - -[DONS4AC:DONS4] -¿Sabías que los Forelli participan en secreto en la compañía que hace las máquinas de votar? - -[DONS4AD:DONS4] -Eso es malo, ¿no? - -[DONS4AE:DONS4] -Está claro que no podemos fiarnos de ellos. - -[DONS4AF:DONS4] -No, es mejor que se estropeen, y así 'menuda papeleta'. Tú ya me entiendes. - -[DONS4_8:DONS4] -Ve a la armería Phil Cassidy's Fully Cocked. - -[DONS4H2:DONS4] -La armería Phil Cassidy's Fully Cocked tiene el icono de una bandera en el radar. - -[DONS427:DONS4] -¡Ahora sal de Fort Staunton! - -[DONS4_9:DONS4] -La armería Phil Cassidy's Fully Cocked te proporcionará equipo para malograr la campaña de los Forelli. - -[DONS417:DONS4] -Hay otro lanzallamas en la armería Phil Cassidy's Fully Cocked. - -[DONS425:DONS4] -Recoge el lanzallamas en la armería Phil Cassidy's Fully Cocked. - -[DONS426:DONS4] -~r~¡El dependiente es historia! - -[DONS4H3:DONS4] -Donald Love ha pagado un lanzallamas. Ve al mostrador a recogerlo. - -{=================================== MISSION TABLE DONS5 ===================================} - -[DONS5_7:DONS5] -Protege la limusina de Donald. - -[DONS5_9:DONS5] -~r~¡Donald Love es historia! - -[DONS513:DONS5] -Daño en limusina - -[DONS516:DONS5] -Sube a la ~b~limusina~w~. - -[DONS517:DONS5] -¡Te has dejado a ~b~Donald Love~w~! - -[DONS519:DONS5] -¡Lleva a Donald al ~y~piso franco~w~! - -[DONS520:DONS5] -¡Mata a los ~r~atacantes~w~! - -[DONS521:DONS5] -Sube a la ~b~limusina~w~. - -[DS5_AA:DONS5] -Cómo odio la publicidad, pero forma parte del juego, ¿no? - -[DS5_AB:DONS5] -Eso me temo. - -[DS5_AC:DONS5] -Los Forelli van a intentar matarme, ¿no? - -[DS5_AD:DONS5] -No te preocupes, yo iré de copiloto. - -[DS5_AE:DONS5] -Oh, muy bien. De perdidos al río... - -[DS5_BA:DONS5] -¡Mierda! ¡Esto es ridículo! - -[DS5_BB:DONS5] -No te asustes, ¡yo me encargo de esos capullos! - -[DS5_BC:DONS5] -¡Hay un rifle en el maletero! - -[DS5_BD:DONS5] -¡Cierra las puertas, esto será rápido! - -[DS5_CA:DONS5] -Vale, podemos irnos. - -[DS5_CB:DONS5] -¡Tenemos otro sicario en los talones! - -[DS5_DA:DONS5] -No puedo ganar unas elecciones si estoy encerrado todo el día. - -[DS5_DB:DONS5] -Tendremos que pensar en una táctica diferente. - -[DONS522:DONS5] -~w~¡Lleva a Donald de vuelta a su ~y~edificio~w~! - -{=================================== MISSION TABLE DONS6 ===================================} - -[DONS6_1:DONS6] -NONE - -[DS6_00:DONS6] -Sigue a la ~b~camioneta electoral~w~. - -[DS6_01:DONS6] -Espera a que el ~b~mensajero~w~ haga el cambio. - -[DS6_02:DONS6] -Róbale los votos al ~r~mensajero~w~. - -[DS6_03:DONS6] -Mata al ~r~mensajero~w~. - -[DS6_04:DONS6] -Coge el ~g~paquete~w~. - -[DS6_05:DONS6] -Sigue a la ~b~camioneta electoral~w~ otra vez. - -[DS6_06:DONS6] -~r~¡Has matado al mensajero antes del cambio! - -[DS6_07:DONS6] -¡Has fallado uno de los intercambios, no puedes fallar otro! - -[DS6_08:DONS6] -~r~¡Has fallado los dos cambios, no se puede amañar el voto! - -[DS6_09:DONS6] -~r~¡Le has espantado! - -[DS6_10:DONS6] -~r~¡La camioneta ha sido destruida! - -[DS6_11:DONS6] -¡Se te ha acabado el tiempo! - -[DS6_12:DONS6] -~r~¡No has alcanzado a la camioneta! - -[DS6_13:DONS6] -~r~¡La camioneta no puede ir sin conductor! - -[DS6_15:DONS6] -~r~¡Has espantado al conductor, ahora nunca lo atraparás! - -[DS6_16:DONS6] -~1~ - -[DS6_17:DONS6] -~w~El conductor perseguido ha muerto, lleva la camioneta al ~y~garaje de Donald~w~. - -[DONS6AA:DONS6] -¡Malas noticias, Toni! - -[DONS6AB:DONS6] -¿Qué? - -[DONS6AC:DONS6] -Los sondeos están muy ajustados. - -[DONS6AD:DONS6] -Es hora del plan B. - -[DONS6AE:DONS6] -Robaremos algunos votos aún por contabilizar y los cambiaremos por unos nuestros. - -[DONS6AF:DONS6] -¿Y eso que decías de no amañar las votaciones? - -[DONS6AG:DONS6] -¡Venga, cierra la boca! - -[DS6_14:DONS6] -¡Vuelve a por los ~g~votos~w~, no puedes dejarlos atrás! - -[DS6_66:DONS6] -~r~¡Has destruido el coche del mensajero antes del cambio! - -[DS6_18:DONS6] -¡Has matado al mensajero antes del cambio! ¡No mates a más! - -[DS6_21:DONS6] -¡Rápido! ¡Se está produciendo un cambio! - -[DS6_22:DONS6] -No has llegado al primer cambio, ¡no vuelvas a fallar! - -[DS6_23:DONS6] -No has llegado al segundo cambio, ¡no vuelvas a fallar! - -[DS6_24:DONS6] -No has llegado al tercer cambio, ¡no vuelvas a fallar! - -[DS6_25:DONS6] -No has llegado al cuarto cambio, ¡no vuelvas a fallar! - -[DS6_26:DONS6] -Has asustado al mensajero antes del cambio. ¡Que no vuelva a pasar! - -[DS6_28:DONS6] -~r~¡La has cagado! ¡Ya no se puede amañar la votación! - -{=================================== MISSION TABLE DONS7 ===================================} - -[ELEC_01:DONS7] -Hola, Don. Ya te he sacado del lío. - -[ELEC_02:DONS7] -Ahora todo irá sobre ruedas. - -[ELEC_03:DONS7] -¿Seguro? - -[ELEC_04:DONS7] -Ya no tienes vínculos con el crimen organizado. - -[ELEC_05:DONS7] -Estás más limpio que el culo de un bebé. Más que el Papa. - -[ELEC_07:DONS7] -Aunque no se ha podido relacionar a Donald Love... - -[ELEC_08:DONS7] -con el crimen organizado de Liberty City, - -[ELEC_09:DONS7] -parece que su amistad con mafiosos, incluyendo a Toni Cipriani, - -[ELEC_11:DONS7] -ha influido muy negativamente en los votantes. - -[ELEC_12:DONS7] -En las últimas horas su popularidad ha caído en picado. - -[ELEC_13:DONS7] -Se le considera indigno de un cargo público... - -[ELEC_14:DONS7] -¡Indigno! Por tu culpa... - -[ELEC_15:DONS7] -Sí. Todo por tu culpa. - -[ELEC_16:DONS7] -¿Mi culpa? - -[ELEC_17:DONS7] -Oh, sí. - -[ELEC_18:DONS7] -¿Mi culpa? - -[ELEC_19:DONS7] -Con los sacrificios que he hecho por esta ciudad, - -[ELEC_20:DONS7] -¿y sabes cuál ha sido mi punto débil todo este tiempo...? - -[ELEC_21:DONS7] -¡La humildad! Y ahora estoy arruinado. - -[ELEC_22:DONS7] -¡En BANCARROTA! 20 millones a hacer puñetas. - -[ELEC_23:DONS7] -Acabado... Arruinado... ¡Arriverdici! ¡BANCARROTA! - -[ELEC_06:DONS7] -¡Que el Papa! Mira esto... - -[DONS7_1:DONS7] -O'Donovan relaciona a Donald Love con Salvatore Leone. La carrera política de Donald Love pende de un hilo. Toni debe destruir las pruebas. - -[DONS7_2:DONS7] -~w~Ve a robar la ~b~furgoneta~w~ que contiene las pruebas. - -[DONS7_3:DONS7] -~r~Has matado al contacto. - -[DONS7_4:DONS7] -~w~Lleva la furgoneta al ~y~punto de entrega~w~. - -[DONS7_5:DONS7] -~w~Vuelve a la ~b~furgoneta~w~. - -[DONS7_7:DONS7] -Sube al ~b~coche del contacto~w~. - -[DONS7CA:DONS7] -Ah, Toni. - -[DONS7CB:DONS7] -Las pruebas están en esa furgoneta de delante. - -[DONS7CC:DONS7] -Tendrás que abrirte paso. - -[DONS7CD:DONS7] -Lleva la furgoneta a casa de D.L. - -[DONS7CE:DONS7] -¡Buena suerte! - -[DONS713:DONS7] -~w~Aparca la furgoneta en el ~y~garaje~w~. - -[DONS714:DONS7] -~r~Has destruido la furgoneta. - -[RMN_AA:DONS7] -Esta noche se celebrará que las protestas laborales que habían paralizado Liberty City... - -[RMN_AB:DONS7] -por fin se han terminado. - -[RMN_AC:DONS7] -Se han restablecido los servicios regulares de ferry y metro. - -[RMN_AD:DONS7] -Hasta el puente levadizo que une Staunton Island con Shoreside Vale se ha reabierto al tráfico. - -[RMN_AE:DONS7] -Lo huelguistas por fin han guardado las pancartas y vuelto a sus puestos de trabajo... - -[RMN_AF:DONS7] -después de que el recién elegido alcalde O'Donovan les hiciera esta promesa: - -[RMN_AG:DONS7] -Como su alcalde, les garantizo que SIEMPRE habrá un servicio de ferry en Liberty City. - -[RMN_AH:DONS7] -Pero algunos temen que estas promesas caigan en saco roto, - -[RMN_AI:DONS7] -ya que siguen las obras del nuevo túnel de Porter Road. - -[DONS7_6:DONS7] -~w~Reúnete con el ~b~hombre~w~ de Donald Love bajo el paso elevado de Newport. - -{=================================== MISSION TABLE RAYS1 ===================================} - -[SAYO_01:RAYS1] -Así que tú eres la mosca cojonera, ¿eh? - -[SAYO_02:RAYS1] -¿Perdón? - -[SAYO_03:RAYS1] -Mucha gente importante se está cagando en tus muelas. - -[SAYO_04:RAYS1] -Leon McAffrey, de la policía de LC. - -[SAYO_05:RAYS1] -No sé de qué me está hablando. - -[SAYO_06:RAYS1] -Yo me dedico a la restauración. - -[SAYO_07:RAYS1] -Lo que tú digas, tipo duro. - -[SAYO_08:RAYS1] -Si los macarronis os queréis matar a tiros, me importa una mierda. - -[SAYO_09:RAYS1] -Lo único que me importa es mi tajada. - -[SAYO_12:RAYS1] -¿Dónde está mi tajada? - -[SAYO_13:RAYS1] -En tu puto culo, amigo. No me hagas reír. - -[SAYO_14:RAYS1] -Si sigues jodiéndome, te liquido a ti, a tus amigos, - -[SAYO_15:RAYS1] -a sus familias y a toda esta puta ciudad. - -[SAYO_16:RAYS1] -Cálmate. Echa un buen polvo o algo así. - -[SAYO_17:RAYS1] -Esto es un negocio -una sociedad- a partes iguales. - -[SAYO_18:RAYS1] -Yo te quito de encima a la ley -federales, antimafia...- - -[SAYO_19:RAYS1] -y tú me pagas los vicios que me gustan. - -[SAYO_20:RAYS1] -¿Y qué garantía tengo de que no me va extorsionar... - -[SAYO_21:RAYS1] -hasta el último poli corrupto de aquí a Vice City? - -[SAYO_22:RAYS1] -Te voy a ayudar a hacerte con esta ciudad. - -[SAYO_23:RAYS1] -A cambio, quiero pasta y unos cuantos favores. - -[SAYO_24:RAYS1] -Vamos, Toni, demos una vuelta... - -[SAYO_25:RAYS1] -Vamos a ver a unos viejos amigos tuyos, los Sindacco. - -[SAYO_10:RAYS1] -- Me encantan los hombres con principios. ~n~ - A mí también. Voy a sus funerales en un cochazo lleno de tías buenas. - -[RS1_YK:RAYS1] -Daño - -[RS1_01:RAYS1] -Liquida a los ~r~Sindacco~w~. - -[RS1_02:RAYS1] -~r~¡El coche ha sido destruido! - -[RS1_03:RAYS1] -~r~¡Los yakuza han sido masacrados! - -[RS1_04:RAYS1] -~w~Mata a algunos ~r~Sindacco~w~ para llamar su atención. - -[RS1_05:RAYS1] -~w~Sube al ~b~coche~w~ de Leon. - -[RS1_06:RAYS1] -~w~Ve al ~y~territorio de los Sindacco~w~. - -[RS1_07:RAYS1] -~w~Vuelve al ~b~coche~w~. - -[RS1_10:RAYS1] -~r~¡Has matado a Leon! - -[RAYS1AA:RAYS1] -¡Bien, yo cojo el volante, tú disparas! - -[RAYS1AB:RAYS1] -Pero ¿no habías dicho que los yakuza harían el trabajo sucio? - -[RAYS1AC:RAYS1] -Adaptarse o morir, Cipriani. Adaptarse o morir. - -[RAYS1BA:RAYS1] -Mierda, esto se está yendo de madre. - -[RAYS1BB:RAYS1] -Yo me las piro. Nos vemos, Toni. - -[RAYS1CA:RAYS1] -¡No bajes la vista, Toni! - -[RAYS1CB:RAYS1] -¡Detrás de nosotros, Toni, detrás! - -[RAYS1CC:RAYS1] -¡Cuidado, a la izquierda! - -[RAYS1CD:RAYS1] -¡A la derecha, Toni, la derecha! - -[RAYS1CE:RAYS1] -Vuelve al coche. - -[RAYS1CF:RAYS1] -¡Mira lo que estás haciendo! - -[RAYS1OS:RAYS1] -¡Oh, mierda! - -{=================================== MISSION TABLE RAYS2 ===================================} - -[RS2_02:RAYS2] -~w~¡Rápido, súbete a una ~b~moto~w~! - -[RS2_03:RAYS2] -~w~¡Atrae a los motoristas a la ~y~emboscada~w~! - -[RS2_04:RAYS2] -~w~Vuelve, ¡no puedes dejar atrás a ningún ~r~Forelli~w~! - -[RS2_05:RAYS2] -~w~Vuelve a la ~b~moto~w~. - -[RS2_06:RAYS2] -~r~Necesitas una moto para atraer a los Forelli. - -[RS2_07:RAYS2] -~r~Los Yardies quieren derramar personalmente la sangre de los Forelli. - -[RS2_08:RAYS2] -~r~¡No ha sobrevivido ni un Yardie! - -[RS2_09:RAYS2] -~1~ - -[RS2_10:RAYS2] -~r~¡No pueden perseguirte si no tienen ni una moto! - -[RAYS2AA:RAYS2] -Te has tomado tu tiempo, Toni. - -[RAYS2AB:RAYS2] -Tú dices 'salta', yo digo 'jódete'. - -[RAYS2AD:RAYS2] -Qué bonito. Ahora escucha. - -[RAYS2AE:RAYS2] -Los Yardies ansían el territorio de los Forelli en Newport. - -[RAYS2AF:RAYS2] -Ve allí y atrae a los soldados de los Forelli al hospital de Rockford. - -[RAYS2AG:RAYS2] -Los Yardies les estarán esperando. - -[RAYS2AH:RAYS2] -¿Y tú qué ganas? - -[RAYS2AI:RAYS2] -Les debo una. Nos vemos luego. - -[RS2_11:RAYS2] -¡No mates a ningún Forelli! - -[RS2_12:RAYS2] -¡~r~Elimínalos~w~! - -[RS2_01:RAYS2] -~w~Roba una ~b~moto~w~ de los Forelli pero no mates a ninguno. - -[RAYS2DB:RAYS2] -Sí. ¡Venga, vamos a darles! - -[RS2_13:RAYS2] -~r~¡Han muerto demasiados Yardies! - -{=================================== MISSION TABLE RAYS3 ===================================} - -[CRAZ_01:RAYS3] -No sé qué hice mal en mi otra vida para merecerte. - -[CRAZ_02:RAYS3] -Ray, tienes 40 tacos y no tienes ni idea de cómo va todo este rollo. - -[CRAZ_03:RAYS3] -No sé cómo has llegado tan lejos. - -[CRAZ_04:RAYS3] -No entiendo cómo nadie te ha volado esa carita de Madre Teresa que tienes. - -[CRAZ_05:RAYS3] -Eh, esa boca, Leon. - -[CRAZ_06:RAYS3] -No puedo creer que tengamos esta puta conversación. - -[CRAZ_07:RAYS3] -¿Qué, te vas a ir corriendo con mamá? - -[CRAZ_08:RAYS3] -¿A jugar al caballito con papá? - -[CRAZ_09:RAYS3] -¿O a pedirles un besito? - -[CRAZ_10:RAYS3] -¡Eh, Toni! - -[CRAZ_14:RAYS3] -Se asegurará de que lo haga todo según el reglamento. - -[CRAZ_15:RAYS3] -Toni Cipriani, Ray Machowski. - -[CRAZ_16:RAYS3] -Está con nosotros. Vamos a combatir la delincuencia organizada. - -[CRAZ_17:RAYS3] -Ahora vete corriendo a comisaría y haz un atestado. - -[CRAZ_18:RAYS3] -Buen chico... Vamos, Toni. - -[CRAZ_19:RAYS3] -Eres un cabronazo, Leon. - -[CRAZ_11:RAYS3] -- Quieto, capullo. ~n~ - ¡EPA! ¡Epa! ¡Epa! ¡Tranqui! Te presento a mi nuevo socio. ¡El Sr. Chupiguay! - -[RAYS3_1:RAYS3] -Ayuda a los yakuza a conquistar el territorio de los Forelli en Belleville Park. Hay que matar a ~1~ Forelli usando solo la katana. - -[RAYS3_2:RAYS3] -~w~Mata a ~1~ ~r~Forelli~w~ usando solo la katana que te han dado. - -[RAYS3_3:RAYS3] -Abat. - -[RAYS3_4:RAYS3] -~w~Tienes que matar a los ~r~Forelli~w~ con la katana. - -[RAYS3_5:RAYS3] -~w~No tienes katana. Coge otra ~g~de repuesto~w~. - -[RAYS3_6:RAYS3] -~r~Se te ha acabado el tiempo. - -[RAYS3_7:RAYS3] -~w~Mata a ~1~ ~r~Forelli~w~ usando solo la katana que te han dado antes de las ~1~:~1~. - -[RAYS3_8:RAYS3] -~w~Mata a ~1~ ~r~Forelli~w~ usando solo la katana que te han dado antes de las ~1~:0~1~. - -[RAYS3_9:RAYS3] -~w~Mata a ~1~ ~r~Forelli~w~ usando solo la katana que te han dado antes de las 0~1~:~1~. - -[RAYS310:RAYS3] -~w~Mata a ~1~ ~r~Forelli~w~ usando solo la katana que te han dado antes de las 0~1~:0~1~. - -{=================================== MISSION TABLE RAYS4 ===================================} - -[RAYS4_1:RAYS4] -~w~Están atacando a los Yardies en Newport. Ocúpate de los ~r~Sindacco~w~ atacantes. - -[RAYS4_2:RAYS4] -~w~Ve a hablar con el ~b~líder de la banda de los Yardies~w~. - -[RAYS4_3:RAYS4] -~w~Sigue al ~b~líder de la banda de los Yardies~w~. - -[RAYS4_4:RAYS4] -~r~¡Han matado a uno de los Yardies! - -[RAYS4_5:RAYS4] -~w~Protege a los Yardies hasta que llegue la ambulancia. - -[RAYS4_6:RAYS4] -~w~Vuelve y protege a los Yardies. - -[RAYS4_7:RAYS4] -~w~Abre un camino para que los Yardies lleguen a la ambulancia. - -[RAYS4_8:RAYS4] -~w~Ve a encontrarte con la ~y~ambulancia~w~. - -[RAYS4AA:RAYS4] -Cipriani, debemos dejar de vernos así. - -[RAYS4AB:RAYS4] -Por mí, bien. - -[RAYS4AC:RAYS4] -Vamos, anímate un poco. - -[RAYS4AD:RAYS4] -¿Qué tienes para mí, McAffrey? - -[RAYS4AE:RAYS4] -A esos Yardies les cuesta un poco conservar el territorio que acaban de conseguir en Newport. - -[RAYS4AF:RAYS4] -Parece que los Sindacco quieren recuperarlo. - -[RAYS4BA:RAYS4] -¡Han perforado a Boy Rudyard! - -[RAYS4BB:RAYS4] -¡Venga, tenemos que meterlo en una ambulancia! - -[RAYS4BC:RAYS4] -Mierda, más payasos de los Sindacco. - -[RAYS4BD:RAYS4] -¡Yo traigo la ambulancia, tú ayuda a mis chicos! - -[RAYS4BE:RAYS4] -¡Salgamos de aquí! - -[RAYS4BF:RAYS4] -¡Aquí viene la ambulancia! - -[RAYS4BG:RAYS4] -Gracias, Sr. Cipriani, ¡Le debemos una! - -{=================================== MISSION TABLE RAYS5 ===================================} - -[RAYS5_1:RAYS5] -NONE - -[RAYS5AA:RAYS5] -¿No hay flores? - -[RAYS5AB:RAYS5] -No sabía que fuera tu funeral. - -[RAYS5AC:RAYS5] -Eres un payaso de la hostia, Toni, un tío muy cachondo. - -[RAYS5AD:RAYS5] -Los Forelli se están poniendo serios. - -[RAYS5AE:RAYS5] -Están transportando armas y quedándose con una parte para ellos... - -[RAYS5AF:RAYS5] -Preparándose por si hay marrones. - -[RAYS5AG:RAYS5] -Están llevando las armas a Fort Staunton en camiones. - -[RAYS5AH:RAYS5] -Bueno, ha sido muy 'díver'. - -[RAYS5AI:RAYS5] -Lo mismo digo. - -[RAY5_2:RAYS5] -Han pedido refuerzos. - -[RAY5_3:RAYS5] -~r~Los Forelli tienen la munición. - -[RAY5_4:RAYS5] -Eh, ¡es Cipriani! - -[RAY5_5:RAYS5] -¡Cargáoslo! - -[RAY5_6:RAYS5] -Uno menos, ahora destruye el otro ~r~camión~w~. - -[RAY5_1:RAYS5] -Destruye los ~r~camiones~w~ antes de que lleguen a su destino. - -[RAY5_7:RAYS5] -Destruye el ~r~camión~w~ antes de que saquen munición suficiente de él. - -[RAY5_8:RAYS5] -~r~¡No has destruido el camión a tiempo! - -{=================================== MISSION TABLE SALH1 ===================================} - -[SLH1_F1:SALH1] -~r~Has matado a uno de los Hoods. - -[SLH1_F2:SALH1] -~w~Atrae a los Forelli destrozando sus ~r~coches~w~. - -[SLH1_F3:SALH1] -~w~Véngate de los ~r~Forelli~w~. - -[SLH1_F4:SALH1] -~w~Atrae a más Forelli destrozando otro ~r~coche~w~. - -[SLH1_F5:SALH1] -~w~No dejes a los ~b~Hoods~w~ detrás. - -[SLH1_B0:SALH1] -~w~Vale, blanco. Quememos la ciudad. - -[SLH1_B1:SALH1] -~w~¡Eh! ¡Vuelve aquí, tarado! - -[SLH1_B2:SALH1] -~w~¡Venga, estás colgado! ¡Mi culo no cabe en eso! - -[SLH1_B3:SALH1] -~w~¡Ya era hora! No llegarías a ninguna parte sin mí. - -[SLH1_B4:SALH1] -~w~¡Joder! ¡Ha sido difícil, tío! - -[SLH1_B6:SALH1] -~w~... No pretendía ofender, Toni. - -[SLH1_B7:SALH1] -~w~¡Es hora de que los Hoods se levanten y hagan lo correcto! - -[SLH1_B8:SALH1] -~w~¡Venga! ¡Vamos a freírlos! - -[SLH1_C0:SALH1] -~w~¡Hermano! - -[SLH1_C1:SALH1] -~w~¿Estás 'apollardao'? ¿Adónde vas? - -[SLH1_C2:SALH1] -~w~¿Y dónde cojones se supone que debo sentarme? - -[SLH1_C3:SALH1] -~w~¡Ya era hora! No llegarías a ninguna parte sin mí. - -[SLH1_C4:SALH1] -~w~¡Mierrrda! ¡He visto más panolis allí! - -[SLH1_D0:SALH1] -~w~¡Eh! ¡Que es mi coche! - -[SLH1_D1:SALH1] -~w~¡Así está más ventilado! - -[SLH1_E0:SALH1] -~w~¿Qué diantres pasa? - -[SLH1_E1:SALH1] -~w~¡Os vamos a sacar a patadas de aquí! ¡Eso es lo que pasa! - -[SLH1_X0:SALH1] -Got threat - -[SLH1_X1:SALH1] -Had threat - -[SLH1_X2:SALH1] -Find threat - -[SLH1_F0:SALH1] -~w~Recoge a los ~b~Hoods~w~ y llama la atención de los ~r~Forelli~w~. - -[RUFJ_01:SALH1] -Su abogado, Sr. Leone. - -[RUFJ_02:SALH1] -Ya sé que es mi abogado, amigo... - -[RUFJ_03:SALH1] -Vamos, déjame un rato. - -[RUFJ_04:SALH1] -Venga, chico, vete corriendo a saludar a tu madre de mi parte. ¿Capisci? - -[RUFJ_05:SALH1] -Muy bien... Tiene cinco minutos. - -[RUFJ_06:SALH1] -Escucha... eh... Lionel, tienes buen aspecto. - -[RUFJ_07:SALH1] -¡Mírame a mí! - -[RUFJ_08:SALH1] -Un buen miembro de la comunidad, y de repente me enchironan. - -[RUFJ_09:SALH1] -¡Esto sí que pone a prueba mi talante filantrópico! - -[RUFJ_10:SALH1] -Por supuesto, Sr. Leone. - -[RUFJ_11:SALH1] -Estamos haciendo todo lo posible por sacarle de aquí y... uh... - -[RUFJ_12:SALH1] -procurar que vuelva a ayudar a la comunidad cuanto antes. - -[RUFJ_13:SALH1] -Por supuesto. - -[RUFJ_14:SALH1] -Espero que empapelemos a alguien por este atropello. - -[RUFJ_15:SALH1] -Esos hijoputas de los Sindacco, o esos maricones, los Forelli... ¿Quién ha sido? - -[RUFJ_16:SALH1] -¿Quién me ha delatado? - -[RUFJ_18:SALH1] -A por los dos a saco. - -[RUFJ_19:SALH1] -Tal como lo veo, ambos merecen una buena paliza por esto. - -[RUFJ_22:SALH1] -Gracias. Toni, de verdad que significas mucho para mí, ya lo sabes. - -[RUFJ_23:SALH1] -Escucha, igual necesitas algún refuerzo. - -[RUFJ_24:SALH1] -Usa a los Hoods. ¿Vale? - -[RUFJ_25:SALH1] -Sus deseos son órdenes, Sr. Leone. - -[RUFJ_26:SALH1] -Muy bien... Marchando de aquí... Lionel. - -[RUFJ_20:SALH1] -- Hijos de perra. ~n~ - Será un placer. - -{=================================== MISSION TABLE SALH2 ===================================} - -[SALH2AA:SALH2] -~w~¡Eh, Sal! Soy yo... Toni. - -[SALH2AB:SALH2] -~w~¡Toni! Me alegro de oír tu voz, chico. - -[SALH2AC:SALH2] -~w~Estos mendas no me dejan ver a nadie. - -[SALH2AD:SALH2] -~w~Escucha, hay un montón de asuntos que resolver. - -[SALH2AE:SALH2] -~w~Encárgate de Paulie Sindacco. Su familia está acabada en esta ciudad. - -[SALH2AF:SALH2] -~w~Pero cree que puede irse de rositas, como si no tuviera deudas. - -[SALH2AG:SALH2] -~w~¡Estoy en chirona por culpa de ese bastardo! - -[SALH2AH:SALH2] -~w~Haz que ese hijo de perra me la pague. - -[SALH2O1:SALH2] -~w~Intercepta a Paulie Sindacco en la ~y~central de la presa de Cochrane~w~. - -[SALH2F1:SALH2] -~r~¡Se ha escapado! ¡Salvatore no se va a alegrar! - -[SALH2CA:SALH2] -~w~¡Idiotas! ¡Es Toni Cipriani! ¡A por él! - -[SALH2BA:SALH2] -~w~¡Eh, Toni! ¿Por qué no vienes nadando y me besas el culo? - -[SALH2BB:SALH2] -~w~¡Eh, a ver si me coges, capullo! - -[SALH2BI:SALH2] -~w~Dale recuerdos a Salvatore. ¡Le enviaré una postal! - -[SALH2BC:SALH2] -~w~¿Qué vas a hacer ahora, pringado? - -[SALH2BE:SALH2] -~w~¡Eres hombre muerto! - -[SALH2BF:SALH2] -~w~¡Eres un mierda! - -[SALH2BG:SALH2] -~w~¡Sorpresa, saco de mierda! - -[SALH2BH:SALH2] -~w~'Americanos, Paulie Sindacco ha muerto...' - -[SALH2BD:SALH2] -~w~¡No vas a pillarme ni en broma, caraculo! - -[SALH2O2:SALH2] -~w~Mata a ~r~Paulie Sindacco~w~. ¡No dejes que se escape! - -[SALH2O3:SALH2] -Consigue un vehículo y embosca a ~r~Paulie~w~ desde la orilla. - -{=================================== MISSION TABLE SALH3 ===================================} - -[SALH3_1:SALH3] -~w~¿Sal? ¿Cómo estamos? - -[SALH3_2:SALH3] -~w~¡'Bene' por los cojones! ¡De narices! - -[SALH3_3:SALH3] -~w~Uno: el nuevo alcalde se empeña en que no me den la condicional. - -[SALH3_4:SALH3] -~w~Dos: no avanzamos ni un palmo en la lucha contra la Tríada y los Diablos. - -[SALH3_5:SALH3] -~w~Tres: me han dicho que la puta Yakuza mueve ficha para quedarse con la ciudad. - -[SALH3_6:SALH3] -~w~Aparte de eso, todo va de perlas. - -[SALH3_7:SALH3] -~w~Tras años de control, los mafiosos nos vamos por el desagüe como un vulgar truño. - -[SALH38:SALH3] -~w~Yo me encargaré de todo, jefe. - -[SALH39:SALH3] -~w~Los yakuza han recibido un cargamento de armas en Aspatria. - -[SALH310:SALH3] -~w~¡Ya nada puede pararlos! - -[SALH311:SALH3] -~w~Eso ya lo veremos. - -[SALH3_A:SALH3] -~w~Registra el ~y~recinto de los yakuza~w~. - -[SALH3C1:SALH3] -~w~Busca una manera de entrar en el ~y~recinto~w~. - -[SALH3C2:SALH3] -~w~¡Hostia puta! ¡La Virgen en tecnicolor! - -[SALH3C3:SALH3] -~w~¡Destruye el ~r~tanque~w~! - -[SALH3C4:SALH3] -~w~¿Qué diablos...? - -[SALH3C5:SALH3] -~w~¡Matadlo! - -[SALH3C6:SALH3] -~w~El ~r~tanque ~w~lleva armadura pesada. ¡Armas normales no neutralizarán este monstruo! - -[SALH3G1:SALH3] -~w~Eh 'colega', aquí no se te ha perdido nada. - -[SALH3G2:SALH3] -~w~Parece que esta zona es solo para los yakuza. - -[SALH3G3:SALH3] -~w~¡Cómprate un desierto y piérdete! - -[SALH3_B:SALH3] -~w~¡El coche de los yakuza les ha engañado! - -[SALH3_C:SALH3] -~w~Entra en el ~y~recinto~w~ con el coche y echa un vistazo. - -{=================================== MISSION TABLE SALH4 ===================================} - -[SALH4_1:SALH4] -~w~¿Sal? ¿Estás ahí? - -[SALH4_2:SALH4] -~w~¡Anthony! ¡Ahora salgo! - -[SALH42A:SALH4] -~w~¡Hoy comparezco ante el juez! - -[SALH4_3:SALH4] -~w~¡Estupendo! - -[SALH44C:SALH4] -~w~Sí, Toni. Lo que tú digas... - -[SALH44E:SALH4] -~w~Eh, ya vienen los guardias... Nos vemos en la puerta de delante. - -[SALH4_5:SALH4] -~w~¡Consigue un coche de policía! - -[SALH45A:SALH4] -~w~¡Necesitas un coche de policía o espantarás al convoy! - -[SALH4_6:SALH4] -~w~Ocupa tu puesto en la ~y~comisaría~w~. - -[SALH4_7:SALH4] -~w~¡Hostia puta! - -[SALH4_8:SALH4] -~w~Protege el ~b~furgón celular~w~ y asegúrate de que llegue entero. - -[SALH4_9:SALH4] -~w~No te alejes demasiado del ~b~furgón celular~w~. - -[SALH410:SALH4] -~w~Vas a perder el ~b~furgón celular~w~. - -[SALH411:SALH4] -~r~¡Has perdido el furgón celular! ¡Han asesinado a Sal! - -[SALH412:SALH4] -~r~¡Han destruido el furgón celular! - -[SALH413:SALH4] -~w~No cabrees a la poli o Salvatore no conseguirá la condicional. - -[SALH416:SALH4] -~w~Escolta el ~b~convoy~w~ hasta su destino. - -[SALH417:SALH4] -~r~¡La has cagado! ¡La poli ha anulado la vista! - -[SALH420:SALH4] -~r~¡Sal ha muerto! - -[SALH421:SALH4] -~r~¡Has perdido el furgón celular! - -[SALH422:SALH4] -~w~Líbrate de la presión policial o atraerás la atención sobre el convoy. - -[SALH424:SALH4] -~w~Destruye la ~y~barricada~w~. - -[SALH415:SALH4] -~w~Es una delicia volver a ser libre. - -[SALH418:SALH4] -~w~Escucha. Voy a casa a cambiarme estos trapos inmundos, ¿vale? - -[SALH419:SALH4] -~w~Nos vemos allí. - -[SALH414:SALH4] -~w~Se informa de barricada ilegal en el área... - -[SALH44A:SALH4] -~w~Conmigo aquí dentro, ¿quién va a pararles los pies? - -[SALH4_4:SALH4] -~w~Sí, pero me da en la nariz que los sicilianos no quieren que llegue al juzgado. - -[SALH44B:SALH4] -~w~Eh, antes tendrían que acabar conmigo, Sal. - -[SALH44D:SALH4] -~w~¡Tú asegúrate de que yo llegue al juzgado! - -{=================================== MISSION TABLE SALH5 ===================================} - -[SALH51A:SALH5] -~w~Pisa a fondo, Toni. - -[SALH51B:SALH5] -~w~Mucho me da que los sicilianos van a por el alcalde. - -[SALH51C:SALH5] -~w~Tenemos que llegar a él antes que ellos. - -[SALH511:SALH5] -~w~Esto pinta mal... - -[SALH554:SALH5] -~w~¡A todo gas, Toni! - -[SALH512:SALH5] -~w~Te has dejado atrás a ~b~Sal~w~. Vuelve y recógelo. - -[SALH513:SALH5] -~w~¡Maldita sea! ¡Ya están aquí! - -[SALH560:SALH5] -~w~¡Fríelos, Toni! - -[SALH561:SALH5] -~w~¡Voy a por el alcalde! - -[SALH514:SALH5] -~w~¡Esos cabronazos ya lo han cogido! - -[SALH555:SALH5] -~w~¡Vamos, Toni! ¡Por aquí! - -[SALH515:SALH5] -~w~¡Allí están! - -[SALH517:SALH5] -~w~¿De dónde han salido esos bastardos? - -[SALH556:SALH5] -~w~¡Detrás, Toni! - -[SALH562:SALH5] -~w~¡Toni, ahí delante! - -[SALH519:SALH5] -~w~¡Toni! ¡Derriba el helicóptero! - -[SALH522:SALH5] -~w~Creen que pueden esconderse en el faro. - -[SALH557:SALH5] -~w~¡A por esos bastardos! - -[SALH558:SALH5] -~w~¡Bonito disparo, Toni! - -[SALH559:SALH5] -~w~Ahora acabemos con esto. - -[SALH526:SALH5] -~w~¡Yo conduzco! ¡Tú cúbrenos! - -[SALH527:SALH5] -~w~Vale, Toni... Es aquí. - -[SALH528:SALH5] -~w~Pero ¿cuántos bastardos hay en esta roca? - -[SALH553:SALH5] -~w~¡Tumbas a un bastardo y aparece otro a darte por culo! - -[SALH523:SALH5] -~r~Has abandonado a Salvatore a su suerte con los sicilianos. - -[SALH524:SALH5] -~r~¡Salvatore ha muerto! - -[SALH552:SALH5] -~r~¡El alcalde ha muerto! - -[SALH573:SALH5] -~r~¡Has destrozado la embarcación! ¡Los has perdido! - -[SALH516:SALH5] -~w~Take out the guards and then let's get after them in that boat! - -[SALH518:SALH5] -~w~Another ~r~boat~w~ incoming... - -[SALH525:SALH5] -~w~Ha! They've left a rocket launcher on this thing! - -[SALH520:SALH5] -~y~I'll move closer to shore so we're more protected... Take it down! - -[SALH521:SALH5] -~w~Good work! Let's move out! - -[SALH53A:SALH5] -~w~Torini... Tenía que ser él. - -[SALH53B:SALH5] -~w~¡Suéltale! - -[SALH53C:SALH5] -~w~¡El alcalde es mío! - -[SALH53D:SALH5] -~w~¡ESTA CIUDAD es mía! - -[SALH53E:SALH5] -~w~Salvatore... - -[SALH53F:SALH5] -~w~Sicilia nunca quiso questo schifo di città. - -[SALH53G:SALH5] -~w~Pero, cuando el tributo se acabó, ¿qué más podíamos hacer...? - -[SALH53H:SALH5] -~w~No ha sido nada personal. - -[SALH53I:SALH5] -~w~¿Nada personal? - -[SALH53J:SALH5] -~w~¡Después de lo que me has hecho! - -[SALH53K:SALH5] -~w~¡Te voy a sacar los higadillos! - -[SALH5TD:SALH5] -~w~¡Derriba el ~r~helicóptero de Massimo~w~! - -[SALH5MO:SALH5] -¡~r~Massimo~w~ se está largando! - -[SALH5GO:SALH5] -~r~¡Massimo se ha escapado! - -[SALH571:SALH5] -~w~Dirígete al ~y~muelle~w~. - -[SALH570:SALH5] -~w~¡Elimina a esos ~r~mafiosos sicilianos~w~! - -[SALH572:SALH5] -~w~¡Ocúpate de ese ~r~listillo siciliano~w~! - -[SALH510:SALH5] -~w~Ve al ~y~ayuntamiento~w~. ¡Ten cuidado con esos listillos sicilianos! - -[SICI_01:SALH5] -No, luego hablamos... - -[SICI_04:SALH5] -Ambos hemos vuelto. ¡Tú y yo! - -[SICI_05:SALH5] -Lo hemos conseguido, ¿eh? - -[SICI_06:SALH5] -Y que lo diga. - -[SICI_07:SALH5] -Hemos borrado del mapa a los Forelli. - -[SICI_08:SALH5] -Hemos enviado a los Sindacco con los peces. - -[SICI_09:SALH5] -Y ahora tengo a los sicilianos al teléfono, que quieren la paz. - -[SICI_10:SALH5] -¡Todos la queremos! Pero la mía, no la de esos cabrones. - -[SICI_11:SALH5] -Ahora soy el puto amo. - -[SICI_12:SALH5] -Ningún menda de la vieja patria me va a decir lo que debo hacer. - -[SICI_13:SALH5] -Les he dicho que se vayan a tomar por culo. - -[SICI_14:SALH5] -¿Sí? ¿Es eso prudente? - -[SICI_15:SALH5] -Eh, ahora el jefe soy yo. ¡YO! - -[SICI_16:SALH5] -Vamos a ver al alcalde para que me retire los cargos... - -[FIN1_01:SALH5] -¡Eh! ¡Sr. alcalde! - -[FIN1_03:SALH5] -Sí, gracias. - -[FIN1_04:SALH5] -Y eso significa que... - -[FIN1_05:SALH5] -Eeh... ¿que la ciudad se lo agradece? - -[FIN1_06:SALH5] -Inténtelo de nuevo. - -[FIN1_07:SALH5] -Que usted trabaja para mí, ¿estamos? - -[FIN1_08:SALH5] -Ah, sí. Que yo trabajo para usted. - -[FIN1_09:SALH5] -Bien. No nos llame. Ya lo haremos nosotros. - -[FIN1_10:SALH5] -Largo de aquí, capullo. - -[FIN1_11:SALH5] -Gracias, Sr. Leone. - -[FIN1_12:SALH5] -Toni. Lo hemos conseguido. Ahora mandamos tú y yo. - -[FIN1_13:SALH5] -Somos un equipo, ¿no? - -[FIN1_14:SALH5] -Y ahora necesito que me hagas una cosita de nada. - -[FIN1_15:SALH5] -Tengo ciertos problemas que hay que resolver... - -[FIN2_01:SALH5] -Hola, tío. ¿Cómo le va, eh? - -[FIN2_02:SALH5] -Tiene buen aspecto. - -[FIN2_03:SALH5] -Ahhhh Salvatore, lo único que queríamos era claridad. - -[FIN2_04:SALH5] -Sí, tío. Y yo lo aprecio. - -[FIN2_07:SALH5] -Bien, muy bien. - -[FIN2_08:SALH5] -Víbora de mierda. - -[FIN2_09:SALH5] -No confiaría en él ni harto de vino. - -[FIN2_23:SALH5] -A todo cerdo le llega su San Martín... - -[FIN2_10:SALH5] -Sí, al menos lo hemos conseguido. - -[FIN2_11:SALH5] -Sí. Hemos hecho limpieza. Lo has hecho bien, Toni. Bien de verdad. - -[FIN2_12:SALH5] -Siempre supe que eras un gran tío. Me has salvado unas cuantas veces. - -[FIN2_13:SALH5] -Y aprecio una lealtad así. - -[FIN2_14:SALH5] -Gracias. - -[FIN2_15:SALH5] -Un buen trabajador. Me gusta tu respeto. - -[FIN2_19:SALH5] -¿Puedes ponerle precio a la amistad? - -[FIN2_20:SALH5] -¿La clase de amistad que tenemos tú y yo? - -[FIN2_21:SALH5] -¡Qué vergüenza! Ven aquí. - -[FIN2_22:SALH5] -Eres buen chico, debería darte vergüenza. - -[SICI_02:SALH5] -- ¡Eh, Toni! ~n~ - ¡Sal! Ha vuelto a donde pertenece. - -[FIN2_05:SALH5] -- Entonces, ¿estamos ya en paz? ¿La vieja patria y tú? ~n~ - Por supuesto. Toda mi gente y yo. - -[FIN2_16:SALH5] -- Así que aquí tienes el medio millón que te prometí. ~n~ - ¿Medio? ¡Eh! ¿No había dicho que dos? - -[FIN2_18:SALH5] -¡Dije un millón de dólares! ¿Y qué? - -[FIN1_02:SALH5] -Le acabamos de salvar de ese hatajo de sicilianos chalados. - -{=================================== MISSION TABLE DONH1 ===================================} - -[DONH1JA:DONH1] -~w~Toni, mi ex mentor, Avery Carrington, viene hoy aquí en avión... - -[DONH1JB:DONH1] -~w~Me han comunicado que trabaja para la Panlantic Corporation. - -[DONH1JC:DONH1] -~w~Harán lo que sea por conseguir inmuebles de primera. - -[DONH1JD:DONH1] -~w~Tenemos que conseguir sus planes de compra de terrenos. - -[DONH1JE:DONH1] -~w~¡Vamos, Toni! ¡A por él! - -[DONH1CA:DONH1] -~w~Eh, Toni, nos iría bien un medio de transporte. - -[DONH1DA:DONH1] -~w~Dirígete al aeropuerto, Toni. - -[DONH1DB:DONH1] -~w~No tenemos tiempo que perder. - -[DONH1EA:DONH1] -~w~Oh, sí. Éste es uno de mis mejores planes, no cabe duda... - -[DONH1EB:DONH1] -~w~Nunca había caído en la cuenta... - -[DONH1EC:DONH1] -~w~Me voy a forrar con esto... - -[DONH1ED:DONH1] -~w~Sí, señor, me voy a forrar... - -[DONH1EE:DONH1] -~w~Hasta Avery estaría orgulloso. - -[DONH1GA:DONH1] -~w~¡Ahí está! - -[DONH1GB:DONH1] -~w~¡Mátalo, Toni! - -[DONH1GC:DONH1] -~w~¡Necesito esos planes! - -[DONH1HA:DONH1] -~w~Por favor, Toni... ¡se escapa! - -[DONH1IA:DONH1] -~w~¡Oh, mayúsculo, Toni...! ¡De verdad! - -[DONH1IB:DONH1] -~w~Ahora volvamos a la seguridad de mi... ejem... 'residencia'. - -[DONH1O0:DONH1] -~w~Lleva a Donald Love al ~y~aeropuerto~w~. - -[DONH1O1:DONH1] -~w~Mata a ~r~Avery Carrington~w~ y cógele los planes. - -[DONH1O2:DONH1] -¡~r~Avery~w~ se larga! ¡Párale los pies! - -[DONH1O3:DONH1] -~r~Avery~w~ ya tiene otro vehículo. ¡No dejes que escape! - -[DONH1O4:DONH1] -¡~r~Avery~w~ se está largando! ¡Cógelo! - -[DONH1O5:DONH1] -~w~Recoge a ~b~Donald Love~w~. - -[DONH1O6:DONH1] -~w~¡Bien hecho! Coge los ~g~planes~w~. - -[DONH1O7:DONH1] -~w~Lleva a Donald y los planes de vuelta al ~y~centro de acogida~w~. - -[DONH1O8:DONH1] -~w~¡Se te han caído los ~g~planes~w~! Vuelve y recógelos. - -[DONH1OA:DONH1] -~w~¡Van a por ti y ~r~Avery~w~ se está escapando! ¡Mátalo! - -[DONH1OB:DONH1] -~w~Necesitas un vehículo. - -[DONH1OC:DONH1] -~w~¡No pierdas a ~b~Donald~w~! - -[DONH1OD:DONH1] -~w~¡Ten cuidado! Los planes se perderán si el ~r~coche de Avery~w~ se destruye con él dentro. - -[DONH1OE:DONH1] -~r~Avery Carrington~w~ se escapa. ¡Ve tras él! - -[DONH1F0:DONH1] -~r~¡Los planes se han destruido! - -[DONH1F1:DONH1] -~r~¡Avery Carrington se ha escapado! - -[DONH1F2:DONH1] -~r~¡Donald ha muerto! - -[DONH1OF:DONH1] -~r~Avery Carrington~w~ casi ha llegado a su destino. ¡Detenlo! - -[DONH1O9:DONH1] -~w~¡No dejes a ~b~Donald~w~ atrás! ¡Esos colombianos lo matarán! - -[DONH1FA:DONH1] -~w~Mmm, Panlantic debe de haber contratado al Cártel para proteger a Avery. - -[LAND_01:DONH1] -Sé lo que estarás pensando, Toni. Cómo caen los poderosos... - -[LAND_02:DONH1] -Pero solo es un bache temporal, amigo. - -[LAND_03:DONH1] -Vale. - -[LAND_04:DONH1] -Ay, no seas tan susceptible. - -[LAND_05:DONH1] -Sé que dije cosas horribles, que era culpa tuya y todo eso, - -[LAND_06:DONH1] -pero el orgullo es mal compañero de cama, casi tanto como las termitas. - -[LAND_07:DONH1] -Créeme, he tenido de ambos recientemente. - -[LAND_08:DONH1] -Espera, tú y yo... ¡volvemos a encontrarnos! - -[LAND_09:DONH1] -Yo nunca me he ido... - -[LAND_10:DONH1] -Estamos juntos en esto, 'amigo'. - -[LAND_11:DONH1] -No, te equivocas. - -[LAND_12:DONH1] -¡Por favor! - -[LAND_13:DONH1] -Por favor... ¿favor? Olvídalo, colega. - -[LAND_18:DONH1] -Vamos, te lo explico de camino. - -[LAND_19:DONH1] -Espero que hayas traído coche. El mío está en... la tienda... ¡Sí! - -[LAND_16:DONH1] -- ¿Un 10% de qué? ¿De esto? ¡Oh, qué amable! ~n~ - De esto no... De algo gordo de verdad. - -[LAND_14:DONH1] -- 'Es todo por tu culpa.' Patético. ~n~ - ¿Un 10%? - -{=================================== MISSION TABLE DONH2 ===================================} - -[DONH2_1:DONH2] -~w~Ve a la ~y~iglesia~w~ de Staunton Island. - -[DONH2_2:DONH2] -~w~Sacúdele al ~r~reportero~w~ o apúntale con un arma para que te dé las fotos. - -[DONH2_3:DONH2] -~w~Tienes algunas fotos mías. ¿Dónde están? - -[DONH2_4:DONH2] -~w~¡No me hagas nada! - -[DONH2_5:DONH2] -~w~¿Dónde están las malditas fotos? - -[DONH2_6:DONH2] -~w~¡No sé de qué me hablas! - -[DONH2_7:DONH2] -~w~¿Dónde están? - -[DONH2_8:DONH2] -~w~¡No, por favor! - -[DONH2_9:DONH2] -~w~¡Vamos, mariquita! ¡Dámelas! - -[DONH210:DONH2] -~w~¡Vale! ¡Vale! - -[DONH2EX:DONH2] -~w~¡Te daré las fotos! - -[DONH211:DONH2] -~w~¡Escondí el carrete en mi garaje! - -[DONH212:DONH2] -~w~Ve al ~y~garaje del reportero~w~. - -[DONH213:DONH2] -~w~¡Socorro! ¡Auxilio! ¡Que me secuestran! - -[DONH214:DONH2] -~w~¡Ayuda! ¡Me va a matar! - -[DONH215:DONH2] -~w~¡Soy demasiado bueno para morir! - -[DONH216:DONH2] -~w~No puedo morir, ¡aún estoy acabando mi libro! - -[DONH217:DONH2] -~w~¡Mi editor nunca me habló de estas cosas! - -[DONH218:DONH2] -~w~¡No muevas ni un músculo, soplapollas! - -[DONH219:DONH2] -~w~¡Quieto parado, gilipollas! - -[DONH220:DONH2] -~w~¡Por el amor de Dios! ¿Vas a dejar de correr o qué? - -[DONH221:DONH2] -~w~¡Toni! ¡Por fin! - -[DONH222:DONH2] -~w~¡Un reportero vio cómo matábamos a Avery! - -[DONH223:DONH2] -~w~¡Y tiene fotos! ¡Oh, Dios! ¡Estoy acabado! - -[DONH224:DONH2] -~w~Cálmate, ¿quieres? ¿Dónde está ese reportero? - -[DONH225:DONH2] -~w~¡Oh, Toni, eres maravilloso! - -[DONH226:DONH2] -~w~Al parecer ha estado trabajando de tapadillo en la iglesia de Staunton Island. - -[DONH227:DONH2] -~w~¡Consigue las fotos y liquídalo! - -[DONH228:DONH2] -~r~¡Ned ha escapado! - -[DONH230:DONH2] -~w~Mata a ~r~Ned Burner~w~. - -[DONH231:DONH2] -~r~¡Ned ha muerto antes de que consiguieras las fotos! - -[DONH229:DONH2] -CACA DE LA VACA - -[DONCUTA:DONH2] -~w~Aquí están... ¡Cógelas! Aún no las he revelado. - -[DONCUTB:DONH2] -~w~¡Cabronazo! - -[DONH2SM:DONH2] -Sustómetro - -[DONH233:DONH2] -Sigue intimidando al reportero. Si el Sustómetro baja demasiado, intentará escapar. - -[DONH2LB:DONH2] -~w~Has dejado atrás al ~b~periodista~w~. Vuelve a por él. - -[DONH2LC:DONH2] -~r~Has abandonado al periodista. - -{=================================== MISSION TABLE DONH3 ===================================} - -[DONH3I1:DONH3] -~w~¡He vuelto! - -[DONH3I2:DONH3] -~w~¡He vuelto de la muerte, Toni! Como el fénix de sus cenizas. - -[DONH3I3:DONH3] -~w~Como Lázaro... sí... ¡Lázaro Love! - -[DONH3I4:DONH3] -~w~¡Ah, volveré a ser rico! - -[DONH3I5:DONH3] -~w~Panlantic me va a pagar una fortuna por cerrar este trato. - -[DONH3I6:DONH3] -~w~¡Lo hemos conseguido, Toni! - -[DONH3I7:DONH3] -~w~Lo que tú digas. - -[DONH3I8:DONH3] -~w~Es hora de dar un sarao con una lista de invitados muy selecta. - -[DONH3I9:DONH3] -~w~¡Vamos! - -[DONH3C1:DONH3] -~w~Necesitaremos un medio de transporte, Toni. No tenemos mucho tiempo. - -[DONH3L1:DONH3] -~w~Necesitas a ~b~Donald~w~. ¡Vuelve y recógelo! - -[DONH3L2:DONH3] -~w~¡Venga, Toni! ¡Vamos apurados! - -[DONH3L3:DONH3] -~w~¡Vuelve a dejar el cadáver! - -[DONH3_5:DONH3] -~w~Toni, me moría por esta fiesta. - -[DONH35D:DONH3] -~w~Igual que mis invitados. - -[DONH35A:DONH3] -~w~Encuentra un ~b~cadáver~w~. - -[DONH35B:DONH3] -~w~Consigue el ~b~cadáver de Avery~w~. - -[DONH35C:DONH3] -~w~Consigue el ~b~cadáver de Ned~w~. - -[DONH3_6:DONH3] -~w~Lleva a Donald y a Avery al ~y~aeropuerto~w~. - -[DONH36A:DONH3] -~w~¡Eh! ¡Devuelve esa ambulancia! - -[DONH36B:DONH3] -~w~Avery. - -[DONH36C:DONH3] -~w~¡Avery! Cómo has envejecido desde la última vez que nos vimos. - -[DONH36D:DONH3] -~w~Tú me alimentabas con esas perlas de sabiduría... - -[DONH36E:DONH3] -~w~... que pronto volveré a saborear. - -[DONH36F:DONH3] -~w~¡Dios! ¡Si lleva peluquín! - -[DONH36G:DONH3] -~w~Toni. Llévanos a Avery y a mí a su jet privado, en el aeropuerto. - -[DONH3_7:DONH3] -~w~Lleva a Donald y a Ned al ~y~aeropuerto~w~. - -[DONH37F:DONH3] -~w~Toni. Llévanos al bueno de Ned y a mí al aeropuerto. - -[DONH37A:DONH3] -~w~¡Eh! ¡Ese tío está mangando el fiambre! - -[DONH37B:DONH3] -~w~Ah, Ned Burner, reportero intrépido. - -[DONH37C:DONH3] -~w~Ah, Ned. Te voy a dar la exclusiva... - -[DONH37D:DONH3] -~w~para que cubras mi maravillosa fiesta. - -[DONH37E:DONH3] -~w~No invitaría a cualquiera a mi pequeño guateque. - -[DONH37G:DONH3] -~w~Las invitaciones son... para morirse. - -[DONH3_8:DONH3] -~w~Lleva el cadáver de Avery al ~y~aeropuerto~w~. - -[DONH3_9:DONH3] -~w~Lleva el cadáver de Ned al ~y~aeropuerto~w~. - -[DONH3A1:DONH3] -~w~Deja aquí los restos putrefactos del viejo Avery antes de que seguridad nos descubra. - -[DONH3A2:DONH3] -~w~Le van a hacer la autopsia en cualquier momento. - -[DONH3N1:DONH3] -~w~Deja el cadáver de Ned Burner aquí antes de que seguridad nos descubra. Lo van a enterrar enseguida. - -[DONH3F1:DONH3] -~r~Love ha muerto. - -[DONH3F2:DONH3] -~r~¡Has perdido el cadáver de Avery! - -[DONH3F3:DONH3] -~r~¡Has perdido el cadáver de Ned! - -[DONH3C2:DONH3] -~w~Los vigilantes del aeropuerto cerrarán el hangar de Avery Carrington a las 22:00. - -[DONH3F4:DONH3] -~r~Demasiado tarde. Los vigilantes del aeropuerto han cerrado el hangar. - -[DONH3F5:DONH3] -~r~Demasiado tarde. Los vigilantes del aeropuerto han encontrado a Donald con el cadáver de Avery. - -[DONH3W1:DONH3] -~w~¡Deprisa! Los vigilantes del aeropuerto cerrarán el hangar de Avery Carrington a las 22:00. - -[DONH3F6:DONH3] -~r~Demasiado tarde. ¡Los vigilantes del aeropuerto han encontrado a Donald con el cadáver de Ned! - -{=================================== MISSION TABLE DONH4 ===================================} - -[DONH4A:DONH4] -~w~Donald me envía a recoger... los 'petardos'. - -[DONH4B:DONH4] -~w~Muy bien. - -[DON4EX1:DONH4] -~w~Tengo lo que necesitáis. Pero vale su pasta. - -[DON4EX2:DONH4] -~w~Don ha dicho que me pagues tú, que él ya te lo apoquinaría luego. - -[DONH4C:DONH4] -~w~Típico de él. - -[DONH4D:DONH4] -~w~¡Sí, claro! ¿Por qué no a nombre de 'bésame el culo'? - -[DONH4E:DONH4] -~w~Bueno, ¿dónde están los petardos? - -[DONH4F:DONH4] -~w~¡Mierda, tío! Preparar unos petardos así lleva su tiempo. - -[DON4EX4:DONH4] -~w~Estaremos en contacto. - -[DONH4G:DONH4] -¡Misión superada! - -[DONH4_1:DONH4] -NONE - -[DONH4PS:DONH4] -8-Ball te avisará cuando los petardos estén listos. - -{=================================== MISSION TABLE DONH5 ===================================} - -[DONH5_0:DONH5] -Camioneta - -[DNH5_A0:DONH5] -~w~Mira, esta camioneta va cargadita. ¿Me explico? Conduce con cuidado. - -[DNH5_A1:DONH5] -~w~¿Sí? Todo en orden. - -[DNH5_A2:DONH5] -~w~Claro. Ahora se pone. - -[DNH5_A3:DONH5] -~w~Toni, estamos a un trabajito de ser fabulosamente ricos. - -[DNH5_A4:DONH5] -~w~Hemos repasado los planos de Fort Staunton. Sus puntos débiles están a lo largo del antiguo metro que va por debajo del área. - -[DNH5_A5:DONH5] -~w~¡Genial, Don! Solo tengo que burlar a un centenar de italianos pirados. - -[DNH5_A6:DONH5] -~w~Tú entra por el túnel de Porter y encontrarás el camino sin problemas. - -[DNH5_B0:DONH5] -~w~¡Eh! ¡Se supone que no puedes estar aquí! - -[DNH5_B1:DONH5] -~w~¡Sal de aquí a toda pastilla! - -[DNH5_C0:DONH5] -~w~Sube a la ~b~camioneta~w~. - -[DNH5_C4:DONH5] -~w~Pon los ~y~explosivos~w~. - -[DNH5_C5:DONH5] -~w~Pon los ~y~explosivos~w~ restantes. - -[DNH5_C6:DONH5] -~w~Escapa por la ~y~entrada del metro~w~. - -[DNH5_D0:DONH5] -~w~¿Qué hacen aquí los Forelli? - -[DNH5_D1:DONH5] -~w~No dejes que los Forelli destrocen la camioneta. - -[DNH5_1:DONH5] -~w~Usa un vehículo para reventar las puertas. - -[DONH5_2:DONH5] -~w~¡Golpea las puertas con más fuerza! - -[DNH5_X0:DONH5] -~r~¡Has destrozado la camioneta! - -[DNH5_C1:DONH5] -~w~Vuelve a la ~b~furgoneta~w~. - -[DNH5_C2:DONH5] -~w~Dirígete a una de las ~y~entradas~w~ del túnel de Porter Road. - -[DNH5_C3:DONH5] -~w~Sigue el ~y~túnel~w~. - -[DNH5_E0:DONH5] -~w~Mata a esos ~r~obreros~w~. - -[DNH5_E1:DONH5] -~w~Mata a ese ~r~obrero~w~. - -[DNH5_E2:DONH5] -~w~Los Forelli han bloqueado el camino de vuelta. Busca otra ~y~salida~w~. - -[DNH5_E3:DONH5] -~w~Usa un vehículo para reventar las puertas y alcanzar la ~y~salida~w~. - -[DNH5_X1:DONH5] -~r~¡Los Forelli han destrozado la camioneta! - -[DNH5_W1:DONH5] -~w~¡No te alejes demasiado de la ~b~camioneta~w~! - -[DNH5_E4:DONH5] -~w~No dejes ningún ~r~testigo~w~. - -{=================================== MISSION TABLE DONH6 ===================================} - -[DONH6_V:DONH6] -~r~v1.00 - -[DONH6_1:DONH6] -~w~Dirígete a la ~y~casa~w~. - -[DONH6_5:DONH6] -~w~¡Oh, Dios mío! ¡Toni! ¡Haz algo! - -[DONH6_6:DONH6] -~w~Tienes ~1~ s. para volver a la finca. - -[DONH6_7:DONH6] -Tiempo para volver - -[DONH6_8:DONH6] -~r~No has conseguido volver a la mansión... ¡Han liquidado a Donald! - -[DONH610:DONH6] -~w~¡Consigue un coche! - -[DONH611:DONH6] -~w~¡Santo Dios! ¡Allí vienen más! - -[DONH624:DONH6] -~w~¡Pisa a fondo, Toni! - -[DONH612:DONH6] -~w~¡Lo hemos conseguido! - -[DONH623:DONH6] -~w~Llévame al jet de Avery. Ned y él siguen a bordo, así que no viajaré solo. - -[DONH622:DONH6] -~w~Ve al ~y~jet de Avery~w~. - -[DONH613:DONH6] -~w~Vamos al aeropuerto. - -[DONH625:DONH6] -~w~Dirígete al ~y~aeropuerto~w~. - -[DONH615:DONH6] -~w~Te has dejado atrás a ~b~Donald~w~. Vuelve y recógelo. - -[DONH619:DONH6] -~r~¡Donald ha muerto! - -[DONH6_9:DONH6] -~w~¿D? ¡Adelante! ¡Vamos! - -[DONH614:DONH6] -~w~¿Seguro que no hay peligro, Toni? - -[DONH616:DONH6] -~w~¡Oh... mi... JARDÍN! - -[DOH616A:DONH6] -~w~¡Mira cómo has dejado mi precioso jardín! - -[DONH617:DONH6] -~w~D... O hacemos paisajismo o escapismo. Tú decides. - -[DONH618:DONH6] -~w~¡Llévame al aeropuerto! - -[DONH620:DONH6] -~w~Odio decir adiós, amigo mío. - -[DOH620A:DONH6] -~w~Así que solo diré 'adieu'. - -[DONH621:DONH6] -~w~D... Ha sido muy instructivo. - -[DONH66S:DONH6] -~w~Tienes ~1~ s. para volver a la finca. - -[DONH66A:DONH6] -~w~¡Elimina a esos ~r~gánsteres colombianos~w~! - -[DONP_01:DONH6] -Érase una oruguita... guita... guita... No, así no funciona. - -[DONP_02:DONH6] -Ohmmmmmmmm. Maldita sea. - -[DONP_03:DONH6] -Es que... Ay, mierda, si tuviera algo frío a lo que abrazarme, - -[DONP_06:DONH6] -¡Antonio! Jo, solo busco iluminación espiritual, - -[DONP_07:DONH6] -por si te interesa, pero no hay manera. - -[DONP_08:DONH6] -Quizá mañana. - -[DONP_09:DONH6] -Por el mensaje parecías un poco inquieto. - -[DONP_10:DONH6] -¿Inquieto? Estoy meditando. ¿Inquieto, moi? - -[DONP_11:DONH6] -Soy uno con el universo. Lo que dices es imposible. - -[DONP_12:DONH6] -Oh, mierda, tienes razón. - -[DONP_13:DONH6] -Um, va a venir una horda de colombianos... - -[DONP_14:DONH6] -a matarme si no cierro la bocaza y les pago todo lo que les debo. - -[DONP_15:DONH6] -Ah. Supongo que eso explica todos esos colombianos que rondan por fuera. - -[DONP_16:DONH6] -¡Mierda! Por favor, Antonio, ¡tienes que sacarme de aquí! - -[DONP_17:DONH6] -No quiero... ¡Por favor! ¡No quiero morir! No... - -[DONP_18:DONH6] -Ya ves lo que vale eso de ser uno con el universo... - -[DONP_19:DONH6] -¡Gracias, Toni! Te recompensaré... Te recompensaré por esto, prometido. - -[DONP_04:DONH6] -- sería más fácil... ~n~ - ¿Qué pasa, D? - -{=================================== MISSION TABLE TOSH1 ===================================} - -[TOSH1AB:TOSH1] -~w~¡Detenedlo! - -[TOSH1AC:TOSH1] -~w~¡A por él! - -[TOSH1AD:TOSH1] -~w~¡Matadlo! - -[TOSH1AA:TOSH1] -~w~¡Ahí está! - -[TOSH120:TOSH1] -~w~Roba el ~b~cargamento de armas~w~ de los yakuza de Bedford Point. - -[TOSH121:TOSH1] -~w~Tendrás que eludir a los ~r~guardias de los yakuza~w~. - -[TOSH122:TOSH1] -~w~Estáte atento a más ~r~embarcaciones de los yakuza~w~. - -[TOSH130:TOSH1] -~w~Lleva las armas al ~y~contacto de Toshiko~w~. - -[TOSH131:TOSH1] -~w~Vuelve junto al ~b~cargamento de armas~w~. - -[TOSH1BA:TOSH1] -~w~¡Chico, aquí tienes artillería de la buena! - -[TOSH1BB:TOSH1] -~w~Mira, hago tantos negocios en estos muelles que debería establecerme aquí, - -[TOSH1BC:TOSH1] -~w~¡y no a medio camino de la maldita isla! - -[TOSH1BD:TOSH1] -~w~¡Bueno, ha estado genial! - -[TOSH1DB:TOSH1] -~r~¡Las armas han sido destruidas! - -[TOSH1PH:TOSH1] -~w~Los yakuza estarán protegiendo el cargamento. Puede que necesites pasarte por Phil Cassidy's de camino. - -[DEAD_01:TOSH1] -¿Así que éste es ese famoso gánster tan duro? - -[DEAD_02:TOSH1] -Pues no parece tan duro. - -[DEAD_03:TOSH1] -... Gracias. - -[DEAD_04:TOSH1] -¿Sabe lo que es vivir sin amor, Sr. Cipriani? - -[DEAD_05:TOSH1] -Es vivir llena de odio... - -[DEAD_06:TOSH1] -Pues si usted lo dice... - -[DEAD_07:TOSH1] -Lo que más anhelo es destruir a un hombre, Sr. Cipriani. - -[DEAD_08:TOSH1] -Destruirlo... No basta con matarlo. - -[DEAD_09:TOSH1] -Quiero que él y toda su organización mermen y muerdan el polvo antes de que muera. - -[DEAD_10:TOSH1] -Quiero que sufra. - -[DEAD_11:TOSH1] -Vale. - -[DEAD_12:TOSH1] -El hombre al que quiero que destruya es mi marido, Kazuki Kasen. - -[DEAD_13:TOSH1] -No se preocupe. - -[DEAD_14:TOSH1] -Será recompensado generosamente por sus servicios. - -[DEAD_15:TOSH1] -Bueno, ¿y si digo que no? - -[DEAD_16:TOSH1] -No lo hará... porque yo quiero que muera, pero usted necesita que muera. - -[DEAD_17:TOSH1] -A decir verdad, ya le ha infligido una gran herida, Sr. Cipriani. - -[DEAD_18:TOSH1] -Sin embargo, hoy recibirá otra entrega de municiones. - -[DEAD_19:TOSH1] -Quiero que usted le robe esas armas en sus ignorantes narices. - -{=================================== MISSION TABLE TOSH2 ===================================} - -[TOSH2AA:TOSH2] -~w~Sr. Toni. - -[TOSH2AL:TOSH2] -~w~Mi marido se ha enfadado mucho por sus actos. - -[TOSH2AB:TOSH2] -~w~Ha conseguido que él, y sus hombres, - -[TOSH2AM:TOSH2] -~w~queden como los payasos que son. - -[TOSH2AC:TOSH2] -~w~Estoy para complacerla. ¿Y ahora qué, princesa? - -[TOSH2AE:TOSH2] -~w~Mi marido quiere retirar una gran cantidad de dinero de su casino. - -[TOSH2AF:TOSH2] -~w~Quiero que destruya todo ese dinero. - -[TOSH2AG:TOSH2] -~w~Yo podría darle un uso mucho mejor, encanto. - -[TOSH2AH:TOSH2] -~w~Quiero que ese dinero se queme en la calle, para que todos lo vean. - -[TOSH2AI:TOSH2] -~w~Vale... vale... ¿Cuándo van a hacerlo? - -[TOSH2AJ:TOSH2] -~w~Ya están en ello. - -[TOSH2AK:TOSH2] -~w~Están saliendo del casino justo ahora, así que no tiene mucho tiempo. - -[TOSH2O0:TOSH2] -~w~Destruye TODOS los ~r~furgones~w~. Que no llegue ninguno al ~y~recinto de los yakuza~w~. - -[TOSH2O1:TOSH2] -~w~¡Están huyendo! ¡Que no escape ni un ~r~furgón~w~. - -[TOSH2O2:TOSH2] -~w~¡Los has espantado! ¡No dejes que los ~r~furgones~w~ escapen! - -[TOSH2E1:TOSH2] -~w~El ~r~convoy~w~ se aproxima al ~y~recinto de los yakuza~w~. - -[TOSH2E2:TOSH2] -~w~Un ~r~furgón~w~ ya está casi en el ~y~recinto de los yakuza~w~. - -{=================================== MISSION TABLE TOSH3 ===================================} - -[TOSH3M1:TOSH3] -~w~¿Hay alguien en casa? - -[TOSH3M2:TOSH3] -~w~¿Sr. Toni? Un momento, por favor... - -[TOSH3M3:TOSH3] -~w~Mi esposo está enfadado. - -[TOSH3EA:TOSH3] -~w~Se pregunta cómo llegó usted a enterarse con tanta precisión de dónde y cuándo atacar. - -[TOSH3M4:TOSH3] -~w~A menos que sea necio, lo descubrirá pronto. - -[TOSH3M5:TOSH3] -~w~Deberíamos ayudarle. Sus hombres chismorrean como viejas. - -[TOSH3EB:TOSH3] -~w~Vamos a darles algo de lo que hablar. - -[TOSH3M6:TOSH3] -~w~¿Adónde vamos? - -[TOSH3M7:TOSH3] -~w~A la ópera. - -[TOSH3M8:TOSH3] -~w~¿A la ópera? ¿Yo? ¿Bromea? - -[TOSH3M9:TOSH3] -~w~No sea ridículo, Sr. Toni. A todo el mundo le gusta la ópera. - -[TOSH3A:TOSH3] -~w~Si me trae el coche, podremos ir a recoger su esmoquin. - -[TOSH3EC:TOSH3] -~w~No tenemos mucho tiempo, va a empezar pronto. - -[TOSH3B:TOSH3] -~w~Trae el ~b~coche de Toshiko~w~. - -[TOSH3C:TOSH3] -~w~Recoge a ~b~Toshiko~w~. - -[TOSH3C2:TOSH3] -~w~Hazte con un esmoquin en ~y~Mr. Benz~w~. - -[TOSH3B3:TOSH3] -~w~Lleva a Toshiko de vuelta a su ~y~apartamento~w~. - -[TOSH3B4:TOSH3] -~r~Has dejado atrás a Toshiko. - -[TOSH3B2:TOSH3] -Vuelve al ~b~coche de Toshiko~w~. - -[TOSH3C3:TOSH3] -~w~Ve a la ~y~ópera~w~. - -[TOSH3D:TOSH3] -~w~¿Adónde va? ¡Vamos a llegar tarde! - -[TOSH3D2:TOSH3] -~w~Por favor, no me deje aquí, Toni-san. - -[TOSH3Z1:TOSH3] -~w~¿Cree que soy una mala persona, Sr. Toni? - -[TOSH3Z2:TOSH3] -~w~Princesa, no soy lo que se dice un santo. - -[TOSH3Z3:TOSH3] -~w~No... Un santo no es lo que me hace falta. - -[TOSH3Z4:TOSH3] -~w~Mi marido es un samurái, Sr. Toni. - -[TOSH3Z5:TOSH3] -~w~Es muy fuerte... pero muy, muy malo. - -[TOSH3Z6:TOSH3] -~w~Solo se casó conmigo para ser el waka-gashira de Liberty City. - -[TOSH3Z7:TOSH3] -~w~Nunca me ha amado... Prefiere la compañía de sus hombres. - -[TOSH3Z8:TOSH3] -~w~¿Comprende? - -[TOSH3Z9:TOSH3] -~w~Sepa que, cuando descubra lo que está usted haciendo, querrá matarle. - -[TOSH3Z0:TOSH3] -~w~Ya no me importan la vida o la muerte, solo la libertad. - -[TOSH3ZB:TOSH3] -~w~Qué visión del mundo tan relajante. - -[TOSH3E:TOSH3] -~w~La sangre italiana no se mezcla con la nipona. - -[TOSH3F:TOSH3] -~w~¡Pero se mezclarán bien en la acera! - -[TOSH3G:TOSH3] -~w~Protege a Toshiko y escapa en ~b~su coche~w~. - -[TOSH3H:TOSH3] -~w~Protege a ~b~Toshiko~w~ y llévala a su ~y~apartamento~w~. - -[TOSH3S1:TOSH3] -~w~¡Mi coche! - -[TOSH3S2:TOSH3] -~w~¡Sálvenos, Toni! - -[TOSH3S3:TOSH3] -~w~¡Vamos, Toni! - -[TOSH3S4:TOSH3] -~w~¡Sáquenos de aquí! - -[TOSH3S5:TOSH3] -~w~¡SÁLVEME! - -[TOSH3S6:TOSH3] -~w~¡SOCORRO! - -[TOSH3S7:TOSH3] -~w~¡No vamos a conseguirlo! - -[TOSH3S8:TOSH3] -~w~¡SOCORRO! - -[TOSH3S9:TOSH3] -~r~¡Toshiko ha muerto! - -[TOSH310:TOSH3] -~r~¡El coche de Toshiko ha quedado destruido! - -[TOSH311:TOSH3] -~r~¡Se te ha acabado el tiempo! - -[TOSH3_1:TOSH3] -NONE - -[TOS3NE1:TOSH3] -~w~Protege a Toshiko y mata a los ~r~gánsteres Forelli~w~. - -[TOS3NE2:TOSH3] -~w~Escapa en el ~b~coche de Toshiko~w~. - -[TOSH3EI:TOSH3] -~w~La ópera empieza a las 20:00. ¡Sé puntual! - -{=================================== MISSION TABLE TOSH4 ===================================} - -[TOSH4O2:TOSH4] -~w~El helicóptero de Kazuki se dirige al ~y~casino~w~. - -[TOSH4O4:TOSH4] -~w~¡Mata a ~r~Kazuki~w~! - -[TOSH4O5:TOSH4] -~w~Ve al ~y~apartamento de Toshiko~w~. - -[TOSH4_3:TOSH4] -~w~Kazuki llega en ese helicóptero. Ábrete paso hasta el helipuerto y mátalo. - -[TOSH4Y1:TOSH4] -~w~¡A por él! - -[TOSH4Y2:TOSH4] -~w~¡Matadlo! - -[TOSH4CA:TOSH4] -~w~Mis hombres me deshonran... - -[TOSH4CB:TOSH4] -~w~Es más adecuado que te mate yo mismo. - -[TOSH4CC:TOSH4] -~w~¡Vosotros dos! ¡Dejadnos solos! - -[TOSH4CD:TOSH4] -~w~Voy a disfrutar cuando te atraviese con la espada. - -[TOSH4CE:TOSH4] -~w~Sí, ya he oído hablar de ti. - -[TOSH4K1:TOSH4] -~w~¡Matadlo! - -[TOSH4K2:TOSH4] -~w~¡Matadlo! - -[TOSH4_7:TOSH4] -~w~Llévale la espada de Kazuki a Toshiko como prueba de que ha muerto. - -[TOSH4_8:TOSH4] -~w~¡Has espantado a Kazuki! ¡Se escapa! .¡Has perdido la oportunidad de matarlo! - -[TOSH4_C:TOSH4] -Kazuki - -[TOSH4AA:TOSH4] -~w~¿Hola? - -[TOSH4AB:TOSH4] -~w~Me estoy bañando, Toni-san. - -[TOSH4AC:TOSH4] -~w~Nos queda poco tiempo. - -[TOSH4AD:TOSH4] -~w~Mi marido ya sabe quién está en realidad detrás de sus derrotas. - -[TOSH4AE:TOSH4] -~w~Va a venir a matarme... y a usted de paso. - -[TOSH4AF:TOSH4] -~w~Bueno, no voy a quedarme aquí esperándole. ¿Dónde está? - -[TOSH4AG:TOSH4] -~w~En Belleville, reuniendo a sus hombres. - -[TOSH4AJ:TOSH4] -~w~Pero pronto estará aquí. - -[TOSH4AH:TOSH4] -~w~Sayonara, preciosa. - -[TOSH4AI:TOSH4] -~w~Mis plegarias van con usted, Toni-san. Buena suerte. - -[TOSH4F1:TOSH4] -~r~¡Kazuki se ríe de ti! - -[TOSH4OA:TOSH4] -~w~¡Mata a los ~r~guardias~w~ de Kazuki! - -[TOSH4OB:TOSH4] -~w~¡Vuelve a la casa de ~y~Kazuki~w~! - -[TOSH4OC:TOSH4] -~w~¡Cuidado, que vienen más ~r~yakuza~w~! - -[TOSH4DA:TOSH4] -~w~¡Disparadle! - -[TOSH4DB:TOSH4] -~w~¡Matadlo! - -[TOSH4DC:TOSH4] -~w~¡Matadlo, capullos! - -[TOSH4O1:TOSH4] -~w~Ve a ~y~casa de Kazuki~w~ y mátalo. - -[TOSH4O3:TOSH4] -~w~Dirígete al ~y~helipuerto~w~. - -[CASH_01:TOSH4] -Esto, eh... Toshiko. Asunto resuelto. - -[CASH_02:TOSH4] -Sí, sí, ya lo sé... Hola, señor Toni. - -[CASH_03:TOSH4] -Eh. Así que... usted ha ganado. - -[CASH_04:TOSH4] -Tiene lo que quería. Todo ha salido a pedir de boca. - -[CASH_06:TOSH4] -Estupendo, sí, estupendo. Magnífico. - -[CASH_07:TOSH4] -Entonces... es hora de pagar, tesoro... - -[CASH_08:TOSH4] -Ambos somos unos asesinos insensatos, señor Toni. - -[CASH_09:TOSH4] -Supongo que sí. - -[CASH_10:TOSH4] -El mundo le pasa una factura tan terrible al espíritu, ¿no le parece, señor Toni? - -[CASH_11:TOSH4] -Supongo. - -[CASH_12:TOSH4] -Pero ahora es libre. Es decir, puede irse a Costa Rica o Aruba o adónde sea. - -[CASH_13:TOSH4] -Empezar de cero, que es lo que siempre quiso. - -[CASH_14:TOSH4] -No creo que esté lista para irme a la playa, señor Toni. - -[CASH_15:TOSH4] -Lo he perdido todo, y lo he hecho deliberadamente. - -[CASH_16:TOSH4] -Se me ha concedido cuanto pedí. - -[CASH_17:TOSH4] -Ahora solo quiero ser libre de verdad. - -[CASH_18:TOSH4] -Sayonara, Toni-san. - -{=================================== MISSION TABLE COPCAR ===================================} - -[C_COMP1:COPCAR] -~w~Misión de vigilante: nivel 12 completado. Aumenta la protección del blindaje corporal. - -[C_BREIF:COPCAR] -~r~Sospechoso~w~ visto por última vez por ~a~. - -[C_BREIG:COPCAR] -~r~Sospechosos~w~ vistos por última vez por ~a~. - -[C_RANGE:COPCAR] -~r~La radio del coche patrulla no recibe nada, ¡acércate a una comisaría! - -[C_TIMEA:COPCAR] -~w~¡Bonif. de tiempo! +~1~ s. - -[COPCART:COPCAR] -~w~Tienes ~1~ s. para volver al vehículo policial antes de que termine la misión. - -[COPCARU:COPCAR] -~w~Tienes ~1~ s. para volver al vehículo policial antes de que termine la misión. - -[C_CANC:COPCAR] -~r~¡Misión de vigilante cancelada! - -[C_TIME:COPCAR] -~r~¡Tu tiempo como justiciero ha terminado! - -[C_PASS3:COPCAR] -~w~¡AMENAZA ELIMINADA! Recompensa: ~1~ $ - -[C_LEVEL:COPCAR] -~r~¡Has dejado que los criminales se escapen! - -[C_RANG2:COPCAR] -~r~La radio de la policía no funciona en el metro. - -{=================================== MISSION TABLE CARS ===================================} - -[CARS_10:CARS] -Sube a un coche para probarlo o sal del aparcamiento para cancelar la misión. - -[CARS_12:CARS] -~w~Si bajas del coche, fallarás la misión. - -[CARS_1:CARS] -~w~Lleva a uno de los clientes a probar un vehículo. - -[CARS_2:CARS] -~w~Tendrás que discernir qué prestaciones quiere cada cliente en un coche. - -[CARS_3:CARS] -~w~Luego usa tu habilidad para demostrarles que el coche tiene exactamente lo que quieren. - -[CARS_5:CARS] -~w~Impresiona al cliente. - -[CARS_6:CARS] -~w~¡Cliente fastidiado! ¡Elige un coche diferente! - -[CARS_30:CARS] -~w~¡Vuelve al ~y~aparcamiento~w~ para cerrar el trato! - -[CARS_C1:CARS] -~w~¡Muy bien, tío! Sacándote a la poli de encima, ¿eh? - -[CARS_C2:CARS] -~w~¡Sí! ¡Esa rata se lo merecía! - -[CARS_P1:CARS] -~w~¡Guau! ¡Este carro es supersónico! - -[CARS_P2:CARS] -~w~¡Yujuuuu! - -[CARS_P3:CARS] -~w~¡Mi abuelita va a esta velocidad! - -[CARS_P4:CARS] -~w~¿Y esto tiene airbag? - -[CARS_M1:CARS] -~w~Ah, qué paseíto más relajante. - -[CARS_M2:CARS] -~w~¿Sabe cuál es el límite de velocidad aquí? - -[CARS_M3:CARS] -~w~¡Ay, Dios mío! ¡Nos vamos a matar! - -[CARS_O1:CARS] -~w~¡Oh, sí! ¡Sin asfalto que nos estorbe! - -[CARS_O2:CARS] -~w~¡Hasta el cielo, colega! - -[CARS_O3:CARS] -~w~¡Vuelta de la hostia, tío! - -[CARS_SC:CARS] -~w~Venta cerrada. Comisión: ~1~ $ Bonif. tiempo: ~1~ s. - -[CARS_SD:CARS] -~w~Nivel ~1~ completado. Comisión: ~1~ $ Bonif. tiempo: ~1~ s. - -[CARS_IR:CARS] -¡~1~ SEGUIDOS! ¡Bonificación! ~1~ $ - -[CARS_RE:CARS] -~w~¡Un incentivo para el vendedor estrella! - -[CARSIC1:CARS] -~w~Necesito algo jodido de alcanzar, tío. - -[CARSIC2:CARS] -~w~Necesito una máquina para que los 'peatontos' se caguen. - -[CARSIP1:CARS] -~w~¡Esta preciosidad parece rápida! - -[CARSIP2:CARS] -~w~¡Jo, tío! ¡Seguro que este buga vuela y todo! - -[CARSIM1:CARS] -~w~Dicen que estos vehículos son lentos pero seguros. - -[CARSIM2:CARS] -~w~Desde que me operaron, necesito coches más lentos. - -[CARSIO1:CARS] -~w~¡Cómo se agarra! ¡Vamos por el campo! - -[CARSIO2:CARS] -~w~Mi colega hace unos trompos que te cagas con su buga. ¡Me flipan! - -[CARS_N1:CARS] -~w~¡No voy a comprar este trasto! - -[CARS_N2:CARS] -~w~¿Te crees que voy a comprar esto? - -[CARS_N3:CARS] -~w~¡Todos los vendedores de coches usados sois iguales! - -[CARS_Y1:CARS] -~w~¡Me lo llevo! - -[CARS_Y2:CARS] -~w~¡Es el coche perfecto para mí! - -[CARS_Y3:CARS] -~w~¡Trato hecho! - -[CARS_R1:CARS] -~w~Me gusta el coche, pero no el color... - -[CARS_R2:CARS] -~w~Repinta el coche. - -[CARS_D1:CARS] -~w~Me gusta, pero está un poco cascado. - -[CARS_D2:CARS] -~w~Lleva el coche a reparar. - -[CARS_F1:CARS] -~r~¡Has destruido el coche! - -[CARS_F2:CARS] -~r~¡Has matado al cliente! - -[CARS_F3:CARS] -~r~¡Has tardado demasiado! ¡El cliente se ha aburrido! - -[CARS_F4:CARS] -~r~¡Al cliente no le gusta el coche! - -[CARS_F5:CARS] -~r~Tu trabajo de vendedor de coches se ha terminado. - -[CARS_F6:CARS] -~r~Al cliente no le gusta el coche, ¡lo has destrozado! - -[CARS_F7:CARS] -~r~Al cliente no le gusta el coche, ¡has ido demasiado rápido! - -[CARS_F8:CARS] -~r~Al cliente no le gusta el coche, ¡has ido demasiado lento! - -[CARS_SA:CARS] -Venta - -[CARS_7:CARS] -~w~¡Sube a un ~b~coche~w~! - -[CARS_RF:CARS] -~w~Capital Autos ahora está bajo tu 'protección'. No dejes de recoger los pagos regularmente. - -{=================================== MISSION TABLE BIKE ===================================} - -[BIKE_10:BIKE] -~w~Sube a una moto para probarla o sal de la pista para cancelar la misión. - -[BIKE_12:BIKE] -~w~Si bajas de la moto, fallarás la misión. - -[BIKE_1:BIKE] -~w~Lleva a uno de los clientes a probar un vehículo. - -[BIKE_2:BIKE] -~w~Tendrás que discernir qué prestaciones quiere cada cliente en una moto. - -[BIKE_3:BIKE] -~w~Luego usa tu habilidad para demostrarles que la moto tiene exactamente lo que quieren. - -[BIKE_5:BIKE] -~w~Impresiona al cliente. - -[BIKE_30:BIKE] -~w~¡Vuelve a la ~y~tienda de motos~w~ para cerrar el trato! - -[BIKE_C1:BIKE] -~w~¡Muy bien, tío! Sacándote a la poli de encima, ¿eh? - -[BIKE_C2:BIKE] -~w~¡Sí! ¡Esa rata se lo merecía! - -[BIKE_P1:BIKE] -~w~¡Sí! ¡Esta moto es impresionante! - -[BIKE_P2:BIKE] -~w~¡Bien! - -[BIKE_P3:BIKE] -~w~Vamos, ¿no puedes ir más rápido? - -[BIKE_P4:BIKE] -~w~¡Cuidado! - -[BIKE_M1:BIKE] -~w~Ah, qué vueltecita más relajante. - -[BIKE_M2:BIKE] -~w~¿Sabe cuál es el límite de velocidad aquí? - -[BIKE_M3:BIKE] -~w~¡Ay, Dios mío! ¡Nos vamos a matar! - -[BIKE_O1:BIKE] -~w~¡Oh, sí! ¡Sin asfalto que nos estorbe! - -[BIKE_O2:BIKE] -~w~¡Hasta el cielo, colega! - -[BIKE_O3:BIKE] -~w~¡Unas acrobacias del copón! - -[BIKE_SC:BIKE] -~w~Venta cerrada. Comisión: ~1~ $ Bonif. tiempo: ~1~ s. - -[BIKE_IR:BIKE] -¡~1~ SEGUIDOS! ¡Bonificación! ~1~ $ - -[BIKE_RE:BIKE] -~w~¡Un incentivo para el vendedor estrella! - -[BIKE_RF:BIKE] -~w~Hogs & Cogs ahora está bajo tu 'protección'. No dejes de recoger los pagos regularmente. - -[BIKEIC1:BIKE] -~w~Necesito algo jodido de alcanzar, tío. - -[BIKEIC2:BIKE] -~w~Necesito una máquina para que los 'peatontos' se caguen. - -[BIKEIP1:BIKE] -~w~¡Este pepino parece rápido! - -[BIKEIP2:BIKE] -~w~¡Quiero algo que impresione a las chicas! - -[BIKEIM1:BIKE] -~w~Dicen que estos vehículos son lentos pero seguros. - -[BIKEIM2:BIKE] -~w~Aún estoy un poco débil, así que necesito una moto lenta. - -[BIKEIO1:BIKE] -~w~¡Cómo se agarra! ¡Vamos por el campo! - -[BIKEIO2:BIKE] -~w~Estos cacharros hacen unas acrobacias de muerte, ¿no? - -[BIKE_N1:BIKE] -~w~¡No voy a comprar este trasto! - -[BIKE_N2:BIKE] -~w~¿Te crees que voy a comprar esto? - -[BIKE_N3:BIKE] -~w~¡Todos los vendedores de motos usadas son iguales! - -[BIKE_Y1:BIKE] -~w~¡Me la llevo! - -[BIKE_Y2:BIKE] -~w~¡Es la moto perfecta para mí! - -[BIKE_Y3:BIKE] -~w~¡Trato hecho! - -[BIKE_R1:BIKE] -~w~Me gusta la moto, pero no el color... - -[BIKE_R2:BIKE] -~w~Repinta la moto. - -[BIKE_D1:BIKE] -~w~Me gusta, pero está un poco cascada. - -[BIKE_D2:BIKE] -~w~Repara la moto. - -[BIKE_F1:BIKE] -~r~¡Has destruido la moto! - -[BIKE_F2:BIKE] -~r~¡Has matado al cliente! - -[BIKE_F3:BIKE] -~r~¡Has tardado demasiado! ¡El cliente se ha aburrido! - -[BIKE_F4:BIKE] -~r~¡Al cliente no le gusta la moto! - -[BIKE_F5:BIKE] -~r~Tu trabajo de vendedor de motos se ha terminado. - -[BIKE_F6:BIKE] -~r~Al cliente no le gusta la moto, ¡la has destrozado! - -[BIKE_F7:BIKE] -~r~Al cliente no le gusta la moto, ¡has ido demasiado rápido! - -[BIKE_F8:BIKE] -~r~Al cliente no le gusta la moto, ¡has ido demasiado lento! - -[BIKE_B1:BIKE] -~w~¡Tienes ~1~ s. para volver a subir a la ~b~moto~w~! - -[BIKE_B2:BIKE] -~w~Que el ~b~cliente~w~ vuelva a subir a la moto. - -[BIKE_B3:BIKE] -~w~¡Deja que el ~b~cliente~w~ se suba a la moto! - -[BIKE_SA:BIKE] -Venta - -[BIKE_7:BIKE] -~w~¡Sube a una ~b~moto~w~! - -[BIKE_S1:BIKE] -~w~¡Has vendido todas las Freeway que teníamos en stock! - -[BIKE_S2:BIKE] -~w~¡Has vendido todas las PCJ-600 que teníamos en stock! - -[BIKE_S3:BIKE] -~w~¡Has vendido todas las Faggio que teníamos en stock! - -[BIKE_S4:BIKE] -~w~¡Has vendido todas las Sánchez que teníamos en stock! - -[BIKE_SN:BIKE] -~w~¡Han llegado nuevas existencias! - -{=================================== MISSION TABLE RAC1 ===================================} - -[RAC1_A0:RAC1] -~w~Demuestra que no conduces de pena y ponte en la línea de salida de la carrera callejera. - -{=================================== MISSION TABLE RAC2 ===================================} - -[RAC2_A0:RAC2] -~w~Eh, sobran las palabras, va a haber una carrera callejera. Pon tu carro en la línea de salida. - -{=================================== MISSION TABLE RAC3 ===================================} - -[RAC3_A0:RAC3] -~w~No hay coche más rápido. Ni conductor más intrépido. - -[RAC3_A1:RAC3] -~w~Te veré en la próxima carrera callejera... por el retrovisor. - -{=================================== MISSION TABLE BIK1 ===================================} - -[BIK1_A0:BIK1] -~w~¿Crees que me puedes adelantar? ¡Lo llevas claro, pardillo! - -[BIK1_A1:BIK1] -~w~¡Pon tu moto en la parrilla de salida y empecemos de una vez! - -{=================================== MISSION TABLE BIK2 ===================================} - -[BIK2_A0:BIK2] -~w~Si crees que puedes ganarme, demuéstramelo con la burra. - -[BIK2_A1:BIK2] -~w~Te veo en la línea de salida. - -{=================================== MISSION TABLE BIK3 ===================================} - -[BIK3_A0:BIK3] -~w~Es muy sencillo. A dos ruedas, soy imbatible. Voy a demostrarlo en la calle. - -{=================================== MISSION TABLE TT1 ===================================} - -[TT1_A0:TT1] -~w~~k~ ~AMBUY~ ~w~ correr. ~n~~k~ ~AMEXI~ ~w~ salir. - -[TT1_0:TT1] -Tiempo - -[TT1_1:TT1] -~w~Nuevo récord de vuelta ~1~:~1~ - -[TT1_1A:TT1] -~w~Nuevo récord de vuelta ~1~:0~1~ - -[TT1_C1:TT1] -~w~3 - -[TT1_C2:TT1] -~w~2 - -[TT1_C3:TT1] -~w~1 - -[TT1_C4:TT1] -~w~¡YA! - -[TT1_D1A:TT1] -~w~Altura: ~1~ pies - -[TT1_D2:TT1] -~w~Tiempo de la vuelta ~1~ ~1~:~1~ - -[TT1_D3:TT1] -~w~Tiempo de la vuelta ~1~ ~1~:0~1~ - -[TT1_D4:TT1] -~w~Vuelta - -[TT1_F2:TT1] -~r~¡Has abandonado la carrera! - -[TT1_F3:TT1] -~r~¡Has destruido la moto! - -[TT1_D5A:TT1] -~w~Altura: ~1~ pies. Bonif.: 10 $ - -[TT1_D1:TT1] -~w~Altura: ~1~ m. - -[TT1_D5:TT1] -~w~Altura: ~1~ m. Bonif.: 10 $ - -[TT1_2:TT1] -~w~¡Has superado la marca! Desbloqueado el siguiente trazado. ¡Bonif. de 100 $! - -[TT1_3:TT1] -~w~¡Has superado la marca! ¡Bonif. de 100 $! - -[TTDONE:TT1] -~w~¡Completados todos los trazados! Has desbloqueado la Mánchez. - -[TT1_2A:TT1] -~r~No has conseguido superar la marca. - -[TT1_2B:TT1] -~r~No has conseguido batir el récord del trazado. - -{=================================== MISSION TABLE RCR ===================================} - -[RCRACE3:RCR] -~w~Derrota a los demás vehículos de RC en una carrera de ~1~ vuelta(s) por el parque. - -[RCRACE4:RCR] -~w~Derrota a los demás vehículos de RC en una carrera de ~1~ vuelta(s) por el aeropuerto. - -[RCRACE7:RCR] -~w~Preparados... - -[RCRLAP5:RCR] -~w~Nuevo récord: ¡vuelta en ~1~ s.! - -[RCRLAP6:RCR] -~w~¡~1~ vueltas para terminar! - -[RCRLAP7:RCR] -~w~¡Última vuelta! - -[RCRLTME:RCR] -Tiempo de vuelta - -[RCRLOSE:RCR] -~r~¡Has perdido! ¡Siempre llegas tarde! - -[RCRLOS2:RCR] -~r~¡Nunca ganarás una carrera si te sales del recorrido! - -[RCRTIME:RCR] -~w~Tienes ~h~~1~ ~w~s. para volver al recorrido. - -[RCRWIN1:RCR] -~w~¡Felicidades! Has ganado pero no has batido el récord de vuelta. - -[RCRWIN2:RCR] -~w~La próxima carrera será a ~1~ vueltas. - -[RCRWIN3:RCR] -~w~Ya está disponible la carrera de RC en el parque de Belleville, Staunton. - -[RCRWIN4:RCR] -~w~Ya está disponible la carrera de RC en el aeropuerto de Shoreside. - -[RCRWIN5:RCR] -~w~¡Ya has superado todos los niveles! ¡Ahora ve y bate tus récords de vuelta! - -[RCR1:RCR] -~w~1 - -[RCR2:RCR] -~w~2 - -[RCR3:RCR] -~w~3 - -[RCRGO:RCR] -~w~¡YA! - -[RCBLAP:RCR] -El mejor tiempo de vuelta es de ~1~:~1~ - -[RCBLAP1:RCR] -El mejor tiempo de vuelta es de ~1~:0~1~ - -[RCBLA2:RCR] -Tiempo de vuelta récord de ~1~:~1~ - -[RCBLA3:RCR] -Tiempo de vuelta récord de ~1~:0~1~ - -[RCRRLA1:RCR] -~w~Nuevo récord: ¡vuelta en ~1~:~1~! - -[RCRRLA2:RCR] -~w~Nuevo récord: ¡vuelta en ~1~:0~1~! - -[RCRACEA:RCR] -Thrashin' RC - -[RCRACEB:RCR] -Ragin' RC - -[RCRACEC:RCR] -Chasin' RC - -[RCLE11:RCR] -NIVEL UNO de Thrashin' RC - -[RCLE12:RCR] -NIVEL DOS de Thrashin' RC - -[RCLE13:RCR] -NIVEL TRES de Thrashin' RC - -[RCLE21:RCR] -NIVEL UNO de Ragin' RC - -[RCLE22:RCR] -NIVEL DOS de Ragin' RC - -[RCLE23:RCR] -NIVEL TRES de Ragin' RC - -[RCLE31:RCR] -NIVEL UNO de Chasin' RC - -[RCLE32:RCR] -NIVEL DOS de Chasin' RC - -[RCLE33:RCR] -NIVEL TRES de Chasin' RC - -[RCRACE2:RCR] -~w~Derrota a los demás vehículos de RC en una carrera de ~1~ vuelta(s) por las obras. - -[RCRWIN6:RCR] -~w~Vuelve a correr para intentar superar tu mejor vuelta. - -[RCQUIT:RCR] -~r~¿Te estás quedando sin batería? - -[RCRFAIL:RCR] -~r~¡No has conseguido llegar el primero! - -[RCRLAP1:RCR] -~c~1ª ~w~VUELTA - -[RCRLAP2:RCR] -~c~2ª ~w~VUELTA - -[RCRLAP3:RCR] -~c~3ª ~w~VUELTA - -[RCRLAP4:RCR] -~c~4ª ~w~VUELTA - -[RCRWIN:RCR] -~w~¡Felicidades! ¡Has ganado con un mejor tiempo de vuelta de ~1~:~1~! ¡500 $ de bonif.! - -[RCRWINB:RCR] -~w~¡Felicidades! ¡Has ganado con un mejor tiempo de vuelta de ~1~:0~1~! ¡500 $ de bonif.! - -{=================================== MISSION TABLE TOUR ===================================} - -[TOUR_H1:TOUR] -~w~Consejo: ponte ~h~delante~w~ del turista, ~h~no muy lejos~w~. Asegúrate de que el ~h~turista y el escenario de fondo~w~ salgan en la foto. - -[TOUR_I2:TOUR] -~w~Recibirás gratificaciones adicionales por fotos de gran calidad. - -[TOUR_S0:TOUR] -~w~Te queda carrete para ~h~~1~~w~ fotos. - -[TOUR_S1:TOUR] -~w~Solo te queda carrete para una foto. ¡Asegúrala! - -[TOUR_S2:TOUR] -~w~¡No desperdicies carrete! Solo te queda para ~h~~1~~w~ fotos. - -[TOUR_S4:TOUR] -~w~Tienes que encuadrar bien al ~b~turista~w~. Te queda carrete para ~h~~1~~w~ fotos. - -[TOUR_F1:TOUR] -~r~¡El turista ha muerto! - -[TOUR_F2:TOUR] -~r~¡Has perdido al turista! - -[TOUR_F3:TOUR] -~r~¡No le has sacado una foto al turista! - -[TOUR_F4:TOUR] -~r~¡Se te ha acabado el tiempo! - -[TOUR_F5:TOUR] -~r~Cancelada la misión del turista. - -[TOUR_F6:TOUR] -~r~¡El tironero se ha escapado con la cámara del turista! - -[TOUR_O1:TOUR] -~w~Lleva al turista al ~y~lugar turístico~w~. - -[TOUR_O2:TOUR] -~w~No dejes atrás al ~b~turista~w~. - -[TOUR_O3:TOUR] -~w~Sigue al ~b~turista~w~ a pie hasta el lugar de la foto. - -[TOUR_O4:TOUR] -~w~Usa la cámara del propio ~b~turista~w~ para sacar la foto. - -[TOUR_O5:TOUR] -~w~Lleva al turista de vuelta al ~y~aeropuerto~w~. - -[TOUR_O6:TOUR] -~w~¡Rápido! ¡Se acaba el tiempo! - -[TOUR_O7:TOUR] -~w~Recoge al ~b~turista~w~. - -[TOUR_O8:TOUR] -~w~Recoge al siguiente ~b~turista~w~ antes de que se acabe el tiempo. - -[TOUR_O9:TOUR] -~w~Tendrías que estar siguiendo al ~b~turista~w~. Estás perdiendo el tiempo. - -[TOUR_OA:TOUR] -~w~El ~b~turista~w~ espera a que le saques la foto. Date prisa, ¡el tiempo se agota! - -[TOUR_W1:TOUR] -~w~Tarifa pagada: ~h~~1~ $~w~ No hay gratificación esta vez. - -[TOUR_W2:TOUR] -~w~Tarifa pagada: ~h~~1~ $~w~ más gratificación de ~h~~1~ $~w~ por una buena foto. - -[TOUR_W3:TOUR] -~w~Tarifa pagada: ~h~~1~ $~w~ más gratificación de ~h~~1~ $~w~ por una foto estupenda. - -[TOUR_W4:TOUR] -~w~Tarifa pagada: ~h~~1~ $~w~ más gratificación de ~h~~1~ $~w~ por una foto excelente. - -[TOUR_W5:TOUR] -~w~¡Bien hecho! Completadas todas la misiones 'See the Sight...' ~1~ $ de gratificación por terminarlas. - -[TOURDAM:TOUR] -~w~VISTA ~1~: ~w~Lleva a este turista a la presa de Cochrane y sácale una foto que demuestre que ha estado allí. - -[TOURBRI:TOUR] -~w~VISTA ~1~: ~w~Esta señorita quiere ver el puente Callahan desde el lado de Portland. - -[TOURDRK:TOUR] -~w~VISTA ~1~: ~w~Sácale una foto a esta fan de las películas de Black Lightman delante de la casa de éste, en Cedar Grove, Shoreside Vale. - -[TOURSTA:TOUR] -~w~VISTA ~1~: ~w~Sácale una foto a esta loca del deporte delante del Liberty Memorial Coliseum, en Staunton. - -[TOURCHU:TOUR] -~w~VISTA ~1~: ~w~Guía a este peregrino a la histórica catedral de Liberty, en Staunton. - -[TOURBCH:TOUR] -~w~VISTA ~1~: ~w~Muestra a esta turista las bellas vistas de Portland Rock y su faro desde la playa de Portland. - -[TOURCHI:TOUR] -~w~VISTA ~1~: ~w~El ambiente oriental de Chinatown Plaza, en Portland, es el exótico destino de este turista. - -[TOURSHO:TOUR] -~w~VISTA ~1~: ~w~Esta turista quiere que sus amigas piensen que ha comprado en los selectos grandes almacenes de Staunton. Llévala allí y sácale una foto. - -[TOURCAS:TOUR] -~w~VISTA ~1~: ~w~Aquí un jugador que quiere sacarse una foto delante del mundialmente famoso casino de Staunton. - -[TOURMUS:TOUR] -~w~VISTA ~1~: ~w~Esta investigadora quiere visitar el museo en Staunton y obtener una imagen del edificio. - -[TOURHAL:TOUR] -~w~VISTA ~1~: ~w~Este turista quiere visitar el ayuntamiento, en Staunton, una vez más antes de irse. - -[TOURRED:TOUR] -~w~VISTA ~1~: ~w~Sus amigos dicen que no se atreve a visitar un club de striptease del Red Light District de Portland. ¡Demuéstrales que sí! - -[TOURMU0:TOUR] -~w~¡El ~r~tironero~w~ le ha robado la cámara! ¡Recúperala! - -[TOURMU1:TOUR] -~w~¡Un chorizo menos del que preocuparse! Recoge la ~g~cámara~w~. - -[TOUR00:TOUR] -~w~Lleva al turista a la ~y~presa de Cochrane~w~, en Shoreside Vale. - -[TOUR01:TOUR] -~w~Lleva a la turista al ~y~Liberty Memorial Coliseum~w~, en Staunton. - -[TOUR02:TOUR] -~w~Lleva al turista a ~y~Chinatown Plaza~w~, en Portland. - -[TOUR03:TOUR] -~w~Lleva al turista a la ~y~catedral de Liberty~w~, en Staunton. - -[TOUR06:TOUR] -~w~Lleva al turista al ~y~club de striptease~w~ del Red Light District de Portland. - -[TOUR07:TOUR] -~w~Lleva a la turista al ~y~museo de Liberty City~w~, en Staunton. - -[TOUR08:TOUR] -~w~Lleva al turista al ~y~casino~w~ de Staunton. - -[TOUR10:TOUR] -~w~Lleva al turista al ~y~ayuntamiento~w~ en Staunton. - -[TOUR11:TOUR] -~w~Lleva a la turista a la ~y~playa de Portland~w~. - -[TOUR04:TOUR] -~w~Lleva a la turista al ~y~puente Callahan~w~, por el lado de Portland. - -[TOUR09:TOUR] -~w~Lleva a la turista a la ~y~casa del actor Black Lightman~w~, en Cedar Grove, Shoreside Vale. - -[TOUR_I1:TOUR] -~w~Lleva a los turistas a los parajes más famosos de Liberty City. - -[TOUR_IA:TOUR] -~w~Hazles fotos de recuerdo cuando estén allí. - -[TOUR_IB:TOUR] -~w~Luego, llévalos de vuelta al avión antes de que despegue. - -[TOURMEM:TOUR] -~w~VISTA ~1~: ~w~Este veterano quiere rendir homenaje a sus camaradas en el Liberty City War Memorial, en el parque de Belleville, Staunton. - -[TOUR05:TOUR] -~w~Lleva al turista al ~y~Liberty City War Memorial~w~, en el parque de Belleville, Staunton. - -{=================================== MISSION TABLE PIZZA ===================================} - -[PIZ1_06:PIZZA] -~w~Pulsa~h~ ~k~ ~TGSUB~ ~w~cuando estés en la moto para cancelar la misión. - -[PIZ1_02:PIZZA] -~w~¡Te has quedado sin pizzas! Vuelve al ~y~Joe's Pizza Restaurant~w~ para conseguir más. - -[PIZ1_07:PIZZA] -~r~¡Has matado al cliente! ¡Estás despedido! - -[PIZ1_08:PIZZA] -~r~¡Te has quedado sin tiempo y sin trabajo! - -[PIZ1_09:PIZZA] -~r~¡Has estrellado la moto! ¡Fuera de aquí! - -[PIZ1_11:PIZZA] -~w~Necesitas la ~b~moto de repartidor~w~ para hacer las entregas. - -[PIZ1_12:PIZZA] -Pizzas - -[PIZ1_13:PIZZA] -~w~¡Pizza! ¡Calentita y lista! ¡Me encanta! - -[PIZ1_14:PIZZA] -~w~¡Listas para repartir! ¡Venga! - -[PIZ1_15:PIZZA] -~w~¡Ésta lleva extra de picante! - -[PIZ1_16:PIZZA] -~w~¡Deja de tocarte los huevos y repártelas! ¡'Pronto'! - -[PIZ1_17:PIZZA] -~w~¡Estas pizzas hay que repartirlas hoy, no el año que viene! - -[PIZ1_18:PIZZA] -~w~¿Repartir pizzas no está a su altura? Usted perdone, señor doctor. - -[PIZ1_19:PIZZA] -~w~¿Vas a repartirlas o qué? - -[PIZ1_20:PIZZA] -~w~¡Despedido! Es broma... ¡Pero no lo será si no las entregas a tiempo! - -[PIZ1_21:PIZZA] -~w~¡Pizzas! ¡Vamos! ¡Hay gordos esperándolas! - -[PIZ1_22:PIZZA] -~w~¿Has estado escupiendo en las pizzas? ¡Pues deberías! ¡Les da más saborcito! - -[PIZ1_23:PIZZA] -~w~¿Crees que van a repartirse solas? - -[PIZ1_24:PIZZA] -~w~¡Si llegan frías, no va a pagarte ni Dios! - -[PIZ1_25:PIZZA] -~w~¡Esta vez date caña! - -[PIZ1_26:PIZZA] -~w~¡Eh, reparte esto! - -[PIZ1_27:PIZZA] -~w~Vale, entrega éstas y vuelve a por más. - -[PIZ1_28:PIZZA] -~w~¡Nuestras pizzas son la polla! ¡Reparte éstas o te la corto! - -[PIZ1_29:PIZZA] -~w~¿Quieres más? Pues me he quedado sin insultos, colega. - -[PIZ1_30:PIZZA] -~w~¡Creo que he estornudado en una de ésas! No importa. ¡Repártelas! - -[PIZ1_31:PIZZA] -~w~¡Odio este trabajo! Pero al menos me dejan mangonearte. - -[PIZ1_3A:PIZZA] -~w~Si no llegan a tiempo, la pasta de la pizza será la única que veas hoy. - -[PIZ1_32:PIZZA] -~r~¿No tragas con nuestras pizzas? - -[PIZ1_33:PIZZA] -~w~Vuelve al ~y~Joe's Pizza Restaurant~w~ a por más pedidos. - -[PIZ1_34:PIZZA] -~w~¡Entrega realizada, dinero cobrado! - -[PIZ_WON:PIZZA] -~w~Completada la misión eventual de repartidor de pizzas, ¡bien hecho! ¡Ha aumentado tu salud máxima! - -[PIZ_WO1:PIZZA] -~w~Joe's Pizza Restaurant ahora está bajo tu 'protección'. No dejes de recoger los pagos regularmente. - -[PIZ1_01:PIZZA] -~w~Lleva estas pizzas a los ~b~clientes~w~ tan rápido como puedas. - -[PIZ1_05:PIZZA] -~w~Para entregarlas, lánzaselas en marcha a sus dueños. - -{=================================== MISSION TABLE TAXI ===================================} - -[TAXI1:TAXI] -~w~Busca un ~b~cliente~w~. - -[TAXI1A:TAXI] -~w~Por aquí no hay clientes. ¡Sigue buscando! - -[TAXI2:TAXI] -~r~¡Se te acabó el tiempo! - -[TAXI3:TAXI] -~w~¡El pasajero ha huido aterrorizado! - -[TAXI4:TAXI] -~w~Viaje completado: ~1~ $ - -[TAXI4A:TAXI] -~w~Viaje completado: ~1~ $ + bonif. por ~1~ SEGUIDOS: ~1~ $ - -[TAXI5:TAXI] -~w~BONIF. VELOCIDAD: ~1~ $ - -[TAXI5A:TAXI] -~w~BONIF. VELOCIDAD: ~1~ $ + bonif. por ~1~ SEGUIDOS: ~1~ $ - -[TAXI7:TAXI] -~w~El coche está dañado, llévalo a reparar. - -[TAXI8:TAXI] -~r~Misión de taxista cancelada. - -[TAXI9:TAXI] -~r~¡El taxi ha quedado destrozado! - -[FARES:TAXI] -Viajes - -[TIP:TAXI] -Propinas - -[FARE9:TAXI] -~w~Destino: ~y~los muelles de Portland~w~. - -[FARE20:TAXI] -~w~Destino: ~y~el parque~w~ de Belleville. - -[FARE22:TAXI] -~w~Destino: ~y~presa de Cochrane~w~. - -[FARE2:TAXI] -~w~Destino: ~y~Head Radio~w~, en Harwood. - -[FARE3:TAXI] -~w~Destino: ~y~el puerto del ferry~w~ de Harwood. - -[FARE4:TAXI] -~w~Destino: ~y~el hospital~w~ de Portland View. - -[FARE7:TAXI] -~w~Destino: ~y~las obras~w~ de Hepburn Heights. - -[FARE8:TAXI] -~w~Destino: ~y~Cipriani Restaurant~w~, en Saint Mark's. - -[FARE10:TAXI] -~w~Destino: ~y~Punk Noodles~w~, en Chinatown. - -[FARE12:TAXI] -~w~Destino: ~y~el puerto del ferry~w~ de Rockford. - -[FARE13:TAXI] -~w~Destino: ~y~la iglesia~w~ de Bedford Point. - -[FARE14:TAXI] -~w~Destino: ~y~oficinas del Liberty Tree~w~, en Bedford Point. - -[FARE15:TAXI] -~w~Destino: ~y~Liberty University~w~, en Liberty Campus. - -[FARE16:TAXI] -~w~Destino: ~y~Hogs 'n' Cogs~w~, en la zona del parque de Belleville. - -[FARE17:TAXI] -~w~Destino: ~y~los juzgados~w~, en la zona del parque de Belleville. - -[FARE18:TAXI] -~w~Destino: el ~y~Mr. Benz~w~ de Bedford Point. - -[FARE19:TAXI] -~w~Destino: ~y~Joe's Pizza~w~, en Bedford Point. - -[FARE21:TAXI] -~w~Destino: ~y~la terminal A~w~ del aeropuerto internacional Francis. - -[FARE23:TAXI] -~w~Destino: ~y~la mansión~w~ de Cedar Grove. - -[FARE24:TAXI] -~w~Destino: ~y~el hospital~w~ de Pike Creek. - -[FARE25:TAXI] -~w~Destino: ~y~el parque~w~ de Shoreside Vale. - -[FARE26:TAXI] -~w~Destino: ~y~North West Towers~w~, en Wichita Gardens. - -[FARE27:TAXI] -~w~Destino: ~y~las cocheras~w~, en Trenton. - -[FARE28:TAXI] -~w~Destino: ~y~el Mr. Benz~w~ de Chinatown. - -[FARE29:TAXI] -~w~Destino: ~y~el Mr. Benz~w~ de Pike Creek. - -[FARE30:TAXI] -~w~Destino: ~y~la terminal C~w~ del aeropuerto internacional Francis. - -[FARE31:TAXI] -~w~Destino: ~y~AM Petroleum~w~, en Pike Creek. - -[FARE32:TAXI] -~w~Destino: ~y~Liberty Pharmaceuticals~w~, en Pike Creek. - -[FARE11:TAXI] -~w~Destino: ~y~armería Phil Cassidy's Fully Cocked~w~, en Bedford Point. - -[FARE1A:TAXI] -~w~Destino: ~y~Paulie's Revue Bar~w~, en el Red Light District. - -[FARE1C:TAXI] -~w~Destino: ~y~Sex Club Seven~w~, en el Red Light District. - -[FARE5:TAXI] -~w~Destino: ~y~Ammu-Nation~w~, en el Red Light District. - -[FARE6:TAXI] -~w~Destino: ~y~Capital Autos~w~, en Saint Mark's. - -{=================================== MISSION TABLE AMBU ===================================} - -[A_FAIL2:AMBU] -~r~¡Has llegado tarde y el paciente no lo cuenta! - -[A_FAIL3:AMBU] -~r~¡El paciente ha muerto! - -[ATUTOR4:AMBU] -~w~Los golpes reducen las posibilidades de supervivencia del paciente. - -[A_TIME:AMBU] -~w~¡Recogido! +~1~ s. - -[A_TIME2:AMBU] -~w~¡Bonificación! +~1~ s. - -[AREWARD:AMBU] -~w~¡Nivel ~1~ completado! Recompensa: ~1~ $ - -[A_RANGE:AMBU] -~r~La radio de la ambulancia no recibe nada, ¡acércate a un hospital! - -[ATUTOR5:AMBU] -~w~Recoge a un ~b~paciente~w~. - -[ATUTOR6:AMBU] -~w~¡Llévalo al ~y~hospital~w~! - -[ATUTOR7:AMBU] -~w~Recoge a más ~b~pacientes~w~ o lleva a éste al ~y~hospital~w~. - -[A_FULL:AMBU] -~w~¡La ambulancia está llena! Deja a los pacientes en el ~y~hospital~w~. - -[A_RANG2:AMBU] -~r~La radio de la ambulancia no funciona en el metro. - -{=================================== MISSION TABLE TV ===================================} - -[TV_01:TV] -Slash TV - -[TV_02:TV] -~w~Mata a todos los locos psicópatas... ¡No dejarán de aparecer! - -[TV_03:TV] -~w~Cada nivel se pone más difícil y hay más enemigos... ¡y también más premios! - -[TV_04:TV] -~w~NIVEL ~1~ - -[TV_10:TV] -~w~¡Has ganado un premio extra! - -[TV_09:TV] -Premio en metálico total ganado en este juego: ¡~1~ $! - -[TV_05:TV] -~w~¡NIVEL COMPLETADO! - -[TV_06:TV] -~w~¡Ganas ~1~ $ de premio! - -[TV_07:TV] -~w~PREPARADOS... - -[TV_08:TV] -~w~¡YA! - -{=================================== MISSION TABLE NOODLE ===================================} - -[NDL1_02:NOODLE] -~w~Oh-oh. ¡Se acabaron los fideos! Vuelve a ~y~Punk Noodles~w~ y consigue más. - -[NDL1_06:NOODLE] -~w~Pulsa~h~ ~k~ ~TGSUB~ ~w~cuando estés en la moto para cancelar la misión. - -[NDL1_07:NOODLE] -~r~¡Has matado al cliente! ¡Estás despedido! - -[NDL1_08:NOODLE] -~r~Se te ha acabado el tiempo. ¡Estás despedido! - -[NDL1_09:NOODLE] -~r~¡Has estrellado la motocicleta! ¡Estás despedido! - -[NDL1_11:NOODLE] -~w~Vuelve a la ~b~moto~w~. - -[NDL1_12:NOODLE] -Fideos - -[NDL1_13:NOODLE] -~w~¡Fideos! ¡'Peazo' de fideos pala lepaltil con salelo! - -[NDL1_14:NOODLE] -~w~Clientes no cansa de mis fideos. - -[NDL1_15:NOODLE] -~w~¡Aquí tiene fideos pala dal y tomal! - -[NDL1_16:NOODLE] -~w~¡Tú intental que estos fideos llega a tiempo! - -[NDL1_17:NOODLE] -~w~¡Eh, basula! ¡Estos fideos cole plisa! - -[NDL1_18:NOODLE] -~w~Tú entlegal estos fideos lapidito. - -[NDL1_19:NOODLE] -~w~Los clientes quiele fideos calientes, no flíos. - -[NDL1_20:NOODLE] -~w~¿Tú no aguanta el calol del fogón? 'Mejol tú bajal llama', Confucio decil. - -[NDL1_21:NOODLE] -~w~Tú lepaltil estos fideos, ¿de acueldo? - -[NDL1_22:NOODLE] -~w~Más fideos pala lepaltil con salelo. - -[NDL1_23:NOODLE] -~w~¡Fideos, fideos, fideos! ¡Tú lepalte bien calentitos! - -[NDL1_24:NOODLE] -~w~¡Habel gente espelando! ¡Lo que hay que vel...! - -[NDL1_25:NOODLE] -~w~¿Tú aún no habel entlegado este pedido? - -[NDL1_26:NOODLE] -~w~¿A qué está espelando? ¿Al Año Nuevo chino? - -[NDL1_27:NOODLE] -~w~Estos fideos estal enfliando. ¡Tú dal plisa! - -[NDL1_28:NOODLE] -~w~Yo quiele sel astlonauta, pelo mi padle solo dejal esto. ¡Hay que jodelse! - -[NDL1_29:NOODLE] -~w~¿Tú quiele conselval tlabajo? ¡Tú movel culo y lepaltil esto! - -[NDL1_30:NOODLE] -~w~Fideos flitos clujientitos... Yo no entiende, pelo a mí me encanta. - -[NDL1_31:NOODLE] -~w~Cleo que tú vale mejol pala lepaltil pizzas. - -[NDL1_3A:NOODLE] -~w~Ellos siemple quiele más. Así que tú vuelve cuando telminal. - -[NDL1_32:NOODLE] -~r~¿Qué ploblema? ¿No gusta los fideos? - -[NDL1_33:NOODLE] -~w~Vuelve a ~y~Punk Noodles~w~ a por más pedidos. - -[NDL1_34:NOODLE] -~w~¡Fideos entregados, dinero cobrado! - -[NDL_WON:NOODLE] -~w~Completada la misión eventual de repartidor de fideos, ¡bien hecho! ¡Ha aumentado tu salud máxima! - -[NDL_WO1:NOODLE] -~w~Punk Noodles ahora está bajo tu 'protección'. No dejes de recoger los pagos regularmente. - -[NDL1_01:NOODLE] -~w~Tú entlega a ~b~clientes~w~ estos fideos lapidito. - -[NDL1_05:NOODLE] -~w~Para entregarlos, lánzaselos en marcha a sus dueños. - -{=================================== MISSION TABLE MPSURV ===================================} - -[SAL01:MPSURV] -~w~María, me voy al hospital a arreglarme lo que tú ya sabes. - -[SAL02:MPSURV] -~w~Cuando salga, el cochino semental galopará como antes... - -[SAL04:MPSURV] -~w~P.S. ¡Prepárate para un buen rodeo cuando salga, nena! - -[SAL05:MPSURV] -~w~P.S.S. ¡No dejes esta nota a la vista de todos! - -[SAL03:MPSURV] -~w~No te metas en líos, porque hay miembros de la Familia que 'se mueren' por hacerse con el poder. - -[SAL03A:MPSURV] -~w~¡Literalmente! - -{=================================== MISSION TABLE JDREF ===================================} - -[JDT1_BA:JDREF] -~w~¡No tengo trabajo para ningún Leone! - -[JDT1_BB:JDREF] -~w~Eh, Toni, vuelve cuando seas menos cantoso. - -[CHNGOUT:JDREF] -~w~Quítate el traje de Leone. De lo contrario, no pueden verte hablando con J.D. - -{=================================== MISSION TABLE CRED01 ===================================} - -[CR01_01:CRED01] -~n~ ~n~ ~n~ ~n~CREDITS - -[CR01_02:CRED01] -~n~ ~n~ ~n~ ~n~ROCKSTAR NORTH - -[CR01_03:CRED01] -~n~ ~n~ ~n~ ~n~Producer ~n~Leslie Benzies - -[CR01_04:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Aaron Garbut - -[CR01_05:CRED01] -~n~ ~n~ ~n~ ~n~Technical Direction ~n~Obbe Vermeij, Adam Fowler - -[CR01_06:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~Written By ~n~Dan Houser, James Worrall ~n~ & David Bland - -[CR01_07:CRED01] -~n~ ~n~ ~n~ ~n~Programming ~n~Alexander Roger, Alexander Illes, ~n~Andrzej Madajczyk, Barane Chan, ~n~Derek Payne, Derek Ward, - -[CR01_08:CRED01] -~n~ ~n~Gordon Yeoman, Graeme Williamson, ~n~Greg Smith, James Broad, ~n~John Gurney, John Whyte, - -[CR01_09:CRED01] -~n~ ~n~Keith McLeman, Mark Nicholson, ~n~Shaun McKillop - -[CR01_10:CRED01] -~n~ ~n~ ~n~ ~n~Audio Programmer ~n~Matthew Smith - -[CR01_11:CRED01] -~n~ ~n~ ~n~ ~n~Sound Design and Mastering ~n~Allan Walker - -[CR01_12:CRED01] -~n~ ~n~ ~n~ ~n~Lead Cut Scene Animator ~n~Mondo Ghulam - -[CR01_13:CRED01] -~n~ ~n~ ~n~ ~n~Cut Scene Animator ~n~Dermot Bailie - -[CR01_14:CRED01] -~n~ ~n~ ~n~ ~n~Character Animator ~n~Felipe Busquets - -[CR01_15:CRED01] -~n~ ~n~ ~n~ ~n~In-Game Animation ~n~Gus Braid, Terry Kenny - -[CR01_16:CRED01] -~n~ ~n~ ~n~ ~n~Characters Artist ~n~Ian McQue - -[CR01_17:CRED01] -~n~ ~n~ ~n~ ~n~Vehicle Artist ~n~Joylon Orme - -[CR01_18:CRED01] -~n~ ~n~ ~n~ ~n~Additional Art ~n~Rick Stirling, Alisdair Wood - -[CR01_19:CRED01] -~n~ ~n~ ~n~ ~n~Music Producer ~n~Craig Conner - -[CR01_20:CRED01] -~n~ ~n~ ~n~ ~n~Audio Design and Dialogue Editor ~n~Will Morton - -[CR01_21:CRED01] -~n~ ~n~ ~n~ ~n~Additional Dialogue Editor ~n~Jon McCavish - -[CR01_22:CRED01] -~n~ ~n~ ~n~ ~n~Development Support ~n~Milly Cottam - -[CR01_23:CRED01] -~n~ ~n~ ~n~ ~n~Graphic Designers ~n~Stuart Petri, Steve Walsh - -[CR01_24:CRED01] -~n~ ~n~ ~n~ ~n~Lead Level Design ~n~William Mills - -[CR01_25:CRED01] -~n~ ~n~ ~n~ ~n~Level Design ~n~Chris Rothwell, Andy Duthie, ~n~Chris McMahon, Neil Ferguson - -[CR01_26:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Craig Arbuthnott - -[CR01_27:CRED01] -~n~ ~n~ ~n~ ~n~Senior Lead Test ~n~Neil Corbett - -[CR01_28:CRED01] -~n~ ~n~ ~n~ ~n~Lead Test ~n~David Murdoch, Neil Meikle, ~n~Alex Bazlinton, Brenda Carey - -[CR01_29:CRED01] -~n~ ~n~ ~n~ ~n~Build Engineer / Lead Test ~n~Neil Walker - -[CR01_30:CRED01] -~n~ ~n~ ~n~ ~n~Audio Test ~n~George Williamson - -[CR01_31:CRED01] -~n~ ~n~ ~n~ ~n~Test ~n~Brian Kelly, Lindsay Robertson, ~n~Sundram Soosay, Eugene Kuczerepa, ~n~Christopher Soosay, Ben Abbott, - -[CR01_32:CRED01] -~n~ ~n~Oliver Elliott, Louis Dinan, ~n~Bobby Wright, Thomas Philips, ~n~Nick Rees, Ivor Williams - -[CR01_33:CRED01] -~n~ ~n~ ~n~ ~n~Test Tools Programming ~n~James Whitcroft, Alex Carter - -[CR01_34:CRED01] -~n~ ~n~ ~n~ ~n~IT Manager ~n~Lorraine Roy - -[CR01_35:CRED01] -~n~ ~n~ ~n~ ~n~IT Support ~n~Christine Chalmers, Dave Bruce - -[CR01_36:CRED01] -~n~ ~n~ ~n~ ~n~Studio Director ~n~Andrew Semple - -[CR01_37:CRED01] -~n~ ~n~ ~n~ ~n~Office Administration ~n~Kim Gurney - -[CR01_38:CRED01] -~n~ ~n~ ~n~ ~n~Administration Support ~n~Charlene Maguire, Kim Wilson - -[CR02_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LEEDS - -[CR02_02:CRED01] -~n~ ~n~ ~n~ ~n~Studio Director ~n~Gordon Hall - -[CR02_03:CRED01] -~n~ ~n~ ~n~ ~n~Head of Development ~n~David Box - -[CR02_04:CRED01] -~n~ ~n~ ~n~ ~n~Lead Programming ~n~Andrew Greensmith, Matthew Shepcar ~n~ ~n~ ~n~ ~n~Console Programming ~n~Nigel Conroy, Richard Frankish, ~n~Andrew Greensmith, Robin Mangham, ~n~Damian McKenna, Finlay Munro, ~n~Stuart Roskell, Matthew Shepcar - -[CR02_05:CRED01] -~n~ ~n~ ~n~ ~n~Programming ~n~Jon Bellamy, Ross Childs, ~n~Nigel Conroy, Neil Dodwell, ~n~Alastair Dukes, David Huebner, - -[CR02_06:CRED01] -~n~ ~n~Robin Mangham, Jason McGann, ~n~Warren Merrifield, Stephen McGreal - -[CR02_07:CRED01] -~n~ ~n~ ~n~ ~n~Sound Programming ~n~Finlay Munro, Charles Waddington - -[CR02_08:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Ian Bowden - -[CR02_09:CRED01] -~n~ ~n~ ~n~ ~n~Art Department Director ~n~Chris Smart - -[CR02_10:CRED01] -~n~ ~n~ ~n~ ~n~Lead Character Artist ~n~Paul Smith - -[CR02_11:CRED01] -~n~ ~n~ ~n~ ~n~Character Artist ~n~Chris Allison - -[CR02_12:CRED01] -~n~ ~n~ ~n~ ~n~Lead City Artist ~n~Dan Roberts - -[CR02_13:CRED01] -~n~ ~n~ ~n~ ~n~City Artists ~n~Paul McKee, James McHale, ~n~Siu Lee - -[CR02_14:CRED01] -~n~ ~n~ ~n~ ~n~Cutscene Interiors ~n~Izzy Stewart - -[CR02_15:CRED01] -~n~ ~n~ ~n~ ~n~Concept Artist ~n~John Wigley - -[CR02_16:CRED01] -~n~ ~n~ ~n~ ~n~Additional Character Animation ~n~Alan Bowker - -[CR02_17:CRED01] -~n~ ~n~ ~n~ ~n~Additional Artists ~n~Andy Walker, Jason Gee, ~n~Chris Edwards, Lee Clark - -[CR02_18:CRED01] -~n~ ~n~ ~n~ ~n~Design Director ~n~David Bland - -[CR02_19:CRED01] -~n~ ~n~ ~n~ ~n~Lead Level Design ~n~John Li - -[CR02_20:CRED01] -~n~ ~n~ ~n~ ~n~Senior Level Design ~n~Tony Gowland, Martyn Bramall - -[CR02_21:CRED01] -~n~ ~n~ ~n~ ~n~Level Design ~n~Sam Hackett, Stephen Robertson, ~n~Tom Kingsley, Chris Edwards, ~n~Kris Gormley - -[CR02_22:CRED01] -~n~ ~n~ ~n~ ~n~Associate Designer ~n~Mark McGinley - -[CR02_23:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Paul Colls - -[CR02_24:CRED01] -~n~ ~n~ ~n~ ~n~QA ~n~Jody Cobb, ~n~ ~n~Luke Brown, Nick Robey, ~n~Matthew Haven - -[CR02_25:CRED01] -~n~ ~n~ ~n~ ~n~Company Secretary ~n~Naomi Martin - -[CR02_26:CRED01] -~n~ ~n~ ~n~ ~n~IT Manager ~n~Chris Waring - -[CR03_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR NYC - -[CR03_02:CRED01] -~n~ ~n~ ~n~ ~n~Executive Producer ~n~Sam Houser - -[CR03_03:CRED01] -~n~ ~n~ ~n~ ~n~VP of Creative ~n~Dan Houser - -[CR03_04:CRED01] -~n~ ~n~ ~n~ ~n~VP of Development ~n~Jamie King - -[CR03_05:CRED01] -~n~ ~n~ ~n~ ~n~Art Director ~n~Alex Horton - -[CR03_06:CRED01] -~n~ ~n~ ~n~ ~n~Chief Technology Officer ~n~Gary J. Foreman - -[CR03_07:CRED01] -~n~ ~n~ ~n~ ~n~Associate Producer ~n~Rich Rosado - -[CR03_08:CRED01] -~n~ ~n~ ~n~ ~n~Director of Quality Assurance ~n~Jeff Rosa - -[CR03_09:CRED01] -~n~ ~n~ ~n~ ~n~Senior Lead Analyst ~n~Lance Williams - -[CR03_10:CRED01] -~n~ ~n~ ~n~ ~n~Project Lead ~n~Jameel Vega - -[CR03_11:CRED01] -~n~ ~n~ ~n~ ~n~Rockstar Test Team ~n~Ethan Abeles, William Rompf, ~n~Christopher Mansfield, Chris Choi, ~n~Mike Hong, Tamara Carrion, - -[CR03_12:CRED01] -~n~ ~n~Rich Huie, Mike Nathan, ~n~Vance Wallace, Marc Rodriguez, ~n~Adam Tetzloff - -[CR03_13:CRED01] -~n~ ~n~ ~n~ ~n~Business Development Director ~n~Sean Macaluso - -[CR03_14:CRED01] -~n~ ~n~ ~n~ ~n~Soundtrack Supervision ~n~Heinz Henn, Ivan Pavlovich, ~n~Tim Sweeney - -[CR04_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~CUT SCENES & DIALOGUE - -[CR04_02:CRED01] -~n~ ~n~ ~n~ ~n~Motion Capture Director ~n~Navid Khonsari - -[CR04_03:CRED01] -~n~ ~n~ ~n~ ~n~Motion Capture Performed by ~n~Danny Mastrogiorgio, Jeffrey C. Hawkins, ~n~Bruce MacVittie, David Zayas, ~n~Peter Appel, Hannah Moon, ~n~Alyssa Truppelli, Joe Lotruglio - -[CR04_04:CRED01] -~n~ ~n~ ~n~ ~n~Voices Performed by ~n~Salvatore Leone - Frank Vincent ~n~Toni Cipriani - Danny Mastrogiorgio ~n~Donald Love - Will Janowitz - -[CR04_05:CRED01] -~n~ ~n~ Vincenzo Cilli - Joe Lotruglio ~n~Maria Latore - Fiona Gallagher ~n~JD O'Toole - Greg Wilson - -[CR04_06:CRED01] -~n~ ~n~Leon McAffrey - Ron Orbach ~n~Ray Machowski - Peter Appel ~n~Toshiko Kasen - Hannah Moon - -[CR04_07:CRED01] -~n~ ~n~ Ned Burner - Peter Bradbury ~n~Ma Cipriani - Sondra James ~n~Giovanni Casa - Joel Jones - -[CR04_08:CRED01] -~n~ ~n~Kazuki Kasen - Keenan Shimizu, ~n~Massimo Torini - Duccio Faggella ~n~Mickey Hamfists - Chris Tardio - -[CR04_09:CRED01] -~n~ ~n~Jane Hopper - Gordana Rashovich ~n~Mayor O'Donovan - John Braden ~n~8 Ball - Guru - -[CR04_10:CRED01] -~n~ ~n~Radio Newscaster - Sharon Washington ~n~TV Reporter - Brooke Alexander - -[CR04_11:CRED01] -~n~ ~n~ ~n~ ~n~Pedestrian Dialogue ~n~Una Cruickshank, Gregory Johnson, ~n~Sanford Santacroce, Ayana Osada - -[CR04_12:CRED01] -~n~ ~n~ ~n~ ~n~Pedestrian Voices ~n~Jamie Hector, Jackson Loo, ~n~Bruce MacVittie, Jeff Gurner, ~n~Jamie Hector, Andrea Kessler, - -[CR04_13:CRED01] -~n~ ~n~Lynne Horton, Phil Mikkelson, ~n~Koji Nonoyama, Devin Bennett, ~n~Jay Capozello, Mike Nathan, - -[CR04_14:CRED01] -~n~ ~n~Ethan Abeles, Lance Williams, ~n~Natalya Wilson, Jay Gladstone, ~n~Craig Blair, Dave Edwards, - -[CR04_15:CRED01] -~n~ ~n~Gregory Johnson, John Zurhellen, ~n~Blair Sadler, Georgia Sadler, ~n~Nicole Sadler, Judy Henderson, - -[CR04_16:CRED01] -~n~ ~n~Kim Graham, Kerry Shaw, ~n~Tamara Carrion, Franceska Clemens, ~n~Navid Khonsari, Noelle Sadler, - -[CR04_17:CRED01] -~n~ ~n~Nicholas Mongomery, Anthony Macbain, ~n~Ryan Rayhill, Josh Slater, ~n~Carmelo Gaeta, Hikari Yokoyama, - -[CR04_18:CRED01] -~n~ ~n~Chris Jobin, Michael Rothstein, ~n~Stacey Rachels, Jennifer Koontz, ~n~Dan Merrill, Ali Khonsari, - -[CR04_19:CRED01] -~n~ ~n~Ellen Rose, Chris Standal, ~n~Lorie Goodman, Neal Johnston, ~n~Son Garth, James Larsen, - -[CR04_20:CRED01] -~n~ ~n~Karl Weibel, Ramin Khonsari, ~n~Ed. Thomas Jr., Stanton Sargent, ~n~Oswald Greene, Audrey Amey, - -[CR04_21:CRED01] -~n~ ~n~Sanford Santacroce, Jeff Madrick, ~n~Ben Weaver, Andrea Kessler, ~n~CS Lee, Yoshi Amao, - -[CR04_22:CRED01] -~n~ ~n~ Jackson Loo, Martha Morrison, ~n~Sarah Bloodsworth, Adam Deher, ~n~Billy Gonzalez - -[CR04_23:CRED01] -~n~ ~n~ ~n~ ~n~Additional Motion Graphics ~n~Maryam Parwana - -[CR04_24:CRED01] -~n~ ~n~ ~n~ ~n~Dialogue Recording & Mixing ~n~Nicholas Montgomery - -[CR04_25:CRED01] -~n~ ~n~ ~n~ ~n~Foley Recording ~n~Bryan Scibinico - -[CR04_26:CRED01] -~n~ ~n~ ~n~ ~n~Foley recorded at Dig It Studios - -[CR04_27:CRED01] -~n~ ~n~ ~n~ ~n~Production Team ~n~Noelle Sadler, Eli Weissman, ~n~Kerry Shaw, John Zurhellen, ~n~Peter Adler, Anthony Carvalho, - -[CR04_28:CRED01] -~n~ ~n~Phil Poli, Jaesun Celebre, ~n~Franceska Clemens, Anthony Litton - -[CR04_29:CRED01] -~n~ ~n~ ~n~ ~n~Casting ~n~Judy Henderson and Associates - -[CR04_30:CRED01] -~n~Motion Capture recorded at Perspective Studios - -[CR05_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RADIO - -[CR05_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ Banter, Talk Radio, Commercials and Imaging written by ~n~Dan Houser and Lazlow - -[CR05_03:CRED01] -~n~ ~n~ ~n~ ~n~Production by ~n~Lazlow - -[CR05_04:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~LCFR - -[CR05_05:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Smith Harrison, Karen Saltus - -[CR05_06:CRED01] -~n~ ~n~ ~n~ ~n~Heartland Values with Nurse Bob ~n~Nurse Bob - Chuck Montgomery - -[CR05_07:CRED01] -~n~ ~n~ ~n~ ~n~Guests and Callers ~n~Ayana Osada, Nick Montgomery, ~n~Russell Lewis, Nick Born, ~n~Sean Macaluso, Kerry Shaw, - -[CR05_08:CRED01] -~n~ ~n~Chad Johnson, Craig Conner, ~n~Mary Elizabeth, Rob Cross, ~n~Josh Bitney - -[CR05_09:CRED01] -~n~ ~n~ ~n~ ~n~Electron Zone ~n~Steve - Ptolemy Slocum ~n~Bill - Michael Urichek - -[CR05_10:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Alice Saltzman, Jeremy Wheaton, ~n~Ryan Rayhill, Maine Anderson, ~n~Patton Oswalt, Wil Wheaton, ~n~Anthony Cumia, Madena Parwana - -[CR05_11:CRED01] -~n~ ~n~ ~n~ ~n~Breathing World ~n~Lee Chowder - Ashley Albert ~n~Crow - Gregg Martin - -[CR05_12:CRED01] -~n~ ~n~ ~n~ ~n~Coq 'O' Vin ~n~Richard Goblin - Mike Shapiro - -[CR05_13:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Ben Krech - -[CR05_14:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Franceska Clemins, Sarah Bloodsworth, ~n~Adam Deher, Martha Morrison, ~n~Carmelo Gaeta - -[CR05_15:CRED01] -~n~ ~n~ ~n~ ~n~Chatterbox ~n~Lazlow as himself - -[CR05_16:CRED01] -~n~ ~n~ ~n~ ~n~Callers ~n~Susan Lewis, Ben Weaver, ~n~Jacky Bam Bam, Ben Sparks, ~n~Deanna Moyer, Liezl Jacinto, - -[CR05_17:CRED01] -~n~ ~n~Joshua Batista, Gregg Opie Hughes, ~n~Sondra James, Elizabeth Satterwhite - -[CR06_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~HEAD RADIO - -[CR06_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Michael Hunt - Russ Mottla - -[CR06_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Jeff Berlin, Katelyn Hutchinson - -[CR06_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jeff Berlin - -[CR06_05:CRED01] -~n~ ~n~ ~n~ ~n~"Train" ~n~Conor & Jay ~n~Written by Craig Conner & Julie Wemyss ~n~Produced by Craig Conner ~n~Guitars by Jon McCavish ~n~Vocals by Julie Wemyss and Craig Conner - -[CR06_06:CRED01] -~n~ ~n~ ~n~ ~n~"The One For Me" ~n~Cloud Nineteen ~n~Written & Produced by ~n~Will Morton ~n~Additional Lyrics by Paul Mackie ~n~Guitars by Allan Walker & Chris Morton ~n~Lead Vocals by Raff ~n~Backing Vocals by Paul Mackie & Raff - -[CR06_07:CRED01] -~n~ ~n~ ~n~ ~n~"Take The Pain" ~n~Purser ~n~Written & Produced by ~n~Will Morton, Chris Morton ~n~Additional Lyrics by Paul Mackie ~n~Lead Vocals by Paul Mackie ~n~Additional Vocals by Will Morton - -[CR06_08:CRED01] -~n~ ~n~ ~n~ ~n~"Free Yourself" ~n~L-Marie featuring Raff ~n~Written & Produced by Craig Conner ~n~Vocals by L-Marie and Raff ~n~Backing Vocals by Craig Conner - -[CR06_09:CRED01] -~n~ ~n~ ~n~ ~n~"Drive" ~n~15 Ways ~n~Written & Produced by Colin Entwistle ~n~Vocals by Paul Mackie - -[CR06_10:CRED01] -~n~ ~n~ ~n~ ~n~"Welcome To The Real World" ~n~Rosco Stow ~n~Written & Produced by Craig Conner ~n~Guitars Written, Produced and Performed by Allan Walker ~n~Lead Vocals by Andy Dorrat ~n~Backing Vocals by Craig Conner, ~n~Anna Stuart and Kim Gurney - -[CR06_11:CRED01] -~n~ ~n~ ~n~ ~n~"Keep Dreaming" ~n~Vanilla Smoothie ~n~Written & Produced by ~n~Alastair MacGregor ~n~Guitars by Allan Walker ~n~Vocals by Fiona Stoddart - -[CR07_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~LIPS 106 - -[CR07_02:CRED01] -~n~ ~n~ ~n~ ~n~DJs ~n~Cliff - Ed McMann ~n~Andee - Shelley Miller - -[CR07_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Jonathan Hanst - -[CR07_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jonathan Hanst - -[CR07_05:CRED01] -~n~ ~n~ ~n~ ~n~"Funk In Time" ~n~Rudy La Fontaine ~n~Written & Produced by Jon McCavish ~n~Guitars by Julian Pais ~n~Vocals by Julian Pais - -[CR07_06:CRED01] -~n~ ~n~ ~n~ ~n~"Love Is The Feeling" ~n~Sawarr ~n~Written by Craig Conner & Julie Wemyss ~n~Produced by Craig Conner ~n~Vocals by Julie Wemyss - -[CR07_07:CRED01] -~n~ ~n~ ~n~ ~n~"Mine Until Monday" ~n~Sunshine Shine ~n~Written & Produced by Will Morton ~n~Additional Lyrics by Paul Mackie ~n~Vocals by Paul Mackie & Raff - -[CR07_08:CRED01] -~n~ ~n~ ~n~ ~n~"Get Down" ~n~Credit Check ~n~Written & Produced by ~n~Alastair MacGregor ~n~Guitars by Martyn Livingstone ~n~Bass by Andy Wilson ~n~Vocals by Louise Ferrier - -[CR07_09:CRED01] -~n~ ~n~ ~n~ ~n~"Tonight" ~n~Cool Timers ~n~Written & Produced by Craig Conner ~n~Vocals by Julie Wemyss - -[CR07_10:CRED01] -~n~ ~n~ ~n~ ~n~"Bassmatic" ~n~Nina Barry ~n~Written & Produced by Jon McCavish ~n~Vocals by Riz Maslen - -[CR07_11:CRED01] -~n~ ~n~ ~n~ ~n~"Into Something (C'mon Get Down)" ~n~The Jackstars ~n~Written & Produced By ~n~Craig Conner ~n~Vocals by Lucie Danti-Juan ~n~Backing vocals by ~n~Kevin Stacey & Craig Conner - -[CR08_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~DOUBLE CLEF FM - -[CR08_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Sergio Boccino - Robert Blumenfeld - -[CR08_03:CRED01] -~n~ ~n~ ~n~ ~n~Caller ~n~Gerald Cosgrove - -[CR08_04:CRED01] -~n~ ~n~ ~n~ ~n~"Il Trovatore: Anvil Chorus" ~n~Composed by Giuseppe Verdi ~n~Performed by ~n~Nuremberg Symphonic Orchestra ~n~& Munich State Opera Choir ~n~Courtesy of Point Classics, LLC - -[CR08_05:CRED01] -~n~ ~n~ ~n~ ~n~"Il Trovatore: Tacea la notte placida" ~n~Composed by Giuseppe Verdi ~n~Performed by ~n~Nuremberg Symphonic Orchestra & ~n~Munich State Opera Choir ~n~(Eva Illes, Soprano) ~n~Courtesy of Point Classics, LLC - -[CR08_06:CRED01] -~n~ ~n~ ~n~ ~n~"Nabucco: Chorus of the Hebrew Slaves" ~n~Composed by Giuseppe Verdi ~n~Performed by Philharmonia Slavonica ~n~Courtesy of Point Classics, LLC - -[CR08_07:CRED01] -~n~ ~n~ ~n~ ~n~"Così fan tutte: È amore un ladroncello" ~n~Composed by Wolfgang Amadeus Mozart ~n~Performed by ~n~Bratislava Opera Soloists, ~n~Choir and Orchestra ~n~(Ida Kirilova "Dorabella") ~n~Courtesy of Point Classics, LLC - -[CR08_08:CRED01] -~n~ ~n~ ~n~ ~n~"Marriage of Figaro: Overture" ~n~Composed by Wolfgang Amadeus Mozart ~n~Performed by ~n~London Philharmonic Orchestra ~n~Courtesy of Point Classics, LLC - -[CR08_09:CRED01] -~n~ ~n~ ~n~ ~n~"I Pagliacci: Vesti la giubba" ~n~Composed by Ruggiero Leoncavallo ~n~Performed by ~n~Nuremberg Symphonic Orchestra ~n~(José Maria Perez, Tenor) ~n~Courtesy of Point Classics, LLC - -[CR09_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RISE FM - -[CR09_02:CRED01] -~n~ ~n~ ~n~ ~n~Engineered by Mike Callaghan - -[CR09_03:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Boy Sanchez - Oliver Vaquer - -[CR09_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~DJ Andre, Lupus Thunder, ~n~Andi Hanley, Mat Ckillz, ~n~Couzin Ed, Lazlow, - -[CR09_05:CRED01] -~n~ ~n~Terry Donovan, Bill Brissette, ~n~Juan Aller, Ed Andrews, ~n~Xeni Jardin, Matthew Orr, ~n~Jeff Berlin - -[CR09_06:CRED01] -~n~ ~n~ ~n~ ~n~"Sing It Back ~n~(Boris Musical Mix)" ~n~Moloko ~n~Written by M. Brydon, R. Murphy ~n~Published by Chrysalis Music (ASCAP) ~n~Remix and Additional Production by ~n~Boris Dlugosch ~n~(p) + © 1998 The Echo Label ~n~Courtesy of Chrysalis Music Limited - -[CR09_07:CRED01] -~n~ ~n~ ~n~ ~n~"Free" ~n~Ultra Nate ~n~Written by U. Nate, L. Springsteen, ~n~J. Ciafone ~n~Published by Warner/ Chappell Music/ BMG Music ~n~(p) + © 1997 Strictly Rhythm Records LLC ~n~Courtesy of Warner Strategic Marketing - -[CR09_08:CRED01] -~n~ ~n~ ~n~ ~n~"I Believe" ~n~Happy Clappers ~n~Written by C. Scott, G. Ripley, M. Knotts, M. Topham ~n~Published by All Boys Music Ltd ~n~(p) + © 1994 C J Scott Productions ~n~Courtesy of C J Scott Productions - -[CR09_09:CRED01] -~n~ ~n~ ~n~ ~n~"House Music" ~n~Eddie Amador ~n~Written by Eddie Amador ~n~Published by ~n~Deep Dish Music ~n~(p) + © 1998 Yoshitoshi Records ~n~Courtesy of ~n~Deep Dish Recordings, Inc. ~n~by arrangement with ~n~Nasseri Music Business Solutions - -[CR09_10:CRED01] -~n~ ~n~ ~n~ ~n~"Feel What You Want" ~n~Kristine W ~n~Written by R. Dougan, R. Armstrong, ~n~K. Weitz ~n~Published by BMG Music/Weitz House Publishing (ASCAP)/ EMI Music Publishing ~n~(p) + © 1996 RCA/ BMG ~n~Courtesy of Sony BMG Entertainment - -[CR09_11:CRED01] -~n~ ~n~ ~n~ ~n~"Hideaway ~n~(Deep Dish Vocal Remix)" ~n~De'Lacy ~n~Written by K. Hedge, J. Milan ~n~Published by ~n~Warner-Tamerlane Publishing Corp ~n~Remix and Additional Production by ~n~Deep Dish ~n~(p) 1995 Easy Street Recordings Inc ~n~© 1998 Kickin Music Ltd ~n~Courtesy of Easy Street Recordings Inc. and Slip n' Slide Records - -[CR09_12:CRED01] -~n~ ~n~ ~n~ ~n~"Spin Spin Sugar ~n~(Armand's Dark Garage Mix)" ~n~Sneaker Pimps ~n~Written by I. Pickering, L. Coverdale Howe, C. Corner ~n~Remix and Additional Production by ~n~Armand Van Helden ~n~Published by BMG Songs, Inc ~n~(p) + © 1997 Clean Up Records Ltd ~n~Courtesy of EMI Music / ~n~One Little Indian, Ltd - -[CR09_13:CRED01] -~n~ ~n~ ~n~ ~n~"Plastic Dreams" ~n~Jaydee ~n~Written by R. Albers ~n~Published by TBM Holland ~n~(p) 1992 R & S Records ~n~© Robin Albers ~n~Courtesy of Robin "Jaydee" Albers - -[CR09_14:CRED01] -~n~ ~n~ ~n~ ~n~"Altered States" ~n~Ron Trent ~n~Written by R. Trent ~n~Published by ~n~High Fashion Music/ Nanada Music ~n~(p) + © 1993 Warehouse ~n~Djax-Up Beats ~n~Courtesy of High Fashion Music/ ~n~Djax-Up Beats - -[CR09_15:CRED01] -~n~ ~n~ ~n~ ~n~"There Will Come A Day (Half Tab Dub)" ~n~The Absolute featuring Suzanne Palmer ~n~Written by M. Pichiotti, C.J. Snider ~n~Published by Much Noyse Music/ ~n~Hoobini Music (ASCAP) ~n~(p) + © 1995 Mark Productions, Inc ~n~Courtesy of Mark Productions, Inc - -[CR09_16:CRED01] -~n~ ~n~ ~n~ ~n~"Positive Education" ~n~Slam ~n~Written by S. McMillan, O. Meikle, ~n~G. Gibbons, J. Muotone ~n~Published by EMI Music Publishing ~n~(p) + © 1997 Soma Recordings Ltd ~n~Courtesy of Soma Recordings Ltd - -[CR09_17:CRED01] -~n~ ~n~ ~n~ ~n~"Flash" ~n~Green Velvet ~n~Written by C. Jones ~n~Published by Curtis A. Jones Music (ASCAP) ~n~(p) 1995 Relief Records ~n~© 2000 Warner Bros. Records and N.E.W.S. Records and Relief Records ~n~Courtesy of Warner Strategic Marketing, N.E.W.S. Records, Relief Records - -[CR09_18:CRED01] -~n~ ~n~ ~n~ ~n~"Circus Bells (Hardfloor Remix)" ~n~Robert Armani ~n~Written by R. Armani ~n~Published by ~n~High Fashion Music/ Nanada Music ~n~(p) + © 1993 Warehouse/ ~n~Djax-Up Beats ~n~Courtesy of High Fashion Music/ ~n~Djax-Up Beats - -[CR09_19:CRED01] -~n~ ~n~ ~n~ ~n~"Higher State Of Consciousness" ~n~Wink ~n~Written by J. Wink ~n~Published by Strictly Rhythm Publishing, Inc. (ASCAP) / Warner/Chappell Music / Wink Inc. (ASCAP) / EMI Music Publishing ~n~(p) + © 1995 Strictly Rhythm Records LLC ~n~Courtesy of Warner Strategic Marketing - -[CR10_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~RADIO DEL MUNDO - -[CR10_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Panjit Gavaskar - Hajaz Akram - -[CR10_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Jessica Wachsman - -[CR10_04:CRED01] -~n~ ~n~ ~n~ ~n~"Raghupati (Folk Tune)" ~n~Ananda Shankar ~n~Arranged by A. Shankar, Lewinson, Hassilev ~n~Published by Warner Chappell Inc ~n~(p) + © 1970 Reprise Records for the U.S. and WEA International Inc ~n~Courtesy of Warner Strategic Marketing - -[CR10_05:CRED01] -~n~ ~n~ ~n~ ~n~"Dum Maro Dum" ~n~Asha Bhosle ~n~Written by RD Burman, Anand Bakshi ~n~Published by Saregama India Ltd ~n~(p) + © 1971 Saregama India Ltd ~n~Courtesy of Saregama India Ltd - -[CR10_06:CRED01] -~n~ ~n~ ~n~ ~n~"Neeve Nanna (Only You Were Mine)" ~n~Vijaya Anand ~n~Written by Vijaya Anand ~n~Published by Shake Boom! (ASCAP)/ ~n~Luaka Bop Inc ~n~(p) 1988 Lahari/Audiovision ~n~© 1992 Sire Records Company ~n~Courtesy of ~n~Luaka Bop Records - -[CR10_07:CRED01] -~n~ ~n~ ~n~ ~n~"Kidda" ~n~Natacha Atlas ~n~Written by N. Atlas, J. Reynolds, J. Adams ~n~Published by Warner Chappell Music Ltd ~n~(p) + © 1997 Nation Records Ltd/ ~n~Beggars Banquet Records Ltd ~n~Courtesy of Nation Records Ltd/ ~n~Beggars Banquet Records Ltd - -[CR10_08:CRED01] -~n~ ~n~ ~n~ ~n~"Hebeena Hebeena" ~n~Farid El Atrache ~n~Written by Barakat, Atrache ~n~Published by Voices Of Lebanon ~n~(p) + © 1974 Voices Of Lebanon ~n~Courtesy of EMI Music/ EMI Music Arabia - -[CR10_09:CRED01] -~n~ ~n~ ~n~ ~n~"Aini Bet Ref" ~n~Ahmed Mneimneh ~n~Written by A. Alishaan ~n~Published by D. Dersahakian (ASCAP) ~n~(p) + © Voice of Stars & ~n~Lys Records ~n~Courtesy of Voice of Stars & ~n~Lys Records - -[CR10_10:CRED01] -~n~ ~n~ ~n~ ~n~"Im Nin'Alu" ~n~Ofra Haza ~n~Traditional, Arranged by I. Ashdot, B. Nagari ~n~Published by Blue Lake Music ~n~ (p) + © 1988 Sire Records Company ~n~Courtesy of Warner Strategic Marketing - -[CR10_11:CRED01] -~n~ ~n~ ~n~ ~n~"Ballaa Tsoubou Hal Kahwa" ~n~Samira Tawfic ~n~Written by R. Al Khylani, J. Al A'ss ~n~Published by Copyright Control ~n~(p) + © Voices Of Lebanon ~n~Courtesy of EMI Music/ EMI Music Arabia - -[CR11_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~K-JAH - -[CR11_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Natalee Walsh Davis - Pascale Armand - -[CR11_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Karl Weibel, Pat McKay - -[CR11_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jay Wright Productions - -[CR11_05:CRED01] -~n~ ~n~ ~n~ ~n~"Pick a Sound" ~n~Selah Collins, Ruddy Ranks, Redeye ~n~Written by S. Collins, H. Burke, ~n~E. Donaldson ~n~Published by Copyright Control/ MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR11_06:CRED01] -~n~ ~n~ ~n~ ~n~"What a Wonderful Feeling" ~n~Errol Bellot, Ruddy Ranks, Redeye ~n~Written by E. Bellot, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR11_07:CRED01] -~n~ "Watch How the People Dancing" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by K. Wright ~n~Published by Jetstar ~n~Courtesy of Honest Jons Records - -[CR11_08:CRED01] -~n~ ~n~ ~n~ ~n~"Lean Boot" ~n~Richie Davis, Ruddy Ranks, Redeye ~n~Written by R. Davis, H. Burke, ~n~E. Donaldson ~n~Published by Westbury Music/ MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR11_09:CRED01] -~n~ ~n~ ~n~ ~n~"Ready For the Dancehall Tonight" ~n~Peter Bouncer, Ruddy Ranks, Redeye ~n~Written by Peter McKenzie, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR11_10:CRED01] -~n~ ~n~ ~n~ ~n~"You Ha Fe Cool" ~n~Richie Davis, Ruddy Ranks, Redeye ~n~Written by R. Davis, H. Burke, ~n~E. Donaldson. ~n~Published by Westbury Music/MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR11_11:CRED01] -~n~ ~n~ ~n~ ~n~"Ring My Number" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by Kenneth Wright, H. Burke, ~n~E. Donaldson. ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR11_12:CRED01] -~n~ ~n~ ~n~ ~n~"Run Come Call Me" ~n~Kenny Knots, Ruddy Ranks, Redeye ~n~Written by Kenneth Wright, H. Burke, ~n~E. Donaldson ~n~Published by MCPS ~n~(p) 1988 by R. Fearon ~n~Courtesy of Honest Jons Records - -[CR12_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~THE LIBERTY JAM - -[CR12_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~DJ Clue as himself - -[CR12_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voices ~n~Jay Wright, Tom Yankowski, Chris Mercado, Vanessa Grullon - -[CR12_04:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Production ~n~Jay Wright Productions - -[CR12_05:CRED01] -~n~ ~n~ ~n~ ~n~"All I Need" ~n~Method Man ~n~Written by C. Smith, R. Diggs ~n~Published by Sony BMG Music ~n~(p) + © 1994 Def Jam Recordings ~n~Courtesy of Def Jam Recordings/ UME - -[CR12_06:CRED01] -~n~ ~n~ ~n~ ~n~"Shook Ones Pt. II" ~n~Mobb Deep ~n~Written by A. Johnson, K. Muchita ~n~Published by ~n~BMG Songs Inc. (ASCAP) ~n~(p) + © 1995 BMG Music ~n~Courtesy of RCA Records by arrangement with Sony BMG Ent - -[CR12_07:CRED01] -~n~ ~n~ ~n~ ~n~"Incarcerated Scarface" ~n~Raekwon ~n~Written by R. Diggs, C. Woods, A. Tilman ~n~Published by ~n~Careers-BMG Music Publishing Inc./ ~n~Wu Tang Publishing (BMI)/ ~n~Bridgeport Music ~n~(p) + © 1995 BMG Music - -[CR12_08:CRED01] -Courtesy of RCA Records by arrangement with Sony BMG Ent ~n~This track contains a sample of "You're Getting A Little Too Smart" as performed by The Detroit Emeralds. Courtesy of Westbound Records. Used by permission. All rights reserved - -[CR12_09:CRED01] -~n~ ~n~ ~n~ ~n~"N.O.R.E." ~n~Noreaga ~n~Written by V. Santiago, J. Olivier, ~n~S. Barnes ~n~Published by Suite 1202 Music/ Jose Luis Gotcha Music (BMI)/ Slamuwell Productions/ Jelly's Jam LLC (ASCAP)/ ~n~12 & Under Music/ - -[CR12_10:CRED01] -Jumping Bean Songs LLC (BMI) ~n~(p) + © 1998 Penalty Recordings ~n~Courtesy of Warner Strategic Marketing - -[CR12_11:CRED01] -~n~ ~n~ ~n~ ~n~"Shut 'Em Down (Remix)" ~n~Onyx featuring Noreaga & Big Pun ~n~Written by F. Scruggs, K. Jones, T. Taylor, E. Hinson, E. Simmons ~n~Published by Universal Music/ ~n~Let Me Show You Music/ ~n~Jelly Jams Music/ - -[CR12_12:CRED01] -III Posse Music/ Ill Hill Billy'z Music/ Warner-Tamerlane Music ~n~(p) + © 1998 Rush Associated Labels Recordings ~n~Courtesy of Universal Music Enterprises - -[CR12_13:CRED01] -~n~ ~n~ ~n~ ~n~"Beware" ~n~Big Pun ~n~Written by C. Rios, J. Tineo ~n~Published by Let Me Show You Music/ ~n~Joe Cartegena Music (ASCAP), ~n~Administered by Jelly Jams Music (BMI)/ ~n~P.H.D. Music (ASCAP) - -[CR12_14:CRED01] -(p) + © 1998 Loud Records LLC ~n~Courtesy of Columbia Records by arrangement with Sony BMG Ent - -[CR12_15:CRED01] -~n~ ~n~ ~n~ ~n~"Twinz (Deep Cover 98)" ~n~Big Pun ~n~Written by C. Rios, J. Cartegena, ~n~C. Brodus, A. Young, C. Wolfe ~n~Published by Let Me Show You Music/ ~n~Joe Cartegena Music (ASCAP)/ ~n~Jelly Jams Music (BMI)/ ~n~Sony Tunes Inc. (ASCAP) - -[CR12_16:CRED01] -~n~(p) + © 1998 Loud Records LLC ~n~Courtesy of Columbia Records by arrangement with Sony BMG Ent ~n~This track contains a sample of "Deep Cover" as performed by Dr. Dre. Courtesy of Solar Records. Used by permission. All rights reserved - -[CR12_17:CRED01] -~n~ ~n~ ~n~ ~n~"Get At Me Dog" ~n~DMX featuring Sheek of The Lox ~n~Written by E. Simmons, D. Blackman, ~n~A. Fields, S. Taylor ~n~Published by Universal Music Publishing/ EMI April Music/ ~n~Sony ATV Tunes - -[CR12_18:CRED01] -~n~(p) + © 1998 Rush Associated Labels Recordings ~n~Courtesy of Universal Music Enterprises - -[CR12_19:CRED01] -~n~ ~n~ ~n~ ~n~"Ruff Ryders Anthem (Remix)" ~n~DMX featuring DJ Clue, Jadakiss, Styles, Drag-On & Eve ~n~Written by J. Phillips, M.J. Smalls, E. Shaw, K. Ifill, E. Simmons, K. Dean, E. Jeffers ~n~Published by Universal Music Publishing/ EMI Music Publishing - -[CR12_20:CRED01] -(p) + © 1998 Roc-a-Fella Records ~n~Courtesy of Universal Music Enterprises - -[CR12_21:CRED01] -~n~ ~n~ ~n~ ~n~"Do What You Feel" ~n~Redman featuring Method Man ~n~Written by P. Michael, R. Noble, C. Smith ~n~Published by Careers BMG/ Sony ATV Tunes/ Famous Music ~n~(p) + © 1996 Def Jam ~n~Courtesy of Universal Music Enterprises - -[CR12_22:CRED01] -~n~ ~n~ ~n~ ~n~"Chain Gang Freestyle" ~n~The Lox & Black Rob ~n~Written by Frierson, Phillips, Styles, Jacobs, Ross, Shaw ~n~Published by EMI Music Publishing ~n~Courtesy of Bad Boy Records - -[CR12_23:CRED01] -~n~ ~n~ ~n~ ~n~"Chest2chest Freestyle" ~n~The Lox ~n~Written by Phillips, Styles, Jacobs, Shaw, Barnes, Lemay, Montgomery ~n~Published by Taggie Music (BMI)/ ~n~Universal Polygram Int'l. (ASCAP)/ ~n~EMI Music Publishing ~n~Courtesy of Bad Boy Records - -[CR12_24:CRED01] -This track contains a sample of "Next Level" as performed by Showbiz & AG. Courtesy of Universal Music Enterprises. Used by permission. All rights reserved - -[CR13_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~MSX 98 - -[CR13_02:CRED01] -~n~ ~n~ ~n~ ~n~MC ~n~Codebreaker as himself - -[CR13_03:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Timecode - -[CR13_04:CRED01] -~n~ ~n~ ~n~ ~n~Station Production ~n~Timecode - -[CR13_05:CRED01] -~n~ ~n~ ~n~ ~n~"Renegade Snares" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1993 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_06:CRED01] -~n~ ~n~ ~n~ ~n~"Terrorist" ~n~Renegade ~n~Written, Produced & Engineered by ~n~A. Dookith ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_07:CRED01] -~n~ ~n~ ~n~ ~n~"Finest Illusion (Legal Mix)" ~n~Foul Play ~n~Written, Produced & Engineered by ~n~J. Morrow, S. Bradshaw, ~n~S. Gurley ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1993 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_08:CRED01] -~n~ ~n~ ~n~ ~n~"Living For the Future (FBD Project Remix)" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_09:CRED01] -~n~ ~n~ ~n~ ~n~"Stay Calm (Foul Play Remix)" ~n~DJ Pulse ~n~Written, Produced & Engineered by ~n~A. Brown ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_10:CRED01] -~n~ ~n~ ~n~ ~n~"Disturbance (Tango Remix)" ~n~Hyper-On Experience ~n~Written, Produced & Engineered by ~n~A. Banks, D. Demierre ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_11:CRED01] -~n~ ~n~ ~n~ ~n~"Cold Fresh Air" ~n~Higher Sense ~n~Written, Produced & Engineered by ~n~A. Miles, DJ Rhythm ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_12:CRED01] -~n~ ~n~ ~n~ ~n~"Living For the Future" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_13:CRED01] -~n~ ~n~ ~n~ ~n~"Thru The Vibe (2 on 1 Mix)" ~n~Omni Trio ~n~Written, Produced & Engineered by ~n~R. Haigh ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_14:CRED01] -~n~ ~n~ ~n~ ~n~"The Helicopter Tune" ~n~Deep Blue ~n~Written, Produced & Engineered by ~n~S. O'Keefe ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR13_15:CRED01] -~n~ ~n~ ~n~ ~n~"Dred Bass" ~n~Dead Dred ~n~Written, Produced & Engineered by ~n~W. Smith, L. Smith ~n~Published by Moving Shadow Music Ltd ~n~(p) + © 1994 Moving Shadow Ltd ~n~Courtesy of Moving Shadow Ltd - -[CR14_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~FLASHBACK FM - -[CR14_02:CRED01] -~n~ ~n~ ~n~ ~n~DJ ~n~Reni Wassulmaier - Barbara Rosenblatt - -[CR14_03:CRED01] -~n~ ~n~ ~n~ ~n~Imaging Voice ~n~Mike Shapiro - -[CR14_04:CRED01] -~n~ ~n~ ~n~ ~n~"First Hand Experience ~n~In Second Hand Love" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Giorgio Moroder ~n~Courtesy of Giorgio Moroder - -[CR14_05:CRED01] -~n~ ~n~ ~n~ ~n~"I Wanna Rock You" ~n~Giorgio ~n~Written by G. Moroder, H. Faltermeyer, ~n~K. Forsey ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1979 Giorgio Moroder ~n~Courtesy of Giorgio Moroder - -[CR14_06:CRED01] -~n~ ~n~ ~n~ ~n~"E=MC2" ~n~Giorgio ~n~Written by G. Moroder, H. Faltermeyer, ~n~P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1979 Giorgio Moroder ~n~Courtesy of Giorgio Moroder - -[CR14_07:CRED01] -~n~ ~n~ ~n~ ~n~"Chase" ~n~Giorgio Moroder ~n~Written by G. Moroder ~n~Published by Warner/ Chappell Music ~n~(p) + © 1978 Casablanca Films/ ~n~Columbia Pictures ~n~Courtesy of Sony Pictures Entertainment - -[CR14_08:CRED01] -~n~ ~n~ ~n~ ~n~"I'm Left, You're Right, She's Gone" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Giorgio Moroder ~n~Courtesy of Giorgio Moroder - -[CR14_09:CRED01] -~n~ ~n~ ~n~ ~n~"From Here To Eternity" ~n~Giorgio ~n~Written by G. Moroder, P. Bellotte ~n~Published by WB Music Corp. (ASCAP) ~n~(p) + © 1977 Casablanca Records ~n~Courtesy of Universal Music Enterprises - -[CR15_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~COMMERCIAL VOICES - -[CR15_02:CRED01] -~n~ ~n~ ~n~ ~n~Alex Anthony, Anouchka Benson, ~n~Audrey Amey, Bill Smith, ~n~Billy Gonzalez, Brian Thomas, - -[CR15_03:CRED01] -~n~ ~n~Chris Jobin, Chris Silvestro, ~n~Craig Blair, Dan Houser, ~n~Dan Merrill, Ed Thomas, - -[CR15_04:CRED01] -~n~ ~n~Ethan Abeles, Garth Johnston, ~n~Gregg Martin, Gregory Johnson, ~n~Hikari Yokoyama, James Ferrante, - -[CR15_05:CRED01] -~n~ ~n~James Larson, Jay Capozello, ~n~Jayson Gladstone, Jeff Berlin, ~n~Jen Sweeney, Jessica Wachsman, - -[CR15_06:CRED01] -~n~ ~n~ JJ Adler, Jonathan Hanst, ~n~Joshua Batista, Karen Saltus, ~n~Koji Nonoyami, Lance Williams, - -[CR15_07:CRED01] -~n~ ~n~Lazlow, Lynne Horton, ~n~Michael Nathan, Mike Ferrante Jr., ~n~Chris Ferrante, Mike Shapiro, - -[CR15_08:CRED01] -~n~ ~n~Natalya Wilson, Noelle Sadler, ~n~Phil Mikkelson, Ron Reeve, ~n~Smith Harrison, Stacy Rachels, - -[CR15_09:CRED01] -~n~ ~n~ Steve Carlesi, Julie Wemyss, ~n~Kim Gurney - -[CR16_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~CUTSCENE MUSIC - -[CR16_02:CRED01] -~n~ ~n~ ~n~ ~n~"Japanese Geisha" ~n~Sonia Slany ~n~Written by Sonia Slany ~n~Published by West One Music ~n~Courtesy of APM Music, LLC - -[CR16_03:CRED01] -~n~ ~n~ ~n~ ~n~"The Heist" ~n~Bugz in the Attic ~n~Written by K. Tatham ~n~Published by Copyright Control ~n~(p) 2005 Bugz In The Attic ~n~Courtesy of Bugz In The Attic ~n~www.bugzintheattic.co.uk - -[CR16_04:CRED01] -~n~ ~n~ ~n~ ~n~"A Dark March" ~n~Danger Mouse ~n~Written by Danger Mouse ~n~Published by ~n~Underground Animals (ASCAP) - -[CR17_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR NYC PUBLISHING TEAM - -[CR17_02:CRED01] -~n~ ~n~ ~n~ ~n~Terry Donovan, Jenefer Gross, ~n~Jennifer Kolbe, Devin Winterbottom, ~n~Adam Tedman, Michael Elkind, - -[CR17_03:CRED01] -~n~ ~n~Paul Yeates, Hosi Simon, ~n~Daniel Einzig, Marlene Yamaguchi, ~n~Gauri Khindaria, Stanton Sarjeant, - -[CR17_04:CRED01] -~n~ ~n~Jordan Chew, Ryan Rayhill, ~n~Devin Bennett, Todd Zuniga, ~n~Thomas O'Donnell, Maria Tabia, - -[CR17_05:CRED01] -~n~ ~n~Anthony Carvalho, Lyonel Tollemache, ~n~John Notarfrancesco, Jerry Luna, ~n~Stuart Petri, Stephen Walsh, - -[CR17_06:CRED01] -~n~ ~n~Michael Carnevale, Andrea Borzuku, ~n~John Schuhmann, Alice Chuang, ~n~Mike Torok, Mayumi Kobayashi, - -[CR17_07:CRED01] -~n~ ~n~Elizabeth Satterwhite, Bruce Dugan, ~n~Eli Weissman, Phil Poli, ~n~Jaesun Celebre, Russell Lewis, - -[CR17_08:CRED01] -~n~ ~n~Sean Mackenzie, Megan Henretta, ~n~Angus Wong, Kristine Severson - -[CR17_09:CRED01] -~n~ ~n~ ~n~ ~n~Cover Art ~n~Steven Olds, Stephen Bliss, ~n~Anthony Macbain - -[CR17_10:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LONDON PD - -[CR17_11:CRED01] -~n~ ~n~ ~n~ ~n~ Chris Madgwick, Chris Wood, ~n~Daimion Pinnock, David McCarthy, ~n~Graham Ainsley, Jurgen Mol, - -[CR17_12:CRED01] -~n~ ~n~ Laura Battistuzzi, Maike Köhler, ~n~Shino Hori, Lucien King - -[CR18_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ROCKSTAR LINCOLN - -[CR18_02:CRED01] -~n~ ~n~ ~n~ ~n~QA Manager ~n~Mark Lloyd - -[CR18_03:CRED01] -~n~ ~n~ ~n~ ~n~Deputy QA Manager ~n~Tim Bates - -[CR18_04:CRED01] -~n~ ~n~ ~n~ ~n~QA Supervisor ~n~Kevin Hobson - -[CR18_05:CRED01] -~n~ ~n~ ~n~ ~n~Lead Tester ~n~Eddie Gibson ~n~ ~n~ ~n~ ~n~Secondary Lead Tester ~n~Mike Bennett - -[CR18_06:CRED01] -~n~ ~n~ ~n~ ~n~Testers ~n~Jonathan Stones, Mike Emeny, ~n~Andy Mason, Lee Johnson, ~n~Carl Young, Matthew Lunnon, ~n~Dan Goddard, Steve McGagh, ~n~Craig Reeve, Joby Luckett - -[CR18_07:CRED01] -~n~ ~n~ ~n~ ~n~Localization Team ~n~ ~n~ ~n~ ~n~Localization Supervisor ~n~Chris Welsh - -[CR18_08:CRED01] -~n~ ~n~ ~n~ ~n~Testers ~n~Antoine Cabrol, Dominic Garcia, ~n~Paolo Ceccotti, Ferruccio Cinquemani, ~n~Nicolas Klimoff, Jesús Pérez Rosales ~n~ ~n~ ~n~ ~n~IT Support ~n~Nick McVey - -[CR19_01:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~SPECIAL THANKS - -[CR19_02:CRED01] -~n~ ~n~ ~n~ ~n~Scooter, Ross Wallace, ~n~Steve Taylor, Kevin Wong, ~n~Kevin Bolt, John Haime, - -[CR19_03:CRED01] -~n~ ~n~Dave Watson, Thomas French, ~n~James Arthur, Martin Connor, ~n~Brendon McDonald, Julie Wemyss, - -[CR19_04:CRED01] -~n~ ~n~Raff Crolla, James Duffy, ~n~Kim Gurney, Andrew Ness, ~n~Andy Brooks (Gearbox), Alan Mcgregor, - -[CR19_05:CRED01] -~n~ ~n~Chris McCallum, Fred, Narns, ~n~Alan, Taruki, Red, ~n~Big Foot, Rita Liberator, ~n~Elliot Torres - -[CR19_06:CRED01] -~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~THANKS - -[CR19_07:CRED01] -~n~ ~n~ ~n~ ~n~Deborah Mannis-Gardner ~n~and Mark Schwartz. ~n~Randy Acker, Karen Adams, ~n~Mark Ainley, Robin Albers, - -[CR19_08:CRED01] -~n~ ~n~Duncan Baker, Armen Boladian, ~n~Tanya Bridges, Richard Brown, ~n~Matt Brookman, Elena Byington, - -[CR19_09:CRED01] -~n~ ~n~Ed Butts, Rob Cairns, ~n~Mike Callaghan, Joseph Carlone, ~n~Kevin Carson, Jason Chin, - -[CR19_10:CRED01] -~n~ ~n~Allison Cipris, Alimah Deen, ~n~James Ellis, Helen English, ~n~Nasko Fejza, Scott Gardner, - -[CR19_11:CRED01] -~n~ ~n~Jochem Gerrits, ~n~Laurie Goldstein Thomas Golubic, ~n~Nick Guarino, Jon Handle, ~n~Millie Hysu, Robert Jo, - -[CR19_12:CRED01] -~n~ ~n~Paul Johannes, Gavin Johnson, ~n~Curtis A. Jones, Jennifer Justice, ~n~Rod Kotler, Diana La Pointe, - -[CR19_13:CRED01] -~n~ ~n~Michael Lau, Jim Long, ~n~Alex De Maegd, John Massa, ~n~Kendall Minter, Steve Morgan, - -[CR19_14:CRED01] -~n~ ~n~Giorgio Moroder, Suzanne Moss, ~n~Melissa Munana, Kirin Murphy, ~n~Kurosh Nasseri, - -[CR19_15:CRED01] -~n~ ~n~Gwen Niles Sean Ogden ~n~aka DJ Nightshade, ~n~Robin Orlowski, Jonathan Palmer, ~n~Tanvi Patel, Jane Peterer, - -[CR19_16:CRED01] -~n~ ~n~Mark Picchiotti, Rob Playford, ~n~Dan Quan, R. Ramnarayan, ~n~Mary Beth Roberts, ~n~Virgil Roberts, Lindsay Rodman, - -[CR19_17:CRED01] -~n~ ~n~Jim Romano, Craig Roseberry, ~n~Gerry Rosenblatt, RZA, ~n~Ali Samii, Alan Scholefield, - -[CR19_18:CRED01] -~n~ ~n~Christopher Scott, Suzi Scott, ~n~Fredro Scruggs, Jennefer Showalter, ~n~Alan Skiena, Saskia Slegers, - -[CR19_19:CRED01] -~n~ ~n~Fran Spero, Lem Springsteen, ~n~David Steel, Jane Ventom, ~n~Christian Wiseman, Debi Wylde, - -[CR19_20:CRED01] -~n~ ~n~Donna Young, Richie Zito - -{ reLCS - new strings } -{ main menu } - -[FEM_MM] -INICIO - -[FEP_STG] -Iniciar juego - -[FEP_OPT] -Opciones - -[FEP_QUI] -Salir - -[FET_QG] -SALIR - -[FEQ_SRW] -¿Seguro que quieres salir? - -{ options } - -[FET_OPT] -OPCIONES - -[FET_GRA] -Configuración de gráficos - -[FET_PS] -Configuración de hugador - -[FET_MIG] -IZQUIERDA, DERECHA, RUEDA DEL RATÓN PARA AJUSTAR - -[FET_HRD] -SE HA RESTAURADO LA CONFIGURACIÓN PREDETERMINADA - -[FET_APP] -APLICAR - -{ controls } - -[FET_CTL] -Configuración de controles - -[FET_CTI] -Controles clásicos - -[FET_STI] -Controles estándar - -[FEC_RED] -Redefinir controles - -[FEC_MOUSE] -Configuración del ratón - -[FET_DEF] -Restaurar valores por defecto - -{ mouse settings } - -[FEC_MSH] -SENSIBILIDAD DEL RATÓN: - -[FEC_IVV] -INVERTIR VERTICALIDAD RATÓN: - -[FET_MST] -CONDUCIR CON EL RATÓN: - -{ audio } - -[FEA_NM3] -NO HAY ARCHIVOS MP3 - -[FEA_3DH] -HARDWARE DE SONIDO: +[ICC1_O] +¿Qué pasa contigo? [FEA_2SP] 2 altavoces -[FET_DAM] -MODELADO ACÚSTICO DINÁMICO: - [FEA_4SP] Más de 2 altavoces [FEA_EAR] Auriculares -[FEA_MPB] -SUBIR VOLUMEN DE MP3: +[FEA_NAH] +NO HAY HARDWARE DE AUDIO -[FEA_SPK] -CONFIGURACIÓN DE ALTAVOCES: - -[FEA_ADP] -DETECTAR AUTOMÁTICAMENTE - -[FET_RSC] -HARDAWARE NO DISPONIBLE. RESTAURADO AJUSTE ORIGINAL - -{ display } - -[FEM_LOD] -DISTANCIA DE DIBUJADO: - -[FEM_CSB] -BORDES EN CINEMÁTICAS: - -[FEC_FRC] -CÁMARA LIBRE: - -{ graphics } - -[FED_RES] -RESOLUCIÓN DE PANTALLA: - -[FED_FLS] -PANTALLA COMPLETA - -[FED_WND] -VENTANA - -[FEM_VSC] -SINCRONIZAR IMAGEN: - -[FEM_FRM] -LIMITADOR DE FOTOGRAMAS: - -[FED_AAS] -SUAVIZADO DE BORDES: - -[FEM_2PR] -ALPHA TEST TIPO PS2: - -[FEM_MOB] -MÓVIL - -[FED_MBL] -DESENFOQUE DE MOVIMIENTO: - -[FEM_NRM] -NORMAL - -[FEM_SIM] -SIMPLE - -[FEM_SCF] -FORMATO DE IMAGEN: - -[FED_CLF] -FILTRO DE COLOR: - -{ skin } +[FET_APP] +APLICAR [FES_SKN] NOMBRE DE APARIENCIA @@ -17544,29 +4787,83 @@ FECHA [FES_SET] Utilizar apariencia -[FET_DSN] -Apariencia predeterminada del jugador.bmp +[FET_DEF] +Restaurar valores por defecto -{ pause menu } +[FESZ_QZ] +¿Seguro de que quieres guardar esta partida? -[FET_PAU] -MENÚ PAUSA +[FES_SCG] +¿Guardar la partida actual? -[FEP_RES] -Continuar +[FES_LCG] +¿Cargar la partida y continuar jugando? -[FEQ_SRE] -¿Seguro que quieres salir? Se perderán todos los progresos desde la última partida guardada. ¿Quieres proceder? +[FEC_FIR] +Disparar -{ map } +[FEC_NWE] +Siguiente arma -[MAP_YAH] -ESTÁS AQUÍ +[FEC_PWE] +Arma anterior -[FEH_MPH] -RATÓN, CURSORES PARA DESPLAZAR - RE PÁG, AV PÁG, RUEDA RATÓN PARA HACER ZOOM, L - LEYENDA +[FEC_FOR] +Avanzar -{ control keys } +[FEC_BAC] +Retroceder + +[FEC_LEF] +Izquierda + +[FEC_RIG] +Derecha + +[FEC_ZIN] +Acercar zoom + +[FEC_ZOT] +Alejar zoom + +[FEC_EEX] +Entrar y salir + +[FEC_RAD] +Radio + +[FEC_SUB] +Misión secundaria + +[FEC_CMR] +Cambiar cámara + +[FEC_JMP] +Saltar + +[FEC_SPN] +Esprintar + +[FEC_HND] +Freno de mano + +[FEC_LOL] +Mirar hacia la izquierda + +[FEC_LOR] +Mirar hacia la derecha + +[FEC_NTR] +Siguiente objetivo + +[FEC_PTT] +Objetivo anterior + +[FEC_LBA] +Mirar detrás + +[FEC_CEN] +Centrar cámara [FET_CFT] A PIE @@ -17574,250 +4871,86 @@ A PIE [FET_CCR] EN COCHE -[FEC_NMN] -NUM. ~1~ - -[FEC_ETR] -ENTRAR - -[FEC_DOT] -NUM. . - -[FEC_UPA] -ARRIBA - -[FEC_DWA] -ABAJO - -[FEC_RFA] -DERECHA - -[FEC_PGU] -RE PÁG - -[FEC_PGD] -AV PÁG - -[FEC_RTN] -INTRO - -[FEC_NUS] -NO UTILIZADO - -[FEC_HME] -INICIO - -[FEC_RCT] -CTRL DCHO. - -[FEC_LSF] -MAYÚS IZQ. - -[FEC_DLL] -SUPR - -[FEC_TAB] -TAB +[FET_CAC] +ACCIÓN [FEC_IBT] - -[FEC_LCT] -CTRL IZQ. +[FEC_MXO] +MXB1 -[FEC_MSL] -RATÓN IZDO. - -[FEC_MWB] -RUEDA RATÓN ABAJO - -[FEC_MWF] -RUEDA RATÓN ARRIBA - -[FEC_SPC] -ESPACIO - -[FEC_RSF] -MAYÚS DCHA. - -[FEC_MSR] -RATÓN DCHO. - -[FEC_CLK] -BLOQ MAYÚS - -[FEC_MSM] -RATÓN CENTRAL - -[FET_CIG] -RETROCESO: QUITAR - BIR, INTRO: CAMBIAR - -[FET_EIG] -NO SE PUEDE DEFINIR UN CONTROL PARA ESTA ACCIÓN - -[FEC_CMP] -COMBO: MIRAR I+D - -[FEC_LOR] -Mirar hacia la derecha - -[FEC_LOL] -Mirar hacia la izquierda - -[FEC_LBA] -Mirar hacia atrás - -[FEC_IRT] -INSERT - -[FEC_PLS] -NUM. + - -[FEC_QUE] -¿¿¿??? +[FEC_MXT] +MXB2 [FEC_UNB] -SIN ASIGNAR - -[FEC_ERI] -¡Error! Una o más acciones de control no están asignadas a una tecla o botón. Comprueba que todas las acciones de control estén asignadas. - -[FEC_TFD] -Torreta /morro abajo - -[FET_RIG] -ELIGE UN NUEVO CONTROL PARA ESTA ACCIÓN - -[FEC_TFU] -Torreta /morro arriba - -[FEC_TFR] -Mirar /Torreta a dcha. +ILIMITADO [FEC_TFL] -Mirar /Torreta a izda. +Mirar a izquierd+Torreta L -[FEC_ANS] -Acción +[FEC_TFR] +Mirar a derecha+Torreta R -[FEC_HND] -Freno de mano +[FEC_MWF] +RUEDA DEL RATÓN ARRIBA -[FEC_SPN] -Esprintar +[FEC_MWB] +RUEDA DEL RATÓN ABAJO -[FEC_JMP] -Saltar +[FEC_ORR] +o -[FEC_CMR] -Cambiar cámara - -[FEC_SUB] -Misión secundaria - -[FEC_HRN] -Claxon - -[FEC_RAD] -Radio - -[FEC_EEX] -Entrar y salir - -[FEC_ZOT] -Alejar zoom - -[FEC_ZIN] -Acercar zoom - -[FEC_RIG] -Derecha - -[FEC_LEF] -Izquierda - -[FEC_CEN] -Centrar cámara - -[FEC_BAC] -Retroceder - -[FEC_PTT] -Objetivo anterior - -[FEC_FOR] -Avanzar - -[FEC_PWE] -Arma anterior - -[FEC_NWE] -Siguiente arma - -[FEC_FIR] -Disparar - -[FEC_NTR] -Siguiente objetivo - -[FEC_LDU] -Mirar abajo +[FEC_NUS] +NO UTILIZADO [FEC_LUD] Mirar arriba -{ improvements & fixes } +[FEC_LDU] +Mirar abajo -[FED_HUD] -INTERFAZ: +[FEC_CMP] +COMBO: MIRAR I+d -[FED_RDM] -MAPA E ICONOS +[LAW_1A] +law_1a -[FED_RDB] -SOLO ICONOS +[LAW_1B] +law_1b -[FEA_MUS] -VOLUMEN DE RADIO: +[LAW_2A] +law_2a -[FEA_SFX] -VOLUMEN DE EFECTOS: +[LAW_2B] +law_2b -[BUSTED] -¡TRINCADO! +[FEH_STA] +ESTADÍSTICAS -[FEM_SL1] -Archivo 1 no presente +[FEH_LOA] +CARGAR -[FEM_SL2] -Archivo 2 no presente +[FEH_CON] +CONTROLES -[FEM_SL3] -Archivo 3 no presente +[FEH_AUD] +SONIDO -[FEM_SL4] -Archivo 4 no presente +[FEH_DIS] +PANTALLA -[FEM_SL5] -Archivo 5 no presente +[FEH_LAN] +IDIOMA -[FEM_SL6] -Archivo 6 no presente - -[FEM_SL7] -Archivo 7 no presente - -[FEM_SL8] -Archivo 8 no presente - -[FES_DEL] -Borrar partida +[FEH_SGA] +INICIAR NUEVA PARTIDA [FEO_CON] -Configuración de controles +Configuración del mando [FEO_AUD] -Configuración de audio +Configuración de sonido [FEO_DIS] Configuración de pantalla @@ -17828,24 +4961,9453 @@ Configuración de idioma [FEO_PLA] Configuración del jugador -[FEB_AUD] -Audio +[FET_PS] +CONFIGURACIÓN DE APARIENCIA -[FEP_AUD] -AUDIO +[FEA_OUT] +Salida -[FEH_AUD] -AUDIO +[FEA_ST] +Estéreo -[SOUND] -AUDIO +[FEA_DTS] +DTS + +[FEA_RSS] +Emisora de radio + +[FEA_NON] +RADIO APAGADA + +[FEA_FM0] +WILDSTYLE + +[FEA_FM1] +FLASH FM + +[FEA_FM2] +KCHAT + +[FEA_FM3] +FEVER 105 + +[FEA_FM4] +VROCK + +[FEA_FM5] +VCPR + +[FEA_FM7] +EMOTION 98.3 + +[FEA_FM8] +WAVE 103 + +[FED_BRI] +Brillo + +[FED_TRA] +Estelas + +[FED_SUB] +Subtítulos + +[FED_WIS] +Formato 16:9 + +[FED_POS] +Posición de la pantalla + +[FED_RDR] +RADAR + +[FED_HUD] +MODO HUD + +[FED_RDB] +SOLO ICONOS + +[FE_MLG] +LEYENDA DEL MAPA + +[FEI_SCR] +Desplazarse + +[FEP_RES] +Continuar + +[FEP_STG] +Iniciar partida + +[FEP_STA] +Estadísticas + +[FEP_BRI] +Resumen + +[FEP_OPT] +Opciones + +[FEP_QUI] +Salir del juego + +[FES_LOA] +Cargar partida + +[FES_DEL] +Borrar partida + +[FEC_CSU] +Configuración del controlador + +[FEC_RED] +Redefinir controles + +[FEC_MOU] +Configuración del ratón + +[DISTGOL] +Distancia recorrida en carro de golf (millas) + +[DISTGOM] +Distancia recorrida en carro de golf (m) + +[ST_FAVR] +Estación de radio favorita + +[ST_WSTR] +estación de radio que menos te gusta + +[ST_FAVV] +Vehículo favorito + +[ST_STAR] +Número total de estrellas se busca conseguidas + +[ST_HEAD] +Número de disparos a la cabeza + +[ST_GANG] +Banda que menos te gusta + +[ST_STGN] +Número total de estrellas se busca evadidas + +[TYREPOP] +Neumáticos reventados por disparos + +[TYRESLA] +Neumáticos rajados con una navaja + +[ST_BRK] +Número de muertes en el anillo sangriento + +[ST_LTBR] +Mayor tiempo en el anillo sangriento (segs.) + +[ST_GNG1] +Cubanos + +[ST_GNG2] +Haitianos + +[ST_GNG3] +Aspirantes callejeros + +[ST_GNG4] +Pandilleros de Díaz + +[ST_GNG5] +Guardias de seguridad + +[ST_GNG6] +Banda de motoristas + +[ST_GNG7] +Banda de Vercetti + +[ST_GNG8] +Golfistas + +[FEA_FM6] +ESPANTOSO + +[ST_ASSI] +Contratos de asesinato completados + +[DISTBIK] +Dist. Recorrida en moto (millas) + +[DISTBIM] +Distancia recorrida en moto (m) + +[HOTEL] +Ocean View + +[KICK1_9] +PUNTOS DE CONTROL: + +[FIN_B6] +No tienes suficiente dinero para empezar esta misión. + +[TEX3_9] +~g~Recoge una bomba pasando con el helicóptero RC cerca de ella. + +[HELP22] +Ve a la señal de la casa verde que hay en el radar. + +[FES_FMS] +Éxito al formatear. Selecciona Aceptar para continuar. + +[FES_SSC] +Éxito al guardar. Selecciona Aceptar para continuar. + +[FES_DSC] +Éxito al borrar. Selecciona Aceptar para continuar. + +[FESZ_QC] +¿Deseas sobreescribir esta partida guardada dañada? + +[FES_CHE] +¡Atención! Se han activado uno o más trucos, esto puede afectar a tus partidas guardadas. Te recomendamos no guardar esta partida. + +[FET_SG] +GUARDAR PARTIDA + +[FEH_BRI] +INFORME + +[FEH_MAP] +MAPA + +[FEM_OK] +Aceptar + +[FEC_CRO] +Agacharse + +[FEC_CR3] +Agacharse (Botón L3) + +[FEC_SMT] +Sub-misión + +[FEC_SM3] +Sub-misión (Botón R3) + +[FEC_RSC] +Emisoras de radio + +[ST_PR01] +Aviador + +[ST_PR02] +Piloto del ejército + +[ST_PR03] +Oficial piloto + +[ST_PR04] +Cabo + +[ST_PR05] +Teniente + +[ST_PR06] +Sargento + +[ST_PR07] +Capitán + +[ST_PR08] +Biggs + +[ST_PR09] +Wedge + +[ST_PR10] +Barón Rojo + +[ST_PR11] +Ganso + +[ST_PR12] +Víbora + +[ST_PR13] +Jester + +[ST_PR14] +Chappy + +[ST_PR15] +Iceman + +[ST_PR16] +Maverick + +[ST_PR17] +Negado + +[ST_PR18] +General de la Armada aérea + +[ST_PR19] +As + +[FET_LG] +CARGAR JUEGO + +[CAR_EXP] +Vehículos destruidos + +[BOA_EXP] +Barcos destruidos + +[HEL_DST] +Aviones y helicópteros destruidos + +[STFT_01] +Tiempo más rápido de ''Moto con llantas de aleación'' + +[STFT_02] +Tiempo más rápido de ''El conductor'' + +[STFT_03] +Tiempo más rápido en el Circuito de Tierra + +[STFT_04] +Tiempo más rápido en la Carrera de Aviones RC + +[STFT_05] +Tiempo más rápido en la Carrera de Coches RC + +[STFT_06] +Tiempo más rápido Control del Helicóptero RC + +[STFT_07] +Tiempo más rápido en ''Velocidad terminal'' + +[STFT_08] +Tiempo más rápido en ''Ocean Drive'' + +[STFT_09] +Tiempo más rápido en ''Carrera por el borde'' + +[STFT_10] +Tiempo más rápido en ''Capital Cruise'' + +[STFT_11] +Tiempo más rápido en ''¡Tour!'' + +[STFT_12] +Tiempo más rápido en ''Aguante en V.C.'' + +[STHC_01] +Puntuación más alta en el campo de tiro + +[STHC_02] +Mejor porcentaje de impactos en el campo de tiro + +[STHC_03] +Ventas de droga realizadas + +[HELP24] +Ahora puedes aceptar trabajos del Coronel. + +[HELP25] +Ahora puedes aceptar trabajos de Avery Carrington. + +[HELP29] +Puedes visitar la tienda de ropa cuando no estés en una misión. + +[HELP30] +Cuando compres ropa nueva, tu nivel de se busca se establecerá en cero. + +[ASM4_24] +distancia: + +[RBM1_6] +~g~Lleva a Mercedes y el ''love juice'' a la banda en el estudio de grabación. + +[HELP31] +Para hacer una pasada, mira primero a izquierda o derecha con ~k~~VEHICLE_LOOKLEFT~ o ~k~~VEHICLE_LOOKRIGHT~. + +[HELP34] +Para realizar una pasada deberás tener un subfusil. + +[STRIP_1] +~r~No tienes dinero suficiente, tacaño miserable. + +[EXIT_1] +Pulsa ~k~~PED_SPRINT~ para salir. + +[ASM1_B] +Encontrará su siguiente trabajo pegado con cinta adhesiva bajo el teléfono. + +[ASM1_C] +Tengo más trabajo para usted que requerirá tomar ''el volante'' de la situación. + +[SCARF] +Apartamento 3c + +[LAW4_10] +¡Mamones de directores! + +[RCH1_6] +~g~Utiliza el helicóptero RC para pasar por los puntos de control dispersados por el aeropuerto. + +[RCH1_9] +~b~TIEMPO TOTAL: ~1~:~1~ + +[RCH1_10] +~b~TIEMPO TOTAL: ~1~:0~1~ + +[WHEEL01] +DOBLE BONIFICACIÓN EN DOS RUEDAS: ~1~ $ Distancia: ~1~,~1~m Tiempo: ~1~ segundos + +[WHEEL02] +DOBLE BONIFICACIÓN EN DOS RUEDAS: ~1~ $ Distancia: ~1~ pies Tiempo: ~1~ segundos + +[WHEEL03] +BONIFICACIÓN EN DOS RUEDAS: ~1~ $ Tiempo: ~1~ segundos + +[WHEEL04] +BONIFICACIÓN EN DOS RUEDAS: ~1~ $ Distancia: ~1~,~1~m + +[WHEEL05] +BONIFICACIÓN EN DOS RUEDAS: ~1~ $ Distancia: ~1~ pies + +[WHEEL06] +BONIFICACIÓN EN CABALLITO: ~1~ $ Distancia: ~1~,~1~m Tiempo: ~1~ segundos + +[WHEEL07] +BONIFICACIÓN EN CABALLITO: ~1~ $ Distancia: ~1~ pies Tiempo: ~1~ segundos + +[WHEEL08] +BONIFICACIÓN EN CABALLITO: ~1~ $ Tiempo: ~1~ segundos + +[WHEEL09] +BONIFICACIÓN EN CABALLITO: ~1~ $ Distancia: ~1~,~1~m + +[WHEEL10] +BONIFICACIÓN EN CABALLITO: ~1~ $ Distancia: ~1~ pies + +[WHEEL11] +BONIFICACIÓN EN PARADA MÁS LARGA: ~1~ $ Distancia: ~1~,~1~m Tiempo: ~1~ segundos + +[WHEEL12] +BONIFICACIÓN EN PARADA MÁS LARGA: ~1~ $ Distancia: ~1~ pies Tiempo: ~1~ segundos + +[WHEEL13] +BONIFICACIÓN EN PARADA MÁS LARGA: ~1~ $ Tiempo: ~1~ segundos + +[WHEEL14] +BONIFICACIÓN EN PARADA MÁS LARGA: ~1~ $ Distancia: ~1~,~1~m + +[WHEEL15] +BONIFICACIÓN EN PARADA MÁS LARGA: ~1~ $ Distancia: ~1~ pies + +[ROK3_72] +¡Love Fist! + +[POR1_19] +¡Eh! + +[DESPERA] +Desesperado + +[MOB_99A] +Ve hasta el teléfono público junto al centro comercial en Washington. + +[MOB_98A] +Ve hasta el teléfono público en Vice Point. + +[MOB_96A] +Ve hasta el teléfono público en la terminal del aeropuerto. + +[MOB_95A] +Ve hasta el teléfono público en Little Havana. + +[BNK1_1] +¿Le puedo ayudar, señor? + +[BNK1_2] +¡Hay un impostor! + +[BNK1_3] +¡Se ha vuelto loco! + +[BNK1_4] +¿Quién demonios eres? + +[BNK1_5] +¿Dónde está tu placa? + +[BNK1_6] +¡Ahí están! ¡Dispara a matar! + +[MOB_24A] +Hola, ¿Sr. Vercetti? + +[MOB_24B] +Sí. + +[MOB_24C] +Soy Cortez. Usted estuvo en mi fiesta. + +[MOB_24D] +Sí, lo recuerdo. + +[MOB_24E] +Sr. Vercetti, ha sido un desgraciado incidente lo que ocurrió con su operación de negocios. + +[MOB_24F] +Lo sé. + +[MOB_24G] +Quiero que sepa que tanto yo como mi gente estamos haciendo todo lo que podemos para llegar al fondo de este tema. + +[MOB_24H] +Si desea hablar conmigo de manera más privada, me podrá encontrar en el barco. Buenos días, señor. + +[BNK2_6] +¡Este tío está chalado! + +[ANGEL] +Ángel + +[CUBJET] +Jetmax Cubano + +[SANDKIN] +Sandking + +[POLMAV] +Maverick de la policía + +[BOXVILL] +Boxville + +[BENSON] +Benson + +[HOTRINA] +Corredor de Hotring + +[HOTRINB] +Corredor de Hotring + +[BLOODRA] +Coche de Bloodring + +[BLOODRB] +Coche de Bloodring + +[MAFIACR] +Yate de la Mafia + +[COP_M2] +ANTI VICIO + +[COP_M3] +TRUENO MARRÓN + +[BNK3_2] +No voy a conducir por ti, ni soñando, voy a compartir esto con el grupo. + +[FEM_SL1] +No hay archivo 1 guardado + +[FEM_SL2] +No hay archivo 2 guardado + +[FEM_SL3] +No hay archivo 3 guardado + +[FEM_SL4] +No hay archivo 4 guardado + +[FEM_SL5] +No hay archivo 5 guardado + +[FEM_SL6] +No hay archivo 6 guardado + +[FEM_SL7] +No hay archivo 7 guardado + +[FEM_SL8] +No hay archivo 8 guardado + +[FEA_CHA] +Cambiando la salida de audio a ESTÉREO. Espera... + +[FEA_CHD] +¡Aviso! Estás cambiando la salida de ESTÉREO a DTS. Espera... + +[FEI_SEL] +Selec. + +[FEI_BAC] +Atrás + +[FEI_RES] +Reanudar + +[FEI_NAV] +Navegar + +[FEI_BTX] +botón / - + +[FEI_BTT] +botón " - + +[FEI_STA] +Botón START - + +[FEI_BTD] +; = > < - + +[FEI_STO] +Parar + +[MOB_68A] +Tommy, tío, tengo una sorpresa para ti. + +[MOB_68B] +Me encuentro en el estudio de grabación con unos artistas importantes. + +[MOB_68C] +¿Por qué no te vienes por aquí? + +[MOB_68D] +Sabes que esto tiene sentido, ¿a que sí? Hasta dentro de un rato. + +[OUTFT1] +Calle + +[OUTFT2] +Etiqueta + +[OUTFT3] +Mono de trabajo + +[OUTFT4] +Club de campo + +[OUTFT5] +Habana + +[OUTFT6] +Policía + +[OUTFT7] +Atraco al banco + +[OUTFT8] +Informal + +[OUTFT9] +Sr. Vercetti + +[OUTFT10] +Chándal + +[OUTFT13] +MC Tommy + +[CAR_AS1] +CONCESIONARIO DE COCHES CONSOLIDADO + +[CAR_AS2] +~g~El Concesionario de coches Sunshine generará ahora unos ingresos de hasta ~1~ $ máximo. Asegúrate de recaudarlos regularmente. + +[BUYSAVE] +~g~A partir de ahora, podrás guardar tu partida aquí cuando no estés en una misión. + +[BUYGARG] +~g~También puedes almacenar vehículos en este garaje. + +[STRPBUY] +Adquirido el club Pole Position: ~1~ $ + +[GA_4] +Las bombas de coche son 500 $ cada una. + +[GA_5] +Tu coche ya está equipado con una bomba. + +[GA_6] { reVC update } +¡Apárcalo, actívala pulsando ~h~~k~~VEHICLE_FIREWEAPON~~w~ y SAL PITANDO! + +[GA_7] { reVC update } +¡Ármalo pulsando ~h~~k~~VEHICLE_FIREWEAPON~~w~. La bomba explotará cuando se arranque el motor. + +[GA_6B] { reVC update } +¡Apárcalo, actívala pulsando ~h~~k~~VEHICLE_FIREWEAPON~~w~ y SAL PITANDO! + +[GA_7B] { reVC update } +¡Ármalo pulsando ~h~~k~~VEHICLE_FIREWEAPON~~w~. La bomba explotará cuando se arranque el motor. + +[MOB_70A] +Tommy, soy yo, el coronel Cortez. Mira, me parece que eres la clase de hombre que lleva a cabo los trabajos. Así que ayúdame, por favor. + +[MOB_70B] +Me podrás encontrar en el barco. + +[PICK1] +¡El chaleco antibalas ha sido entregado en el hotel Ocean View! + +[PICK2] +¡La .357 ha sido entregada en el hotel Ocean View! + +[PICK3] +¡La sierra mecánica ha sido entregada en el hotel Ocean View! + +[PICK4] +¡El lanzallamas ha sido entregado en el hotel Ocean View! + +[PICK5] +¡El rifle de francotirador .308 ha sido entregado en el hotel Ocean View! + +[PICK6] +¡La Ametralladora Pesada ha sido entregada en el hotel Ocean View! + +[PICK7] +¡El lanzacohetes ha sido entregado en el hotel Ocean View! + +[PICK8] +¡El Sea Sparrow está ahora disponible en la mansión de Starfish Island! + +[PICK9] +¡El tanque está ahora disponible en los cuarteles del ejército! + +[PICK10] +¡El Hunter está ahora disponible en los cuarteles del ejército! + +[CLOTH1] +El traje de etiqueta ha sido entregado en Rafaels en Ocean Beach. + +[CLOTH2] +El traje de calle ha sido entregado en los pisos francos. + +[CLOTH3] +El mono de trabajo ha sido entregado en Tooled Up en el centro comercial de North Point. + +[CLOTH4] +El traje del club de campo ha sido entregado en el club de golf de Leaf Links. + +[CLOTH5] +El traje Havana ha sido entregado en la tienda de ropa de Little Havana. + +[CLOTH6] +El traje de policía ha sido entregado en la jefatura de policía de Washington Beach. + +[CLOTH7] +El traje informal ha sido entregado en Gash del centro comercial de North Point. + +[CLOTH8] +El traje del Sr. Vercetti ha sido entregado en Collar & Cuffs de Ocean Beach. + +[CLOTH9] +El chándal ha sido entregado en Jocksport del centro de la ciudad. + +[CLOTH10] +El traje para el atraco al banco ha sido entregado en el Club Malibu de Vice Point. + +[MOB_62A] +Tommy, soy Ricardo Díaz, quiero darte las gracias por cuidar de mí, tío. + +[MOB_62B] +He preguntado al gilipollas de Cortez, y me ha dicho que eres bueno, amigo, ¿por qué no vienes a verme? + +[MOB_62C] +Necesito un tío como tú. Todos los que tengo son gilipollas perdidos, + +[MOB_62D] +gilipollas por todas partes, tío. Yo te puedo hacer muy rico. + +[GOAWAY2] +~g~Regresa cuando hayas terminado las misiones de la banda de moteros. + +[COL2_9] +¡Estúpido americano! ¡Te han seguido hasta aquí! + +[LOADCOL] +Cargando... + +[STFT_17] +Tiempo más rápido en la ''Prueba PCJ'' + +[STFT_18] +Tiempo más rápido en el ''Trial de tierra'' + +[STFT_19] +Tiempo más rápido en la ''Pista de Pruebas'' + +[NEW_REC] +¡Nuevo récord establecido! ~w~~1~ minutos ~g~y ~w~~1~ segundos. + +[BMX_HOW] +~g~¡Da dos vueltas a la pista de tierra, ~y~pasando por ~g~los ~y~PUNTOS DE CONTROL ~g~por el camino! + +[BMXREW1] +~g~¡Cada vez que batas tu récord anterior de las dos vueltas + +[BMXREW2] +~g~conseguirás una ~y~RECOMPENSA ~g~mejor! + +[BMXRAIN] +~g~Parece lluvia... + +[ITBEG] +Al principio... + +[NBMNBUY] +Casa Swanko adquirida: ~1~ $ + +[LNKVBUY] +Apartamento en Links View adquirido: ~1~ $ + +[HYCOBUY] +Piso de Hyman adquirido: ~1~ $ + +[BUYGARS] +~g~Puedes guardar vehículos en estos garajes. + +[OCHEBUY] +Apartamento de Ocean Heights adquirido: ~1~ $ + +[WASHBUY] +1102 de la calle Washington adquirido: ~1~ $ + +[VCPTBUY] +3321 de Vice Point adquirido: ~1~ $ + +[SKUMBUY] +Chabola Skumole adquirida: ~1~ $ + +[HELP6_C] +Pulsa ~h~~k~~VEHICLE_HANDBRAKE~~w~ para usar el freno de mano del vehículo. + +[HELP2_A] +Pulsa ~h~~k~~PED_SPRINT~~w~~w~ cuando estés corriendo para ~h~esprintar. + +[HELP4_A] +Pulsa ~h~~k~~VEHICLE_ACCELERATE~~w~ para acelerar. + +[HELP5_A] +Pulsa ~h~~k~~VEHICLE_BRAKE~~w~ para frenar o para dar marcha atrás si el vehículo se ha detenido. + +[HELP8_A] +Pulsa ~h~~k~~PED_SNIPER_ZOOM_IN~~w~ para hacer zoom con el rifle y ~h~~k~~PED_SNIPER_ZOOM_OUT~~w~ para alejar la vista. + +[PBOAT_1] { reVC update } +Pulsa ~h~ ~k~~VEHICLE_FIREWEAPON~~w~ para disparar los cañones del barco. + +[SEG3_4] { reVC update } +~g~Puedes recoger bombas simplemente pilotando tu Helicóptero RC cerca de cada una de ellas, para soltar una bomba pulsa ~h~~k~~VEHICLE_FIREWEAPON~~g~. + +[RCR1_3] { reVC update } +~g~Si quieres abandonar esta misión, pulsa ~h~~k~~VEHICLE_FIREWEAPON~~g~ para detonar tu coche RC. + +[HELP32] { reVC update } +A continuación dispara pulsando ~h~~k~~VEHICLE_FIREWEAPON~. + +[HELP33] { reVC update } +A continuación dispara pulsando ~h~~k~~VEHICLE_FIREWEAPON~. + +[TTUTOR] +Pulsa ~h~~k~~TOGGLE_SUBMISSIONS~~w~ para comenzar o cancelar las misiones de taxista. + +[TTUTOR2] +Pulsa ~h~~k~~TOGGLE_SUBMISSIONS~~w~ para comenzar o cancelar las misiones de taxista. + +[FTUTOR] +Pulsa ~h~~k~~TOGGLE_SUBMISSIONS~~w~ para comenzar o cancelar las misiones del camión de bomberos. + +[FTUTOR2] +Pulsa ~h~~k~~TOGGLE_SUBMISSIONS~~w~ para comenzar o cancelar las misiones del camión de bomberos. + +[CTUTOR] +Pulsa ~h~~k~~TOGGLE_SUBMISSIONS~~w~ para comenzar o cancelar las misiones de justiciero. + +[CTUTOR2] +Pulsa ~h~~k~~TOGGLE_SUBMISSIONS~~w~ para comenzar o cancelar las misiones de justiciero. + +[HELP8_B] +Pulsa ~h~~k~~PED_SNIPER_ZOOM_IN~ ~w~para ~h~acercar la vista ~w~con el rifle y ~h~~k~~PED_SNIPER_ZOOM_OUT~ ~w~para ~h~alejar la vista ~w~otra vez. + +[ATUTOR3] +Pulsa ~h~~k~~TOGGLE_SUBMISSIONS~~w~ para comenzar o cancelar las misiones de ATS. + +[GUN_H1] +~w~Pulsa ~h~~k~~PED_SPRINT~~w~ para comprar. ~w~Pulsa ~h~~k~~VEHICLE_ENTER_EXIT~~w~ para salir. + +[PU_CF3] { reVC update } +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para reemplazar tu arma actual en esta ranura. + +[PU_CF4] { reVC update } +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para reemplazar tu arma actual en esta ranura. + +[HELP9_B] +Pulsa ~h~~k~~PED_FIREWEAPON~ ~w~para ~h~disparar~w~ el rifle de francotirador. + +[HELP37] +Si no quieres subir al coche mientras se lo estás robando a alguien, pulsa ~h~~k~~PED_SPRINT~. + +[HELP6_A] +Pulsa ~h~~k~~VEHICLE_HANDBRAKE~~w~ para usar el freno de mano del vehículo. + +[HELP6_D] +Pulsa ~h~~k~~VEHICLE_HANDBRAKE~~w~ para usar el freno de mano del vehículo. + +[HELP26] +Pulsa ~h~~k~~VEHICLE_ENTER_EXIT~~w~ para subir o bajar de un vehículo. + +[HELP27] +Pulsa ~h~~k~~VEHICLE_TURRETUP~~w~ o ~h~~k~~VEHICLE_TURRETDOWN~~w~ para equilibrar tu peso en la moto. + +[HELP28] +Pulsa ~h~~k~~VEHICLE_TURRETUP~~w~ o ~h~~k~~VEHICLE_TURRETDOWN~~w~ para equilibrar tu peso en la moto. + +[HELP35] +Pulsa ~h~~k~~GO_LEFT~~w~ o ~h~~k~~GO_RIGHT~~w~ para conducir el vehículo. + +[HELP36] +Pulsa ~h~~k~~GO_LEFT~~w~ o ~h~~k~~GO_RIGHT~~w~ para conducir el vehículo. + +[HELP42] +Ve al ~q~icono rosa~w~ para encontrar el hotel. + +[HELP19] +Camina hasta el ~q~marcador rosa~w~ para continuar. + +[HELP1] +Párate en el centro del ~q~marcador rosa. + +[HELP12] +Camina hasta el centro del ~q~marcador rosa~w~ para activar una misión. + +[SEG3_6] +~g~Para acertar en una zona objetivo con éxito, deberás soltar una bomba en la zona representada por el ~q~marcador rosa~w~. Puedes soltar las bombas en cualquier orden. + +[S_PROMP] +Cuando no estés en una misión podrás guardar tu progreso recogiendo las ~h~cintas de cassette~w~. + +[HELP16] +Cruza la puerta principal del hotel ~h~Ocean View~w~ para entrar en el edificio. + +[HELP43] +~g~Ve al hotel ~h~Ocean View~g~ en Ocean Drive. + +[HELI_F1] +~r~¡Misión de puntos de control cancelada! + +[AMMUHLP] +Si necesitas armas pásate por ~h~Ammu-Nation~w~. Está indicado en el radar como una ~h~pistola~w~ azul. + +[HELI_1] +Control del Helicóptero de Centro de la ciudad + +[HELI_2] +Control del Helicóptero de Ocean Beach + +[HELI_3] +Control del Helicóptero de Vice Point + +[HELI_4] +Control del Helicóptero de Little Haiti + +[FST_MFR] +Emisora de radio preferida + +[FST_LFR] +Emisora de radio menos escuchada + +[FEI_HOL] +Mantener + +[FEI_ZOO] +Zoom + +[FEI_BTR] +> < - + +[FEI_NA] +N\A + +[MESA] +Mesa Grande + +[STRP_NO] +No puedes comprar el club de striptease en este momento, vuelve luego. + +[CHSE] +PERSECUCIÓN + +[NBMN_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la casa Swanko por ~1~ $. + +[NBMN_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la casa Swanko por ~1~ $. + +[NBMN_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la casa Swanko por ~1~ $. + +[LNKV_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el apartamento de Links View por ~1~ $. + +[LNKV_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el apartamento de Linsk View por ~1~ $. + +[LNKV_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el apartamento de Links View por ~1~ $. + +[HYCO_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el piso de Hyman por ~1~ $. + +[HYCO_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el piso de Hyman por ~1~ $. + +[HYCO_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el piso de Hyman por ~1~ $. + +[OCHE_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el apartamento de Ocean Heights por ~1~ $. + +[OCHE_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el apartamento de Ocean Heights por ~1~ $. + +[OCHE_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el apartamento de Ocean Heights por ~1~ $. + +[WASH_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el 1102 de la calle Washington por ~1~ $. + +[WASH_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el 1102 de la calle Washington por ~1~ $. + +[WASH_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el 1102 de la calle Washington por ~1~ $. + +[VCPT_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el 3321 de Vice Point por ~1~ $. + +[VCPT_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el 3321 de Vice Point por ~1~ $. + +[VCPT_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el 3321 de Vice Point por ~1~ $. + +[SKUM_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la chabola Skumole por ~1~ $. + +[SKUM_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~para comprar la chabola Skumole por ~1~ $. + +[SKUM_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~ ~w~ para comprar la chabola Skumole por ~1~ $. + +[PRNT_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la imprenta por ~1~ $. + +[PRNT_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la imprenta por ~1~ $. + +[PRNT_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la imprenta por ~1~ $. + +[CAR_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el concesionario de coches por ~1~ $. + +[CAR_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el concesionario de coches por ~1~ $. + +[CAR_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el concesionario de coches por ~1~ $. + +[PORN_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar los estudios de cine por ~1~ $. + +[PORN_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar los estudios de cine por ~1~ $. + +[PORN_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar los estudios de cine por ~1~ $. + +[ICE_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la fábrica de helados por ~1~ $. + +[ICE_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la fábrica de helados por ~1~ $. + +[ICE_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la fábrica de helados por ~1~ $. + +[TAXI_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la compañía de taxis por ~1~ $. + +[TAXI_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la compañía de taxis por ~1~ $. + +[TAXI_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la compañía de taxis por ~1~ $. + +[BANK_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el Malibú por ~1~ $. + +[BANK_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el Malibú por ~1~ $. + +[BANK_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el Malibú por ~1~ $. + +[BOAT_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el astillero por ~1~ $. + +[BOAT_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el astillero por ~1~ $. + +[BOAT_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el astillero por ~1~ $. + +[STRP_L] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el club Pole Position por ~1~ $. + +[STRP_T] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el club Pole Position por ~1~ $. + +[STRP_C] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar el club Pole Position por ~1~ $. + +[STOCK] +~r~Agotado + +[HELP14] +Para encontrar el bufete del abogado, ve hacia la ~h~señal de la L~w~ que hay en el radar. + +[RAMPAGE] +¡MASACRE! + +[RAMP_F] +¡MASACRE FALLIDA! + +[RAMP_P] +¡MASACRE COMPLETADA! + +[RAMP_A] +¡TODAS LAS MASACRES COMPLETADAS! + +[PAGE_01] +¡Liquida a ~1~ criminales en 2 minutos! + +[PAGE_02] +¡Destruye ~1~ vehículos en 2 minutos! + +[PAGE_03] +¡Pasa en el coche y cárgate a ~1~ criminales en 2 minutos! + +[PAGE_04] +¡Atropella y mata a ~1~ criminales en 2 minutos! + +[PAGE_05] +¡Abate a tiros a ~1~ criminales en 2 minutos! + +[SENTXS] +Sentinel XS + +[MAP_LEG] +Leyenda + +[VCNMAV] +VCN Maverick + +[LG_01] +Posición del jugador + +[LG_02] +Avery Carrington + +[LG_03] +Contacto del motero + +[LG_04] +Coronel Cortez + +[LG_05] +Ricardo Díaz + +[LG_06] +Kent Paul + +[LG_07] +Abogado + +[LG_08] +Phil Cassidy + +[LG_09] +Astillero + +[LG_10] +Club Malibú + +[LG_11] +Cubanos + +[LG_12] +Estudio Cinematográfico + +[LG_13] +Ammu-Nation + +[LG_14] +Haitianos + +[LG_15] +Ferretería + +[LG_16] +Piso franco + +[LG_17] +Helado + +[LG_18] +Taxis Kaufman + +[LG_19] +Love Fist + +[LG_20] +Imprenta + +[LG_21] +Propiedad + +[LG_22] +Taller de Pintura + +[LG_23] +Tienda de ropa + +[LG_24] +Mansión de Tommy + +[LG_25] +Teléfono + +[LG_26] +Emisora de radio Wildstyle + +[LG_27] +Emisora de radio Flash FM + +[LG_28] +Emisora de radio Kchat + +[LG_29] +Emisora de radio Fever 105 + +[LG_30] +Emisora de radio VRock + +[LG_31] +Emisora de radio VCPR + +[LG_32] +Emisora de radio Espantoso + +[LG_33] +Emisora de radio Emotion 98.3 + +[LG_34] +Emisora de radio Wave 103 + +[LG_35] +Destino + +[LG_36] +Solarium + +[LG_37] +Club de Striptease + +[LG_38] +Objetivo + +[MAP_YAH] +ESTÁS AQUÍ + +[TAXSHRT] +~g~Puedes coger este taxi Kaufman para ir a tu destino sin conducir. Te costará 9 $. + +[FEST_HV] +Nivel más alto de misión de justiciero + +[CLOHELP] +¡Ropa limpia! + +[SUNSHIN] +Coches Sunshine + +[CHERRYP] +Helados Cherry Popper + +[KAUFCAB] +Taxis Kaufman + +[BOATYAR] +El Astillero + +[WANT_L] +Has perdido tu nivel de se busca, si cometes un crimen mientras las estrellas parpadean, tu nivel total de se busca se restablecerá. + +[FEI_BTU] +; = - + +[BOAT_AS] +~g~El astillero generará ahora unos ingresos hasta un máximo de ~1~ $. Asegúrate de recaudarlos de manera regular. + +[BOAT_A2] +ASTILLERO COMPLETADO + +[BOAT_N] +Punto de control Charlie + +[BOAT_P] +~g~Recoge los paquetes antes de que se acabe el tiempo. + +[FEI_R1B] +Botón R1 \ R2 - + +[HELP9_A] +Pulsa ~h~~k~~PED_FIREWEAPON~ ~w~para disparar el rifle de francotirador. + +[HELP21] +Pulsa ~h~~k~~VEHICLE_ENTER_EXIT~ ~w~para subir o bajar de un vehículo. + +[CREAM] +Distribución + +[UMBERTO] +Café Robina + +[PU_CF1] +Pulsa ~h~~k~~PED_ANSWER_PHONE~ ~w~para recoger esta arma. Reemplazará cualquier arma del mismo tipo que tengas. + +[FED_RDM] +MAPA E ICONOS + +[FEC_ILU] +Invertir vista en primera persona + +[NITRO] +¡Ahora todos los taxis disponen de un impulsor de salto! Simplemente toca el claxon. + +[RATNG53] +Informal + +[RATNG54] +Vergüenza + +[RATNG55] +Hacker + +[RATNG56] +Liante + +[RATNG57] +Mentiroso compulsivo + +[STHC_04] +Puntuación más alta por mantener la pelota en el aire en la playa + +[STHC_05] +Mejor resultado de Hotring + +[STFT_13] +Mejor tiempo en el Control del Helicóptero del centro + +[STFT_14] +Mejor tiempo en el Control del Helicóptero de Ocean Beach + +[STFT_15] +Mejor tiempo en el Control del Helicóptero de Vice Point + +[STFT_16] +Mejor tiempo en el Control del Helicóptero de Little Haití + +[STFT_21] +Tiempo más rápido en Hotring + +[STFT_22] +Vuelta más rápida en Hotring + +[STFT_20] +Tiempo más rápido en el ''Conocircuito'' + +[HELP44] +Detente en el ~q~marcador rosa. + +[HELP45] +Pulsa ~h~~k~~PED_DUCK~~w~ para agacharte. Esto aumentará tu puntería con las armas que llevas. + +[RCR1_5] +Carrera Bandit RC + +[RCPL1_7] +Carrera Barón RC + +[RCH1_11] +Recogidas del Raider RC + +[FEA_CTD] +¡Aviso! Esta característica requiere que el dispositivo compatible DTS esté conectado. ¿Continuar? + +[FEM_STE] +UTILIZAR ESTÉREO + +[GREET] +Saludos desde... + +[LANCE_1] +¡Venga, tío, conduce con más cuidado! + +[LANCE_2] +¡Eh, mira lo que haces! + +[LANCE_3] +¿Eh, dónde vamos ahora? + +[LANCE_4] +¿Qué estamos haciendo ahora? + +[LAW4_15] +¡Más dinero! + +[MERC_5] +Bonito coche, Mr. Vercetti. + +[MERC_26] +¡DEPRISA, DEPRISA, DEPRISA! + +[MERC_27] +Con cuidado Tommy, me arreglaron la nariz el mes pasado. + +[MERC_28] +Conduce con cuidado Tommy. + +[MERC_29] +Ve más despacio Tommy. + +[MERC_30] +Tommy, si no te importa mata a quien quieras menos a mí. + +[MERC_31] +¡Tommy, cielo, no me mates! + +[MERC_32] +¡Tommy, me alegro que robaras este coche! + +[MERC_40] +Me he divertido tanto. + +[MERC_43] +Adiós, mi ángel. + +[MERC_44] +Ahora sigue machacándote, me oyes. + +[MERC_45] +Ciao, guapetón. + +[COL5_17] +¡Oh, Dios mío, tienen un helicóptero! + +[COL5_18] +¡Dispara al helicóptero! + +[COL5_19] +Tommy, ¡hazte con ese helicóptero! + +[COL5_20] +¡Ahí viene otra vez! ¡Derriba a ese helicóptero! + +[COL5_21] +¡Mira el tamaño de ese helicóptero! + +[COL5_22] +¡Ahí viene de nuevo! + +[FEA_DSM] +¡Aviso! Esta partida guardada está configurada para utilizar DTS. Esto requiere que el dispositivo compatible DTS esté conectado. Por favor selecciona si quieres continuar usando el sistema DTS o ESTÉREO. + +[STFT_23] +Tiempo más rápido en Punto de control Charlie + +[HELP50] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para colocar la cámara detrás de ti. + +[HELP51] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para colocar la cámara detrás de ti. + +[HELP52] +Pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para colocar la cámara detrás de ti. + +[HELP53] +Pulsa ~h~~k~~PED_CYCLE_WEAPON_LEFT~~w~ o ~h~~k~~PED_CYCLE_WEAPON_RIGHT~~w~ para elegir entre todas tus armas disponibles. + +[HELP46] +Hay ocho categorías de armas diferentes. + +[HELP47] +Puedes llevar una arma de cada categoría al mismo tiempo: un tipo de pistola, un tipo de rifle. + +[HELP54] +~w~Cuesta: ~1~ $. ~r~Si compras esta arma reemplazarás la actual. + +[HELP2A2] +Pulsa ~h~~k~~PED_SPRINT~~w~ cuando corras para ~h~esprintar. + +[HLPSN_A] +El rifle de francotirador te permite hacer zoom de acercamiento y disparar con más precisión a objetivos a una cierta distancia. + +[HLPSN_B] +Mantén pulsado ~h~~k~~PED_LOCK_TARGET~ ~w~para ~h~apuntar~w~ con el rifle de francotirador. + +[HLPSN_C] +Mantén pulsado ~h~~k~~PED_LOCK_TARGET~ ~w~para ~h~apuntar~w~ con el rifle de francotirador. + +[HLPSN_D] +Pulsa ~h~~k~~PED_SNIPER_ZOOM_IN~~w~ para ~h~acercar la vista ~w~con el rifle y ~h~~k~~PED_SNIPER_ZOOM_OUT~ ~w~para ~h~alejarla~w~. + +[HLPSN_E] +Pulsa ~h~~k~~PED_FIREWEAPON~~w~ para ~h~disparar~w~ el rifle de francotirador. + +[HLPSN_F] +Pulsa ~h~~k~~PED_FIREWEAPON~~w~ para ~h~disparar~w~ el rifle de francotirador. + +[HLPSN_G] +Pulsa ~h~~k~~PED_FIREWEAPON~~w~ para ~h~disparar~w~ el rifle de francotirador. + +[PLANE_H] +Mueve ~h~~k~~VEHICLE_ACCELERATE~~w~ hacia delante para acelerar y a izquierda o derecha para girar. + +[PLANE_4] { reVC update } +{Mueve ~h~~k~~VEHICLE_ACCELERATE~~w~ hacia delante para acelerar y a izquierda o derecha para girar.} +Utiliza el joystick analógico derecho para acelerar, tira hacia atrás el joystick analógico izquierdo para ascender, empújalo hacia adelante para descender. Para girar muévelo a izquierda o derecha. + +[HELP55] +Pulsa ~h~~k~~PED_FIREWEAPON~~w~ para atacar al chef. + +[STPR_8] +Club Pole Position + +[STPR_9] +3321 de Vice Point + +[STPR_10] +Apartamento de Links View + +[STPR_11] +Casa Swanko + +[STPR_12] +1102 de Washington Street + +[STPR_13] +Apartamento de Ocean Heights + +[STPR_14] +Chabola Skumole + +[STPR_15] +Piso de Hyman + +[RCCANX] +~r~Misión de avión RC cancelada. + +[CLT_HL2] +Cuando recojas ropa, te librarás de una o dos estrellas del nivel de se busca. + +[CRED009] +DISEÑO DE MISIONES + +[CRED359] +LEE JOHNSON + +[CRED360] +HENDRIK LESSER + +[CRED361] +PASQUALE STACCHIOTTI + +[CRED362] +ENRIQUE FERNÁNDEZ + +[CRED363] +PAUL BYERS + +[CRED364] +MIKE EMENY + +[CRED365] +ROB DUNKIN + +[CRED366] +CHARLIE KINLOCH + +[CRED367] +KEVIN HOBSON + +[CRED368] +JIM CREE + +[MOB_66A] +Tommy, Tommy, ¿para qué has vuelto? + +[MOB_66B] +Ya te he dicho que no queremos verte más. + +[MOB_67A] +Tommy, creo que no deberías acercarte, ¿me oyes? + +[MOB_67B] +Los chicos haitianos no están muy contentos contigo. + +[MOB_18A] +Tommy, soy Paulo, ¿cómo estás? Vale hombre, bueno pensé que tenía que mandarte una nota. + +[MOB_18B] +Oh Dios misericordioso, hijo mío, no te vas a creer la categoría de la furcia que acabo de conocer. + +[MOB_18C] +Prostituta callejera o algo parecido, cerca de Little Havana, tío. + +[MOB_18D] +Me dijo que se llamaba Mercedes o algo así. + +[MOB_18E] +Oh Dios, tío, tienes que probar a esa palomita. + +[MOB_18F] +Sabe como ponerte a tono. Dijo que yo era el mejor tío con el que había estado en toda su vida. + +[MOB_18G] +Estate al tanto por si la ves. Hasta luego. + +[MOB_72A] +Tommy, soy yo, Lance. Mantén la boca cerrada Tommy porque no tengo ganas de hablar. + +[MOB_72B] +No estoy interesado en lo que tengas que decir. ¿Por qué debería estarlo? ¿Te preocupas tú por mí? + +[MOB_72C] +Tienes que cuidarme un poco mejor. Darme una buena tajada, ya sabes... + +[MOB_72D] +Tommy... oh, mira, tío, Lo siento. Es solo que... + +[MOB_72E] +La gente me ha estado sobreprotegiendo toda mi vida, tratándome como a un niño. + +[MOB_72F] +Mi hermano haría eso. Por favor, tío, no lo hagas. + +[MOB_72G] +Tengo que irme. + +[MOB_63A] +Tommy, soy Earnest. Earnest Kelly. + +[MOB_63B] +¿Cómo estás? + +[MOB_63C] +Estoy bien. Necesitaré un bastón para andar pero muy pronto volveré al trabajo. + +[MOB_63D] +Bien. + +[MOB_63E] +Me enteré de lo de Lance. Vaya cabroncete, ¿eh? + +[MOB_63F] +Sí. + +[MOB_63G] +No te fíes nunca de un hombre que va por la calle en pijama. Y es lo que digo yo. Menos mal que lo mataste. Espero que el mamón sufriera. + +[MOB_63H] +Creo que sí. Lo que pasa es que yo no creí que... + +[MOB_63I] +Tommy, para ser un chalado furioso, eres bastante ingenuo. Cuando vuelva a trabajar pronto te enseñaré un par de cosas sobre la vida, me oyes. + +[MOB_63J] +Tómate tu tiempo, Earnest. Cuídate. + +[MOB_16A] +Tommy, soy Paulo, ¿qué pasa amigo? + +[MOB_16B] +Qué quieres Paul. No necesito ropa de marca de imitación. + +[MOB_16C] +Muy gracioso, tío, pero sabes que no toco nada de mercancía ilegal. No, sólo llamaba para ver si puedo conseguir un papel en una de tus películas. + +[MOB_16D] +Allí en Inglaterra hice un montón de porno, colega. Soy bastante más ardiente que tú, pequeño. + +[MOB_16E] +Paul, gracias por la oferta, lo tendré en cuenta. + +[MOB_16F] +En serio, después de todo lo que he hecho por ti, no te olvides de mí. + +[MOB_16G] +Eso es lo que intento olvidar. + +[MOB_17A] +Tommy Vercetti, ¿Qué tal te va Sr. Influyente? He oído un montón de cosas sobre ti, así que ahora eres el que manda en la ciudad, eh... + +[MOB_17B] +Paul, estás borracho. + +[MOB_17C] +No, imbécil, no estoy borracho. Sólo he tomado un par de copas y alguna que otra invitación, no me he acostado en los dos últimos días, sabes. + +[MOB_17D] +En cualquier caso, no me vengas con esto. No soy tonto. ¿Quién te estableció en esta ciudad? ¿Quién? Yo. Que te enteres. + +[MOB_17F] +¿De verdad? + +[MOB_17G] +No me vengas con esto. Yo te presenté a la gente. Te enseñé cómo hacer bien los trabajos, hice muchas cosas por ti, y así es como me lo pagas. + +[MOB_17H] +Me ignoras. Ni siguieras me das acceso a nada, después de todo lo que hice por ti. ¿Quién te crees que soy? ¿Un retrasado mental o algo así? + +[MOB_17I] +Paul, tranquilízate. He estado muy ocupado, no te comportes como un idiota.. + +[MOB_17J] +No soy un idiota, colega. Eso es lo que decían en el reformatorio. ¿Estás buscando bronca? ¡Porque la vas a tener! + +[MOB_17K] +Tommy, colega. Por favor. ¡Tú eras mi gran esperanza! Por favor, ¡no te rías de mí! + +[MOB_17L] +Paul, vete a dormir un poco, de verdad. + +[MOB_73A] +Tommy, soy Steve. + +[MOB_73B] +Eh, Steve. + +[MOB_73C] +¡Eres un portento! ¡Soy un portento! La gente está loca por nosotros. Vamos a entrar en la historia, amigo. + +[MOB_73D] +Se trata de los premios más importantes. Podré llevar a mi padre a una residencia y no tener que escucharle nunca más. + +[MOB_73E] +Eso está bien, Steve. + +[MOB_73F] +Mejor que bien tío. Mejor, mucho mejor. Nunca creyó en mí. Nunca creyó que pudiera ser un artista y ahora lo he conseguido. + +[MOB_73G] +Soy el mejor director de cine porno de todos los tiempos, amigo. Solo quería decirte que ha sido un placer conocerte. + +[MOB_73H] +Gracias Steve. + +[MOB_73I] +Te quiero tío, No cambies, me oyes. + +[MOB_73J] +Te oigo. Adiós Steve. + +[BOLLOX] +Pulsa ~h~~k~~VEHICLE_HANDBRAKE~ ~w~para soltar una bomba. Pulsa ~h~~k~~VEHICLE_ENTER_EXIT~ ~w~para cancelar. + +[BRID_OP] +El temporal ha pasado, todos los puentes hacia la península están ahora abiertos. + +[BRID_CL] +Alerta de temporal: Cerrados todos los puentes hacia la península. + +[ASSET_C] +¡CLUB POLE POSITION CONSOLIDADO! + +[ASSET_D] +El club Pole Position generará ahora unos ingresos máximos de hasta ~1~ $ al día. ¡Asegúrate de recaudarlos regularmente! + +[ST_WHEE] +Mayor tiempo en caballito (seg) + +[ST_STOP] +Mayor tiempo en parada (seg) + +[ST_2WHE] +Mayor tiempo en dos ruedas (seg) + +[ST_WHED] +Mayor distancia en caballito (m) + +[ST_STOD] +Mayor distancia en parada (m) + +[ST_2WHD] +Mayor distancia en dos ruedas (m) + +[OUTFT11] +Chándal + +[OUTFT12] +Frankie + +[RELOAD] +~g~¡Has conseguido la habilidad de recargar rápidamente! + +[APACHE] +Hunter entregado en el helipuerto de Ocean Beach. + +[CRED369] +JOHN MCCARDLE + +[CRED370] +DAVID MURDOCH + +[CRED371] +CHRIS BROWN + +[CRED372] +PAUL GREEN + +[CRED373] +KYLE MILNE + +[CRED374] +KEVIN YUN + +[CRED375] +ERICK COBBS + +[CRED376] +RANDY BLAKE + +[CRED377] +BRANDON LIM + +[CRED378] +BRANDON FENOL + +[CRED379] +MICHAEL MANOLE + +[CRED380] +ALETHEIA SIMONSON + +[CRED381] +JOHN JANSEN + +[CUNTY] +¡Ropa nueva entregada en la finca de Vercetti! + +[GOODBOY] +¡Prima de 50 $ por comportamiento ejemplar! + +[NEWCONT] +¡Nuevo ~h~punto de contacto ~w~disponible en el puerto deportivo en Ocean Beach! + +[FIRELVL] +Misión de camión de bomberos nivel ~1~ + + +[HELP56] +Pulsa ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~ para ajustar la cámara. + +[HELP57] +Pulsa ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~ para ajustar la cámara. + +[HELP58] +Mientras estás apuntando, puedes pulsar ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~ o ~h~~k~~PED_CYCLE_TARGET_RIGHT~~w~para cambiar de objetivo. + +[HELP59] +Mientras estás apuntando, puedes pulsar ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~ o ~h~~k~~PED_CYCLE_TARGET_RIGHT~~w~para cambiar de objetivo. + +[HELP60] +Si pulsas ~h~~k~~PED_SPRINT~ ~w~ mientras estás robando un coche, no te subirás en él. + +[HELP61] +Ahora dispones de munición ilimitada y el doble de robustez en todos los vehículos. + +[FEC_LB1] +Mirar + +[FEC_LB2] +detrás + +[FEC_LB3] +Mirar detrás + +[FEC_R3] +(botón R3) + +[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 vista rifle francotirador + +[FEC_SZO] +Alejar vista 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] +Misiones secundarias + +[FEC_CRD] +Cambiar emisora de radio + +[FEC_ENT] +Entrar/salir de vehículo + +[FEC_WPN] +Disparar arma + +[FEC_PAS] +Pausa + +[FEC_FPO] +Cambiar armas primera persona + +[FEC_SMS] +Mostrar puntero del ratón + +[FEC_CMS] +Cambiar modo cámara en todas situaciones. + +[FEC_TSS] +Capturar pantalla + +[FEC_DBG] +DEBUG MENU + +[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~ + +[FEC_WAR] +Aviso + +[FEC_OKK] +Aceptar + +[FEC_DLF] +Error al borrar. + +[FEC_SVU] +Error al guardar. + +[FEC_LUN] +Error al cargar. Archivo dañado, por favor bórralo. + +[FEC_PAD] +Gamepad + +[FEC_JOY] +Joystick + +[FES_CSA] +Seleccionar aspecto de la lista inferior: + +[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_DSN] +Apariencia predeterminada del jugador.bmp + +[FET_RSO] +RESTAURADO AJUSTE ORIGINAL + +[FET_RSC] +HARDAWARE NO DISPONIBLE. RESTAURADO AJUSTE ORIGINAL + +[FEA_3DH] +HARDWARE DE SONIDO + +[FEA_SPK] +AJUSTE DE ALTAVOCES + +[FEM_LOD] +DIST. DE REPRESENTACIÓN + +[FEM_VSC] +SINCRONÍA DE IMAGEN + +[FEM_FRM] +LIMITADOR DE CUADROS + +[FEM_MM] +MENÚ PRINCIPAL + +[FED_RES] +RESOLUCIÓN DE PANTALLA + +[FET_CTL] +CONFIGURAR MANDO + +[FET_OPT] +OPCIONES + +[FEC_MSH] +SENSIBILIDAD DEL RATÓN + +[FEC_IVV] +INVERTIR VERTICALIDAD RATÓN + +[FEC_FNC] +F~1~ + +[FEC_IRT] +INSERT + +[FEC_DLL] +SUPR + +[FEC_HME] +INICIO + +[FEC_END] +FIN + +[FEC_PGU] +RE PÁG + +[FEC_PGD] +AV PÁG + +[FEC_UPA] +ARRIBA + +[FEC_DWA] +ABAJO [FEC_LFA] -IZQUIERDA +IZDA -[FEH_SGA] -Iniciar nueva partida +[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] +RETROCESO + +[FEC_TAB] +TAB + +[FEC_CLK] +BLOQ MAYÚS + +[FEC_RTN] +INTRO + +[FEC_LSF] +MAYÚS IZQ + +[FEC_RSF] +MAYÚS DCH + +[FEC_LCT] +CTRL I + +[FEC_RCT] +CTRL D + +[FEC_LAL] +ALT I + +[FEC_RAL] +ALT D + +[FEC_LWD] +WIN I + +[FEC_RWD] +WIN D + +[FEC_WRC] +APMENÚ + +[FEC_SPC] +ESPACIO + +[WIN_TTL] +Grand Theft Auto VC + +[WIN_95] +Grand Theft Auto VC no se puede ejecutar bajo W95 + +[WIN_DX] +Grand Theft Auto VC necesita al menos la versión 8.1 de DirectX + +[FET_EIG] +NO SE PUEDE DEFINIR UN CONTROL PARA ESTA ACCIÓN + +[FET_DAM] +MODELADO ACÚSTICO DINÁMICO + +[FEQ_SRE] +¿Seguro que quieres salir? Se perderán todos los progresos desde la última partida guardada. ¿Quieres proceder? + +[FEQ_SRW] +¿Seguro que quieres salir del juego? + +[FET_QG] +SALIR DEL JUEGO + +[FEN_STA] +INICIAR JUEGO + +[FET_PAU] +MENÚ PAUSA + +[REPLAY] +VOLVER A JUGAR + +[FEC_ANS] +Acción + +[CVT_MSG] +Convertir texturas a un formato óptimo para tu tarjeta de vídeo + +[FEC_SFT] +MAYÚS + +[FEH_VMP] +VER MAPA + +[FES_DEE] +¡Error al eliminar! Por favor, inténtalo de nuevo. + +[FES_CMP] +¡Error al guardar! Por favor, inténtalo de nuevo. + +[FESZ_WR] +Guardando partida actual. Por favor, espera... + +[FELD_WR] +Cargando el juego. Por favor, espera... + +[FEDL_WR] +Eliminando partida guardada. Por favor, espera... + +[PCRESRT] +Iniciando nueva partida. Por favor, espera... + +[FET_STI] +Controles estándar + +[FET_CTI] +Controles clásicos + +[FEH_NA] +OPCIÓN NO DISPONIBLE + +[FEH_MPH] +RATÓN, CURSORES PARA MOVERSE - RE. PAG, AV. PAG, RUEDA RATÓN PARA ZOOM, L - LEYENDA + +[FEA_MP3] +REPRODUCTOR MP3 + +[NO_PCCD] +Por favor, introduce tu CD de GTA Vice City o pulsa ESC para cancelar + +[FEH_SSA] +CURSORES PARA MOVERSE - S PARA GUARDAR EN UN ARCHIVO + +[FES_CMI] +ÚLTIMA MISIÓN SUPERADA + +[FET_STS] +ESTADÍSTICAS GUARDADAS EN 'STATS.HTML' + 'STATS.TXT' + +[WIN_VDM] +Grand Theft Auto VC no pudo encontrar suficiente memoria de vídeo disponible + +[FEC_ERI] +¡Error! Una o más acciones de control no están vinculadas a ninguna tecla o botón. Comprueba que todas las acciones de control estén definidas. + +[FEC_TFU] +Torreta + Inclinar arriba + +[FEC_TFD] +Torreta + Inclinar abajo + +[FET_RIG] +ELIGE UN NUEVO CONTROL PARA ESTA ACCIÓN + +[FEA_NM3] +NO SE ENCONTRARON ARCHIVOS MP3 + +[FEA_MPB] +SUBIR VOLUMEN DE MP3 + +[FEA_MUS] +VOLUMEN DE MÚSICA + +[FEA_SFX] +VOLUMEN DE EFECTOS + +[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. + +[FEA_ADP] +DETECTAR EL HARDWARE AUTOMÁTICAMENTE + +{=================================== MISSION TABLE AMBULAE ===================================} + +[ATUTOR2:AMBULAE] +~g~Lleva a los pacientes al hospital CON CUIDADO. Cada bache reduce sus posibilidades de supervivencia. + +[A_FULL:AMBULAE] +~r~¡Ambulancia llena! + +[A_FAIL2:AMBULAE] +~r~¡Tu falta de urgencia ha sido mortal para el paciente! + +[A_FAIL3:AMBULAE] +~r~¡El paciente está muerto! + +[A_PASS:AMBULAE] +¡Rescatado! + +[A_COMP2:AMBULAE] +¡Nunca te cansarás! + +[A_CANC:AMBULAE] +~r~¡Misión de ATS cancelada! + +[A_COMP3:AMBULAE] +¡Misiones de ATS completadas! ¡Nunca te cansarás cuando estés corriendo! + +[ALEVEL:AMBULAE] +Misión de ATS nivel ~1~ + +[A_FAIL1:AMBULAE] +Misión de ATS terminada. + +[A_SAVES:AMBULAE] +PERSONAS SALVADAS: ~1~ + +[A_COMP1:AMBULAE] +Misiones de ATS completas: ~1~ $ + +{=================================== MISSION TABLE ASSIN1 ===================================} + +[ASM1_5:ASSIN1] +~r~¡Completó sus entregas! + +[ASM1_6:ASSIN1] +Entregas restantes: + +[ASM1_7:ASSIN1] +~g~Carl Pearson, repartidor de pizza. Mátale antes que finalice el reparto. + +[ASM1_A:ASSIN1] +Sr. Teal, su ayuda en erradicar a esos forasteros fue inestimable para el negocio. Tengo más trabajo para usted y más cercano a la ''intervención''. + +[ASM1_D:ASSIN1] +Sr. Teal, su ayuda en erradicar a esos forasteros fue inestimable para el negocio. + +{=================================== MISSION TABLE ASSIN2 ===================================} + +[ASM2_1:ASSIN2] +~g~La Sra. Dawson dejará pronto la joyería de Vice Point. Mátala. Debe parecer un accidente de coche. + +[ASM2_3:ASSIN2] +~g~¡Va a estallar! ¡Largo de aquí! + +[ASM2_4:ASSIN2] +~r~Dañaste su coche ¡y ni siquiera está en él! ¡Ahora no se subirá ahí! + +[ASM2_5:ASSIN2] +~r~¡Se escapó! + +[ASM2_6:ASSIN2] +~r~¡Estabas demasiado cerca de la escena del ''accidente''! + +[ASM2_7:ASSIN2] +~g~¡No utilices armas! ¡Se supone que debe parecer un accidente! ¡En vez de eso, sácala de la carretera! + +[ASM2_8:ASSIN2] +~g~Debes hacer que la muerte de la Sra. Dawson parezca un accidente. No utilices ningún arma. + +[ASM2_9:ASSIN2] +~g~¡Necesitas un coche para este trabajo! + +[ASM2_10:ASSIN2] +~g~Cuando el coche explote en llamas vete lo más lejos posible de la escena del accidente. + +[ASM2_11:ASSIN2] +¡Ayúdame! + +[ASM2_12:ASSIN2] +¡Que alguien me ayude! + +[ASM2_13:ASSIN2] +¡oh, Dios mío! + +[ASM2_A:ASSIN2] +Felicidades por un trabajo bien hecho, Sr. Teal. Mi cliente está muy satisfecho. + +[ASM2_2:ASSIN2] +salud: + +{=================================== MISSION TABLE ASSIN3 ===================================} + +[ASM3_11:ASSIN3] +TIEMPO: + +[ASM3_C:ASSIN3] +Una banda europea planea atracar un banco en Vice City. A mis jefes les gustaría que esto no sucediese. + +[ASM3_D:ASSIN3] +Cada miembro de la banda tiene una tapadera mientras está aquí en Vice City. Algunos tienen trabajos sin importancia y otros están de vacaciones. + +[ASM3_E:ASSIN3] +Cada objetivo y sus posibles paraderos están pegados con cinta adhesiva bajo el teléfono. + +[ASM3_14:ASSIN3] +~g~Dick Tanner está ubicado junto al DBP de Seguridad en Ocean Drive. + +[ASM3_15:ASSIN3] +~g~Marcus Hammond y Franco Carter están ubicados junto a la joyería en Vice Point. + +[ASM3_16:ASSIN3] +~g~Nick Kong está en su barco cerca de Washington Beach. + +[ASM3_18:ASSIN3] +~g~¡No te acerque demasiado al objetivo o te descubrirá y tendrás que perseguirle hasta atraparle! + +[ASM3_19:ASSIN3] +~g~¡Te ha visto! ¡Acaba con él! + +[ASM3_20:ASSIN3] +~g~¡Te han visto! ¡Asegúrate de acabar con los dos! + +[ASM3_21:ASSIN3] +~r~¡No mataste a todos los miembros de la banda a tiempo! + +[ASM3_22:ASSIN3] +~g~¡No te acerques demasiado a los objetivos o te descubrirán e intentarán escapar. + +[ASM3_12:ASSIN3] +~g~Se ha dejado cerca una selección de armas en caso de necesidad. Dispones de ~h~9 MINUTOS ~g~para matar a todos los miembros de la banda. + +[ASM3_13:ASSIN3] +~g~Mike Griffin está trabajando en una valla de publicidad en Washington. + +[ASM3_17:ASSIN3] +~g~Charlie Dilson está dando una vuelta en su moto en Washington. + +{=================================== MISSION TABLE ASSIN4 ===================================} + +[ASM4_10:ASSIN4] +~g~¡Parece que no eres el único que persigue el maletín! ¡Llévalo deprisa a Ammu- Nation! + +[ASM4_12:ASSIN4] +Distancia: + +[ASM4_15:ASSIN4] +~g~Busca el rifle de francotirador hacia tu derecha. + +[ASM4_16:ASSIN4] +~g~Observa a la mujer de la galería, bajará por las escaleras mecánicas y preguntará a alguien la hora. + +[ASM4_17:ASSIN4] +~g~Solamente cuando la conversación haya concluido, mata a la persona con la que habló, pero no la mates a ella. + +[ASM4_18:ASSIN4] +~g~Cuando el objetivo haya muerto, recupera el maletín y llévalo a Ammu-Nation, en el centro. + +[ASM4_19:ASSIN4] +~g~Mantén tu distancia del objetivo, la barra de distancia de la parte superior de la pantalla te indica lo cerca que estás del objetivo. + +[ASM4_20:ASSIN4] +~g~No dejes que se llene o te verá. + +[ASM4_21:ASSIN4] +~g~¡Recoge el maletín! + +[ASM4_22:ASSIN4] +~g~Lleva el maletín a Ammu-Nation, en el centro. + +[ASM4_23:ASSIN4] +~g~¡Te ha visto y se escapa, atrápale y consigue el maletín! + +[ASM4_25:ASSIN4] +~r~¡Has matado a la mujer, idiota! + +[ASM4_26:ASSIN4] +~r~¡El objetivo ha subido a su avión! + +[ASM4_27:ASSIN4] +~r~¡El objetivo te ha visto! ¡Deberías mantener tu distancia! + +[ASM4_28:ASSIN4] +~r~¡El objetivo te ha visto! ¡Te ha escuchado disparar el arma! + +[ASM4_29:ASSIN4] +~r~¡Mátale sólo después que haya hablado con la mujer! + +[ASM4_A:ASSIN4] +Es hora de ir a por el pez gordo, Sr. Teal. Hay un rifle a su derecha, tras la maceta. + +[ASM4_B:ASSIN4] +Observe a la mujer que está en la galería por encima de los mostradores de facturación. Caminará por entre la gente y le preguntará a alguien la hora. + +[ASM4_C:ASSIN4] +Debe matar a esa persona, recoger el maletín y llevarlo al lugar adherido con cinta bajo el teléfono. + +{=================================== MISSION TABLE ASSIN5 ===================================} + +[ASM5_A:ASSIN5] +Un valioso canje va a tener lugar en el tejado de la compañía de helados Cherry Popper. + +[ASM5_B:ASSIN5] +Liquide a todos los implicados, robe el maletín y llévelo al helipuerto del aeropuerto. + +[ASM5_C:ASSIN5] +Hay una puerta a su izquierda que conduce a la parte trasera de la fábrica. + +[ASM5_1:ASSIN5] +~g~Entra al complejo por detrás de la compañía de helados Cherry Popper y dirígete al tejado donde va a tener lugar el trato. + +[ASM5_2:ASSIN5] +~g~Consigue el maletín y llévalo al helipuerto del aeropuerto. + +[ASM5_3:ASSIN5] +~g~¡Lleva el maletín al helipuerto del aeropuerto! + +{=================================== MISSION TABLE BANKJ1 ===================================} + +[WANTED1:BANKJ1] +~g~¡Quítate de encima a los polis y pierde tu nivel de se busca! + +[BJM1_A:BANKJ1] +¡Tommy! ¡Eh, Tommy, mira esto, es genial! ¡He hecho que nos instalen un minibar! + +[BJM1_B:BANKJ1] +Tenemos todo un bar abajo, Ken. + +[BJM1_C:BANKJ1] +Sí, sí, vale. Bueno, tengo la pizarra que pediste. + +[BJM1_D:BANKJ1] +Eso es lo bueno de estudiar derecho: te enseñan a seguir las instrucciones. + +[BJM1_E:BANKJ1] +Necesito un hombre para la caja fuerte. + +[BJM1_F:BANKJ1] +De acuerdo, bueno, déjame pensar... caja fuerte, caja fuerte, caja fuerte, caja fuerte... ¡Lo tengo! ¡Este tipo te va a encantar! + +[BJM1_G:BANKJ1] +Ah, ese idiota no. Está encerrado. + +[BJM1_H:BANKJ1] +¿Encerrado dónde? + +[BJM1_I:BANKJ1] +En la celda de una comisaría esperando el traslado. + +[BJM1_J:BANKJ1] +Creo que está a punto de conseguir la libertad condicional... + +[BJM1_1:BANKJ1] +~g~¡Libera a Cam Jones de la comisaría de policía! + +[BJM1_3:BANKJ1] +~g~Encontrarás algo útil en el vestuario de la comisaría. + +[BJM1_21:BANKJ1] +~g~Puedes encontrar la llave de las celdas en el piso de arriba de la comisaría. + +[BNK1_7:BANKJ1] +¿Cam Jones? + +[BNK1_8:BANKJ1] +¡Te voy a sacar de aquí! + +[BNK1_10:BANKJ1] +Sí, soy yo... + +[BNK1_11:BANKJ1] +¡Lo que tú digas! + +[BNK1_13:BANKJ1] +Voy a hacer un trabajo y tu serás mi revienta cajas fuertes. + +[BNK1_14:BANKJ1] +¡Eso es mejor que pudrirse en una celda! + +[BJM1_22:BANKJ1] +~g~¡Lleva a Cam de vuelta a su casa! + +[BJM1_23:BANKJ1] +~g~¡Necesitas coger la tarjeta llave primero! + +[BNK1_12:BANKJ1] +¡Piérdeles el rastro y llévame a mi casa! + +[BJM1_20:BANKJ1] +¡Guarda el arma o te enfréntate a las consecuencias! + +[BJM1_5:BANKJ1] +¡Sólo personal autorizado más allá de este punto! + +[BJM1_2:BANKJ1] +~r~¡Se supone que tenías que sacar a rastras a Cam, no matarle! + +[BJM1_4:BANKJ1] +¡Está armado! ¡Mátale! + +{=================================== MISSION TABLE BANKJ2 ===================================} + +[BJM2_A:BANKJ2] +Necesitamos a un atracador. ¿Conoces a alguno? + +[BJM2_B:BANKJ2] +Eh, Tommy, Tommy, Tommy, esta mierda te pone a tono, tío. + +[BJM2_C:BANKJ2] +¡Guauuuuu! + +[BJM2_D:BANKJ2] +¡Yo podría ser tu atracador! ¡Manos arriba! ¡Manos arriba! + +[BJM2_E:BANKJ2] +Tú no eres un atracador, tú eres un idiota. + +[BJM2_F:BANKJ2] +Ahora ponte una copa y cállate. + +[BJM2_G:BANKJ2] +Eh. ¡Quítate de mi camino! Sí, sí, sí, eh, eh. + +[BJM2_H:BANKJ2] +¿Cam, tú qué opinas? + +[BJM2_I:BANKJ2] +Bueno, el mejor tirador de esta ciudad es un tipo llamado Cassidy. + +[BJM2_J:BANKJ2] +¿Seguro? + +[BJM2_K:BANKJ2] +Sí. Un militar, o al menos él piensa que lo es. + +[BJM2_L:BANKJ2] +Dudo que estuviese alguna vez en el ejército, pero desde luego sabe manejar las armas. + +[BJM2_M:BANKJ2] +Estará en el campo de tiro. + +[BJM2_2A:BANKJ2] +¿Tú eres Phil Cassidy? + +[BJM2_2B:BANKJ2] +¿Por qué? + +[BJM2_2C:BANKJ2] +Estoy buscando a un hombre que sepa manejar un arma. Pero ahora que te veo, no estoy muy convencido. + +[BJM2_2D:BANKJ2] +Hijo, podría quitarte una mosca de la cabeza de un solo disparo a 100 metros. + +[BJM2_2E:BANKJ2] +Oh, ¿de verdad? + +[BJM2_2F:BANKJ2] +Sí. Aprendí en el ejército. + +[BJM2_2G:BANKJ2] +¿Se suele disparar a las moscas en el ejército? Me alegra no pagar impuestos. + +[BJM2_2H:BANKJ2] +¿Intentas ser gracioso? + +[BJM2_2I:BANKJ2] +~n~ + +[BJM2_2J:BANKJ2] +Vamos a disparar. + +[BJM2_1:BANKJ2] +~g~Ve a Ammu-Nation en el centro de la ciudad y habla con Phil Cassidy. + +[BJM2_3:BANKJ2] +TASA DE IMPACTOS: ~1~% + +[BJM2_4:BANKJ2] +PUNTUACIÓN PRIMERA FASE: ~1~ + +[BJM2_6:BANKJ2] +PUNTUACIÓN SEGUNDA FASE: ~1~ + +[BJM2_7:BANKJ2] +PUNTUACIÓN TOTAL DE DISPARO: ~1~ + +[BJM2_9:BANKJ2] +~g~Ve al punto de inicio de la segunda fase. + +[BJM2_11:BANKJ2] +~r~¡Phil está muerto! + +[BJM2_12:BANKJ2] +~r~¡Uno de los tiradores está muerto! + +[BJM2_14:BANKJ2] +~g~¡Pasa a la siguiente fase! + +[BJM2_15:BANKJ2] +PUNTUACIÓN: + +[BJM2_17:BANKJ2] +~g~Ve y habla con Phil. + +[BJM2_18:BANKJ2] +PUNTUACIÓN A SUPERAR: + +[BJM2_19:BANKJ2] +~g~¡Acierta a tantos blancos como puedas dentro del límite de tiempo! + +[BJM2_22:BANKJ2] +~r~¡Has abandonado el campo de tiro! + +[BJM2_23:BANKJ2] +~g~Si abandonas el campo de tiro durante la competición, fracasarás en la misión. + +[BJM2_24:BANKJ2] +~g~El objetivo más cercano vale un punto. + +[BJM2_25:BANKJ2] +~g~El objetivo del medio vale dos puntos. + +[BJM2_27:BANKJ2] +~g~Todos los objetivos de esta ronda valen un punto. + +[BNK2_2:BANKJ2] +APUNTA, 3, 2, 1... ¡FUEGO! + +[BNK2_3:BANKJ2] +¡ZONA DESPEJADA! + +[BNK2_4:BANKJ2] +¡Yupiiiiiii! + +[BNK2_5:BANKJ2] +¡No podrías darle ni a un elefante a 2 metros! + +[BNK2_7:BANKJ2] +Entonces, ¿quieres hacerme un favor y ayudarme a preparar un atraco? + +[BNK2_8:BANKJ2] +Hijo, disparando de ese modo, si me pidieras que sea tu mujer, te diría que sí. + +[BNK2_9A:BANKJ2] +Hijo, mejor será que te vayas y te metas tus ideas y palabrería donde te quepan. Eres una mierda disparando. + +[BNK2_9B:BANKJ2] +Eres una mierda disparando. + +[BJM2_28:BANKJ2] +PUNTUACIÓN RONDA TRES: ~1~ + +[BJM2_20:BANKJ2] +~g~¡La ronda se acabará cuando te quedes sin ~w~tiempo ~g~o ~w~munición~g~! + +[BJM2_26:BANKJ2] +~g~El objetivo más lejano vale tres puntos. + +[BNK2_1:BANKJ2] +MUNICIÓN CARGADA + +[RANGE_1:BANKJ2] +PUNTUACIÓN POR DISPARO: ~1~ + +[BJM2_2:BANKJ2] +~g~Para abandonar la ronda, pulsa ~h~~k~~PED_JUMPING~. + +[BJM2_N:BANKJ2] +Tranqui. + +{=================================== MISSION TABLE BANKJ3 ===================================} + +[BJM3_A:BANKJ3] +Las cosas empiezan a ir bien. + +[BJM3_B:BANKJ3] +¿Cuál es el plan, Tommy? ¿Qué pasa, amigo? + +[BJM3_C:BANKJ3] +El plan es que tú sigas haciendo el imbécil. En fin, necesitamos a un conductor. + +[BJM3_D:BANKJ3] +Tommy, yo lo haré. Sé conducir. + +[BJM3_E:BANKJ3] +Necesitamos a Hilary, señor, no a un picapleitos charlatán. + +[BJM3_F:BANKJ3] +Hilary es nuestra mejor opción. Seguro que no has visto nunca conducir a nadie tan rápido. Voy a darle un toque. + +[BJM3_G:BANKJ3] +Eh, Hil, soy Phil. ¿Cómo te va? No, no hables. Recordaremos los viejos tiempos más tarde. ¿Quieres hacerme un favor? + +[BJM3_H:BANKJ3] +Tengo a un tipo del norte... No, no, no creo que sirviese en el ejército, pero quiere un conductor. + +[BJM3_I:BANKJ3] +Por un poco de acción. De acuerdo, comprendo. + +[BJM3_J:BANKJ3] +¿Qué dijo? + +[BJM3_K:BANKJ3] +Bueno, lo hará, no hay problema. Bueno, podría haber un pequeño problema... Verás, tiene miedo al abandono. + +[BJM3_L:BANKJ3] +Y parece que no trabajará para nadie que no pueda derrotarle. Tiene algo que ver con su madre o algo así. + +[BJM3_M:BANKJ3] +De todas formas primero quiere echarte una carrera, dice que se encontrará contigo fuera... + +[BJM3_2A:BANKJ3] +¿Eres Tommy? Por supuesto que eres Tommy, quiero decir, + +[BJM3_2B:BANKJ3] +¿quién más querría hablar conmigo? + +[BJM3_2C:BANKJ3] +Vale. Esto es lo que hay. + +[BJM3_2D:BANKJ3] +Conduciré para ti solamente si me demuestras que conduces bien. + +[BJM3_2E:BANKJ3] +Déjame tirado, y nunca te perdonaré. + +[BJM3_2:BANKJ3] +~r~¡Hilary está muerto! + +[BJM3_4:BANKJ3] +~g~¡Necesitas un coche para participar! + +[BNK3_1:BANKJ3] +Vale. Te llevaré pero por favor, machácame un poco. + +[BNK3_3A:BANKJ3] +Carrera callejera ilegal en progreso en Vice Point. + +[BNK3_3B:BANKJ3] +Llamando a todos los agentes. + +[BNK3_3C:BANKJ3] +Corredores callejeros, ¡esto es ilegal y no está permitido! + +{=================================== MISSION TABLE BANKJ4 ===================================} + +[BNK4_A:BANKJ4] +~w~Como podéis ver, caballeros, éste va a ser el dinero más fácil que hayamos ganado jamás. + +[BNK4_B:BANKJ4] +~w~Tommy, de verdad, tienes que plantearte seriamente el meterte en la abogacía. + +[BNK4_C:BANKJ4] +~w~Pero, ¿qué coño te estás fumando, tío? ¡Este no es un plan sencillo! + +[BNK4_D:BANKJ4] +~w~Bueno, de todas formas, ¿quién necesita un plan sencillo? + +[BNK4_E:BANKJ4] +~w~Mira el comunismo, bien, pues ese era un plan sencillo. Y jodió bien a Rusia ¿no? + +[BNK4_F:BANKJ4] +~w~Cálmate, ¿vale? Con un equipo como éste, no va a haber problemas. + +[BNK4_G:BANKJ4] +~w~Tenemos a Cam en la caja fuerte. ¿Phil? Tú y yo nos encargaremos de la seguridad y Hilary conducirá el coche de huída. + +[BNK4_H:BANKJ4] +~w~Uh, je, je, ¿no te olvidas de alguien? ¿Alguien que te ayudó siempre en esta ciudad? ¿Alguien...? + +[BNK4_I:BANKJ4] +~w~Ken... Ken, es cierto. Aquí Ken, él nos lavará el dinero y mantendrá las bebidas frías. + +[BNK4_J:BANKJ4] +~w~No comprendo qué se supone que debo hacer aquí. + +[BNK4_K:BANKJ4] +~w~Mira, es sencillo. ¿No has visto nunca una película? + +[BNK4_L:BANKJ4] +~w~Entramos en el banco, enseñamos las armas y nos marchamos siendo hombres muy ricos. + +[P_DEAD:BANKJ4] +~r~¡Phil está muerto! + +[C_DEAD:BANKJ4] +~r~¡Cam está muerto! + +[H_DEAD:BANKJ4] +~r~¡Hilary está muerto! + +[P_HIND:BANKJ4] +~r~¡Has perdido a Phil! + +[C_HIND:BANKJ4] +~r~¡Cam se ha quedado atrás! + +[H_HIND:BANKJ4] +~r~¡Hilary ha sido abandonado! + +[GETCAR:BANKJ4] +~g~¡Sube en el coche de escapada para hacer el trabajito del banco! + +[TRASHED:BANKJ4] +~r~¡DESTROZASTE EL COCHE DE FUGA! + +[BNK4_1:BANKJ4] +Yo conduciré. + +[BNK4_2:BANKJ4] +Genial. Un pasajero. Espera a que les hable de esto al grupo. + +[BNK4_3A:BANKJ4] +¡Eh, cuidado con las ruedas, Tommy! + +[BNK4_3B:BANKJ4] +¡Tommy, Hilary está ocupando mucho espacio! + +[BNK4_3C:BANKJ4] +¡No es verdad! + +[BNK4_3D:BANKJ4] +¡Sí! + +[BNK4_3E:BANKJ4] +Eh, callaos los dos o iréis andando. + +[BNK4_3F:BANKJ4] +Sí, Hilary. + +[BNK4_3I:BANKJ4] +Por el amor de Dios, Phil, deja de agitar esa cosa. + +[BNK4_3J:BANKJ4] +¡Sí, le sacarás un ojo a alguien! + +[BNK4_3M:BANKJ4] +¡Mi pequeña! ¡Está hecha un desastre! + +[BNK4_3O:BANKJ4] +Te aferras a la ilusión de una permanencia perpetua... + +[BNK4_3P:BANKJ4] +¿Qué? + +[BNK4_3Q:BANKJ4] +Crees que todas las cosas durarán. + +[BNK4_3R:BANKJ4] +La juventud, los seres queridos, la pizza... + +[BNK4_3S:BANKJ4] +Todo pasará o terminará y debes aceptar eso. + +[BNK4_3T:BANKJ4] +Sí, tienes razón. Gracias, Cam. + +[BNK4_3U:BANKJ4] +No hay de que. + +[BNK4_3V:BANKJ4] +Eh, Tommy, ¿por qué nos hemos detenido? + +[BNK4_4A:BANKJ4] +~w~Hilary, sigue conduciendo en torno a la manzana. + +[BNK4_5:BANKJ4] +~w~De acuerdo, Tommy, de acuerdo. + +[BNK4_6:BANKJ4] +~w~¡ESTO ES UN ATRACO! + +[BNK4_7:BANKJ4] +~w~¡QUE NADIE SE MUEVA! + +[BNK4_8:BANKJ4] +~w~¡TODO EL MUNDO CONTRA ESA PARED! + +[BNK4_9:BANKJ4] +¡Phil, quédate vigilando! + +[BNK4_10:BANKJ4] +¡No problemo! + +[BNK4_11:BANKJ4] +Vamos, Cam, la cámara acorazada está arriba... + +[BK4_12A:BANKJ4] +¡Maldición! ¡Es una Flange 9000! + +[BK4_12B:BANKJ4] +Podría tardar horas en abrirla, + +[BK4_12C:BANKJ4] +o cinco minutos si encuentras al director. + +[BNK4_13:BANKJ4] +Iré a averiguar en qué agujero se ha metido. + +[BK4_14A:BANKJ4] +Phil, ¿van bien las cosas? + +[BNK4_15:BANKJ4] +Sí. Todo está muy tranquilo. + +[BNK4_16:BANKJ4] +¡Tú, ven conmigo! + +[BNK4_17:BANKJ4] +¡De acuerdo! ¡De acuerdo! ¡Por favor, no dispare! + +[BNK4_18:BANKJ4] +¡DIJE QUE NO SE MOVIESE NADIE! + +[BK4_19A:BANKJ4] +Tiene un cierre temporizado. + +[BK4_19B:BANKJ4] +¡Podríais rendiros ahora mismo! + +[BK4_20A:BANKJ4] +Diablos, puedo hacer un puente en el cierre temporizado, + +[BK4_20B:BANKJ4] +¡Así que solo necesitaremos tu código de acceso y ya está! + +[BNK4_21:BANKJ4] +Quédate aquí. Intenta algo y serás comida para los peces. ¿Lo captas? + +[BNK422A:BANKJ4] +Cam, ¿cuánto tiempo? + +[BK4_23A:BANKJ4] +¡Dame cinco minutos! + +[BK4_24A:BANKJ4] +Voy a comprobar qué tal va Phil, volveré. + +[BK4_24B:BANKJ4] +¡Te dije que no tocases esa alarma! + +[BNK4_25:BANKJ4] +¡Los de operaciones especiales estarán aquí en cualquier momento! + +[BNK4_27:BANKJ4] +¡Me vendría bien un poco de ayuda aquí, Tommy! + +[BNK4_28:BANKJ4] +¡SWAT de Vice City! ¡Estáis rodeados! + +[BNK4_29:BANKJ4] +¿Rodeados? + +[BNK4_30:BANKJ4] +La están cagando, ¡bastardos corruptos! + +[BK4_31A:BANKJ4] +¡Tommy! ¡La cámara acorazada está abierta! + +[BK4_34A:BANKJ4] +De acuerdo, tenemos el fondo de pensiones de los SWAT. ¡Salgamos de aquí! + +[BK4_34B:BANKJ4] +¡De acuerdo, vosotros lo habéis pedido! ¡Habéis tenido vuestra última oportunidad! + +[BK4_35A:BANKJ4] +¡Van a arrasar el lugar! + +[BK4_35B:BANKJ4] +¡A cubierto! + +[BNK4_94:BANKJ4] +~w~De acuerdo chicos. Ha sido tan fácil como lo habíamos planeado. + +[BM_DEAD:BANKJ4] +~r~¡Necesitas al director del banco vivo! + +[ASSET_A:BANKJ4] +¡ATRACO AL BANCO COMPLETADO! + +[ASSET_B:BANKJ4] +~g~El Club Malibú generará ahora unos ingresos máximos de hasta ~1~ $ al día. ¡Asegúrate de recaudarlos regularmente! + +[IDIOT:BANKJ4] +~r~ Eso es, ve por ahí vestido como un chiflado y llamando la atención, ¡IDIOTA! + +{=================================== MISSION TABLE BARON1 ===================================} + +[COK1_A:BARON1] +Vamos nena, vamos, sí, ¡sí! + +[COK1_B:BARON1] +¡Estúpido caballo! ¡Te cortaré la cabeza! + +[COK1_C:BARON1] +¿Quién es este gilipollas? + +[COK1_D:BARON1] +Tommy Vercetti, ¿me recuerdas? + +[COK1_E:BARON1] +Perdóname, estoy un poco alterado. ¡Nunca te fíes de un maldito caballo! + +[COK1_F:BARON1] +Hiciste un buen trabajo... ahora trabajas para mí. + +[COK1_H:BARON1] +Como dije amigo, trabajas para mí. Ahora, cállate. Algún Judas me ha traicionado. + +[COK1_I:BARON1] +Él cree que no sé cuando dinero debería sacar con esto, pero robar un 3% es tan malo como robar el 100%. + +[COK1_J:BARON1] +Nadie me hace esto a mí. ¡NADIE! + +[COK1_K:BARON1] +¡Le sigues desde su apartamento y ves a dónde va! Más tarde, le mataremos. + +[COK1_1:BARON1] +¡Mierda! + +[COK1_2:BARON1] +¡Demasiado lento, abuelo! + +[COK1_4:BARON1] +Perdedor. + +[COK1_5:BARON1] +¡Mejor sigue corriendo, gilipollas! + +[COK1_8:BARON1] +~g~¡Rápido! ¡Consigue un vehículo y síguele! + +[COK1_9:BARON1] +~r~¡Se supone que debes seguirle, no matarle! + +[COK1_10:BARON1] +~r~Ve a la casa del ladrón y descubre dónde esconde el dinero. + +[COK1_11:BARON1] +~g~Echa un vistazo por su ventana. + +[COK1_7:BARON1] +~g~¡Se ha escapado por el tejado, ve tras él pero no le mates! + +[COK1_G:BARON1] +Trabajo por dinero. + +{=================================== MISSION TABLE BARON2 ===================================} + +[COK2_A:BARON2] +¿Qué clase de tonto incompetente eres? + +[COK2_B:BARON2] +¡TONTO! ¡TONTO! ¡TONTO! ¡TONTO! + +[COK2_C:BARON2] +Tommy... + +[COK2_D:BARON2] +¿Qué pasa, Ricardo? + +[COK2_E:BARON2] +Estos idiotas... Siempre intentan joderle a uno. + +[COK2_F:BARON2] +Ese es el problema de este negocio. + +[COK2_G:BARON2] +¿Qué crees que estás haciendo? + +[COK2_H:BARON2] +Estos mamones me han fallado miserablemente. + +[COK2_I:BARON2] +Pronto cualquier madre o padre creerán que pueden vender farlopa en Vice City. + +[COK2_J:BARON2] +¿Y ahora qué, eh? ¿La apestosa Mafia? + +[COK2_K:BARON2] +Ese antro de mafiosos es una fortaleza inexpugnable desde el suelo, + +[COK2_L:BARON2] +así que Quentin... ¡Quentin! ¡QUENTIN! + +[COK2_M:BARON2] +¡Volará sobre la zona! + +[COK2_N:BARON2] +¡Hacedles desaparecer! + +[COK2_O:BARON2] +¿Qué crees que estás haciendo? + +[COK2_P:BARON2] +¿Qué haces aquí? + +[COK2_Q:BARON2] +He estado haciendo preguntas por ahí, y es obvio + +[COK2_R:BARON2] +que Diaz se saltó el trato y se cargó a mi hermano. + +[COK2_S:BARON2] +¡Y te matará a ti también! + +[COK2_T:BARON2] +¡Puedo encargarme de Diaz! + +[COK2_U:BARON2] +No. ¡Escúchame! Yo me encargaré de Diaz... + +[COK2_V:BARON2] +Está empezando a confiar en mí. + +[COK2_1:BARON2] +Hay una cosa que me mosquea... ¿por qué Quentin? + +[COK2_2:BARON2] +No sé, siempre me ha gustado... Quentin Vance... + +[COK2_3:BARON2] +¿Vance? ¿Tu nombre es Lance Vance? + +[COK2_4:BARON2] +¡Eh! ¡Ya tuve bastante con eso en la escuela! + +[COK2_5:BARON2] +¿Alguna vez has disparado uno de esos desde un helicóptero? + +[COK2_8:BARON2] +En fin, ¿a dónde nos dirigimos? + +[COK2_9:BARON2] +A Prawn Island. + +[COK2_13:BARON2] +Lance Vance. Pobre desgraciado. + +[COK2_14:BARON2] +Bien, casi hemos llegado. + +[COK2_15:BARON2] +Daremos un par de pasadas. + +[COK2_16:BARON2] +Así que elimina a tantos como puedas. + +[COK2_17:BARON2] +Después te dejaré abajo y te las arreglarás solo. + +[COK2_20:BARON2] +¡Mierda! ¡Ésto es una zona de guerra! ¡Elimina a algunos de esos pistoleros! + +[COK2_21:BARON2] +¡Nos están alcanzando, tío! + +[COK2_22:BARON2] +¡Arreglar esta cosa no sale barato! ¡Elimínalos! + +[COK2_23:BARON2] +Vale, de ahora en adelante es cosa tuya... ¡Buena suerte, hermano! + +[COK2_24:BARON2] +Helicóptero: + +[COK2_25:BARON2] +~g~Ve y recoge el dinero del tejado. + +[COK2_27:BARON2] +¡Estás en mi territorio, gilipollas! + +[COK2_28:BARON2] +¡Vas a desaparecer! + +[COK2_6:BARON2] +No. Practicaré un poco por el camino. + +[OPEN_B:BARON2] +Los controles policiales con dirección a la península han sido levantados + +{=================================== MISSION TABLE BARON3 ===================================} + +[COK3_A:BARON3] +Ahora ya no os sentís tan complacidas, ¿eh? + +[COK3_B:BARON3] +~n~ + +[COK3_C:BARON3] +¡Guau! Mira hacia donde mueves esa cosa. + +[COK3_D:BARON3] +Ya no habrá más mierda de paloma en mi coche, ¿eh, Tommy? + +[COK3_E:BARON3] +Supongo que no. + +[COK3_F:BARON3] +Tienes toda la razón. Ahora escucha, + +[COK3_G:BARON3] +¿sabes quién posee el barco más rápido de la costa este? + +[COK3_H:BARON3] +Ni idea. + +[COK3_I:BARON3] +Yo. Y quiero que siga siendo así. + +[COK3_J:BARON3] +Cada traficante de aquí a Caracas tiene un sueño, un barco más rápido. + +[COK3_K:BARON3] +Se rumorea que el astillero acaba de terminar un barco así + +[COK3_L:BARON3] +para algún mamón costarricense. + +[COK3_M:BARON3] +Y Tommy... ¡QUIERO ESE BARCO! + +[COK3_N:BARON3] +Creo que han vuelto tus palomas. + +[COK3_O:BARON3] +¡Ah! Pensé que te tenía. ¿De dónde has salido? + +[COK3_P:BARON3] +¡Palomas! ¡Boom! ¡Aaaaah! + +[COK3_5:BARON3] +~g~Localiza el interruptor para bajar el barco. + +[COK3_6:BARON3] +~g~Lleva el barco a la mansión. + +[COK3_7:BARON3] +~r~¡Destruiste el barco! + +[COK3_8:BARON3] +~g~Ve al astillero, en los muelles y roba el barco más rápido. + +[COK3_9:BARON3] +~g~Ahora sube al barco. + +{=================================== MISSION TABLE BARON4 ===================================} + +[COK4_A:BARON4] +¡Expúlsala! ¡MIERDA DE PLÁSTICO! + +[COK4_B:BARON4] +¿Por qué me haces esto? + +[COK4_C:BARON4] +¿Quién te crees que eres, maldita mierda de plástico? + +[COK4_D:BARON4] +¡QUE TE JODAN! + +[COK4_E:BARON4] +Se traga mi película favorita de El burro, ¡se muere! + +[COK4_F:BARON4] +¿Qué más podría haber hecho? + +[COK4_G:BARON4] +Probablemente no estaba enchufado. + +[COK4_H:BARON4] +¿Qué? + +[COK4_I:BARON4] +Maldición... No importa, puedo comprar cien más. + +[COK4_J:BARON4] +Ahora, Tommy, + +[COK4_K:BARON4] +cada mes un camello autónomo navega hasta Vice City y amarra su yate. + +[COK4_L:BARON4] +Vende su partida al primer barco. + +[COK4_M:BARON4] +Quiero que cojas la lancha motora + +[COK4_N:BARON4] +y que elimines a todos los otros cabrones, + +[COK4_O:BARON4] +luego me traes aquí el alijo, ¿entendido? + +[COK4_P:BARON4] +Déjame adivinar, pensaste que me podía venir bien un ángel guardián. + +[COK4_Q:BARON4] +Solo digo que tienes que dejarme participar, tío. + +[COK4_R:BARON4] +Ahora ya puedes contarme toda esa basura del 'chico duro solitario', + +[COK4_S:BARON4] +pero sé que un día te voy a salvar el culo + +[COK4_T:BARON4] +¡y probablemente querrás darme un beso! + +[COK4_U:BARON4] +Colgado. + +[COK4_V:BARON4] +~n~ + +[COK4_1:BARON4] +Así que Tommy, sabemos que fue Díaz quien jodió nuestro trato... + +[COK4_3:BARON4] +Así que, ¿por qué coño vamos por ahí haciéndole recados? + +[COK4_4:BARON4] +Cuanto más aprendamos ahora, ¡menos tendremos que aprender cuando tomemos el control de esta ciudad! + +[COK4_5:BARON4] +Me encanta tu estilo, tío. Muy fresco. + +[COK4_12:BARON4] +¡Cuidado, vienen de todas partes! + +[COK4_13:BARON4] +Ya está. ¡Dirígete hacia Díaz tan rápido como puedas! + +[COK4_14:BARON4] +¿Queréis un poco de esto? + +[COK4_15:BARON4] +¡A dormir con los peces! + +[COK4_16:BARON4] +¡Comed! ¡COMED! + +[COK4_19:BARON4] +¡Más problemas ahí adelante! + +[COK4_20:BARON4] +¡Hay más pistoleros en el malecón! + +[COK4_24:BARON4] +Buen disparo, amigo mío. Eres un verdadero y auténtico lunático de categoría A. + +[COK4_25:BARON4] +Bueno, gracias. + +[COK4_26:BARON4] +Nos vemos, Tommy. + +[COK4_27:BARON4] +Vale, Sr. Lance Vance. + +[COK4_28:BARON4] +~g~¡Ve hasta el yate antes de que lleguen los otros barcos! + +[COK4_31:BARON4] +~g~¡Ve al barco más rápido del embarcadero! + +[COK4_32:BARON4] +~r~¡Demasiado lento! + +[COK4_33:BARON4] +~r~¡Has destruido el barco! + +[COK4_34:BARON4] +~g~¡Hunde esos barcos! + +[COK4_35:BARON4] +Estado del barco: + +{=================================== MISSION TABLE BARON5 ===================================} + +[PROP_A:BARON5] +¡PROPIEDAD ADQUIRIDA! + +[COK4_30:BARON5] +~r~¡Lance está muerto! + +[ASS1_A:BARON5] +He conseguido unos juguetes nuevos. Están en el maletero. + +[ASS1_B:BARON5] +¡Mierda! ¿Dónde conseguiste todo este material? + +[ASS1_C:BARON5] +Lo he estado guardando para un momento como éste. + +[ASS1_D:BARON5] +¿Te gusta? + +[ASS1_E:BARON5] +Sí, me gusta. + +[ASS1_F:BARON5] +Estúpidos mamones... + +[ASS1_G:BARON5] +Mi hermosa casa. + +[ASS1_H:BARON5] +¡Mirad lo que le habéis hecho! + +[ASS1_I:BARON5] +¡Esto es por mi hermano! + +[ASS1_J:BARON5] +Confiaba en ti, Tommy. + +[ASS1_K:BARON5] +Te hubiese convertido en... + +[ASS1_L:BARON5] +Diga buenas noches, Sr. Díaz. + +[ASS1_1:BARON5] +Este lugar va a estar hasta arriba de capullos... ten cuidado... + +[ASS1_2:BARON5] +No te preocupes Tommy, te cubro. + +[ASS1_13:BARON5] +¡DÍAZ! ¡He venido a encargarme de tu negocio! + +[ASS1_14:BARON5] +¡TOMMY! Me has traicionado... ¡Imbécil! Voy a acabar contigo muy pronto... + +[ASS1_15:BARON5] +~g~¡Arrasa esa mansión y mata a Diaz! + +[ASS1_16:BARON5] +~g~¡Mata a Diaz! + +[ASS1_17:BARON5] +~g~Hay múltiples caminos para entrar en la mansión. + +[BUD1:BARON5] +Lance + +[ASS1_18:BARON5] +~g~La puerta está cerrada con llave, intenta otra ruta. + +[ASS1_19:BARON5] +¡Por aquí! + +[ASS1_20:BARON5] +¡Tommy, mi problema es con Quentin, no contigo, tío! + +{=================================== MISSION TABLE BIKE1 ===================================} + +[BM1_A:BIKE1] +¿Dónde está Baker? + +[BM1_B:BIKE1] +Estoy buscando al gran Mitch Baker... + +[BM1_C:BIKE1] +¿Quién le busca? + +[BM1_D:BIKE1] +Tommy Vercetti. + +[BM1_E:BIKE1] +Vercetti. + +[BM1_F:BIKE1] +No pareces policía, así que eso te concede un minuto. + +[BM1_G:BIKE1] +Habla rápido. + +[BM1_H:BIKE1] +Kent Paul dijo que podrías estar interesado en llevar la seguridad de una gira que él ha organizado. + +[BM1_I:BIKE1] +¿Kent Paul? No me extraña que te enviase en su lugar. + +[BM1_J:BIKE1] +La última vez que estuvo aquí, se marchó por la ventana sin nada, tal cual le trajo su madre al mundo. + +[BM1_K:BIKE1] +¿Estás interesado o no? + +[BM1_L:BIKE1] +Sólo hacemos favores a los nuestros. + +[BM1_M:BIKE1] +¿Cómo puedo unirme a vosotros? + +[BM1_N:BIKE1] +Este no es un club de campo, chico. ¿Sabes montar en moto? + +[BM1_O:BIKE1] +¿Sabes sentarte en un taburete y beber? + +[BM1_P:BIKE1] +Cougar, Zeppelin, id a ver cómo se le da la moto a esta nenaza... + +[BM1_2:BIKE1] +~g~¡Necesitas una Freeway o una Ángel para competir! + +[BM1_3:BIKE1] +~r~¡Los corredores han sido atacados! + +[BIKE1_1:BIKE1] +Bien, modelitos caros. Veamos qué puedes hacer. + +[BM1_1:BIKE1] +~g~Consigue una Freeway o una Ángel y ve a la parrilla de salida. + +{=================================== MISSION TABLE BIKE2 ===================================} + +[BM2_1:BIKE2] +CAOSMETRO: + +[BM2_A:BIKE2] +Te he vuelto a ganar. + +[BM2_B:BIKE2] +Eh, Vercetti. + +[BM2_C:BIKE2] +Cougar dice que sabes manejar muy bien una moto. + +[BM2_D:BIKE2] +Sí, ¿cuántos recados más voy a tener que hacer? + +[BM2_E:BIKE2] +Soy un hombre muy ocupado. + +[BM2_F:BIKE2] +Si es un combate lo que va arreglarlo todo, entonces adelante. + +[BM2_G:BIKE2] +Ser uno de nosotros no va solo de fanfarronear. Va de ser parte de una familia. + +[BM2_H:BIKE2] +Sí, he sido parte de una familia antes. No funcionó. + +[BM2_I:BIKE2] +Sí, seguro, pero esta familia cuida de los suyos. + +[BM2_J:BIKE2] +No le pedimos a un hombre que haga el trabajo sucio y luego le dejamos pasar quince años de sequía. + +[BM2_K:BIKE2] +Sí, es verdad. He hecho mis deberes. + +[BM2_L:BIKE2] +Ésta de aquí es la familia más grande de inadaptados, rebeldes y tipos duros. + +[BM2_M:BIKE2] +Diablos, algunos de nosotros incluso hemos sido traicionados por nuestro propio país. + +[BM2_N:BIKE2] +Estuve preso durante Vietnam. Un tema desagradable. + +[BM2_O:BIKE2] +Por eso es por lo que voy a pedirte que vayas a armar jaleo. + +[BM2_P:BIKE2] +Este maldito país necesita una patada en el culo, y nosotros se la vamos a dar. + +[BM2_Q:BIKE2] +¡Así que sal de ahí, pilla una moto, demuestra a esta ciudad lo cabreado que estás! + +[BM2_R:BIKE2] +De acuerdo. + +[BM2_2:BIKE2] +~g~¡Debes llenar el Caosmetro en el tiempo determinado para demostrarnos lo duro que eres! + +[BM2_3:BIKE2] +~g~Este sonido indica que has llenado una parte del contador, continúa así. + +[BM2_4:BIKE2] +~r~¡Has fracasado en llenar el Caosmetro a tiempo! + +{=================================== MISSION TABLE BIKE3 ===================================} + +[BM3_A:BIKE3] +Hola, Mitch. + +[BM3_B:BIKE3] +Bueno, si es el ''tipo duro'' Vercetti. + +[BM3_C:BIKE3] +Ahora quiero ver lo bien que sabes luchar por tu territorio. + +[BM3_D:BIKE3] +Una banda callejera local cometió el error de robar mi moto, + +[BM3_E:BIKE3] +probablemente para hacerse los machos o algo así. + +[BM3_F:BIKE3] +Los chicos y yo iríamos a darles una lección sobre el respeto a las propiedades ajenas y todo eso. + +[BM3_G:BIKE3] +En fin... + +[BM3_H:BIKE3] +Entonces empecé a pensar que esto sería una buena iniciación para ti. + +[BM3_I:BIKE3] +Devuélveme mi moto y puedes decirle a Paul que tiene su seguridad. + +[BM3_2:BIKE3] +~r~¡Se suponía que debías traer de vuelta la moto, no destruirla! + +[BM3_3:BIKE3] +~g~¡Lleva la moto de vuelta al bar! + +[BM3_4:BIKE3] +~g~¡Sube a la moto! + +[INTRUDE:BIKE3] +~g~¡Te han visto! + +[BM3_6:BIKE3] +~g~Están refugiados detrás de Ammu-Nation en la zona del centro. + +[BM3_7:BIKE3] +~g~Necesitarás una moto rápida para conseguir acceder al tejado. + +[BM3_8:BIKE3] +~g~Utiliza la moto para saltar desde esas escaleras hasta el tejado que hay en el extremo opuesto de la carretera. + +[BM3_1:BIKE3] +~g~Una banda local ha robado la Ángel de Mitch Baker. ¡Recupérala! + +[BM3_9:BIKE3] +~g~¡Recupera la Ángel de Mitch y sal de ahí! + +{=================================== MISSION TABLE BMX_1 ===================================} + +[GETBIK2:BMX_1] +¡Tienes ~1~ segundos para subirte a una moto de motocross! + +{=================================== MISSION TABLE BOATBUY ===================================} + +[DRUG_1:BOATBUY] +¿Hola? + +[DRUG_2:BOATBUY] +Apágalo. Hay un tipo ahí afuera. + +[DRUG_3:BOATBUY] +¡Eh, el tipo del traje! Supongo que eres el nuevo propietario. + +[DRUG_4:BOATBUY] +Sí. ¿Cuál de los barcos es el más rápido? + +[DRUG_5:BOATBUY] +Ya está en el agua, tío, + +[DRUG_6:BOATBUY] +Pensé que querrías probarlo. + +[DRUG_7:BOATBUY] +Tío, funciona con un motor de 300 caballos... + +[DRUG_8:BOATBUY] +y el casco es de fibra de vidrio, ¡sale disparado por las olas! + +[DRUG_9:BOATBUY] +Puede ponerse de cero a noventa tan sólo en cuatro segundos, tío... + +[DRUG_10:BOATBUY] +¡y puede llevar como veinte contenedores de la mejor hierba jamaicana justo en el casco! + +[DRUG_11:BOATBUY] +Así que adelante, tío, ¡está preparada para volar! + +[DRUG_12:BOATBUY] +Tipo trajeado, ¿tienes fuego? + +[DRUG_13:BOATBUY] +¿Colega? + +{=================================== MISSION TABLE CAP_1 ===================================} + +[CAP1_B1:CAP_1] +~g~La mafia está imponiendo impuestos a tus negocios. Encuéntrales y mátales. + +[CAP1_B2:CAP_1] +~g~¡La mafia ha saqueado el astillero! + +[CAP1_B3:CAP_1] +~g~¡La mafia ha saqueado la fábrica de helados! + +[CAP1_B4:CAP_1] +~g~¡La mafia ha saqueado el salón de autos! + +[CAP1_B5:CAP_1] +~g~¡La mafia ha saqueado la compañía de taxis! + +[CAP_01:CAP_1] +¿Cuál es la emergencia? + +[CAP_02:CAP_1] +¿QUIÉN? + +[CAP_03:CAP_1] +Tommy... unos matones mafiosos... dijeron que vendrían a recoger su parte... + +[CAP_04:CAP_1] +Dijeron que era dinero del Sr. Forello... me siento una basura. + +[CAP_05:CAP_1] +¿Forelli? ¿SONNY Forelli? + +[CAP_06:CAP_1] +Sí, ése es el tipo... creo... insistieron mucho... + +[CAP_07:CAP_1] +No te preocupes, abuelo, no estoy enfadado contigo. + +[CAP_08:CAP_1] +Llevadle al hospital. + +[CAP_09:CAP_1] +Tommy... rájale un nuevo culo a ese tipo por mí... + +[CAP_10:CAP_1] +Voy a rajarle en dos. + +[CAP1_2:CAP_1] +¡Conoces las reglas, Vercetti! + +[CAP1_3:CAP_1] +¡El Sr. Forelli envía sus saludos! + +[CAP1_4:CAP_1] +¡Es el carnicero de Harwood! + +[CAP1_5:CAP_1] +Decidle a Sonny... ¡Que permanezca alejado! + +[CAP1_6:CAP_1] +Vice City ahora es MÍA, NO suya. + +[CAP1_7:CAP_1] +¿Crees que puedes eliminarme, Vercetti? + +[CAP1_8:CAP_1] +Seguiremos yendo tras de ti hasta que mueras, Vercetti. + +[CAP1_9:CAP_1] +No tienes ni una oportunidad, mamón psicótico. + +[CAP1_10:CAP_1] +Te mataré, Vercetti. + +[CAP1_11:CAP_1] +Siempre fuiste un gilipollas. + +[CAP1_12:CAP_1] +Vas a morir, Vercetti. + +[CAP1_B6:CAP_1] +~g~Has encontrado al cobrador, remátale. + +[CAP1_B7:CAP_1] +~g~Has perdido al cobrador. + +[CAP1_B8:CAP_1] +~r~El cobrador ha saqueado todos tus negocios. + +[CAP1_B9:CAP_1] +~g~¡La mafia ha saqueado a El Malibu! + +[CAP1_B0:CAP_1] +~g~¡La mafia ha saqueado al estudio cinematográfico! + +[CAP1_C2:CAP_1] +~g~¡La mafia ha llegado al astillero! + +[CAP1_C3:CAP_1] +~g~¡La mafia ha llegado a la fábrica de helados! + +[CAP1_C4:CAP_1] +~g~¡La mafia ha llegado al concesionario de coches! + +[CAP1_C5:CAP_1] +~g~¡La mafia ha llegado a la compañía de taxis! + +[CAP1_C9:CAP_1] +~g~¡La mafia ha llegado al Malibú! + +[CAP1_C0:CAP_1] +~g~¡La mafia ha llegado al estudio cinematográfico! + +[CAP1_D2:CAP_1] +~g~¡La mafia abandona el astillero! + +[CAP1_D3:CAP_1] +~g~La mafia abandona la fábrica de helados! + +[CAP1_D4:CAP_1] +~g~¡La mafia abandona el concesionario de coches! + +[CAP1_D5:CAP_1] +~g~¡La mafia abandona la compañía de taxis! + +[CAP1_D9:CAP_1] +~g~¡La mafia abandona el Malibú! + +[CAP1_D0:CAP_1] +~g~¡La mafia abandona el estudio cinematográfico! + +[CAP1B10:CAP_1] +Has puesto límite a los recaudadores. Vienen más de camino. + +{=================================== MISSION TABLE CARBUY ===================================} + +[CAR1_1:CARBUY] +B.J. Smith. Y usted debe ser el Sr. Vercetti. + +[CAR1_2:CARBUY] +¿Le gustaría dar una vuelta? + +[CAR1_3:CARBUY] +Podría ser. + +[CAR1_4:CARBUY] +Estoy muy triste por vender el negocio. + +[CAR1_5:CARBUY] +Esta fue mi primera inversión después de convertirme en profesional. + +[CAR1_6:CARBUY] +Pero es hora de que me mude. + +[CAR1_7:CARBUY] +¿Deja la ciudad? + +[CAR1_8:CARBUY] +No demasiado deprisa, espero. + +[CAR1_9:CARBUY] +No. Me estoy retirando pero simplemente para preparar mi regreso. + +[CAR1_10:CARBUY] +El negocio no era demasiado fuerte, + +[CAR1_11:CARBUY] +y mi equipo quizás se puso demasiado + +[CAR1_12:CARBUY] +creativo con la generación de la riqueza. + +[CAR1_13:CARBUY] +Obviamente, habría podido desmantelar el negocio antes de cederlo. + +[CAR1_14:CARBUY] +Diablos, podría haber quemado el sitio si hubiese querido. + +[CAR1_15:CARBUY] +Esta es tierra para una urbanización de primera. + +[CAR1_16:CARBUY] +Oh, yo no me preocuparía por nada de eso. + +[CAR1_17:CARBUY] +Este lugar parece perfecto. + +[CAR1_18:CARBUY] +Sí, así es, ¿así que entiendo que tenemos un trato? + +{=================================== MISSION TABLE CARPAR1 ===================================} + +[MM_1_A:CARPAR1] +~g~Atraviesa ~y~5 puntos de control ~r~¡SIN ~g~aplastar ningún ~r~CONO! ~g~Puedes atravesarlos en ~y~CUALQUIER ORDEN. + +[CONE_1:CARPAR1] +~r~¡Aplastaste un cono! + +[MM_1_C:CARPAR1] +~y~PASA POR~g~ un punto de control para activar el temporizador. ~g~Cada punto de control te dará ~y~~1~ SEGUNDOS~g~. + +{=================================== MISSION TABLE COPCAR ===================================} + +[KILLS:COPCAR] +MUERTES: + +[C_BREIF:COPCAR] +~g~Sospechoso visto por última vez en la zona de ~a~. + +[C_PASS:COPCAR] +AMENAZA ELIMINADA: ~1~ $ + +[COPCART:COPCAR] +~g~Tienes ~1~ segundos para volver al vehículo de policía antes de que termine la misión. + +[C_CANC:COPCAR] +~r~¡Misión de justiciero cancelada! + +[C_TIME:COPCAR] +~r~¡Tu tiempo como representante de la ley se ha terminado! + +[C_COMP1:COPCAR] +Has completado el nivel 12 de la misión de justiciero: tu armadura personal máxima ha aumentado a 150. + +[CLEVEL:COPCAR] +Misión de justiciero nivel ~1~ + +{=================================== MISSION TABLE COUNT1 ===================================} + +[CM1_A:COUNT1] +¿Sr. Vercetti? ¿Comprando la vieja imprenta? + +[CM1_B:COUNT1] +Sí, mi viejo solía trabajar con ellas. + +[CM1_C:COUNT1] +Iba a seguirle en el negocio, pero... viví una vida diferente. + +[CM1_D:COUNT1] +¿Planea vender la vieja maquinaria o destruirla? + +[CM1_E:COUNT1] +Estoy pensando que podíamos imprimir algo, un periódico, una revista... + +[CM1_F:COUNT1] +Oh, mierda, hijo, todo eso es mierda de baja calidad. Siempre me ha apetecido imprimir dinero. No es tan difícil. + +[CM1_G:COUNT1] +Ya sabes, llevo haciéndolo a pequeña escala durante años. + +[CM1_H:COUNT1] +¿De verdad? + +[CM1_I:COUNT1] +Claro. Pero necesitamos unas planchas de buena calidad. + +[CM1_J:COUNT1] +¡Por supuesto! Hay un sindicato de la falsificación que opera ya en Florida. + +[CM1_K:COUNT1] +¿Un sindicato? + +[CM1_L:COUNT1] +Sí. He escuchado algunos rumores. + +[CM1_M:COUNT1] +Conozco a un tipo que es bueno con los rumores... + +[CM1_N:COUNT1] +Solía pasar las tardes con él, limpiando los rodillos... + +[CM1_2A:COUNT1] +¡Menudo trasero! + +[CM1_2B:COUNT1] +¡Vale chica, tú te lo pierdes! + +[CM1_2C:COUNT1] +Buenas, figura, ¿cómo va todo? + +[CM1_2D:COUNT1] +¿Qué sabes sobre falsificación? + +[CM1_2E:COUNT1] +Estoy bien, Paul, ¿qué tal tú? + +[CM1_2F:COUNT1] +¡Ven aquí! + +[CM1_2G:COUNT1] +¡Vale! ¡Vale! Obviamente eres un hombre ocupado. + +[CM1_2H:COUNT1] +Todo lo que sé sobre los asuntos turbios es que las tríadas suministran las planchas. + +[CM1_2I:COUNT1] +Tienen una compañía de envíos en los muelles, + +[CM1_2J:COUNT1] +¡el jefe sabrá cuándo vienen las próximas planchas! + +[CM1_2K:COUNT1] +Gracias, Paul. + +[CM1_2L:COUNT1] +¡Cuál es tu problema, lunático! + +[CM1_2M:COUNT1] +¡Ponme otra copa, pronto! + +[CM1_3:COUNT1] +~g~¡Te han visto! + +[CM1_5:COUNT1] +~g~¡Ve a encontrarte con Kent Paul en el Club Malibú! + +[CNT1_1:COUNT1] +¿Quién eres tú? ¡En la cara no! ¡En la cara no! + +[CM1_1:COUNT1] +~g~Ve al barco de la línea charter Libertine en el muelle. + +[CM1_2:COUNT1] +~g~El encargado de los envíos tendrá toda la información necesaria. + +[CNT1_2:COUNT1] +Vale, ¡hablaré! ¡hablaré! + +[CM1_6:COUNT1] +~g~¡Lleva toda la información de vuelta a la imprenta! + +{=================================== MISSION TABLE COUNT2 ===================================} + +[CNT2_B1:COUNT2] +De acuerdo, hoy el mensajero moverá las planchas de los muelles. + +[CNT2_B2:COUNT2] +Voy a interceptarles, coger las planchas, deshacerme de las pruebas, y volver aquí. + +[CNT2_B3:COUNT2] +Dependiendo de lo bien que vaya esto, + +[CNT2_B4:COUNT2] +podemos tener cinco minutos para imprimir el dinero antes de que el sindicato de falsificación nos encuentre, o puede que tengamos todo el año. + +[CNT2_B5:COUNT2] +De cualquier modo, quiero que los verdes salgan de las prensas cinco minutos después de que vuelva. ¿Entendido? + +[CNT2_B6:COUNT2] +No te preocupes, Tommy. Estaremos preparados. + +[CNT2_B7:COUNT2] +Los otros chicos y yo estaremos por aquí en el vecindario, en caso de que necesites que nos ocupemos de cualquier problema. + +[CNT2_B8:COUNT2] +De acuerdo, ¿todo el mundo está tranquilo? De acuerdo. Os veré luego... + +[CNT2_01:COUNT2] +~g~El ~r~mensajero~g~ con las planchas de falsificación llegará en cualquier momento a los ~y~muelles~g~ en un helicóptero. + +[CNT2_02:COUNT2] +~r~El mensajero de las planchas ha huido en el helicóptero. + +[CNT2_03:COUNT2] +~r~¡El mensajero ha llegado a su destino sano y salvo, llegas demasiado tarde! + +[CNT2_04:COUNT2] +~r~¡Has destruido las planchas en la explosión! + +[CNT2_05:COUNT2] +~g~Tienes las planchas de falsificación. Llévalas a la imprenta. + +[CNT2_06:COUNT2] +~g~El mensajero ha muerto y ha dejado caer las planchas, recógelas antes de que lo haga otro. + +[CNT2_07:COUNT2] +~g~Una de las guardias ha recogido las planchas, no la dejes escapar. + +[CNT2_08:COUNT2] +~g~El ~r~mensajero~g~ ha llegado a los muelles con las planchas. + +[CNT2_4:COUNT2] +Negocio privado. ¡No eres bienvenido! + +[CNT2_09:COUNT2] +IMPRENTA CONSOLIDADA + +[CNT2_10:COUNT2] +~g~La imprenta generará ahora unos ingresos hasta un máximo de ~1~ $. Asegúrate que lo recaudas de manera regular. + +[CNT2_11:COUNT2] +~r~¡Las planchas están en el fondo del mar! + +{=================================== MISSION TABLE CUBAN1 ===================================} + +[CUB1_A:CUBAN1] +¿Sí, tío? + +[CUB1_B:CUBAN1] +Eh, tranquilo papito, este hombre es para mí. Tú, ¿tú eres el chico? + +[CUB1_C:CUBAN1] +Oh, sí. Tú eres el chico. Eso creo, ¿sabes? + +[CUB1_D:CUBAN1] +No. No creo que lo sepa. + +[CUB1_E:CUBAN1] +¿Oh, sí? Ven aquí, tipo duro. + +[CUB1_F:CUBAN1] +¿Crees que puedes desafiarme? + +[CUB1_G:CUBAN1] +¿Crees que puedes jugar a ese estúpido juego conmigo? + +[CUB1_H:CUBAN1] +No, creo que ya lo estás haciendo tú lo suficientemente estúpido por los dos. + +[CUB1_I:CUBAN1] +Eh, te llamó tonto, hijo. + +[CUB1_J:CUBAN1] +Y yo le llamé niñita, papá. + +[CUB1_K:CUBAN1] +Mírale, vestido así. + +[CUB1_L:CUBAN1] +¿Qué es esto, un traje de noche? + +[CUB1_M:CUBAN1] +¿Eres alguna clase de tipo duro y vistes como una mujer? + +[CUB1_N:CUBAN1] +También llevas pantis como una mujer, ¿eh? + +[CUB1_O:CUBAN1] +¿Qué tienes contra las mujeres? ¿Prefieres a los hombres, grandullón? + +[CUB1_P:CUBAN1] +¡Me gustan las mujeres! ¡Me gustan las mujeres! ¡Amo a mi madre, chico! + +[CUB1_Q:CUBAN1] +De acuerdo, de acuerdo. Aceptaré tu palabra. + +[CUB1_R:CUBAN1] +¿Sabes conducir, amigo? + +[CUB1_S:CUBAN1] +Sí... como una mujer. + +[CUB1_T:CUBAN1] +Muy gracioso. Me gustas, grandullón. Quizás puedas ayudarme. + +[CUB1_U:CUBAN1] +Quizás puedas demostrar que eres un hombre. ¿Eh? + +[CUB1_V:CUBAN1] +Saca el barco. + +[CUB1_W:CUBAN1] +Demuéstrame que tienes un par de cojones, + +[CUB1_X:CUBAN1] +y no unos chiquitos de ratón. + +[CUB1_02:CUBAN1] +De acuerdo, tío, trátalo como a una mujer. + +[CUB1_03:CUBAN1] +No está mal, un hombre de verdad. + +[CUB1_04:CUBAN1] +Tío, tienes unas pelotas bien grandes, amigo. + +[CUB1_05:CUBAN1] +Amigo, eres un tío. + +[CUB1_06:CUBAN1] +¿Puedes decir que eres un machote, tío? + +[CUB1_07:CUBAN1] +Eres un ratón asustado, niñito, vete a llorar con tu mamá. + +[CUB1_08:CUBAN1] +Eres una bazofia. Andas como un tío, hablas con un tío, pero conduces como un idiota. + +[CUB1_09:CUBAN1] +Brother, eres un macho. Me gustas, tío. Me gustas un montón. + +[CUB1_10:CUBAN1] +En cualquier momento, tío. Porque tienes un par. Y todos mis amigos tienen un buen par de cojones. + +[CUB1_11:CUBAN1] +~r~¡Mataste a Rico! + +[CUB1_12:CUBAN1] +Atraviesa el primer punto de control para comenzar la prueba. + +[CUB1_14:CUBAN1] +¡Vuelve al bote! + +[CUB1_15:CUBAN1] +~r~Brother, eres demasiado lento. + +[CUB1_01:CUBAN1] +Eh, soy Rico. ¿Eres tú el tío de las pelotas grandes? + +[CUB1_13:CUBAN1] +~g~Tienes tres minutos para recorrer el circuito. + +{=================================== MISSION TABLE CUBAN2 ===================================} + +[CUB2_A:CUBAN2] +Un cafetito, por favor, Alberto... + +[CUB2_N:CUBAN2] +Sin problema, Tommy. + +[CUB2_B:CUBAN2] +¡Papá! ¡Un gran problema! + +[CUB2_O:CUBAN2] +Umberto, mi hijo, ¿qué ocurre? + +[CUB2_C:CUBAN2] +¡Los haitianos! ¡Odio a estos haitianos! + +[CUB2_D:CUBAN2] +¡Me han molestado por última vez! + +[CUB2_E:CUBAN2] +¡Nos desharemos de ellos! + +[CUB2_F:CUBAN2] +Sólo necesitamos un poco de apoyo. + +[CUB2_G:CUBAN2] +Ya he perdido algunos hermanos ahí fuera. + +[CUB2_H:CUBAN2] +¡Amigo, tú conduces bien! + +[CUB2_I:CUBAN2] +Para ser una mujer. ¿No? + +[CUB2_J:CUBAN2] +¡Éste no es momento de bromear! + +[CUB2_K:CUBAN2] +¡Vamos, maneja de nuevo para mí! + +[CUB2_L:CUBAN2] +¡Lleva a mis chicos allí y eliminaremos a esos haitianos! + +[CUB2_M:CUBAN2] +¡Se meten conmigo y se meten con el chico grande de la ciudad! + +[CUB2_01:CUBAN2] +No hay suficiente espacio, brother, necesitas un coche más grande. + +[CUB2_02:CUBAN2] +¡Necesitamos refuerzos del café! + +[CUB2_03:CUBAN2] +~g~Consigue un coche y recoge a los cubanos frente al Café Robina. + +[CUB2_04:CUBAN2] +~g~Ve y deja a los cubanos en la zona de combate. + +[CUB2_05:CUBAN2] +¡Elimina a ese francotirador cobarde! + +[CUB2_07:CUBAN2] +¡Luchan como nenas! ¡Ponte a cubierto! + +[CUB2_09:CUBAN2] +¡Francotirador en el tejado! + +[CUB2_11:CUBAN2] +~r~Estúpido, necesitábamos ese coche. + +[CUB2_12:CUBAN2] +¡Eh, amigo! ¡Me alegro de que hayas podido venir! + +[CUB2_13:CUBAN2] +¡Apestoso nido de haitianos, vamos a matarlos a todos! + +[CUB2_14:CUBAN2] +¡A LA CARGA! + +[CUB2_15:CUBAN2] +¡Ahora, hermanos, A LA CAAARGA! + +[CUB2_16:CUBAN2] +¡Tommy, hemos demostrado nuestro valor y nuestra hombría! + +[CUB2_17:CUBAN2] +¡Vamos a robar esa furgoneta llena de farlopa y pegarnos el piro! + +[CUB2_18:CUBAN2] +~g~Consigue un coche y recoge a los cubanos. + +[CUB2_19:CUBAN2] +¡Vamos a combatir como machos! + +[CUB2_21:CUBAN2] +¡Luchad como machos con un par de cojones! + +[CUB2_22:CUBAN2] +~g~Termina con el resto de los haitianos para que los cubanos puedan avanzar. + +[CUB2_23:CUBAN2] +~g~Little Haiti estará atestado de haitianos intentando desquitarse con los cubanos. ¡Ten cuidado! + +[CUB2_24:CUBAN2] +~g~Vuelve al Café Robina en la furgoneta y aparca en la parte trasera. + +[CUB2_25:CUBAN2] +¡MATA A TODOS LOS HAITIANOS! + +{=================================== MISSION TABLE CUBAN3 ===================================} + +[CUB3_A:CUBAN3] +Alberto. Un cafetito, señor. + +[CUB3_B:CUBAN3] +Papaíto, no sirvas a esta sabandija. + +[CUB3_C:CUBAN3] +¡Tienes dos caras, Tommy! + +[CUB3_D:CUBAN3] +¡Tú, guapito de cara, o eres un falso o eres un calzonazos! + +[CUB3_E:CUBAN3] +¡Los haitianos! Tío, se están riendo de mí. + +[CUB3_F:CUBAN3] +Vale, vale. ¿Qué problema tienes? + +[CUB3_G:CUBAN3] +Se están riendo de mí, Tommy. ¡De mí! + +[CUB3_H:CUBAN3] +¡Umberto Robina! ¡Están haciendo lo que quieren! + +[CUB3_I:CUBAN3] +Nadie hace lo que quiere, Umberto, hacen lo que les dejes hacer. + +[CUB3_J:CUBAN3] +¿Qué? + +[CUB3_K:CUBAN3] +¿Quieres que alguien se ocupe del asunto? + +[CUB3_L:CUBAN3] +Puedo manejarlo, pero va a costarte. + +[CUB3_M:CUBAN3] +Sé que somos hermanos y todo eso, pero esto es un negocio. + +[CUB3_N:CUBAN3] +Tommy. Eres un verdadero macho. Un tío de negocios, un caballero. + +[CUB3_O:CUBAN3] +Estos haitianos. Tienen un alijo de producto que va a venir desde alta mar, un material de primera. + +[CUB3_P:CUBAN3] +Lo agarraremos y acabaremos con ellos. + +[CUB3_Q:CUBAN3] +Tú lo agarrarás y yo cuidaré de ti. Como a un hermano. Como a un hijo. + +[CUB3_R:CUBAN3] +Creo que prefiero el dinero a que me mezas en tus rodillas, amigo. + +[CUB3_01:CUBAN3] +Eh, Rico. Bonito barco, ¿estás preparado? + +[CUB3_03:CUBAN3] +~g~Recoge todos los maletines llenos de nieve y dinero. + +[CUB3_04:CUBAN3] +~g~Lleva la nieve y la pasta de vuelta a Umberto. + +[CUB3_05:CUBAN3] +Sí, Tommy. Tienes que apuntar bien. + +[CUB3_06:CUBAN3] +Mi barco, no me sirve lleno de agujeros, ¿eh? + +[CUB3_07:CUBAN3] +~g~Ve y reúnete con Rico. Te llevará al punto de encuentro. + + +[CUB3_02:CUBAN3] +~g~¡MATA A TODOS LOS HAITIANOS DEL BARCO! +[CUB3_08:CUBAN3] +Oh, oh... Una banda de cubanos. ¡Nos atacan! + +{=================================== MISSION TABLE CUBAN4 ===================================} + +[CUB4_A:CUBAN4] +Ey, señoritas. ¿Sabéis qué voy a hacer? + +[CUB4_B:CUBAN4] +Primero voy a matar un haitiano. ¿Y después? + +[CUB4_C:CUBAN4] +Voy a hacer el amor como un hombre. + +[CUB4_D:CUBAN4] +¿Sabes chica? Algo así. + +[CUB4_E:CUBAN4] +¡Perdedor! + +[CUB4_F:CUBAN4] +Mamón. + +[CUB4_G:CUBAN4] +¡Ey, nena, no te tocaría ni con una pértiga de tres metros! + +[CUB4_H:CUBAN4] +¡A Umberto Robina le gustan las damas! ¡No una cabra con faldas! + +[CUB4_I:CUBAN4] +¡Tommy! ¡Tommy, te quiero, te quiero! ¡Vámonos! + +[CUB4_J:CUBAN4] +¿Irnos a donde? ¿No me puedo tomar primero una taza de café? + +[CUB4_K:CUBAN4] +¡No hay tiempo para café! Además, acabo de tomarme uno. + +[CUB4_L:CUBAN4] +Vamos a eliminar a los haitianos. + +[CUB4_M:CUBAN4] +Tommy, ¿qué tiene un elefante dentro de la trompa? + +[CUB4_N:CUBAN4] +¡Dos metros de mocos! ¡Ja, ja, ja! + +[CUB4_O:CUBAN4] +Lo que tú digas, Umberto. + +[CUB4_P:CUBAN4] +Tommy, ve y consíguenos un cochecito haitiano. + +[CUB4_Q:CUBAN4] +Cuando lo tengas, regresa y recoge a mi chico + +[CUB4_R:CUBAN4] +Pepe, y llévale a donde los haitianos. + +[CUB4_S:CUBAN4] +Luego te vas hasta la planta de procesamiento de los haitianos y utilizas su disolvente como explosivo. + +[CUB4_T:CUBAN4] +¡Boom! Y ¡Bye bye! + +[CUB4_U:CUBAN4] +Umberto, ¿qué hay de ti? + +[CUB4_V:CUBAN4] +Oh, voy a quedarme atrás, a vigilar el café con papá. + +[CUB4_W:CUBAN4] +No se siente muy bien, ¿sabes? + +[CUB4_02:CUBAN4] +~g~Las bombas se colocarán con un temporizador de 45 segundos. + +[CUB4_04:CUBAN4] +~r~¡Alertaste a la base, ahora no habrá modo de entrar! + +[CUB4_07:CUBAN4] +El disolvente está a la vuelta, amigo. + +[CUB4_08:CUBAN4] +Hola, amigos. + +[CUB4_09:CUBAN4] +Bueno. Haitianos putas. Muerte. + +[CUB4_10:CUBAN4] +Vamos. + +[CUB4_11:CUBAN4] +Sí, vamos. + +[CUB4_12:CUBAN4] +¡Ey, necesitamos un coche de la banda haitiana! + +[CUB4_13:CUBAN4] +¡Oye, vamos a encontrar a nuestros muchachos! + +[CUB4_14:CUBAN4] +Sigue a mis compadres. + +[CUB4_15:CUBAN4] +De acuerdo, allá vas... + +[CUB4_16:CUBAN4] +¡Voy a colocar la bomba, cubridme! + +[CUB4_17:CUBAN4] +¡CORRED! + +[CUB4_18:CUBAN4] +Tío, esta es una parte bonita de la ciudad... + +[CUB4_19:CUBAN4] +Compadre, este lugar es un vertedero. + +[CUB4_20:CUBAN4] +Yo tenía una hermosa mujer... vivía por este barrio. + +[CUB4_21:CUBAN4] +Sabes, allí hacen unas buenas pizzas. + +[CUB4_22:CUBAN4] +¡Tío! ¡Conduces como un loco! + +[CUB4_23:CUBAN4] +¿Te has perdido tío? + +[CUB4_24:CUBAN4] +Dejaste atrás a Pepe, ve a por él. + +[CUB4_03:CUBAN4] +~g~Permanece en el coche hasta que puedas aparcar sin percances dentro del recinto. + +[CUB4_26:CUBAN4] +~g~Recoge a Pepe, dirígete al norte a Little Haiti y roba un coche Voodoo. + +[CUB4_27:CUBAN4] +~g~Ve y reúnete con Rico y los otros cubanos. + +[CUB4_28:CUBAN4] +~g~Reúnete con los otros cubanos en el laboratorio de sustancias químicas haitiano. + +[CUB4_29:CUBAN4] +~g~Camina hacia cada uno de los marcadores para colocar la bomba en ese lugar. + +[CUB4_30:CUBAN4] +~g~Después de colocar las tres bombas, aléjate de la fábrica antes que salte por los aires. + +[CUB4_31:CUBAN4] +~g~¡Aléjate de la fábrica! + +[CUB4_32:CUBAN4] +~g~Aparca el coche en el marcador y bájate de él. + +[CUB4_06:CUBAN4] +~r~No te alejaste lo suficiente de la base, ¡y hemos tenido que abortar la explosión! + +{=================================== MISSION TABLE FINALE ===================================} + +[FIN1_01:FINALE] +¿Qué está pasando? + +[FIN1_02:FINALE] +¡Tommy! Oh, bien, bien. Escucha, escucha. Uh, escucha, + +[FIN1_03:FINALE] +me gusta el pescado. Me encanta el pescado. + +[FIN1_04:FINALE] +Me encantan como mascotas en peceras, o como comida en un plato, + +[FIN1_05:FINALE] +pero aunque los adoro, no quiero dormir con ellos. + +[FIN1_06:FINALE] +De acuerdo, pero ahora mismo, tus hermanos italianos van a salir de ahí para ponerme esos zapatos de cemento y yo... + +[FIN1_07:FINALE] +Cállate, Ken. Siéntate. + +[FIN1_08:FINALE] +Lance, ¿qué demonios ocurre? + +[FIN1_09:FINALE] +Es tu amigo del norte, Tommy. No está muy contento de que matases a su hombre. + +[FIN1_10:FINALE] +Vienen hoy para ver el negocio. + +[FIN1_11:FINALE] +Tardaron más de lo que pensaba... + +[FIN1_12:FINALE] +Chicos, tenemos que acabar con esto y no dejar duda de que ésta es mi operación. ¡Mía! + +[FIN1_13:FINALE] +Ken, pon tres millones de la primera tanda de dinero falsificado en maletines. + +[FIN1_14:FINALE] +Lance, reúne a los muchachos... + +[FIN2_01:FINALE] +¡Tommy! + +[FIN2_02:FINALE] +¿Qué? ¿No hay un gran abrazo para tu viejo colega? + +[FIN2_03:FINALE] +He pasado quince años fuera del negocio, + +[FIN2_04:FINALE] +estoy un poco oxidado respecto a las costumbres de la familia. + +[FIN2_05:FINALE] +Siempre enfadado, ¿eh? Tommy. + +[FIN2_06:FINALE] +No te dije que tu temperamento te metería en problemas, ¿eh? + +[FIN2_07:FINALE] +Hay tres millones en los maletines... + +[FIN2_08:FINALE] +¿Cuántos fueron? ¿Diez? No, once hombres. + +[FIN2_09:FINALE] +¡Así es como llegaron a llamarte el Carnicero de Harwood! ¡Je je je! + +[FIN2_10:FINALE] +Me enviaste a matar a un hombre, UN HOMBRE. Sabían que iba para allá. + +[FIN2_11:FINALE] +Vigila tu tono. + +[FIN2_12:FINALE] +Cualquiera pensaría que me echas la culpa por ese desafortunado conjunto de circunstancias. + +[FIN2_13:FINALE] +Simplemente coge el dinero... + +[FIN2_14:FINALE] +¿Que coja el maldito dinero? + +[FIN2_15:FINALE] +¿Sabes, Tommy? Hice lo que pude por ti, tiré de algunos hilos, pedí favores. + +[FIN2_16:FINALE] +Yo era tu amigo, Tommy. Esperaba que entraras en razón, ver qué es bueno para el negocio. + +[FIN2_17:FINALE] +Confié en ti, Tommy, y me decepcionaste. + +[FIN2_18:FINALE] +Pero al menos alguno de tu organización de mierda sabe hacer negocios, + +[FIN2_19:FINALE] +¿No es verdad, Lance? + +[FIN2_20:FINALE] +Lo siento, Tommy. Esto es Vice City. Son negocios. + +[FIN2_21:FINALE] +Nos vendiste. + +[FIN2_22:FINALE] +No. Te vendí a TI, Tommy, te vendí a TI. + +[FIN2_23:FINALE] +El dinero de verdad está arriba, en la caja fuerte. + +[FIN2_24:FINALE] +Así que Tommy, ¿cuál es el gran plan? + +[FIN2_25:FINALE] +¿Creías que solo me llevaría el dinero falso? + +[FIN2_26:FINALE] +¿Salvar el culo y huir con el rabo entre las piernas? + +[FIN2_27:FINALE] +No. + +[FIN2_28:FINALE] +Solo quería joderte antes de matarte. + +[FIN3_01:FINALE] +¿Tommy? + +[FIN3_02:FINALE] +Oh, Dios mío, ¡Tommy! ¿Qué ha sucedido? + +[FIN3_03:FINALE] +¿A ti qué te parece? + +[FIN3_04:FINALE] +¡Parece que te han arruinado el traje! + +[FIN3_05:FINALE] +¡Y Tommy, era un traje muy bonito! Tommy, ¿qué diablos ha ocurrido? + +[FIN3_06:FINALE] +Tuve un desacuerdo con un socio del negocio, ya sabes cómo son estas cosas. + +[FIN3_07:FINALE] +Tommy, cuando tengo un desacuerdo con un socio, le envío una carta muy enfadado. + +[FIN3_08:FINALE] +Quizás me mee en su buzón. No empiezo la tercera guerra mundial. + +[FIN3_09:FINALE] +¿Sabes? Quizás deberías hablar con mi psiquiatra... + +[FIN3_10:FINALE] +Ése estúpido mamón, Lance... + +[FIN3_11:FINALE] +Tommy. A mí nunca me gustó ese tipo, ¿de acuerdo? + +[FIN3_12:FINALE] +Era neurótico, era inseguro, era egocéntrico... ¡ese tipo era un gilipollas! + +[FIN3_13:FINALE] +¡Me alegro de que lo eliminases! + +[FIN3_14:FINALE] +No creo que vayamos a tener más líos desde la parte norte... + +[FIN3_15:FINALE] +porque ya no hay 'parte norte'. + +[FIN3_16:FINALE] +Ahora es todo sur. + +[FIN3_17:FINALE] +Espera, eso quiere decir lo que creo que quiere decir, Tommy, ¿nene? + +[FIN3_18:FINALE] +¿Qué crees que significa? + +[FIN3_19:FINALE] +Que estamos al mando... Quiero decir, que tú estás al mando. Oh, Tommy... + +[FIN3_20:FINALE] +¿Sabes, Ken? Este podría ser el comienzo de una hermosa relación comercial... + +[FIN3_21:FINALE] +Después de todo, eres un cómplice, traicionero, ladrón de tres al cuarto + +[FIN3_22:FINALE] +y yo soy un asesino psicópata convicto y además paso farlopa. + +[FIN3_23:FINALE] +Lo sé. ¿No es sencillamente hermoso? + +[FIN_B1:FINALE] +~g~Ve y liquida al traidor de ~y~Lance Vance~g~. + +[FIN_B2:FINALE] +~g~Liquida a ~p~Sonny~g~ y acaba con esto de una vez por todas. + +[FIN_B3:FINALE] +~g~La mafia está intentando robarte el dinero. Protege la caja fuerte. + +[FIN_B4:FINALE] +~g~Estás casi muerto, consigue ~w~salud~g~ en el piso de abajo. + +[FIN_B5:FINALE] +~g~La mafia está robándote el dinero, protege la ~c~caja fuerte~g~. + +[FIN_B7:FINALE] +~r~La mafia te ha robado todo el dinero. + +[DEFSAFE:FINALE] +~g~Regresa a la caja fuerte y protégela. + +{=================================== MISSION TABLE FIRETRK ===================================} + +[F_PASS1:FIRETRK] +¡Fuego extinguido! + +[F_FAIL2:FIRETRK] +~r~¡Llegas demasiado tarde! + +[F_CANC:FIRETRK] +~r~¡Misión de bombero cancelada! + +[F_EXTIN:FIRETRK] +FUEGOS: + +[F_START:FIRETRK] +~g~Se ha informado de un vehículo ardiendo en la zona de ~a~. Ve y extingue el fuego. + +[SIREN_1:FIRETRK] +Para activar la sirena de este vehículo, pulsa ~h~~k~~VEHICLE_HORN~~w~. + +[SIREN_2:FIRETRK] +Para activar la sirena de este vehículo, pulsa ~h~~k~~VEHICLE_HORN~~w~. + +[FIREPRO:FIRETRK] +Nivel 12 de la misión del camión de bomberos completado. ¡Ahora eres completamente ignífugo! + +[F_FAIL1:FIRETRK] +Misión de bombero terminada. + +[F_STAR1:FIRETRK] +~g~Se ha informado de que hay vehículos ardiendo en la ~a~ zona. Ve y apaga el fuego. + +[SPRAY_4:FIRETRK] { reVC update } +Pulsa ~h~~k~~VEHICLE_FIREWEAPON~ ~w~para disparar el cañón de agua y ~h~~k~~VEHICLE_TURRETLEFT~~w~ o ~h~~k~~VEHICLE_TURRETRIGHT~~w~ para apuntar con él. + +[SPRAY_1:FIRETRK] { reVC update } +Pulsa ~h~~k~~VEHICLE_FIREWEAPON~ ~w~para disparar el cañón de agua y ~h~~k~~VEHICLE_TURRETLEFT~~w~ o ~h~~k~~VEHICLE_TURRETRIGHT~~w~ para apuntar con él. + +{=================================== MISSION TABLE GENERA1 ===================================} + +[GEN1_A:GENERA1] +¡Sr. Vercetti! + +[GEN1_B:GENERA1] +Coronel. + +[GEN1_D:GENERA1] +No, gracias. + +[GEN1_E:GENERA1] +Me avergüenza admitir que una de las causas de nuestro mutuo problema parece ser la lengua larga de un hombre en el que solía confiar. + +[GEN1_F:GENERA1] +He tenido conmigo a González durante años, pero ahora su incompetencia alcanza nuevas cotas. + +[GEN1_G:GENERA1] +Lo correcto es que mates a González... + +[GEN1_H:GENERA1] +¿Lo hizo él? El dinero es lo único importante para mí. + +[GEN1_I:GENERA1] +Por tu gentileza te compensaré y después buscaremos juntos tu dinero. + +[GEN1_J:GENERA1] +Estará en su ático, probablemente medio borracho. Utiliza esto... + +[GEN1_K:GENERA1] +Utiliza esto... + +[GEN1_06:GENERA1] +¡Eh! ¡Tiene una sierra! + +[GEN1_07:GENERA1] +¡Mantente alejado de mí, cabrón miserable! + +[GEN1_08:GENERA1] +¡Maldición, he desperdiciado mi vida y mi belleza! + +[GEN1_10:GENERA1] +¡Te voy a cerrar esa bocaza tuya! + +[GEN1_11:GENERA1] +¡Deja de correr gorda bola de sebo! + +[GEN1_12:GENERA1] +¡Estate quieto y haré que sea rápido! + +[GEN1_13:GENERA1] +Deja de chillar, a nadie le importa, ¡gordo! + +[GEN1_C:GENERA1] +Gracias por venir. Por favor siéntese. ¿Langosta? + +[GEN1_05:GENERA1] +~g~¡Ve y liquida a González! + +[GEN1_09:GENERA1] +Te pagaré el doble, Tommy, ¡EL DOBLE! + +[GEN1_18:GENERA1] +~r~¡González ha conseguido llegar a la Jefatura de Policía! + +[GEN1_19:GENERA1] +~g~¡La policía de Vice City viene a por ti! + +[GEN1_20:GENERA1] +~g~Sube a un vehículo. + +[GEN1_21:GENERA1] +~g~Ve al~h~ taller de pintura~g~ de~h~ Vice Point~g~. + +[GEN1_22:GENERA1] +~g~Conduce tu vehículo hasta el interior del ~h~taller de pintura~w~ para perder tu ~h~nivel de se busca~w~, reparar y volver a pintar tu vehículo. El precio es ~h~100 $~g~. Esta vez es gratis. + +[GEN1_01:GENERA1] +Cuando estés corriendo, mantén pulsado ~h~~k~~PED_FIREWEAPON~~w~ para preparar un ataque cuerpo a cuerpo. + +[GEN1_02:GENERA1] +Cuando estés corriendo, mantén pulsado ~h~~k~~PED_FIREWEAPON~~w~ para preparar un ataque cuerpo a cuerpo. + +[GEN1_03:GENERA1] +Cuando estés corriendo, mantén pulsado ~h~~k~~PED_FIREWEAPON~~w~ para preparar un ataque cuerpo a cuerpo. + +[GEN1_14:GENERA1] +Suelta ~h~~k~~PED_FIREWEAPON~~w~ para atacar. + +[GEN1_15:GENERA1] +Suelta ~h~~k~~PED_FIREWEAPON~~w~ para atacar. + +[GEN1_16:GENERA1] +Suelta ~h~~k~~PED_FIREWEAPON~~w~ para atacar. + +[GEN1_23:GENERA1] +~g~Vuelve pasando por las puertas para regresar a la planta baja. + +{=================================== MISSION TABLE GENERA2 ===================================} + +[COL2_A:GENERA2] +¡Tommy! Ven, acércate. + +[COL2_B:GENERA2] +Qué buena pinta, ¿eh? ¿Hocico de tapir? + +[COL2_C:GENERA2] +No. No, gracias. + +[COL2_D:GENERA2] +Tommy, eres como una brisa de la pampa que me ha liberado de la peste de la corrupción, + +[COL2_E:GENERA2] +aunque, parece que debo llorar su paso y seguir con el negocio como siempre. + +[COL2_F:GENERA2] +Esto no me está acercando mucho a mi dinero... + +[COL2_G:GENERA2] +Tommy, amigo mío, ahora no estás en Liberty. Aquí hacemos las cosas de un modo diferente. + +[COL2_H:GENERA2] +Continuaré con mis investigaciones pero mientras tanto tengo un valioso trato que cerrar. + +[COL2_I:GENERA2] +Un favor para un amigo, Cortez. + +[COL2_J:GENERA2] +Eres un buen amigo, Tommy. Sabía que no me decepcionarías. + +[COL2_K:GENERA2] +Necesito que te encuentres con un mensajero que ha conseguido una tecnología valiosa para mí... + +[COL2_1:GENERA2] +La lluvia, está muy húmeda esta época del año... + +[COL2_2:GENERA2] +¿Qué? + +[COL2_3:GENERA2] +Ah, comment? + +[COL2_4:GENERA2] +Mira, me envía Cortez. Tan sólo dame los malditos chips. + +[COL2_5:GENERA2] +Oh... d'accord. + +[COL2_B1:GENERA2] +~g~Encuéntrate con el mensajero en el centro comercial. + +[COL2_B2:GENERA2] +~g~El mensajero está huyendo con los chips guía, ¡no le dejes escapar! + +[COL2_B3:GENERA2] +~g~Recupera los chips guía y llévaselos de vuelta al Coronel. + +[COL2_F1:GENERA2] +~r~¡Mataste al contacto! + +[COL2_F2:GENERA2] +~r~El mensajero está muerto. Coge los chips guía. + +[COL2_6A:GENERA2] +¡Alto, cerdo imperialista americano! Eso es propiedad del gobierno francés. ¡Y se acabó! + +[BLIPHLP:GENERA2] +Cuando el icono en el radar es un triángulo apuntando hacia arriba, indica que el objetivo está por encima del jugador. + +[COL2_F3:GENERA2] +~r~Los chips de orientación están en el fondo del mar. + +[COL2_F4:GENERA2] +~r~¡El mensajero ha escapado! Has fracasado en conseguir los chips de orientación. + +{=================================== MISSION TABLE GENERA3 ===================================} + +[GEN3_A:GENERA3] +Thomas, agradezco que hayas venido. + +[GEN3_B:GENERA3] +Perdóname por ir directamente a los negocios. + +[GEN3_C:GENERA3] +Díaz me ha pedido que supervise una transacción comercial poco importante. + +[GEN3_D:GENERA3] +Esperemos que vaya mejor que la última vez, ¿eh? + +[GEN3_E:GENERA3] +Por eso es por lo que pensé en ti, amigo mío. + +[GEN3_F:GENERA3] +He dejado protección en un aparcamiento de varias plantas. + +[GEN3_G:GENERA3] +Recógela... luego ve a vigilar a los hombres de Díaz en el punto de entrega. + +[GEN3_H:GENERA3] +Gracias, amigo. + +[GEN3_1:GENERA3] +Monopolizando toda la acción, ya veo... + +[GEN3_2:GENERA3] +Mira, ¿quieres dejar de seguirme a todas partes? ¿Por qué no vienes y me demuestras que vales para algo? + +[GEN3_3:GENERA3] +Podría hacerlo. Mi nombre es Lance, por cierto. + +[GEN3_5:GENERA3] +Tú debes de ser el nuevo matón de Cortez. + +[GEN3_6:GENERA3] +Hasta que surjan oportunidades mejor pagadas. + +[GEN3_7:GENERA3] +Estarán aquí en cualquier momento. Será mejor que consigamos una posición ventajosa... + +[GEN3_8:GENERA3] +¡De acuerdo! Yo iré al balcón, tú sube a ese tejado al otro lado del patio. + +[GEN3_9:GENERA3] +¡Estoy vivo! ¡Mamones! ¡Y todo gracias a ti! ¿Cómo te llamas? + +[GEN3_10:GENERA3] +Tommy. + +[GEN3_11:GENERA3] +Nos veremos pronto, ¡creo! + +[GEN3_12:GENERA3] +Mierda. ¿Dónde está Lance? + +[GEN3_14:GENERA3] +¡Tommy! ¡Necesito ayuda aquí! + +[GEN3_15:GENERA3] +¡No te preocupes, te tengo cubierto! + +[GEN3_16:GENERA3] +¡Los hombres de Díaz están siendo eliminados! + +[GEN3_19:GENERA3] +~g~¡Haitianos! ¡Están saboteando el trato! ¡Protege a Díaz! + +[GEN3_20:GENERA3] +~g~Ve al aparcamiento donde podrás recoger el arma que te dejó el Coronel. + +[GEN3_22:GENERA3] +Salud de Díaz: + +[GEN3_23:GENERA3] +~g~¡Has dejado a Lance atrás! ¡Ve a por él! + +[GEN3_25:GENERA3] +~r~¡Lance murió! + +[GEN3_28:GENERA3] +~g~Devuélvele el maletín a Díaz. + +[GEN3_29:GENERA3] +~g~Recoge el maletín y llévaselo a Díaz. + +[GEN3_30:GENERA3] +~r~¡Se escapó con el dinero! ¡Díaz te arrancará las pelotas por ésto! + +[GEN3_33:GENERA3] +~r~¡Mira adónde disparas! Se supone que tienes que proteger a Díaz y a sus hombres, ¡no dispararles! + +[GEN3_34:GENERA3] +~r~¡No va a haber ningún trato si disparas a los cubanos! + +[GEN3_35:GENERA3] +~g~¡Ha robado el dinero de Díaz! + +[GEN3_36:GENERA3] +~g~¡Pilla una moto, persíguele y recupera el dinero de Díaz! + +[GEN3_37:GENERA3] +~g~Aquí vienen los cubanos. Vigila el trato y asegúrate que Díaz y Lance están a salvo. + +[GEN3_38:GENERA3] +~r~¡Díaz ha muerto! ¡Has fallado en protegerle! + +[GEN3_39:GENERA3] +~g~Ve a tu posición estratégica en el piso de arriba. + +[GEN3_44:GENERA3] +~g~Ve con Lance al punto de entrega y vigila a Díaz. + +[GEN3_45:GENERA3] +Estarán aquí en cualquier minuto, mejor será que vayamos tomando posiciones estratégicas. + +[GEN3_40:GENERA3] { reVC update } +Para ~h~disparar hacia el frente ~w~sobre una ~h~moto ~w~pulsa ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[GEN3_41:GENERA3] { reVC update } +Para ~h~disparar hacia el frente ~w~sobre una ~h~moto ~w~pulsa ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[GEN3_46:GENERA3] +¡Mierda! + +[GEN3_47:GENERA3] +¡Tommy! + +[GEN3_48:GENERA3] +¡Maldición! + +[GEN3_49:GENERA3] +Salud de Lance: + +[GEN3_50:GENERA3] +~r~¡Has perdido el dinero de Díaz! ¡La próxima vez intenta no convertir mi dinero en cenizas! + +[GEN3_51:GENERA3] +¡Más condenados haitianos en una furgoneta apestosa! + +[GEN3_54:GENERA3] +¡No os quedéis ahí, panda de gilipollas, perseguid a ese haitiano cabrón! + +[GEN3_55:GENERA3] +¡Tommy! ¡Yo me quedo aquí a proteger a Díaz! + +[GEN3_18:GENERA3] +~g~Aquí llegan los cubanos, mantente cerca de Díaz. Asegúrate de que la negociación entre Díaz y Lance sea segura. + +[GEN3_56:GENERA3] +~r~¡Díaz ha caído en una emboscada y ha muerto! ¡La próxima vez no le pierdas de vista! + +[GEN3_57:GENERA3] +El Kruger es un rifle de asalto que te permite apuntar en primera persona manualmente. + +[GEN3_58:GENERA3] +Mantén pulsado ~h~~k~~PED_LOCK_TARGET~~w~ para ~h~apuntar~w~ con un rifle de asalto. + +[GEN3_59:GENERA3] +Mantén pulsado ~h~~k~~PED_LOCK_TARGET~~w~ para ~h~apuntar~w~ con un rifle de asalto. + +[GEN3_60:GENERA3] +Pulsa ~h~~k~~PED_FIREWEAPON~~w~ para ~h~disparar~w~ un rifle de asalto. + +[GEN3_61:GENERA3] +Pulsa ~h~~k~~PED_FIREWEAPON~~w~ para ~h~disparar~w~ un rifle de asalto. + +[GEN3_62:GENERA3] +Pulsa ~h~~k~~PED_FIREWEAPON~~w~ para ~h~disparar~w~ un rifle de asalto. + +[GEN3_63:GENERA3] +Además de realizar maniobras de acercamiento,~h~ las motos ~w~te permiten ~h~disparar hacia adelante~w~. + +[GEN3_64:GENERA3] { reVC update } +Para ~h~disparar hacia el frente ~w~sobre una ~h~moto ~w~pulsa ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[GEN3_65:GENERA3] { reVC update } +Para ~h~disparar hacia el frente ~w~sobre una ~h~moto ~w~pulsa ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[GEN3_66:GENERA3] { reVC update } +Para ~h~disparar hacia el frente ~w~sobre una ~h~moto ~w~pulsa ~h~~k~~VEHICLE_FIREWEAPON~~w~. + +[GEN3_67:GENERA3] +Para disparar hacia el frente en una moto deberás tener un subfusil. + +[GEN3_53:GENERA3] +¡Mi dinero! + +[GEN3_52:GENERA3] +¿Esos haitianos creen que pueden enfrentarse a RICARDO DÍAZ? + +{=================================== MISSION TABLE GENERA4 ===================================} + +[DETON:GENERA4] +DETONACIÓN: + +[COL4_3:GENERA4] +¡CONVOY, ALTO! + +[COL4_6:GENERA4] +¡NOS ESTÁN DISPARANDO! + +[COL4_7:GENERA4] +¡Civil, aléjese del tanque! + +[COL4_8:GENERA4] +¡DIJE, alejaos, INMEDIATAMENTE! + +[COL4_9:GENERA4] +¡POSICIONES DEFENSIVAS! + +[COL4_11:GENERA4] +- ¡Quite a esos civiles fuera de mi camino, soldado! - ¡Señor, sí, señor! + +[COL4_12:GENERA4] +¡Civil en el TANQUE! ¡DETENEDLE! + +[COL4_13:GENERA4] +Este es un convoy militar, no obstruyan nuestra ruta. + +[COL4_14:GENERA4] +Tírelo, soldado. + +[COL4_15:GENERA4] +- ¡Mueva ese vehículo civil fuera de nuestro camino! - ¡Señor! ¡Moviendo el vehículo, señor! + +[COL4_17:GENERA4] +¡Bien, PELOTÓN, MUÉVANSE! + +[COL4_18:GENERA4] +¡Hay alguien en el tanque, señor! + +[COL4_19:GENERA4] +- ¡Vaya a conseguir unos donuts, soldado! - ¡Señor, sí, señor! + +[COL4_20:GENERA4] +Blanco localizado, señor. + +[COL4_21:GENERA4] +¡FRANCOTIRADOR! + +[COL4_22:GENERA4] +Me voy de aquí. + +[COL4_23:GENERA4] +- ¡Objetivo completado! ¡Pelotón, rompan filas! - Vamos a comer unos cuantos donuts. + +[COL4_24:GENERA4] +¡Activado protocolo de seguridad Delta India Eco! ¡Iniciada autodestrucción del vehículo! + +[COL4_26:GENERA4] +¡Prepárate para morir, basura comunista! + +[COL4_B2:GENERA4] +~r~El tanque llegó a su destino a salvo! + +[COL4_B5:GENERA4] +~r~¡El tanque ha sido destruido! + +[COL4_01:GENERA4] +Díaz estaba complacido, y le gustaría verte de nuevo. + +[COL4_02:GENERA4] +¿Es eso algo bueno? + +[COL4_03:GENERA4] +¡Por supuesto! Aunque estoy empezando a pensar que Díaz fue el responsable de nuestra desafortunada pérdida... + +[COL4_04:GENERA4] +¿Qué te hace decir eso? + +[COL4_05:GENERA4] +Uno no esgrime acusaciones contra un hombre como Díaz... Solo estoy pensando en voz alta... + +[COL4_06:GENERA4] +No importa. Tengo una propuesta de la que te podrías beneficiar... + +[COL4_07:GENERA4] +No tengo tiempo para hacer más recados, Cortez. + +[COL4_08:GENERA4] +Yo habría pensado que un hombre con unas deudas tan grandes estaría ansioso por encontrar oportunidades. Por favor, Tommy, al menos escúchame. + +[COL4_09:GENERA4] +Adelante... + +[COL410:GENERA4] +Tengo un comprador para una pieza de equipo militar que está siendo transportada a través de la ciudad. Recógela para mí... + +[COL411:GENERA4] +y una vez que la tengas, quiero que me llames inmediatamente, entonces... + +[COL4_B4:GENERA4] +~g~El tanque está bloqueado. Busca un modo de engañar a los ocupantes. + +[COL4_1:GENERA4] +- ¿Que qué pasa con el artillero? - ¡No lo sé, señor! + +[COL4_4:GENERA4] +- Ve arriba soldado. - ¡Sí, señor! + +[COL4_B1:GENERA4] +~g~Ve y adquiere el vehículo militar que se está paseando por la ciudad. + +[COL4_B3:GENERA4] +~g~Deja el tanque en el escondite del Coronel antes que se autodestruya. + +[COL4_B6:GENERA4] +~g~¡Encuentra el modo de robar el tanque! + +[COL4_B7:GENERA4] +~g~Conduce el tanque al garaje. + +[COL4_B8:GENERA4] +~g~Bájate del tanque y sal del garaje. + +{=================================== MISSION TABLE GENERA5 ===================================} + +[COL5A_1:GENERA5] +Las circunstancias fuerzan una apresurada partida, amigo. + +[COL5A_2:GENERA5] +¿Cuál es el problema? + +[COL5A_3:GENERA5] +Los franceses quieren recuperar la tecnología de sus misiles y después del último incidente, + +[COL5A_4:GENERA5] +siento que es momento de encontrar puertos más seguros. + +[COL5A_5:GENERA5] +¿No sería más seguro volar? + +[COL5A_6:GENERA5] +Estaría muerto antes de alcanzar el mostrador de facturación de equipajes. Además, necesito sacar del país mi mercancía. + +[COL5A_7:GENERA5] +¿Necesitas otro guardaespaldas? + +[COL5A_8:GENERA5] +Tú, amigo mío, vales por diez guardaespaldas... + +[COL5B_1:GENERA5] +Thomas, me has protegido y servido bien. + +[COL5B_2:GENERA5] +Pero ahora debes dejarnos antes de que lleguemos a mar abierto. + +[COL5B_4:GENERA5] +Gracias, Coronel. + +[COL5B_5:GENERA5] +Una petición más, mientras estoy fuera, ¿podrías vigilar a Mercedes por mí? + +[COL5B_6:GENERA5] +Creo que ella puede cuidarse por sí misma, pero seguro, la vigilaré. + +[COL5B_7:GENERA5] +Gracias, amigo mío. Hasta luego. + +[COL5B_8:GENERA5] +Adiós, amigo. + +[COL5_7:GENERA5] +¡Deja de dispararme! + +[COL5_9:GENERA5] +¡Tommy, haz que dejen de dispararme! + +[COL5_10:GENERA5] +¡Tengo inmunidad diplomática! + +[COL5_11:GENERA5] +¡No disparen, soy un Coronel! + +[COL5_12:GENERA5] +Thomas, mátales, mi país te adorará. + +[COL5_13:GENERA5] +¡Tommy, los franceses nos superan! + +[COL5_14:GENERA5] +Tommy, mire a donde mire, hay franceses, ¡lo odio! + +[COL5_15:GENERA5] +Tommy, ¿cómo estás? + +[COL5_16:GENERA5] +¡Ésto es por Piaf y Gainesbourg y por vuestro estúpido pan francés! + +[COL5_1:GENERA5] +¡A babor! ¡A babor! + +[COL5_2:GENERA5] +¡Están atacando desde estribor! + +[COL5_3:GENERA5] +¡El puente está ahí delante! + +[COL5_4:GENERA5] +¡Tienen un helicóptero! + +[COL5_B1:GENERA5] +~g~Protege al Coronel y su yate a toda costa. + +[COL5_B2:GENERA5] +~g~Ponte delante y despeja la ruta del yate del Coronel. + +[COL5_B3:GENERA5] +~r~¡El Coronel está muerto! + +[COL5_B4:GENERA5] +~g~Destruye el helicóptero de ataque. + +[COL5B_3:GENERA5] +Bajaré mi lancha personal. Quédatela, amigo, en señal de mi agradecimiento. + +[COL5_B5:GENERA5] +~g~Dispara para abatir los helicópteros, no pongas en peligro el yate. + +[COL5_B6:GENERA5] +~g~Te has quedado sin munición, consigue más de las escaleras en la cubierta superior. + +[COL5_B7:GENERA5] +~g~Te estás quedando sin salud, consigue más de las escaleras en la cubierta superior. + +{=================================== MISSION TABLE HAIT1 ===================================} + +[HAM1_A:HAIT1] +¿Hola? ¿Hola? + +[HAM1_B:HAIT1] +Entra, cielo, y descansa los pies. + +[HAM1_C:HAIT1] +Tú debes de ser el gran hombre malo sobre el que ha estado hablando mi abuelo. + +[HAM1_D:HAIT1] +Me cuenta cosas sobre ti, ya sabes, cuando me visita, + +[HAM1_E:HAIT1] +y sobre los otros que te esperan. + +[HAM1_F:HAIT1] +Bien, todos llevamos muertos mucho tiempo, pero tú... + +[HAM1_G:HAIT1] +No me gustaría estar en tu pellejo. + +[HAM1_H:HAIT1] +Recibí un mensaje. Para que viniese aquí. + +[HAM1_I:HAIT1] +¿Puedes oírles? + +[HAM1_J:HAIT1] +Están diciendo tu nombre, deben quererte mucho, ¿no crees? + +[HAM1_K:HAIT1] +Ahora ayudarás a la tía Poulet y quizás ella te ayude. + +[HAM1_L:HAIT1] +Quizás ella pueda darte un pequeño talismán después de todo esto. + +[HAM1_M:HAIT1] +¿Darte algo de magia para echar el mal de ojo a la policía? + +[HAM1_N:HAIT1] +Mira, esto es todo muy... ¿darme qué? + +[HAM1_O:HAIT1] +Yo, yo, creo que recibí la dirección equivocada... + +[HAM1_P:HAIT1] +Haz esto por mí, Tommy... + +[HAM1_Q:HAIT1] +Los cubanos, tontos orgullosos y desagradables, + +[HAM1_R:HAIT1] +han estado causando problemas a mis encantadores chicos haitianos. + +[HAM1_S:HAIT1] +Ahora le han dicho a la policía donde he estado almacenando mis polvos. + +[HAM1_T:HAIT1] +Ellos piensan que es farlopa, pardillos. + +[HAM1_U:HAIT1] +Ahora sé un buen chico, Tommy, y ve a conseguir los polvos para la tía Poulet. + +[HAM1_V:HAIT1] +Sí, sí, seguro, seguro. + +[HAM1_1:HAIT1] +~g~Los polis se están acercando a nuestros escondites. Ve y consíguelos antes que ellos lo hagan. + +[HAM1_2:HAIT1] +~r~¡Los polis llegaron primero al escondite! + +[HAM1_3:HAIT1] +~g~¡Lleva este material de vuelta al escondite! + +[HAM1_4:HAIT1] +~g~¡Bien! ¡Ahora el siguiente! + +[HAM1_6:HAIT1] +~r~¡Ese almacén está destruido, idiota! + +[HAM1_7:HAIT1] +~g~¡Los polis han conseguido nuestro alijo! ¡Recupéralo antes de que se marchen! + +[HAM1_8:HAIT1] +~g~Los polis están de camino para recoger el alijo, ¡date prisa! + +[HAT_1A:HAIT1] +~g~¡No muevas ni un solo dedo! + +{=================================== MISSION TABLE HAIT2 ===================================} + +[HAT2_B1:HAIT2] +~g~Ve hasta la camioneta que contiene las bombas aéreas. + +[HAT2_B2:HAIT2] +Mata a los cubanos... + +[HAT2_B4:HAIT2] +¡Y destruye sus barcos! + +[HAT2_B5:HAIT2] +~g~Los cubanos están huyendo. ¡No les dejes escapar! + +[HAT2_B6:HAIT2] +~r~¡El avión RC está yendo demasiado lejos del alcance! + +[HAT2_B7:HAIT2] +~g~Uno de los cubanos está escapando en un coche. ¡No dejes ningún testigo! + +[HAT2_B8:HAIT2] +~r~¡No te quedan aviones RC! + +[HAT2_B9:HAIT2] +Aviones RC: + +[HAT2_1:HAIT2] +Oh. Lo siento, debo tener la dirección equivocada... + +[HAT2_2:HAIT2] +Bueno, también podrías entrar y descansar los pies y tomarte una taza de té. + +[HAT2_3:HAIT2] +¿Tienes algo ahí para mí? + +[HAT2_4:HAIT2] +Sí... + +[HAT2_5:HAIT2] +Este lugar me parece familiar. Un olor de la niñez... un deja vu... + +[HAT2_6:HAIT2] +Bien, Tommy, te voy a susurrar un pequeño recado para que lo hagas. Escúchame bien, ¿vale? + +[HAT2_7:HAIT2] +Te pareces a alguien que yo... + +[HAT2_8:HAIT2] +Los cubanos tienen barcos rápidos que usan para cruzar el charco cargados de polvo. + +[HAT2_9:HAIT2] +Es su sustento. + +[HAT2_10:HAIT2] +Mi sobrino ha estado preparando pequeñas bombas aéreas para eliminarles. + +[HAT2_11:HAIT2] +Vuela los barcos y conviértelos en madera de ataúd. + +[HAT2_12:HAIT2] +Muchas gracias por el té. + +[HAT2_B3:HAIT2] { reVC update } +Pulsa ~h~~k~~VEHICLE_FIREWEAPON~~w~ para soltar una bomba. Pulsa ~h~~k~~VEHICLE_ENTER_EXIT~~w~ para cancelar. + +{=================================== MISSION TABLE HAIT3 ===================================} + +[HAM3_A:HAIT3] +¿Hola? Hola, eh... Estaba buscando a alguien por aquí... + +[HAM3_B:HAIT3] +Pareces hambriento, Tommy, + +[HAM3_C:HAIT3] +¿Te conozco? + +[HAM3_D:HAIT3] +Silencio. + +[HAM3_E:HAIT3] +Una cosa más y te podré dejar marchar, Tommy. + +[HAM3_F:HAIT3] +Mis chicos están en guerra con los cubanos. + +[HAM3_G:HAIT3] +Pero sin armas. + +[HAM3_H:HAIT3] +Pero los cubanos tienen una sorpresa por llegar. + +[HAM3_I:HAIT3] +Mientras combaten en las calles, tú tomarás este rifle y los matarás en medio del alboroto. + +[HAM3_J:HAIT3] +Nadie te verá, nadie te oirá. + +[HAM3_K:HAIT3] +Tommy, si haces esto por mí, ya no estarás atado a los lazos de mi delantal. + +[HAM3_1:HAIT3] +~g~Debemos ganar esta batalla. Si todos los haitianos mueren, perdemos nosotros. + +[HAM3_3:HAIT3] +~g~Espero que los cubanos hagan trampas así que permanece alerta. + +[HAM3_4:HAIT3] +~r~¡Te han visto! ¡La misión ha fracasado! + +[HAM3_5:HAIT3] +~g~Debes matar a los cubanos desde lejos. No deben verte. + +[HAM3_8:HAIT3] +~g~¡Los haitianos están muriendo! Mejora tu puntería. + +[HAM3_7:HAIT3] +~g~¡Cuidado! Los cubanos han traído refuerzos. ¡¡Acaba con todos ellos!! + +[HAM3_2:HAIT3] +~r~¡Los haitianos han muerto! + +[HAM3_L:HAIT3] +Vale, tía... + +{=================================== MISSION TABLE HOTEL ===================================} + +[INTB_A:HOTEL] +¡Tommy! Tommy, ha pasado tanto tiempo. + +[INTB_B:HOTEL] +Hola, Sonny. + +[INTB_C:HOTEL] +Lo sé, lo sé. Te abruma la emoción. + +[INTB_D:HOTEL] +Quince años... si parece que fue ayer. + +[INTB_E:HOTEL] +Supongo que es cuestión de perspectiva. + +[INTB_F:HOTEL] +Eh, estar en el talego por la familia no es agradable, + +[INTB_G:HOTEL] +aunque la familia cuida de los suyos, ¿no es verdad? + +[INTB_H:HOTEL] +Y bien, cómo fue el negocio... ¿estás sentado en una pila de oro blanco? + +[INTB_I:HOTEL] +Mira, Sonny, nos tendieron una trampa. El negocio fue una emboscada. Harry y Lee están muertos. + +[INTB_J:HOTEL] +Me estás tomando el pelo, ¿no? Tommy. Dime que aún tienes el dinero. + +[INTB_K:HOTEL] +No Sonny... no tengo el dinero. + +[INTB_L:HOTEL] +Ése era mi dinero, Tommy, ¡mi dinero! + +[INTB_M:HOTEL] +¡Espero que no me andes jodiendo, Tommy, porque sabes que soy un hombre con el que no se puede jugar! + +[INTB_N:HOTEL] +Espera Sonny. + +[INTB_O:HOTEL] +Tienes mi garantía personal de que voy a conseguir recuperar el dinero y el alijo. + +[INTB_P:HOTEL] +Y te voy a enviar por correo las pelotas de los responsables. + +[INTB_Q:HOTEL] +Eh, ya lo sé. No eres tonto, Tommy, pero te prevengo, yo tampoco lo soy. + +[INTB_R:HOTEL] +Si se tratase de cualquier otro, ya estarías MUERTO. + +[INTB_S:HOTEL] +Pero como se trata de ti, como hemos hecho historia, voy a dejar que te ocupes de esto. + +[INTB_T:HOTEL] +Mira, Sonny, tienes mi palabra. + +[INTB_U:HOTEL] +Estaremos en contacto. + +{=================================== MISSION TABLE ICECRE1 ===================================} + +[ICC1_1:ICECRE1] +~g~Utiliza la furgoneta de los helados para distribuir perica en Vice City. + +[ICC1_3:ICECRE1] +~g~Recibirás dinero por cada venta que hagas, pero cuantas más transacciones hagas más atraerás la atención de la policía. + +[ICC1_4:ICECRE1] +~g~No hay ningún cliente en esta zona, inténtalo en otra. + +[ICC1_5:ICECRE1] +Negocios hechos: + +[ICC1_6:ICECRE1] +~g~Utiliza la furgoneta Mr. Whoopee para distribuir los productos Cherry Popper por Vice City. + +[ICC1_7:ICECRE1] +~g~Por cada transacción que hagas recibirás dinero, aunque cuantas más operaciones lleves a cabo más atención provocarás de la policía. + +[ICC1_8:ICECRE1] +~g~Para llevar a cabo el negocio ~h~aparca la furgoneta, ~g~y pulsa el ~h~~k~~VEHICLE_HORN~ ~g~para que suene la música que llamará la atención de la gente. + +[ICC1_9:ICECRE1] +~g~A las bandas locales no les gustará que hagas negocios en su territorio así que si haces esto, prepárate para hostilidades. + +[ICC1_10:ICECRE1] +~g~Has hecho ~1~ tratos! + +[ICC1_11:ICECRE1] +~g~Has hecho ~1~ trato! + +[ICC1_12:ICECRE1] +¡PROPIEDAD ADQUIRIDA! + +[ICC1_13:ICECRE1] +~r~¡No conseguiste ningún trato! + +[ICC1_14:ICECRE1] +FÁBRICA DE HELADOS CONSOLIDADA + +[ICC1_15:ICECRE1] +~g~La fábrica de helados generará ahora unos ingresos máximos de hasta ~1~ $. Asegúrate de recaudarlos regularmente. + +[ICC1_2:ICECRE1] +~g~Aparca la furgoneta y pulsa ~h~~k~~VEHICLE_HORN~~w~ para que suene la música indicando a los clientes que estás listo para hacer empezar. + +[ICC1_16:ICECRE1] +~g~Utiliza la furgoneta Mr. Whoopee para distribuir los productos Cherry Popper por Vice City. + +[ICE_AT1:ICECRE1] +FÁBRICA DE HELADOS CONSOLIDADA + +[ICE_AT2:ICECRE1] +~g~La fábrica Cherry Popper generará ahora unos ingresos hasta un máximo de ~1~ $. Asegúrate de recaudarlos de manera regular. + +[ICC1_17:ICECRE1] +Misión de Distribución finalizada + +[ICC1_18:ICECRE1] +Venta total de helados: ~1~ $ + +[ICC1_19:ICECRE1] +Total de negocios hechos: ~1~ + +{=================================== MISSION TABLE ICECUT ===================================} + +[ICC1_A:ICECUT] +¿Quién eres tú? + +[ICC1_B:ICECUT] +El nuevo propietario. + +[ICC1_C:ICECUT] +¿Fuiste ahora o en cualquier momento un niño? + +[ICC1_D:ICECUT] +¿De qué estás hablando? + +[ICC1_E:ICECUT] +¿Fuiste niño? + +[ICC1_F:ICECUT] +¡Sí! ¡Calma! ¿Qué pasa contigo? + +[ICC1_G:ICECUT] +Lo sabía. Un niño. + +[ICC1_H:ICECUT] +¡Un maldito, apestoso, lloriqueante, mocoso, vil, vomitivo y pequeño bebé chillón! + +[ICC1_I:ICECUT] +Bebés... Criaturas repugnantes, horribles y espantosas. + +[ICC1_J:ICECUT] +Mami no te quiere. ¡mierdecilla! + +[ICC1_K:ICECUT] +Cálmate. + +[ICC1_L:ICECUT] +ODIO los bebés, odio los niños. + +[ICC1_M:ICECUT] +Son unos pequeños guarros, llorones, mocosos, perversos y vomitivos... + +[ICC1_N:ICECUT] +¡Ya es suficiente! + +[ICC1_O:ICECUT] +¿Qué pasa contigo? + +[ICC1_P:ICECUT] +¿Fabricas helado, de acuerdo? Es básicamente para los niños. + +[ICC1_Q:ICECUT] +¿Qué clase de psicópata eres tú? + +[ICC1_R:ICECUT] +Solo para que lo entienda, ¿para qué hacer felices a los niños si los odias? + +[ICC1_S:ICECUT] +Oh, estúpido, apestoso, lloriqueante... + +[ICC1_T:ICECUT] +¡Cállate! + +[ICC1_U:ICECUT] +¡Mocoso! + +[ICC1_V:ICECUT] +El helado es una tapadera. + +[ICC1_W:ICECUT] +Distribuimos otros productos no lácteos. + +[ICC1_X:ICECUT] +Y si veo un niño, le saco provecho. + +[ICC1_Y:ICECUT] +¿Verdad, niños? Sí, sí, lo hago. Mamá no os quiere. + +[ICC1_Z:ICECUT] +¡Os ODIA! + +[ICC1_ZA:ICECUT] +¡PROPIEDAD ADQUIRIDA! + +{=================================== MISSION TABLE INTRO ===================================} + +[INT1_A:INTRO] +Tommy Vercetti... Mierda. + +[INT1_B:INTRO] +No pensé que le fueran a soltar nunca. + +[INT1_C:INTRO] +Mantuvo la cabeza gacha, ayuda a la gente a olvidar. + +[INT1_D:INTRO] +La gente lo recordará antes de lo que crees. + +[INT1_E:INTRO] +Cuando le vean paseando por las calles de su barrio. + +[INT1_F:INTRO] +Será malo para el negocio. + +[INT1_G:INTRO] +Bien, ¿qué vamos a hacer, Sonny? + +[INT1_H:INTRO] +Le tratamos como a un viejo amigo y le tenemos ocupado fuera de la ciudad. ¿De acuerdo? + +[INT1_I:INTRO] +Hemos estado hablando de expandirnos hacia el sur. ¿Verdad? + +[INT1_J:INTRO] +Hoy en día Vice City es oro de veinticuatro quilates. + +[INT1_K:INTRO] +Los colombianos, los mejicanos, demonios, + +[INT1_L:INTRO] +incluso esos refugiados cubanos se están repartiendo un buen pedazo de la acción. + +[INT1_M:INTRO] +Pero todo es por la nieve, Sonny. + +[INT1_N:INTRO] +¡Ninguna de las familias tocará esa mierda! + +[INT1_O:INTRO] +Los tiempos cambian. + +[INT1_P:INTRO] +Las familias no pueden seguir dando la espalda mientras nuestros enemigos recogen las recompensas. + +[INT1_Q:INTRO] +Así que enviaremos a alguien para que nos hagan el trabajo sucio + +[INT1_R:INTRO] +y tranquilamente nos llevaremos un buen cacho. ¿Vale? + +[INT1_S:INTRO] +¿Quién es nuestro contacto allí? + +[INT1_T:INTRO] +Ken Rosenberg, un estúpido abogado. + +[INT1_U:INTRO] +¿Cómo va a atar corto a Vercetti? + +[INT1_V:INTRO] +No necesitamos que lo haga. + +[INT1_W:INTRO] +Simplemente le soltaremos en Vice City + +[INT1_X:INTRO] +y le daremos un poco de dinero para que empiece. ¿De acuerdo? + +[INT1_Y:INTRO] +Le damos unos cuantos meses. + +[INT1_Z:INTRO] +Luego vamos, + +[INT1_A1:INTRO] +y le hacemos una pequeña visita, ¿de acuerdo? + +[INT1_A2:INTRO] +Para ver cómo le va. + +[INT2_A:INTRO] +¡Eh, eh, tíos! ¡Aquí, eh, Ken Rosenberg! ¡Je, je, genial! + +[INT2_B:INTRO] +Bueno, voy a llevaros a la reunión, ¿vale? + +[INT2_C:INTRO] +He hablado con los proveedores, y ellos están muy... + +[INT2_D:INTRO] +interesados en empezar una relación de negocios, así que... + +[INT2_E:INTRO] +si todo esto va bien, deberíamos... + +[INT2_F:INTRO] +empezar a obtener beneficios, lo cual es, ya sabes... + +[INT2_G:INTRO] +Bueno. + +[INT2_H:INTRO] +Entonces. Son hermanos, ¿vale? + +[INT2_I:INTRO] +Uno dirige el negocio, + +[INT2_J:INTRO] +y el otro se encarga de los vuelos. + +[INT2_K:INTRO] +Ahora operan fuera de Méjico + +[INT3_A:INTRO] +Bien, son los del helicóptero. + +[INT3_B:INTRO] +De acuerdo, este es el trato. + +[INT3_C:INTRO] +Quieren un intercambio directo en campo abierto. + +[INT3_D:INTRO] +¿De acuerdo? De acuerdo, permanece firme, vamos. + +[INT3_E:INTRO] +De acuerdo, ahora con cuidado. + +[INT3_F:INTRO] +Estoy aquí. ¡El coche está en marcha, nena! + +[INT3_G:INTRO] +¿Lo tienes? + +[INT3_H:INTRO] +Colombiana, 100% con un grado de pureza A, amigo. + +[INT3_I:INTRO] +¿Los verdes? + +[INT3_J:INTRO] +De diez y de veinte... usados. + +[INT3_L:INTRO] +¡Vamos, fuera de aquí! ¡Arranca! + +[INT4_A:INTRO] +¡Jodidos! ¡Estamos jodidos! + +[INT4_B:INTRO] +Muy típico, + +[INT4_C:INTRO] +saco la cabeza del agujero un jodido segundo, + +[INT4_D:INTRO] +¡Y el destino me echa la mierda a la cara! + +[INT4_E:INTRO] +Bueno, ¡jódete! + +[INT4_F:INTRO] +Cierra el pico y deja de quejarte. Estás vivo, ¿no? + +[INT4_G:INTRO] +Déjame justo aquí. + +[INT4_H:INTRO] +Ve y abandona el coche y luego vete a dormir un poco. + +[INT4_I:INTRO] +Mañana me pasaré por tu oficina y podemos empezar a solucionar esto. + +[INT4_J:INTRO] +De acuerdo, es una buena idea, iré a dormir un poco. + +[INT4_K:INTRO] +¿Qué vas a hacer tú. + +[INT4_L:INTRO] +Me las arreglaré para volver a mi hotel. + +[INT4_M:INTRO] +A despejar la mente y a pensar sobre esta mierda. + +[INT4_N:INTRO] +Vale. + +[INTRO1:INTRO] +Saco la cabeza del agujero un jodido segundo y el destino, ¡me echa la mierda en la cara! + +[INTRO2:INTRO] +Vete a dormir un poco. + +[INTRO3:INTRO] +¿Qué es lo que vas a hacer? + +[INTRO4:INTRO] +Mañana me pasaré por tu oficina y empezaremos a solucionar todo este desorden. + +[INT3_K:INTRO] +Creo que hemos llegado a un acuerdo, amigo mío. + +[INT3_M:INTRO] +Déjame ver. + +[INT2_L:INTRO] +no, no, no, espera... + +[INT3_N:INTRO] +¡Mierda! + +{=================================== MISSION TABLE KENT1 ===================================} + +[KPM1_A:KENT1] +A ver tío, te voy a salvar el culo, colega. + +[KPM1_B:KENT1] +¿De qué coño me estás hablando? + +[KPM1_C:KENT1] +Conoces a ese bastardo de Díaz, Don Farlopa. + +[KPM1_D:KENT1] +Tiene a tu colega, Lance. Dicen que tu amigo intentó atacarle por sorpresa... + +[KPM1_E:KENT1] +pero no fue lo suficientemente sorprendente, si entiendes lo que te quiero decir. + +[KPM1_F:KENT1] +¿A dónde le llevó? + +[KPM1_G:KENT1] +¡Tranquilo! Le hicieron cruzar la ciudad hasta el desguace. + +[KPM1_H:KENT1] +Maldita sea... ¡Chalado! + +[KPM1_2:KENT1] +~r~¡Se suponía que debías sacar con vida a Lance! + +[KPM1_3:KENT1] +SALUD DE LANCE: + +[RESC_1:KENT1] +¿Crees que puedes usar un arma? + +[RESC_2:KENT1] +Sí... supongo... yo también me alegro de verte. + +[RESC_3:KENT1] +Salgamos de aquí. + +[RESC_4:KENT1] +Ahí va todo mi cuidadoso plan, directo a la mierda, gracias a ti. La jodiste bien. + +[RESC_5:KENT1] +Mató a mi hermano. ¿Qué esperabas que hiciese, cortarle el césped? + +[RESC_6:KENT1] +Vamos a tener que eliminar a ese mamón de Díaz antes de que él nos elimine a nosotros. + +[RESC_7:KENT1] +Haz que te curen y encuéntrate conmigo en el puente que va a Star Island, ¿de acuerdo? + +[RESC_8:KENT1] +De acuerdo, entendido. + +[KPM1_1:KENT1] +~g~¡Lance está siendo retenido en el desguace, ve y libérale! + +[KPM1_4:KENT1] +~g~¡Lleva a Lance al hospital! + +[M_PASSN:KENT1] +¡MISIÓN SUPERADA! + +[KPM1_5:KENT1] +~g~¡Los hombres de Díaz te están buscando! Lleva a Lance al hospital. + +{=================================== MISSION TABLE KICKSTT ===================================} + +[KICK1_2:KICKSTT] +~r~¡No volviste a la moto lo suficientemente rápido! + +[KICK1_7:KICKSTT] +~r~¡Has destrozado la moto! + +[KICK1_8:KICKSTT] +~g~¡Sube a la moto! + +[KICK1_T:KICKSTT] +TIEMPO EMPLEADO: + +[KICKTM:KICKSTT] +~b~TIEMPO DE PRUEBA: ~1~:~1~ + +[KICKTM2:KICKSTT] +~b~TIEMPO DE PRUEBA: ~1~:0~1~ + +[GETBIKE:KICKSTT] +~g~Tienes ~1~ segundos para volver a subir a una moto antes de que termine la misión. + +[KICK1_1:KICKSTT] +~g~Completa el circuito lo más rápidamente posible. + +[KICK1_6:KICKSTT] +~g~¡Bien hecho! + +[KICK_10:KICKSTT] +~g~Utiliza la Sanchez para completar el circuito pasando por todos los puntos de control. + +[KICK_12:KICKSTT] +~r~¡La has cagado! + +[KICK_13:KICKSTT] +~r~¡Has tardado mucho tiempo! + +[KICK_11:KICKSTT] +~g~Para abandonar la misión, sitúate en el ~q~marcador rosa~g~. + +{=================================== MISSION TABLE LAWYER1 ===================================} + +[LAW1_A:LAWYER1] +Ve a dormir un poco, dice... + +[LAW1_B:LAWYER1] +¡Llevo sentado en esta silla toda la noche con las luces apagadas y bebiendo café! + +[LAW1_C:LAWYER1] +Esto es un desastre. ¡Estamos muy jodidos, tío! + +[LAW1_D:LAWYER1] +Estos gorilas, escúchame, van a venir aquí a arrancarme la cabeza. ¡Es ridículo! + +[LAW1_E:LAWYER1] +¡NO fui a la universidad para ésto! De acuerdo, ¿ahora qué coño vamos a hacer? + +[LAW1_F:LAWYER1] +Cállate, siéntate y relájate. Te diré lo que vamos a hacer. + +[LAW1_G:LAWYER1] +Vas a descubrir quién se llevó nuestra nieve... y después voy a cargármelos. + +[LAW1_H:LAWYER1] +Es una buena idea. Es una idea GENIAL. Déjame pensar, déjame pensar, déjame pensar. + +[LAW1_I:LAWYER1] +¡Oh! Está este Coronel retirado, el coronel Juan García Cortez. + +[LAW1_J:LAWYER1] +Él es el que me ayudó a montar esta operación + +[LAW1_K:LAWYER1] +bien lejos de los matones establecidos de Vice City. ¿Entendido? + +[LAW1_L:LAWYER1] +Bien, escucha. Está dando una fiesta en su lujoso yate en la bahía + +[LAW1_M:LAWYER1] +y todos los hombres más importantes de Vice City van a estar allí. + +[LAW1_N:LAWYER1] +Tengo invitación, por supuesto que tengo invitación, + +[LAW1_O:LAWYER1] +pero no sueñes que vaya a asomar la cabeza por esa puerta... ¡ni lo sueñes! + +[LAW1_P:LAWYER1] +¡Te lo dije, cállate! Iré yo mismo... + +[LAW1_Q:LAWYER1] +A mí también me gusta el estilo de 1978, pero esto no va a ser una fiesta con cerveza y tías en pelotas. + +[LAW1_R:LAWYER1] +Quiero decir, sin ánimo de ofender, creo que podrías hacer que la gente se volviese a mirar por razones equivocadas. + +[LAW1_S:LAWYER1] +¿Qué hay de malo con cómo voy vestido? + +[LAW1_T:LAWYER1] +Vale, mira, ten. Pásate por donde Rafael, dile que te envío yo, hará que parezcas respetable. + +[LAW1_U:LAWYER1] +Bien, ve, vamos... + +[LAWP_1:LAWYER1] +Buenas noches. + +[LAWP_2:LAWYER1] +Tengo entendido que viene de parte del Sr. Rosenberg, + +[LAWP_3:LAWYER1] +Espero que ningún problema reciente le haya afectado a su salud física, o uh, + +[LAWP_4:LAWYER1] +o mental, Sr... ¿eh? + +[LAWP_5:LAWYER1] +Vercetti. Tan sólo tiene un poco de... agorafobia. + +[LAWP_6:LAWYER1] +Excelente, excelente. ¿Y usted? + +[LAWP_7:LAWYER1] +Yo solo quiero mi farlopa. + +[LAWP_8:LAWYER1] +Ah. Ha sido un desgraciado cúmulo de circunstancias para todos los interesados. + +[LAWP_9:LAWYER1] +Por supuesto, he iniciado mis propias pesquisas + +[LAWP_10:LAWYER1] +pero un asunto tan delicado llevará tiempo. + +[LAWP_11:LAWYER1] +Quizás hablemos más tarde. ¿Eh? + +[LAWP_12:LAWYER1] +Mientras tanto, permítame presentarle a mi hija. + +[LAWP_13:LAWYER1] +¡Mercedes! + +[LAWP_14:LAWYER1] +Cara mía, ¿podrías acompañar a nuestro invitado mientras atiendo a mis obligaciones? + +[LAWP_15:LAWYER1] +Por supuesto, papá. + +[LAWP_16:LAWYER1] +Por favor, discúlpeme. + +[LAWP_17:LAWYER1] +¿Mercedes? + +[LAWP_18:LAWYER1] +Intenta acostumbrarte. + +[LAWP_19:LAWYER1] +En fin, déjame presentarte a algunos de nuestros invitados más distinguidos... + +[LAWP_20:LAWYER1] +Ese es nuestro congresista Alex Shrub con la sonriente estrella de la silicona Candy Suxxx... + +[LAWP_21:LAWYER1] +¿Conoces a mi encantadora esposa, Laura? ¿No? + +[LAWP_22:LAWYER1] +Bueno, desafortunadamente ella está en Alabama. Te presento a Candy. + +[LAWP_23:LAWYER1] +Y por ahí tenemos a la estirada estrella de las Mambas de Vice City, BJ. + +[LAWP_24:LAWYER1] +Siempre tan encantador. + +[LAWP_25:LAWYER1] +Le paré en seco, lo hice, ¡y le dejé en una silla de ruedas! + +[LAWP_26:LAWYER1] +¡Ja, ja, ésa es buena! + +[LAWP_27:LAWYER1] +Bien, ahora estoy mirando una verdadera propiedad de primera. + +[LAWP_28:LAWYER1] +Y ese anfibio al lado de la piscina es Jezz Torrent, + +[LAWP_29:LAWYER1] +cantante principal de Love Fist. + +[LAWP_30:LAWYER1] +¿Sabéis cómo juegan al ping-pong en Tailandia? + +[LAWP_31:LAWYER1] +Dejad que os lo cuente, + +[LAWP_32:LAWYER1] +¡no hace falta una pala precisamente! ¿entendéis lo que quiero decir? + +[LAWP_33:LAWYER1] +Impotente. + +[LAWP_34:LAWYER1] +Y el trío charlatán. + +[LAWP_35:LAWYER1] +Esa glándula sudorípara durmiente es la mano derecha de papá, González + +[LAWP_36:LAWYER1] +y los otros dos son el pastor Richards + +[LAWP_37:LAWYER1] +y el director de cine seudointelectual, Steve Scott. + +[LAWP_38:LAWYER1] +Pasión con las invasoras ninfómanas, + +[LAWP_39:LAWYER1] +entonces aparece el tiburón gigante y... + +[LAWP_40:LAWYER1] +¡Les arranca las pollas de un mordisco! + +[LAWP_41:LAWYER1] +Ja, bien. Nunca has visto nada igual, ¿Verdad? + +[LAWP_42:LAWYER1] +¡Coronel! + +[LAWP_43:LAWYER1] +¡Sus fiestas tienen siempre un gran éxito! + +[LAWP_44:LAWYER1] +Sólo puedo pedir disculpas por mi tardía llegada. + +[LAWP_45:LAWYER1] +Ah, de nada amigo. ¿Cómo nos encontramos? + +[LAWP_46:LAWYER1] +Nuestro negocio es muy estresante, siempre intentan desbancarnos. + +[LAWP_47:LAWYER1] +Hay un momento para recompensar a los amigos de uno y para liquidar a los enemigos, amigo. + +[LAWP_48:LAWYER1] +¿Quién es el bocazas? + +[LAWP_49:LAWYER1] +Ricardo Díaz, alias Don Farlopa. + +[LAWP_50:LAWYER1] +¡Mercedes! + +[LAWP_51:LAWYER1] +Oh, estaba a punto de llevar a mi amigo de vuelta a la ciudad. + +[LAWP_52:LAWYER1] +¡En otro momento, Ricardo! + +[LAWP_53:LAWYER1] +Salgamos de aquí. + +[LAWP_54:LAWYER1] +Mejor llévame al club Pole Position. + +[LAW1_2:LAWYER1] +~g~Ve al barco del Coronel. + +[LAW1_4:LAWYER1] +~r~¡Mataste a la hija del Coronel! + +[LAW1_5:LAWYER1] +¿Trabajarás para mi padre? + +[LAW1_6:LAWYER1] +Quizás. + +[LAW1_7:LAWYER1] +¿Te importa que pose mi mano en tu regazo? + +[LAW1_8:LAWYER1] +Quizás... + +[LAW1_9:LAWYER1] +Es tan difícil tener un padre rico y poderoso. Vamos. + +[LAW1_10:LAWYER1] +¡Nos vemos, guapo! + +[LAW1_11:LAWYER1] +Estoy seguro. + +[LAW1_12:LAWYER1] +Bonita moto. + +[LAW1_13:LAWYER1] +¡No! ¡Mi moto! + +[LAW1_3:LAWYER1] +~g~Lleva a la hija del Coronel al club Pole Position. + +[HELP20:LAWYER1] +Ve al icono de la ~h~camiseta~w~ que hay en el radar para encontrar la tienda de Rafael. + +[LAW1_14:LAWYER1] +¡Guau!, Me encantaría probar tu moto. + +[LAW1_15:LAWYER1] +Sí pequeño, pues recógela de Howlin' Pete's + +{=================================== MISSION TABLE LAWYER2 ===================================} + +[LAW2_A:LAWYER2] +¡Ah! Espero que te lo estés pasando bien. Porque yo me estoy volviendo loco de preocupación. ¿Qué has descubierto? + +[LAW2_B:LAWYER2] +Que hay más criminales en esta ciudad que en la cárcel. Necesitamos un confidente de las calles... + +[LAW2_C:LAWYER2] +Vale, déjame pensar, déjame pensar, déjame pensar... + +[LAW2_D:LAWYER2] +¡AH! ¡Lo tengo! + +[LAW2_E:LAWYER2] +Está este inglés, un baboso de la industria musical, + +[LAW2_F:LAWYER2] +se hace llamar Kent Paul. + +[LAW2_G:LAWYER2] +Bueno, tiene la cabeza tan metida en la mayoría de los culos de Vice City + +[LAW2_H:LAWYER2] +que si alguien sabe el paradero de 20 kilos de farlopa, + +[LAW2_I:LAWYER2] +es este tío, ¿de acuerdo? Siempre está en el Malibú. + +[LAW2_J:LAWYER2] +Le haré una visita. + +[LAW2B_A:LAWYER2] +¿De dónde saliste? + +[LAW2B_B:LAWYER2] +He estado buscando una chica como tú durante siglos, tía... + +[LAW2B_C:LAWYER2] +Kent Paul, tía. Por aquí soy el que manda. + +[LAW2B_D:LAWYER2] +Estoy buscando a un tipo inglés... + +[LAW2B_E:LAWYER2] +Muevo hilos, ¿entiendes lo que quiero decir? + +[LAW2B_F:LAWYER2] +Te invitaré. Lo que quieras, te lo conseguiré, chica. + +[LAW2B_G:LAWYER2] +No te preocupes por nada, tía. + +[LAW2B_H:LAWYER2] +Piérdete, guapa. + +[LAW2B_I:LAWYER2] +¡Eh, eh, eh, eh, eh! + +[LAW2B_J:LAWYER2] +¿Eres Kent Paul? Soy amigo de Rosenberg... + +[LAW2B_K:LAWYER2] +Rosenberg... Rosenberg... ¡Oh, ese chalado abogado de pacotilla! + +[LAW2B_L:LAWYER2] +¡Ese tipo podría defender a un inocente y mandarle directamente al corredor de la muerte! + +[LAW2B_M:LAWYER2] +Ponnos otra copa, hermano. + +[LAW2B_N:LAWYER2] +Todo el mundo es cómico. + +[LAW2B_O:LAWYER2] +Escúchame, he perdido veinte kilos y un montón de pasta... + +[LAW2B_P:LAWYER2] +¿Drogas, tío? Es un juego de tontos. + +[LAW2B_Q:LAWYER2] +¿Qué sabes al respecto? + +[LAW2B_R:LAWYER2] +¡Eh, eh! A lo que iba es que, + +[LAW2B_S:LAWYER2] +hay un chef-camello que tiene su negocio en la cocina de un hotel en Ocean Drive. + +[LAW2B_T:LAWYER2] +Últimamente parece muy satisfecho de sí mismo. ¿Podrías ir y tantearle? + +[LAW2B_U:LAWYER2] +Lo haré... y ya nos veremos. + +[LAW2B_V:LAWYER2] +Sí, está bien. Venga... vete, idiota. ¡Te voy a quitar las luces de un puñetazo! + +[LAW2B_W:LAWYER2] +Ponme una copa... ¡y dónde está esa zorra! + +[LAW2C_A:LAWYER2] +Oh, así se hace, tipo duro. Machácale. Eso debería hacerle muy parlanchín. + +[LAW2C_B:LAWYER2] +¿Tú también quieres un poco? + +[LAW2C_C:LAWYER2] +Eh, relájate. Quiero lo que tú quieres, hermano. + +[LAW2C_D:LAWYER2] +¿Oh, sí? ¿Y qué es eso? + +[LAW2C_E:LAWYER2] +Tu dinero... y la nieve de mi hermano muerto. Desgraciadamente, hiciste callar a nuestro contacto. + +[LAW2C_F:LAWYER2] +Los accidentes ocurren. Piérdete. + +[LAW2C_G:LAWYER2] +Eh, eh, guau. No hay necesidad de hacerte el llanero solitario conmigo. + +[LAW2C_H:LAWYER2] +Tal y como yo lo veo... somos dos hombres en una ciudad extraña. Necesitamos cubrirnos las espaldas mutuamente. + +[LAW2C_I:LAWYER2] +Mi espalda está bien, hermano... + +[LAW2C_J:LAWYER2] +¿Estás seguro de eso? Ten, toma esto... + +[LAW2C_K:LAWYER2] +¡Sígueme! + +[LAW2_1:LAWYER2] +¿Qué estás mirando? + +[LAW2_2:LAWYER2] +Mejor empieza a hablar... + +[LAW2_3:LAWYER2] +¡Oblígame, mamón! + +[LAW2_4:LAWYER2] +¡Por aquí! + +[LAW2_5:LAWYER2] +Voy a ver qué puedo averiguar. Te estaré vigilando, Tommy. + +[LAW2_6:LAWYER2] +~g~Ve al club Malibú y busca a Kent Paul. + +[LAW2_7:LAWYER2] +~g~Ve y busca al chef en Ocean Drive. + +[LAW2_10:LAWYER2] +~g~Regresa al hotel. + +[LAW2_11:LAWYER2] +~g~Recoge su teléfono móvil. + +[LAW2_12:LAWYER2] +¡Adquirido un teléfono móvil! Ahora puedes recibir llamadas telefónicas. + +[LAW2_13:LAWYER2] +~g~¡Has dejado a Lance atrás! ¡Ve y tráele! + +[LAW2_14:LAWYER2] +¡Tenemos que salir pitando de aquí! + +[GUN_2A:LAWYER2] +¡Mantén ~h~~k~~PED_LOCK_TARGET~ ~w~para ~h~apuntar automáticamente~w~ y pulsa ~h~~k~~PED_FIREWEAPON~ ~w~para ~h~disparar! + +[GUN_2C:LAWYER2] +¡Mantén ~h~~k~~PED_LOCK_TARGET~ ~w~para ~h~apuntar automáticamente~w~ y pulsa ~h~~k~~PED_FIREWEAPON~ ~w~para ~h~disparar! + +[GUN_2D:LAWYER2] +¡Mantén ~h~~k~~PED_LOCK_TARGET~ ~w~para ~h~apuntar automáticamente~w~ y pulsa ~h~~k~~PED_FIREWEAPON~ ~w~para ~h~disparar! + +[HELP17:LAWYER2] +Pulsa ~h~~k~~PED_FIREWEAPON~~w~ para atacar al chef. + +[HELP18:LAWYER2] +Pulsa ~h~~k~~PED_FIREWEAPON~~w~ para atacar al chef. + +[LAW3_11:LAWYER2] +Sitúate en el ~q~marcador rosa~w~ para ver las armas disponibles. + +[LAW3_12:LAWYER2] +Puedes seleccionar armas pulsando ~h~izquierda~w~ o ~h~derecha~w~ en los ~h~botones de dirección~w~. + +[LAW3_13:LAWYER2] +Si dispones de suficiente dinero, puedes comprar armas pulsando ~h~~k~~PED_SPRINT~~w~. + +[LAW3_14:LAWYER2] +Puedes salir de la tienda pulsando ~h~~k~~VEHICLE_ENTER_EXIT~~w~. + +[LAW3_15:LAWYER2] +Ve al ~h~icono de la pistola~w~ que hay en el radar para encontrar el ~h~Ammu-Nation~w~. + +[LAW2_15:LAWYER2] +~g~Ve a Ammu-Nation. + +[LAW2_K:LAWYER2] +Tómatelo con calma. + +[LAW2_16:LAWYER2] +Tienes que entender una cosa sobre esta ciudad. Tienes que saber protegerte. + +[LAW2_17:LAWYER2] +Venga, la tienda de armas local está a un par de manzanas de aquí. + +[LAW2_18:LAWYER2] +Tommy, cada hombre necesita un poco de rock de vez en cuando. + +[LAW2_19:LAWYER2] +Este de aquí es el club de striptease Pole Position. Quizás quieras entrar alguna vez. + +{=================================== MISSION TABLE LAWYER3 ===================================} + +[LAW3_A:LAWYER3] +¡Aagh! ¡Oh, por el amor de Dios, eres tú! Oh, Jesús, ¡voy a necesitar pantalones nuevos! + +[LAW3_B:LAWYER3] +Eh, esos psicópatas del norte han estado entrometiéndose y pronto vendrán aquí. + +[LAW3_C:LAWYER3] +Bien, ¿dónde está el maldito dinero? + +[LAW3_D:LAWYER3] +Relájate, relájate. Aún no hemos llegado a esa parte. + +[LAW3_E:LAWYER3] +Pensé que te estabas ocupando de esto, de verdad que sí. + +[LAW3_F:LAWYER3] +Y ahora esos tipos dicen que les tenemos que hacer un favor. + +[LAW3_G:LAWYER3] +Quieres decir que yo tengo que hacerles un favor. + +[LAW3_H:LAWYER3] +Oh, por supuesto, eso es lo que quiero decir. ¿Doy yo la impresión de poder intimidar a un jurado? + +[LAW3_I:LAWYER3] +No podría intimidar a un niño y créeme, lo he intentado. + +[LAW3_J:LAWYER3] +Ahora mira, es eso, o al primo de Forelli, Giorgio, le caerán cinco años por fraude. + +[LAW3_K:LAWYER3] +¡Tienes que encargarte de esos tipos! + +[LAW3_L:LAWYER3] +Comprendo. Ayuda al jurado a que cambie de idea. No te preocupes por ello. + +[LAW3_M:LAWYER3] +¡No no no no... NO! Ya intenté eso. El caso del jurado no fue tan bien, + +[LAW3_N:LAWYER3] +así que HAZ que cambien de idea. + +[LAW3_1:LAWYER3] +Giorgio envía sus saludos. + +[LAW3_2:LAWYER3] +Recuerda, ''culpable'' es una palabra fea. + +[LAW3_3:LAWYER3] +Inocente hasta que yo diga lo contrario. + +[LAW3_4:LAWYER3] +Sabes que no es culpable. + +[LAW3_5:LAWYER3] +¿Recuerdas a Giorgio? Recuerda que es inocente. + +[LAW3_6:LAWYER3] +No culpable. ¿Comprendido? Bien. + +[LAW3_8:LAWYER3] +~r~¡Mataste a un miembro del jurado! + +[LAW3_9:LAWYER3] +~g~¡Destroza el coche del miembro del jurado para sacarle de ahí! + +[HELP40:LAWYER3] +Puedes destrozar coches usando el martillo o un arma similar. + +[HELP41:LAWYER3] +o puedes aplastarlas con un vehículo + +[LAW3_20:LAWYER3] +~g~¡Destroza el coche del miembro del jurado! + +[LAW3_21:LAWYER3] +¡No puedo creer lo que está pasando! + +[LAW3_22:LAWYER3] +¡Increíble! + +[LAW3_23:LAWYER3] +¡Ya! ¡Ya! ¡Entendido! + +[LAW3_24:LAWYER3] +~g~Ese martillo será útil. + +[LAW3_7:LAWYER3] +~g~¡Ve y coacciona a los dos miembros del jurado pero NO los mates! + +[HELP23:LAWYER3] +Puedes ir al ~h~icono del martillo~w~ que hay en el radar si quieres comprar armas blancas en la ferretería. + +[LAW3_16:LAWYER3] +Estúpido cretino de Florida. + +[LAW3_17:LAWYER3] +¡Quítate de en medio! + +{=================================== MISSION TABLE LAWYER4 ===================================} + +[LAW4_A:LAWYER4] +Avery, ni que decir tiene... ¡Tommy! ¡Tommy! ¿Algún progreso? No, no, no... cuéntamelo luego, cuéntamelo luego. + +[LAW4_B:LAWYER4] +Tommy, éste es Avery Carrington... ¿Creo que os conocisteis en la fiesta? + +[LAW4_C:LAWYER4] +No en persona. + +[LAW4_D:LAWYER4] +¿Qué tal? + +[LAW4_E:LAWYER4] +Avery tiene una proposición. + +[LAW4_F:LAWYER4] +¿No tenemos otras cosas en mente? + +[LAW4_G:LAWYER4] +Estoy intentando mantener todo bajo control así que, ¿podrías darme un respiro? + +[LAW4_H:LAWYER4] +Estoy tenso como un alambre e incluso si estoy muerto al final de la semana, me gustaría pensar que no moriré pobre. + +[LAW4_I:LAWYER4] +Bien, calmaos, los dos. + +[LAW4_J:LAWYER4] +Hijo, si me ayudas, me encargaré de que cualquier capullo que te esté molestando se eche una buena siesta. + +[LAW4_K:LAWYER4] +De acuerdo, ¿qué puedo hacer por ti? + +[LAW4_L:LAWYER4] +Esta compañía de reparto tiene el almacén en unos terrenos de primera. No venderán. + +[LAW4_M:LAWYER4] +Están aguantando como una vieja rata de la pradera, así que tenemos que ir allí y ahumar a esas alimañas para hacerlas salir. + +[LAW4_N:LAWYER4] +Ve allí y alborota el avispero. + +[LAW4_O:LAWYER4] +Los de seguridad tendrán las manos ocupadas y entonces podrás colarte y dejarles fuera de combate. + +[LAW4_P:LAWYER4] +Y podrías pasarte por Rafael para cambiarte de ropa. Podrías estar allí un rato, pero sí, ve. + +[LAW4_Q:LAWYER4] +Debería ser un motín. + +[LAW4_R:LAWYER4] +Si las cosas salen como deberían, pásate alguna vez por mi oficina... + +[LAW4_1:LAWYER4] +Por favor, dispérsense. ¡La dirección discutirá cualquier queja de la forma apropiada! + +[LAW4_2:LAWYER4] +Por favor, dispérsense. ¡Vuelvan a sus casas! + +[LAW4_3:LAWYER4] +¡Por favor, dispérsense! ¡Esto no es apropiado! + +[LAW4_4:LAWYER4] +Por favor, dispérsense. Todos acabaréis en la calle. + +[LAW4_5:LAWYER4] +¡Desenfundad, chicos! ¡Vamos a romper unos cuantos cráneos comunistas! + +[LAW4_13:LAWYER4] +~g~Empieza a luchar con al menos 4 trabajadores para iniciar una revuelta. + +[LAW4_14:LAWYER4] +~g~¡Destruye las furgonetas del complejo! + +[HELP38:LAWYER4] +Si matas a alguien que lleva un arma, la dejará caer. + +[HELP39:LAWYER4] +Puedes disparar a los barriles explosivos, pero mantén la distancia. + +{=================================== MISSION TABLE MIAMI_1 ===================================} + +[T4X4_1A:MIAMI_1] +~g~Tienes ~1~ segundos para pasar por ~y~24~g~ puntos de control. ~g~Puedes atravesarlos en ~y~CUALQUIER ORDEN. + +[T4X4_1B:MIAMI_1] +~y~ATRAVIESA~g~ el primer punto de control para poner en marcha el ~r~CRONÓMETRO. + +[T4X4_1C:MIAMI_1] +¡~1~ de 24! + +[GETBIK1:MIAMI_1] +¡Tienes ~1~ segundos para subirte en una PCJ 600! + +[GETBIK3:MIAMI_1] +~r~Necesitas una PCJ 600 para realizar esta misión! + +{=================================== MISSION TABLE MM ===================================} + +[BLOD_04:MM] +ESTADO DEL COCHE: + +[BLOD_05:MM] +~g~TIEMPO OBJETIVO: ~1~ Minuto + +[BLOD_06:MM] +~g~TIEMPO OBJETIVO: ~1~ Minutos + +[BLOD_07:MM] +NUEVO Mejor Tiempo: ~1~ Segundos + +[BLOD_08:MM] +Coches destrozados: ~1~ + +[BLOD_09:MM] +~1~ $ + +[BLOD_10:MM] +¡GANADOR! + +[BLOD_01:MM] +Pasa por todos los puntos de control para aumentar tu tiempo total. + +[BLOD_02:MM] +Fracasarás si tu tiempo total llega a cero. + +[BLOD_03:MM] +¡Consigue que tu tiempo total sean superior al objetivo a superar! + +{=================================== MISSION TABLE OVALRIG ===================================} + +[HOTR_01:OVALRIG] +~g~La carrera dura 12 vueltas. Solamente los puestos 1, 2 y 3 obtienen premios en metálico. + +[HOTR_02:OVALRIG] +~g~Si destrozas tu coche serás descalificado. + +[HOTR_03:OVALRIG] +~g~Cuando tu coche sufra daños podrás repararlo en boxes. + +[HOTR_04:OVALRIG] +~g~Este es el camino para salir del estadio. + +[HOTR_05:OVALRIG] +Estado del coche: + +[HOTR_06:OVALRIG] +Vueltas: + +[HOTR_07:OVALRIG] +Nuevo mejor tiempo: ~1~:0~1~ + +[HOTR_08:OVALRIG] +Tiempo: ~1~:~1~ + +[HOTR_10:OVALRIG] +Tiempo de carrera: + +[HOTR_09:OVALRIG] +Posición: + +[HOTR_12:OVALRIG] +~r~¡Tu coche está destrozado! + +[HOTR_13:OVALRIG] +~r~¡No ganaste la carrera! + +[HOTR_14:OVALRIG] +~r~¡Has sido descalificado! + +[HOTR_15:OVALRIG] +Tiempo: ~1~:~1~ + +[HOTR_16:OVALRIG] +Tiempo: ~1~:0~1~ + +[HOTR_17:OVALRIG] +Mejor Tiempo: ~1~:~1~ + +[HOTR_18:OVALRIG] +Mejor Tiempo: ~1~:0~1~ + +[HOTR_19:OVALRIG] +Mejor Tiempo: NA + +[HOTR_20:OVALRIG] +Nuevo Mejor Tiempo: ~1~:~1~ + +[HOTR_21:OVALRIG] +Nuevo Mejor Tiempo: ~1~:0~1~ + +[HOTR_22:OVALRIG] +Mejor Resultado: NA + +[HOTR_23:OVALRIG] +Mejor resultado: 1 + +[HOTR_24:OVALRIG] +Mejor resultado: 2 + +[HOTR_25:OVALRIG] +Mejor resultado: 3 + +[HOTR_26:OVALRIG] +Mejor resultado: ~1~ + +[HOTR_27:OVALRIG] +Mejor Tiempo de Vuelta: ~1~.~1~ segundos + +[HOTR_28:OVALRIG] +Mejor Tiempo de Vuelta: ~1~.0~1~ segundos + +[HOTR_29:OVALRIG] +~1~ $ + +[HOTR_30:OVALRIG] +PUESTO: 1 + +[HOTR_31:OVALRIG] +PUESTO: 2 + +[HOTR_32:OVALRIG] +PUESTO: 3 + +[HOTR_33:OVALRIG] +Mejor tiempo de vuelta: ninguno + +[HOTR_11:OVALRIG] +Nuevo mejor tiempo de vuelta: ~1~,~1~ segundos + +[HOTR_34:OVALRIG] +Nuevo mejor tiempo de vuelta: ~1~,0~1~ segundos + +{=================================== MISSION TABLE PHIL1 ===================================} + +[PHIL1_A:PHIL1] +¿Phil? + +[PHIL1_B:PHIL1] +¡CORRE! + +[PHIL1_C:PHIL1] +¡Corre! + +[PHIL1_E:PHIL1] +Mierda Phil, ¿te bebes ese mejunje? + +[PHIL1_F:PHIL1] +Diablos, no tienes que bebértelo... + +[PHIL1_G:PHIL1] +solo tienes que olerlo para colocarte. + +[PHIL1_H:PHIL1] +Escucha, Phil, dijiste que podrías proporcionarme algo de potencia de fuego... + +[PHIL1_I:PHIL1] +Por supuesto. + +[PHIL1_J:PHIL1] +Hay un traficante de armas mejicano que me ha estado pisando el negocio últimamente. + +[PHIL1_K:PHIL1] +Suele realizar su ronda semanal a esta hora. + +[PHIL1_L:PHIL1] +Haz caer la mercancía de la parte de atrás de sus camiones antes de que acabe fuera de nuestro alcance. + +[PHIL1_M:PHIL1] +Y mientras estás en ello me estarás haciendo un favor. + +[PHIL1_N:PHIL1] +Luego acaba con él. + +[PHI1_01:PHIL1] +~g~Ve y pilla las armas de la parte trasera de los camiones del traficante. + +[PHI1_02:PHIL1] +~g~El traficante de armas ha perdido la carga. Destroza la caja y recoge el arma. + +[PHI1_03:PHIL1] +~g~Parece que han llamado pidiendo refuerzos. + +[PHI1_04:PHIL1] +~g~Ahora ve y acaba con el resto de los traficantes. + +[PHI1_HP:PHIL1] +Cuando utilices Detonador de Granadas, lanza una granada y después provoca la explosión en cualquier momento. + +[PHIL1_O:PHIL1] +¡Jooooodeeeeer! + +[PHIL1_D:PHIL1] +¡Nunca acerques una llama a uno de los alambiques de boomshine de Phil Cassidy! + +{=================================== MISSION TABLE PHIL2 ===================================} + +[PHIL2_A:PHIL2] +Hola, Phil, ¿cómo te va? + +[PHIL2_B:PHIL2] +Ehhh, Tommy. ¿Cómo estás? Hace tanto tiempo... + +[PHIL2_C:PHIL2] +Te juro que deberías dejar ese mejunje, tío. + +[PHIL2_D:PHIL2] +Huele como decapante de pintura. Hace que me ardan los ojos... + +[PHIL2_E:PHIL2] +Shhh, shhh, tú mismo, Tommy, + +[PHIL2_F:PHIL2] +y ven aquí porque hay algo que quiero enseñarte... algo. + +[PHIL2_G:PHIL2] +¡Dios! ¿Debería poder oler eso desde aquí? Me estoy mareando. + +[PHIL2_H:PHIL2] +No te preocupes por el olor, Tommy, mira esto. + +[PHIL2_I:PHIL2] +Las malditas pilas baratas o algo así. Hay más en el banco. + +[PHIL2_J:PHIL2] +¡TA-DAAA! + +[PHIL2_K:PHIL2] +¡Maldición! + +[PHI2_01:PHIL2] +~g~Rápido, lleva a Phil al hospital. + +[PHI2_03:PHIL2] +~r~¡Phil Cassidy está muerto! ¿Ahora quién va a suministrar armas en Vice City? + +[PHI2_05:PHIL2] +¡Al hospital no, tío! ¡Demasiados polis y vietcongs! + +[PHI2_06:PHIL2] +Hay un excirujano del ejército que me debe unos cuantos favores... y un cortador de césped. + +[PHI2_07:PHIL2] +Tiene un lugar llamado Little Havana, oh mira, un pez gigante. + +[PHI2_08:PHIL2] +¡Cuidado! ¡Charlies en la línea de los árboles! + +[PHI2_09:PHIL2] +¿Soy yo o las carreteras están hechas de gelatina? + +[PHI2_10:PHIL2] +Cuchara rota a madre gallina, ¿me recibes? + +[PHI2_11:PHIL2] +¡Cucharita, rita, rit, rit! + +[PHI2_12:PHIL2] +¡Viene a por mí, chico! + +[PHI2_13:PHIL2] +Hay alas de plumas negras aleteando por todas partes... + +[PHI2_14:PHIL2] +Es hermoso, tío... es hermoso... pero hace tanto frío... + +[PHI2_15:PHIL2] +10-4 tenemos un conductor borracho. + +[PHI2_04:PHIL2] +SALUD DE PHIL: + +[PHI_AS1:PHIL2] +LOCAL DE PHIL CONSOLIDADO + +[PHI_AS2:PHIL2] +~g~Nuevas armas disponibles para comprar en el Local de Phil. + +{=================================== MISSION TABLE PIZZA ===================================} + +[PIZ1_01:PIZZA] +~g~Ve a entregar estas pizzas, debes lanzar la pizza a los clientes. Pasa cerca para lanzar las pizzas. + +[PIZ1_02:PIZZA] +~g~Has lanzado todas tus pizzas, vuelve y recoge algunas más. + +[PIZ1_05:PIZZA] +~g~Tienes cinco minutos para entregar los pedidos antes de que los clientes telefoneen a otra pizzería. + +[PIZ1_07:PIZZA] +~r~¡Mataste al cliente! Estás despedido. + +[PIZ1_08:PIZZA] +~r~Te has quedado sin tiempo. Estás despedido. + +[PIZ1_09:PIZZA] +~r~¡Destruiste nuestra moto! Estás despedido. + +[PIZ1_11:PIZZA] +¡Eh! ¡Vuelve a subir a la moto! + +[PIZ1_12:PIZZA] +Pizzas restantes: + +[PIZ1_06:PIZZA] +Pulsa ~h~~k~~TOGGLE_SUBMISSIONS~~w~ cuando estés en la moto para cancelar la misión. + +[PIZ1_13:PIZZA] +Reparte éstas bien calentitas. + +[PIZ1_14:PIZZA] +Amigo, te toca repartir éstas. + +[PIZ1_15:PIZZA] +A ver, tío, repártelas rápido. + +[PIZ1_16:PIZZA] +¿Qué estás esperando, tío? Tienes pizzas que repartir. + +[PIZ1_17:PIZZA] +Ya sé que no querías ser el chico de las pizzas, vale me importa un cuerno. + +[PIZ1_18:PIZZA] +Reparte éstas. + +[PIZ1_19:PIZZA] +Hay que repartir éstas. + +[PIZ1_20:PIZZA] +Venga hombre, reparte estas cosas o estás despedido. + +[PIZ1_21:PIZZA] +Tenemos gente esperando amigo. + +[PIZ1_22:PIZZA] +¿Qué estás esperando? ¡Hay que repartir esto! + +[PIZ1_23:PIZZA] +Haz el reparto de la maldita comida hombre. + +[PIZ1_24:PIZZA] +Hay que repartir éstas, amigo. + +[PIZ1_25:PIZZA] +Tío, ¿te puedes llevar éstas? + +[PIZ1_26:PIZZA] +Oye, haz el reparto pronto, vamos amigo. + +[PIZ1_27:PIZZA] +Venga, tenemos prisa, haz ya el reparto. + +[PIZ1_28:PIZZA] +¿Otra vez tú? Bueno, reparte éstas deprisa, amigo. + +[PIZ1_29:PIZZA] +No pierdas el tiempo amigo. + +[PIZ1_30:PIZZA] +Venga ya vago hijo de puta, reparte esta mierda de una vez. + +[PIZ1_31:PIZZA] +No tendrás nunca un ascenso a menos que te muevas más rápido esta vez. + +[PIZ1_32:PIZZA] +~r~¿La pizza es demasiado caliente para encargarte de ella? + +[PIZ1_33:PIZZA] +~g~Vuelve al restaurante a por más pedidos. + +[PIZ1_34:PIZZA] +~g~Pizza repartida, aquí está tu dinero. + +[PIZ_WON:PIZZA] +Misión de Pizza Completada. Tu salud Personal máxima ha aumentado a 150. + +{=================================== MISSION TABLE PORN1 ===================================} + +[POR1_A:PORN1] +Acción. + +[POR1_B:PORN1] +¡Guau! Eso sí que es grande. + +[POR1_C:PORN1] +30 cm, eso es para pensárselo, nene. + +[POR1_D:PORN1] +¡CORTEN! ¿Quién es este idiota? ¡Tú! ¡Tú! ¿Por qué estás en el set? ¿POR QUÉ? + +[POR1_E:PORN1] +¿De qué va toda esta basura? + +[POR1_F:PORN1] +¿Alienígenas? ¿Cañas de pescar? + +[POR1_G:PORN1] +¿Quién ha visto alguna vez a un tiburón tan grande? + +[POR1_H:PORN1] +Hay que desechar todo este material. + +[POR1_I:PORN1] +¿Por qué te metiste en este negocio, mamón? + +[POR1_J:PORN1] +¿Eh? + +[POR1_K:PORN1] +¡Por los chochos, evidentemente! ¿Qué es esto? + +[POR1_L:PORN1] +Éste es mi arte. ¡SEGURIDAD! + +[POR1_M:PORN1] +Mira, pomposo gilipollas, ahora eres de mi propiedad. Yo poseo todo esto. + +[POR1_N:PORN1] +Vamos a cambiar este lugar... + +[POR1_O:PORN1] +Voy a hacerte rico. + +[POR1_P:PORN1] +Usted es... Usted... ¿Usted es Tommy Vercetti? Pero yo creí que usted era... + +[POR1_Q:PORN1] +Eso es. + +[POR1_R:PORN1] +Vamos a hacer algunos cambios por aquí y vamos a empezar a hacer dinero de verdad. + +[POR1_S:PORN1] +En realidad, alguna vez has pensado en... + +[POR1_T:PORN1] +Pero primero, vamos a necesitar unas chicas guapas de verdad... + +[POR1_U:PORN1] +Sí, las chicas están bien, pero tú... ¡guau! + +[POR1_02:PORN1] +~g~ Ve y elimina al chulo de Candy, luego vuelve y recoge a Candy. + +[POR1_04:PORN1] +Candy. Estoy buscando una estrella de cine. ¿Estás interesada? + +[POR1_05:PORN1] +¡Claro! Pero tendrás que hablar con mi agente... + +[POR1_06:PORN1] +¿Qué DEMONIOS estás haciendo? + +[POR1_07:PORN1] +¡Hoy deberías haberte quedado en casa! + +[POR1_7B:PORN1] +¿Puedes creer a este gilipollas? + +[POR1_08:PORN1] +¡Eh, Mercedes! + +[POR1_09:PORN1] +¡Eh, Tommy! ¿Quieres ir de fiesta? + +[POR1_10:PORN1] +Ahora no, preciosa. ¿Te interesa hacer algunas películas? + +[POR1_11:PORN1] +Por supuesto. Mientras que sea una peli barata y cutre. + +[POR1_13:PORN1] +~g~Lleva a las chicas de vuelta al Estudio para que conozcan a Steve. + +[POR1_14:PORN1] +¡Contratada! + +[POR1_15:PORN1] +Eh Tommy, ¿¡qué, vienes a entrar en calor!? + +[POR1_17:PORN1] +¡Guau, un tiburón genial! + +[POR1_18:PORN1] +~r~¡Mercedes está muerta! + +[POR1_20:PORN1] +Tommy, ¿a dónde vas? ¡Vuelve aquí! + +[POR1_21:PORN1] +¿A dónde vas? + +[POR1_22:PORN1] +Tommy, ¿cuando vamos a pasar algún tiempo a solas? + +[POR1_01:PORN1] +~g~¡Candy Suxxx sería perfecta para el papel principal! + +[POR1_12:PORN1] +~g~Ve con Candy a encontrarte con Mercedes. + +[POR1_16:PORN1] +Quizás después, nena... + +[POR1_24:PORN1] +~g~Vuelve y recoge a Candy. + +[POR1_25:PORN1] +~g~Te has dejado atrás a Candy, ve y tráela. + +[POR1_23:PORN1] +~g~Candy estará ocupándose de unos asuntos en el ~h~centro de la ciudad~g~. + +[POR1_26:PORN1] +~g~Aquí está Candy, parece que ha estado otra vez con el congresista Shrub. + +[POR1_27:PORN1] +Venga, vamos. + +[POR1_28:PORN1] +¡Tommy ten cuidado! ¡Aún no he asegurado mis implantes! + +[POR1_29:PORN1] +¿Y a esto le llamas conducir? + +[POR1_30:PORN1] +¡No podré hacer ningún numerito porno después de esto! + +[POR1_31:PORN1] +¿Qué? ¿Me estás intentando matar? ¡Creía que era la estrella era yo! + +{=================================== MISSION TABLE PORN2 ===================================} + +[POR2_A:PORN2] +¿Cómo va el rodaje, Steve? + +[POR2_B:PORN2] +Bien, Candy es una fuera de serie y esa chica nueva ¡es insaciable! + +[POR2_C:PORN2] +Se repasó a la mitad del reparto antes de que pudiese medir la luz. + +[POR2_D:PORN2] +De todas formas, eh, mañana vamos a exteriores a rodar las escenas del barco... + +[POR2_E:PORN2] +¿Escenas del barco, qué escenas del barco? + +[POR2_F:PORN2] +Los pescadores son presa de la pasión cuando aparece el tiburón gigante... + +[POR2_G:PORN2] +¿Qué te dije del tiburón gigante? + +[POR2_H:PORN2] +Dije, ''SIN TIBURÓN GIGANTE'', ¿de acuerdo? + +[POR2_I:PORN2] +¡Tú solo tienes que mantener las cámaras apuntando a los conejos! + +[POR2_J:PORN2] +De acuerdo, de acuerdo, eh Tommy, uno tiene que intentarlo, ¿de acuerdo? + +[POR2_K:PORN2] +¿Has hecho que impriman esos folletos? + +[POR2_L:PORN2] +Sí, pero nadie va a distribuir esas cosas, quiero decir que... + +[POR2_M:PORN2] +son demasiado... poco imaginativos. + +[POR2_N:PORN2] +No te preocupes por eso. + +[POR2_O:PORN2] +Tengo mis propias ideas para la distribución. + +[POR2_P:PORN2] +Vale. Candy, ven a mi caravana. + +[POR2_01:PORN2] +~g~Hay un hidroavión que se utilizó como atrezzo en una antigua película independiente a la vuelta de los estudios. + +[POR2_02:PORN2] +~g~Escoge uno de los puntos de control para empezar a dejar caer los folletos. + +[POR2_03:PORN2] +~g~Deja caer los folletos por todo el camino hasta el último punto de control. + +[POR2_04:PORN2] +~r~¡COMBUSTIBLE BAJO! + +[POR2_05:PORN2] +Utilízalo para distribuir los folletos por toda la ciudad. + +[DILDO:PORN2] +Combustible del Skimmer: + +[POR2_Q:PORN2] +¡Jo!, tío. + +[PORN2_9:PORN2] +~g~Tienes ~1~ segundos para volver a subir a una Skimmer antes de que termine la misión. + +{=================================== MISSION TABLE PORN3 ===================================} + +[POR3_A:PORN3] +Vale, ¿cuál es el problema ahora? + +[POR3_B:PORN3] +¡SSShhhh! + +[POR3_C:PORN3] +Bien, después de este encuentro cercano con las invasoras ninfómanas + +[POR3_D:PORN3] +nuestro héroe se encuentra incapaz de pensar en nada excepto en esta enorme montaña fálica... + +[POR3_E:PORN3] +y es entonces cuando queremos hacer la escena con la tina de puré de patatas, pero entonces... + +[POR3_F:PORN3] +¡Me importa una mierda! + +[POR3_G:PORN3] +¡Sigue, sigue! + +[POR3_H:PORN3] +Eh Tommy... + +[POR3_I:PORN3] +¿Mencionaste algo sobre un problema legal al teléfono? + +[POR3_J:PORN3] +¡Vaya que sí! El congresista Alex Shrub se ha subido al tren preelectoral y va tras el voto puritano. + +[POR3_K:PORN3] +Hay rumores de que va a apoyar medidas restrictivas, digamos, + +[POR3_L:PORN3] +para el aspecto más lujurioso de la gran industria del entretenimiento de esta nación. + +[POR3_M:PORN3] +Genial. + +[POR3_N:PORN3] +¡Candy! Tú conoces a Shrub, + +[POR3_O:PORN3] +¿llegasteis a algo pervertido? + +[POR3_P:PORN3] +¡Oh sí, oh sí, oh sí! ¡Sí sí sí SÍ! ¡OOOoooh! + +[POR3_Q:PORN3] +Por favor dime que filmaste eso. + +[POR3_R:PORN3] +¿Eso era parte del eh... o estaba hablando conmigo...? + +[POR3_S:PORN3] +Eh, uno nunca podría decirlo... De todas formas... + +[POR3_T:PORN3] +Probablemente sea mejor que la sigas después del rodaje, + +[POR3_U:PORN3] +para ver si te lleva a su nuevo nido de amor. + +[POR3_V:PORN3] +¿Tienes una cámara? + +[POR3_X:PORN3] +Vale, conseguidle una cámara. + +[POR3_02:PORN3] +~r~¡Has asesinado al Congresista! Ahora no habrá modo de que puedas chantajearle. + +[POR3_03:PORN3] +~r~Has alertado a la protección del Congresista, le sacarán de aquí inmediatamente. + +[POR3_04:PORN3] +Candy, ¿podrías llamarme Marta? + +[POR3_05:PORN3] +Oh Alex, quiero decir Marta. Lo que tú digas. + +[POR3_06:PORN3] +Marta, alguien está mirando... qué pervertido. + +[POR3_07:PORN3] +Tú, el de ahí. Dame esa cámara. + +[POR3_01:PORN3] +~g~Sigue la ~h~limusina~g~ de Candy. + +[POR3_15:PORN3] +~r~¡Has destruido la limusina de Candy! + +[POR3_17:PORN3] +~g~Regresa a la compañía de pornografía con las fotos. + +[POR3_19:PORN3] +~r~¡Te has quedado sin película! + +[POR3_21:PORN3] +~g~¡Has perdido la limusina de Candy! + +[POR3_22:PORN3] +~g~El Hotel WK Chariot frente a este balcón debería proporcionar el lugar ideal para la sesión fotográfica. + +[POR3_23:PORN3] +~g~Hay una puerta lateral que te permitirá acceder al hotel. + +[POR3_08:PORN3] +Mantén pulsado ~h~~k~~PED_LOCK_TARGET~ ~w~para~h~ enfocar~w~ con la cámara. + +[POR3_09:PORN3] +Mantén pulsado ~h~~k~~PED_LOCK_TARGET~ ~w~para~h~ enfocar~w~ con la cámara. + +[POR3_10:PORN3] +Pulsa ~h~~k~~PED_SNIPER_ZOOM_IN~ ~w~para ~h~acercar el zoom ~w~con la cámara y ~h~~k~~PED_SNIPER_ZOOM_OUT~ ~w~para ~h~alejarlo ~w~de nuevo. + +[POR3_11:PORN3] +Pulsa ~h~~k~~PED_SNIPER_ZOOM_IN~ ~w~para ~h~acercar el zoom ~w~con la cámara y ~h~~k~~PED_SNIPER_ZOOM_OUT~ ~w~para ~h~alejarlo ~w~de nuevo. + +[POR3_12:PORN3] +Pulsa ~h~~k~~PED_FIREWEAPON~ ~w~para sacar una foto. + +[POR3_13:PORN3] +Pulsa ~h~~k~~PED_FIREWEAPON~ ~w~para sacar una foto. + +[POR3_14:PORN3] +Pulsa ~h~~k~~PED_FIREWEAPON~ ~w~para sacar una foto. + +[POR3_20:PORN3] +~g~Si necesitas transporte, utiliza el ~h~Sparrow~g~ que está en la parte de atrás. + +[POR3_16:PORN3] +~g~Necesitas tres buenas fotos de Alex Shrub con Candy para chantajearle. + +[POR3_24:PORN3] +FOTOS HECHAS: + +{=================================== MISSION TABLE PORN4 ===================================} + +[POR4_A:PORN4] +Lo siento, pero no puedo tragarme eso ahora. + +[POR4_B:PORN4] +¡Oh, VENGA, cariño! + +[POR4_C:PORN4] +La tiene como un cachalote, por el amor de Dios, + +[POR4_D:PORN4] +¿cómo es que no puedes sentir el papel? + +[POR4_E:PORN4] +Pero Stevie... + +[POR4_F:PORN4] +¿Cómo está mi director estrella? + +[POR4_G:PORN4] +Oh, tío. La lucha entre la integridad artística y + +[POR4_H:PORN4] +la acción cargante y bombeante continúa sin perder intensidad. + +[POR4_I:PORN4] +Y antes de que puedas preguntarlo, sí, los cuatro vídeos serán lanzados en sus... + +[POR4_J:PORN4] +Cariño, podrías POR FAVOR mantener la anaconda dentro del plano, + +[POR4_K:PORN4] +¡cuesta por hora más de lo que cuestas tú! + +[POR4_L:PORN4] +Oh, lo siento, Steve. + +[POR4_M:PORN4] +Estaba pensando, necesitamos algún tipo de gran truco publicitario para promover de verdad el lanzamiento. + +[POR4_N:PORN4] +Algo que tenga un verdadero impacto en la ciudad, ¿tienes alguna idea? + +[POR4_O:PORN4] +Bueno, en los viejos tiempos solían organizar fiestas, + +[POR4_P:PORN4] +estrellas, limusinas, el cielo nocturno con los focos entrecruzados... + +[POR4_Q:PORN4] +¿Focos? Tengo una idea... + +[POR4_R:PORN4] +...sí, sí, sí. Los numeritos de lentejuelas, y las limusinas, oh, premieres. + +[POR4_S:PORN4] +Oh, sí, madam, por supuesto madam, + +[POR4_T:PORN4] +y la prensa, y el bombardeo de luces... + +[POR4_01:PORN4] +~g~Ve al ~y~centro~g~ y ajusta los focos sobre lo alto del edificio. + +[POR4_02:PORN4] +~g~Necesitarás una moto rápida para saltar de un tejado a otro. El guardia de seguridad normalmente lleva una ~y~PCJ 600~g~ para ir a trabajar... + +[POR4_03:PORN4] +~g~Necesitarás subir a los tejados de los edificios. Debería de haber un ascensor que lleve a una de las oficinas superiores... + +[POR4_06:PORN4] +~g~Vuelve a la oficina inferior si de nuevo necesitas acceso a los tejados. + +[POR4_07:PORN4] +~g~Necesitarás una moto para poder saltar de un edificio a otro. + +[POR4_08:PORN4] +~g~Atraviesa la ventana para empezar el recorrido. Tienes hasta las 07:00 antes de que haya demasiada luz como para subir allí sin ser visto. + +[POR4_09:PORN4] +~g~Los marcadores rosas te mostrarán a qué edificio saltar después. + +[POR4_10:PORN4] +~r~Hay demasiada luz como para subir ahí sin ser visto. + +[POR4_11:PORN4] +~g~Vuelve a la escalera si necesitas acceder de nuevo a los tejados. + +[POR4_05:PORN4] +~g~Estas escaleras llevan a una oficina en el piso inferior. + +[POR_AS1:PORN4] +ESTUDIO CINEMATOGRÁFICO CONSOLIDADO + +[POR_AS2:PORN4] +~g~Inter Global Films generará ahora unos ingresos máximos de hasta ~1~ $. Asegúrate que lo recaudas de forma regular. + +{=================================== MISSION TABLE PROT1 ===================================} + +[PRO1_B:PROT1] +No puedo soportar este look. Tommy, ¿Tú que dices? ¿Qué te parece si ponemos un bar en... + +[PRO1_D:PROT1] +Escúchame, + +[PRO1_E:PROT1] +Es hora de tomar esta ciudad. Está ahí, esperándonos. + +[PRO1_F:PROT1] +Necesitamos empezar a ampliar nuestro territorio, + +[PRO1_G:PROT1] +vamos a dejar que Vice City sepa que somos los nuevos tíos importantes de la ciudad, ¿sabes a lo que me refiero? + +[PRO1_I:PROT1] +Lo que necesitas es un frente legítimo, Tommy, una verdadera propiedad. A mí nunca me ha hecho daño. + +[PRO1_J:PROT1] +Necesitamos empezar a utilizar la fuerza o podemos despedirnos de todo el trabajo duro que hemos hecho. + +[PRO1_K:PROT1] +¡Los negociantes locales saben que Díaz está muerto, y se niegan a pagar la protección! + +[PRO1_L:PROT1] +Oh. Podríamos intentar el soborno... + +[PRO1_M:PROT1] +¿Soborno? ¡Que le jodan al soborno! Te mostraré cómo hacer que se asusten. + +[PRO1_01:PROT1] +~g~Ve a atracar los escaparates de las tiendas y tendrás a los propietarios suplicando protección. + +[PRO1_03:PROT1] +~r~Se suponía que deberías atacar y salir corriendo, no atacar y tomarte un café. + +[PRO1_04:PROT1] +¡Mi sustento, destruido! + +[PRO1_05:PROT1] +¡Arruinado... ESTOY ARRUINADO! + +[PRO1_06:PROT1] +¡Pagaré lo que sea por protección! + +[PRO1_07:PROT1] +¡Mi hermoso escaparate destruido! + +[PRO1_08:PROT1] +Mi tienda. Mi maravillosa tienda. + +[PRO1_09:PROT1] +Vercetti. Recuerda el nombre. + +[PRO1_10:PROT1] +Ahora dirijo esta ciudad. ¡YO! + +[BUYP1:PROT1] +Ahora puedes comprar propiedades en ciertas zonas de la ciudad. + +[BUYP2:PROT1] +Si ves un indicador con una casa verde, puedes comprar esa propiedad. + +[PRO1_N:PROT1] +Volveré aquí en cinco minutos... + +[PRO1_11:PROT1] +~g~Ve al ~y~Centro Comercial North Point~g~ en ~y~Vice Point~g~. + +[PRO1_12:PROT1] +~g~Destroza los escaparates de todas las tiendas y los propietarios te suplicarán para obtener nueva protección. + +[PRO1_A:PROT1] +Oh, tenemos que volver a pintar este sitio. Tenemos que hacer que parezca más viejo. + +[PRO1_C:PROT1] +Rosenberg, eres mi abogado, no mi diseñador de interiores, ¿lo entiendes? + +[BUYP3:PROT1] +Sitúate en el marcador, a continuación pulsa ~h~~k~~PED_ANSWER_PHONE~~w~ para comprar la propiedad. + +[PRO1_13:PROT1] +~g~Dispones de cinco minutos para machacarlos a todos. + +{=================================== MISSION TABLE PROT2 ===================================} + +[PRO2_A:PROT2] +¿Cuál es el problema? + +[PRO2_B:PROT2] +Un bar se niega a pagar. + +[PRO2_C:PROT2] +Creen que están protegidos por una banda de matones locales. + +[PRO2_D:PROT2] +Pero no te preocupes, Tommy, yo me encargo. + +[PRO2_E:PROT2] +¿Llamas a esto encargarte? + +[PRO2_F:PROT2] +Vosotros dos, en pie... + +[PRO2_G:PROT2] +Vamos. + +[PRO2_01:PROT2] +~g~Elimina a los guardias que vigilan el Bar Front Page y descubre quién los ha puesto ahí. + +[PRO2_10:PROT2] +~g~Dos más han huido. Sígueles la pista y acaba con ellos. + +[PRO2_11:PROT2] +Sube al coche, inútil. + +[PRO2_02:PROT2] +Tu seguridad necesita un poco más de seguridad. + +[PRO2_03:PROT2] +¡Ahh! demonios, ¡otra vez no! ¡no necesito esta basura! + +[PRO2_04:PROT2] +Estos idiotas pertenecen al DBP de Seguridad que hay a la vuelta de la esquina. + +[PRO2_05:PROT2] +¡Eh tíos! Arregladlo entre vosotros. + +[PRO2_06:PROT2] +Nos vemos en un rato. + +[PRO2_07:PROT2] +Sí, vale, lo que tú digas. + +[PRO2_08:PROT2] +~g~El DBP de Seguridad sabrá que estás de camino, ve y atrápalos antes que escapen. + +[PRO2_09:PROT2] +~g~Ve y habla con el dueño del bar Front Page. + +{=================================== MISSION TABLE PROT3 ===================================} + +[PRO3_A:PROT3] +¡Idiota! ¿En qué estabas pensando? + +[PRO3_B:PROT3] +¿Te das cuenta de lo que significa ésto? + +[PRO3_C:PROT3] +¡Podríamos estar todos hundidos! + +[PRO3_D:PROT3] +El temporizador debe haberse jodido. + +[PRO3_E:PROT3] +Ese lugar estaba preparado para estallar como una fábrica de fuegos artificiales. + +[PRO3_F:PROT3] +Entonces alguien avisó a la poli... + +[PRO3_G:PROT3] +¿Cuál es el problema, colegas? + +[PRO3_H:PROT3] +Se suponía que Mike iba a quemar algún sitio en el centro comercial, + +[PRO3_I:PROT3] +pero la cagó con los fusibles y ahora eso está plagado de polis. + +[PRO3_J:PROT3] +¡Tenemos que conseguir nuestras cosas y salir de aquí! + +[PRO3_K:PROT3] +¡Relajaos los dos, dejadme pensar un segundo! + +[PRO3_L:PROT3] +Tommy Vercetti no corta por lo sano y huye. + +[PRO3_M:PROT3] +Los polis van a repasar ese edificio con un buen cepillo de dientes, ¿verdad? + +[PRO3_N:PROT3] +Pero eso lleva tiempo. + +[PRO3_O:PROT3] +Tenemos que ir y quemar nosotros mismos ese sitio. + +[PRO3_P:PROT3] +Sí, pero... + +[PRO3_Q:PROT3] +¡Nadie excepto un poli podría acercarse a una milla de ese lugar! + +[PRO3_R:PROT3] +Así que iremos como polis. + +[PRO3_S:PROT3] +Tenemos que conseguir uniformes, y vamos a necesitar un coche patrulla. + +[PRO3_T:PROT3] +Todo gracias a ti, Mike. + +[PRO3_U:PROT3] +Lo siento. + +[PRO3_V:PROT3] +Lo capto. + +[PRO3_W:PROT3] +Lo que tenemos que hacer es atraer a los polis enseñándoles el dedo, + +[PRO3_X:PROT3] +encerrarles + +[PRO3_Y:PROT3] +y asaltarles. + +[PRO3_Z:PROT3] +Buen plan. ¡Vamos! + +[PRO3_A1:PROT3] +De acuerdo. + +[PRO3_01:PROT3] +De acuerdo, Lance, ¡vamos a por los polis! + +[PRO3_02:PROT3] +~g~ Roba el coche de policía y coloca la bomba en el Café Tarbrush del centro comercial. + +[PRO3_03:PROT3] +~g~ Has dejado atrás a Lance, vuelve y recógele. + +[PRO3_04:PROT3] +~g~ Vamos. + +[PRO3_05:PROT3] +~r~¡Has matado a Lance! + +[PRO3_07:PROT3] +~g~ Te has descubierto. ¡Date prisa y coloca la bomba! + +[PRO3_08:PROT3] +~g~Vuelve a la ~h~finca de Vercetti~g~ en ~h~Starfish Island~g~. + +[PRO3_09:PROT3] +¡Átales y amordázales! + +[PRO3_10:PROT3] +¡Me queda como un guante! + +[PRO3_11:PROT3] +Un poco ajustado en la entrepierna... + +[PRO3_12:PROT3] +Oh, sí, sí, el mío también. El mío también. + +[PRO3_13:PROT3] +¡Relájate, hermano! ¡Ningún poli conduce tan mal! + +[PRO3_14:PROT3] +Recuerda, sonríe a los otros polis. + +[PRO3_15:PROT3] +Hola, agente. Bonita placa, bonita placa. + +[PRO3_16:PROT3] +Muy desenvuelto, Lance. + +[PRO3_17:PROT3] +De acuerdo, los temporizadores están colocados, 5 segundos. + +[PRO3_18:PROT3] +¿5 segundos? ¡Tenemos que salir de aquí pitando! + +[PRO3_19:PROT3] +Ahora que los hemos enfadado de verdad. + +[PRO3_20:PROT3] +~g~ Haz que dos polis te sigan hasta el garaje. + +[PRO3_21:PROT3] +~g~Consigue un nivel de se busca suficiente para que los polis te sigan hasta el garaje. + +[PRO3_22:PROT3] +~g~¡La puerta del garaje está bloqueada! El acceso tiene que estar despejado para que se pueda cerrar. + +[PRO3_23:PROT3] +~g~Camina hacia el marcador para colocar la bomba. + +[PRO3_24:PROT3] +~g~¡Aléjate del Café! + +[PRO_AS1:PROT3] +ANILLO DE PROTECCIÓN COMPLETADO + +[PRO_AS2:PROT3] +~g~La finca de Vercetti generará ahora unos ingresos máximos de hasta ~1~ $. Asegúrate de recaudarlo regularmente. + +{=================================== MISSION TABLE RACES ===================================} + +[RACES_2:RACES] +~g~¡Necesitas un vehículo para correr, esto no es una carrera a pie! + +[RACES_3:RACES] +3... 2... 1... ¡ADELANTE! ¡ADELANTE! ¡ADELANTE! + +[RACES_8:RACES] +~r~¡No has ganado la carrera! + +[RACES00:RACES] +Carrera ~1~: + +[RACES01:RACES] +Velocidad terminal + +[RACES02:RACES] +Ocean Drive + +[RACES03:RACES] +Carrera por el borde + +[RACES04:RACES] +Capital Cruise + +[RACES05:RACES] +¡Tour! + +[RACES06:RACES] +Aguante en V.C. + +[RACES07:RACES] +Precio de entrada: ~1~ $ + +[RACES08:RACES] +Mejor tiempo: ~1~:~1~ + +[RACES09:RACES] +Mejor resultado: 1 + +[RACES10:RACES] +Mejor resultado: 2 + +[RACES11:RACES] +Mejor resultado: 3 + +[RACES12:RACES] +Mejor resultado: 4 + +[RACES13:RACES] +Longitud de pista: ~1~.~1~ km + +[RACES15:RACES] +Mejor tiempo: NA + +[RACES16:RACES] +Mejor resultado: NA + +[RACES19:RACES] +No puedes permitirte entrar en esta carrera. + +[RACES22:RACES] +Mejor tiempo: ~1~:0~1~ + +[RACES23:RACES] +Longitud de la pista: ~1~.~1~ millas + +[RACES_1:RACES] +~g~Consigue un vehículo rápido y ve a la parrilla de salida. + +[RACEHLP:RACES] +~w~Pulsa ~h~~k~~PED_SPRINT~~w~ para empezar la carrera seleccionada. Pulsa ~h~~k~~VEHICLE_ENTER_EXIT~~w~ para salir. + +{=================================== MISSION TABLE RCHELI1 ===================================} + +[WRECKED:RCHELI1] +~r~¡El vehículo está destrozado! + +[RCH1_4:RCHELI1] +Puntos de control: + +[RCH1_7:RCHELI1] +~g~Hay 20 puntos de control en total. + +[RCH1_12:RCHELI1] +~g~¡El helicóptero RC está saliendo fuera de su alcance de control! + +[RCH1_13:RCHELI1] +~r~¡El helicóptero RC se ha salido de su radio de alcance! + +[RCH1_8:RCHELI1] { reVC update } +~g~Si deseas abandonar esta misión, pulsa ~h~~k~~VEHICLE_FIREWEAPON~~g~ para detonar tu helicóptero RC. + +{=================================== MISSION TABLE RCPLNE1 ===================================} + +[RCPL1_4:RCPLNE1] +~g~Compite en una CARRERA DE PUNTOS DE CONTROL contra otros tres aviones RC. + +[RCPL1_5:RCPLNE1] +~g~Vuela a través de los puntos de control dispersados por Vice City. + +[RCPL1_6:RCPLNE1] { reVC update } +~g~Si deseas abandonar esta misión, pulsa ~h~~k~~VEHICLE_FIREWEAPON~~g~ para detonar tu avión RC. + +[RCPL1_8:RCPLNE1] +~g~¡Tu avión RC está saliendo fuera del alcance! + +[RCPL1_9:RCPLNE1] +~r~¡Tu avión RC se salió del alcance! + +{=================================== MISSION TABLE RCRACE1 ===================================} + +[RCRC1_1:RCRACE1] +~g~Compite en una CARRERA DE PUNTOS DE CONTROL contra 3 Barón RC durante dos vueltas. + +[RCRC1_3:RCRACE1] +~g~¡Vuelta final! + +[RCR1_4:RCRACE1] +vueltas restantes: + +[RCR1_1:RCRACE1] +~g~Compite en una carrera de puntos de control contra otros tres coches RC. + +[RCR1_2:RCRACE1] +~g~¡Consigue ser el primero en completar las dos vueltas del circuito para ganar! + +[RCR1_6:RCRACE1] +~g~¡Tu coche RC se está saliendo fuera del alcance! + +[RCR1_7:RCRACE1] +~r~¡Tu coche RC se salió del alcance! + +{=================================== MISSION TABLE ROCK1 ===================================} + +[RBM1_A:ROCK1] +~n~ + +[RBM1_B:ROCK1] +¡Brillante, jodidamente brillante! + +[RBM1_D:ROCK1] +¿Eh, habías conocido antes a los Love Fist? + +[RBM1_E:ROCK1] +No, pero siempre me encantó vuestra música. + +[RBM1_F:ROCK1] +Déjame presentarte a la banda. + +[RBM1_G:ROCK1] +Estos son P, Percy, Dick, y Willy está en el kaze, y ese de antes de la cabina era Jezz, + +[RBM1_H:ROCK1] +y tíos, quiero que conozcáis a un buen amigo mío. + +[RBM1_I:ROCK1] +Este es Tommy. Nos conocemos desde hace mucho. + +[RBM1_J:ROCK1] +De acuerdo, colega. + +[RBM1_K:ROCK1] +Y, eh, ¿cuál era tu nombre? + +[RBM1_L:ROCK1] +Déjalo, Jezz, lo recuerdas, + +[RBM1_M:ROCK1] +no juegues a eso conmigo, colega, + +[RBM1_N:ROCK1] +¡soy demasiado astuto para eso, encanto! + +[RBM1_O:ROCK1] +Verás, Tom, la cosa es que los chicos necesitan algo de ayuda. + +[RBM1_P:ROCK1] +No tienen muchos contactos en la zona, gente a la que preguntarle ''¿vienes mucho por aquí?'' y todo eso. + +[RBM1_Q:ROCK1] +¡Necesitamos unos tiritos, colega! + +[RBM1_R:ROCK1] +¿Vamos a pillar la vieja furia Love Fist, sabes? + +[RBM1_S:ROCK1] +Bueno, esto es Vice City, tío. ¿Cuál es el problema? + +[RBM1_U:ROCK1] +¡Love juice, tío! + +[RBM1_V:ROCK1] +¿Love juice? + +[RBM1_W:ROCK1] +Sí, dos partes de boomshine, una parte de farlopa, cinco caramelos con picapica y un litro de gasolina. + +[RBM1_X:ROCK1] +¿Puedes ayudarnos, colega? + +[RBM1_Y:ROCK1] +De verdad significaría mucho para los chicos. + +[RBM1_Z:ROCK1] +Puedes hacer eso por los muchachos, ¿verdad? + +[RBM1_7:ROCK1] +~r~¡No conseguiste a tiempo el ''love juice''! + +[RBM1_8:ROCK1] +~r~¡Mercedes está muerta! + +[RBM1_10:ROCK1] +~r~¡Idiota! ¡Has destruido el material! + +[RBM1_13:ROCK1] +~g~Lleva el ''love juice'' y a Mercedes a la banda antes de que sean requeridos en el escenario. + +[RBM1_15:ROCK1] +~r~¡Has perdido al camello, nuestra pasta y la nieve! + +[RBM1_17:ROCK1] +~g~¡Mata al camello y consigue los ingredientes! + +[MOB_07A:ROCK1] +Eh colega, a los chicos les vendría bien algo de compañía, si entiendes lo que quiero decir... + +[MOB_07B:ROCK1] +Conozco a la chica apropiada. + +[ROK1_5:ROCK1] +¡Hola, Mercedes! + +[ROK1_6:ROCK1] +Hola, Tommy. ¿Cómo estás? + +[ROK1_7:ROCK1] +Bien. Escucha, ¿te apetece acostarte con los Love Fist? + +[ROK1_8:ROCK1] +De acuerdo, pero sólo como un favor que espero que me sea devuelto... + +[RBM1_14:ROCK1] +~g~¡Necesitas un coche o una moto! + +[RBM1_1:ROCK1] +~g~Ve y recoge a Mercedes en su apartamento. + +[RBM1_12:ROCK1] +~g~Ve y reúnete con el camello para conseguir los ingredientes del ''love juice''. + +[ROK1_2:ROCK1] +YA NO ES NECESARIO + +[ROK1_3:ROCK1] +YA NO ES NECESARIO + +[MERC_39:ROCK1] +Hasta luego grandullón. + +[RBM1_C:ROCK1] +¡Eh, Tommy! Me alegro que pudieras venir. + +[RBM1_9:ROCK1] +~g~¡Ve y reúnete con el camello de los Love Fist para conseguir algo de ''love juice''! + +[ROK1_1A:ROCK1] +¿Buscas algo especial? ¡Yo tengo lo que necesitas! + +[ROK1_9:ROCK1] +¡Gracias por el dinero, mamón! + +[RBM1_T:ROCK1] +Necesitamos ''love juice'', tío, ¿sabes? + +{=================================== MISSION TABLE ROCK2 ===================================} + +[RBM2_A:ROCK2] +Tommy, tío. ¡Me alegro de verte! + +[RBM2_B:ROCK2] +¿Qué sucede? + +[RBM2_C:ROCK2] +Malas vibraciones, Tommy... + +[RBM2_E:ROCK2] +Hay un tipo, apenas le conocemos, pero él nos conoce a nosotros. + +[RBM2_F:ROCK2] +Como este tipo, que lo sabe todo de nosotros. + +[RBM2_G:ROCK2] +Sabe que a Willy le gusta ponerse ropa interior de mujeres. + +[RBM2_H:ROCK2] +¡O que a Percy le gusta Duran Duran! + +[RBM2_K:ROCK2] +Sí, bien, tu cohete del amor. Pero escucha, este tipo... + +[RBM2_L:ROCK2] +El tipo, quiere ver a los Love Fist muertos. + +[RBM2_M:ROCK2] +Muertos, Tommy. + +[RBM2_N:ROCK2] +El final Love Fist. Ya sabes lo que dicen, los buenos mueren jóvenes. + +[RBM2_O:ROCK2] +¡Pero Tommy, tienes que salvar a los Love Fist! + +[RBM2_P:ROCK2] +Tenemos que firmar en dos horas y creo... + +[RBM2_Q:ROCK2] +Los chicos creen que el sospechoso va a intentar hacer algún recibimiento infame. + +[RBM2_1:ROCK2] +~g~Conduce la limusina a la firma de autógrafos e intenta encontrar al psicópata. + +[RBM2_2:ROCK2] +~r~¡Destrozaste el coche de la banda! + +[RBM2_3:ROCK2] +~g~¡Ve a la firma de autógrafos! + +[RBM2_4:ROCK2] +~g~¡Atrapa al psicópata! ¡No le dejes escapar! + +[RBM2_5:ROCK2] +~r~¡Lo perdiste, idiota! + +[RBM2_7:ROCK2] +~r~¡Los fans han sido atacados, el psicópata no aparecerá! + +[RBM2_8:ROCK2] +~r~¡Los guardas de seguridad han sido atacados, el psicópata no aparecerá! + +[PSYCH_1:ROCK2] +¡Me encantaría ver arder a los Love Fist! + +[PSYCH_2:ROCK2] +¡Los Love Fist arruinaron mi vida! + +[RBM2_I:ROCK2] +Cállate, idiota. Sólo porque Jezz se folla ovejas. + +[RBM2_R:ROCK2] +¡Eh, cierra la boca! + +[RBM2_D:ROCK2] +Sí, no estoy de broma, es un tema muy gordo tío, muy gordo, ¿sabes? + +[RBM2_J:ROCK2] +Es lo que atrae a mi cohete del amor, ¿entiendes? + +{=================================== MISSION TABLE ROCK3 ===================================} + +[RBM3_A:ROCK3] +¡Tommy! ¡Tommy! ¡Tommy, tío, ese psicópata ha vuelto! + +[RBM3_B:ROCK3] +¿Qué está pasando? + +[RBM3_C:ROCK3] +¡Ese psicópata no dejará en paz a los Love Fist! + +[RBM3_D:ROCK3] +No le mataste, tío. Y ahora ha vuelto. + +[RBM3_E:ROCK3] +Sí, sí, sí, y la cuestión es... + +[RBM3_F:ROCK3] +La cuestión es que necesitamos alguien en quien poder confiar para que conduzca la limo, + +[RBM3_G:ROCK3] +¡porque ese chiflado sigue con las amenazas! + +[RBM3_I:ROCK3] +Aquí estamos todos acojonados, tío. + +[RBM3_J:ROCK3] +De acuerdo tíos, calmaos, yo me encargaré de esto. + +[RBM3_K:ROCK3] +Normalmente, no me ocuparía de ir por ahí haciendo de chófer para una panda de bisexuales escoceses bebidos, + +[RBM3_L:ROCK3] +pero, en vuestro caso, haré una excepción. + +[RBM3_4:ROCK3] +~r~¡Has matado a los Love Fist! + +[RBM3_6:ROCK3] +DETONACIÓN: + +[RBM3_1:ROCK3] +~g~Conduce a los Love Fist al local del concierto. + +[RBM3_2:ROCK3] +Si intentas abandonar el coche mientras la bomba está armada explotará... + +[RBM3_3:ROCK3] +Si la barra de detonación se llena completamente la bomba explotará. + +[RBM3_8:ROCK3] +Cuanto más rápido conduzcas más despacio se moverá la barra de detonación. + +[RBM3_7:ROCK3] +~g~¡BOMBA DESACTIVADA! + +[ROK3_62:ROCK3] +y pensamos que podríamos enseñarte nuestro Templo del Rock. + +[ROK3_63:ROCK3] +¡Para que te vayas acostumbrando a la furia de Love Fist! + +[ROK3_64:ROCK3] +Escúchate a ti mismo, tío. Es papel maché y cinta aislante. + +[ROK3_65:ROCK3] +Eh, para los chavales, ¡esto es un templo y nosotros somos los sacerdotes! + +[ROK3_66:ROCK3] +Si, vale, si a los chavales les gustan los sacerdotes colgados y sin oído musical, + +[ROK3_67:ROCK3] +¿quién soy yo para discutirlo? + +[ROK3_68:ROCK3] +Vaya por Dios, se está comiendo la cinta otra vez. + +[ROK3_69:ROCK3] +Con este ritmo tendremos que tocar en directo. + +[ROK3_70:ROCK3] +Oohh ¡mierda! Mis tripas... + +[ROK3_73:ROCK3] +Jezz está escuchando la cinta, + +[RBM3_9:ROCK3] +Si te paran o reduces la velocidad la barra de detonación aumentará. + +[RBM3_H:ROCK3] +¡Me estoy cagando de miedo tío. Necesito a mi, mamá! + +[ROK3_71:ROCK3] +Tenemos que seguir con esto. Gracias de nuevo Tommy, ya sabes lo que quiero decir, apúntate una, ¡adiós! + +[ROK3_1:ROCK3] +Al fin tío, hora de un merecido trago. La sala de conciertos está solo a unos cientos de metros calle abajo. + +[ROK3_2:ROCK3] +Mejor ponme uno doble. Eh Tommy, cambia los temas, tío. + +[ROK3_3:ROCK3] +Me siento perdido si la cabeza no me estalla. Ah, mira, ¿Qué es esto? Eh Tommy, pon esta cinta. + +[ROK3_4:ROCK3] +Love Fist. Vuestro tiempo contaminando las ondas se ha terminado. Os di la oportunidad de ser amigos. + +[ROK3_5:ROCK3] +Ahora os doy la oportunidad de morir. ¡Intentad aminorar la marcha y vuestra limusina explotará junto con vuestros GRANDES Y PELUDOS CULOS! + +[ROK3_6:ROCK3] +Tommy amigo, ¡tienes que salvar a la banda! Yo me estoy cansando de esto. ¡Mantén pisado el acelerador! + +[ROK3_7:ROCK3] +¡Tenemos que encontrar la bomba! ¿Podremos conducir por ahí todo el día? Sí, tenemos suficiente bebida.. + +[ROK3_8:ROCK3] +¿La bomba no estará en el motor? Tendremos que parar y cogerla. ¡Vamos a morir todos! ¡Me voy a emborrachar! + +[ROK3_9:ROCK3] +Eh, ¡amigo, aquí hay cola! ¡La respuesta no está en el mueble bar! ¡Sal de mi camino! + +[ROK3_10:ROCK3] +Eh, ¡a la botella de vodka le salen unos cables! ¡Eso no es vodka!, ¡Eso es una BOMBA! + +[ROK3_11:ROCK3] +¡Y está preparada para explotar! + +[ROK3_12:ROCK3] +Siempre me dijeron que la bebida acabaría conmigo. He visto esto en la tele. Tienes que tirar de uno de los cables. ¿De qué cable? Pues no sé tío. + +[ROK3_13:ROCK3] +No tengo ni idea. Willy, di algo. Voy a tocar el bajo en el otro mundo. + +[ROK3_14:ROCK3] +Tommy tío, sigue conduciendo deprisa, amigo. Que alguien haga algo. Si, ¡qué listo! + +[ROK3_15:ROCK3] +''Que alguien haga algo'', qué mierda es esa, he visto a niñas con más valor. Tipo duro, haz tú algo. + +[ROK3_16:ROCK3] +Mira tío, yo toco un instrumento y no tengo ni idea de desactivar bombas. Willy podrías beberte el líquido de la bomba con una pajita. + +[ROK3_17:ROCK3] +Sí, he oído que eres bueno en ese tipo de cosas. ¡Eh, aquella noche estaba muy colgado, como bien sabes! + +[ROK3_18:ROCK3] +¡Anda pásale una pajita a Willy! ¿Una pajita? ¡Este es el autobús de la gira de los Love Fist! + +[ROK3_19:ROCK3] +¿De dónde voy a sacar yo una pajita? ¿me entiendes? ¿Qué cable Tommy? El verde. No hay ninguno verde. + +[ROK3_20:ROCK3] +¿O es que este es verde? ¿Te parece verde alguno de estos cables? + +[ROK3_21:ROCK3] +¡Oh no! ¡La muerte está en las cartas! ¡Todo parece verde! Tenía que haberos dejado tirados cuando tuve la oportunidad. + +[ROK3_22:ROCK3] +Buscador de gloria. Capitalista. He estado tirando de ti durante años. Cállate. Eres un espantajo. + +[ROK3_23:ROCK3] +Una nena grande y chillona. Sí. Cállate y tira del cable. ¿Qué cable? Este... + +[ROK3_24:ROCK3] +¡NO, tío! estamos bien. ¡No hemos saltado por los aires, amigo. + +[ROK3_25:ROCK3] +Tommy, tío, chachi. Rock and roll, tío. ¿No tenemos que actuar? + +[ROK3_26:ROCK3] +¿Meter bulla? ¿Abusar de las fans? ¡LOVE FIST! + +[ROK3_27:ROCK3] +¿Has terminado con esa botella? + +{=================================== MISSION TABLE SERG1 ===================================} + +[TEX1_A:SERG1] +Entra y disfruta de los asientos de cuero, hijo. + +[TEX1_B:SERG1] +Demonios, mi padre solía decir, a caballo regalado no le mires el diente, y por Dios que nunca lo hizo. + +[TEX1_C:SERG1] +¿Te gustaría un trago del viejo Kentucky? + +[TEX1_D:SERG1] +No gracias. + +[TEX1_E:SERG1] +Alguien con la mente despejada, me gusta eso. + +[TEX1_F:SERG1] +El negocio de la propiedad no se trata solo de papeleo pretencioso. + +[TEX1_G:SERG1] +¡Se trata de tierra! ¡Y el derecho a reclamarla! ¿Me sigues, hijo? + +[TEX1_H:SERG1] +Sí. + +[TEX1_J:SERG1] +Y yo creo que eres la clase de tío para persuadirle. + +[TEX1_K:SERG1] +La persuasión es mi fuerte. + +[TEX1_L:SERG1] +Sí, estará en el club de campo, en el campo de golf. + +[TEX1_M:SERG1] +Allí no permiten armas, así que sus guardaespaldas no llevarán protección. + +[TEX1_N:SERG1] +Ve y dale una paliza inolvidable. + +[TEX1_O:SERG1] +Bien, toma... te he conseguido un carné de socio, y chico, vas a necesitar un tipo de ropa más apropiada. + +[TEX1_2:SERG1] +~g~Ahora ve al Club de golf Leaf Links. + +[TEX1_0:SERG1] +~g~El objetivo está en el campo de prácticas disfrutando de una partida de golf. ¡Asegúrate de que sea la última! + +[TEX1_3:SERG1] +¿Quién es este tipo? Chicos, ocuparos de él. + +[TEX1_6:SERG1] +¡Bonito culo nena! + +[TEX1_7:SERG1] +¿Este soy yo? + +[TEX1_I:SERG1] +Bueno, necesito algún cabrón obstinado que suelte algo de mierda. + +[TEX1_8:SERG1] +Cada vez que subas a un Caddy recibirás automáticamente un palo de golf, siempre que la ranura de armas blancas esté vacía. + +[TEX1_9:SERG1] +¡Atrapadle! + +[TEX1_10:SERG1] +¡Mata a ese psicópata! + +[TEX1_1:SERG1] +~g~Ve y consigue ropa de golf en Jocksports. + +{=================================== MISSION TABLE SERG2 ===================================} + +[TEX_2A:SERG2] +~g~¡Excelente! ¡Te han visto! + +[TEX_2B:SERG2] +~r~¡Idiota! ¡La gente debe PRESENCIAR a un cubano haciendo el trabajito! + +[TEX_2C:SERG2] +~g~¡Ve y consígue algo con los colores de la banda cubana en Little Havana! + +[TEX_2D:SERG2] +~g~¡Ahora elimina al capo de la banda haitiana en la Funeraria de Romero! + +[TEX2_A:SERG2] +Tommy, este es Donald Love. Donald, te presento a Tommy Vercetti, + +[TEX2_B:SERG2] +el último tirador más rápido en llegar a estos lares. + +[TEX2_C:SERG2] +Si... eh... + +[TEX2_D:SERG2] +Donald, ahora cállate y escucha, puede que aprendas algo. + +[TEX2_E:SERG2] +Veamos. Nada hace que los precios de las propiedades bajen más rápido que una guerra entre bandas al viejo estilo. + +[TEX2_F:SERG2] +Excepto un desastre quizás, como la peste de la que habla la biblia o algo así, + +[TEX2_G:SERG2] +aunque puede que en este caso vayamos demasiado lejos. + +[TEX2_H:SERG2] +¿Te estás enterando, capullo cuatro ojos? + +[TEX2_I:SERG2] +Hace poco murió un capo de una banda haitiana. Al parecer lo hicieron los cubanos, nadie lo sabe. + +[TEX2_J:SERG2] +¡Pero se lo haremos saber! Disfrázate de cubano + +[TEX2_K:SERG2] +y ve a reventar el funeral. Crea confusión y después le sigues bien de cerca. + +[TEX2_L:SERG2] +¿Te estás enterando, Donald? + +[TEX2_M:SERG2] +Eso debería meter al zorro en el gallinero. ¿Eh? + +[TEX2_N:SERG2] +y ahora sólo tenemos que sentarnos a esperar y ver cómo caen los precios. + +[TEXEXIT:SERG2] +~g~¡Lárgate de Little Haiti ahora! + +{=================================== MISSION TABLE SERG3 ===================================} + +[TEX3_A:SERG3] +Bien, mira, hijo. Tengo un problema y creo que podrías ayudarme con él. + +[TEX3_B:SERG3] +No soy constructor. + +[TEX3_C:SERG3] +No, estaba pensando más bien en tus habilidades para la demolición. + +[TEX3_D:SERG3] +Bien, esto de aquí es el centro empresarial tal y como se ha planeado, y éste + +[TEX3_E:SERG3] +es el solar que estamos buscando. + +[TEX3_F:SERG3] +Intentas decir que este nuevo bloque de oficinas está en medio. + +[TEX3_G:SERG3] +Lo captas rápido. + +[TEX3_H:SERG3] +Bien, voy a irme de esta ciudad durante un tiempo + +[TEX3_I:SERG3] +y si ese centro de oficinas se enfrentase a problemas estructurales repentinos e insalvables, entonces yo... + +[TEX3_J:SERG3] +¿Como buen ciudadano se sentirá obligado a intervenir y + +[TEX3_K:SERG3] +salvar la remodelación de una zona tan importante de la ciudad? + +[TEX3_L:SERG3] +¿Dónde puedo conseguir más tipos como tú? + +[TEX3_1:SERG3] +~g~Utiliza el helicóptero RC para transportar las bombas a los cuatro objetivos del edificio que debes demoler. + +[TEX3_2:SERG3] +~g~Debes colocar una bomba en cada objetivo. Puedes colocarlas en cualquier orden. + +[TEX3_3:SERG3] +~g~Para recoger una bomba, dirige el helicóptero RC hasta a ella. Solo puedes llevar las bombas de una en una. + +[TEX3_4:SERG3] { reVC update } +~g~Para soltar una bomba pulsa ~h~~k~~VEHICLE_FIREWEAPON~~g~. + +[TEX3_5:SERG3] +~g~Si fallas al colocar una bomba podrás recogerla e intentarlo de nuevo. + +[TEX3_6:SERG3] +~g~Cuando hayas recogido una bomba por primera vez, el temporizador de detonación se pondrá en marcha. + +[TEX3_7:SERG3] +~g~¡A continuación deberás conseguir colocar el resto de las bombas en 7 minutos! + +[TEX3_8:SERG3] +~g~¡Has fallado en el objetivo! ¡Recoge la bomba e inténtalo de nuevo! + +[TEX3_10:SERG3] +~g~Suelta la bomba en el objetivo. + +[TEX3_11:SERG3] +objetivos restantes: + +[TEX3_17:SERG3] +~r~¡Te has quedado sin tiempo! + +[TEX3_18:SERG3] +~r~¡Tu helicóptero RC ha sido destruido! + +[TEX3_19:SERG3] +~r~¡Has lanzado la bomba en el agua! ¡Esa no es manera de pescar! + +[TEX3_20:SERG3] +~g~¡Tu Helicóptero RC está casi fuera del alcance del control remoto! + +[TEX3_21:SERG3] +~r~¡Tu Helicóptero RC está fuera del alcance del control remoto! + +[TEX3_24:SERG3] +Pulsa ~h~~k~~VEHICLE_LOOKLEFT~ ~w~para girar el helicóptero en sentido contrario a las agujas del reloj. + +[TEX3_25:SERG3] +Pulsa ~h~~k~~VEHICLE_LOOKLEFT~ ~w~para girar el helicóptero en sentido de las agujas del reloj. + +[TEX3_27:SERG3] +~g~Una escalera central permite el acceso a todas las plantas del edificio. + +[TEX3_31:SERG3] +~r~¡Has destruido la furgoneta de TOPFUN que tenía las bombas y el helicóptero RC! + +[TEX3_32:SERG3] +Puedes ~h~mirar atrás~w~ si ~h~pulsas simultáneamente ~k~~VEHICLE_LOOKLEFT~ y ~k~~VEHICLE_LOOKRIGHT~~w~. + +[TEX3_29:SERG3] { reVC update } +~g~Para soltar una bomba pulsa ~h~~k~~VEHICLE_FIREWEAPON~~g~. + +[TEX3_26:SERG3] +Pulsa ~h~~k~~VEHICLE_BRAKE~~w~ para disminuir la velocidad del rotor y ~h~descender~w~. + +[TEX3_22:SERG3] +Pulsa ~h~~k~~VEHICLE_ACCELERATE~~w~ para aumentar la velocidad del rotor y así ~h~ascender~w~. + +[TEX3_16:SERG3] +~g~Ve a la furgoneta ~w~TOPFUN ~g~cercana al solar de construcción que se va a demoler. + +[TEX3_33:SERG3] +Una vez que recojas una bomba el radar te mostrará la posición del objetivo con relación al helicóptero RC. + +[TEX3_34:SERG3] +Un ~h~icono triangular apuntando hacia arriba ~w~indica que el objetivo está ~h~por encima ~w~del helicóptero RC. + +[TEX3_35:SERG3] +Un ~h~icono triangular apuntando hacia abajo ~w~indica que el objetivo está ~h~por debajo ~w~del helicóptero RC. + +[TEX3_36:SERG3] +Un ~h~icono cuadrado ~w~indica que el objetivo está al ~h~mismo nivel ~w~que el helicóptero RC. + +[TEX3_28:SERG3] +Para ~h~recoger una bomba~w~, simplemente dirige el helicóptero RC hasta ella. El helicóptero RC sólo puede transportar una bomba. + +[TEX3_30:SERG3] +~g~Para recoger una bomba, simplemente dirige el helicóptero RC hasta ella. El helicóptero RC sólo puede transportar una bomba. + +[TEX3_12:SERG3] +~g~¡Bomba colocada! ¡Quedan 3 objetivos más! Vuelve a por otra bomba. + +[TEX3_13:SERG3] +~g~¡Bomba colocada! ¡Quedan 2 objetivos más! Vuelve a por otra bomba. + +[TEX3_14:SERG3] +~g~¡Bomba colocada! ¡Queda 1 objetivo más! Vuelve a por otra bomba. + +[TEX3_15:SERG3] +~r~¡El temporizador de detonación se ha puesto en marcha! ~g~Debes colocar las ~w~4 bombas ~g~en el tiempo restante! + +[TEX3_37:SERG3] +Si empujas ~h~el joystick analógico derecho hacia atrás~w~, aumentarás la velocidad del rotor y así ~h~ascenderá~w~. + +[TEX3_38:SERG3] { reVC update } +{Pulsa ~h~~k~~VEHICLE_ACCELERATE~~w~ para aumentar la velocidad del rotor y así ~h~ascender~w~.} +Si empujas ~h~el joystick analógico derecho hacia adelante ~w~la velocidad del rotor aumenta, haciendo que el helicóptero ~h~descienda. + +[TEX3_39:SERG3] +~g~Para soltar una bomba pulsa ~h~~k~~VEHICLE_HANDBRAKE~~w~. + +[TEX3_40:SERG3] +~g~Para soltar una bomba pulsa ~h~~k~~VEHICLE_HANDBRAKE~~w~. + +[TEX3_23:SERG3] +Pulsa ~h~~k~~VEHICLE_TURRETUP~~w~ y ~h~~k~~VEHICLE_TURRETDOWN~~w~ para inclinar el helicóptero en la dirección deseada. + +{=================================== MISSION TABLE TAXI1 ===================================} + +[FARES:TAXI1] +CARRERAS: + +[TAXI1:TAXI1] +~g~Busca un cliente. + +[TSCORE2:TAXI1] +~1~ $ + +[IN_ROW:TAXI1] +~1~ ¡Racha de clientes! ~1~ $ + +[TAXI3:TAXI1] +~r~¡Tu pasajero huye aterrorizado! + +[TAXI7:TAXI1] +~r~Tu coche está destrozado, haz que lo reparen. + +[TAXI4:TAXI1] +¡Viaje completado! + +[TAXI5:TAXI1] +¡VIAJE RÁPIDO! + +[TAXI6:TAXI1] +Misión de taxista cancelada + +[TAXIH1:TAXI1] +Detente cerca de un peatón que esté resaltado para recogerle y llevarle a su destino antes de que se agote el tiempo. + +[FARE1:TAXI1] +~g~Destino ~w~''el club Pole Position'' ~g~en Ocean Beach. + +[FARE3:TAXI1] +~g~Destino ~w~''el club náutico'' ~g~en Ocean Beach. + +[FARE4:TAXI1] +~g~Destino ~w~''Ammu-Nation'' ~g~en Ocean Beach. + +[FARE5:TAXI1] +~g~Destino ~w~''la ferretería'' ~g~en Washington Beach. + +[FARE6:TAXI1] +~g~Destino ~w~''el centro comercial North Point'' ~g~en Vice Point. + +[MFARE1:TAXI1] +~g~Destino ~w~''Ammu-Nation'' ~g~en el centro. + +[MFARE2:TAXI1] +~g~Destino ~w~''la terminal'' ~g~en el aeropuerto Escobar International. + +[WFARE3:TAXI1] +~g~Destino ~w~''Coches Sunshine'' ~g~en Little Havana. + +[WFARE4:TAXI1] +~g~Destino ~w~''Taxis Kaufman'' ~g~en Little Haiti. + +[WFARE5:TAXI1] +~g~Destino ~w~''la ferretería'' ~g~en Little Havana. + +[WFARE6:TAXI1] +~g~Destino ~w~''Emporio Howlin Petes Bike'' ~g~en el centro. + +[FARE7:TAXI1] +~g~Destino ~w~''la joyería'' ~g~en Vice Point. + +[FARE8:TAXI1] +~g~Destino ~w~''la playa'' ~g~en Ocean Beach. + +[FARE9:TAXI1] +~g~Destino ~w~''la playa'' ~g~en Washington Beach. + +[FARE10:TAXI1] +~g~Destino ~w~''la playa'' ~g~en Vice Point. + +[FARE11:TAXI1] +~g~Destino ~w~''el hospital'' ~g~en Ocean Beach. + +[FARE12:TAXI1] +~g~Destino ~w~''el hospital'' ~g~en Vice Point. + +[FARE13:TAXI1] +~g~Destino ~w~''la comisaría de policía'' ~g~en Washington Beach. + +[FARE14:TAXI1] +~g~Destino ~w~''la comisaría de policía'' ~g~en Vice Point. + +[FARE15:TAXI1] +~g~Destino ~w~''la pizzería'' ~g~en Vice Point. + +[WFARE7:TAXI1] +~g~Destino ~w~''la comisaría de policía'' ~g~en Little Havana. + +[WFARE8:TAXI1] +~g~Destino ~w~''la comisaría de policía'' ~g~en el centro de la ciudad. + +[WFARE9:TAXI1] +~g~Destino ~w~''el hospital'' ~g~en el centro de la ciudad. + +[WFARE10:TAXI1] +~g~Destino ~w~''el hospital'' ~g~en Little Havana. + +[WFARE11:TAXI1] +~g~Destino ~w~''el estadio'' ~g~en el centro de la ciudad. + +[WFARE12:TAXI1] +~g~Destino ~w~''la pizzería'' ~g~en Little Haiti. + +[WFARE13:TAXI1] +~g~Destino ~w~''la pizzería'' ~g~en el centro de la ciudad. + +[WFARE14:TAXI1] +~g~Destino ~w~''los muelles'' ~g~en Viceport. + +[WFARE15:TAXI1] +~g~Destino ~w~''la farmacia'' ~g~en Little Haiti. + +[FARE2:TAXI1] +~g~Destino ~w~''el club Malibú'' ~g~en Vice Point. + +{=================================== MISSION TABLE TAXICUT ===================================} + +[TAXC_A:TAXICUT] +Supongo que eres el nuevo propietario. + +[TAXC_B:TAXICUT] +¿Qué eres, mafioso? ¿Del cártel? No pareces mejicano... + +[TAXC_C:TAXICUT] +En fin, será mejor que sueltes el rollo de ''las cosas van a cambiar por aquí'', + +[TAXC_D:TAXICUT] +quizás amenazar a alguno de los conductores... + +[TAXC_E:TAXICUT] +ve con calma con Ted, el de ahí, acaban de curarle la hernia. + +[TAXC_F:TAXICUT] +Bueno, sí. Las cosas van a cambiar por aquí, señora. + +[TAXC_G:TAXICUT] +Oh, mierda, hijo. Anda dejarme esto a mí... + +[TAXC_H:TAXICUT] +Llevo haciéndolo años. + +[TAXC_I:TAXICUT] +Ahora oíd esto. + +[TAXC_J:TAXICUT] +Ahora tenemos una nueva dirección y las cosas van a cambiar por aquí. + +[TAXC_K:TAXICUT] +Nuestra nueva dirección, los... + +[TAXC_L:TAXICUT] +¿De qué banda eres? + +[TAXC_M:TAXICUT] +Bueno, en realidad no formo parte de ninguna banda. + +[TAXC_N:TAXICUT] +¿Cómo coño te llamas, muchacho? + +[TAXC_O:TAXICUT] +Vercetti, Tommy Vercetti. + +[TAXC_P:TAXICUT] +Nuestra nueva administración, la banda de Vercetti, + +[TAXC_Q:TAXICUT] +se va a encargar de que no tengamos problemas. + +[TAXC_R:TAXICUT] +¿Capiche? ¡Corto! + +[TAXC_S:TAXICUT] +¿Te gustó el ''capiche''? A mí me gustó el ''capiche''. + +[TAXC_T:TAXICUT] +Así que así es como funcionaban las cosas en el pasado, + +[TAXC_U:TAXICUT] +Dirigimos la compañía como siempre. + +[TAXC_V:TAXICUT] +Si tenemos algún problema con las compañías rivales, tú les das una somanta de palos. + +[TAXC_W:TAXICUT] +Luego ellos nos la dan a nosotros, + +[TAXC_X:TAXICUT] +y después, se la vuelves a dar a ellos, + +[TAXC_Y:TAXICUT] +etcétera, etcétera. ¿Lo captas? + +[TAXC_Z:TAXICUT] +Sí, supongo... + +[TAXC_A1:TAXICUT] +Simplemente toma un taxi del garaje si tienes ganas de subir a bordo. + +{=================================== MISSION TABLE TAXIWA1 ===================================} + +[OUTTIME:TAXIWA1] +~r~¡Demasiado lento, tío, demasiado lento! + +[TAX1_1:TAXIWA1] +Tenemos un cliente importante que necesita que lo recojan en Starfish Island. ¿Alguien me recibe? + +[TAX1_2:TAXIWA1] +¡Aquí Tommy, yo lo recogeré! + +[TAX1_3:TAXIWA1] +¡Este es mi cliente, lárgate, gilipollas! + +[TAX1_4:TAXIWA1] +Venga, venga, entre, ¡rápido! + +[TAX1_5:TAXIWA1] +¡Vale, vale! ¡No me haga daño! + +[TAXW1_1:TAXIWA1] +~g~Recoge al V.I.P. en Starfish Island. + +[TAXW1_2:TAXIWA1] +~g~¡Recupera al V.I.P! ¡Destroza el otro coche! + +[TAXW1_3:TAXIWA1] +~r~¡El V.I.P. está muerto! + +[TAXW1_4:TAXIWA1] +~r~¡El V.I.P. se ha apeado! + +[TAXW1_6:TAXIWA1] +~g~¡Lleva al V.I.P. al aeropuerto! + +{=================================== MISSION TABLE TAXIWA2 ===================================} + +[TAX2_1:TAXIWA2] +Llamando a todos los taxis, estamos perdiendo clientes por toda la ciudad. ¿Qué os pasa, tíos? + +[TAX2_2:TAXIWA2] +Taxis VC sigue llevándonos la delantera. ¡Tienen tantos coches que no podemos competir! + +[TAX2_3:TAXIWA2] +Sr. Vercetti, si está ahí escuchando, ¡tiene que poner fuera de circulación unos cuantos Taxis VC antes de que nos hundan! + +[TAXW2_1:TAXIWA2] +~g~¡Destruye 3 de los taxis rivales! + +{=================================== MISSION TABLE TAXIWA3 ===================================} + +[TAX3_1:TAXIWA3] +Coche 13, tengo a una tal Señorita Cortez, preguntó especialmente por usted. + +[TAX3_2:TAXIWA3] +Vale, entendido. ¡Coche 13 en ruta! + +[TAX3_3:TAXIWA3] +No hay rastro de Mercedes... + +[TAXW3_3:TAXIWA3] +~g~Destrulle al taxi principal! + +[TAXW3_2:TAXIWA3] +~g~Permanece con vida hasta que se agote el temporizador. + +[TAX_AS1:TAXIWA3] +COMPAÑÍA DE TAXIS CONSOLIDADA + +[TAX_AS2:TAXIWA3] +~g~Los taxis Kaufman generarán ahora unos ingresos de hasta ~1~ $ máximo. Asegúrate de recaudarlos regularmente. + +[TAX3_4:TAXIWA3] +¡Es hora que el ángel guardián de Taxis Kaufman coma algo del parachoques! + +[TAX3_5:TAXIWA3] +¡Eh chico te voy a zurrar la badana! + +{ reVC updates } +{ new languages } +[FEL_JAP] +JAPONÉS + +[FEL_POL] +POLACO + +[FEL_RUS] +RUSO + +{ new display menus } +[FET_GFX] +CONFIGURACIÓN DE GRÁFICOS + +[FED_MIP] +MIPMAPPING + +[FED_AAS] +SUAVIZADO DE BORDES + +[FED_FIL] +FILTRO DE TEXTURAS + +[FED_BIL] +BILINEAL + +[FED_TRL] +TRILINEAL + +[FED_WND] +VENTANA + +[FED_FLS] +PANTALLA COMPLETA + +[FEM_CSB] +BORDES EN CINEMÁTICAS + +[FEM_SCF] +FORMATO DE IMAGEN + +[FEM_ISL] +USO DE MEMORIA + +[FEM_LOW] +BAJO + +[FEM_MED] +MEDIO + +[FEM_HIG] +ALTO + +[FEM_2PR] +ALPHA TEST TIPO PS2 + +[FEC_FRC] +CÁMARA LIBRE + +{ Linux joy detection } +[FEC_JOD] +DETECTAR JOYSTICK + +[FEC_JPR] +Pulsa cualquier botón del joystick que quieras usar con el juego para seleccionarlo. + +[FEC_JDE] +Joystick detectado + +{ mission restart } +[FET_RMS] +REPETIR MISIÓN + +[FESZ_RM] +¿REINTENTAR? + +[FED_VPL] +FLUJO DE VEHÍCULOS + +[FED_PRM] +LUCES EN PEATONES + +[FED_RGL] +BRILLO DE CARRETERAS + +[FED_CLF] +FILTRO DE COLOR + +[FED_WLM] +MAPAS DE LUZ DEL MUNDO + +[FED_MBL] +DESENFOQ. MOVIMIENTO + +[FEM_SIM] +SIMPLE + +[FEM_NRM] +NORMAL + +[FEM_MOB] +MÓVIL + +[FED_MFX] +MATFX + +[FED_NEO] +NEO + +[FEM_PS2] +PS2 + +[FEM_XBX] +XBOX + +[FEC_IVP] +INVERTIR VERTICALIDAD MANDO + +[FEM_NON] +NADA + +[FEC_DS2] +DUALSHOCK 2 + +[FEC_DS3] +DUALSHOCK 3 + +[FEC_DS4] +DUALSHOCK 4 + +[FEC_360] +MANDO DE XBOX 360 + +[FEC_ONE] +MANDO DE XBOX ONE + +[FEC_TYP] +TIPO DE MANDO + +[FET_AGS] +AJUSTES DE MANDO + +[FEM_AUT] { aspect ratio related } +AUTO + +{ 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/vendor/librw/.appveyor.yml b/vendor/librw/.appveyor.yml deleted file mode 100644 index 5ff58de..0000000 --- a/vendor/librw/.appveyor.yml +++ /dev/null @@ -1,32 +0,0 @@ -image: Visual Studio 2017 -configuration: Release -environment: - GLFW_BASE: glfw-3.2.1.bin.WIN64 - GLFW_URL: https://github.com/glfw/glfw/releases/download/3.2.1/%GLFW_BASE%.zip - SDL2_BASE: SDL2-devel-2.0.8-VC - SDL2_URL: https://www.libsdl.org/release/%SDL2_BASE%.zip - SDL2_DIRAME: SDL2-2.0.8 - PREMAKE5_URL: https://github.com/premake/premake-core/releases/download/v5.0.0-alpha12/premake-5.0.0-alpha12-windows.zip - matrix: - - PLATFORM: win-amd64-null - - PLATFORM: win-amd64-gl3 - PREMAKE5_EXTRA_ARGS: --gfxlib=glfw - - PLATFORM: win-amd64-gl3 - PREMAKE5_EXTRA_ARGS: --gfxlib=sdl2 - - PLATFORM: win-amd64-d3d9 - -install: - - appveyor DownloadFile %GLFW_URL% -FileName "%APPVEYOR_BUILD_FOLDER%/%GLFW_BASE%.zip" - - 7z x "%APPVEYOR_BUILD_FOLDER%/%GLFW_BASE%.zip" - - appveyor DownloadFile %SDL2_URL% -FileName "%APPVEYOR_BUILD_FOLDER%/%SDL2_BASE%.zip" - - 7z x "%APPVEYOR_BUILD_FOLDER%/%SDL2_BASE%.zip" - - appveyor DownloadFile %PREMAKE5_URL% -FileName "%APPVEYOR_BUILD_FOLDER%/premake5.zip" - - mkdir "%APPVEYOR_BUILD_FOLDER%/bin" && cd "%APPVEYOR_BUILD_FOLDER%/bin" && 7z x "%APPVEYOR_BUILD_FOLDER%/premake5.zip" - - set PATH=%APPVEYOR_BUILD_FOLDER%/bin;%PATH% -before_build: - - mkdir "%APPVEYOR_BUILD_FOLDER%/build" - - cd "%APPVEYOR_BUILD_FOLDER%" - - premake5 vs2017 --glfwdir64=%APPVEYOR_BUILD_FOLDER%/%GLFW_BASE% --sdl2dir=%APPVEYOR_BUILD_FOLDER%/%SDL2_DIRAME% %PREMAKE5_EXTRA_ARGS% -build: - project: c:\projects\librw\build\librw.sln - verbosity: minimal diff --git a/vendor/librw/.github/workflows/build-cmake-conan.yml b/vendor/librw/.github/workflows/build-cmake-conan.yml deleted file mode 100644 index 092e1a6..0000000 --- a/vendor/librw/.github/workflows/build-cmake-conan.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: Build using conan+cmake -on: - pull_request: - push: - release: - types: published -jobs: - build-cmake: - strategy: - matrix: - os: [windows-latest, ubuntu-latest, macos-latest] - platform: ['null', 'gl3', 'd3d9', 'ps2'] - gl3_gfxlib: ['glfw', 'sdl2'] - exclude: - - os: windows-latest - platform: ps2 - - os: ubuntu-latest - platform: d3d9 - - os: macos-latest - platform: d3d9 - - platform: 'null' - gl3_gfxlib: sdl2 - - platform: d3d9 - gl3_gfxlib: sdl2 - - platform: ps2 - gl3_gfxlib: sdl2 - runs-on: ${{ matrix.os }} - continue-on-error: ${{ matrix.platform == 'ps2' }} - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 - with: - python-version: '3.x' - - name: "Setup conan" - run: | - python -m pip install conan - conan config init - conan config set log.print_run_commands=True - conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan - conan remote add madebr_ps2dev https://api.bintray.com/conan/madebr/ps2dev - - name: "Add os=Playstation2 + gcc.version=3.2 to .conan/settings.yml" - if: ${{ matrix.platform == 'ps2' }} - shell: python - run: | - import os, yaml - settings_path = os.path.expanduser("~/.conan/settings.yml") - yml = yaml.safe_load(open(settings_path)) - yml["os"]["Playstation2"] = None - yml["compiler"]["gcc"]["version"].append("3.2") - yml["compiler"]["gcc"]["version"].sort() - yaml.safe_dump(yml, open(settings_path, "w")) - - name: "Create host profile" - shell: bash - run: | - if test "${{ matrix.platform }}" = "ps2"; then - cp conan/playstation2 host_profile - else - cp ~/.conan/profiles/default host_profile - fi - - name: "Export Playstation 2 CMake toolchain conan recipe" - run: | - conan export cmake/ps2toolchain ps2dev-cmaketoolchain/master@ - - name: "Download/build dependencies (conan install)" - run: | - conan install ${{ github.workspace }} librw/master@ -if build -o platform=${{ matrix.platform }} -o gl3_gfxlib=${{ matrix.gl3_gfxlib}} --build missing -pr:h ./host_profile -pr:b default - env: - CONAN_SYSREQUIRES_MODE: enabled - - name: "Build librw (conan build)" - run: | - conan build ${{ github.workspace }} -if build -bf build -pf package - - name: "Package librw (conan package)" - run: | - conan package ${{ github.workspace }} -if build -bf build -pf package - - name: "Create binary package (cpack)" - working-directory: ./build - run: | - cpack - - name: "Archive binary package (github artifacts)" - uses: actions/upload-artifact@v2 - with: - name: "${{ matrix.os }}-${{ matrix.platform }}" - path: build/*.tar.xz - if-no-files-found: error diff --git a/vendor/librw/.gitignore b/vendor/librw/.gitignore deleted file mode 100644 index d536cfb..0000000 --- a/vendor/librw/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -/bin -/build -/obj -/lib -/output -/.vs -librw.vcxproj.user -librw.VC.db -librw.VC.VC.opendb \ No newline at end of file diff --git a/vendor/librw/.travis.yml b/vendor/librw/.travis.yml deleted file mode 100644 index 91411e6..0000000 --- a/vendor/librw/.travis.yml +++ /dev/null @@ -1,46 +0,0 @@ -language: cpp - -matrix: - include: - - os: linux - env: TARGET=release_linux-amd64-null - script: - - mkdir -p "$TRAVIS_BUILD_DIR/build" - #- docker build -t librw "$TRAVIS_BUILD_DIR" - #- docker run -v "$TRAVIS_BUILD_DIR:/librw:rw,z" --name librw_instance -d librw sleep infinity - - docker pull librw/librw - - docker run -v "$TRAVIS_BUILD_DIR:/librw:rw,z" -v "$TRAVIS_BUILD_DIR/build:/build:rw,z" --name librw_instance -d librw/librw sleep infinity - - docker exec -u builder librw_instance /bin/bash -c "cd /librw && premake5 gmake && cd /librw/build && make config=$TARGET verbose=1" - - os: linux - env: TARGET=release_linux-amd64-gl3 GFXLIB=glfw - services: docker - script: - - mkdir -p "$TRAVIS_BUILD_DIR/build" - #- docker build -t librw "$TRAVIS_BUILD_DIR" - #- docker run -v "$TRAVIS_BUILD_DIR:/librw:rw,z" --name librw_instance -d librw sleep infinity - - docker pull librw/librw - - docker run -v "$TRAVIS_BUILD_DIR:/librw:rw,z" -v "$TRAVIS_BUILD_DIR/build:/build:rw,z" --name librw_instance -d librw/librw sleep infinity - - docker exec -u builder librw_instance /bin/bash -c "cd /librw && premake5 --gfxlib=$GFXLIB gmake && cd /librw/build && make config=$TARGET verbose=1" - - os: linux - env: TARGET=release_linux-amd64-gl3 GFXLIB=sdl2 - services: docker - script: - - mkdir -p "$TRAVIS_BUILD_DIR/build" - #- docker build -t librw "$TRAVIS_BUILD_DIR" - #- docker run -v "$TRAVIS_BUILD_DIR:/librw:rw,z" --name librw_instance -d librw sleep infinity - - docker pull librw/librw - - docker run -v "$TRAVIS_BUILD_DIR:/librw:rw,z" -v "$TRAVIS_BUILD_DIR/build:/build:rw,z" --name librw_instance -d librw/librw sleep infinity - - docker exec -u builder librw_instance /bin/bash -c "cd /librw && premake5 --gfxlib=$GFXLIB gmake && cd /librw/build && make config=$TARGET verbose=1" - - name: "ps2" - os: linux - env: TARGET=release_ps2 - services: docker - script: - - mkdir -p "$TRAVIS_BUILD_DIR/build" - #- docker build -t librw "$TRAVIS_BUILD_DIR" - #- docker run -v "$TRAVIS_BUILD_DIR:/librw:rw,z" --name librw_instance -d librw sleep infinity - - docker pull librw/librw - - docker run -v "$TRAVIS_BUILD_DIR:/librw:rw,z" -v "$TRAVIS_BUILD_DIR/build:/build:rw,z" --name librw_instance -d librw/librw sleep infinity - - docker exec -u builder librw_instance /bin/bash -c "cd /librw && premake5 gmake && cd /librw/build && make config=$TARGET verbose=1" - allow_failures: - - name: "ps2" diff --git a/vendor/librw/ARCHITECTURE.MD b/vendor/librw/ARCHITECTURE.MD deleted file mode 100644 index dad04fa..0000000 --- a/vendor/librw/ARCHITECTURE.MD +++ /dev/null @@ -1,174 +0,0 @@ -This document gives an overview of the architecture of librw. - -Disclaimer: Some of these design decision were taken over from original RW, -some are my own. I only take partial responsibility. - -Differently from original RW, librw has no neat separation into modules. -Some things could be made optional, but in particular RW's RpWorld -plugin is integrated with everything else. - -# Plugins - -To extend structs with custom data, -RW (and librw) provides a plugin mechanism -for certain structs. -This can be used to tack more data onto a struct -and register custom streaming functions. -Plugins must be registered before any instance -of that struct is allocated. - -# Pipelines - -RW's pipeline architecture was designed for very flexible data flow. -Unfortunately for RW most of the rendering pipeline moved into the GPU -causing RW's pipeline architecture to be severely overengineered. - -librw's pipeline architecture is therefore much simplified -and only implements what is actually needed, -but the name *pipeline* is retained. - -Three pipelines are implemented in librw itself: -Default, Skin, MatFX (only env map so far). -Others can be implemented by applications using librw. - -# RW Objects - -## Frame - -A Frame is an orientation in space, arranged in a hierarchy. -Camera, Lights and Atomics can be attached to it. -It has two matrices: a (so called) model matrix, -which is relative to its parent, -and a local transformation matrix (LTM) which is relative to the world. -The LTM is updated automatically as needed whenever the hierarchy gets dirty. - -## Camera - -A Camera is attached to a Frame to position it in space -and has a framebuffer and a z-buffer attached to render to. -Rendering is started by `beginUpdate` and ended by `endUpdate`. -This sets up things like framebuffers and matrices -so that the Camera's raster can be rendered to. - -## Light - -Lights are attached to a Frame to position it in space. -They are used to light Atomics for rendering. -Different types of light are possible. - -## Geometry - -A Geometry contains the raw geometry data that can be rendered. -It has a list of materials that are applied to its triangles. -The latter are sorted by materials into meshes for easier instancing. - -## Atomic - -An Atomic is attached to a Frame to position it in space -and references a Geometry. -Atomics are the objects that are rendered by pipelines. - -## Clump - -A Clump is a container of Atomics, Lights and Cameras. -Clumps can be read from and written to DFF files. -Rendering a Clump will be render all of its Atomics. - -# Engine - -Due to the versatility of librw, -there are three levels of code: -Platform indpendent code, -platform specific code, -and render device specific code. - -The second category does not exist in original RW, -but because librw is supposed to be able to -convert between all sorts of platform specific files, -the code for that has to be available no matter -the render platform used. -The common interface for all device-independent -platform code is the `Driver` struct. -The `Engine` struct has an array with one for each platform. - -The render device specific code -is used for actually rendering something to the screen. -The common interface for the device-dependent -code is the `Device` struct and the `Engine` -struct only has a single one, as there can only be one render device -(i.e. you cannot select D3D or OpenGL at runtime). - -Thus when implementing a new backend -you have to implement the `Driver` and `Device` interfaces. -But do note that the `Driver` can be extended with plugins! - -# Driver - -The driver is mostly concerned with conversion -between platform independent data to platform dependent one, and vice versa. -This concerns the following two cases. - -## Raster, Images - -Images contain platform independent uncompressed pixel data. -Rasters contain platform dependent (and possibly compressed) pixel data. -A driver has to be able to convert an image to a raster for the purposes of loading textures -from files or having them converted from foreign rasters. -Converting from rasters to images is not absolutely necessary but it's needed e.g. for taking screenshots. -librw has a set of default raster formats that the platform is -expected to implement for the most part, however not all have to be supported necessarily. -A driver is also free to implement its own formats; -this is done for texture compression. - -Rasters have different types, -`TEXTURE` and `CAMERATEXTURE` rasters can be used as textures, -`CAMERA` and `CAMERATEXTURE` can be used as render targets, -`ZBUFFER` is used as a depth-buffer. - -## Pipelines - -A librw ObjPipeline implements essentially -an instance stage which converts platform independent geometry -to a format that can efficiently be rendered, -and a render stage that actually renders it. -(There is also an uninstance function, -but this is only used to convert platform specific geometry back to the generic format -and hence is not necessary.) - -# Device - -The device implements everything that is actually needed for rendering. - -This includes starting, handling and closing the rendering device, -setting render states, -allocating and destroying buffers and textures, -im2d and im3d rendering, -and the render functions of the pipelines. - -## System - -The `system` function implements certain device requests -from the engine (why these aren't separate functions I don't know, RW design). - -The `Engine` is started in different stages, at various points of which -the render device gets different requests. -At the end the device is initialized and ready for rendering. -A similar but reverse sequence happens on shutdown. - -Subsystems (screens) and video modes are queried through -the `system` by the application before the device is started. - -## Immediate mode - -Im2d and im3d are immediate-mode style rendering interface. - -## Pipelines - -For instancing the typical job is to allocate and fill -a struct to hold some data about an atomic, -an array of structs for all the meshes, -and vertex and index buffers to hold geometry for rendering. - -The render function will render the previously instanced -data by doing a per-object setup and then iterating over -and rendering all the meshes. diff --git a/vendor/librw/CMakeLists.txt b/vendor/librw/CMakeLists.txt deleted file mode 100644 index 81d3a43..0000000 --- a/vendor/librw/CMakeLists.txt +++ /dev/null @@ -1,119 +0,0 @@ -cmake_minimum_required(VERSION 3.8) -project(librw C CXX) - -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") - -if(WIN32) - set(LIBRW_PLATFORMS "NULL" "GL3" "D3D9") -else() - set(LIBRW_PLATFORMS "NULL" "GL3" "PS2") -endif() -set(LIBRW_PLATFORM "NULL" CACHE STRING "Platform") -set_property(CACHE LIBRW_PLATFORM PROPERTY STRINGS ${LIBRW_PLATFORMS}) -message(STATUS "LIBRW_PLATFORM = ${LIBRW_PLATFORM} (choices=${LIBRW_PLATFORMS})") -set("LIBRW_PLATFORM_${LIBRW_PLATFORM}" ON) -if(NOT LIBRW_PLATFORM IN_LIST LIBRW_PLATFORMS) - message(FATAL_ERROR "Illegal LIBRW_PLATFORM=${LIBRW_PLATFORM}") -endif() - -set(LIBRW_GL3_GFXLIBS "GLFW" "SDL2") -set(LIBRW_GL3_GFXLIB "GLFW" CACHE STRING "gfxlib for gl3") -set_property(CACHE LIBRW_GL3_GFXLIB PROPERTY STRINGS ${LIBRW_GL3_GFXLIBS}) -if(LIBRW_PLATFORM_GL3) - message(STATUS "LIBRW_GL3_GFXLIB = ${LIBRW_GL3_GFXLIB} (choices=${LIBRW_GL3_GFXLIBS})") -endif() -if(NOT LIBRW_GL3_GFXLIB IN_LIST LIBRW_GL3_GFXLIBS) - message(FATAL_ERROR "Illegal LIBRW_GL3_GFXLIB=${LIBRW_GL3_GFXLIB}") -endif() - -if(LIBRW_PLATFORM_PS2) - enable_language(DSM) -endif() - -option(LIBRW_TOOLS "Build librw tools" ON) -option(LIBRW_INSTALL "Install librw files" OFF) - -if(LIBRW_INSTALL) - include(GNUInstallDirs) - set(LIBRW_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/librw") -endif() - -add_subdirectory(src) - -if(LIBRW_TOOLS) - add_subdirectory(skeleton) - - add_subdirectory(tools) -endif() - -if(LIBRW_INSTALL) - include(CMakePackageConfigHelpers) - configure_package_config_file(cmake/librw-config.cmake.in librw-config.cmake - INSTALL_DESTINATION "${CMAKE_INSTALL_PREFIX}" - ) - install( - FILES "${CMAKE_CURRENT_BINARY_DIR}/librw-config.cmake" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - ) - install( - EXPORT librw-targets NAMESPACE librw:: - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - ) - - string(REPLACE "." ";" cmake_c_compiler_version_list "${CMAKE_C_COMPILER_VERSION}") - list(GET cmake_c_compiler_version_list 0 cmake_c_compiler_version_major) - - string(TOLOWER "${LIBRW_PLATFORM}" librw_platform) - set(compiler) - set(os) - if(NOT LIBRW_PLATFORM STREQUAL "PS2") - if(MSVC) - set(compiler "-msvc${MSVC_VERSION}") - elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") - set(compiler "-gcc${cmake_c_compiler_version_major}") - elseif(CMAKE_C_COMPILER_ID STREQUAL "Clang") - set(compiler "-clang${cmake_c_compiler_version_major}") - elseif(CMAKE_C_COMPILER_ID STREQUAL "AppleClang") - set(compiler "-appleclang${cmake_c_compiler_version_major}") - else() - set(compiler "-UNK") - message(WARNING "Unknown compiler. Created cpack package will be wrong. (override using cpack -P)") - endif() - endif() - if(LIBRW_PLATFORM_NULL) - set(platform "-null") - elseif(LIBRW_PLATFORM_PS2) - set(platform "-ps2") - elseif(LIBRW_PLATFORM_GL3) - if(LIBRW_GL3_GFXLIB STREQUAL "GLFW") - set(platform "-gl3-glfw") - else() - set(platform "-gl3-sdl2") - endif() - elseif(LIBRW_PLATFORM_D3D9) - set(platform "-d3d9") - endif() - if(NOT LIBRW_PLATFORM_PS2) - if(WIN32) - set(os "-win") - elseif(APPLE) - set(os "-apple") - elseif(UNIX) - set(os "-linux") - else() - set(compiler "-UNK") - message(WARNING "Unknown os. Created cpack package will be wrong. (override using cpack -P)") - endif() - endif() - - set(CPACK_PACKAGE_NAME "${PROJECT_NAME}${platform}${os}${compiler}") - set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A (partial) re-implementation of RenderWare Graphics") - set(CPACK_PACKAGE_VENDOR "aap") - set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/LICENSE") - set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE") - set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_NAME}") - set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}") - set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}") - set(CPACK_GENERATOR "TXZ") - include(CPack) -endif() diff --git a/vendor/librw/Dockerfile b/vendor/librw/Dockerfile deleted file mode 100644 index a664173..0000000 --- a/vendor/librw/Dockerfile +++ /dev/null @@ -1,60 +0,0 @@ -FROM ubuntu:rolling - -ENV PS2DEV /ps2dev -ENV PS2SDK $PS2DEV/ps2sdk -ENV PATH $PATH:$PS2DEV/bin:$PS2DEV/ee/bin:$PS2DEV/iop/bin:$PS2DEV/dvp/bin:$PS2SDK/bin - -ENV DEBIAN_FRONTEND noninteractive - -ENV TOOLCHAIN_GIT_URL git://github.com/ps2dev/ps2toolchain.git -ENV TOOLCHAIN_GIT_BRANCH master - -ENV PREMAKE5_URL=https://github.com/premake/premake-core/releases/download/v5.0.0-alpha12/premake-5.0.0-alpha12-linux.tar.gz - -RUN mkdir -p "$PS2DEV" "$PS2SDK" \ - && apt-get update \ - && apt-get upgrade -y \ - && apt-get install -y \ - build-essential \ - cmake \ - autoconf \ - bzip2 \ - gcc \ - git \ - libucl-dev \ - make \ - patch \ - vim \ - wget \ - zip \ - zlib1g-dev \ - libglfw3-dev \ - libsdl2-dev \ - && git clone -b $TOOLCHAIN_GIT_BRANCH $TOOLCHAIN_GIT_URL /toolchain \ - && cd /toolchain \ - && ./toolchain.sh \ - && git clone git://github.com/ps2dev/ps2eth.git /ps2dev/ps2eth \ - && make -C /ps2dev/ps2eth \ - && git clone git://github.com/ps2dev/ps2-packer.git /ps2-packer \ - && make install -C /ps2-packer \ - && rm -rf \ - /ps2-packer \ - /ps2dev/ps2eth/.git \ - /ps2dev/ps2sdk/test.tmp \ - /ps2dev/test.tmp \ - /toolchain \ - && rm -rf /var/lib/apt/lists/* \ - && wget "$PREMAKE5_URL" -O /tmp/premake5.tar.gz \ - && tar xf /tmp/premake5.tar.gz -C /usr/bin/ \ - && rm /tmp/premake5.tar.gz \ - && groupadd 1000 -g 1000 \ - && groupadd 1001 -g 1001 \ - && groupadd 2000 -g 2000 \ - && groupadd 999 -g 999 \ - && useradd -ms /bin/bash builder -g 1001 -G 1000,2000,999 \ - && printf "builder:builder" | chpasswd \ - && adduser builder sudo \ - && printf "builder ALL= NOPASSWD: ALL\\n" >> /etc/sudoers - -USER builder -WORKDIR /home/builder diff --git a/vendor/librw/LICENSE b/vendor/librw/LICENSE deleted file mode 100644 index ef53cc2..0000000 --- a/vendor/librw/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 aap - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/vendor/librw/README.md b/vendor/librw/README.md deleted file mode 100644 index 77defd0..0000000 --- a/vendor/librw/README.md +++ /dev/null @@ -1,26 +0,0 @@ -librw -===== - -This library is supposed to be a re-implementation of RenderWare graphics, -or a good part of it anyway. - -It is intended to be cross-platform in two senses: -support rendering on different platforms similar to RW; -supporting all file formats for all platforms at all times and provide -way to convert to all other platforms. - -Supported file formats are DFF and TXD for PS2, D3D8, D3D9 and Xbox. -Not all pre-instanced PS2 DFFs are supported. -BSP is not supported at all. - -For rendering we have D3D9 and OpenGL (>=2.1, ES >= 2.0) backends. -Rendering some things on the PS2 is working as a test only. - -# Uses - -librw can be used for rendering [GTA](https://github.com/gtamodding/re3). - -# Building - -Get premake5. Generate a config, e.g. with ``premake5 gmake``, -and look in the build directory. diff --git a/vendor/librw/TODO b/vendor/librw/TODO deleted file mode 100644 index c4d8cdb..0000000 --- a/vendor/librw/TODO +++ /dev/null @@ -1,16 +0,0 @@ -TODO: -- tristrips -- examples -- morphing -- Pipelines (PDS, Xbox, PC) - -driver -- metrics - -ps2 -- rendering! -- ADC conversion - - -BUGS: - - fseek with negative offset on ps2 over ps2link messes up the current position diff --git a/vendor/librw/args.h b/vendor/librw/args.h deleted file mode 100644 index 0e666c1..0000000 --- a/vendor/librw/args.h +++ /dev/null @@ -1,24 +0,0 @@ -extern char *argv0; -#define USED(x) ((void)x) -#define SET(x) ((x)=0) - -#define ARGBEGIN for((argv0||(argv0=*argv)),argv++,argc--;\ - argv[0] && argv[0][0]=='-' && argv[0][1];\ - argc--, argv++) {\ - char *_args, *_argt;\ - char _argc;\ - _args = &argv[0][1];\ - if(_args[0]=='-' && _args[1]==0){\ - argc--; argv++; break;\ - }\ - _argc = 0;\ - while(*_args && (_argc = *_args++))\ - switch(_argc) -#define ARGEND SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc); -#define ARGF() (_argt=_args, _args=(char*)"",\ - (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) -#define EARGF(x) (_argt=_args, _args=(char*)"",\ - (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) - -#define ARGC() _argc - diff --git a/vendor/librw/cmake/FindSDL2.cmake b/vendor/librw/cmake/FindSDL2.cmake deleted file mode 100644 index 24288b4..0000000 --- a/vendor/librw/cmake/FindSDL2.cmake +++ /dev/null @@ -1,38 +0,0 @@ -find_package(PkgConfig QUIET) -if(PKG_CONFIG_FOUND) - pkg_check_modules(SDL2 IMPORTED_TARGET "sdl2") - if(TARGET PkgConfig::SDL2 AND NOT TARGET SDL2::SDL2) - add_library(SDL2::SDL2 INTERFACE IMPORTED) - set_property(TARGET SDL2::SDL2 PROPERTY INTERFACE_LINK_LIBRARIES PkgConfig::SDL2) - endif() -endif() - -find_library(SDL2main_LIBRARY SDL2main) - -if(NOT SDL2_FOUND) - find_path(SDL2_INCLUDE_DIR sdl2.h) - find_library(SDL2_LIBRARY SDL2 SDL2d) - - find_library(SDL2main_LIBRARY SDL2main) - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(libuv - REQUIRED_VARS SDL2_INCLUDE_DIR SDL2_LIBRARY - ) - - if(NOT TARGET SDL2::SDL2) - add_library(SDL2::SDL2 UNKNOWN IMPORTED) - set_target_properties(SDL2::SDL2 PROPERTIES - IMPORTED_LOCATION "${SDL2_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}" - ) - endif() -endif() - -if(SDL2main_LIBRARY AND NOT TARGET SDL2::SDL2main) - add_library(SDL2::SDL2main UNKNOWN IMPORTED) - set_target_properties(SDL2::SDL2main PROPERTIES - IMPORTED_LOCATION "${SDL2main_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}" - ) -endif() diff --git a/vendor/librw/cmake/librw-config.cmake.in b/vendor/librw/cmake/librw-config.cmake.in deleted file mode 100644 index 67dd050..0000000 --- a/vendor/librw/cmake/librw-config.cmake.in +++ /dev/null @@ -1,18 +0,0 @@ -include("${CMAKE_CURRENT_LIST_DIR}/librw-targets.cmake") - -set(LIBRW_PLATFORM "@LIBRW_PLATFORM@") -set(LIBRW_PLATFORMS "@LIBRW_PLATFORMS@") -set(LIBRW_PLATFORM_@LIBRW_PLATFORM@ ON) - -if(LIBRW_PLATFORM_GL3) - set(LIBRW_GL3_GFXLIB "@LIBRW_GL3_GFXLIB@") - set(LIBRW_GL3_GFXLIBS "@LIBRW_GL3_GFXLIBS@") - - set(OpenGL_GL_PREFERENCE GLVND) - find_package(OpenGL REQUIRED) - if(LIBRW_GL3_GFXLIB STREQUAL "GLFW") - find_package(glfw3 REQUIRED) - elseif(LIBRW_GL3_GFXLIB STREQUAL "SDL2") - find_package(SDL2 REQUIRED) - endif() -endif() diff --git a/vendor/librw/cmake/ps2toolchain/CMakeDSMCompiler.cmake.in b/vendor/librw/cmake/ps2toolchain/CMakeDSMCompiler.cmake.in deleted file mode 100644 index 9a55d4c..0000000 --- a/vendor/librw/cmake/ps2toolchain/CMakeDSMCompiler.cmake.in +++ /dev/null @@ -1,16 +0,0 @@ -set(CMAKE_DSM_COMPILER "@_CMAKE_DSM_COMPILER@") -set(CMAKE_DSM_COMPILER_ARG1 "@_CMAKE_DSM_COMPILER_ARG1@") -set(CMAKE_DSM_COMPILER_AR "@_CMAKE_DSM_COMPILER_AR@") -set(CMAKE_RANLIB "@CMAKE_RANLIB@") -set(CMAKE_DSM_COMPILER_RANLIB "@_CMAKE_DSM_COMPILER_RANLIB@") -set(CMAKE_LINKER "@CMAKE_LINKER@") -set(CMAKE_DSM_COMPILER_LOADED 1) -set(CMAKE_DSM_COMPILER_ID "@_CMAKE_DSM_COMPILER_ID@") -set(CMAKE_DSM_COMPILER_VERSION "@_CMAKE_DSM_COMPILER_VERSION@") -set(CMAKE_DSM_COMPILER_ENV_VAR "@_CMAKE_DSM_COMPILER_ENV_VAR@") -@_SET_CMAKE_DSM_COMPILER_ARCHITECTURE_ID@ - -set(CMAKE_DSM_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_DSM_LINKER_PREFERENCE 0) - -@CMAKE_DSM_COMPILER_CUSTOM_CODE@ diff --git a/vendor/librw/cmake/ps2toolchain/CMakeDSMInformation.cmake b/vendor/librw/cmake/ps2toolchain/CMakeDSMInformation.cmake deleted file mode 100644 index 27b56d6..0000000 --- a/vendor/librw/cmake/ps2toolchain/CMakeDSMInformation.cmake +++ /dev/null @@ -1,79 +0,0 @@ -if(UNIX) - set(CMAKE_DSM_OUTPUT_EXTENSION .o) -else() - set(CMAKE_DSM_OUTPUT_EXTENSION .obj) -endif() - -set(CMAKE_INCLUDE_FLAG_DSM "-I") - -set(CMAKE_DSM_FLAGS_INIT "$ENV{DSMFLAGS} ${CMAKE_DSM_FLAGS_INIT}") - -# replace for CMake >= 3.11 -foreach(c "" _DEBUG _RELEASE _MINSIZEREL _RELWITHDEBINFO) - string(STRIP "${CMAKE_DSM_FLAGS${c}_INIT}" CMAKE_DSM_FLAGS${c}_INIT) -endforeach() - -set (CMAKE_DSM_FLAGS "${CMAKE_DSM_FLAGS_INIT}" CACHE STRING - "Flags used by the assembler during all build types.") - -if(NOT CMAKE_NOT_USING_CONFIG_FLAGS) - get_property(_GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) - # default build type is none - if(NOT _GENERATOR_IS_MULTI_CONFIG AND NOT CMAKE_NO_BUILD_TYPE) - set (CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE_INIT} CACHE STRING - "Choose the type of build, options are: None, Debug Release RelWithDebInfo MinSizeRel.") - endif() - unset(_GENERATOR_IS_MULTI_CONFIG) - set (CMAKE_DSM_FLAGS_DEBUG "${CMAKE_DSM_FLAGS_DEBUG_INIT}" CACHE STRING - "Flags used by the assembler during debug builds.") - set (CMAKE_DSM_FLAGS_MINSIZEREL "${CMAKE_DSM_FLAGS_MINSIZEREL_INIT}" CACHE STRING - "Flags used by the assembler during release minsize builds.") - set (CMAKE_DSM_FLAGS_RELEASE "${CMAKE_DSM_FLAGS_RELEASE_INIT}" CACHE STRING - "Flags used by the assembler during release builds.") - set (CMAKE_DSM_FLAGS_RELWITHDEBINFO "${CMAKE_DSM_FLAGS_RELWITHDEBINFO_INIT}" CACHE STRING - "Flags used by the assembler during Release with Debug Info builds.") -endif() - -mark_as_advanced(CMAKE_DSM_FLAGS - CMAKE_DSM_FLAGS_DEBUG - CMAKE_DSM_FLAGS_MINSIZEREL - CMAKE_DSM_FLAGS_RELEASE - CMAKE_DSM_FLAGS_RELWITHDEBINFO - ) -# WITH: cmake_initialize_per_config_variable(CMAKE_DSM_FLAGS "Flags used by the DSM compiler") - -if(NOT CMAKE_DSM_COMPILE_OBJECT) - set(CMAKE_DSM_COMPILE_OBJECT " -o ") -endif() - -if(NOT CMAKE_DSM_CREATE_STATIC_LIBRARY) - set(CMAKE_DSM_CREATE_STATIC_LIBRARY - " cr " - " ") -endif() - -if(NOT CMAKE_DSM_LINK_EXECUTABLE) - set(CMAKE_DSM_LINK_EXECUTABLE - " -o ") -endif() - -if(NOT CMAKE_EXECUTABLE_RUNTIME_DSM_FLAG) - set(CMAKE_EXECUTABLE_RUNTIME_DSM_FLAG ${CMAKE_SHARED_LIBRARY_RUNTIME_DSM_FLAG}) -endif() - -if(NOT CMAKE_EXECUTABLE_RUNTIME_DSM_FLAG_SEP) - set(CMAKE_EXECUTABLE_RUNTIME_DSM_FLAG_SEP ${CMAKE_SHARED_LIBRARY_RUNTIME_DSM_FLAG_SEP}) -endif() - -if(NOT CMAKE_EXECUTABLE_RPATH_LINK_DSM_FLAG) - set(CMAKE_EXECUTABLE_RPATH_LINK_DSM_FLAG ${CMAKE_SHARED_LIBRARY_RPATH_LINK_DSM_FLAG}) -endif() - -# to be done -if(NOT CMAKE_DSM_CREATE_SHARED_LIBRARY) - set(CMAKE_DSM_CREATE_SHARED_LIBRARY) -endif() - -if(NOT CMAKE_DSM_CREATE_SHARED_MODULE) - set(CMAKE_DSM_CREATE_SHARED_MODULE) -endif() diff --git a/vendor/librw/cmake/ps2toolchain/CMakeDetermineDSMCompiler.cmake b/vendor/librw/cmake/ps2toolchain/CMakeDetermineDSMCompiler.cmake deleted file mode 100644 index d3bda8b..0000000 --- a/vendor/librw/cmake/ps2toolchain/CMakeDetermineDSMCompiler.cmake +++ /dev/null @@ -1,87 +0,0 @@ -include(${CMAKE_ROOT}/Modules/CMakeDetermineCompiler.cmake) - -if (NOT CMAKE_DSM_COMPILER) - message(FATAL_ERROR "Need CMAKE_DSM_COMPILER set") -endif() - -_cmake_find_compiler_path(DSM) -mark_as_advanced(CMAKE_DSM_COMPILER) - -if (NOT CMAKE_DSM_COMPILER_ID) - # Table of per-vendor compiler id flags with expected output. - list(APPEND CMAKE_DSM_COMPILER_ID_VENDORS GNU ) - set(CMAKE_DSM_COMPILER_ID_VENDOR_FLAGS_GNU "--version") - set(CMAKE_DSM_COMPILER_ID_VENDOR_REGEX_GNU "(GNU assembler)|(GCC)|(Free Software Foundation)") - - include(CMakeDetermineCompilerId) - cmake_determine_compiler_id_vendor(DSM "") - -endif() - -if (NOT _CMAKE_TOOLCHAIN_LOCATION) - get_filename_component(_CMAKE_TOOLCHAIN_LOCATION "${CMAKE_DSM_COMPILER}" PATH) -endif() - -if (CMAKE_DSM_COMPILER_ID) - if (CMAKE_DSM_COMPILER_VERSION) - set(_version " ${CMAKE_DSM_COMPILER_VERSION}") - else() - set(_version "") - endif() - message(STATUS "The DSM compiler identification is ${CMAKE_DSM_COMPILER_ID}${_version}") - unset(_version) -else() - message(STATUS "The DSM compiler identification is unknown") -endif() - -if (NOT _CMAKE_TOOLCHAIN_PREFIX) - get_filename_component(COMPILER_BASENAME "${CMAKE_DSM_COMPILER}" NAME) - if (COMPILER_BASENAME MATCHES "^(.+1)g?as(-[0-9]+\\.[0-9]+\\.[0-9]+)?(\\.exe)?$") - set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1}) - endif() - -endif() - -set(_CMAKE_PROCESSING_LANGUAGE "DSM") -find_program(CMAKE_DSM_COMPILER_AR NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ar HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) -find_program(CMAKE_DSM_COMPILER_RANLIB NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ranlib HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) -find_program(CMAKE_DSM_COMPILER_STRIP NAMES ${_CMAKE_TOOLCHAIN_PREFIX}strip HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) -find_program(CMAKE_DSM_COMPILER_NM NAMES ${_CMAKE_TOOLCHAIN_PREFIX}nm HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) -find_program(CMAKE_DSM_COMPILER_OBJDUMP NAMES ${_CMAKE_TOOLCHAIN_PREFIX}objdump HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) -find_program(CMAKE_DSM_COMPILER_OBJCOPY NAMES ${_CMAKE_TOOLCHAIN_PREFIX}objcopy HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) - -unset(_CMAKE_PROCESSING_LANGUAGE) - -set(CMAKE_DSM_COMPILER_ENV_VAR "DSM") - -if (CMAKE_DSM_COMPILER) - message(STATUS "Found DSM assembler: ${CMAKE_DSM_COMPILER}") -else() - message(STATUS "Didn't find assembler") -endif() - -foreach(_var - COMPILER - COMPILER_ID - COMPILER_ARG1 - COMPILER_ENV_VAR - COMPILER_AR - COMPILER_RANLIB - COMPILER_VERSION - ) - set(_CMAKE_DSM_${_var} "${CMAKE_DSM_${_var}}") -endforeach() - -configure_file("${CMAKE_CURRENT_LIST_DIR}/CMakeDSMCompiler.cmake.in" - "${CMAKE_PLATFORM_INFO_DIR}/CMakeDSMCompiler.cmake" @ONLY) - -foreach(_var - COMPILER - COMPILER_ID - COMPILER_ARG1 - COMPILER_ENV_VAR - COMPILER_AR - COMPILER_VERSION - ) - unset(_CMAKE_DSM_${_var}) -endforeach() diff --git a/vendor/librw/cmake/ps2toolchain/CMakeTestDSMCompiler.cmake b/vendor/librw/cmake/ps2toolchain/CMakeTestDSMCompiler.cmake deleted file mode 100644 index 5c514ea..0000000 --- a/vendor/librw/cmake/ps2toolchain/CMakeTestDSMCompiler.cmake +++ /dev/null @@ -1,7 +0,0 @@ -set(_ASM_COMPILER_WORKS 0) - -if(CMAKE_DSM_COMPILER) - set(_DSM_COMPILER_WORKS) -endif() - -set(CMAKE_DSM_COMPILER_WORKS ${_DSM_COMPILER_WORKS} CACHE INTERNAL "") diff --git a/vendor/librw/cmake/ps2toolchain/Platform/PlayStation2.cmake b/vendor/librw/cmake/ps2toolchain/Platform/PlayStation2.cmake deleted file mode 100644 index bd2995e..0000000 --- a/vendor/librw/cmake/ps2toolchain/Platform/PlayStation2.cmake +++ /dev/null @@ -1 +0,0 @@ -set(CMAKE_EXECUTABLE_SUFFIX ".elf") diff --git a/vendor/librw/cmake/ps2toolchain/cmaketoolchain.cmake b/vendor/librw/cmake/ps2toolchain/cmaketoolchain.cmake deleted file mode 100644 index 6f83c96..0000000 --- a/vendor/librw/cmake/ps2toolchain/cmaketoolchain.cmake +++ /dev/null @@ -1,68 +0,0 @@ -cmake_minimum_required(VERSION 3.7) - -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") - -set(CMAKE_SYSTEM_NAME "PlayStation2") -set(CMAKE_SYSTEM_PROCESSOR "mipsel") -set(CMAKE_SYSTEM_VERSION 1) - -set(CMAKE_POSITION_INDEPENDENT_CODE ON) - -set(CMAKE_NO_SYSTEM_FROM_IMPORTED ON) - -set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) - -if(NOT DEFINED ENV{PS2DEV}) - message(FATAL_ERROR "Need environment variable PS2DEV set") -endif() -if(NOT DEFINED ENV{PS2SDK}) - message(FATAL_ERROR "Need environment variable PS2SDK set") -endif() -set(PS2DEV "$ENV{PS2DEV}") -set(PS2SDK "$ENV{PS2SDK}") - -if(NOT IS_DIRECTORY "${PS2DEV}") - message(FATAL_ERROR "PS2DEV must contain a folder path (${PS2DEV})") -endif() - -if(NOT IS_DIRECTORY "${PS2SDK}") - message(FATAL_ERROR "PS2SDK must contain a folder path (${PS2SDK})") -endif() - -set(CMAKE_DSM_SOURCE_FILE_EXTENSIONS "dsm") - -set(CMAKE_C_COMPILER "${PS2DEV}/ee/bin/ee-gcc") -set(CMAKE_CXX_COMPILER "${PS2DEV}/ee/bin/ee-g++") -set(CMAKE_ASM_COMPILER "${PS2DEV}/ee/bin/ee-g++") -set(CMAKE_DSM_COMPILER "${PS2DEV}/dvp/bin/dvp-as") -set(CMAKE_AR "${PS2DEV}/ee/bin/ee-ar" CACHE FILEPATH "archiver") -set(CMAKE_LINKER "${PS2DEV}/ee/bin/ee-ld") -set(CMAKE_RANLIB "${PS2DEV}/ee/bin/ee-ranlib" CACHE FILEPATH "ranlib") -set(CMAKE_STRIP "${PS2DEV}/ee/bin/ee-strip" CACHE FILEPATH "strip") - -set(CMAKE_ASM_FLAGS_INIT "-G0 -I\"${PS2SDK}/ee/include\" -I\"${PS2SDK}/common/include\"") -set(CMAKE_C_FLAGS_INIT "-G0 -fno-common -I\"${PS2SDK}/ee/include\" -I\"${PS2SDK}/common/include\"") -set(CMAKE_CXX_FLAGS_INIT "-G0 -fno-common -I\"${PS2SDK}/ee/include\" -I\"${PS2SDK}/common/include\"") -set(CMAKE_EXE_LINKER_FLAGS_INIT "-G0 -L\"${PS2SDK}/ee/lib\" -Wl,-r -Wl,-d") - -set(CMAKE_FIND_ROOT_PATH "${PS2DEV}/ee;${PS2SDK}/ee") -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - -set(PS2 1) -set(EE 1) - -function(add_erl_executable OUTFILE TARGET) - get_property(output_dir TARGET ${TARGET} PROPERTY RUNTIME_OUTPUT_DIRECTORY) - set(outfile "${output_dir}/${TARGET}.erl") - add_custom_command(OUTPUT "${outfile}" - COMMAND "${CMAKE_COMMAND}" -E copy "$" "${outfile}" - COMMAND "${CMAKE_STRIP}" --strip-unneeded -R .mdebug.eabi64 -R .reginfo -R .comment "${outfile}" - DEPENDS ${TARGET} - ) - add_custom_target("${TARGET}_erl" ALL - DEPENDS "${outfile}" - ) - set("${OUTFILE}" "${outfile}" PARENT_SCOPE) -endfunction() diff --git a/vendor/librw/cmake/ps2toolchain/conanfile.py b/vendor/librw/cmake/ps2toolchain/conanfile.py deleted file mode 100644 index 11c8628..0000000 --- a/vendor/librw/cmake/ps2toolchain/conanfile.py +++ /dev/null @@ -1,21 +0,0 @@ -from conans import ConanFile -import os -import shutil - - -class Ps2devCMakeToolchainConan(ConanFile): - name = "ps2dev-cmaketoolchain" - description = "CMake toolchain script for ps2dev" - topics = "ps2", "sdk", "library", "sony", "playstation", "ps2" - - def export_sources(self): - self.copy("*.cmake*", dst="cmake") - self.copy("Platform", dst="cmake") - - def package(self): - shutil.copytree(os.path.join(self.source_folder, "cmake"), - os.path.join(self.package_folder, "cmake")) - - def package_info(self): - self.user_info.cmake_dir = os.path.join(self.package_folder, "cmake").replace("\\", "/") - self.user_info.cmake_toolchain_file = os.path.join(self.package_folder, "cmake", "cmaketoolchain.cmake").replace("\\", "/") diff --git a/vendor/librw/cmake/ps2toolchain/toolchain_ps2_ee.cmake b/vendor/librw/cmake/ps2toolchain/toolchain_ps2_ee.cmake deleted file mode 100644 index 95517d0..0000000 --- a/vendor/librw/cmake/ps2toolchain/toolchain_ps2_ee.cmake +++ /dev/null @@ -1,60 +0,0 @@ -cmake_minimum_required(VERSION 3.7) - -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") - -set(CMAKE_SYSTEM_NAME "PlayStation2") -set(CMAKE_SYSTEM_PROCESSOR "mipsel") -set(CMAKE_SYSTEM_VERSION 1) - -set(CMAKE_POSITION_INDEPENDENT_CODE ON) - -set(CMAKE_NO_SYSTEM_FROM_IMPORTED ON) - -set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) - -if(NOT DEFINED ENV{PS2DEV}) - message(FATAL_ERROR "Need environment variable PS2DEV set") -endif() -if(NOT DEFINED ENV{PS2SDK}) - message(FATAL_ERROR "Need environment variable PS2SDK set") -endif() -set(PS2DEV "$ENV{PS2DEV}") -set(PS2SDK "$ENV{PS2SDK}") - -set(CMAKE_DSM_SOURCE_FILE_EXTENSIONS "dsm") - -set(CMAKE_C_COMPILER "${PS2DEV}/ee/bin/ee-gcc") -set(CMAKE_CXX_COMPILER "${PS2DEV}/ee/bin/ee-g++") -set(CMAKE_ASM_COMPILER "${PS2DEV}/ee/bin/ee-g++") -set(CMAKE_DSM_COMPILER "${PS2DEV}/dvp/bin/dvp-as") -set(CMAKE_AR "${PS2DEV}/ee/bin/ee-ar" CACHE FILEPATH "archiver") -set(CMAKE_LINKER "${PS2DEV}/ee/bin/ee-ld") -set(CMAKE_RANLIB "${PS2DEV}/ee/bin/ee-ranlib" CACHE FILEPATH "ranlib") -set(CMAKE_STRIP "${PS2DEV}/ee/bin/ee-strip" CACHE FILEPATH "strip") - -set(CMAKE_ASM_FLAGS_INIT "-G0 -I\"${PS2SDK}/ee/include\" -I\"${PS2SDK}/common/include\"") -set(CMAKE_C_FLAGS_INIT "-G0 -fno-common -I\"${PS2SDK}/ee/include\" -I\"${PS2SDK}/common/include\"") -set(CMAKE_CXX_FLAGS_INIT "-G0 -fno-common -I\"${PS2SDK}/ee/include\" -I\"${PS2SDK}/common/include\"") -set(CMAKE_EXE_LINKER_FLAGS_INIT "-G0 -L\"${PS2SDK}/ee/lib\" -Wl,-r -Wl,-d") - -set(CMAKE_FIND_ROOT_PATH "${PS2DEV}/ee;${PS2SDK}/ee") -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - -set(PS2 1) -set(EE 1) - -function(add_erl_executable OUTFILE TARGET) - get_property(output_dir TARGET ${TARGET} PROPERTY RUNTIME_OUTPUT_DIRECTORY) - set(outfile "${output_dir}/${TARGET}.erl") - add_custom_command(OUTPUT "${outfile}" - COMMAND "${CMAKE_COMMAND}" -E copy "$" "${outfile}" - COMMAND "${CMAKE_STRIP}" --strip-unneeded -R .mdebug.eabi64 -R .reginfo -R .comment "${outfile}" - DEPENDS ${TARGET} - ) - add_custom_target("${TARGET}_erl" ALL - DEPENDS "${outfile}" - ) - set("${OUTFILE}" "${outfile}" PARENT_SCOPE) -endfunction() diff --git a/vendor/librw/conan/playstation2 b/vendor/librw/conan/playstation2 deleted file mode 100644 index ddad52b..0000000 --- a/vendor/librw/conan/playstation2 +++ /dev/null @@ -1,12 +0,0 @@ -[settings] -os=Playstation2 -arch=mips -compiler=gcc -compiler.version=3.2 -compiler.libcxx=libstdc++ -build_type=Release -[options] -librw:platform=ps2 -[build_requires] -ps2dev-ps2toolchain/unknown@madebr/testing -[env] diff --git a/vendor/librw/conanfile.py b/vendor/librw/conanfile.py deleted file mode 100644 index 3032eae..0000000 --- a/vendor/librw/conanfile.py +++ /dev/null @@ -1,139 +0,0 @@ -from conans import ConanFile, CMake, tools -from conans.errors import ConanException, ConanInvalidConfiguration -import os -import shutil -import textwrap - - -class LibrwConan(ConanFile): - name = "librw" - version = "master" - license = "MIT" - settings = "os", "arch", "compiler", "build_type" - generators = "cmake", "cmake_find_package" - options = { - "platform": ["null", "gl3", "d3d9", "ps2"], - "gl3_gfxlib": ["glfw", "sdl2"], - } - default_options = { - "platform": "gl3", - "gl3_gfxlib": "glfw", - "openal:with_external_libs": False, - "sdl2:vulkan": False, - "sdl2:opengl": True, - "sdl2:sdl2main": True, - } - no_copy_source = True - - @property - def _os_is_playstation2(self): - try: - return self.settings.os == "Playstation2" - except ConanException: - return False - - def config_options(self): - if self._os_is_playstation2: - self.options.platform = "ps2" - if self.settings.os == "Windows": - self.options["sdl2"].directx = False - - def configure(self): - if self.options.platform != "gl3": - del self.options.gl3_gfxlib - - def validate(self): - if self.options.platform == "d3d9" and self.settings.os != "Windows": - raise ConanInvalidConfiguration("d3d9 can only be built for Windows") - if self.options.platform == "ps2": - if not self._os_is_playstation2: - raise ConanInvalidConfiguration("platform=ps2 is only valid for os=Playstation2") - else: - if self._os_is_playstation2: - raise ConanInvalidConfiguration("os=Playstation2 only supports platform=ps2") - - def requirements(self): - if self.options.platform == "gl3": - if self.options.gl3_gfxlib == "glfw": - self.requires("glfw/3.3.2") - elif self.options.gl3_gfxlib == "sdl2": - self.requires("sdl2/2.0.12@bincrafters/stable") - elif self.options.platform == "ps2": - self.requires("ps2dev-ps2sdk/unknown@madebr/testing") - if self._os_is_playstation2: - self.requires("ps2dev-cmaketoolchain/{}".format(self.version)) - - def export_sources(self): - for d in ("cmake", "skeleton", "src", "tools"): - shutil.copytree(src=d, dst=os.path.join(self.export_sources_folder, d)) - self.copy("args.h") - self.copy("rw.h") - self.copy("CMakeLists.txt") - self.copy("LICENSE") - - @property - def _librw_platform(self): - return { - "null": "NULL", - "gl3": "GL3", - "d3d9": "D3D9", - "ps2": "PS2", - }[str(self.options.platform)] - - def build(self): - if self.source_folder == self.build_folder: - raise Exception("cannot build with source_folder == build_folder") - if self.options.platform == "gl3" and self.options.gl3_gfxlib == "glfw": - tools.save("Findglfw3.cmake", - textwrap.dedent( - """ - if(NOT TARGET glfw) - message(STATUS "Creating glfw TARGET") - add_library(glfw INTERFACE IMPORTED) - set_target_properties(glfw PROPERTIES - INTERFACE_LINK_LIBRARIES CONAN_PKG::glfw) - endif() - """), append=True) - tools.save("CMakeLists.txt", - textwrap.dedent( - """ - cmake_minimum_required(VERSION 3.0) - project(cmake_wrapper) - - include("{}/conanbuildinfo.cmake") - conan_basic_setup(TARGETS) - - add_subdirectory("{}" librw) - """).format(self.install_folder.replace("\\", "/"), - self.source_folder.replace("\\", "/"))) - cmake = CMake(self) - env = {} - cmake.definitions["LIBRW_PLATFORM"] = self._librw_platform - cmake.definitions["LIBRW_INSTALL"] = True - cmake.definitions["LIBRW_TOOLS"] = True - if self.options.platform == "gl3": - cmake.definitions["LIBRW_GL3_GFXLIB"] = str(self.options.gl3_gfxlib).upper() - if self._os_is_playstation2: - cmake.definitions["CMAKE_TOOLCHAIN_FILE"] = self.deps_user_info["ps2dev-cmaketoolchain"].cmake_toolchain_file - env["PS2SDK"] = self.deps_cpp_info["ps2dev-ps2sdk"].rootpath - with tools.environment_append(env): - cmake.configure(source_folder=self.build_folder) - cmake.build() - - def package(self): - cmake = CMake(self) - cmake.install() - - def package_info(self): - self.cpp_info.includedirs.append(os.path.join("include", "librw")) - self.cpp_info.libs = ["librw" if self.settings.compiler == "Visual Studio" else "rw"] - if self.options.platform == "null": - self.cpp_info.defines.append("RW_NULL") - elif self.options.platform == "gl3": - self.cpp_info.defines.append("RW_GL3") - if self.options.gl3_gfxlib == "sdl2": - self.cpp_info.defines.append("LIBRW_SDL2") - elif self.options.platform == "d3d9": - self.cpp_info.defines.append("RW_D3D9") - elif self.options.platform == "ps2": - self.cpp_info.defines.append("RW_PS2") diff --git a/vendor/librw/docker_rebuild_ps2.sh b/vendor/librw/docker_rebuild_ps2.sh deleted file mode 100755 index cf8148f..0000000 --- a/vendor/librw/docker_rebuild_ps2.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -TARGET=release_ps2 - -set -e - -LIBRWDIR=$(dirname "$(readlink -f "$0")") -echo "LIBRWDIR is $LIBRWDIR" - -cd "$LIBRWDIR" - -premake5 gmake - -docker rm librw_instance -f >/dev/null 2>&1 || true -docker stop librw_instance -t 0 >/dev/null 2>&1 || true - -docker pull librw/librw -docker run -v "$LIBRWDIR:/librw:rw,z" --name librw_instance -d librw/librw sleep infinity -docker exec -u builder librw_instance /bin/bash -c "cd /librw/build && make clean config=$TARGET && make config=$TARGET verbose=1" - -docker rm librw_instance -f >/dev/null 2>&1 || true -docker stop librw_instance -t 0 >/dev/null 2>&1 || true diff --git a/vendor/librw/premake-vs2019.cmd b/vendor/librw/premake-vs2019.cmd deleted file mode 100644 index 18298f5..0000000 --- a/vendor/librw/premake-vs2019.cmd +++ /dev/null @@ -1 +0,0 @@ -premake5 vs2019 \ No newline at end of file diff --git a/vendor/librw/premake5.exe b/vendor/librw/premake5.exe deleted file mode 100644 index 9048d51..0000000 Binary files a/vendor/librw/premake5.exe and /dev/null differ diff --git a/vendor/librw/premake5.lua b/vendor/librw/premake5.lua deleted file mode 100755 index 484e407..0000000 --- a/vendor/librw/premake5.lua +++ /dev/null @@ -1,245 +0,0 @@ -newoption { - trigger = "gfxlib", - value = "LIBRARY", - description = "Choose a particular development library", - default = "glfw", - allowed = { - { "glfw", "GLFW" }, - { "sdl2", "SDL2" }, - }, -} - -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 = "sdl2dir", - value = "PATH", - description = "Directory of sdl2", - default = "../SDL2-2.0.8", -} - -workspace "librw" - location "build" - language "C++" - - configurations { "Release", "Debug" } - filter { "system:windows" } - configurations { "ReleaseStatic" } - platforms { "win-x86-null", "win-x86-gl3", "win-x86-d3d9", - "win-amd64-null", "win-amd64-gl3", "win-amd64-d3d9" } - filter { "system:linux" } - platforms { "linux-x86-null", "linux-x86-gl3", - "linux-amd64-null", "linux-amd64-gl3", - "linux-arm-null", "linux-arm-gl3", - "ps2" } - if _OPTIONS["gfxlib"] == "sdl2" then - includedirs { "/usr/include/SDL2" } - end - filter {} - - filter "configurations:Debug" - defines { "DEBUG" } - symbols "On" - filter "configurations:Release*" - defines { "NDEBUG" } - optimize "On" - filter "configurations:ReleaseStatic" - flags { "StaticRuntime" } - - filter { "platforms:*null" } - defines { "RW_NULL" } - filter { "platforms:*gl3" } - defines { "RW_GL3" } - if _OPTIONS["gfxlib"] == "sdl2" then - defines { "LIBRW_SDL2" } - end - filter { "platforms:*d3d9" } - defines { "RW_D3D9" } - filter { "platforms:ps2" } - defines { "RW_PS2" } - toolset "gcc" - gccprefix 'ee-' - buildoptions { "-nostdlib", "-fno-common" } - includedirs { "$(PS2SDK)/ee/include", "$(PS2SDK)/common/include" } - optimize "Off" - - filter { "platforms:*amd64*" } - architecture "x86_64" - filter { "platforms:*x86*" } - architecture "x86" - filter { "platforms:*arm*" } - architecture "ARM" - - filter { "platforms:win*" } - system "windows" - filter { "platforms:linux*" } - system "linux" - - filter { "platforms:win*gl3" } - includedirs { path.join(_OPTIONS["sdl2dir"], "include") } - filter { "platforms:win-x86-gl3" } - includedirs { path.join(_OPTIONS["glfwdir32"], "include") } - filter { "platforms:win-amd64-gl3" } - includedirs { path.join(_OPTIONS["glfwdir64"], "include") } - - filter "action:vs*" - buildoptions { "/wd4996", "/wd4244" } - - filter { "platforms:win*gl3", "action:not vs*" } - if _OPTIONS["gfxlib"] == "sdl2" then - includedirs { "/mingw/include/SDL2" } -- TODO: Detect this properly - end - - filter {} - - Libdir = "lib/%{cfg.platform}/%{cfg.buildcfg}" - Bindir = "bin/%{cfg.platform}/%{cfg.buildcfg}" - -project "librw" - kind "StaticLib" - targetname "rw" - targetdir (Libdir) - defines { "LODEPNG_NO_COMPILE_CPP" } - files { "src/*.*" } - files { "src/*/*.*" } - filter { "platforms:*gl3" } - files { "src/gl/glad/*.*" } - -project "dumprwtree" - kind "ConsoleApp" - targetdir (Bindir) - removeplatforms { "*gl3", "*d3d9", "ps2" } - files { "tools/dumprwtree/*" } - includedirs { "." } - libdirs { Libdir } - links { "librw" } - -function findlibs() - filter { "platforms:linux*gl3" } - links { "GL" } - if _OPTIONS["gfxlib"] == "glfw" then - links { "glfw" } - else - links { "SDL2" } - end - filter { "platforms:win-amd64-gl3" } - libdirs { path.join(_OPTIONS["glfwdir64"], "lib-vc2015") } - libdirs { path.join(_OPTIONS["sdl2dir"], "lib/x64") } - filter { "platforms:win-x86-gl3" } - libdirs { path.join(_OPTIONS["glfwdir32"], "lib-vc2015") } - libdirs { path.join(_OPTIONS["sdl2dir"], "lib/x86") } - filter { "platforms:win*gl3" } - links { "opengl32" } - if _OPTIONS["gfxlib"] == "glfw" then - links { "glfw3" } - else - links { "SDL2" } - end - filter { "platforms:*d3d9" } - links { "gdi32", "d3d9" } - filter { "platforms:*d3d9", "action:vs*" } - links { "Xinput9_1_0" } - filter {} -end - -function skeleton() - files { "skeleton/*.cpp", "skeleton/*.h" } - files { "skeleton/imgui/*.cpp", "skeleton/imgui/*.h" } - includedirs { "skeleton" } -end - -function skeltool(dir) - targetdir (Bindir) - files { path.join("tools", dir, "*.cpp"), - path.join("tools", dir, "*.h") } - vpaths { - {["src"] = { path.join("tools", dir, "*") }}, - {["skeleton"] = { "skeleton/*" }}, - } - skeleton() - debugdir ( path.join("tools", dir) ) - includedirs { "." } - libdirs { Libdir } - links { "librw" } - findlibs() -end - -function vucode() - filter "files:**.dsm" - buildcommands { - 'cpp "%{file.relpath}" | dvp-as -o "%{cfg.objdir}/%{file.basename}.o"' - } - buildoutputs { '%{cfg.objdir}/%{file.basename}.o' } - filter {} -end - -project "playground" - kind "WindowedApp" - characterset ("MBCS") - skeltool("playground") - flags { "WinMain" } - removeplatforms { "*null" } - removeplatforms { "ps2" } -- for now - -project "imguitest" - kind "WindowedApp" - characterset ("MBCS") - skeltool("imguitest") - flags { "WinMain" } - removeplatforms { "*null" } - removeplatforms { "ps2" } - -project "lights" - kind "WindowedApp" - characterset ("MBCS") - skeltool("lights") - flags { "WinMain" } - removeplatforms { "*null" } - removeplatforms { "ps2" } - -project "ska2anm" - kind "ConsoleApp" - characterset ("MBCS") - targetdir (Bindir) - files { path.join("tools/ska2anm", "*.cpp"), - path.join("tools/ska2anm", "*.h") } - debugdir ( path.join("tools/ska2nm") ) - includedirs { "." } - libdirs { Libdir } - links { "librw" } - findlibs() - removeplatforms { "*gl3", "*d3d9", "*ps2" } - -project "ps2test" - kind "ConsoleApp" - targetdir (Bindir) - vucode() - removeplatforms { "*gl3", "*d3d9", "*null" } - targetextension '.elf' - includedirs { "." } - files { "tools/ps2test/*.cpp", - "tools/ps2test/vu/*.dsm", - "tools/ps2test/*.h" } - libdirs { "$(PS2SDK)/ee/lib" } - links { "librw" } - ---project "ps2rastertest" --- kind "ConsoleApp" --- targetdir (Bindir) --- removeplatforms { "*gl3", "*d3d9" } --- files { "tools/ps2rastertest/*.cpp" } --- includedirs { "." } --- libdirs { Libdir } --- links { "librw" } diff --git a/vendor/librw/rw.h b/vendor/librw/rw.h deleted file mode 100644 index fb9829f..0000000 --- a/vendor/librw/rw.h +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include - -#include "src/rwbase.h" -#include "src/rwerror.h" -#include "src/rwplg.h" -#include "src/rwrender.h" -#include "src/rwengine.h" -#include "src/rwpipeline.h" -#include "src/rwobjects.h" -#include "src/rwanim.h" -#include "src/rwplugins.h" -#include "src/rwuserdata.h" -#include "src/rwcharset.h" -#include "src/ps2/rwps2.h" -#include "src/ps2/rwps2plg.h" -#include "src/d3d/rwxbox.h" -#include "src/d3d/rwd3d.h" -#include "src/d3d/rwd3d8.h" -#include "src/d3d/rwd3d9.h" -#include "src/gl/rwwdgl.h" -#include "src/gl/rwgl3.h" -#include "src/gl/rwgl3shader.h" -#include "src/gl/rwgl3plg.h" diff --git a/vendor/librw/skeleton/CMakeLists.txt b/vendor/librw/skeleton/CMakeLists.txt deleted file mode 100644 index 98970bc..0000000 --- a/vendor/librw/skeleton/CMakeLists.txt +++ /dev/null @@ -1,47 +0,0 @@ -add_library(librw_skeleton - glfw.cpp - sdl2.cpp - skeleton.cpp - skeleton.h - win.cpp -) - -set_target_properties(librw_skeleton - PROPERTIES - PREFIX "" -) - -target_link_libraries(librw_skeleton - PUBLIC - librw -) - -target_include_directories(librw_skeleton - INTERFACE - $ -) - -if(NOT LIBRW_PLATFORM_PS2 AND NOT LIBRW_PLATFORM_NULL) - add_subdirectory(imgui) -endif() - -if(LIBRW_INSTALL) - target_include_directories(librw_skeleton - INTERFACE - $ - ) - - install( - FILES - skeleton.h - DESTINATION "${LIBRW_INSTALL_INCLUDEDIR}/skeleton" - ) - - install( - TARGETS librw_skeleton - EXPORT librw-targets - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ) -endif() diff --git a/vendor/librw/skeleton/glfw.cpp b/vendor/librw/skeleton/glfw.cpp deleted file mode 100644 index 23832c0..0000000 --- a/vendor/librw/skeleton/glfw.cpp +++ /dev/null @@ -1,262 +0,0 @@ -#ifndef LIBRW_SDL2 - -#include -#include "skeleton.h" - -using namespace sk; -using namespace rw; - -#ifdef RW_OPENGL - -GLFWwindow *window; -int keymap[GLFW_KEY_LAST+1]; - -static void -initkeymap(void) -{ - int i; - for(i = 0; i < GLFW_KEY_LAST+1; i++) - keymap[i] = KEY_NULL; - keymap[GLFW_KEY_SPACE] = ' '; - keymap[GLFW_KEY_APOSTROPHE] = '\''; - keymap[GLFW_KEY_COMMA] = ','; - keymap[GLFW_KEY_MINUS] = '-'; - keymap[GLFW_KEY_PERIOD] = '.'; - keymap[GLFW_KEY_SLASH] = '/'; - keymap[GLFW_KEY_0] = '0'; - keymap[GLFW_KEY_1] = '1'; - keymap[GLFW_KEY_2] = '2'; - keymap[GLFW_KEY_3] = '3'; - keymap[GLFW_KEY_4] = '4'; - keymap[GLFW_KEY_5] = '5'; - keymap[GLFW_KEY_6] = '6'; - keymap[GLFW_KEY_7] = '7'; - keymap[GLFW_KEY_8] = '8'; - keymap[GLFW_KEY_9] = '9'; - keymap[GLFW_KEY_SEMICOLON] = ';'; - keymap[GLFW_KEY_EQUAL] = '='; - keymap[GLFW_KEY_A] = 'A'; - keymap[GLFW_KEY_B] = 'B'; - keymap[GLFW_KEY_C] = 'C'; - keymap[GLFW_KEY_D] = 'D'; - keymap[GLFW_KEY_E] = 'E'; - keymap[GLFW_KEY_F] = 'F'; - keymap[GLFW_KEY_G] = 'G'; - keymap[GLFW_KEY_H] = 'H'; - keymap[GLFW_KEY_I] = 'I'; - keymap[GLFW_KEY_J] = 'J'; - keymap[GLFW_KEY_K] = 'K'; - keymap[GLFW_KEY_L] = 'L'; - keymap[GLFW_KEY_M] = 'M'; - keymap[GLFW_KEY_N] = 'N'; - keymap[GLFW_KEY_O] = 'O'; - keymap[GLFW_KEY_P] = 'P'; - keymap[GLFW_KEY_Q] = 'Q'; - keymap[GLFW_KEY_R] = 'R'; - keymap[GLFW_KEY_S] = 'S'; - keymap[GLFW_KEY_T] = 'T'; - keymap[GLFW_KEY_U] = 'U'; - keymap[GLFW_KEY_V] = 'V'; - keymap[GLFW_KEY_W] = 'W'; - keymap[GLFW_KEY_X] = 'X'; - keymap[GLFW_KEY_Y] = 'Y'; - keymap[GLFW_KEY_Z] = 'Z'; - keymap[GLFW_KEY_LEFT_BRACKET] = '['; - keymap[GLFW_KEY_BACKSLASH] = '\\'; - keymap[GLFW_KEY_RIGHT_BRACKET] = ']'; - keymap[GLFW_KEY_GRAVE_ACCENT] = '`'; - keymap[GLFW_KEY_ESCAPE] = KEY_ESC; - keymap[GLFW_KEY_ENTER] = KEY_ENTER; - keymap[GLFW_KEY_TAB] = KEY_TAB; - keymap[GLFW_KEY_BACKSPACE] = KEY_BACKSP; - keymap[GLFW_KEY_INSERT] = KEY_INS; - keymap[GLFW_KEY_DELETE] = KEY_DEL; - keymap[GLFW_KEY_RIGHT] = KEY_RIGHT; - keymap[GLFW_KEY_LEFT] = KEY_LEFT; - keymap[GLFW_KEY_DOWN] = KEY_DOWN; - keymap[GLFW_KEY_UP] = KEY_UP; - keymap[GLFW_KEY_PAGE_UP] = KEY_PGUP; - keymap[GLFW_KEY_PAGE_DOWN] = KEY_PGDN; - keymap[GLFW_KEY_HOME] = KEY_HOME; - keymap[GLFW_KEY_END] = KEY_END; - keymap[GLFW_KEY_CAPS_LOCK] = KEY_CAPSLK; - keymap[GLFW_KEY_SCROLL_LOCK] = KEY_NULL; - keymap[GLFW_KEY_NUM_LOCK] = KEY_NULL; - keymap[GLFW_KEY_PRINT_SCREEN] = KEY_NULL; - keymap[GLFW_KEY_PAUSE] = KEY_NULL; - - keymap[GLFW_KEY_F1] = KEY_F1; - keymap[GLFW_KEY_F2] = KEY_F2; - keymap[GLFW_KEY_F3] = KEY_F3; - keymap[GLFW_KEY_F4] = KEY_F4; - keymap[GLFW_KEY_F5] = KEY_F5; - keymap[GLFW_KEY_F6] = KEY_F6; - keymap[GLFW_KEY_F7] = KEY_F7; - keymap[GLFW_KEY_F8] = KEY_F8; - keymap[GLFW_KEY_F9] = KEY_F9; - keymap[GLFW_KEY_F10] = KEY_F10; - keymap[GLFW_KEY_F11] = KEY_F11; - keymap[GLFW_KEY_F12] = KEY_F12; - keymap[GLFW_KEY_F13] = KEY_NULL; - keymap[GLFW_KEY_F14] = KEY_NULL; - keymap[GLFW_KEY_F15] = KEY_NULL; - keymap[GLFW_KEY_F16] = KEY_NULL; - keymap[GLFW_KEY_F17] = KEY_NULL; - keymap[GLFW_KEY_F18] = KEY_NULL; - keymap[GLFW_KEY_F19] = KEY_NULL; - keymap[GLFW_KEY_F20] = KEY_NULL; - keymap[GLFW_KEY_F21] = KEY_NULL; - keymap[GLFW_KEY_F22] = KEY_NULL; - keymap[GLFW_KEY_F23] = KEY_NULL; - keymap[GLFW_KEY_F24] = KEY_NULL; - keymap[GLFW_KEY_F25] = KEY_NULL; - keymap[GLFW_KEY_KP_0] = KEY_NULL; - keymap[GLFW_KEY_KP_1] = KEY_NULL; - keymap[GLFW_KEY_KP_2] = KEY_NULL; - keymap[GLFW_KEY_KP_3] = KEY_NULL; - keymap[GLFW_KEY_KP_4] = KEY_NULL; - keymap[GLFW_KEY_KP_5] = KEY_NULL; - keymap[GLFW_KEY_KP_6] = KEY_NULL; - keymap[GLFW_KEY_KP_7] = KEY_NULL; - keymap[GLFW_KEY_KP_8] = KEY_NULL; - keymap[GLFW_KEY_KP_9] = KEY_NULL; - keymap[GLFW_KEY_KP_DECIMAL] = KEY_NULL; - keymap[GLFW_KEY_KP_DIVIDE] = KEY_NULL; - keymap[GLFW_KEY_KP_MULTIPLY] = KEY_NULL; - keymap[GLFW_KEY_KP_SUBTRACT] = KEY_NULL; - keymap[GLFW_KEY_KP_ADD] = KEY_NULL; - keymap[GLFW_KEY_KP_ENTER] = KEY_NULL; - keymap[GLFW_KEY_KP_EQUAL] = KEY_NULL; - keymap[GLFW_KEY_LEFT_SHIFT] = KEY_LSHIFT; - keymap[GLFW_KEY_LEFT_CONTROL] = KEY_LCTRL; - keymap[GLFW_KEY_LEFT_ALT] = KEY_LALT; - keymap[GLFW_KEY_LEFT_SUPER] = KEY_NULL; - keymap[GLFW_KEY_RIGHT_SHIFT] = KEY_RSHIFT; - keymap[GLFW_KEY_RIGHT_CONTROL] = KEY_RCTRL; - keymap[GLFW_KEY_RIGHT_ALT] = KEY_RALT; - keymap[GLFW_KEY_RIGHT_SUPER] = KEY_NULL; - keymap[GLFW_KEY_MENU] = KEY_NULL; -} - -static void KeyUp(int key) { EventHandler(KEYUP, &key); } -static void KeyDown(int key) { EventHandler(KEYDOWN, &key); } - -static void -keypress(GLFWwindow *window, int key, int scancode, int action, int mods) -{ - if(key >= 0 && key <= GLFW_KEY_LAST){ - if(action == GLFW_RELEASE) KeyUp(keymap[key]); - else if(action == GLFW_PRESS) KeyDown(keymap[key]); - else if(action == GLFW_REPEAT) KeyDown(keymap[key]); - } -} - -static void -charinput(GLFWwindow *window, unsigned int c) -{ - EventHandler(CHARINPUT, (void*)(uintptr)c); -} - -static void -resize(GLFWwindow *window, int w, int h) -{ - rw::Rect r; - r.x = 0; - r.y = 0; - r.w = w; - r.h = h; - EventHandler(RESIZE, &r); -} - -static void -mousemove(GLFWwindow *window, double x, double y) -{ - sk::MouseState ms; - ms.posx = x; - ms.posy = y; - EventHandler(MOUSEMOVE, &ms); -} - -static void -mousebtn(GLFWwindow *window, int button, int action, int mods) -{ - static int buttons = 0; - sk::MouseState ms; - - switch(button){ - case GLFW_MOUSE_BUTTON_LEFT: - if(action == GLFW_PRESS) - buttons |= 1; - else - buttons &= ~1; - break; - case GLFW_MOUSE_BUTTON_MIDDLE: - if(action == GLFW_PRESS) - buttons |= 2; - else - buttons &= ~2; - break; - case GLFW_MOUSE_BUTTON_RIGHT: - if(action == GLFW_PRESS) - buttons |= 4; - else - buttons &= ~4; - break; - } - - ms.buttons = buttons; - EventHandler(MOUSEBTN, &ms); -} - -int -main(int argc, char *argv[]) -{ - args.argc = argc; - args.argv = argv; - - if(EventHandler(INITIALIZE, nil) == EVENTERROR) - return 0; - - engineOpenParams.width = sk::globals.width; - engineOpenParams.height = sk::globals.height; - engineOpenParams.windowtitle = sk::globals.windowtitle; - engineOpenParams.window = &window; - - if(EventHandler(RWINITIALIZE, nil) == EVENTERROR) - return 0; - - initkeymap(); - glfwSetKeyCallback(window, keypress); - glfwSetCharCallback(window, charinput); - glfwSetWindowSizeCallback(window, resize); - glfwSetCursorPosCallback(window, mousemove); - glfwSetMouseButtonCallback(window, mousebtn); - - float lastTime = glfwGetTime()*1000; - while(!sk::globals.quit && !glfwWindowShouldClose(window)){ - float currTime = glfwGetTime()*1000; - float timeDelta = (currTime - lastTime)*0.001f; - glfwPollEvents(); - - EventHandler(IDLE, &timeDelta); - - lastTime = currTime; - } - - EventHandler(RWTERMINATE, nil); - - return 0; -} - -namespace sk { - -void -SetMousePosition(int x, int y) -{ - glfwSetCursorPos(*engineOpenParams.window, (double)x, (double)y); -} - -} - -#endif -#endif diff --git a/vendor/librw/skeleton/imgui/CMakeLists.txt b/vendor/librw/skeleton/imgui/CMakeLists.txt deleted file mode 100644 index cb65dee..0000000 --- a/vendor/librw/skeleton/imgui/CMakeLists.txt +++ /dev/null @@ -1,46 +0,0 @@ -add_library(librw_skeleton_imgui - imconfig.h - imgui.cpp - imgui_demo.cpp - imgui_draw.cpp - imgui.h - imgui_impl_rw.cpp - imgui_impl_rw.h - imgui_internal.h - ImGuizmo.cpp - ImGuizmo.h - stb_rect_pack.h - stb_textedit.h - stb_truetype.h -) - -set_target_properties(librw_skeleton_imgui - PROPERTIES - PREFIX "" -) - -target_link_libraries(librw_skeleton_imgui - PUBLIC - librw_skeleton -) - -if(LIBRW_INSTALL) - install( - FILES - imconfig.h - imgui.h - imgui_impl_rw.h - imgui_internal.h - ImGuizmo.h - stb_textedit.h - DESTINATION "${LIBRW_INSTALL_INCLUDEDIR}/skeleton/imgui" - ) - - install( - TARGETS librw_skeleton_imgui - EXPORT librw-targets - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ) -endif() diff --git a/vendor/librw/skeleton/imgui/ImGuizmo.cpp b/vendor/librw/skeleton/imgui/ImGuizmo.cpp deleted file mode 100644 index 384e752..0000000 --- a/vendor/librw/skeleton/imgui/ImGuizmo.cpp +++ /dev/null @@ -1,1834 +0,0 @@ -// The MIT License(MIT) -// -// Copyright(c) 2016 Cedric Guillemet -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files(the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions : -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -#include "imgui.h" -#ifndef IMGUI_DEFINE_MATH_OPERATORS -#define IMGUI_DEFINE_MATH_OPERATORS -#endif -#include "imgui_internal.h" -#include "ImGuizmo.h" - -// includes patches for multiview from -// https://github.com/CedricGuillemet/ImGuizmo/issues/15 - -namespace ImGuizmo -{ - static const float ZPI = 3.14159265358979323846f; - static const float RAD2DEG = (180.f / ZPI); - static const float DEG2RAD = (ZPI / 180.f); - - const float screenRotateSize = 0.06f; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // utility and math - - void FPU_MatrixF_x_MatrixF(const float *a, const float *b, float *r) - { - r[0] = a[0] * b[0] + a[1] * b[4] + a[2] * b[8] + a[3] * b[12]; - r[1] = a[0] * b[1] + a[1] * b[5] + a[2] * b[9] + a[3] * b[13]; - r[2] = a[0] * b[2] + a[1] * b[6] + a[2] * b[10] + a[3] * b[14]; - r[3] = a[0] * b[3] + a[1] * b[7] + a[2] * b[11] + a[3] * b[15]; - - r[4] = a[4] * b[0] + a[5] * b[4] + a[6] * b[8] + a[7] * b[12]; - r[5] = a[4] * b[1] + a[5] * b[5] + a[6] * b[9] + a[7] * b[13]; - r[6] = a[4] * b[2] + a[5] * b[6] + a[6] * b[10] + a[7] * b[14]; - r[7] = a[4] * b[3] + a[5] * b[7] + a[6] * b[11] + a[7] * b[15]; - - r[8] = a[8] * b[0] + a[9] * b[4] + a[10] * b[8] + a[11] * b[12]; - r[9] = a[8] * b[1] + a[9] * b[5] + a[10] * b[9] + a[11] * b[13]; - r[10] = a[8] * b[2] + a[9] * b[6] + a[10] * b[10] + a[11] * b[14]; - r[11] = a[8] * b[3] + a[9] * b[7] + a[10] * b[11] + a[11] * b[15]; - - r[12] = a[12] * b[0] + a[13] * b[4] + a[14] * b[8] + a[15] * b[12]; - r[13] = a[12] * b[1] + a[13] * b[5] + a[14] * b[9] + a[15] * b[13]; - r[14] = a[12] * b[2] + a[13] * b[6] + a[14] * b[10] + a[15] * b[14]; - r[15] = a[12] * b[3] + a[13] * b[7] + a[14] * b[11] + a[15] * b[15]; - } - - //template T LERP(T x, T y, float z) { return (x + (y - x)*z); } - template T Clamp(T x, T y, T z) { return ((xz) ? z : x)); } - template T max(T x, T y) { return (x > y) ? x : y; } - template T min(T x, T y) { return (x < y) ? x : y; } - template bool IsWithin(T x, T y, T z) { return (x>=y) && (x<=z); } - - struct matrix_t; - struct vec_t - { - public: - float x, y, z, w; - - void Lerp(const vec_t& v, float t) - { - x += (v.x - x) * t; - y += (v.y - y) * t; - z += (v.z - z) * t; - w += (v.w - w) * t; - } - - void Set(float v) { x = y = z = w = v; } - void Set(float _x, float _y, float _z = 0.f, float _w = 0.f) { x = _x; y = _y; z = _z; w = _w; } - - vec_t& operator -= (const vec_t& v) { x -= v.x; y -= v.y; z -= v.z; w -= v.w; return *this; } - vec_t& operator += (const vec_t& v) { x += v.x; y += v.y; z += v.z; w += v.w; return *this; } - vec_t& operator *= (const vec_t& v) { x *= v.x; y *= v.y; z *= v.z; w *= v.w; return *this; } - vec_t& operator *= (float v) { x *= v; y *= v; z *= v; w *= v; return *this; } - - vec_t operator * (float f) const; - vec_t operator - () const; - vec_t operator - (const vec_t& v) const; - vec_t operator + (const vec_t& v) const; - vec_t operator * (const vec_t& v) const; - - const vec_t& operator + () const { return (*this); } - float Length() const { return sqrtf(x*x + y*y + z*z); }; - float LengthSq() const { return (x*x + y*y + z*z); }; - vec_t Normalize() { (*this) *= (1.f / Length()); return (*this); } - vec_t Normalize(const vec_t& v) { this->Set(v.x, v.y, v.z, v.w); this->Normalize(); return (*this); } - vec_t Abs() const; - void Cross(const vec_t& v) - { - vec_t res; - res.x = y * v.z - z * v.y; - res.y = z * v.x - x * v.z; - res.z = x * v.y - y * v.x; - - x = res.x; - y = res.y; - z = res.z; - w = 0.f; - } - void Cross(const vec_t& v1, const vec_t& v2) - { - x = v1.y * v2.z - v1.z * v2.y; - y = v1.z * v2.x - v1.x * v2.z; - z = v1.x * v2.y - v1.y * v2.x; - w = 0.f; - } - float Dot(const vec_t &v) const - { - return (x * v.x) + (y * v.y) + (z * v.z) + (w * v.w); - } - float Dot3(const vec_t &v) const - { - return (x * v.x) + (y * v.y) + (z * v.z); - } - - void Transform(const matrix_t& matrix); - void Transform(const vec_t & s, const matrix_t& matrix); - - void TransformVector(const matrix_t& matrix); - void TransformPoint(const matrix_t& matrix); - void TransformVector(const vec_t& v, const matrix_t& matrix) { (*this) = v; this->TransformVector(matrix); } - void TransformPoint(const vec_t& v, const matrix_t& matrix) { (*this) = v; this->TransformPoint(matrix); } - - float& operator [] (size_t index) { return ((float*)&x)[index]; } - const float& operator [] (size_t index) const { return ((float*)&x)[index]; } - }; - - vec_t makeVect(float _x, float _y, float _z = 0.f, float _w = 0.f) { vec_t res; res.x = _x; res.y = _y; res.z = _z; res.w = _w; return res; } - vec_t vec_t::operator * (float f) const { return makeVect(x * f, y * f, z * f, w *f); } - vec_t vec_t::operator - () const { return makeVect(-x, -y, -z, -w); } - vec_t vec_t::operator - (const vec_t& v) const { return makeVect(x - v.x, y - v.y, z - v.z, w - v.w); } - vec_t vec_t::operator + (const vec_t& v) const { return makeVect(x + v.x, y + v.y, z + v.z, w + v.w); } - vec_t vec_t::operator * (const vec_t& v) const { return makeVect(x * v.x, y * v.y, z * v.z, w * v.w); } - vec_t vec_t::Abs() const { return makeVect(fabsf(x), fabsf(y), fabsf(z)); } - - vec_t Normalized(const vec_t& v) { vec_t res; res = v; res.Normalize(); return res; } - vec_t Cross(const vec_t& v1, const vec_t& v2) - { - vec_t res; - res.x = v1.y * v2.z - v1.z * v2.y; - res.y = v1.z * v2.x - v1.x * v2.z; - res.z = v1.x * v2.y - v1.y * v2.x; - res.w = 0.f; - return res; - } - - float Dot(const vec_t &v1, const vec_t &v2) - { - return (v1.x * v2.x) + (v1.y * v2.y) + (v1.z * v2.z); - } - - vec_t BuildPlan(const vec_t & p_point1, const vec_t & p_normal) - { - vec_t normal, res; - normal.Normalize(p_normal); - res.w = normal.Dot(p_point1); - res.x = normal.x; - res.y = normal.y; - res.z = normal.z; - return res; - } - - struct matrix_t - { - public: - - union - { - float m[4][4]; - float m16[16]; - struct - { - vec_t right, up, dir, position; - } v; - vec_t component[4]; - }; - - matrix_t(const matrix_t& other) { memcpy(&m16[0], &other.m16[0], sizeof(float) * 16); } - matrix_t() {} - - operator float * () { return m16; } - operator const float* () const { return m16; } - void Translation(float _x, float _y, float _z) { this->Translation(makeVect(_x, _y, _z)); } - - void Translation(const vec_t& vt) - { - v.right.Set(1.f, 0.f, 0.f, 0.f); - v.up.Set(0.f, 1.f, 0.f, 0.f); - v.dir.Set(0.f, 0.f, 1.f, 0.f); - v.position.Set(vt.x, vt.y, vt.z, 1.f); - } - - void Scale(float _x, float _y, float _z) - { - v.right.Set(_x, 0.f, 0.f, 0.f); - v.up.Set(0.f, _y, 0.f, 0.f); - v.dir.Set(0.f, 0.f, _z, 0.f); - v.position.Set(0.f, 0.f, 0.f, 1.f); - } - void Scale(const vec_t& s) { Scale(s.x, s.y, s.z); } - - matrix_t& operator *= (const matrix_t& mat) - { - matrix_t tmpMat; - tmpMat = *this; - tmpMat.Multiply(mat); - *this = tmpMat; - return *this; - } - matrix_t operator * (const matrix_t& mat) const - { - matrix_t matT; - matT.Multiply(*this, mat); - return matT; - } - - void Multiply(const matrix_t &matrix) - { - matrix_t tmp; - tmp = *this; - - FPU_MatrixF_x_MatrixF((float*)&tmp, (float*)&matrix, (float*)this); - } - - void Multiply(const matrix_t &m1, const matrix_t &m2) - { - FPU_MatrixF_x_MatrixF((float*)&m1, (float*)&m2, (float*)this); - } - - float GetDeterminant() const - { - return m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0] + m[0][2] * m[1][0] * m[2][1] - - m[0][2] * m[1][1] * m[2][0] - m[0][1] * m[1][0] * m[2][2] - m[0][0] * m[1][2] * m[2][1]; - } - - float Inverse(const matrix_t &srcMatrix, bool affine = false); - void SetToIdentity() - { - v.right.Set(1.f, 0.f, 0.f, 0.f); - v.up.Set(0.f, 1.f, 0.f, 0.f); - v.dir.Set(0.f, 0.f, 1.f, 0.f); - v.position.Set(0.f, 0.f, 0.f, 1.f); - } - void Transpose() - { - matrix_t tmpm; - for (int l = 0; l < 4; l++) - { - for (int c = 0; c < 4; c++) - { - tmpm.m[l][c] = m[c][l]; - } - } - (*this) = tmpm; - } - - void RotationAxis(const vec_t & axis, float angle); - - void OrthoNormalize() - { - v.right.Normalize(); - v.up.Normalize(); - v.dir.Normalize(); - } - }; - - void vec_t::Transform(const matrix_t& matrix) - { - vec_t out; - - out.x = x * matrix.m[0][0] + y * matrix.m[1][0] + z * matrix.m[2][0] + w * matrix.m[3][0]; - out.y = x * matrix.m[0][1] + y * matrix.m[1][1] + z * matrix.m[2][1] + w * matrix.m[3][1]; - out.z = x * matrix.m[0][2] + y * matrix.m[1][2] + z * matrix.m[2][2] + w * matrix.m[3][2]; - out.w = x * matrix.m[0][3] + y * matrix.m[1][3] + z * matrix.m[2][3] + w * matrix.m[3][3]; - - x = out.x; - y = out.y; - z = out.z; - w = out.w; - } - - void vec_t::Transform(const vec_t & s, const matrix_t& matrix) - { - *this = s; - Transform(matrix); - } - - void vec_t::TransformPoint(const matrix_t& matrix) - { - vec_t out; - - out.x = x * matrix.m[0][0] + y * matrix.m[1][0] + z * matrix.m[2][0] + matrix.m[3][0]; - out.y = x * matrix.m[0][1] + y * matrix.m[1][1] + z * matrix.m[2][1] + matrix.m[3][1]; - out.z = x * matrix.m[0][2] + y * matrix.m[1][2] + z * matrix.m[2][2] + matrix.m[3][2]; - out.w = x * matrix.m[0][3] + y * matrix.m[1][3] + z * matrix.m[2][3] + matrix.m[3][3]; - - x = out.x; - y = out.y; - z = out.z; - w = out.w; - } - - - void vec_t::TransformVector(const matrix_t& matrix) - { - vec_t out; - - out.x = x * matrix.m[0][0] + y * matrix.m[1][0] + z * matrix.m[2][0]; - out.y = x * matrix.m[0][1] + y * matrix.m[1][1] + z * matrix.m[2][1]; - out.z = x * matrix.m[0][2] + y * matrix.m[1][2] + z * matrix.m[2][2]; - out.w = x * matrix.m[0][3] + y * matrix.m[1][3] + z * matrix.m[2][3]; - - x = out.x; - y = out.y; - z = out.z; - w = out.w; - } - - float matrix_t::Inverse(const matrix_t &srcMatrix, bool affine) - { - float det = 0; - - if (affine) - { - det = GetDeterminant(); - float s = 1 / det; - m[0][0] = (srcMatrix.m[1][1] * srcMatrix.m[2][2] - srcMatrix.m[1][2] * srcMatrix.m[2][1]) * s; - m[0][1] = (srcMatrix.m[2][1] * srcMatrix.m[0][2] - srcMatrix.m[2][2] * srcMatrix.m[0][1]) * s; - m[0][2] = (srcMatrix.m[0][1] * srcMatrix.m[1][2] - srcMatrix.m[0][2] * srcMatrix.m[1][1]) * s; - m[1][0] = (srcMatrix.m[1][2] * srcMatrix.m[2][0] - srcMatrix.m[1][0] * srcMatrix.m[2][2]) * s; - m[1][1] = (srcMatrix.m[2][2] * srcMatrix.m[0][0] - srcMatrix.m[2][0] * srcMatrix.m[0][2]) * s; - m[1][2] = (srcMatrix.m[0][2] * srcMatrix.m[1][0] - srcMatrix.m[0][0] * srcMatrix.m[1][2]) * s; - m[2][0] = (srcMatrix.m[1][0] * srcMatrix.m[2][1] - srcMatrix.m[1][1] * srcMatrix.m[2][0]) * s; - m[2][1] = (srcMatrix.m[2][0] * srcMatrix.m[0][1] - srcMatrix.m[2][1] * srcMatrix.m[0][0]) * s; - m[2][2] = (srcMatrix.m[0][0] * srcMatrix.m[1][1] - srcMatrix.m[0][1] * srcMatrix.m[1][0]) * s; - m[3][0] = -(m[0][0] * srcMatrix.m[3][0] + m[1][0] * srcMatrix.m[3][1] + m[2][0] * srcMatrix.m[3][2]); - m[3][1] = -(m[0][1] * srcMatrix.m[3][0] + m[1][1] * srcMatrix.m[3][1] + m[2][1] * srcMatrix.m[3][2]); - m[3][2] = -(m[0][2] * srcMatrix.m[3][0] + m[1][2] * srcMatrix.m[3][1] + m[2][2] * srcMatrix.m[3][2]); - } - else - { - // transpose matrix - float src[16]; - for (int i = 0; i < 4; ++i) - { - src[i] = srcMatrix.m16[i * 4]; - src[i + 4] = srcMatrix.m16[i * 4 + 1]; - src[i + 8] = srcMatrix.m16[i * 4 + 2]; - src[i + 12] = srcMatrix.m16[i * 4 + 3]; - } - - // calculate pairs for first 8 elements (cofactors) - float tmp[12]; // temp array for pairs - tmp[0] = src[10] * src[15]; - tmp[1] = src[11] * src[14]; - tmp[2] = src[9] * src[15]; - tmp[3] = src[11] * src[13]; - tmp[4] = src[9] * src[14]; - tmp[5] = src[10] * src[13]; - tmp[6] = src[8] * src[15]; - tmp[7] = src[11] * src[12]; - tmp[8] = src[8] * src[14]; - tmp[9] = src[10] * src[12]; - tmp[10] = src[8] * src[13]; - tmp[11] = src[9] * src[12]; - - // calculate first 8 elements (cofactors) - m16[0] = (tmp[0] * src[5] + tmp[3] * src[6] + tmp[4] * src[7]) - (tmp[1] * src[5] + tmp[2] * src[6] + tmp[5] * src[7]); - m16[1] = (tmp[1] * src[4] + tmp[6] * src[6] + tmp[9] * src[7]) - (tmp[0] * src[4] + tmp[7] * src[6] + tmp[8] * src[7]); - m16[2] = (tmp[2] * src[4] + tmp[7] * src[5] + tmp[10] * src[7]) - (tmp[3] * src[4] + tmp[6] * src[5] + tmp[11] * src[7]); - m16[3] = (tmp[5] * src[4] + tmp[8] * src[5] + tmp[11] * src[6]) - (tmp[4] * src[4] + tmp[9] * src[5] + tmp[10] * src[6]); - m16[4] = (tmp[1] * src[1] + tmp[2] * src[2] + tmp[5] * src[3]) - (tmp[0] * src[1] + tmp[3] * src[2] + tmp[4] * src[3]); - m16[5] = (tmp[0] * src[0] + tmp[7] * src[2] + tmp[8] * src[3]) - (tmp[1] * src[0] + tmp[6] * src[2] + tmp[9] * src[3]); - m16[6] = (tmp[3] * src[0] + tmp[6] * src[1] + tmp[11] * src[3]) - (tmp[2] * src[0] + tmp[7] * src[1] + tmp[10] * src[3]); - m16[7] = (tmp[4] * src[0] + tmp[9] * src[1] + tmp[10] * src[2]) - (tmp[5] * src[0] + tmp[8] * src[1] + tmp[11] * src[2]); - - // calculate pairs for second 8 elements (cofactors) - tmp[0] = src[2] * src[7]; - tmp[1] = src[3] * src[6]; - tmp[2] = src[1] * src[7]; - tmp[3] = src[3] * src[5]; - tmp[4] = src[1] * src[6]; - tmp[5] = src[2] * src[5]; - tmp[6] = src[0] * src[7]; - tmp[7] = src[3] * src[4]; - tmp[8] = src[0] * src[6]; - tmp[9] = src[2] * src[4]; - tmp[10] = src[0] * src[5]; - tmp[11] = src[1] * src[4]; - - // calculate second 8 elements (cofactors) - m16[8] = (tmp[0] * src[13] + tmp[3] * src[14] + tmp[4] * src[15]) - (tmp[1] * src[13] + tmp[2] * src[14] + tmp[5] * src[15]); - m16[9] = (tmp[1] * src[12] + tmp[6] * src[14] + tmp[9] * src[15]) - (tmp[0] * src[12] + tmp[7] * src[14] + tmp[8] * src[15]); - m16[10] = (tmp[2] * src[12] + tmp[7] * src[13] + tmp[10] * src[15]) - (tmp[3] * src[12] + tmp[6] * src[13] + tmp[11] * src[15]); - m16[11] = (tmp[5] * src[12] + tmp[8] * src[13] + tmp[11] * src[14]) - (tmp[4] * src[12] + tmp[9] * src[13] + tmp[10] * src[14]); - m16[12] = (tmp[2] * src[10] + tmp[5] * src[11] + tmp[1] * src[9]) - (tmp[4] * src[11] + tmp[0] * src[9] + tmp[3] * src[10]); - m16[13] = (tmp[8] * src[11] + tmp[0] * src[8] + tmp[7] * src[10]) - (tmp[6] * src[10] + tmp[9] * src[11] + tmp[1] * src[8]); - m16[14] = (tmp[6] * src[9] + tmp[11] * src[11] + tmp[3] * src[8]) - (tmp[10] * src[11] + tmp[2] * src[8] + tmp[7] * src[9]); - m16[15] = (tmp[10] * src[10] + tmp[4] * src[8] + tmp[9] * src[9]) - (tmp[8] * src[9] + tmp[11] * src[10] + tmp[5] * src[8]); - - // calculate determinant - det = src[0] * m16[0] + src[1] * m16[1] + src[2] * m16[2] + src[3] * m16[3]; - - // calculate matrix inverse - float invdet = 1 / det; - for (int j = 0; j < 16; ++j) - { - m16[j] *= invdet; - } - } - - return det; - } - - void matrix_t::RotationAxis(const vec_t & axis, float angle) - { - float length2 = axis.LengthSq(); - if (length2 < FLT_EPSILON) - { - SetToIdentity(); - return; - } - - vec_t n = axis * (1.f / sqrtf(length2)); - float s = sinf(angle); - float c = cosf(angle); - float k = 1.f - c; - - float xx = n.x * n.x * k + c; - float yy = n.y * n.y * k + c; - float zz = n.z * n.z * k + c; - float xy = n.x * n.y * k; - float yz = n.y * n.z * k; - float zx = n.z * n.x * k; - float xs = n.x * s; - float ys = n.y * s; - float zs = n.z * s; - - m[0][0] = xx; - m[0][1] = xy + zs; - m[0][2] = zx - ys; - m[0][3] = 0.f; - m[1][0] = xy - zs; - m[1][1] = yy; - m[1][2] = yz + xs; - m[1][3] = 0.f; - m[2][0] = zx + ys; - m[2][1] = yz - xs; - m[2][2] = zz; - m[2][3] = 0.f; - m[3][0] = 0.f; - m[3][1] = 0.f; - m[3][2] = 0.f; - m[3][3] = 1.f; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // - - enum MOVETYPE - { - NONE, - MOVE_X, - MOVE_Y, - MOVE_Z, - MOVE_XY, - MOVE_XZ, - MOVE_YZ, - MOVE_SCREEN, - ROTATE_X, - ROTATE_Y, - ROTATE_Z, - ROTATE_SCREEN, - SCALE_X, - SCALE_Y, - SCALE_Z, - SCALE_XYZ, - BOUNDS - }; - - struct Context - { - Context() : mbUsing(false), mbEnable(true), mbUsingBounds(false) - { - } - - ImDrawList* mDrawList; - - MODE mMode; - matrix_t mViewMat; - matrix_t mProjectionMat; - matrix_t mModel; - matrix_t mModelInverse; - matrix_t mModelSource; - matrix_t mModelSourceInverse; - matrix_t mMVP; - matrix_t mViewProjection; - - vec_t mModelScaleOrigin; - vec_t mCameraEye; - vec_t mCameraRight; - vec_t mCameraDir; - vec_t mCameraUp; - vec_t mRayOrigin; - vec_t mRayVector; - - float mRadiusSquareCenter; - ImVec2 mScreenSquareCenter; - ImVec2 mScreenSquareMin; - ImVec2 mScreenSquareMax; - - float mScreenFactor; - vec_t mRelativeOrigin; - - bool mbUsing; - bool mbEnable; - - // translation - vec_t mTranslationPlan; - vec_t mTranslationPlanOrigin; - vec_t mMatrixOrigin; - - // rotation - vec_t mRotationVectorSource; - float mRotationAngle; - float mRotationAngleOrigin; - //vec_t mWorldToLocalAxis; - - // scale - vec_t mScale; - vec_t mScaleValueOrigin; - float mSaveMousePosx; - - // save axis factor when using gizmo - bool mBelowAxisLimit[3]; - bool mBelowPlaneLimit[3]; - float mAxisFactor[3]; - - // bounds stretching - vec_t mBoundsPivot; - vec_t mBoundsAnchor; - vec_t mBoundsPlan; - vec_t mBoundsLocalPivot; - int mBoundsBestAxis; - int mBoundsAxis[2]; - bool mbUsingBounds; - matrix_t mBoundsMatrix; - - // - int mCurrentOperation; - - float mX = 0.f; - float mY = 0.f; - float mWidth = 0.f; - float mHeight = 0.f; - float mXMax = 0.f; - float mYMax = 0.f; - }; - - static Context gContext; - - static const float angleLimit = 0.96f; - static const float planeLimit = 0.2f; - - static const vec_t directionUnary[3] = { makeVect(1.f, 0.f, 0.f), makeVect(0.f, 1.f, 0.f), makeVect(0.f, 0.f, 1.f) }; - static const ImU32 directionColor[3] = { 0xFF0000AA, 0xFF00AA00, 0xFFAA0000 }; - - // Alpha: 100%: FF, 87%: DE, 70%: B3, 54%: 8A, 50%: 80, 38%: 61, 12%: 1F - static const ImU32 planeBorderColor[3] = { 0xFFAA0000, 0xFF0000AA, 0xFF00AA00 }; - static const ImU32 planeColor[3] = { 0x610000AA, 0x6100AA00, 0x61AA0000 }; - static const ImU32 selectionColor = 0x8A1080FF; - static const ImU32 inactiveColor = 0x99999999; - static const ImU32 translationLineColor = 0xAAAAAAAA; - static const char *translationInfoMask[] = { "X : %5.3f", "Y : %5.3f", "Z : %5.3f", "X : %5.3f Y : %5.3f", "Y : %5.3f Z : %5.3f", "X : %5.3f Z : %5.3f", "X : %5.3f Y : %5.3f Z : %5.3f" }; - static const char *scaleInfoMask[] = { "X : %5.2f", "Y : %5.2f", "Z : %5.2f", "XYZ : %5.2f" }; - static const char *rotationInfoMask[] = { "X : %5.2f deg %5.2f rad", "Y : %5.2f deg %5.2f rad", "Z : %5.2f deg %5.2f rad", "Screen : %5.2f deg %5.2f rad" }; - static const int translationInfoIndex[] = { 0,0,0, 1,0,0, 2,0,0, 0,1,0, 1,2,0, 0,2,1, 0,1,2 }; - static const float quadMin = 0.5f; - static const float quadMax = 0.8f; - static const float quadUV[8] = { quadMin, quadMin, quadMin, quadMax, quadMax, quadMax, quadMax, quadMin }; - static const int halfCircleSegmentCount = 64; - static const float snapTension = 0.5f; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // - static int GetMoveType(vec_t *gizmoHitProportion); - static int GetRotateType(); - static int GetScaleType(); - - static ImVec2 worldToPos(const vec_t& worldPos, const matrix_t& mat) - { - vec_t trans; - trans.TransformPoint(worldPos, mat); - trans *= 0.5f / trans.w; - trans += makeVect(0.5f, 0.5f); - trans.y = 1.f - trans.y; - trans.x *= gContext.mWidth; - trans.y *= gContext.mHeight; - trans.x += gContext.mX; - trans.y += gContext.mY; - return ImVec2(trans.x, trans.y); - } - - static void ComputeCameraRay(vec_t &rayOrigin, vec_t &rayDir) - { - ImGuiIO& io = ImGui::GetIO(); - - matrix_t mViewProjInverse; - mViewProjInverse.Inverse(gContext.mViewMat * gContext.mProjectionMat); - - float mox = ((io.MousePos.x - gContext.mX) / gContext.mWidth) * 2.f - 1.f; - float moy = (1.f - ((io.MousePos.y - gContext.mY) / gContext.mHeight)) * 2.f - 1.f; - - rayOrigin.Transform(makeVect(mox, moy, 0.f, 1.f), mViewProjInverse); - rayOrigin *= 1.f / rayOrigin.w; - vec_t rayEnd; - rayEnd.Transform(makeVect(mox, moy, 1.f, 1.f), mViewProjInverse); - rayEnd *= 1.f / rayEnd.w; - rayDir = Normalized(rayEnd - rayOrigin); - } - - static float IntersectRayPlane(const vec_t & rOrigin, const vec_t& rVector, const vec_t& plan) - { - float numer = plan.Dot3(rOrigin) - plan.w; - float denom = plan.Dot3(rVector); - - if (fabsf(denom) < FLT_EPSILON) // normal is orthogonal to vector, cant intersect - return -1.0f; - - return -(numer / denom); - } - - static bool IsInContextRect( ImVec2 p ) - { - return IsWithin( p.x, gContext.mX, gContext.mXMax ) && IsWithin(p.y, gContext.mY, gContext.mYMax ); - } - - void SetRect(float x, float y, float width, float height) - { - gContext.mX = x; - gContext.mY = y; - gContext.mWidth = width; - gContext.mHeight = height; - gContext.mXMax = gContext.mX + gContext.mWidth; - gContext.mYMax = gContext.mY + gContext.mXMax; - } - - void SetDrawlist() - { - gContext.mDrawList = ImGui::GetWindowDrawList(); - } - - void BeginFrame() - { - ImGuiIO& io = ImGui::GetIO(); - - const ImU32 flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoBringToFrontOnFocus; - ImGui::SetNextWindowSize(io.DisplaySize); - - ImGui::PushStyleColor(ImGuiCol_WindowBg, 0); - ImGui::Begin("gizmo", NULL, flags); - gContext.mDrawList = ImGui::GetWindowDrawList(); - ImGui::End(); - ImGui::PopStyleColor(); - } - - bool IsUsing() - { - return gContext.mbUsing||gContext.mbUsingBounds; - } - - bool IsOver() - { - return (GetMoveType(NULL) != NONE) || GetRotateType() != NONE || GetScaleType() != NONE || IsUsing(); - } - - void Enable(bool enable) - { - gContext.mbEnable = enable; - if (!enable) - { - gContext.mbUsing = false; - gContext.mbUsingBounds = false; - } - } - - static float GetUniform(const vec_t& position, const matrix_t& mat) - { - vec_t trf = makeVect(position.x, position.y, position.z, 1.f); - trf.Transform(mat); - return trf.w; - } - - static void ComputeContext(const float *view, const float *projection, float *matrix, MODE mode) - { - gContext.mMode = mode; - gContext.mViewMat = *(matrix_t*)view; - gContext.mProjectionMat = *(matrix_t*)projection; - - if (mode == LOCAL) - { - gContext.mModel = *(matrix_t*)matrix; - gContext.mModel.OrthoNormalize(); - } - else - { - gContext.mModel.Translation(((matrix_t*)matrix)->v.position); - } - gContext.mModelSource = *(matrix_t*)matrix; - gContext.mModelScaleOrigin.Set(gContext.mModelSource.v.right.Length(), gContext.mModelSource.v.up.Length(), gContext.mModelSource.v.dir.Length()); - - gContext.mModelInverse.Inverse(gContext.mModel); - gContext.mModelSourceInverse.Inverse(gContext.mModelSource); - gContext.mViewProjection = gContext.mViewMat * gContext.mProjectionMat; - gContext.mMVP = gContext.mModel * gContext.mViewProjection; - - matrix_t viewInverse; - viewInverse.Inverse(gContext.mViewMat); - gContext.mCameraDir = viewInverse.v.dir; - gContext.mCameraEye = viewInverse.v.position; - gContext.mCameraRight = viewInverse.v.right; - gContext.mCameraUp = viewInverse.v.up; - gContext.mScreenFactor = 0.1f * GetUniform(gContext.mModel.v.position, gContext.mViewProjection); - - ImVec2 centerSSpace = worldToPos(makeVect(0.f, 0.f), gContext.mMVP); - gContext.mScreenSquareCenter = centerSSpace; - gContext.mScreenSquareMin = ImVec2(centerSSpace.x - 10.f, centerSSpace.y - 10.f); - gContext.mScreenSquareMax = ImVec2(centerSSpace.x + 10.f, centerSSpace.y + 10.f); - - ComputeCameraRay(gContext.mRayOrigin, gContext.mRayVector); - } - - static void ComputeColors(ImU32 *colors, int type, OPERATION operation) - { - if (gContext.mbEnable) - { - switch (operation) - { - case TRANSLATE: - colors[0] = (type == MOVE_SCREEN) ? selectionColor : 0xFFFFFFFF; - for (int i = 0; i < 3; i++) - { - int colorPlaneIndex = (i + 2) % 3; - colors[i + 1] = (type == (int)(MOVE_X + i)) ? selectionColor : directionColor[i]; - colors[i + 4] = (type == (int)(MOVE_XY + i)) ? selectionColor : planeColor[colorPlaneIndex]; - colors[i + 4] = (type == MOVE_SCREEN) ? selectionColor : colors[i + 4]; - } - break; - case ROTATE: - colors[0] = (type == ROTATE_SCREEN) ? selectionColor : 0xFFFFFFFF; - for (int i = 0; i < 3; i++) - colors[i + 1] = (type == (int)(ROTATE_X + i)) ? selectionColor : directionColor[i]; - break; - case SCALE: - colors[0] = (type == SCALE_XYZ) ? selectionColor : 0xFFFFFFFF; - for (int i = 0; i < 3; i++) - colors[i + 1] = (type == (int)(SCALE_X + i)) ? selectionColor : directionColor[i]; - break; - } - } - else - { - for (int i = 0; i < 7; i++) - colors[i] = inactiveColor; - } - } - - static void ComputeTripodAxisAndVisibility(int axisIndex, vec_t& dirPlaneX, vec_t& dirPlaneY, bool& belowAxisLimit, bool& belowPlaneLimit) - { - const int planNormal = (axisIndex + 2) % 3; - dirPlaneX = directionUnary[axisIndex]; - dirPlaneY = directionUnary[(axisIndex + 1) % 3]; - - if (gContext.mbUsing) - { - // when using, use stored factors so the gizmo doesn't flip when we translate - belowAxisLimit = gContext.mBelowAxisLimit[axisIndex]; - belowPlaneLimit = gContext.mBelowPlaneLimit[axisIndex]; - - dirPlaneX *= gContext.mAxisFactor[axisIndex]; - dirPlaneY *= gContext.mAxisFactor[(axisIndex + 1) % 3]; - } - else - { - vec_t dirPlaneNormalWorld; - dirPlaneNormalWorld.TransformVector(directionUnary[planNormal], gContext.mModel); - dirPlaneNormalWorld.Normalize(); - - vec_t dirPlaneXWorld(dirPlaneX); - dirPlaneXWorld.TransformVector(gContext.mModel); - dirPlaneXWorld.Normalize(); - - vec_t dirPlaneYWorld(dirPlaneY); - dirPlaneYWorld.TransformVector(gContext.mModel); - dirPlaneYWorld.Normalize(); - - vec_t cameraEyeToGizmo = Normalized(gContext.mModel.v.position - gContext.mCameraEye); - float dotCameraDirX = cameraEyeToGizmo.Dot3(dirPlaneXWorld); - float dotCameraDirY = cameraEyeToGizmo.Dot3(dirPlaneYWorld); - - // compute factor values -#ifdef FLIP - float mulAxisX = (dotCameraDirX > 0.f) ? -1.f : 1.f; - float mulAxisY = (dotCameraDirY > 0.f) ? -1.f : 1.f; -#else - float mulAxisX = 1.f; - float mulAxisY = 1.f; -#endif - dirPlaneX *= mulAxisX; - dirPlaneY *= mulAxisY; - - belowAxisLimit = fabsf(dotCameraDirX) < angleLimit; - belowPlaneLimit = (fabsf(cameraEyeToGizmo.Dot3(dirPlaneNormalWorld)) > planeLimit); - - // and store values - gContext.mAxisFactor[axisIndex] = mulAxisX; - gContext.mAxisFactor[(axisIndex+1)%3] = mulAxisY; - gContext.mBelowAxisLimit[axisIndex] = belowAxisLimit; - gContext.mBelowPlaneLimit[axisIndex] = belowPlaneLimit; - } - } - - static void ComputeSnap(float*value, float snap) - { - if (snap <= FLT_EPSILON) - return; - float modulo = fmodf(*value, snap); - float moduloRatio = fabsf(modulo) / snap; - if (moduloRatio < snapTension) - *value -= modulo; - else if (moduloRatio >(1.f - snapTension)) - *value = *value - modulo + snap * ((*value<0.f) ? -1.f : 1.f); - } - static void ComputeSnap(vec_t& value, float *snap) - { - for (int i = 0; i < 3; i++) - { - ComputeSnap(&value[i], snap[i]); - } - } - - static float ComputeAngleOnPlan() - { - const float len = IntersectRayPlane(gContext.mRayOrigin, gContext.mRayVector, gContext.mTranslationPlan); - vec_t localPos = Normalized(gContext.mRayOrigin + gContext.mRayVector * len - gContext.mModel.v.position); - - vec_t perpendicularVector; - perpendicularVector.Cross(gContext.mRotationVectorSource, gContext.mTranslationPlan); - perpendicularVector.Normalize(); - float acosAngle = Clamp(Dot(localPos, gContext.mRotationVectorSource), -0.9999f, 0.9999f); - float angle = acosf(acosAngle); - angle *= (Dot(localPos, perpendicularVector) < 0.f) ? 1.f : -1.f; - return angle; - } - - static void DrawRotationGizmo(int type) - { - ImDrawList* drawList = gContext.mDrawList; - - // colors - ImU32 colors[7]; - ComputeColors(colors, type, ROTATE); - - vec_t cameraToModelNormalized = Normalized(gContext.mModel.v.position - gContext.mCameraEye); - cameraToModelNormalized.TransformVector(gContext.mModelInverse); - - gContext.mRadiusSquareCenter = screenRotateSize * gContext.mHeight; - for (int axis = 0; axis < 3; axis++) - { - ImVec2 circlePos[halfCircleSegmentCount]; - - float angleStart = atan2f(cameraToModelNormalized[(4-axis)%3], cameraToModelNormalized[(3 - axis) % 3]) + ZPI * 0.5f; - - for (unsigned int i = 0; i < halfCircleSegmentCount; i++) - { - float ng = angleStart + ZPI * ((float)i / (float)halfCircleSegmentCount); - vec_t axisPos = makeVect(cosf(ng), sinf(ng), 0.f); - vec_t pos = makeVect(axisPos[axis], axisPos[(axis+1)%3], axisPos[(axis+2)%3]) * gContext.mScreenFactor; - circlePos[i] = worldToPos(pos, gContext.mMVP); - } - - float radiusAxis = sqrtf( (ImLengthSqr(worldToPos(gContext.mModel.v.position, gContext.mViewProjection) - circlePos[0]) )); - if(radiusAxis > gContext.mRadiusSquareCenter) - gContext.mRadiusSquareCenter = radiusAxis; - - drawList->AddPolyline(circlePos, halfCircleSegmentCount, colors[3 - axis], false, 2); - } - drawList->AddCircle(worldToPos(gContext.mModel.v.position, gContext.mViewProjection), gContext.mRadiusSquareCenter, colors[0], 64, 3.f); - - if (gContext.mbUsing) - { - ImVec2 circlePos[halfCircleSegmentCount +1]; - - circlePos[0] = worldToPos(gContext.mModel.v.position, gContext.mViewProjection); - for (unsigned int i = 1; i < halfCircleSegmentCount; i++) - { - float ng = gContext.mRotationAngle * ((float)(i-1) / (float)(halfCircleSegmentCount -1)); - matrix_t rotateVectorMatrix; - rotateVectorMatrix.RotationAxis(gContext.mTranslationPlan, ng); - vec_t pos; - pos.TransformPoint(gContext.mRotationVectorSource, rotateVectorMatrix); - pos *= gContext.mScreenFactor; - circlePos[i] = worldToPos(pos + gContext.mModel.v.position, gContext.mViewProjection); - } - drawList->AddConvexPolyFilled(circlePos, halfCircleSegmentCount, 0x801080FF); - drawList->AddPolyline(circlePos, halfCircleSegmentCount, 0xFF1080FF, true, 2); - - ImVec2 destinationPosOnScreen = circlePos[1]; - char tmps[512]; - ImFormatString(tmps, sizeof(tmps), rotationInfoMask[type - ROTATE_X], (gContext.mRotationAngle/ZPI)*180.f, gContext.mRotationAngle); - drawList->AddText(ImVec2(destinationPosOnScreen.x + 15, destinationPosOnScreen.y + 15), 0xFF000000, tmps); - drawList->AddText(ImVec2(destinationPosOnScreen.x + 14, destinationPosOnScreen.y + 14), 0xFFFFFFFF, tmps); - } - } - - static void DrawHatchedAxis(const vec_t& axis) - { - for (int j = 1; j < 10; j++) - { - ImVec2 baseSSpace2 = worldToPos(axis * 0.05f * (float)(j * 2) * gContext.mScreenFactor, gContext.mMVP); - ImVec2 worldDirSSpace2 = worldToPos(axis * 0.05f * (float)(j * 2 + 1) * gContext.mScreenFactor, gContext.mMVP); - gContext.mDrawList->AddLine(baseSSpace2, worldDirSSpace2, 0x80000000, 6.f); - } - } - - static void DrawScaleGizmo(int type) - { - ImDrawList* drawList = gContext.mDrawList; - - // colors - ImU32 colors[7]; - ComputeColors(colors, type, SCALE); - - // draw - vec_t scaleDisplay = { 1.f, 1.f, 1.f, 1.f }; - - if (gContext.mbUsing) - scaleDisplay = gContext.mScale; - - for (unsigned int i = 0; i < 3; i++) - { - vec_t dirPlaneX, dirPlaneY; - bool belowAxisLimit, belowPlaneLimit; - ComputeTripodAxisAndVisibility(i, dirPlaneX, dirPlaneY, belowAxisLimit, belowPlaneLimit); - - // draw axis - if (belowAxisLimit) - { - ImVec2 baseSSpace = worldToPos(dirPlaneX * 0.1f * gContext.mScreenFactor, gContext.mMVP); - ImVec2 worldDirSSpaceNoScale = worldToPos(dirPlaneX * gContext.mScreenFactor, gContext.mMVP); - ImVec2 worldDirSSpace = worldToPos((dirPlaneX * scaleDisplay[i]) * gContext.mScreenFactor, gContext.mMVP); - - if (gContext.mbUsing) - { - drawList->AddLine(baseSSpace, worldDirSSpaceNoScale, 0xFF404040, 3.f); - drawList->AddCircleFilled(worldDirSSpaceNoScale, 6.f, 0xFF404040); - } - - drawList->AddLine(baseSSpace, worldDirSSpace, colors[i + 1], 3.f); - drawList->AddCircleFilled(worldDirSSpace, 6.f, colors[i + 1]); - -#ifdef HATCHED - if (gContext.mAxisFactor[i] < 0.f) - DrawHatchedAxis(dirPlaneX * scaleDisplay[i]); -#endif - } - } - - // draw screen cirle - drawList->AddCircleFilled(gContext.mScreenSquareCenter, 6.f, colors[0], 32); - - if (gContext.mbUsing) - { - //ImVec2 sourcePosOnScreen = worldToPos(gContext.mMatrixOrigin, gContext.mViewProjection); - ImVec2 destinationPosOnScreen = worldToPos(gContext.mModel.v.position, gContext.mViewProjection); - /*vec_t dif(destinationPosOnScreen.x - sourcePosOnScreen.x, destinationPosOnScreen.y - sourcePosOnScreen.y); - dif.Normalize(); - dif *= 5.f; - drawList->AddCircle(sourcePosOnScreen, 6.f, translationLineColor); - drawList->AddCircle(destinationPosOnScreen, 6.f, translationLineColor); - drawList->AddLine(ImVec2(sourcePosOnScreen.x + dif.x, sourcePosOnScreen.y + dif.y), ImVec2(destinationPosOnScreen.x - dif.x, destinationPosOnScreen.y - dif.y), translationLineColor, 2.f); - */ - char tmps[512]; - //vec_t deltaInfo = gContext.mModel.v.position - gContext.mMatrixOrigin; - int componentInfoIndex = (type - SCALE_X) * 3; - ImFormatString(tmps, sizeof(tmps), scaleInfoMask[type - SCALE_X], scaleDisplay[translationInfoIndex[componentInfoIndex]]); - drawList->AddText(ImVec2(destinationPosOnScreen.x + 15, destinationPosOnScreen.y + 15), 0xFF000000, tmps); - drawList->AddText(ImVec2(destinationPosOnScreen.x + 14, destinationPosOnScreen.y + 14), 0xFFFFFFFF, tmps); - } - } - - - static void DrawTranslationGizmo(int type) - { - ImDrawList* drawList = gContext.mDrawList; - if (!drawList) - return; - - // colors - ImU32 colors[7]; - ComputeColors(colors, type, TRANSLATE); - - const ImVec2 origin = worldToPos(gContext.mModel.v.position, gContext.mViewProjection); - - // draw - bool belowAxisLimit = false; - bool belowPlaneLimit = false; - for (unsigned int i = 0; i < 3; ++i) - { - vec_t dirPlaneX, dirPlaneY; - ComputeTripodAxisAndVisibility(i, dirPlaneX, dirPlaneY, belowAxisLimit, belowPlaneLimit); - - // draw axis - if (belowAxisLimit) - { - ImVec2 baseSSpace = worldToPos(dirPlaneX * 0.1f * gContext.mScreenFactor, gContext.mMVP); - ImVec2 worldDirSSpace = worldToPos(dirPlaneX * gContext.mScreenFactor, gContext.mMVP); - - drawList->AddLine(baseSSpace, worldDirSSpace, colors[i + 1], 3.f); - - // Arrow head begin - ImVec2 dir(origin - worldDirSSpace); - - float d = sqrtf(ImLengthSqr(dir)); - dir /= d; // Normalize - dir *= 6.0f; - - ImVec2 ortogonalDir(dir.y, -dir.x); // Perpendicular vector - ImVec2 a(worldDirSSpace + dir); - drawList->AddTriangleFilled(worldDirSSpace - dir, a + ortogonalDir, a - ortogonalDir, colors[i + 1]); - // Arrow head end - -#ifdef HATCHED - if (gContext.mAxisFactor[i] < 0.f) - DrawHatchedAxis(dirPlaneX); -#endif - } - - // draw plane - if (belowPlaneLimit) - { - ImVec2 screenQuadPts[4]; - for (int j = 0; j < 4; ++j) - { - vec_t cornerWorldPos = (dirPlaneX * quadUV[j * 2] + dirPlaneY * quadUV[j * 2 + 1]) * gContext.mScreenFactor; - screenQuadPts[j] = worldToPos(cornerWorldPos, gContext.mMVP); - } - drawList->AddPolyline(screenQuadPts, 4, planeBorderColor[i], true, 1.0f); - drawList->AddConvexPolyFilled(screenQuadPts, 4, colors[i + 4]); - } - } - - drawList->AddCircleFilled(gContext.mScreenSquareCenter, 6.f, colors[0], 32); - - if (gContext.mbUsing) - { - ImVec2 sourcePosOnScreen = worldToPos(gContext.mMatrixOrigin, gContext.mViewProjection); - ImVec2 destinationPosOnScreen = worldToPos(gContext.mModel.v.position, gContext.mViewProjection); - vec_t dif = { destinationPosOnScreen.x - sourcePosOnScreen.x, destinationPosOnScreen.y - sourcePosOnScreen.y, 0.f, 0.f }; - dif.Normalize(); - dif *= 5.f; - drawList->AddCircle(sourcePosOnScreen, 6.f, translationLineColor); - drawList->AddCircle(destinationPosOnScreen, 6.f, translationLineColor); - drawList->AddLine(ImVec2(sourcePosOnScreen.x + dif.x, sourcePosOnScreen.y + dif.y), ImVec2(destinationPosOnScreen.x - dif.x, destinationPosOnScreen.y - dif.y), translationLineColor, 2.f); - - char tmps[512]; - vec_t deltaInfo = gContext.mModel.v.position - gContext.mMatrixOrigin; - int componentInfoIndex = (type - MOVE_X) * 3; - ImFormatString(tmps, sizeof(tmps), translationInfoMask[type - MOVE_X], deltaInfo[translationInfoIndex[componentInfoIndex]], deltaInfo[translationInfoIndex[componentInfoIndex + 1]], deltaInfo[translationInfoIndex[componentInfoIndex + 2]]); - drawList->AddText(ImVec2(destinationPosOnScreen.x + 15, destinationPosOnScreen.y + 15), 0xFF000000, tmps); - drawList->AddText(ImVec2(destinationPosOnScreen.x + 14, destinationPosOnScreen.y + 14), 0xFFFFFFFF, tmps); - } - } - - static bool CanActivate() - { - if (ImGui::IsMouseClicked(0) && !ImGui::IsAnyItemHovered() && !ImGui::IsAnyItemActive()) - return true; - return false; - } - - static void HandleAndDrawLocalBounds(float *bounds, matrix_t *matrix, float *snapValues) - { - ImGuiIO& io = ImGui::GetIO(); - ImDrawList* drawList = gContext.mDrawList; - - // compute best projection axis - vec_t axesWorldDirections[3]; - vec_t bestAxisWorldDirection = { 0.0f, 0.0f, 0.0f, 0.0f }; - int axes[3]; - unsigned int numAxes = 1; - axes[0] = gContext.mBoundsBestAxis; - int bestAxis = axes[0]; - if (!gContext.mbUsingBounds) - { - numAxes = 0; - float bestDot = 0.f; - for (unsigned int i = 0; i < 3; i++) - { - vec_t dirPlaneNormalWorld; - dirPlaneNormalWorld.TransformVector(directionUnary[i], gContext.mModelSource); - dirPlaneNormalWorld.Normalize(); - - float dt = fabsf( Dot(Normalized(gContext.mCameraEye - gContext.mModelSource.v.position), dirPlaneNormalWorld) ); - if ( dt >= bestDot ) - { - bestDot = dt; - bestAxis = i; - bestAxisWorldDirection = dirPlaneNormalWorld; - } - - if( dt >= 0.1f ) - { - axes[numAxes] = i; - axesWorldDirections[numAxes] = dirPlaneNormalWorld; - ++numAxes; - } - } - } - - if( numAxes == 0 ) - { - axes[0] = bestAxis; - axesWorldDirections[0] = bestAxisWorldDirection; - numAxes = 1; - } - else if( bestAxis != axes[0] ) - { - unsigned int bestIndex = 0; - for (unsigned int i = 0; i < numAxes; i++) - { - if( axes[i] == bestAxis ) - { - bestIndex = i; - break; - } - } - int tempAxis = axes[0]; - axes[0] = axes[bestIndex]; - axes[bestIndex] = tempAxis; - vec_t tempDirection = axesWorldDirections[0]; - axesWorldDirections[0] = axesWorldDirections[bestIndex]; - axesWorldDirections[bestIndex] = tempDirection; - } - - for (unsigned int axisIndex = 0; axisIndex < numAxes; ++axisIndex) - { - bestAxis = axes[axisIndex]; - bestAxisWorldDirection = axesWorldDirections[axisIndex]; - - // corners - vec_t aabb[4]; - - int secondAxis = (bestAxis + 1) % 3; - int thirdAxis = (bestAxis + 2) % 3; - - for (int i = 0; i < 4; i++) - { - aabb[i][3] = aabb[i][bestAxis] = 0.f; - aabb[i][secondAxis] = bounds[secondAxis + 3 * (i >> 1)]; - aabb[i][thirdAxis] = bounds[thirdAxis + 3 * ((i >> 1) ^ (i & 1))]; - } - - // draw bounds - unsigned int anchorAlpha = gContext.mbEnable ? 0xFF000000 : 0x80000000; - - matrix_t boundsMVP = gContext.mModelSource * gContext.mViewProjection; - for (int i = 0; i < 4;i++) - { - ImVec2 worldBound1 = worldToPos(aabb[i], boundsMVP); - ImVec2 worldBound2 = worldToPos(aabb[(i+1)%4], boundsMVP); - if( !IsInContextRect( worldBound1 ) || !IsInContextRect( worldBound2 ) ) - { - continue; - } - float boundDistance = sqrtf(ImLengthSqr(worldBound1 - worldBound2)); - int stepCount = (int)(boundDistance / 10.f); - stepCount = min( stepCount, 1000 ); - float stepLength = 1.f / (float)stepCount; - for (int j = 0; j < stepCount; j++) - { - float t1 = (float)j * stepLength; - float t2 = (float)j * stepLength + stepLength * 0.5f; - ImVec2 worldBoundSS1 = ImLerp(worldBound1, worldBound2, ImVec2(t1, t1)); - ImVec2 worldBoundSS2 = ImLerp(worldBound1, worldBound2, ImVec2(t2, t2)); - drawList->AddLine(worldBoundSS1, worldBoundSS2, 0xAAAAAA + anchorAlpha, 3.f); - } - vec_t midPoint = (aabb[i] + aabb[(i + 1) % 4] ) * 0.5f; - ImVec2 midBound = worldToPos(midPoint, boundsMVP); - static const float AnchorBigRadius = 8.f; - static const float AnchorSmallRadius = 6.f; - bool overBigAnchor = ImLengthSqr(worldBound1 - io.MousePos) <= (AnchorBigRadius*AnchorBigRadius); - bool overSmallAnchor = ImLengthSqr(midBound - io.MousePos) <= (AnchorBigRadius*AnchorBigRadius); - - - unsigned int bigAnchorColor = overBigAnchor ? selectionColor : (0xAAAAAA + anchorAlpha); - unsigned int smallAnchorColor = overSmallAnchor ? selectionColor : (0xAAAAAA + anchorAlpha); - - drawList->AddCircleFilled(worldBound1, AnchorBigRadius, bigAnchorColor); - drawList->AddCircleFilled(midBound, AnchorSmallRadius, smallAnchorColor); - int oppositeIndex = (i + 2) % 4; - // big anchor on corners - if (!gContext.mbUsingBounds && gContext.mbEnable && overBigAnchor && CanActivate()) - { - gContext.mBoundsPivot.TransformPoint(aabb[(i + 2) % 4], gContext.mModelSource); - gContext.mBoundsAnchor.TransformPoint(aabb[i], gContext.mModelSource); - gContext.mBoundsPlan = BuildPlan(gContext.mBoundsAnchor, bestAxisWorldDirection); - gContext.mBoundsBestAxis = bestAxis; - gContext.mBoundsAxis[0] = secondAxis; - gContext.mBoundsAxis[1] = thirdAxis; - - gContext.mBoundsLocalPivot.Set(0.f); - gContext.mBoundsLocalPivot[secondAxis] = aabb[oppositeIndex][secondAxis]; - gContext.mBoundsLocalPivot[thirdAxis] = aabb[oppositeIndex][thirdAxis]; - - gContext.mbUsingBounds = true; - gContext.mBoundsMatrix = gContext.mModelSource; - } - // small anchor on middle of segment - if (!gContext.mbUsingBounds && gContext.mbEnable && overSmallAnchor && CanActivate()) - { - vec_t midPointOpposite = (aabb[(i + 2) % 4] + aabb[(i + 3) % 4]) * 0.5f; - gContext.mBoundsPivot.TransformPoint(midPointOpposite, gContext.mModelSource); - gContext.mBoundsAnchor.TransformPoint(midPoint, gContext.mModelSource); - gContext.mBoundsPlan = BuildPlan(gContext.mBoundsAnchor, bestAxisWorldDirection); - gContext.mBoundsBestAxis = bestAxis; - int indices[] = { secondAxis , thirdAxis }; - gContext.mBoundsAxis[0] = indices[i%2]; - gContext.mBoundsAxis[1] = -1; - - gContext.mBoundsLocalPivot.Set(0.f); - gContext.mBoundsLocalPivot[gContext.mBoundsAxis[0]] = aabb[oppositeIndex][indices[i % 2]];// bounds[gContext.mBoundsAxis[0]] * (((i + 1) & 2) ? 1.f : -1.f); - - gContext.mbUsingBounds = true; - gContext.mBoundsMatrix = gContext.mModelSource; - } - } - - if (gContext.mbUsingBounds) - { - matrix_t scale; - scale.SetToIdentity(); - - // compute projected mouse position on plan - const float len = IntersectRayPlane(gContext.mRayOrigin, gContext.mRayVector, gContext.mBoundsPlan); - vec_t newPos = gContext.mRayOrigin + gContext.mRayVector * len; - - // compute a reference and delta vectors base on mouse move - vec_t deltaVector = (newPos - gContext.mBoundsPivot).Abs(); - vec_t referenceVector = (gContext.mBoundsAnchor - gContext.mBoundsPivot).Abs(); - - // for 1 or 2 axes, compute a ratio that's used for scale and snap it based on resulting length - for (int i = 0; i < 2; i++) - { - int axisIndex1 = gContext.mBoundsAxis[i]; - if (axisIndex1 == -1) - continue; - - float ratioAxis = 1.f; - vec_t axisDir = gContext.mBoundsMatrix.component[axisIndex1].Abs(); - - float dtAxis = axisDir.Dot(referenceVector); - float boundSize = bounds[axisIndex1 + 3] - bounds[axisIndex1]; - if (dtAxis > FLT_EPSILON) - ratioAxis = axisDir.Dot(deltaVector) / dtAxis; - - if (snapValues) - { - float length = boundSize * ratioAxis; - ComputeSnap(&length, snapValues[axisIndex1]); - if (boundSize > FLT_EPSILON) - ratioAxis = length / boundSize; - } - scale.component[axisIndex1] *= ratioAxis; - } - - // transform matrix - matrix_t preScale, postScale; - preScale.Translation(-gContext.mBoundsLocalPivot); - postScale.Translation(gContext.mBoundsLocalPivot); - matrix_t res = preScale * scale * postScale * gContext.mBoundsMatrix; - *matrix = res; - - // info text - char tmps[512]; - ImVec2 destinationPosOnScreen = worldToPos(gContext.mModel.v.position, gContext.mViewProjection); - ImFormatString(tmps, sizeof(tmps), "X: %.2f Y: %.2f Z:%.2f" - , (bounds[3] - bounds[0]) * gContext.mBoundsMatrix.component[0].Length() * scale.component[0].Length() - , (bounds[4] - bounds[1]) * gContext.mBoundsMatrix.component[1].Length() * scale.component[1].Length() - , (bounds[5] - bounds[2]) * gContext.mBoundsMatrix.component[2].Length() * scale.component[2].Length() - ); - drawList->AddText(ImVec2(destinationPosOnScreen.x + 15, destinationPosOnScreen.y + 15), 0xFF000000, tmps); - drawList->AddText(ImVec2(destinationPosOnScreen.x + 14, destinationPosOnScreen.y + 14), 0xFFFFFFFF, tmps); - } - - if (!io.MouseDown[0]) - gContext.mbUsingBounds = false; - - if( gContext.mbUsingBounds ) - break; - } - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // - - static int GetScaleType() - { - ImGuiIO& io = ImGui::GetIO(); - int type = NONE; - - // screen - if (io.MousePos.x >= gContext.mScreenSquareMin.x && io.MousePos.x <= gContext.mScreenSquareMax.x && - io.MousePos.y >= gContext.mScreenSquareMin.y && io.MousePos.y <= gContext.mScreenSquareMax.y) - type = SCALE_XYZ; - - const vec_t direction[3] = { gContext.mModel.v.right, gContext.mModel.v.up, gContext.mModel.v.dir }; - // compute - for (unsigned int i = 0; i < 3 && type == NONE; i++) - { - vec_t dirPlaneX, dirPlaneY; - bool belowAxisLimit, belowPlaneLimit; - ComputeTripodAxisAndVisibility(i, dirPlaneX, dirPlaneY, belowAxisLimit, belowPlaneLimit); - dirPlaneX.TransformVector(gContext.mModel); - dirPlaneY.TransformVector(gContext.mModel); - - const int planNormal = (i + 2) % 3; - - const float len = IntersectRayPlane(gContext.mRayOrigin, gContext.mRayVector, BuildPlan(gContext.mModel.v.position, direction[planNormal])); - vec_t posOnPlan = gContext.mRayOrigin + gContext.mRayVector * len; - - const float dx = dirPlaneX.Dot3((posOnPlan - gContext.mModel.v.position) * (1.f / gContext.mScreenFactor)); - const float dy = dirPlaneY.Dot3((posOnPlan - gContext.mModel.v.position) * (1.f / gContext.mScreenFactor)); - if (belowAxisLimit && dy > -0.1f && dy < 0.1f && dx > 0.1f && dx < 1.f) - type = SCALE_X + i; - } - return type; - } - - static int GetRotateType() - { - ImGuiIO& io = ImGui::GetIO(); - int type = NONE; - - vec_t deltaScreen = { io.MousePos.x - gContext.mScreenSquareCenter.x, io.MousePos.y - gContext.mScreenSquareCenter.y, 0.f, 0.f }; - float dist = deltaScreen.Length(); - if (dist >= (gContext.mRadiusSquareCenter - 1.0f) && dist < (gContext.mRadiusSquareCenter + 1.0f)) - type = ROTATE_SCREEN; - - const vec_t planNormals[] = { gContext.mModel.v.right, gContext.mModel.v.up, gContext.mModel.v.dir}; - - for (unsigned int i = 0; i < 3 && type == NONE; i++) - { - // pickup plan - vec_t pickupPlan = BuildPlan(gContext.mModel.v.position, planNormals[i]); - - const float len = IntersectRayPlane(gContext.mRayOrigin, gContext.mRayVector, pickupPlan); - vec_t localPos = gContext.mRayOrigin + gContext.mRayVector * len - gContext.mModel.v.position; - - if (Dot(Normalized(localPos), gContext.mRayVector) > FLT_EPSILON) - continue; - - float distance = localPos.Length() / gContext.mScreenFactor; - if (distance > 0.9f && distance < 1.1f) - type = ROTATE_X + i; - } - - return type; - } - - static int GetMoveType(vec_t *gizmoHitProportion) - { - ImGuiIO& io = ImGui::GetIO(); - int type = NONE; - - // screen - if (io.MousePos.x >= gContext.mScreenSquareMin.x && io.MousePos.x <= gContext.mScreenSquareMax.x && - io.MousePos.y >= gContext.mScreenSquareMin.y && io.MousePos.y <= gContext.mScreenSquareMax.y) - type = MOVE_SCREEN; - - const vec_t direction[3] = { gContext.mModel.v.right, gContext.mModel.v.up, gContext.mModel.v.dir }; - - // compute - for (unsigned int i = 0; i < 3 && type == NONE; i++) - { - vec_t dirPlaneX, dirPlaneY; - bool belowAxisLimit, belowPlaneLimit; - ComputeTripodAxisAndVisibility(i, dirPlaneX, dirPlaneY, belowAxisLimit, belowPlaneLimit); - dirPlaneX.TransformVector(gContext.mModel); - dirPlaneY.TransformVector(gContext.mModel); - - const int planNormal = (i + 2) % 3; - - const float len = IntersectRayPlane(gContext.mRayOrigin, gContext.mRayVector, BuildPlan(gContext.mModel.v.position, direction[planNormal])); - vec_t posOnPlan = gContext.mRayOrigin + gContext.mRayVector * len; - - const float dx = dirPlaneX.Dot3((posOnPlan - gContext.mModel.v.position) * (1.f / gContext.mScreenFactor)); - const float dy = dirPlaneY.Dot3((posOnPlan - gContext.mModel.v.position) * (1.f / gContext.mScreenFactor)); - if (belowAxisLimit && dy > -0.1f && dy < 0.1f && dx > 0.1f && dx < 1.f) - type = MOVE_X + i; - - if (belowPlaneLimit && dx >= quadUV[0] && dx <= quadUV[4] && dy >= quadUV[1] && dy <= quadUV[3]) - type = MOVE_XY + i; - - if (gizmoHitProportion) - *gizmoHitProportion = makeVect(dx, dy, 0.f); - } - return type; - } - - static void HandleTranslation(float *matrix, float *deltaMatrix, int& type, float *snap) - { - ImGuiIO& io = ImGui::GetIO(); - bool applyRotationLocaly = gContext.mMode == LOCAL || type == MOVE_SCREEN; - - // move - if (gContext.mbUsing) - { - ImGui::CaptureMouseFromApp(); - const float len = IntersectRayPlane(gContext.mRayOrigin, gContext.mRayVector, gContext.mTranslationPlan); - vec_t newPos = gContext.mRayOrigin + gContext.mRayVector * len; - - // compute delta - vec_t newOrigin = newPos - gContext.mRelativeOrigin * gContext.mScreenFactor; - vec_t delta = newOrigin - gContext.mModel.v.position; - - // 1 axis constraint - if (gContext.mCurrentOperation >= MOVE_X && gContext.mCurrentOperation <= MOVE_Z) - { - int axisIndex = gContext.mCurrentOperation - MOVE_X; - const vec_t& axisValue = *(vec_t*)&gContext.mModel.m[axisIndex]; - float lengthOnAxis = Dot(axisValue, delta); - delta = axisValue * lengthOnAxis; - } - - // snap - if (snap) - { - vec_t cumulativeDelta = gContext.mModel.v.position + delta - gContext.mMatrixOrigin; - if (applyRotationLocaly) - { - matrix_t modelSourceNormalized = gContext.mModelSource; - modelSourceNormalized.OrthoNormalize(); - matrix_t modelSourceNormalizedInverse; - modelSourceNormalizedInverse.Inverse(modelSourceNormalized); - cumulativeDelta.TransformVector(modelSourceNormalizedInverse); - ComputeSnap(cumulativeDelta, snap); - cumulativeDelta.TransformVector(modelSourceNormalized); - } - else - { - ComputeSnap(cumulativeDelta, snap); - } - delta = gContext.mMatrixOrigin + cumulativeDelta - gContext.mModel.v.position; - - } - - // compute matrix & delta - matrix_t deltaMatrixTranslation; - deltaMatrixTranslation.Translation(delta); - if (deltaMatrix) - memcpy(deltaMatrix, deltaMatrixTranslation.m16, sizeof(float) * 16); - - - matrix_t res = gContext.mModelSource * deltaMatrixTranslation; - *(matrix_t*)matrix = res; - - if (!io.MouseDown[0]) - gContext.mbUsing = false; - - type = gContext.mCurrentOperation; - } - else - { - // find new possible way to move - vec_t gizmoHitProportion; - type = GetMoveType(&gizmoHitProportion); - if (CanActivate() && type != NONE) - { - ImGui::CaptureMouseFromApp(); - gContext.mbUsing = true; - gContext.mCurrentOperation = type; - const vec_t movePlanNormal[] = { gContext.mModel.v.up, gContext.mModel.v.dir, gContext.mModel.v.right, gContext.mModel.v.dir, gContext.mModel.v.right, gContext.mModel.v.up, -gContext.mCameraDir }; - // pickup plan - gContext.mTranslationPlan = BuildPlan(gContext.mModel.v.position, movePlanNormal[type - MOVE_X]); - const float len = IntersectRayPlane(gContext.mRayOrigin, gContext.mRayVector, gContext.mTranslationPlan); - gContext.mTranslationPlanOrigin = gContext.mRayOrigin + gContext.mRayVector * len; - gContext.mMatrixOrigin = gContext.mModel.v.position; - - gContext.mRelativeOrigin = (gContext.mTranslationPlanOrigin - gContext.mModel.v.position) * (1.f / gContext.mScreenFactor); - } - } - } - - static void HandleScale(float *matrix, float *deltaMatrix, int& type, float *snap) - { - ImGuiIO& io = ImGui::GetIO(); - - if (!gContext.mbUsing) - { - // find new possible way to scale - type = GetScaleType(); - if (CanActivate() && type != NONE) - { - ImGui::CaptureMouseFromApp(); - gContext.mbUsing = true; - gContext.mCurrentOperation = type; - const vec_t movePlanNormal[] = { gContext.mModel.v.up, gContext.mModel.v.dir, gContext.mModel.v.right, gContext.mModel.v.dir, gContext.mModel.v.up, gContext.mModel.v.right, -gContext.mCameraDir }; - // pickup plan - - gContext.mTranslationPlan = BuildPlan(gContext.mModel.v.position, movePlanNormal[type - SCALE_X]); - const float len = IntersectRayPlane(gContext.mRayOrigin, gContext.mRayVector, gContext.mTranslationPlan); - gContext.mTranslationPlanOrigin = gContext.mRayOrigin + gContext.mRayVector * len; - gContext.mMatrixOrigin = gContext.mModel.v.position; - gContext.mScale.Set(1.f, 1.f, 1.f); - gContext.mRelativeOrigin = (gContext.mTranslationPlanOrigin - gContext.mModel.v.position) * (1.f / gContext.mScreenFactor); - gContext.mScaleValueOrigin = makeVect(gContext.mModelSource.v.right.Length(), gContext.mModelSource.v.up.Length(), gContext.mModelSource.v.dir.Length()); - gContext.mSaveMousePosx = io.MousePos.x; - } - } - // scale - if (gContext.mbUsing) - { - ImGui::CaptureMouseFromApp(); - const float len = IntersectRayPlane(gContext.mRayOrigin, gContext.mRayVector, gContext.mTranslationPlan); - vec_t newPos = gContext.mRayOrigin + gContext.mRayVector * len; - vec_t newOrigin = newPos - gContext.mRelativeOrigin * gContext.mScreenFactor; - vec_t delta = newOrigin - gContext.mModel.v.position; - - // 1 axis constraint - if (gContext.mCurrentOperation >= SCALE_X && gContext.mCurrentOperation <= SCALE_Z) - { - int axisIndex = gContext.mCurrentOperation - SCALE_X; - const vec_t& axisValue = *(vec_t*)&gContext.mModel.m[axisIndex]; - float lengthOnAxis = Dot(axisValue, delta); - delta = axisValue * lengthOnAxis; - - vec_t baseVector = gContext.mTranslationPlanOrigin - gContext.mModel.v.position; - float ratio = Dot(axisValue, baseVector + delta) / Dot(axisValue, baseVector); - - gContext.mScale[axisIndex] = max(ratio, 0.001f); - } - else - { - float scaleDelta = (io.MousePos.x - gContext.mSaveMousePosx) * 0.01f; - gContext.mScale.Set(max(1.f + scaleDelta, 0.001f)); - } - - // snap - if (snap) - { - float scaleSnap[] = { snap[0], snap[0], snap[0] }; - ComputeSnap(gContext.mScale, scaleSnap); - } - - // no 0 allowed - for (int i = 0; i < 3;i++) - gContext.mScale[i] = max(gContext.mScale[i], 0.001f); - - // compute matrix & delta - matrix_t deltaMatrixScale; - deltaMatrixScale.Scale(gContext.mScale * gContext.mScaleValueOrigin); - - matrix_t res = deltaMatrixScale * gContext.mModel; - *(matrix_t*)matrix = res; - - if (deltaMatrix) - { - deltaMatrixScale.Scale(gContext.mScale); - memcpy(deltaMatrix, deltaMatrixScale.m16, sizeof(float) * 16); - } - - if (!io.MouseDown[0]) - gContext.mbUsing = false; - - type = gContext.mCurrentOperation; - } - } - - static void HandleRotation(float *matrix, float *deltaMatrix, int& type, float *snap) - { - ImGuiIO& io = ImGui::GetIO(); - bool applyRotationLocaly = gContext.mMode == LOCAL; - - if (!gContext.mbUsing) - { - type = GetRotateType(); - - if (type == ROTATE_SCREEN) - { - applyRotationLocaly = true; - } - - if (CanActivate() && type != NONE) - { - ImGui::CaptureMouseFromApp(); - gContext.mbUsing = true; - gContext.mCurrentOperation = type; - const vec_t rotatePlanNormal[] = { gContext.mModel.v.right, gContext.mModel.v.up, gContext.mModel.v.dir, -gContext.mCameraDir }; - // pickup plan - if (applyRotationLocaly) - { - gContext.mTranslationPlan = BuildPlan(gContext.mModel.v.position, rotatePlanNormal[type - ROTATE_X]); - } - else - { - gContext.mTranslationPlan = BuildPlan(gContext.mModelSource.v.position, directionUnary[type - ROTATE_X]); - } - - const float len = IntersectRayPlane(gContext.mRayOrigin, gContext.mRayVector, gContext.mTranslationPlan); - vec_t localPos = gContext.mRayOrigin + gContext.mRayVector * len - gContext.mModel.v.position; - gContext.mRotationVectorSource = Normalized(localPos); - gContext.mRotationAngleOrigin = ComputeAngleOnPlan(); - } - } - - // rotation - if (gContext.mbUsing) - { - ImGui::CaptureMouseFromApp(); - gContext.mRotationAngle = ComputeAngleOnPlan(); - if (snap) - { - float snapInRadian = snap[0] * DEG2RAD; - ComputeSnap(&gContext.mRotationAngle, snapInRadian); - } - vec_t rotationAxisLocalSpace; - - rotationAxisLocalSpace.TransformVector(makeVect(gContext.mTranslationPlan.x, gContext.mTranslationPlan.y, gContext.mTranslationPlan.z, 0.f), gContext.mModelInverse); - rotationAxisLocalSpace.Normalize(); - - matrix_t deltaRotation; - deltaRotation.RotationAxis(rotationAxisLocalSpace, gContext.mRotationAngle - gContext.mRotationAngleOrigin); - gContext.mRotationAngleOrigin = gContext.mRotationAngle; - - matrix_t scaleOrigin; - scaleOrigin.Scale(gContext.mModelScaleOrigin); - - if (applyRotationLocaly) - { - *(matrix_t*)matrix = scaleOrigin * deltaRotation * gContext.mModel; - } - else - { - matrix_t res = gContext.mModelSource; - res.v.position.Set(0.f); - - *(matrix_t*)matrix = res * deltaRotation; - ((matrix_t*)matrix)->v.position = gContext.mModelSource.v.position; - } - - if (deltaMatrix) - { - *(matrix_t*)deltaMatrix = gContext.mModelInverse * deltaRotation * gContext.mModel; - } - - if (!io.MouseDown[0]) - gContext.mbUsing = false; - - type = gContext.mCurrentOperation; - } - } - - void DecomposeMatrixToComponents(const float *matrix, float *translation, float *rotation, float *scale) - { - matrix_t mat = *(matrix_t*)matrix; - - scale[0] = mat.v.right.Length(); - scale[1] = mat.v.up.Length(); - scale[2] = mat.v.dir.Length(); - - mat.OrthoNormalize(); - - rotation[0] = RAD2DEG * atan2f(mat.m[1][2], mat.m[2][2]); - rotation[1] = RAD2DEG * atan2f(-mat.m[0][2], sqrtf(mat.m[1][2] * mat.m[1][2] + mat.m[2][2]* mat.m[2][2])); - rotation[2] = RAD2DEG * atan2f(mat.m[0][1], mat.m[0][0]); - - translation[0] = mat.v.position.x; - translation[1] = mat.v.position.y; - translation[2] = mat.v.position.z; - } - - void RecomposeMatrixFromComponents(const float *translation, const float *rotation, const float *scale, float *matrix) - { - matrix_t& mat = *(matrix_t*)matrix; - - matrix_t rot[3]; - for (int i = 0; i < 3;i++) - rot[i].RotationAxis(directionUnary[i], rotation[i] * DEG2RAD); - - mat = rot[0] * rot[1] * rot[2]; - - float validScale[3]; - for (int i = 0; i < 3; i++) - { - if (fabsf(scale[i]) < FLT_EPSILON) - validScale[i] = 0.001f; - else - validScale[i] = scale[i]; - } - mat.v.right *= validScale[0]; - mat.v.up *= validScale[1]; - mat.v.dir *= validScale[2]; - mat.v.position.Set(translation[0], translation[1], translation[2], 1.f); - } - - void Manipulate(const float *view, const float *projection, OPERATION operation, MODE mode, float *matrix, float *deltaMatrix, float *snap, float *localBounds, float *boundsSnap) - { - ComputeContext(view, projection, matrix, mode); - - // set delta to identity - if (deltaMatrix) - ((matrix_t*)deltaMatrix)->SetToIdentity(); - - // behind camera - vec_t camSpacePosition; - camSpacePosition.TransformPoint(makeVect(0.f, 0.f, 0.f), gContext.mMVP); - if (camSpacePosition.z < 0.001f) - return; - - // -- - int type = NONE; - if (gContext.mbEnable) - { - if (!gContext.mbUsingBounds) - { - switch (operation) - { - case ROTATE: - HandleRotation(matrix, deltaMatrix, type, snap); - break; - case TRANSLATE: - HandleTranslation(matrix, deltaMatrix, type, snap); - break; - case SCALE: - HandleScale(matrix, deltaMatrix, type, snap); - break; - } - } - } - - if (localBounds && !gContext.mbUsing) - HandleAndDrawLocalBounds(localBounds, (matrix_t*)matrix, boundsSnap); - - if (!gContext.mbUsingBounds) - { - switch (operation) - { - case ROTATE: - DrawRotationGizmo(type); - break; - case TRANSLATE: - DrawTranslationGizmo(type); - break; - case SCALE: - DrawScaleGizmo(type); - break; - } - } - } - - void DrawCube(const float *view, const float *projection, float *matrix) - { - matrix_t viewInverse; - viewInverse.Inverse(*(matrix_t*)view); - const matrix_t& model = *(matrix_t*)matrix; - matrix_t res = *(matrix_t*)matrix * *(matrix_t*)view * *(matrix_t*)projection; - - for (int iFace = 0; iFace < 6; iFace++) - { - const int normalIndex = (iFace % 3); - const int perpXIndex = (normalIndex + 1) % 3; - const int perpYIndex = (normalIndex + 2) % 3; - const float invert = (iFace > 2) ? -1.f : 1.f; - - const vec_t faceCoords[4] = { directionUnary[normalIndex] + directionUnary[perpXIndex] + directionUnary[perpYIndex], - directionUnary[normalIndex] + directionUnary[perpXIndex] - directionUnary[perpYIndex], - directionUnary[normalIndex] - directionUnary[perpXIndex] - directionUnary[perpYIndex], - directionUnary[normalIndex] - directionUnary[perpXIndex] + directionUnary[perpYIndex], - }; - - // clipping - bool skipFace = false; - for (unsigned int iCoord = 0; iCoord < 4; iCoord++) - { - vec_t camSpacePosition; - camSpacePosition.TransformPoint(faceCoords[iCoord] * 0.5f * invert, gContext.mMVP); - if (camSpacePosition.z < 0.001f) - { - skipFace = true; - break; - } - } - if (skipFace) - continue; - - // 3D->2D - ImVec2 faceCoordsScreen[4]; - for (unsigned int iCoord = 0; iCoord < 4; iCoord++) - faceCoordsScreen[iCoord] = worldToPos(faceCoords[iCoord] * 0.5f * invert, res); - - // back face culling - vec_t cullPos, cullNormal; - cullPos.TransformPoint(faceCoords[0] * 0.5f * invert, model); - cullNormal.TransformVector(directionUnary[normalIndex] * invert, model); - float dt = Dot(Normalized(cullPos - viewInverse.v.position), Normalized(cullNormal)); - if (dt>0.f) - continue; - - // draw face with lighter color - gContext.mDrawList->AddConvexPolyFilled(faceCoordsScreen, 4, directionColor[normalIndex] | 0x808080); - } - } -}; - diff --git a/vendor/librw/skeleton/imgui/ImGuizmo.h b/vendor/librw/skeleton/imgui/ImGuizmo.h deleted file mode 100644 index d0ec81e..0000000 --- a/vendor/librw/skeleton/imgui/ImGuizmo.h +++ /dev/null @@ -1,169 +0,0 @@ -// https://github.com/CedricGuillemet/ImGuizmo -// v 1.04 WIP -// -// The MIT License(MIT) -// -// Copyright(c) 2016 Cedric Guillemet -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files(the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions : -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// ------------------------------------------------------------------------------------------- -// History : -// 2016/09/11 Behind camera culling. Scaling Delta matrix not multiplied by source matrix scales. local/world rotation and translation fixed. Display message is incorrect (X: ... Y:...) in local mode. -// 2016/09/09 Hatched negative axis. Snapping. Documentation update. -// 2016/09/04 Axis switch and translation plan autohiding. Scale transform stability improved -// 2016/09/01 Mogwai changed to Manipulate. Draw debug cube. Fixed inverted scale. Mixing scale and translation/rotation gives bad results. -// 2016/08/31 First version -// -// ------------------------------------------------------------------------------------------- -// Future (no order): -// -// - Multi view -// - display rotation/translation/scale infos in local/world space and not only local -// - finish local/world matrix application -// - OPERATION as bitmask -// -// ------------------------------------------------------------------------------------------- -// Example -#if 0 -void EditTransform(const Camera& camera, matrix_t& matrix) -{ - static ImGuizmo::OPERATION mCurrentGizmoOperation(ImGuizmo::ROTATE); - static ImGuizmo::MODE mCurrentGizmoMode(ImGuizmo::WORLD); - if (ImGui::IsKeyPressed(90)) - mCurrentGizmoOperation = ImGuizmo::TRANSLATE; - if (ImGui::IsKeyPressed(69)) - mCurrentGizmoOperation = ImGuizmo::ROTATE; - if (ImGui::IsKeyPressed(82)) // r Key - mCurrentGizmoOperation = ImGuizmo::SCALE; - if (ImGui::RadioButton("Translate", mCurrentGizmoOperation == ImGuizmo::TRANSLATE)) - mCurrentGizmoOperation = ImGuizmo::TRANSLATE; - ImGui::SameLine(); - if (ImGui::RadioButton("Rotate", mCurrentGizmoOperation == ImGuizmo::ROTATE)) - mCurrentGizmoOperation = ImGuizmo::ROTATE; - ImGui::SameLine(); - if (ImGui::RadioButton("Scale", mCurrentGizmoOperation == ImGuizmo::SCALE)) - mCurrentGizmoOperation = ImGuizmo::SCALE; - float matrixTranslation[3], matrixRotation[3], matrixScale[3]; - ImGuizmo::DecomposeMatrixToComponents(matrix.m16, matrixTranslation, matrixRotation, matrixScale); - ImGui::InputFloat3("Tr", matrixTranslation, 3); - ImGui::InputFloat3("Rt", matrixRotation, 3); - ImGui::InputFloat3("Sc", matrixScale, 3); - ImGuizmo::RecomposeMatrixFromComponents(matrixTranslation, matrixRotation, matrixScale, matrix.m16); - - if (mCurrentGizmoOperation != ImGuizmo::SCALE) - { - if (ImGui::RadioButton("Local", mCurrentGizmoMode == ImGuizmo::LOCAL)) - mCurrentGizmoMode = ImGuizmo::LOCAL; - ImGui::SameLine(); - if (ImGui::RadioButton("World", mCurrentGizmoMode == ImGuizmo::WORLD)) - mCurrentGizmoMode = ImGuizmo::WORLD; - } - static bool useSnap(false); - if (ImGui::IsKeyPressed(83)) - useSnap = !useSnap; - ImGui::Checkbox("", &useSnap); - ImGui::SameLine(); - vec_t snap; - switch (mCurrentGizmoOperation) - { - case ImGuizmo::TRANSLATE: - snap = config.mSnapTranslation; - ImGui::InputFloat3("Snap", &snap.x); - break; - case ImGuizmo::ROTATE: - snap = config.mSnapRotation; - ImGui::InputFloat("Angle Snap", &snap.x); - break; - case ImGuizmo::SCALE: - snap = config.mSnapScale; - ImGui::InputFloat("Scale Snap", &snap.x); - break; - } - ImGuiIO& io = ImGui::GetIO(); - ImGuizmo::SetRect(0, 0, io.DisplaySize.x, io.DisplaySize.y); - ImGuizmo::Manipulate(camera.mView.m16, camera.mProjection.m16, mCurrentGizmoOperation, mCurrentGizmoMode, matrix.m16, NULL, useSnap ? &snap.x : NULL); -} -#endif -#pragma once - -#ifdef USE_IMGUI_API -#include "imconfig.h" -#endif -#ifndef IMGUI_API -#define IMGUI_API -#endif - -namespace ImGuizmo -{ - // call inside your own window and before Manipulate() in order to draw gizmo to that window. - IMGUI_API void SetDrawlist(); - - // call BeginFrame right after ImGui_XXXX_NewFrame(); - IMGUI_API void BeginFrame(); - - // return true if mouse cursor is over any gizmo control (axis, plan or screen component) - IMGUI_API bool IsOver(); - - // return true if mouse IsOver or if the gizmo is in moving state - IMGUI_API bool IsUsing(); - - // enable/disable the gizmo. Stay in the state until next call to Enable. - // gizmo is rendered with gray half transparent color when disabled - IMGUI_API void Enable(bool enable); - - // helper functions for manualy editing translation/rotation/scale with an input float - // translation, rotation and scale float points to 3 floats each - // Angles are in degrees (more suitable for human editing) - // example: - // float matrixTranslation[3], matrixRotation[3], matrixScale[3]; - // ImGuizmo::DecomposeMatrixToComponents(gizmoMatrix.m16, matrixTranslation, matrixRotation, matrixScale); - // ImGui::InputFloat3("Tr", matrixTranslation, 3); - // ImGui::InputFloat3("Rt", matrixRotation, 3); - // ImGui::InputFloat3("Sc", matrixScale, 3); - // ImGuizmo::RecomposeMatrixFromComponents(matrixTranslation, matrixRotation, matrixScale, gizmoMatrix.m16); - // - // These functions have some numerical stability issues for now. Use with caution. - IMGUI_API void DecomposeMatrixToComponents(const float *matrix, float *translation, float *rotation, float *scale); - IMGUI_API void RecomposeMatrixFromComponents(const float *translation, const float *rotation, const float *scale, float *matrix); - - IMGUI_API void SetRect(float x, float y, float width, float height); - - // Render a cube with face color corresponding to face normal. Usefull for debug/tests - IMGUI_API void DrawCube(const float *view, const float *projection, float *matrix); - - // call it when you want a gizmo - // Needs view and projection matrices. - // matrix parameter is the source matrix (where will be gizmo be drawn) and might be transformed by the function. Return deltaMatrix is optional - // translation is applied in world space - enum OPERATION - { - TRANSLATE, - ROTATE, - SCALE - }; - - enum MODE - { - LOCAL, - WORLD - }; - - IMGUI_API void Manipulate(const float *view, const float *projection, OPERATION operation, MODE mode, float *matrix, float *deltaMatrix = 0, float *snap = 0, float *localBounds = NULL, float *boundsSnap = NULL); -}; diff --git a/vendor/librw/skeleton/imgui/LICENSE_imgui.txt b/vendor/librw/skeleton/imgui/LICENSE_imgui.txt deleted file mode 100644 index 5a9b98b..0000000 --- a/vendor/librw/skeleton/imgui/LICENSE_imgui.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2017 Omar Cornut and ImGui contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/librw/skeleton/imgui/LICENSE_imguizmo.txt b/vendor/librw/skeleton/imgui/LICENSE_imguizmo.txt deleted file mode 100644 index dcbee45..0000000 --- a/vendor/librw/skeleton/imgui/LICENSE_imguizmo.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Cedric Guillemet - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/librw/skeleton/imgui/imconfig.h b/vendor/librw/skeleton/imgui/imconfig.h deleted file mode 100644 index 824a81a..0000000 --- a/vendor/librw/skeleton/imgui/imconfig.h +++ /dev/null @@ -1,61 +0,0 @@ -//----------------------------------------------------------------------------- -// USER IMPLEMENTATION -// This file contains compile-time options for ImGui. -// Other options (memory allocation overrides, callbacks, etc.) can be set at runtime via the ImGuiIO structure - ImGui::GetIO(). -//----------------------------------------------------------------------------- - -#pragma once - -//---- Define assertion handler. Defaults to calling assert(). -//#define IM_ASSERT(_EXPR) MyAssert(_EXPR) - -//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows. -//#define IMGUI_API __declspec( dllexport ) -//#define IMGUI_API __declspec( dllimport ) - -//---- Don't define obsolete functions names. Consider enabling from time to time or when updating to reduce like hood of using already obsolete function/names -//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS - -//---- Include imgui_user.h at the end of imgui.h -//#define IMGUI_INCLUDE_IMGUI_USER_H - -//---- Don't implement default handlers for Windows (so as not to link with OpenClipboard() and others Win32 functions) -//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS -//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS - -//---- Don't implement demo windows functionality (ShowDemoWindow()/ShowStyleEditor()/ShowUserGuide() methods will be empty) -//---- It is very strongly recommended to NOT disable the demo windows. Please read the comment at the top of imgui_demo.cpp to learn why. -//#define IMGUI_DISABLE_DEMO_WINDOWS - -//---- Don't implement ImFormatString(), ImFormatStringV() so you can reimplement them yourself. -//#define IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS - -//---- Pack colors to BGRA instead of RGBA (remove need to post process vertex buffer in back ends) -//#define IMGUI_USE_BGRA_PACKED_COLOR - -//---- Implement STB libraries in a namespace to avoid linkage conflicts -//#define IMGUI_STB_NAMESPACE ImGuiStb - -//---- Define constructor and implicit cast operators to convert back<>forth from your math types and ImVec2/ImVec4. -/* -#define IM_VEC2_CLASS_EXTRA \ - ImVec2(const MyVec2& f) { x = f.x; y = f.y; } \ - operator MyVec2() const { return MyVec2(x,y); } - -#define IM_VEC4_CLASS_EXTRA \ - ImVec4(const MyVec4& f) { x = f.x; y = f.y; z = f.z; w = f.w; } \ - operator MyVec4() const { return MyVec4(x,y,z,w); } -*/ - -//---- Use 32-bit vertex indices (instead of default: 16-bit) to allow meshes with more than 64K vertices -//#define ImDrawIdx unsigned int - -//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files. -//---- e.g. create variants of the ImGui::Value() helper for your low-level math types, or your own widgets/helpers. -/* -namespace ImGui -{ - void Value(const char* prefix, const MyMatrix44& v, const char* float_format = NULL); -} -*/ - diff --git a/vendor/librw/skeleton/imgui/imgui.cpp b/vendor/librw/skeleton/imgui/imgui.cpp deleted file mode 100644 index e0f1af4..0000000 --- a/vendor/librw/skeleton/imgui/imgui.cpp +++ /dev/null @@ -1,11739 +0,0 @@ -// dear imgui, v1.54 WIP -// (main code and documentation) - -// Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code. -// Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase. -// Get latest version at https://github.com/ocornut/imgui -// Releases change-log at https://github.com/ocornut/imgui/releases -// Gallery (please post your screenshots/video there!): https://github.com/ocornut/imgui/issues/1269 -// Developed by Omar Cornut and every direct or indirect contributors to the GitHub. -// This library is free but I need your support to sustain development and maintenance. -// If you work for a company, please consider financial support, see Readme. For individuals: https://www.patreon.com/imgui - -/* - - Index - - MISSION STATEMENT - - END-USER GUIDE - - PROGRAMMER GUIDE (read me!) - - Read first - - How to update to a newer version of Dear ImGui - - Getting started with integrating Dear ImGui in your code/engine - - API BREAKING CHANGES (read me when you update!) - - ISSUES & TODO LIST - - FREQUENTLY ASKED QUESTIONS (FAQ), TIPS - - How can I help? - - What is ImTextureID and how do I display an image? - - I integrated Dear ImGui in my engine and the text or lines are blurry.. - - I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around.. - - How can I have multiple widgets with the same label? Can I have widget without a label? (Yes). A primer on labels/IDs. - - How can I tell when Dear ImGui wants my mouse/keyboard inputs VS when I can pass them to my application? - - How can I load a different font than the default? - - How can I easily use icons in my application? - - How can I load multiple fonts? - - How can I display and input non-latin characters such as Chinese, Japanese, Korean, Cyrillic? - - How can I preserve my Dear ImGui context across reloading a DLL? (loss of the global/static variables) - - How can I use the drawing facilities without an ImGui window? (using ImDrawList API) - - ISSUES & TODO-LIST - - CODE - - - MISSION STATEMENT - ================= - - - Easy to use to create code-driven and data-driven tools - - Easy to use to create ad hoc short-lived tools and long-lived, more elaborate tools - - Easy to hack and improve - - Minimize screen real-estate usage - - Minimize setup and maintenance - - Minimize state storage on user side - - Portable, minimize dependencies, run on target (consoles, phones, etc.) - - Efficient runtime and memory consumption (NB- we do allocate when "growing" content e.g. creating a window, opening a tree node - for the first time, etc. but a typical frame won't allocate anything) - - Designed for developers and content-creators, not the typical end-user! Some of the weaknesses includes: - - Doesn't look fancy, doesn't animate - - Limited layout features, intricate layouts are typically crafted in code - - - END-USER GUIDE - ============== - - - Double-click on title bar to collapse window. - - Click upper right corner to close a window, available when 'bool* p_open' is passed to ImGui::Begin(). - - Click and drag on lower right corner to resize window (double-click to auto fit window to its contents). - - Click and drag on any empty space to move window. - - TAB/SHIFT+TAB to cycle through keyboard editable fields. - - CTRL+Click on a slider or drag box to input value as text. - - Use mouse wheel to scroll. - - Text editor: - - Hold SHIFT or use mouse to select text. - - CTRL+Left/Right to word jump. - - CTRL+Shift+Left/Right to select words. - - CTRL+A our Double-Click to select all. - - CTRL+X,CTRL+C,CTRL+V to use OS clipboard/ - - CTRL+Z,CTRL+Y to undo/redo. - - ESCAPE to revert text to its original value. - - You can apply arithmetic operators +,*,/ on numerical values. Use +- to subtract (because - would set a negative value!) - - Controls are automatically adjusted for OSX to match standard OSX text editing operations. - - - PROGRAMMER GUIDE - ================ - - READ FIRST - - - Read the FAQ below this section! - - Your code creates the UI, if your code doesn't run the UI is gone! == very dynamic UI, no construction/destructions steps, less data retention - on your side, no state duplication, less sync, less bugs. - - Call and read ImGui::ShowDemoWindow() for demo code demonstrating most features. - - You can learn about immediate-mode gui principles at http://www.johno.se/book/imgui.html or watch http://mollyrocket.com/861 - - HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI - - - Overwrite all the sources files except for imconfig.h (if you have made modification to your copy of imconfig.h) - - Read the "API BREAKING CHANGES" section (below). This is where we list occasional API breaking changes. - If a function/type has been renamed / or marked obsolete, try to fix the name in your code before it is permanently removed from the public API. - If you have a problem with a missing function/symbols, search for its name in the code, there will likely be a comment about it. - Please report any issue to the GitHub page! - - Try to keep your copy of dear imgui reasonably up to date. - - GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE - - - Add the Dear ImGui source files to your projects, using your preferred build system. - It is recommended you build the .cpp files as part of your project and not as a library. - - You can later customize the imconfig.h file to tweak some compilation time behavior, such as integrating imgui types with your own maths types. - - See examples/ folder for standalone sample applications. - - You may be able to grab and copy a ready made imgui_impl_*** file from the examples/. - - When using Dear ImGui, your programming IDE is your friend: follow the declaration of variables, functions and types to find comments about them. - - - Init: retrieve the ImGuiIO structure with ImGui::GetIO() and fill the fields marked 'Settings': at minimum you need to set io.DisplaySize - (application resolution). Later on you will fill your keyboard mapping, clipboard handlers, and other advanced features but for a basic - integration you don't need to worry about it all. - - Init: call io.Fonts->GetTexDataAsRGBA32(...), it will build the font atlas texture, then load the texture pixels into graphics memory. - - Every frame: - - In your main loop as early a possible, fill the IO fields marked 'Input' (e.g. mouse position, buttons, keyboard info, etc.) - - Call ImGui::NewFrame() to begin the frame - - You can use any ImGui function you want between NewFrame() and Render() - - Call ImGui::Render() as late as you can to end the frame and finalize render data. it will call your io.RenderDrawListFn handler. - (Even if you don't render, call Render() and ignore the callback, or call EndFrame() instead. Otherwhise some features will break) - - All rendering information are stored into command-lists until ImGui::Render() is called. - - Dear ImGui never touches or knows about your GPU state. the only function that knows about GPU is the RenderDrawListFn handler that you provide. - - Effectively it means you can create widgets at any time in your code, regardless of considerations of being in "update" vs "render" phases - of your own application. - - Refer to the examples applications in the examples/ folder for instruction on how to setup your code. - - A minimal application skeleton may be: - - // Application init - ImGuiIO& io = ImGui::GetIO(); - io.DisplaySize.x = 1920.0f; - io.DisplaySize.y = 1280.0f; - io.RenderDrawListsFn = MyRenderFunction; // Setup a render function, or set to NULL and call GetDrawData() after Render() to access render data. - // TODO: Fill others settings of the io structure later. - - // Load texture atlas (there is a default font so you don't need to care about choosing a font yet) - unsigned char* pixels; - int width, height; - io.Fonts->GetTexDataAsRGBA32(pixels, &width, &height); - // TODO: At this points you've got the texture data and you need to upload that your your graphic system: - MyTexture* texture = MyEngine::CreateTextureFromMemoryPixels(pixels, width, height, TEXTURE_TYPE_RGBA) - // TODO: Store your texture pointer/identifier (whatever your engine uses) in 'io.Fonts->TexID'. This will be passed back to your via the renderer. - io.Fonts->TexID = (void*)texture; - - // Application main loop - while (true) - { - // Setup low-level inputs (e.g. on Win32, GetKeyboardState(), or write to those fields from your Windows message loop handlers, etc.) - ImGuiIO& io = ImGui::GetIO(); - io.DeltaTime = 1.0f/60.0f; - io.MousePos = mouse_pos; - io.MouseDown[0] = mouse_button_0; - io.MouseDown[1] = mouse_button_1; - - // Call NewFrame(), after this point you can use ImGui::* functions anytime - ImGui::NewFrame(); - - // Most of your application code here - MyGameUpdate(); // may use any ImGui functions, e.g. ImGui::Begin("My window"); ImGui::Text("Hello, world!"); ImGui::End(); - MyGameRender(); // may use any ImGui functions as well! - - // Render & swap video buffers - ImGui::Render(); - SwapBuffers(); - } - - - A minimal render function skeleton may be: - - void void MyRenderFunction(ImDrawData* draw_data)(ImDrawData* draw_data) - { - // TODO: Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled - // TODO: Setup viewport, orthographic projection matrix - // TODO: Setup shader: vertex { float2 pos, float2 uv, u32 color }, fragment shader sample color from 1 texture, multiply by vertex color. - for (int n = 0; n < draw_data->CmdListsCount; n++) - { - const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; // vertex buffer generated by ImGui - const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; // index buffer generated by ImGui - for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) - { - const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; - if (pcmd->UserCallback) - { - pcmd->UserCallback(cmd_list, pcmd); - } - else - { - // The texture for the draw call is specified by pcmd->TextureId. - // The vast majority of draw calls with use the imgui texture atlas, which value you have set yourself during initialization. - MyEngineBindTexture(pcmd->TextureId); - - // We are using scissoring to clip some objects. All low-level graphics API supports it. - // If your engine doesn't support scissoring yet, you will get some small glitches (some elements outside their bounds) which you can fix later. - MyEngineScissor((int)pcmd->ClipRect.x, (int)pcmd->ClipRect.y, (int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (int)(pcmd->ClipRect.w - pcmd->ClipRect.y)); - - // Render 'pcmd->ElemCount/3' indexed triangles. - // By default the indices ImDrawIdx are 16-bits, you can change them to 32-bits if your engine doesn't support 16-bits indices. - MyEngineDrawIndexedTriangles(pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer, vtx_buffer); - } - idx_buffer += pcmd->ElemCount; - } - } - } - - - The examples/ folders contains many functional implementation of the pseudo-code above. - - When calling NewFrame(), the 'io.WantCaptureMouse'/'io.WantCaptureKeyboard'/'io.WantTextInput' flags are updated. - They tell you if ImGui intends to use your inputs. So for example, if 'io.WantCaptureMouse' is set you would typically want to hide - mouse inputs from the rest of your application. Read the FAQ below for more information about those flags. - - - - API BREAKING CHANGES - ==================== - - Occasionally introducing changes that are breaking the API. The breakage are generally minor and easy to fix. - Here is a change-log of API breaking changes, if you are using one of the functions listed, expect to have to fix some code. - Also read releases logs https://github.com/ocornut/imgui/releases for more details. - - - 2017/12/24 (1.53) - renamed the emblematic ShowTestWindow() function to ShowDemoWindow(). Kept redirection function (will obsolete). - - 2017/12/21 (1.53) - ImDrawList: renamed style.AntiAliasedShapes to style.AntiAliasedFill for consistency and as a way to explicitly break code that manipulate those flag at runtime. You can now manipulate ImDrawList::Flags - - 2017/12/21 (1.53) - ImDrawList: removed 'bool anti_aliased = true' final parameter of ImDrawList::AddPolyline() and ImDrawList::AddConvexPolyFilled(). Prefer manipulating ImDrawList::Flags if you need to toggle them during the frame. - - 2017/12/14 (1.53) - using the ImGuiWindowFlags_NoScrollWithMouse flag on a child window forwards the mouse wheel event to the parent window, unless either ImGuiWindowFlags_NoInputs or ImGuiWindowFlags_NoScrollbar are also set. - - 2017/12/13 (1.53) - renamed GetItemsLineHeightWithSpacing() to GetFrameHeightWithSpacing(). Kept redirection function (will obsolete). - - 2017/12/13 (1.53) - obsoleted IsRootWindowFocused() in favor of using IsWindowFocused(ImGuiFocusedFlags_RootWindow). Kept redirection function (will obsolete). - - obsoleted IsRootWindowOrAnyChildFocused() in favor of using IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows). Kept redirection function (will obsolete). - - 2017/12/12 (1.53) - renamed ImGuiTreeNodeFlags_AllowOverlapMode to ImGuiTreeNodeFlags_AllowItemOverlap. Kept redirection enum (will obsolete). - - 2017/12/10 (1.53) - removed SetNextWindowContentWidth(), prefer using SetNextWindowContentSize(). Kept redirection function (will obsolete). - - 2017/11/27 (1.53) - renamed ImGuiTextBuffer::append() helper to appendf(), appendv() to appendfv(). If you copied the 'Log' demo in your code, it uses appendv() so that needs to be renamed. - - 2017/11/18 (1.53) - Style, Begin: removed ImGuiWindowFlags_ShowBorders window flag. Borders are now fully set up in the ImGuiStyle structure (see e.g. style.FrameBorderSize, style.WindowBorderSize). Use ImGui::ShowStyleEditor() to look them up. - Please note that the style system will keep evolving (hopefully stabilizing in Q1 2018), and so custom styles will probably subtly break over time. It is recommended you use the StyleColorsClassic(), StyleColorsDark(), StyleColorsLight() functions. - - 2017/11/18 (1.53) - Style: removed ImGuiCol_ComboBg in favor of combo boxes using ImGuiCol_PopupBg for consistency. - - 2017/11/18 (1.53) - Style: renamed ImGuiCol_ChildWindowBg to ImGuiCol_ChildBg. - - 2017/11/18 (1.53) - Style: renamed style.ChildWindowRounding to style.ChildRounding, ImGuiStyleVar_ChildWindowRounding to ImGuiStyleVar_ChildRounding. - - 2017/11/02 (1.53) - obsoleted IsRootWindowOrAnyChildHovered() in favor of using IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows); - - 2017/10/24 (1.52) - renamed IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS/IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCS to IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS/IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS for consistency. - - 2017/10/20 (1.52) - changed IsWindowHovered() default parameters behavior to return false if an item is active in another window (e.g. click-dragging item from another window to this window). You can use the newly introduced IsWindowHovered() flags to requests this specific behavior if you need it. - - 2017/10/20 (1.52) - marked IsItemHoveredRect()/IsMouseHoveringWindow() as obsolete, in favor of using the newly introduced flags for IsItemHovered() and IsWindowHovered(). See https://github.com/ocornut/imgui/issues/1382 for details. - removed the IsItemRectHovered()/IsWindowRectHovered() names introduced in 1.51 since they were merely more consistent names for the two functions we are now obsoleting. - - 2017/10/17 (1.52) - marked the old 5-parameters version of Begin() as obsolete (still available). Use SetNextWindowSize()+Begin() instead! - - 2017/10/11 (1.52) - renamed AlignFirstTextHeightToWidgets() to AlignTextToFramePadding(). Kept inline redirection function (will obsolete). - - 2017/09/25 (1.52) - removed SetNextWindowPosCenter() because SetNextWindowPos() now has the optional pivot information to do the same and more. Kept redirection function (will obsolete). - - 2017/08/25 (1.52) - io.MousePos needs to be set to ImVec2(-FLT_MAX,-FLT_MAX) when mouse is unavailable/missing. Previously ImVec2(-1,-1) was enough but we now accept negative mouse coordinates. In your binding if you need to support unavailable mouse, make sure to replace "io.MousePos = ImVec2(-1,-1)" with "io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX)". - - 2017/08/22 (1.51) - renamed IsItemHoveredRect() to IsItemRectHovered(). Kept inline redirection function (will obsolete). -> (1.52) use IsItemHovered(ImGuiHoveredFlags_RectOnly)! - - renamed IsMouseHoveringAnyWindow() to IsAnyWindowHovered() for consistency. Kept inline redirection function (will obsolete). - - renamed IsMouseHoveringWindow() to IsWindowRectHovered() for consistency. Kept inline redirection function (will obsolete). - - 2017/08/20 (1.51) - renamed GetStyleColName() to GetStyleColorName() for consistency. - - 2017/08/20 (1.51) - added PushStyleColor(ImGuiCol idx, ImU32 col) overload, which _might_ cause an "ambiguous call" compilation error if you are using ImColor() with implicit cast. Cast to ImU32 or ImVec4 explicily to fix. - - 2017/08/15 (1.51) - marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame. - - 2017/08/15 (1.51) - changed parameter order for BeginPopupContextWindow() from (const char*,int buttons,bool also_over_items) to (const char*,int buttons,bool also_over_items). Note that most calls relied on default parameters completely. - - 2017/08/13 (1.51) - renamed ImGuiCol_Columns*** to ImGuiCol_Separator***. Kept redirection enums (will obsolete). - - 2017/08/11 (1.51) - renamed ImGuiSetCond_*** types and flags to ImGuiCond_***. Kept redirection enums (will obsolete). - - 2017/08/09 (1.51) - removed ValueColor() helpers, they are equivalent to calling Text(label) + SameLine() + ColorButton(). - - 2017/08/08 (1.51) - removed ColorEditMode() and ImGuiColorEditMode in favor of ImGuiColorEditFlags and parameters to the various Color*() functions. The SetColorEditOptions() allows to initialize default but the user can still change them with right-click context menu. - - changed prototype of 'ColorEdit4(const char* label, float col[4], bool show_alpha = true)' to 'ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0)', where passing flags = 0x01 is a safe no-op (hello dodgy backward compatibility!). - check and run the demo window, under "Color/Picker Widgets", to understand the various new options. - - changed prototype of rarely used 'ColorButton(ImVec4 col, bool small_height = false, bool outline_border = true)' to 'ColorButton(const char* desc_id, ImVec4 col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0,0))' - - 2017/07/20 (1.51) - removed IsPosHoveringAnyWindow(ImVec2), which was partly broken and misleading. ASSERT + redirect user to io.WantCaptureMouse - - 2017/05/26 (1.50) - removed ImFontConfig::MergeGlyphCenterV in favor of a more multipurpose ImFontConfig::GlyphOffset. - - 2017/05/01 (1.50) - renamed ImDrawList::PathFill() (rarely used directly) to ImDrawList::PathFillConvex() for clarity. - - 2016/11/06 (1.50) - BeginChild(const char*) now applies the stack id to the provided label, consistently with other functions as it should always have been. It shouldn't affect you unless (extremely unlikely) you were appending multiple times to a same child from different locations of the stack id. If that's the case, generate an id with GetId() and use it instead of passing string to BeginChild(). - - 2016/10/15 (1.50) - avoid 'void* user_data' parameter to io.SetClipboardTextFn/io.GetClipboardTextFn pointers. We pass io.ClipboardUserData to it. - - 2016/09/25 (1.50) - style.WindowTitleAlign is now a ImVec2 (ImGuiAlign enum was removed). set to (0.5f,0.5f) for horizontal+vertical centering, (0.0f,0.0f) for upper-left, etc. - - 2016/07/30 (1.50) - SameLine(x) with x>0.0f is now relative to left of column/group if any, and not always to left of window. This was sort of always the intent and hopefully breakage should be minimal. - - 2016/05/12 (1.49) - title bar (using ImGuiCol_TitleBg/ImGuiCol_TitleBgActive colors) isn't rendered over a window background (ImGuiCol_WindowBg color) anymore. - If your TitleBg/TitleBgActive alpha was 1.0f or you are using the default theme it will not affect you. - However if your TitleBg/TitleBgActive alpha was <1.0f you need to tweak your custom theme to readjust for the fact that we don't draw a WindowBg background behind the title bar. - This helper function will convert an old TitleBg/TitleBgActive color into a new one with the same visual output, given the OLD color and the OLD WindowBg color. - ImVec4 ConvertTitleBgCol(const ImVec4& win_bg_col, const ImVec4& title_bg_col) - { - float new_a = 1.0f - ((1.0f - win_bg_col.w) * (1.0f - title_bg_col.w)), k = title_bg_col.w / new_a; - return ImVec4((win_bg_col.x * win_bg_col.w + title_bg_col.x) * k, (win_bg_col.y * win_bg_col.w + title_bg_col.y) * k, (win_bg_col.z * win_bg_col.w + title_bg_col.z) * k, new_a); - } - If this is confusing, pick the RGB value from title bar from an old screenshot and apply this as TitleBg/TitleBgActive. Or you may just create TitleBgActive from a tweaked TitleBg color. - - 2016/05/07 (1.49) - removed confusing set of GetInternalState(), GetInternalStateSize(), SetInternalState() functions. Now using CreateContext(), DestroyContext(), GetCurrentContext(), SetCurrentContext(). - - 2016/05/02 (1.49) - renamed SetNextTreeNodeOpened() to SetNextTreeNodeOpen(), no redirection. - - 2016/05/01 (1.49) - obsoleted old signature of CollapsingHeader(const char* label, const char* str_id = NULL, bool display_frame = true, bool default_open = false) as extra parameters were badly designed and rarely used. You can replace the "default_open = true" flag in new API with CollapsingHeader(label, ImGuiTreeNodeFlags_DefaultOpen). - - 2016/04/26 (1.49) - changed ImDrawList::PushClipRect(ImVec4 rect) to ImDraw::PushClipRect(Imvec2 min,ImVec2 max,bool intersect_with_current_clip_rect=false). Note that higher-level ImGui::PushClipRect() is preferable because it will clip at logic/widget level, whereas ImDrawList::PushClipRect() only affect your renderer. - - 2016/04/03 (1.48) - removed style.WindowFillAlphaDefault setting which was redundant. Bake default BG alpha inside style.Colors[ImGuiCol_WindowBg] and all other Bg color values. (ref github issue #337). - - 2016/04/03 (1.48) - renamed ImGuiCol_TooltipBg to ImGuiCol_PopupBg, used by popups/menus and tooltips. popups/menus were previously using ImGuiCol_WindowBg. (ref github issue #337) - - 2016/03/21 (1.48) - renamed GetWindowFont() to GetFont(), GetWindowFontSize() to GetFontSize(). Kept inline redirection function (will obsolete). - - 2016/03/02 (1.48) - InputText() completion/history/always callbacks: if you modify the text buffer manually (without using DeleteChars()/InsertChars() helper) you need to maintain the BufTextLen field. added an assert. - - 2016/01/23 (1.48) - fixed not honoring exact width passed to PushItemWidth(), previously it would add extra FramePadding.x*2 over that width. if you had manual pixel-perfect alignment in place it might affect you. - - 2015/12/27 (1.48) - fixed ImDrawList::AddRect() which used to render a rectangle 1 px too large on each axis. - - 2015/12/04 (1.47) - renamed Color() helpers to ValueColor() - dangerously named, rarely used and probably to be made obsolete. - - 2015/08/29 (1.45) - with the addition of horizontal scrollbar we made various fixes to inconsistencies with dealing with cursor position. - GetCursorPos()/SetCursorPos() functions now include the scrolled amount. It shouldn't affect the majority of users, but take note that SetCursorPosX(100.0f) puts you at +100 from the starting x position which may include scrolling, not at +100 from the window left side. - GetContentRegionMax()/GetWindowContentRegionMin()/GetWindowContentRegionMax() functions allow include the scrolled amount. Typically those were used in cases where no scrolling would happen so it may not be a problem, but watch out! - - 2015/08/29 (1.45) - renamed style.ScrollbarWidth to style.ScrollbarSize - - 2015/08/05 (1.44) - split imgui.cpp into extra files: imgui_demo.cpp imgui_draw.cpp imgui_internal.h that you need to add to your project. - - 2015/07/18 (1.44) - fixed angles in ImDrawList::PathArcTo(), PathArcToFast() (introduced in 1.43) being off by an extra PI for no justifiable reason - - 2015/07/14 (1.43) - add new ImFontAtlas::AddFont() API. For the old AddFont***, moved the 'font_no' parameter of ImFontAtlas::AddFont** functions to the ImFontConfig structure. - you need to render your textured triangles with bilinear filtering to benefit from sub-pixel positioning of text. - - 2015/07/08 (1.43) - switched rendering data to use indexed rendering. this is saving a fair amount of CPU/GPU and enables us to get anti-aliasing for a marginal cost. - this necessary change will break your rendering function! the fix should be very easy. sorry for that :( - - if you are using a vanilla copy of one of the imgui_impl_XXXX.cpp provided in the example, you just need to update your copy and you can ignore the rest. - - the signature of the io.RenderDrawListsFn handler has changed! - ImGui_XXXX_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count) - became: - ImGui_XXXX_RenderDrawLists(ImDrawData* draw_data). - argument 'cmd_lists' -> 'draw_data->CmdLists' - argument 'cmd_lists_count' -> 'draw_data->CmdListsCount' - ImDrawList 'commands' -> 'CmdBuffer' - ImDrawList 'vtx_buffer' -> 'VtxBuffer' - ImDrawList n/a -> 'IdxBuffer' (new) - ImDrawCmd 'vtx_count' -> 'ElemCount' - ImDrawCmd 'clip_rect' -> 'ClipRect' - ImDrawCmd 'user_callback' -> 'UserCallback' - ImDrawCmd 'texture_id' -> 'TextureId' - - each ImDrawList now contains both a vertex buffer and an index buffer. For each command, render ElemCount/3 triangles using indices from the index buffer. - - if you REALLY cannot render indexed primitives, you can call the draw_data->DeIndexAllBuffers() method to de-index the buffers. This is slow and a waste of CPU/GPU. Prefer using indexed rendering! - - refer to code in the examples/ folder or ask on the GitHub if you are unsure of how to upgrade. please upgrade! - - 2015/07/10 (1.43) - changed SameLine() parameters from int to float. - - 2015/07/02 (1.42) - renamed SetScrollPosHere() to SetScrollFromCursorPos(). Kept inline redirection function (will obsolete). - - 2015/07/02 (1.42) - renamed GetScrollPosY() to GetScrollY(). Necessary to reduce confusion along with other scrolling functions, because positions (e.g. cursor position) are not equivalent to scrolling amount. - - 2015/06/14 (1.41) - changed ImageButton() default bg_col parameter from (0,0,0,1) (black) to (0,0,0,0) (transparent) - makes a difference when texture have transparence - - 2015/06/14 (1.41) - changed Selectable() API from (label, selected, size) to (label, selected, flags, size). Size override should have been rarely be used. Sorry! - - 2015/05/31 (1.40) - renamed GetWindowCollapsed() to IsWindowCollapsed() for consistency. Kept inline redirection function (will obsolete). - - 2015/05/31 (1.40) - renamed IsRectClipped() to IsRectVisible() for consistency. Note that return value is opposite! Kept inline redirection function (will obsolete). - - 2015/05/27 (1.40) - removed the third 'repeat_if_held' parameter from Button() - sorry! it was rarely used and inconsistent. Use PushButtonRepeat(true) / PopButtonRepeat() to enable repeat on desired buttons. - - 2015/05/11 (1.40) - changed BeginPopup() API, takes a string identifier instead of a bool. ImGui needs to manage the open/closed state of popups. Call OpenPopup() to actually set the "open" state of a popup. BeginPopup() returns true if the popup is opened. - - 2015/05/03 (1.40) - removed style.AutoFitPadding, using style.WindowPadding makes more sense (the default values were already the same). - - 2015/04/13 (1.38) - renamed IsClipped() to IsRectClipped(). Kept inline redirection function until 1.50. - - 2015/04/09 (1.38) - renamed ImDrawList::AddArc() to ImDrawList::AddArcFast() for compatibility with future API - - 2015/04/03 (1.38) - removed ImGuiCol_CheckHovered, ImGuiCol_CheckActive, replaced with the more general ImGuiCol_FrameBgHovered, ImGuiCol_FrameBgActive. - - 2014/04/03 (1.38) - removed support for passing -FLT_MAX..+FLT_MAX as the range for a SliderFloat(). Use DragFloat() or Inputfloat() instead. - - 2015/03/17 (1.36) - renamed GetItemBoxMin()/GetItemBoxMax()/IsMouseHoveringBox() to GetItemRectMin()/GetItemRectMax()/IsMouseHoveringRect(). Kept inline redirection function until 1.50. - - 2015/03/15 (1.36) - renamed style.TreeNodeSpacing to style.IndentSpacing, ImGuiStyleVar_TreeNodeSpacing to ImGuiStyleVar_IndentSpacing - - 2015/03/13 (1.36) - renamed GetWindowIsFocused() to IsWindowFocused(). Kept inline redirection function until 1.50. - - 2015/03/08 (1.35) - renamed style.ScrollBarWidth to style.ScrollbarWidth (casing) - - 2015/02/27 (1.34) - renamed OpenNextNode(bool) to SetNextTreeNodeOpened(bool, ImGuiSetCond). Kept inline redirection function until 1.50. - - 2015/02/27 (1.34) - renamed ImGuiSetCondition_*** to ImGuiSetCond_***, and _FirstUseThisSession becomes _Once. - - 2015/02/11 (1.32) - changed text input callback ImGuiTextEditCallback return type from void-->int. reserved for future use, return 0 for now. - - 2015/02/10 (1.32) - renamed GetItemWidth() to CalcItemWidth() to clarify its evolving behavior - - 2015/02/08 (1.31) - renamed GetTextLineSpacing() to GetTextLineHeightWithSpacing() - - 2015/02/01 (1.31) - removed IO.MemReallocFn (unused) - - 2015/01/19 (1.30) - renamed ImGuiStorage::GetIntPtr()/GetFloatPtr() to GetIntRef()/GetIntRef() because Ptr was conflicting with actual pointer storage functions. - - 2015/01/11 (1.30) - big font/image API change! now loads TTF file. allow for multiple fonts. no need for a PNG loader. - (1.30) - removed GetDefaultFontData(). uses io.Fonts->GetTextureData*() API to retrieve uncompressed pixels. - this sequence: - const void* png_data; - unsigned int png_size; - ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size); - // - became: - unsigned char* pixels; - int width, height; - io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); - // - io.Fonts->TexID = (your_texture_identifier); - you now have much more flexibility to load multiple TTF fonts and manage the texture buffer for internal needs. - it is now recommended that you sample the font texture with bilinear interpolation. - (1.30) - added texture identifier in ImDrawCmd passed to your render function (we can now render images). make sure to set io.Fonts->TexID. - (1.30) - removed IO.PixelCenterOffset (unnecessary, can be handled in user projection matrix) - (1.30) - removed ImGui::IsItemFocused() in favor of ImGui::IsItemActive() which handles all widgets - - 2014/12/10 (1.18) - removed SetNewWindowDefaultPos() in favor of new generic API SetNextWindowPos(pos, ImGuiSetCondition_FirstUseEver) - - 2014/11/28 (1.17) - moved IO.Font*** options to inside the IO.Font-> structure (FontYOffset, FontTexUvForWhite, FontBaseScale, FontFallbackGlyph) - - 2014/11/26 (1.17) - reworked syntax of IMGUI_ONCE_UPON_A_FRAME helper macro to increase compiler compatibility - - 2014/11/07 (1.15) - renamed IsHovered() to IsItemHovered() - - 2014/10/02 (1.14) - renamed IMGUI_INCLUDE_IMGUI_USER_CPP to IMGUI_INCLUDE_IMGUI_USER_INL and imgui_user.cpp to imgui_user.inl (more IDE friendly) - - 2014/09/25 (1.13) - removed 'text_end' parameter from IO.SetClipboardTextFn (the string is now always zero-terminated for simplicity) - - 2014/09/24 (1.12) - renamed SetFontScale() to SetWindowFontScale() - - 2014/09/24 (1.12) - moved IM_MALLOC/IM_REALLOC/IM_FREE preprocessor defines to IO.MemAllocFn/IO.MemReallocFn/IO.MemFreeFn - - 2014/08/30 (1.09) - removed IO.FontHeight (now computed automatically) - - 2014/08/30 (1.09) - moved IMGUI_FONT_TEX_UV_FOR_WHITE preprocessor define to IO.FontTexUvForWhite - - 2014/08/28 (1.09) - changed the behavior of IO.PixelCenterOffset following various rendering fixes - - - ISSUES & TODO-LIST - ================== - See TODO.txt - - - FREQUENTLY ASKED QUESTIONS (FAQ), TIPS - ====================================== - - Q: How can I help? - A: - If you are experienced enough with Dear ImGui and with C/C++, look at the todo list and see how you want/can help! - - Become a Patron/donate! Convince your company to become a Patron or provide serious funding for development time! See http://www.patreon.com/imgui - - Q: What is ImTextureID and how do I display an image? - A: ImTextureID is a void* used to pass renderer-agnostic texture references around until it hits your render function. - Dear ImGui knows nothing about what those bits represent, it just passes them around. It is up to you to decide what you want the void* to carry! - It could be an identifier to your OpenGL texture (cast GLuint to void*), a pointer to your custom engine material (cast MyMaterial* to void*), etc. - At the end of the chain, your renderer takes this void* to cast it back into whatever it needs to select a current texture to render. - Refer to examples applications, where each renderer (in a imgui_impl_xxxx.cpp file) is treating ImTextureID as a different thing. - (c++ tip: OpenGL uses integers to identify textures. You can safely store an integer into a void*, just cast it to void*, don't take it's address!) - To display a custom image/texture within an ImGui window, you may use ImGui::Image(), ImGui::ImageButton(), ImDrawList::AddImage() functions. - Dear ImGui will generate the geometry and draw calls using the ImTextureID that you passed and which your renderer can use. - It is your responsibility to get textures uploaded to your GPU. - - Q: I integrated Dear ImGui in my engine and the text or lines are blurry.. - A: In your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f). - Also make sure your orthographic projection matrix and io.DisplaySize matches your actual framebuffer dimension. - - Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around.. - A: You are probably mishandling the clipping rectangles in your render function. - Rectangles provided by ImGui are defined as (x1=left,y1=top,x2=right,y2=bottom) and NOT as (x1,y1,width,height). - - Q: Can I have multiple widgets with the same label? Can I have widget without a label? - A: Yes. A primer on the use of labels/IDs in Dear ImGui.. - - - Elements that are not clickable, such as Text() items don't need an ID. - - - Interactive widgets require state to be carried over multiple frames (most typically Dear ImGui often needs to remember what is - the "active" widget). to do so they need a unique ID. unique ID are typically derived from a string label, an integer index or a pointer. - - Button("OK"); // Label = "OK", ID = hash of "OK" - Button("Cancel"); // Label = "Cancel", ID = hash of "Cancel" - - - ID are uniquely scoped within windows, tree nodes, etc. so no conflict can happen if you have two buttons called "OK" - in two different windows or in two different locations of a tree. - - - If you have a same ID twice in the same location, you'll have a conflict: - - Button("OK"); - Button("OK"); // ID collision! Both buttons will be treated as the same. - - Fear not! this is easy to solve and there are many ways to solve it! - - - When passing a label you can optionally specify extra unique ID information within string itself. - This helps solving the simpler collision cases. Use "##" to pass a complement to the ID that won't be visible to the end-user: - - Button("Play"); // Label = "Play", ID = hash of "Play" - Button("Play##foo1"); // Label = "Play", ID = hash of "Play##foo1" (different from above) - Button("Play##foo2"); // Label = "Play", ID = hash of "Play##foo2" (different from above) - - - If you want to completely hide the label, but still need an ID: - - Checkbox("##On", &b); // Label = "", ID = hash of "##On" (no label!) - - - Occasionally/rarely you might want change a label while preserving a constant ID. This allows you to animate labels. - For example you may want to include varying information in a window title bar (and windows are uniquely identified by their ID.. obviously) - Use "###" to pass a label that isn't part of ID: - - Button("Hello###ID"; // Label = "Hello", ID = hash of "ID" - Button("World###ID"; // Label = "World", ID = hash of "ID" (same as above) - - sprintf(buf, "My game (%f FPS)###MyGame"); - Begin(buf); // Variable label, ID = hash of "MyGame" - - - Use PushID() / PopID() to create scopes and avoid ID conflicts within the same Window. - This is the most convenient way of distinguishing ID if you are iterating and creating many UI elements. - You can push a pointer, a string or an integer value. Remember that ID are formed from the concatenation of everything in the ID stack! - - for (int i = 0; i < 100; i++) - { - PushID(i); - Button("Click"); // Label = "Click", ID = hash of integer + "label" (unique) - PopID(); - } - - for (int i = 0; i < 100; i++) - { - MyObject* obj = Objects[i]; - PushID(obj); - Button("Click"); // Label = "Click", ID = hash of pointer + "label" (unique) - PopID(); - } - - for (int i = 0; i < 100; i++) - { - MyObject* obj = Objects[i]; - PushID(obj->Name); - Button("Click"); // Label = "Click", ID = hash of string + "label" (unique) - PopID(); - } - - - More example showing that you can stack multiple prefixes into the ID stack: - - Button("Click"); // Label = "Click", ID = hash of "Click" - PushID("node"); - Button("Click"); // Label = "Click", ID = hash of "node" + "Click" - PushID(my_ptr); - Button("Click"); // Label = "Click", ID = hash of "node" + ptr + "Click" - PopID(); - PopID(); - - - Tree nodes implicitly creates a scope for you by calling PushID(). - - Button("Click"); // Label = "Click", ID = hash of "Click" - if (TreeNode("node")) - { - Button("Click"); // Label = "Click", ID = hash of "node" + "Click" - TreePop(); - } - - - When working with trees, ID are used to preserve the open/close state of each tree node. - Depending on your use cases you may want to use strings, indices or pointers as ID. - e.g. when displaying a single object that may change over time (dynamic 1-1 relationship), using a static string as ID will preserve your - node open/closed state when the targeted object change. - e.g. when displaying a list of objects, using indices or pointers as ID will preserve the node open/closed state differently. - experiment and see what makes more sense! - - Q: How can I tell when Dear ImGui wants my mouse/keyboard inputs VS when I can pass them to my application? - A: You can read the 'io.WantCaptureMouse'/'io.WantCaptureKeyboard'/'ioWantTextInput' flags from the ImGuiIO structure. - - When 'io.WantCaptureMouse' or 'io.WantCaptureKeyboard' flags are set you may want to discard/hide the inputs from the rest of your application. - - When 'io.WantTextInput' is set to may want to notify your OS to popup an on-screen keyboard, if available (e.g. on a mobile phone, or console OS). - Preferably read the flags after calling ImGui::NewFrame() to avoid them lagging by one frame. But reading those flags before calling NewFrame() is - also generally ok, as the bool toggles fairly rarely and you don't generally expect to interact with either Dear ImGui or your application during - the same frame when that transition occurs. Dear ImGui is tracking dragging and widget activity that may occur outside the boundary of a window, - so 'io.WantCaptureMouse' is more accurate and correct than checking if a window is hovered. - (Advanced note: text input releases focus on Return 'KeyDown', so the following Return 'KeyUp' event that your application receive will typically - have 'io.WantCaptureKeyboard=false'. Depending on your application logic it may or not be inconvenient. You might want to track which key-downs - were for Dear ImGui, e.g. with an array of bool, and filter out the corresponding key-ups.) - - Q: How can I load a different font than the default? (default is an embedded version of ProggyClean.ttf, rendered at size 13) - A: Use the font atlas to load the TTF/OTF file you want: - - ImGuiIO& io = ImGui::GetIO(); - io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels); - io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8() - - Q: How can I easily use icons in my application? - A: The most convenient and practical way is to merge an icon font such as FontAwesome inside you main font. Then you can refer to icons within your - strings. Read 'How can I load multiple fonts?' and the file 'extra_fonts/README.txt' for instructions and useful header files. - - Q: How can I load multiple fonts? - A: Use the font atlas to pack them into a single texture: - (Read extra_fonts/README.txt and the code in ImFontAtlas for more details.) - - ImGuiIO& io = ImGui::GetIO(); - ImFont* font0 = io.Fonts->AddFontDefault(); - ImFont* font1 = io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels); - ImFont* font2 = io.Fonts->AddFontFromFileTTF("myfontfile2.ttf", size_in_pixels); - io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8() - // the first loaded font gets used by default - // use ImGui::PushFont()/ImGui::PopFont() to change the font at runtime - - // Options - ImFontConfig config; - config.OversampleH = 3; - config.OversampleV = 1; - config.GlyphOffset.y -= 2.0f; // Move everything by 2 pixels up - config.GlyphExtraSpacing.x = 1.0f; // Increase spacing between characters - io.Fonts->LoadFromFileTTF("myfontfile.ttf", size_pixels, &config); - - // Combine multiple fonts into one (e.g. for icon fonts) - ImWchar ranges[] = { 0xf000, 0xf3ff, 0 }; - ImFontConfig config; - config.MergeMode = true; - io.Fonts->AddFontDefault(); - io.Fonts->LoadFromFileTTF("fontawesome-webfont.ttf", 16.0f, &config, ranges); // Merge icon font - io.Fonts->LoadFromFileTTF("myfontfile.ttf", size_pixels, NULL, &config, io.Fonts->GetGlyphRangesJapanese()); // Merge japanese glyphs - - Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic? - A: When loading a font, pass custom Unicode ranges to specify the glyphs to load. - - // Add default Japanese ranges - io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, io.Fonts->GetGlyphRangesJapanese()); - - // Or create your own custom ranges (e.g. for a game you can feed your entire game script and only build the characters the game need) - ImVector ranges; - ImFontAtlas::GlyphRangesBuilder builder; - builder.AddText("Hello world"); // Add a string (here "Hello world" contains 7 unique characters) - builder.AddChar(0x7262); // Add a specific character - builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges - builder.BuildRanges(&ranges); // Build the final result (ordered ranges with all the unique characters submitted) - io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, ranges.Data); - - All your strings needs to use UTF-8 encoding. In C++11 you can encode a string literal in UTF-8 by using the u8"hello" syntax. - Specifying literal in your source code using a local code page (such as CP-923 for Japanese or CP-1251 for Cyrillic) will NOT work! - Otherwise you can convert yourself to UTF-8 or load text data from file already saved as UTF-8. - - Text input: it is up to your application to pass the right character code to io.AddInputCharacter(). The applications in examples/ are doing that. - For languages using IME, on Windows you can copy the Hwnd of your application to io.ImeWindowHandle. - The default implementation of io.ImeSetInputScreenPosFn() on Windows will set your IME position correctly. - - Q: How can I preserve my Dear ImGui context across reloading a DLL? (loss of the global/static variables) - A: Create your own context 'ctx = CreateContext()' + 'SetCurrentContext(ctx)' and your own font atlas 'ctx->GetIO().Fonts = new ImFontAtlas()' - so you don't rely on the default globals. - - Q: How can I use the drawing facilities without an ImGui window? (using ImDrawList API) - A: The easiest way is to create a dummy window. Call Begin() with NoTitleBar|NoResize|NoMove|NoScrollbar|NoSavedSettings|NoInputs flag, - zero background alpha, then retrieve the ImDrawList* via GetWindowDrawList() and draw to it in any way you like. - You can also perfectly create a standalone ImDrawList instance _but_ you need ImGui to be initialized because ImDrawList pulls from ImGui - data to retrieve the coordinates of the white pixel. - - - tip: you can call Begin() multiple times with the same name during the same frame, it will keep appending to the same window. - this is also useful to set yourself in the context of another window (to get/set other settings) - - tip: you can create widgets without a Begin()/End() block, they will go in an implicit window called "Debug". - - tip: the ImGuiOnceUponAFrame helper will allow run the block of code only once a frame. You can use it to quickly add custom UI in the middle - of a deep nested inner loop in your code. - - tip: you can call Render() multiple times (e.g for VR renders). - - tip: call and read the ShowDemoWindow() code in imgui_demo.cpp for more example of how to use ImGui! - -*/ - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "imgui.h" -#define IMGUI_DEFINE_MATH_OPERATORS -#include "imgui_internal.h" - -#include // toupper, isprint -#include // NULL, malloc, free, qsort, atoi -#include // vsnprintf, sscanf, printf -#include // INT_MIN, INT_MAX -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else -#include // intptr_t -#endif - -#ifdef _MSC_VER -#pragma warning (disable: 4127) // condition expression is constant -#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff) -#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen -#endif - -// Clang warnings with -Weverything -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning : unknown warning group '-Wformat-pedantic *' // not all warnings are known by all clang versions.. so ignoring warnings triggers new warnings on some configuration. great! -#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse. -#pragma clang diagnostic ignored "-Wfloat-equal" // warning : comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. -#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning : format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. -#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning : declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. -#pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference it. -#pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness // -#pragma clang diagnostic ignored "-Wformat-pedantic" // warning : format specifies type 'void *' but the argument has type 'xxxx *' // unreasonable, would lead to casting every %p arg to void*. probably enabled by -pedantic. -#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning : cast to 'void *' from smaller integer type 'int' // -#elif defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used -#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size -#pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'void*', but argument 6 has type 'ImGuiWindow*' -#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function -#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value -#pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'xxxx' to type 'xxxx' casts away qualifiers -#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked -#endif - -//------------------------------------------------------------------------- -// Forward Declarations -//------------------------------------------------------------------------- - -static bool IsKeyPressedMap(ImGuiKey key, bool repeat = true); - -static ImFont* GetDefaultFont(); -static void SetCurrentFont(ImFont* font); -static void SetCurrentWindow(ImGuiWindow* window); -static void SetWindowScrollY(ImGuiWindow* window, float new_scroll_y); -static void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond); -static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond); -static void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond); -static ImGuiWindow* FindHoveredWindow(ImVec2 pos); -static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags); -static void ClearSetNextWindowData(); -static void CheckStacksSize(ImGuiWindow* window, bool write); -static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window); - -static void AddDrawListToRenderList(ImVector& out_render_list, ImDrawList* draw_list); -static void AddWindowToRenderList(ImVector& out_render_list, ImGuiWindow* window); -static void AddWindowToSortedBuffer(ImVector& out_sorted_windows, ImGuiWindow* window); - -static ImGuiWindowSettings* AddWindowSettings(const char* name); - -static void LoadIniSettingsFromDisk(const char* ini_filename); -static void LoadIniSettingsFromMemory(const char* buf); -static void SaveIniSettingsToDisk(const char* ini_filename); -static void SaveIniSettingsToMemory(ImVector& out_buf); -static void MarkIniSettingsDirty(ImGuiWindow* window); - -static ImRect GetVisibleRect(); - -static void CloseInactivePopups(ImGuiWindow* ref_window); -static void ClosePopupToLevel(int remaining); -static ImGuiWindow* GetFrontMostModalRootWindow(); - -static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data); -static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end); -static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false); - -static inline void DataTypeFormatString(ImGuiDataType data_type, void* data_ptr, const char* display_format, char* buf, int buf_size); -static inline void DataTypeFormatString(ImGuiDataType data_type, void* data_ptr, int decimal_precision, char* buf, int buf_size); -static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* value1, const void* value2); -static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* scalar_format); - -namespace ImGui -{ -static void FocusPreviousWindow(); -} - -//----------------------------------------------------------------------------- -// Platform dependent default implementations -//----------------------------------------------------------------------------- - -static const char* GetClipboardTextFn_DefaultImpl(void* user_data); -static void SetClipboardTextFn_DefaultImpl(void* user_data, const char* text); -static void ImeSetInputScreenPosFn_DefaultImpl(int x, int y); - -//----------------------------------------------------------------------------- -// Context -//----------------------------------------------------------------------------- - -// Default font atlas storage. -// New contexts always point by default to this font atlas. It can be changed by reassigning the GetIO().Fonts variable. -static ImFontAtlas GImDefaultFontAtlas; - -// Default context storage + current context pointer. -// Implicitely used by all ImGui functions. Always assumed to be != NULL. Change to a different context by calling ImGui::SetCurrentContext() -// If you are hot-reloading this code in a DLL you will lose the static/global variables. Create your own context+font atlas instead of relying on those default (see FAQ entry "How can I preserve my ImGui context across reloading a DLL?"). -// ImGui is currently not thread-safe because of this variable. If you want thread-safety to allow N threads to access N different contexts, you might work around it by: -// - Having multiple instances of the ImGui code compiled inside different namespace (easiest/safest, if you have a finite number of contexts) -// - or: Changing this variable to be TLS. You may #define GImGui in imconfig.h for further custom hackery. Future development aim to make this context pointer explicit to all calls. Also read https://github.com/ocornut/imgui/issues/586 -#ifndef GImGui -static ImGuiContext GImDefaultContext; -ImGuiContext* GImGui = &GImDefaultContext; -#endif - -//----------------------------------------------------------------------------- -// User facing structures -//----------------------------------------------------------------------------- - -ImGuiStyle::ImGuiStyle() -{ - Alpha = 1.0f; // Global alpha applies to everything in ImGui - WindowPadding = ImVec2(8,8); // Padding within a window - WindowRounding = 7.0f; // Radius of window corners rounding. Set to 0.0f to have rectangular windows - WindowBorderSize = 0.0f; // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested. - WindowMinSize = ImVec2(32,32); // Minimum window size - WindowTitleAlign = ImVec2(0.0f,0.5f);// Alignment for title bar text - ChildRounding = 0.0f; // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows - ChildBorderSize = 1.0f; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested. - PopupRounding = 0.0f; // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows - PopupBorderSize = 1.0f; // Thickness of border around popup or tooltip windows. Generally set to 0.0f or 1.0f. Other values not well tested. - FramePadding = ImVec2(4,3); // Padding within a framed rectangle (used by most widgets) - FrameRounding = 0.0f; // Radius of frame corners rounding. Set to 0.0f to have rectangular frames (used by most widgets). - FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested. - ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines - ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label) - TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! - IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). - ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns - ScrollbarSize = 16.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar - ScrollbarRounding = 9.0f; // Radius of grab corners rounding for scrollbar - GrabMinSize = 10.0f; // Minimum width/height of a grab box for slider/scrollbar - GrabRounding = 0.0f; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. - ButtonTextAlign = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text. - DisplayWindowPadding = ImVec2(22,22); // Window positions are clamped to be visible within the display area by at least this amount. Only covers regular windows. - DisplaySafeAreaPadding = ImVec2(4,4); // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. - AntiAliasedLines = true; // Enable anti-aliasing on lines/borders. Disable if you are really short on CPU/GPU. - AntiAliasedFill = true; // Enable anti-aliasing on filled shapes (rounded rectangles, circles, etc.) - CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. - - ImGui::StyleColorsClassic(this); -} - -// To scale your entire UI (e.g. if you want your app to use High DPI or generally be DPI aware) you may use this helper function. Scaling the fonts is done separately and is up to you. -// Important: This operation is lossy because we round all sizes to integer. If you need to change your scale multiples, call this over a freshly initialized ImGuiStyle structure rather than scaling multiple times. -void ImGuiStyle::ScaleAllSizes(float scale_factor) -{ - WindowPadding = ImFloor(WindowPadding * scale_factor); - WindowRounding = ImFloor(WindowRounding * scale_factor); - WindowMinSize = ImFloor(WindowMinSize * scale_factor); - ChildRounding = ImFloor(ChildRounding * scale_factor); - PopupRounding = ImFloor(PopupRounding * scale_factor); - FramePadding = ImFloor(FramePadding * scale_factor); - FrameRounding = ImFloor(FrameRounding * scale_factor); - ItemSpacing = ImFloor(ItemSpacing * scale_factor); - ItemInnerSpacing = ImFloor(ItemInnerSpacing * scale_factor); - TouchExtraPadding = ImFloor(TouchExtraPadding * scale_factor); - IndentSpacing = ImFloor(IndentSpacing * scale_factor); - ColumnsMinSpacing = ImFloor(ColumnsMinSpacing * scale_factor); - ScrollbarSize = ImFloor(ScrollbarSize * scale_factor); - ScrollbarRounding = ImFloor(ScrollbarRounding * scale_factor); - GrabMinSize = ImFloor(GrabMinSize * scale_factor); - GrabRounding = ImFloor(GrabRounding * scale_factor); - DisplayWindowPadding = ImFloor(DisplayWindowPadding * scale_factor); - DisplaySafeAreaPadding = ImFloor(DisplaySafeAreaPadding * scale_factor); -} - -ImGuiIO::ImGuiIO() -{ - // Most fields are initialized with zero - memset(this, 0, sizeof(*this)); - - // Settings - DisplaySize = ImVec2(-1.0f, -1.0f); - DeltaTime = 1.0f/60.0f; - IniSavingRate = 5.0f; - IniFilename = "imgui.ini"; - LogFilename = "imgui_log.txt"; - MouseDoubleClickTime = 0.30f; - MouseDoubleClickMaxDist = 6.0f; - for (int i = 0; i < ImGuiKey_COUNT; i++) - KeyMap[i] = -1; - KeyRepeatDelay = 0.250f; - KeyRepeatRate = 0.050f; - UserData = NULL; - - Fonts = &GImDefaultFontAtlas; - FontGlobalScale = 1.0f; - FontDefault = NULL; - FontAllowUserScaling = false; - DisplayFramebufferScale = ImVec2(1.0f, 1.0f); - DisplayVisibleMin = DisplayVisibleMax = ImVec2(0.0f, 0.0f); - - // Advanced/subtle behaviors -#ifdef __APPLE__ - OptMacOSXBehaviors = true; // Set Mac OS X style defaults based on __APPLE__ compile time flag -#else - OptMacOSXBehaviors = false; -#endif - OptCursorBlink = true; - - // Settings (User Functions) - RenderDrawListsFn = NULL; - MemAllocFn = malloc; - MemFreeFn = free; - GetClipboardTextFn = GetClipboardTextFn_DefaultImpl; // Platform dependent default implementations - SetClipboardTextFn = SetClipboardTextFn_DefaultImpl; - ClipboardUserData = NULL; - ImeSetInputScreenPosFn = ImeSetInputScreenPosFn_DefaultImpl; - ImeWindowHandle = NULL; - - // Input (NB: we already have memset zero the entire structure) - MousePos = ImVec2(-FLT_MAX, -FLT_MAX); - MousePosPrev = ImVec2(-FLT_MAX, -FLT_MAX); - MouseDragThreshold = 6.0f; - for (int i = 0; i < IM_ARRAYSIZE(MouseDownDuration); i++) MouseDownDuration[i] = MouseDownDurationPrev[i] = -1.0f; - for (int i = 0; i < IM_ARRAYSIZE(KeysDownDuration); i++) KeysDownDuration[i] = KeysDownDurationPrev[i] = -1.0f; -} - -// Pass in translated ASCII characters for text input. -// - with glfw you can get those from the callback set in glfwSetCharCallback() -// - on Windows you can get those using ToAscii+keyboard state, or via the WM_CHAR message -void ImGuiIO::AddInputCharacter(ImWchar c) -{ - const int n = ImStrlenW(InputCharacters); - if (n + 1 < IM_ARRAYSIZE(InputCharacters)) - { - InputCharacters[n] = c; - InputCharacters[n+1] = '\0'; - } -} - -void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars) -{ - // We can't pass more wchars than ImGuiIO::InputCharacters[] can hold so don't convert more - const int wchars_buf_len = sizeof(ImGuiIO::InputCharacters) / sizeof(ImWchar); - ImWchar wchars[wchars_buf_len]; - ImTextStrFromUtf8(wchars, wchars_buf_len, utf8_chars, NULL); - for (int i = 0; i < wchars_buf_len && wchars[i] != 0; i++) - AddInputCharacter(wchars[i]); -} - -//----------------------------------------------------------------------------- -// HELPERS -//----------------------------------------------------------------------------- - -#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose -#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255 - -// Play it nice with Windows users. Notepad in 2015 still doesn't display text data with Unix-style \n. -#ifdef _WIN32 -#define IM_NEWLINE "\r\n" -#else -#define IM_NEWLINE "\n" -#endif - -ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p) -{ - ImVec2 ap = p - a; - ImVec2 ab_dir = b - a; - float ab_len = sqrtf(ab_dir.x * ab_dir.x + ab_dir.y * ab_dir.y); - ab_dir *= 1.0f / ab_len; - float dot = ap.x * ab_dir.x + ap.y * ab_dir.y; - if (dot < 0.0f) - return a; - if (dot > ab_len) - return b; - return a + ab_dir * dot; -} - -bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p) -{ - bool b1 = ((p.x - b.x) * (a.y - b.y) - (p.y - b.y) * (a.x - b.x)) < 0.0f; - bool b2 = ((p.x - c.x) * (b.y - c.y) - (p.y - c.y) * (b.x - c.x)) < 0.0f; - bool b3 = ((p.x - a.x) * (c.y - a.y) - (p.y - a.y) * (c.x - a.x)) < 0.0f; - return ((b1 == b2) && (b2 == b3)); -} - -void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w) -{ - ImVec2 v0 = b - a; - ImVec2 v1 = c - a; - ImVec2 v2 = p - a; - const float denom = v0.x * v1.y - v1.x * v0.y; - out_v = (v2.x * v1.y - v1.x * v2.y) / denom; - out_w = (v0.x * v2.y - v2.x * v0.y) / denom; - out_u = 1.0f - out_v - out_w; -} - -ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p) -{ - ImVec2 proj_ab = ImLineClosestPoint(a, b, p); - ImVec2 proj_bc = ImLineClosestPoint(b, c, p); - ImVec2 proj_ca = ImLineClosestPoint(c, a, p); - float dist2_ab = ImLengthSqr(p - proj_ab); - float dist2_bc = ImLengthSqr(p - proj_bc); - float dist2_ca = ImLengthSqr(p - proj_ca); - float m = ImMin(dist2_ab, ImMin(dist2_bc, dist2_ca)); - if (m == dist2_ab) - return proj_ab; - if (m == dist2_bc) - return proj_bc; - return proj_ca; -} - -int ImStricmp(const char* str1, const char* str2) -{ - int d; - while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; } - return d; -} - -int ImStrnicmp(const char* str1, const char* str2, size_t count) -{ - int d = 0; - while (count > 0 && (d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; count--; } - return d; -} - -void ImStrncpy(char* dst, const char* src, size_t count) -{ - if (count < 1) return; - strncpy(dst, src, count); - dst[count-1] = 0; -} - -char* ImStrdup(const char *str) -{ - size_t len = strlen(str) + 1; - void* buf = ImGui::MemAlloc(len); - return (char*)memcpy(buf, (const void*)str, len); -} - -char* ImStrchrRange(const char* str, const char* str_end, char c) -{ - for ( ; str < str_end; str++) - if (*str == c) - return (char*)str; - return NULL; -} - -int ImStrlenW(const ImWchar* str) -{ - int n = 0; - while (*str++) n++; - return n; -} - -const ImWchar* ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin) // find beginning-of-line -{ - while (buf_mid_line > buf_begin && buf_mid_line[-1] != '\n') - buf_mid_line--; - return buf_mid_line; -} - -const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end) -{ - if (!needle_end) - needle_end = needle + strlen(needle); - - const char un0 = (char)toupper(*needle); - while ((!haystack_end && *haystack) || (haystack_end && haystack < haystack_end)) - { - if (toupper(*haystack) == un0) - { - const char* b = needle + 1; - for (const char* a = haystack + 1; b < needle_end; a++, b++) - if (toupper(*a) != toupper(*b)) - break; - if (b == needle_end) - return haystack; - } - haystack++; - } - return NULL; -} - -static const char* ImAtoi(const char* src, int* output) -{ - int negative = 0; - if (*src == '-') { negative = 1; src++; } - if (*src == '+') { src++; } - int v = 0; - while (*src >= '0' && *src <= '9') - v = (v * 10) + (*src++ - '0'); - *output = negative ? -v : v; - return src; -} - -// A) MSVC version appears to return -1 on overflow, whereas glibc appears to return total count (which may be >= buf_size). -// Ideally we would test for only one of those limits at runtime depending on the behavior the vsnprintf(), but trying to deduct it at compile time sounds like a pandora can of worm. -// B) When buf==NULL vsnprintf() will return the output size. -#ifndef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS -int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - int w = vsnprintf(buf, buf_size, fmt, args); - va_end(args); - if (buf == NULL) - return w; - if (w == -1 || w >= (int)buf_size) - w = (int)buf_size - 1; - buf[w] = 0; - return w; -} - -int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) -{ - int w = vsnprintf(buf, buf_size, fmt, args); - if (buf == NULL) - return w; - if (w == -1 || w >= (int)buf_size) - w = (int)buf_size - 1; - buf[w] = 0; - return w; -} -#endif // #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS - -// Pass data_size==0 for zero-terminated strings -// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements. -ImU32 ImHash(const void* data, int data_size, ImU32 seed) -{ - static ImU32 crc32_lut[256] = { 0 }; - if (!crc32_lut[1]) - { - const ImU32 polynomial = 0xEDB88320; - for (ImU32 i = 0; i < 256; i++) - { - ImU32 crc = i; - for (ImU32 j = 0; j < 8; j++) - crc = (crc >> 1) ^ (ImU32(-int(crc & 1)) & polynomial); - crc32_lut[i] = crc; - } - } - - seed = ~seed; - ImU32 crc = seed; - const unsigned char* current = (const unsigned char*)data; - - if (data_size > 0) - { - // Known size - while (data_size--) - crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ *current++]; - } - else - { - // Zero-terminated string - while (unsigned char c = *current++) - { - // We support a syntax of "label###id" where only "###id" is included in the hash, and only "label" gets displayed. - // Because this syntax is rarely used we are optimizing for the common case. - // - If we reach ### in the string we discard the hash so far and reset to the seed. - // - We don't do 'current += 2; continue;' after handling ### to keep the code smaller. - if (c == '#' && current[0] == '#' && current[1] == '#') - crc = seed; - crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c]; - } - } - return ~crc; -} - -//----------------------------------------------------------------------------- -// ImText* helpers -//----------------------------------------------------------------------------- - -// Convert UTF-8 to 32-bits character, process single character input. -// Based on stb_from_utf8() from github.com/nothings/stb/ -// We handle UTF-8 decoding error by skipping forward. -int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end) -{ - unsigned int c = (unsigned int)-1; - const unsigned char* str = (const unsigned char*)in_text; - if (!(*str & 0x80)) - { - c = (unsigned int)(*str++); - *out_char = c; - return 1; - } - if ((*str & 0xe0) == 0xc0) - { - *out_char = 0xFFFD; // will be invalid but not end of string - if (in_text_end && in_text_end - (const char*)str < 2) return 1; - if (*str < 0xc2) return 2; - c = (unsigned int)((*str++ & 0x1f) << 6); - if ((*str & 0xc0) != 0x80) return 2; - c += (*str++ & 0x3f); - *out_char = c; - return 2; - } - if ((*str & 0xf0) == 0xe0) - { - *out_char = 0xFFFD; // will be invalid but not end of string - if (in_text_end && in_text_end - (const char*)str < 3) return 1; - if (*str == 0xe0 && (str[1] < 0xa0 || str[1] > 0xbf)) return 3; - if (*str == 0xed && str[1] > 0x9f) return 3; // str[1] < 0x80 is checked below - c = (unsigned int)((*str++ & 0x0f) << 12); - if ((*str & 0xc0) != 0x80) return 3; - c += (unsigned int)((*str++ & 0x3f) << 6); - if ((*str & 0xc0) != 0x80) return 3; - c += (*str++ & 0x3f); - *out_char = c; - return 3; - } - if ((*str & 0xf8) == 0xf0) - { - *out_char = 0xFFFD; // will be invalid but not end of string - if (in_text_end && in_text_end - (const char*)str < 4) return 1; - if (*str > 0xf4) return 4; - if (*str == 0xf0 && (str[1] < 0x90 || str[1] > 0xbf)) return 4; - if (*str == 0xf4 && str[1] > 0x8f) return 4; // str[1] < 0x80 is checked below - c = (unsigned int)((*str++ & 0x07) << 18); - if ((*str & 0xc0) != 0x80) return 4; - c += (unsigned int)((*str++ & 0x3f) << 12); - if ((*str & 0xc0) != 0x80) return 4; - c += (unsigned int)((*str++ & 0x3f) << 6); - if ((*str & 0xc0) != 0x80) return 4; - c += (*str++ & 0x3f); - // utf-8 encodings of values used in surrogate pairs are invalid - if ((c & 0xFFFFF800) == 0xD800) return 4; - *out_char = c; - return 4; - } - *out_char = 0; - return 0; -} - -int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_text_remaining) -{ - ImWchar* buf_out = buf; - ImWchar* buf_end = buf + buf_size; - while (buf_out < buf_end-1 && (!in_text_end || in_text < in_text_end) && *in_text) - { - unsigned int c; - in_text += ImTextCharFromUtf8(&c, in_text, in_text_end); - if (c == 0) - break; - if (c < 0x10000) // FIXME: Losing characters that don't fit in 2 bytes - *buf_out++ = (ImWchar)c; - } - *buf_out = 0; - if (in_text_remaining) - *in_text_remaining = in_text; - return (int)(buf_out - buf); -} - -int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end) -{ - int char_count = 0; - while ((!in_text_end || in_text < in_text_end) && *in_text) - { - unsigned int c; - in_text += ImTextCharFromUtf8(&c, in_text, in_text_end); - if (c == 0) - break; - if (c < 0x10000) - char_count++; - } - return char_count; -} - -// Based on stb_to_utf8() from github.com/nothings/stb/ -static inline int ImTextCharToUtf8(char* buf, int buf_size, unsigned int c) -{ - if (c < 0x80) - { - buf[0] = (char)c; - return 1; - } - if (c < 0x800) - { - if (buf_size < 2) return 0; - buf[0] = (char)(0xc0 + (c >> 6)); - buf[1] = (char)(0x80 + (c & 0x3f)); - return 2; - } - if (c >= 0xdc00 && c < 0xe000) - { - return 0; - } - if (c >= 0xd800 && c < 0xdc00) - { - if (buf_size < 4) return 0; - buf[0] = (char)(0xf0 + (c >> 18)); - buf[1] = (char)(0x80 + ((c >> 12) & 0x3f)); - buf[2] = (char)(0x80 + ((c >> 6) & 0x3f)); - buf[3] = (char)(0x80 + ((c ) & 0x3f)); - return 4; - } - //else if (c < 0x10000) - { - if (buf_size < 3) return 0; - buf[0] = (char)(0xe0 + (c >> 12)); - buf[1] = (char)(0x80 + ((c>> 6) & 0x3f)); - buf[2] = (char)(0x80 + ((c ) & 0x3f)); - return 3; - } -} - -static inline int ImTextCountUtf8BytesFromChar(unsigned int c) -{ - if (c < 0x80) return 1; - if (c < 0x800) return 2; - if (c >= 0xdc00 && c < 0xe000) return 0; - if (c >= 0xd800 && c < 0xdc00) return 4; - return 3; -} - -int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end) -{ - char* buf_out = buf; - const char* buf_end = buf + buf_size; - while (buf_out < buf_end-1 && (!in_text_end || in_text < in_text_end) && *in_text) - { - unsigned int c = (unsigned int)(*in_text++); - if (c < 0x80) - *buf_out++ = (char)c; - else - buf_out += ImTextCharToUtf8(buf_out, (int)(buf_end-buf_out-1), c); - } - *buf_out = 0; - return (int)(buf_out - buf); -} - -int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end) -{ - int bytes_count = 0; - while ((!in_text_end || in_text < in_text_end) && *in_text) - { - unsigned int c = (unsigned int)(*in_text++); - if (c < 0x80) - bytes_count++; - else - bytes_count += ImTextCountUtf8BytesFromChar(c); - } - return bytes_count; -} - -ImVec4 ImGui::ColorConvertU32ToFloat4(ImU32 in) -{ - float s = 1.0f/255.0f; - return ImVec4( - ((in >> IM_COL32_R_SHIFT) & 0xFF) * s, - ((in >> IM_COL32_G_SHIFT) & 0xFF) * s, - ((in >> IM_COL32_B_SHIFT) & 0xFF) * s, - ((in >> IM_COL32_A_SHIFT) & 0xFF) * s); -} - -ImU32 ImGui::ColorConvertFloat4ToU32(const ImVec4& in) -{ - ImU32 out; - out = ((ImU32)IM_F32_TO_INT8_SAT(in.x)) << IM_COL32_R_SHIFT; - out |= ((ImU32)IM_F32_TO_INT8_SAT(in.y)) << IM_COL32_G_SHIFT; - out |= ((ImU32)IM_F32_TO_INT8_SAT(in.z)) << IM_COL32_B_SHIFT; - out |= ((ImU32)IM_F32_TO_INT8_SAT(in.w)) << IM_COL32_A_SHIFT; - return out; -} - -ImU32 ImGui::GetColorU32(ImGuiCol idx, float alpha_mul) -{ - ImGuiStyle& style = GImGui->Style; - ImVec4 c = style.Colors[idx]; - c.w *= style.Alpha * alpha_mul; - return ColorConvertFloat4ToU32(c); -} - -ImU32 ImGui::GetColorU32(const ImVec4& col) -{ - ImGuiStyle& style = GImGui->Style; - ImVec4 c = col; - c.w *= style.Alpha; - return ColorConvertFloat4ToU32(c); -} - -const ImVec4& ImGui::GetStyleColorVec4(ImGuiCol idx) -{ - ImGuiStyle& style = GImGui->Style; - return style.Colors[idx]; -} - -ImU32 ImGui::GetColorU32(ImU32 col) -{ - float style_alpha = GImGui->Style.Alpha; - if (style_alpha >= 1.0f) - return col; - int a = (col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT; - a = (int)(a * style_alpha); // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range. - return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT); -} - -// Convert rgb floats ([0-1],[0-1],[0-1]) to hsv floats ([0-1],[0-1],[0-1]), from Foley & van Dam p592 -// Optimized http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv -void ImGui::ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v) -{ - float K = 0.f; - if (g < b) - { - ImSwap(g, b); - K = -1.f; - } - if (r < g) - { - ImSwap(r, g); - K = -2.f / 6.f - K; - } - - const float chroma = r - (g < b ? g : b); - out_h = fabsf(K + (g - b) / (6.f * chroma + 1e-20f)); - out_s = chroma / (r + 1e-20f); - out_v = r; -} - -// Convert hsv floats ([0-1],[0-1],[0-1]) to rgb floats ([0-1],[0-1],[0-1]), from Foley & van Dam p593 -// also http://en.wikipedia.org/wiki/HSL_and_HSV -void ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b) -{ - if (s == 0.0f) - { - // gray - out_r = out_g = out_b = v; - return; - } - - h = fmodf(h, 1.0f) / (60.0f/360.0f); - int i = (int)h; - float f = h - (float)i; - float p = v * (1.0f - s); - float q = v * (1.0f - s * f); - float t = v * (1.0f - s * (1.0f - f)); - - switch (i) - { - case 0: out_r = v; out_g = t; out_b = p; break; - case 1: out_r = q; out_g = v; out_b = p; break; - case 2: out_r = p; out_g = v; out_b = t; break; - case 3: out_r = p; out_g = q; out_b = v; break; - case 4: out_r = t; out_g = p; out_b = v; break; - case 5: default: out_r = v; out_g = p; out_b = q; break; - } -} - -FILE* ImFileOpen(const char* filename, const char* mode) -{ -#if defined(_WIN32) && !defined(__CYGWIN__) - // We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames. Converting both strings from UTF-8 to wchar format (using a single allocation, because we can) - const int filename_wsize = ImTextCountCharsFromUtf8(filename, NULL) + 1; - const int mode_wsize = ImTextCountCharsFromUtf8(mode, NULL) + 1; - ImVector buf; - buf.resize(filename_wsize + mode_wsize); - ImTextStrFromUtf8(&buf[0], filename_wsize, filename, NULL); - ImTextStrFromUtf8(&buf[filename_wsize], mode_wsize, mode, NULL); - return _wfopen((wchar_t*)&buf[0], (wchar_t*)&buf[filename_wsize]); -#else - return fopen(filename, mode); -#endif -} - -// Load file content into memory -// Memory allocated with ImGui::MemAlloc(), must be freed by user using ImGui::MemFree() -void* ImFileLoadToMemory(const char* filename, const char* file_open_mode, int* out_file_size, int padding_bytes) -{ - IM_ASSERT(filename && file_open_mode); - if (out_file_size) - *out_file_size = 0; - - FILE* f; - if ((f = ImFileOpen(filename, file_open_mode)) == NULL) - return NULL; - - long file_size_signed; - if (fseek(f, 0, SEEK_END) || (file_size_signed = ftell(f)) == -1 || fseek(f, 0, SEEK_SET)) - { - fclose(f); - return NULL; - } - - int file_size = (int)file_size_signed; - void* file_data = ImGui::MemAlloc(file_size + padding_bytes); - if (file_data == NULL) - { - fclose(f); - return NULL; - } - if (fread(file_data, 1, (size_t)file_size, f) != (size_t)file_size) - { - fclose(f); - ImGui::MemFree(file_data); - return NULL; - } - if (padding_bytes > 0) - memset((void *)(((char*)file_data) + file_size), 0, padding_bytes); - - fclose(f); - if (out_file_size) - *out_file_size = file_size; - - return file_data; -} - -//----------------------------------------------------------------------------- -// ImGuiStorage -// Helper: Key->value storage -//----------------------------------------------------------------------------- - -// std::lower_bound but without the bullshit -static ImVector::iterator LowerBound(ImVector& data, ImGuiID key) -{ - ImVector::iterator first = data.begin(); - ImVector::iterator last = data.end(); - size_t count = (size_t)(last - first); - while (count > 0) - { - size_t count2 = count >> 1; - ImVector::iterator mid = first + count2; - if (mid->key < key) - { - first = ++mid; - count -= count2 + 1; - } - else - { - count = count2; - } - } - return first; -} - -// For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once. -void ImGuiStorage::BuildSortByKey() -{ - struct StaticFunc - { - static int PairCompareByID(const void* lhs, const void* rhs) - { - // We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that. - if (((const Pair*)lhs)->key > ((const Pair*)rhs)->key) return +1; - if (((const Pair*)lhs)->key < ((const Pair*)rhs)->key) return -1; - return 0; - } - }; - if (Data.Size > 1) - qsort(Data.Data, (size_t)Data.Size, sizeof(Pair), StaticFunc::PairCompareByID); -} - -int ImGuiStorage::GetInt(ImGuiID key, int default_val) const -{ - ImVector::iterator it = LowerBound(const_cast&>(Data), key); - if (it == Data.end() || it->key != key) - return default_val; - return it->val_i; -} - -bool ImGuiStorage::GetBool(ImGuiID key, bool default_val) const -{ - return GetInt(key, default_val ? 1 : 0) != 0; -} - -float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const -{ - ImVector::iterator it = LowerBound(const_cast&>(Data), key); - if (it == Data.end() || it->key != key) - return default_val; - return it->val_f; -} - -void* ImGuiStorage::GetVoidPtr(ImGuiID key) const -{ - ImVector::iterator it = LowerBound(const_cast&>(Data), key); - if (it == Data.end() || it->key != key) - return NULL; - return it->val_p; -} - -// References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer. -int* ImGuiStorage::GetIntRef(ImGuiID key, int default_val) -{ - ImVector::iterator it = LowerBound(Data, key); - if (it == Data.end() || it->key != key) - it = Data.insert(it, Pair(key, default_val)); - return &it->val_i; -} - -bool* ImGuiStorage::GetBoolRef(ImGuiID key, bool default_val) -{ - return (bool*)GetIntRef(key, default_val ? 1 : 0); -} - -float* ImGuiStorage::GetFloatRef(ImGuiID key, float default_val) -{ - ImVector::iterator it = LowerBound(Data, key); - if (it == Data.end() || it->key != key) - it = Data.insert(it, Pair(key, default_val)); - return &it->val_f; -} - -void** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val) -{ - ImVector::iterator it = LowerBound(Data, key); - if (it == Data.end() || it->key != key) - it = Data.insert(it, Pair(key, default_val)); - return &it->val_p; -} - -// FIXME-OPT: Need a way to reuse the result of lower_bound when doing GetInt()/SetInt() - not too bad because it only happens on explicit interaction (maximum one a frame) -void ImGuiStorage::SetInt(ImGuiID key, int val) -{ - ImVector::iterator it = LowerBound(Data, key); - if (it == Data.end() || it->key != key) - { - Data.insert(it, Pair(key, val)); - return; - } - it->val_i = val; -} - -void ImGuiStorage::SetBool(ImGuiID key, bool val) -{ - SetInt(key, val ? 1 : 0); -} - -void ImGuiStorage::SetFloat(ImGuiID key, float val) -{ - ImVector::iterator it = LowerBound(Data, key); - if (it == Data.end() || it->key != key) - { - Data.insert(it, Pair(key, val)); - return; - } - it->val_f = val; -} - -void ImGuiStorage::SetVoidPtr(ImGuiID key, void* val) -{ - ImVector::iterator it = LowerBound(Data, key); - if (it == Data.end() || it->key != key) - { - Data.insert(it, Pair(key, val)); - return; - } - it->val_p = val; -} - -void ImGuiStorage::SetAllInt(int v) -{ - for (int i = 0; i < Data.Size; i++) - Data[i].val_i = v; -} - -//----------------------------------------------------------------------------- -// ImGuiTextFilter -//----------------------------------------------------------------------------- - -// Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]" -ImGuiTextFilter::ImGuiTextFilter(const char* default_filter) -{ - if (default_filter) - { - ImStrncpy(InputBuf, default_filter, IM_ARRAYSIZE(InputBuf)); - Build(); - } - else - { - InputBuf[0] = 0; - CountGrep = 0; - } -} - -bool ImGuiTextFilter::Draw(const char* label, float width) -{ - if (width != 0.0f) - ImGui::PushItemWidth(width); - bool value_changed = ImGui::InputText(label, InputBuf, IM_ARRAYSIZE(InputBuf)); - if (width != 0.0f) - ImGui::PopItemWidth(); - if (value_changed) - Build(); - return value_changed; -} - -void ImGuiTextFilter::TextRange::split(char separator, ImVector& out) -{ - out.resize(0); - const char* wb = b; - const char* we = wb; - while (we < e) - { - if (*we == separator) - { - out.push_back(TextRange(wb, we)); - wb = we + 1; - } - we++; - } - if (wb != we) - out.push_back(TextRange(wb, we)); -} - -void ImGuiTextFilter::Build() -{ - Filters.resize(0); - TextRange input_range(InputBuf, InputBuf+strlen(InputBuf)); - input_range.split(',', Filters); - - CountGrep = 0; - for (int i = 0; i != Filters.Size; i++) - { - Filters[i].trim_blanks(); - if (Filters[i].empty()) - continue; - if (Filters[i].front() != '-') - CountGrep += 1; - } -} - -bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const -{ - if (Filters.empty()) - return true; - - if (text == NULL) - text = ""; - - for (int i = 0; i != Filters.Size; i++) - { - const TextRange& f = Filters[i]; - if (f.empty()) - continue; - if (f.front() == '-') - { - // Subtract - if (ImStristr(text, text_end, f.begin()+1, f.end()) != NULL) - return false; - } - else - { - // Grep - if (ImStristr(text, text_end, f.begin(), f.end()) != NULL) - return true; - } - } - - // Implicit * grep - if (CountGrep == 0) - return true; - - return false; -} - -//----------------------------------------------------------------------------- -// ImGuiTextBuffer -//----------------------------------------------------------------------------- - -// On some platform vsnprintf() takes va_list by reference and modifies it. -// va_copy is the 'correct' way to copy a va_list but Visual Studio prior to 2013 doesn't have it. -#ifndef va_copy -#define va_copy(dest, src) (dest = src) -#endif - -// Helper: Text buffer for logging/accumulating text -void ImGuiTextBuffer::appendfv(const char* fmt, va_list args) -{ - va_list args_copy; - va_copy(args_copy, args); - - int len = ImFormatStringV(NULL, 0, fmt, args); // FIXME-OPT: could do a first pass write attempt, likely successful on first pass. - if (len <= 0) - return; - - const int write_off = Buf.Size; - const int needed_sz = write_off + len; - if (write_off + len >= Buf.Capacity) - { - int double_capacity = Buf.Capacity * 2; - Buf.reserve(needed_sz > double_capacity ? needed_sz : double_capacity); - } - - Buf.resize(needed_sz); - ImFormatStringV(&Buf[write_off - 1], len + 1, fmt, args_copy); -} - -void ImGuiTextBuffer::appendf(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - appendfv(fmt, args); - va_end(args); -} - -//----------------------------------------------------------------------------- -// ImGuiSimpleColumns (internal use only) -//----------------------------------------------------------------------------- - -ImGuiSimpleColumns::ImGuiSimpleColumns() -{ - Count = 0; - Spacing = Width = NextWidth = 0.0f; - memset(Pos, 0, sizeof(Pos)); - memset(NextWidths, 0, sizeof(NextWidths)); -} - -void ImGuiSimpleColumns::Update(int count, float spacing, bool clear) -{ - IM_ASSERT(Count <= IM_ARRAYSIZE(Pos)); - Count = count; - Width = NextWidth = 0.0f; - Spacing = spacing; - if (clear) memset(NextWidths, 0, sizeof(NextWidths)); - for (int i = 0; i < Count; i++) - { - if (i > 0 && NextWidths[i] > 0.0f) - Width += Spacing; - Pos[i] = (float)(int)Width; - Width += NextWidths[i]; - NextWidths[i] = 0.0f; - } -} - -float ImGuiSimpleColumns::DeclColumns(float w0, float w1, float w2) // not using va_arg because they promote float to double -{ - NextWidth = 0.0f; - NextWidths[0] = ImMax(NextWidths[0], w0); - NextWidths[1] = ImMax(NextWidths[1], w1); - NextWidths[2] = ImMax(NextWidths[2], w2); - for (int i = 0; i < 3; i++) - NextWidth += NextWidths[i] + ((i > 0 && NextWidths[i] > 0.0f) ? Spacing : 0.0f); - return ImMax(Width, NextWidth); -} - -float ImGuiSimpleColumns::CalcExtraSpace(float avail_w) -{ - return ImMax(0.0f, avail_w - Width); -} - -//----------------------------------------------------------------------------- -// ImGuiListClipper -//----------------------------------------------------------------------------- - -static void SetCursorPosYAndSetupDummyPrevLine(float pos_y, float line_height) -{ - // Set cursor position and a few other things so that SetScrollHere() and Columns() can work when seeking cursor. - // FIXME: It is problematic that we have to do that here, because custom/equivalent end-user code would stumble on the same issue. Consider moving within SetCursorXXX functions? - ImGui::SetCursorPosY(pos_y); - ImGuiWindow* window = ImGui::GetCurrentWindow(); - window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y - line_height; // Setting those fields so that SetScrollHere() can properly function after the end of our clipper usage. - window->DC.PrevLineHeight = (line_height - GImGui->Style.ItemSpacing.y); // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list. - if (window->DC.ColumnsSet) - window->DC.ColumnsSet->CellMinY = window->DC.CursorPos.y; // Setting this so that cell Y position are set properly -} - -// Use case A: Begin() called from constructor with items_height<0, then called again from Sync() in StepNo 1 -// Use case B: Begin() called from constructor with items_height>0 -// FIXME-LEGACY: Ideally we should remove the Begin/End functions but they are part of the legacy API we still support. This is why some of the code in Step() calling Begin() and reassign some fields, spaghetti style. -void ImGuiListClipper::Begin(int count, float items_height) -{ - StartPosY = ImGui::GetCursorPosY(); - ItemsHeight = items_height; - ItemsCount = count; - StepNo = 0; - DisplayEnd = DisplayStart = -1; - if (ItemsHeight > 0.0f) - { - ImGui::CalcListClipping(ItemsCount, ItemsHeight, &DisplayStart, &DisplayEnd); // calculate how many to clip/display - if (DisplayStart > 0) - SetCursorPosYAndSetupDummyPrevLine(StartPosY + DisplayStart * ItemsHeight, ItemsHeight); // advance cursor - StepNo = 2; - } -} - -void ImGuiListClipper::End() -{ - if (ItemsCount < 0) - return; - // In theory here we should assert that ImGui::GetCursorPosY() == StartPosY + DisplayEnd * ItemsHeight, but it feels saner to just seek at the end and not assert/crash the user. - if (ItemsCount < INT_MAX) - SetCursorPosYAndSetupDummyPrevLine(StartPosY + ItemsCount * ItemsHeight, ItemsHeight); // advance cursor - ItemsCount = -1; - StepNo = 3; -} - -bool ImGuiListClipper::Step() -{ - if (ItemsCount == 0 || ImGui::GetCurrentWindowRead()->SkipItems) - { - ItemsCount = -1; - return false; - } - if (StepNo == 0) // Step 0: the clipper let you process the first element, regardless of it being visible or not, so we can measure the element height. - { - DisplayStart = 0; - DisplayEnd = 1; - StartPosY = ImGui::GetCursorPosY(); - StepNo = 1; - return true; - } - if (StepNo == 1) // Step 1: the clipper infer height from first element, calculate the actual range of elements to display, and position the cursor before the first element. - { - if (ItemsCount == 1) { ItemsCount = -1; return false; } - float items_height = ImGui::GetCursorPosY() - StartPosY; - IM_ASSERT(items_height > 0.0f); // If this triggers, it means Item 0 hasn't moved the cursor vertically - Begin(ItemsCount-1, items_height); - DisplayStart++; - DisplayEnd++; - StepNo = 3; - return true; - } - if (StepNo == 2) // Step 2: dummy step only required if an explicit items_height was passed to constructor or Begin() and user still call Step(). Does nothing and switch to Step 3. - { - IM_ASSERT(DisplayStart >= 0 && DisplayEnd >= 0); - StepNo = 3; - return true; - } - if (StepNo == 3) // Step 3: the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), advance the cursor to the end of the list and then returns 'false' to end the loop. - End(); - return false; -} - -//----------------------------------------------------------------------------- -// ImGuiWindow -//----------------------------------------------------------------------------- - -ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name) -{ - Name = ImStrdup(name); - ID = ImHash(name, 0); - IDStack.push_back(ID); - Flags = 0; - PosFloat = Pos = ImVec2(0.0f, 0.0f); - Size = SizeFull = ImVec2(0.0f, 0.0f); - SizeContents = SizeContentsExplicit = ImVec2(0.0f, 0.0f); - WindowPadding = ImVec2(0.0f, 0.0f); - WindowRounding = 0.0f; - WindowBorderSize = 0.0f; - MoveId = GetID("#MOVE"); - Scroll = ImVec2(0.0f, 0.0f); - ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); - ScrollTargetCenterRatio = ImVec2(0.5f, 0.5f); - ScrollbarX = ScrollbarY = false; - ScrollbarSizes = ImVec2(0.0f, 0.0f); - Active = WasActive = false; - WriteAccessed = false; - Collapsed = false; - SkipItems = false; - Appearing = false; - CloseButton = false; - BeginOrderWithinParent = -1; - BeginOrderWithinContext = -1; - BeginCount = 0; - PopupId = 0; - AutoFitFramesX = AutoFitFramesY = -1; - AutoFitOnlyGrows = false; - AutoFitChildAxises = 0x00; - AutoPosLastDirection = ImGuiDir_None; - HiddenFrames = 0; - SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing; - SetWindowPosVal = SetWindowPosPivot = ImVec2(FLT_MAX, FLT_MAX); - - LastFrameActive = -1; - ItemWidthDefault = 0.0f; - FontWindowScale = 1.0f; - - DrawList = IM_NEW(ImDrawList)(&context->DrawListSharedData); - DrawList->_OwnerName = Name; - ParentWindow = NULL; - RootWindow = NULL; - RootNonPopupWindow = NULL; - - FocusIdxAllCounter = FocusIdxTabCounter = -1; - FocusIdxAllRequestCurrent = FocusIdxTabRequestCurrent = INT_MAX; - FocusIdxAllRequestNext = FocusIdxTabRequestNext = INT_MAX; -} - -ImGuiWindow::~ImGuiWindow() -{ - IM_DELETE(DrawList); - IM_DELETE(Name); -} - -ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end) -{ - ImGuiID seed = IDStack.back(); - ImGuiID id = ImHash(str, str_end ? (int)(str_end - str) : 0, seed); - ImGui::KeepAliveID(id); - return id; -} - -ImGuiID ImGuiWindow::GetID(const void* ptr) -{ - ImGuiID seed = IDStack.back(); - ImGuiID id = ImHash(&ptr, sizeof(void*), seed); - ImGui::KeepAliveID(id); - return id; -} - -ImGuiID ImGuiWindow::GetIDNoKeepAlive(const char* str, const char* str_end) -{ - ImGuiID seed = IDStack.back(); - return ImHash(str, str_end ? (int)(str_end - str) : 0, seed); -} - -// This is only used in rare/specific situations to manufacture an ID out of nowhere. -ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs) -{ - ImGuiID seed = IDStack.back(); - const int r_rel[4] = { (int)(r_abs.Min.x - Pos.x), (int)(r_abs.Min.y - Pos.y), (int)(r_abs.Max.x - Pos.x), (int)(r_abs.Max.y - Pos.y) }; - ImGuiID id = ImHash(&r_rel, sizeof(r_rel), seed); - ImGui::KeepAliveID(id); - return id; -} - -//----------------------------------------------------------------------------- -// Internal API exposed in imgui_internal.h -//----------------------------------------------------------------------------- - -static void SetCurrentWindow(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - g.CurrentWindow = window; - if (window) - g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); -} - -void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - g.ActiveIdIsJustActivated = (g.ActiveId != id); - if (g.ActiveIdIsJustActivated) - g.ActiveIdTimer = 0.0f; - g.ActiveId = id; - g.ActiveIdAllowOverlap = false; - g.ActiveIdIsAlive |= (id != 0); - g.ActiveIdWindow = window; -} - -void ImGui::ClearActiveID() -{ - SetActiveID(0, NULL); -} - -void ImGui::SetHoveredID(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - g.HoveredId = id; - g.HoveredIdAllowOverlap = false; - g.HoveredIdTimer = (id != 0 && g.HoveredIdPreviousFrame == id) ? (g.HoveredIdTimer + g.IO.DeltaTime) : 0.0f; -} - -void ImGui::KeepAliveID(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - if (g.ActiveId == id) - g.ActiveIdIsAlive = true; -} - -static inline bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags) -{ - // An active popup disable hovering on other windows (apart from its own children) - // FIXME-OPT: This could be cached/stored within the window. - ImGuiContext& g = *GImGui; - if (g.NavWindow) - if (ImGuiWindow* focused_root_window = g.NavWindow->RootWindow) - if (focused_root_window->WasActive && focused_root_window != window->RootWindow) - { - // For the purpose of those flags we differentiate "standard popup" from "modal popup" - // NB: The order of those two tests is important because Modal windows are also Popups. - if (focused_root_window->Flags & ImGuiWindowFlags_Modal) - return false; - if ((focused_root_window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiHoveredFlags_AllowWhenBlockedByPopup)) - return false; - } - - return true; -} - -// Advance cursor given item size for layout. -void ImGui::ItemSize(const ImVec2& size, float text_offset_y) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return; - - // Always align ourselves on pixel boundaries - const float line_height = ImMax(window->DC.CurrentLineHeight, size.y); - const float text_base_offset = ImMax(window->DC.CurrentLineTextBaseOffset, text_offset_y); - //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG] - window->DC.CursorPosPrevLine = ImVec2(window->DC.CursorPos.x + size.x, window->DC.CursorPos.y); - window->DC.CursorPos = ImVec2((float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX), (float)(int)(window->DC.CursorPos.y + line_height + g.Style.ItemSpacing.y)); - window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x); - window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y); - //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG] - - window->DC.PrevLineHeight = line_height; - window->DC.PrevLineTextBaseOffset = text_base_offset; - window->DC.CurrentLineHeight = window->DC.CurrentLineTextBaseOffset = 0.0f; - - // Horizontal layout mode - if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) - SameLine(); -} - -void ImGui::ItemSize(const ImRect& bb, float text_offset_y) -{ - ItemSize(bb.GetSize(), text_offset_y); -} - -// Declare item bounding box for clipping and interaction. -// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface -// declares their minimum size requirement to ItemSize() and then use a larger region for drawing/interaction, which is passed to ItemAdd(). -bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - const bool is_clipped = IsClippedEx(bb, id, false); - window->DC.LastItemId = id; - window->DC.LastItemRect = bb; - window->DC.LastItemRectHoveredRect = false; - if (is_clipped) - return false; - //if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG] - - // We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them) - window->DC.LastItemRectHoveredRect = IsMouseHoveringRect(bb.Min, bb.Max); - return true; -} - -// This is roughly matching the behavior of internal-facing ItemHoverable() -// - we allow hovering to be true when ActiveId==window->MoveID, so that clicking on non-interactive items such as a Text() item still returns true with IsItemHovered() -// - this should work even for non-interactive items that have no ID, so we cannot use LastItemId -bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - // Test for bounding box overlap, as updated as ItemAdd() - if (!window->DC.LastItemRectHoveredRect) - return false; - IM_ASSERT((flags & (ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows)) == 0); // Flags not supported by this function - - // Test if we are hovering the right window (our window could be behind another window) - // [2017/10/16] Reverted commit 344d48be3 and testing RootWindow instead. I believe it is correct to NOT test for RootWindow but this leaves us unable to use IsItemHovered() after EndChild() itself. - // Until a solution is found I believe reverting to the test from 2017/09/27 is safe since this was the test that has been running for a long while. - //if (g.HoveredWindow != window) - // return false; - if (g.HoveredRootWindow != window->RootWindow && !(flags & ImGuiHoveredFlags_AllowWhenOverlapped)) - return false; - - // Test if another item is active (e.g. being dragged) - if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) - if (g.ActiveId != 0 && g.ActiveId != window->DC.LastItemId && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId) - return false; - - // Test if interactions on this window are blocked by an active popup or modal - if (!IsWindowContentHoverable(window, flags)) - return false; - - // Test if the item is disabled - if (window->DC.ItemFlags & ImGuiItemFlags_Disabled) - return false; - - // Special handling for the 1st item after Begin() which represent the title bar. When the window is collapsed (SkipItems==true) that last item will never be overwritten so we need to detect tht case. - if (window->DC.LastItemId == window->MoveId && window->WriteAccessed) - return false; - return true; -} - -// Internal facing ItemHoverable() used when submitting widgets. Differs slightly from IsItemHovered(). -bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id) -{ - ImGuiContext& g = *GImGui; - if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap) - return false; - - ImGuiWindow* window = g.CurrentWindow; - if (g.HoveredWindow != window) - return false; - if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap) - return false; - if (!IsMouseHoveringRect(bb.Min, bb.Max)) - return false; - if (!IsWindowContentHoverable(window, ImGuiHoveredFlags_Default)) - return false; - if (window->DC.ItemFlags & ImGuiItemFlags_Disabled) - return false; - - SetHoveredID(id); - return true; -} - -bool ImGui::IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (!bb.Overlaps(window->ClipRect)) - if (id == 0 || id != g.ActiveId) - if (clip_even_when_logged || !g.LogEnabled) - return true; - return false; -} - -bool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop) -{ - ImGuiContext& g = *GImGui; - - const bool allow_keyboard_focus = (window->DC.ItemFlags & (ImGuiItemFlags_AllowKeyboardFocus | ImGuiItemFlags_Disabled)) == ImGuiItemFlags_AllowKeyboardFocus; - window->FocusIdxAllCounter++; - if (allow_keyboard_focus) - window->FocusIdxTabCounter++; - - // Process keyboard input at this point: TAB/Shift-TAB to tab out of the currently focused item. - // Note that we can always TAB out of a widget that doesn't allow tabbing in. - if (tab_stop && (g.ActiveId == id) && window->FocusIdxAllRequestNext == INT_MAX && window->FocusIdxTabRequestNext == INT_MAX && !g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab)) - window->FocusIdxTabRequestNext = window->FocusIdxTabCounter + (g.IO.KeyShift ? (allow_keyboard_focus ? -1 : 0) : +1); // Modulo on index will be applied at the end of frame once we've got the total counter of items. - - if (window->FocusIdxAllCounter == window->FocusIdxAllRequestCurrent) - return true; - - if (allow_keyboard_focus) - if (window->FocusIdxTabCounter == window->FocusIdxTabRequestCurrent) - return true; - - return false; -} - -void ImGui::FocusableItemUnregister(ImGuiWindow* window) -{ - window->FocusIdxAllCounter--; - window->FocusIdxTabCounter--; -} - -ImVec2 ImGui::CalcItemSize(ImVec2 size, float default_x, float default_y) -{ - ImGuiContext& g = *GImGui; - ImVec2 content_max; - if (size.x < 0.0f || size.y < 0.0f) - content_max = g.CurrentWindow->Pos + GetContentRegionMax(); - if (size.x <= 0.0f) - size.x = (size.x == 0.0f) ? default_x : ImMax(content_max.x - g.CurrentWindow->DC.CursorPos.x, 4.0f) + size.x; - if (size.y <= 0.0f) - size.y = (size.y == 0.0f) ? default_y : ImMax(content_max.y - g.CurrentWindow->DC.CursorPos.y, 4.0f) + size.y; - return size; -} - -float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x) -{ - if (wrap_pos_x < 0.0f) - return 0.0f; - - ImGuiWindow* window = GetCurrentWindowRead(); - if (wrap_pos_x == 0.0f) - wrap_pos_x = GetContentRegionMax().x + window->Pos.x; - else if (wrap_pos_x > 0.0f) - wrap_pos_x += window->Pos.x - window->Scroll.x; // wrap_pos_x is provided is window local space - - return ImMax(wrap_pos_x - pos.x, 1.0f); -} - -//----------------------------------------------------------------------------- - -void* ImGui::MemAlloc(size_t sz) -{ - GImGui->IO.MetricsAllocs++; - return GImGui->IO.MemAllocFn(sz); -} - -void ImGui::MemFree(void* ptr) -{ - if (ptr) GImGui->IO.MetricsAllocs--; - return GImGui->IO.MemFreeFn(ptr); -} - -const char* ImGui::GetClipboardText() -{ - return GImGui->IO.GetClipboardTextFn ? GImGui->IO.GetClipboardTextFn(GImGui->IO.ClipboardUserData) : ""; -} - -void ImGui::SetClipboardText(const char* text) -{ - if (GImGui->IO.SetClipboardTextFn) - GImGui->IO.SetClipboardTextFn(GImGui->IO.ClipboardUserData, text); -} - -const char* ImGui::GetVersion() -{ - return IMGUI_VERSION; -} - -// Internal state access - if you want to share ImGui state between modules (e.g. DLL) or allocate it yourself -// Note that we still point to some static data and members (such as GFontAtlas), so the state instance you end up using will point to the static data within its module -ImGuiContext* ImGui::GetCurrentContext() -{ - return GImGui; -} - -void ImGui::SetCurrentContext(ImGuiContext* ctx) -{ -#ifdef IMGUI_SET_CURRENT_CONTEXT_FUNC - IMGUI_SET_CURRENT_CONTEXT_FUNC(ctx); // For custom thread-based hackery you may want to have control over this. -#else - GImGui = ctx; -#endif -} - -ImGuiContext* ImGui::CreateContext(void* (*malloc_fn)(size_t), void (*free_fn)(void*)) -{ - if (!malloc_fn) malloc_fn = malloc; - ImGuiContext* ctx = (ImGuiContext*)malloc_fn(sizeof(ImGuiContext)); - IM_PLACEMENT_NEW(ctx) ImGuiContext(); - ctx->IO.MemAllocFn = malloc_fn; - ctx->IO.MemFreeFn = free_fn ? free_fn : free; - return ctx; -} - -void ImGui::DestroyContext(ImGuiContext* ctx) -{ - void (*free_fn)(void*) = ctx->IO.MemFreeFn; - ctx->~ImGuiContext(); - free_fn(ctx); - if (GImGui == ctx) - SetCurrentContext(NULL); -} - -ImGuiIO& ImGui::GetIO() -{ - return GImGui->IO; -} - -ImGuiStyle& ImGui::GetStyle() -{ - return GImGui->Style; -} - -// Same value as passed to your RenderDrawListsFn() function. valid after Render() and until the next call to NewFrame() -ImDrawData* ImGui::GetDrawData() -{ - return GImGui->RenderDrawData.Valid ? &GImGui->RenderDrawData : NULL; -} - -float ImGui::GetTime() -{ - return GImGui->Time; -} - -int ImGui::GetFrameCount() -{ - return GImGui->FrameCount; -} - -ImDrawList* ImGui::GetOverlayDrawList() -{ - return &GImGui->OverlayDrawList; -} - -ImDrawListSharedData* ImGui::GetDrawListSharedData() -{ - return &GImGui->DrawListSharedData; -} - -void ImGui::NewFrame() -{ - ImGuiContext& g = *GImGui; - - // Check user data - // (We pass an error message in the assert expression as a trick to get it visible to programmers who are not using a debugger, as most assert handlers display their argument) - IM_ASSERT(g.IO.DeltaTime >= 0.0f && "Need a positive DeltaTime (zero is tolerated but will cause some timing issues)"); - IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f && "Invalid DisplaySize value"); - IM_ASSERT(g.IO.Fonts->Fonts.Size > 0 && "Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?"); - IM_ASSERT(g.IO.Fonts->Fonts[0]->IsLoaded() && "Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?"); - IM_ASSERT(g.Style.CurveTessellationTol > 0.0f && "Invalid style setting"); - IM_ASSERT(g.Style.Alpha >= 0.0f && g.Style.Alpha <= 1.0f && "Invalid style setting. Alpha cannot be negative (allows us to avoid a few clamps in color computations)"); - IM_ASSERT((g.FrameCount == 0 || g.FrameCountEnded == g.FrameCount) && "Forgot to call Render() or EndFrame() at the end of the previous frame?"); - - // Initialize on first frame - if (!g.Initialized) - Initialize(); - - SetCurrentFont(GetDefaultFont()); - IM_ASSERT(g.Font->IsLoaded()); - g.DrawListSharedData.ClipRectFullscreen = ImVec4(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y); - g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol; - - g.Time += g.IO.DeltaTime; - g.FrameCount += 1; - g.TooltipOverrideCount = 0; - g.WindowsActiveCount = 0; - g.OverlayDrawList.Clear(); - g.OverlayDrawList.PushTextureID(g.IO.Fonts->TexID); - g.OverlayDrawList.PushClipRectFullScreen(); - g.OverlayDrawList.Flags = (g.Style.AntiAliasedLines ? ImDrawListFlags_AntiAliasedLines : 0) | (g.Style.AntiAliasedFill ? ImDrawListFlags_AntiAliasedFill : 0); - - // Mark rendering data as invalid to prevent user who may have a handle on it to use it - g.RenderDrawData.Valid = false; - g.RenderDrawData.CmdLists = NULL; - g.RenderDrawData.CmdListsCount = g.RenderDrawData.TotalVtxCount = g.RenderDrawData.TotalIdxCount = 0; - - // Clear reference to active widget if the widget isn't alive anymore - if (!g.HoveredIdPreviousFrame) - g.HoveredIdTimer = 0.0f; - g.HoveredIdPreviousFrame = g.HoveredId; - g.HoveredId = 0; - g.HoveredIdAllowOverlap = false; - if (!g.ActiveIdIsAlive && g.ActiveIdPreviousFrame == g.ActiveId && g.ActiveId != 0) - ClearActiveID(); - if (g.ActiveId) - g.ActiveIdTimer += g.IO.DeltaTime; - g.ActiveIdPreviousFrame = g.ActiveId; - g.ActiveIdIsAlive = false; - g.ActiveIdIsJustActivated = false; - if (g.ScalarAsInputTextId && g.ActiveId != g.ScalarAsInputTextId) - g.ScalarAsInputTextId = 0; - - // Elapse drag & drop payload - if (g.DragDropActive && g.DragDropPayload.DataFrameCount + 1 < g.FrameCount) - { - ClearDragDrop(); - g.DragDropPayloadBufHeap.clear(); - memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); - } - g.DragDropAcceptIdPrev = g.DragDropAcceptIdCurr; - g.DragDropAcceptIdCurr = 0; - g.DragDropAcceptIdCurrRectSurface = FLT_MAX; - - // Update keyboard input state - memcpy(g.IO.KeysDownDurationPrev, g.IO.KeysDownDuration, sizeof(g.IO.KeysDownDuration)); - for (int i = 0; i < IM_ARRAYSIZE(g.IO.KeysDown); i++) - g.IO.KeysDownDuration[i] = g.IO.KeysDown[i] ? (g.IO.KeysDownDuration[i] < 0.0f ? 0.0f : g.IO.KeysDownDuration[i] + g.IO.DeltaTime) : -1.0f; - - // Update mouse input state - // If mouse just appeared or disappeared (usually denoted by -FLT_MAX component, but in reality we test for -256000.0f) we cancel out movement in MouseDelta - if (IsMousePosValid(&g.IO.MousePos) && IsMousePosValid(&g.IO.MousePosPrev)) - g.IO.MouseDelta = g.IO.MousePos - g.IO.MousePosPrev; - else - g.IO.MouseDelta = ImVec2(0.0f, 0.0f); - g.IO.MousePosPrev = g.IO.MousePos; - for (int i = 0; i < IM_ARRAYSIZE(g.IO.MouseDown); i++) - { - g.IO.MouseClicked[i] = g.IO.MouseDown[i] && g.IO.MouseDownDuration[i] < 0.0f; - g.IO.MouseReleased[i] = !g.IO.MouseDown[i] && g.IO.MouseDownDuration[i] >= 0.0f; - g.IO.MouseDownDurationPrev[i] = g.IO.MouseDownDuration[i]; - g.IO.MouseDownDuration[i] = g.IO.MouseDown[i] ? (g.IO.MouseDownDuration[i] < 0.0f ? 0.0f : g.IO.MouseDownDuration[i] + g.IO.DeltaTime) : -1.0f; - g.IO.MouseDoubleClicked[i] = false; - if (g.IO.MouseClicked[i]) - { - if (g.Time - g.IO.MouseClickedTime[i] < g.IO.MouseDoubleClickTime) - { - if (ImLengthSqr(g.IO.MousePos - g.IO.MouseClickedPos[i]) < g.IO.MouseDoubleClickMaxDist * g.IO.MouseDoubleClickMaxDist) - g.IO.MouseDoubleClicked[i] = true; - g.IO.MouseClickedTime[i] = -FLT_MAX; // so the third click isn't turned into a double-click - } - else - { - g.IO.MouseClickedTime[i] = g.Time; - } - g.IO.MouseClickedPos[i] = g.IO.MousePos; - g.IO.MouseDragMaxDistanceAbs[i] = ImVec2(0.0f, 0.0f); - g.IO.MouseDragMaxDistanceSqr[i] = 0.0f; - } - else if (g.IO.MouseDown[i]) - { - ImVec2 mouse_delta = g.IO.MousePos - g.IO.MouseClickedPos[i]; - g.IO.MouseDragMaxDistanceAbs[i].x = ImMax(g.IO.MouseDragMaxDistanceAbs[i].x, mouse_delta.x < 0.0f ? -mouse_delta.x : mouse_delta.x); - g.IO.MouseDragMaxDistanceAbs[i].y = ImMax(g.IO.MouseDragMaxDistanceAbs[i].y, mouse_delta.y < 0.0f ? -mouse_delta.y : mouse_delta.y); - g.IO.MouseDragMaxDistanceSqr[i] = ImMax(g.IO.MouseDragMaxDistanceSqr[i], ImLengthSqr(mouse_delta)); - } - } - - // Calculate frame-rate for the user, as a purely luxurious feature - g.FramerateSecPerFrameAccum += g.IO.DeltaTime - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx]; - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx] = g.IO.DeltaTime; - g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame); - g.IO.Framerate = 1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame)); - - // Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering). Only valid for root windows. - if (g.MovingWindowMoveId && g.MovingWindowMoveId == g.ActiveId) - { - KeepAliveID(g.MovingWindowMoveId); - IM_ASSERT(g.MovingWindow && g.MovingWindow->RootWindow); - IM_ASSERT(g.MovingWindow->MoveId == g.MovingWindowMoveId); - if (g.IO.MouseDown[0]) - { - ImVec2 pos = g.IO.MousePos - g.ActiveIdClickOffset; - if (g.MovingWindow->RootWindow->PosFloat.x != pos.x || g.MovingWindow->RootWindow->PosFloat.y != pos.y) - MarkIniSettingsDirty(g.MovingWindow->RootWindow); - g.MovingWindow->RootWindow->PosFloat = pos; - FocusWindow(g.MovingWindow); - } - else - { - ClearActiveID(); - g.MovingWindow = NULL; - g.MovingWindowMoveId = 0; - } - } - else - { - g.MovingWindow = NULL; - g.MovingWindowMoveId = 0; - } - - // Delay saving settings so we don't spam disk too much - if (g.SettingsDirtyTimer > 0.0f) - { - g.SettingsDirtyTimer -= g.IO.DeltaTime; - if (g.SettingsDirtyTimer <= 0.0f) - SaveIniSettingsToDisk(g.IO.IniFilename); - } - - // Find the window we are hovering - // - Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow. - // - When moving a window we can skip the search, which also conveniently bypasses the fact that window->WindowRectClipped is lagging as this point. - // - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms. - g.HoveredWindow = (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoInputs)) ? g.MovingWindow : FindHoveredWindow(g.IO.MousePos); - g.HoveredRootWindow = g.HoveredWindow ? g.HoveredWindow->RootWindow : NULL; - - ImGuiWindow* modal_window = GetFrontMostModalRootWindow(); - if (modal_window != NULL) - { - g.ModalWindowDarkeningRatio = ImMin(g.ModalWindowDarkeningRatio + g.IO.DeltaTime * 6.0f, 1.0f); - if (g.HoveredRootWindow && !IsWindowChildOf(g.HoveredRootWindow, modal_window)) - g.HoveredRootWindow = g.HoveredWindow = NULL; - } - else - { - g.ModalWindowDarkeningRatio = 0.0f; - } - - // Update the WantCaptureMouse/WantCAptureKeyboard flags, so user can capture/discard the inputs away from the rest of their application. - // When clicking outside of a window we assume the click is owned by the application and won't request capture. We need to track click ownership. - int mouse_earliest_button_down = -1; - bool mouse_any_down = false; - for (int i = 0; i < IM_ARRAYSIZE(g.IO.MouseDown); i++) - { - if (g.IO.MouseClicked[i]) - g.IO.MouseDownOwned[i] = (g.HoveredWindow != NULL) || (!g.OpenPopupStack.empty()); - mouse_any_down |= g.IO.MouseDown[i]; - if (g.IO.MouseDown[i]) - if (mouse_earliest_button_down == -1 || g.IO.MouseClickedTime[i] < g.IO.MouseClickedTime[mouse_earliest_button_down]) - mouse_earliest_button_down = i; - } - bool mouse_avail_to_imgui = (mouse_earliest_button_down == -1) || g.IO.MouseDownOwned[mouse_earliest_button_down]; - if (g.WantCaptureMouseNextFrame != -1) - g.IO.WantCaptureMouse = (g.WantCaptureMouseNextFrame != 0); - else - g.IO.WantCaptureMouse = (mouse_avail_to_imgui && (g.HoveredWindow != NULL || mouse_any_down)) || (!g.OpenPopupStack.empty()); - if (g.WantCaptureKeyboardNextFrame != -1) - g.IO.WantCaptureKeyboard = (g.WantCaptureKeyboardNextFrame != 0); - else - g.IO.WantCaptureKeyboard = (g.ActiveId != 0) || (modal_window != NULL); - g.IO.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : 0; - g.MouseCursor = ImGuiMouseCursor_Arrow; - g.WantCaptureMouseNextFrame = g.WantCaptureKeyboardNextFrame = g.WantTextInputNextFrame = -1; - g.OsImePosRequest = ImVec2(1.0f, 1.0f); // OS Input Method Editor showing on top-left of our window by default - - // If mouse was first clicked outside of ImGui bounds we also cancel out hovering. - // FIXME: For patterns of drag and drop across OS windows, we may need to rework/remove this test (first committed 311c0ca9 on 2015/02) - bool mouse_dragging_extern_payload = g.DragDropActive && (g.DragDropSourceFlags & ImGuiDragDropFlags_SourceExtern) != 0; - if (!mouse_avail_to_imgui && !mouse_dragging_extern_payload) - g.HoveredWindow = g.HoveredRootWindow = NULL; - - // Scale & Scrolling - if (g.HoveredWindow && g.IO.MouseWheel != 0.0f && !g.HoveredWindow->Collapsed) - { - ImGuiWindow* window = g.HoveredWindow; - if (g.IO.KeyCtrl && g.IO.FontAllowUserScaling) - { - // Zoom / Scale window - const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f); - const float scale = new_font_scale / window->FontWindowScale; - window->FontWindowScale = new_font_scale; - - const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size; - window->Pos += offset; - window->PosFloat += offset; - window->Size *= scale; - window->SizeFull *= scale; - } - else if (!g.IO.KeyCtrl) - { - // Mouse wheel Scrolling - // If a child window has the ImGuiWindowFlags_NoScrollWithMouse flag, we give a chance to scroll its parent (unless either ImGuiWindowFlags_NoInputs or ImGuiWindowFlags_NoScrollbar are also set). - ImGuiWindow* scroll_window = window; - while ((scroll_window->Flags & ImGuiWindowFlags_ChildWindow) && (scroll_window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(scroll_window->Flags & ImGuiWindowFlags_NoScrollbar) && !(scroll_window->Flags & ImGuiWindowFlags_NoInputs) && scroll_window->ParentWindow) - scroll_window = scroll_window->ParentWindow; - - if (!(scroll_window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(scroll_window->Flags & ImGuiWindowFlags_NoInputs)) - { - float scroll_amount = 5 * scroll_window->CalcFontSize(); - scroll_amount = (float)(int)ImMin(scroll_amount, (scroll_window->ContentsRegionRect.GetHeight() + scroll_window->WindowPadding.y * 2.0f) * 0.67f); - SetWindowScrollY(scroll_window, scroll_window->Scroll.y - g.IO.MouseWheel * scroll_amount); - } - } - } - - // Pressing TAB activate widget focus - if (g.ActiveId == 0 && g.NavWindow != NULL && g.NavWindow->Active && IsKeyPressedMap(ImGuiKey_Tab, false)) - g.NavWindow->FocusIdxTabRequestNext = 0; - - // Mark all windows as not visible - for (int i = 0; i != g.Windows.Size; i++) - { - ImGuiWindow* window = g.Windows[i]; - window->WasActive = window->Active; - window->Active = false; - window->WriteAccessed = false; - } - - // Closing the focused window restore focus to the first active root window in descending z-order - if (g.NavWindow && !g.NavWindow->WasActive) - FocusPreviousWindow(); - - // No window should be open at the beginning of the frame. - // But in order to allow the user to call NewFrame() multiple times without calling Render(), we are doing an explicit clear. - g.CurrentWindowStack.resize(0); - g.CurrentPopupStack.resize(0); - CloseInactivePopups(g.NavWindow); - - // Create implicit window - we will only render it if the user has added something to it. - // We don't use "Debug" to avoid colliding with user trying to create a "Debug" window with custom flags. - SetNextWindowSize(ImVec2(400,400), ImGuiCond_FirstUseEver); - Begin("Debug##Default"); -} - -static void* SettingsHandlerWindow_ReadOpen(ImGuiContext&, const char* name) -{ - ImGuiWindowSettings* settings = ImGui::FindWindowSettings(ImHash(name, 0)); - if (!settings) - settings = AddWindowSettings(name); - return (void*)settings; -} - -static void SettingsHandlerWindow_ReadLine(ImGuiContext&, void* entry, const char* line) -{ - ImGuiWindowSettings* settings = (ImGuiWindowSettings*)entry; - float x, y; - int i; - if (sscanf(line, "Pos=%f,%f", &x, &y) == 2) settings->Pos = ImVec2(x, y); - else if (sscanf(line, "Size=%f,%f", &x, &y) == 2) settings->Size = ImMax(ImVec2(x, y), GImGui->Style.WindowMinSize); - else if (sscanf(line, "Collapsed=%d", &i) == 1) settings->Collapsed = (i != 0); -} - -static void SettingsHandlerWindow_WriteAll(ImGuiContext& g, ImGuiTextBuffer* buf) -{ - // Gather data from windows that were active during this session - for (int i = 0; i != g.Windows.Size; i++) - { - ImGuiWindow* window = g.Windows[i]; - if (window->Flags & ImGuiWindowFlags_NoSavedSettings) - continue; - ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID); - if (!settings) - settings = AddWindowSettings(window->Name); - settings->Pos = window->Pos; - settings->Size = window->SizeFull; - settings->Collapsed = window->Collapsed; - } - - // Write a buffer - // If a window wasn't opened in this session we preserve its settings - buf->reserve(buf->size() + g.SettingsWindows.Size * 96); // ballpark reserve - for (int i = 0; i != g.SettingsWindows.Size; i++) - { - const ImGuiWindowSettings* settings = &g.SettingsWindows[i]; - if (settings->Pos.x == FLT_MAX) - continue; - const char* name = settings->Name; - if (const char* p = strstr(name, "###")) // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID() - name = p; - buf->appendf("[Window][%s]\n", name); - buf->appendf("Pos=%d,%d\n", (int)settings->Pos.x, (int)settings->Pos.y); - buf->appendf("Size=%d,%d\n", (int)settings->Size.x, (int)settings->Size.y); - buf->appendf("Collapsed=%d\n", settings->Collapsed); - buf->appendf("\n"); - } -} - -void ImGui::Initialize() -{ - ImGuiContext& g = *GImGui; - g.LogClipboard = IM_NEW(ImGuiTextBuffer)(); - - // Add .ini handle for ImGuiWindow type - ImGuiSettingsHandler ini_handler; - ini_handler.TypeName = "Window"; - ini_handler.TypeHash = ImHash("Window", 0, 0); - ini_handler.ReadOpenFn = SettingsHandlerWindow_ReadOpen; - ini_handler.ReadLineFn = SettingsHandlerWindow_ReadLine; - ini_handler.WriteAllFn = SettingsHandlerWindow_WriteAll; - g.SettingsHandlers.push_front(ini_handler); - - // Load .ini file - IM_ASSERT(g.SettingsWindows.empty()); - LoadIniSettingsFromDisk(g.IO.IniFilename); - g.Initialized = true; -} - -// This function is merely here to free heap allocations. -void ImGui::Shutdown() -{ - ImGuiContext& g = *GImGui; - - // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame) - if (g.IO.Fonts) // Testing for NULL to allow user to NULLify in case of running Shutdown() on multiple contexts. Bit hacky. - g.IO.Fonts->Clear(); - - // Cleanup of other data are conditional on actually having initialize ImGui. - if (!g.Initialized) - return; - - SaveIniSettingsToDisk(g.IO.IniFilename); - - for (int i = 0; i < g.Windows.Size; i++) - IM_DELETE(g.Windows[i]); - g.Windows.clear(); - g.WindowsSortBuffer.clear(); - g.CurrentWindow = NULL; - g.CurrentWindowStack.clear(); - g.WindowsById.Clear(); - g.NavWindow = NULL; - g.HoveredWindow = NULL; - g.HoveredRootWindow = NULL; - g.ActiveIdWindow = NULL; - g.MovingWindow = NULL; - for (int i = 0; i < g.SettingsWindows.Size; i++) - IM_DELETE(g.SettingsWindows[i].Name); - g.ColorModifiers.clear(); - g.StyleModifiers.clear(); - g.FontStack.clear(); - g.OpenPopupStack.clear(); - g.CurrentPopupStack.clear(); - g.SetNextWindowSizeConstraintCallback = NULL; - g.SetNextWindowSizeConstraintCallbackUserData = NULL; - for (int i = 0; i < IM_ARRAYSIZE(g.RenderDrawLists); i++) - g.RenderDrawLists[i].clear(); - g.OverlayDrawList.ClearFreeMemory(); - g.PrivateClipboard.clear(); - g.InputTextState.Text.clear(); - g.InputTextState.InitialText.clear(); - g.InputTextState.TempTextBuffer.clear(); - - g.SettingsWindows.clear(); - g.SettingsHandlers.clear(); - - if (g.LogFile && g.LogFile != stdout) - { - fclose(g.LogFile); - g.LogFile = NULL; - } - if (g.LogClipboard) - IM_DELETE(g.LogClipboard); - - g.Initialized = false; -} - -ImGuiWindowSettings* ImGui::FindWindowSettings(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - for (int i = 0; i != g.SettingsWindows.Size; i++) - if (g.SettingsWindows[i].Id == id) - return &g.SettingsWindows[i]; - return NULL; -} - -static ImGuiWindowSettings* AddWindowSettings(const char* name) -{ - ImGuiContext& g = *GImGui; - g.SettingsWindows.push_back(ImGuiWindowSettings()); - ImGuiWindowSettings* settings = &g.SettingsWindows.back(); - settings->Name = ImStrdup(name); - settings->Id = ImHash(name, 0); - return settings; -} - -static void LoadIniSettingsFromDisk(const char* ini_filename) -{ - if (!ini_filename) - return; - char* file_data = (char*)ImFileLoadToMemory(ini_filename, "rb", NULL, +1); - if (!file_data) - return; - LoadIniSettingsFromMemory(file_data); - ImGui::MemFree(file_data); -} - -ImGuiSettingsHandler* ImGui::FindSettingsHandler(ImGuiID type_hash) -{ - ImGuiContext& g = *GImGui; - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].TypeHash == type_hash) - return &g.SettingsHandlers[handler_n]; - return NULL; -} - -// Zero-tolerance, no error reporting, cheap .ini parsing -static void LoadIniSettingsFromMemory(const char* buf_readonly) -{ - // For convenience and to make the code simpler, we'll write zero terminators inside the buffer. So let's create a writable copy. - char* buf = ImStrdup(buf_readonly); - char* buf_end = buf + strlen(buf); - - ImGuiContext& g = *GImGui; - void* entry_data = NULL; - const ImGuiSettingsHandler* entry_handler = NULL; - - char* line_end = NULL; - for (char* line = buf; line < buf_end; line = line_end + 1) - { - // Skip new lines markers, then find end of the line - while (*line == '\n' || *line == '\r') - line++; - line_end = line; - while (line_end < buf_end && *line_end != '\n' && *line_end != '\r') - line_end++; - line_end[0] = 0; - - if (line[0] == '[' && line_end > line && line_end[-1] == ']') - { - // Parse "[Type][Name]". Note that 'Name' can itself contains [] characters, which is acceptable with the current format and parsing code. - line_end[-1] = 0; - const char* name_end = line_end - 1; - const char* type_start = line + 1; - char* type_end = ImStrchrRange(type_start, name_end, ']'); - const char* name_start = type_end ? ImStrchrRange(type_end + 1, name_end, '[') : NULL; - if (!type_end || !name_start) - { - name_start = type_start; // Import legacy entries that have no type - type_start = "Window"; - } - else - { - *type_end = 0; // Overwrite first ']' - name_start++; // Skip second '[' - } - const ImGuiID type_hash = ImHash(type_start, 0, 0); - entry_handler = ImGui::FindSettingsHandler(type_hash); - entry_data = entry_handler ? entry_handler->ReadOpenFn(g, name_start) : NULL; - } - else if (entry_handler != NULL && entry_data != NULL) - { - // Let type handler parse the line - entry_handler->ReadLineFn(g, entry_data, line); - } - } - ImGui::MemFree(buf); -} - -static void SaveIniSettingsToDisk(const char* ini_filename) -{ - ImGuiContext& g = *GImGui; - g.SettingsDirtyTimer = 0.0f; - if (!ini_filename) - return; - - ImVector buf; - SaveIniSettingsToMemory(buf); - - FILE* f = ImFileOpen(ini_filename, "wt"); - if (!f) - return; - fwrite(buf.Data, sizeof(char), (size_t)buf.Size, f); - fclose(f); -} - -static void SaveIniSettingsToMemory(ImVector& out_buf) -{ - ImGuiContext& g = *GImGui; - g.SettingsDirtyTimer = 0.0f; - - ImGuiTextBuffer buf; - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - g.SettingsHandlers[handler_n].WriteAllFn(g, &buf); - - buf.Buf.pop_back(); // Remove extra zero-terminator used by ImGuiTextBuffer - out_buf.swap(buf.Buf); -} - -void ImGui::MarkIniSettingsDirty() -{ - ImGuiContext& g = *GImGui; - if (g.SettingsDirtyTimer <= 0.0f) - g.SettingsDirtyTimer = g.IO.IniSavingRate; -} - -static void MarkIniSettingsDirty(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings)) - if (g.SettingsDirtyTimer <= 0.0f) - g.SettingsDirtyTimer = g.IO.IniSavingRate; -} - -// FIXME: Add a more explicit sort order in the window structure. -static int ChildWindowComparer(const void* lhs, const void* rhs) -{ - const ImGuiWindow* a = *(const ImGuiWindow**)lhs; - const ImGuiWindow* b = *(const ImGuiWindow**)rhs; - if (int d = (a->Flags & ImGuiWindowFlags_Popup) - (b->Flags & ImGuiWindowFlags_Popup)) - return d; - if (int d = (a->Flags & ImGuiWindowFlags_Tooltip) - (b->Flags & ImGuiWindowFlags_Tooltip)) - return d; - return (a->BeginOrderWithinParent - b->BeginOrderWithinParent); -} - -static void AddWindowToSortedBuffer(ImVector& out_sorted_windows, ImGuiWindow* window) -{ - out_sorted_windows.push_back(window); - if (window->Active) - { - int count = window->DC.ChildWindows.Size; - if (count > 1) - qsort(window->DC.ChildWindows.begin(), (size_t)count, sizeof(ImGuiWindow*), ChildWindowComparer); - for (int i = 0; i < count; i++) - { - ImGuiWindow* child = window->DC.ChildWindows[i]; - if (child->Active) - AddWindowToSortedBuffer(out_sorted_windows, child); - } - } -} - -static void AddDrawListToRenderList(ImVector& out_render_list, ImDrawList* draw_list) -{ - if (draw_list->CmdBuffer.empty()) - return; - - // Remove trailing command if unused - ImDrawCmd& last_cmd = draw_list->CmdBuffer.back(); - if (last_cmd.ElemCount == 0 && last_cmd.UserCallback == NULL) - { - draw_list->CmdBuffer.pop_back(); - if (draw_list->CmdBuffer.empty()) - return; - } - - // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. May trigger for you if you are using PrimXXX functions incorrectly. - IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size); - IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size); - IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); - - // Check that draw_list doesn't use more vertices than indexable in a single draw call (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window) - // If this assert triggers because you are drawing lots of stuff manually: - // A) Make sure you are coarse clipping, because ImDrawList let all your vertices pass. You can use thre Metrics window to inspect draw list contents. - // B) If you need/want meshes with more than 64K vertices, uncomment the '#define ImDrawIdx unsigned int' line in imconfig.h to set the index size to 4 bytes. - // You'll need to handle the 4-bytes indices to your renderer. For example, the OpenGL example code detect index size at compile-time by doing: - // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); - // Your own engine or render API may use different parameters or function calls to specify index sizes. 2 and 4 bytes indices are generally supported by most API. - // C) If for some reason you cannot use 4 bytes indices or don't want to, a workaround is to call BeginChild()/EndChild() before reaching the 64K limit to split your draw commands in multiple draw lists. - if (sizeof(ImDrawIdx) == 2) - IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above"); - - out_render_list.push_back(draw_list); - GImGui->IO.MetricsRenderVertices += draw_list->VtxBuffer.Size; - GImGui->IO.MetricsRenderIndices += draw_list->IdxBuffer.Size; -} - -static void AddWindowToRenderList(ImVector& out_render_list, ImGuiWindow* window) -{ - AddDrawListToRenderList(out_render_list, window->DrawList); - for (int i = 0; i < window->DC.ChildWindows.Size; i++) - { - ImGuiWindow* child = window->DC.ChildWindows[i]; - if (!child->Active) // clipped children may have been marked not active - continue; - if ((child->Flags & ImGuiWindowFlags_Popup) && child->HiddenFrames > 0) - continue; - AddWindowToRenderList(out_render_list, child); - } -} - -static void AddWindowToRenderListSelectLayer(ImGuiWindow* window) -{ - // FIXME: Generalize this with a proper layering system so e.g. user can draw in specific layers, below text, .. - ImGuiContext& g = *GImGui; - g.IO.MetricsActiveWindows++; - if (window->Flags & ImGuiWindowFlags_Popup) - AddWindowToRenderList(g.RenderDrawLists[1], window); - else if (window->Flags & ImGuiWindowFlags_Tooltip) - AddWindowToRenderList(g.RenderDrawLists[2], window); - else - AddWindowToRenderList(g.RenderDrawLists[0], window); -} - -// When using this function it is sane to ensure that float are perfectly rounded to integer values, to that e.g. (int)(max.x-min.x) in user's render produce correct result. -void ImGui::PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DrawList->PushClipRect(clip_rect_min, clip_rect_max, intersect_with_current_clip_rect); - window->ClipRect = window->DrawList->_ClipRectStack.back(); -} - -void ImGui::PopClipRect() -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DrawList->PopClipRect(); - window->ClipRect = window->DrawList->_ClipRectStack.back(); -} - -// This is normally called by Render(). You may want to call it directly if you want to avoid calling Render() but the gain will be very minimal. -void ImGui::EndFrame() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.Initialized); // Forgot to call ImGui::NewFrame() - if (g.FrameCountEnded == g.FrameCount) // Don't process EndFrame() multiple times. - return; - - // Notify OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME) - if (g.IO.ImeSetInputScreenPosFn && ImLengthSqr(g.OsImePosRequest - g.OsImePosSet) > 0.0001f) - { - g.IO.ImeSetInputScreenPosFn((int)g.OsImePosRequest.x, (int)g.OsImePosRequest.y); - g.OsImePosSet = g.OsImePosRequest; - } - - // Hide implicit "Debug" window if it hasn't been used - IM_ASSERT(g.CurrentWindowStack.Size == 1); // Mismatched Begin()/End() calls - if (g.CurrentWindow && !g.CurrentWindow->WriteAccessed) - g.CurrentWindow->Active = false; - ImGui::End(); - - if (g.ActiveId == 0 && g.HoveredId == 0) - { - if (!g.NavWindow || !g.NavWindow->Appearing) // Unless we just made a window/popup appear - { - // Click to focus window and start moving (after we're done with all our widgets) - if (g.IO.MouseClicked[0]) - { - if (g.HoveredRootWindow != NULL) - { - FocusWindow(g.HoveredWindow); - if (!(g.HoveredWindow->Flags & ImGuiWindowFlags_NoMove) && !(g.HoveredRootWindow->Flags & ImGuiWindowFlags_NoMove)) - { - g.MovingWindow = g.HoveredWindow; - g.MovingWindowMoveId = g.MovingWindow->MoveId; - SetActiveID(g.MovingWindowMoveId, g.HoveredRootWindow); - g.ActiveIdClickOffset = g.IO.MousePos - g.MovingWindow->RootWindow->Pos; - } - } - else if (g.NavWindow != NULL && GetFrontMostModalRootWindow() == NULL) - { - // Clicking on void disable focus - FocusWindow(NULL); - } - } - - // With right mouse button we close popups without changing focus - // (The left mouse button path calls FocusWindow which will lead NewFrame->CloseInactivePopups to trigger) - if (g.IO.MouseClicked[1]) - { - // Find the top-most window between HoveredWindow and the front most Modal Window. - // This is where we can trim the popup stack. - ImGuiWindow* modal = GetFrontMostModalRootWindow(); - bool hovered_window_above_modal = false; - if (modal == NULL) - hovered_window_above_modal = true; - for (int i = g.Windows.Size - 1; i >= 0 && hovered_window_above_modal == false; i--) - { - ImGuiWindow* window = g.Windows[i]; - if (window == modal) - break; - if (window == g.HoveredWindow) - hovered_window_above_modal = true; - } - CloseInactivePopups(hovered_window_above_modal ? g.HoveredWindow : modal); - } - } - } - - // Sort the window list so that all child windows are after their parent - // We cannot do that on FocusWindow() because childs may not exist yet - g.WindowsSortBuffer.resize(0); - g.WindowsSortBuffer.reserve(g.Windows.Size); - for (int i = 0; i != g.Windows.Size; i++) - { - ImGuiWindow* window = g.Windows[i]; - if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow)) // if a child is active its parent will add it - continue; - AddWindowToSortedBuffer(g.WindowsSortBuffer, window); - } - - IM_ASSERT(g.Windows.Size == g.WindowsSortBuffer.Size); // we done something wrong - g.Windows.swap(g.WindowsSortBuffer); - - // Clear Input data for next frame - g.IO.MouseWheel = 0.0f; - memset(g.IO.InputCharacters, 0, sizeof(g.IO.InputCharacters)); - - g.FrameCountEnded = g.FrameCount; -} - -void ImGui::Render() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.Initialized); // Forgot to call ImGui::NewFrame() - - if (g.FrameCountEnded != g.FrameCount) - ImGui::EndFrame(); - g.FrameCountRendered = g.FrameCount; - - // Skip render altogether if alpha is 0.0 - // Note that vertex buffers have been created and are wasted, so it is best practice that you don't create windows in the first place, or consistently respond to Begin() returning false. - if (g.Style.Alpha > 0.0f) - { - // Gather windows to render - g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = g.IO.MetricsActiveWindows = 0; - for (int i = 0; i < IM_ARRAYSIZE(g.RenderDrawLists); i++) - g.RenderDrawLists[i].resize(0); - for (int i = 0; i != g.Windows.Size; i++) - { - ImGuiWindow* window = g.Windows[i]; - if (window->Active && window->HiddenFrames <= 0 && (window->Flags & (ImGuiWindowFlags_ChildWindow)) == 0) - AddWindowToRenderListSelectLayer(window); - } - - // Flatten layers - int n = g.RenderDrawLists[0].Size; - int flattened_size = n; - for (int i = 1; i < IM_ARRAYSIZE(g.RenderDrawLists); i++) - flattened_size += g.RenderDrawLists[i].Size; - g.RenderDrawLists[0].resize(flattened_size); - for (int i = 1; i < IM_ARRAYSIZE(g.RenderDrawLists); i++) - { - ImVector& layer = g.RenderDrawLists[i]; - if (layer.empty()) - continue; - memcpy(&g.RenderDrawLists[0][n], &layer[0], layer.Size * sizeof(ImDrawList*)); - n += layer.Size; - } - - // Draw software mouse cursor if requested - if (g.IO.MouseDrawCursor) - { - const ImGuiMouseCursorData& cursor_data = g.MouseCursorData[g.MouseCursor]; - const ImVec2 pos = g.IO.MousePos - cursor_data.HotOffset; - const ImVec2 size = cursor_data.Size; - const ImTextureID tex_id = g.IO.Fonts->TexID; - g.OverlayDrawList.PushTextureID(tex_id); - g.OverlayDrawList.AddImage(tex_id, pos+ImVec2(1,0), pos+ImVec2(1,0) + size, cursor_data.TexUvMin[1], cursor_data.TexUvMax[1], IM_COL32(0,0,0,48)); // Shadow - g.OverlayDrawList.AddImage(tex_id, pos+ImVec2(2,0), pos+ImVec2(2,0) + size, cursor_data.TexUvMin[1], cursor_data.TexUvMax[1], IM_COL32(0,0,0,48)); // Shadow - g.OverlayDrawList.AddImage(tex_id, pos, pos + size, cursor_data.TexUvMin[1], cursor_data.TexUvMax[1], IM_COL32(0,0,0,255)); // Black border - g.OverlayDrawList.AddImage(tex_id, pos, pos + size, cursor_data.TexUvMin[0], cursor_data.TexUvMax[0], IM_COL32(255,255,255,255)); // White fill - g.OverlayDrawList.PopTextureID(); - } - if (!g.OverlayDrawList.VtxBuffer.empty()) - AddDrawListToRenderList(g.RenderDrawLists[0], &g.OverlayDrawList); - - // Setup draw data - g.RenderDrawData.Valid = true; - g.RenderDrawData.CmdLists = (g.RenderDrawLists[0].Size > 0) ? &g.RenderDrawLists[0][0] : NULL; - g.RenderDrawData.CmdListsCount = g.RenderDrawLists[0].Size; - g.RenderDrawData.TotalVtxCount = g.IO.MetricsRenderVertices; - g.RenderDrawData.TotalIdxCount = g.IO.MetricsRenderIndices; - - // Render. If user hasn't set a callback then they may retrieve the draw data via GetDrawData() - if (g.RenderDrawData.CmdListsCount > 0 && g.IO.RenderDrawListsFn != NULL) - g.IO.RenderDrawListsFn(&g.RenderDrawData); - } -} - -const char* ImGui::FindRenderedTextEnd(const char* text, const char* text_end) -{ - const char* text_display_end = text; - if (!text_end) - text_end = (const char*)-1; - - while (text_display_end < text_end && *text_display_end != '\0' && (text_display_end[0] != '#' || text_display_end[1] != '#')) - text_display_end++; - return text_display_end; -} - -// Pass text data straight to log (without being displayed) -void ImGui::LogText(const char* fmt, ...) -{ - ImGuiContext& g = *GImGui; - if (!g.LogEnabled) - return; - - va_list args; - va_start(args, fmt); - if (g.LogFile) - { - vfprintf(g.LogFile, fmt, args); - } - else - { - g.LogClipboard->appendfv(fmt, args); - } - va_end(args); -} - -// Internal version that takes a position to decide on newline placement and pad items according to their depth. -// We split text into individual lines to add current tree level padding -static void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - if (!text_end) - text_end = ImGui::FindRenderedTextEnd(text, text_end); - - const bool log_new_line = ref_pos && (ref_pos->y > window->DC.LogLinePosY + 1); - if (ref_pos) - window->DC.LogLinePosY = ref_pos->y; - - const char* text_remaining = text; - if (g.LogStartDepth > window->DC.TreeDepth) // Re-adjust padding if we have popped out of our starting depth - g.LogStartDepth = window->DC.TreeDepth; - const int tree_depth = (window->DC.TreeDepth - g.LogStartDepth); - for (;;) - { - // Split the string. Each new line (after a '\n') is followed by spacing corresponding to the current depth of our log entry. - const char* line_end = text_remaining; - while (line_end < text_end) - if (*line_end == '\n') - break; - else - line_end++; - if (line_end >= text_end) - line_end = NULL; - - const bool is_first_line = (text == text_remaining); - bool is_last_line = false; - if (line_end == NULL) - { - is_last_line = true; - line_end = text_end; - } - if (line_end != NULL && !(is_last_line && (line_end - text_remaining)==0)) - { - const int char_count = (int)(line_end - text_remaining); - if (log_new_line || !is_first_line) - ImGui::LogText(IM_NEWLINE "%*s%.*s", tree_depth*4, "", char_count, text_remaining); - else - ImGui::LogText(" %.*s", char_count, text_remaining); - } - - if (is_last_line) - break; - text_remaining = line_end + 1; - } -} - -// Internal ImGui functions to render text -// RenderText***() functions calls ImDrawList::AddText() calls ImBitmapFont::RenderText() -void ImGui::RenderText(ImVec2 pos, const char* text, const char* text_end, bool hide_text_after_hash) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - // Hide anything after a '##' string - const char* text_display_end; - if (hide_text_after_hash) - { - text_display_end = FindRenderedTextEnd(text, text_end); - } - else - { - if (!text_end) - text_end = text + strlen(text); // FIXME-OPT - text_display_end = text_end; - } - - const int text_len = (int)(text_display_end - text); - if (text_len > 0) - { - window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end); - if (g.LogEnabled) - LogRenderedText(&pos, text, text_display_end); - } -} - -void ImGui::RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - if (!text_end) - text_end = text + strlen(text); // FIXME-OPT - - const int text_len = (int)(text_end - text); - if (text_len > 0) - { - window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_end, wrap_width); - if (g.LogEnabled) - LogRenderedText(&pos, text, text_end); - } -} - -// Default clip_rect uses (pos_min,pos_max) -// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges) -void ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect) -{ - // Hide anything after a '##' string - const char* text_display_end = FindRenderedTextEnd(text, text_end); - const int text_len = (int)(text_display_end - text); - if (text_len == 0) - return; - - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - // Perform CPU side clipping for single clipped element to avoid using scissor state - ImVec2 pos = pos_min; - const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_display_end, false, 0.0f); - - const ImVec2* clip_min = clip_rect ? &clip_rect->Min : &pos_min; - const ImVec2* clip_max = clip_rect ? &clip_rect->Max : &pos_max; - bool need_clipping = (pos.x + text_size.x >= clip_max->x) || (pos.y + text_size.y >= clip_max->y); - if (clip_rect) // If we had no explicit clipping rectangle then pos==clip_min - need_clipping |= (pos.x < clip_min->x) || (pos.y < clip_min->y); - - // Align whole block. We should defer that to the better rendering function when we'll have support for individual line alignment. - if (align.x > 0.0f) pos.x = ImMax(pos.x, pos.x + (pos_max.x - pos.x - text_size.x) * align.x); - if (align.y > 0.0f) pos.y = ImMax(pos.y, pos.y + (pos_max.y - pos.y - text_size.y) * align.y); - - // Render - if (need_clipping) - { - ImVec4 fine_clip_rect(clip_min->x, clip_min->y, clip_max->x, clip_max->y); - window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, &fine_clip_rect); - } - else - { - window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, NULL); - } - if (g.LogEnabled) - LogRenderedText(&pos, text, text_display_end); -} - -// Render a rectangle shaped with optional rounding and borders -void ImGui::RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border, float rounding) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - window->DrawList->AddRectFilled(p_min, p_max, fill_col, rounding); - const float border_size = g.Style.FrameBorderSize; - if (border && border_size > 0.0f) - { - window->DrawList->AddRect(p_min+ImVec2(1,1), p_max+ImVec2(1,1), GetColorU32(ImGuiCol_BorderShadow), rounding, ImDrawCornerFlags_All, border_size); - window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, ImDrawCornerFlags_All, border_size); - } -} - -void ImGui::RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - const float border_size = g.Style.FrameBorderSize; - if (border_size > 0.0f) - { - window->DrawList->AddRect(p_min+ImVec2(1,1), p_max+ImVec2(1,1), GetColorU32(ImGuiCol_BorderShadow), rounding, ImDrawCornerFlags_All, border_size); - window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, ImDrawCornerFlags_All, border_size); - } -} - -// Render a triangle to denote expanded/collapsed state -void ImGui::RenderTriangle(ImVec2 p_min, ImGuiDir dir, float scale) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - const float h = g.FontSize * 1.00f; - float r = h * 0.40f * scale; - ImVec2 center = p_min + ImVec2(h * 0.50f, h * 0.50f * scale); - - ImVec2 a, b, c; - switch (dir) - { - case ImGuiDir_Up: - case ImGuiDir_Down: - if (dir == ImGuiDir_Up) r = -r; - center.y -= r * 0.25f; - a = ImVec2(0,1) * r; - b = ImVec2(-0.866f,-0.5f) * r; - c = ImVec2(+0.866f,-0.5f) * r; - break; - case ImGuiDir_Left: - case ImGuiDir_Right: - if (dir == ImGuiDir_Left) r = -r; - center.x -= r * 0.25f; - a = ImVec2(1,0) * r; - b = ImVec2(-0.500f,+0.866f) * r; - c = ImVec2(-0.500f,-0.866f) * r; - break; - case ImGuiDir_None: - case ImGuiDir_Count_: - IM_ASSERT(0); - break; - } - - window->DrawList->AddTriangleFilled(center + a, center + b, center + c, GetColorU32(ImGuiCol_Text)); -} - -void ImGui::RenderBullet(ImVec2 pos) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - window->DrawList->AddCircleFilled(pos, GImGui->FontSize*0.20f, GetColorU32(ImGuiCol_Text), 8); -} - -void ImGui::RenderCheckMark(ImVec2 pos, ImU32 col, float sz) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - float thickness = ImMax(sz / 5.0f, 1.0f); - sz -= thickness*0.5f; - pos += ImVec2(thickness*0.25f, thickness*0.25f); - - float third = sz / 3.0f; - float bx = pos.x + third; - float by = pos.y + sz - third*0.5f; - window->DrawList->PathLineTo(ImVec2(bx - third, by - third)); - window->DrawList->PathLineTo(ImVec2(bx, by)); - window->DrawList->PathLineTo(ImVec2(bx + third*2, by - third*2)); - window->DrawList->PathStroke(col, false, thickness); -} - -// Calculate text size. Text can be multi-line. Optionally ignore text after a ## marker. -// CalcTextSize("") should return ImVec2(0.0f, GImGui->FontSize) -ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_text_after_double_hash, float wrap_width) -{ - ImGuiContext& g = *GImGui; - - const char* text_display_end; - if (hide_text_after_double_hash) - text_display_end = FindRenderedTextEnd(text, text_end); // Hide anything after a '##' string - else - text_display_end = text_end; - - ImFont* font = g.Font; - const float font_size = g.FontSize; - if (text == text_display_end) - return ImVec2(0.0f, font_size); - ImVec2 text_size = font->CalcTextSizeA(font_size, FLT_MAX, wrap_width, text, text_display_end, NULL); - - // Cancel out character spacing for the last character of a line (it is baked into glyph->AdvanceX field) - const float font_scale = font_size / font->FontSize; - const float character_spacing_x = 1.0f * font_scale; - if (text_size.x > 0.0f) - text_size.x -= character_spacing_x; - text_size.x = (float)(int)(text_size.x + 0.95f); - - return text_size; -} - -// Helper to calculate coarse clipping of large list of evenly sized items. -// NB: Prefer using the ImGuiListClipper higher-level helper if you can! Read comments and instructions there on how those use this sort of pattern. -// NB: 'items_count' is only used to clamp the result, if you don't know your count you can use INT_MAX -void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (g.LogEnabled) - { - // If logging is active, do not perform any clipping - *out_items_display_start = 0; - *out_items_display_end = items_count; - return; - } - if (window->SkipItems) - { - *out_items_display_start = *out_items_display_end = 0; - return; - } - - const ImVec2 pos = window->DC.CursorPos; - int start = (int)((window->ClipRect.Min.y - pos.y) / items_height); - int end = (int)((window->ClipRect.Max.y - pos.y) / items_height); - start = ImClamp(start, 0, items_count); - end = ImClamp(end + 1, start, items_count); - *out_items_display_start = start; - *out_items_display_end = end; -} - -// Find window given position, search front-to-back -// FIXME: Note that we have a lag here because WindowRectClipped is updated in Begin() so windows moved by user via SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is called, aka before the next Begin(). Moving window thankfully isn't affected. -static ImGuiWindow* FindHoveredWindow(ImVec2 pos) -{ - ImGuiContext& g = *GImGui; - for (int i = g.Windows.Size - 1; i >= 0; i--) - { - ImGuiWindow* window = g.Windows[i]; - if (!window->Active) - continue; - if (window->Flags & ImGuiWindowFlags_NoInputs) - continue; - - // Using the clipped AABB, a child window will typically be clipped by its parent (not always) - ImRect bb(window->WindowRectClipped.Min - g.Style.TouchExtraPadding, window->WindowRectClipped.Max + g.Style.TouchExtraPadding); - if (bb.Contains(pos)) - return window; - } - return NULL; -} - -// Test if mouse cursor is hovering given rectangle -// NB- Rectangle is clipped by our current clip setting -// NB- Expand the rectangle to be generous on imprecise inputs systems (g.Style.TouchExtraPadding) -bool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - // Clip - ImRect rect_clipped(r_min, r_max); - if (clip) - rect_clipped.ClipWith(window->ClipRect); - - // Expand for touch input - const ImRect rect_for_touch(rect_clipped.Min - g.Style.TouchExtraPadding, rect_clipped.Max + g.Style.TouchExtraPadding); - return rect_for_touch.Contains(g.IO.MousePos); -} - -bool ImGui::IsAnyWindowHovered() -{ - ImGuiContext& g = *GImGui; - return g.HoveredWindow != NULL; -} - -bool ImGui::IsAnyWindowFocused() -{ - ImGuiContext& g = *GImGui; - return g.NavWindow != NULL; -} - -static bool IsKeyPressedMap(ImGuiKey key, bool repeat) -{ - const int key_index = GImGui->IO.KeyMap[key]; - return (key_index >= 0) ? ImGui::IsKeyPressed(key_index, repeat) : false; -} - -int ImGui::GetKeyIndex(ImGuiKey imgui_key) -{ - IM_ASSERT(imgui_key >= 0 && imgui_key < ImGuiKey_COUNT); - return GImGui->IO.KeyMap[imgui_key]; -} - -// Note that imgui doesn't know the semantic of each entry of io.KeyDown[]. Use your own indices/enums according to how your backend/engine stored them into KeyDown[]! -bool ImGui::IsKeyDown(int user_key_index) -{ - if (user_key_index < 0) return false; - IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(GImGui->IO.KeysDown)); - return GImGui->IO.KeysDown[user_key_index]; -} - -int ImGui::CalcTypematicPressedRepeatAmount(float t, float t_prev, float repeat_delay, float repeat_rate) -{ - if (t == 0.0f) - return 1; - if (t <= repeat_delay || repeat_rate <= 0.0f) - return 0; - const int count = (int)((t - repeat_delay) / repeat_rate) - (int)((t_prev - repeat_delay) / repeat_rate); - return (count > 0) ? count : 0; -} - -int ImGui::GetKeyPressedAmount(int key_index, float repeat_delay, float repeat_rate) -{ - ImGuiContext& g = *GImGui; - if (key_index < 0) return false; - IM_ASSERT(key_index >= 0 && key_index < IM_ARRAYSIZE(g.IO.KeysDown)); - const float t = g.IO.KeysDownDuration[key_index]; - return CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, repeat_delay, repeat_rate); -} - -bool ImGui::IsKeyPressed(int user_key_index, bool repeat) -{ - ImGuiContext& g = *GImGui; - if (user_key_index < 0) return false; - IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(g.IO.KeysDown)); - const float t = g.IO.KeysDownDuration[user_key_index]; - if (t == 0.0f) - return true; - if (repeat && t > g.IO.KeyRepeatDelay) - return GetKeyPressedAmount(user_key_index, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0; - return false; -} - -bool ImGui::IsKeyReleased(int user_key_index) -{ - ImGuiContext& g = *GImGui; - if (user_key_index < 0) return false; - IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(g.IO.KeysDown)); - if (g.IO.KeysDownDurationPrev[user_key_index] >= 0.0f && !g.IO.KeysDown[user_key_index]) - return true; - return false; -} - -bool ImGui::IsMouseDown(int button) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - return g.IO.MouseDown[button]; -} - -bool ImGui::IsMouseClicked(int button, bool repeat) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - const float t = g.IO.MouseDownDuration[button]; - if (t == 0.0f) - return true; - - if (repeat && t > g.IO.KeyRepeatDelay) - { - float delay = g.IO.KeyRepeatDelay, rate = g.IO.KeyRepeatRate; - if ((fmodf(t - delay, rate) > rate*0.5f) != (fmodf(t - delay - g.IO.DeltaTime, rate) > rate*0.5f)) - return true; - } - - return false; -} - -bool ImGui::IsMouseReleased(int button) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - return g.IO.MouseReleased[button]; -} - -bool ImGui::IsMouseDoubleClicked(int button) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - return g.IO.MouseDoubleClicked[button]; -} - -bool ImGui::IsMouseDragging(int button, float lock_threshold) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - if (!g.IO.MouseDown[button]) - return false; - if (lock_threshold < 0.0f) - lock_threshold = g.IO.MouseDragThreshold; - return g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold; -} - -ImVec2 ImGui::GetMousePos() -{ - return GImGui->IO.MousePos; -} - -// NB: prefer to call right after BeginPopup(). At the time Selectable/MenuItem is activated, the popup is already closed! -ImVec2 ImGui::GetMousePosOnOpeningCurrentPopup() -{ - ImGuiContext& g = *GImGui; - if (g.CurrentPopupStack.Size > 0) - return g.OpenPopupStack[g.CurrentPopupStack.Size-1].MousePosOnOpen; - return g.IO.MousePos; -} - -// We typically use ImVec2(-FLT_MAX,-FLT_MAX) to denote an invalid mouse position -bool ImGui::IsMousePosValid(const ImVec2* mouse_pos) -{ - if (mouse_pos == NULL) - mouse_pos = &GImGui->IO.MousePos; - const float MOUSE_INVALID = -256000.0f; - return mouse_pos->x >= MOUSE_INVALID && mouse_pos->y >= MOUSE_INVALID; -} - -ImVec2 ImGui::GetMouseDragDelta(int button, float lock_threshold) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - if (lock_threshold < 0.0f) - lock_threshold = g.IO.MouseDragThreshold; - if (g.IO.MouseDown[button]) - if (g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold) - return g.IO.MousePos - g.IO.MouseClickedPos[button]; // Assume we can only get active with left-mouse button (at the moment). - return ImVec2(0.0f, 0.0f); -} - -void ImGui::ResetMouseDragDelta(int button) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - // NB: We don't need to reset g.IO.MouseDragMaxDistanceSqr - g.IO.MouseClickedPos[button] = g.IO.MousePos; -} - -ImGuiMouseCursor ImGui::GetMouseCursor() -{ - return GImGui->MouseCursor; -} - -void ImGui::SetMouseCursor(ImGuiMouseCursor cursor_type) -{ - GImGui->MouseCursor = cursor_type; -} - -void ImGui::CaptureKeyboardFromApp(bool capture) -{ - GImGui->WantCaptureKeyboardNextFrame = capture ? 1 : 0; -} - -void ImGui::CaptureMouseFromApp(bool capture) -{ - GImGui->WantCaptureMouseNextFrame = capture ? 1 : 0; -} - -bool ImGui::IsItemActive() -{ - ImGuiContext& g = *GImGui; - if (g.ActiveId) - { - ImGuiWindow* window = g.CurrentWindow; - return g.ActiveId == window->DC.LastItemId; - } - return false; -} - -bool ImGui::IsItemClicked(int mouse_button) -{ - return IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_Default); -} - -bool ImGui::IsAnyItemHovered() -{ - ImGuiContext& g = *GImGui; - return g.HoveredId != 0 || g.HoveredIdPreviousFrame != 0; -} - -bool ImGui::IsAnyItemActive() -{ - return GImGui->ActiveId != 0; -} - -bool ImGui::IsItemVisible() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->ClipRect.Overlaps(window->DC.LastItemRect); -} - -// Allow last item to be overlapped by a subsequent item. Both may be activated during the same frame before the later one takes priority. -void ImGui::SetItemAllowOverlap() -{ - ImGuiContext& g = *GImGui; - if (g.HoveredId == g.CurrentWindow->DC.LastItemId) - g.HoveredIdAllowOverlap = true; - if (g.ActiveId == g.CurrentWindow->DC.LastItemId) - g.ActiveIdAllowOverlap = true; -} - -ImVec2 ImGui::GetItemRectMin() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.LastItemRect.Min; -} - -ImVec2 ImGui::GetItemRectMax() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.LastItemRect.Max; -} - -ImVec2 ImGui::GetItemRectSize() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.LastItemRect.GetSize(); -} - -ImVec2 ImGui::CalcItemRectClosestPoint(const ImVec2& pos, bool on_edge, float outward) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImRect rect = window->DC.LastItemRect; - rect.Expand(outward); - return rect.GetClosestPoint(pos, on_edge); -} - -static ImRect GetVisibleRect() -{ - ImGuiContext& g = *GImGui; - if (g.IO.DisplayVisibleMin.x != g.IO.DisplayVisibleMax.x && g.IO.DisplayVisibleMin.y != g.IO.DisplayVisibleMax.y) - return ImRect(g.IO.DisplayVisibleMin, g.IO.DisplayVisibleMax); - return ImRect(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y); -} - -// Not exposed publicly as BeginTooltip() because bool parameters are evil. Let's see if other needs arise first. -void ImGui::BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip) -{ - ImGuiContext& g = *GImGui; - char window_name[16]; - ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", g.TooltipOverrideCount); - if (override_previous_tooltip) - if (ImGuiWindow* window = FindWindowByName(window_name)) - if (window->Active) - { - // Hide previous tooltips. We can't easily "reset" the content of a window so we create a new one. - window->HiddenFrames = 1; - ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", ++g.TooltipOverrideCount); - } - ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoSavedSettings|ImGuiWindowFlags_AlwaysAutoResize; - Begin(window_name, NULL, flags | extra_flags); -} - -void ImGui::SetTooltipV(const char* fmt, va_list args) -{ - BeginTooltipEx(0, true); - TextV(fmt, args); - EndTooltip(); -} - -void ImGui::SetTooltip(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - SetTooltipV(fmt, args); - va_end(args); -} - -void ImGui::BeginTooltip() -{ - BeginTooltipEx(0, false); -} - -void ImGui::EndTooltip() -{ - IM_ASSERT(GetCurrentWindowRead()->Flags & ImGuiWindowFlags_Tooltip); // Mismatched BeginTooltip()/EndTooltip() calls - ImGui::End(); -} - -// Mark popup as open (toggle toward open state). -// Popups are closed when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. -// Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level). -// One open popup per level of the popup hierarchy (NB: when assigning we reset the Window member of ImGuiPopupRef to NULL) -void ImGui::OpenPopupEx(ImGuiID id, bool reopen_existing) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* parent_window = g.CurrentWindow; - int current_stack_size = g.CurrentPopupStack.Size; - ImGuiPopupRef popup_ref = ImGuiPopupRef(id, parent_window, parent_window->GetID("##Menus"), g.IO.MousePos); // Tagged as new ref because constructor sets Window to NULL. - if (g.OpenPopupStack.Size < current_stack_size + 1) - g.OpenPopupStack.push_back(popup_ref); - else if (reopen_existing || g.OpenPopupStack[current_stack_size].PopupId != id) - { - g.OpenPopupStack.resize(current_stack_size+1); - g.OpenPopupStack[current_stack_size] = popup_ref; - - // When reopening a popup we first refocus its parent, otherwise if its parent is itself a popup it would get closed by CloseInactivePopups(). - // This is equivalent to what ClosePopupToLevel() does. - if (g.OpenPopupStack[current_stack_size].PopupId == id) - FocusWindow(parent_window); - } -} - -void ImGui::OpenPopup(const char* str_id) -{ - ImGuiContext& g = *GImGui; - OpenPopupEx(g.CurrentWindow->GetID(str_id), false); -} - -static void CloseInactivePopups(ImGuiWindow* ref_window) -{ - ImGuiContext& g = *GImGui; - if (g.OpenPopupStack.empty()) - return; - - // When popups are stacked, clicking on a lower level popups puts focus back to it and close popups above it. - // Don't close our own child popup windows. - int n = 0; - if (ref_window) - { - for (n = 0; n < g.OpenPopupStack.Size; n++) - { - ImGuiPopupRef& popup = g.OpenPopupStack[n]; - if (!popup.Window) - continue; - IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0); - if (popup.Window->Flags & ImGuiWindowFlags_ChildWindow) - continue; - - // Trim the stack if popups are not direct descendant of the reference window (which is often the NavWindow) - bool has_focus = false; - for (int m = n; m < g.OpenPopupStack.Size && !has_focus; m++) - has_focus = (g.OpenPopupStack[m].Window && g.OpenPopupStack[m].Window->RootWindow == ref_window->RootWindow); - if (!has_focus) - break; - } - } - if (n < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the block below - ClosePopupToLevel(n); -} - -static ImGuiWindow* GetFrontMostModalRootWindow() -{ - ImGuiContext& g = *GImGui; - for (int n = g.OpenPopupStack.Size-1; n >= 0; n--) - if (ImGuiWindow* popup = g.OpenPopupStack.Data[n].Window) - if (popup->Flags & ImGuiWindowFlags_Modal) - return popup; - return NULL; -} - -static void ClosePopupToLevel(int remaining) -{ - ImGuiContext& g = *GImGui; - if (remaining > 0) - ImGui::FocusWindow(g.OpenPopupStack[remaining-1].Window); - else - ImGui::FocusWindow(g.OpenPopupStack[0].ParentWindow); - g.OpenPopupStack.resize(remaining); -} - -void ImGui::ClosePopup(ImGuiID id) -{ - if (!IsPopupOpen(id)) - return; - ImGuiContext& g = *GImGui; - ClosePopupToLevel(g.OpenPopupStack.Size - 1); -} - -// Close the popup we have begin-ed into. -void ImGui::CloseCurrentPopup() -{ - ImGuiContext& g = *GImGui; - int popup_idx = g.CurrentPopupStack.Size - 1; - if (popup_idx < 0 || popup_idx >= g.OpenPopupStack.Size || g.CurrentPopupStack[popup_idx].PopupId != g.OpenPopupStack[popup_idx].PopupId) - return; - while (popup_idx > 0 && g.OpenPopupStack[popup_idx].Window && (g.OpenPopupStack[popup_idx].Window->Flags & ImGuiWindowFlags_ChildMenu)) - popup_idx--; - ClosePopupToLevel(popup_idx); -} - -static inline void ClearSetNextWindowData() -{ - // FIXME-OPT - ImGuiContext& g = *GImGui; - g.SetNextWindowPosCond = g.SetNextWindowSizeCond = g.SetNextWindowContentSizeCond = g.SetNextWindowCollapsedCond = 0; - g.SetNextWindowSizeConstraint = g.SetNextWindowFocus = false; -} - -bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags) -{ - ImGuiContext& g = *GImGui; - if (!IsPopupOpen(id)) - { - ClearSetNextWindowData(); // We behave like Begin() and need to consume those values - return false; - } - - char name[20]; - if (extra_flags & ImGuiWindowFlags_ChildMenu) - ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.CurrentPopupStack.Size); // Recycle windows based on depth - else - ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame - - bool is_open = Begin(name, NULL, extra_flags | ImGuiWindowFlags_Popup); - if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display) - EndPopup(); - - return is_open; -} - -bool ImGui::BeginPopup(const char* str_id) -{ - ImGuiContext& g = *GImGui; - if (g.OpenPopupStack.Size <= g.CurrentPopupStack.Size) // Early out for performance - { - ClearSetNextWindowData(); // We behave like Begin() and need to consume those values - return false; - } - return BeginPopupEx(g.CurrentWindow->GetID(str_id), ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings); -} - -bool ImGui::IsPopupOpen(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - return g.OpenPopupStack.Size > g.CurrentPopupStack.Size && g.OpenPopupStack[g.CurrentPopupStack.Size].PopupId == id; -} - -bool ImGui::IsPopupOpen(const char* str_id) -{ - ImGuiContext& g = *GImGui; - return g.OpenPopupStack.Size > g.CurrentPopupStack.Size && g.OpenPopupStack[g.CurrentPopupStack.Size].PopupId == g.CurrentWindow->GetID(str_id); -} - -bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags extra_flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - const ImGuiID id = window->GetID(name); - if (!IsPopupOpen(id)) - { - ClearSetNextWindowData(); // We behave like Begin() and need to consume those values - return false; - } - - // Center modal windows by default - if ((window->SetWindowPosAllowFlags & g.SetNextWindowPosCond) == 0) - SetNextWindowPos(g.IO.DisplaySize * 0.5f, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); - - ImGuiWindowFlags flags = extra_flags|ImGuiWindowFlags_Popup|ImGuiWindowFlags_Modal|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoSavedSettings; - bool is_open = Begin(name, p_open, flags); - if (!is_open || (p_open && !*p_open)) // NB: is_open can be 'false' when the popup is completely clipped (e.g. zero size display) - { - EndPopup(); - if (is_open) - ClosePopup(id); - return false; - } - - return is_open; -} - -void ImGui::EndPopup() -{ - ImGuiContext& g = *GImGui; (void)g; - IM_ASSERT(g.CurrentWindow->Flags & ImGuiWindowFlags_Popup); // Mismatched BeginPopup()/EndPopup() calls - IM_ASSERT(g.CurrentPopupStack.Size > 0); - End(); -} - -bool ImGui::OpenPopupOnItemClick(const char* str_id, int mouse_button) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - if (IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) - { - ImGuiID id = str_id ? window->GetID(str_id) : window->DC.LastItemId; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict! - IM_ASSERT(id != 0); // However, you cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item) - OpenPopupEx(id, true); - return true; - } - return false; -} - -// This is a helper to handle the simplest case of associating one named popup to one given widget. -// You may want to handle this on user side if you have specific needs (e.g. tweaking IsItemHovered() parameters). -// You can pass a NULL str_id to use the identifier of the last item. -bool ImGui::BeginPopupContextItem(const char* str_id, int mouse_button) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - ImGuiID id = str_id ? window->GetID(str_id) : window->DC.LastItemId; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict! - IM_ASSERT(id != 0); // However, you cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item) - if (IsMouseClicked(mouse_button)) - if (IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) - OpenPopupEx(id, true); - return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings); -} - -bool ImGui::BeginPopupContextWindow(const char* str_id, int mouse_button, bool also_over_items) -{ - if (!str_id) - str_id = "window_context"; - ImGuiID id = GImGui->CurrentWindow->GetID(str_id); - if (IsMouseClicked(mouse_button)) - if (IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) - if (also_over_items || !IsAnyItemHovered()) - OpenPopupEx(id, true); - return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings); -} - -bool ImGui::BeginPopupContextVoid(const char* str_id, int mouse_button) -{ - if (!str_id) - str_id = "void_context"; - ImGuiID id = GImGui->CurrentWindow->GetID(str_id); - if (!IsAnyWindowHovered() && IsMouseClicked(mouse_button)) - OpenPopupEx(id, true); - return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings); -} - -static bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* parent_window = ImGui::GetCurrentWindow(); - ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoSavedSettings|ImGuiWindowFlags_ChildWindow; - flags |= (parent_window->Flags & ImGuiWindowFlags_NoMove); // Inherit the NoMove flag - - const ImVec2 content_avail = ImGui::GetContentRegionAvail(); - ImVec2 size = ImFloor(size_arg); - const int auto_fit_axises = ((size.x == 0.0f) ? (1 << ImGuiAxis_X) : 0x00) | ((size.y == 0.0f) ? (1 << ImGuiAxis_Y) : 0x00); - if (size.x <= 0.0f) - size.x = ImMax(content_avail.x + size.x, 4.0f); // Arbitrary minimum child size (0.0f causing too much issues) - if (size.y <= 0.0f) - size.y = ImMax(content_avail.y + size.y, 4.0f); - - const float backup_border_size = g.Style.ChildBorderSize; - if (!border) - g.Style.ChildBorderSize = 0.0f; - flags |= extra_flags; - - char title[256]; - if (name) - ImFormatString(title, IM_ARRAYSIZE(title), "%s/%s_%08X", parent_window->Name, name, id); - else - ImFormatString(title, IM_ARRAYSIZE(title), "%s/%08X", parent_window->Name, id); - - ImGui::SetNextWindowSize(size); - bool ret = ImGui::Begin(title, NULL, flags); - ImGuiWindow* child_window = ImGui::GetCurrentWindow(); - child_window->AutoFitChildAxises = auto_fit_axises; - g.Style.ChildBorderSize = backup_border_size; - - return ret; -} - -bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - return BeginChildEx(str_id, window->GetID(str_id), size_arg, border, extra_flags); -} - -bool ImGui::BeginChild(ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) -{ - return BeginChildEx(NULL, id, size_arg, border, extra_flags); -} - -void ImGui::EndChild() -{ - ImGuiWindow* window = GetCurrentWindow(); - - IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() callss - if (window->BeginCount > 1) - { - ImGui::End(); - } - else - { - // When using auto-filling child window, we don't provide full width/height to ItemSize so that it doesn't feed back into automatic size-fitting. - ImVec2 sz = GetWindowSize(); - if (window->AutoFitChildAxises & (1 << ImGuiAxis_X)) // Arbitrary minimum zero-ish child size of 4.0f causes less trouble than a 0.0f - sz.x = ImMax(4.0f, sz.x); - if (window->AutoFitChildAxises & (1 << ImGuiAxis_Y)) - sz.y = ImMax(4.0f, sz.y); - ImGui::End(); - - ImGuiWindow* parent_window = GetCurrentWindow(); - ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + sz); - ItemSize(sz); - ItemAdd(bb, 0); - } -} - -// Helper to create a child window / scrolling region that looks like a normal widget frame. -bool ImGui::BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags extra_flags) -{ - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); - PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); - PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); - PushStyleVar(ImGuiStyleVar_WindowPadding, style.FramePadding); - return BeginChild(id, size, true, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysUseWindowPadding | extra_flags); -} - -void ImGui::EndChildFrame() -{ - EndChild(); - PopStyleVar(3); - PopStyleColor(); -} - -// Save and compare stack sizes on Begin()/End() to detect usage errors -static void CheckStacksSize(ImGuiWindow* window, bool write) -{ - // NOT checking: DC.ItemWidth, DC.AllowKeyboardFocus, DC.ButtonRepeat, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin) - ImGuiContext& g = *GImGui; - int* p_backup = &window->DC.StackSizesBackup[0]; - { int current = window->IDStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && "PushID/PopID or TreeNode/TreePop Mismatch!"); p_backup++; } // Too few or too many PopID()/TreePop() - { int current = window->DC.GroupStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && "BeginGroup/EndGroup Mismatch!"); p_backup++; } // Too few or too many EndGroup() - { int current = g.CurrentPopupStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && "BeginMenu/EndMenu or BeginPopup/EndPopup Mismatch"); p_backup++;}// Too few or too many EndMenu()/EndPopup() - { int current = g.ColorModifiers.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && "PushStyleColor/PopStyleColor Mismatch!"); p_backup++; } // Too few or too many PopStyleColor() - { int current = g.StyleModifiers.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && "PushStyleVar/PopStyleVar Mismatch!"); p_backup++; } // Too few or too many PopStyleVar() - { int current = g.FontStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && "PushFont/PopFont Mismatch!"); p_backup++; } // Too few or too many PopFont() - IM_ASSERT(p_backup == window->DC.StackSizesBackup + IM_ARRAYSIZE(window->DC.StackSizesBackup)); -} - -enum ImGuiPopupPositionPolicy -{ - ImGuiPopupPositionPolicy_Default, - ImGuiPopupPositionPolicy_ComboBox -}; - -static ImVec2 FindBestWindowPosForPopup(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy = ImGuiPopupPositionPolicy_Default) -{ - const ImGuiStyle& style = GImGui->Style; - - // r_avoid = the rectangle to avoid (e.g. for tooltip it is a rectangle around the mouse cursor which we want to avoid. for popups it's a small point around the cursor.) - // r_outer = the visible area rectangle, minus safe area padding. If our popup size won't fit because of safe area padding we ignore it. - ImVec2 safe_padding = style.DisplaySafeAreaPadding; - ImRect r_outer(GetVisibleRect()); - r_outer.Expand(ImVec2((size.x - r_outer.GetWidth() > safe_padding.x*2) ? -safe_padding.x : 0.0f, (size.y - r_outer.GetHeight() > safe_padding.y*2) ? -safe_padding.y : 0.0f)); - ImVec2 base_pos_clamped = ImClamp(ref_pos, r_outer.Min, r_outer.Max - size); - //GImGui->OverlayDrawList.AddRect(r_avoid.Min, r_avoid.Max, IM_COL32(255,0,0,255)); - //GImGui->OverlayDrawList.AddRect(r_outer.Min, r_outer.Max, IM_COL32(0,255,0,255)); - - // Combo Box policy (we want a connecting edge) - if (policy == ImGuiPopupPositionPolicy_ComboBox) - { - const ImGuiDir dir_prefered_order[ImGuiDir_Count_] = { ImGuiDir_Down, ImGuiDir_Right, ImGuiDir_Left, ImGuiDir_Up }; - for (int n = (*last_dir != ImGuiDir_None) ? -1 : 0; n < ImGuiDir_Count_; n++) - { - const ImGuiDir dir = (n == -1) ? *last_dir : dir_prefered_order[n]; - if (n != -1 && dir == *last_dir) // Already tried this direction? - continue; - ImVec2 pos; - if (dir == ImGuiDir_Down) pos = ImVec2(r_avoid.Min.x, r_avoid.Max.y); // Below, Toward Right (default) - if (dir == ImGuiDir_Right) pos = ImVec2(r_avoid.Min.x, r_avoid.Min.y - size.y); // Above, Toward Right - if (dir == ImGuiDir_Left) pos = ImVec2(r_avoid.Max.x - size.x, r_avoid.Max.y); // Below, Toward Left - if (dir == ImGuiDir_Up) pos = ImVec2(r_avoid.Max.x - size.x, r_avoid.Min.y - size.y); // Above, Toward Left - if (!r_outer.Contains(ImRect(pos, pos + size))) - continue; - *last_dir = dir; - return pos; - } - } - - // Default popup policy - const ImGuiDir dir_prefered_order[ImGuiDir_Count_] = { ImGuiDir_Right, ImGuiDir_Down, ImGuiDir_Up, ImGuiDir_Left }; - for (int n = (*last_dir != ImGuiDir_None) ? -1 : 0; n < ImGuiDir_Count_; n++) - { - const ImGuiDir dir = (n == -1) ? *last_dir : dir_prefered_order[n]; - if (n != -1 && dir == *last_dir) // Already tried this direction? - continue; - float avail_w = (dir == ImGuiDir_Left ? r_avoid.Min.x : r_outer.Max.x) - (dir == ImGuiDir_Right ? r_avoid.Max.x : r_outer.Min.x); - float avail_h = (dir == ImGuiDir_Up ? r_avoid.Min.y : r_outer.Max.y) - (dir == ImGuiDir_Down ? r_avoid.Max.y : r_outer.Min.y); - if (avail_w < size.x || avail_h < size.y) - continue; - ImVec2 pos; - pos.x = (dir == ImGuiDir_Left) ? r_avoid.Min.x - size.x : (dir == ImGuiDir_Right) ? r_avoid.Max.x : base_pos_clamped.x; - pos.y = (dir == ImGuiDir_Up) ? r_avoid.Min.y - size.y : (dir == ImGuiDir_Down) ? r_avoid.Max.y : base_pos_clamped.y; - *last_dir = dir; - return pos; - } - - // Fallback, try to keep within display - *last_dir = ImGuiDir_None; - ImVec2 pos = ref_pos; - pos.x = ImMax(ImMin(pos.x + size.x, r_outer.Max.x) - size.x, r_outer.Min.x); - pos.y = ImMax(ImMin(pos.y + size.y, r_outer.Max.y) - size.y, r_outer.Min.y); - return pos; -} - -static void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, bool enabled) -{ - window->SetWindowPosAllowFlags = enabled ? (window->SetWindowPosAllowFlags | flags) : (window->SetWindowPosAllowFlags & ~flags); - window->SetWindowSizeAllowFlags = enabled ? (window->SetWindowSizeAllowFlags | flags) : (window->SetWindowSizeAllowFlags & ~flags); - window->SetWindowCollapsedAllowFlags = enabled ? (window->SetWindowCollapsedAllowFlags | flags) : (window->SetWindowCollapsedAllowFlags & ~flags); -} - -ImGuiWindow* ImGui::FindWindowByName(const char* name) -{ - ImGuiContext& g = *GImGui; - ImGuiID id = ImHash(name, 0); - return (ImGuiWindow*)g.WindowsById.GetVoidPtr(id); -} - -static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags) -{ - ImGuiContext& g = *GImGui; - - // Create window the first time - ImGuiWindow* window = IM_NEW(ImGuiWindow)(&g, name); - window->Flags = flags; - g.WindowsById.SetVoidPtr(window->ID, window); - - // User can disable loading and saving of settings. Tooltip and child windows also don't store settings. - if (!(flags & ImGuiWindowFlags_NoSavedSettings)) - { - // Retrieve settings from .ini file - // Use SetWindowPos() or SetNextWindowPos() with the appropriate condition flag to change the initial position of a window. - window->PosFloat = ImVec2(60, 60); - window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y); - - if (ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID)) - { - SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false); - window->PosFloat = settings->Pos; - window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y); - window->Collapsed = settings->Collapsed; - if (ImLengthSqr(settings->Size) > 0.00001f) - size = settings->Size; - } - } - window->Size = window->SizeFull = window->SizeFullAtLastBegin = size; - - if ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0) - { - window->AutoFitFramesX = window->AutoFitFramesY = 2; - window->AutoFitOnlyGrows = false; - } - else - { - if (window->Size.x <= 0.0f) - window->AutoFitFramesX = 2; - if (window->Size.y <= 0.0f) - window->AutoFitFramesY = 2; - window->AutoFitOnlyGrows = (window->AutoFitFramesX > 0) || (window->AutoFitFramesY > 0); - } - - if (flags & ImGuiWindowFlags_NoBringToFrontOnFocus) - g.Windows.insert(g.Windows.begin(), window); // Quite slow but rare and only once - else - g.Windows.push_back(window); - return window; -} - -static ImVec2 CalcSizeAfterConstraint(ImGuiWindow* window, ImVec2 new_size) -{ - ImGuiContext& g = *GImGui; - if (g.SetNextWindowSizeConstraint) - { - // Using -1,-1 on either X/Y axis to preserve the current size. - ImRect cr = g.SetNextWindowSizeConstraintRect; - new_size.x = (cr.Min.x >= 0 && cr.Max.x >= 0) ? ImClamp(new_size.x, cr.Min.x, cr.Max.x) : window->SizeFull.x; - new_size.y = (cr.Min.y >= 0 && cr.Max.y >= 0) ? ImClamp(new_size.y, cr.Min.y, cr.Max.y) : window->SizeFull.y; - if (g.SetNextWindowSizeConstraintCallback) - { - ImGuiSizeConstraintCallbackData data; - data.UserData = g.SetNextWindowSizeConstraintCallbackUserData; - data.Pos = window->Pos; - data.CurrentSize = window->SizeFull; - data.DesiredSize = new_size; - g.SetNextWindowSizeConstraintCallback(&data); - new_size = data.DesiredSize; - } - } - - // Minimum size - if (!(window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize))) - { - new_size = ImMax(new_size, g.Style.WindowMinSize); - new_size.y = ImMax(new_size.y, window->TitleBarHeight() + window->MenuBarHeight() + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); // Reduce artifacts with very small windows - } - return new_size; -} - -static ImVec2 CalcSizeContents(ImGuiWindow* window) -{ - ImVec2 sz; - sz.x = (float)(int)((window->SizeContentsExplicit.x != 0.0f) ? window->SizeContentsExplicit.x : (window->DC.CursorMaxPos.x - window->Pos.x + window->Scroll.x)); - sz.y = (float)(int)((window->SizeContentsExplicit.y != 0.0f) ? window->SizeContentsExplicit.y : (window->DC.CursorMaxPos.y - window->Pos.y + window->Scroll.y)); - return sz + window->WindowPadding; -} - -static ImVec2 CalcSizeAutoFit(ImGuiWindow* window, const ImVec2& size_contents) -{ - ImGuiContext& g = *GImGui; - ImGuiStyle& style = g.Style; - ImGuiWindowFlags flags = window->Flags; - ImVec2 size_auto_fit; - if ((flags & ImGuiWindowFlags_Tooltip) != 0) - { - // Tooltip always resize. We keep the spacing symmetric on both axises for aesthetic purpose. - size_auto_fit = size_contents; - } - else - { - // When the window cannot fit all contents (either because of constraints, either because screen is too small): we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than DisplaySize-WindowPadding. - size_auto_fit = ImClamp(size_contents, style.WindowMinSize, ImMax(style.WindowMinSize, g.IO.DisplaySize - g.Style.DisplaySafeAreaPadding)); - ImVec2 size_auto_fit_after_constraint = CalcSizeAfterConstraint(window, size_auto_fit); - if (size_auto_fit_after_constraint.x < size_contents.x && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)) - size_auto_fit.y += style.ScrollbarSize; - if (size_auto_fit_after_constraint.y < size_contents.y && !(flags & ImGuiWindowFlags_NoScrollbar)) - size_auto_fit.x += style.ScrollbarSize; - } - return size_auto_fit; -} - -static float GetScrollMaxX(ImGuiWindow* window) -{ - return ImMax(0.0f, window->SizeContents.x - (window->SizeFull.x - window->ScrollbarSizes.x)); -} - -static float GetScrollMaxY(ImGuiWindow* window) -{ - return ImMax(0.0f, window->SizeContents.y - (window->SizeFull.y - window->ScrollbarSizes.y)); -} - -static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window) -{ - ImVec2 scroll = window->Scroll; - float cr_x = window->ScrollTargetCenterRatio.x; - float cr_y = window->ScrollTargetCenterRatio.y; - if (window->ScrollTarget.x < FLT_MAX) - scroll.x = window->ScrollTarget.x - cr_x * (window->SizeFull.x - window->ScrollbarSizes.x); - if (window->ScrollTarget.y < FLT_MAX) - scroll.y = window->ScrollTarget.y - (1.0f - cr_y) * (window->TitleBarHeight() + window->MenuBarHeight()) - cr_y * (window->SizeFull.y - window->ScrollbarSizes.y); - scroll = ImMax(scroll, ImVec2(0.0f, 0.0f)); - if (!window->Collapsed && !window->SkipItems) - { - scroll.x = ImMin(scroll.x, GetScrollMaxX(window)); - scroll.y = ImMin(scroll.y, GetScrollMaxY(window)); - } - return scroll; -} - -static ImGuiCol GetWindowBgColorIdxFromFlags(ImGuiWindowFlags flags) -{ - if (flags & (ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) - return ImGuiCol_PopupBg; - if (flags & ImGuiWindowFlags_ChildWindow) - return ImGuiCol_ChildBg; - return ImGuiCol_WindowBg; -} - -static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& corner_target, const ImVec2& corner_norm, ImVec2* out_pos, ImVec2* out_size) -{ - ImVec2 pos_min = ImLerp(corner_target, window->Pos, corner_norm); // Expected window upper-left - ImVec2 pos_max = ImLerp(window->Pos + window->Size, corner_target, corner_norm); // Expected window lower-right - ImVec2 size_expected = pos_max - pos_min; - ImVec2 size_constrained = CalcSizeAfterConstraint(window, size_expected); - *out_pos = pos_min; - if (corner_norm.x == 0.0f) - out_pos->x -= (size_constrained.x - size_expected.x); - if (corner_norm.y == 0.0f) - out_pos->y -= (size_constrained.y - size_expected.y); - *out_size = size_constrained; -} - -struct ImGuiResizeGripDef -{ - ImVec2 CornerPos; - ImVec2 InnerDir; - int AngleMin12, AngleMax12; -}; - -const ImGuiResizeGripDef resize_grip_def[4] = -{ - { ImVec2(1,1), ImVec2(-1,-1), 0, 3 }, // Lower right - { ImVec2(0,1), ImVec2(+1,-1), 3, 6 }, // Lower left - { ImVec2(0,0), ImVec2(+1,+1), 6, 9 }, // Upper left - { ImVec2(1,0), ImVec2(-1,+1), 9,12 }, // Upper right -}; - -static ImRect GetBorderRect(ImGuiWindow* window, int border_n, float perp_padding, float thickness) -{ - ImRect rect = window->Rect(); - if (thickness == 0.0f) rect.Max -= ImVec2(1,1); - if (border_n == 0) return ImRect(rect.Min.x + perp_padding, rect.Min.y, rect.Max.x - perp_padding, rect.Min.y + thickness); - if (border_n == 1) return ImRect(rect.Max.x - thickness, rect.Min.y + perp_padding, rect.Max.x, rect.Max.y - perp_padding); - if (border_n == 2) return ImRect(rect.Min.x + perp_padding, rect.Max.y - thickness, rect.Max.x - perp_padding, rect.Max.y); - if (border_n == 3) return ImRect(rect.Min.x, rect.Min.y + perp_padding, rect.Min.x + thickness, rect.Max.y - perp_padding); - IM_ASSERT(0); - return ImRect(); -} - -// Push a new ImGui window to add widgets to. -// - A default window called "Debug" is automatically stacked at the beginning of every frame so you can use widgets without explicitly calling a Begin/End pair. -// - Begin/End can be called multiple times during the frame with the same window name to append content. -// - The window name is used as a unique identifier to preserve window information across frames (and save rudimentary information to the .ini file). -// You can use the "##" or "###" markers to use the same label with different id, or same id with different label. See documentation at the top of this file. -// - Return false when window is collapsed, so you can early out in your code. You always need to call ImGui::End() even if false is returned. -// - Passing 'bool* p_open' displays a Close button on the upper-right corner of the window, the pointed value will be set to false when the button is pressed. -bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) -{ - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - IM_ASSERT(name != NULL); // Window name required - IM_ASSERT(g.Initialized); // Forgot to call ImGui::NewFrame() - IM_ASSERT(g.FrameCountEnded != g.FrameCount); // Called ImGui::Render() or ImGui::EndFrame() and haven't called ImGui::NewFrame() again yet - - if (flags & ImGuiWindowFlags_NoInputs) - flags |= ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize; - - // Find or create - ImGuiWindow* window = FindWindowByName(name); - if (!window) - { - ImVec2 size_on_first_use = (g.SetNextWindowSizeCond != 0) ? g.SetNextWindowSizeVal : ImVec2(0.0f, 0.0f); // Any condition flag will do since we are creating a new window here. - window = CreateNewWindow(name, size_on_first_use, flags); - } - - const int current_frame = g.FrameCount; - const bool first_begin_of_the_frame = (window->LastFrameActive != current_frame); - if (first_begin_of_the_frame) - window->Flags = (ImGuiWindowFlags)flags; - else - flags = window->Flags; - - // Update the Appearing flag - bool window_just_activated_by_user = (window->LastFrameActive < current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on - const bool window_just_appearing_after_hidden_for_resize = (window->HiddenFrames == 1); - if (flags & ImGuiWindowFlags_Popup) - { - ImGuiPopupRef& popup_ref = g.OpenPopupStack[g.CurrentPopupStack.Size]; - window_just_activated_by_user |= (window->PopupId != popup_ref.PopupId); // We recycle popups so treat window as activated if popup id changed - window_just_activated_by_user |= (window != popup_ref.Window); - } - window->Appearing = (window_just_activated_by_user || window_just_appearing_after_hidden_for_resize); - window->CloseButton = (p_open != NULL); - if (window->Appearing) - SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, true); - - // Parent window is latched only on the first call to Begin() of the frame, so further append-calls can be done from a different window stack - ImGuiWindow* parent_window_in_stack = g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back(); - ImGuiWindow* parent_window = first_begin_of_the_frame ? ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)) ? parent_window_in_stack : NULL) : window->ParentWindow; - IM_ASSERT(parent_window != NULL || !(flags & ImGuiWindowFlags_ChildWindow)); - - // Add to stack - g.CurrentWindowStack.push_back(window); - SetCurrentWindow(window); - CheckStacksSize(window, true); - if (flags & ImGuiWindowFlags_Popup) - { - ImGuiPopupRef& popup_ref = g.OpenPopupStack[g.CurrentPopupStack.Size]; - popup_ref.Window = window; - g.CurrentPopupStack.push_back(popup_ref); - window->PopupId = popup_ref.PopupId; - } - - // Process SetNextWindow***() calls - bool window_pos_set_by_api = false; - bool window_size_x_set_by_api = false, window_size_y_set_by_api = false; - if (g.SetNextWindowPosCond) - { - window_pos_set_by_api = (window->SetWindowPosAllowFlags & g.SetNextWindowPosCond) != 0; - if (window_pos_set_by_api && ImLengthSqr(g.SetNextWindowPosPivot) > 0.00001f) - { - // May be processed on the next frame if this is our first frame and we are measuring size - // FIXME: Look into removing the branch so everything can go through this same code path for consistency. - window->SetWindowPosVal = g.SetNextWindowPosVal; - window->SetWindowPosPivot = g.SetNextWindowPosPivot; - window->SetWindowPosAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); - } - else - { - SetWindowPos(window, g.SetNextWindowPosVal, g.SetNextWindowPosCond); - } - g.SetNextWindowPosCond = 0; - } - if (g.SetNextWindowSizeCond) - { - window_size_x_set_by_api = (window->SetWindowSizeAllowFlags & g.SetNextWindowSizeCond) != 0 && (g.SetNextWindowSizeVal.x > 0.0f); - window_size_y_set_by_api = (window->SetWindowSizeAllowFlags & g.SetNextWindowSizeCond) != 0 && (g.SetNextWindowSizeVal.y > 0.0f); - SetWindowSize(window, g.SetNextWindowSizeVal, g.SetNextWindowSizeCond); - g.SetNextWindowSizeCond = 0; - } - if (g.SetNextWindowContentSizeCond) - { - // Adjust passed "client size" to become a "window size" - window->SizeContentsExplicit = g.SetNextWindowContentSizeVal; - window->SizeContentsExplicit.y += window->TitleBarHeight() + window->MenuBarHeight(); - g.SetNextWindowContentSizeCond = 0; - } - else if (first_begin_of_the_frame) - { - window->SizeContentsExplicit = ImVec2(0.0f, 0.0f); - } - if (g.SetNextWindowCollapsedCond) - { - SetWindowCollapsed(window, g.SetNextWindowCollapsedVal, g.SetNextWindowCollapsedCond); - g.SetNextWindowCollapsedCond = 0; - } - if (g.SetNextWindowFocus) - { - SetWindowFocus(); - g.SetNextWindowFocus = false; - } - if (window->Appearing) - SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, false); - - // When reusing window again multiple times a frame, just append content (don't need to setup again) - if (first_begin_of_the_frame) - { - // Initialize - window->ParentWindow = parent_window; - window->RootWindow = window->RootNonPopupWindow = window; - if (parent_window && (flags & ImGuiWindowFlags_ChildWindow)) - window->RootWindow = parent_window->RootWindow; - if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup))) - window->RootNonPopupWindow = parent_window->RootNonPopupWindow; - //window->RootNavWindow = window; - //while (window->RootNavWindow->Flags & ImGuiWindowFlags_NavFlattened) - // window->RootNavWindow = window->RootNavWindow->ParentWindow; - - window->Active = true; - window->BeginOrderWithinParent = 0; - window->BeginOrderWithinContext = g.WindowsActiveCount++; - window->BeginCount = 0; - window->ClipRect = ImVec4(-FLT_MAX,-FLT_MAX,+FLT_MAX,+FLT_MAX); - window->LastFrameActive = current_frame; - window->IDStack.resize(1); - - // Setup draw list and outer clipping rectangle - window->DrawList->Clear(); - window->DrawList->Flags = (g.Style.AntiAliasedLines ? ImDrawListFlags_AntiAliasedLines : 0) | (g.Style.AntiAliasedFill ? ImDrawListFlags_AntiAliasedFill : 0); - window->DrawList->PushTextureID(g.Font->ContainerAtlas->TexID); - ImRect fullscreen_rect(GetVisibleRect()); - if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup)) - PushClipRect(parent_window->ClipRect.Min, parent_window->ClipRect.Max, true); - else - PushClipRect(fullscreen_rect.Min, fullscreen_rect.Max, true); - - if (window_just_activated_by_user) - { - // Popup first latch mouse position, will position itself when it appears next frame - window->AutoPosLastDirection = ImGuiDir_None; - if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api) - window->PosFloat = g.IO.MousePos; - } - - // Collapse window by double-clicking on title bar - // At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing - if (!(flags & ImGuiWindowFlags_NoTitleBar) && !(flags & ImGuiWindowFlags_NoCollapse)) - { - ImRect title_bar_rect = window->TitleBarRect(); - if (g.HoveredWindow == window && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max) && g.IO.MouseDoubleClicked[0]) - { - window->Collapsed = !window->Collapsed; - MarkIniSettingsDirty(window); - FocusWindow(window); - } - } - else - { - window->Collapsed = false; - } - - // SIZE - - // Update contents size from last frame for auto-fitting (unless explicitly specified) - window->SizeContents = CalcSizeContents(window); - - // Hide popup/tooltip window when re-opening while we measure size (because we recycle the windows) - if (window->HiddenFrames > 0) - window->HiddenFrames--; - if ((flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) != 0 && window_just_activated_by_user) - { - window->HiddenFrames = 1; - if (flags & ImGuiWindowFlags_AlwaysAutoResize) - { - if (!window_size_x_set_by_api) - window->Size.x = window->SizeFull.x = 0.f; - if (!window_size_y_set_by_api) - window->Size.y = window->SizeFull.y = 0.f; - window->SizeContents = ImVec2(0.f, 0.f); - } - } - - // Lock window rounding, border size and rounding so that altering the border sizes for children doesn't have side-effects. - window->WindowRounding = (flags & ImGuiWindowFlags_ChildWindow) ? style.ChildRounding : ((flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupRounding : style.WindowRounding; - window->WindowBorderSize = (flags & ImGuiWindowFlags_ChildWindow) ? style.ChildBorderSize : ((flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupBorderSize : style.WindowBorderSize; - window->WindowPadding = style.WindowPadding; - if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_Popup)) && window->WindowBorderSize == 0.0f) - window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f); - const float window_rounding = window->WindowRounding; - const float window_border_size = window->WindowBorderSize; - - // Calculate auto-fit size, handle automatic resize - const ImVec2 size_auto_fit = CalcSizeAutoFit(window, window->SizeContents); - ImVec2 size_full_modified(FLT_MAX, FLT_MAX); - if (flags & ImGuiWindowFlags_AlwaysAutoResize && !window->Collapsed) - { - // Using SetNextWindowSize() overrides ImGuiWindowFlags_AlwaysAutoResize, so it can be used on tooltips/popups, etc. - if (!window_size_x_set_by_api) - window->SizeFull.x = size_full_modified.x = size_auto_fit.x; - if (!window_size_y_set_by_api) - window->SizeFull.y = size_full_modified.y = size_auto_fit.y; - } - else if (window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) - { - // Auto-fit only grows during the first few frames - // We still process initial auto-fit on collapsed windows to get a window width, but otherwise don't honor ImGuiWindowFlags_AlwaysAutoResize when collapsed. - if (!window_size_x_set_by_api && window->AutoFitFramesX > 0) - window->SizeFull.x = size_full_modified.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x; - if (!window_size_y_set_by_api && window->AutoFitFramesY > 0) - window->SizeFull.y = size_full_modified.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y; - if (!window->Collapsed) - MarkIniSettingsDirty(window); - } - - // Apply minimum/maximum window size constraints and final size - window->SizeFull = CalcSizeAfterConstraint(window, window->SizeFull); - window->Size = window->Collapsed ? window->TitleBarRect().GetSize() : window->SizeFull; - if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup)) - { - IM_ASSERT(window_size_x_set_by_api && window_size_y_set_by_api); // Submitted by BeginChild() - window->Size = window->SizeFull; - } - - // SCROLLBAR STATUS - - // Update scrollbar status (based on the Size that was effective during last frame or the auto-resized Size). - if (!window->Collapsed) - { - // When reading the current size we need to read it after size constraints have been applied - float size_x_for_scrollbars = size_full_modified.x != FLT_MAX ? window->SizeFull.x : window->SizeFullAtLastBegin.x; - float size_y_for_scrollbars = size_full_modified.y != FLT_MAX ? window->SizeFull.y : window->SizeFullAtLastBegin.y; - window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((window->SizeContents.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar)); - window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((window->SizeContents.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f) - window->WindowPadding.x) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)); - if (window->ScrollbarX && !window->ScrollbarY) - window->ScrollbarY = (window->SizeContents.y > size_y_for_scrollbars + style.ScrollbarSize) && !(flags & ImGuiWindowFlags_NoScrollbar); - window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f); - } - - // POSITION - - // Position child window - if (flags & ImGuiWindowFlags_ChildWindow) - { - window->BeginOrderWithinParent = parent_window->DC.ChildWindows.Size; - parent_window->DC.ChildWindows.push_back(window); - } - if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_pos_set_by_api) - window->Pos = window->PosFloat = parent_window->DC.CursorPos; - - const bool window_pos_with_pivot = (window->SetWindowPosVal.x != FLT_MAX && window->HiddenFrames == 0); - if (window_pos_with_pivot) - { - // Position given a pivot (e.g. for centering) - SetWindowPos(window, ImMax(style.DisplaySafeAreaPadding, window->SetWindowPosVal - window->SizeFull * window->SetWindowPosPivot), 0); - } - else if (flags & ImGuiWindowFlags_ChildMenu) - { - // Child menus typically request _any_ position within the parent menu item, and then our FindBestPopupWindowPos() function will move the new menu outside the parent bounds. - // This is how we end up with child menus appearing (most-commonly) on the right of the parent menu. - IM_ASSERT(window_pos_set_by_api); - float horizontal_overlap = style.ItemSpacing.x; // We want some overlap to convey the relative depth of each popup (currently the amount of overlap it is hard-coded to style.ItemSpacing.x, may need to introduce another style value). - ImGuiWindow* parent_menu = parent_window_in_stack; - ImRect rect_to_avoid; - if (parent_menu->DC.MenuBarAppending) - rect_to_avoid = ImRect(-FLT_MAX, parent_menu->Pos.y + parent_menu->TitleBarHeight(), FLT_MAX, parent_menu->Pos.y + parent_menu->TitleBarHeight() + parent_menu->MenuBarHeight()); - else - rect_to_avoid = ImRect(parent_menu->Pos.x + horizontal_overlap, -FLT_MAX, parent_menu->Pos.x + parent_menu->Size.x - horizontal_overlap - parent_menu->ScrollbarSizes.x, FLT_MAX); - window->PosFloat = FindBestWindowPosForPopup(window->PosFloat, window->Size, &window->AutoPosLastDirection, rect_to_avoid); - } - else if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api && window_just_appearing_after_hidden_for_resize) - { - ImRect rect_to_avoid(window->PosFloat.x - 1, window->PosFloat.y - 1, window->PosFloat.x + 1, window->PosFloat.y + 1); - window->PosFloat = FindBestWindowPosForPopup(window->PosFloat, window->Size, &window->AutoPosLastDirection, rect_to_avoid); - } - - // Position tooltip (always follows mouse) - if ((flags & ImGuiWindowFlags_Tooltip) != 0 && !window_pos_set_by_api) - { - ImVec2 ref_pos = g.IO.MousePos; - ImRect rect_to_avoid(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 24, ref_pos.y + 24); // FIXME: Completely hard-coded. Store boxes in mouse cursor data? Scale? Center on cursor hit-point? - window->PosFloat = FindBestWindowPosForPopup(ref_pos, window->Size, &window->AutoPosLastDirection, rect_to_avoid); - if (window->AutoPosLastDirection == ImGuiDir_None) - window->PosFloat = ref_pos + ImVec2(2,2); // If there's not enough room, for tooltip we prefer avoiding the cursor at all cost even if it means that part of the tooltip won't be visible. - } - - // Clamp position so it stays visible - if (!(flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Tooltip)) - { - if (!window_pos_set_by_api && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && g.IO.DisplaySize.x > 0.0f && g.IO.DisplaySize.y > 0.0f) // Ignore zero-sized display explicitly to avoid losing positions if a window manager reports zero-sized window when initializing or minimizing. - { - ImVec2 padding = ImMax(style.DisplayWindowPadding, style.DisplaySafeAreaPadding); - window->PosFloat = ImMax(window->PosFloat + window->Size, padding) - window->Size; - window->PosFloat = ImMin(window->PosFloat, g.IO.DisplaySize - padding); - } - } - window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y); - - // Default item width. Make it proportional to window size if window manually resizes - if (window->Size.x > 0.0f && !(flags & ImGuiWindowFlags_Tooltip) && !(flags & ImGuiWindowFlags_AlwaysAutoResize)) - window->ItemWidthDefault = (float)(int)(window->Size.x * 0.65f); - else - window->ItemWidthDefault = (float)(int)(g.FontSize * 16.0f); - - // Prepare for focus requests - window->FocusIdxAllRequestCurrent = (window->FocusIdxAllRequestNext == INT_MAX || window->FocusIdxAllCounter == -1) ? INT_MAX : (window->FocusIdxAllRequestNext + (window->FocusIdxAllCounter+1)) % (window->FocusIdxAllCounter+1); - window->FocusIdxTabRequestCurrent = (window->FocusIdxTabRequestNext == INT_MAX || window->FocusIdxTabCounter == -1) ? INT_MAX : (window->FocusIdxTabRequestNext + (window->FocusIdxTabCounter+1)) % (window->FocusIdxTabCounter+1); - window->FocusIdxAllCounter = window->FocusIdxTabCounter = -1; - window->FocusIdxAllRequestNext = window->FocusIdxTabRequestNext = INT_MAX; - - // Apply scrolling - window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window); - window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); - - // Apply focus, new windows appears in front - bool want_focus = false; - if (window_just_activated_by_user && !(flags & ImGuiWindowFlags_NoFocusOnAppearing)) - if (!(flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) || (flags & ImGuiWindowFlags_Popup)) - want_focus = true; - - // Draw modal window background (darkens what is behind them) - if ((flags & ImGuiWindowFlags_Modal) != 0 && window == GetFrontMostModalRootWindow()) - window->DrawList->AddRectFilled(fullscreen_rect.Min, fullscreen_rect.Max, GetColorU32(ImGuiCol_ModalWindowDarkening, g.ModalWindowDarkeningRatio)); - - // Draw window + handle manual resize - ImRect title_bar_rect = window->TitleBarRect(); - if (window->Collapsed) - { - // Title bar only - float backup_border_size = style.FrameBorderSize; - g.Style.FrameBorderSize = window->WindowBorderSize; - RenderFrame(title_bar_rect.Min, title_bar_rect.Max, GetColorU32(ImGuiCol_TitleBgCollapsed), true, window_rounding); - g.Style.FrameBorderSize = backup_border_size; - } - else - { - // Handle resize for: Resize Grips, Borders, Gamepad - int border_held = -1; - ImU32 resize_grip_col[4] = { 0 }; - const int resize_grip_count = (flags & ImGuiWindowFlags_ResizeFromAnySide) ? 2 : 1; // 4 - const int resize_border_count = (flags & ImGuiWindowFlags_ResizeFromAnySide) ? 4 : 0; - - const float grip_draw_size = (float)(int)ImMax(g.FontSize * 1.35f, window_rounding + 1.0f + g.FontSize * 0.2f); - const float grip_hover_size = (float)(int)(grip_draw_size * 0.75f); - if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && !(flags & ImGuiWindowFlags_NoResize)) - { - ImVec2 pos_target(FLT_MAX, FLT_MAX); - ImVec2 size_target(FLT_MAX, FLT_MAX); - - // Manual resize grips - PushID("#RESIZE"); - for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++) - { - const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n]; - const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPos); - - // Using the FlattenChilds button flag we make the resize button accessible even if we are hovering over a child window - ImRect resize_rect(corner, corner + grip.InnerDir * grip_hover_size); - resize_rect.FixInverted(); - bool hovered, held; - ButtonBehavior(resize_rect, window->GetID((void*)(intptr_t)resize_grip_n), &hovered, &held, ImGuiButtonFlags_FlattenChildren); - if (hovered || held) - g.MouseCursor = (resize_grip_n & 1) ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE; - - if (g.HoveredWindow == window && held && g.IO.MouseDoubleClicked[0] && resize_grip_n == 0) - { - // Manual auto-fit when double-clicking - size_target = CalcSizeAfterConstraint(window, size_auto_fit); - ClearActiveID(); - } - else if (held) - { - // Resize from any of the four corners - // We don't use an incremental MouseDelta but rather compute an absolute target size based on mouse position - ImVec2 corner_target = g.IO.MousePos - g.ActiveIdClickOffset + resize_rect.GetSize() * grip.CornerPos; // Corner of the window corresponding to our corner grip - CalcResizePosSizeFromAnyCorner(window, corner_target, grip.CornerPos, &pos_target, &size_target); - } - if (resize_grip_n == 0 || held || hovered) - resize_grip_col[resize_grip_n] = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip); - } - for (int border_n = 0; border_n < resize_border_count; border_n++) - { - const float BORDER_SIZE = 5.0f; // FIXME: Only works _inside_ window because of HoveredWindow check. - const float BORDER_APPEAR_TIMER = 0.05f; // Reduce visual noise - bool hovered, held; - ImRect border_rect = GetBorderRect(window, border_n, grip_hover_size, BORDER_SIZE); - ButtonBehavior(border_rect, window->GetID((void*)(intptr_t)(border_n+4)), &hovered, &held, ImGuiButtonFlags_FlattenChildren); - if ((hovered && g.HoveredIdTimer > BORDER_APPEAR_TIMER) || held) - { - g.MouseCursor = (border_n & 1) ? ImGuiMouseCursor_ResizeEW : ImGuiMouseCursor_ResizeNS; - if (held) border_held = border_n; - } - if (held) - { - ImVec2 border_target = window->Pos; - ImVec2 border_posn; - if (border_n == 0) { border_posn = ImVec2(0, 0); border_target.y = (g.IO.MousePos.y - g.ActiveIdClickOffset.y); } - if (border_n == 1) { border_posn = ImVec2(1, 0); border_target.x = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + BORDER_SIZE); } - if (border_n == 2) { border_posn = ImVec2(0, 1); border_target.y = (g.IO.MousePos.y - g.ActiveIdClickOffset.y + BORDER_SIZE); } - if (border_n == 3) { border_posn = ImVec2(0, 0); border_target.x = (g.IO.MousePos.x - g.ActiveIdClickOffset.x); } - CalcResizePosSizeFromAnyCorner(window, border_target, border_posn, &pos_target, &size_target); - } - } - PopID(); - - // Apply back modified position/size to window - if (size_target.x != FLT_MAX) - { - window->SizeFull = size_target; - MarkIniSettingsDirty(window); - } - if (pos_target.x != FLT_MAX) - { - window->Pos = window->PosFloat = ImVec2((float)(int)pos_target.x, (float)(int)pos_target.y); - MarkIniSettingsDirty(window); - } - - window->Size = window->SizeFull; - title_bar_rect = window->TitleBarRect(); - } - - // Window background, Default Alpha - ImU32 bg_col = GetColorU32(GetWindowBgColorIdxFromFlags(flags)); - window->DrawList->AddRectFilled(window->Pos+ImVec2(0,window->TitleBarHeight()), window->Pos+window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Bot); - - // Title bar - const bool window_is_focused = want_focus || (g.NavWindow && window->RootNonPopupWindow == g.NavWindow->RootNonPopupWindow); - if (!(flags & ImGuiWindowFlags_NoTitleBar)) - window->DrawList->AddRectFilled(title_bar_rect.Min, title_bar_rect.Max, GetColorU32(window_is_focused ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg), window_rounding, ImDrawCornerFlags_Top); - - // Menu bar - if (flags & ImGuiWindowFlags_MenuBar) - { - ImRect menu_bar_rect = window->MenuBarRect(); - menu_bar_rect.ClipWith(window->Rect()); // Soft clipping, in particular child window don't have minimum size covering the menu bar so this is useful for them. - window->DrawList->AddRectFilled(menu_bar_rect.Min, menu_bar_rect.Max, GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawCornerFlags_Top); - if (style.FrameBorderSize > 0.0f && menu_bar_rect.Max.y < window->Pos.y + window->Size.y) - window->DrawList->AddLine(menu_bar_rect.GetBL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_Border), style.FrameBorderSize); - } - - // Scrollbars - if (window->ScrollbarX) - Scrollbar(ImGuiLayoutType_Horizontal); - if (window->ScrollbarY) - Scrollbar(ImGuiLayoutType_Vertical); - - // Render resize grips (after their input handling so we don't have a frame of latency) - if (!(flags & ImGuiWindowFlags_NoResize)) - { - for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++) - { - const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n]; - const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPos); - window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, grip_draw_size) : ImVec2(grip_draw_size, window_border_size))); - window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(grip_draw_size, window_border_size) : ImVec2(window_border_size, grip_draw_size))); - window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12); - window->DrawList->PathFillConvex(resize_grip_col[resize_grip_n]); - } - } - - // Borders - if (window_border_size > 0.0f) - window->DrawList->AddRect(window->Pos, window->Pos+window->Size, GetColorU32(ImGuiCol_Border), window_rounding, ImDrawCornerFlags_All, window_border_size); - if (border_held != -1) - { - ImRect border = GetBorderRect(window, border_held, grip_draw_size, 0.0f); - window->DrawList->AddLine(border.Min, border.Max, GetColorU32(ImGuiCol_SeparatorActive), ImMax(1.0f, window_border_size)); - } - if (style.FrameBorderSize > 0 && !(flags & ImGuiWindowFlags_NoTitleBar)) - window->DrawList->AddLine(title_bar_rect.GetBL() + ImVec2(style.WindowBorderSize, -1), title_bar_rect.GetBR() + ImVec2(-style.WindowBorderSize,-1), GetColorU32(ImGuiCol_Border), style.FrameBorderSize); - } - - // Store a backup of SizeFull which we will use next frame to decide if we need scrollbars. - window->SizeFullAtLastBegin = window->SizeFull; - - // Update ContentsRegionMax. All the variable it depends on are set above in this function. - window->ContentsRegionRect.Min.x = -window->Scroll.x + window->WindowPadding.x; - window->ContentsRegionRect.Min.y = -window->Scroll.y + window->WindowPadding.y + window->TitleBarHeight() + window->MenuBarHeight(); - window->ContentsRegionRect.Max.x = -window->Scroll.x - window->WindowPadding.x + (window->SizeContentsExplicit.x != 0.0f ? window->SizeContentsExplicit.x : (window->Size.x - window->ScrollbarSizes.x)); - window->ContentsRegionRect.Max.y = -window->Scroll.y - window->WindowPadding.y + (window->SizeContentsExplicit.y != 0.0f ? window->SizeContentsExplicit.y : (window->Size.y - window->ScrollbarSizes.y)); - - // Setup drawing context - // (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.) - window->DC.IndentX = 0.0f + window->WindowPadding.x - window->Scroll.x; - window->DC.GroupOffsetX = 0.0f; - window->DC.ColumnsOffsetX = 0.0f; - window->DC.CursorStartPos = window->Pos + ImVec2(window->DC.IndentX + window->DC.ColumnsOffsetX, window->TitleBarHeight() + window->MenuBarHeight() + window->WindowPadding.y - window->Scroll.y); - window->DC.CursorPos = window->DC.CursorStartPos; - window->DC.CursorPosPrevLine = window->DC.CursorPos; - window->DC.CursorMaxPos = window->DC.CursorStartPos; - window->DC.CurrentLineHeight = window->DC.PrevLineHeight = 0.0f; - window->DC.CurrentLineTextBaseOffset = window->DC.PrevLineTextBaseOffset = 0.0f; - window->DC.MenuBarAppending = false; - window->DC.MenuBarOffsetX = ImMax(window->WindowPadding.x, style.ItemSpacing.x); - window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f; - window->DC.ChildWindows.resize(0); - window->DC.LayoutType = ImGuiLayoutType_Vertical; - window->DC.ItemFlags = ImGuiItemFlags_Default_; - window->DC.ItemWidth = window->ItemWidthDefault; - window->DC.TextWrapPos = -1.0f; // disabled - window->DC.ItemFlagsStack.resize(0); - window->DC.ItemWidthStack.resize(0); - window->DC.TextWrapPosStack.resize(0); - window->DC.ColumnsSet = NULL; - window->DC.TreeDepth = 0; - window->DC.StateStorage = &window->StateStorage; - window->DC.GroupStack.resize(0); - window->MenuColumns.Update(3, style.ItemSpacing.x, window_just_activated_by_user); - - if ((flags & ImGuiWindowFlags_ChildWindow) && (window->DC.ItemFlags != parent_window->DC.ItemFlags)) - { - window->DC.ItemFlags = parent_window->DC.ItemFlags; - window->DC.ItemFlagsStack.push_back(window->DC.ItemFlags); - } - - if (window->AutoFitFramesX > 0) - window->AutoFitFramesX--; - if (window->AutoFitFramesY > 0) - window->AutoFitFramesY--; - - // Apply focus (we need to call FocusWindow() AFTER setting DC.CursorStartPos so our initial navigation reference rectangle can start around there) - if (want_focus) - FocusWindow(window); - - // Title bar - if (!(flags & ImGuiWindowFlags_NoTitleBar)) - { - // Collapse button - if (!(flags & ImGuiWindowFlags_NoCollapse)) - { - RenderTriangle(window->Pos + style.FramePadding, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f); - } - - // Close button - if (p_open != NULL) - { - const float PAD = 2.0f; - const float rad = (window->TitleBarHeight() - PAD*2.0f) * 0.5f; - if (CloseButton(window->GetID("#CLOSE"), window->Rect().GetTR() + ImVec2(-PAD - rad, PAD + rad), rad)) - *p_open = false; - } - - // Title text (FIXME: refactor text alignment facilities along with RenderText helpers) - const ImVec2 text_size = CalcTextSize(name, NULL, true); - ImVec2 text_min = window->Pos; - ImVec2 text_max = window->Pos + ImVec2(window->Size.x, style.FramePadding.y*2 + text_size.y); - ImRect clip_rect; - clip_rect.Max = ImVec2(window->Pos.x + window->Size.x - (p_open ? title_bar_rect.GetHeight() - 3 : style.FramePadding.x), text_max.y); // Match the size of CloseWindowButton() - float pad_left = (flags & ImGuiWindowFlags_NoCollapse) == 0 ? (style.FramePadding.x + g.FontSize + style.ItemInnerSpacing.x) : style.FramePadding.x; - float pad_right = (p_open != NULL) ? (style.FramePadding.x + g.FontSize + style.ItemInnerSpacing.x) : style.FramePadding.x; - if (style.WindowTitleAlign.x > 0.0f) pad_right = ImLerp(pad_right, pad_left, style.WindowTitleAlign.x); - text_min.x += pad_left; - text_max.x -= pad_right; - clip_rect.Min = ImVec2(text_min.x, window->Pos.y); - RenderTextClipped(text_min, text_max, name, NULL, &text_size, style.WindowTitleAlign, &clip_rect); - } - - // Save clipped aabb so we can access it in constant-time in FindHoveredWindow() - window->WindowRectClipped = window->Rect(); - window->WindowRectClipped.ClipWith(window->ClipRect); - - // Pressing CTRL+C while holding on a window copy its content to the clipboard - // This works but 1. doesn't handle multiple Begin/End pairs, 2. recursing into another Begin/End pair - so we need to work that out and add better logging scope. - // Maybe we can support CTRL+C on every element? - /* - if (g.ActiveId == move_id) - if (g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_C)) - ImGui::LogToClipboard(); - */ - - // Inner rectangle - // We set this up after processing the resize grip so that our clip rectangle doesn't lag by a frame - // Note that if our window is collapsed we will end up with a null clipping rectangle which is the correct behavior. - window->InnerRect.Min.x = title_bar_rect.Min.x + window->WindowBorderSize; - window->InnerRect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight() + (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize); - window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x - window->WindowBorderSize; - window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y - window->WindowBorderSize; - //window->DrawList->AddRect(window->InnerRect.Min, window->InnerRect.Max, IM_COL32_WHITE); - - // After Begin() we fill the last item / hovered data using the title bar data. Make that a standard behavior (to allow usage of context menus on title bar only, etc.). - window->DC.LastItemId = window->MoveId; - window->DC.LastItemRect = title_bar_rect; - window->DC.LastItemRectHoveredRect = IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false); - } - - // Inner clipping rectangle - // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. - const float border_size = window->WindowBorderSize; - ImRect clip_rect; - clip_rect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + ImMax(0.0f, ImFloor(window->WindowPadding.x*0.5f - border_size))); - clip_rect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y); - clip_rect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - ImMax(0.0f, ImFloor(window->WindowPadding.x*0.5f - border_size))); - clip_rect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y); - PushClipRect(clip_rect.Min, clip_rect.Max, true); - - // Clear 'accessed' flag last thing (After PushClipRect which will set the flag. We want the flag to stay false when the default "Debug" window is unused) - if (first_begin_of_the_frame) - window->WriteAccessed = false; - - window->BeginCount++; - g.SetNextWindowSizeConstraint = false; - - // Child window can be out of sight and have "negative" clip windows. - // Mark them as collapsed so commands are skipped earlier (we can't manually collapse because they have no title bar). - if (flags & ImGuiWindowFlags_ChildWindow) - { - IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0); - window->Collapsed = parent_window && parent_window->Collapsed; - - if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) - window->Collapsed |= (window->WindowRectClipped.Min.x >= window->WindowRectClipped.Max.x || window->WindowRectClipped.Min.y >= window->WindowRectClipped.Max.y); - - // We also hide the window from rendering because we've already added its border to the command list. - // (we could perform the check earlier in the function but it is simpler at this point) - if (window->Collapsed) - window->Active = false; - } - if (style.Alpha <= 0.0f) - window->Active = false; - - // Return false if we don't intend to display anything to allow user to perform an early out optimization - window->SkipItems = (window->Collapsed || !window->Active) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0; - return !window->SkipItems; -} - -// Old Begin() API with 5 parameters, avoid calling this version directly! Use SetNextWindowSize()+Begin() instead. -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS -bool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_on_first_use, float bg_alpha_override, ImGuiWindowFlags flags) -{ - // Old API feature: we could pass the initial window size as a parameter, however this was very misleading because in most cases it would only affect the window when it didn't have storage in the .ini file. - if (size_on_first_use.x != 0.0f || size_on_first_use.y != 0.0f) - SetNextWindowSize(size_on_first_use, ImGuiCond_FirstUseEver); - - // Old API feature: we could override the window background alpha with a parameter. This is actually tricky to reproduce manually because: - // (1) there are multiple variants of WindowBg (popup, tooltip, etc.) and (2) you can't call PushStyleColor before Begin and PopStyleColor just after Begin() because of how CheckStackSizes() behave. - // The user-side solution is to do backup = GetStyleColorVec4(ImGuiCol_xxxBG), PushStyleColor(ImGuiCol_xxxBg), Begin, PushStyleColor(ImGuiCol_xxxBg, backup), [...], PopStyleColor(), End(); PopStyleColor() - which is super awkward. - // The alpha override was rarely used but for now we'll leave the Begin() variant around for a bit. We may either lift the constraint on CheckStackSizes() either add a SetNextWindowBgAlpha() helper that does it magically. - ImGuiContext& g = *GImGui; - const ImGuiCol bg_color_idx = GetWindowBgColorIdxFromFlags(flags); - const ImVec4 bg_color_backup = g.Style.Colors[bg_color_idx]; - if (bg_alpha_override >= 0.0f) - g.Style.Colors[bg_color_idx].w = bg_alpha_override; - - bool ret = Begin(name, p_open, flags); - - if (bg_alpha_override >= 0.0f) - g.Style.Colors[bg_color_idx] = bg_color_backup; - return ret; -} -#endif // IMGUI_DISABLE_OBSOLETE_FUNCTIONS - -void ImGui::End() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - if (window->DC.ColumnsSet != NULL) - EndColumns(); - PopClipRect(); // inner window clip rectangle - - // Stop logging - if (!(window->Flags & ImGuiWindowFlags_ChildWindow)) // FIXME: add more options for scope of logging - LogFinish(); - - // Pop - // NB: we don't clear 'window->RootWindow'. The pointer is allowed to live until the next call to Begin(). - g.CurrentWindowStack.pop_back(); - if (window->Flags & ImGuiWindowFlags_Popup) - g.CurrentPopupStack.pop_back(); - CheckStacksSize(window, false); - SetCurrentWindow(g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back()); -} - -// Vertical scrollbar -// The entire piece of code below is rather confusing because: -// - We handle absolute seeking (when first clicking outside the grab) and relative manipulation (afterward or when clicking inside the grab) -// - We store values as normalized ratio and in a form that allows the window content to change while we are holding on a scrollbar -// - We handle both horizontal and vertical scrollbars, which makes the terminology not ideal. -void ImGui::Scrollbar(ImGuiLayoutType direction) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - const bool horizontal = (direction == ImGuiLayoutType_Horizontal); - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(horizontal ? "#SCROLLX" : "#SCROLLY"); - - // Render background - bool other_scrollbar = (horizontal ? window->ScrollbarY : window->ScrollbarX); - float other_scrollbar_size_w = other_scrollbar ? style.ScrollbarSize : 0.0f; - const ImRect window_rect = window->Rect(); - const float border_size = window->WindowBorderSize; - ImRect bb = horizontal - ? ImRect(window->Pos.x + border_size, window_rect.Max.y - style.ScrollbarSize, window_rect.Max.x - other_scrollbar_size_w - border_size, window_rect.Max.y - border_size) - : ImRect(window_rect.Max.x - style.ScrollbarSize, window->Pos.y + border_size, window_rect.Max.x - border_size, window_rect.Max.y - other_scrollbar_size_w - border_size); - if (!horizontal) - bb.Min.y += window->TitleBarHeight() + ((window->Flags & ImGuiWindowFlags_MenuBar) ? window->MenuBarHeight() : 0.0f); - if (bb.GetWidth() <= 0.0f || bb.GetHeight() <= 0.0f) - return; - - int window_rounding_corners; - if (horizontal) - window_rounding_corners = ImDrawCornerFlags_BotLeft | (other_scrollbar ? 0 : ImDrawCornerFlags_BotRight); - else - window_rounding_corners = (((window->Flags & ImGuiWindowFlags_NoTitleBar) && !(window->Flags & ImGuiWindowFlags_MenuBar)) ? ImDrawCornerFlags_TopRight : 0) | (other_scrollbar ? 0 : ImDrawCornerFlags_BotRight); - window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_ScrollbarBg), window->WindowRounding, window_rounding_corners); - bb.Expand(ImVec2(-ImClamp((float)(int)((bb.Max.x - bb.Min.x - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp((float)(int)((bb.Max.y - bb.Min.y - 2.0f) * 0.5f), 0.0f, 3.0f))); - - // V denote the main, longer axis of the scrollbar (= height for a vertical scrollbar) - float scrollbar_size_v = horizontal ? bb.GetWidth() : bb.GetHeight(); - float scroll_v = horizontal ? window->Scroll.x : window->Scroll.y; - float win_size_avail_v = (horizontal ? window->SizeFull.x : window->SizeFull.y) - other_scrollbar_size_w; - float win_size_contents_v = horizontal ? window->SizeContents.x : window->SizeContents.y; - - // Calculate the height of our grabbable box. It generally represent the amount visible (vs the total scrollable amount) - // But we maintain a minimum size in pixel to allow for the user to still aim inside. - IM_ASSERT(ImMax(win_size_contents_v, win_size_avail_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers. - const float win_size_v = ImMax(ImMax(win_size_contents_v, win_size_avail_v), 1.0f); - const float grab_h_pixels = ImClamp(scrollbar_size_v * (win_size_avail_v / win_size_v), style.GrabMinSize, scrollbar_size_v); - const float grab_h_norm = grab_h_pixels / scrollbar_size_v; - - // Handle input right away. None of the code of Begin() is relying on scrolling position before calling Scrollbar(). - bool held = false; - bool hovered = false; - const bool previously_held = (g.ActiveId == id); - ButtonBehavior(bb, id, &hovered, &held); - - float scroll_max = ImMax(1.0f, win_size_contents_v - win_size_avail_v); - float scroll_ratio = ImSaturate(scroll_v / scroll_max); - float grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; - if (held && grab_h_norm < 1.0f) - { - float scrollbar_pos_v = horizontal ? bb.Min.x : bb.Min.y; - float mouse_pos_v = horizontal ? g.IO.MousePos.x : g.IO.MousePos.y; - float* click_delta_to_grab_center_v = horizontal ? &g.ScrollbarClickDeltaToGrabCenter.x : &g.ScrollbarClickDeltaToGrabCenter.y; - - // Click position in scrollbar normalized space (0.0f->1.0f) - const float clicked_v_norm = ImSaturate((mouse_pos_v - scrollbar_pos_v) / scrollbar_size_v); - SetHoveredID(id); - - bool seek_absolute = false; - if (!previously_held) - { - // On initial click calculate the distance between mouse and the center of the grab - if (clicked_v_norm >= grab_v_norm && clicked_v_norm <= grab_v_norm + grab_h_norm) - { - *click_delta_to_grab_center_v = clicked_v_norm - grab_v_norm - grab_h_norm*0.5f; - } - else - { - seek_absolute = true; - *click_delta_to_grab_center_v = 0.0f; - } - } - - // Apply scroll - // It is ok to modify Scroll here because we are being called in Begin() after the calculation of SizeContents and before setting up our starting position - const float scroll_v_norm = ImSaturate((clicked_v_norm - *click_delta_to_grab_center_v - grab_h_norm*0.5f) / (1.0f - grab_h_norm)); - scroll_v = (float)(int)(0.5f + scroll_v_norm * scroll_max);//(win_size_contents_v - win_size_v)); - if (horizontal) - window->Scroll.x = scroll_v; - else - window->Scroll.y = scroll_v; - - // Update values for rendering - scroll_ratio = ImSaturate(scroll_v / scroll_max); - grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; - - // Update distance to grab now that we have seeked and saturated - if (seek_absolute) - *click_delta_to_grab_center_v = clicked_v_norm - grab_v_norm - grab_h_norm*0.5f; - } - - // Render - const ImU32 grab_col = GetColorU32(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab); - ImRect grab_rect; - if (horizontal) - grab_rect = ImRect(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y, ImMin(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, window_rect.Max.x), bb.Max.y); - else - grab_rect = ImRect(bb.Min.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm), bb.Max.x, ImMin(ImLerp(bb.Min.y, bb.Max.y, grab_v_norm) + grab_h_pixels, window_rect.Max.y)); - window->DrawList->AddRectFilled(grab_rect.Min, grab_rect.Max, grab_col, style.ScrollbarRounding); -} - -void ImGui::BringWindowToFront(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - if (g.Windows.back() == window) - return; - for (int i = 0; i < g.Windows.Size; i++) - if (g.Windows[i] == window) - { - g.Windows.erase(g.Windows.begin() + i); - g.Windows.push_back(window); - break; - } -} - -void ImGui::BringWindowToBack(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - if (g.Windows[0] == window) - return; - for (int i = 0; i < g.Windows.Size; i++) - if (g.Windows[i] == window) - { - memmove(&g.Windows[1], &g.Windows[0], (size_t)i * sizeof(ImGuiWindow*)); - g.Windows[0] = window; - break; - } -} - -// Moving window to front of display and set focus (which happens to be back of our sorted list) -void ImGui::FocusWindow(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - - // Always mark the window we passed as focused. This is used for keyboard interactions such as tabbing. - g.NavWindow = window; - - // Passing NULL allow to disable keyboard focus - if (!window) - return; - - // Move the root window to the top of the pile - if (window->RootWindow) - window = window->RootWindow; - - // Steal focus on active widgets - if (window->Flags & ImGuiWindowFlags_Popup) // FIXME: This statement should be unnecessary. Need further testing before removing it.. - if (g.ActiveId != 0 && g.ActiveIdWindow && g.ActiveIdWindow->RootWindow != window) - ClearActiveID(); - - // Bring to front - if (!(window->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) - BringWindowToFront(window); -} - -void ImGui::FocusPreviousWindow() -{ - ImGuiContext& g = *GImGui; - for (int i = g.Windows.Size - 1; i >= 0; i--) - if (g.Windows[i]->WasActive && !(g.Windows[i]->Flags & ImGuiWindowFlags_ChildWindow)) - { - FocusWindow(g.Windows[i]); - return; - } -} - -void ImGui::PushItemWidth(float item_width) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.ItemWidth = (item_width == 0.0f ? window->ItemWidthDefault : item_width); - window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); -} - -void ImGui::PushMultiItemsWidths(int components, float w_full) -{ - ImGuiWindow* window = GetCurrentWindow(); - const ImGuiStyle& style = GImGui->Style; - if (w_full <= 0.0f) - w_full = CalcItemWidth(); - const float w_item_one = ImMax(1.0f, (float)(int)((w_full - (style.ItemInnerSpacing.x) * (components-1)) / (float)components)); - const float w_item_last = ImMax(1.0f, (float)(int)(w_full - (w_item_one + style.ItemInnerSpacing.x) * (components-1))); - window->DC.ItemWidthStack.push_back(w_item_last); - for (int i = 0; i < components-1; i++) - window->DC.ItemWidthStack.push_back(w_item_one); - window->DC.ItemWidth = window->DC.ItemWidthStack.back(); -} - -void ImGui::PopItemWidth() -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.ItemWidthStack.pop_back(); - window->DC.ItemWidth = window->DC.ItemWidthStack.empty() ? window->ItemWidthDefault : window->DC.ItemWidthStack.back(); -} - -float ImGui::CalcItemWidth() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - float w = window->DC.ItemWidth; - if (w < 0.0f) - { - // Align to a right-side limit. We include 1 frame padding in the calculation because this is how the width is always used (we add 2 frame padding to it), but we could move that responsibility to the widget as well. - float width_to_right_edge = GetContentRegionAvail().x; - w = ImMax(1.0f, width_to_right_edge + w); - } - w = (float)(int)w; - return w; -} - -static ImFont* GetDefaultFont() -{ - ImGuiContext& g = *GImGui; - return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; -} - -static void SetCurrentFont(ImFont* font) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(font && font->IsLoaded()); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ? - IM_ASSERT(font->Scale > 0.0f); - g.Font = font; - g.FontBaseSize = g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale; - g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f; - - ImFontAtlas* atlas = g.Font->ContainerAtlas; - g.DrawListSharedData.TexUvWhitePixel = atlas->TexUvWhitePixel; - g.DrawListSharedData.Font = g.Font; - g.DrawListSharedData.FontSize = g.FontSize; -} - -void ImGui::PushFont(ImFont* font) -{ - ImGuiContext& g = *GImGui; - if (!font) - font = GetDefaultFont(); - SetCurrentFont(font); - g.FontStack.push_back(font); - g.CurrentWindow->DrawList->PushTextureID(font->ContainerAtlas->TexID); -} - -void ImGui::PopFont() -{ - ImGuiContext& g = *GImGui; - g.CurrentWindow->DrawList->PopTextureID(); - g.FontStack.pop_back(); - SetCurrentFont(g.FontStack.empty() ? GetDefaultFont() : g.FontStack.back()); -} - -void ImGui::PushItemFlag(ImGuiItemFlags option, bool enabled) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (enabled) - window->DC.ItemFlags |= option; - else - window->DC.ItemFlags &= ~option; - window->DC.ItemFlagsStack.push_back(window->DC.ItemFlags); -} - -void ImGui::PopItemFlag() -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.ItemFlagsStack.pop_back(); - window->DC.ItemFlags = window->DC.ItemFlagsStack.empty() ? ImGuiItemFlags_Default_ : window->DC.ItemFlagsStack.back(); -} - -void ImGui::PushAllowKeyboardFocus(bool allow_keyboard_focus) -{ - PushItemFlag(ImGuiItemFlags_AllowKeyboardFocus, allow_keyboard_focus); -} - -void ImGui::PopAllowKeyboardFocus() -{ - PopItemFlag(); -} - -void ImGui::PushButtonRepeat(bool repeat) -{ - PushItemFlag(ImGuiItemFlags_ButtonRepeat, repeat); -} - -void ImGui::PopButtonRepeat() -{ - PopItemFlag(); -} - -void ImGui::PushTextWrapPos(float wrap_pos_x) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.TextWrapPos = wrap_pos_x; - window->DC.TextWrapPosStack.push_back(wrap_pos_x); -} - -void ImGui::PopTextWrapPos() -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.TextWrapPosStack.pop_back(); - window->DC.TextWrapPos = window->DC.TextWrapPosStack.empty() ? -1.0f : window->DC.TextWrapPosStack.back(); -} - -// FIXME: This may incur a round-trip (if the end user got their data from a float4) but eventually we aim to store the in-flight colors as ImU32 -void ImGui::PushStyleColor(ImGuiCol idx, ImU32 col) -{ - ImGuiContext& g = *GImGui; - ImGuiColMod backup; - backup.Col = idx; - backup.BackupValue = g.Style.Colors[idx]; - g.ColorModifiers.push_back(backup); - g.Style.Colors[idx] = ColorConvertU32ToFloat4(col); -} - -void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col) -{ - ImGuiContext& g = *GImGui; - ImGuiColMod backup; - backup.Col = idx; - backup.BackupValue = g.Style.Colors[idx]; - g.ColorModifiers.push_back(backup); - g.Style.Colors[idx] = col; -} - -void ImGui::PopStyleColor(int count) -{ - ImGuiContext& g = *GImGui; - while (count > 0) - { - ImGuiColMod& backup = g.ColorModifiers.back(); - g.Style.Colors[backup.Col] = backup.BackupValue; - g.ColorModifiers.pop_back(); - count--; - } -} - -struct ImGuiStyleVarInfo -{ - ImGuiDataType Type; - ImU32 Offset; - void* GetVarPtr(ImGuiStyle* style) const { return (void*)((unsigned char*)style + Offset); } -}; - -static const ImGuiStyleVarInfo GStyleVarInfo[ImGuiStyleVar_Count_] = -{ - { ImGuiDataType_Float, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha - { ImGuiDataType_Float2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding - { ImGuiDataType_Float, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding - { ImGuiDataType_Float, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize - { ImGuiDataType_Float2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize - { ImGuiDataType_Float, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding - { ImGuiDataType_Float, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize - { ImGuiDataType_Float, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding - { ImGuiDataType_Float, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize - { ImGuiDataType_Float2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding - { ImGuiDataType_Float, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding - { ImGuiDataType_Float, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize - { ImGuiDataType_Float2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing - { ImGuiDataType_Float2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing - { ImGuiDataType_Float, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing - { ImGuiDataType_Float, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize - { ImGuiDataType_Float2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign -}; - -static const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx) -{ - IM_ASSERT(idx >= 0 && idx < ImGuiStyleVar_Count_); - return &GStyleVarInfo[idx]; -} - -void ImGui::PushStyleVar(ImGuiStyleVar idx, float val) -{ - const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx); - if (var_info->Type == ImGuiDataType_Float) - { - ImGuiContext& g = *GImGui; - float* pvar = (float*)var_info->GetVarPtr(&g.Style); - g.StyleModifiers.push_back(ImGuiStyleMod(idx, *pvar)); - *pvar = val; - return; - } - IM_ASSERT(0); // Called function with wrong-type? Variable is not a float. -} - -void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val) -{ - const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx); - if (var_info->Type == ImGuiDataType_Float2) - { - ImGuiContext& g = *GImGui; - ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style); - g.StyleModifiers.push_back(ImGuiStyleMod(idx, *pvar)); - *pvar = val; - return; - } - IM_ASSERT(0); // Called function with wrong-type? Variable is not a ImVec2. -} - -void ImGui::PopStyleVar(int count) -{ - ImGuiContext& g = *GImGui; - while (count > 0) - { - ImGuiStyleMod& backup = g.StyleModifiers.back(); - const ImGuiStyleVarInfo* info = GetStyleVarInfo(backup.VarIdx); - if (info->Type == ImGuiDataType_Float) (*(float*)info->GetVarPtr(&g.Style)) = backup.BackupFloat[0]; - else if (info->Type == ImGuiDataType_Float2) (*(ImVec2*)info->GetVarPtr(&g.Style)) = ImVec2(backup.BackupFloat[0], backup.BackupFloat[1]); - else if (info->Type == ImGuiDataType_Int) (*(int*)info->GetVarPtr(&g.Style)) = backup.BackupInt[0]; - g.StyleModifiers.pop_back(); - count--; - } -} - -const char* ImGui::GetStyleColorName(ImGuiCol idx) -{ - // Create switch-case from enum with regexp: ImGuiCol_{.*}, --> case ImGuiCol_\1: return "\1"; - switch (idx) - { - case ImGuiCol_Text: return "Text"; - case ImGuiCol_TextDisabled: return "TextDisabled"; - case ImGuiCol_WindowBg: return "WindowBg"; - case ImGuiCol_ChildBg: return "ChildBg"; - case ImGuiCol_PopupBg: return "PopupBg"; - case ImGuiCol_Border: return "Border"; - case ImGuiCol_BorderShadow: return "BorderShadow"; - case ImGuiCol_FrameBg: return "FrameBg"; - case ImGuiCol_FrameBgHovered: return "FrameBgHovered"; - case ImGuiCol_FrameBgActive: return "FrameBgActive"; - case ImGuiCol_TitleBg: return "TitleBg"; - case ImGuiCol_TitleBgActive: return "TitleBgActive"; - case ImGuiCol_TitleBgCollapsed: return "TitleBgCollapsed"; - case ImGuiCol_MenuBarBg: return "MenuBarBg"; - case ImGuiCol_ScrollbarBg: return "ScrollbarBg"; - case ImGuiCol_ScrollbarGrab: return "ScrollbarGrab"; - case ImGuiCol_ScrollbarGrabHovered: return "ScrollbarGrabHovered"; - case ImGuiCol_ScrollbarGrabActive: return "ScrollbarGrabActive"; - case ImGuiCol_CheckMark: return "CheckMark"; - case ImGuiCol_SliderGrab: return "SliderGrab"; - case ImGuiCol_SliderGrabActive: return "SliderGrabActive"; - case ImGuiCol_Button: return "Button"; - case ImGuiCol_ButtonHovered: return "ButtonHovered"; - case ImGuiCol_ButtonActive: return "ButtonActive"; - case ImGuiCol_Header: return "Header"; - case ImGuiCol_HeaderHovered: return "HeaderHovered"; - case ImGuiCol_HeaderActive: return "HeaderActive"; - case ImGuiCol_Separator: return "Separator"; - case ImGuiCol_SeparatorHovered: return "SeparatorHovered"; - case ImGuiCol_SeparatorActive: return "SeparatorActive"; - case ImGuiCol_ResizeGrip: return "ResizeGrip"; - case ImGuiCol_ResizeGripHovered: return "ResizeGripHovered"; - case ImGuiCol_ResizeGripActive: return "ResizeGripActive"; - case ImGuiCol_CloseButton: return "CloseButton"; - case ImGuiCol_CloseButtonHovered: return "CloseButtonHovered"; - case ImGuiCol_CloseButtonActive: return "CloseButtonActive"; - case ImGuiCol_PlotLines: return "PlotLines"; - case ImGuiCol_PlotLinesHovered: return "PlotLinesHovered"; - case ImGuiCol_PlotHistogram: return "PlotHistogram"; - case ImGuiCol_PlotHistogramHovered: return "PlotHistogramHovered"; - case ImGuiCol_TextSelectedBg: return "TextSelectedBg"; - case ImGuiCol_ModalWindowDarkening: return "ModalWindowDarkening"; - case ImGuiCol_DragDropTarget: return "DragDropTarget"; - } - IM_ASSERT(0); - return "Unknown"; -} - -bool ImGui::IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent) -{ - if (window->RootWindow == potential_parent) - return true; - while (window != NULL) - { - if (window == potential_parent) - return true; - window = window->ParentWindow; - } - return false; -} - -bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags) -{ - IM_ASSERT((flags & ImGuiHoveredFlags_AllowWhenOverlapped) == 0); // Flags not supported by this function - ImGuiContext& g = *GImGui; - switch (flags & (ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows)) - { - case ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows: - if (g.HoveredRootWindow != g.CurrentWindow->RootWindow) - return false; - break; - case ImGuiHoveredFlags_RootWindow: - if (g.HoveredWindow != g.CurrentWindow->RootWindow) - return false; - break; - case ImGuiHoveredFlags_ChildWindows: - if (g.HoveredWindow == NULL || !IsWindowChildOf(g.HoveredWindow, g.CurrentWindow)) - return false; - break; - default: - if (g.HoveredWindow != g.CurrentWindow) - return false; - break; - } - - if (!IsWindowContentHoverable(g.HoveredRootWindow, flags)) - return false; - if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) - if (g.ActiveId != 0 && !g.ActiveIdAllowOverlap && g.ActiveId != g.HoveredWindow->MoveId) - return false; - return true; -} - -bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.CurrentWindow); // Not inside a Begin()/End() - - switch (flags & (ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows)) - { - case ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows: - return g.NavWindow && g.CurrentWindow->RootWindow == g.NavWindow->RootWindow; - case ImGuiFocusedFlags_RootWindow: - return g.CurrentWindow->RootWindow == g.NavWindow; - case ImGuiFocusedFlags_ChildWindows: - return g.NavWindow && IsWindowChildOf(g.NavWindow, g.CurrentWindow); - default: - return g.CurrentWindow == g.NavWindow; - } -} - -float ImGui::GetWindowWidth() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->Size.x; -} - -float ImGui::GetWindowHeight() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->Size.y; -} - -ImVec2 ImGui::GetWindowPos() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - return window->Pos; -} - -static void SetWindowScrollY(ImGuiWindow* window, float new_scroll_y) -{ - window->DC.CursorMaxPos.y += window->Scroll.y; // SizeContents is generally computed based on CursorMaxPos which is affected by scroll position, so we need to apply our change to it. - window->Scroll.y = new_scroll_y; - window->DC.CursorMaxPos.y -= window->Scroll.y; -} - -static void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond) -{ - // Test condition (NB: bit 0 is always true) and clear flags for next time - if (cond && (window->SetWindowPosAllowFlags & cond) == 0) - return; - window->SetWindowPosAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); - window->SetWindowPosVal = ImVec2(FLT_MAX, FLT_MAX); - - // Set - const ImVec2 old_pos = window->Pos; - window->PosFloat = pos; - window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y); - window->DC.CursorPos += (window->Pos - old_pos); // As we happen to move the window while it is being appended to (which is a bad idea - will smear) let's at least offset the cursor - window->DC.CursorMaxPos += (window->Pos - old_pos); // And more importantly we need to adjust this so size calculation doesn't get affected. -} - -void ImGui::SetWindowPos(const ImVec2& pos, ImGuiCond cond) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - SetWindowPos(window, pos, cond); -} - -void ImGui::SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond) -{ - if (ImGuiWindow* window = FindWindowByName(name)) - SetWindowPos(window, pos, cond); -} - -ImVec2 ImGui::GetWindowSize() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->Size; -} - -static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond) -{ - // Test condition (NB: bit 0 is always true) and clear flags for next time - if (cond && (window->SetWindowSizeAllowFlags & cond) == 0) - return; - window->SetWindowSizeAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); - - // Set - if (size.x > 0.0f) - { - window->AutoFitFramesX = 0; - window->SizeFull.x = size.x; - } - else - { - window->AutoFitFramesX = 2; - window->AutoFitOnlyGrows = false; - } - if (size.y > 0.0f) - { - window->AutoFitFramesY = 0; - window->SizeFull.y = size.y; - } - else - { - window->AutoFitFramesY = 2; - window->AutoFitOnlyGrows = false; - } -} - -void ImGui::SetWindowSize(const ImVec2& size, ImGuiCond cond) -{ - SetWindowSize(GImGui->CurrentWindow, size, cond); -} - -void ImGui::SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond) -{ - if (ImGuiWindow* window = FindWindowByName(name)) - SetWindowSize(window, size, cond); -} - -static void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond) -{ - // Test condition (NB: bit 0 is always true) and clear flags for next time - if (cond && (window->SetWindowCollapsedAllowFlags & cond) == 0) - return; - window->SetWindowCollapsedAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); - - // Set - window->Collapsed = collapsed; -} - -void ImGui::SetWindowCollapsed(bool collapsed, ImGuiCond cond) -{ - SetWindowCollapsed(GImGui->CurrentWindow, collapsed, cond); -} - -bool ImGui::IsWindowCollapsed() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->Collapsed; -} - -bool ImGui::IsWindowAppearing() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->Appearing; -} - -void ImGui::SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond) -{ - if (ImGuiWindow* window = FindWindowByName(name)) - SetWindowCollapsed(window, collapsed, cond); -} - -void ImGui::SetWindowFocus() -{ - FocusWindow(GImGui->CurrentWindow); -} - -void ImGui::SetWindowFocus(const char* name) -{ - if (name) - { - if (ImGuiWindow* window = FindWindowByName(name)) - FocusWindow(window); - } - else - { - FocusWindow(NULL); - } -} - -void ImGui::SetNextWindowPos(const ImVec2& pos, ImGuiCond cond, const ImVec2& pivot) -{ - ImGuiContext& g = *GImGui; - g.SetNextWindowPosVal = pos; - g.SetNextWindowPosPivot = pivot; - g.SetNextWindowPosCond = cond ? cond : ImGuiCond_Always; -} - -void ImGui::SetNextWindowSize(const ImVec2& size, ImGuiCond cond) -{ - ImGuiContext& g = *GImGui; - g.SetNextWindowSizeVal = size; - g.SetNextWindowSizeCond = cond ? cond : ImGuiCond_Always; -} - -void ImGui::SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeConstraintCallback custom_callback, void* custom_callback_user_data) -{ - ImGuiContext& g = *GImGui; - g.SetNextWindowSizeConstraint = true; - g.SetNextWindowSizeConstraintRect = ImRect(size_min, size_max); - g.SetNextWindowSizeConstraintCallback = custom_callback; - g.SetNextWindowSizeConstraintCallbackUserData = custom_callback_user_data; -} - -void ImGui::SetNextWindowContentSize(const ImVec2& size) -{ - ImGuiContext& g = *GImGui; - g.SetNextWindowContentSizeVal = size; // In Begin() we will add the size of window decorations (title bar, menu etc.) to that to form a SizeContents value. - g.SetNextWindowContentSizeCond = ImGuiCond_Always; -} - -void ImGui::SetNextWindowCollapsed(bool collapsed, ImGuiCond cond) -{ - ImGuiContext& g = *GImGui; - g.SetNextWindowCollapsedVal = collapsed; - g.SetNextWindowCollapsedCond = cond ? cond : ImGuiCond_Always; -} - -void ImGui::SetNextWindowFocus() -{ - ImGuiContext& g = *GImGui; - g.SetNextWindowFocus = true; -} - -// In window space (not screen space!) -ImVec2 ImGui::GetContentRegionMax() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImVec2 mx = window->ContentsRegionRect.Max; - if (window->DC.ColumnsSet) - mx.x = GetColumnOffset(window->DC.ColumnsSet->Current + 1) - window->WindowPadding.x; - return mx; -} - -ImVec2 ImGui::GetContentRegionAvail() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return GetContentRegionMax() - (window->DC.CursorPos - window->Pos); -} - -float ImGui::GetContentRegionAvailWidth() -{ - return GetContentRegionAvail().x; -} - -// In window space (not screen space!) -ImVec2 ImGui::GetWindowContentRegionMin() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->ContentsRegionRect.Min; -} - -ImVec2 ImGui::GetWindowContentRegionMax() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->ContentsRegionRect.Max; -} - -float ImGui::GetWindowContentRegionWidth() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->ContentsRegionRect.Max.x - window->ContentsRegionRect.Min.x; -} - -float ImGui::GetTextLineHeight() -{ - ImGuiContext& g = *GImGui; - return g.FontSize; -} - -float ImGui::GetTextLineHeightWithSpacing() -{ - ImGuiContext& g = *GImGui; - return g.FontSize + g.Style.ItemSpacing.y; -} - -float ImGui::GetFrameHeight() -{ - ImGuiContext& g = *GImGui; - return g.FontSize + g.Style.FramePadding.y * 2.0f; -} - -float ImGui::GetFrameHeightWithSpacing() -{ - ImGuiContext& g = *GImGui; - return g.FontSize + g.Style.FramePadding.y * 2.0f + g.Style.ItemSpacing.y; -} - -ImDrawList* ImGui::GetWindowDrawList() -{ - ImGuiWindow* window = GetCurrentWindow(); - return window->DrawList; -} - -ImFont* ImGui::GetFont() -{ - return GImGui->Font; -} - -float ImGui::GetFontSize() -{ - return GImGui->FontSize; -} - -ImVec2 ImGui::GetFontTexUvWhitePixel() -{ - return GImGui->DrawListSharedData.TexUvWhitePixel; -} - -void ImGui::SetWindowFontScale(float scale) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - window->FontWindowScale = scale; - g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); -} - -// User generally sees positions in window coordinates. Internally we store CursorPos in absolute screen coordinates because it is more convenient. -// Conversion happens as we pass the value to user, but it makes our naming convention confusing because GetCursorPos() == (DC.CursorPos - window.Pos). May want to rename 'DC.CursorPos'. -ImVec2 ImGui::GetCursorPos() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CursorPos - window->Pos + window->Scroll; -} - -float ImGui::GetCursorPosX() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CursorPos.x - window->Pos.x + window->Scroll.x; -} - -float ImGui::GetCursorPosY() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CursorPos.y - window->Pos.y + window->Scroll.y; -} - -void ImGui::SetCursorPos(const ImVec2& local_pos) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.CursorPos = window->Pos - window->Scroll + local_pos; - window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos); -} - -void ImGui::SetCursorPosX(float x) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + x; - window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPos.x); -} - -void ImGui::SetCursorPosY(float y) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.CursorPos.y = window->Pos.y - window->Scroll.y + y; - window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y); -} - -ImVec2 ImGui::GetCursorStartPos() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CursorStartPos - window->Pos; -} - -ImVec2 ImGui::GetCursorScreenPos() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CursorPos; -} - -void ImGui::SetCursorScreenPos(const ImVec2& screen_pos) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.CursorPos = screen_pos; - window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos); -} - -float ImGui::GetScrollX() -{ - return GImGui->CurrentWindow->Scroll.x; -} - -float ImGui::GetScrollY() -{ - return GImGui->CurrentWindow->Scroll.y; -} - -float ImGui::GetScrollMaxX() -{ - return GetScrollMaxX(GImGui->CurrentWindow); -} - -float ImGui::GetScrollMaxY() -{ - return GetScrollMaxY(GImGui->CurrentWindow); -} - -void ImGui::SetScrollX(float scroll_x) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->ScrollTarget.x = scroll_x; - window->ScrollTargetCenterRatio.x = 0.0f; -} - -void ImGui::SetScrollY(float scroll_y) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->ScrollTarget.y = scroll_y + window->TitleBarHeight() + window->MenuBarHeight(); // title bar height canceled out when using ScrollTargetRelY - window->ScrollTargetCenterRatio.y = 0.0f; -} - -void ImGui::SetScrollFromPosY(float pos_y, float center_y_ratio) -{ - // We store a target position so centering can occur on the next frame when we are guaranteed to have a known window size - ImGuiWindow* window = GetCurrentWindow(); - IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f); - window->ScrollTarget.y = (float)(int)(pos_y + window->Scroll.y); - window->ScrollTargetCenterRatio.y = center_y_ratio; - - // Minor hack to to make scrolling to top/bottom of window take account of WindowPadding, it looks more right to the user this way - if (center_y_ratio <= 0.0f && window->ScrollTarget.y <= window->WindowPadding.y) - window->ScrollTarget.y = 0.0f; - else if (center_y_ratio >= 1.0f && window->ScrollTarget.y >= window->SizeContents.y - window->WindowPadding.y + GImGui->Style.ItemSpacing.y) - window->ScrollTarget.y = window->SizeContents.y; -} - -// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item. -void ImGui::SetScrollHere(float center_y_ratio) -{ - ImGuiWindow* window = GetCurrentWindow(); - float target_y = window->DC.CursorPosPrevLine.y - window->Pos.y; // Top of last item, in window space - target_y += (window->DC.PrevLineHeight * center_y_ratio) + (GImGui->Style.ItemSpacing.y * (center_y_ratio - 0.5f) * 2.0f); // Precisely aim above, in the middle or below the last line. - SetScrollFromPosY(target_y, center_y_ratio); -} - -// FIXME-NAV: This function is a placeholder for the upcoming Navigation branch + Focusing features. -// In the current branch this function will only set the scrolling, in the navigation branch it will also set your navigation cursor. -// Prefer using "SetItemDefaultFocus()" over "if (IsWindowAppearing()) SetScrollHere()" when applicable. -void ImGui::SetItemDefaultFocus() -{ - if (IsWindowAppearing()) - SetScrollHere(); -} - -void ImGui::SetKeyboardFocusHere(int offset) -{ - IM_ASSERT(offset >= -1); // -1 is allowed but not below - ImGuiWindow* window = GetCurrentWindow(); - window->FocusIdxAllRequestNext = window->FocusIdxAllCounter + 1 + offset; - window->FocusIdxTabRequestNext = INT_MAX; -} - -void ImGui::SetStateStorage(ImGuiStorage* tree) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.StateStorage = tree ? tree : &window->StateStorage; -} - -ImGuiStorage* ImGui::GetStateStorage() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.StateStorage; -} - -void ImGui::TextV(const char* fmt, va_list args) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - const char* text_end = g.TempBuffer + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); - TextUnformatted(g.TempBuffer, text_end); -} - -void ImGui::Text(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - TextV(fmt, args); - va_end(args); -} - -void ImGui::TextColoredV(const ImVec4& col, const char* fmt, va_list args) -{ - PushStyleColor(ImGuiCol_Text, col); - TextV(fmt, args); - PopStyleColor(); -} - -void ImGui::TextColored(const ImVec4& col, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - TextColoredV(col, fmt, args); - va_end(args); -} - -void ImGui::TextDisabledV(const char* fmt, va_list args) -{ - PushStyleColor(ImGuiCol_Text, GImGui->Style.Colors[ImGuiCol_TextDisabled]); - TextV(fmt, args); - PopStyleColor(); -} - -void ImGui::TextDisabled(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - TextDisabledV(fmt, args); - va_end(args); -} - -void ImGui::TextWrappedV(const char* fmt, va_list args) -{ - bool need_wrap = (GImGui->CurrentWindow->DC.TextWrapPos < 0.0f); // Keep existing wrap position is one ia already set - if (need_wrap) PushTextWrapPos(0.0f); - TextV(fmt, args); - if (need_wrap) PopTextWrapPos(); -} - -void ImGui::TextWrapped(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - TextWrappedV(fmt, args); - va_end(args); -} - -void ImGui::TextUnformatted(const char* text, const char* text_end) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - IM_ASSERT(text != NULL); - const char* text_begin = text; - if (text_end == NULL) - text_end = text + strlen(text); // FIXME-OPT - - const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrentLineTextBaseOffset); - const float wrap_pos_x = window->DC.TextWrapPos; - const bool wrap_enabled = wrap_pos_x >= 0.0f; - if (text_end - text > 2000 && !wrap_enabled) - { - // Long text! - // Perform manual coarse clipping to optimize for long multi-line text - // From this point we will only compute the width of lines that are visible. Optimization only available when word-wrapping is disabled. - // We also don't vertically center the text within the line full height, which is unlikely to matter because we are likely the biggest and only item on the line. - const char* line = text; - const float line_height = GetTextLineHeight(); - const ImRect clip_rect = window->ClipRect; - ImVec2 text_size(0,0); - - if (text_pos.y <= clip_rect.Max.y) - { - ImVec2 pos = text_pos; - - // Lines to skip (can't skip when logging text) - if (!g.LogEnabled) - { - int lines_skippable = (int)((clip_rect.Min.y - text_pos.y) / line_height); - if (lines_skippable > 0) - { - int lines_skipped = 0; - while (line < text_end && lines_skipped < lines_skippable) - { - const char* line_end = strchr(line, '\n'); - if (!line_end) - line_end = text_end; - line = line_end + 1; - lines_skipped++; - } - pos.y += lines_skipped * line_height; - } - } - - // Lines to render - if (line < text_end) - { - ImRect line_rect(pos, pos + ImVec2(FLT_MAX, line_height)); - while (line < text_end) - { - const char* line_end = strchr(line, '\n'); - if (IsClippedEx(line_rect, 0, false)) - break; - - const ImVec2 line_size = CalcTextSize(line, line_end, false); - text_size.x = ImMax(text_size.x, line_size.x); - RenderText(pos, line, line_end, false); - if (!line_end) - line_end = text_end; - line = line_end + 1; - line_rect.Min.y += line_height; - line_rect.Max.y += line_height; - pos.y += line_height; - } - - // Count remaining lines - int lines_skipped = 0; - while (line < text_end) - { - const char* line_end = strchr(line, '\n'); - if (!line_end) - line_end = text_end; - line = line_end + 1; - lines_skipped++; - } - pos.y += lines_skipped * line_height; - } - - text_size.y += (pos - text_pos).y; - } - - ImRect bb(text_pos, text_pos + text_size); - ItemSize(bb); - ItemAdd(bb, 0); - } - else - { - const float wrap_width = wrap_enabled ? CalcWrapWidthForPos(window->DC.CursorPos, wrap_pos_x) : 0.0f; - const ImVec2 text_size = CalcTextSize(text_begin, text_end, false, wrap_width); - - // Account of baseline offset - ImRect bb(text_pos, text_pos + text_size); - ItemSize(text_size); - if (!ItemAdd(bb, 0)) - return; - - // Render (we don't hide text after ## in this end-user function) - RenderTextWrapped(bb.Min, text_begin, text_end, wrap_width); - } -} - -void ImGui::AlignTextToFramePadding() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - window->DC.CurrentLineHeight = ImMax(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y * 2); - window->DC.CurrentLineTextBaseOffset = ImMax(window->DC.CurrentLineTextBaseOffset, g.Style.FramePadding.y); -} - -// Add a label+text combo aligned to other label+value widgets -void ImGui::LabelTextV(const char* label, const char* fmt, va_list args) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const float w = CalcItemWidth(); - - const ImVec2 label_size = CalcTextSize(label, NULL, true); - const ImRect value_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2)); - const ImRect total_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w + (label_size.x > 0.0f ? style.ItemInnerSpacing.x : 0.0f), style.FramePadding.y*2) + label_size); - ItemSize(total_bb, style.FramePadding.y); - if (!ItemAdd(total_bb, 0)) - return; - - // Render - const char* value_text_begin = &g.TempBuffer[0]; - const char* value_text_end = value_text_begin + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); - RenderTextClipped(value_bb.Min, value_bb.Max, value_text_begin, value_text_end, NULL, ImVec2(0.0f,0.5f)); - if (label_size.x > 0.0f) - RenderText(ImVec2(value_bb.Max.x + style.ItemInnerSpacing.x, value_bb.Min.y + style.FramePadding.y), label); -} - -void ImGui::LabelText(const char* label, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - LabelTextV(label, fmt, args); - va_end(args); -} - -bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - - if (flags & ImGuiButtonFlags_Disabled) - { - if (out_hovered) *out_hovered = false; - if (out_held) *out_held = false; - if (g.ActiveId == id) ClearActiveID(); - return false; - } - - // Default behavior requires click+release on same spot - if ((flags & (ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick)) == 0) - flags |= ImGuiButtonFlags_PressedOnClickRelease; - - ImGuiWindow* backup_hovered_window = g.HoveredWindow; - if ((flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredRootWindow == window) - g.HoveredWindow = window; - - bool pressed = false; - bool hovered = ItemHoverable(bb, id); - - // Special mode for Drag and Drop where holding button pressed for a long time while dragging another item triggers the button - if ((flags & ImGuiButtonFlags_PressedOnDragDropHold) && g.DragDropActive && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoHoldToOpenOthers)) - if (IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) - { - hovered = true; - SetHoveredID(id); - if (CalcTypematicPressedRepeatAmount(g.HoveredIdTimer + 0.0001f, g.HoveredIdTimer + 0.0001f - g.IO.DeltaTime, 0.01f, 0.70f)) // FIXME: Our formula for CalcTypematicPressedRepeatAmount() is fishy - { - pressed = true; - FocusWindow(window); - } - } - - if ((flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredRootWindow == window) - g.HoveredWindow = backup_hovered_window; - - // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one. - if (hovered && (flags & ImGuiButtonFlags_AllowItemOverlap) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0)) - hovered = false; - - if (hovered) - { - if (!(flags & ImGuiButtonFlags_NoKeyModifiers) || (!g.IO.KeyCtrl && !g.IO.KeyShift && !g.IO.KeyAlt)) - { - // | CLICKING | HOLDING with ImGuiButtonFlags_Repeat - // PressedOnClickRelease | * | .. (NOT on release) <-- MOST COMMON! (*) only if both click/release were over bounds - // PressedOnClick | | .. - // PressedOnRelease | | .. (NOT on release) - // PressedOnDoubleClick | | .. - if ((flags & ImGuiButtonFlags_PressedOnClickRelease) && g.IO.MouseClicked[0]) - { - SetActiveID(id, window); // Hold on ID - FocusWindow(window); - g.ActiveIdClickOffset = g.IO.MousePos - bb.Min; - } - if (((flags & ImGuiButtonFlags_PressedOnClick) && g.IO.MouseClicked[0]) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseDoubleClicked[0])) - { - pressed = true; - if (flags & ImGuiButtonFlags_NoHoldingActiveID) - { - ClearActiveID(); - } - else - { - SetActiveID(id, window); // Hold on ID - g.ActiveIdClickOffset = g.IO.MousePos - bb.Min; - } - FocusWindow(window); - } - if ((flags & ImGuiButtonFlags_PressedOnRelease) && g.IO.MouseReleased[0]) - { - if (!((flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[0] >= g.IO.KeyRepeatDelay)) // Repeat mode trumps - pressed = true; - ClearActiveID(); - } - - // 'Repeat' mode acts when held regardless of _PressedOn flags (see table above). - // Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings. - if ((flags & ImGuiButtonFlags_Repeat) && g.ActiveId == id && g.IO.MouseDownDuration[0] > 0.0f && IsMouseClicked(0, true)) - pressed = true; - } - } - - bool held = false; - if (g.ActiveId == id) - { - if (g.IO.MouseDown[0]) - { - held = true; - } - else - { - if (hovered && (flags & ImGuiButtonFlags_PressedOnClickRelease)) - if (!((flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[0] >= g.IO.KeyRepeatDelay)) // Repeat mode trumps - if (!g.DragDropActive) - pressed = true; - ClearActiveID(); - } - } - - if (out_hovered) *out_hovered = hovered; - if (out_held) *out_held = held; - - return pressed; -} - -bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const ImVec2 label_size = CalcTextSize(label, NULL, true); - - ImVec2 pos = window->DC.CursorPos; - if ((flags & ImGuiButtonFlags_AlignTextBaseLine) && style.FramePadding.y < window->DC.CurrentLineTextBaseOffset) // Try to vertically align buttons that are smaller/have no padding so that text baseline matches (bit hacky, since it shouldn't be a flag) - pos.y += window->DC.CurrentLineTextBaseOffset - style.FramePadding.y; - ImVec2 size = CalcItemSize(size_arg, label_size.x + style.FramePadding.x * 2.0f, label_size.y + style.FramePadding.y * 2.0f); - - const ImRect bb(pos, pos + size); - ItemSize(bb, style.FramePadding.y); - if (!ItemAdd(bb, id)) - return false; - - if (window->DC.ItemFlags & ImGuiItemFlags_ButtonRepeat) flags |= ImGuiButtonFlags_Repeat; - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); - - // Render - const ImU32 col = GetColorU32((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); - RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding); - RenderTextClipped(bb.Min + style.FramePadding, bb.Max - style.FramePadding, label, NULL, &label_size, style.ButtonTextAlign, &bb); - - // Automatically close popups - //if (pressed && !(flags & ImGuiButtonFlags_DontClosePopups) && (window->Flags & ImGuiWindowFlags_Popup)) - // CloseCurrentPopup(); - - return pressed; -} - -bool ImGui::Button(const char* label, const ImVec2& size_arg) -{ - return ButtonEx(label, size_arg, 0); -} - -// Small buttons fits within text without additional vertical spacing. -bool ImGui::SmallButton(const char* label) -{ - ImGuiContext& g = *GImGui; - float backup_padding_y = g.Style.FramePadding.y; - g.Style.FramePadding.y = 0.0f; - bool pressed = ButtonEx(label, ImVec2(0,0), ImGuiButtonFlags_AlignTextBaseLine); - g.Style.FramePadding.y = backup_padding_y; - return pressed; -} - -// Tip: use ImGui::PushID()/PopID() to push indices or pointers in the ID stack. -// Then you can keep 'str_id' empty or the same for all your buttons (instead of creating a string based on a non-string id) -bool ImGui::InvisibleButton(const char* str_id, const ImVec2& size_arg) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - const ImGuiID id = window->GetID(str_id); - ImVec2 size = CalcItemSize(size_arg, 0.0f, 0.0f); - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); - ItemSize(bb); - if (!ItemAdd(bb, id)) - return false; - - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held); - - return pressed; -} - -// Upper-right button to close a window. -bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos, float radius) -{ - ImGuiWindow* window = GetCurrentWindow(); - - const ImRect bb(pos - ImVec2(radius,radius), pos + ImVec2(radius,radius)); - - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held); - - // Render - const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_CloseButtonActive : hovered ? ImGuiCol_CloseButtonHovered : ImGuiCol_CloseButton); - const ImVec2 center = bb.GetCenter(); - window->DrawList->AddCircleFilled(center, ImMax(2.0f, radius), col, 12); - - const float cross_extent = (radius * 0.7071f) - 1.0f; - if (hovered) - { - window->DrawList->AddLine(center + ImVec2(+cross_extent,+cross_extent), center + ImVec2(-cross_extent,-cross_extent), GetColorU32(ImGuiCol_Text)); - window->DrawList->AddLine(center + ImVec2(+cross_extent,-cross_extent), center + ImVec2(-cross_extent,+cross_extent), GetColorU32(ImGuiCol_Text)); - } - - return pressed; -} - -// [Internal] -bool ImGui::ArrowButton(ImGuiID id, ImGuiDir dir, ImVec2 padding, ImGuiButtonFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return false; - - const ImGuiStyle& style = g.Style; - - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize + padding.x * 2.0f, g.FontSize + padding.y * 2.0f)); - ItemSize(bb, style.FramePadding.y); - if (!ItemAdd(bb, id)) - return false; - - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); - - const ImU32 col = GetColorU32((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); -#ifdef IMGUI_HAS_NAV - RenderNavHighlight(bb, id); -#endif - RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding); - RenderTriangle(bb.Min + padding, dir, 1.0f); - - return pressed; -} - -void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); - if (border_col.w > 0.0f) - bb.Max += ImVec2(2,2); - ItemSize(bb); - if (!ItemAdd(bb, 0)) - return; - - if (border_col.w > 0.0f) - { - window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(border_col), 0.0f); - window->DrawList->AddImage(user_texture_id, bb.Min+ImVec2(1,1), bb.Max-ImVec2(1,1), uv0, uv1, GetColorU32(tint_col)); - } - else - { - window->DrawList->AddImage(user_texture_id, bb.Min, bb.Max, uv0, uv1, GetColorU32(tint_col)); - } -} - -// frame_padding < 0: uses FramePadding from style (default) -// frame_padding = 0: no framing -// frame_padding > 0: set framing size -// The color used are the button colors. -bool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, int frame_padding, const ImVec4& bg_col, const ImVec4& tint_col) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - - // Default to using texture ID as ID. User can still push string/integer prefixes. - // We could hash the size/uv to create a unique ID but that would prevent the user from animating UV. - PushID((void *)user_texture_id); - const ImGuiID id = window->GetID("#image"); - PopID(); - - const ImVec2 padding = (frame_padding >= 0) ? ImVec2((float)frame_padding, (float)frame_padding) : style.FramePadding; - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size + padding*2); - const ImRect image_bb(window->DC.CursorPos + padding, window->DC.CursorPos + padding + size); - ItemSize(bb); - if (!ItemAdd(bb, id)) - return false; - - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held); - - // Render - const ImU32 col = GetColorU32((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); - RenderFrame(bb.Min, bb.Max, col, true, ImClamp((float)ImMin(padding.x, padding.y), 0.0f, style.FrameRounding)); - if (bg_col.w > 0.0f) - window->DrawList->AddRectFilled(image_bb.Min, image_bb.Max, GetColorU32(bg_col)); - window->DrawList->AddImage(user_texture_id, image_bb.Min, image_bb.Max, uv0, uv1, GetColorU32(tint_col)); - - return pressed; -} - -// Start logging ImGui output to TTY -void ImGui::LogToTTY(int max_depth) -{ - ImGuiContext& g = *GImGui; - if (g.LogEnabled) - return; - ImGuiWindow* window = g.CurrentWindow; - - g.LogEnabled = true; - g.LogFile = stdout; - g.LogStartDepth = window->DC.TreeDepth; - if (max_depth >= 0) - g.LogAutoExpandMaxDepth = max_depth; -} - -// Start logging ImGui output to given file -void ImGui::LogToFile(int max_depth, const char* filename) -{ - ImGuiContext& g = *GImGui; - if (g.LogEnabled) - return; - ImGuiWindow* window = g.CurrentWindow; - - if (!filename) - { - filename = g.IO.LogFilename; - if (!filename) - return; - } - - g.LogFile = ImFileOpen(filename, "ab"); - if (!g.LogFile) - { - IM_ASSERT(g.LogFile != NULL); // Consider this an error - return; - } - g.LogEnabled = true; - g.LogStartDepth = window->DC.TreeDepth; - if (max_depth >= 0) - g.LogAutoExpandMaxDepth = max_depth; -} - -// Start logging ImGui output to clipboard -void ImGui::LogToClipboard(int max_depth) -{ - ImGuiContext& g = *GImGui; - if (g.LogEnabled) - return; - ImGuiWindow* window = g.CurrentWindow; - - g.LogEnabled = true; - g.LogFile = NULL; - g.LogStartDepth = window->DC.TreeDepth; - if (max_depth >= 0) - g.LogAutoExpandMaxDepth = max_depth; -} - -void ImGui::LogFinish() -{ - ImGuiContext& g = *GImGui; - if (!g.LogEnabled) - return; - - LogText(IM_NEWLINE); - g.LogEnabled = false; - if (g.LogFile != NULL) - { - if (g.LogFile == stdout) - fflush(g.LogFile); - else - fclose(g.LogFile); - g.LogFile = NULL; - } - if (g.LogClipboard->size() > 1) - { - SetClipboardText(g.LogClipboard->begin()); - g.LogClipboard->clear(); - } -} - -// Helper to display logging buttons -void ImGui::LogButtons() -{ - ImGuiContext& g = *GImGui; - - PushID("LogButtons"); - const bool log_to_tty = Button("Log To TTY"); SameLine(); - const bool log_to_file = Button("Log To File"); SameLine(); - const bool log_to_clipboard = Button("Log To Clipboard"); SameLine(); - PushItemWidth(80.0f); - PushAllowKeyboardFocus(false); - SliderInt("Depth", &g.LogAutoExpandMaxDepth, 0, 9, NULL); - PopAllowKeyboardFocus(); - PopItemWidth(); - PopID(); - - // Start logging at the end of the function so that the buttons don't appear in the log - if (log_to_tty) - LogToTTY(g.LogAutoExpandMaxDepth); - if (log_to_file) - LogToFile(g.LogAutoExpandMaxDepth, g.IO.LogFilename); - if (log_to_clipboard) - LogToClipboard(g.LogAutoExpandMaxDepth); -} - -bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags) -{ - if (flags & ImGuiTreeNodeFlags_Leaf) - return true; - - // We only write to the tree storage if the user clicks (or explicitely use SetNextTreeNode*** functions) - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiStorage* storage = window->DC.StateStorage; - - bool is_open; - if (g.SetNextTreeNodeOpenCond != 0) - { - if (g.SetNextTreeNodeOpenCond & ImGuiCond_Always) - { - is_open = g.SetNextTreeNodeOpenVal; - storage->SetInt(id, is_open); - } - else - { - // We treat ImGuiCond_Once and ImGuiCond_FirstUseEver the same because tree node state are not saved persistently. - const int stored_value = storage->GetInt(id, -1); - if (stored_value == -1) - { - is_open = g.SetNextTreeNodeOpenVal; - storage->SetInt(id, is_open); - } - else - { - is_open = stored_value != 0; - } - } - g.SetNextTreeNodeOpenCond = 0; - } - else - { - is_open = storage->GetInt(id, (flags & ImGuiTreeNodeFlags_DefaultOpen) ? 1 : 0) != 0; - } - - // When logging is enabled, we automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior). - // NB- If we are above max depth we still allow manually opened nodes to be logged. - if (g.LogEnabled && !(flags & ImGuiTreeNodeFlags_NoAutoOpenOnLog) && window->DC.TreeDepth < g.LogAutoExpandMaxDepth) - is_open = true; - - return is_open; -} - -bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const bool display_frame = (flags & ImGuiTreeNodeFlags_Framed) != 0; - const ImVec2 padding = (display_frame || (flags & ImGuiTreeNodeFlags_FramePadding)) ? style.FramePadding : ImVec2(style.FramePadding.x, 0.0f); - - if (!label_end) - label_end = FindRenderedTextEnd(label); - const ImVec2 label_size = CalcTextSize(label, label_end, false); - - // We vertically grow up to current line height up the typical widget height. - const float text_base_offset_y = ImMax(padding.y, window->DC.CurrentLineTextBaseOffset); // Latch before ItemSize changes it - const float frame_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + style.FramePadding.y*2), label_size.y + padding.y*2); - ImRect bb = ImRect(window->DC.CursorPos, ImVec2(window->Pos.x + GetContentRegionMax().x, window->DC.CursorPos.y + frame_height)); - if (display_frame) - { - // Framed header expand a little outside the default padding - bb.Min.x -= (float)(int)(window->WindowPadding.x*0.5f) - 1; - bb.Max.x += (float)(int)(window->WindowPadding.x*0.5f) - 1; - } - - const float text_offset_x = (g.FontSize + (display_frame ? padding.x*3 : padding.x*2)); // Collapser arrow width + Spacing - const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x*2 : 0.0f); // Include collapser - ItemSize(ImVec2(text_width, frame_height), text_base_offset_y); - - // For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing - // (Ideally we'd want to add a flag for the user to specify if we want the hit test to be done up to the right side of the content or not) - const ImRect interact_bb = display_frame ? bb : ImRect(bb.Min.x, bb.Min.y, bb.Min.x + text_width + style.ItemSpacing.x*2, bb.Max.y); - bool is_open = TreeNodeBehaviorIsOpen(id, flags); - if (!ItemAdd(interact_bb, id)) - { - if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) - TreePushRawID(id); - return is_open; - } - - // Flags that affects opening behavior: - // - 0(default) ..................... single-click anywhere to open - // - OpenOnDoubleClick .............. double-click anywhere to open - // - OpenOnArrow .................... single-click on arrow to open - // - OpenOnDoubleClick|OpenOnArrow .. single-click on arrow or double-click anywhere to open - ImGuiButtonFlags button_flags = ImGuiButtonFlags_NoKeyModifiers | ((flags & ImGuiTreeNodeFlags_AllowItemOverlap) ? ImGuiButtonFlags_AllowItemOverlap : 0); - button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; - if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) - button_flags |= ImGuiButtonFlags_PressedOnDoubleClick | ((flags & ImGuiTreeNodeFlags_OpenOnArrow) ? ImGuiButtonFlags_PressedOnClickRelease : 0); - - bool hovered, held, pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags); - if (pressed && !(flags & ImGuiTreeNodeFlags_Leaf)) - { - bool toggled = !(flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick)); - if (flags & ImGuiTreeNodeFlags_OpenOnArrow) - toggled |= IsMouseHoveringRect(interact_bb.Min, ImVec2(interact_bb.Min.x + text_offset_x, interact_bb.Max.y)); - if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) - toggled |= g.IO.MouseDoubleClicked[0]; - if (g.DragDropActive && is_open) // When using Drag and Drop "hold to open" we keep the node highlighted after opening, but never close it again. - toggled = false; - if (toggled) - { - is_open = !is_open; - window->DC.StateStorage->SetInt(id, is_open); - } - } - if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) - SetItemAllowOverlap(); - - // Render - const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); - const ImVec2 text_pos = bb.Min + ImVec2(text_offset_x, text_base_offset_y); - if (display_frame) - { - // Framed type - RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding); - RenderTriangle(bb.Min + ImVec2(padding.x, text_base_offset_y), is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f); - if (g.LogEnabled) - { - // NB: '##' is normally used to hide text (as a library-wide feature), so we need to specify the text range to make sure the ## aren't stripped out here. - const char log_prefix[] = "\n##"; - const char log_suffix[] = "##"; - LogRenderedText(&text_pos, log_prefix, log_prefix+3); - RenderTextClipped(text_pos, bb.Max, label, label_end, &label_size); - LogRenderedText(&text_pos, log_suffix+1, log_suffix+3); - } - else - { - RenderTextClipped(text_pos, bb.Max, label, label_end, &label_size); - } - } - else - { - // Unframed typed for tree nodes - if (hovered || (flags & ImGuiTreeNodeFlags_Selected)) - RenderFrame(bb.Min, bb.Max, col, false); - - if (flags & ImGuiTreeNodeFlags_Bullet) - RenderBullet(bb.Min + ImVec2(text_offset_x * 0.5f, g.FontSize*0.50f + text_base_offset_y)); - else if (!(flags & ImGuiTreeNodeFlags_Leaf)) - RenderTriangle(bb.Min + ImVec2(padding.x, g.FontSize*0.15f + text_base_offset_y), is_open ? ImGuiDir_Down : ImGuiDir_Right, 0.70f); - if (g.LogEnabled) - LogRenderedText(&text_pos, ">"); - RenderText(text_pos, label, label_end, false); - } - - if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) - TreePushRawID(id); - return is_open; -} - -// CollapsingHeader returns true when opened but do not indent nor push into the ID stack (because of the ImGuiTreeNodeFlags_NoTreePushOnOpen flag). -// This is basically the same as calling TreeNodeEx(label, ImGuiTreeNodeFlags_CollapsingHeader | ImGuiTreeNodeFlags_NoTreePushOnOpen). You can remove the _NoTreePushOnOpen flag if you want behavior closer to normal TreeNode(). -bool ImGui::CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - return TreeNodeBehavior(window->GetID(label), flags | ImGuiTreeNodeFlags_CollapsingHeader | ImGuiTreeNodeFlags_NoTreePushOnOpen, label); -} - -bool ImGui::CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - if (p_open && !*p_open) - return false; - - ImGuiID id = window->GetID(label); - bool is_open = TreeNodeBehavior(id, flags | ImGuiTreeNodeFlags_CollapsingHeader | ImGuiTreeNodeFlags_NoTreePushOnOpen | (p_open ? ImGuiTreeNodeFlags_AllowItemOverlap : 0), label); - if (p_open) - { - // Create a small overlapping close button // FIXME: We can evolve this into user accessible helpers to add extra buttons on title bars, headers, etc. - ImGuiContext& g = *GImGui; - float button_sz = g.FontSize * 0.5f; - ImGuiItemHoveredDataBackup last_item_backup; - if (CloseButton(window->GetID((void*)(intptr_t)(id+1)), ImVec2(ImMin(window->DC.LastItemRect.Max.x, window->ClipRect.Max.x) - g.Style.FramePadding.x - button_sz, window->DC.LastItemRect.Min.y + g.Style.FramePadding.y + button_sz), button_sz)) - *p_open = false; - last_item_backup.Restore(); - } - - return is_open; -} - -bool ImGui::TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - return TreeNodeBehavior(window->GetID(label), flags, label, NULL); -} - -bool ImGui::TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const char* label_end = g.TempBuffer + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); - return TreeNodeBehavior(window->GetID(str_id), flags, g.TempBuffer, label_end); -} - -bool ImGui::TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const char* label_end = g.TempBuffer + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); - return TreeNodeBehavior(window->GetID(ptr_id), flags, g.TempBuffer, label_end); -} - -bool ImGui::TreeNodeV(const char* str_id, const char* fmt, va_list args) -{ - return TreeNodeExV(str_id, 0, fmt, args); -} - -bool ImGui::TreeNodeV(const void* ptr_id, const char* fmt, va_list args) -{ - return TreeNodeExV(ptr_id, 0, fmt, args); -} - -bool ImGui::TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - bool is_open = TreeNodeExV(str_id, flags, fmt, args); - va_end(args); - return is_open; -} - -bool ImGui::TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - bool is_open = TreeNodeExV(ptr_id, flags, fmt, args); - va_end(args); - return is_open; -} - -bool ImGui::TreeNode(const char* str_id, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - bool is_open = TreeNodeExV(str_id, 0, fmt, args); - va_end(args); - return is_open; -} - -bool ImGui::TreeNode(const void* ptr_id, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - bool is_open = TreeNodeExV(ptr_id, 0, fmt, args); - va_end(args); - return is_open; -} - -bool ImGui::TreeNode(const char* label) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - return TreeNodeBehavior(window->GetID(label), 0, label, NULL); -} - -void ImGui::TreeAdvanceToLabelPos() -{ - ImGuiContext& g = *GImGui; - g.CurrentWindow->DC.CursorPos.x += GetTreeNodeToLabelSpacing(); -} - -// Horizontal distance preceding label when using TreeNode() or Bullet() -float ImGui::GetTreeNodeToLabelSpacing() -{ - ImGuiContext& g = *GImGui; - return g.FontSize + (g.Style.FramePadding.x * 2.0f); -} - -void ImGui::SetNextTreeNodeOpen(bool is_open, ImGuiCond cond) -{ - ImGuiContext& g = *GImGui; - if (g.CurrentWindow->SkipItems) - return; - g.SetNextTreeNodeOpenVal = is_open; - g.SetNextTreeNodeOpenCond = cond ? cond : ImGuiCond_Always; -} - -void ImGui::PushID(const char* str_id) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - window->IDStack.push_back(window->GetID(str_id)); -} - -void ImGui::PushID(const char* str_id_begin, const char* str_id_end) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - window->IDStack.push_back(window->GetID(str_id_begin, str_id_end)); -} - -void ImGui::PushID(const void* ptr_id) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - window->IDStack.push_back(window->GetID(ptr_id)); -} - -void ImGui::PushID(int int_id) -{ - const void* ptr_id = (void*)(intptr_t)int_id; - ImGuiWindow* window = GetCurrentWindowRead(); - window->IDStack.push_back(window->GetID(ptr_id)); -} - -void ImGui::PopID() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - window->IDStack.pop_back(); -} - -ImGuiID ImGui::GetID(const char* str_id) -{ - return GImGui->CurrentWindow->GetID(str_id); -} - -ImGuiID ImGui::GetID(const char* str_id_begin, const char* str_id_end) -{ - return GImGui->CurrentWindow->GetID(str_id_begin, str_id_end); -} - -ImGuiID ImGui::GetID(const void* ptr_id) -{ - return GImGui->CurrentWindow->GetID(ptr_id); -} - -void ImGui::Bullet() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const float line_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y*2), g.FontSize); - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize, line_height)); - ItemSize(bb); - if (!ItemAdd(bb, 0)) - { - SameLine(0, style.FramePadding.x*2); - return; - } - - // Render and stay on same line - RenderBullet(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f)); - SameLine(0, style.FramePadding.x*2); -} - -// Text with a little bullet aligned to the typical tree node. -void ImGui::BulletTextV(const char* fmt, va_list args) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - - const char* text_begin = g.TempBuffer; - const char* text_end = text_begin + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); - const ImVec2 label_size = CalcTextSize(text_begin, text_end, false); - const float text_base_offset_y = ImMax(0.0f, window->DC.CurrentLineTextBaseOffset); // Latch before ItemSize changes it - const float line_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y*2), g.FontSize); - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize + (label_size.x > 0.0f ? (label_size.x + style.FramePadding.x*2) : 0.0f), ImMax(line_height, label_size.y))); // Empty text doesn't add padding - ItemSize(bb); - if (!ItemAdd(bb, 0)) - return; - - // Render - RenderBullet(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f)); - RenderText(bb.Min+ImVec2(g.FontSize + style.FramePadding.x*2, text_base_offset_y), text_begin, text_end, false); -} - -void ImGui::BulletText(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - BulletTextV(fmt, args); - va_end(args); -} - -static inline void DataTypeFormatString(ImGuiDataType data_type, void* data_ptr, const char* display_format, char* buf, int buf_size) -{ - if (data_type == ImGuiDataType_Int) - ImFormatString(buf, buf_size, display_format, *(int*)data_ptr); - else if (data_type == ImGuiDataType_Float) - ImFormatString(buf, buf_size, display_format, *(float*)data_ptr); -} - -static inline void DataTypeFormatString(ImGuiDataType data_type, void* data_ptr, int decimal_precision, char* buf, int buf_size) -{ - if (data_type == ImGuiDataType_Int) - { - if (decimal_precision < 0) - ImFormatString(buf, buf_size, "%d", *(int*)data_ptr); - else - ImFormatString(buf, buf_size, "%.*d", decimal_precision, *(int*)data_ptr); - } - else if (data_type == ImGuiDataType_Float) - { - if (decimal_precision < 0) - ImFormatString(buf, buf_size, "%f", *(float*)data_ptr); // Ideally we'd have a minimum decimal precision of 1 to visually denote that it is a float, while hiding non-significant digits? - else - ImFormatString(buf, buf_size, "%.*f", decimal_precision, *(float*)data_ptr); - } -} - -static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* value1, const void* value2)// Store into value1 -{ - if (data_type == ImGuiDataType_Int) - { - if (op == '+') - *(int*)value1 = *(int*)value1 + *(const int*)value2; - else if (op == '-') - *(int*)value1 = *(int*)value1 - *(const int*)value2; - } - else if (data_type == ImGuiDataType_Float) - { - if (op == '+') - *(float*)value1 = *(float*)value1 + *(const float*)value2; - else if (op == '-') - *(float*)value1 = *(float*)value1 - *(const float*)value2; - } -} - -// User can input math operators (e.g. +100) to edit a numerical values. -static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* scalar_format) -{ - while (ImCharIsSpace(*buf)) - buf++; - - // We don't support '-' op because it would conflict with inputing negative value. - // Instead you can use +-100 to subtract from an existing value - char op = buf[0]; - if (op == '+' || op == '*' || op == '/') - { - buf++; - while (ImCharIsSpace(*buf)) - buf++; - } - else - { - op = 0; - } - if (!buf[0]) - return false; - - if (data_type == ImGuiDataType_Int) - { - if (!scalar_format) - scalar_format = "%d"; - int* v = (int*)data_ptr; - const int old_v = *v; - int arg0i = *v; - if (op && sscanf(initial_value_buf, scalar_format, &arg0i) < 1) - return false; - - // Store operand in a float so we can use fractional value for multipliers (*1.1), but constant always parsed as integer so we can fit big integers (e.g. 2000000003) past float precision - float arg1f = 0.0f; - if (op == '+') { if (sscanf(buf, "%f", &arg1f) == 1) *v = (int)(arg0i + arg1f); } // Add (use "+-" to subtract) - else if (op == '*') { if (sscanf(buf, "%f", &arg1f) == 1) *v = (int)(arg0i * arg1f); } // Multiply - else if (op == '/') { if (sscanf(buf, "%f", &arg1f) == 1 && arg1f != 0.0f) *v = (int)(arg0i / arg1f); }// Divide - else { if (sscanf(buf, scalar_format, &arg0i) == 1) *v = arg0i; } // Assign constant (read as integer so big values are not lossy) - return (old_v != *v); - } - else if (data_type == ImGuiDataType_Float) - { - // For floats we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in - scalar_format = "%f"; - float* v = (float*)data_ptr; - const float old_v = *v; - float arg0f = *v; - if (op && sscanf(initial_value_buf, scalar_format, &arg0f) < 1) - return false; - - float arg1f = 0.0f; - if (sscanf(buf, scalar_format, &arg1f) < 1) - return false; - if (op == '+') { *v = arg0f + arg1f; } // Add (use "+-" to subtract) - else if (op == '*') { *v = arg0f * arg1f; } // Multiply - else if (op == '/') { if (arg1f != 0.0f) *v = arg0f / arg1f; } // Divide - else { *v = arg1f; } // Assign constant - return (old_v != *v); - } - - return false; -} - -// Create text input in place of a slider (when CTRL+Clicking on slider) -// FIXME: Logic is messy and confusing. -bool ImGui::InputScalarAsWidgetReplacement(const ImRect& aabb, const char* label, ImGuiDataType data_type, void* data_ptr, ImGuiID id, int decimal_precision) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - - // Our replacement widget will override the focus ID (registered previously to allow for a TAB focus to happen) - // On the first frame, g.ScalarAsInputTextId == 0, then on subsequent frames it becomes == id - SetActiveID(g.ScalarAsInputTextId, window); - SetHoveredID(0); - FocusableItemUnregister(window); - - char buf[32]; - DataTypeFormatString(data_type, data_ptr, decimal_precision, buf, IM_ARRAYSIZE(buf)); - bool text_value_changed = InputTextEx(label, buf, IM_ARRAYSIZE(buf), aabb.GetSize(), ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_AutoSelectAll); - if (g.ScalarAsInputTextId == 0) // First frame we started displaying the InputText widget - { - IM_ASSERT(g.ActiveId == id); // InputText ID expected to match the Slider ID (else we'd need to store them both, which is also possible) - g.ScalarAsInputTextId = g.ActiveId; - SetHoveredID(id); - } - if (text_value_changed) - return DataTypeApplyOpFromText(buf, GImGui->InputTextState.InitialText.begin(), data_type, data_ptr, NULL); - return false; -} - -// Parse display precision back from the display format string -int ImGui::ParseFormatPrecision(const char* fmt, int default_precision) -{ - int precision = default_precision; - while ((fmt = strchr(fmt, '%')) != NULL) - { - fmt++; - if (fmt[0] == '%') { fmt++; continue; } // Ignore "%%" - while (*fmt >= '0' && *fmt <= '9') - fmt++; - if (*fmt == '.') - { - fmt = ImAtoi(fmt + 1, &precision); - if (precision < 0 || precision > 10) - precision = default_precision; - } - if (*fmt == 'e' || *fmt == 'E') // Maximum precision with scientific notation - precision = -1; - break; - } - return precision; -} - -static float GetMinimumStepAtDecimalPrecision(int decimal_precision) -{ - static const float min_steps[10] = { 1.0f, 0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, 0.000000001f }; - return (decimal_precision >= 0 && decimal_precision < 10) ? min_steps[decimal_precision] : powf(10.0f, (float)-decimal_precision); -} - -float ImGui::RoundScalar(float value, int decimal_precision) -{ - // Round past decimal precision - // So when our value is 1.99999 with a precision of 0.001 we'll end up rounding to 2.0 - // FIXME: Investigate better rounding methods - if (decimal_precision < 0) - return value; - const float min_step = GetMinimumStepAtDecimalPrecision(decimal_precision); - bool negative = value < 0.0f; - value = fabsf(value); - float remainder = fmodf(value, min_step); - if (remainder <= min_step*0.5f) - value -= remainder; - else - value += (min_step - remainder); - return negative ? -value : value; -} - -static inline float SliderBehaviorCalcRatioFromValue(float v, float v_min, float v_max, float power, float linear_zero_pos) -{ - if (v_min == v_max) - return 0.0f; - - const bool is_non_linear = (power < 1.0f-0.00001f) || (power > 1.0f+0.00001f); - const float v_clamped = (v_min < v_max) ? ImClamp(v, v_min, v_max) : ImClamp(v, v_max, v_min); - if (is_non_linear) - { - if (v_clamped < 0.0f) - { - const float f = 1.0f - (v_clamped - v_min) / (ImMin(0.0f,v_max) - v_min); - return (1.0f - powf(f, 1.0f/power)) * linear_zero_pos; - } - else - { - const float f = (v_clamped - ImMax(0.0f,v_min)) / (v_max - ImMax(0.0f,v_min)); - return linear_zero_pos + powf(f, 1.0f/power) * (1.0f - linear_zero_pos); - } - } - - // Linear slider - return (v_clamped - v_min) / (v_max - v_min); -} - -bool ImGui::SliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_min, float v_max, float power, int decimal_precision, ImGuiSliderFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - const ImGuiStyle& style = g.Style; - - // Draw frame - RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); - - const bool is_non_linear = (power < 1.0f-0.00001f) || (power > 1.0f+0.00001f); - const bool is_horizontal = (flags & ImGuiSliderFlags_Vertical) == 0; - - const float grab_padding = 2.0f; - const float slider_sz = is_horizontal ? (frame_bb.GetWidth() - grab_padding * 2.0f) : (frame_bb.GetHeight() - grab_padding * 2.0f); - float grab_sz; - if (decimal_precision != 0) - grab_sz = ImMin(style.GrabMinSize, slider_sz); - else - grab_sz = ImMin(ImMax(1.0f * (slider_sz / ((v_min < v_max ? v_max - v_min : v_min - v_max) + 1.0f)), style.GrabMinSize), slider_sz); // Integer sliders, if possible have the grab size represent 1 unit - const float slider_usable_sz = slider_sz - grab_sz; - const float slider_usable_pos_min = (is_horizontal ? frame_bb.Min.x : frame_bb.Min.y) + grab_padding + grab_sz*0.5f; - const float slider_usable_pos_max = (is_horizontal ? frame_bb.Max.x : frame_bb.Max.y) - grab_padding - grab_sz*0.5f; - - // For logarithmic sliders that cross over sign boundary we want the exponential increase to be symmetric around 0.0f - float linear_zero_pos = 0.0f; // 0.0->1.0f - if (v_min * v_max < 0.0f) - { - // Different sign - const float linear_dist_min_to_0 = powf(fabsf(0.0f - v_min), 1.0f/power); - const float linear_dist_max_to_0 = powf(fabsf(v_max - 0.0f), 1.0f/power); - linear_zero_pos = linear_dist_min_to_0 / (linear_dist_min_to_0+linear_dist_max_to_0); - } - else - { - // Same sign - linear_zero_pos = v_min < 0.0f ? 1.0f : 0.0f; - } - - // Process clicking on the slider - bool value_changed = false; - if (g.ActiveId == id) - { - bool set_new_value = false; - float clicked_t = 0.0f; - if (g.IO.MouseDown[0]) - { - const float mouse_abs_pos = is_horizontal ? g.IO.MousePos.x : g.IO.MousePos.y; - clicked_t = (slider_usable_sz > 0.0f) ? ImClamp((mouse_abs_pos - slider_usable_pos_min) / slider_usable_sz, 0.0f, 1.0f) : 0.0f; - if (!is_horizontal) - clicked_t = 1.0f - clicked_t; - set_new_value = true; - } - else - { - ClearActiveID(); - } - - if (set_new_value) - { - float new_value; - if (is_non_linear) - { - // Account for logarithmic scale on both sides of the zero - if (clicked_t < linear_zero_pos) - { - // Negative: rescale to the negative range before powering - float a = 1.0f - (clicked_t / linear_zero_pos); - a = powf(a, power); - new_value = ImLerp(ImMin(v_max,0.0f), v_min, a); - } - else - { - // Positive: rescale to the positive range before powering - float a; - if (fabsf(linear_zero_pos - 1.0f) > 1.e-6f) - a = (clicked_t - linear_zero_pos) / (1.0f - linear_zero_pos); - else - a = clicked_t; - a = powf(a, power); - new_value = ImLerp(ImMax(v_min,0.0f), v_max, a); - } - } - else - { - // Linear slider - new_value = ImLerp(v_min, v_max, clicked_t); - } - - // Round past decimal precision - new_value = RoundScalar(new_value, decimal_precision); - if (*v != new_value) - { - *v = new_value; - value_changed = true; - } - } - } - - // Draw - float grab_t = SliderBehaviorCalcRatioFromValue(*v, v_min, v_max, power, linear_zero_pos); - if (!is_horizontal) - grab_t = 1.0f - grab_t; - const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t); - ImRect grab_bb; - if (is_horizontal) - grab_bb = ImRect(ImVec2(grab_pos - grab_sz*0.5f, frame_bb.Min.y + grab_padding), ImVec2(grab_pos + grab_sz*0.5f, frame_bb.Max.y - grab_padding)); - else - grab_bb = ImRect(ImVec2(frame_bb.Min.x + grab_padding, grab_pos - grab_sz*0.5f), ImVec2(frame_bb.Max.x - grab_padding, grab_pos + grab_sz*0.5f)); - window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding); - - return value_changed; -} - -// Use power!=1.0 for logarithmic sliders. -// Adjust display_format to decorate the value with a prefix or a suffix. -// "%.3f" 1.234 -// "%5.2f secs" 01.23 secs -// "Gold: %.0f" Gold: 1 -bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, const char* display_format, float power) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const float w = CalcItemWidth(); - - const ImVec2 label_size = CalcTextSize(label, NULL, true); - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f)); - const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); - - // NB- we don't call ItemSize() yet because we may turn into a text edit box below - if (!ItemAdd(total_bb, id)) - { - ItemSize(total_bb, style.FramePadding.y); - return false; - } - const bool hovered = ItemHoverable(frame_bb, id); - - if (!display_format) - display_format = "%.3f"; - int decimal_precision = ParseFormatPrecision(display_format, 3); - - // Tabbing or CTRL-clicking on Slider turns it into an input box - bool start_text_input = false; - const bool tab_focus_requested = FocusableItemRegister(window, id); - if (tab_focus_requested || (hovered && g.IO.MouseClicked[0])) - { - SetActiveID(id, window); - FocusWindow(window); - if (tab_focus_requested || g.IO.KeyCtrl) - { - start_text_input = true; - g.ScalarAsInputTextId = 0; - } - } - if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id)) - return InputScalarAsWidgetReplacement(frame_bb, label, ImGuiDataType_Float, v, id, decimal_precision); - - // Actual slider behavior + render grab - ItemSize(total_bb, style.FramePadding.y); - const bool value_changed = SliderBehavior(frame_bb, id, v, v_min, v_max, power, decimal_precision); - - // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. - char value_buf[64]; - const char* value_buf_end = value_buf + ImFormatString(value_buf, IM_ARRAYSIZE(value_buf), display_format, *v); - RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.5f)); - - if (label_size.x > 0.0f) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); - - return value_changed; -} - -bool ImGui::VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* display_format, float power) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - - const ImVec2 label_size = CalcTextSize(label, NULL, true); - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size); - const ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); - - ItemSize(bb, style.FramePadding.y); - if (!ItemAdd(frame_bb, id)) - return false; - const bool hovered = ItemHoverable(frame_bb, id); - - if (!display_format) - display_format = "%.3f"; - int decimal_precision = ParseFormatPrecision(display_format, 3); - - if (hovered && g.IO.MouseClicked[0]) - { - SetActiveID(id, window); - FocusWindow(window); - } - - // Actual slider behavior + render grab - bool value_changed = SliderBehavior(frame_bb, id, v, v_min, v_max, power, decimal_precision, ImGuiSliderFlags_Vertical); - - // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. - // For the vertical slider we allow centered text to overlap the frame padding - char value_buf[64]; - char* value_buf_end = value_buf + ImFormatString(value_buf, IM_ARRAYSIZE(value_buf), display_format, *v); - RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.0f)); - if (label_size.x > 0.0f) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); - - return value_changed; -} - -bool ImGui::SliderAngle(const char* label, float* v_rad, float v_degrees_min, float v_degrees_max) -{ - float v_deg = (*v_rad) * 360.0f / (2*IM_PI); - bool value_changed = SliderFloat(label, &v_deg, v_degrees_min, v_degrees_max, "%.0f deg", 1.0f); - *v_rad = v_deg * (2*IM_PI) / 360.0f; - return value_changed; -} - -bool ImGui::SliderInt(const char* label, int* v, int v_min, int v_max, const char* display_format) -{ - if (!display_format) - display_format = "%.0f"; - float v_f = (float)*v; - bool value_changed = SliderFloat(label, &v_f, (float)v_min, (float)v_max, display_format, 1.0f); - *v = (int)v_f; - return value_changed; -} - -bool ImGui::VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* display_format) -{ - if (!display_format) - display_format = "%.0f"; - float v_f = (float)*v; - bool value_changed = VSliderFloat(label, size, &v_f, (float)v_min, (float)v_max, display_format, 1.0f); - *v = (int)v_f; - return value_changed; -} - -// Add multiple sliders on 1 line for compact edition of multiple components -bool ImGui::SliderFloatN(const char* label, float* v, int components, float v_min, float v_max, const char* display_format, float power) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - bool value_changed = false; - BeginGroup(); - PushID(label); - PushMultiItemsWidths(components); - for (int i = 0; i < components; i++) - { - PushID(i); - value_changed |= SliderFloat("##v", &v[i], v_min, v_max, display_format, power); - SameLine(0, g.Style.ItemInnerSpacing.x); - PopID(); - PopItemWidth(); - } - PopID(); - - TextUnformatted(label, FindRenderedTextEnd(label)); - EndGroup(); - - return value_changed; -} - -bool ImGui::SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* display_format, float power) -{ - return SliderFloatN(label, v, 2, v_min, v_max, display_format, power); -} - -bool ImGui::SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* display_format, float power) -{ - return SliderFloatN(label, v, 3, v_min, v_max, display_format, power); -} - -bool ImGui::SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* display_format, float power) -{ - return SliderFloatN(label, v, 4, v_min, v_max, display_format, power); -} - -bool ImGui::SliderIntN(const char* label, int* v, int components, int v_min, int v_max, const char* display_format) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - bool value_changed = false; - BeginGroup(); - PushID(label); - PushMultiItemsWidths(components); - for (int i = 0; i < components; i++) - { - PushID(i); - value_changed |= SliderInt("##v", &v[i], v_min, v_max, display_format); - SameLine(0, g.Style.ItemInnerSpacing.x); - PopID(); - PopItemWidth(); - } - PopID(); - - TextUnformatted(label, FindRenderedTextEnd(label)); - EndGroup(); - - return value_changed; -} - -bool ImGui::SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* display_format) -{ - return SliderIntN(label, v, 2, v_min, v_max, display_format); -} - -bool ImGui::SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* display_format) -{ - return SliderIntN(label, v, 3, v_min, v_max, display_format); -} - -bool ImGui::SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* display_format) -{ - return SliderIntN(label, v, 4, v_min, v_max, display_format); -} - -bool ImGui::DragBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_speed, float v_min, float v_max, int decimal_precision, float power) -{ - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - - // Draw frame - const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); - RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding); - - bool value_changed = false; - - // Process clicking on the drag - if (g.ActiveId == id) - { - if (g.IO.MouseDown[0]) - { - if (g.ActiveIdIsJustActivated) - { - // Lock current value on click - g.DragCurrentValue = *v; - g.DragLastMouseDelta = ImVec2(0.f, 0.f); - } - - if (v_speed == 0.0f && (v_max - v_min) != 0.0f && (v_max - v_min) < FLT_MAX) - v_speed = (v_max - v_min) * g.DragSpeedDefaultRatio; - - float v_cur = g.DragCurrentValue; - const ImVec2 mouse_drag_delta = GetMouseDragDelta(0, 1.0f); - float adjust_delta = 0.0f; - //if (g.ActiveIdSource == ImGuiInputSource_Mouse) - { - adjust_delta = mouse_drag_delta.x - g.DragLastMouseDelta.x; - if (g.IO.KeyShift && g.DragSpeedScaleFast >= 0.0f) - adjust_delta *= g.DragSpeedScaleFast; - if (g.IO.KeyAlt && g.DragSpeedScaleSlow >= 0.0f) - adjust_delta *= g.DragSpeedScaleSlow; - } - adjust_delta *= v_speed; - g.DragLastMouseDelta.x = mouse_drag_delta.x; - - if (fabsf(adjust_delta) > 0.0f) - { - if (fabsf(power - 1.0f) > 0.001f) - { - // Logarithmic curve on both side of 0.0 - float v0_abs = v_cur >= 0.0f ? v_cur : -v_cur; - float v0_sign = v_cur >= 0.0f ? 1.0f : -1.0f; - float v1 = powf(v0_abs, 1.0f / power) + (adjust_delta * v0_sign); - float v1_abs = v1 >= 0.0f ? v1 : -v1; - float v1_sign = v1 >= 0.0f ? 1.0f : -1.0f; // Crossed sign line - v_cur = powf(v1_abs, power) * v0_sign * v1_sign; // Reapply sign - } - else - { - v_cur += adjust_delta; - } - - // Clamp - if (v_min < v_max) - v_cur = ImClamp(v_cur, v_min, v_max); - g.DragCurrentValue = v_cur; - } - - // Round to user desired precision, then apply - v_cur = RoundScalar(v_cur, decimal_precision); - if (*v != v_cur) - { - *v = v_cur; - value_changed = true; - } - } - else - { - ClearActiveID(); - } - } - - return value_changed; -} - -bool ImGui::DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max, const char* display_format, float power) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const float w = CalcItemWidth(); - - const ImVec2 label_size = CalcTextSize(label, NULL, true); - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f)); - const ImRect inner_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding); - const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); - - // NB- we don't call ItemSize() yet because we may turn into a text edit box below - if (!ItemAdd(total_bb, id)) - { - ItemSize(total_bb, style.FramePadding.y); - return false; - } - const bool hovered = ItemHoverable(frame_bb, id); - - if (!display_format) - display_format = "%.3f"; - int decimal_precision = ParseFormatPrecision(display_format, 3); - - // Tabbing or CTRL-clicking on Drag turns it into an input box - bool start_text_input = false; - const bool tab_focus_requested = FocusableItemRegister(window, id); - if (tab_focus_requested || (hovered && (g.IO.MouseClicked[0] || g.IO.MouseDoubleClicked[0]))) - { - SetActiveID(id, window); - FocusWindow(window); - if (tab_focus_requested || g.IO.KeyCtrl || g.IO.MouseDoubleClicked[0]) - { - start_text_input = true; - g.ScalarAsInputTextId = 0; - } - } - if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id)) - return InputScalarAsWidgetReplacement(frame_bb, label, ImGuiDataType_Float, v, id, decimal_precision); - - // Actual drag behavior - ItemSize(total_bb, style.FramePadding.y); - const bool value_changed = DragBehavior(frame_bb, id, v, v_speed, v_min, v_max, decimal_precision, power); - - // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. - char value_buf[64]; - const char* value_buf_end = value_buf + ImFormatString(value_buf, IM_ARRAYSIZE(value_buf), display_format, *v); - RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.5f)); - - if (label_size.x > 0.0f) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, inner_bb.Min.y), label); - - return value_changed; -} - -bool ImGui::DragFloatN(const char* label, float* v, int components, float v_speed, float v_min, float v_max, const char* display_format, float power) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - bool value_changed = false; - BeginGroup(); - PushID(label); - PushMultiItemsWidths(components); - for (int i = 0; i < components; i++) - { - PushID(i); - value_changed |= DragFloat("##v", &v[i], v_speed, v_min, v_max, display_format, power); - SameLine(0, g.Style.ItemInnerSpacing.x); - PopID(); - PopItemWidth(); - } - PopID(); - - TextUnformatted(label, FindRenderedTextEnd(label)); - EndGroup(); - - return value_changed; -} - -bool ImGui::DragFloat2(const char* label, float v[2], float v_speed, float v_min, float v_max, const char* display_format, float power) -{ - return DragFloatN(label, v, 2, v_speed, v_min, v_max, display_format, power); -} - -bool ImGui::DragFloat3(const char* label, float v[3], float v_speed, float v_min, float v_max, const char* display_format, float power) -{ - return DragFloatN(label, v, 3, v_speed, v_min, v_max, display_format, power); -} - -bool ImGui::DragFloat4(const char* label, float v[4], float v_speed, float v_min, float v_max, const char* display_format, float power) -{ - return DragFloatN(label, v, 4, v_speed, v_min, v_max, display_format, power); -} - -bool ImGui::DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed, float v_min, float v_max, const char* display_format, const char* display_format_max, float power) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - PushID(label); - BeginGroup(); - PushMultiItemsWidths(2); - - bool value_changed = DragFloat("##min", v_current_min, v_speed, (v_min >= v_max) ? -FLT_MAX : v_min, (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max), display_format, power); - PopItemWidth(); - SameLine(0, g.Style.ItemInnerSpacing.x); - value_changed |= DragFloat("##max", v_current_max, v_speed, (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min), (v_min >= v_max) ? FLT_MAX : v_max, display_format_max ? display_format_max : display_format, power); - PopItemWidth(); - SameLine(0, g.Style.ItemInnerSpacing.x); - - TextUnformatted(label, FindRenderedTextEnd(label)); - EndGroup(); - PopID(); - - return value_changed; -} - -// NB: v_speed is float to allow adjusting the drag speed with more precision -bool ImGui::DragInt(const char* label, int* v, float v_speed, int v_min, int v_max, const char* display_format) -{ - if (!display_format) - display_format = "%.0f"; - float v_f = (float)*v; - bool value_changed = DragFloat(label, &v_f, v_speed, (float)v_min, (float)v_max, display_format); - *v = (int)v_f; - return value_changed; -} - -bool ImGui::DragIntN(const char* label, int* v, int components, float v_speed, int v_min, int v_max, const char* display_format) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - bool value_changed = false; - BeginGroup(); - PushID(label); - PushMultiItemsWidths(components); - for (int i = 0; i < components; i++) - { - PushID(i); - value_changed |= DragInt("##v", &v[i], v_speed, v_min, v_max, display_format); - SameLine(0, g.Style.ItemInnerSpacing.x); - PopID(); - PopItemWidth(); - } - PopID(); - - TextUnformatted(label, FindRenderedTextEnd(label)); - EndGroup(); - - return value_changed; -} - -bool ImGui::DragInt2(const char* label, int v[2], float v_speed, int v_min, int v_max, const char* display_format) -{ - return DragIntN(label, v, 2, v_speed, v_min, v_max, display_format); -} - -bool ImGui::DragInt3(const char* label, int v[3], float v_speed, int v_min, int v_max, const char* display_format) -{ - return DragIntN(label, v, 3, v_speed, v_min, v_max, display_format); -} - -bool ImGui::DragInt4(const char* label, int v[4], float v_speed, int v_min, int v_max, const char* display_format) -{ - return DragIntN(label, v, 4, v_speed, v_min, v_max, display_format); -} - -bool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed, int v_min, int v_max, const char* display_format, const char* display_format_max) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - PushID(label); - BeginGroup(); - PushMultiItemsWidths(2); - - bool value_changed = DragInt("##min", v_current_min, v_speed, (v_min >= v_max) ? INT_MIN : v_min, (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max), display_format); - PopItemWidth(); - SameLine(0, g.Style.ItemInnerSpacing.x); - value_changed |= DragInt("##max", v_current_max, v_speed, (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min), (v_min >= v_max) ? INT_MAX : v_max, display_format_max ? display_format_max : display_format); - PopItemWidth(); - SameLine(0, g.Style.ItemInnerSpacing.x); - - TextUnformatted(label, FindRenderedTextEnd(label)); - EndGroup(); - PopID(); - - return value_changed; -} - -void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - - const ImVec2 label_size = CalcTextSize(label, NULL, true); - if (graph_size.x == 0.0f) - graph_size.x = CalcItemWidth(); - if (graph_size.y == 0.0f) - graph_size.y = label_size.y + (style.FramePadding.y * 2); - - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(graph_size.x, graph_size.y)); - const ImRect inner_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding); - const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0)); - ItemSize(total_bb, style.FramePadding.y); - if (!ItemAdd(total_bb, 0)) - return; - const bool hovered = ItemHoverable(inner_bb, 0); - - // Determine scale from values if not specified - if (scale_min == FLT_MAX || scale_max == FLT_MAX) - { - float v_min = FLT_MAX; - float v_max = -FLT_MAX; - for (int i = 0; i < values_count; i++) - { - const float v = values_getter(data, i); - v_min = ImMin(v_min, v); - v_max = ImMax(v_max, v); - } - if (scale_min == FLT_MAX) - scale_min = v_min; - if (scale_max == FLT_MAX) - scale_max = v_max; - } - - RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); - - if (values_count > 0) - { - int res_w = ImMin((int)graph_size.x, values_count) + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); - int item_count = values_count + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); - - // Tooltip on hover - int v_hovered = -1; - if (hovered) - { - const float t = ImClamp((g.IO.MousePos.x - inner_bb.Min.x) / (inner_bb.Max.x - inner_bb.Min.x), 0.0f, 0.9999f); - const int v_idx = (int)(t * item_count); - IM_ASSERT(v_idx >= 0 && v_idx < values_count); - - const float v0 = values_getter(data, (v_idx + values_offset) % values_count); - const float v1 = values_getter(data, (v_idx + 1 + values_offset) % values_count); - if (plot_type == ImGuiPlotType_Lines) - SetTooltip("%d: %8.4g\n%d: %8.4g", v_idx, v0, v_idx+1, v1); - else if (plot_type == ImGuiPlotType_Histogram) - SetTooltip("%d: %8.4g", v_idx, v0); - v_hovered = v_idx; - } - - const float t_step = 1.0f / (float)res_w; - - float v0 = values_getter(data, (0 + values_offset) % values_count); - float t0 = 0.0f; - ImVec2 tp0 = ImVec2( t0, 1.0f - ImSaturate((v0 - scale_min) / (scale_max - scale_min)) ); // Point in the normalized space of our target rectangle - float histogram_zero_line_t = (scale_min * scale_max < 0.0f) ? (-scale_min / (scale_max - scale_min)) : (scale_min < 0.0f ? 0.0f : 1.0f); // Where does the zero line stands - - const ImU32 col_base = GetColorU32((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLines : ImGuiCol_PlotHistogram); - const ImU32 col_hovered = GetColorU32((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLinesHovered : ImGuiCol_PlotHistogramHovered); - - for (int n = 0; n < res_w; n++) - { - const float t1 = t0 + t_step; - const int v1_idx = (int)(t0 * item_count + 0.5f); - IM_ASSERT(v1_idx >= 0 && v1_idx < values_count); - const float v1 = values_getter(data, (v1_idx + values_offset + 1) % values_count); - const ImVec2 tp1 = ImVec2( t1, 1.0f - ImSaturate((v1 - scale_min) / (scale_max - scale_min)) ); - - // NB: Draw calls are merged together by the DrawList system. Still, we should render our batch are lower level to save a bit of CPU. - ImVec2 pos0 = ImLerp(inner_bb.Min, inner_bb.Max, tp0); - ImVec2 pos1 = ImLerp(inner_bb.Min, inner_bb.Max, (plot_type == ImGuiPlotType_Lines) ? tp1 : ImVec2(tp1.x, histogram_zero_line_t)); - if (plot_type == ImGuiPlotType_Lines) - { - window->DrawList->AddLine(pos0, pos1, v_hovered == v1_idx ? col_hovered : col_base); - } - else if (plot_type == ImGuiPlotType_Histogram) - { - if (pos1.x >= pos0.x + 2.0f) - pos1.x -= 1.0f; - window->DrawList->AddRectFilled(pos0, pos1, v_hovered == v1_idx ? col_hovered : col_base); - } - - t0 = t1; - tp0 = tp1; - } - } - - // Text overlay - if (overlay_text) - RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, overlay_text, NULL, NULL, ImVec2(0.5f,0.0f)); - - if (label_size.x > 0.0f) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, inner_bb.Min.y), label); -} - -struct ImGuiPlotArrayGetterData -{ - const float* Values; - int Stride; - - ImGuiPlotArrayGetterData(const float* values, int stride) { Values = values; Stride = stride; } -}; - -static float Plot_ArrayGetter(void* data, int idx) -{ - ImGuiPlotArrayGetterData* plot_data = (ImGuiPlotArrayGetterData*)data; - const float v = *(float*)(void*)((unsigned char*)plot_data->Values + (size_t)idx * plot_data->Stride); - return v; -} - -void ImGui::PlotLines(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, int stride) -{ - ImGuiPlotArrayGetterData data(values, stride); - PlotEx(ImGuiPlotType_Lines, label, &Plot_ArrayGetter, (void*)&data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); -} - -void ImGui::PlotLines(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size) -{ - PlotEx(ImGuiPlotType_Lines, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); -} - -void ImGui::PlotHistogram(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, int stride) -{ - ImGuiPlotArrayGetterData data(values, stride); - PlotEx(ImGuiPlotType_Histogram, label, &Plot_ArrayGetter, (void*)&data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); -} - -void ImGui::PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size) -{ - PlotEx(ImGuiPlotType_Histogram, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); -} - -// size_arg (for each axis) < 0.0f: align to end, 0.0f: auto, > 0.0f: specified size -void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* overlay) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - - ImVec2 pos = window->DC.CursorPos; - ImRect bb(pos, pos + CalcItemSize(size_arg, CalcItemWidth(), g.FontSize + style.FramePadding.y*2.0f)); - ItemSize(bb, style.FramePadding.y); - if (!ItemAdd(bb, 0)) - return; - - // Render - fraction = ImSaturate(fraction); - RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); - bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize)); - const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction), bb.Max.y); - RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), 0.0f, fraction, style.FrameRounding); - - // Default displaying the fraction as percentage string, but user can override it - char overlay_buf[32]; - if (!overlay) - { - ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction*100+0.01f); - overlay = overlay_buf; - } - - ImVec2 overlay_size = CalcTextSize(overlay, NULL); - if (overlay_size.x > 0.0f) - RenderTextClipped(ImVec2(ImClamp(fill_br.x + style.ItemSpacing.x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f,0.5f), &bb); -} - -bool ImGui::Checkbox(const char* label, bool* v) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const ImVec2 label_size = CalcTextSize(label, NULL, true); - - const ImRect check_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(label_size.y + style.FramePadding.y*2, label_size.y + style.FramePadding.y*2)); // We want a square shape to we use Y twice - ItemSize(check_bb, style.FramePadding.y); - - ImRect total_bb = check_bb; - if (label_size.x > 0) - SameLine(0, style.ItemInnerSpacing.x); - const ImRect text_bb(window->DC.CursorPos + ImVec2(0,style.FramePadding.y), window->DC.CursorPos + ImVec2(0,style.FramePadding.y) + label_size); - if (label_size.x > 0) - { - ItemSize(ImVec2(text_bb.GetWidth(), check_bb.GetHeight()), style.FramePadding.y); - total_bb = ImRect(ImMin(check_bb.Min, text_bb.Min), ImMax(check_bb.Max, text_bb.Max)); - } - - if (!ItemAdd(total_bb, id)) - return false; - - bool hovered, held; - bool pressed = ButtonBehavior(total_bb, id, &hovered, &held); - if (pressed) - *v = !(*v); - - RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding); - if (*v) - { - const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight()); - const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f)); - RenderCheckMark(check_bb.Min + ImVec2(pad,pad), GetColorU32(ImGuiCol_CheckMark), check_bb.GetWidth() - pad*2.0f); - } - - if (g.LogEnabled) - LogRenderedText(&text_bb.Min, *v ? "[x]" : "[ ]"); - if (label_size.x > 0.0f) - RenderText(text_bb.Min, label); - - return pressed; -} - -bool ImGui::CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value) -{ - bool v = ((*flags & flags_value) == flags_value); - bool pressed = Checkbox(label, &v); - if (pressed) - { - if (v) - *flags |= flags_value; - else - *flags &= ~flags_value; - } - - return pressed; -} - -bool ImGui::RadioButton(const char* label, bool active) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const ImVec2 label_size = CalcTextSize(label, NULL, true); - - const ImRect check_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(label_size.y + style.FramePadding.y*2-1, label_size.y + style.FramePadding.y*2-1)); - ItemSize(check_bb, style.FramePadding.y); - - ImRect total_bb = check_bb; - if (label_size.x > 0) - SameLine(0, style.ItemInnerSpacing.x); - const ImRect text_bb(window->DC.CursorPos + ImVec2(0, style.FramePadding.y), window->DC.CursorPos + ImVec2(0, style.FramePadding.y) + label_size); - if (label_size.x > 0) - { - ItemSize(ImVec2(text_bb.GetWidth(), check_bb.GetHeight()), style.FramePadding.y); - total_bb.Add(text_bb); - } - - if (!ItemAdd(total_bb, id)) - return false; - - ImVec2 center = check_bb.GetCenter(); - center.x = (float)(int)center.x + 0.5f; - center.y = (float)(int)center.y + 0.5f; - const float radius = check_bb.GetHeight() * 0.5f; - - bool hovered, held; - bool pressed = ButtonBehavior(total_bb, id, &hovered, &held); - - window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), 16); - if (active) - { - const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight()); - const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f)); - window->DrawList->AddCircleFilled(center, radius-pad, GetColorU32(ImGuiCol_CheckMark), 16); - } - - if (style.FrameBorderSize > 0.0f) - { - window->DrawList->AddCircle(center+ImVec2(1,1), radius, GetColorU32(ImGuiCol_BorderShadow), 16, style.FrameBorderSize); - window->DrawList->AddCircle(center, radius, GetColorU32(ImGuiCol_Border), 16, style.FrameBorderSize); - } - - if (g.LogEnabled) - LogRenderedText(&text_bb.Min, active ? "(x)" : "( )"); - if (label_size.x > 0.0f) - RenderText(text_bb.Min, label); - - return pressed; -} - -bool ImGui::RadioButton(const char* label, int* v, int v_button) -{ - const bool pressed = RadioButton(label, *v == v_button); - if (pressed) - { - *v = v_button; - } - return pressed; -} - -static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end) -{ - int line_count = 0; - const char* s = text_begin; - while (char c = *s++) // We are only matching for \n so we can ignore UTF-8 decoding - if (c == '\n') - line_count++; - s--; - if (s[0] != '\n' && s[0] != '\r') - line_count++; - *out_text_end = s; - return line_count; -} - -static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining, ImVec2* out_offset, bool stop_on_new_line) -{ - ImFont* font = GImGui->Font; - const float line_height = GImGui->FontSize; - const float scale = line_height / font->FontSize; - - ImVec2 text_size = ImVec2(0,0); - float line_width = 0.0f; - - const ImWchar* s = text_begin; - while (s < text_end) - { - unsigned int c = (unsigned int)(*s++); - if (c == '\n') - { - text_size.x = ImMax(text_size.x, line_width); - text_size.y += line_height; - line_width = 0.0f; - if (stop_on_new_line) - break; - continue; - } - if (c == '\r') - continue; - - const float char_width = font->GetCharAdvance((unsigned short)c) * scale; - line_width += char_width; - } - - if (text_size.x < line_width) - text_size.x = line_width; - - if (out_offset) - *out_offset = ImVec2(line_width, text_size.y + line_height); // offset allow for the possibility of sitting after a trailing \n - - if (line_width > 0 || text_size.y == 0.0f) // whereas size.y will ignore the trailing \n - text_size.y += line_height; - - if (remaining) - *remaining = s; - - return text_size; -} - -// Wrapper for stb_textedit.h to edit text (our wrapper is for: statically sized buffer, single-line, wchar characters. InputText converts between UTF-8 and wchar) -namespace ImGuiStb -{ - -static int STB_TEXTEDIT_STRINGLEN(const STB_TEXTEDIT_STRING* obj) { return obj->CurLenW; } -static ImWchar STB_TEXTEDIT_GETCHAR(const STB_TEXTEDIT_STRING* obj, int idx) { return obj->Text[idx]; } -static float STB_TEXTEDIT_GETWIDTH(STB_TEXTEDIT_STRING* obj, int line_start_idx, int char_idx) { ImWchar c = obj->Text[line_start_idx+char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; return GImGui->Font->GetCharAdvance(c) * (GImGui->FontSize / GImGui->Font->FontSize); } -static int STB_TEXTEDIT_KEYTOTEXT(int key) { return key >= 0x10000 ? 0 : key; } -static ImWchar STB_TEXTEDIT_NEWLINE = '\n'; -static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, STB_TEXTEDIT_STRING* obj, int line_start_idx) -{ - const ImWchar* text = obj->Text.Data; - const ImWchar* text_remaining = NULL; - const ImVec2 size = InputTextCalcTextSizeW(text + line_start_idx, text + obj->CurLenW, &text_remaining, NULL, true); - r->x0 = 0.0f; - r->x1 = size.x; - r->baseline_y_delta = size.y; - r->ymin = 0.0f; - r->ymax = size.y; - r->num_chars = (int)(text_remaining - (text + line_start_idx)); -} - -static bool is_separator(unsigned int c) { return ImCharIsSpace(c) || c==',' || c==';' || c=='(' || c==')' || c=='{' || c=='}' || c=='[' || c==']' || c=='|'; } -static int is_word_boundary_from_right(STB_TEXTEDIT_STRING* obj, int idx) { return idx > 0 ? (is_separator( obj->Text[idx-1] ) && !is_separator( obj->Text[idx] ) ) : 1; } -static int STB_TEXTEDIT_MOVEWORDLEFT_IMPL(STB_TEXTEDIT_STRING* obj, int idx) { idx--; while (idx >= 0 && !is_word_boundary_from_right(obj, idx)) idx--; return idx < 0 ? 0 : idx; } -#ifdef __APPLE__ // FIXME: Move setting to IO structure -static int is_word_boundary_from_left(STB_TEXTEDIT_STRING* obj, int idx) { return idx > 0 ? (!is_separator( obj->Text[idx-1] ) && is_separator( obj->Text[idx] ) ) : 1; } -static int STB_TEXTEDIT_MOVEWORDRIGHT_IMPL(STB_TEXTEDIT_STRING* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_left(obj, idx)) idx++; return idx > len ? len : idx; } -#else -static int STB_TEXTEDIT_MOVEWORDRIGHT_IMPL(STB_TEXTEDIT_STRING* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_right(obj, idx)) idx++; return idx > len ? len : idx; } -#endif -#define STB_TEXTEDIT_MOVEWORDLEFT STB_TEXTEDIT_MOVEWORDLEFT_IMPL // They need to be #define for stb_textedit.h -#define STB_TEXTEDIT_MOVEWORDRIGHT STB_TEXTEDIT_MOVEWORDRIGHT_IMPL - -static void STB_TEXTEDIT_DELETECHARS(STB_TEXTEDIT_STRING* obj, int pos, int n) -{ - ImWchar* dst = obj->Text.Data + pos; - - // We maintain our buffer length in both UTF-8 and wchar formats - obj->CurLenA -= ImTextCountUtf8BytesFromStr(dst, dst + n); - obj->CurLenW -= n; - - // Offset remaining text - const ImWchar* src = obj->Text.Data + pos + n; - while (ImWchar c = *src++) - *dst++ = c; - *dst = '\0'; -} - -static bool STB_TEXTEDIT_INSERTCHARS(STB_TEXTEDIT_STRING* obj, int pos, const ImWchar* new_text, int new_text_len) -{ - const int text_len = obj->CurLenW; - IM_ASSERT(pos <= text_len); - if (new_text_len + text_len + 1 > obj->Text.Size) - return false; - - const int new_text_len_utf8 = ImTextCountUtf8BytesFromStr(new_text, new_text + new_text_len); - if (new_text_len_utf8 + obj->CurLenA + 1 > obj->BufSizeA) - return false; - - ImWchar* text = obj->Text.Data; - if (pos != text_len) - memmove(text + pos + new_text_len, text + pos, (size_t)(text_len - pos) * sizeof(ImWchar)); - memcpy(text + pos, new_text, (size_t)new_text_len * sizeof(ImWchar)); - - obj->CurLenW += new_text_len; - obj->CurLenA += new_text_len_utf8; - obj->Text[obj->CurLenW] = '\0'; - - return true; -} - -// We don't use an enum so we can build even with conflicting symbols (if another user of stb_textedit.h leak their STB_TEXTEDIT_K_* symbols) -#define STB_TEXTEDIT_K_LEFT 0x10000 // keyboard input to move cursor left -#define STB_TEXTEDIT_K_RIGHT 0x10001 // keyboard input to move cursor right -#define STB_TEXTEDIT_K_UP 0x10002 // keyboard input to move cursor up -#define STB_TEXTEDIT_K_DOWN 0x10003 // keyboard input to move cursor down -#define STB_TEXTEDIT_K_LINESTART 0x10004 // keyboard input to move cursor to start of line -#define STB_TEXTEDIT_K_LINEEND 0x10005 // keyboard input to move cursor to end of line -#define STB_TEXTEDIT_K_TEXTSTART 0x10006 // keyboard input to move cursor to start of text -#define STB_TEXTEDIT_K_TEXTEND 0x10007 // keyboard input to move cursor to end of text -#define STB_TEXTEDIT_K_DELETE 0x10008 // keyboard input to delete selection or character under cursor -#define STB_TEXTEDIT_K_BACKSPACE 0x10009 // keyboard input to delete selection or character left of cursor -#define STB_TEXTEDIT_K_UNDO 0x1000A // keyboard input to perform undo -#define STB_TEXTEDIT_K_REDO 0x1000B // keyboard input to perform redo -#define STB_TEXTEDIT_K_WORDLEFT 0x1000C // keyboard input to move cursor left one word -#define STB_TEXTEDIT_K_WORDRIGHT 0x1000D // keyboard input to move cursor right one word -#define STB_TEXTEDIT_K_SHIFT 0x20000 - -#define STB_TEXTEDIT_IMPLEMENTATION -#include "stb_textedit.h" - -} - -void ImGuiTextEditState::OnKeyPressed(int key) -{ - stb_textedit_key(this, &StbState, key); - CursorFollow = true; - CursorAnimReset(); -} - -// Public API to manipulate UTF-8 text -// We expose UTF-8 to the user (unlike the STB_TEXTEDIT_* functions which are manipulating wchar) -// FIXME: The existence of this rarely exercised code path is a bit of a nuisance. -void ImGuiTextEditCallbackData::DeleteChars(int pos, int bytes_count) -{ - IM_ASSERT(pos + bytes_count <= BufTextLen); - char* dst = Buf + pos; - const char* src = Buf + pos + bytes_count; - while (char c = *src++) - *dst++ = c; - *dst = '\0'; - - if (CursorPos + bytes_count >= pos) - CursorPos -= bytes_count; - else if (CursorPos >= pos) - CursorPos = pos; - SelectionStart = SelectionEnd = CursorPos; - BufDirty = true; - BufTextLen -= bytes_count; -} - -void ImGuiTextEditCallbackData::InsertChars(int pos, const char* new_text, const char* new_text_end) -{ - const int new_text_len = new_text_end ? (int)(new_text_end - new_text) : (int)strlen(new_text); - if (new_text_len + BufTextLen + 1 >= BufSize) - return; - - if (BufTextLen != pos) - memmove(Buf + pos + new_text_len, Buf + pos, (size_t)(BufTextLen - pos)); - memcpy(Buf + pos, new_text, (size_t)new_text_len * sizeof(char)); - Buf[BufTextLen + new_text_len] = '\0'; - - if (CursorPos >= pos) - CursorPos += new_text_len; - SelectionStart = SelectionEnd = CursorPos; - BufDirty = true; - BufTextLen += new_text_len; -} - -// Return false to discard a character. -static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data) -{ - unsigned int c = *p_char; - - if (c < 128 && c != ' ' && !isprint((int)(c & 0xFF))) - { - bool pass = false; - pass |= (c == '\n' && (flags & ImGuiInputTextFlags_Multiline)); - pass |= (c == '\t' && (flags & ImGuiInputTextFlags_AllowTabInput)); - if (!pass) - return false; - } - - if (c >= 0xE000 && c <= 0xF8FF) // Filter private Unicode range. I don't imagine anybody would want to input them. GLFW on OSX seems to send private characters for special keys like arrow keys. - return false; - - if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank)) - { - if (flags & ImGuiInputTextFlags_CharsDecimal) - if (!(c >= '0' && c <= '9') && (c != '.') && (c != '-') && (c != '+') && (c != '*') && (c != '/')) - return false; - - if (flags & ImGuiInputTextFlags_CharsHexadecimal) - if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) - return false; - - if (flags & ImGuiInputTextFlags_CharsUppercase) - if (c >= 'a' && c <= 'z') - *p_char = (c += (unsigned int)('A'-'a')); - - if (flags & ImGuiInputTextFlags_CharsNoBlank) - if (ImCharIsSpace(c)) - return false; - } - - if (flags & ImGuiInputTextFlags_CallbackCharFilter) - { - ImGuiTextEditCallbackData callback_data; - memset(&callback_data, 0, sizeof(ImGuiTextEditCallbackData)); - callback_data.EventFlag = ImGuiInputTextFlags_CallbackCharFilter; - callback_data.EventChar = (ImWchar)c; - callback_data.Flags = flags; - callback_data.UserData = user_data; - if (callback(&callback_data) != 0) - return false; - *p_char = callback_data.EventChar; - if (!callback_data.EventChar) - return false; - } - - return true; -} - -// Edit a string of text -// NB: when active, hold on a privately held copy of the text (and apply back to 'buf'). So changing 'buf' while active has no effect. -// FIXME: Rather messy function partly because we are doing UTF8 > u16 > UTF8 conversions on the go to more easily handle stb_textedit calls. Ideally we should stay in UTF-8 all the time. See https://github.com/nothings/stb/issues/188 -bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackHistory) && (flags & ImGuiInputTextFlags_Multiline))); // Can't use both together (they both use up/down keys) - IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackCompletion) && (flags & ImGuiInputTextFlags_AllowTabInput))); // Can't use both together (they both use tab key) - - ImGuiContext& g = *GImGui; - const ImGuiIO& io = g.IO; - const ImGuiStyle& style = g.Style; - - const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0; - const bool is_editable = (flags & ImGuiInputTextFlags_ReadOnly) == 0; - const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0; - const bool is_undoable = (flags & ImGuiInputTextFlags_NoUndoRedo) == 0; - - if (is_multiline) // Open group before calling GetID() because groups tracks id created during their spawn - BeginGroup(); - const ImGuiID id = window->GetID(label); - const ImVec2 label_size = CalcTextSize(label, NULL, true); - ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), (is_multiline ? GetTextLineHeight() * 8.0f : label_size.y) + style.FramePadding.y*2.0f); // Arbitrary default of 8 lines high for multi-line - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size); - const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? (style.ItemInnerSpacing.x + label_size.x) : 0.0f, 0.0f)); - - ImGuiWindow* draw_window = window; - if (is_multiline) - { - if (!BeginChildFrame(id, frame_bb.GetSize())) - { - EndChildFrame(); - EndGroup(); - return false; - } - draw_window = GetCurrentWindow(); - size.x -= draw_window->ScrollbarSizes.x; - } - else - { - ItemSize(total_bb, style.FramePadding.y); - if (!ItemAdd(total_bb, id)) - return false; - } - const bool hovered = ItemHoverable(frame_bb, id); - if (hovered) - g.MouseCursor = ImGuiMouseCursor_TextInput; - - // Password pushes a temporary font with only a fallback glyph - if (is_password) - { - const ImFontGlyph* glyph = g.Font->FindGlyph('*'); - ImFont* password_font = &g.InputTextPasswordFont; - password_font->FontSize = g.Font->FontSize; - password_font->Scale = g.Font->Scale; - password_font->DisplayOffset = g.Font->DisplayOffset; - password_font->Ascent = g.Font->Ascent; - password_font->Descent = g.Font->Descent; - password_font->ContainerAtlas = g.Font->ContainerAtlas; - password_font->FallbackGlyph = glyph; - password_font->FallbackAdvanceX = glyph->AdvanceX; - IM_ASSERT(password_font->Glyphs.empty() && password_font->IndexAdvanceX.empty() && password_font->IndexLookup.empty()); - PushFont(password_font); - } - - // NB: we are only allowed to access 'edit_state' if we are the active widget. - ImGuiTextEditState& edit_state = g.InputTextState; - - const bool focus_requested = FocusableItemRegister(window, id, (flags & (ImGuiInputTextFlags_CallbackCompletion|ImGuiInputTextFlags_AllowTabInput)) == 0); // Using completion callback disable keyboard tabbing - const bool focus_requested_by_code = focus_requested && (window->FocusIdxAllCounter == window->FocusIdxAllRequestCurrent); - const bool focus_requested_by_tab = focus_requested && !focus_requested_by_code; - - const bool user_clicked = hovered && io.MouseClicked[0]; - const bool user_scrolled = is_multiline && g.ActiveId == 0 && edit_state.Id == id && g.ActiveIdPreviousFrame == draw_window->GetIDNoKeepAlive("#SCROLLY"); - - bool clear_active_id = false; - - bool select_all = (g.ActiveId != id) && (flags & ImGuiInputTextFlags_AutoSelectAll) != 0; - if (focus_requested || user_clicked || user_scrolled) - { - if (g.ActiveId != id) - { - // Start edition - // Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar) - // From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode) - const int prev_len_w = edit_state.CurLenW; - edit_state.Text.resize(buf_size+1); // wchar count <= UTF-8 count. we use +1 to make sure that .Data isn't NULL so it doesn't crash. - edit_state.InitialText.resize(buf_size+1); // UTF-8. we use +1 to make sure that .Data isn't NULL so it doesn't crash. - ImStrncpy(edit_state.InitialText.Data, buf, edit_state.InitialText.Size); - const char* buf_end = NULL; - edit_state.CurLenW = ImTextStrFromUtf8(edit_state.Text.Data, edit_state.Text.Size, buf, NULL, &buf_end); - edit_state.CurLenA = (int)(buf_end - buf); // We can't get the result from ImFormatString() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8. - edit_state.CursorAnimReset(); - - // Preserve cursor position and undo/redo stack if we come back to same widget - // FIXME: We should probably compare the whole buffer to be on the safety side. Comparing buf (utf8) and edit_state.Text (wchar). - const bool recycle_state = (edit_state.Id == id) && (prev_len_w == edit_state.CurLenW); - if (recycle_state) - { - // Recycle existing cursor/selection/undo stack but clamp position - // Note a single mouse click will override the cursor/position immediately by calling stb_textedit_click handler. - edit_state.CursorClamp(); - } - else - { - edit_state.Id = id; - edit_state.ScrollX = 0.0f; - stb_textedit_initialize_state(&edit_state.StbState, !is_multiline); - if (!is_multiline && focus_requested_by_code) - select_all = true; - } - if (flags & ImGuiInputTextFlags_AlwaysInsertMode) - edit_state.StbState.insert_mode = true; - if (!is_multiline && (focus_requested_by_tab || (user_clicked && io.KeyCtrl))) - select_all = true; - } - SetActiveID(id, window); - FocusWindow(window); - } - else if (io.MouseClicked[0]) - { - // Release focus when we click outside - clear_active_id = true; - } - - bool value_changed = false; - bool enter_pressed = false; - - if (g.ActiveId == id) - { - if (!is_editable && !g.ActiveIdIsJustActivated) - { - // When read-only we always use the live data passed to the function - edit_state.Text.resize(buf_size+1); - const char* buf_end = NULL; - edit_state.CurLenW = ImTextStrFromUtf8(edit_state.Text.Data, edit_state.Text.Size, buf, NULL, &buf_end); - edit_state.CurLenA = (int)(buf_end - buf); - edit_state.CursorClamp(); - } - - edit_state.BufSizeA = buf_size; - - // Although we are active we don't prevent mouse from hovering other elements unless we are interacting right now with the widget. - // Down the line we should have a cleaner library-wide concept of Selected vs Active. - g.ActiveIdAllowOverlap = !io.MouseDown[0]; - g.WantTextInputNextFrame = 1; - - // Edit in progress - const float mouse_x = (io.MousePos.x - frame_bb.Min.x - style.FramePadding.x) + edit_state.ScrollX; - const float mouse_y = (is_multiline ? (io.MousePos.y - draw_window->DC.CursorPos.y - style.FramePadding.y) : (g.FontSize*0.5f)); - - const bool osx_double_click_selects_words = io.OptMacOSXBehaviors; // OS X style: Double click selects by word instead of selecting whole text - if (select_all || (hovered && !osx_double_click_selects_words && io.MouseDoubleClicked[0])) - { - edit_state.SelectAll(); - edit_state.SelectedAllMouseLock = true; - } - else if (hovered && osx_double_click_selects_words && io.MouseDoubleClicked[0]) - { - // Select a word only, OS X style (by simulating keystrokes) - edit_state.OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT); - edit_state.OnKeyPressed(STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT); - } - else if (io.MouseClicked[0] && !edit_state.SelectedAllMouseLock) - { - stb_textedit_click(&edit_state, &edit_state.StbState, mouse_x, mouse_y); - edit_state.CursorAnimReset(); - } - else if (io.MouseDown[0] && !edit_state.SelectedAllMouseLock && (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f)) - { - stb_textedit_drag(&edit_state, &edit_state.StbState, mouse_x, mouse_y); - edit_state.CursorAnimReset(); - edit_state.CursorFollow = true; - } - if (edit_state.SelectedAllMouseLock && !io.MouseDown[0]) - edit_state.SelectedAllMouseLock = false; - - if (io.InputCharacters[0]) - { - // Process text input (before we check for Return because using some IME will effectively send a Return?) - // We ignore CTRL inputs, but need to allow CTRL+ALT as some keyboards (e.g. German) use AltGR - which is Alt+Ctrl - to input certain characters. - if (!(io.KeyCtrl && !io.KeyAlt) && is_editable) - { - for (int n = 0; n < IM_ARRAYSIZE(io.InputCharacters) && io.InputCharacters[n]; n++) - if (unsigned int c = (unsigned int)io.InputCharacters[n]) - { - // Insert character if they pass filtering - if (!InputTextFilterCharacter(&c, flags, callback, user_data)) - continue; - edit_state.OnKeyPressed((int)c); - } - } - - // Consume characters - memset(g.IO.InputCharacters, 0, sizeof(g.IO.InputCharacters)); - } - } - - bool cancel_edit = false; - if (g.ActiveId == id && !g.ActiveIdIsJustActivated && !clear_active_id) - { - // Handle key-presses - const int k_mask = (io.KeyShift ? STB_TEXTEDIT_K_SHIFT : 0); - const bool is_shortcut_key_only = (io.OptMacOSXBehaviors ? (io.KeySuper && !io.KeyCtrl) : (io.KeyCtrl && !io.KeySuper)) && !io.KeyAlt && !io.KeyShift; // OS X style: Shortcuts using Cmd/Super instead of Ctrl - const bool is_wordmove_key_down = io.OptMacOSXBehaviors ? io.KeyAlt : io.KeyCtrl; // OS X style: Text editing cursor movement using Alt instead of Ctrl - const bool is_startend_key_down = io.OptMacOSXBehaviors && io.KeySuper && !io.KeyCtrl && !io.KeyAlt; // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End - - if (IsKeyPressedMap(ImGuiKey_LeftArrow)) { edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINESTART : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDLEFT : STB_TEXTEDIT_K_LEFT) | k_mask); } - else if (IsKeyPressedMap(ImGuiKey_RightArrow)) { edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINEEND : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDRIGHT : STB_TEXTEDIT_K_RIGHT) | k_mask); } - else if (IsKeyPressedMap(ImGuiKey_UpArrow) && is_multiline) { if (io.KeyCtrl) SetWindowScrollY(draw_window, ImMax(draw_window->Scroll.y - g.FontSize, 0.0f)); else edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTSTART : STB_TEXTEDIT_K_UP) | k_mask); } - else if (IsKeyPressedMap(ImGuiKey_DownArrow) && is_multiline) { if (io.KeyCtrl) SetWindowScrollY(draw_window, ImMin(draw_window->Scroll.y + g.FontSize, GetScrollMaxY())); else edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTEND : STB_TEXTEDIT_K_DOWN) | k_mask); } - else if (IsKeyPressedMap(ImGuiKey_Home)) { edit_state.OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTSTART | k_mask : STB_TEXTEDIT_K_LINESTART | k_mask); } - else if (IsKeyPressedMap(ImGuiKey_End)) { edit_state.OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTEND | k_mask : STB_TEXTEDIT_K_LINEEND | k_mask); } - else if (IsKeyPressedMap(ImGuiKey_Delete) && is_editable) { edit_state.OnKeyPressed(STB_TEXTEDIT_K_DELETE | k_mask); } - else if (IsKeyPressedMap(ImGuiKey_Backspace) && is_editable) - { - if (!edit_state.HasSelection()) - { - if (is_wordmove_key_down) edit_state.OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT|STB_TEXTEDIT_K_SHIFT); - else if (io.OptMacOSXBehaviors && io.KeySuper && !io.KeyAlt && !io.KeyCtrl) edit_state.OnKeyPressed(STB_TEXTEDIT_K_LINESTART|STB_TEXTEDIT_K_SHIFT); - } - edit_state.OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask); - } - else if (IsKeyPressedMap(ImGuiKey_Enter)) - { - bool ctrl_enter_for_new_line = (flags & ImGuiInputTextFlags_CtrlEnterForNewLine) != 0; - if (!is_multiline || (ctrl_enter_for_new_line && !io.KeyCtrl) || (!ctrl_enter_for_new_line && io.KeyCtrl)) - { - enter_pressed = clear_active_id = true; - } - else if (is_editable) - { - unsigned int c = '\n'; // Insert new line - if (InputTextFilterCharacter(&c, flags, callback, user_data)) - edit_state.OnKeyPressed((int)c); - } - } - else if ((flags & ImGuiInputTextFlags_AllowTabInput) && IsKeyPressedMap(ImGuiKey_Tab) && !io.KeyCtrl && !io.KeyShift && !io.KeyAlt && is_editable) - { - unsigned int c = '\t'; // Insert TAB - if (InputTextFilterCharacter(&c, flags, callback, user_data)) - edit_state.OnKeyPressed((int)c); - } - else if (IsKeyPressedMap(ImGuiKey_Escape)) { clear_active_id = cancel_edit = true; } - else if (is_shortcut_key_only && IsKeyPressedMap(ImGuiKey_Z) && is_editable && is_undoable) { edit_state.OnKeyPressed(STB_TEXTEDIT_K_UNDO); edit_state.ClearSelection(); } - else if (is_shortcut_key_only && IsKeyPressedMap(ImGuiKey_Y) && is_editable && is_undoable) { edit_state.OnKeyPressed(STB_TEXTEDIT_K_REDO); edit_state.ClearSelection(); } - else if (is_shortcut_key_only && IsKeyPressedMap(ImGuiKey_A)) { edit_state.SelectAll(); edit_state.CursorFollow = true; } - else if (is_shortcut_key_only && !is_password && ((IsKeyPressedMap(ImGuiKey_X) && is_editable) || IsKeyPressedMap(ImGuiKey_C)) && (!is_multiline || edit_state.HasSelection())) - { - // Cut, Copy - const bool cut = IsKeyPressedMap(ImGuiKey_X); - if (cut && !edit_state.HasSelection()) - edit_state.SelectAll(); - - if (io.SetClipboardTextFn) - { - const int ib = edit_state.HasSelection() ? ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end) : 0; - const int ie = edit_state.HasSelection() ? ImMax(edit_state.StbState.select_start, edit_state.StbState.select_end) : edit_state.CurLenW; - edit_state.TempTextBuffer.resize((ie-ib) * 4 + 1); - ImTextStrToUtf8(edit_state.TempTextBuffer.Data, edit_state.TempTextBuffer.Size, edit_state.Text.Data+ib, edit_state.Text.Data+ie); - SetClipboardText(edit_state.TempTextBuffer.Data); - } - - if (cut) - { - edit_state.CursorFollow = true; - stb_textedit_cut(&edit_state, &edit_state.StbState); - } - } - else if (is_shortcut_key_only && IsKeyPressedMap(ImGuiKey_V) && is_editable) - { - // Paste - if (const char* clipboard = GetClipboardText()) - { - // Filter pasted buffer - const int clipboard_len = (int)strlen(clipboard); - ImWchar* clipboard_filtered = (ImWchar*)ImGui::MemAlloc((clipboard_len+1) * sizeof(ImWchar)); - int clipboard_filtered_len = 0; - for (const char* s = clipboard; *s; ) - { - unsigned int c; - s += ImTextCharFromUtf8(&c, s, NULL); - if (c == 0) - break; - if (c >= 0x10000 || !InputTextFilterCharacter(&c, flags, callback, user_data)) - continue; - clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c; - } - clipboard_filtered[clipboard_filtered_len] = 0; - if (clipboard_filtered_len > 0) // If everything was filtered, ignore the pasting operation - { - stb_textedit_paste(&edit_state, &edit_state.StbState, clipboard_filtered, clipboard_filtered_len); - edit_state.CursorFollow = true; - } - ImGui::MemFree(clipboard_filtered); - } - } - } - - if (g.ActiveId == id) - { - if (cancel_edit) - { - // Restore initial value - if (is_editable) - { - ImStrncpy(buf, edit_state.InitialText.Data, buf_size); - value_changed = true; - } - } - - // When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer before clearing ActiveId, even though strictly speaking it wasn't modified on this frame. - // If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail. Also this allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage. - bool apply_edit_back_to_user_buffer = !cancel_edit || (enter_pressed && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0); - if (apply_edit_back_to_user_buffer) - { - // Apply new value immediately - copy modified buffer back - // Note that as soon as the input box is active, the in-widget value gets priority over any underlying modification of the input buffer - // FIXME: We actually always render 'buf' when calling DrawList->AddText, making the comment above incorrect. - // FIXME-OPT: CPU waste to do this every time the widget is active, should mark dirty state from the stb_textedit callbacks. - if (is_editable) - { - edit_state.TempTextBuffer.resize(edit_state.Text.Size * 4); - ImTextStrToUtf8(edit_state.TempTextBuffer.Data, edit_state.TempTextBuffer.Size, edit_state.Text.Data, NULL); - } - - // User callback - if ((flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory | ImGuiInputTextFlags_CallbackAlways)) != 0) - { - IM_ASSERT(callback != NULL); - - // The reason we specify the usage semantic (Completion/History) is that Completion needs to disable keyboard TABBING at the moment. - ImGuiInputTextFlags event_flag = 0; - ImGuiKey event_key = ImGuiKey_COUNT; - if ((flags & ImGuiInputTextFlags_CallbackCompletion) != 0 && IsKeyPressedMap(ImGuiKey_Tab)) - { - event_flag = ImGuiInputTextFlags_CallbackCompletion; - event_key = ImGuiKey_Tab; - } - else if ((flags & ImGuiInputTextFlags_CallbackHistory) != 0 && IsKeyPressedMap(ImGuiKey_UpArrow)) - { - event_flag = ImGuiInputTextFlags_CallbackHistory; - event_key = ImGuiKey_UpArrow; - } - else if ((flags & ImGuiInputTextFlags_CallbackHistory) != 0 && IsKeyPressedMap(ImGuiKey_DownArrow)) - { - event_flag = ImGuiInputTextFlags_CallbackHistory; - event_key = ImGuiKey_DownArrow; - } - else if (flags & ImGuiInputTextFlags_CallbackAlways) - event_flag = ImGuiInputTextFlags_CallbackAlways; - - if (event_flag) - { - ImGuiTextEditCallbackData callback_data; - memset(&callback_data, 0, sizeof(ImGuiTextEditCallbackData)); - callback_data.EventFlag = event_flag; - callback_data.Flags = flags; - callback_data.UserData = user_data; - callback_data.ReadOnly = !is_editable; - - callback_data.EventKey = event_key; - callback_data.Buf = edit_state.TempTextBuffer.Data; - callback_data.BufTextLen = edit_state.CurLenA; - callback_data.BufSize = edit_state.BufSizeA; - callback_data.BufDirty = false; - - // We have to convert from wchar-positions to UTF-8-positions, which can be pretty slow (an incentive to ditch the ImWchar buffer, see https://github.com/nothings/stb/issues/188) - ImWchar* text = edit_state.Text.Data; - const int utf8_cursor_pos = callback_data.CursorPos = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.cursor); - const int utf8_selection_start = callback_data.SelectionStart = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.select_start); - const int utf8_selection_end = callback_data.SelectionEnd = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.select_end); - - // Call user code - callback(&callback_data); - - // Read back what user may have modified - IM_ASSERT(callback_data.Buf == edit_state.TempTextBuffer.Data); // Invalid to modify those fields - IM_ASSERT(callback_data.BufSize == edit_state.BufSizeA); - IM_ASSERT(callback_data.Flags == flags); - if (callback_data.CursorPos != utf8_cursor_pos) edit_state.StbState.cursor = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.CursorPos); - if (callback_data.SelectionStart != utf8_selection_start) edit_state.StbState.select_start = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionStart); - if (callback_data.SelectionEnd != utf8_selection_end) edit_state.StbState.select_end = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd); - if (callback_data.BufDirty) - { - IM_ASSERT(callback_data.BufTextLen == (int)strlen(callback_data.Buf)); // You need to maintain BufTextLen if you change the text! - edit_state.CurLenW = ImTextStrFromUtf8(edit_state.Text.Data, edit_state.Text.Size, callback_data.Buf, NULL); - edit_state.CurLenA = callback_data.BufTextLen; // Assume correct length and valid UTF-8 from user, saves us an extra strlen() - edit_state.CursorAnimReset(); - } - } - } - - // Copy back to user buffer - if (is_editable && strcmp(edit_state.TempTextBuffer.Data, buf) != 0) - { - ImStrncpy(buf, edit_state.TempTextBuffer.Data, buf_size); - value_changed = true; - } - } - } - - // Release active ID at the end of the function (so e.g. pressing Return still does a final application of the value) - if (clear_active_id && g.ActiveId == id) - ClearActiveID(); - - // Render - // Select which buffer we are going to display. When ImGuiInputTextFlags_NoLiveEdit is set 'buf' might still be the old value. We set buf to NULL to prevent accidental usage from now on. - const char* buf_display = (g.ActiveId == id && is_editable) ? edit_state.TempTextBuffer.Data : buf; buf = NULL; - - if (!is_multiline) - RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); - - const ImVec4 clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + size.x, frame_bb.Min.y + size.y); // Not using frame_bb.Max because we have adjusted size - ImVec2 render_pos = is_multiline ? draw_window->DC.CursorPos : frame_bb.Min + style.FramePadding; - ImVec2 text_size(0.f, 0.f); - const bool is_currently_scrolling = (edit_state.Id == id && is_multiline && g.ActiveId == draw_window->GetIDNoKeepAlive("#SCROLLY")); - if (g.ActiveId == id || is_currently_scrolling) - { - edit_state.CursorAnim += io.DeltaTime; - - // This is going to be messy. We need to: - // - Display the text (this alone can be more easily clipped) - // - Handle scrolling, highlight selection, display cursor (those all requires some form of 1d->2d cursor position calculation) - // - Measure text height (for scrollbar) - // We are attempting to do most of that in **one main pass** to minimize the computation cost (non-negligible for large amount of text) + 2nd pass for selection rendering (we could merge them by an extra refactoring effort) - // FIXME: This should occur on buf_display but we'd need to maintain cursor/select_start/select_end for UTF-8. - const ImWchar* text_begin = edit_state.Text.Data; - ImVec2 cursor_offset, select_start_offset; - - { - // Count lines + find lines numbers straddling 'cursor' and 'select_start' position. - const ImWchar* searches_input_ptr[2]; - searches_input_ptr[0] = text_begin + edit_state.StbState.cursor; - searches_input_ptr[1] = NULL; - int searches_remaining = 1; - int searches_result_line_number[2] = { -1, -999 }; - if (edit_state.StbState.select_start != edit_state.StbState.select_end) - { - searches_input_ptr[1] = text_begin + ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end); - searches_result_line_number[1] = -1; - searches_remaining++; - } - - // Iterate all lines to find our line numbers - // In multi-line mode, we never exit the loop until all lines are counted, so add one extra to the searches_remaining counter. - searches_remaining += is_multiline ? 1 : 0; - int line_count = 0; - for (const ImWchar* s = text_begin; *s != 0; s++) - if (*s == '\n') - { - line_count++; - if (searches_result_line_number[0] == -1 && s >= searches_input_ptr[0]) { searches_result_line_number[0] = line_count; if (--searches_remaining <= 0) break; } - if (searches_result_line_number[1] == -1 && s >= searches_input_ptr[1]) { searches_result_line_number[1] = line_count; if (--searches_remaining <= 0) break; } - } - line_count++; - if (searches_result_line_number[0] == -1) searches_result_line_number[0] = line_count; - if (searches_result_line_number[1] == -1) searches_result_line_number[1] = line_count; - - // Calculate 2d position by finding the beginning of the line and measuring distance - cursor_offset.x = InputTextCalcTextSizeW(ImStrbolW(searches_input_ptr[0], text_begin), searches_input_ptr[0]).x; - cursor_offset.y = searches_result_line_number[0] * g.FontSize; - if (searches_result_line_number[1] >= 0) - { - select_start_offset.x = InputTextCalcTextSizeW(ImStrbolW(searches_input_ptr[1], text_begin), searches_input_ptr[1]).x; - select_start_offset.y = searches_result_line_number[1] * g.FontSize; - } - - // Store text height (note that we haven't calculated text width at all, see GitHub issues #383, #1224) - if (is_multiline) - text_size = ImVec2(size.x, line_count * g.FontSize); - } - - // Scroll - if (edit_state.CursorFollow) - { - // Horizontal scroll in chunks of quarter width - if (!(flags & ImGuiInputTextFlags_NoHorizontalScroll)) - { - const float scroll_increment_x = size.x * 0.25f; - if (cursor_offset.x < edit_state.ScrollX) - edit_state.ScrollX = (float)(int)ImMax(0.0f, cursor_offset.x - scroll_increment_x); - else if (cursor_offset.x - size.x >= edit_state.ScrollX) - edit_state.ScrollX = (float)(int)(cursor_offset.x - size.x + scroll_increment_x); - } - else - { - edit_state.ScrollX = 0.0f; - } - - // Vertical scroll - if (is_multiline) - { - float scroll_y = draw_window->Scroll.y; - if (cursor_offset.y - g.FontSize < scroll_y) - scroll_y = ImMax(0.0f, cursor_offset.y - g.FontSize); - else if (cursor_offset.y - size.y >= scroll_y) - scroll_y = cursor_offset.y - size.y; - draw_window->DC.CursorPos.y += (draw_window->Scroll.y - scroll_y); // To avoid a frame of lag - draw_window->Scroll.y = scroll_y; - render_pos.y = draw_window->DC.CursorPos.y; - } - } - edit_state.CursorFollow = false; - const ImVec2 render_scroll = ImVec2(edit_state.ScrollX, 0.0f); - - // Draw selection - if (edit_state.StbState.select_start != edit_state.StbState.select_end) - { - const ImWchar* text_selected_begin = text_begin + ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end); - const ImWchar* text_selected_end = text_begin + ImMax(edit_state.StbState.select_start, edit_state.StbState.select_end); - - float bg_offy_up = is_multiline ? 0.0f : -1.0f; // FIXME: those offsets should be part of the style? they don't play so well with multi-line selection. - float bg_offy_dn = is_multiline ? 0.0f : 2.0f; - ImU32 bg_color = GetColorU32(ImGuiCol_TextSelectedBg); - ImVec2 rect_pos = render_pos + select_start_offset - render_scroll; - for (const ImWchar* p = text_selected_begin; p < text_selected_end; ) - { - if (rect_pos.y > clip_rect.w + g.FontSize) - break; - if (rect_pos.y < clip_rect.y) - { - while (p < text_selected_end) - if (*p++ == '\n') - break; - } - else - { - ImVec2 rect_size = InputTextCalcTextSizeW(p, text_selected_end, &p, NULL, true); - if (rect_size.x <= 0.0f) rect_size.x = (float)(int)(g.Font->GetCharAdvance((unsigned short)' ') * 0.50f); // So we can see selected empty lines - ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos +ImVec2(rect_size.x, bg_offy_dn)); - rect.ClipWith(clip_rect); - if (rect.Overlaps(clip_rect)) - draw_window->DrawList->AddRectFilled(rect.Min, rect.Max, bg_color); - } - rect_pos.x = render_pos.x - render_scroll.x; - rect_pos.y += g.FontSize; - } - } - - draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos - render_scroll, GetColorU32(ImGuiCol_Text), buf_display, buf_display + edit_state.CurLenA, 0.0f, is_multiline ? NULL : &clip_rect); - - // Draw blinking cursor - bool cursor_is_visible = (!g.IO.OptCursorBlink) || (g.InputTextState.CursorAnim <= 0.0f) || fmodf(g.InputTextState.CursorAnim, 1.20f) <= 0.80f; - ImVec2 cursor_screen_pos = render_pos + cursor_offset - render_scroll; - ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y-g.FontSize+0.5f, cursor_screen_pos.x+1.0f, cursor_screen_pos.y-1.5f); - if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect)) - draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_Text)); - - // Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.) - if (is_editable) - g.OsImePosRequest = ImVec2(cursor_screen_pos.x - 1, cursor_screen_pos.y - g.FontSize); - } - else - { - // Render text only - const char* buf_end = NULL; - if (is_multiline) - text_size = ImVec2(size.x, InputTextCalcTextLenAndLineCount(buf_display, &buf_end) * g.FontSize); // We don't need width - draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos, GetColorU32(ImGuiCol_Text), buf_display, buf_end, 0.0f, is_multiline ? NULL : &clip_rect); - } - - if (is_multiline) - { - Dummy(text_size + ImVec2(0.0f, g.FontSize)); // Always add room to scroll an extra line - EndChildFrame(); - EndGroup(); - } - - if (is_password) - PopFont(); - - // Log as text - if (g.LogEnabled && !is_password) - LogRenderedText(&render_pos, buf_display, NULL); - - if (label_size.x > 0) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); - - if ((flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0) - return enter_pressed; - else - return value_changed; -} - -bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data) -{ - IM_ASSERT(!(flags & ImGuiInputTextFlags_Multiline)); // call InputTextMultiline() - return InputTextEx(label, buf, (int)buf_size, ImVec2(0,0), flags, callback, user_data); -} - -bool ImGui::InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data) -{ - return InputTextEx(label, buf, (int)buf_size, size, flags | ImGuiInputTextFlags_Multiline, callback, user_data); -} - -// NB: scalar_format here must be a simple "%xx" format string with no prefix/suffix (unlike the Drag/Slider functions "display_format" argument) -bool ImGui::InputScalarEx(const char* label, ImGuiDataType data_type, void* data_ptr, void* step_ptr, void* step_fast_ptr, const char* scalar_format, ImGuiInputTextFlags extra_flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImVec2 label_size = CalcTextSize(label, NULL, true); - - BeginGroup(); - PushID(label); - const ImVec2 button_sz = ImVec2(GetFrameHeight(), GetFrameHeight()); - if (step_ptr) - PushItemWidth(ImMax(1.0f, CalcItemWidth() - (button_sz.x + style.ItemInnerSpacing.x)*2)); - - char buf[64]; - DataTypeFormatString(data_type, data_ptr, scalar_format, buf, IM_ARRAYSIZE(buf)); - - bool value_changed = false; - if (!(extra_flags & ImGuiInputTextFlags_CharsHexadecimal)) - extra_flags |= ImGuiInputTextFlags_CharsDecimal; - extra_flags |= ImGuiInputTextFlags_AutoSelectAll; - if (InputText("", buf, IM_ARRAYSIZE(buf), extra_flags)) // PushId(label) + "" gives us the expected ID from outside point of view - value_changed = DataTypeApplyOpFromText(buf, GImGui->InputTextState.InitialText.begin(), data_type, data_ptr, scalar_format); - - // Step buttons - if (step_ptr) - { - PopItemWidth(); - SameLine(0, style.ItemInnerSpacing.x); - if (ButtonEx("-", button_sz, ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups)) - { - DataTypeApplyOp(data_type, '-', data_ptr, g.IO.KeyCtrl && step_fast_ptr ? step_fast_ptr : step_ptr); - value_changed = true; - } - SameLine(0, style.ItemInnerSpacing.x); - if (ButtonEx("+", button_sz, ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups)) - { - DataTypeApplyOp(data_type, '+', data_ptr, g.IO.KeyCtrl && step_fast_ptr ? step_fast_ptr : step_ptr); - value_changed = true; - } - } - PopID(); - - if (label_size.x > 0) - { - SameLine(0, style.ItemInnerSpacing.x); - RenderText(ImVec2(window->DC.CursorPos.x, window->DC.CursorPos.y + style.FramePadding.y), label); - ItemSize(label_size, style.FramePadding.y); - } - EndGroup(); - - return value_changed; -} - -bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, int decimal_precision, ImGuiInputTextFlags extra_flags) -{ - char display_format[16]; - if (decimal_precision < 0) - strcpy(display_format, "%f"); // Ideally we'd have a minimum decimal precision of 1 to visually denote that this is a float, while hiding non-significant digits? %f doesn't have a minimum of 1 - else - ImFormatString(display_format, IM_ARRAYSIZE(display_format), "%%.%df", decimal_precision); - return InputScalarEx(label, ImGuiDataType_Float, (void*)v, (void*)(step>0.0f ? &step : NULL), (void*)(step_fast>0.0f ? &step_fast : NULL), display_format, extra_flags); -} - -bool ImGui::InputInt(const char* label, int* v, int step, int step_fast, ImGuiInputTextFlags extra_flags) -{ - // Hexadecimal input provided as a convenience but the flag name is awkward. Typically you'd use InputText() to parse your own data, if you want to handle prefixes. - const char* scalar_format = (extra_flags & ImGuiInputTextFlags_CharsHexadecimal) ? "%08X" : "%d"; - return InputScalarEx(label, ImGuiDataType_Int, (void*)v, (void*)(step>0.0f ? &step : NULL), (void*)(step_fast>0.0f ? &step_fast : NULL), scalar_format, extra_flags); -} - -bool ImGui::InputFloatN(const char* label, float* v, int components, int decimal_precision, ImGuiInputTextFlags extra_flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - bool value_changed = false; - BeginGroup(); - PushID(label); - PushMultiItemsWidths(components); - for (int i = 0; i < components; i++) - { - PushID(i); - value_changed |= InputFloat("##v", &v[i], 0, 0, decimal_precision, extra_flags); - SameLine(0, g.Style.ItemInnerSpacing.x); - PopID(); - PopItemWidth(); - } - PopID(); - - TextUnformatted(label, FindRenderedTextEnd(label)); - EndGroup(); - - return value_changed; -} - -bool ImGui::InputFloat2(const char* label, float v[2], int decimal_precision, ImGuiInputTextFlags extra_flags) -{ - return InputFloatN(label, v, 2, decimal_precision, extra_flags); -} - -bool ImGui::InputFloat3(const char* label, float v[3], int decimal_precision, ImGuiInputTextFlags extra_flags) -{ - return InputFloatN(label, v, 3, decimal_precision, extra_flags); -} - -bool ImGui::InputFloat4(const char* label, float v[4], int decimal_precision, ImGuiInputTextFlags extra_flags) -{ - return InputFloatN(label, v, 4, decimal_precision, extra_flags); -} - -bool ImGui::InputIntN(const char* label, int* v, int components, ImGuiInputTextFlags extra_flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - bool value_changed = false; - BeginGroup(); - PushID(label); - PushMultiItemsWidths(components); - for (int i = 0; i < components; i++) - { - PushID(i); - value_changed |= InputInt("##v", &v[i], 0, 0, extra_flags); - SameLine(0, g.Style.ItemInnerSpacing.x); - PopID(); - PopItemWidth(); - } - PopID(); - - TextUnformatted(label, FindRenderedTextEnd(label)); - EndGroup(); - - return value_changed; -} - -bool ImGui::InputInt2(const char* label, int v[2], ImGuiInputTextFlags extra_flags) -{ - return InputIntN(label, v, 2, extra_flags); -} - -bool ImGui::InputInt3(const char* label, int v[3], ImGuiInputTextFlags extra_flags) -{ - return InputIntN(label, v, 3, extra_flags); -} - -bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_flags) -{ - return InputIntN(label, v, 4, extra_flags); -} - -static float CalcMaxPopupHeightFromItemCount(int items_count) -{ - ImGuiContext& g = *GImGui; - if (items_count <= 0) - return FLT_MAX; - return (g.FontSize + g.Style.ItemSpacing.y) * items_count - g.Style.ItemSpacing.y + (g.Style.WindowPadding.y * 2); -} - -bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags) -{ - // Always consume the SetNextWindowSizeConstraint() call in our early return paths - ImGuiContext& g = *GImGui; - bool backup_has_next_window_size_constraint = g.SetNextWindowSizeConstraint; - g.SetNextWindowSizeConstraint = false; - - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const float w = CalcItemWidth(); - - const ImVec2 label_size = CalcTextSize(label, NULL, true); - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f)); - const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); - ItemSize(total_bb, style.FramePadding.y); - if (!ItemAdd(total_bb, id)) - return false; - - bool hovered, held; - bool pressed = ButtonBehavior(frame_bb, id, &hovered, &held); - bool popup_open = IsPopupOpen(id); - - const float arrow_size = GetFrameHeight(); - const ImRect value_bb(frame_bb.Min, frame_bb.Max - ImVec2(arrow_size, 0.0f)); - RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); - RenderFrame(ImVec2(frame_bb.Max.x-arrow_size, frame_bb.Min.y), frame_bb.Max, GetColorU32(popup_open || hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button), true, style.FrameRounding); // FIXME-ROUNDING - RenderTriangle(ImVec2(frame_bb.Max.x - arrow_size + style.FramePadding.y, frame_bb.Min.y + style.FramePadding.y), ImGuiDir_Down); - if (preview_value != NULL) - RenderTextClipped(frame_bb.Min + style.FramePadding, value_bb.Max, preview_value, NULL, NULL, ImVec2(0.0f,0.0f)); - if (label_size.x > 0) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); - - if (pressed && !popup_open) - { - OpenPopupEx(id, false); - popup_open = true; - } - - if (!popup_open) - return false; - - if (backup_has_next_window_size_constraint) - { - g.SetNextWindowSizeConstraint = true; - g.SetNextWindowSizeConstraintRect.Min.x = ImMax(g.SetNextWindowSizeConstraintRect.Min.x, w); - } - else - { - if ((flags & ImGuiComboFlags_HeightMask_) == 0) - flags |= ImGuiComboFlags_HeightRegular; - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiComboFlags_HeightMask_)); // Only one - int popup_max_height_in_items = -1; - if (flags & ImGuiComboFlags_HeightRegular) popup_max_height_in_items = 8; - else if (flags & ImGuiComboFlags_HeightSmall) popup_max_height_in_items = 4; - else if (flags & ImGuiComboFlags_HeightLarge) popup_max_height_in_items = 20; - SetNextWindowSizeConstraints(ImVec2(w, 0.0f), ImVec2(FLT_MAX, CalcMaxPopupHeightFromItemCount(popup_max_height_in_items))); - } - - char name[16]; - ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.CurrentPopupStack.Size); // Recycle windows based on depth - - // Peak into expected window size so we can position it - if (ImGuiWindow* popup_window = FindWindowByName(name)) - { - ImVec2 size_contents = CalcSizeContents(popup_window); - ImVec2 size_expected = CalcSizeAfterConstraint(popup_window, CalcSizeAutoFit(popup_window, size_contents)); - if (flags & ImGuiComboFlags_PopupAlignLeft) - popup_window->AutoPosLastDirection = ImGuiDir_Left; - ImVec2 pos = FindBestWindowPosForPopup(frame_bb.GetBL(), size_expected, &popup_window->AutoPosLastDirection, frame_bb, ImGuiPopupPositionPolicy_ComboBox); - SetNextWindowPos(pos); - } - - ImGuiWindowFlags window_flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings; - if (!Begin(name, NULL, window_flags)) - { - EndPopup(); - IM_ASSERT(0); // This should never happen as we tested for IsPopupOpen() above - return false; - } - - // Horizontally align ourselves with the framed text - if (style.FramePadding.x != style.WindowPadding.x) - Indent(style.FramePadding.x - style.WindowPadding.x); - - return true; -} - -void ImGui::EndCombo() -{ - const ImGuiStyle& style = GImGui->Style; - if (style.FramePadding.x != style.WindowPadding.x) - Unindent(style.FramePadding.x - style.WindowPadding.x); - EndPopup(); -} - -// Old API, prefer using BeginCombo() nowadays if you can. -bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int popup_max_height_in_items) -{ - ImGuiContext& g = *GImGui; - - const char* preview_text = NULL; - if (*current_item >= 0 && *current_item < items_count) - items_getter(data, *current_item, &preview_text); - - // The old Combo() API exposed "popup_max_height_in_items", however the new more general BeginCombo() API doesn't, so we emulate it here. - if (popup_max_height_in_items != -1 && !g.SetNextWindowSizeConstraint) - { - float popup_max_height = CalcMaxPopupHeightFromItemCount(popup_max_height_in_items); - SetNextWindowSizeConstraints(ImVec2(0,0), ImVec2(FLT_MAX, popup_max_height)); - } - - if (!BeginCombo(label, preview_text, 0)) - return false; - - // Display items - // FIXME-OPT: Use clipper (but we need to disable it on the appearing frame to make sure our call to SetItemDefaultFocus() is processed) - bool value_changed = false; - for (int i = 0; i < items_count; i++) - { - PushID((void*)(intptr_t)i); - const bool item_selected = (i == *current_item); - const char* item_text; - if (!items_getter(data, i, &item_text)) - item_text = "*Unknown item*"; - if (Selectable(item_text, item_selected)) - { - value_changed = true; - *current_item = i; - } - if (item_selected) - SetItemDefaultFocus(); - PopID(); - } - - EndCombo(); - return value_changed; -} - -static bool Items_ArrayGetter(void* data, int idx, const char** out_text) -{ - const char* const* items = (const char* const*)data; - if (out_text) - *out_text = items[idx]; - return true; -} - -static bool Items_SingleStringGetter(void* data, int idx, const char** out_text) -{ - // FIXME-OPT: we could pre-compute the indices to fasten this. But only 1 active combo means the waste is limited. - const char* items_separated_by_zeros = (const char*)data; - int items_count = 0; - const char* p = items_separated_by_zeros; - while (*p) - { - if (idx == items_count) - break; - p += strlen(p) + 1; - items_count++; - } - if (!*p) - return false; - if (out_text) - *out_text = p; - return true; -} - -// Combo box helper allowing to pass an array of strings. -bool ImGui::Combo(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items) -{ - const bool value_changed = Combo(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_in_items); - return value_changed; -} - -// Combo box helper allowing to pass all items in a single string. -bool ImGui::Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int height_in_items) -{ - int items_count = 0; - const char* p = items_separated_by_zeros; // FIXME-OPT: Avoid computing this, or at least only when combo is open - while (*p) - { - p += strlen(p) + 1; - items_count++; - } - bool value_changed = Combo(label, current_item, Items_SingleStringGetter, (void*)items_separated_by_zeros, items_count, height_in_items); - return value_changed; -} - -// Tip: pass an empty label (e.g. "##dummy") then you can use the space to draw other text or image. -// But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID. -bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - - if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.ColumnsSet) // FIXME-OPT: Avoid if vertically clipped. - PopClipRect(); - - ImGuiID id = window->GetID(label); - ImVec2 label_size = CalcTextSize(label, NULL, true); - ImVec2 size(size_arg.x != 0.0f ? size_arg.x : label_size.x, size_arg.y != 0.0f ? size_arg.y : label_size.y); - ImVec2 pos = window->DC.CursorPos; - pos.y += window->DC.CurrentLineTextBaseOffset; - ImRect bb(pos, pos + size); - ItemSize(bb); - - // Fill horizontal space. - ImVec2 window_padding = window->WindowPadding; - float max_x = (flags & ImGuiSelectableFlags_SpanAllColumns) ? GetWindowContentRegionMax().x : GetContentRegionMax().x; - float w_draw = ImMax(label_size.x, window->Pos.x + max_x - window_padding.x - window->DC.CursorPos.x); - ImVec2 size_draw((size_arg.x != 0 && !(flags & ImGuiSelectableFlags_DrawFillAvailWidth)) ? size_arg.x : w_draw, size_arg.y != 0.0f ? size_arg.y : size.y); - ImRect bb_with_spacing(pos, pos + size_draw); - if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_DrawFillAvailWidth)) - bb_with_spacing.Max.x += window_padding.x; - - // Selectables are tightly packed together, we extend the box to cover spacing between selectable. - float spacing_L = (float)(int)(style.ItemSpacing.x * 0.5f); - float spacing_U = (float)(int)(style.ItemSpacing.y * 0.5f); - float spacing_R = style.ItemSpacing.x - spacing_L; - float spacing_D = style.ItemSpacing.y - spacing_U; - bb_with_spacing.Min.x -= spacing_L; - bb_with_spacing.Min.y -= spacing_U; - bb_with_spacing.Max.x += spacing_R; - bb_with_spacing.Max.y += spacing_D; - if (!ItemAdd(bb_with_spacing, id)) - { - if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.ColumnsSet) - PushColumnClipRect(); - return false; - } - - ImGuiButtonFlags button_flags = 0; - if (flags & ImGuiSelectableFlags_Menu) button_flags |= ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_NoHoldingActiveID; - if (flags & ImGuiSelectableFlags_MenuItem) button_flags |= ImGuiButtonFlags_PressedOnRelease; - if (flags & ImGuiSelectableFlags_Disabled) button_flags |= ImGuiButtonFlags_Disabled; - if (flags & ImGuiSelectableFlags_AllowDoubleClick) button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; - bool hovered, held; - bool pressed = ButtonBehavior(bb_with_spacing, id, &hovered, &held, button_flags); - if (flags & ImGuiSelectableFlags_Disabled) - selected = false; - - // Render - if (hovered || selected) - { - const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); - RenderFrame(bb_with_spacing.Min, bb_with_spacing.Max, col, false, 0.0f); - } - - if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.ColumnsSet) - { - PushColumnClipRect(); - bb_with_spacing.Max.x -= (GetContentRegionMax().x - max_x); - } - - if (flags & ImGuiSelectableFlags_Disabled) PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]); - RenderTextClipped(bb.Min, bb_with_spacing.Max, label, NULL, &label_size, ImVec2(0.0f,0.0f)); - if (flags & ImGuiSelectableFlags_Disabled) PopStyleColor(); - - // Automatically close popups - if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_DontClosePopups) && !(window->DC.ItemFlags & ImGuiItemFlags_SelectableDontClosePopup)) - CloseCurrentPopup(); - return pressed; -} - -bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) -{ - if (Selectable(label, *p_selected, flags, size_arg)) - { - *p_selected = !*p_selected; - return true; - } - return false; -} - -// Helper to calculate the size of a listbox and display a label on the right. -// Tip: To have a list filling the entire window width, PushItemWidth(-1) and pass an empty label "##empty" -bool ImGui::ListBoxHeader(const char* label, const ImVec2& size_arg) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - const ImGuiStyle& style = GetStyle(); - const ImGuiID id = GetID(label); - const ImVec2 label_size = CalcTextSize(label, NULL, true); - - // Size default to hold ~7 items. Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar. - ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.4f + style.ItemSpacing.y); - ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y)); - ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); - ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); - window->DC.LastItemRect = bb; - - BeginGroup(); - if (label_size.x > 0) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); - - BeginChildFrame(id, frame_bb.GetSize()); - return true; -} - -bool ImGui::ListBoxHeader(const char* label, int items_count, int height_in_items) -{ - // Size default to hold ~7 items. Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar. - // However we don't add +0.40f if items_count <= height_in_items. It is slightly dodgy, because it means a dynamic list of items will make the widget resize occasionally when it crosses that size. - // I am expecting that someone will come and complain about this behavior in a remote future, then we can advise on a better solution. - if (height_in_items < 0) - height_in_items = ImMin(items_count, 7); - float height_in_items_f = height_in_items < items_count ? (height_in_items + 0.40f) : (height_in_items + 0.00f); - - // We include ItemSpacing.y so that a list sized for the exact number of items doesn't make a scrollbar appears. We could also enforce that by passing a flag to BeginChild(). - ImVec2 size; - size.x = 0.0f; - size.y = GetTextLineHeightWithSpacing() * height_in_items_f + GetStyle().ItemSpacing.y; - return ListBoxHeader(label, size); -} - -void ImGui::ListBoxFooter() -{ - ImGuiWindow* parent_window = GetCurrentWindow()->ParentWindow; - const ImRect bb = parent_window->DC.LastItemRect; - const ImGuiStyle& style = GetStyle(); - - EndChildFrame(); - - // Redeclare item size so that it includes the label (we have stored the full size in LastItemRect) - // We call SameLine() to restore DC.CurrentLine* data - SameLine(); - parent_window->DC.CursorPos = bb.Min; - ItemSize(bb, style.FramePadding.y); - EndGroup(); -} - -bool ImGui::ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_items) -{ - const bool value_changed = ListBox(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_items); - return value_changed; -} - -bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items) -{ - if (!ListBoxHeader(label, items_count, height_in_items)) - return false; - - // Assume all items have even height (= 1 line of text). If you need items of different or variable sizes you can create a custom version of ListBox() in your code without using the clipper. - bool value_changed = false; - ImGuiListClipper clipper(items_count, GetTextLineHeightWithSpacing()); // We know exactly our line height here so we pass it as a minor optimization, but generally you don't need to. - while (clipper.Step()) - for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) - { - const bool item_selected = (i == *current_item); - const char* item_text; - if (!items_getter(data, i, &item_text)) - item_text = "*Unknown item*"; - - PushID(i); - if (Selectable(item_text, item_selected)) - { - *current_item = i; - value_changed = true; - } - PopID(); - } - ListBoxFooter(); - return value_changed; -} - -bool ImGui::MenuItem(const char* label, const char* shortcut, bool selected, bool enabled) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - ImGuiStyle& style = g.Style; - ImVec2 pos = window->DC.CursorPos; - ImVec2 label_size = CalcTextSize(label, NULL, true); - - ImGuiSelectableFlags flags = ImGuiSelectableFlags_MenuItem | (enabled ? 0 : ImGuiSelectableFlags_Disabled); - bool pressed; - if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) - { - // Mimic the exact layout spacing of BeginMenu() to allow MenuItem() inside a menu bar, which is a little misleading but may be useful - // Note that in this situation we render neither the shortcut neither the selected tick mark - float w = label_size.x; - window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * 0.5f); - PushStyleVar(ImGuiStyleVar_ItemSpacing, style.ItemSpacing * 2.0f); - pressed = Selectable(label, false, flags, ImVec2(w, 0.0f)); - PopStyleVar(); - window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). - } - else - { - ImVec2 shortcut_size = shortcut ? CalcTextSize(shortcut, NULL) : ImVec2(0.0f, 0.0f); - float w = window->MenuColumns.DeclColumns(label_size.x, shortcut_size.x, (float)(int)(g.FontSize * 1.20f)); // Feedback for next frame - float extra_w = ImMax(0.0f, GetContentRegionAvail().x - w); - pressed = Selectable(label, false, flags | ImGuiSelectableFlags_DrawFillAvailWidth, ImVec2(w, 0.0f)); - if (shortcut_size.x > 0.0f) - { - PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]); - RenderText(pos + ImVec2(window->MenuColumns.Pos[1] + extra_w, 0.0f), shortcut, NULL, false); - PopStyleColor(); - } - if (selected) - RenderCheckMark(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.40f, g.FontSize * 0.134f * 0.5f), GetColorU32(enabled ? ImGuiCol_Text : ImGuiCol_TextDisabled), g.FontSize * 0.866f); - } - return pressed; -} - -bool ImGui::MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled) -{ - if (MenuItem(label, shortcut, p_selected ? *p_selected : false, enabled)) - { - if (p_selected) - *p_selected = !*p_selected; - return true; - } - return false; -} - -bool ImGui::BeginMainMenuBar() -{ - ImGuiContext& g = *GImGui; - SetNextWindowPos(ImVec2(0.0f, 0.0f)); - SetNextWindowSize(ImVec2(g.IO.DisplaySize.x, g.FontBaseSize + g.Style.FramePadding.y * 2.0f)); - PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); - PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0,0)); - if (!Begin("##MainMenuBar", NULL, ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoSavedSettings|ImGuiWindowFlags_MenuBar) - || !BeginMenuBar()) - { - End(); - PopStyleVar(2); - return false; - } - g.CurrentWindow->DC.MenuBarOffsetX += g.Style.DisplaySafeAreaPadding.x; - return true; -} - -void ImGui::EndMainMenuBar() -{ - EndMenuBar(); - End(); - PopStyleVar(2); -} - -bool ImGui::BeginMenuBar() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - if (!(window->Flags & ImGuiWindowFlags_MenuBar)) - return false; - - IM_ASSERT(!window->DC.MenuBarAppending); - BeginGroup(); // Save position - PushID("##menubar"); - - // We don't clip with regular window clipping rectangle as it is already set to the area below. However we clip with window full rect. - // We remove 1 worth of rounding to Max.x to that text in long menus don't tend to display over the lower-right rounded area, which looks particularly glitchy. - ImRect bar_rect = window->MenuBarRect(); - ImRect clip_rect(ImFloor(bar_rect.Min.x + 0.5f), ImFloor(bar_rect.Min.y + window->WindowBorderSize + 0.5f), ImFloor(ImMax(bar_rect.Min.x, bar_rect.Max.x - window->WindowRounding) + 0.5f), ImFloor(bar_rect.Max.y + 0.5f)); - clip_rect.ClipWith(window->Rect()); - PushClipRect(clip_rect.Min, clip_rect.Max, false); - - window->DC.CursorPos = ImVec2(bar_rect.Min.x + window->DC.MenuBarOffsetX, bar_rect.Min.y);// + g.Style.FramePadding.y); - window->DC.LayoutType = ImGuiLayoutType_Horizontal; - window->DC.MenuBarAppending = true; - AlignTextToFramePadding(); - return true; -} - -void ImGui::EndMenuBar() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - IM_ASSERT(window->Flags & ImGuiWindowFlags_MenuBar); - IM_ASSERT(window->DC.MenuBarAppending); - PopClipRect(); - PopID(); - window->DC.MenuBarOffsetX = window->DC.CursorPos.x - window->MenuBarRect().Min.x; - window->DC.GroupStack.back().AdvanceCursor = false; - EndGroup(); - window->DC.LayoutType = ImGuiLayoutType_Vertical; - window->DC.MenuBarAppending = false; -} - -bool ImGui::BeginMenu(const char* label, bool enabled) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - - ImVec2 label_size = CalcTextSize(label, NULL, true); - - bool pressed; - bool menu_is_open = IsPopupOpen(id); - bool menuset_is_open = !(window->Flags & ImGuiWindowFlags_Popup) && (g.OpenPopupStack.Size > g.CurrentPopupStack.Size && g.OpenPopupStack[g.CurrentPopupStack.Size].ParentMenuSet == window->GetID("##Menus")); - ImGuiWindow* backed_nav_window = g.NavWindow; - if (menuset_is_open) - g.NavWindow = window; // Odd hack to allow hovering across menus of a same menu-set (otherwise we wouldn't be able to hover parent) - - // The reference position stored in popup_pos will be used by Begin() to find a suitable position for the child menu (using FindBestPopupWindowPos). - ImVec2 popup_pos, pos = window->DC.CursorPos; - if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) - { - // Menu inside an horizontal menu bar - // Selectable extend their highlight by half ItemSpacing in each direction. - // For ChildMenu, the popup position will be overwritten by the call to FindBestPopupWindowPos() in Begin() - popup_pos = ImVec2(pos.x - window->WindowPadding.x, pos.y - style.FramePadding.y + window->MenuBarHeight()); - window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * 0.5f); - PushStyleVar(ImGuiStyleVar_ItemSpacing, style.ItemSpacing * 2.0f); - float w = label_size.x; - pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_Menu | ImGuiSelectableFlags_DontClosePopups | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f)); - PopStyleVar(); - window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). - } - else - { - // Menu inside a menu - popup_pos = ImVec2(pos.x, pos.y - style.WindowPadding.y); - float w = window->MenuColumns.DeclColumns(label_size.x, 0.0f, (float)(int)(g.FontSize * 1.20f)); // Feedback to next frame - float extra_w = ImMax(0.0f, GetContentRegionAvail().x - w); - pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_Menu | ImGuiSelectableFlags_DontClosePopups | ImGuiSelectableFlags_DrawFillAvailWidth | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f)); - if (!enabled) PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]); - RenderTriangle(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.30f, 0.0f), ImGuiDir_Right); - if (!enabled) PopStyleColor(); - } - - const bool hovered = enabled && ItemHoverable(window->DC.LastItemRect, id); - if (menuset_is_open) - g.NavWindow = backed_nav_window; - - bool want_open = false, want_close = false; - if (window->DC.LayoutType != ImGuiLayoutType_Horizontal) // (window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu)) - { - // Implement http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown to avoid using timers, so menus feels more reactive. - bool moving_within_opened_triangle = false; - if (g.HoveredWindow == window && g.OpenPopupStack.Size > g.CurrentPopupStack.Size && g.OpenPopupStack[g.CurrentPopupStack.Size].ParentWindow == window) - { - if (ImGuiWindow* next_window = g.OpenPopupStack[g.CurrentPopupStack.Size].Window) - { - ImRect next_window_rect = next_window->Rect(); - ImVec2 ta = g.IO.MousePos - g.IO.MouseDelta; - ImVec2 tb = (window->Pos.x < next_window->Pos.x) ? next_window_rect.GetTL() : next_window_rect.GetTR(); - ImVec2 tc = (window->Pos.x < next_window->Pos.x) ? next_window_rect.GetBL() : next_window_rect.GetBR(); - float extra = ImClamp(fabsf(ta.x - tb.x) * 0.30f, 5.0f, 30.0f); // add a bit of extra slack. - ta.x += (window->Pos.x < next_window->Pos.x) ? -0.5f : +0.5f; // to avoid numerical issues - tb.y = ta.y + ImMax((tb.y - extra) - ta.y, -100.0f); // triangle is maximum 200 high to limit the slope and the bias toward large sub-menus // FIXME: Multiply by fb_scale? - tc.y = ta.y + ImMin((tc.y + extra) - ta.y, +100.0f); - moving_within_opened_triangle = ImTriangleContainsPoint(ta, tb, tc, g.IO.MousePos); - //window->DrawList->PushClipRectFullScreen(); window->DrawList->AddTriangleFilled(ta, tb, tc, moving_within_opened_triangle ? IM_COL32(0,128,0,128) : IM_COL32(128,0,0,128)); window->DrawList->PopClipRect(); // Debug - } - } - - want_close = (menu_is_open && !hovered && g.HoveredWindow == window && g.HoveredIdPreviousFrame != 0 && g.HoveredIdPreviousFrame != id && !moving_within_opened_triangle); - want_open = (!menu_is_open && hovered && !moving_within_opened_triangle) || (!menu_is_open && hovered && pressed); - } - else - { - // Menu bar - if (menu_is_open && pressed && menuset_is_open) // Click an open menu again to close it - { - want_close = true; - want_open = menu_is_open = false; - } - else if (pressed || (hovered && menuset_is_open && !menu_is_open)) // First click to open, then hover to open others - { - want_open = true; - } - } - - if (!enabled) // explicitly close if an open menu becomes disabled, facilitate users code a lot in pattern such as 'if (BeginMenu("options", has_object)) { ..use object.. }' - want_close = true; - if (want_close && IsPopupOpen(id)) - ClosePopupToLevel(GImGui->CurrentPopupStack.Size); - - if (!menu_is_open && want_open && g.OpenPopupStack.Size > g.CurrentPopupStack.Size) - { - // Don't recycle same menu level in the same frame, first close the other menu and yield for a frame. - OpenPopup(label); - return false; - } - - menu_is_open |= want_open; - if (want_open) - OpenPopup(label); - - if (menu_is_open) - { - SetNextWindowPos(popup_pos, ImGuiCond_Always); - ImGuiWindowFlags flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings | ((window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu)) ? ImGuiWindowFlags_ChildMenu|ImGuiWindowFlags_ChildWindow : ImGuiWindowFlags_ChildMenu); - menu_is_open = BeginPopupEx(id, flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display) - } - - return menu_is_open; -} - -void ImGui::EndMenu() -{ - EndPopup(); -} - -// Note: only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. -void ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags) -{ - ImGuiContext& g = *GImGui; - - int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]); - BeginTooltipEx(0, true); - - const char* text_end = text ? FindRenderedTextEnd(text, NULL) : text; - if (text_end > text) - { - TextUnformatted(text, text_end); - Separator(); - } - - ImVec2 sz(g.FontSize * 3 + g.Style.FramePadding.y * 2, g.FontSize * 3 + g.Style.FramePadding.y * 2); - ColorButton("##preview", ImVec4(col[0], col[1], col[2], col[3]), (flags & (ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)) | ImGuiColorEditFlags_NoTooltip, sz); - SameLine(); - if (flags & ImGuiColorEditFlags_NoAlpha) - Text("#%02X%02X%02X\nR: %d, G: %d, B: %d\n(%.3f, %.3f, %.3f)", cr, cg, cb, cr, cg, cb, col[0], col[1], col[2]); - else - Text("#%02X%02X%02X%02X\nR:%d, G:%d, B:%d, A:%d\n(%.3f, %.3f, %.3f, %.3f)", cr, cg, cb, ca, cr, cg, cb, ca, col[0], col[1], col[2], col[3]); - EndTooltip(); -} - -static inline ImU32 ImAlphaBlendColor(ImU32 col_a, ImU32 col_b) -{ - float t = ((col_b >> IM_COL32_A_SHIFT) & 0xFF) / 255.f; - int r = ImLerp((int)(col_a >> IM_COL32_R_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_R_SHIFT) & 0xFF, t); - int g = ImLerp((int)(col_a >> IM_COL32_G_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_G_SHIFT) & 0xFF, t); - int b = ImLerp((int)(col_a >> IM_COL32_B_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_B_SHIFT) & 0xFF, t); - return IM_COL32(r, g, b, 0xFF); -} - -// NB: This is rather brittle and will show artifact when rounding this enabled if rounded corners overlap multiple cells. Caller currently responsible for avoiding that. -// I spent a non reasonable amount of time trying to getting this right for ColorButton with rounding+anti-aliasing+ImGuiColorEditFlags_HalfAlphaPreview flag + various grid sizes and offsets, and eventually gave up... probably more reasonable to disable rounding alltogether. -void ImGui::RenderColorRectWithAlphaCheckerboard(ImVec2 p_min, ImVec2 p_max, ImU32 col, float grid_step, ImVec2 grid_off, float rounding, int rounding_corners_flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (((col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT) < 0xFF) - { - ImU32 col_bg1 = GetColorU32(ImAlphaBlendColor(IM_COL32(204,204,204,255), col)); - ImU32 col_bg2 = GetColorU32(ImAlphaBlendColor(IM_COL32(128,128,128,255), col)); - window->DrawList->AddRectFilled(p_min, p_max, col_bg1, rounding, rounding_corners_flags); - - int yi = 0; - for (float y = p_min.y + grid_off.y; y < p_max.y; y += grid_step, yi++) - { - float y1 = ImClamp(y, p_min.y, p_max.y), y2 = ImMin(y + grid_step, p_max.y); - if (y2 <= y1) - continue; - for (float x = p_min.x + grid_off.x + (yi & 1) * grid_step; x < p_max.x; x += grid_step * 2.0f) - { - float x1 = ImClamp(x, p_min.x, p_max.x), x2 = ImMin(x + grid_step, p_max.x); - if (x2 <= x1) - continue; - int rounding_corners_flags_cell = 0; - if (y1 <= p_min.y) { if (x1 <= p_min.x) rounding_corners_flags_cell |= ImDrawCornerFlags_TopLeft; if (x2 >= p_max.x) rounding_corners_flags_cell |= ImDrawCornerFlags_TopRight; } - if (y2 >= p_max.y) { if (x1 <= p_min.x) rounding_corners_flags_cell |= ImDrawCornerFlags_BotLeft; if (x2 >= p_max.x) rounding_corners_flags_cell |= ImDrawCornerFlags_BotRight; } - rounding_corners_flags_cell &= rounding_corners_flags; - window->DrawList->AddRectFilled(ImVec2(x1,y1), ImVec2(x2,y2), col_bg2, rounding_corners_flags_cell ? rounding : 0.0f, rounding_corners_flags_cell); - } - } - } - else - { - window->DrawList->AddRectFilled(p_min, p_max, col, rounding, rounding_corners_flags); - } -} - -void ImGui::SetColorEditOptions(ImGuiColorEditFlags flags) -{ - ImGuiContext& g = *GImGui; - if ((flags & ImGuiColorEditFlags__InputsMask) == 0) - flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__InputsMask; - if ((flags & ImGuiColorEditFlags__DataTypeMask) == 0) - flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__DataTypeMask; - if ((flags & ImGuiColorEditFlags__PickerMask) == 0) - flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__PickerMask; - IM_ASSERT(ImIsPowerOfTwo((int)(flags & ImGuiColorEditFlags__InputsMask))); // Check only 1 option is selected - IM_ASSERT(ImIsPowerOfTwo((int)(flags & ImGuiColorEditFlags__DataTypeMask))); // Check only 1 option is selected - IM_ASSERT(ImIsPowerOfTwo((int)(flags & ImGuiColorEditFlags__PickerMask))); // Check only 1 option is selected - g.ColorEditOptions = flags; -} - -// A little colored square. Return true when clicked. -// FIXME: May want to display/ignore the alpha component in the color display? Yet show it in the tooltip. -// 'desc_id' is not called 'label' because we don't display it next to the button, but only in the tooltip. -bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags, ImVec2 size) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiID id = window->GetID(desc_id); - float default_size = GetFrameHeight(); - if (size.x == 0.0f) - size.x = default_size; - if (size.y == 0.0f) - size.y = default_size; - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); - ItemSize(bb, (size.y >= default_size) ? g.Style.FramePadding.y : 0.0f); - if (!ItemAdd(bb, id)) - return false; - - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held); - - if (flags & ImGuiColorEditFlags_NoAlpha) - flags &= ~(ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf); - - ImVec4 col_without_alpha(col.x, col.y, col.z, 1.0f); - float grid_step = ImMin(size.x, size.y) / 2.99f; - float rounding = ImMin(g.Style.FrameRounding, grid_step * 0.5f); - ImRect bb_inner = bb; - float off = -0.75f; // The border (using Col_FrameBg) tends to look off when color is near-opaque and rounding is enabled. This offset seemed like a good middle ground to reduce those artifacts. - bb_inner.Expand(off); - if ((flags & ImGuiColorEditFlags_AlphaPreviewHalf) && col.w < 1.0f) - { - float mid_x = (float)(int)((bb_inner.Min.x + bb_inner.Max.x) * 0.5f + 0.5f); - RenderColorRectWithAlphaCheckerboard(ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col), grid_step, ImVec2(-grid_step + off, off), rounding, ImDrawCornerFlags_TopRight| ImDrawCornerFlags_BotRight); - window->DrawList->AddRectFilled(bb_inner.Min, ImVec2(mid_x, bb_inner.Max.y), GetColorU32(col_without_alpha), rounding, ImDrawCornerFlags_TopLeft|ImDrawCornerFlags_BotLeft); - } - else - { - // Because GetColorU32() multiplies by the global style Alpha and we don't want to display a checkerboard if the source code had no alpha - ImVec4 col_source = (flags & ImGuiColorEditFlags_AlphaPreview) ? col : col_without_alpha; - if (col_source.w < 1.0f) - RenderColorRectWithAlphaCheckerboard(bb_inner.Min, bb_inner.Max, GetColorU32(col_source), grid_step, ImVec2(off, off), rounding); - else - window->DrawList->AddRectFilled(bb_inner.Min, bb_inner.Max, GetColorU32(col_source), rounding, ImDrawCornerFlags_All); - } - if (g.Style.FrameBorderSize > 0.0f) - RenderFrameBorder(bb.Min, bb.Max, rounding); - else - window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), rounding); // Color button are often in need of some sort of border - - // Drag and Drop Source - if (g.ActiveId == id && BeginDragDropSource()) // NB: The ActiveId test is merely an optional micro-optimization - { - if (flags & ImGuiColorEditFlags_NoAlpha) - SetDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F, &col, sizeof(float) * 3, ImGuiCond_Once); - else - SetDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F, &col, sizeof(float) * 4, ImGuiCond_Once); - ColorButton(desc_id, col, flags); - SameLine(); - TextUnformatted("Color"); - EndDragDropSource(); - hovered = false; - } - - // Tooltip - if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered) - ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)); - - return pressed; -} - -bool ImGui::ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags) -{ - return ColorEdit4(label, col, flags | ImGuiColorEditFlags_NoAlpha); -} - -void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags) -{ - bool allow_opt_inputs = !(flags & ImGuiColorEditFlags__InputsMask); - bool allow_opt_datatype = !(flags & ImGuiColorEditFlags__DataTypeMask); - if ((!allow_opt_inputs && !allow_opt_datatype) || !BeginPopup("context")) - return; - ImGuiContext& g = *GImGui; - ImGuiColorEditFlags opts = g.ColorEditOptions; - if (allow_opt_inputs) - { - if (RadioButton("RGB", (opts & ImGuiColorEditFlags_RGB) ? 1 : 0)) opts = (opts & ~ImGuiColorEditFlags__InputsMask) | ImGuiColorEditFlags_RGB; - if (RadioButton("HSV", (opts & ImGuiColorEditFlags_HSV) ? 1 : 0)) opts = (opts & ~ImGuiColorEditFlags__InputsMask) | ImGuiColorEditFlags_HSV; - if (RadioButton("HEX", (opts & ImGuiColorEditFlags_HEX) ? 1 : 0)) opts = (opts & ~ImGuiColorEditFlags__InputsMask) | ImGuiColorEditFlags_HEX; - } - if (allow_opt_datatype) - { - if (allow_opt_inputs) Separator(); - if (RadioButton("0..255", (opts & ImGuiColorEditFlags_Uint8) ? 1 : 0)) opts = (opts & ~ImGuiColorEditFlags__DataTypeMask) | ImGuiColorEditFlags_Uint8; - if (RadioButton("0.00..1.00", (opts & ImGuiColorEditFlags_Float) ? 1 : 0)) opts = (opts & ~ImGuiColorEditFlags__DataTypeMask) | ImGuiColorEditFlags_Float; - } - - if (allow_opt_inputs || allow_opt_datatype) - Separator(); - if (Button("Copy as..", ImVec2(-1,0))) - OpenPopup("Copy"); - if (BeginPopup("Copy")) - { - int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]); - char buf[64]; - ImFormatString(buf, IM_ARRAYSIZE(buf), "(%.3ff, %.3ff, %.3ff, %.3ff)", col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]); - if (Selectable(buf)) - SetClipboardText(buf); - ImFormatString(buf, IM_ARRAYSIZE(buf), "(%d,%d,%d,%d)", cr, cg, cb, ca); - if (Selectable(buf)) - SetClipboardText(buf); - if (flags & ImGuiColorEditFlags_NoAlpha) - ImFormatString(buf, IM_ARRAYSIZE(buf), "0x%02X%02X%02X", cr, cg, cb); - else - ImFormatString(buf, IM_ARRAYSIZE(buf), "0x%02X%02X%02X%02X", cr, cg, cb, ca); - if (Selectable(buf)) - SetClipboardText(buf); - EndPopup(); - } - - g.ColorEditOptions = opts; - EndPopup(); -} - -static void ColorPickerOptionsPopup(ImGuiColorEditFlags flags, const float* ref_col) -{ - bool allow_opt_picker = !(flags & ImGuiColorEditFlags__PickerMask); - bool allow_opt_alpha_bar = !(flags & ImGuiColorEditFlags_NoAlpha) && !(flags & ImGuiColorEditFlags_AlphaBar); - if ((!allow_opt_picker && !allow_opt_alpha_bar) || !ImGui::BeginPopup("context")) - return; - ImGuiContext& g = *GImGui; - if (allow_opt_picker) - { - ImVec2 picker_size(g.FontSize * 8, ImMax(g.FontSize * 8 - (ImGui::GetFrameHeight() + g.Style.ItemInnerSpacing.x), 1.0f)); // FIXME: Picker size copied from main picker function - ImGui::PushItemWidth(picker_size.x); - for (int picker_type = 0; picker_type < 2; picker_type++) - { - // Draw small/thumbnail version of each picker type (over an invisible button for selection) - if (picker_type > 0) ImGui::Separator(); - ImGui::PushID(picker_type); - ImGuiColorEditFlags picker_flags = ImGuiColorEditFlags_NoInputs|ImGuiColorEditFlags_NoOptions|ImGuiColorEditFlags_NoLabel|ImGuiColorEditFlags_NoSidePreview|(flags & ImGuiColorEditFlags_NoAlpha); - if (picker_type == 0) picker_flags |= ImGuiColorEditFlags_PickerHueBar; - if (picker_type == 1) picker_flags |= ImGuiColorEditFlags_PickerHueWheel; - ImVec2 backup_pos = ImGui::GetCursorScreenPos(); - if (ImGui::Selectable("##selectable", false, 0, picker_size)) // By default, Selectable() is closing popup - g.ColorEditOptions = (g.ColorEditOptions & ~ImGuiColorEditFlags__PickerMask) | (picker_flags & ImGuiColorEditFlags__PickerMask); - ImGui::SetCursorScreenPos(backup_pos); - ImVec4 dummy_ref_col; - memcpy(&dummy_ref_col.x, ref_col, sizeof(float) * (picker_flags & ImGuiColorEditFlags_NoAlpha ? 3 : 4)); - ImGui::ColorPicker4("##dummypicker", &dummy_ref_col.x, picker_flags); - ImGui::PopID(); - } - ImGui::PopItemWidth(); - } - if (allow_opt_alpha_bar) - { - if (allow_opt_picker) ImGui::Separator(); - ImGui::CheckboxFlags("Alpha Bar", (unsigned int*)&g.ColorEditOptions, ImGuiColorEditFlags_AlphaBar); - } - ImGui::EndPopup(); -} - -// Edit colors components (each component in 0.0f..1.0f range). -// See enum ImGuiColorEditFlags_ for available options. e.g. Only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. -// With typical options: Left-click on colored square to open color picker. Right-click to open option menu. CTRL-Click over input fields to edit them and TAB to go to next item. -bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const float square_sz = GetFrameHeight(); - const float w_extra = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x); - const float w_items_all = CalcItemWidth() - w_extra; - const char* label_display_end = FindRenderedTextEnd(label); - - const bool alpha = (flags & ImGuiColorEditFlags_NoAlpha) == 0; - const bool hdr = (flags & ImGuiColorEditFlags_HDR) != 0; - const int components = alpha ? 4 : 3; - const ImGuiColorEditFlags flags_untouched = flags; - - BeginGroup(); - PushID(label); - - // If we're not showing any slider there's no point in doing any HSV conversions - if (flags & ImGuiColorEditFlags_NoInputs) - flags = (flags & (~ImGuiColorEditFlags__InputsMask)) | ImGuiColorEditFlags_RGB | ImGuiColorEditFlags_NoOptions; - - // Context menu: display and modify options (before defaults are applied) - if (!(flags & ImGuiColorEditFlags_NoOptions)) - ColorEditOptionsPopup(col, flags); - - // Read stored options - if (!(flags & ImGuiColorEditFlags__InputsMask)) - flags |= (g.ColorEditOptions & ImGuiColorEditFlags__InputsMask); - if (!(flags & ImGuiColorEditFlags__DataTypeMask)) - flags |= (g.ColorEditOptions & ImGuiColorEditFlags__DataTypeMask); - if (!(flags & ImGuiColorEditFlags__PickerMask)) - flags |= (g.ColorEditOptions & ImGuiColorEditFlags__PickerMask); - flags |= (g.ColorEditOptions & ~(ImGuiColorEditFlags__InputsMask | ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__PickerMask)); - - // Convert to the formats we need - float f[4] = { col[0], col[1], col[2], alpha ? col[3] : 1.0f }; - if (flags & ImGuiColorEditFlags_HSV) - ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]); - int i[4] = { IM_F32_TO_INT8_UNBOUND(f[0]), IM_F32_TO_INT8_UNBOUND(f[1]), IM_F32_TO_INT8_UNBOUND(f[2]), IM_F32_TO_INT8_UNBOUND(f[3]) }; - - bool value_changed = false; - bool value_changed_as_float = false; - - if ((flags & (ImGuiColorEditFlags_RGB | ImGuiColorEditFlags_HSV)) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) - { - // RGB/HSV 0..255 Sliders - const float w_item_one = ImMax(1.0f, (float)(int)((w_items_all - (style.ItemInnerSpacing.x) * (components-1)) / (float)components)); - const float w_item_last = ImMax(1.0f, (float)(int)(w_items_all - (w_item_one + style.ItemInnerSpacing.x) * (components-1))); - - const bool hide_prefix = (w_item_one <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x); - const char* ids[4] = { "##X", "##Y", "##Z", "##W" }; - const char* fmt_table_int[3][4] = - { - { "%3.0f", "%3.0f", "%3.0f", "%3.0f" }, // Short display - { "R:%3.0f", "G:%3.0f", "B:%3.0f", "A:%3.0f" }, // Long display for RGBA - { "H:%3.0f", "S:%3.0f", "V:%3.0f", "A:%3.0f" } // Long display for HSVA - }; - const char* fmt_table_float[3][4] = - { - { "%0.3f", "%0.3f", "%0.3f", "%0.3f" }, // Short display - { "R:%0.3f", "G:%0.3f", "B:%0.3f", "A:%0.3f" }, // Long display for RGBA - { "H:%0.3f", "S:%0.3f", "V:%0.3f", "A:%0.3f" } // Long display for HSVA - }; - const int fmt_idx = hide_prefix ? 0 : (flags & ImGuiColorEditFlags_HSV) ? 2 : 1; - - PushItemWidth(w_item_one); - for (int n = 0; n < components; n++) - { - if (n > 0) - SameLine(0, style.ItemInnerSpacing.x); - if (n + 1 == components) - PushItemWidth(w_item_last); - if (flags & ImGuiColorEditFlags_Float) - value_changed = value_changed_as_float = value_changed | DragFloat(ids[n], &f[n], 1.0f/255.0f, 0.0f, hdr ? 0.0f : 1.0f, fmt_table_float[fmt_idx][n]); - else - value_changed |= DragInt(ids[n], &i[n], 1.0f, 0, hdr ? 0 : 255, fmt_table_int[fmt_idx][n]); - if (!(flags & ImGuiColorEditFlags_NoOptions)) - OpenPopupOnItemClick("context"); - } - PopItemWidth(); - PopItemWidth(); - } - else if ((flags & ImGuiColorEditFlags_HEX) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) - { - // RGB Hexadecimal Input - char buf[64]; - if (alpha) - ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", ImClamp(i[0],0,255), ImClamp(i[1],0,255), ImClamp(i[2],0,255), ImClamp(i[3],0,255)); - else - ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", ImClamp(i[0],0,255), ImClamp(i[1],0,255), ImClamp(i[2],0,255)); - PushItemWidth(w_items_all); - if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase)) - { - value_changed = true; - char* p = buf; - while (*p == '#' || ImCharIsSpace(*p)) - p++; - i[0] = i[1] = i[2] = i[3] = 0; - if (alpha) - sscanf(p, "%02X%02X%02X%02X", (unsigned int*)&i[0], (unsigned int*)&i[1], (unsigned int*)&i[2], (unsigned int*)&i[3]); // Treat at unsigned (%X is unsigned) - else - sscanf(p, "%02X%02X%02X", (unsigned int*)&i[0], (unsigned int*)&i[1], (unsigned int*)&i[2]); - } - if (!(flags & ImGuiColorEditFlags_NoOptions)) - OpenPopupOnItemClick("context"); - PopItemWidth(); - } - - ImGuiWindow* picker_active_window = NULL; - if (!(flags & ImGuiColorEditFlags_NoSmallPreview)) - { - if (!(flags & ImGuiColorEditFlags_NoInputs)) - SameLine(0, style.ItemInnerSpacing.x); - - const ImVec4 col_v4(col[0], col[1], col[2], alpha ? col[3] : 1.0f); - if (ColorButton("##ColorButton", col_v4, flags)) - { - if (!(flags & ImGuiColorEditFlags_NoPicker)) - { - // Store current color and open a picker - g.ColorPickerRef = col_v4; - OpenPopup("picker"); - SetNextWindowPos(window->DC.LastItemRect.GetBL() + ImVec2(-1,style.ItemSpacing.y)); - } - } - if (!(flags & ImGuiColorEditFlags_NoOptions)) - OpenPopupOnItemClick("context"); - - if (BeginPopup("picker")) - { - picker_active_window = g.CurrentWindow; - if (label != label_display_end) - { - TextUnformatted(label, label_display_end); - Separator(); - } - ImGuiColorEditFlags picker_flags_to_forward = ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__PickerMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaBar; - ImGuiColorEditFlags picker_flags = (flags_untouched & picker_flags_to_forward) | ImGuiColorEditFlags__InputsMask | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_AlphaPreviewHalf; - PushItemWidth(square_sz * 12.0f); // Use 256 + bar sizes? - value_changed |= ColorPicker4("##picker", col, picker_flags, &g.ColorPickerRef.x); - PopItemWidth(); - EndPopup(); - } - } - - if (label != label_display_end && !(flags & ImGuiColorEditFlags_NoLabel)) - { - SameLine(0, style.ItemInnerSpacing.x); - TextUnformatted(label, label_display_end); - } - - // Convert back - if (picker_active_window == NULL) - { - if (!value_changed_as_float) - for (int n = 0; n < 4; n++) - f[n] = i[n] / 255.0f; - if (flags & ImGuiColorEditFlags_HSV) - ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]); - if (value_changed) - { - col[0] = f[0]; - col[1] = f[1]; - col[2] = f[2]; - if (alpha) - col[3] = f[3]; - } - } - - PopID(); - EndGroup(); - - // Drag and Drop Target - if (window->DC.LastItemRectHoveredRect && BeginDragDropTarget()) // NB: The LastItemRectHoveredRect test is merely an optional micro-optimization - { - if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) - { - memcpy((float*)col, payload->Data, sizeof(float) * 3); - value_changed = true; - } - if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F)) - { - memcpy((float*)col, payload->Data, sizeof(float) * components); - value_changed = true; - } - EndDragDropTarget(); - } - - // When picker is being actively used, use its active id so IsItemActive() will function on ColorEdit4(). - if (picker_active_window && g.ActiveId != 0 && g.ActiveIdWindow == picker_active_window) - window->DC.LastItemId = g.ActiveId; - - return value_changed; -} - -bool ImGui::ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags) -{ - float col4[4] = { col[0], col[1], col[2], 1.0f }; - if (!ColorPicker4(label, col4, flags | ImGuiColorEditFlags_NoAlpha)) - return false; - col[0] = col4[0]; col[1] = col4[1]; col[2] = col4[2]; - return true; -} - -// 'pos' is position of the arrow tip. half_sz.x is length from base to tip. half_sz.y is length on each side. -static void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col) -{ - switch (direction) - { - case ImGuiDir_Left: draw_list->AddTriangleFilled(ImVec2(pos.x + half_sz.x, pos.y - half_sz.y), ImVec2(pos.x + half_sz.x, pos.y + half_sz.y), pos, col); return; - case ImGuiDir_Right: draw_list->AddTriangleFilled(ImVec2(pos.x - half_sz.x, pos.y + half_sz.y), ImVec2(pos.x - half_sz.x, pos.y - half_sz.y), pos, col); return; - case ImGuiDir_Up: draw_list->AddTriangleFilled(ImVec2(pos.x + half_sz.x, pos.y + half_sz.y), ImVec2(pos.x - half_sz.x, pos.y + half_sz.y), pos, col); return; - case ImGuiDir_Down: draw_list->AddTriangleFilled(ImVec2(pos.x - half_sz.x, pos.y - half_sz.y), ImVec2(pos.x + half_sz.x, pos.y - half_sz.y), pos, col); return; - case ImGuiDir_None: case ImGuiDir_Count_: break; // Fix warnings - } -} - -static void RenderArrowsForVerticalBar(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, float bar_w) -{ - RenderArrow(draw_list, ImVec2(pos.x + half_sz.x + 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Right, IM_COL32_BLACK); - RenderArrow(draw_list, ImVec2(pos.x + half_sz.x, pos.y), half_sz, ImGuiDir_Right, IM_COL32_WHITE); - RenderArrow(draw_list, ImVec2(pos.x + bar_w - half_sz.x - 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Left, IM_COL32_BLACK); - RenderArrow(draw_list, ImVec2(pos.x + bar_w - half_sz.x, pos.y), half_sz, ImGuiDir_Left, IM_COL32_WHITE); -} - -// ColorPicker -// Note: only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. -// FIXME: we adjust the big color square height based on item width, which may cause a flickering feedback loop (if automatic height makes a vertical scrollbar appears, affecting automatic width..) -bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags, const float* ref_col) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - ImDrawList* draw_list = window->DrawList; - - ImGuiStyle& style = g.Style; - ImGuiIO& io = g.IO; - - PushID(label); - BeginGroup(); - - if (!(flags & ImGuiColorEditFlags_NoSidePreview)) - flags |= ImGuiColorEditFlags_NoSmallPreview; - - // Context menu: display and store options. - if (!(flags & ImGuiColorEditFlags_NoOptions)) - ColorPickerOptionsPopup(flags, col); - - // Read stored options - if (!(flags & ImGuiColorEditFlags__PickerMask)) - flags |= ((g.ColorEditOptions & ImGuiColorEditFlags__PickerMask) ? g.ColorEditOptions : ImGuiColorEditFlags__OptionsDefault) & ImGuiColorEditFlags__PickerMask; - IM_ASSERT(ImIsPowerOfTwo((int)(flags & ImGuiColorEditFlags__PickerMask))); // Check that only 1 is selected - if (!(flags & ImGuiColorEditFlags_NoOptions)) - flags |= (g.ColorEditOptions & ImGuiColorEditFlags_AlphaBar); - - // Setup - int components = (flags & ImGuiColorEditFlags_NoAlpha) ? 3 : 4; - bool alpha_bar = (flags & ImGuiColorEditFlags_AlphaBar) && !(flags & ImGuiColorEditFlags_NoAlpha); - ImVec2 picker_pos = window->DC.CursorPos; - float square_sz = GetFrameHeight(); - float bars_width = square_sz; // Arbitrary smallish width of Hue/Alpha picking bars - float sv_picker_size = ImMax(bars_width * 1, CalcItemWidth() - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box - float bar0_pos_x = picker_pos.x + sv_picker_size + style.ItemInnerSpacing.x; - float bar1_pos_x = bar0_pos_x + bars_width + style.ItemInnerSpacing.x; - float bars_triangles_half_sz = (float)(int)(bars_width * 0.20f); - - float backup_initial_col[4]; - memcpy(backup_initial_col, col, components * sizeof(float)); - - float wheel_thickness = sv_picker_size * 0.08f; - float wheel_r_outer = sv_picker_size * 0.50f; - float wheel_r_inner = wheel_r_outer - wheel_thickness; - ImVec2 wheel_center(picker_pos.x + (sv_picker_size + bars_width)*0.5f, picker_pos.y + sv_picker_size*0.5f); - - // Note: the triangle is displayed rotated with triangle_pa pointing to Hue, but most coordinates stays unrotated for logic. - float triangle_r = wheel_r_inner - (int)(sv_picker_size * 0.027f); - ImVec2 triangle_pa = ImVec2(triangle_r, 0.0f); // Hue point. - ImVec2 triangle_pb = ImVec2(triangle_r * -0.5f, triangle_r * -0.866025f); // Black point. - ImVec2 triangle_pc = ImVec2(triangle_r * -0.5f, triangle_r * +0.866025f); // White point. - - float H,S,V; - ColorConvertRGBtoHSV(col[0], col[1], col[2], H, S, V); - - bool value_changed = false, value_changed_h = false, value_changed_sv = false; - - if (flags & ImGuiColorEditFlags_PickerHueWheel) - { - // Hue wheel + SV triangle logic - InvisibleButton("hsv", ImVec2(sv_picker_size + style.ItemInnerSpacing.x + bars_width, sv_picker_size)); - if (IsItemActive()) - { - ImVec2 initial_off = g.IO.MouseClickedPos[0] - wheel_center; - ImVec2 current_off = g.IO.MousePos - wheel_center; - float initial_dist2 = ImLengthSqr(initial_off); - if (initial_dist2 >= (wheel_r_inner-1)*(wheel_r_inner-1) && initial_dist2 <= (wheel_r_outer+1)*(wheel_r_outer+1)) - { - // Interactive with Hue wheel - H = atan2f(current_off.y, current_off.x) / IM_PI*0.5f; - if (H < 0.0f) - H += 1.0f; - value_changed = value_changed_h = true; - } - float cos_hue_angle = cosf(-H * 2.0f * IM_PI); - float sin_hue_angle = sinf(-H * 2.0f * IM_PI); - if (ImTriangleContainsPoint(triangle_pa, triangle_pb, triangle_pc, ImRotate(initial_off, cos_hue_angle, sin_hue_angle))) - { - // Interacting with SV triangle - ImVec2 current_off_unrotated = ImRotate(current_off, cos_hue_angle, sin_hue_angle); - if (!ImTriangleContainsPoint(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated)) - current_off_unrotated = ImTriangleClosestPoint(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated); - float uu, vv, ww; - ImTriangleBarycentricCoords(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated, uu, vv, ww); - V = ImClamp(1.0f - vv, 0.0001f, 1.0f); - S = ImClamp(uu / V, 0.0001f, 1.0f); - value_changed = value_changed_sv = true; - } - } - if (!(flags & ImGuiColorEditFlags_NoOptions)) - OpenPopupOnItemClick("context"); - } - else if (flags & ImGuiColorEditFlags_PickerHueBar) - { - // SV rectangle logic - InvisibleButton("sv", ImVec2(sv_picker_size, sv_picker_size)); - if (IsItemActive()) - { - S = ImSaturate((io.MousePos.x - picker_pos.x) / (sv_picker_size-1)); - V = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1)); - value_changed = value_changed_sv = true; - } - if (!(flags & ImGuiColorEditFlags_NoOptions)) - OpenPopupOnItemClick("context"); - - // Hue bar logic - SetCursorScreenPos(ImVec2(bar0_pos_x, picker_pos.y)); - InvisibleButton("hue", ImVec2(bars_width, sv_picker_size)); - if (IsItemActive()) - { - H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1)); - value_changed = value_changed_h = true; - } - } - - // Alpha bar logic - if (alpha_bar) - { - SetCursorScreenPos(ImVec2(bar1_pos_x, picker_pos.y)); - InvisibleButton("alpha", ImVec2(bars_width, sv_picker_size)); - if (IsItemActive()) - { - col[3] = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1)); - value_changed = true; - } - } - - if (!(flags & ImGuiColorEditFlags_NoSidePreview)) - { - SameLine(0, style.ItemInnerSpacing.x); - BeginGroup(); - } - - if (!(flags & ImGuiColorEditFlags_NoLabel)) - { - const char* label_display_end = FindRenderedTextEnd(label); - if (label != label_display_end) - { - if ((flags & ImGuiColorEditFlags_NoSidePreview)) - SameLine(0, style.ItemInnerSpacing.x); - TextUnformatted(label, label_display_end); - } - } - - if (!(flags & ImGuiColorEditFlags_NoSidePreview)) - { - ImVec4 col_v4(col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]); - if ((flags & ImGuiColorEditFlags_NoLabel)) - Text("Current"); - ColorButton("##current", col_v4, (flags & (ImGuiColorEditFlags_HDR|ImGuiColorEditFlags_AlphaPreview|ImGuiColorEditFlags_AlphaPreviewHalf|ImGuiColorEditFlags_NoTooltip)), ImVec2(square_sz * 3, square_sz * 2)); - if (ref_col != NULL) - { - Text("Original"); - ImVec4 ref_col_v4(ref_col[0], ref_col[1], ref_col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : ref_col[3]); - if (ColorButton("##original", ref_col_v4, (flags & (ImGuiColorEditFlags_HDR|ImGuiColorEditFlags_AlphaPreview|ImGuiColorEditFlags_AlphaPreviewHalf|ImGuiColorEditFlags_NoTooltip)), ImVec2(square_sz * 3, square_sz * 2))) - { - memcpy(col, ref_col, components * sizeof(float)); - value_changed = true; - } - } - EndGroup(); - } - - // Convert back color to RGB - if (value_changed_h || value_changed_sv) - ColorConvertHSVtoRGB(H >= 1.0f ? H - 10 * 1e-6f : H, S > 0.0f ? S : 10*1e-6f, V > 0.0f ? V : 1e-6f, col[0], col[1], col[2]); - - // R,G,B and H,S,V slider color editor - if ((flags & ImGuiColorEditFlags_NoInputs) == 0) - { - PushItemWidth((alpha_bar ? bar1_pos_x : bar0_pos_x) + bars_width - picker_pos.x); - ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf; - ImGuiColorEditFlags sub_flags = (flags & sub_flags_to_forward) | ImGuiColorEditFlags_NoPicker; - if (flags & ImGuiColorEditFlags_RGB || (flags & ImGuiColorEditFlags__InputsMask) == 0) - value_changed |= ColorEdit4("##rgb", col, sub_flags | ImGuiColorEditFlags_RGB); - if (flags & ImGuiColorEditFlags_HSV || (flags & ImGuiColorEditFlags__InputsMask) == 0) - value_changed |= ColorEdit4("##hsv", col, sub_flags | ImGuiColorEditFlags_HSV); - if (flags & ImGuiColorEditFlags_HEX || (flags & ImGuiColorEditFlags__InputsMask) == 0) - value_changed |= ColorEdit4("##hex", col, sub_flags | ImGuiColorEditFlags_HEX); - PopItemWidth(); - } - - // Try to cancel hue wrap (after ColorEdit), if any - if (value_changed) - { - float new_H, new_S, new_V; - ColorConvertRGBtoHSV(col[0], col[1], col[2], new_H, new_S, new_V); - if (new_H <= 0 && H > 0) - { - if (new_V <= 0 && V != new_V) - ColorConvertHSVtoRGB(H, S, new_V <= 0 ? V * 0.5f : new_V, col[0], col[1], col[2]); - else if (new_S <= 0) - ColorConvertHSVtoRGB(H, new_S <= 0 ? S * 0.5f : new_S, new_V, col[0], col[1], col[2]); - } - } - - ImVec4 hue_color_f(1, 1, 1, 1); ColorConvertHSVtoRGB(H, 1, 1, hue_color_f.x, hue_color_f.y, hue_color_f.z); - ImU32 hue_color32 = ColorConvertFloat4ToU32(hue_color_f); - ImU32 col32_no_alpha = ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 1.0f)); - - const ImU32 hue_colors[6+1] = { IM_COL32(255,0,0,255), IM_COL32(255,255,0,255), IM_COL32(0,255,0,255), IM_COL32(0,255,255,255), IM_COL32(0,0,255,255), IM_COL32(255,0,255,255), IM_COL32(255,0,0,255) }; - ImVec2 sv_cursor_pos; - - if (flags & ImGuiColorEditFlags_PickerHueWheel) - { - // Render Hue Wheel - const float aeps = 1.5f / wheel_r_outer; // Half a pixel arc length in radians (2pi cancels out). - const int segment_per_arc = ImMax(4, (int)wheel_r_outer / 12); - for (int n = 0; n < 6; n++) - { - const float a0 = (n) /6.0f * 2.0f * IM_PI - aeps; - const float a1 = (n+1.0f)/6.0f * 2.0f * IM_PI + aeps; - const int vert_start_idx = draw_list->VtxBuffer.Size; - draw_list->PathArcTo(wheel_center, (wheel_r_inner + wheel_r_outer)*0.5f, a0, a1, segment_per_arc); - draw_list->PathStroke(IM_COL32_WHITE, false, wheel_thickness); - const int vert_end_idx = draw_list->VtxBuffer.Size; - - // Paint colors over existing vertices - ImVec2 gradient_p0(wheel_center.x + cosf(a0) * wheel_r_inner, wheel_center.y + sinf(a0) * wheel_r_inner); - ImVec2 gradient_p1(wheel_center.x + cosf(a1) * wheel_r_inner, wheel_center.y + sinf(a1) * wheel_r_inner); - ShadeVertsLinearColorGradientKeepAlpha(draw_list->VtxBuffer.Data + vert_start_idx, draw_list->VtxBuffer.Data + vert_end_idx, gradient_p0, gradient_p1, hue_colors[n], hue_colors[n+1]); - } - - // Render Cursor + preview on Hue Wheel - float cos_hue_angle = cosf(H * 2.0f * IM_PI); - float sin_hue_angle = sinf(H * 2.0f * IM_PI); - ImVec2 hue_cursor_pos(wheel_center.x + cos_hue_angle * (wheel_r_inner+wheel_r_outer)*0.5f, wheel_center.y + sin_hue_angle * (wheel_r_inner+wheel_r_outer)*0.5f); - float hue_cursor_rad = value_changed_h ? wheel_thickness * 0.65f : wheel_thickness * 0.55f; - int hue_cursor_segments = ImClamp((int)(hue_cursor_rad / 1.4f), 9, 32); - draw_list->AddCircleFilled(hue_cursor_pos, hue_cursor_rad, hue_color32, hue_cursor_segments); - draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad+1, IM_COL32(128,128,128,255), hue_cursor_segments); - draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad, IM_COL32_WHITE, hue_cursor_segments); - - // Render SV triangle (rotated according to hue) - ImVec2 tra = wheel_center + ImRotate(triangle_pa, cos_hue_angle, sin_hue_angle); - ImVec2 trb = wheel_center + ImRotate(triangle_pb, cos_hue_angle, sin_hue_angle); - ImVec2 trc = wheel_center + ImRotate(triangle_pc, cos_hue_angle, sin_hue_angle); - ImVec2 uv_white = GetFontTexUvWhitePixel(); - draw_list->PrimReserve(6, 6); - draw_list->PrimVtx(tra, uv_white, hue_color32); - draw_list->PrimVtx(trb, uv_white, hue_color32); - draw_list->PrimVtx(trc, uv_white, IM_COL32_WHITE); - draw_list->PrimVtx(tra, uv_white, IM_COL32_BLACK_TRANS); - draw_list->PrimVtx(trb, uv_white, IM_COL32_BLACK); - draw_list->PrimVtx(trc, uv_white, IM_COL32_BLACK_TRANS); - draw_list->AddTriangle(tra, trb, trc, IM_COL32(128,128,128,255), 1.5f); - sv_cursor_pos = ImLerp(ImLerp(trc, tra, ImSaturate(S)), trb, ImSaturate(1 - V)); - } - else if (flags & ImGuiColorEditFlags_PickerHueBar) - { - // Render SV Square - draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), IM_COL32_WHITE, hue_color32, hue_color32, IM_COL32_WHITE); - draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), IM_COL32_BLACK_TRANS, IM_COL32_BLACK_TRANS, IM_COL32_BLACK, IM_COL32_BLACK); - RenderFrameBorder(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), 0.0f); - sv_cursor_pos.x = ImClamp((float)(int)(picker_pos.x + ImSaturate(S) * sv_picker_size + 0.5f), picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much - sv_cursor_pos.y = ImClamp((float)(int)(picker_pos.y + ImSaturate(1 - V) * sv_picker_size + 0.5f), picker_pos.y + 2, picker_pos.y + sv_picker_size - 2); - - // Render Hue Bar - for (int i = 0; i < 6; ++i) - draw_list->AddRectFilledMultiColor(ImVec2(bar0_pos_x, picker_pos.y + i * (sv_picker_size / 6)), ImVec2(bar0_pos_x + bars_width, picker_pos.y + (i + 1) * (sv_picker_size / 6)), hue_colors[i], hue_colors[i], hue_colors[i + 1], hue_colors[i + 1]); - float bar0_line_y = (float)(int)(picker_pos.y + H * sv_picker_size + 0.5f); - RenderFrameBorder(ImVec2(bar0_pos_x, picker_pos.y), ImVec2(bar0_pos_x + bars_width, picker_pos.y + sv_picker_size), 0.0f); - RenderArrowsForVerticalBar(draw_list, ImVec2(bar0_pos_x - 1, bar0_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f); - } - - // Render cursor/preview circle (clamp S/V within 0..1 range because floating points colors may lead HSV values to be out of range) - float sv_cursor_rad = value_changed_sv ? 10.0f : 6.0f; - draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, col32_no_alpha, 12); - draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad+1, IM_COL32(128,128,128,255), 12); - draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad, IM_COL32_WHITE, 12); - - // Render alpha bar - if (alpha_bar) - { - float alpha = ImSaturate(col[3]); - ImRect bar1_bb(bar1_pos_x, picker_pos.y, bar1_pos_x + bars_width, picker_pos.y + sv_picker_size); - RenderColorRectWithAlphaCheckerboard(bar1_bb.Min, bar1_bb.Max, IM_COL32(0,0,0,0), bar1_bb.GetWidth() / 2.0f, ImVec2(0.0f, 0.0f)); - draw_list->AddRectFilledMultiColor(bar1_bb.Min, bar1_bb.Max, col32_no_alpha, col32_no_alpha, col32_no_alpha & ~IM_COL32_A_MASK, col32_no_alpha & ~IM_COL32_A_MASK); - float bar1_line_y = (float)(int)(picker_pos.y + (1.0f - alpha) * sv_picker_size + 0.5f); - RenderFrameBorder(bar1_bb.Min, bar1_bb.Max, 0.0f); - RenderArrowsForVerticalBar(draw_list, ImVec2(bar1_pos_x - 1, bar1_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f); - } - - EndGroup(); - PopID(); - - return value_changed && memcmp(backup_initial_col, col, components * sizeof(float)); -} - -// Horizontal separating line. -void ImGui::Separator() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - ImGuiContext& g = *GImGui; - - ImGuiWindowFlags flags = 0; - if ((flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical)) == 0) - flags |= (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal; - IM_ASSERT(ImIsPowerOfTwo((int)(flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical)))); // Check that only 1 option is selected - if (flags & ImGuiSeparatorFlags_Vertical) - { - VerticalSeparator(); - return; - } - - // Horizontal Separator - if (window->DC.ColumnsSet) - PopClipRect(); - - float x1 = window->Pos.x; - float x2 = window->Pos.x + window->Size.x; - if (!window->DC.GroupStack.empty()) - x1 += window->DC.IndentX; - - const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y+1.0f)); - ItemSize(ImVec2(0.0f, 0.0f)); // NB: we don't provide our width so that it doesn't get feed back into AutoFit, we don't provide height to not alter layout. - if (!ItemAdd(bb, 0)) - { - if (window->DC.ColumnsSet) - PushColumnClipRect(); - return; - } - - window->DrawList->AddLine(bb.Min, ImVec2(bb.Max.x,bb.Min.y), GetColorU32(ImGuiCol_Separator)); - - if (g.LogEnabled) - LogRenderedText(NULL, IM_NEWLINE "--------------------------------"); - - if (window->DC.ColumnsSet) - { - PushColumnClipRect(); - window->DC.ColumnsSet->CellMinY = window->DC.CursorPos.y; - } -} - -void ImGui::VerticalSeparator() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - ImGuiContext& g = *GImGui; - - float y1 = window->DC.CursorPos.y; - float y2 = window->DC.CursorPos.y + window->DC.CurrentLineHeight; - const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + 1.0f, y2)); - ItemSize(ImVec2(bb.GetWidth(), 0.0f)); - if (!ItemAdd(bb, 0)) - return; - - window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Min.y), ImVec2(bb.Min.x, bb.Max.y), GetColorU32(ImGuiCol_Separator)); - if (g.LogEnabled) - LogText(" |"); -} - -bool ImGui::SplitterBehavior(ImGuiID id, const ImRect& bb, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - const ImGuiItemFlags item_flags_backup = window->DC.ItemFlags; -#ifdef IMGUI_HAS_NAV - window->DC.ItemFlags |= ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus; -#endif - bool add = ItemAdd(bb, id); - window->DC.ItemFlags = item_flags_backup; - if (!add) - return false; - - bool hovered, held; - ImRect bb_interact = bb; - bb_interact.Expand(axis == ImGuiAxis_Y ? ImVec2(0.0f, hover_extend) : ImVec2(hover_extend, 0.0f)); - ButtonBehavior(bb_interact, id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap); - if (g.ActiveId != id) - SetItemAllowOverlap(); - - if (held || (g.HoveredId == id && g.HoveredIdPreviousFrame == id)) - SetMouseCursor(axis == ImGuiAxis_Y ? ImGuiMouseCursor_ResizeNS : ImGuiMouseCursor_ResizeEW); - - ImRect bb_render = bb; - if (held) - { - ImVec2 mouse_delta_2d = g.IO.MousePos - g.ActiveIdClickOffset - bb_interact.Min; - float mouse_delta = (axis == ImGuiAxis_Y) ? mouse_delta_2d.y : mouse_delta_2d.x; - - // Minimum pane size - if (mouse_delta < min_size1 - *size1) - mouse_delta = min_size1 - *size1; - if (mouse_delta > *size2 - min_size2) - mouse_delta = *size2 - min_size2; - - // Apply resize - *size1 += mouse_delta; - *size2 -= mouse_delta; - bb_render.Translate((axis == ImGuiAxis_X) ? ImVec2(mouse_delta, 0.0f) : ImVec2(0.0f, mouse_delta)); - } - - // Render - const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); - window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, col, g.Style.FrameRounding); - - return held; -} - -void ImGui::Spacing() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - ItemSize(ImVec2(0,0)); -} - -void ImGui::Dummy(const ImVec2& size) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); - ItemSize(bb); - ItemAdd(bb, 0); -} - -bool ImGui::IsRectVisible(const ImVec2& size) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); -} - -bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->ClipRect.Overlaps(ImRect(rect_min, rect_max)); -} - -// Lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) -void ImGui::BeginGroup() -{ - ImGuiWindow* window = GetCurrentWindow(); - - window->DC.GroupStack.resize(window->DC.GroupStack.Size + 1); - ImGuiGroupData& group_data = window->DC.GroupStack.back(); - group_data.BackupCursorPos = window->DC.CursorPos; - group_data.BackupCursorMaxPos = window->DC.CursorMaxPos; - group_data.BackupIndentX = window->DC.IndentX; - group_data.BackupGroupOffsetX = window->DC.GroupOffsetX; - group_data.BackupCurrentLineHeight = window->DC.CurrentLineHeight; - group_data.BackupCurrentLineTextBaseOffset = window->DC.CurrentLineTextBaseOffset; - group_data.BackupLogLinePosY = window->DC.LogLinePosY; - group_data.BackupActiveIdIsAlive = GImGui->ActiveIdIsAlive; - group_data.AdvanceCursor = true; - - window->DC.GroupOffsetX = window->DC.CursorPos.x - window->Pos.x - window->DC.ColumnsOffsetX; - window->DC.IndentX = window->DC.GroupOffsetX; - window->DC.CursorMaxPos = window->DC.CursorPos; - window->DC.CurrentLineHeight = 0.0f; - window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f; -} - -void ImGui::EndGroup() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - - IM_ASSERT(!window->DC.GroupStack.empty()); // Mismatched BeginGroup()/EndGroup() calls - - ImGuiGroupData& group_data = window->DC.GroupStack.back(); - - ImRect group_bb(group_data.BackupCursorPos, window->DC.CursorMaxPos); - group_bb.Max = ImMax(group_bb.Min, group_bb.Max); - - window->DC.CursorPos = group_data.BackupCursorPos; - window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, window->DC.CursorMaxPos); - window->DC.CurrentLineHeight = group_data.BackupCurrentLineHeight; - window->DC.CurrentLineTextBaseOffset = group_data.BackupCurrentLineTextBaseOffset; - window->DC.IndentX = group_data.BackupIndentX; - window->DC.GroupOffsetX = group_data.BackupGroupOffsetX; - window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f; - - if (group_data.AdvanceCursor) - { - window->DC.CurrentLineTextBaseOffset = ImMax(window->DC.PrevLineTextBaseOffset, group_data.BackupCurrentLineTextBaseOffset); // FIXME: Incorrect, we should grab the base offset from the *first line* of the group but it is hard to obtain now. - ItemSize(group_bb.GetSize(), group_data.BackupCurrentLineTextBaseOffset); - ItemAdd(group_bb, 0); - } - - // If the current ActiveId was declared within the boundary of our group, we copy it to LastItemId so IsItemActive() will be functional on the entire group. - // It would be be neater if we replaced window.DC.LastItemId by e.g. 'bool LastItemIsActive', but if you search for LastItemId you'll notice it is only used in that context. - const bool active_id_within_group = (!group_data.BackupActiveIdIsAlive && g.ActiveIdIsAlive && g.ActiveId && g.ActiveIdWindow->RootWindow == window->RootWindow); - if (active_id_within_group) - window->DC.LastItemId = g.ActiveId; - window->DC.LastItemRect = group_bb; - - window->DC.GroupStack.pop_back(); - - //window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug] -} - -// Gets back to previous line and continue with horizontal layout -// pos_x == 0 : follow right after previous item -// pos_x != 0 : align to specified x position (relative to window/group left) -// spacing_w < 0 : use default spacing if pos_x == 0, no spacing if pos_x != 0 -// spacing_w >= 0 : enforce spacing amount -void ImGui::SameLine(float pos_x, float spacing_w) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - if (pos_x != 0.0f) - { - if (spacing_w < 0.0f) spacing_w = 0.0f; - window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + pos_x + spacing_w + window->DC.GroupOffsetX + window->DC.ColumnsOffsetX; - window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y; - } - else - { - if (spacing_w < 0.0f) spacing_w = g.Style.ItemSpacing.x; - window->DC.CursorPos.x = window->DC.CursorPosPrevLine.x + spacing_w; - window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y; - } - window->DC.CurrentLineHeight = window->DC.PrevLineHeight; - window->DC.CurrentLineTextBaseOffset = window->DC.PrevLineTextBaseOffset; -} - -void ImGui::NewLine() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - const ImGuiLayoutType backup_layout_type = window->DC.LayoutType; - window->DC.LayoutType = ImGuiLayoutType_Vertical; - if (window->DC.CurrentLineHeight > 0.0f) // In the event that we are on a line with items that is smaller that FontSize high, we will preserve its height. - ItemSize(ImVec2(0,0)); - else - ItemSize(ImVec2(0.0f, g.FontSize)); - window->DC.LayoutType = backup_layout_type; -} - -void ImGui::NextColumn() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems || window->DC.ColumnsSet == NULL) - return; - - ImGuiContext& g = *GImGui; - PopItemWidth(); - PopClipRect(); - - ImGuiColumnsSet* columns = window->DC.ColumnsSet; - columns->CellMaxY = ImMax(columns->CellMaxY, window->DC.CursorPos.y); - if (++columns->Current < columns->Count) - { - // Columns 1+ cancel out IndentX - window->DC.ColumnsOffsetX = GetColumnOffset(columns->Current) - window->DC.IndentX + g.Style.ItemSpacing.x; - window->DrawList->ChannelsSetCurrent(columns->Current); - } - else - { - window->DC.ColumnsOffsetX = 0.0f; - window->DrawList->ChannelsSetCurrent(0); - columns->Current = 0; - columns->CellMinY = columns->CellMaxY; - } - window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX); - window->DC.CursorPos.y = columns->CellMinY; - window->DC.CurrentLineHeight = 0.0f; - window->DC.CurrentLineTextBaseOffset = 0.0f; - - PushColumnClipRect(); - PushItemWidth(GetColumnWidth() * 0.65f); // FIXME: Move on columns setup -} - -int ImGui::GetColumnIndex() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.ColumnsSet ? window->DC.ColumnsSet->Current : 0; -} - -int ImGui::GetColumnsCount() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.ColumnsSet ? window->DC.ColumnsSet->Count : 1; -} - -static float OffsetNormToPixels(const ImGuiColumnsSet* columns, float offset_norm) -{ - return offset_norm * (columns->MaxX - columns->MinX); -} - -static float PixelsToOffsetNorm(const ImGuiColumnsSet* columns, float offset) -{ - return offset / (columns->MaxX - columns->MinX); -} - -static inline float GetColumnsRectHalfWidth() { return 4.0f; } - -static float GetDraggedColumnOffset(ImGuiColumnsSet* columns, int column_index) -{ - // Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing - // window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning. - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - IM_ASSERT(column_index > 0); // We cannot drag column 0. If you get this assert you may have a conflict between the ID of your columns and another widgets. - IM_ASSERT(g.ActiveId == columns->ID + ImGuiID(column_index)); - - float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + GetColumnsRectHalfWidth() - window->Pos.x; - x = ImMax(x, ImGui::GetColumnOffset(column_index - 1) + g.Style.ColumnsMinSpacing); - if ((columns->Flags & ImGuiColumnsFlags_NoPreserveWidths)) - x = ImMin(x, ImGui::GetColumnOffset(column_index + 1) - g.Style.ColumnsMinSpacing); - - return x; -} - -float ImGui::GetColumnOffset(int column_index) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiColumnsSet* columns = window->DC.ColumnsSet; - IM_ASSERT(columns != NULL); - - if (column_index < 0) - column_index = columns->Current; - IM_ASSERT(column_index < columns->Columns.Size); - - /* - if (g.ActiveId) - { - ImGuiContext& g = *GImGui; - const ImGuiID column_id = columns->ColumnsSetId + ImGuiID(column_index); - if (g.ActiveId == column_id) - return GetDraggedColumnOffset(columns, column_index); - } - */ - - const float t = columns->Columns[column_index].OffsetNorm; - const float x_offset = ImLerp(columns->MinX, columns->MaxX, t); - return x_offset; -} - -static float GetColumnWidthEx(ImGuiColumnsSet* columns, int column_index, bool before_resize = false) -{ - if (column_index < 0) - column_index = columns->Current; - - float offset_norm; - if (before_resize) - offset_norm = columns->Columns[column_index + 1].OffsetNormBeforeResize - columns->Columns[column_index].OffsetNormBeforeResize; - else - offset_norm = columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm; - return OffsetNormToPixels(columns, offset_norm); -} - -float ImGui::GetColumnWidth(int column_index) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiColumnsSet* columns = window->DC.ColumnsSet; - IM_ASSERT(columns != NULL); - - if (column_index < 0) - column_index = columns->Current; - return OffsetNormToPixels(columns, columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm); -} - -void ImGui::SetColumnOffset(int column_index, float offset) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiColumnsSet* columns = window->DC.ColumnsSet; - IM_ASSERT(columns != NULL); - - if (column_index < 0) - column_index = columns->Current; - IM_ASSERT(column_index < columns->Columns.Size); - - const bool preserve_width = !(columns->Flags & ImGuiColumnsFlags_NoPreserveWidths) && (column_index < columns->Count-1); - const float width = preserve_width ? GetColumnWidthEx(columns, column_index, columns->IsBeingResized) : 0.0f; - - if (!(columns->Flags & ImGuiColumnsFlags_NoForceWithinWindow)) - offset = ImMin(offset, columns->MaxX - g.Style.ColumnsMinSpacing * (columns->Count - column_index)); - columns->Columns[column_index].OffsetNorm = PixelsToOffsetNorm(columns, offset - columns->MinX); - - if (preserve_width) - SetColumnOffset(column_index + 1, offset + ImMax(g.Style.ColumnsMinSpacing, width)); -} - -void ImGui::SetColumnWidth(int column_index, float width) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiColumnsSet* columns = window->DC.ColumnsSet; - IM_ASSERT(columns != NULL); - - if (column_index < 0) - column_index = columns->Current; - SetColumnOffset(column_index + 1, GetColumnOffset(column_index) + width); -} - -void ImGui::PushColumnClipRect(int column_index) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiColumnsSet* columns = window->DC.ColumnsSet; - if (column_index < 0) - column_index = columns->Current; - - PushClipRect(columns->Columns[column_index].ClipRect.Min, columns->Columns[column_index].ClipRect.Max, false); -} - -static ImGuiColumnsSet* FindOrAddColumnsSet(ImGuiWindow* window, ImGuiID id) -{ - for (int n = 0; n < window->ColumnsStorage.Size; n++) - if (window->ColumnsStorage[n].ID == id) - return &window->ColumnsStorage[n]; - - window->ColumnsStorage.push_back(ImGuiColumnsSet()); - ImGuiColumnsSet* columns = &window->ColumnsStorage.back(); - columns->ID = id; - return columns; -} - -void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiColumnsFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - - IM_ASSERT(columns_count > 1); - IM_ASSERT(window->DC.ColumnsSet == NULL); // Nested columns are currently not supported - - // Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget. - // In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer. - PushID(0x11223347 + (str_id ? 0 : columns_count)); - ImGuiID id = window->GetID(str_id ? str_id : "columns"); - PopID(); - - // Acquire storage for the columns set - ImGuiColumnsSet* columns = FindOrAddColumnsSet(window, id); - IM_ASSERT(columns->ID == id); - columns->Current = 0; - columns->Count = columns_count; - columns->Flags = flags; - window->DC.ColumnsSet = columns; - - // Set state for first column - const float content_region_width = (window->SizeContentsExplicit.x != 0.0f) ? (window->SizeContentsExplicit.x) : (window->Size.x -window->ScrollbarSizes.x); - columns->MinX = window->DC.IndentX - g.Style.ItemSpacing.x; // Lock our horizontal range - //column->MaxX = content_region_width - window->Scroll.x - ((window->Flags & ImGuiWindowFlags_NoScrollbar) ? 0 : g.Style.ScrollbarSize);// - window->WindowPadding().x; - columns->MaxX = content_region_width - window->Scroll.x; - columns->StartPosY = window->DC.CursorPos.y; - columns->StartMaxPosX = window->DC.CursorMaxPos.x; - columns->CellMinY = columns->CellMaxY = window->DC.CursorPos.y; - window->DC.ColumnsOffsetX = 0.0f; - window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX); - - // Initialize defaults - columns->IsFirstFrame = (columns->Columns.Size == 0); - if (columns->Columns.Size == 0) - { - columns->Columns.reserve(columns_count + 1); - for (int n = 0; n < columns_count + 1; n++) - { - ImGuiColumnData column; - column.OffsetNorm = n / (float)columns_count; - columns->Columns.push_back(column); - } - } - IM_ASSERT(columns->Columns.Size == columns_count + 1); - - for (int n = 0; n < columns_count + 1; n++) - { - // Clamp position - ImGuiColumnData* column = &columns->Columns[n]; - float t = column->OffsetNorm; - if (!(columns->Flags & ImGuiColumnsFlags_NoForceWithinWindow)) - t = ImMin(t, PixelsToOffsetNorm(columns, (columns->MaxX - columns->MinX) - g.Style.ColumnsMinSpacing * (columns->Count - n))); - column->OffsetNorm = t; - - if (n == columns_count) - continue; - - // Compute clipping rectangle - float clip_x1 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(n) - 1.0f); - float clip_x2 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(n + 1) - 1.0f); - column->ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX); - column->ClipRect.ClipWith(window->ClipRect); - } - - window->DrawList->ChannelsSplit(columns->Count); - PushColumnClipRect(); - PushItemWidth(GetColumnWidth() * 0.65f); -} - -void ImGui::EndColumns() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - ImGuiColumnsSet* columns = window->DC.ColumnsSet; - IM_ASSERT(columns != NULL); - - PopItemWidth(); - PopClipRect(); - window->DrawList->ChannelsMerge(); - - columns->CellMaxY = ImMax(columns->CellMaxY, window->DC.CursorPos.y); - window->DC.CursorPos.y = columns->CellMaxY; - if (!(columns->Flags & ImGuiColumnsFlags_GrowParentContentsSize)) - window->DC.CursorMaxPos.x = ImMax(columns->StartMaxPosX, columns->MaxX); // Restore cursor max pos, as columns don't grow parent - - // Draw columns borders and handle resize - bool is_being_resized = false; - if (!(columns->Flags & ImGuiColumnsFlags_NoBorder) && !window->SkipItems) - { - const float y1 = columns->StartPosY; - const float y2 = window->DC.CursorPos.y; - int dragging_column = -1; - for (int n = 1; n < columns->Count; n++) - { - float x = window->Pos.x + GetColumnOffset(n); - const ImGuiID column_id = columns->ID + ImGuiID(n); - const float column_hw = GetColumnsRectHalfWidth(); // Half-width for interaction - const ImRect column_rect(ImVec2(x - column_hw, y1), ImVec2(x + column_hw, y2)); - KeepAliveID(column_id); - if (IsClippedEx(column_rect, column_id, false)) - continue; - - bool hovered = false, held = false; - if (!(columns->Flags & ImGuiColumnsFlags_NoResize)) - { - ButtonBehavior(column_rect, column_id, &hovered, &held); - if (hovered || held) - g.MouseCursor = ImGuiMouseCursor_ResizeEW; - if (held && !(columns->Columns[n].Flags & ImGuiColumnsFlags_NoResize)) - dragging_column = n; - } - - // Draw column (we clip the Y boundaries CPU side because very long triangles are mishandled by some GPU drivers.) - const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); - const float xi = (float)(int)x; - window->DrawList->AddLine(ImVec2(xi, ImMax(y1 + 1.0f, window->ClipRect.Min.y)), ImVec2(xi, ImMin(y2, window->ClipRect.Max.y)), col); - } - - // Apply dragging after drawing the column lines, so our rendered lines are in sync with how items were displayed during the frame. - if (dragging_column != -1) - { - if (!columns->IsBeingResized) - for (int n = 0; n < columns->Count + 1; n++) - columns->Columns[n].OffsetNormBeforeResize = columns->Columns[n].OffsetNorm; - columns->IsBeingResized = is_being_resized = true; - float x = GetDraggedColumnOffset(columns, dragging_column); - SetColumnOffset(dragging_column, x); - } - } - columns->IsBeingResized = is_being_resized; - - window->DC.ColumnsSet = NULL; - window->DC.ColumnsOffsetX = 0.0f; - window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX); -} - -// [2017/12: This is currently the only public API, while we are working on making BeginColumns/EndColumns user-facing] -void ImGui::Columns(int columns_count, const char* id, bool border) -{ - ImGuiWindow* window = GetCurrentWindow(); - IM_ASSERT(columns_count >= 1); - if (window->DC.ColumnsSet != NULL && window->DC.ColumnsSet->Count != columns_count) - EndColumns(); - - ImGuiColumnsFlags flags = (border ? 0 : ImGuiColumnsFlags_NoBorder); - //flags |= ImGuiColumnsFlags_NoPreserveWidths; // NB: Legacy behavior - if (columns_count != 1) - BeginColumns(id, columns_count, flags); -} - -void ImGui::Indent(float indent_w) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - window->DC.IndentX += (indent_w != 0.0f) ? indent_w : g.Style.IndentSpacing; - window->DC.CursorPos.x = window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX; -} - -void ImGui::Unindent(float indent_w) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - window->DC.IndentX -= (indent_w != 0.0f) ? indent_w : g.Style.IndentSpacing; - window->DC.CursorPos.x = window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX; -} - -void ImGui::TreePush(const char* str_id) -{ - ImGuiWindow* window = GetCurrentWindow(); - Indent(); - window->DC.TreeDepth++; - PushID(str_id ? str_id : "#TreePush"); -} - -void ImGui::TreePush(const void* ptr_id) -{ - ImGuiWindow* window = GetCurrentWindow(); - Indent(); - window->DC.TreeDepth++; - PushID(ptr_id ? ptr_id : (const void*)"#TreePush"); -} - -void ImGui::TreePushRawID(ImGuiID id) -{ - ImGuiWindow* window = GetCurrentWindow(); - Indent(); - window->DC.TreeDepth++; - window->IDStack.push_back(id); -} - -void ImGui::TreePop() -{ - ImGuiWindow* window = GetCurrentWindow(); - Unindent(); - window->DC.TreeDepth--; - PopID(); -} - -void ImGui::Value(const char* prefix, bool b) -{ - Text("%s: %s", prefix, (b ? "true" : "false")); -} - -void ImGui::Value(const char* prefix, int v) -{ - Text("%s: %d", prefix, v); -} - -void ImGui::Value(const char* prefix, unsigned int v) -{ - Text("%s: %d", prefix, v); -} - -void ImGui::Value(const char* prefix, float v, const char* float_format) -{ - if (float_format) - { - char fmt[64]; - ImFormatString(fmt, IM_ARRAYSIZE(fmt), "%%s: %s", float_format); - Text(fmt, prefix, v); - } - else - { - Text("%s: %.3f", prefix, v); - } -} - -//----------------------------------------------------------------------------- -// DRAG AND DROP -//----------------------------------------------------------------------------- - -void ImGui::ClearDragDrop() -{ - ImGuiContext& g = *GImGui; - g.DragDropActive = false; - g.DragDropPayload.Clear(); - g.DragDropAcceptIdCurr = g.DragDropAcceptIdPrev = 0; - g.DragDropAcceptIdCurrRectSurface = FLT_MAX; - g.DragDropAcceptFrameCount = -1; -} - -// Call when current ID is active. -// When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource() -bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags, int mouse_button) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - bool source_drag_active = false; - ImGuiID source_id = 0; - ImGuiID source_parent_id = 0; - if (!(flags & ImGuiDragDropFlags_SourceExtern)) - { - source_id = window->DC.LastItemId; - if (source_id != 0 && g.ActiveId != source_id) // Early out for most common case - return false; - if (g.IO.MouseDown[mouse_button] == false) - return false; - - if (source_id == 0) - { - // If you want to use BeginDragDropSource() on an item with no unique identifier for interaction, such as Text() or Image(), you need to: - // A) Read the explanation below, B) Use the ImGuiDragDropFlags_SourceAllowNullID flag, C) Swallow your programmer pride. - if (!(flags & ImGuiDragDropFlags_SourceAllowNullID)) - { - IM_ASSERT(0); - return false; - } - - // Magic fallback (=somehow reprehensible) to handle items with no assigned ID, e.g. Text(), Image() - // We build a throwaway ID based on current ID stack + relative AABB of items in window. - // THE IDENTIFIER WON'T SURVIVE ANY REPOSITIONING OF THE WIDGET, so if your widget moves your dragging operation will be canceled. - // We don't need to maintain/call ClearActiveID() as releasing the button will early out this function and trigger !ActiveIdIsAlive. - bool is_hovered = window->DC.LastItemRectHoveredRect; - if (!is_hovered && (g.ActiveId == 0 || g.ActiveIdWindow != window)) - return false; - source_id = window->DC.LastItemId = window->GetIDFromRectangle(window->DC.LastItemRect); - if (is_hovered) - SetHoveredID(source_id); - if (is_hovered && g.IO.MouseClicked[mouse_button]) - { - SetActiveID(source_id, window); - FocusWindow(window); - } - if (g.ActiveId == source_id) // Allow the underlying widget to display/return hovered during the mouse release frame, else we would get a flicker. - g.ActiveIdAllowOverlap = is_hovered; - } - if (g.ActiveId != source_id) - return false; - source_parent_id = window->IDStack.back(); - source_drag_active = IsMouseDragging(mouse_button); - } - else - { - window = NULL; - source_id = ImHash("#SourceExtern", 0); - source_drag_active = true; - } - - if (source_drag_active) - { - if (!g.DragDropActive) - { - IM_ASSERT(source_id != 0); - ClearDragDrop(); - ImGuiPayload& payload = g.DragDropPayload; - payload.SourceId = source_id; - payload.SourceParentId = source_parent_id; - g.DragDropActive = true; - g.DragDropSourceFlags = flags; - g.DragDropMouseButton = mouse_button; - } - - if (!(flags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) - { - // FIXME-DRAG - //SetNextWindowPos(g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding); - //PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * 0.60f); // This is better but e.g ColorButton with checkboard has issue with transparent colors :( - SetNextWindowPos(g.IO.MousePos); - PushStyleColor(ImGuiCol_PopupBg, GetStyleColorVec4(ImGuiCol_PopupBg) * ImVec4(1.0f, 1.0f, 1.0f, 0.6f)); - BeginTooltipEx(ImGuiWindowFlags_NoInputs); - } - - if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern)) - window->DC.LastItemRectHoveredRect = false; - - return true; - } - return false; -} - -void ImGui::EndDragDropSource() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.DragDropActive); - - if (!(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) - { - EndTooltip(); - PopStyleColor(); - //PopStyleVar(); - } - - // Discard the drag if have not called SetDragDropPayload() - if (g.DragDropPayload.DataFrameCount == -1) - ClearDragDrop(); -} - -// Use 'cond' to choose to submit payload on drag start or every frame -bool ImGui::SetDragDropPayload(const char* type, const void* data, size_t data_size, ImGuiCond cond) -{ - ImGuiContext& g = *GImGui; - ImGuiPayload& payload = g.DragDropPayload; - if (cond == 0) - cond = ImGuiCond_Always; - - IM_ASSERT(type != NULL); - IM_ASSERT(strlen(type) < IM_ARRAYSIZE(payload.DataType)); // Payload type can be at most 8 characters longs - IM_ASSERT((data != NULL && data_size > 0) || (data == NULL && data_size == 0)); - IM_ASSERT(cond == ImGuiCond_Always || cond == ImGuiCond_Once); - IM_ASSERT(payload.SourceId != 0); // Not called between BeginDragDropSource() and EndDragDropSource() - - if (cond == ImGuiCond_Always || payload.DataFrameCount == -1) - { - // Copy payload - ImStrncpy(payload.DataType, type, IM_ARRAYSIZE(payload.DataType)); - g.DragDropPayloadBufHeap.resize(0); - if (data_size > sizeof(g.DragDropPayloadBufLocal)) - { - // Store in heap - g.DragDropPayloadBufHeap.resize((int)data_size); - payload.Data = g.DragDropPayloadBufHeap.Data; - memcpy((void*)payload.Data, data, data_size); - } - else if (data_size > 0) - { - // Store locally - memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); - payload.Data = g.DragDropPayloadBufLocal; - memcpy((void*)payload.Data, data, data_size); - } - else - { - payload.Data = NULL; - } - payload.DataSize = (int)data_size; - } - payload.DataFrameCount = g.FrameCount; - - return (g.DragDropAcceptFrameCount == g.FrameCount) || (g.DragDropAcceptFrameCount == g.FrameCount - 1); -} - -bool ImGui::BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id) -{ - ImGuiContext& g = *GImGui; - if (!g.DragDropActive) - return false; - - ImGuiWindow* window = g.CurrentWindow; - if (g.HoveredWindow == NULL || window->RootWindow != g.HoveredWindow->RootWindow) - return false; - IM_ASSERT(id != 0); - if (!IsMouseHoveringRect(bb.Min, bb.Max) || (id == g.DragDropPayload.SourceId)) - return false; - - g.DragDropTargetRect = bb; - g.DragDropTargetId = id; - return true; -} - -// We don't use BeginDragDropTargetCustom() and duplicate its code because: -// 1) we use LastItemRectHoveredRect which handles items that pushes a temporarily clip rectangle in their code. Calling BeginDragDropTargetCustom(LastItemRect) would not handle them. -// 2) and it's faster. as this code may be very frequently called, we want to early out as fast as we can. -// Also note how the HoveredWindow test is positioned differently in both functions (in both functions we optimize for the cheapest early out case) -bool ImGui::BeginDragDropTarget() -{ - ImGuiContext& g = *GImGui; - if (!g.DragDropActive) - return false; - - ImGuiWindow* window = g.CurrentWindow; - if (!window->DC.LastItemRectHoveredRect) - return false; - if (g.HoveredWindow == NULL || window->RootWindow != g.HoveredWindow->RootWindow) - return false; - - ImGuiID id = window->DC.LastItemId; - if (id == 0) - id = window->GetIDFromRectangle(window->DC.LastItemRect); - if (g.DragDropPayload.SourceId == id) - return false; - - g.DragDropTargetRect = window->DC.LastItemRect; - g.DragDropTargetId = id; - return true; -} - -bool ImGui::IsDragDropPayloadBeingAccepted() -{ - ImGuiContext& g = *GImGui; - return g.DragDropActive && g.DragDropAcceptIdPrev != 0; -} - -const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiPayload& payload = g.DragDropPayload; - IM_ASSERT(g.DragDropActive); // Not called between BeginDragDropTarget() and EndDragDropTarget() ? - IM_ASSERT(payload.DataFrameCount != -1); // Forgot to call EndDragDropTarget() ? - if (type != NULL && !payload.IsDataType(type)) - return NULL; - - // Accept smallest drag target bounding box, this allows us to nest drag targets conveniently without ordering constraints. - // NB: We currently accept NULL id as target. However, overlapping targets requires a unique ID to function! - const bool was_accepted_previously = (g.DragDropAcceptIdPrev == g.DragDropTargetId); - ImRect r = g.DragDropTargetRect; - float r_surface = r.GetWidth() * r.GetHeight(); - if (r_surface < g.DragDropAcceptIdCurrRectSurface) - { - g.DragDropAcceptIdCurr = g.DragDropTargetId; - g.DragDropAcceptIdCurrRectSurface = r_surface; - } - - // Render default drop visuals - payload.Preview = was_accepted_previously; - flags |= (g.DragDropSourceFlags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect); // Source can also inhibit the preview (useful for external sources that lives for 1 frame) - if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview) - { - // FIXME-DRAG: Settle on a proper default visuals for drop target. - r.Expand(3.5f); - bool push_clip_rect = !window->ClipRect.Contains(r); - if (push_clip_rect) window->DrawList->PushClipRectFullScreen(); - window->DrawList->AddRect(r.Min, r.Max, GetColorU32(ImGuiCol_DragDropTarget), 0.0f, ~0, 2.0f); - if (push_clip_rect) window->DrawList->PopClipRect(); - } - - g.DragDropAcceptFrameCount = g.FrameCount; - payload.Delivery = was_accepted_previously && !IsMouseDown(g.DragDropMouseButton); // For extern drag sources affecting os window focus, it's easier to just test !IsMouseDown() instead of IsMouseReleased() - if (!payload.Delivery && !(flags & ImGuiDragDropFlags_AcceptBeforeDelivery)) - return NULL; - - return &payload; -} - -// We don't really use/need this now, but added it for the sake of consistency and because we might need it later. -void ImGui::EndDragDropTarget() -{ - ImGuiContext& g = *GImGui; (void)g; - IM_ASSERT(g.DragDropActive); -} - -//----------------------------------------------------------------------------- -// PLATFORM DEPENDENT HELPERS -//----------------------------------------------------------------------------- - -#if defined(_WIN32) && !defined(_WINDOWS_) && (!defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) || !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS)) -#undef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#include -#endif - -// Win32 API clipboard implementation -#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) - -#ifdef _MSC_VER -#pragma comment(lib, "user32") -#endif - -static const char* GetClipboardTextFn_DefaultImpl(void*) -{ - static ImVector buf_local; - buf_local.clear(); - if (!OpenClipboard(NULL)) - return NULL; - HANDLE wbuf_handle = GetClipboardData(CF_UNICODETEXT); - if (wbuf_handle == NULL) - { - CloseClipboard(); - return NULL; - } - if (ImWchar* wbuf_global = (ImWchar*)GlobalLock(wbuf_handle)) - { - int buf_len = ImTextCountUtf8BytesFromStr(wbuf_global, NULL) + 1; - buf_local.resize(buf_len); - ImTextStrToUtf8(buf_local.Data, buf_len, wbuf_global, NULL); - } - GlobalUnlock(wbuf_handle); - CloseClipboard(); - return buf_local.Data; -} - -static void SetClipboardTextFn_DefaultImpl(void*, const char* text) -{ - if (!OpenClipboard(NULL)) - return; - const int wbuf_length = ImTextCountCharsFromUtf8(text, NULL) + 1; - HGLOBAL wbuf_handle = GlobalAlloc(GMEM_MOVEABLE, (SIZE_T)wbuf_length * sizeof(ImWchar)); - if (wbuf_handle == NULL) - { - CloseClipboard(); - return; - } - ImWchar* wbuf_global = (ImWchar*)GlobalLock(wbuf_handle); - ImTextStrFromUtf8(wbuf_global, wbuf_length, text, NULL); - GlobalUnlock(wbuf_handle); - EmptyClipboard(); - SetClipboardData(CF_UNICODETEXT, wbuf_handle); - CloseClipboard(); -} - -#else - -// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers -static const char* GetClipboardTextFn_DefaultImpl(void*) -{ - ImGuiContext& g = *GImGui; - return g.PrivateClipboard.empty() ? NULL : g.PrivateClipboard.begin(); -} - -// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers -static void SetClipboardTextFn_DefaultImpl(void*, const char* text) -{ - ImGuiContext& g = *GImGui; - g.PrivateClipboard.clear(); - const char* text_end = text + strlen(text); - g.PrivateClipboard.resize((int)(text_end - text) + 1); - memcpy(&g.PrivateClipboard[0], text, (size_t)(text_end - text)); - g.PrivateClipboard[(int)(text_end - text)] = 0; -} - -#endif - -// Win32 API IME support (for Asian languages, etc.) -#if defined(_WIN32) && !defined(__GNUC__) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) - -#include -#ifdef _MSC_VER -#pragma comment(lib, "imm32") -#endif - -static void ImeSetInputScreenPosFn_DefaultImpl(int x, int y) -{ - // Notify OS Input Method Editor of text input position - if (HWND hwnd = (HWND)GImGui->IO.ImeWindowHandle) - if (HIMC himc = ImmGetContext(hwnd)) - { - COMPOSITIONFORM cf; - cf.ptCurrentPos.x = x; - cf.ptCurrentPos.y = y; - cf.dwStyle = CFS_FORCE_POSITION; - ImmSetCompositionWindow(himc, &cf); - } -} - -#else - -static void ImeSetInputScreenPosFn_DefaultImpl(int, int) {} - -#endif - -//----------------------------------------------------------------------------- -// HELP -//----------------------------------------------------------------------------- - -void ImGui::ShowMetricsWindow(bool* p_open) -{ - if (ImGui::Begin("ImGui Metrics", p_open)) - { - ImGui::Text("ImGui %s", ImGui::GetVersion()); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Text("%d vertices, %d indices (%d triangles)", ImGui::GetIO().MetricsRenderVertices, ImGui::GetIO().MetricsRenderIndices, ImGui::GetIO().MetricsRenderIndices / 3); - ImGui::Text("%d allocations", ImGui::GetIO().MetricsAllocs); - static bool show_clip_rects = true; - ImGui::Checkbox("Show clipping rectangles when hovering an ImDrawCmd", &show_clip_rects); - ImGui::Separator(); - - struct Funcs - { - static void NodeDrawList(ImDrawList* draw_list, const char* label) - { - bool node_open = ImGui::TreeNode(draw_list, "%s: '%s' %d vtx, %d indices, %d cmds", label, draw_list->_OwnerName ? draw_list->_OwnerName : "", draw_list->VtxBuffer.Size, draw_list->IdxBuffer.Size, draw_list->CmdBuffer.Size); - if (draw_list == ImGui::GetWindowDrawList()) - { - ImGui::SameLine(); - ImGui::TextColored(ImColor(255,100,100), "CURRENTLY APPENDING"); // Can't display stats for active draw list! (we don't have the data double-buffered) - if (node_open) ImGui::TreePop(); - return; - } - if (!node_open) - return; - - ImDrawList* overlay_draw_list = &GImGui->OverlayDrawList; // Render additional visuals into the top-most draw list - int elem_offset = 0; - for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.begin(); pcmd < draw_list->CmdBuffer.end(); elem_offset += pcmd->ElemCount, pcmd++) - { - if (pcmd->UserCallback == NULL && pcmd->ElemCount == 0) - continue; - if (pcmd->UserCallback) - { - ImGui::BulletText("Callback %p, user_data %p", pcmd->UserCallback, pcmd->UserCallbackData); - continue; - } - ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; - bool pcmd_node_open = ImGui::TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "Draw %-4d %s vtx, tex = %p, clip_rect = (%.0f,%.0f)..(%.0f,%.0f)", pcmd->ElemCount, draw_list->IdxBuffer.Size > 0 ? "indexed" : "non-indexed", pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w); - if (show_clip_rects && ImGui::IsItemHovered()) - { - ImRect clip_rect = pcmd->ClipRect; - ImRect vtxs_rect; - for (int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++) - vtxs_rect.Add(draw_list->VtxBuffer[idx_buffer ? idx_buffer[i] : i].pos); - clip_rect.Floor(); overlay_draw_list->AddRect(clip_rect.Min, clip_rect.Max, IM_COL32(255,255,0,255)); - vtxs_rect.Floor(); overlay_draw_list->AddRect(vtxs_rect.Min, vtxs_rect.Max, IM_COL32(255,0,255,255)); - } - if (!pcmd_node_open) - continue; - - // Display individual triangles/vertices. Hover on to get the corresponding triangle highlighted. - ImGuiListClipper clipper(pcmd->ElemCount/3); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible. - while (clipper.Step()) - for (int prim = clipper.DisplayStart, vtx_i = elem_offset + clipper.DisplayStart*3; prim < clipper.DisplayEnd; prim++) - { - char buf[300]; - char *buf_p = buf, *buf_end = buf + IM_ARRAYSIZE(buf); - ImVec2 triangles_pos[3]; - for (int n = 0; n < 3; n++, vtx_i++) - { - ImDrawVert& v = draw_list->VtxBuffer[idx_buffer ? idx_buffer[vtx_i] : vtx_i]; - triangles_pos[n] = v.pos; - buf_p += ImFormatString(buf_p, (int)(buf_end - buf_p), "%s %04d { pos = (%8.2f,%8.2f), uv = (%.6f,%.6f), col = %08X }\n", (n == 0) ? "vtx" : " ", vtx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col); - } - ImGui::Selectable(buf, false); - if (ImGui::IsItemHovered()) - { - ImDrawListFlags backup_flags = overlay_draw_list->Flags; - overlay_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines at is more readable for very large and thin triangles. - overlay_draw_list->AddPolyline(triangles_pos, 3, IM_COL32(255,255,0,255), true, 1.0f); - overlay_draw_list->Flags = backup_flags; - } - } - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - static void NodeWindows(ImVector& windows, const char* label) - { - if (!ImGui::TreeNode(label, "%s (%d)", label, windows.Size)) - return; - for (int i = 0; i < windows.Size; i++) - Funcs::NodeWindow(windows[i], "Window"); - ImGui::TreePop(); - } - - static void NodeWindow(ImGuiWindow* window, const char* label) - { - if (!ImGui::TreeNode(window, "%s '%s', %d @ 0x%p", label, window->Name, window->Active || window->WasActive, window)) - return; - NodeDrawList(window->DrawList, "DrawList"); - ImGui::BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), SizeContents (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->SizeContents.x, window->SizeContents.y); - if (ImGui::IsItemHovered()) - GImGui->OverlayDrawList.AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255,255,0,255)); - ImGui::BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f)", window->Scroll.x, GetScrollMaxX(window), window->Scroll.y, GetScrollMaxY(window)); - ImGui::BulletText("Active: %d, WriteAccessed: %d", window->Active, window->WriteAccessed); - if (window->RootWindow != window) NodeWindow(window->RootWindow, "RootWindow"); - if (window->DC.ChildWindows.Size > 0) NodeWindows(window->DC.ChildWindows, "ChildWindows"); - ImGui::BulletText("Storage: %d bytes", window->StateStorage.Data.Size * (int)sizeof(ImGuiStorage::Pair)); - ImGui::TreePop(); - } - }; - - ImGuiContext& g = *GImGui; // Access private state - Funcs::NodeWindows(g.Windows, "Windows"); - if (ImGui::TreeNode("DrawList", "Active DrawLists (%d)", g.RenderDrawLists[0].Size)) - { - for (int layer = 0; layer < IM_ARRAYSIZE(g.RenderDrawLists); layer++) - for (int i = 0; i < g.RenderDrawLists[layer].Size; i++) - Funcs::NodeDrawList(g.RenderDrawLists[0][i], "DrawList"); - ImGui::TreePop(); - } - if (ImGui::TreeNode("Popups", "Open Popups Stack (%d)", g.OpenPopupStack.Size)) - { - for (int i = 0; i < g.OpenPopupStack.Size; i++) - { - ImGuiWindow* window = g.OpenPopupStack[i].Window; - ImGui::BulletText("PopupID: %08x, Window: '%s'%s%s", g.OpenPopupStack[i].PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? " ChildWindow" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? " ChildMenu" : ""); - } - ImGui::TreePop(); - } - if (ImGui::TreeNode("Basic state")) - { - ImGui::Text("HoveredWindow: '%s'", g.HoveredWindow ? g.HoveredWindow->Name : "NULL"); - ImGui::Text("HoveredRootWindow: '%s'", g.HoveredRootWindow ? g.HoveredRootWindow->Name : "NULL"); - ImGui::Text("HoveredId: 0x%08X/0x%08X (%.2f sec)", g.HoveredId, g.HoveredIdPreviousFrame, g.HoveredIdTimer); // Data is "in-flight" so depending on when the Metrics window is called we may see current frame information or not - ImGui::Text("ActiveId: 0x%08X/0x%08X (%.2f sec)", g.ActiveId, g.ActiveIdPreviousFrame, g.ActiveIdTimer); - ImGui::Text("ActiveIdWindow: '%s'", g.ActiveIdWindow ? g.ActiveIdWindow->Name : "NULL"); - ImGui::Text("NavWindow: '%s'", g.NavWindow ? g.NavWindow->Name : "NULL"); - ImGui::TreePop(); - } - } - ImGui::End(); -} - -//----------------------------------------------------------------------------- - -// Include imgui_user.inl at the end of imgui.cpp to access private data/functions that aren't exposed. -// Prefer just including imgui_internal.h from your code rather than using this define. If a declaration is missing from imgui_internal.h add it or request it on the github. -#ifdef IMGUI_INCLUDE_IMGUI_USER_INL -#include "imgui_user.inl" -#endif - -//----------------------------------------------------------------------------- diff --git a/vendor/librw/skeleton/imgui/imgui.h b/vendor/librw/skeleton/imgui/imgui.h deleted file mode 100644 index 711e027..0000000 --- a/vendor/librw/skeleton/imgui/imgui.h +++ /dev/null @@ -1,1684 +0,0 @@ -// dear imgui, v1.54 WIP -// (headers) - -// See imgui.cpp file for documentation. -// Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code. -// Read 'Programmer guide' in imgui.cpp for notes on how to setup ImGui in your codebase. -// Get latest version at https://github.com/ocornut/imgui - -#pragma once - -#if !defined(IMGUI_DISABLE_INCLUDE_IMCONFIG_H) || defined(IMGUI_INCLUDE_IMCONFIG_H) -#include "imconfig.h" // User-editable configuration file -#endif -#include // FLT_MAX -#include // va_list -#include // ptrdiff_t, NULL -#include // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp - -#define IMGUI_VERSION "1.54 WIP" - -// Define attributes of all API symbols declarations, e.g. for DLL under Windows. -#ifndef IMGUI_API -#define IMGUI_API -#endif - -// Define assertion handler. -#ifndef IM_ASSERT -#include -#define IM_ASSERT(_EXPR) assert(_EXPR) -#endif - -// Helpers -// Some compilers support applying printf-style warnings to user functions. -#if defined(__clang__) || defined(__GNUC__) -#define IM_FMTARGS(FMT) __attribute__((format(printf, FMT, FMT+1))) -#define IM_FMTLIST(FMT) __attribute__((format(printf, FMT, 0))) -#else -#define IM_FMTARGS(FMT) -#define IM_FMTLIST(FMT) -#endif -#define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR)/sizeof(*_ARR))) - -#if defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wold-style-cast" -#endif - -// Forward declarations -struct ImDrawChannel; // Temporary storage for outputting drawing commands out of order, used by ImDrawList::ChannelsSplit() -struct ImDrawCmd; // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call) -struct ImDrawData; // All draw command lists required to render the frame -struct ImDrawList; // A single draw command list (generally one per window) -struct ImDrawListSharedData; // Data shared among multiple draw lists (typically owned by parent ImGui context, but you may create one yourself) -struct ImDrawVert; // A single vertex (20 bytes by default, override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT) -struct ImFont; // Runtime data for a single font within a parent ImFontAtlas -struct ImFontAtlas; // Runtime data for multiple fonts, bake multiple fonts into a single texture, TTF/OTF font loader -struct ImFontConfig; // Configuration data when adding a font or merging fonts -struct ImColor; // Helper functions to create a color that can be converted to either u32 or float4 -struct ImGuiIO; // Main configuration and I/O between your application and ImGui -struct ImGuiOnceUponAFrame; // Simple helper for running a block of code not more than once a frame, used by IMGUI_ONCE_UPON_A_FRAME macro -struct ImGuiStorage; // Simple custom key value storage -struct ImGuiStyle; // Runtime data for styling/colors -struct ImGuiTextFilter; // Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]" -struct ImGuiTextBuffer; // Text buffer for logging/accumulating text -struct ImGuiTextEditCallbackData; // Shared state of ImGui::InputText() when using custom ImGuiTextEditCallback (rare/advanced use) -struct ImGuiSizeConstraintCallbackData;// Structure used to constraint window size in custom ways when using custom ImGuiSizeConstraintCallback (rare/advanced use) -struct ImGuiListClipper; // Helper to manually clip large list of items -struct ImGuiPayload; // User data payload for drag and drop operations -struct ImGuiContext; // ImGui context (opaque) - -// Typedefs and Enumerations (declared as int for compatibility and to not pollute the top of this file) -typedef unsigned int ImU32; // 32-bit unsigned integer (typically used to store packed colors) -typedef unsigned int ImGuiID; // unique ID used by widgets (typically hashed from a stack of string) -typedef unsigned short ImWchar; // character for keyboard input/display -typedef void* ImTextureID; // user data to identify a texture (this is whatever to you want it to be! read the FAQ about ImTextureID in imgui.cpp) -typedef int ImGuiCol; // enum: a color identifier for styling // enum ImGuiCol_ -typedef int ImGuiCond; // enum: a condition for Set*() // enum ImGuiCond_ -typedef int ImGuiKey; // enum: a key identifier (ImGui-side enum) // enum ImGuiKey_ -typedef int ImGuiMouseCursor; // enum: a mouse cursor identifier // enum ImGuiMouseCursor_ -typedef int ImGuiStyleVar; // enum: a variable identifier for styling // enum ImGuiStyleVar_ -typedef int ImDrawCornerFlags; // flags: for ImDrawList::AddRect*() etc. // enum ImDrawCornerFlags_ -typedef int ImDrawListFlags; // flags: for ImDrawList // enum ImDrawListFlags_ -typedef int ImGuiColorEditFlags; // flags: for ColorEdit*(), ColorPicker*() // enum ImGuiColorEditFlags_ -typedef int ImGuiColumnsFlags; // flags: for *Columns*() // enum ImGuiColumnsFlags_ -typedef int ImGuiDragDropFlags; // flags: for *DragDrop*() // enum ImGuiDragDropFlags_ -typedef int ImGuiComboFlags; // flags: for BeginCombo() // enum ImGuiComboFlags_ -typedef int ImGuiFocusedFlags; // flags: for IsWindowFocused() // enum ImGuiFocusedFlags_ -typedef int ImGuiHoveredFlags; // flags: for IsItemHovered() etc. // enum ImGuiHoveredFlags_ -typedef int ImGuiInputTextFlags; // flags: for InputText*() // enum ImGuiInputTextFlags_ -typedef int ImGuiSelectableFlags; // flags: for Selectable() // enum ImGuiSelectableFlags_ -typedef int ImGuiTreeNodeFlags; // flags: for TreeNode*(),CollapsingHeader()// enum ImGuiTreeNodeFlags_ -typedef int ImGuiWindowFlags; // flags: for Begin*() // enum ImGuiWindowFlags_ -typedef int (*ImGuiTextEditCallback)(ImGuiTextEditCallbackData *data); -typedef void (*ImGuiSizeConstraintCallback)(ImGuiSizeConstraintCallbackData* data); -#if defined(_MSC_VER) && !defined(__clang__) -typedef unsigned __int64 ImU64; // 64-bit unsigned integer -#else -typedef unsigned long long ImU64; // 64-bit unsigned integer -#endif - -// Others helpers at bottom of the file: -// class ImVector<> // Lightweight std::vector like class. -// IMGUI_ONCE_UPON_A_FRAME // Execute a block of code once per frame only (convenient for creating UI within deep-nested code that runs multiple times) - -struct ImVec2 -{ - float x, y; - ImVec2() { x = y = 0.0f; } - ImVec2(float _x, float _y) { x = _x; y = _y; } -#ifdef IM_VEC2_CLASS_EXTRA // Define constructor and implicit cast operators in imconfig.h to convert back<>forth from your math types and ImVec2. - IM_VEC2_CLASS_EXTRA -#endif -}; - -struct ImVec4 -{ - float x, y, z, w; - ImVec4() { x = y = z = w = 0.0f; } - ImVec4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; } -#ifdef IM_VEC4_CLASS_EXTRA // Define constructor and implicit cast operators in imconfig.h to convert back<>forth from your math types and ImVec4. - IM_VEC4_CLASS_EXTRA -#endif -}; - -// ImGui end-user API -// In a namespace so that user can add extra functions in a separate file (e.g. Value() helpers for your vector or common types) -namespace ImGui -{ - // Main - IMGUI_API ImGuiIO& GetIO(); - IMGUI_API ImGuiStyle& GetStyle(); - IMGUI_API ImDrawData* GetDrawData(); // same value as passed to your io.RenderDrawListsFn() function. valid after Render() and until the next call to NewFrame() - IMGUI_API void NewFrame(); // start a new ImGui frame, you can submit any command from this point until Render()/EndFrame(). - IMGUI_API void Render(); // ends the ImGui frame, finalize the draw data, then call your io.RenderDrawListsFn() function if set. - IMGUI_API void EndFrame(); // ends the ImGui frame. automatically called by Render(), so most likely don't need to ever call that yourself directly. If you don't need to render you may call EndFrame() but you'll have wasted CPU already. If you don't need to render, better to not create any imgui windows instead! - IMGUI_API void Shutdown(); - - // Demo, Debug, Informations - IMGUI_API void ShowDemoWindow(bool* p_open = NULL); // create demo/test window (previously called ShowTestWindow). demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application! - IMGUI_API void ShowMetricsWindow(bool* p_open = NULL); // create metrics window. display ImGui internals: draw commands (with individual draw calls and vertices), window list, basic internal state, etc. - IMGUI_API void ShowStyleEditor(ImGuiStyle* ref = NULL); // add style editor block (not a window). you can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it uses the default style) - IMGUI_API bool ShowStyleSelector(const char* label); - IMGUI_API void ShowFontSelector(const char* label); - IMGUI_API void ShowUserGuide(); // add basic help/info block (not a window): how to manipulate ImGui as a end-user (mouse/keyboard controls). - - // Window - IMGUI_API bool Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); // push window to the stack and start appending to it. see .cpp for details. return false when window is collapsed, so you can early out in your code. 'bool* p_open' creates a widget on the upper-right to close the window (which sets your bool to false). - IMGUI_API void End(); // finish appending to current window, pop it off the window stack. - IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags extra_flags = 0); // begin a scrolling region. size==0.0f: use remaining window size, size<0.0f: use remaining window size minus abs(size). size>0.0f: fixed size. each axis can use a different mode, e.g. ImVec2(0,400). - IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags extra_flags = 0); // " - IMGUI_API void EndChild(); - IMGUI_API ImVec2 GetContentRegionMax(); // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates - IMGUI_API ImVec2 GetContentRegionAvail(); // == GetContentRegionMax() - GetCursorPos() - IMGUI_API float GetContentRegionAvailWidth(); // - IMGUI_API ImVec2 GetWindowContentRegionMin(); // content boundaries min (roughly (0,0)-Scroll), in window coordinates - IMGUI_API ImVec2 GetWindowContentRegionMax(); // content boundaries max (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates - IMGUI_API float GetWindowContentRegionWidth(); // - IMGUI_API ImDrawList* GetWindowDrawList(); // get rendering command-list if you want to append your own draw primitives - IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (useful if you want to do your own drawing via the DrawList api) - IMGUI_API ImVec2 GetWindowSize(); // get current window size - IMGUI_API float GetWindowWidth(); - IMGUI_API float GetWindowHeight(); - IMGUI_API bool IsWindowCollapsed(); - IMGUI_API bool IsWindowAppearing(); - IMGUI_API void SetWindowFontScale(float scale); // per-window font scale. Adjust IO.FontGlobalScale if you want to scale all windows - - IMGUI_API void SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0,0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc. - IMGUI_API void SetNextWindowSize(const ImVec2& size, ImGuiCond cond = 0); // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin() - IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeConstraintCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Use callback to apply non-trivial programmatic constraints. - IMGUI_API void SetNextWindowContentSize(const ImVec2& size); // set next window content size (~ enforce the range of scrollbars). not including window decorations (title bar, menu bar, etc.). set an axis to 0.0f to leave it automatic. call before Begin() - IMGUI_API void SetNextWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // set next window collapsed state. call before Begin() - IMGUI_API void SetNextWindowFocus(); // set next window to be focused / front-most. call before Begin() - IMGUI_API void SetWindowPos(const ImVec2& pos, ImGuiCond cond = 0); // (not recommended) set current window position - call within Begin()/End(). prefer using SetNextWindowPos(), as this may incur tearing and side-effects. - IMGUI_API void SetWindowSize(const ImVec2& size, ImGuiCond cond = 0); // (not recommended) set current window size - call within Begin()/End(). set to ImVec2(0,0) to force an auto-fit. prefer using SetNextWindowSize(), as this may incur tearing and minor side-effects. - IMGUI_API void SetWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // (not recommended) set current window collapsed state. prefer using SetNextWindowCollapsed(). - IMGUI_API void SetWindowFocus(); // (not recommended) set current window to be focused / front-most. prefer using SetNextWindowFocus(). - IMGUI_API void SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond = 0); // set named window position. - IMGUI_API void SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond = 0); // set named window size. set axis to 0.0f to force an auto-fit on this axis. - IMGUI_API void SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond = 0); // set named window collapsed state - IMGUI_API void SetWindowFocus(const char* name); // set named window to be focused / front-most. use NULL to remove focus. - - IMGUI_API float GetScrollX(); // get scrolling amount [0..GetScrollMaxX()] - IMGUI_API float GetScrollY(); // get scrolling amount [0..GetScrollMaxY()] - IMGUI_API float GetScrollMaxX(); // get maximum scrolling amount ~~ ContentSize.X - WindowSize.X - IMGUI_API float GetScrollMaxY(); // get maximum scrolling amount ~~ ContentSize.Y - WindowSize.Y - IMGUI_API void SetScrollX(float scroll_x); // set scrolling amount [0..GetScrollMaxX()] - IMGUI_API void SetScrollY(float scroll_y); // set scrolling amount [0..GetScrollMaxY()] - IMGUI_API void SetScrollHere(float center_y_ratio = 0.5f); // adjust scrolling amount to make current cursor position visible. center_y_ratio=0.0: top, 0.5: center, 1.0: bottom. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead. - IMGUI_API void SetScrollFromPosY(float pos_y, float center_y_ratio = 0.5f); // adjust scrolling amount to make given position valid. use GetCursorPos() or GetCursorStartPos()+offset to get valid positions. - IMGUI_API void SetStateStorage(ImGuiStorage* tree); // replace tree state storage with our own (if you want to manipulate it yourself, typically clear subsection of it) - IMGUI_API ImGuiStorage* GetStateStorage(); - - // Parameters stacks (shared) - IMGUI_API void PushFont(ImFont* font); // use NULL as a shortcut to push default font - IMGUI_API void PopFont(); - IMGUI_API void PushStyleColor(ImGuiCol idx, ImU32 col); - IMGUI_API void PushStyleColor(ImGuiCol idx, const ImVec4& col); - IMGUI_API void PopStyleColor(int count = 1); - IMGUI_API void PushStyleVar(ImGuiStyleVar idx, float val); - IMGUI_API void PushStyleVar(ImGuiStyleVar idx, const ImVec2& val); - IMGUI_API void PopStyleVar(int count = 1); - IMGUI_API const ImVec4& GetStyleColorVec4(ImGuiCol idx); // retrieve style color as stored in ImGuiStyle structure. use to feed back into PushStyleColor(), otherwhise use GetColorU32() to get style color + style alpha. - IMGUI_API ImFont* GetFont(); // get current font - IMGUI_API float GetFontSize(); // get current font size (= height in pixels) of current font with current scale applied - IMGUI_API ImVec2 GetFontTexUvWhitePixel(); // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API - IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f); // retrieve given style color with style alpha applied and optional extra alpha multiplier - IMGUI_API ImU32 GetColorU32(const ImVec4& col); // retrieve given color with style alpha applied - IMGUI_API ImU32 GetColorU32(ImU32 col); // retrieve given color with style alpha applied - - // Parameters stacks (current window) - IMGUI_API void PushItemWidth(float item_width); // width of items for the common item+label case, pixels. 0.0f = default to ~2/3 of windows width, >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side) - IMGUI_API void PopItemWidth(); - IMGUI_API float CalcItemWidth(); // width of item given pushed settings and current cursor position - IMGUI_API void PushTextWrapPos(float wrap_pos_x = 0.0f); // word-wrapping for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space - IMGUI_API void PopTextWrapPos(); - IMGUI_API void PushAllowKeyboardFocus(bool allow_keyboard_focus); // allow focusing using TAB/Shift-TAB, enabled by default but you can disable it for certain widgets - IMGUI_API void PopAllowKeyboardFocus(); - IMGUI_API void PushButtonRepeat(bool repeat); // in 'repeat' mode, Button*() functions return repeated true in a typematic manner (using io.KeyRepeatDelay/io.KeyRepeatRate setting). Note that you can call IsItemActive() after any Button() to tell if the button is held in the current frame. - IMGUI_API void PopButtonRepeat(); - - // Cursor / Layout - IMGUI_API void Separator(); // separator, generally horizontal. inside a menu bar or in horizontal layout mode, this becomes a vertical separator. - IMGUI_API void SameLine(float pos_x = 0.0f, float spacing_w = -1.0f); // call between widgets or groups to layout them horizontally - IMGUI_API void NewLine(); // undo a SameLine() - IMGUI_API void Spacing(); // add vertical spacing - IMGUI_API void Dummy(const ImVec2& size); // add a dummy item of given size - IMGUI_API void Indent(float indent_w = 0.0f); // move content position toward the right, by style.IndentSpacing or indent_w if != 0 - IMGUI_API void Unindent(float indent_w = 0.0f); // move content position back to the left, by style.IndentSpacing or indent_w if != 0 - IMGUI_API void BeginGroup(); // lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) - IMGUI_API void EndGroup(); - IMGUI_API ImVec2 GetCursorPos(); // cursor position is relative to window position - IMGUI_API float GetCursorPosX(); // " - IMGUI_API float GetCursorPosY(); // " - IMGUI_API void SetCursorPos(const ImVec2& local_pos); // " - IMGUI_API void SetCursorPosX(float x); // " - IMGUI_API void SetCursorPosY(float y); // " - IMGUI_API ImVec2 GetCursorStartPos(); // initial cursor position - IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute screen coordinates [0..io.DisplaySize] (useful to work with ImDrawList API) - IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute screen coordinates [0..io.DisplaySize] - IMGUI_API void AlignTextToFramePadding(); // vertically align/lower upcoming text to FramePadding.y so that it will aligns to upcoming widgets (call if you have text on a line before regular widgets) - IMGUI_API float GetTextLineHeight(); // ~ FontSize - IMGUI_API float GetTextLineHeightWithSpacing(); // ~ FontSize + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of text) - IMGUI_API float GetFrameHeight(); // ~ FontSize + style.FramePadding.y * 2 - IMGUI_API float GetFrameHeightWithSpacing(); // ~ FontSize + style.FramePadding.y * 2 + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of framed widgets) - - // Columns - // You can also use SameLine(pos_x) for simplified columns. The columns API is still work-in-progress and rather lacking. - IMGUI_API void Columns(int count = 1, const char* id = NULL, bool border = true); - IMGUI_API void NextColumn(); // next column, defaults to current row or next row if the current row is finished - IMGUI_API int GetColumnIndex(); // get current column index - IMGUI_API float GetColumnWidth(int column_index = -1); // get column width (in pixels). pass -1 to use current column - IMGUI_API void SetColumnWidth(int column_index, float width); // set column width (in pixels). pass -1 to use current column - IMGUI_API float GetColumnOffset(int column_index = -1); // get position of column line (in pixels, from the left side of the contents region). pass -1 to use current column, otherwise 0..GetColumnsCount() inclusive. column 0 is typically 0.0f - IMGUI_API void SetColumnOffset(int column_index, float offset_x); // set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column - IMGUI_API int GetColumnsCount(); - - // ID scopes - // If you are creating widgets in a loop you most likely want to push a unique identifier (e.g. object pointer, loop index) so ImGui can differentiate them. - // You can also use the "##foobar" syntax within widget label to distinguish them from each others. Read "A primer on the use of labels/IDs" in the FAQ for more details. - IMGUI_API void PushID(const char* str_id); // push identifier into the ID stack. IDs are hash of the entire stack! - IMGUI_API void PushID(const char* str_id_begin, const char* str_id_end); - IMGUI_API void PushID(const void* ptr_id); - IMGUI_API void PushID(int int_id); - IMGUI_API void PopID(); - IMGUI_API ImGuiID GetID(const char* str_id); // calculate unique ID (hash of whole ID stack + given parameter). e.g. if you want to query into ImGuiStorage yourself - IMGUI_API ImGuiID GetID(const char* str_id_begin, const char* str_id_end); - IMGUI_API ImGuiID GetID(const void* ptr_id); - - // Widgets: Text - IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text. - IMGUI_API void Text(const char* fmt, ...) IM_FMTARGS(1); // simple formatted text - IMGUI_API void TextV(const char* fmt, va_list args) IM_FMTLIST(1); - IMGUI_API void TextColored(const ImVec4& col, const char* fmt, ...) IM_FMTARGS(2); // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor(); - IMGUI_API void TextColoredV(const ImVec4& col, const char* fmt, va_list args) IM_FMTLIST(2); - IMGUI_API void TextDisabled(const char* fmt, ...) IM_FMTARGS(1); // shortcut for PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); Text(fmt, ...); PopStyleColor(); - IMGUI_API void TextDisabledV(const char* fmt, va_list args) IM_FMTLIST(1); - IMGUI_API void TextWrapped(const char* fmt, ...) IM_FMTARGS(1); // shortcut for PushTextWrapPos(0.0f); Text(fmt, ...); PopTextWrapPos();. Note that this won't work on an auto-resizing window if there's no other widgets to extend the window width, yoy may need to set a size using SetNextWindowSize(). - IMGUI_API void TextWrappedV(const char* fmt, va_list args) IM_FMTLIST(1); - IMGUI_API void LabelText(const char* label, const char* fmt, ...) IM_FMTARGS(2); // display text+label aligned the same way as value+label widgets - IMGUI_API void LabelTextV(const char* label, const char* fmt, va_list args) IM_FMTLIST(2); - IMGUI_API void BulletText(const char* fmt, ...) IM_FMTARGS(1); // shortcut for Bullet()+Text() - IMGUI_API void BulletTextV(const char* fmt, va_list args) IM_FMTLIST(1); - IMGUI_API void Bullet(); // draw a small circle and keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses - - // Widgets: Main - IMGUI_API bool Button(const char* label, const ImVec2& size = ImVec2(0,0)); // button - IMGUI_API bool SmallButton(const char* label); // button with FramePadding=(0,0) to easily embed within text - IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size); // button behavior without the visuals, useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.) - IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0)); - IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1)); // <0 frame_padding uses default frame padding settings. 0 for no padding - IMGUI_API bool Checkbox(const char* label, bool* v); - IMGUI_API bool CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value); - IMGUI_API bool RadioButton(const char* label, bool active); - IMGUI_API bool RadioButton(const char* label, int* v, int v_button); - IMGUI_API void PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0), int stride = sizeof(float)); - IMGUI_API void PlotLines(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0)); - IMGUI_API void PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0), int stride = sizeof(float)); - IMGUI_API void PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0)); - IMGUI_API void ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-1,0), const char* overlay = NULL); - - // Widgets: Combo Box - // The new BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it. - // The old Combo() api are helpers over BeginCombo()/EndCombo() which are kept available for convenience purpose. - IMGUI_API bool BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags = 0); - IMGUI_API void EndCombo(); - IMGUI_API bool Combo(const char* label, int* current_item, const char* const items[], int items_count, int popup_max_height_in_items = -1); - IMGUI_API bool Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_max_height_in_items = -1); // Separate items with \0 within a string, end item-list with \0\0. e.g. "One\0Two\0Three\0" - IMGUI_API bool Combo(const char* label, int* current_item, bool(*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int popup_max_height_in_items = -1); - - // Widgets: Drags (tip: ctrl+click on a drag box to input with keyboard. manually input values aren't clamped, can go off-bounds) - // For all the Float2/Float3/Float4/Int2/Int3/Int4 versions of every functions, note that a 'float v[X]' function argument is the same as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. You can pass address of your first element out of a contiguous set, e.g. &myvector.x - IMGUI_API bool DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f); // If v_min >= v_max we have no bound - IMGUI_API bool DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f); - IMGUI_API bool DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f); - IMGUI_API bool DragFloat4(const char* label, float v[4], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f); - IMGUI_API bool DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", const char* display_format_max = NULL, float power = 1.0f); - IMGUI_API bool DragInt(const char* label, int* v, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f"); // If v_min >= v_max we have no bound - IMGUI_API bool DragInt2(const char* label, int v[2], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f"); - IMGUI_API bool DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f"); - IMGUI_API bool DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f"); - IMGUI_API bool DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f", const char* display_format_max = NULL); - - // Widgets: Input with Keyboard - IMGUI_API bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL); - IMGUI_API bool InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0,0), ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL); - IMGUI_API bool InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0); - IMGUI_API bool InputFloat2(const char* label, float v[2], int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0); - IMGUI_API bool InputFloat3(const char* label, float v[3], int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0); - IMGUI_API bool InputFloat4(const char* label, float v[4], int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0); - IMGUI_API bool InputInt(const char* label, int* v, int step = 1, int step_fast = 100, ImGuiInputTextFlags extra_flags = 0); - IMGUI_API bool InputInt2(const char* label, int v[2], ImGuiInputTextFlags extra_flags = 0); - IMGUI_API bool InputInt3(const char* label, int v[3], ImGuiInputTextFlags extra_flags = 0); - IMGUI_API bool InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_flags = 0); - - // Widgets: Sliders (tip: ctrl+click on a slider to input with keyboard. manually input values aren't clamped, can go off-bounds) - IMGUI_API bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f); // adjust display_format to decorate the value with a prefix or a suffix for in-slider labels or unit display. Use power!=1.0 for logarithmic sliders - IMGUI_API bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f); - IMGUI_API bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f); - IMGUI_API bool SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f); - IMGUI_API bool SliderAngle(const char* label, float* v_rad, float v_degrees_min = -360.0f, float v_degrees_max = +360.0f); - IMGUI_API bool SliderInt(const char* label, int* v, int v_min, int v_max, const char* display_format = "%.0f"); - IMGUI_API bool SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* display_format = "%.0f"); - IMGUI_API bool SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* display_format = "%.0f"); - IMGUI_API bool SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* display_format = "%.0f"); - IMGUI_API bool VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f); - IMGUI_API bool VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* display_format = "%.0f"); - - // Widgets: Color Editor/Picker (tip: the ColorEdit* functions have a little colored preview square that can be left-clicked to open a picker, and right-clicked to open an option menu.) - // Note that a 'float v[X]' function argument is the same as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. You can the pass the address of a first float element out of a contiguous structure, e.g. &myvector.x - IMGUI_API bool ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags = 0); - IMGUI_API bool ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0); - IMGUI_API bool ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags = 0); - IMGUI_API bool ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags = 0, const float* ref_col = NULL); - IMGUI_API bool ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0,0)); // display a colored square/button, hover for details, return true when pressed. - IMGUI_API void SetColorEditOptions(ImGuiColorEditFlags flags); // initialize current options (generally on application startup) if you want to select a default format, picker type, etc. User will be able to change many settings, unless you pass the _NoOptions flag to your calls. - - // Widgets: Trees - IMGUI_API bool TreeNode(const char* label); // if returning 'true' the node is open and the tree id is pushed into the id stack. user is responsible for calling TreePop(). - IMGUI_API bool TreeNode(const char* str_id, const char* fmt, ...) IM_FMTARGS(2); // read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet(). - IMGUI_API bool TreeNode(const void* ptr_id, const char* fmt, ...) IM_FMTARGS(2); // " - IMGUI_API bool TreeNodeV(const char* str_id, const char* fmt, va_list args) IM_FMTLIST(2); - IMGUI_API bool TreeNodeV(const void* ptr_id, const char* fmt, va_list args) IM_FMTLIST(2); - IMGUI_API bool TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags = 0); - IMGUI_API bool TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3); - IMGUI_API bool TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3); - IMGUI_API bool TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); - IMGUI_API bool TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); - IMGUI_API void TreePush(const char* str_id); // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call Push/Pop yourself for layout purpose - IMGUI_API void TreePush(const void* ptr_id = NULL); // " - IMGUI_API void TreePop(); // ~ Unindent()+PopId() - IMGUI_API void TreeAdvanceToLabelPos(); // advance cursor x position by GetTreeNodeToLabelSpacing() - IMGUI_API float GetTreeNodeToLabelSpacing(); // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode - IMGUI_API void SetNextTreeNodeOpen(bool is_open, ImGuiCond cond = 0); // set next TreeNode/CollapsingHeader open state. - IMGUI_API bool CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0); // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop(). - IMGUI_API bool CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags flags = 0); // when 'p_open' isn't NULL, display an additional small close button on upper right of the header - - // Widgets: Selectable / Lists - IMGUI_API bool Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0)); // size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height - IMGUI_API bool Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0)); - IMGUI_API bool ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items = -1); - IMGUI_API bool ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1); - IMGUI_API bool ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0,0)); // use if you want to reimplement ListBox() will custom data or interactions. make sure to call ListBoxFooter() afterwards. - IMGUI_API bool ListBoxHeader(const char* label, int items_count, int height_in_items = -1); // " - IMGUI_API void ListBoxFooter(); // terminate the scrolling region - - // Widgets: Value() Helpers. Output single value in "name: value" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace) - IMGUI_API void Value(const char* prefix, bool b); - IMGUI_API void Value(const char* prefix, int v); - IMGUI_API void Value(const char* prefix, unsigned int v); - IMGUI_API void Value(const char* prefix, float v, const char* float_format = NULL); - - // Tooltips - IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set text tooltip under mouse-cursor, typically use with ImGui::IsItemHovered(). overidde any previous call to SetTooltip(). - IMGUI_API void SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1); - IMGUI_API void BeginTooltip(); // begin/append a tooltip window. to create full-featured tooltip (with any kind of contents). - IMGUI_API void EndTooltip(); - - // Menus - IMGUI_API bool BeginMainMenuBar(); // create and append to a full screen menu-bar. only call EndMainMenuBar() if this returns true! - IMGUI_API void EndMainMenuBar(); - IMGUI_API bool BeginMenuBar(); // append to menu-bar of current window (requires ImGuiWindowFlags_MenuBar flag set on parent window). only call EndMenuBar() if this returns true! - IMGUI_API void EndMenuBar(); - IMGUI_API bool BeginMenu(const char* label, bool enabled = true); // create a sub-menu entry. only call EndMenu() if this returns true! - IMGUI_API void EndMenu(); - IMGUI_API bool MenuItem(const char* label, const char* shortcut = NULL, bool selected = false, bool enabled = true); // return true when activated. shortcuts are displayed for convenience but not processed by ImGui at the moment - IMGUI_API bool MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true); // return true when activated + toggle (*p_selected) if p_selected != NULL - - // Popups - IMGUI_API void OpenPopup(const char* str_id); // call to mark popup as open (don't call every frame!). popups are closed when user click outside, or if CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. By default, Selectable()/MenuItem() are calling CloseCurrentPopup(). Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level). - IMGUI_API bool OpenPopupOnItemClick(const char* str_id = NULL, int mouse_button = 1); // helper to open popup when clicked on last item. return true when just opened. - IMGUI_API bool BeginPopup(const char* str_id); // return true if the popup is open, and you can start outputting to it. only call EndPopup() if BeginPopup() returned true! - IMGUI_API bool BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags extra_flags = 0); // modal dialog (block interactions behind the modal window, can't close the modal window by clicking outside) - IMGUI_API bool BeginPopupContextItem(const char* str_id = NULL, int mouse_button = 1); // helper to open and begin popup when clicked on last item. if you can pass a NULL str_id only if the previous item had an id. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp! - IMGUI_API bool BeginPopupContextWindow(const char* str_id = NULL, int mouse_button = 1, bool also_over_items = true); // helper to open and begin popup when clicked on current window. - IMGUI_API bool BeginPopupContextVoid(const char* str_id = NULL, int mouse_button = 1); // helper to open and begin popup when clicked in void (where there are no imgui windows). - IMGUI_API void EndPopup(); - IMGUI_API bool IsPopupOpen(const char* str_id); // return true if the popup is open - IMGUI_API void CloseCurrentPopup(); // close the popup we have begin-ed into. clicking on a MenuItem or Selectable automatically close the current popup. - - // Logging/Capture: all text output from interface is captured to tty/file/clipboard. By default, tree nodes are automatically opened during logging. - IMGUI_API void LogToTTY(int max_depth = -1); // start logging to tty - IMGUI_API void LogToFile(int max_depth = -1, const char* filename = NULL); // start logging to file - IMGUI_API void LogToClipboard(int max_depth = -1); // start logging to OS clipboard - IMGUI_API void LogFinish(); // stop logging (close file, etc.) - IMGUI_API void LogButtons(); // helper to display buttons for logging to tty/file/clipboard - IMGUI_API void LogText(const char* fmt, ...) IM_FMTARGS(1); // pass text data straight to log (without being displayed) - - // Drag and Drop - // [BETA API] Missing Demo code. API may evolve. - IMGUI_API bool BeginDragDropSource(ImGuiDragDropFlags flags = 0, int mouse_button = 0); // call when the current item is active. If this return true, you can call SetDragDropPayload() + EndDragDropSource() - IMGUI_API bool SetDragDropPayload(const char* type, const void* data, size_t size, ImGuiCond cond = 0);// type is a user defined string of maximum 8 characters. Strings starting with '_' are reserved for dear imgui internal types. Data is copied and held by imgui. - IMGUI_API void EndDragDropSource(); - IMGUI_API bool BeginDragDropTarget(); // call after submitting an item that may receive an item. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget() - IMGUI_API const ImGuiPayload* AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags = 0); // accept contents of a given type. If ImGuiDragDropFlags_AcceptBeforeDelivery is set you can peek into the payload before the mouse button is released. - IMGUI_API void EndDragDropTarget(); - - // Clipping - IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect); - IMGUI_API void PopClipRect(); - - // Styles - IMGUI_API void StyleColorsClassic(ImGuiStyle* dst = NULL); - IMGUI_API void StyleColorsDark(ImGuiStyle* dst = NULL); - IMGUI_API void StyleColorsLight(ImGuiStyle* dst = NULL); - - // Focus - // (FIXME: Those functions will be reworked after we merge the navigation branch + have a pass at focusing/tabbing features.) - // (Prefer using "SetItemDefaultFocus()" over "if (IsWindowAppearing()) SetScrollHere()" when applicable, to make your code more forward compatible when navigation branch is merged) - IMGUI_API void SetItemDefaultFocus(); // make last item the default focused item of a window (WIP navigation branch only). Pleaase use instead of SetScrollHere(). - IMGUI_API void SetKeyboardFocusHere(int offset = 0); // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget. Use -1 to access previous widget. - - // Utilities - IMGUI_API bool IsItemHovered(ImGuiHoveredFlags flags = 0); // is the last item hovered? (and usable, aka not blocked by a popup, etc.). See ImGuiHoveredFlags for more options. - IMGUI_API bool IsItemActive(); // is the last item active? (e.g. button being held, text field being edited- items that don't interact will always return false) - IMGUI_API bool IsItemClicked(int mouse_button = 0); // is the last item clicked? (e.g. button/node just clicked on) - IMGUI_API bool IsItemVisible(); // is the last item visible? (aka not out of sight due to clipping/scrolling.) - IMGUI_API bool IsAnyItemHovered(); - IMGUI_API bool IsAnyItemActive(); - IMGUI_API ImVec2 GetItemRectMin(); // get bounding rectangle of last item, in screen space - IMGUI_API ImVec2 GetItemRectMax(); // " - IMGUI_API ImVec2 GetItemRectSize(); // get size of last item, in screen space - IMGUI_API void SetItemAllowOverlap(); // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area. - IMGUI_API bool IsWindowFocused(ImGuiFocusedFlags flags = 0); // is current window focused? or its root/child, depending on flags. see flags for options. - IMGUI_API bool IsWindowHovered(ImGuiHoveredFlags flags = 0); // is current window hovered (and typically: not blocked by a popup/modal)? see flags for options. - IMGUI_API bool IsAnyWindowFocused(); - IMGUI_API bool IsAnyWindowHovered(); // is mouse hovering any visible window - IMGUI_API bool IsRectVisible(const ImVec2& size); // test if rectangle (of given size, starting from cursor position) is visible / not clipped. - IMGUI_API bool IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max); // test if rectangle (in screen space) is visible / not clipped. to perform coarse clipping on user's side. - IMGUI_API float GetTime(); - IMGUI_API int GetFrameCount(); - IMGUI_API ImDrawList* GetOverlayDrawList(); // this draw list will be the last rendered one, useful to quickly draw overlays shapes/text - IMGUI_API ImDrawListSharedData* GetDrawListSharedData(); - IMGUI_API const char* GetStyleColorName(ImGuiCol idx); - IMGUI_API ImVec2 CalcItemRectClosestPoint(const ImVec2& pos, bool on_edge = false, float outward = +0.0f); // utility to find the closest point the last item bounding rectangle edge. useful to visually link items - IMGUI_API ImVec2 CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); - IMGUI_API void CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end); // calculate coarse clipping for large list of evenly sized items. Prefer using the ImGuiListClipper higher-level helper if you can. - - IMGUI_API bool BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags extra_flags = 0); // helper to create a child window / scrolling region that looks like a normal widget frame - IMGUI_API void EndChildFrame(); - - IMGUI_API ImVec4 ColorConvertU32ToFloat4(ImU32 in); - IMGUI_API ImU32 ColorConvertFloat4ToU32(const ImVec4& in); - IMGUI_API void ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v); - IMGUI_API void ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b); - - // Inputs - IMGUI_API int GetKeyIndex(ImGuiKey imgui_key); // map ImGuiKey_* values into user's key index. == io.KeyMap[key] - IMGUI_API bool IsKeyDown(int user_key_index); // is key being held. == io.KeysDown[user_key_index]. note that imgui doesn't know the semantic of each entry of io.KeyDown[]. Use your own indices/enums according to how your backend/engine stored them into KeyDown[]! - IMGUI_API bool IsKeyPressed(int user_key_index, bool repeat = true); // was key pressed (went from !Down to Down). if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate - IMGUI_API bool IsKeyReleased(int user_key_index); // was key released (went from Down to !Down).. - IMGUI_API int GetKeyPressedAmount(int key_index, float repeat_delay, float rate); // uses provided repeat rate/delay. return a count, most often 0 or 1 but might be >1 if RepeatRate is small enough that DeltaTime > RepeatRate - IMGUI_API bool IsMouseDown(int button); // is mouse button held - IMGUI_API bool IsMouseClicked(int button, bool repeat = false); // did mouse button clicked (went from !Down to Down) - IMGUI_API bool IsMouseDoubleClicked(int button); // did mouse button double-clicked. a double-click returns false in IsMouseClicked(). uses io.MouseDoubleClickTime. - IMGUI_API bool IsMouseReleased(int button); // did mouse button released (went from Down to !Down) - IMGUI_API bool IsMouseDragging(int button = 0, float lock_threshold = -1.0f); // is mouse dragging. if lock_threshold < -1.0f uses io.MouseDraggingThreshold - IMGUI_API bool IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true); // is mouse hovering given bounding rect (in screen space). clipped by current clipping settings. disregarding of consideration of focus/window ordering/blocked by a popup. - IMGUI_API bool IsMousePosValid(const ImVec2* mouse_pos = NULL); // - IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls - IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve backup of mouse positioning at the time of opening popup we have BeginPopup() into - IMGUI_API ImVec2 GetMouseDragDelta(int button = 0, float lock_threshold = -1.0f); // dragging amount since clicking. if lock_threshold < -1.0f uses io.MouseDraggingThreshold - IMGUI_API void ResetMouseDragDelta(int button = 0); // - IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired cursor type, reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you - IMGUI_API void SetMouseCursor(ImGuiMouseCursor type); // set desired cursor type - IMGUI_API void CaptureKeyboardFromApp(bool capture = true); // manually override io.WantCaptureKeyboard flag next frame (said flag is entirely left for your application handle). e.g. force capture keyboard when your widget is being hovered. - IMGUI_API void CaptureMouseFromApp(bool capture = true); // manually override io.WantCaptureMouse flag next frame (said flag is entirely left for your application handle). - - // Helpers functions to access functions pointers in ImGui::GetIO() - IMGUI_API void* MemAlloc(size_t sz); - IMGUI_API void MemFree(void* ptr); - IMGUI_API const char* GetClipboardText(); - IMGUI_API void SetClipboardText(const char* text); - - // Internal context access - if you want to use multiple context, share context between modules (e.g. DLL). There is a default context created and active by default. - // All contexts share a same ImFontAtlas by default. If you want different font atlas, you can new() them and overwrite the GetIO().Fonts variable of an ImGui context. - IMGUI_API const char* GetVersion(); - IMGUI_API ImGuiContext* CreateContext(void* (*malloc_fn)(size_t) = NULL, void (*free_fn)(void*) = NULL); - IMGUI_API void DestroyContext(ImGuiContext* ctx); - IMGUI_API ImGuiContext* GetCurrentContext(); - IMGUI_API void SetCurrentContext(ImGuiContext* ctx); - -} // namespace ImGui - -// Flags for ImGui::Begin() -enum ImGuiWindowFlags_ -{ - ImGuiWindowFlags_NoTitleBar = 1 << 0, // Disable title-bar - ImGuiWindowFlags_NoResize = 1 << 1, // Disable user resizing with the lower-right grip - ImGuiWindowFlags_NoMove = 1 << 2, // Disable user moving the window - ImGuiWindowFlags_NoScrollbar = 1 << 3, // Disable scrollbars (window can still scroll with mouse or programatically) - ImGuiWindowFlags_NoScrollWithMouse = 1 << 4, // Disable user vertically scrolling with mouse wheel. On child window, mouse wheel will be forwarded to the parent unless NoScrollbar is also set. - ImGuiWindowFlags_NoCollapse = 1 << 5, // Disable user collapsing window by double-clicking on it - ImGuiWindowFlags_AlwaysAutoResize = 1 << 6, // Resize every window to its content every frame - //ImGuiWindowFlags_ShowBorders = 1 << 7, // Show borders around windows and items (OBSOLETE! Use e.g. style.FrameBorderSize=1.0f to enable borders). - ImGuiWindowFlags_NoSavedSettings = 1 << 8, // Never load/save settings in .ini file - ImGuiWindowFlags_NoInputs = 1 << 9, // Disable catching mouse or keyboard inputs, hovering test with pass through. - ImGuiWindowFlags_MenuBar = 1 << 10, // Has a menu-bar - ImGuiWindowFlags_HorizontalScrollbar = 1 << 11, // Allow horizontal scrollbar to appear (off by default). You may use SetNextWindowContentSize(ImVec2(width,0.0f)); prior to calling Begin() to specify width. Read code in imgui_demo in the "Horizontal Scrolling" section. - ImGuiWindowFlags_NoFocusOnAppearing = 1 << 12, // Disable taking focus when transitioning from hidden to visible state - ImGuiWindowFlags_NoBringToFrontOnFocus = 1 << 13, // Disable bringing window to front when taking focus (e.g. clicking on it or programatically giving it focus) - ImGuiWindowFlags_AlwaysVerticalScrollbar= 1 << 14, // Always show vertical scrollbar (even if ContentSize.y < Size.y) - ImGuiWindowFlags_AlwaysHorizontalScrollbar=1<< 15, // Always show horizontal scrollbar (even if ContentSize.x < Size.x) - ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16, // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient) - ImGuiWindowFlags_ResizeFromAnySide = 1 << 17, // (WIP) Enable resize from any corners and borders. Your back-end needs to honor the different values of io.MouseCursor set by imgui. - - // [Internal] - ImGuiWindowFlags_ChildWindow = 1 << 24, // Don't use! For internal use by BeginChild() - ImGuiWindowFlags_Tooltip = 1 << 25, // Don't use! For internal use by BeginTooltip() - ImGuiWindowFlags_Popup = 1 << 26, // Don't use! For internal use by BeginPopup() - ImGuiWindowFlags_Modal = 1 << 27, // Don't use! For internal use by BeginPopupModal() - ImGuiWindowFlags_ChildMenu = 1 << 28 // Don't use! For internal use by BeginMenu() -}; - -// Flags for ImGui::InputText() -enum ImGuiInputTextFlags_ -{ - ImGuiInputTextFlags_CharsDecimal = 1 << 0, // Allow 0123456789.+-*/ - ImGuiInputTextFlags_CharsHexadecimal = 1 << 1, // Allow 0123456789ABCDEFabcdef - ImGuiInputTextFlags_CharsUppercase = 1 << 2, // Turn a..z into A..Z - ImGuiInputTextFlags_CharsNoBlank = 1 << 3, // Filter out spaces, tabs - ImGuiInputTextFlags_AutoSelectAll = 1 << 4, // Select entire text when first taking mouse focus - ImGuiInputTextFlags_EnterReturnsTrue = 1 << 5, // Return 'true' when Enter is pressed (as opposed to when the value was modified) - ImGuiInputTextFlags_CallbackCompletion = 1 << 6, // Call user function on pressing TAB (for completion handling) - ImGuiInputTextFlags_CallbackHistory = 1 << 7, // Call user function on pressing Up/Down arrows (for history handling) - ImGuiInputTextFlags_CallbackAlways = 1 << 8, // Call user function every time. User code may query cursor position, modify text buffer. - ImGuiInputTextFlags_CallbackCharFilter = 1 << 9, // Call user function to filter character. Modify data->EventChar to replace/filter input, or return 1 to discard character. - ImGuiInputTextFlags_AllowTabInput = 1 << 10, // Pressing TAB input a '\t' character into the text field - ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11, // In multi-line mode, unfocus with Enter, add new line with Ctrl+Enter (default is opposite: unfocus with Ctrl+Enter, add line with Enter). - ImGuiInputTextFlags_NoHorizontalScroll = 1 << 12, // Disable following the cursor horizontally - ImGuiInputTextFlags_AlwaysInsertMode = 1 << 13, // Insert mode - ImGuiInputTextFlags_ReadOnly = 1 << 14, // Read-only mode - ImGuiInputTextFlags_Password = 1 << 15, // Password mode, display all characters as '*' - ImGuiInputTextFlags_NoUndoRedo = 1 << 16, // Disable undo/redo. Note that input text owns the text data while active, if you want to provide your own undo/redo stack you need e.g. to call ClearActiveID(). - // [Internal] - ImGuiInputTextFlags_Multiline = 1 << 20 // For internal use by InputTextMultiline() -}; - -// Flags for ImGui::TreeNodeEx(), ImGui::CollapsingHeader*() -enum ImGuiTreeNodeFlags_ -{ - ImGuiTreeNodeFlags_Selected = 1 << 0, // Draw as selected - ImGuiTreeNodeFlags_Framed = 1 << 1, // Full colored frame (e.g. for CollapsingHeader) - ImGuiTreeNodeFlags_AllowItemOverlap = 1 << 2, // Hit testing to allow subsequent widgets to overlap this one - ImGuiTreeNodeFlags_NoTreePushOnOpen = 1 << 3, // Don't do a TreePush() when open (e.g. for CollapsingHeader) = no extra indent nor pushing on ID stack - ImGuiTreeNodeFlags_NoAutoOpenOnLog = 1 << 4, // Don't automatically and temporarily open node when Logging is active (by default logging will automatically open tree nodes) - ImGuiTreeNodeFlags_DefaultOpen = 1 << 5, // Default node to be open - ImGuiTreeNodeFlags_OpenOnDoubleClick = 1 << 6, // Need double-click to open node - ImGuiTreeNodeFlags_OpenOnArrow = 1 << 7, // Only open when clicking on the arrow part. If ImGuiTreeNodeFlags_OpenOnDoubleClick is also set, single-click arrow or double-click all box to open. - ImGuiTreeNodeFlags_Leaf = 1 << 8, // No collapsing, no arrow (use as a convenience for leaf nodes). - ImGuiTreeNodeFlags_Bullet = 1 << 9, // Display a bullet instead of arrow - ImGuiTreeNodeFlags_FramePadding = 1 << 10, // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding(). - //ImGuITreeNodeFlags_SpanAllAvailWidth = 1 << 11, // FIXME: TODO: Extend hit box horizontally even if not framed - //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 12, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible - ImGuiTreeNodeFlags_CollapsingHeader = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoAutoOpenOnLog - - // Obsolete names (will be removed) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - , ImGuiTreeNodeFlags_AllowOverlapMode = ImGuiTreeNodeFlags_AllowItemOverlap -#endif -}; - -// Flags for ImGui::Selectable() -enum ImGuiSelectableFlags_ -{ - ImGuiSelectableFlags_DontClosePopups = 1 << 0, // Clicking this don't close parent popup window - ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Selectable frame can span all columns (text will still fit in current column) - ImGuiSelectableFlags_AllowDoubleClick = 1 << 2 // Generate press events on double clicks too -}; - -// Flags for ImGui::BeginCombo() -enum ImGuiComboFlags_ -{ - ImGuiComboFlags_PopupAlignLeft = 1 << 0, // Align the popup toward the left by default - ImGuiComboFlags_HeightSmall = 1 << 1, // Max ~4 items visible. Tip: If you want your combo popup to be a specific size you can use SetNextWindowSizeConstraints() prior to calling BeginCombo() - ImGuiComboFlags_HeightRegular = 1 << 2, // Max ~8 items visible (default) - ImGuiComboFlags_HeightLarge = 1 << 3, // Max ~20 items visible - ImGuiComboFlags_HeightLargest = 1 << 4, // As many fitting items as possible - ImGuiComboFlags_HeightMask_ = ImGuiComboFlags_HeightSmall | ImGuiComboFlags_HeightRegular | ImGuiComboFlags_HeightLarge | ImGuiComboFlags_HeightLargest -}; - -// Flags for ImGui::IsWindowFocused() -enum ImGuiFocusedFlags_ -{ - ImGuiFocusedFlags_ChildWindows = 1 << 0, // IsWindowFocused(): Return true if any children of the window is focused - ImGuiFocusedFlags_RootWindow = 1 << 1, // IsWindowFocused(): Test from root window (top most parent of the current hierarchy) - ImGuiFocusedFlags_RootAndChildWindows = ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows -}; - -// Flags for ImGui::IsItemHovered(), ImGui::IsWindowHovered() -enum ImGuiHoveredFlags_ -{ - ImGuiHoveredFlags_Default = 0, // Return true if directly over the item/window, not obstructed by another window, not obstructed by an active popup or modal blocking inputs under them. - ImGuiHoveredFlags_ChildWindows = 1 << 0, // IsWindowHovered() only: Return true if any children of the window is hovered - ImGuiHoveredFlags_RootWindow = 1 << 1, // IsWindowHovered() only: Test from root window (top most parent of the current hierarchy) - ImGuiHoveredFlags_AllowWhenBlockedByPopup = 1 << 2, // Return true even if a popup window is normally blocking access to this item/window - //ImGuiHoveredFlags_AllowWhenBlockedByModal = 1 << 3, // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet. - ImGuiHoveredFlags_AllowWhenBlockedByActiveItem = 1 << 4, // Return true even if an active item is blocking access to this item/window. Useful for Drag and Drop patterns. - ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 5, // Return true even if the position is overlapped by another window - ImGuiHoveredFlags_RectOnly = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped, - ImGuiHoveredFlags_RootAndChildWindows = ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows -}; - -// Flags for ImGui::BeginDragDropSource(), ImGui::AcceptDragDropPayload() -enum ImGuiDragDropFlags_ -{ - // BeginDragDropSource() flags - ImGuiDragDropFlags_SourceNoPreviewTooltip = 1 << 0, // By default, a successful call to BeginDragDropSource opens a tooltip so you can display a preview or description of the source contents. This flag disable this behavior. - ImGuiDragDropFlags_SourceNoDisableHover = 1 << 1, // By default, when dragging we clear data so that IsItemHovered() will return true, to avoid subsequent user code submitting tooltips. This flag disable this behavior so you can still call IsItemHovered() on the source item. - ImGuiDragDropFlags_SourceNoHoldToOpenOthers = 1 << 2, // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item. - ImGuiDragDropFlags_SourceAllowNullID = 1 << 3, // Allow items such as Text(), Image() that have no unique identifier to be used as drag source, by manufacturing a temporary identifier based on their window-relative position. This is extremely unusual within the dear imgui ecosystem and so we made it explicit. - ImGuiDragDropFlags_SourceExtern = 1 << 4, // External source (from outside of imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously. - // AcceptDragDropPayload() flags - ImGuiDragDropFlags_AcceptBeforeDelivery = 1 << 10, // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered. - ImGuiDragDropFlags_AcceptNoDrawDefaultRect = 1 << 11, // Do not draw the default highlight rectangle when hovering over target. - ImGuiDragDropFlags_AcceptPeekOnly = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoDrawDefaultRect // For peeking ahead and inspecting the payload before delivery. -}; - -// Standard Drag and Drop payload types. You can define you own payload types using 8-characters long strings. Types starting with '_' are defined by Dear ImGui. -#define IMGUI_PAYLOAD_TYPE_COLOR_3F "_COL3F" // float[3] // Standard type for colors, without alpha. User code may use this type. -#define IMGUI_PAYLOAD_TYPE_COLOR_4F "_COL4F" // float[4] // Standard type for colors. User code may use this type. - -// User fill ImGuiIO.KeyMap[] array with indices into the ImGuiIO.KeysDown[512] array -enum ImGuiKey_ -{ - ImGuiKey_Tab, // for tabbing through fields - ImGuiKey_LeftArrow, // for text edit - ImGuiKey_RightArrow,// for text edit - ImGuiKey_UpArrow, // for text edit - ImGuiKey_DownArrow, // for text edit - ImGuiKey_PageUp, - ImGuiKey_PageDown, - ImGuiKey_Home, // for text edit - ImGuiKey_End, // for text edit - ImGuiKey_Delete, // for text edit - ImGuiKey_Backspace, // for text edit - ImGuiKey_Enter, // for text edit - ImGuiKey_Escape, // for text edit - ImGuiKey_A, // for text edit CTRL+A: select all - ImGuiKey_C, // for text edit CTRL+C: copy - ImGuiKey_V, // for text edit CTRL+V: paste - ImGuiKey_X, // for text edit CTRL+X: cut - ImGuiKey_Y, // for text edit CTRL+Y: redo - ImGuiKey_Z, // for text edit CTRL+Z: undo - ImGuiKey_COUNT -}; - -// Enumeration for PushStyleColor() / PopStyleColor() -enum ImGuiCol_ -{ - ImGuiCol_Text, - ImGuiCol_TextDisabled, - ImGuiCol_WindowBg, // Background of normal windows - ImGuiCol_ChildBg, // Background of child windows - ImGuiCol_PopupBg, // Background of popups, menus, tooltips windows - ImGuiCol_Border, - ImGuiCol_BorderShadow, - ImGuiCol_FrameBg, // Background of checkbox, radio button, plot, slider, text input - ImGuiCol_FrameBgHovered, - ImGuiCol_FrameBgActive, - ImGuiCol_TitleBg, - ImGuiCol_TitleBgActive, - ImGuiCol_TitleBgCollapsed, - ImGuiCol_MenuBarBg, - ImGuiCol_ScrollbarBg, - ImGuiCol_ScrollbarGrab, - ImGuiCol_ScrollbarGrabHovered, - ImGuiCol_ScrollbarGrabActive, - ImGuiCol_CheckMark, - ImGuiCol_SliderGrab, - ImGuiCol_SliderGrabActive, - ImGuiCol_Button, - ImGuiCol_ButtonHovered, - ImGuiCol_ButtonActive, - ImGuiCol_Header, - ImGuiCol_HeaderHovered, - ImGuiCol_HeaderActive, - ImGuiCol_Separator, - ImGuiCol_SeparatorHovered, - ImGuiCol_SeparatorActive, - ImGuiCol_ResizeGrip, - ImGuiCol_ResizeGripHovered, - ImGuiCol_ResizeGripActive, - ImGuiCol_CloseButton, - ImGuiCol_CloseButtonHovered, - ImGuiCol_CloseButtonActive, - ImGuiCol_PlotLines, - ImGuiCol_PlotLinesHovered, - ImGuiCol_PlotHistogram, - ImGuiCol_PlotHistogramHovered, - ImGuiCol_TextSelectedBg, - ImGuiCol_ModalWindowDarkening, // darken entire screen when a modal window is active - ImGuiCol_DragDropTarget, - ImGuiCol_COUNT - - // Obsolete names (will be removed) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - //, ImGuiCol_ComboBg = ImGuiCol_PopupBg // ComboBg has been merged with PopupBg, so a redirect isn't accurate. - , ImGuiCol_ChildWindowBg = ImGuiCol_ChildBg, ImGuiCol_Column = ImGuiCol_Separator, ImGuiCol_ColumnHovered = ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive = ImGuiCol_SeparatorActive -#endif -}; - -// Enumeration for PushStyleVar() / PopStyleVar() to temporarily modify the ImGuiStyle structure. -// NB: the enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code. During initialization, feel free to just poke into ImGuiStyle directly. -// NB: if changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type. -enum ImGuiStyleVar_ -{ - // Enum name ......................// Member in ImGuiStyle structure (see ImGuiStyle for descriptions) - ImGuiStyleVar_Alpha, // float Alpha - ImGuiStyleVar_WindowPadding, // ImVec2 WindowPadding - ImGuiStyleVar_WindowRounding, // float WindowRounding - ImGuiStyleVar_WindowBorderSize, // float WindowBorderSize - ImGuiStyleVar_WindowMinSize, // ImVec2 WindowMinSize - ImGuiStyleVar_ChildRounding, // float ChildRounding - ImGuiStyleVar_ChildBorderSize, // float ChildBorderSize - ImGuiStyleVar_PopupRounding, // float PopupRounding - ImGuiStyleVar_PopupBorderSize, // float PopupBorderSize - ImGuiStyleVar_FramePadding, // ImVec2 FramePadding - ImGuiStyleVar_FrameRounding, // float FrameRounding - ImGuiStyleVar_FrameBorderSize, // float FrameBorderSize - ImGuiStyleVar_ItemSpacing, // ImVec2 ItemSpacing - ImGuiStyleVar_ItemInnerSpacing, // ImVec2 ItemInnerSpacing - ImGuiStyleVar_IndentSpacing, // float IndentSpacing - ImGuiStyleVar_GrabMinSize, // float GrabMinSize - ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign - ImGuiStyleVar_Count_ - - // Obsolete names (will be removed) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - , ImGuiStyleVar_ChildWindowRounding = ImGuiStyleVar_ChildRounding -#endif -}; - -// Enumeration for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton() -enum ImGuiColorEditFlags_ -{ - ImGuiColorEditFlags_NoAlpha = 1 << 1, // // ColorEdit, ColorPicker, ColorButton: ignore Alpha component (read 3 components from the input pointer). - ImGuiColorEditFlags_NoPicker = 1 << 2, // // ColorEdit: disable picker when clicking on colored square. - ImGuiColorEditFlags_NoOptions = 1 << 3, // // ColorEdit: disable toggling options menu when right-clicking on inputs/small preview. - ImGuiColorEditFlags_NoSmallPreview = 1 << 4, // // ColorEdit, ColorPicker: disable colored square preview next to the inputs. (e.g. to show only the inputs) - ImGuiColorEditFlags_NoInputs = 1 << 5, // // ColorEdit, ColorPicker: disable inputs sliders/text widgets (e.g. to show only the small preview colored square). - ImGuiColorEditFlags_NoTooltip = 1 << 6, // // ColorEdit, ColorPicker, ColorButton: disable tooltip when hovering the preview. - ImGuiColorEditFlags_NoLabel = 1 << 7, // // ColorEdit, ColorPicker: disable display of inline text label (the label is still forwarded to the tooltip and picker). - ImGuiColorEditFlags_NoSidePreview = 1 << 8, // // ColorPicker: disable bigger color preview on right side of the picker, use small colored square preview instead. - // User Options (right-click on widget to change some of them). You can set application defaults using SetColorEditOptions(). The idea is that you probably don't want to override them in most of your calls, let the user choose and/or call SetColorEditOptions() during startup. - ImGuiColorEditFlags_AlphaBar = 1 << 9, // // ColorEdit, ColorPicker: show vertical alpha bar/gradient in picker. - ImGuiColorEditFlags_AlphaPreview = 1 << 10, // // ColorEdit, ColorPicker, ColorButton: display preview as a transparent color over a checkerboard, instead of opaque. - ImGuiColorEditFlags_AlphaPreviewHalf= 1 << 11, // // ColorEdit, ColorPicker, ColorButton: display half opaque / half checkerboard, instead of opaque. - ImGuiColorEditFlags_HDR = 1 << 12, // // (WIP) ColorEdit: Currently only disable 0.0f..1.0f limits in RGBA edition (note: you probably want to use ImGuiColorEditFlags_Float flag as well). - ImGuiColorEditFlags_RGB = 1 << 13, // [Inputs] // ColorEdit: choose one among RGB/HSV/HEX. ColorPicker: choose any combination using RGB/HSV/HEX. - ImGuiColorEditFlags_HSV = 1 << 14, // [Inputs] // " - ImGuiColorEditFlags_HEX = 1 << 15, // [Inputs] // " - ImGuiColorEditFlags_Uint8 = 1 << 16, // [DataType] // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0..255. - ImGuiColorEditFlags_Float = 1 << 17, // [DataType] // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0.0f..1.0f floats instead of 0..255 integers. No round-trip of value via integers. - ImGuiColorEditFlags_PickerHueBar = 1 << 18, // [PickerMode] // ColorPicker: bar for Hue, rectangle for Sat/Value. - ImGuiColorEditFlags_PickerHueWheel = 1 << 19, // [PickerMode] // ColorPicker: wheel for Hue, triangle for Sat/Value. - // Internals/Masks - ImGuiColorEditFlags__InputsMask = ImGuiColorEditFlags_RGB|ImGuiColorEditFlags_HSV|ImGuiColorEditFlags_HEX, - ImGuiColorEditFlags__DataTypeMask = ImGuiColorEditFlags_Uint8|ImGuiColorEditFlags_Float, - ImGuiColorEditFlags__PickerMask = ImGuiColorEditFlags_PickerHueWheel|ImGuiColorEditFlags_PickerHueBar, - ImGuiColorEditFlags__OptionsDefault = ImGuiColorEditFlags_Uint8|ImGuiColorEditFlags_RGB|ImGuiColorEditFlags_PickerHueBar // Change application default using SetColorEditOptions() -}; - -// Enumeration for GetMouseCursor() -enum ImGuiMouseCursor_ -{ - ImGuiMouseCursor_None = -1, - ImGuiMouseCursor_Arrow = 0, - ImGuiMouseCursor_TextInput, // When hovering over InputText, etc. - ImGuiMouseCursor_Move, // Unused - ImGuiMouseCursor_ResizeNS, // When hovering over an horizontal border - ImGuiMouseCursor_ResizeEW, // When hovering over a vertical border or a column - ImGuiMouseCursor_ResizeNESW, // When hovering over the bottom-left corner of a window - ImGuiMouseCursor_ResizeNWSE, // When hovering over the bottom-right corner of a window - ImGuiMouseCursor_Count_ -}; - -// Condition for ImGui::SetWindow***(), SetNextWindow***(), SetNextTreeNode***() functions -// All those functions treat 0 as a shortcut to ImGuiCond_Always. From the point of view of the user use this as an enum (don't combine multiple values into flags). -enum ImGuiCond_ -{ - ImGuiCond_Always = 1 << 0, // Set the variable - ImGuiCond_Once = 1 << 1, // Set the variable once per runtime session (only the first call with succeed) - ImGuiCond_FirstUseEver = 1 << 2, // Set the variable if the window has no saved data (if doesn't exist in the .ini file) - ImGuiCond_Appearing = 1 << 3 // Set the variable if the window is appearing after being hidden/inactive (or the first time) - - // Obsolete names (will be removed) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - , ImGuiSetCond_Always = ImGuiCond_Always, ImGuiSetCond_Once = ImGuiCond_Once, ImGuiSetCond_FirstUseEver = ImGuiCond_FirstUseEver, ImGuiSetCond_Appearing = ImGuiCond_Appearing -#endif -}; - -struct ImGuiStyle -{ - float Alpha; // Global alpha applies to everything in ImGui - ImVec2 WindowPadding; // Padding within a window - float WindowRounding; // Radius of window corners rounding. Set to 0.0f to have rectangular windows - float WindowBorderSize; // Thickness of border around windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly) - ImVec2 WindowMinSize; // Minimum window size - ImVec2 WindowTitleAlign; // Alignment for title bar text. Defaults to (0.0f,0.5f) for left-aligned,vertically centered. - float ChildRounding; // Radius of child window corners rounding. Set to 0.0f to have rectangular windows. - float ChildBorderSize; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly) - float PopupRounding; // Radius of popup window corners rounding. - float PopupBorderSize; // Thickness of border around popup windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly) - ImVec2 FramePadding; // Padding within a framed rectangle (used by most widgets) - float FrameRounding; // Radius of frame corners rounding. Set to 0.0f to have rectangular frame (used by most widgets). - float FrameBorderSize; // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly) - ImVec2 ItemSpacing; // Horizontal and vertical spacing between widgets/lines - ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label) - ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! - float IndentSpacing; // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). - float ColumnsMinSpacing; // Minimum horizontal spacing between two columns - float ScrollbarSize; // Width of the vertical scrollbar, Height of the horizontal scrollbar - float ScrollbarRounding; // Radius of grab corners for scrollbar - float GrabMinSize; // Minimum width/height of a grab box for slider/scrollbar. - float GrabRounding; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. - ImVec2 ButtonTextAlign; // Alignment of button text when button is larger than text. Defaults to (0.5f,0.5f) for horizontally+vertically centered. - ImVec2 DisplayWindowPadding; // Window positions are clamped to be visible within the display area by at least this amount. Only covers regular windows. - ImVec2 DisplaySafeAreaPadding; // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. - bool AntiAliasedLines; // Enable anti-aliasing on lines/borders. Disable if you are really tight on CPU/GPU. - bool AntiAliasedFill; // Enable anti-aliasing on filled shapes (rounded rectangles, circles, etc.) - float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. - ImVec4 Colors[ImGuiCol_COUNT]; - - IMGUI_API ImGuiStyle(); - IMGUI_API void ScaleAllSizes(float scale_factor); -}; - -// This is where your app communicate with ImGui. Access via ImGui::GetIO(). -// Read 'Programmer guide' section in .cpp file for general usage. -struct ImGuiIO -{ - //------------------------------------------------------------------ - // Settings (fill once) // Default value: - //------------------------------------------------------------------ - - ImVec2 DisplaySize; // // Display size, in pixels. For clamping windows positions. - float DeltaTime; // = 1.0f/60.0f // Time elapsed since last frame, in seconds. - float IniSavingRate; // = 5.0f // Maximum time between saving positions/sizes to .ini file, in seconds. - const char* IniFilename; // = "imgui.ini" // Path to .ini file. NULL to disable .ini saving. - const char* LogFilename; // = "imgui_log.txt" // Path to .log file (default parameter to ImGui::LogToFile when no file is specified). - float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds. - float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels. - float MouseDragThreshold; // = 6.0f // Distance threshold before considering we are dragging - int KeyMap[ImGuiKey_COUNT]; // // Map of indices into the KeysDown[512] entries array - float KeyRepeatDelay; // = 0.250f // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.). - float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds. - void* UserData; // = NULL // Store your own data for retrieval by callbacks. - - ImFontAtlas* Fonts; // // Load and assemble one or more fonts into a single tightly packed texture. Output to Fonts array. - float FontGlobalScale; // = 1.0f // Global scale all fonts - bool FontAllowUserScaling; // = false // Allow user scaling text of individual window with CTRL+Wheel. - ImFont* FontDefault; // = NULL // Font to use on NewFrame(). Use NULL to uses Fonts->Fonts[0]. - ImVec2 DisplayFramebufferScale; // = (1.0f,1.0f) // For retina display or other situations where window coordinates are different from framebuffer coordinates. User storage only, presently not used by ImGui. - ImVec2 DisplayVisibleMin; // (0.0f,0.0f) // If you use DisplaySize as a virtual space larger than your screen, set DisplayVisibleMin/Max to the visible area. - ImVec2 DisplayVisibleMax; // (0.0f,0.0f) // If the values are the same, we defaults to Min=(0.0f) and Max=DisplaySize - - // Advanced/subtle behaviors - bool OptMacOSXBehaviors; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl - bool OptCursorBlink; // = true // Enable blinking cursor, for users who consider it annoying. - - //------------------------------------------------------------------ - // Settings (User Functions) - //------------------------------------------------------------------ - - // Rendering function, will be called in Render(). - // Alternatively you can keep this to NULL and call GetDrawData() after Render() to get the same pointer. - // See example applications if you are unsure of how to implement this. - void (*RenderDrawListsFn)(ImDrawData* data); - - // Optional: access OS clipboard - // (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures) - const char* (*GetClipboardTextFn)(void* user_data); - void (*SetClipboardTextFn)(void* user_data, const char* text); - void* ClipboardUserData; - - // Optional: override memory allocations. MemFreeFn() may be called with a NULL pointer. - // (default to posix malloc/free) - void* (*MemAllocFn)(size_t sz); - void (*MemFreeFn)(void* ptr); - - // Optional: notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME in Windows) - // (default to use native imm32 api on Windows) - void (*ImeSetInputScreenPosFn)(int x, int y); - void* ImeWindowHandle; // (Windows) Set this to your HWND to get automatic IME cursor positioning. - - //------------------------------------------------------------------ - // Input - Fill before calling NewFrame() - //------------------------------------------------------------------ - - ImVec2 MousePos; // Mouse position, in pixels. Set to ImVec2(-FLT_MAX,-FLT_MAX) if mouse is unavailable (on another screen, etc.) - bool MouseDown[5]; // Mouse buttons: left, right, middle + extras. ImGui itself mostly only uses left button (BeginPopupContext** are using right button). Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API. - float MouseWheel; // Mouse wheel: 1 unit scrolls about 5 lines text. - bool MouseDrawCursor; // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). - bool KeyCtrl; // Keyboard modifier pressed: Control - bool KeyShift; // Keyboard modifier pressed: Shift - bool KeyAlt; // Keyboard modifier pressed: Alt - bool KeySuper; // Keyboard modifier pressed: Cmd/Super/Windows - bool KeysDown[512]; // Keyboard keys that are pressed (in whatever storage order you naturally have access to keyboard data) - ImWchar InputCharacters[16+1]; // List of characters input (translated by user from keypress+keyboard state). Fill using AddInputCharacter() helper. - - // Functions - IMGUI_API void AddInputCharacter(ImWchar c); // Add new character into InputCharacters[] - IMGUI_API void AddInputCharactersUTF8(const char* utf8_chars); // Add new characters into InputCharacters[] from an UTF-8 string - inline void ClearInputCharacters() { InputCharacters[0] = 0; } // Clear the text input buffer manually - - //------------------------------------------------------------------ - // Output - Retrieve after calling NewFrame() - //------------------------------------------------------------------ - - bool WantCaptureMouse; // When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. This is set by ImGui when it wants to use your mouse (e.g. unclicked mouse is hovering a window, or a widget is active). - bool WantCaptureKeyboard; // When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. This is set by ImGui when it wants to use your keyboard inputs. - bool WantTextInput; // Mobile/console: when io.WantTextInput is true, you may display an on-screen keyboard. This is set by ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active). - bool WantMoveMouse; // [BETA-NAV] MousePos has been altered, back-end should reposition mouse on next frame. Set only when 'NavMovesMouse=true'. - float Framerate; // Application framerate estimation, in frame per second. Solely for convenience. Rolling average estimation based on IO.DeltaTime over 120 frames - int MetricsAllocs; // Number of active memory allocations - int MetricsRenderVertices; // Vertices output during last call to Render() - int MetricsRenderIndices; // Indices output during last call to Render() = number of triangles * 3 - int MetricsActiveWindows; // Number of visible root windows (exclude child windows) - ImVec2 MouseDelta; // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta. - - //------------------------------------------------------------------ - // [Internal] ImGui will maintain those fields. Forward compatibility not guaranteed! - //------------------------------------------------------------------ - - ImVec2 MousePosPrev; // Previous mouse position temporary storage (nb: not for public use, set to MousePos in NewFrame()) - ImVec2 MouseClickedPos[5]; // Position at time of clicking - float MouseClickedTime[5]; // Time of last click (used to figure out double-click) - bool MouseClicked[5]; // Mouse button went from !Down to Down - bool MouseDoubleClicked[5]; // Has mouse button been double-clicked? - bool MouseReleased[5]; // Mouse button went from Down to !Down - bool MouseDownOwned[5]; // Track if button was clicked inside a window. We don't request mouse capture from the application if click started outside ImGui bounds. - float MouseDownDuration[5]; // Duration the mouse button has been down (0.0f == just clicked) - float MouseDownDurationPrev[5]; // Previous time the mouse button has been down - ImVec2 MouseDragMaxDistanceAbs[5]; // Maximum distance, absolute, on each axis, of how much mouse has traveled from the clicking point - float MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the clicking point - float KeysDownDuration[512]; // Duration the keyboard key has been down (0.0f == just pressed) - float KeysDownDurationPrev[512]; // Previous duration the key has been down - - IMGUI_API ImGuiIO(); -}; - -//----------------------------------------------------------------------------- -// Obsolete functions (Will be removed! Also see 'API BREAKING CHANGES' section in imgui.cpp) -//----------------------------------------------------------------------------- - -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS -namespace ImGui -{ - static inline void ShowTestWindow() { return ShowDemoWindow(); } // OBSOLETE 1.53+ - static inline bool IsRootWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootWindow); } // OBSOLETE 1.53+ - static inline bool IsRootWindowOrAnyChildFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows); } // OBSOLETE 1.53+ - static inline void SetNextWindowContentWidth(float width) { SetNextWindowContentSize(ImVec2(width, 0.0f)); } // OBSOLETE 1.53+ (nb: original version preserved last Y value set by SetNextWindowContentSize()) - static inline bool IsRootWindowOrAnyChildHovered(ImGuiHoveredFlags flags = 0) { return IsItemHovered(flags | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows); } // OBSOLETE 1.53+ use flags directly - bool Begin(const char* name, bool* p_open, const ImVec2& size_on_first_use, float bg_alpha_override = -1.0f, ImGuiWindowFlags flags = 0); // OBSOLETE 1.52+. use SetNextWindowSize() instead if you want to set a window size. - static inline void AlignFirstTextHeightToWidgets() { AlignTextToFramePadding(); } // OBSOLETE 1.52+ - static inline void SetNextWindowPosCenter(ImGuiCond cond = 0) { SetNextWindowPos(ImVec2(GetIO().DisplaySize.x * 0.5f, GetIO().DisplaySize.y * 0.5f), cond, ImVec2(0.5f, 0.5f)); } // OBSOLETE 1.52+ - static inline bool IsItemHoveredRect() { return IsItemHovered(ImGuiHoveredFlags_RectOnly); } // OBSOLETE 1.51+ - static inline bool IsPosHoveringAnyWindow(const ImVec2&) { IM_ASSERT(0); return false; } // OBSOLETE 1.51+. This was partly broken. You probably wanted to use ImGui::GetIO().WantCaptureMouse instead. - static inline bool IsMouseHoveringAnyWindow() { return IsAnyWindowHovered(); } // OBSOLETE 1.51+ - static inline bool IsMouseHoveringWindow() { return IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem); } // OBSOLETE 1.51+ - static inline bool CollapsingHeader(const char* label, const char* str_id, bool framed = true, bool default_open = false) { (void)str_id; (void)framed; ImGuiTreeNodeFlags default_open_flags = 1 << 5; return CollapsingHeader(label, (default_open ? default_open_flags : 0)); } // OBSOLETE 1.49+ -} -#endif - -//----------------------------------------------------------------------------- -// Helpers -//----------------------------------------------------------------------------- - -// Lightweight std::vector<> like class to avoid dragging dependencies (also: windows implementation of STL with debug enabled is absurdly slow, so let's bypass it so our code runs fast in debug). -// Our implementation does NOT call C++ constructors/destructors. This is intentional and we do not require it. Do not use this class as a straight std::vector replacement in your code! -template -class ImVector -{ -public: - int Size; - int Capacity; - T* Data; - - typedef T value_type; - typedef value_type* iterator; - typedef const value_type* const_iterator; - - inline ImVector() { Size = Capacity = 0; Data = NULL; } - inline ~ImVector() { if (Data) ImGui::MemFree(Data); } - - inline bool empty() const { return Size == 0; } - inline int size() const { return Size; } - inline int capacity() const { return Capacity; } - - inline value_type& operator[](int i) { IM_ASSERT(i < Size); return Data[i]; } - inline const value_type& operator[](int i) const { IM_ASSERT(i < Size); return Data[i]; } - - inline void clear() { if (Data) { Size = Capacity = 0; ImGui::MemFree(Data); Data = NULL; } } - inline iterator begin() { return Data; } - inline const_iterator begin() const { return Data; } - inline iterator end() { return Data + Size; } - inline const_iterator end() const { return Data + Size; } - inline value_type& front() { IM_ASSERT(Size > 0); return Data[0]; } - inline const value_type& front() const { IM_ASSERT(Size > 0); return Data[0]; } - inline value_type& back() { IM_ASSERT(Size > 0); return Data[Size - 1]; } - inline const value_type& back() const { IM_ASSERT(Size > 0); return Data[Size - 1]; } - inline void swap(ImVector& rhs) { int rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; int rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; value_type* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; } - - inline int _grow_capacity(int sz) const { int new_capacity = Capacity ? (Capacity + Capacity/2) : 8; return new_capacity > sz ? new_capacity : sz; } - - inline void resize(int new_size) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; } - inline void resize(int new_size, const T& v){ if (new_size > Capacity) reserve(_grow_capacity(new_size)); if (new_size > Size) for (int n = Size; n < new_size; n++) Data[n] = v; Size = new_size; } - inline void reserve(int new_capacity) - { - if (new_capacity <= Capacity) - return; - T* new_data = (value_type*)ImGui::MemAlloc((size_t)new_capacity * sizeof(T)); - if (Data) - memcpy(new_data, Data, (size_t)Size * sizeof(T)); - ImGui::MemFree(Data); - Data = new_data; - Capacity = new_capacity; - } - - inline void push_back(const value_type& v) { if (Size == Capacity) reserve(_grow_capacity(Size + 1)); Data[Size++] = v; } - inline void pop_back() { IM_ASSERT(Size > 0); Size--; } - inline void push_front(const value_type& v) { if (Size == 0) push_back(v); else insert(Data, v); } - - inline iterator erase(const_iterator it) { IM_ASSERT(it >= Data && it < Data+Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(value_type)); Size--; return Data + off; } - inline iterator insert(const_iterator it, const value_type& v) { IM_ASSERT(it >= Data && it <= Data+Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(_grow_capacity(Size + 1)); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(value_type)); Data[off] = v; Size++; return Data + off; } - inline bool contains(const value_type& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data++ == v) return true; return false; } -}; - -// Helper: execute a block of code at maximum once a frame. Convenient if you want to quickly create an UI within deep-nested code that runs multiple times every frame. -// Usage: -// static ImGuiOnceUponAFrame oaf; -// if (oaf) -// ImGui::Text("This will be called only once per frame"); -struct ImGuiOnceUponAFrame -{ - ImGuiOnceUponAFrame() { RefFrame = -1; } - mutable int RefFrame; - operator bool() const { int current_frame = ImGui::GetFrameCount(); if (RefFrame == current_frame) return false; RefFrame = current_frame; return true; } -}; - -// Helper macro for ImGuiOnceUponAFrame. Attention: The macro expands into 2 statement so make sure you don't use it within e.g. an if() statement without curly braces. -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS // Will obsolete -#define IMGUI_ONCE_UPON_A_FRAME static ImGuiOnceUponAFrame imgui_oaf; if (imgui_oaf) -#endif - -// Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]" -struct ImGuiTextFilter -{ - struct TextRange - { - const char* b; - const char* e; - - TextRange() { b = e = NULL; } - TextRange(const char* _b, const char* _e) { b = _b; e = _e; } - const char* begin() const { return b; } - const char* end() const { return e; } - bool empty() const { return b == e; } - char front() const { return *b; } - static bool is_blank(char c) { return c == ' ' || c == '\t'; } - void trim_blanks() { while (b < e && is_blank(*b)) b++; while (e > b && is_blank(*(e-1))) e--; } - IMGUI_API void split(char separator, ImVector& out); - }; - - char InputBuf[256]; - ImVector Filters; - int CountGrep; - - IMGUI_API ImGuiTextFilter(const char* default_filter = ""); - IMGUI_API bool Draw(const char* label = "Filter (inc,-exc)", float width = 0.0f); // Helper calling InputText+Build - IMGUI_API bool PassFilter(const char* text, const char* text_end = NULL) const; - IMGUI_API void Build(); - void Clear() { InputBuf[0] = 0; Build(); } - bool IsActive() const { return !Filters.empty(); } -}; - -// Helper: Text buffer for logging/accumulating text -struct ImGuiTextBuffer -{ - ImVector Buf; - - ImGuiTextBuffer() { Buf.push_back(0); } - inline char operator[](int i) { return Buf.Data[i]; } - const char* begin() const { return &Buf.front(); } - const char* end() const { return &Buf.back(); } // Buf is zero-terminated, so end() will point on the zero-terminator - int size() const { return Buf.Size - 1; } - bool empty() { return Buf.Size <= 1; } - void clear() { Buf.clear(); Buf.push_back(0); } - void reserve(int capacity) { Buf.reserve(capacity); } - const char* c_str() const { return Buf.Data; } - IMGUI_API void appendf(const char* fmt, ...) IM_FMTARGS(2); - IMGUI_API void appendfv(const char* fmt, va_list args) IM_FMTLIST(2); -}; - -// Helper: Simple Key->value storage -// Typically you don't have to worry about this since a storage is held within each Window. -// We use it to e.g. store collapse state for a tree (Int 0/1), store color edit options. -// This is optimized for efficient reading (dichotomy into a contiguous buffer), rare writing (typically tied to user interactions) -// You can use it as custom user storage for temporary values. Declare your own storage if, for example: -// - You want to manipulate the open/close state of a particular sub-tree in your interface (tree node uses Int 0/1 to store their state). -// - You want to store custom debug data easily without adding or editing structures in your code (probably not efficient, but convenient) -// Types are NOT stored, so it is up to you to make sure your Key don't collide with different types. -struct ImGuiStorage -{ - struct Pair - { - ImGuiID key; - union { int val_i; float val_f; void* val_p; }; - Pair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; } - Pair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; } - Pair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; } - }; - ImVector Data; - - // - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N) - // - Set***() functions find pair, insertion on demand if missing. - // - Sorted insertion is costly, paid once. A typical frame shouldn't need to insert any new pair. - void Clear() { Data.clear(); } - IMGUI_API int GetInt(ImGuiID key, int default_val = 0) const; - IMGUI_API void SetInt(ImGuiID key, int val); - IMGUI_API bool GetBool(ImGuiID key, bool default_val = false) const; - IMGUI_API void SetBool(ImGuiID key, bool val); - IMGUI_API float GetFloat(ImGuiID key, float default_val = 0.0f) const; - IMGUI_API void SetFloat(ImGuiID key, float val); - IMGUI_API void* GetVoidPtr(ImGuiID key) const; // default_val is NULL - IMGUI_API void SetVoidPtr(ImGuiID key, void* val); - - // - Get***Ref() functions finds pair, insert on demand if missing, return pointer. Useful if you intend to do Get+Set. - // - References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer. - // - A typical use case where this is convenient for quick hacking (e.g. add storage during a live Edit&Continue session if you can't modify existing struct) - // float* pvar = ImGui::GetFloatRef(key); ImGui::SliderFloat("var", pvar, 0, 100.0f); some_var += *pvar; - IMGUI_API int* GetIntRef(ImGuiID key, int default_val = 0); - IMGUI_API bool* GetBoolRef(ImGuiID key, bool default_val = false); - IMGUI_API float* GetFloatRef(ImGuiID key, float default_val = 0.0f); - IMGUI_API void** GetVoidPtrRef(ImGuiID key, void* default_val = NULL); - - // Use on your own storage if you know only integer are being stored (open/close all tree nodes) - IMGUI_API void SetAllInt(int val); - - // For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once. - IMGUI_API void BuildSortByKey(); -}; - -// Shared state of InputText(), passed to callback when a ImGuiInputTextFlags_Callback* flag is used and the corresponding callback is triggered. -struct ImGuiTextEditCallbackData -{ - ImGuiInputTextFlags EventFlag; // One of ImGuiInputTextFlags_Callback* // Read-only - ImGuiInputTextFlags Flags; // What user passed to InputText() // Read-only - void* UserData; // What user passed to InputText() // Read-only - bool ReadOnly; // Read-only mode // Read-only - - // CharFilter event: - ImWchar EventChar; // Character input // Read-write (replace character or set to zero) - - // Completion,History,Always events: - // If you modify the buffer contents make sure you update 'BufTextLen' and set 'BufDirty' to true. - ImGuiKey EventKey; // Key pressed (Up/Down/TAB) // Read-only - char* Buf; // Current text buffer // Read-write (pointed data only, can't replace the actual pointer) - int BufTextLen; // Current text length in bytes // Read-write - int BufSize; // Maximum text length in bytes // Read-only - bool BufDirty; // Set if you modify Buf/BufTextLen!! // Write - int CursorPos; // // Read-write - int SelectionStart; // // Read-write (== to SelectionEnd when no selection) - int SelectionEnd; // // Read-write - - // NB: Helper functions for text manipulation. Calling those function loses selection. - IMGUI_API void DeleteChars(int pos, int bytes_count); - IMGUI_API void InsertChars(int pos, const char* text, const char* text_end = NULL); - bool HasSelection() const { return SelectionStart != SelectionEnd; } -}; - -// Resizing callback data to apply custom constraint. As enabled by SetNextWindowSizeConstraints(). Callback is called during the next Begin(). -// NB: For basic min/max size constraint on each axis you don't need to use the callback! The SetNextWindowSizeConstraints() parameters are enough. -struct ImGuiSizeConstraintCallbackData -{ - void* UserData; // Read-only. What user passed to SetNextWindowSizeConstraints() - ImVec2 Pos; // Read-only. Window position, for reference. - ImVec2 CurrentSize; // Read-only. Current window size. - ImVec2 DesiredSize; // Read-write. Desired size, based on user's mouse position. Write to this field to restrain resizing. -}; - -// Data payload for Drag and Drop operations -struct ImGuiPayload -{ - // Members - const void* Data; // Data (copied and owned by dear imgui) - int DataSize; // Data size - - // [Internal] - ImGuiID SourceId; // Source item id - ImGuiID SourceParentId; // Source parent id (if available) - int DataFrameCount; // Data timestamp - char DataType[8 + 1]; // Data type tag (short user-supplied string) - bool Preview; // Set when AcceptDragDropPayload() was called and mouse has been hovering the target item (nb: handle overlapping drag targets) - bool Delivery; // Set when AcceptDragDropPayload() was called and mouse button is released over the target item. - - ImGuiPayload() { Clear(); } - void Clear() { SourceId = SourceParentId = 0; Data = NULL; DataSize = 0; memset(DataType, 0, sizeof(DataType)); DataFrameCount = -1; Preview = Delivery = false; } - bool IsDataType(const char* type) const { return DataFrameCount != -1 && strcmp(type, DataType) == 0; } - bool IsPreview() const { return Preview; } - bool IsDelivery() const { return Delivery; } -}; - -// Helpers macros to generate 32-bits encoded colors -#ifdef IMGUI_USE_BGRA_PACKED_COLOR -#define IM_COL32_R_SHIFT 16 -#define IM_COL32_G_SHIFT 8 -#define IM_COL32_B_SHIFT 0 -#define IM_COL32_A_SHIFT 24 -#define IM_COL32_A_MASK 0xFF000000 -#else -#define IM_COL32_R_SHIFT 0 -#define IM_COL32_G_SHIFT 8 -#define IM_COL32_B_SHIFT 16 -#define IM_COL32_A_SHIFT 24 -#define IM_COL32_A_MASK 0xFF000000 -#endif -#define IM_COL32(R,G,B,A) (((ImU32)(A)<>IM_COL32_R_SHIFT)&0xFF) * sc; Value.y = (float)((rgba>>IM_COL32_G_SHIFT)&0xFF) * sc; Value.z = (float)((rgba>>IM_COL32_B_SHIFT)&0xFF) * sc; Value.w = (float)((rgba>>IM_COL32_A_SHIFT)&0xFF) * sc; } - ImColor(float r, float g, float b, float a = 1.0f) { Value.x = r; Value.y = g; Value.z = b; Value.w = a; } - ImColor(const ImVec4& col) { Value = col; } - inline operator ImU32() const { return ImGui::ColorConvertFloat4ToU32(Value); } - inline operator ImVec4() const { return Value; } - - // FIXME-OBSOLETE: May need to obsolete/cleanup those helpers. - inline void SetHSV(float h, float s, float v, float a = 1.0f){ ImGui::ColorConvertHSVtoRGB(h, s, v, Value.x, Value.y, Value.z); Value.w = a; } - static ImColor HSV(float h, float s, float v, float a = 1.0f) { float r,g,b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); return ImColor(r,g,b,a); } -}; - -// Helper: Manually clip large list of items. -// If you are submitting lots of evenly spaced items and you have a random access to the list, you can perform coarse clipping based on visibility to save yourself from processing those items at all. -// The clipper calculates the range of visible items and advance the cursor to compensate for the non-visible items we have skipped. -// ImGui already clip items based on their bounds but it needs to measure text size to do so. Coarse clipping before submission makes this cost and your own data fetching/submission cost null. -// Usage: -// ImGuiListClipper clipper(1000); // we have 1000 elements, evenly spaced. -// while (clipper.Step()) -// for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) -// ImGui::Text("line number %d", i); -// - Step 0: the clipper let you process the first element, regardless of it being visible or not, so we can measure the element height (step skipped if we passed a known height as second arg to constructor). -// - Step 1: the clipper infer height from first element, calculate the actual range of elements to display, and position the cursor before the first element. -// - (Step 2: dummy step only required if an explicit items_height was passed to constructor or Begin() and user call Step(). Does nothing and switch to Step 3.) -// - Step 3: the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), advance the cursor to the end of the list and then returns 'false' to end the loop. -struct ImGuiListClipper -{ - float StartPosY; - float ItemsHeight; - int ItemsCount, StepNo, DisplayStart, DisplayEnd; - - // items_count: Use -1 to ignore (you can call Begin later). Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step). - // items_height: Use -1.0f to be calculated automatically on first step. Otherwise pass in the distance between your items, typically GetTextLineHeightWithSpacing() or GetFrameHeightWithSpacing(). - // If you don't specify an items_height, you NEED to call Step(). If you specify items_height you may call the old Begin()/End() api directly, but prefer calling Step(). - ImGuiListClipper(int items_count = -1, float items_height = -1.0f) { Begin(items_count, items_height); } // NB: Begin() initialize every fields (as we allow user to call Begin/End multiple times on a same instance if they want). - ~ImGuiListClipper() { IM_ASSERT(ItemsCount == -1); } // Assert if user forgot to call End() or Step() until false. - - IMGUI_API bool Step(); // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items. - IMGUI_API void Begin(int items_count, float items_height = -1.0f); // Automatically called by constructor if you passed 'items_count' or by Step() in Step 1. - IMGUI_API void End(); // Automatically called on the last call of Step() that returns false. -}; - -//----------------------------------------------------------------------------- -// Draw List -// Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList. -//----------------------------------------------------------------------------- - -// Draw callbacks for advanced uses. -// NB- You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering (you can poke into the draw list for that) -// Draw callback may be useful for example, A) Change your GPU render state, B) render a complex 3D scene inside a UI element (without an intermediate texture/render target), etc. -// The expected behavior from your rendering function is 'if (cmd.UserCallback != NULL) cmd.UserCallback(parent_list, cmd); else RenderTriangles()' -typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd); - -// Typically, 1 command = 1 GPU draw call (unless command is a callback) -struct ImDrawCmd -{ - unsigned int ElemCount; // Number of indices (multiple of 3) to be rendered as triangles. Vertices are stored in the callee ImDrawList's vtx_buffer[] array, indices in idx_buffer[]. - ImVec4 ClipRect; // Clipping rectangle (x1, y1, x2, y2) - ImTextureID TextureId; // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas. - ImDrawCallback UserCallback; // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally. - void* UserCallbackData; // The draw callback code can access this. - - ImDrawCmd() { ElemCount = 0; ClipRect.x = ClipRect.y = ClipRect.z = ClipRect.w = 0.0f; TextureId = NULL; UserCallback = NULL; UserCallbackData = NULL; } -}; - -// Vertex index (override with '#define ImDrawIdx unsigned int' inside in imconfig.h) -#ifndef ImDrawIdx -typedef unsigned short ImDrawIdx; -#endif - -// Vertex layout -#ifndef IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT -struct ImDrawVert -{ - ImVec2 pos; - ImVec2 uv; - ImU32 col; -}; -#else -// You can override the vertex format layout by defining IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT in imconfig.h -// The code expect ImVec2 pos (8 bytes), ImVec2 uv (8 bytes), ImU32 col (4 bytes), but you can re-order them or add other fields as needed to simplify integration in your engine. -// The type has to be described within the macro (you can either declare the struct or use a typedef) -// NOTE: IMGUI DOESN'T CLEAR THE STRUCTURE AND DOESN'T CALL A CONSTRUCTOR SO ANY CUSTOM FIELD WILL BE UNINITIALIZED. IF YOU ADD EXTRA FIELDS (SUCH AS A 'Z' COORDINATES) YOU WILL NEED TO CLEAR THEM DURING RENDER OR TO IGNORE THEM. -IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT; -#endif - -// Draw channels are used by the Columns API to "split" the render list into different channels while building, so items of each column can be batched together. -// You can also use them to simulate drawing layers and submit primitives in a different order than how they will be rendered. -struct ImDrawChannel -{ - ImVector CmdBuffer; - ImVector IdxBuffer; -}; - -enum ImDrawCornerFlags_ -{ - ImDrawCornerFlags_TopLeft = 1 << 0, // 0x1 - ImDrawCornerFlags_TopRight = 1 << 1, // 0x2 - ImDrawCornerFlags_BotLeft = 1 << 2, // 0x4 - ImDrawCornerFlags_BotRight = 1 << 3, // 0x8 - ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight, // 0x3 - ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight, // 0xC - ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft, // 0x5 - ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight, // 0xA - ImDrawCornerFlags_All = 0xF // In your function calls you may use ~0 (= all bits sets) instead of ImDrawCornerFlags_All, as a convenience -}; - -enum ImDrawListFlags_ -{ - ImDrawListFlags_AntiAliasedLines = 1 << 0, - ImDrawListFlags_AntiAliasedFill = 1 << 1 -}; - -// Draw command list -// This is the low-level list of polygons that ImGui functions are filling. At the end of the frame, all command lists are passed to your ImGuiIO::RenderDrawListFn function for rendering. -// Each ImGui window contains its own ImDrawList. You can use ImGui::GetWindowDrawList() to access the current window draw list and draw custom primitives. -// You can interleave normal ImGui:: calls and adding primitives to the current draw list. -// All positions are generally in pixel coordinates (top-left at (0,0), bottom-right at io.DisplaySize), however you are totally free to apply whatever transformation matrix to want to the data (if you apply such transformation you'll want to apply it to ClipRect as well) -// Important: Primitives are always added to the list and not culled (culling is done at higher-level by ImGui:: functions), if you use this API a lot consider coarse culling your drawn objects. -struct ImDrawList -{ - // This is what you have to render - ImVector CmdBuffer; // Draw commands. Typically 1 command = 1 GPU draw call, unless the command is a callback. - ImVector IdxBuffer; // Index buffer. Each command consume ImDrawCmd::ElemCount of those - ImVector VtxBuffer; // Vertex buffer. - - // [Internal, used while building lists] - ImDrawListFlags Flags; // Flags, you may poke into these to adjust anti-aliasing settings per-primitive. - const ImDrawListSharedData* _Data; // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context) - const char* _OwnerName; // Pointer to owner window's name for debugging - unsigned int _VtxCurrentIdx; // [Internal] == VtxBuffer.Size - ImDrawVert* _VtxWritePtr; // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) - ImDrawIdx* _IdxWritePtr; // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) - ImVector _ClipRectStack; // [Internal] - ImVector _TextureIdStack; // [Internal] - ImVector _Path; // [Internal] current path building - int _ChannelsCurrent; // [Internal] current channel number (0) - int _ChannelsCount; // [Internal] number of active channels (1+) - ImVector _Channels; // [Internal] draw channels for columns API (not resized down so _ChannelsCount may be smaller than _Channels.Size) - - ImDrawList(const ImDrawListSharedData* shared_data) { _Data = shared_data; _OwnerName = NULL; Clear(); } - ~ImDrawList() { ClearFreeMemory(); } - IMGUI_API void PushClipRect(ImVec2 clip_rect_min, ImVec2 clip_rect_max, bool intersect_with_current_clip_rect = false); // Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling) - IMGUI_API void PushClipRectFullScreen(); - IMGUI_API void PopClipRect(); - IMGUI_API void PushTextureID(const ImTextureID& texture_id); - IMGUI_API void PopTextureID(); - inline ImVec2 GetClipRectMin() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.x, cr.y); } - inline ImVec2 GetClipRectMax() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.z, cr.w); } - - // Primitives - IMGUI_API void AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness = 1.0f); - IMGUI_API void AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All, float thickness = 1.0f); // a: upper-left, b: lower-right, rounding_corners_flags: 4-bits corresponding to which corner to round - IMGUI_API void AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All); // a: upper-left, b: lower-right - IMGUI_API void AddRectFilledMultiColor(const ImVec2& a, const ImVec2& b, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left); - IMGUI_API void AddQuad(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col, float thickness = 1.0f); - IMGUI_API void AddQuadFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col); - IMGUI_API void AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness = 1.0f); - IMGUI_API void AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col); - IMGUI_API void AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12, float thickness = 1.0f); - IMGUI_API void AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12); - IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL); - IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL); - IMGUI_API void AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,1), ImU32 col = 0xFFFFFFFF); - IMGUI_API void AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,0), const ImVec2& uv_c = ImVec2(1,1), const ImVec2& uv_d = ImVec2(0,1), ImU32 col = 0xFFFFFFFF); - IMGUI_API void AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col, float rounding, int rounding_corners = ImDrawCornerFlags_All); - IMGUI_API void AddPolyline(const ImVec2* points, const int num_points, ImU32 col, bool closed, float thickness); - IMGUI_API void AddConvexPolyFilled(const ImVec2* points, const int num_points, ImU32 col); - IMGUI_API void AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments = 0); - - // Stateful path API, add points then finish with PathFill() or PathStroke() - inline void PathClear() { _Path.resize(0); } - inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); } - inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path[_Path.Size-1], &pos, 8) != 0) _Path.push_back(pos); } - inline void PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); PathClear(); } - inline void PathStroke(ImU32 col, bool closed, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, closed, thickness); PathClear(); } - IMGUI_API void PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments = 10); - IMGUI_API void PathArcToFast(const ImVec2& centre, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle - IMGUI_API void PathBezierCurveTo(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, int num_segments = 0); - IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All); - - // Channels - // - Use to simulate layers. By switching channels to can render out-of-order (e.g. submit foreground primitives before background primitives) - // - Use to minimize draw calls (e.g. if going back-and-forth between multiple non-overlapping clipping rectangles, prefer to append into separate channels then merge at the end) - IMGUI_API void ChannelsSplit(int channels_count); - IMGUI_API void ChannelsMerge(); - IMGUI_API void ChannelsSetCurrent(int channel_index); - - // Advanced - IMGUI_API void AddCallback(ImDrawCallback callback, void* callback_data); // Your rendering function must check for 'UserCallback' in ImDrawCmd and call the function instead of rendering triangles. - IMGUI_API void AddDrawCmd(); // This is useful if you need to forcefully create a new draw call (to allow for dependent rendering / blending). Otherwise primitives are merged into the same draw-call as much as possible - - // Internal helpers - // NB: all primitives needs to be reserved via PrimReserve() beforehand! - IMGUI_API void Clear(); - IMGUI_API void ClearFreeMemory(); - IMGUI_API void PrimReserve(int idx_count, int vtx_count); - IMGUI_API void PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col); // Axis aligned rectangle (composed of two triangles) - IMGUI_API void PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col); - IMGUI_API void PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col); - inline void PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col){ _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; } - inline void PrimWriteIdx(ImDrawIdx idx) { *_IdxWritePtr = idx; _IdxWritePtr++; } - inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } - IMGUI_API void UpdateClipRect(); - IMGUI_API void UpdateTextureID(); -}; - -// All draw data to render an ImGui frame -struct ImDrawData -{ - bool Valid; // Only valid after Render() is called and before the next NewFrame() is called. - ImDrawList** CmdLists; - int CmdListsCount; - int TotalVtxCount; // For convenience, sum of all cmd_lists vtx_buffer.Size - int TotalIdxCount; // For convenience, sum of all cmd_lists idx_buffer.Size - - // Functions - ImDrawData() { Valid = false; CmdLists = NULL; CmdListsCount = TotalVtxCount = TotalIdxCount = 0; } - IMGUI_API void DeIndexAllBuffers(); // For backward compatibility or convenience: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! - IMGUI_API void ScaleClipRects(const ImVec2& sc); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than ImGui expects, or if there is a difference between your window resolution and framebuffer resolution. -}; - -struct ImFontConfig -{ - void* FontData; // // TTF/OTF data - int FontDataSize; // // TTF/OTF data size - bool FontDataOwnedByAtlas; // true // TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself). - int FontNo; // 0 // Index of font within TTF/OTF file - float SizePixels; // // Size in pixels for rasterizer. - int OversampleH, OversampleV; // 3, 1 // Rasterize at higher quality for sub-pixel positioning. We don't use sub-pixel positions on the Y axis. - bool PixelSnapH; // false // Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1. - ImVec2 GlyphExtraSpacing; // 0, 0 // Extra spacing (in pixels) between glyphs. Only X axis is supported for now. - ImVec2 GlyphOffset; // 0, 0 // Offset all glyphs from this font input. - const ImWchar* GlyphRanges; // NULL // Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list). THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE. - bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights. - unsigned int RasterizerFlags; // 0x00 // Settings for custom font rasterizer (e.g. ImGuiFreeType). Leave as zero if you aren't using one. - float RasterizerMultiply; // 1.0f // Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable. - - // [Internal] - char Name[32]; // Name (strictly to ease debugging) - ImFont* DstFont; - - IMGUI_API ImFontConfig(); -}; - -struct ImFontGlyph -{ - ImWchar Codepoint; // 0x0000..0xFFFF - float AdvanceX; // Distance to next character (= data from font + ImFontConfig::GlyphExtraSpacing.x baked in) - float X0, Y0, X1, Y1; // Glyph corners - float U0, V0, U1, V1; // Texture coordinates -}; - -// Load and rasterize multiple TTF/OTF fonts into a same texture. -// Sharing a texture for multiple fonts allows us to reduce the number of draw calls during rendering. -// We also add custom graphic data into the texture that serves for ImGui. -// 1. (Optional) Call AddFont*** functions. If you don't call any, the default font will be loaded for you. -// 2. Call GetTexDataAsAlpha8() or GetTexDataAsRGBA32() to build and retrieve pixels data. -// 3. Upload the pixels data into a texture within your graphics system. -// 4. Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture. This value will be passed back to you during rendering to identify the texture. -// IMPORTANT: If you pass a 'glyph_ranges' array to AddFont*** functions, you need to make sure that your array persist up until the ImFont is build (when calling GetTextData*** or Build()). We only copy the pointer, not the data. -struct ImFontAtlas -{ - IMGUI_API ImFontAtlas(); - IMGUI_API ~ImFontAtlas(); - IMGUI_API ImFont* AddFont(const ImFontConfig* font_cfg); - IMGUI_API ImFont* AddFontDefault(const ImFontConfig* font_cfg = NULL); - IMGUI_API ImFont* AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); - IMGUI_API ImFont* AddFontFromMemoryTTF(void* font_data, int font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after Build(). Set font_cfg->FontDataOwnedByAtlas to false to keep ownership. - IMGUI_API ImFont* AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp. - IMGUI_API ImFont* AddFontFromMemoryCompressedBase85TTF(const char* compressed_font_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter. - IMGUI_API void ClearTexData(); // Clear the CPU-side texture data. Saves RAM once the texture has been copied to graphics memory. - IMGUI_API void ClearInputData(); // Clear the input TTF data (inc sizes, glyph ranges) - IMGUI_API void ClearFonts(); // Clear the ImGui-side font data (glyphs storage, UV coordinates) - IMGUI_API void Clear(); // Clear all - - // Build atlas, retrieve pixel data. - // User is in charge of copying the pixels into graphics memory (e.g. create a texture with your engine). Then store your texture handle with SetTexID(). - // RGBA32 format is provided for convenience and compatibility, but note that unless you use CustomRect to draw color data, the RGB pixels emitted from Fonts will all be white (~75% of waste). - // Pitch = Width * BytesPerPixels - IMGUI_API bool Build(); // Build pixels data. This is called automatically for you by the GetTexData*** functions. - IMGUI_API void GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 1 byte per-pixel - IMGUI_API void GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 4 bytes-per-pixel - void SetTexID(ImTextureID id) { TexID = id; } - - //------------------------------------------- - // Glyph Ranges - //------------------------------------------- - - // Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list) - // NB: Make sure that your string are UTF-8 and NOT in your local code page. In C++11, you can create UTF-8 string literal using the u8"Hello world" syntax. See FAQ for details. - IMGUI_API const ImWchar* GetGlyphRangesDefault(); // Basic Latin, Extended Latin - IMGUI_API const ImWchar* GetGlyphRangesKorean(); // Default + Korean characters - IMGUI_API const ImWchar* GetGlyphRangesJapanese(); // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs - IMGUI_API const ImWchar* GetGlyphRangesChinese(); // Default + Japanese + full set of about 21000 CJK Unified Ideographs - IMGUI_API const ImWchar* GetGlyphRangesCyrillic(); // Default + about 400 Cyrillic characters - IMGUI_API const ImWchar* GetGlyphRangesThai(); // Default + Thai characters - - // Helpers to build glyph ranges from text data. Feed your application strings/characters to it then call BuildRanges(). - struct GlyphRangesBuilder - { - ImVector UsedChars; // Store 1-bit per Unicode code point (0=unused, 1=used) - GlyphRangesBuilder() { UsedChars.resize(0x10000 / 8); memset(UsedChars.Data, 0, 0x10000 / 8); } - bool GetBit(int n) { return (UsedChars[n >> 3] & (1 << (n & 7))) != 0; } - void SetBit(int n) { UsedChars[n >> 3] |= 1 << (n & 7); } // Set bit 'c' in the array - void AddChar(ImWchar c) { SetBit(c); } // Add character - IMGUI_API void AddText(const char* text, const char* text_end = NULL); // Add string (each character of the UTF-8 string are added) - IMGUI_API void AddRanges(const ImWchar* ranges); // Add ranges, e.g. builder.AddRanges(ImFontAtlas::GetGlyphRangesDefault) to force add all of ASCII/Latin+Ext - IMGUI_API void BuildRanges(ImVector* out_ranges); // Output new ranges - }; - - //------------------------------------------- - // Custom Rectangles/Glyphs API - //------------------------------------------- - - // You can request arbitrary rectangles to be packed into the atlas, for your own purposes. After calling Build(), you can query the rectangle position and render your pixels. - // You can also request your rectangles to be mapped as font glyph (given a font + Unicode point), so you can render e.g. custom colorful icons and use them as regular glyphs. - struct CustomRect - { - unsigned int ID; // Input // User ID. Use <0x10000 to map into a font glyph, >=0x10000 for other/internal/custom texture data. - unsigned short Width, Height; // Input // Desired rectangle dimension - unsigned short X, Y; // Output // Packed position in Atlas - float GlyphAdvanceX; // Input // For custom font glyphs only (ID<0x10000): glyph xadvance - ImVec2 GlyphOffset; // Input // For custom font glyphs only (ID<0x10000): glyph display offset - ImFont* Font; // Input // For custom font glyphs only (ID<0x10000): target font - CustomRect() { ID = 0xFFFFFFFF; Width = Height = 0; X = Y = 0xFFFF; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0,0); Font = NULL; } - bool IsPacked() const { return X != 0xFFFF; } - }; - - IMGUI_API int AddCustomRectRegular(unsigned int id, int width, int height); // Id needs to be >= 0x10000. Id >= 0x80000000 are reserved for ImGui and ImDrawList - IMGUI_API int AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0,0)); // Id needs to be < 0x10000 to register a rectangle to map into a specific font. - IMGUI_API void CalcCustomRectUV(const CustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max); - const CustomRect* GetCustomRectByIndex(int index) const { if (index < 0) return NULL; return &CustomRects[index]; } - - //------------------------------------------- - // Members - //------------------------------------------- - - ImTextureID TexID; // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure. - int TexDesiredWidth; // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height. - int TexGlyphPadding; // Padding between glyphs within texture in pixels. Defaults to 1. - - // [Internal] - // NB: Access texture data via GetTexData*() calls! Which will setup a default font for you. - unsigned char* TexPixelsAlpha8; // 1 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight - unsigned int* TexPixelsRGBA32; // 4 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight * 4 - int TexWidth; // Texture width calculated during Build(). - int TexHeight; // Texture height calculated during Build(). - ImVec2 TexUvWhitePixel; // Texture coordinates to a white pixel - ImVector Fonts; // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font. - ImVector CustomRects; // Rectangles for packing custom texture data into the atlas. - ImVector ConfigData; // Internal data - int CustomRectIds[1]; // Identifiers of custom texture rectangle used by ImFontAtlas/ImDrawList -}; - -// Font runtime data and rendering -// ImFontAtlas automatically loads a default embedded font for you when you call GetTexDataAsAlpha8() or GetTexDataAsRGBA32(). -struct ImFont -{ - // Members: Hot ~62/78 bytes - float FontSize; // // Height of characters, set during loading (don't change after loading) - float Scale; // = 1.f // Base font scale, multiplied by the per-window font scale which you can adjust with SetFontScale() - ImVec2 DisplayOffset; // = (0.f,1.f) // Offset font rendering by xx pixels - ImVector Glyphs; // // All glyphs. - ImVector IndexAdvanceX; // // Sparse. Glyphs->AdvanceX in a directly indexable way (more cache-friendly, for CalcTextSize functions which are often bottleneck in large UI). - ImVector IndexLookup; // // Sparse. Index glyphs by Unicode code-point. - const ImFontGlyph* FallbackGlyph; // == FindGlyph(FontFallbackChar) - float FallbackAdvanceX; // == FallbackGlyph->AdvanceX - ImWchar FallbackChar; // = '?' // Replacement glyph if one isn't found. Only set via SetFallbackChar() - - // Members: Cold ~18/26 bytes - short ConfigDataCount; // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont. - ImFontConfig* ConfigData; // // Pointer within ContainerAtlas->ConfigData - ImFontAtlas* ContainerAtlas; // // What we has been loaded into - float Ascent, Descent; // // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize] - int MetricsTotalSurface;// // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs) - - // Methods - IMGUI_API ImFont(); - IMGUI_API ~ImFont(); - IMGUI_API void ClearOutputData(); - IMGUI_API void BuildLookupTable(); - IMGUI_API const ImFontGlyph*FindGlyph(ImWchar c) const; - IMGUI_API void SetFallbackChar(ImWchar c); - float GetCharAdvance(ImWchar c) const { return ((int)c < IndexAdvanceX.Size) ? IndexAdvanceX[(int)c] : FallbackAdvanceX; } - bool IsLoaded() const { return ContainerAtlas != NULL; } - const char* GetDebugName() const { return ConfigData ? ConfigData->Name : ""; } - - // 'max_width' stops rendering after a certain width (could be turned into a 2d size). FLT_MAX to disable. - // 'wrap_width' enable automatic word-wrapping across multiple lines to fit into given width. 0.0f to disable. - IMGUI_API ImVec2 CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** remaining = NULL) const; // utf8 - IMGUI_API const char* CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const; - IMGUI_API void RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, unsigned short c) const; - IMGUI_API void RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false) const; - - // [Internal] - IMGUI_API void GrowIndex(int new_size); - IMGUI_API void AddGlyph(ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x); - IMGUI_API void AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built. - -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - typedef ImFontGlyph Glyph; // OBSOLETE 1.52+ -#endif -}; - -#if defined(__clang__) -#pragma clang diagnostic pop -#endif - -// Include imgui_user.h at the end of imgui.h (convenient for user to only explicitly include vanilla imgui.h) -#ifdef IMGUI_INCLUDE_IMGUI_USER_H -#include "imgui_user.h" -#endif diff --git a/vendor/librw/skeleton/imgui/imgui_demo.cpp b/vendor/librw/skeleton/imgui/imgui_demo.cpp deleted file mode 100644 index 94531a1..0000000 --- a/vendor/librw/skeleton/imgui/imgui_demo.cpp +++ /dev/null @@ -1,3068 +0,0 @@ -// dear imgui, v1.54 WIP -// (demo code) - -// Message to the person tempted to delete this file when integrating ImGui into their code base: -// Don't do it! Do NOT remove this file from your project! It is useful reference code that you and other users will want to refer to. -// Everything in this file will be stripped out by the linker if you don't call ImGui::ShowDemoWindow(). -// During development, you can call ImGui::ShowDemoWindow() in your code to learn about various features of ImGui. Have it wired in a debug menu! -// Removing this file from your project is hindering access to documentation for everyone in your team, likely leading you to poorer usage of the library. -// Note that you can #define IMGUI_DISABLE_DEMO_WINDOWS in imconfig.h for the same effect. -// If you want to link core ImGui in your final builds but not those demo windows, #define IMGUI_DISABLE_DEMO_WINDOWS in imconfig.h and those functions will be empty. -// In other situation, when you have ImGui available you probably want this to be available for reference and execution. -// Thank you, -// -Your beloved friend, imgui_demo.cpp (that you won't delete) - -// Message to beginner C/C++ programmers. About the meaning of 'static': in this demo code, we frequently we use 'static' variables inside functions. -// We do this as a way to gather code and data in the same place, just to make the demo code faster to read, faster to write, and use less code. -// A static variable persist across calls, so it is essentially like a global variable but declared inside the scope of the function. -// It also happens to be a convenient way of storing simple UI related information as long as your function doesn't need to be reentrant or used in threads. -// This might be a pattern you occasionally want to use in your code, but most of the real data you would be editing is likely to be stored outside your function. - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "imgui.h" -#include // toupper, isprint -#include // sqrtf, powf, cosf, sinf, floorf, ceilf -#include // vsnprintf, sscanf, printf -#include // NULL, malloc, free, atoi -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else -#include // intptr_t -#endif - -#ifdef _MSC_VER -#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen -#define snprintf _snprintf -#endif -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse. -#pragma clang diagnostic ignored "-Wdeprecated-declarations" // warning : 'xx' is deprecated: The POSIX name for this item.. // for strdup used in demo code (so user can copy & paste the code) -#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning : cast to 'void *' from smaller integer type 'int' -#pragma clang diagnostic ignored "-Wformat-security" // warning : warning: format string is not a string literal -#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning : declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. -#if __has_warning("-Wreserved-id-macro") -#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning : macro name is a reserved identifier // -#endif -#elif defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size -#pragma GCC diagnostic ignored "-Wformat-security" // warning : format string is not a string literal (potentially insecure) -#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function -#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value -#if (__GNUC__ >= 6) -#pragma GCC diagnostic ignored "-Wmisleading-indentation" // warning: this 'if' clause does not guard this statement // GCC 6.0+ only. See #883 on GitHub. -#endif -#endif - -// Play it nice with Windows users. Notepad in 2017 still doesn't display text data with Unix-style \n. -#ifdef _WIN32 -#define IM_NEWLINE "\r\n" -#else -#define IM_NEWLINE "\n" -#endif - -#define IM_MAX(_A,_B) (((_A) >= (_B)) ? (_A) : (_B)) - -//----------------------------------------------------------------------------- -// DEMO CODE -//----------------------------------------------------------------------------- - -#if !defined(IMGUI_DISABLE_OBSOLETE_FUNCTIONS) && defined(IMGUI_DISABLE_TEST_WINDOWS) && !defined(IMGUI_DISABLE_DEMO_WINDOWS) // Obsolete name since 1.53, TEST->DEMO -#define IMGUI_DISABLE_DEMO_WINDOWS -#endif - -#if !defined(IMGUI_DISABLE_DEMO_WINDOWS) - -static void ShowExampleAppConsole(bool* p_open); -static void ShowExampleAppLog(bool* p_open); -static void ShowExampleAppLayout(bool* p_open); -static void ShowExampleAppPropertyEditor(bool* p_open); -static void ShowExampleAppLongText(bool* p_open); -static void ShowExampleAppAutoResize(bool* p_open); -static void ShowExampleAppConstrainedResize(bool* p_open); -static void ShowExampleAppFixedOverlay(bool* p_open); -static void ShowExampleAppWindowTitles(bool* p_open); -static void ShowExampleAppCustomRendering(bool* p_open); -static void ShowExampleAppMainMenuBar(); -static void ShowExampleMenuFile(); - -static void ShowHelpMarker(const char* desc) -{ - ImGui::TextDisabled("(?)"); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(450.0f); - ImGui::TextUnformatted(desc); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } -} - -void ImGui::ShowUserGuide() -{ - ImGui::BulletText("Double-click on title bar to collapse window."); - ImGui::BulletText("Click and drag on lower right corner to resize window\n(double-click to auto fit window to its contents)."); - ImGui::BulletText("Click and drag on any empty space to move window."); - ImGui::BulletText("TAB/SHIFT+TAB to cycle through keyboard editable fields."); - ImGui::BulletText("CTRL+Click on a slider or drag box to input value as text."); - if (ImGui::GetIO().FontAllowUserScaling) - ImGui::BulletText("CTRL+Mouse Wheel to zoom window contents."); - ImGui::BulletText("Mouse Wheel to scroll."); - ImGui::BulletText("While editing text:\n"); - ImGui::Indent(); - ImGui::BulletText("Hold SHIFT or use mouse to select text."); - ImGui::BulletText("CTRL+Left/Right to word jump."); - ImGui::BulletText("CTRL+A or double-click to select all."); - ImGui::BulletText("CTRL+X,CTRL+C,CTRL+V to use clipboard."); - ImGui::BulletText("CTRL+Z,CTRL+Y to undo/redo."); - ImGui::BulletText("ESCAPE to revert."); - ImGui::BulletText("You can apply arithmetic operators +,*,/ on numerical values.\nUse +- to subtract."); - ImGui::Unindent(); -} - -// Demonstrate most ImGui features (big function!) -void ImGui::ShowDemoWindow(bool* p_open) -{ - // Examples apps - static bool show_app_main_menu_bar = false; - static bool show_app_console = false; - static bool show_app_log = false; - static bool show_app_layout = false; - static bool show_app_property_editor = false; - static bool show_app_long_text = false; - static bool show_app_auto_resize = false; - static bool show_app_constrained_resize = false; - static bool show_app_fixed_overlay = false; - static bool show_app_window_titles = false; - static bool show_app_custom_rendering = false; - static bool show_app_style_editor = false; - - static bool show_app_metrics = false; - static bool show_app_about = false; - - if (show_app_main_menu_bar) ShowExampleAppMainMenuBar(); - if (show_app_console) ShowExampleAppConsole(&show_app_console); - if (show_app_log) ShowExampleAppLog(&show_app_log); - if (show_app_layout) ShowExampleAppLayout(&show_app_layout); - if (show_app_property_editor) ShowExampleAppPropertyEditor(&show_app_property_editor); - if (show_app_long_text) ShowExampleAppLongText(&show_app_long_text); - if (show_app_auto_resize) ShowExampleAppAutoResize(&show_app_auto_resize); - if (show_app_constrained_resize) ShowExampleAppConstrainedResize(&show_app_constrained_resize); - if (show_app_fixed_overlay) ShowExampleAppFixedOverlay(&show_app_fixed_overlay); - if (show_app_window_titles) ShowExampleAppWindowTitles(&show_app_window_titles); - if (show_app_custom_rendering) ShowExampleAppCustomRendering(&show_app_custom_rendering); - - if (show_app_metrics) { ImGui::ShowMetricsWindow(&show_app_metrics); } - if (show_app_style_editor) { ImGui::Begin("Style Editor", &show_app_style_editor); ImGui::ShowStyleEditor(); ImGui::End(); } - if (show_app_about) - { - ImGui::Begin("About Dear ImGui", &show_app_about, ImGuiWindowFlags_AlwaysAutoResize); - ImGui::Text("dear imgui, %s", ImGui::GetVersion()); - ImGui::Separator(); - ImGui::Text("By Omar Cornut and all dear imgui contributors."); - ImGui::Text("Dear ImGui is licensed under the MIT License, see LICENSE for more information."); - ImGui::End(); - } - - static bool no_titlebar = false; - static bool no_scrollbar = false; - static bool no_menu = false; - static bool no_move = false; - static bool no_resize = false; - static bool no_collapse = false; - static bool no_close = false; - - // Demonstrate the various window flags. Typically you would just use the default. - ImGuiWindowFlags window_flags = 0; - if (no_titlebar) window_flags |= ImGuiWindowFlags_NoTitleBar; - if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar; - if (!no_menu) window_flags |= ImGuiWindowFlags_MenuBar; - if (no_move) window_flags |= ImGuiWindowFlags_NoMove; - if (no_resize) window_flags |= ImGuiWindowFlags_NoResize; - if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse; - if (no_close) p_open = NULL; // Don't pass our bool* to Begin - - ImGui::SetNextWindowSize(ImVec2(550,680), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("ImGui Demo", p_open, window_flags)) - { - // Early out if the window is collapsed, as an optimization. - ImGui::End(); - return; - } - - //ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.65f); // 2/3 of the space for widget and 1/3 for labels - ImGui::PushItemWidth(-140); // Right align, keep 140 pixels for labels - - ImGui::Text("dear imgui says hello. (%s)", IMGUI_VERSION); - - // Menu - if (ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("Menu")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Examples")) - { - ImGui::MenuItem("Main menu bar", NULL, &show_app_main_menu_bar); - ImGui::MenuItem("Console", NULL, &show_app_console); - ImGui::MenuItem("Log", NULL, &show_app_log); - ImGui::MenuItem("Simple layout", NULL, &show_app_layout); - ImGui::MenuItem("Property editor", NULL, &show_app_property_editor); - ImGui::MenuItem("Long text display", NULL, &show_app_long_text); - ImGui::MenuItem("Auto-resizing window", NULL, &show_app_auto_resize); - ImGui::MenuItem("Constrained-resizing window", NULL, &show_app_constrained_resize); - ImGui::MenuItem("Simple overlay", NULL, &show_app_fixed_overlay); - ImGui::MenuItem("Manipulating window titles", NULL, &show_app_window_titles); - ImGui::MenuItem("Custom rendering", NULL, &show_app_custom_rendering); - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Help")) - { - ImGui::MenuItem("Metrics", NULL, &show_app_metrics); - ImGui::MenuItem("Style Editor", NULL, &show_app_style_editor); - ImGui::MenuItem("About Dear ImGui", NULL, &show_app_about); - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - - ImGui::Spacing(); - if (ImGui::CollapsingHeader("Help")) - { - ImGui::TextWrapped("This window is being created by the ShowDemoWindow() function. Please refer to the code in imgui_demo.cpp for reference.\n\n"); - ImGui::Text("USER GUIDE:"); - ImGui::ShowUserGuide(); - } - - if (ImGui::CollapsingHeader("Window options")) - { - ImGui::Checkbox("No titlebar", &no_titlebar); ImGui::SameLine(150); - ImGui::Checkbox("No scrollbar", &no_scrollbar); ImGui::SameLine(300); - ImGui::Checkbox("No menu", &no_menu); - ImGui::Checkbox("No move", &no_move); ImGui::SameLine(150); - ImGui::Checkbox("No resize", &no_resize); ImGui::SameLine(300); - ImGui::Checkbox("No collapse", &no_collapse); - ImGui::Checkbox("No close", &no_close); - - if (ImGui::TreeNode("Style")) - { - ImGui::ShowStyleEditor(); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Capture/Logging")) - { - ImGui::TextWrapped("The logging API redirects all text output so you can easily capture the content of a window or a block. Tree nodes can be automatically expanded. You can also call ImGui::LogText() to output directly to the log without a visual output."); - ImGui::LogButtons(); - ImGui::TreePop(); - } - } - - if (ImGui::CollapsingHeader("Widgets")) - { - if (ImGui::TreeNode("Basic")) - { - static int clicked = 0; - if (ImGui::Button("Button")) - clicked++; - if (clicked & 1) - { - ImGui::SameLine(); - ImGui::Text("Thanks for clicking me!"); - } - - static bool check = true; - ImGui::Checkbox("checkbox", &check); - - static int e = 0; - ImGui::RadioButton("radio a", &e, 0); ImGui::SameLine(); - ImGui::RadioButton("radio b", &e, 1); ImGui::SameLine(); - ImGui::RadioButton("radio c", &e, 2); - - // Color buttons, demonstrate using PushID() to add unique identifier in the ID stack, and changing style. - for (int i = 0; i < 7; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::PushID(i); - ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i/7.0f, 0.6f, 0.6f)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i/7.0f, 0.7f, 0.7f)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i/7.0f, 0.8f, 0.8f)); - ImGui::Button("Click"); - ImGui::PopStyleColor(3); - ImGui::PopID(); - } - - ImGui::Text("Hover over me"); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("I am a tooltip"); - - ImGui::SameLine(); - ImGui::Text("- or me"); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::Text("I am a fancy tooltip"); - static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; - ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr)); - ImGui::EndTooltip(); - } - - // Testing ImGuiOnceUponAFrame helper. - //static ImGuiOnceUponAFrame once; - //for (int i = 0; i < 5; i++) - // if (once) - // ImGui::Text("This will be displayed only once."); - - ImGui::Separator(); - - ImGui::LabelText("label", "Value"); - - { - // Simplified one-liner Combo() API, using values packed in a single constant string - static int current_item_1 = 1; - ImGui::Combo("combo", ¤t_item_1, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); - //ImGui::Combo("combo w/ array of char*", ¤t_item_2_idx, items, IM_ARRAYSIZE(items)); // Combo using proper array. You can also pass a callback to retrieve array value, no need to create/copy an array just for that. - - // General BeginCombo() API, you have full control over your selection data and display type - const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO", "PPPP", "QQQQQQQQQQ", "RRR", "SSSS" }; - static const char* current_item_2 = NULL; - if (ImGui::BeginCombo("combo 2", current_item_2)) // The second parameter is the label previewed before opening the combo. - { - for (int n = 0; n < IM_ARRAYSIZE(items); n++) - { - bool is_selected = (current_item_2 == items[n]); // You can store your selection however you want, outside or inside your objects - if (ImGui::Selectable(items[n], is_selected)) - current_item_2 = items[n]; - if (is_selected) - ImGui::SetItemDefaultFocus(); // Set the initial focus when opening the combo (scrolling + for keyboard navigation support in the upcoming navigation branch) - } - ImGui::EndCombo(); - } - } - - { - static char str0[128] = "Hello, world!"; - static int i0=123; - static float f0=0.001f; - ImGui::InputText("input text", str0, IM_ARRAYSIZE(str0)); - ImGui::SameLine(); ShowHelpMarker("Hold SHIFT or use mouse to select text.\n" "CTRL+Left/Right to word jump.\n" "CTRL+A or double-click to select all.\n" "CTRL+X,CTRL+C,CTRL+V clipboard.\n" "CTRL+Z,CTRL+Y undo/redo.\n" "ESCAPE to revert.\n"); - - ImGui::InputInt("input int", &i0); - ImGui::SameLine(); ShowHelpMarker("You can apply arithmetic operators +,*,/ on numerical values.\n e.g. [ 100 ], input \'*2\', result becomes [ 200 ]\nUse +- to subtract.\n"); - - ImGui::InputFloat("input float", &f0, 0.01f, 1.0f); - - static float vec4a[4] = { 0.10f, 0.20f, 0.30f, 0.44f }; - ImGui::InputFloat3("input float3", vec4a); - } - - { - static int i1=50, i2=42; - ImGui::DragInt("drag int", &i1, 1); - ImGui::SameLine(); ShowHelpMarker("Click and drag to edit value.\nHold SHIFT/ALT for faster/slower edit.\nDouble-click or CTRL+click to input value."); - - ImGui::DragInt("drag int 0..100", &i2, 1, 0, 100, "%.0f%%"); - - static float f1=1.00f, f2=0.0067f; - ImGui::DragFloat("drag float", &f1, 0.005f); - ImGui::DragFloat("drag small float", &f2, 0.0001f, 0.0f, 0.0f, "%.06f ns"); - } - - { - static int i1=0; - ImGui::SliderInt("slider int", &i1, -1, 3); - ImGui::SameLine(); ShowHelpMarker("CTRL+click to input value."); - - static float f1=0.123f, f2=0.0f; - ImGui::SliderFloat("slider float", &f1, 0.0f, 1.0f, "ratio = %.3f"); - ImGui::SliderFloat("slider log float", &f2, -10.0f, 10.0f, "%.4f", 3.0f); - static float angle = 0.0f; - ImGui::SliderAngle("slider angle", &angle); - } - - static float col1[3] = { 1.0f,0.0f,0.2f }; - static float col2[4] = { 0.4f,0.7f,0.0f,0.5f }; - ImGui::ColorEdit3("color 1", col1); - ImGui::SameLine(); ShowHelpMarker("Click on the colored square to open a color picker.\nRight-click on the colored square to show options.\nCTRL+click on individual component to input value.\n"); - - ImGui::ColorEdit4("color 2", col2); - - const char* listbox_items[] = { "Apple", "Banana", "Cherry", "Kiwi", "Mango", "Orange", "Pineapple", "Strawberry", "Watermelon" }; - static int listbox_item_current = 1; - ImGui::ListBox("listbox\n(single select)", &listbox_item_current, listbox_items, IM_ARRAYSIZE(listbox_items), 4); - - //static int listbox_item_current2 = 2; - //ImGui::PushItemWidth(-1); - //ImGui::ListBox("##listbox2", &listbox_item_current2, listbox_items, IM_ARRAYSIZE(listbox_items), 4); - //ImGui::PopItemWidth(); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Trees")) - { - if (ImGui::TreeNode("Basic trees")) - { - for (int i = 0; i < 5; i++) - if (ImGui::TreeNode((void*)(intptr_t)i, "Child %d", i)) - { - ImGui::Text("blah blah"); - ImGui::SameLine(); - if (ImGui::SmallButton("print")) printf("Child %d pressed", i); - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Advanced, with Selectable nodes")) - { - ShowHelpMarker("This is a more standard looking tree with selectable nodes.\nClick to select, CTRL+Click to toggle, click on arrows or double-click to open."); - static bool align_label_with_current_x_position = false; - ImGui::Checkbox("Align label with current X position)", &align_label_with_current_x_position); - ImGui::Text("Hello!"); - if (align_label_with_current_x_position) - ImGui::Unindent(ImGui::GetTreeNodeToLabelSpacing()); - - static int selection_mask = (1 << 2); // Dumb representation of what may be user-side selection state. You may carry selection state inside or outside your objects in whatever format you see fit. - int node_clicked = -1; // Temporary storage of what node we have clicked to process selection at the end of the loop. May be a pointer to your own node type, etc. - ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, ImGui::GetFontSize()*3); // Increase spacing to differentiate leaves from expanded contents. - for (int i = 0; i < 6; i++) - { - // Disable the default open on single-click behavior and pass in Selected flag according to our selection state. - ImGuiTreeNodeFlags node_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ((selection_mask & (1 << i)) ? ImGuiTreeNodeFlags_Selected : 0); - if (i < 3) - { - // Node - bool node_open = ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Node %d", i); - if (ImGui::IsItemClicked()) - node_clicked = i; - if (node_open) - { - ImGui::Text("Blah blah\nBlah Blah"); - ImGui::TreePop(); - } - } - else - { - // Leaf: The only reason we have a TreeNode at all is to allow selection of the leaf. Otherwise we can use BulletText() or TreeAdvanceToLabelPos()+Text(). - node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; // ImGuiTreeNodeFlags_Bullet - ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Leaf %d", i); - if (ImGui::IsItemClicked()) - node_clicked = i; - } - } - if (node_clicked != -1) - { - // Update selection state. Process outside of tree loop to avoid visual inconsistencies during the clicking-frame. - if (ImGui::GetIO().KeyCtrl) - selection_mask ^= (1 << node_clicked); // CTRL+click to toggle - else //if (!(selection_mask & (1 << node_clicked))) // Depending on selection behavior you want, this commented bit preserve selection when clicking on item that is part of the selection - selection_mask = (1 << node_clicked); // Click to single-select - } - ImGui::PopStyleVar(); - if (align_label_with_current_x_position) - ImGui::Indent(ImGui::GetTreeNodeToLabelSpacing()); - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Collapsing Headers")) - { - static bool closable_group = true; - ImGui::Checkbox("Enable extra group", &closable_group); - if (ImGui::CollapsingHeader("Header")) - { - ImGui::Text("IsItemHovered: %d", IsItemHovered()); - for (int i = 0; i < 5; i++) - ImGui::Text("Some content %d", i); - } - if (ImGui::CollapsingHeader("Header with a close button", &closable_group)) - { - ImGui::Text("IsItemHovered: %d", IsItemHovered()); - for (int i = 0; i < 5; i++) - ImGui::Text("More content %d", i); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Bullets")) - { - ImGui::BulletText("Bullet point 1"); - ImGui::BulletText("Bullet point 2\nOn multiple lines"); - ImGui::Bullet(); ImGui::Text("Bullet point 3 (two calls)"); - ImGui::Bullet(); ImGui::SmallButton("Button"); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Text")) - { - if (ImGui::TreeNode("Colored Text")) - { - // Using shortcut. You can use PushStyleColor()/PopStyleColor() for more flexibility. - ImGui::TextColored(ImVec4(1.0f,0.0f,1.0f,1.0f), "Pink"); - ImGui::TextColored(ImVec4(1.0f,1.0f,0.0f,1.0f), "Yellow"); - ImGui::TextDisabled("Disabled"); - ImGui::SameLine(); ShowHelpMarker("The TextDisabled color is stored in ImGuiStyle."); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Word Wrapping")) - { - // Using shortcut. You can use PushTextWrapPos()/PopTextWrapPos() for more flexibility. - ImGui::TextWrapped("This text should automatically wrap on the edge of the window. The current implementation for text wrapping follows simple rules suitable for English and possibly other languages."); - ImGui::Spacing(); - - static float wrap_width = 200.0f; - ImGui::SliderFloat("Wrap width", &wrap_width, -20, 600, "%.0f"); - - ImGui::Text("Test paragraph 1:"); - ImVec2 pos = ImGui::GetCursorScreenPos(); - ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(pos.x + wrap_width, pos.y), ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight()), IM_COL32(255,0,255,255)); - ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width); - ImGui::Text("The lazy dog is a good dog. This paragraph is made to fit within %.0f pixels. Testing a 1 character word. The quick brown fox jumps over the lazy dog.", wrap_width); - ImGui::GetWindowDrawList()->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255,255,0,255)); - ImGui::PopTextWrapPos(); - - ImGui::Text("Test paragraph 2:"); - pos = ImGui::GetCursorScreenPos(); - ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(pos.x + wrap_width, pos.y), ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight()), IM_COL32(255,0,255,255)); - ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width); - ImGui::Text("aaaaaaaa bbbbbbbb, c cccccccc,dddddddd. d eeeeeeee ffffffff. gggggggg!hhhhhhhh"); - ImGui::GetWindowDrawList()->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255,255,0,255)); - ImGui::PopTextWrapPos(); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("UTF-8 Text")) - { - // UTF-8 test with Japanese characters - // (needs a suitable font, try Arial Unicode or M+ fonts http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index-en.html) - // - From C++11 you can use the u8"my text" syntax to encode literal strings as UTF-8 - // - For earlier compiler, you may be able to encode your sources as UTF-8 (e.g. Visual Studio save your file as 'UTF-8 without signature') - // - HOWEVER, FOR THIS DEMO FILE, BECAUSE WE WANT TO SUPPORT COMPILER, WE ARE *NOT* INCLUDING RAW UTF-8 CHARACTERS IN THIS SOURCE FILE. - // Instead we are encoding a few string with hexadecimal constants. Don't do this in your application! - // Note that characters values are preserved even by InputText() if the font cannot be displayed, so you can safely copy & paste garbled characters into another application. - ImGui::TextWrapped("CJK text will only appears if the font was loaded with the appropriate CJK character ranges. Call io.Font->LoadFromFileTTF() manually to load extra character ranges."); - ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)"); - ImGui::Text("Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)"); - static char buf[32] = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"; // "nihongo" - ImGui::InputText("UTF-8 input", buf, IM_ARRAYSIZE(buf)); - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Images")) - { - ImGui::TextWrapped("Below we are displaying the font texture (which is the only texture we have access to in this demo). Use the 'ImTextureID' type as storage to pass pointers or identifier to your own texture data. Hover the texture for a zoomed view!"); - ImGuiIO& io = ImGui::GetIO(); - - // Here we are grabbing the font texture because that's the only one we have access to inside the demo code. - // Remember that ImTextureID is just storage for whatever you want it to be, it is essentially a value that will be passed to the render function inside the ImDrawCmd structure. - // If you use one of the default imgui_impl_XXXX.cpp renderer, they all have comments at the top of their file to specify what they expect to be stored in ImTextureID. - // (for example, the imgui_impl_dx11.cpp renderer expect a 'ID3D11ShaderResourceView*' pointer. The imgui_impl_glfw_gl3.cpp renderer expect a GLuint OpenGL texture identifier etc.) - // If you decided that ImTextureID = MyEngineTexture*, then you can pass your MyEngineTexture* pointers to ImGui::Image(), and gather width/height through your own functions, etc. - // Using ShowMetricsWindow() as a "debugger" to inspect the draw data that are being passed to your render will help you debug issues if you are confused about this. - // Consider using the lower-level ImDrawList::AddImage() API, via ImGui::GetWindowDrawList()->AddImage(). - ImTextureID my_tex_id = io.Fonts->TexID; - float my_tex_w = (float)io.Fonts->TexWidth; - float my_tex_h = (float)io.Fonts->TexHeight; - - ImGui::Text("%.0fx%.0f", my_tex_w, my_tex_h); - ImVec2 pos = ImGui::GetCursorScreenPos(); - ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), ImVec2(0,0), ImVec2(1,1), ImColor(255,255,255,255), ImColor(255,255,255,128)); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - float focus_sz = 32.0f; - float focus_x = io.MousePos.x - pos.x - focus_sz * 0.5f; if (focus_x < 0.0f) focus_x = 0.0f; else if (focus_x > my_tex_w - focus_sz) focus_x = my_tex_w - focus_sz; - float focus_y = io.MousePos.y - pos.y - focus_sz * 0.5f; if (focus_y < 0.0f) focus_y = 0.0f; else if (focus_y > my_tex_h - focus_sz) focus_y = my_tex_h - focus_sz; - ImGui::Text("Min: (%.2f, %.2f)", focus_x, focus_y); - ImGui::Text("Max: (%.2f, %.2f)", focus_x + focus_sz, focus_y + focus_sz); - ImVec2 uv0 = ImVec2((focus_x) / my_tex_w, (focus_y) / my_tex_h); - ImVec2 uv1 = ImVec2((focus_x + focus_sz) / my_tex_w, (focus_y + focus_sz) / my_tex_h); - ImGui::Image(my_tex_id, ImVec2(128,128), uv0, uv1, ImColor(255,255,255,255), ImColor(255,255,255,128)); - ImGui::EndTooltip(); - } - ImGui::TextWrapped("And now some textured buttons.."); - static int pressed_count = 0; - for (int i = 0; i < 8; i++) - { - ImGui::PushID(i); - int frame_padding = -1 + i; // -1 = uses default padding - if (ImGui::ImageButton(my_tex_id, ImVec2(32,32), ImVec2(0,0), ImVec2(32.0f/my_tex_w,32/my_tex_h), frame_padding, ImColor(0,0,0,255))) - pressed_count += 1; - ImGui::PopID(); - ImGui::SameLine(); - } - ImGui::NewLine(); - ImGui::Text("Pressed %d times.", pressed_count); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Selectables")) - { - if (ImGui::TreeNode("Basic")) - { - static bool selected[4] = { false, true, false, false }; - ImGui::Selectable("1. I am selectable", &selected[0]); - ImGui::Selectable("2. I am selectable", &selected[1]); - ImGui::Text("3. I am not selectable"); - ImGui::Selectable("4. I am selectable", &selected[2]); - if (ImGui::Selectable("5. I am double clickable", selected[3], ImGuiSelectableFlags_AllowDoubleClick)) - if (ImGui::IsMouseDoubleClicked(0)) - selected[3] = !selected[3]; - ImGui::TreePop(); - } - if (ImGui::TreeNode("Rendering more text into the same block")) - { - static bool selected[3] = { false, false, false }; - ImGui::Selectable("main.c", &selected[0]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); - ImGui::Selectable("Hello.cpp", &selected[1]); ImGui::SameLine(300); ImGui::Text("12,345 bytes"); - ImGui::Selectable("Hello.h", &selected[2]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); - ImGui::TreePop(); - } - if (ImGui::TreeNode("In columns")) - { - ImGui::Columns(3, NULL, false); - static bool selected[16] = { 0 }; - for (int i = 0; i < 16; i++) - { - char label[32]; sprintf(label, "Item %d", i); - if (ImGui::Selectable(label, &selected[i])) {} - ImGui::NextColumn(); - } - ImGui::Columns(1); - ImGui::TreePop(); - } - if (ImGui::TreeNode("Grid")) - { - static bool selected[16] = { true, false, false, false, false, true, false, false, false, false, true, false, false, false, false, true }; - for (int i = 0; i < 16; i++) - { - ImGui::PushID(i); - if (ImGui::Selectable("Sailor", &selected[i], 0, ImVec2(50,50))) - { - int x = i % 4, y = i / 4; - if (x > 0) selected[i - 1] ^= 1; - if (x < 3) selected[i + 1] ^= 1; - if (y > 0) selected[i - 4] ^= 1; - if (y < 3) selected[i + 4] ^= 1; - } - if ((i % 4) < 3) ImGui::SameLine(); - ImGui::PopID(); - } - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Filtered Text Input")) - { - static char buf1[64] = ""; ImGui::InputText("default", buf1, 64); - static char buf2[64] = ""; ImGui::InputText("decimal", buf2, 64, ImGuiInputTextFlags_CharsDecimal); - static char buf3[64] = ""; ImGui::InputText("hexadecimal", buf3, 64, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase); - static char buf4[64] = ""; ImGui::InputText("uppercase", buf4, 64, ImGuiInputTextFlags_CharsUppercase); - static char buf5[64] = ""; ImGui::InputText("no blank", buf5, 64, ImGuiInputTextFlags_CharsNoBlank); - struct TextFilters { static int FilterImGuiLetters(ImGuiTextEditCallbackData* data) { if (data->EventChar < 256 && strchr("imgui", (char)data->EventChar)) return 0; return 1; } }; - static char buf6[64] = ""; ImGui::InputText("\"imgui\" letters", buf6, 64, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters); - - ImGui::Text("Password input"); - static char bufpass[64] = "password123"; - ImGui::InputText("password", bufpass, 64, ImGuiInputTextFlags_Password | ImGuiInputTextFlags_CharsNoBlank); - ImGui::SameLine(); ShowHelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n"); - ImGui::InputText("password (clear)", bufpass, 64, ImGuiInputTextFlags_CharsNoBlank); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Multi-line Text Input")) - { - static bool read_only = false; - static char text[1024*16] = - "/*\n" - " The Pentium F00F bug, shorthand for F0 0F C7 C8,\n" - " the hexadecimal encoding of one offending instruction,\n" - " more formally, the invalid operand with locked CMPXCHG8B\n" - " instruction bug, is a design flaw in the majority of\n" - " Intel Pentium, Pentium MMX, and Pentium OverDrive\n" - " processors (all in the P5 microarchitecture).\n" - "*/\n\n" - "label:\n" - "\tlock cmpxchg8b eax\n"; - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0)); - ImGui::Checkbox("Read-only", &read_only); - ImGui::PopStyleVar(); - ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-1.0f, ImGui::GetTextLineHeight() * 16), ImGuiInputTextFlags_AllowTabInput | (read_only ? ImGuiInputTextFlags_ReadOnly : 0)); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Plots widgets")) - { - static bool animate = true; - ImGui::Checkbox("Animate", &animate); - - static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; - ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr)); - - // Create a dummy array of contiguous float values to plot - // Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float and the sizeof() of your structure in the Stride parameter. - static float values[90] = { 0 }; - static int values_offset = 0; - static float refresh_time = 0.0f; - if (!animate || refresh_time == 0.0f) - refresh_time = ImGui::GetTime(); - while (refresh_time < ImGui::GetTime()) // Create dummy data at fixed 60 hz rate for the demo - { - static float phase = 0.0f; - values[values_offset] = cosf(phase); - values_offset = (values_offset+1) % IM_ARRAYSIZE(values); - phase += 0.10f*values_offset; - refresh_time += 1.0f/60.0f; - } - ImGui::PlotLines("Lines", values, IM_ARRAYSIZE(values), values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,80)); - ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0,80)); - - // Use functions to generate output - // FIXME: This is rather awkward because current plot API only pass in indices. We probably want an API passing floats and user provide sample rate/count. - struct Funcs - { - static float Sin(void*, int i) { return sinf(i * 0.1f); } - static float Saw(void*, int i) { return (i & 1) ? 1.0f : -1.0f; } - }; - static int func_type = 0, display_count = 70; - ImGui::Separator(); - ImGui::PushItemWidth(100); ImGui::Combo("func", &func_type, "Sin\0Saw\0"); ImGui::PopItemWidth(); - ImGui::SameLine(); - ImGui::SliderInt("Sample count", &display_count, 1, 400); - float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw; - ImGui::PlotLines("Lines", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0,80)); - ImGui::PlotHistogram("Histogram", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0,80)); - ImGui::Separator(); - - // Animate a simple progress bar - static float progress = 0.0f, progress_dir = 1.0f; - if (animate) - { - progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime; - if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; } - if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; } - } - - // Typically we would use ImVec2(-1.0f,0.0f) to use all available width, or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth. - ImGui::ProgressBar(progress, ImVec2(0.0f,0.0f)); - ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); - ImGui::Text("Progress Bar"); - - float progress_saturated = (progress < 0.0f) ? 0.0f : (progress > 1.0f) ? 1.0f : progress; - char buf[32]; - sprintf(buf, "%d/%d", (int)(progress_saturated*1753), 1753); - ImGui::ProgressBar(progress, ImVec2(0.f,0.f), buf); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Color/Picker Widgets")) - { - static ImVec4 color = ImColor(114, 144, 154, 200); - - static bool hdr = false; - static bool alpha_preview = true; - static bool alpha_half_preview = false; - static bool options_menu = true; - ImGui::Checkbox("With HDR", &hdr); ImGui::SameLine(); ShowHelpMarker("Currently all this does is to lift the 0..1 limits on dragging widgets."); - ImGui::Checkbox("With Alpha Preview", &alpha_preview); - ImGui::Checkbox("With Half Alpha Preview", &alpha_half_preview); - ImGui::Checkbox("With Options Menu", &options_menu); ImGui::SameLine(); ShowHelpMarker("Right-click on the individual color widget to show options."); - int misc_flags = (hdr ? ImGuiColorEditFlags_HDR : 0) | (alpha_half_preview ? ImGuiColorEditFlags_AlphaPreviewHalf : (alpha_preview ? ImGuiColorEditFlags_AlphaPreview : 0)) | (options_menu ? 0 : ImGuiColorEditFlags_NoOptions); - - ImGui::Text("Color widget:"); - ImGui::SameLine(); ShowHelpMarker("Click on the colored square to open a color picker.\nCTRL+click on individual component to input value.\n"); - ImGui::ColorEdit3("MyColor##1", (float*)&color, misc_flags); - - ImGui::Text("Color widget HSV with Alpha:"); - ImGui::ColorEdit4("MyColor##2", (float*)&color, ImGuiColorEditFlags_HSV | misc_flags); - - ImGui::Text("Color widget with Float Display:"); - ImGui::ColorEdit4("MyColor##2f", (float*)&color, ImGuiColorEditFlags_Float | misc_flags); - - ImGui::Text("Color button with Picker:"); - ImGui::SameLine(); ShowHelpMarker("With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\nWith the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only be used for the tooltip and picker popup."); - ImGui::ColorEdit4("MyColor##3", (float*)&color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | misc_flags); - - ImGui::Text("Color button with Custom Picker Popup:"); - - // Generate a dummy palette - static bool saved_palette_inited = false; - static ImVec4 saved_palette[32]; - if (!saved_palette_inited) - for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) - { - ImGui::ColorConvertHSVtoRGB(n / 31.0f, 0.8f, 0.8f, saved_palette[n].x, saved_palette[n].y, saved_palette[n].z); - saved_palette[n].w = 1.0f; // Alpha - } - saved_palette_inited = true; - - static ImVec4 backup_color; - bool open_popup = ImGui::ColorButton("MyColor##3b", color, misc_flags); - ImGui::SameLine(); - open_popup |= ImGui::Button("Palette"); - if (open_popup) - { - ImGui::OpenPopup("mypicker"); - backup_color = color; - } - if (ImGui::BeginPopup("mypicker")) - { - // FIXME: Adding a drag and drop example here would be perfect! - ImGui::Text("MY CUSTOM COLOR PICKER WITH AN AMAZING PALETTE!"); - ImGui::Separator(); - ImGui::ColorPicker4("##picker", (float*)&color, misc_flags | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoSmallPreview); - ImGui::SameLine(); - ImGui::BeginGroup(); - ImGui::Text("Current"); - ImGui::ColorButton("##current", color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60,40)); - ImGui::Text("Previous"); - if (ImGui::ColorButton("##previous", backup_color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60,40))) - color = backup_color; - ImGui::Separator(); - ImGui::Text("Palette"); - for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) - { - ImGui::PushID(n); - if ((n % 8) != 0) - ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y); - if (ImGui::ColorButton("##palette", saved_palette[n], ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip, ImVec2(20,20))) - color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z, color.w); // Preserve alpha! - - if (ImGui::BeginDragDropTarget()) - { - if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) - memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 3); - if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F)) - memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 4); - EndDragDropTarget(); - } - - ImGui::PopID(); - } - ImGui::EndGroup(); - ImGui::EndPopup(); - } - - ImGui::Text("Color button only:"); - ImGui::ColorButton("MyColor##3c", *(ImVec4*)&color, misc_flags, ImVec2(80,80)); - - ImGui::Text("Color picker:"); - static bool alpha = true; - static bool alpha_bar = true; - static bool side_preview = true; - static bool ref_color = false; - static ImVec4 ref_color_v(1.0f,0.0f,1.0f,0.5f); - static int inputs_mode = 2; - static int picker_mode = 0; - ImGui::Checkbox("With Alpha", &alpha); - ImGui::Checkbox("With Alpha Bar", &alpha_bar); - ImGui::Checkbox("With Side Preview", &side_preview); - if (side_preview) - { - ImGui::SameLine(); - ImGui::Checkbox("With Ref Color", &ref_color); - if (ref_color) - { - ImGui::SameLine(); - ImGui::ColorEdit4("##RefColor", &ref_color_v.x, ImGuiColorEditFlags_NoInputs | misc_flags); - } - } - ImGui::Combo("Inputs Mode", &inputs_mode, "All Inputs\0No Inputs\0RGB Input\0HSV Input\0HEX Input\0"); - ImGui::Combo("Picker Mode", &picker_mode, "Auto/Current\0Hue bar + SV rect\0Hue wheel + SV triangle\0"); - ImGui::SameLine(); ShowHelpMarker("User can right-click the picker to change mode."); - ImGuiColorEditFlags flags = misc_flags; - if (!alpha) flags |= ImGuiColorEditFlags_NoAlpha; // This is by default if you call ColorPicker3() instead of ColorPicker4() - if (alpha_bar) flags |= ImGuiColorEditFlags_AlphaBar; - if (!side_preview) flags |= ImGuiColorEditFlags_NoSidePreview; - if (picker_mode == 1) flags |= ImGuiColorEditFlags_PickerHueBar; - if (picker_mode == 2) flags |= ImGuiColorEditFlags_PickerHueWheel; - if (inputs_mode == 1) flags |= ImGuiColorEditFlags_NoInputs; - if (inputs_mode == 2) flags |= ImGuiColorEditFlags_RGB; - if (inputs_mode == 3) flags |= ImGuiColorEditFlags_HSV; - if (inputs_mode == 4) flags |= ImGuiColorEditFlags_HEX; - ImGui::ColorPicker4("MyColor##4", (float*)&color, flags, ref_color ? &ref_color_v.x : NULL); - - ImGui::Text("Programmatically set defaults/options:"); - ImGui::SameLine(); ShowHelpMarker("SetColorEditOptions() is designed to allow you to set boot-time default.\nWe don't have Push/Pop functions because you can force options on a per-widget basis if needed, and the user can change non-forced ones with the options menu.\nWe don't have a getter to avoid encouraging you to persistently save values that aren't forward-compatible."); - if (ImGui::Button("Uint8 + HSV")) - ImGui::SetColorEditOptions(ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_HSV); - ImGui::SameLine(); - if (ImGui::Button("Float + HDR")) - ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_RGB); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Range Widgets")) - { - static float begin = 10, end = 90; - static int begin_i = 100, end_i = 1000; - ImGui::DragFloatRange2("range", &begin, &end, 0.25f, 0.0f, 100.0f, "Min: %.1f %%", "Max: %.1f %%"); - ImGui::DragIntRange2("range int (no bounds)", &begin_i, &end_i, 5, 0, 0, "Min: %.0f units", "Max: %.0f units"); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Multi-component Widgets")) - { - static float vec4f[4] = { 0.10f, 0.20f, 0.30f, 0.44f }; - static int vec4i[4] = { 1, 5, 100, 255 }; - - ImGui::InputFloat2("input float2", vec4f); - ImGui::DragFloat2("drag float2", vec4f, 0.01f, 0.0f, 1.0f); - ImGui::SliderFloat2("slider float2", vec4f, 0.0f, 1.0f); - ImGui::DragInt2("drag int2", vec4i, 1, 0, 255); - ImGui::InputInt2("input int2", vec4i); - ImGui::SliderInt2("slider int2", vec4i, 0, 255); - ImGui::Spacing(); - - ImGui::InputFloat3("input float3", vec4f); - ImGui::DragFloat3("drag float3", vec4f, 0.01f, 0.0f, 1.0f); - ImGui::SliderFloat3("slider float3", vec4f, 0.0f, 1.0f); - ImGui::DragInt3("drag int3", vec4i, 1, 0, 255); - ImGui::InputInt3("input int3", vec4i); - ImGui::SliderInt3("slider int3", vec4i, 0, 255); - ImGui::Spacing(); - - ImGui::InputFloat4("input float4", vec4f); - ImGui::DragFloat4("drag float4", vec4f, 0.01f, 0.0f, 1.0f); - ImGui::SliderFloat4("slider float4", vec4f, 0.0f, 1.0f); - ImGui::InputInt4("input int4", vec4i); - ImGui::DragInt4("drag int4", vec4i, 1, 0, 255); - ImGui::SliderInt4("slider int4", vec4i, 0, 255); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Vertical Sliders")) - { - const float spacing = 4; - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(spacing, spacing)); - - static int int_value = 0; - ImGui::VSliderInt("##int", ImVec2(18,160), &int_value, 0, 5); - ImGui::SameLine(); - - static float values[7] = { 0.0f, 0.60f, 0.35f, 0.9f, 0.70f, 0.20f, 0.0f }; - ImGui::PushID("set1"); - for (int i = 0; i < 7; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::PushID(i); - ImGui::PushStyleColor(ImGuiCol_FrameBg, (ImVec4)ImColor::HSV(i/7.0f, 0.5f, 0.5f)); - ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, (ImVec4)ImColor::HSV(i/7.0f, 0.6f, 0.5f)); - ImGui::PushStyleColor(ImGuiCol_FrameBgActive, (ImVec4)ImColor::HSV(i/7.0f, 0.7f, 0.5f)); - ImGui::PushStyleColor(ImGuiCol_SliderGrab, (ImVec4)ImColor::HSV(i/7.0f, 0.9f, 0.9f)); - ImGui::VSliderFloat("##v", ImVec2(18,160), &values[i], 0.0f, 1.0f, ""); - if (ImGui::IsItemActive() || ImGui::IsItemHovered()) - ImGui::SetTooltip("%.3f", values[i]); - ImGui::PopStyleColor(4); - ImGui::PopID(); - } - ImGui::PopID(); - - ImGui::SameLine(); - ImGui::PushID("set2"); - static float values2[4] = { 0.20f, 0.80f, 0.40f, 0.25f }; - const int rows = 3; - const ImVec2 small_slider_size(18, (160.0f-(rows-1)*spacing)/rows); - for (int nx = 0; nx < 4; nx++) - { - if (nx > 0) ImGui::SameLine(); - ImGui::BeginGroup(); - for (int ny = 0; ny < rows; ny++) - { - ImGui::PushID(nx*rows+ny); - ImGui::VSliderFloat("##v", small_slider_size, &values2[nx], 0.0f, 1.0f, ""); - if (ImGui::IsItemActive() || ImGui::IsItemHovered()) - ImGui::SetTooltip("%.3f", values2[nx]); - ImGui::PopID(); - } - ImGui::EndGroup(); - } - ImGui::PopID(); - - ImGui::SameLine(); - ImGui::PushID("set3"); - for (int i = 0; i < 4; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::PushID(i); - ImGui::PushStyleVar(ImGuiStyleVar_GrabMinSize, 40); - ImGui::VSliderFloat("##v", ImVec2(40,160), &values[i], 0.0f, 1.0f, "%.2f\nsec"); - ImGui::PopStyleVar(); - ImGui::PopID(); - } - ImGui::PopID(); - ImGui::PopStyleVar(); - ImGui::TreePop(); - } - } - - if (ImGui::CollapsingHeader("Layout")) - { - if (ImGui::TreeNode("Child regions")) - { - static bool disable_mouse_wheel = false; - ImGui::Checkbox("Disable Mouse Wheel", &disable_mouse_wheel); - - ImGui::Text("Without border"); - static int line = 50; - bool goto_line = ImGui::Button("Goto"); - ImGui::SameLine(); - ImGui::PushItemWidth(100); - goto_line |= ImGui::InputInt("##Line", &line, 0, 0, ImGuiInputTextFlags_EnterReturnsTrue); - ImGui::PopItemWidth(); - - ImGui::BeginChild("Sub1", ImVec2(ImGui::GetWindowContentRegionWidth() * 0.5f,300), false, ImGuiWindowFlags_HorizontalScrollbar | (disable_mouse_wheel ? ImGuiWindowFlags_NoScrollWithMouse : 0)); - for (int i = 0; i < 100; i++) - { - ImGui::Text("%04d: scrollable region", i); - if (goto_line && line == i) - ImGui::SetScrollHere(); - } - if (goto_line && line >= 100) - ImGui::SetScrollHere(); - ImGui::EndChild(); - - ImGui::SameLine(); - - ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f); - ImGui::BeginChild("Sub2", ImVec2(0,300), true, (disable_mouse_wheel ? ImGuiWindowFlags_NoScrollWithMouse : 0)); - ImGui::Text("With border"); - ImGui::Columns(2); - for (int i = 0; i < 100; i++) - { - if (i == 50) - ImGui::NextColumn(); - char buf[32]; - sprintf(buf, "%08x", i*5731); - ImGui::Button(buf, ImVec2(-1.0f, 0.0f)); - } - ImGui::EndChild(); - ImGui::PopStyleVar(); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Widgets Width")) - { - static float f = 0.0f; - ImGui::Text("PushItemWidth(100)"); - ImGui::SameLine(); ShowHelpMarker("Fixed width."); - ImGui::PushItemWidth(100); - ImGui::DragFloat("float##1", &f); - ImGui::PopItemWidth(); - - ImGui::Text("PushItemWidth(GetWindowWidth() * 0.5f)"); - ImGui::SameLine(); ShowHelpMarker("Half of window width."); - ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.5f); - ImGui::DragFloat("float##2", &f); - ImGui::PopItemWidth(); - - ImGui::Text("PushItemWidth(GetContentRegionAvailWidth() * 0.5f)"); - ImGui::SameLine(); ShowHelpMarker("Half of available width.\n(~ right-cursor_pos)\n(works within a column set)"); - ImGui::PushItemWidth(ImGui::GetContentRegionAvailWidth() * 0.5f); - ImGui::DragFloat("float##3", &f); - ImGui::PopItemWidth(); - - ImGui::Text("PushItemWidth(-100)"); - ImGui::SameLine(); ShowHelpMarker("Align to right edge minus 100"); - ImGui::PushItemWidth(-100); - ImGui::DragFloat("float##4", &f); - ImGui::PopItemWidth(); - - ImGui::Text("PushItemWidth(-1)"); - ImGui::SameLine(); ShowHelpMarker("Align to right edge"); - ImGui::PushItemWidth(-1); - ImGui::DragFloat("float##5", &f); - ImGui::PopItemWidth(); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Basic Horizontal Layout")) - { - ImGui::TextWrapped("(Use ImGui::SameLine() to keep adding items to the right of the preceding item)"); - - // Text - ImGui::Text("Two items: Hello"); ImGui::SameLine(); - ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); - - // Adjust spacing - ImGui::Text("More spacing: Hello"); ImGui::SameLine(0, 20); - ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); - - // Button - ImGui::AlignTextToFramePadding(); - ImGui::Text("Normal buttons"); ImGui::SameLine(); - ImGui::Button("Banana"); ImGui::SameLine(); - ImGui::Button("Apple"); ImGui::SameLine(); - ImGui::Button("Corniflower"); - - // Button - ImGui::Text("Small buttons"); ImGui::SameLine(); - ImGui::SmallButton("Like this one"); ImGui::SameLine(); - ImGui::Text("can fit within a text block."); - - // Aligned to arbitrary position. Easy/cheap column. - ImGui::Text("Aligned"); - ImGui::SameLine(150); ImGui::Text("x=150"); - ImGui::SameLine(300); ImGui::Text("x=300"); - ImGui::Text("Aligned"); - ImGui::SameLine(150); ImGui::SmallButton("x=150"); - ImGui::SameLine(300); ImGui::SmallButton("x=300"); - - // Checkbox - static bool c1=false,c2=false,c3=false,c4=false; - ImGui::Checkbox("My", &c1); ImGui::SameLine(); - ImGui::Checkbox("Tailor", &c2); ImGui::SameLine(); - ImGui::Checkbox("Is", &c3); ImGui::SameLine(); - ImGui::Checkbox("Rich", &c4); - - // Various - static float f0=1.0f, f1=2.0f, f2=3.0f; - ImGui::PushItemWidth(80); - const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD" }; - static int item = -1; - ImGui::Combo("Combo", &item, items, IM_ARRAYSIZE(items)); ImGui::SameLine(); - ImGui::SliderFloat("X", &f0, 0.0f,5.0f); ImGui::SameLine(); - ImGui::SliderFloat("Y", &f1, 0.0f,5.0f); ImGui::SameLine(); - ImGui::SliderFloat("Z", &f2, 0.0f,5.0f); - ImGui::PopItemWidth(); - - ImGui::PushItemWidth(80); - ImGui::Text("Lists:"); - static int selection[4] = { 0, 1, 2, 3 }; - for (int i = 0; i < 4; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::PushID(i); - ImGui::ListBox("", &selection[i], items, IM_ARRAYSIZE(items)); - ImGui::PopID(); - //if (ImGui::IsItemHovered()) ImGui::SetTooltip("ListBox %d hovered", i); - } - ImGui::PopItemWidth(); - - // Dummy - ImVec2 sz(30,30); - ImGui::Button("A", sz); ImGui::SameLine(); - ImGui::Dummy(sz); ImGui::SameLine(); - ImGui::Button("B", sz); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Groups")) - { - ImGui::TextWrapped("(Using ImGui::BeginGroup()/EndGroup() to layout items. BeginGroup() basically locks the horizontal position. EndGroup() bundles the whole group so that you can use functions such as IsItemHovered() on it.)"); - ImGui::BeginGroup(); - { - ImGui::BeginGroup(); - ImGui::Button("AAA"); - ImGui::SameLine(); - ImGui::Button("BBB"); - ImGui::SameLine(); - ImGui::BeginGroup(); - ImGui::Button("CCC"); - ImGui::Button("DDD"); - ImGui::EndGroup(); - ImGui::SameLine(); - ImGui::Button("EEE"); - ImGui::EndGroup(); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("First group hovered"); - } - // Capture the group size and create widgets using the same size - ImVec2 size = ImGui::GetItemRectSize(); - const float values[5] = { 0.5f, 0.20f, 0.80f, 0.60f, 0.25f }; - ImGui::PlotHistogram("##values", values, IM_ARRAYSIZE(values), 0, NULL, 0.0f, 1.0f, size); - - ImGui::Button("ACTION", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x)*0.5f,size.y)); - ImGui::SameLine(); - ImGui::Button("REACTION", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x)*0.5f,size.y)); - ImGui::EndGroup(); - ImGui::SameLine(); - - ImGui::Button("LEVERAGE\nBUZZWORD", size); - ImGui::SameLine(); - - ImGui::ListBoxHeader("List", size); - ImGui::Selectable("Selected", true); - ImGui::Selectable("Not Selected", false); - ImGui::ListBoxFooter(); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Text Baseline Alignment")) - { - ImGui::TextWrapped("(This is testing the vertical alignment that occurs on text to keep it at the same baseline as widgets. Lines only composed of text or \"small\" widgets fit in less vertical spaces than lines with normal widgets)"); - - ImGui::Text("One\nTwo\nThree"); ImGui::SameLine(); - ImGui::Text("Hello\nWorld"); ImGui::SameLine(); - ImGui::Text("Banana"); - - ImGui::Text("Banana"); ImGui::SameLine(); - ImGui::Text("Hello\nWorld"); ImGui::SameLine(); - ImGui::Text("One\nTwo\nThree"); - - ImGui::Button("HOP##1"); ImGui::SameLine(); - ImGui::Text("Banana"); ImGui::SameLine(); - ImGui::Text("Hello\nWorld"); ImGui::SameLine(); - ImGui::Text("Banana"); - - ImGui::Button("HOP##2"); ImGui::SameLine(); - ImGui::Text("Hello\nWorld"); ImGui::SameLine(); - ImGui::Text("Banana"); - - ImGui::Button("TEST##1"); ImGui::SameLine(); - ImGui::Text("TEST"); ImGui::SameLine(); - ImGui::SmallButton("TEST##2"); - - ImGui::AlignTextToFramePadding(); // If your line starts with text, call this to align it to upcoming widgets. - ImGui::Text("Text aligned to Widget"); ImGui::SameLine(); - ImGui::Button("Widget##1"); ImGui::SameLine(); - ImGui::Text("Widget"); ImGui::SameLine(); - ImGui::SmallButton("Widget##2"); ImGui::SameLine(); - ImGui::Button("Widget##3"); - - // Tree - const float spacing = ImGui::GetStyle().ItemInnerSpacing.x; - ImGui::Button("Button##1"); - ImGui::SameLine(0.0f, spacing); - if (ImGui::TreeNode("Node##1")) { for (int i = 0; i < 6; i++) ImGui::BulletText("Item %d..", i); ImGui::TreePop(); } // Dummy tree data - - ImGui::AlignTextToFramePadding(); // Vertically align text node a bit lower so it'll be vertically centered with upcoming widget. Otherwise you can use SmallButton (smaller fit). - bool node_open = ImGui::TreeNode("Node##2"); // Common mistake to avoid: if we want to SameLine after TreeNode we need to do it before we add child content. - ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##2"); - if (node_open) { for (int i = 0; i < 6; i++) ImGui::BulletText("Item %d..", i); ImGui::TreePop(); } // Dummy tree data - - // Bullet - ImGui::Button("Button##3"); - ImGui::SameLine(0.0f, spacing); - ImGui::BulletText("Bullet text"); - - ImGui::AlignTextToFramePadding(); - ImGui::BulletText("Node"); - ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##4"); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Scrolling")) - { - ImGui::TextWrapped("(Use SetScrollHere() or SetScrollFromPosY() to scroll to a given position.)"); - static bool track = true; - static int track_line = 50, scroll_to_px = 200; - ImGui::Checkbox("Track", &track); - ImGui::PushItemWidth(100); - ImGui::SameLine(130); track |= ImGui::DragInt("##line", &track_line, 0.25f, 0, 99, "Line = %.0f"); - bool scroll_to = ImGui::Button("Scroll To Pos"); - ImGui::SameLine(130); scroll_to |= ImGui::DragInt("##pos_y", &scroll_to_px, 1.00f, 0, 9999, "Y = %.0f px"); - ImGui::PopItemWidth(); - if (scroll_to) track = false; - - for (int i = 0; i < 5; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::BeginGroup(); - ImGui::Text("%s", i == 0 ? "Top" : i == 1 ? "25%" : i == 2 ? "Center" : i == 3 ? "75%" : "Bottom"); - ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(ImGui::GetWindowWidth() * 0.17f, 200.0f), true); - if (scroll_to) - ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_px, i * 0.25f); - for (int line = 0; line < 100; line++) - { - if (track && line == track_line) - { - ImGui::TextColored(ImColor(255,255,0), "Line %d", line); - ImGui::SetScrollHere(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom - } - else - { - ImGui::Text("Line %d", line); - } - } - float scroll_y = ImGui::GetScrollY(), scroll_max_y = ImGui::GetScrollMaxY(); - ImGui::EndChild(); - ImGui::Text("%.0f/%0.f", scroll_y, scroll_max_y); - ImGui::EndGroup(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Horizontal Scrolling")) - { - ImGui::Bullet(); ImGui::TextWrapped("Horizontal scrolling for a window has to be enabled explicitly via the ImGuiWindowFlags_HorizontalScrollbar flag."); - ImGui::Bullet(); ImGui::TextWrapped("You may want to explicitly specify content width by calling SetNextWindowContentWidth() before Begin()."); - static int lines = 7; - ImGui::SliderInt("Lines", &lines, 1, 15); - ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 1.0f)); - ImGui::BeginChild("scrolling", ImVec2(0, ImGui::GetFrameHeightWithSpacing()*7 + 30), true, ImGuiWindowFlags_HorizontalScrollbar); - for (int line = 0; line < lines; line++) - { - // Display random stuff (for the sake of this trivial demo we are using basic Button+SameLine. If you want to create your own time line for a real application you may be better off - // manipulating the cursor position yourself, aka using SetCursorPos/SetCursorScreenPos to position the widgets yourself. You may also want to use the lower-level ImDrawList API) - int num_buttons = 10 + ((line & 1) ? line * 9 : line * 3); - for (int n = 0; n < num_buttons; n++) - { - if (n > 0) ImGui::SameLine(); - ImGui::PushID(n + line * 1000); - char num_buf[16]; - sprintf(num_buf, "%d", n); - const char* label = (!(n%15)) ? "FizzBuzz" : (!(n%3)) ? "Fizz" : (!(n%5)) ? "Buzz" : num_buf; - float hue = n*0.05f; - ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(hue, 0.6f, 0.6f)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(hue, 0.7f, 0.7f)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(hue, 0.8f, 0.8f)); - ImGui::Button(label, ImVec2(40.0f + sinf((float)(line + n)) * 20.0f, 0.0f)); - ImGui::PopStyleColor(3); - ImGui::PopID(); - } - } - float scroll_x = ImGui::GetScrollX(), scroll_max_x = ImGui::GetScrollMaxX(); - ImGui::EndChild(); - ImGui::PopStyleVar(2); - float scroll_x_delta = 0.0f; - ImGui::SmallButton("<<"); if (ImGui::IsItemActive()) scroll_x_delta = -ImGui::GetIO().DeltaTime * 1000.0f; ImGui::SameLine(); - ImGui::Text("Scroll from code"); ImGui::SameLine(); - ImGui::SmallButton(">>"); if (ImGui::IsItemActive()) scroll_x_delta = +ImGui::GetIO().DeltaTime * 1000.0f; ImGui::SameLine(); - ImGui::Text("%.0f/%.0f", scroll_x, scroll_max_x); - if (scroll_x_delta != 0.0f) - { - ImGui::BeginChild("scrolling"); // Demonstrate a trick: you can use Begin to set yourself in the context of another window (here we are already out of your child window) - ImGui::SetScrollX(ImGui::GetScrollX() + scroll_x_delta); - ImGui::End(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Clipping")) - { - static ImVec2 size(100, 100), offset(50, 20); - ImGui::TextWrapped("On a per-widget basis we are occasionally clipping text CPU-side if it won't fit in its frame. Otherwise we are doing coarser clipping + passing a scissor rectangle to the renderer. The system is designed to try minimizing both execution and CPU/GPU rendering cost."); - ImGui::DragFloat2("size", (float*)&size, 0.5f, 0.0f, 200.0f, "%.0f"); - ImGui::TextWrapped("(Click and drag)"); - ImVec2 pos = ImGui::GetCursorScreenPos(); - ImVec4 clip_rect(pos.x, pos.y, pos.x+size.x, pos.y+size.y); - ImGui::InvisibleButton("##dummy", size); - if (ImGui::IsItemActive() && ImGui::IsMouseDragging()) { offset.x += ImGui::GetIO().MouseDelta.x; offset.y += ImGui::GetIO().MouseDelta.y; } - ImGui::GetWindowDrawList()->AddRectFilled(pos, ImVec2(pos.x+size.x,pos.y+size.y), ImColor(90,90,120,255)); - ImGui::GetWindowDrawList()->AddText(ImGui::GetFont(), ImGui::GetFontSize()*2.0f, ImVec2(pos.x+offset.x,pos.y+offset.y), ImColor(255,255,255,255), "Line 1 hello\nLine 2 clip me!", NULL, 0.0f, &clip_rect); - ImGui::TreePop(); - } - } - - if (ImGui::CollapsingHeader("Popups & Modal windows")) - { - if (ImGui::TreeNode("Popups")) - { - ImGui::TextWrapped("When a popup is active, it inhibits interacting with windows that are behind the popup. Clicking outside the popup closes it."); - - static int selected_fish = -1; - const char* names[] = { "Bream", "Haddock", "Mackerel", "Pollock", "Tilefish" }; - static bool toggles[] = { true, false, false, false, false }; - - // Simple selection popup - // (If you want to show the current selection inside the Button itself, you may want to build a string using the "###" operator to preserve a constant ID with a variable label) - if (ImGui::Button("Select..")) - ImGui::OpenPopup("select"); - ImGui::SameLine(); - ImGui::TextUnformatted(selected_fish == -1 ? "" : names[selected_fish]); - if (ImGui::BeginPopup("select")) - { - ImGui::Text("Aquarium"); - ImGui::Separator(); - for (int i = 0; i < IM_ARRAYSIZE(names); i++) - if (ImGui::Selectable(names[i])) - selected_fish = i; - ImGui::EndPopup(); - } - - // Showing a menu with toggles - if (ImGui::Button("Toggle..")) - ImGui::OpenPopup("toggle"); - if (ImGui::BeginPopup("toggle")) - { - for (int i = 0; i < IM_ARRAYSIZE(names); i++) - ImGui::MenuItem(names[i], "", &toggles[i]); - if (ImGui::BeginMenu("Sub-menu")) - { - ImGui::MenuItem("Click me"); - ImGui::EndMenu(); - } - - ImGui::Separator(); - ImGui::Text("Tooltip here"); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("I am a tooltip over a popup"); - - if (ImGui::Button("Stacked Popup")) - ImGui::OpenPopup("another popup"); - if (ImGui::BeginPopup("another popup")) - { - for (int i = 0; i < IM_ARRAYSIZE(names); i++) - ImGui::MenuItem(names[i], "", &toggles[i]); - if (ImGui::BeginMenu("Sub-menu")) - { - ImGui::MenuItem("Click me"); - ImGui::EndMenu(); - } - ImGui::EndPopup(); - } - ImGui::EndPopup(); - } - - if (ImGui::Button("Popup Menu..")) - ImGui::OpenPopup("FilePopup"); - if (ImGui::BeginPopup("FilePopup")) - { - ShowExampleMenuFile(); - ImGui::EndPopup(); - } - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Context menus")) - { - // BeginPopupContextItem() is a helper to provide common/simple popup behavior of essentially doing: - // if (IsItemHovered() && IsMouseClicked(0)) - // OpenPopup(id); - // return BeginPopup(id); - // For more advanced uses you may want to replicate and cuztomize this code. This the comments inside BeginPopupContextItem() implementation. - static float value = 0.5f; - ImGui::Text("Value = %.3f (<-- right-click here)", value); - if (ImGui::BeginPopupContextItem("item context menu")) - { - if (ImGui::Selectable("Set to zero")) value = 0.0f; - if (ImGui::Selectable("Set to PI")) value = 3.1415f; - ImGui::PushItemWidth(-1); - ImGui::DragFloat("##Value", &value, 0.1f, 0.0f, 0.0f); - ImGui::PopItemWidth(); - ImGui::EndPopup(); - } - - static char name[32] = "Label1"; - char buf[64]; sprintf(buf, "Button: %s###Button", name); // ### operator override ID ignoring the preceding label - ImGui::Button(buf); - if (ImGui::BeginPopupContextItem()) // When used after an item that has an ID (here the Button), we can skip providing an ID to BeginPopupContextItem(). - { - ImGui::Text("Edit name:"); - ImGui::InputText("##edit", name, IM_ARRAYSIZE(name)); - if (ImGui::Button("Close")) - ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - ImGui::SameLine(); ImGui::Text("(<-- right-click here)"); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Modals")) - { - ImGui::TextWrapped("Modal windows are like popups but the user cannot close them by clicking outside the window."); - - if (ImGui::Button("Delete..")) - ImGui::OpenPopup("Delete?"); - if (ImGui::BeginPopupModal("Delete?", NULL, ImGuiWindowFlags_AlwaysAutoResize)) - { - ImGui::Text("All those beautiful files will be deleted.\nThis operation cannot be undone!\n\n"); - ImGui::Separator(); - - //static int dummy_i = 0; - //ImGui::Combo("Combo", &dummy_i, "Delete\0Delete harder\0"); - - static bool dont_ask_me_next_time = false; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0)); - ImGui::Checkbox("Don't ask me next time", &dont_ask_me_next_time); - ImGui::PopStyleVar(); - - if (ImGui::Button("OK", ImVec2(120,0))) { ImGui::CloseCurrentPopup(); } - ImGui::SameLine(); - if (ImGui::Button("Cancel", ImVec2(120,0))) { ImGui::CloseCurrentPopup(); } - ImGui::EndPopup(); - } - - if (ImGui::Button("Stacked modals..")) - ImGui::OpenPopup("Stacked 1"); - if (ImGui::BeginPopupModal("Stacked 1")) - { - ImGui::Text("Hello from Stacked The First\nUsing style.Colors[ImGuiCol_ModalWindowDarkening] for darkening."); - static int item = 1; - ImGui::Combo("Combo", &item, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); - static float color[4] = { 0.4f,0.7f,0.0f,0.5f }; - ImGui::ColorEdit4("color", color); // This is to test behavior of stacked regular popups over a modal - - if (ImGui::Button("Add another modal..")) - ImGui::OpenPopup("Stacked 2"); - if (ImGui::BeginPopupModal("Stacked 2")) - { - ImGui::Text("Hello from Stacked The Second"); - if (ImGui::Button("Close")) - ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - - if (ImGui::Button("Close")) - ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Menus inside a regular window")) - { - ImGui::TextWrapped("Below we are testing adding menu items to a regular window. It's rather unusual but should work!"); - ImGui::Separator(); - // NB: As a quirk in this very specific example, we want to differentiate the parent of this menu from the parent of the various popup menus above. - // To do so we are encloding the items in a PushID()/PopID() block to make them two different menusets. If we don't, opening any popup above and hovering our menu here - // would open it. This is because once a menu is active, we allow to switch to a sibling menu by just hovering on it, which is the desired behavior for regular menus. - ImGui::PushID("foo"); - ImGui::MenuItem("Menu item", "CTRL+M"); - if (ImGui::BeginMenu("Menu inside a regular window")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - ImGui::PopID(); - ImGui::Separator(); - ImGui::TreePop(); - } - } - - if (ImGui::CollapsingHeader("Columns")) - { - ImGui::PushID("Columns"); - - // Basic columns - if (ImGui::TreeNode("Basic")) - { - ImGui::Text("Without border:"); - ImGui::Columns(3, "mycolumns3", false); // 3-ways, no border - ImGui::Separator(); - for (int n = 0; n < 14; n++) - { - char label[32]; - sprintf(label, "Item %d", n); - if (ImGui::Selectable(label)) {} - //if (ImGui::Button(label, ImVec2(-1,0))) {} - ImGui::NextColumn(); - } - ImGui::Columns(1); - ImGui::Separator(); - - ImGui::Text("With border:"); - ImGui::Columns(4, "mycolumns"); // 4-ways, with border - ImGui::Separator(); - ImGui::Text("ID"); ImGui::NextColumn(); - ImGui::Text("Name"); ImGui::NextColumn(); - ImGui::Text("Path"); ImGui::NextColumn(); - ImGui::Text("Hovered"); ImGui::NextColumn(); - ImGui::Separator(); - const char* names[3] = { "One", "Two", "Three" }; - const char* paths[3] = { "/path/one", "/path/two", "/path/three" }; - static int selected = -1; - for (int i = 0; i < 3; i++) - { - char label[32]; - sprintf(label, "%04d", i); - if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SpanAllColumns)) - selected = i; - bool hovered = ImGui::IsItemHovered(); - ImGui::NextColumn(); - ImGui::Text(names[i]); ImGui::NextColumn(); - ImGui::Text(paths[i]); ImGui::NextColumn(); - ImGui::Text("%d", hovered); ImGui::NextColumn(); - } - ImGui::Columns(1); - ImGui::Separator(); - ImGui::TreePop(); - } - - // Create multiple items in a same cell before switching to next column - if (ImGui::TreeNode("Mixed items")) - { - ImGui::Columns(3, "mixed"); - ImGui::Separator(); - - ImGui::Text("Hello"); - ImGui::Button("Banana"); - ImGui::NextColumn(); - - ImGui::Text("ImGui"); - ImGui::Button("Apple"); - static float foo = 1.0f; - ImGui::InputFloat("red", &foo, 0.05f, 0, 3); - ImGui::Text("An extra line here."); - ImGui::NextColumn(); - - ImGui::Text("Sailor"); - ImGui::Button("Corniflower"); - static float bar = 1.0f; - ImGui::InputFloat("blue", &bar, 0.05f, 0, 3); - ImGui::NextColumn(); - - if (ImGui::CollapsingHeader("Category A")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); - if (ImGui::CollapsingHeader("Category B")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); - if (ImGui::CollapsingHeader("Category C")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); - ImGui::Columns(1); - ImGui::Separator(); - ImGui::TreePop(); - } - - // Word wrapping - if (ImGui::TreeNode("Word-wrapping")) - { - ImGui::Columns(2, "word-wrapping"); - ImGui::Separator(); - ImGui::TextWrapped("The quick brown fox jumps over the lazy dog."); - ImGui::TextWrapped("Hello Left"); - ImGui::NextColumn(); - ImGui::TextWrapped("The quick brown fox jumps over the lazy dog."); - ImGui::TextWrapped("Hello Right"); - ImGui::Columns(1); - ImGui::Separator(); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Borders")) - { - // NB: Future columns API should allow automatic horizontal borders. - static bool h_borders = true; - static bool v_borders = true; - ImGui::Checkbox("horizontal", &h_borders); - ImGui::SameLine(); - ImGui::Checkbox("vertical", &v_borders); - ImGui::Columns(4, NULL, v_borders); - for (int i = 0; i < 4*3; i++) - { - if (h_borders && ImGui::GetColumnIndex() == 0) - ImGui::Separator(); - ImGui::Text("%c%c%c", 'a'+i, 'a'+i, 'a'+i); - ImGui::Text("Width %.2f\nOffset %.2f", ImGui::GetColumnWidth(), ImGui::GetColumnOffset()); - ImGui::NextColumn(); - } - ImGui::Columns(1); - if (h_borders) - ImGui::Separator(); - ImGui::TreePop(); - } - - // Scrolling columns - /* - if (ImGui::TreeNode("Vertical Scrolling")) - { - ImGui::BeginChild("##header", ImVec2(0, ImGui::GetTextLineHeightWithSpacing()+ImGui::GetStyle().ItemSpacing.y)); - ImGui::Columns(3); - ImGui::Text("ID"); ImGui::NextColumn(); - ImGui::Text("Name"); ImGui::NextColumn(); - ImGui::Text("Path"); ImGui::NextColumn(); - ImGui::Columns(1); - ImGui::Separator(); - ImGui::EndChild(); - ImGui::BeginChild("##scrollingregion", ImVec2(0, 60)); - ImGui::Columns(3); - for (int i = 0; i < 10; i++) - { - ImGui::Text("%04d", i); ImGui::NextColumn(); - ImGui::Text("Foobar"); ImGui::NextColumn(); - ImGui::Text("/path/foobar/%04d/", i); ImGui::NextColumn(); - } - ImGui::Columns(1); - ImGui::EndChild(); - ImGui::TreePop(); - } - */ - - if (ImGui::TreeNode("Horizontal Scrolling")) - { - ImGui::SetNextWindowContentSize(ImVec2(1500.0f, 0.0f)); - ImGui::BeginChild("##ScrollingRegion", ImVec2(0, ImGui::GetFontSize() * 20), false, ImGuiWindowFlags_HorizontalScrollbar); - ImGui::Columns(10); - int ITEMS_COUNT = 2000; - ImGuiListClipper clipper(ITEMS_COUNT); // Also demonstrate using the clipper for large list - while (clipper.Step()) - { - for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) - for (int j = 0; j < 10; j++) - { - ImGui::Text("Line %d Column %d...", i, j); - ImGui::NextColumn(); - } - } - ImGui::Columns(1); - ImGui::EndChild(); - ImGui::TreePop(); - } - - bool node_open = ImGui::TreeNode("Tree within single cell"); - ImGui::SameLine(); ShowHelpMarker("NB: Tree node must be poped before ending the cell. There's no storage of state per-cell."); - if (node_open) - { - ImGui::Columns(2, "tree items"); - ImGui::Separator(); - if (ImGui::TreeNode("Hello")) { ImGui::BulletText("Sailor"); ImGui::TreePop(); } ImGui::NextColumn(); - if (ImGui::TreeNode("Bonjour")) { ImGui::BulletText("Marin"); ImGui::TreePop(); } ImGui::NextColumn(); - ImGui::Columns(1); - ImGui::Separator(); - ImGui::TreePop(); - } - ImGui::PopID(); - } - - if (ImGui::CollapsingHeader("Filtering")) - { - static ImGuiTextFilter filter; - ImGui::Text("Filter usage:\n" - " \"\" display all lines\n" - " \"xxx\" display lines containing \"xxx\"\n" - " \"xxx,yyy\" display lines containing \"xxx\" or \"yyy\"\n" - " \"-xxx\" hide lines containing \"xxx\""); - filter.Draw(); - const char* lines[] = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }; - for (int i = 0; i < IM_ARRAYSIZE(lines); i++) - if (filter.PassFilter(lines[i])) - ImGui::BulletText("%s", lines[i]); - } - - if (ImGui::CollapsingHeader("Inputs & Focus")) - { - ImGuiIO& io = ImGui::GetIO(); - ImGui::Checkbox("io.MouseDrawCursor", &io.MouseDrawCursor); - ImGui::SameLine(); ShowHelpMarker("Request ImGui to render a mouse cursor for you in software. Note that a mouse cursor rendered via your application GPU rendering path will feel more laggy than hardware cursor, but will be more in sync with your other visuals.\n\nSome desktop applications may use both kinds of cursors (e.g. enable software cursor only when resizing/dragging something)."); - - ImGui::Text("WantCaptureMouse: %d", io.WantCaptureMouse); - ImGui::Text("WantCaptureKeyboard: %d", io.WantCaptureKeyboard); - ImGui::Text("WantTextInput: %d", io.WantTextInput); - ImGui::Text("WantMoveMouse: %d", io.WantMoveMouse); - - if (ImGui::TreeNode("Keyboard & Mouse State")) - { - if (ImGui::IsMousePosValid()) - ImGui::Text("Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y); - else - ImGui::Text("Mouse pos: "); - ImGui::Text("Mouse down:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (io.MouseDownDuration[i] >= 0.0f) { ImGui::SameLine(); ImGui::Text("b%d (%.02f secs)", i, io.MouseDownDuration[i]); } - ImGui::Text("Mouse clicked:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseClicked(i)) { ImGui::SameLine(); ImGui::Text("b%d", i); } - ImGui::Text("Mouse dbl-clicked:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseDoubleClicked(i)) { ImGui::SameLine(); ImGui::Text("b%d", i); } - ImGui::Text("Mouse released:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseReleased(i)) { ImGui::SameLine(); ImGui::Text("b%d", i); } - ImGui::Text("Mouse wheel: %.1f", io.MouseWheel); - - ImGui::Text("Keys down:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (io.KeysDownDuration[i] >= 0.0f) { ImGui::SameLine(); ImGui::Text("%d (%.02f secs)", i, io.KeysDownDuration[i]); } - ImGui::Text("Keys pressed:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyPressed(i)) { ImGui::SameLine(); ImGui::Text("%d", i); } - ImGui::Text("Keys release:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyReleased(i)) { ImGui::SameLine(); ImGui::Text("%d", i); } - ImGui::Text("Keys mods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : ""); - - - ImGui::Button("Hovering me sets the\nkeyboard capture flag"); - if (ImGui::IsItemHovered()) - ImGui::CaptureKeyboardFromApp(true); - ImGui::SameLine(); - ImGui::Button("Holding me clears the\nthe keyboard capture flag"); - if (ImGui::IsItemActive()) - ImGui::CaptureKeyboardFromApp(false); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Tabbing")) - { - ImGui::Text("Use TAB/SHIFT+TAB to cycle through keyboard editable fields."); - static char buf[32] = "dummy"; - ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); - ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); - ImGui::InputText("3", buf, IM_ARRAYSIZE(buf)); - ImGui::PushAllowKeyboardFocus(false); - ImGui::InputText("4 (tab skip)", buf, IM_ARRAYSIZE(buf)); - //ImGui::SameLine(); ShowHelperMarker("Use ImGui::PushAllowKeyboardFocus(bool)\nto disable tabbing through certain widgets."); - ImGui::PopAllowKeyboardFocus(); - ImGui::InputText("5", buf, IM_ARRAYSIZE(buf)); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Focus from code")) - { - bool focus_1 = ImGui::Button("Focus on 1"); ImGui::SameLine(); - bool focus_2 = ImGui::Button("Focus on 2"); ImGui::SameLine(); - bool focus_3 = ImGui::Button("Focus on 3"); - int has_focus = 0; - static char buf[128] = "click on a button to set focus"; - - if (focus_1) ImGui::SetKeyboardFocusHere(); - ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); - if (ImGui::IsItemActive()) has_focus = 1; - - if (focus_2) ImGui::SetKeyboardFocusHere(); - ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); - if (ImGui::IsItemActive()) has_focus = 2; - - ImGui::PushAllowKeyboardFocus(false); - if (focus_3) ImGui::SetKeyboardFocusHere(); - ImGui::InputText("3 (tab skip)", buf, IM_ARRAYSIZE(buf)); - if (ImGui::IsItemActive()) has_focus = 3; - ImGui::PopAllowKeyboardFocus(); - if (has_focus) - ImGui::Text("Item with focus: %d", has_focus); - else - ImGui::Text("Item with focus: "); - ImGui::TextWrapped("Cursor & selection are preserved when refocusing last used item in code."); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Focused & Hovered Test")) - { - static bool embed_all_inside_a_child_window = false; - ImGui::Checkbox("Embed everything inside a child window (for additional testing)", &embed_all_inside_a_child_window); - if (embed_all_inside_a_child_window) - ImGui::BeginChild("embeddingchild", ImVec2(0, ImGui::GetFontSize() * 25), true); - - // Testing IsWindowFocused() function with its various flags (note that the flags can be combined) - ImGui::BulletText( - "IsWindowFocused() = %d\n" - "IsWindowFocused(_ChildWindows) = %d\n" - "IsWindowFocused(_ChildWindows|_RootWindow) = %d\n" - "IsWindowFocused(_RootWindow) = %d\n", - ImGui::IsWindowFocused(), - ImGui::IsWindowFocused(ImGuiHoveredFlags_ChildWindows), - ImGui::IsWindowFocused(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow), - ImGui::IsWindowFocused(ImGuiHoveredFlags_RootWindow)); - - // Testing IsWindowHovered() function with its various flags (note that the flags can be combined) - ImGui::BulletText( - "IsWindowHovered() = %d\n" - "IsWindowHovered(_AllowWhenBlockedByPopup) = %d\n" - "IsWindowHovered(_AllowWhenBlockedByActiveItem) = %d\n" - "IsWindowHovered(_ChildWindows) = %d\n" - "IsWindowHovered(_ChildWindows|_RootWindow) = %d\n" - "IsWindowHovered(_RootWindow) = %d\n", - ImGui::IsWindowHovered(), - ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), - ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), - ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows), - ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow), - ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow)); - - // Testing IsItemHovered() function (because BulletText is an item itself and that would affect the output of IsItemHovered, we pass all lines in a single items to shorten the code) - ImGui::Button("ITEM"); - ImGui::BulletText( - "IsItemHovered() = %d\n" - "IsItemHovered(_AllowWhenBlockedByPopup) = %d\n" - "IsItemHovered(_AllowWhenBlockedByActiveItem) = %d\n" - "IsItemHovered(_AllowWhenOverlapped) = %d\n" - "IsItemhovered(_RectOnly) = %d\n", - ImGui::IsItemHovered(), - ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), - ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), - ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlapped), - ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly)); - - ImGui::BeginChild("child", ImVec2(0,50), true); - ImGui::Text("This is another child window for testing IsWindowHovered() flags."); - ImGui::EndChild(); - - if (embed_all_inside_a_child_window) - EndChild(); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Dragging")) - { - ImGui::TextWrapped("You can use ImGui::GetMouseDragDelta(0) to query for the dragged amount on any widget."); - for (int button = 0; button < 3; button++) - ImGui::Text("IsMouseDragging(%d):\n w/ default threshold: %d,\n w/ zero threshold: %d\n w/ large threshold: %d", - button, ImGui::IsMouseDragging(button), ImGui::IsMouseDragging(button, 0.0f), ImGui::IsMouseDragging(button, 20.0f)); - ImGui::Button("Drag Me"); - if (ImGui::IsItemActive()) - { - // Draw a line between the button and the mouse cursor - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - draw_list->PushClipRectFullScreen(); - draw_list->AddLine(ImGui::CalcItemRectClosestPoint(io.MousePos, true, -2.0f), io.MousePos, ImColor(ImGui::GetStyle().Colors[ImGuiCol_Button]), 4.0f); - draw_list->PopClipRect(); - - // Drag operations gets "unlocked" when the mouse has moved past a certain threshold (the default threshold is stored in io.MouseDragThreshold) - // You can request a lower or higher threshold using the second parameter of IsMouseDragging() and GetMouseDragDelta() - ImVec2 value_raw = ImGui::GetMouseDragDelta(0, 0.0f); - ImVec2 value_with_lock_threshold = ImGui::GetMouseDragDelta(0); - ImVec2 mouse_delta = io.MouseDelta; - ImGui::SameLine(); ImGui::Text("Raw (%.1f, %.1f), WithLockThresold (%.1f, %.1f), MouseDelta (%.1f, %.1f)", value_raw.x, value_raw.y, value_with_lock_threshold.x, value_with_lock_threshold.y, mouse_delta.x, mouse_delta.y); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Mouse cursors")) - { - const char* mouse_cursors_names[] = { "Arrow", "TextInput", "Move", "ResizeNS", "ResizeEW", "ResizeNESW", "ResizeNWSE" }; - IM_ASSERT(IM_ARRAYSIZE(mouse_cursors_names) == ImGuiMouseCursor_Count_); - - ImGui::Text("Current mouse cursor = %d: %s", ImGui::GetMouseCursor(), mouse_cursors_names[ImGui::GetMouseCursor()]); - ImGui::Text("Hover to see mouse cursors:"); - ImGui::SameLine(); ShowHelpMarker("Your application can render a different mouse cursor based on what ImGui::GetMouseCursor() returns. If software cursor rendering (io.MouseDrawCursor) is set ImGui will draw the right cursor for you, otherwise your backend needs to handle it."); - for (int i = 0; i < ImGuiMouseCursor_Count_; i++) - { - char label[32]; - sprintf(label, "Mouse cursor %d: %s", i, mouse_cursors_names[i]); - ImGui::Bullet(); ImGui::Selectable(label, false); - if (ImGui::IsItemHovered()) - ImGui::SetMouseCursor(i); - } - ImGui::TreePop(); - } - } - - ImGui::End(); -} - -// Demo helper function to select among default colors. See ShowStyleEditor() for more advanced options. -// Here we use the simplified Combo() api that packs items into a single literal string. Useful for quick combo boxes where the choices are known locally. -bool ImGui::ShowStyleSelector(const char* label) -{ - static int style_idx = 0; - if (ImGui::Combo(label, &style_idx, "Classic\0Dark\0Light\0")) - { - switch (style_idx) - { - case 0: ImGui::StyleColorsClassic(); break; - case 1: ImGui::StyleColorsDark(); break; - case 2: ImGui::StyleColorsLight(); break; - } - return true; - } - return false; -} - -// Demo helper function to select among loaded fonts. -// Here we use the regular BeginCombo()/EndCombo() api which is more the more flexible one. -void ImGui::ShowFontSelector(const char* label) -{ - ImGuiIO& io = ImGui::GetIO(); - ImFont* font_current = ImGui::GetFont(); - if (ImGui::BeginCombo(label, font_current->GetDebugName())) - { - for (int n = 0; n < io.Fonts->Fonts.Size; n++) - if (ImGui::Selectable(io.Fonts->Fonts[n]->GetDebugName(), io.Fonts->Fonts[n] == font_current)) - io.FontDefault = io.Fonts->Fonts[n]; - ImGui::EndCombo(); - } - ImGui::SameLine(); - ShowHelpMarker( - "- Load additional fonts with io.Fonts->AddFontFromFileTTF().\n" - "- The font atlas is built when calling io.Fonts->GetTexDataAsXXXX() or io.Fonts->Build().\n" - "- Read FAQ and documentation in extra_fonts/ for more details.\n" - "- If you need to add/remove fonts at runtime (e.g. for DPI change), do it before calling NewFrame()."); -} - -void ImGui::ShowStyleEditor(ImGuiStyle* ref) -{ - // You can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it compares to an internally stored reference) - ImGuiStyle& style = ImGui::GetStyle(); - static ImGuiStyle ref_saved_style; - - // Default to using internal storage as reference - static bool init = true; - if (init && ref == NULL) - ref_saved_style = style; - init = false; - if (ref == NULL) - ref = &ref_saved_style; - - ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.50f); - - if (ImGui::ShowStyleSelector("Colors##Selector")) - ref_saved_style = style; - ImGui::ShowFontSelector("Fonts##Selector"); - - // Simplified Settings - if (ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f")) - style.GrabRounding = style.FrameRounding; // Make GrabRounding always the same value as FrameRounding - { bool window_border = (style.WindowBorderSize > 0.0f); if (ImGui::Checkbox("WindowBorder", &window_border)) style.WindowBorderSize = window_border ? 1.0f : 0.0f; } - ImGui::SameLine(); - { bool frame_border = (style.FrameBorderSize > 0.0f); if (ImGui::Checkbox("FrameBorder", &frame_border)) style.FrameBorderSize = frame_border ? 1.0f : 0.0f; } - ImGui::SameLine(); - { bool popup_border = (style.PopupBorderSize > 0.0f); if (ImGui::Checkbox("PopupBorder", &popup_border)) style.PopupBorderSize = popup_border ? 1.0f : 0.0f; } - - // Save/Revert button - if (ImGui::Button("Save Ref")) - *ref = ref_saved_style = style; - ImGui::SameLine(); - if (ImGui::Button("Revert Ref")) - style = *ref; - ImGui::SameLine(); - ShowHelpMarker("Save/Revert in local non-persistent storage. Default Colors definition are not affected. Use \"Export Colors\" below to save them somewhere."); - - if (ImGui::TreeNode("Rendering")) - { - ImGui::Checkbox("Anti-aliased lines", &style.AntiAliasedLines); ImGui::SameLine(); ShowHelpMarker("When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well."); - ImGui::Checkbox("Anti-aliased fill", &style.AntiAliasedFill); - ImGui::PushItemWidth(100); - ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, FLT_MAX, NULL, 2.0f); - if (style.CurveTessellationTol < 0.0f) style.CurveTessellationTol = 0.10f; - ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero. - ImGui::PopItemWidth(); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Settings")) - { - ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat("PopupRounding", &style.PopupRounding, 0.0f, 16.0f, "%.0f"); - ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("TouchExtraPadding", (float*)&style.TouchExtraPadding, 0.0f, 10.0f, "%.0f"); - ImGui::SliderFloat("IndentSpacing", &style.IndentSpacing, 0.0f, 30.0f, "%.0f"); - ImGui::SliderFloat("ScrollbarSize", &style.ScrollbarSize, 1.0f, 20.0f, "%.0f"); - ImGui::SliderFloat("GrabMinSize", &style.GrabMinSize, 1.0f, 20.0f, "%.0f"); - ImGui::Text("BorderSize"); - ImGui::SliderFloat("WindowBorderSize", &style.WindowBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::SliderFloat("ChildBorderSize", &style.ChildBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::SliderFloat("PopupBorderSize", &style.PopupBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::SliderFloat("FrameBorderSize", &style.FrameBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::Text("Rounding"); - ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 14.0f, "%.0f"); - ImGui::SliderFloat("ChildRounding", &style.ChildRounding, 0.0f, 16.0f, "%.0f"); - ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f"); - ImGui::Text("Alignment"); - ImGui::SliderFloat2("WindowTitleAlign", (float*)&style.WindowTitleAlign, 0.0f, 1.0f, "%.2f"); - ImGui::SliderFloat2("ButtonTextAlign", (float*)&style.ButtonTextAlign, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); ShowHelpMarker("Alignment applies when a button is larger than its text content."); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Colors")) - { - static int output_dest = 0; - static bool output_only_modified = true; - if (ImGui::Button("Export Unsaved")) - { - if (output_dest == 0) - ImGui::LogToClipboard(); - else - ImGui::LogToTTY(); - ImGui::LogText("ImVec4* colors = ImGui::GetStyle().Colors;" IM_NEWLINE); - for (int i = 0; i < ImGuiCol_COUNT; i++) - { - const ImVec4& col = style.Colors[i]; - const char* name = ImGui::GetStyleColorName(i); - if (!output_only_modified || memcmp(&col, &ref->Colors[i], sizeof(ImVec4)) != 0) - ImGui::LogText("colors[ImGuiCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff);" IM_NEWLINE, name, 23-(int)strlen(name), "", col.x, col.y, col.z, col.w); - } - ImGui::LogFinish(); - } - ImGui::SameLine(); ImGui::PushItemWidth(120); ImGui::Combo("##output_type", &output_dest, "To Clipboard\0To TTY\0"); ImGui::PopItemWidth(); - ImGui::SameLine(); ImGui::Checkbox("Only Modified Colors", &output_only_modified); - - ImGui::Text("Tip: Left-click on colored square to open color picker,\nRight-click to open edit options menu."); - - static ImGuiTextFilter filter; - filter.Draw("Filter colors", 200); - - static ImGuiColorEditFlags alpha_flags = 0; - ImGui::RadioButton("Opaque", &alpha_flags, 0); ImGui::SameLine(); - ImGui::RadioButton("Alpha", &alpha_flags, ImGuiColorEditFlags_AlphaPreview); ImGui::SameLine(); - ImGui::RadioButton("Both", &alpha_flags, ImGuiColorEditFlags_AlphaPreviewHalf); - - ImGui::BeginChild("#colors", ImVec2(0, 300), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar); - ImGui::PushItemWidth(-160); - for (int i = 0; i < ImGuiCol_COUNT; i++) - { - const char* name = ImGui::GetStyleColorName(i); - if (!filter.PassFilter(name)) - continue; - ImGui::PushID(i); - ImGui::ColorEdit4("##color", (float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags); - if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0) - { - // Tips: in a real user application, you may want to merge and use an icon font into the main font, so instead of "Save"/"Revert" you'd use icons. - // Read the FAQ and extra_fonts/README.txt about using icon fonts. It's really easy and super convenient! - ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Save")) ref->Colors[i] = style.Colors[i]; - ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Revert")) style.Colors[i] = ref->Colors[i]; - } - ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); - ImGui::TextUnformatted(name); - ImGui::PopID(); - } - ImGui::PopItemWidth(); - ImGui::EndChild(); - - ImGui::TreePop(); - } - - bool fonts_opened = ImGui::TreeNode("Fonts", "Fonts (%d)", ImGui::GetIO().Fonts->Fonts.Size); - if (fonts_opened) - { - ImFontAtlas* atlas = ImGui::GetIO().Fonts; - if (ImGui::TreeNode("Atlas texture", "Atlas texture (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight)) - { - ImGui::Image(atlas->TexID, ImVec2((float)atlas->TexWidth, (float)atlas->TexHeight), ImVec2(0,0), ImVec2(1,1), ImColor(255,255,255,255), ImColor(255,255,255,128)); - ImGui::TreePop(); - } - ImGui::PushItemWidth(100); - for (int i = 0; i < atlas->Fonts.Size; i++) - { - ImFont* font = atlas->Fonts[i]; - ImGui::PushID(font); - bool font_details_opened = ImGui::TreeNode(font, "Font %d: \'%s\', %.2f px, %d glyphs", i, font->ConfigData ? font->ConfigData[0].Name : "", font->FontSize, font->Glyphs.Size); - ImGui::SameLine(); if (ImGui::SmallButton("Set as default")) ImGui::GetIO().FontDefault = font; - if (font_details_opened) - { - ImGui::PushFont(font); - ImGui::Text("The quick brown fox jumps over the lazy dog"); - ImGui::PopFont(); - ImGui::DragFloat("Font scale", &font->Scale, 0.005f, 0.3f, 2.0f, "%.1f"); // Scale only this font - ImGui::SameLine(); ShowHelpMarker("Note than the default embedded font is NOT meant to be scaled.\n\nFont are currently rendered into bitmaps at a given size at the time of building the atlas. You may oversample them to get some flexibility with scaling. You can also render at multiple sizes and select which one to use at runtime.\n\n(Glimmer of hope: the atlas system should hopefully be rewritten in the future to make scaling more natural and automatic.)"); - ImGui::Text("Ascent: %f, Descent: %f, Height: %f", font->Ascent, font->Descent, font->Ascent - font->Descent); - ImGui::Text("Fallback character: '%c' (%d)", font->FallbackChar, font->FallbackChar); - ImGui::Text("Texture surface: %d pixels (approx) ~ %dx%d", font->MetricsTotalSurface, (int)sqrtf((float)font->MetricsTotalSurface), (int)sqrtf((float)font->MetricsTotalSurface)); - for (int config_i = 0; config_i < font->ConfigDataCount; config_i++) - { - ImFontConfig* cfg = &font->ConfigData[config_i]; - ImGui::BulletText("Input %d: \'%s\', Oversample: (%d,%d), PixelSnapH: %d", config_i, cfg->Name, cfg->OversampleH, cfg->OversampleV, cfg->PixelSnapH); - } - if (ImGui::TreeNode("Glyphs", "Glyphs (%d)", font->Glyphs.Size)) - { - // Display all glyphs of the fonts in separate pages of 256 characters - const ImFontGlyph* glyph_fallback = font->FallbackGlyph; // Forcefully/dodgily make FindGlyph() return NULL on fallback, which isn't the default behavior. - font->FallbackGlyph = NULL; - for (int base = 0; base < 0x10000; base += 256) - { - int count = 0; - for (int n = 0; n < 256; n++) - count += font->FindGlyph((ImWchar)(base + n)) ? 1 : 0; - if (count > 0 && ImGui::TreeNode((void*)(intptr_t)base, "U+%04X..U+%04X (%d %s)", base, base+255, count, count > 1 ? "glyphs" : "glyph")) - { - float cell_spacing = style.ItemSpacing.y; - ImVec2 cell_size(font->FontSize * 1, font->FontSize * 1); - ImVec2 base_pos = ImGui::GetCursorScreenPos(); - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - for (int n = 0; n < 256; n++) - { - ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size.x + cell_spacing), base_pos.y + (n / 16) * (cell_size.y + cell_spacing)); - ImVec2 cell_p2(cell_p1.x + cell_size.x, cell_p1.y + cell_size.y); - const ImFontGlyph* glyph = font->FindGlyph((ImWchar)(base+n));; - draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255,255,255,100) : IM_COL32(255,255,255,50)); - font->RenderChar(draw_list, cell_size.x, cell_p1, ImGui::GetColorU32(ImGuiCol_Text), (ImWchar)(base+n)); // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions available to generate a string. - if (glyph && ImGui::IsMouseHoveringRect(cell_p1, cell_p2)) - { - ImGui::BeginTooltip(); - ImGui::Text("Codepoint: U+%04X", base+n); - ImGui::Separator(); - ImGui::Text("AdvanceX: %.1f", glyph->AdvanceX); - ImGui::Text("Pos: (%.2f,%.2f)->(%.2f,%.2f)", glyph->X0, glyph->Y0, glyph->X1, glyph->Y1); - ImGui::Text("UV: (%.3f,%.3f)->(%.3f,%.3f)", glyph->U0, glyph->V0, glyph->U1, glyph->V1); - ImGui::EndTooltip(); - } - } - ImGui::Dummy(ImVec2((cell_size.x + cell_spacing) * 16, (cell_size.y + cell_spacing) * 16)); - ImGui::TreePop(); - } - } - font->FallbackGlyph = glyph_fallback; - ImGui::TreePop(); - } - ImGui::TreePop(); - } - ImGui::PopID(); - } - static float window_scale = 1.0f; - ImGui::DragFloat("this window scale", &window_scale, 0.005f, 0.3f, 2.0f, "%.1f"); // scale only this window - ImGui::DragFloat("global scale", &ImGui::GetIO().FontGlobalScale, 0.005f, 0.3f, 2.0f, "%.1f"); // scale everything - ImGui::PopItemWidth(); - ImGui::SetWindowFontScale(window_scale); - ImGui::TreePop(); - } - - ImGui::PopItemWidth(); -} - -// Demonstrate creating a fullscreen menu bar and populating it. -static void ShowExampleAppMainMenuBar() -{ - if (ImGui::BeginMainMenuBar()) - { - if (ImGui::BeginMenu("File")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Edit")) - { - if (ImGui::MenuItem("Undo", "CTRL+Z")) {} - if (ImGui::MenuItem("Redo", "CTRL+Y", false, false)) {} // Disabled item - ImGui::Separator(); - if (ImGui::MenuItem("Cut", "CTRL+X")) {} - if (ImGui::MenuItem("Copy", "CTRL+C")) {} - if (ImGui::MenuItem("Paste", "CTRL+V")) {} - ImGui::EndMenu(); - } - ImGui::EndMainMenuBar(); - } -} - -static void ShowExampleMenuFile() -{ - ImGui::MenuItem("(dummy menu)", NULL, false, false); - if (ImGui::MenuItem("New")) {} - if (ImGui::MenuItem("Open", "Ctrl+O")) {} - if (ImGui::BeginMenu("Open Recent")) - { - ImGui::MenuItem("fish_hat.c"); - ImGui::MenuItem("fish_hat.inl"); - ImGui::MenuItem("fish_hat.h"); - if (ImGui::BeginMenu("More..")) - { - ImGui::MenuItem("Hello"); - ImGui::MenuItem("Sailor"); - if (ImGui::BeginMenu("Recurse..")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - ImGui::EndMenu(); - } - ImGui::EndMenu(); - } - if (ImGui::MenuItem("Save", "Ctrl+S")) {} - if (ImGui::MenuItem("Save As..")) {} - ImGui::Separator(); - if (ImGui::BeginMenu("Options")) - { - static bool enabled = true; - ImGui::MenuItem("Enabled", "", &enabled); - ImGui::BeginChild("child", ImVec2(0, 60), true); - for (int i = 0; i < 10; i++) - ImGui::Text("Scrolling Text %d", i); - ImGui::EndChild(); - static float f = 0.5f; - static int n = 0; - static bool b = true; - ImGui::SliderFloat("Value", &f, 0.0f, 1.0f); - ImGui::InputFloat("Input", &f, 0.1f); - ImGui::Combo("Combo", &n, "Yes\0No\0Maybe\0\0"); - ImGui::Checkbox("Check", &b); - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Colors")) - { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0)); - for (int i = 0; i < ImGuiCol_COUNT; i++) - { - const char* name = ImGui::GetStyleColorName((ImGuiCol)i); - ImGui::ColorButton(name, ImGui::GetStyleColorVec4((ImGuiCol)i)); - ImGui::SameLine(); - ImGui::MenuItem(name); - } - ImGui::PopStyleVar(); - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Disabled", false)) // Disabled - { - IM_ASSERT(0); - } - if (ImGui::MenuItem("Checked", NULL, true)) {} - if (ImGui::MenuItem("Quit", "Alt+F4")) {} -} - -// Demonstrate creating a window which gets auto-resized according to its content. -static void ShowExampleAppAutoResize(bool* p_open) -{ - if (!ImGui::Begin("Example: Auto-resizing window", p_open, ImGuiWindowFlags_AlwaysAutoResize)) - { - ImGui::End(); - return; - } - - static int lines = 10; - ImGui::Text("Window will resize every-frame to the size of its content.\nNote that you probably don't want to query the window size to\noutput your content because that would create a feedback loop."); - ImGui::SliderInt("Number of lines", &lines, 1, 20); - for (int i = 0; i < lines; i++) - ImGui::Text("%*sThis is line %d", i*4, "", i); // Pad with space to extend size horizontally - ImGui::End(); -} - -// Demonstrate creating a window with custom resize constraints. -static void ShowExampleAppConstrainedResize(bool* p_open) -{ - struct CustomConstraints // Helper functions to demonstrate programmatic constraints - { - static void Square(ImGuiSizeConstraintCallbackData* data) { data->DesiredSize = ImVec2(IM_MAX(data->DesiredSize.x, data->DesiredSize.y), IM_MAX(data->DesiredSize.x, data->DesiredSize.y)); } - static void Step(ImGuiSizeConstraintCallbackData* data) { float step = (float)(int)(intptr_t)data->UserData; data->DesiredSize = ImVec2((int)(data->DesiredSize.x / step + 0.5f) * step, (int)(data->DesiredSize.y / step + 0.5f) * step); } - }; - - static bool auto_resize = false; - static int type = 0; - static int display_lines = 10; - if (type == 0) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Vertical only - if (type == 1) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Horizontal only - if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX)); // Width > 100, Height > 100 - if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width 400-500 - if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 400), ImVec2(-1, 500)); // Height 400-500 - if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square - if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)100);// Fixed Step - - ImGuiWindowFlags flags = auto_resize ? ImGuiWindowFlags_AlwaysAutoResize : 0; - if (ImGui::Begin("Example: Constrained Resize", p_open, flags)) - { - const char* desc[] = - { - "Resize vertical only", - "Resize horizontal only", - "Width > 100, Height > 100", - "Width 400-500", - "Height 400-500", - "Custom: Always Square", - "Custom: Fixed Steps (100)", - }; - if (ImGui::Button("200x200")) { ImGui::SetWindowSize(ImVec2(200, 200)); } ImGui::SameLine(); - if (ImGui::Button("500x500")) { ImGui::SetWindowSize(ImVec2(500, 500)); } ImGui::SameLine(); - if (ImGui::Button("800x200")) { ImGui::SetWindowSize(ImVec2(800, 200)); } - ImGui::PushItemWidth(200); - ImGui::Combo("Constraint", &type, desc, IM_ARRAYSIZE(desc)); - ImGui::DragInt("Lines", &display_lines, 0.2f, 1, 100); - ImGui::PopItemWidth(); - ImGui::Checkbox("Auto-resize", &auto_resize); - for (int i = 0; i < display_lines; i++) - ImGui::Text("%*sHello, sailor! Making this line long enough for the example.", i * 4, ""); - } - ImGui::End(); -} - -// Demonstrate creating a simple static window with no decoration + a context-menu to choose which corner of the screen to use. -static void ShowExampleAppFixedOverlay(bool* p_open) -{ - const float DISTANCE = 10.0f; - static int corner = 0; - ImVec2 window_pos = ImVec2((corner & 1) ? ImGui::GetIO().DisplaySize.x - DISTANCE : DISTANCE, (corner & 2) ? ImGui::GetIO().DisplaySize.y - DISTANCE : DISTANCE); - ImVec2 window_pos_pivot = ImVec2((corner & 1) ? 1.0f : 0.0f, (corner & 2) ? 1.0f : 0.0f); - ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot); - ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.0f, 0.0f, 0.0f, 0.3f)); // Transparent background - if (ImGui::Begin("Example: Fixed Overlay", p_open, ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoSavedSettings)) - { - ImGui::Text("Simple overlay\nin the corner of the screen.\n(right-click to change position)"); - ImGui::Separator(); - ImGui::Text("Mouse Position: (%.1f,%.1f)", ImGui::GetIO().MousePos.x, ImGui::GetIO().MousePos.y); - if (ImGui::BeginPopupContextWindow()) - { - if (ImGui::MenuItem("Top-left", NULL, corner == 0)) corner = 0; - if (ImGui::MenuItem("Top-right", NULL, corner == 1)) corner = 1; - if (ImGui::MenuItem("Bottom-left", NULL, corner == 2)) corner = 2; - if (ImGui::MenuItem("Bottom-right", NULL, corner == 3)) corner = 3; - ImGui::EndPopup(); - } - ImGui::End(); - } - ImGui::PopStyleColor(); -} - -// Demonstrate using "##" and "###" in identifiers to manipulate ID generation. -// This apply to regular items as well. Read FAQ section "How can I have multiple widgets with the same label? Can I have widget without a label? (Yes). A primer on the purpose of labels/IDs." for details. -static void ShowExampleAppWindowTitles(bool*) -{ - // By default, Windows are uniquely identified by their title. - // You can use the "##" and "###" markers to manipulate the display/ID. - - // Using "##" to display same title but have unique identifier. - ImGui::SetNextWindowPos(ImVec2(100,100), ImGuiCond_FirstUseEver); - ImGui::Begin("Same title as another window##1"); - ImGui::Text("This is window 1.\nMy title is the same as window 2, but my identifier is unique."); - ImGui::End(); - - ImGui::SetNextWindowPos(ImVec2(100,200), ImGuiCond_FirstUseEver); - ImGui::Begin("Same title as another window##2"); - ImGui::Text("This is window 2.\nMy title is the same as window 1, but my identifier is unique."); - ImGui::End(); - - // Using "###" to display a changing title but keep a static identifier "AnimatedTitle" - char buf[128]; - sprintf(buf, "Animated title %c %d###AnimatedTitle", "|/-\\"[(int)(ImGui::GetTime()/0.25f)&3], ImGui::GetFrameCount()); - ImGui::SetNextWindowPos(ImVec2(100,300), ImGuiCond_FirstUseEver); - ImGui::Begin(buf); - ImGui::Text("This window has a changing title."); - ImGui::End(); -} - -// Demonstrate using the low-level ImDrawList to draw custom shapes. -static void ShowExampleAppCustomRendering(bool* p_open) -{ - ImGui::SetNextWindowSize(ImVec2(350,560), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Example: Custom rendering", p_open)) - { - ImGui::End(); - return; - } - - // Tip: If you do a lot of custom rendering, you probably want to use your own geometrical types and benefit of overloaded operators, etc. - // Define IM_VEC2_CLASS_EXTRA in imconfig.h to create implicit conversions between your types and ImVec2/ImVec4. - // ImGui defines overloaded operators but they are internal to imgui.cpp and not exposed outside (to avoid messing with your types) - // In this example we are not using the maths operators! - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - - // Primitives - ImGui::Text("Primitives"); - static float sz = 36.0f; - static ImVec4 col = ImVec4(1.0f,1.0f,0.4f,1.0f); - ImGui::DragFloat("Size", &sz, 0.2f, 2.0f, 72.0f, "%.0f"); - ImGui::ColorEdit3("Color", &col.x); - { - const ImVec2 p = ImGui::GetCursorScreenPos(); - const ImU32 col32 = ImColor(col); - float x = p.x + 4.0f, y = p.y + 4.0f, spacing = 8.0f; - for (int n = 0; n < 2; n++) - { - float thickness = (n == 0) ? 1.0f : 4.0f; - draw_list->AddCircle(ImVec2(x+sz*0.5f, y+sz*0.5f), sz*0.5f, col32, 20, thickness); x += sz+spacing; - draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 0.0f, ImDrawCornerFlags_All, thickness); x += sz+spacing; - draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f, ImDrawCornerFlags_All, thickness); x += sz+spacing; - draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f, ImDrawCornerFlags_TopLeft|ImDrawCornerFlags_BotRight, thickness); x += sz+spacing; - draw_list->AddTriangle(ImVec2(x+sz*0.5f, y), ImVec2(x+sz,y+sz-0.5f), ImVec2(x,y+sz-0.5f), col32, thickness); x += sz+spacing; - draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y ), col32, thickness); x += sz+spacing; - draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, thickness); x += sz+spacing; - draw_list->AddLine(ImVec2(x, y), ImVec2(x, y+sz), col32, thickness); x += spacing; - draw_list->AddBezierCurve(ImVec2(x, y), ImVec2(x+sz*1.3f,y+sz*0.3f), ImVec2(x+sz-sz*1.3f,y+sz-sz*0.3f), ImVec2(x+sz, y+sz), col32, thickness); - x = p.x + 4; - y += sz+spacing; - } - draw_list->AddCircleFilled(ImVec2(x+sz*0.5f, y+sz*0.5f), sz*0.5f, col32, 32); x += sz+spacing; - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32); x += sz+spacing; - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f); x += sz+spacing; - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f, ImDrawCornerFlags_TopLeft|ImDrawCornerFlags_BotRight); x += sz+spacing; - draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f, y), ImVec2(x+sz,y+sz-0.5f), ImVec2(x,y+sz-0.5f), col32); x += sz+spacing; - draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x+sz, y+sz), ImColor(0,0,0), ImColor(255,0,0), ImColor(255,255,0), ImColor(0,255,0)); - ImGui::Dummy(ImVec2((sz+spacing)*8, (sz+spacing)*3)); - } - ImGui::Separator(); - { - static ImVector points; - static bool adding_line = false; - ImGui::Text("Canvas example"); - if (ImGui::Button("Clear")) points.clear(); - if (points.Size >= 2) { ImGui::SameLine(); if (ImGui::Button("Undo")) { points.pop_back(); points.pop_back(); } } - ImGui::Text("Left-click and drag to add lines,\nRight-click to undo"); - - // Here we are using InvisibleButton() as a convenience to 1) advance the cursor and 2) allows us to use IsItemHovered() - // However you can draw directly and poll mouse/keyboard by yourself. You can manipulate the cursor using GetCursorPos() and SetCursorPos(). - // If you only use the ImDrawList API, you can notify the owner window of its extends by using SetCursorPos(max). - ImVec2 canvas_pos = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates! - ImVec2 canvas_size = ImGui::GetContentRegionAvail(); // Resize canvas to what's available - if (canvas_size.x < 50.0f) canvas_size.x = 50.0f; - if (canvas_size.y < 50.0f) canvas_size.y = 50.0f; - draw_list->AddRectFilledMultiColor(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(50,50,50), ImColor(50,50,60), ImColor(60,60,70), ImColor(50,50,60)); - draw_list->AddRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(255,255,255)); - - bool adding_preview = false; - ImGui::InvisibleButton("canvas", canvas_size); - ImVec2 mouse_pos_in_canvas = ImVec2(ImGui::GetIO().MousePos.x - canvas_pos.x, ImGui::GetIO().MousePos.y - canvas_pos.y); - if (adding_line) - { - adding_preview = true; - points.push_back(mouse_pos_in_canvas); - if (!ImGui::GetIO().MouseDown[0]) - adding_line = adding_preview = false; - } - if (ImGui::IsItemHovered()) - { - if (!adding_line && ImGui::IsMouseClicked(0)) - { - points.push_back(mouse_pos_in_canvas); - adding_line = true; - } - if (ImGui::IsMouseClicked(1) && !points.empty()) - { - adding_line = adding_preview = false; - points.pop_back(); - points.pop_back(); - } - } - draw_list->PushClipRect(canvas_pos, ImVec2(canvas_pos.x+canvas_size.x, canvas_pos.y+canvas_size.y), true); // clip lines within the canvas (if we resize it, etc.) - for (int i = 0; i < points.Size - 1; i += 2) - draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i+1].x, canvas_pos.y + points[i+1].y), IM_COL32(255,255,0,255), 2.0f); - draw_list->PopClipRect(); - if (adding_preview) - points.pop_back(); - } - ImGui::End(); -} - -// Demonstrating creating a simple console window, with scrolling, filtering, completion and history. -// For the console example, here we are using a more C++ like approach of declaring a class to hold the data and the functions. -struct ExampleAppConsole -{ - char InputBuf[256]; - ImVector Items; - bool ScrollToBottom; - ImVector History; - int HistoryPos; // -1: new line, 0..History.Size-1 browsing history. - ImVector Commands; - - ExampleAppConsole() - { - ClearLog(); - memset(InputBuf, 0, sizeof(InputBuf)); - HistoryPos = -1; - Commands.push_back("HELP"); - Commands.push_back("HISTORY"); - Commands.push_back("CLEAR"); - Commands.push_back("CLASSIFY"); // "classify" is here to provide an example of "C"+[tab] completing to "CL" and displaying matches. - AddLog("Welcome to ImGui!"); - } - ~ExampleAppConsole() - { - ClearLog(); - for (int i = 0; i < History.Size; i++) - free(History[i]); - } - - // Portable helpers - static int Stricmp(const char* str1, const char* str2) { int d; while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; } return d; } - static int Strnicmp(const char* str1, const char* str2, int n) { int d = 0; while (n > 0 && (d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; n--; } return d; } - static char* Strdup(const char *str) { size_t len = strlen(str) + 1; void* buff = malloc(len); return (char*)memcpy(buff, (const void*)str, len); } - - void ClearLog() - { - for (int i = 0; i < Items.Size; i++) - free(Items[i]); - Items.clear(); - ScrollToBottom = true; - } - - void AddLog(const char* fmt, ...) IM_FMTARGS(2) - { - // FIXME-OPT - char buf[1024]; - va_list args; - va_start(args, fmt); - vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); - buf[IM_ARRAYSIZE(buf)-1] = 0; - va_end(args); - Items.push_back(Strdup(buf)); - ScrollToBottom = true; - } - - void Draw(const char* title, bool* p_open) - { - ImGui::SetNextWindowSize(ImVec2(520,600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin(title, p_open)) - { - ImGui::End(); - return; - } - - // As a specific feature guaranteed by the library, after calling Begin() the last Item represent the title bar. So e.g. IsItemHovered() will return true when hovering the title bar. - // Here we create a context menu only available from the title bar. - if (ImGui::BeginPopupContextItem()) - { - if (ImGui::MenuItem("Close")) - *p_open = false; - ImGui::EndPopup(); - } - - ImGui::TextWrapped("This example implements a console with basic coloring, completion and history. A more elaborate implementation may want to store entries along with extra data such as timestamp, emitter, etc."); - ImGui::TextWrapped("Enter 'HELP' for help, press TAB to use text completion."); - - // TODO: display items starting from the bottom - - if (ImGui::SmallButton("Add Dummy Text")) { AddLog("%d some text", Items.Size); AddLog("some more text"); AddLog("display very important message here!"); } ImGui::SameLine(); - if (ImGui::SmallButton("Add Dummy Error")) { AddLog("[error] something went wrong"); } ImGui::SameLine(); - if (ImGui::SmallButton("Clear")) { ClearLog(); } ImGui::SameLine(); - bool copy_to_clipboard = ImGui::SmallButton("Copy"); ImGui::SameLine(); - if (ImGui::SmallButton("Scroll to bottom")) ScrollToBottom = true; - //static float t = 0.0f; if (ImGui::GetTime() - t > 0.02f) { t = ImGui::GetTime(); AddLog("Spam %f", t); } - - ImGui::Separator(); - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0)); - static ImGuiTextFilter filter; - filter.Draw("Filter (\"incl,-excl\") (\"error\")", 180); - ImGui::PopStyleVar(); - ImGui::Separator(); - - const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing(); // 1 separator, 1 input text - ImGui::BeginChild("ScrollingRegion", ImVec2(0, -footer_height_to_reserve), false, ImGuiWindowFlags_HorizontalScrollbar); // Leave room for 1 separator + 1 InputText - if (ImGui::BeginPopupContextWindow()) - { - if (ImGui::Selectable("Clear")) ClearLog(); - ImGui::EndPopup(); - } - - // Display every line as a separate entry so we can change their color or add custom widgets. If you only want raw text you can use ImGui::TextUnformatted(log.begin(), log.end()); - // NB- if you have thousands of entries this approach may be too inefficient and may require user-side clipping to only process visible items. - // You can seek and display only the lines that are visible using the ImGuiListClipper helper, if your elements are evenly spaced and you have cheap random access to the elements. - // To use the clipper we could replace the 'for (int i = 0; i < Items.Size; i++)' loop with: - // ImGuiListClipper clipper(Items.Size); - // while (clipper.Step()) - // for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) - // However take note that you can not use this code as is if a filter is active because it breaks the 'cheap random-access' property. We would need random-access on the post-filtered list. - // A typical application wanting coarse clipping and filtering may want to pre-compute an array of indices that passed the filtering test, recomputing this array when user changes the filter, - // and appending newly elements as they are inserted. This is left as a task to the user until we can manage to improve this example code! - // If your items are of variable size you may want to implement code similar to what ImGuiListClipper does. Or split your data into fixed height items to allow random-seeking into your list. - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4,1)); // Tighten spacing - if (copy_to_clipboard) - ImGui::LogToClipboard(); - ImVec4 col_default_text = ImGui::GetStyleColorVec4(ImGuiCol_Text); - for (int i = 0; i < Items.Size; i++) - { - const char* item = Items[i]; - if (!filter.PassFilter(item)) - continue; - ImVec4 col = col_default_text; - if (strstr(item, "[error]")) col = ImColor(1.0f,0.4f,0.4f,1.0f); - else if (strncmp(item, "# ", 2) == 0) col = ImColor(1.0f,0.78f,0.58f,1.0f); - ImGui::PushStyleColor(ImGuiCol_Text, col); - ImGui::TextUnformatted(item); - ImGui::PopStyleColor(); - } - if (copy_to_clipboard) - ImGui::LogFinish(); - if (ScrollToBottom) - ImGui::SetScrollHere(); - ScrollToBottom = false; - ImGui::PopStyleVar(); - ImGui::EndChild(); - ImGui::Separator(); - - // Command-line - if (ImGui::InputText("Input", InputBuf, IM_ARRAYSIZE(InputBuf), ImGuiInputTextFlags_EnterReturnsTrue|ImGuiInputTextFlags_CallbackCompletion|ImGuiInputTextFlags_CallbackHistory, &TextEditCallbackStub, (void*)this)) - { - char* input_end = InputBuf+strlen(InputBuf); - while (input_end > InputBuf && input_end[-1] == ' ') { input_end--; } *input_end = 0; - if (InputBuf[0]) - ExecCommand(InputBuf); - strcpy(InputBuf, ""); - } - - // Demonstrate keeping auto focus on the input box - if (ImGui::IsItemHovered() || (ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) && !ImGui::IsAnyItemActive() && !ImGui::IsMouseClicked(0))) - ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget - - ImGui::End(); - } - - void ExecCommand(const char* command_line) - { - AddLog("# %s\n", command_line); - - // Insert into history. First find match and delete it so it can be pushed to the back. This isn't trying to be smart or optimal. - HistoryPos = -1; - for (int i = History.Size-1; i >= 0; i--) - if (Stricmp(History[i], command_line) == 0) - { - free(History[i]); - History.erase(History.begin() + i); - break; - } - History.push_back(Strdup(command_line)); - - // Process command - if (Stricmp(command_line, "CLEAR") == 0) - { - ClearLog(); - } - else if (Stricmp(command_line, "HELP") == 0) - { - AddLog("Commands:"); - for (int i = 0; i < Commands.Size; i++) - AddLog("- %s", Commands[i]); - } - else if (Stricmp(command_line, "HISTORY") == 0) - { - int first = History.Size - 10; - for (int i = first > 0 ? first : 0; i < History.Size; i++) - AddLog("%3d: %s\n", i, History[i]); - } - else - { - AddLog("Unknown command: '%s'\n", command_line); - } - } - - static int TextEditCallbackStub(ImGuiTextEditCallbackData* data) // In C++11 you are better off using lambdas for this sort of forwarding callbacks - { - ExampleAppConsole* console = (ExampleAppConsole*)data->UserData; - return console->TextEditCallback(data); - } - - int TextEditCallback(ImGuiTextEditCallbackData* data) - { - //AddLog("cursor: %d, selection: %d-%d", data->CursorPos, data->SelectionStart, data->SelectionEnd); - switch (data->EventFlag) - { - case ImGuiInputTextFlags_CallbackCompletion: - { - // Example of TEXT COMPLETION - - // Locate beginning of current word - const char* word_end = data->Buf + data->CursorPos; - const char* word_start = word_end; - while (word_start > data->Buf) - { - const char c = word_start[-1]; - if (c == ' ' || c == '\t' || c == ',' || c == ';') - break; - word_start--; - } - - // Build a list of candidates - ImVector candidates; - for (int i = 0; i < Commands.Size; i++) - if (Strnicmp(Commands[i], word_start, (int)(word_end-word_start)) == 0) - candidates.push_back(Commands[i]); - - if (candidates.Size == 0) - { - // No match - AddLog("No match for \"%.*s\"!\n", (int)(word_end-word_start), word_start); - } - else if (candidates.Size == 1) - { - // Single match. Delete the beginning of the word and replace it entirely so we've got nice casing - data->DeleteChars((int)(word_start-data->Buf), (int)(word_end-word_start)); - data->InsertChars(data->CursorPos, candidates[0]); - data->InsertChars(data->CursorPos, " "); - } - else - { - // Multiple matches. Complete as much as we can, so inputing "C" will complete to "CL" and display "CLEAR" and "CLASSIFY" - int match_len = (int)(word_end - word_start); - for (;;) - { - int c = 0; - bool all_candidates_matches = true; - for (int i = 0; i < candidates.Size && all_candidates_matches; i++) - if (i == 0) - c = toupper(candidates[i][match_len]); - else if (c == 0 || c != toupper(candidates[i][match_len])) - all_candidates_matches = false; - if (!all_candidates_matches) - break; - match_len++; - } - - if (match_len > 0) - { - data->DeleteChars((int)(word_start - data->Buf), (int)(word_end-word_start)); - data->InsertChars(data->CursorPos, candidates[0], candidates[0] + match_len); - } - - // List matches - AddLog("Possible matches:\n"); - for (int i = 0; i < candidates.Size; i++) - AddLog("- %s\n", candidates[i]); - } - - break; - } - case ImGuiInputTextFlags_CallbackHistory: - { - // Example of HISTORY - const int prev_history_pos = HistoryPos; - if (data->EventKey == ImGuiKey_UpArrow) - { - if (HistoryPos == -1) - HistoryPos = History.Size - 1; - else if (HistoryPos > 0) - HistoryPos--; - } - else if (data->EventKey == ImGuiKey_DownArrow) - { - if (HistoryPos != -1) - if (++HistoryPos >= History.Size) - HistoryPos = -1; - } - - // A better implementation would preserve the data on the current input line along with cursor position. - if (prev_history_pos != HistoryPos) - { - data->CursorPos = data->SelectionStart = data->SelectionEnd = data->BufTextLen = (int)snprintf(data->Buf, (size_t)data->BufSize, "%s", (HistoryPos >= 0) ? History[HistoryPos] : ""); - data->BufDirty = true; - } - } - } - return 0; - } -}; - -static void ShowExampleAppConsole(bool* p_open) -{ - static ExampleAppConsole console; - console.Draw("Example: Console", p_open); -} - -// Usage: -// static ExampleAppLog my_log; -// my_log.AddLog("Hello %d world\n", 123); -// my_log.Draw("title"); -struct ExampleAppLog -{ - ImGuiTextBuffer Buf; - ImGuiTextFilter Filter; - ImVector LineOffsets; // Index to lines offset - bool ScrollToBottom; - - void Clear() { Buf.clear(); LineOffsets.clear(); } - - void AddLog(const char* fmt, ...) IM_FMTARGS(2) - { - int old_size = Buf.size(); - va_list args; - va_start(args, fmt); - Buf.appendfv(fmt, args); - va_end(args); - for (int new_size = Buf.size(); old_size < new_size; old_size++) - if (Buf[old_size] == '\n') - LineOffsets.push_back(old_size); - ScrollToBottom = true; - } - - void Draw(const char* title, bool* p_open = NULL) - { - ImGui::SetNextWindowSize(ImVec2(500,400), ImGuiCond_FirstUseEver); - ImGui::Begin(title, p_open); - if (ImGui::Button("Clear")) Clear(); - ImGui::SameLine(); - bool copy = ImGui::Button("Copy"); - ImGui::SameLine(); - Filter.Draw("Filter", -100.0f); - ImGui::Separator(); - ImGui::BeginChild("scrolling", ImVec2(0,0), false, ImGuiWindowFlags_HorizontalScrollbar); - if (copy) ImGui::LogToClipboard(); - - if (Filter.IsActive()) - { - const char* buf_begin = Buf.begin(); - const char* line = buf_begin; - for (int line_no = 0; line != NULL; line_no++) - { - const char* line_end = (line_no < LineOffsets.Size) ? buf_begin + LineOffsets[line_no] : NULL; - if (Filter.PassFilter(line, line_end)) - ImGui::TextUnformatted(line, line_end); - line = line_end && line_end[1] ? line_end + 1 : NULL; - } - } - else - { - ImGui::TextUnformatted(Buf.begin()); - } - - if (ScrollToBottom) - ImGui::SetScrollHere(1.0f); - ScrollToBottom = false; - ImGui::EndChild(); - ImGui::End(); - } -}; - -// Demonstrate creating a simple log window with basic filtering. -static void ShowExampleAppLog(bool* p_open) -{ - static ExampleAppLog log; - - // Demo: add random items (unless Ctrl is held) - static float last_time = -1.0f; - float time = ImGui::GetTime(); - if (time - last_time >= 0.20f && !ImGui::GetIO().KeyCtrl) - { - const char* random_words[] = { "system", "info", "warning", "error", "fatal", "notice", "log" }; - log.AddLog("[%s] Hello, time is %.1f, frame count is %d\n", random_words[rand() % IM_ARRAYSIZE(random_words)], time, ImGui::GetFrameCount()); - last_time = time; - } - - log.Draw("Example: Log", p_open); -} - -// Demonstrate create a window with multiple child windows. -static void ShowExampleAppLayout(bool* p_open) -{ - ImGui::SetNextWindowSize(ImVec2(500, 440), ImGuiCond_FirstUseEver); - if (ImGui::Begin("Example: Layout", p_open, ImGuiWindowFlags_MenuBar)) - { - if (ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("File")) - { - if (ImGui::MenuItem("Close")) *p_open = false; - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - - // left - static int selected = 0; - ImGui::BeginChild("left pane", ImVec2(150, 0), true); - for (int i = 0; i < 100; i++) - { - char label[128]; - sprintf(label, "MyObject %d", i); - if (ImGui::Selectable(label, selected == i)) - selected = i; - } - ImGui::EndChild(); - ImGui::SameLine(); - - // right - ImGui::BeginGroup(); - ImGui::BeginChild("item view", ImVec2(0, -ImGui::GetFrameHeightWithSpacing())); // Leave room for 1 line below us - ImGui::Text("MyObject: %d", selected); - ImGui::Separator(); - ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "); - ImGui::EndChild(); - if (ImGui::Button("Revert")) {} - ImGui::SameLine(); - if (ImGui::Button("Save")) {} - ImGui::EndGroup(); - } - ImGui::End(); -} - -// Demonstrate create a simple property editor. -static void ShowExampleAppPropertyEditor(bool* p_open) -{ - ImGui::SetNextWindowSize(ImVec2(430,450), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Example: Property editor", p_open)) - { - ImGui::End(); - return; - } - - ShowHelpMarker("This example shows how you may implement a property editor using two columns.\nAll objects/fields data are dummies here.\nRemember that in many simple cases, you can use ImGui::SameLine(xxx) to position\nyour cursor horizontally instead of using the Columns() API."); - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2,2)); - ImGui::Columns(2); - ImGui::Separator(); - - struct funcs - { - static void ShowDummyObject(const char* prefix, int uid) - { - ImGui::PushID(uid); // Use object uid as identifier. Most commonly you could also use the object pointer as a base ID. - ImGui::AlignTextToFramePadding(); // Text and Tree nodes are less high than regular widgets, here we add vertical spacing to make the tree lines equal high. - bool node_open = ImGui::TreeNode("Object", "%s_%u", prefix, uid); - ImGui::NextColumn(); - ImGui::AlignTextToFramePadding(); - ImGui::Text("my sailor is rich"); - ImGui::NextColumn(); - if (node_open) - { - static float dummy_members[8] = { 0.0f,0.0f,1.0f,3.1416f,100.0f,999.0f }; - for (int i = 0; i < 8; i++) - { - ImGui::PushID(i); // Use field index as identifier. - if (i < 2) - { - ShowDummyObject("Child", 424242); - } - else - { - ImGui::AlignTextToFramePadding(); - // Here we use a Selectable (instead of Text) to highlight on hover - //ImGui::Text("Field_%d", i); - char label[32]; - sprintf(label, "Field_%d", i); - ImGui::Bullet(); - ImGui::Selectable(label); - ImGui::NextColumn(); - ImGui::PushItemWidth(-1); - if (i >= 5) - ImGui::InputFloat("##value", &dummy_members[i], 1.0f); - else - ImGui::DragFloat("##value", &dummy_members[i], 0.01f); - ImGui::PopItemWidth(); - ImGui::NextColumn(); - } - ImGui::PopID(); - } - ImGui::TreePop(); - } - ImGui::PopID(); - } - }; - - // Iterate dummy objects with dummy members (all the same data) - for (int obj_i = 0; obj_i < 3; obj_i++) - funcs::ShowDummyObject("Object", obj_i); - - ImGui::Columns(1); - ImGui::Separator(); - ImGui::PopStyleVar(); - ImGui::End(); -} - -// Demonstrate/test rendering huge amount of text, and the incidence of clipping. -static void ShowExampleAppLongText(bool* p_open) -{ - ImGui::SetNextWindowSize(ImVec2(520,600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Example: Long text display", p_open)) - { - ImGui::End(); - return; - } - - static int test_type = 0; - static ImGuiTextBuffer log; - static int lines = 0; - ImGui::Text("Printing unusually long amount of text."); - ImGui::Combo("Test type", &test_type, "Single call to TextUnformatted()\0Multiple calls to Text(), clipped manually\0Multiple calls to Text(), not clipped (slow)\0"); - ImGui::Text("Buffer contents: %d lines, %d bytes", lines, log.size()); - if (ImGui::Button("Clear")) { log.clear(); lines = 0; } - ImGui::SameLine(); - if (ImGui::Button("Add 1000 lines")) - { - for (int i = 0; i < 1000; i++) - log.appendf("%i The quick brown fox jumps over the lazy dog\n", lines+i); - lines += 1000; - } - ImGui::BeginChild("Log"); - switch (test_type) - { - case 0: - // Single call to TextUnformatted() with a big buffer - ImGui::TextUnformatted(log.begin(), log.end()); - break; - case 1: - { - // Multiple calls to Text(), manually coarsely clipped - demonstrate how to use the ImGuiListClipper helper. - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0,0)); - ImGuiListClipper clipper(lines); - while (clipper.Step()) - for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) - ImGui::Text("%i The quick brown fox jumps over the lazy dog", i); - ImGui::PopStyleVar(); - break; - } - case 2: - // Multiple calls to Text(), not clipped (slow) - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0,0)); - for (int i = 0; i < lines; i++) - ImGui::Text("%i The quick brown fox jumps over the lazy dog", i); - ImGui::PopStyleVar(); - break; - } - ImGui::EndChild(); - ImGui::End(); -} - -// End of Demo code -#else - -void ImGui::ShowDemoWindow(bool*) {} -void ImGui::ShowUserGuide() {} -void ImGui::ShowStyleEditor(ImGuiStyle*) {} - -#endif diff --git a/vendor/librw/skeleton/imgui/imgui_draw.cpp b/vendor/librw/skeleton/imgui/imgui_draw.cpp deleted file mode 100644 index b56d90c..0000000 --- a/vendor/librw/skeleton/imgui/imgui_draw.cpp +++ /dev/null @@ -1,2906 +0,0 @@ -// dear imgui, v1.54 WIP -// (drawing and font code) - -// Contains implementation for -// - Default styles -// - ImDrawList -// - ImDrawData -// - ImFontAtlas -// - ImFont -// - Default font data - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "imgui.h" -#define IMGUI_DEFINE_MATH_OPERATORS -#include "imgui_internal.h" - -#include // vsnprintf, sscanf, printf -#if !defined(alloca) -#ifdef _WIN32 -#include // alloca -#if !defined(alloca) -#define alloca _alloca // for clang with MS Codegen -#endif -#elif defined(__GLIBC__) || defined(__sun) -#include // alloca -#else -#include // alloca -#endif -#endif - -#ifdef _MSC_VER -#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff) -#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen -#define snprintf _snprintf -#endif - -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse. -#pragma clang diagnostic ignored "-Wfloat-equal" // warning : comparing floating point with == or != is unsafe // storing and comparing against same constants ok. -#pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference it. -#pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness // -#pragma clang diagnostic ignored "-Wcomma" // warning : possible misuse of comma operator here // -#if __has_warning("-Wreserved-id-macro") -#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning : macro name is a reserved identifier // -#endif -#if __has_warning("-Wdouble-promotion") -#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function -#endif -#elif defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used -#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function -#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value -#pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'xxxx' to type 'xxxx' casts away qualifiers -#endif - -//------------------------------------------------------------------------- -// STB libraries implementation -//------------------------------------------------------------------------- - -//#define IMGUI_STB_NAMESPACE ImGuiStb -//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION -//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION - -#ifdef IMGUI_STB_NAMESPACE -namespace IMGUI_STB_NAMESPACE -{ -#endif - -#ifdef _MSC_VER -#pragma warning (push) -#pragma warning (disable: 4456) // declaration of 'xx' hides previous local declaration -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunused-function" -#pragma clang diagnostic ignored "-Wmissing-prototypes" -#pragma clang diagnostic ignored "-Wimplicit-fallthrough" -#endif - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wtype-limits" // warning: comparison is always true due to limited range of data type [-Wtype-limits] -#endif - -#define STBRP_ASSERT(x) IM_ASSERT(x) -#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION -#define STBRP_STATIC -#define STB_RECT_PACK_IMPLEMENTATION -#endif -#include "stb_rect_pack.h" - -#define STBTT_malloc(x,u) ((void)(u), ImGui::MemAlloc(x)) -#define STBTT_free(x,u) ((void)(u), ImGui::MemFree(x)) -#define STBTT_assert(x) IM_ASSERT(x) -#ifndef IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION -#define STBTT_STATIC -#define STB_TRUETYPE_IMPLEMENTATION -#else -#define STBTT_DEF extern -#endif -#include "stb_truetype.h" - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#ifdef _MSC_VER -#pragma warning (pop) -#endif - -#ifdef IMGUI_STB_NAMESPACE -} // namespace ImGuiStb -using namespace IMGUI_STB_NAMESPACE; -#endif - -//----------------------------------------------------------------------------- -// Style functions -//----------------------------------------------------------------------------- - -void ImGui::StyleColorsClassic(ImGuiStyle* dst) -{ - ImGuiStyle* style = dst ? dst : &ImGui::GetStyle(); - ImVec4* colors = style->Colors; - - colors[ImGuiCol_Text] = ImVec4(0.90f, 0.90f, 0.90f, 1.00f); - colors[ImGuiCol_TextDisabled] = ImVec4(0.60f, 0.60f, 0.60f, 1.00f); - colors[ImGuiCol_WindowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.70f); - colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_PopupBg] = ImVec4(0.11f, 0.11f, 0.14f, 0.92f); - colors[ImGuiCol_Border] = ImVec4(0.50f, 0.50f, 0.50f, 0.50f); - colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_FrameBg] = ImVec4(0.43f, 0.43f, 0.43f, 0.39f); - colors[ImGuiCol_FrameBgHovered] = ImVec4(0.47f, 0.47f, 0.69f, 0.40f); - colors[ImGuiCol_FrameBgActive] = ImVec4(0.42f, 0.41f, 0.64f, 0.69f); - colors[ImGuiCol_TitleBg] = ImVec4(0.27f, 0.27f, 0.54f, 0.83f); - colors[ImGuiCol_TitleBgActive] = ImVec4(0.32f, 0.32f, 0.63f, 0.87f); - colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.40f, 0.40f, 0.80f, 0.20f); - colors[ImGuiCol_MenuBarBg] = ImVec4(0.40f, 0.40f, 0.55f, 0.80f); - colors[ImGuiCol_ScrollbarBg] = ImVec4(0.20f, 0.25f, 0.30f, 0.60f); - colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.40f, 0.40f, 0.80f, 0.30f); - colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.40f, 0.40f, 0.80f, 0.40f); - colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.41f, 0.39f, 0.80f, 0.60f); - colors[ImGuiCol_CheckMark] = ImVec4(0.90f, 0.90f, 0.90f, 0.50f); - colors[ImGuiCol_SliderGrab] = ImVec4(1.00f, 1.00f, 1.00f, 0.30f); - colors[ImGuiCol_SliderGrabActive] = ImVec4(0.41f, 0.39f, 0.80f, 0.60f); - colors[ImGuiCol_Button] = ImVec4(0.35f, 0.40f, 0.61f, 0.62f); - colors[ImGuiCol_ButtonHovered] = ImVec4(0.40f, 0.48f, 0.71f, 0.79f); - colors[ImGuiCol_ButtonActive] = ImVec4(0.46f, 0.54f, 0.80f, 1.00f); - colors[ImGuiCol_Header] = ImVec4(0.40f, 0.40f, 0.90f, 0.45f); - colors[ImGuiCol_HeaderHovered] = ImVec4(0.45f, 0.45f, 0.90f, 0.80f); - colors[ImGuiCol_HeaderActive] = ImVec4(0.53f, 0.53f, 0.87f, 0.80f); - colors[ImGuiCol_Separator] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); - colors[ImGuiCol_SeparatorHovered] = ImVec4(0.60f, 0.60f, 0.70f, 1.00f); - colors[ImGuiCol_SeparatorActive] = ImVec4(0.70f, 0.70f, 0.90f, 1.00f); - colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.16f); - colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.78f, 0.82f, 1.00f, 0.60f); - colors[ImGuiCol_ResizeGripActive] = ImVec4(0.78f, 0.82f, 1.00f, 0.90f); - colors[ImGuiCol_CloseButton] = ImVec4(0.50f, 0.50f, 0.90f, 0.50f); - colors[ImGuiCol_CloseButtonHovered] = ImVec4(0.70f, 0.70f, 0.90f, 0.60f); - colors[ImGuiCol_CloseButtonActive] = ImVec4(0.70f, 0.70f, 0.70f, 1.00f); - colors[ImGuiCol_PlotLines] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); - colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); - colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); - colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); - colors[ImGuiCol_TextSelectedBg] = ImVec4(0.00f, 0.00f, 1.00f, 0.35f); - colors[ImGuiCol_ModalWindowDarkening] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f); - colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); -} - -void ImGui::StyleColorsDark(ImGuiStyle* dst) -{ - ImGuiStyle* style = dst ? dst : &ImGui::GetStyle(); - ImVec4* colors = style->Colors; - - colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); - colors[ImGuiCol_TextDisabled] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); - colors[ImGuiCol_WindowBg] = ImVec4(0.06f, 0.06f, 0.06f, 0.94f); - colors[ImGuiCol_ChildBg] = ImVec4(1.00f, 1.00f, 1.00f, 0.00f); - colors[ImGuiCol_PopupBg] = ImVec4(0.08f, 0.08f, 0.08f, 0.94f); - colors[ImGuiCol_Border] = ImVec4(0.43f, 0.43f, 0.50f, 0.50f); - colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_FrameBg] = ImVec4(0.16f, 0.29f, 0.48f, 0.54f); - colors[ImGuiCol_FrameBgHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); - colors[ImGuiCol_FrameBgActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); - colors[ImGuiCol_TitleBg] = ImVec4(0.04f, 0.04f, 0.04f, 1.00f); - colors[ImGuiCol_TitleBgActive] = ImVec4(0.16f, 0.29f, 0.48f, 1.00f); - colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 0.51f); - colors[ImGuiCol_MenuBarBg] = ImVec4(0.14f, 0.14f, 0.14f, 1.00f); - colors[ImGuiCol_ScrollbarBg] = ImVec4(0.02f, 0.02f, 0.02f, 0.53f); - colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.31f, 0.31f, 0.31f, 1.00f); - colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f); - colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.51f, 0.51f, 0.51f, 1.00f); - colors[ImGuiCol_CheckMark] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_SliderGrab] = ImVec4(0.24f, 0.52f, 0.88f, 1.00f); - colors[ImGuiCol_SliderGrabActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_Button] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); - colors[ImGuiCol_ButtonHovered] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_ButtonActive] = ImVec4(0.06f, 0.53f, 0.98f, 1.00f); - colors[ImGuiCol_Header] = ImVec4(0.26f, 0.59f, 0.98f, 0.31f); - colors[ImGuiCol_HeaderHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.80f); - colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_Separator] = colors[ImGuiCol_Border];//ImVec4(0.61f, 0.61f, 0.61f, 1.00f); - colors[ImGuiCol_SeparatorHovered] = ImVec4(0.10f, 0.40f, 0.75f, 0.78f); - colors[ImGuiCol_SeparatorActive] = ImVec4(0.10f, 0.40f, 0.75f, 1.00f); - colors[ImGuiCol_ResizeGrip] = ImVec4(0.26f, 0.59f, 0.98f, 0.25f); - colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); - colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); - colors[ImGuiCol_CloseButton] = ImVec4(0.41f, 0.41f, 0.41f, 0.50f); - colors[ImGuiCol_CloseButtonHovered] = ImVec4(0.98f, 0.39f, 0.36f, 1.00f); - colors[ImGuiCol_CloseButtonActive] = ImVec4(0.98f, 0.39f, 0.36f, 1.00f); - colors[ImGuiCol_PlotLines] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f); - colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); - colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); - colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); - colors[ImGuiCol_TextSelectedBg] = ImVec4(0.26f, 0.59f, 0.98f, 0.35f); - colors[ImGuiCol_ModalWindowDarkening] = ImVec4(0.80f, 0.80f, 0.80f, 0.35f); - colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); -} - -// Those light colors are better suited with a thicker font than the default one + FrameBorder -void ImGui::StyleColorsLight(ImGuiStyle* dst) -{ - ImGuiStyle* style = dst ? dst : &ImGui::GetStyle(); - ImVec4* colors = style->Colors; - - colors[ImGuiCol_Text] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); - colors[ImGuiCol_TextDisabled] = ImVec4(0.60f, 0.60f, 0.60f, 1.00f); - //colors[ImGuiCol_TextHovered] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); - //colors[ImGuiCol_TextActive] = ImVec4(1.00f, 1.00f, 0.00f, 1.00f); - colors[ImGuiCol_WindowBg] = ImVec4(0.94f, 0.94f, 0.94f, 1.00f); - colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_PopupBg] = ImVec4(1.00f, 1.00f, 1.00f, 0.98f); - colors[ImGuiCol_Border] = ImVec4(0.00f, 0.00f, 0.00f, 0.30f); - colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_FrameBg] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); - colors[ImGuiCol_FrameBgHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); - colors[ImGuiCol_FrameBgActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); - colors[ImGuiCol_TitleBg] = ImVec4(0.96f, 0.96f, 0.96f, 1.00f); - colors[ImGuiCol_TitleBgActive] = ImVec4(0.82f, 0.82f, 0.82f, 1.00f); - colors[ImGuiCol_TitleBgCollapsed] = ImVec4(1.00f, 1.00f, 1.00f, 0.51f); - colors[ImGuiCol_MenuBarBg] = ImVec4(0.86f, 0.86f, 0.86f, 1.00f); - colors[ImGuiCol_ScrollbarBg] = ImVec4(0.98f, 0.98f, 0.98f, 0.53f); - colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.69f, 0.69f, 0.69f, 0.80f); - colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.49f, 0.49f, 0.49f, 0.80f); - colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.49f, 0.49f, 0.49f, 1.00f); - colors[ImGuiCol_CheckMark] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_SliderGrab] = ImVec4(0.26f, 0.59f, 0.98f, 0.78f); - colors[ImGuiCol_SliderGrabActive] = ImVec4(0.46f, 0.54f, 0.80f, 0.60f); - colors[ImGuiCol_Button] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); - colors[ImGuiCol_ButtonHovered] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_ButtonActive] = ImVec4(0.06f, 0.53f, 0.98f, 1.00f); - colors[ImGuiCol_Header] = ImVec4(0.26f, 0.59f, 0.98f, 0.31f); - colors[ImGuiCol_HeaderHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.80f); - colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_Separator] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f); - colors[ImGuiCol_SeparatorHovered] = ImVec4(0.14f, 0.44f, 0.80f, 0.78f); - colors[ImGuiCol_SeparatorActive] = ImVec4(0.14f, 0.44f, 0.80f, 1.00f); - colors[ImGuiCol_ResizeGrip] = ImVec4(0.80f, 0.80f, 0.80f, 0.56f); - colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); - colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); - colors[ImGuiCol_CloseButton] = ImVec4(0.59f, 0.59f, 0.59f, 0.50f); - colors[ImGuiCol_CloseButtonHovered] = ImVec4(0.98f, 0.39f, 0.36f, 1.00f); - colors[ImGuiCol_CloseButtonActive] = ImVec4(0.98f, 0.39f, 0.36f, 1.00f); - colors[ImGuiCol_PlotLines] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f); - colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); - colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); - colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.45f, 0.00f, 1.00f); - colors[ImGuiCol_TextSelectedBg] = ImVec4(0.26f, 0.59f, 0.98f, 0.35f); - colors[ImGuiCol_ModalWindowDarkening] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f); - colors[ImGuiCol_DragDropTarget] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); -} - -//----------------------------------------------------------------------------- -// ImDrawListData -//----------------------------------------------------------------------------- - -ImDrawListSharedData::ImDrawListSharedData() -{ - Font = NULL; - FontSize = 0.0f; - CurveTessellationTol = 0.0f; - ClipRectFullscreen = ImVec4(-8192.0f, -8192.0f, +8192.0f, +8192.0f); - - // Const data - for (int i = 0; i < IM_ARRAYSIZE(CircleVtx12); i++) - { - const float a = ((float)i * 2 * IM_PI) / (float)IM_ARRAYSIZE(CircleVtx12); - CircleVtx12[i] = ImVec2(cosf(a), sinf(a)); - } -} - -//----------------------------------------------------------------------------- -// ImDrawList -//----------------------------------------------------------------------------- - -void ImDrawList::Clear() -{ - CmdBuffer.resize(0); - IdxBuffer.resize(0); - VtxBuffer.resize(0); - Flags = ImDrawListFlags_AntiAliasedLines | ImDrawListFlags_AntiAliasedFill; - _VtxCurrentIdx = 0; - _VtxWritePtr = NULL; - _IdxWritePtr = NULL; - _ClipRectStack.resize(0); - _TextureIdStack.resize(0); - _Path.resize(0); - _ChannelsCurrent = 0; - _ChannelsCount = 1; - // NB: Do not clear channels so our allocations are re-used after the first frame. -} - -void ImDrawList::ClearFreeMemory() -{ - CmdBuffer.clear(); - IdxBuffer.clear(); - VtxBuffer.clear(); - _VtxCurrentIdx = 0; - _VtxWritePtr = NULL; - _IdxWritePtr = NULL; - _ClipRectStack.clear(); - _TextureIdStack.clear(); - _Path.clear(); - _ChannelsCurrent = 0; - _ChannelsCount = 1; - for (int i = 0; i < _Channels.Size; i++) - { - if (i == 0) memset(&_Channels[0], 0, sizeof(_Channels[0])); // channel 0 is a copy of CmdBuffer/IdxBuffer, don't destruct again - _Channels[i].CmdBuffer.clear(); - _Channels[i].IdxBuffer.clear(); - } - _Channels.clear(); -} - -// Using macros because C++ is a terrible language, we want guaranteed inline, no code in header, and no overhead in Debug builds -#define GetCurrentClipRect() (_ClipRectStack.Size ? _ClipRectStack.Data[_ClipRectStack.Size-1] : _Data->ClipRectFullscreen) -#define GetCurrentTextureId() (_TextureIdStack.Size ? _TextureIdStack.Data[_TextureIdStack.Size-1] : NULL) - -void ImDrawList::AddDrawCmd() -{ - ImDrawCmd draw_cmd; - draw_cmd.ClipRect = GetCurrentClipRect(); - draw_cmd.TextureId = GetCurrentTextureId(); - - IM_ASSERT(draw_cmd.ClipRect.x <= draw_cmd.ClipRect.z && draw_cmd.ClipRect.y <= draw_cmd.ClipRect.w); - CmdBuffer.push_back(draw_cmd); -} - -void ImDrawList::AddCallback(ImDrawCallback callback, void* callback_data) -{ - ImDrawCmd* current_cmd = CmdBuffer.Size ? &CmdBuffer.back() : NULL; - if (!current_cmd || current_cmd->ElemCount != 0 || current_cmd->UserCallback != NULL) - { - AddDrawCmd(); - current_cmd = &CmdBuffer.back(); - } - current_cmd->UserCallback = callback; - current_cmd->UserCallbackData = callback_data; - - AddDrawCmd(); // Force a new command after us (see comment below) -} - -// Our scheme may appears a bit unusual, basically we want the most-common calls AddLine AddRect etc. to not have to perform any check so we always have a command ready in the stack. -// The cost of figuring out if a new command has to be added or if we can merge is paid in those Update** functions only. -void ImDrawList::UpdateClipRect() -{ - // If current command is used with different settings we need to add a new command - const ImVec4 curr_clip_rect = GetCurrentClipRect(); - ImDrawCmd* curr_cmd = CmdBuffer.Size > 0 ? &CmdBuffer.Data[CmdBuffer.Size-1] : NULL; - if (!curr_cmd || (curr_cmd->ElemCount != 0 && memcmp(&curr_cmd->ClipRect, &curr_clip_rect, sizeof(ImVec4)) != 0) || curr_cmd->UserCallback != NULL) - { - AddDrawCmd(); - return; - } - - // Try to merge with previous command if it matches, else use current command - ImDrawCmd* prev_cmd = CmdBuffer.Size > 1 ? curr_cmd - 1 : NULL; - if (curr_cmd->ElemCount == 0 && prev_cmd && memcmp(&prev_cmd->ClipRect, &curr_clip_rect, sizeof(ImVec4)) == 0 && prev_cmd->TextureId == GetCurrentTextureId() && prev_cmd->UserCallback == NULL) - CmdBuffer.pop_back(); - else - curr_cmd->ClipRect = curr_clip_rect; -} - -void ImDrawList::UpdateTextureID() -{ - // If current command is used with different settings we need to add a new command - const ImTextureID curr_texture_id = GetCurrentTextureId(); - ImDrawCmd* curr_cmd = CmdBuffer.Size ? &CmdBuffer.back() : NULL; - if (!curr_cmd || (curr_cmd->ElemCount != 0 && curr_cmd->TextureId != curr_texture_id) || curr_cmd->UserCallback != NULL) - { - AddDrawCmd(); - return; - } - - // Try to merge with previous command if it matches, else use current command - ImDrawCmd* prev_cmd = CmdBuffer.Size > 1 ? curr_cmd - 1 : NULL; - if (curr_cmd->ElemCount == 0 && prev_cmd && prev_cmd->TextureId == curr_texture_id && memcmp(&prev_cmd->ClipRect, &GetCurrentClipRect(), sizeof(ImVec4)) == 0 && prev_cmd->UserCallback == NULL) - CmdBuffer.pop_back(); - else - curr_cmd->TextureId = curr_texture_id; -} - -#undef GetCurrentClipRect -#undef GetCurrentTextureId - -// Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling) -void ImDrawList::PushClipRect(ImVec2 cr_min, ImVec2 cr_max, bool intersect_with_current_clip_rect) -{ - ImVec4 cr(cr_min.x, cr_min.y, cr_max.x, cr_max.y); - if (intersect_with_current_clip_rect && _ClipRectStack.Size) - { - ImVec4 current = _ClipRectStack.Data[_ClipRectStack.Size-1]; - if (cr.x < current.x) cr.x = current.x; - if (cr.y < current.y) cr.y = current.y; - if (cr.z > current.z) cr.z = current.z; - if (cr.w > current.w) cr.w = current.w; - } - cr.z = ImMax(cr.x, cr.z); - cr.w = ImMax(cr.y, cr.w); - - _ClipRectStack.push_back(cr); - UpdateClipRect(); -} - -void ImDrawList::PushClipRectFullScreen() -{ - PushClipRect(ImVec2(_Data->ClipRectFullscreen.x, _Data->ClipRectFullscreen.y), ImVec2(_Data->ClipRectFullscreen.z, _Data->ClipRectFullscreen.w)); -} - -void ImDrawList::PopClipRect() -{ - IM_ASSERT(_ClipRectStack.Size > 0); - _ClipRectStack.pop_back(); - UpdateClipRect(); -} - -void ImDrawList::PushTextureID(const ImTextureID& texture_id) -{ - _TextureIdStack.push_back(texture_id); - UpdateTextureID(); -} - -void ImDrawList::PopTextureID() -{ - IM_ASSERT(_TextureIdStack.Size > 0); - _TextureIdStack.pop_back(); - UpdateTextureID(); -} - -void ImDrawList::ChannelsSplit(int channels_count) -{ - IM_ASSERT(_ChannelsCurrent == 0 && _ChannelsCount == 1); - int old_channels_count = _Channels.Size; - if (old_channels_count < channels_count) - _Channels.resize(channels_count); - _ChannelsCount = channels_count; - - // _Channels[] (24/32 bytes each) hold storage that we'll swap with this->_CmdBuffer/_IdxBuffer - // The content of _Channels[0] at this point doesn't matter. We clear it to make state tidy in a debugger but we don't strictly need to. - // When we switch to the next channel, we'll copy _CmdBuffer/_IdxBuffer into _Channels[0] and then _Channels[1] into _CmdBuffer/_IdxBuffer - memset(&_Channels[0], 0, sizeof(ImDrawChannel)); - for (int i = 1; i < channels_count; i++) - { - if (i >= old_channels_count) - { - IM_PLACEMENT_NEW(&_Channels[i]) ImDrawChannel(); - } - else - { - _Channels[i].CmdBuffer.resize(0); - _Channels[i].IdxBuffer.resize(0); - } - if (_Channels[i].CmdBuffer.Size == 0) - { - ImDrawCmd draw_cmd; - draw_cmd.ClipRect = _ClipRectStack.back(); - draw_cmd.TextureId = _TextureIdStack.back(); - _Channels[i].CmdBuffer.push_back(draw_cmd); - } - } -} - -void ImDrawList::ChannelsMerge() -{ - // Note that we never use or rely on channels.Size because it is merely a buffer that we never shrink back to 0 to keep all sub-buffers ready for use. - if (_ChannelsCount <= 1) - return; - - ChannelsSetCurrent(0); - if (CmdBuffer.Size && CmdBuffer.back().ElemCount == 0) - CmdBuffer.pop_back(); - - int new_cmd_buffer_count = 0, new_idx_buffer_count = 0; - for (int i = 1; i < _ChannelsCount; i++) - { - ImDrawChannel& ch = _Channels[i]; - if (ch.CmdBuffer.Size && ch.CmdBuffer.back().ElemCount == 0) - ch.CmdBuffer.pop_back(); - new_cmd_buffer_count += ch.CmdBuffer.Size; - new_idx_buffer_count += ch.IdxBuffer.Size; - } - CmdBuffer.resize(CmdBuffer.Size + new_cmd_buffer_count); - IdxBuffer.resize(IdxBuffer.Size + new_idx_buffer_count); - - ImDrawCmd* cmd_write = CmdBuffer.Data + CmdBuffer.Size - new_cmd_buffer_count; - _IdxWritePtr = IdxBuffer.Data + IdxBuffer.Size - new_idx_buffer_count; - for (int i = 1; i < _ChannelsCount; i++) - { - ImDrawChannel& ch = _Channels[i]; - if (int sz = ch.CmdBuffer.Size) { memcpy(cmd_write, ch.CmdBuffer.Data, sz * sizeof(ImDrawCmd)); cmd_write += sz; } - if (int sz = ch.IdxBuffer.Size) { memcpy(_IdxWritePtr, ch.IdxBuffer.Data, sz * sizeof(ImDrawIdx)); _IdxWritePtr += sz; } - } - UpdateClipRect(); // We call this instead of AddDrawCmd(), so that empty channels won't produce an extra draw call. - _ChannelsCount = 1; -} - -void ImDrawList::ChannelsSetCurrent(int idx) -{ - IM_ASSERT(idx < _ChannelsCount); - if (_ChannelsCurrent == idx) return; - memcpy(&_Channels.Data[_ChannelsCurrent].CmdBuffer, &CmdBuffer, sizeof(CmdBuffer)); // copy 12 bytes, four times - memcpy(&_Channels.Data[_ChannelsCurrent].IdxBuffer, &IdxBuffer, sizeof(IdxBuffer)); - _ChannelsCurrent = idx; - memcpy(&CmdBuffer, &_Channels.Data[_ChannelsCurrent].CmdBuffer, sizeof(CmdBuffer)); - memcpy(&IdxBuffer, &_Channels.Data[_ChannelsCurrent].IdxBuffer, sizeof(IdxBuffer)); - _IdxWritePtr = IdxBuffer.Data + IdxBuffer.Size; -} - -// NB: this can be called with negative count for removing primitives (as long as the result does not underflow) -void ImDrawList::PrimReserve(int idx_count, int vtx_count) -{ - ImDrawCmd& draw_cmd = CmdBuffer.Data[CmdBuffer.Size-1]; - draw_cmd.ElemCount += idx_count; - - int vtx_buffer_old_size = VtxBuffer.Size; - VtxBuffer.resize(vtx_buffer_old_size + vtx_count); - _VtxWritePtr = VtxBuffer.Data + vtx_buffer_old_size; - - int idx_buffer_old_size = IdxBuffer.Size; - IdxBuffer.resize(idx_buffer_old_size + idx_count); - _IdxWritePtr = IdxBuffer.Data + idx_buffer_old_size; -} - -// Fully unrolled with inline call to keep our debug builds decently fast. -void ImDrawList::PrimRect(const ImVec2& a, const ImVec2& c, ImU32 col) -{ - ImVec2 b(c.x, a.y), d(a.x, c.y), uv(_Data->TexUvWhitePixel); - ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx; - _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2); - _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3); - _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; - _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col; - _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col; - _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col; - _VtxWritePtr += 4; - _VtxCurrentIdx += 4; - _IdxWritePtr += 6; -} - -void ImDrawList::PrimRectUV(const ImVec2& a, const ImVec2& c, const ImVec2& uv_a, const ImVec2& uv_c, ImU32 col) -{ - ImVec2 b(c.x, a.y), d(a.x, c.y), uv_b(uv_c.x, uv_a.y), uv_d(uv_a.x, uv_c.y); - ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx; - _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2); - _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3); - _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col; - _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col; - _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col; - _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col; - _VtxWritePtr += 4; - _VtxCurrentIdx += 4; - _IdxWritePtr += 6; -} - -void ImDrawList::PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col) -{ - ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx; - _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2); - _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3); - _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col; - _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col; - _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col; - _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col; - _VtxWritePtr += 4; - _VtxCurrentIdx += 4; - _IdxWritePtr += 6; -} - -// TODO: Thickness anti-aliased lines cap are missing their AA fringe. -void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 col, bool closed, float thickness) -{ - if (points_count < 2) - return; - - const ImVec2 uv = _Data->TexUvWhitePixel; - - int count = points_count; - if (!closed) - count = points_count-1; - - const bool thick_line = thickness > 1.0f; - if (Flags & ImDrawListFlags_AntiAliasedLines) - { - // Anti-aliased stroke - const float AA_SIZE = 1.0f; - const ImU32 col_trans = col & ~IM_COL32_A_MASK; - - const int idx_count = thick_line ? count*18 : count*12; - const int vtx_count = thick_line ? points_count*4 : points_count*3; - PrimReserve(idx_count, vtx_count); - - // Temporary buffer - ImVec2* temp_normals = (ImVec2*)alloca(points_count * (thick_line ? 5 : 3) * sizeof(ImVec2)); - ImVec2* temp_points = temp_normals + points_count; - - for (int i1 = 0; i1 < count; i1++) - { - const int i2 = (i1+1) == points_count ? 0 : i1+1; - ImVec2 diff = points[i2] - points[i1]; - diff *= ImInvLength(diff, 1.0f); - temp_normals[i1].x = diff.y; - temp_normals[i1].y = -diff.x; - } - if (!closed) - temp_normals[points_count-1] = temp_normals[points_count-2]; - - if (!thick_line) - { - if (!closed) - { - temp_points[0] = points[0] + temp_normals[0] * AA_SIZE; - temp_points[1] = points[0] - temp_normals[0] * AA_SIZE; - temp_points[(points_count-1)*2+0] = points[points_count-1] + temp_normals[points_count-1] * AA_SIZE; - temp_points[(points_count-1)*2+1] = points[points_count-1] - temp_normals[points_count-1] * AA_SIZE; - } - - // FIXME-OPT: Merge the different loops, possibly remove the temporary buffer. - unsigned int idx1 = _VtxCurrentIdx; - for (int i1 = 0; i1 < count; i1++) - { - const int i2 = (i1+1) == points_count ? 0 : i1+1; - unsigned int idx2 = (i1+1) == points_count ? _VtxCurrentIdx : idx1+3; - - // Average normals - ImVec2 dm = (temp_normals[i1] + temp_normals[i2]) * 0.5f; - float dmr2 = dm.x*dm.x + dm.y*dm.y; - if (dmr2 > 0.000001f) - { - float scale = 1.0f / dmr2; - if (scale > 100.0f) scale = 100.0f; - dm *= scale; - } - dm *= AA_SIZE; - temp_points[i2*2+0] = points[i2] + dm; - temp_points[i2*2+1] = points[i2] - dm; - - // Add indexes - _IdxWritePtr[0] = (ImDrawIdx)(idx2+0); _IdxWritePtr[1] = (ImDrawIdx)(idx1+0); _IdxWritePtr[2] = (ImDrawIdx)(idx1+2); - _IdxWritePtr[3] = (ImDrawIdx)(idx1+2); _IdxWritePtr[4] = (ImDrawIdx)(idx2+2); _IdxWritePtr[5] = (ImDrawIdx)(idx2+0); - _IdxWritePtr[6] = (ImDrawIdx)(idx2+1); _IdxWritePtr[7] = (ImDrawIdx)(idx1+1); _IdxWritePtr[8] = (ImDrawIdx)(idx1+0); - _IdxWritePtr[9] = (ImDrawIdx)(idx1+0); _IdxWritePtr[10]= (ImDrawIdx)(idx2+0); _IdxWritePtr[11]= (ImDrawIdx)(idx2+1); - _IdxWritePtr += 12; - - idx1 = idx2; - } - - // Add vertexes - for (int i = 0; i < points_count; i++) - { - _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; - _VtxWritePtr[1].pos = temp_points[i*2+0]; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans; - _VtxWritePtr[2].pos = temp_points[i*2+1]; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col_trans; - _VtxWritePtr += 3; - } - } - else - { - const float half_inner_thickness = (thickness - AA_SIZE) * 0.5f; - if (!closed) - { - temp_points[0] = points[0] + temp_normals[0] * (half_inner_thickness + AA_SIZE); - temp_points[1] = points[0] + temp_normals[0] * (half_inner_thickness); - temp_points[2] = points[0] - temp_normals[0] * (half_inner_thickness); - temp_points[3] = points[0] - temp_normals[0] * (half_inner_thickness + AA_SIZE); - temp_points[(points_count-1)*4+0] = points[points_count-1] + temp_normals[points_count-1] * (half_inner_thickness + AA_SIZE); - temp_points[(points_count-1)*4+1] = points[points_count-1] + temp_normals[points_count-1] * (half_inner_thickness); - temp_points[(points_count-1)*4+2] = points[points_count-1] - temp_normals[points_count-1] * (half_inner_thickness); - temp_points[(points_count-1)*4+3] = points[points_count-1] - temp_normals[points_count-1] * (half_inner_thickness + AA_SIZE); - } - - // FIXME-OPT: Merge the different loops, possibly remove the temporary buffer. - unsigned int idx1 = _VtxCurrentIdx; - for (int i1 = 0; i1 < count; i1++) - { - const int i2 = (i1+1) == points_count ? 0 : i1+1; - unsigned int idx2 = (i1+1) == points_count ? _VtxCurrentIdx : idx1+4; - - // Average normals - ImVec2 dm = (temp_normals[i1] + temp_normals[i2]) * 0.5f; - float dmr2 = dm.x*dm.x + dm.y*dm.y; - if (dmr2 > 0.000001f) - { - float scale = 1.0f / dmr2; - if (scale > 100.0f) scale = 100.0f; - dm *= scale; - } - ImVec2 dm_out = dm * (half_inner_thickness + AA_SIZE); - ImVec2 dm_in = dm * half_inner_thickness; - temp_points[i2*4+0] = points[i2] + dm_out; - temp_points[i2*4+1] = points[i2] + dm_in; - temp_points[i2*4+2] = points[i2] - dm_in; - temp_points[i2*4+3] = points[i2] - dm_out; - - // Add indexes - _IdxWritePtr[0] = (ImDrawIdx)(idx2+1); _IdxWritePtr[1] = (ImDrawIdx)(idx1+1); _IdxWritePtr[2] = (ImDrawIdx)(idx1+2); - _IdxWritePtr[3] = (ImDrawIdx)(idx1+2); _IdxWritePtr[4] = (ImDrawIdx)(idx2+2); _IdxWritePtr[5] = (ImDrawIdx)(idx2+1); - _IdxWritePtr[6] = (ImDrawIdx)(idx2+1); _IdxWritePtr[7] = (ImDrawIdx)(idx1+1); _IdxWritePtr[8] = (ImDrawIdx)(idx1+0); - _IdxWritePtr[9] = (ImDrawIdx)(idx1+0); _IdxWritePtr[10] = (ImDrawIdx)(idx2+0); _IdxWritePtr[11] = (ImDrawIdx)(idx2+1); - _IdxWritePtr[12] = (ImDrawIdx)(idx2+2); _IdxWritePtr[13] = (ImDrawIdx)(idx1+2); _IdxWritePtr[14] = (ImDrawIdx)(idx1+3); - _IdxWritePtr[15] = (ImDrawIdx)(idx1+3); _IdxWritePtr[16] = (ImDrawIdx)(idx2+3); _IdxWritePtr[17] = (ImDrawIdx)(idx2+2); - _IdxWritePtr += 18; - - idx1 = idx2; - } - - // Add vertexes - for (int i = 0; i < points_count; i++) - { - _VtxWritePtr[0].pos = temp_points[i*4+0]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col_trans; - _VtxWritePtr[1].pos = temp_points[i*4+1]; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col; - _VtxWritePtr[2].pos = temp_points[i*4+2]; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col; - _VtxWritePtr[3].pos = temp_points[i*4+3]; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col_trans; - _VtxWritePtr += 4; - } - } - _VtxCurrentIdx += (ImDrawIdx)vtx_count; - } - else - { - // Non Anti-aliased Stroke - const int idx_count = count*6; - const int vtx_count = count*4; // FIXME-OPT: Not sharing edges - PrimReserve(idx_count, vtx_count); - - for (int i1 = 0; i1 < count; i1++) - { - const int i2 = (i1+1) == points_count ? 0 : i1+1; - const ImVec2& p1 = points[i1]; - const ImVec2& p2 = points[i2]; - ImVec2 diff = p2 - p1; - diff *= ImInvLength(diff, 1.0f); - - const float dx = diff.x * (thickness * 0.5f); - const float dy = diff.y * (thickness * 0.5f); - _VtxWritePtr[0].pos.x = p1.x + dy; _VtxWritePtr[0].pos.y = p1.y - dx; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; - _VtxWritePtr[1].pos.x = p2.x + dy; _VtxWritePtr[1].pos.y = p2.y - dx; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col; - _VtxWritePtr[2].pos.x = p2.x - dy; _VtxWritePtr[2].pos.y = p2.y + dx; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col; - _VtxWritePtr[3].pos.x = p1.x - dy; _VtxWritePtr[3].pos.y = p1.y + dx; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col; - _VtxWritePtr += 4; - - _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+2); - _IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx+2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx+3); - _IdxWritePtr += 6; - _VtxCurrentIdx += 4; - } - } -} - -void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_count, ImU32 col) -{ - const ImVec2 uv = _Data->TexUvWhitePixel; - - if (Flags & ImDrawListFlags_AntiAliasedFill) - { - // Anti-aliased Fill - const float AA_SIZE = 1.0f; - const ImU32 col_trans = col & ~IM_COL32_A_MASK; - const int idx_count = (points_count-2)*3 + points_count*6; - const int vtx_count = (points_count*2); - PrimReserve(idx_count, vtx_count); - - // Add indexes for fill - unsigned int vtx_inner_idx = _VtxCurrentIdx; - unsigned int vtx_outer_idx = _VtxCurrentIdx+1; - for (int i = 2; i < points_count; i++) - { - _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx+((i-1)<<1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_inner_idx+(i<<1)); - _IdxWritePtr += 3; - } - - // Compute normals - ImVec2* temp_normals = (ImVec2*)alloca(points_count * sizeof(ImVec2)); - for (int i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++) - { - const ImVec2& p0 = points[i0]; - const ImVec2& p1 = points[i1]; - ImVec2 diff = p1 - p0; - diff *= ImInvLength(diff, 1.0f); - temp_normals[i0].x = diff.y; - temp_normals[i0].y = -diff.x; - } - - for (int i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++) - { - // Average normals - const ImVec2& n0 = temp_normals[i0]; - const ImVec2& n1 = temp_normals[i1]; - ImVec2 dm = (n0 + n1) * 0.5f; - float dmr2 = dm.x*dm.x + dm.y*dm.y; - if (dmr2 > 0.000001f) - { - float scale = 1.0f / dmr2; - if (scale > 100.0f) scale = 100.0f; - dm *= scale; - } - dm *= AA_SIZE * 0.5f; - - // Add vertices - _VtxWritePtr[0].pos = (points[i1] - dm); _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; // Inner - _VtxWritePtr[1].pos = (points[i1] + dm); _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans; // Outer - _VtxWritePtr += 2; - - // Add indexes for fringes - _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx+(i1<<1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx+(i0<<1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_outer_idx+(i0<<1)); - _IdxWritePtr[3] = (ImDrawIdx)(vtx_outer_idx+(i0<<1)); _IdxWritePtr[4] = (ImDrawIdx)(vtx_outer_idx+(i1<<1)); _IdxWritePtr[5] = (ImDrawIdx)(vtx_inner_idx+(i1<<1)); - _IdxWritePtr += 6; - } - _VtxCurrentIdx += (ImDrawIdx)vtx_count; - } - else - { - // Non Anti-aliased Fill - const int idx_count = (points_count-2)*3; - const int vtx_count = points_count; - PrimReserve(idx_count, vtx_count); - for (int i = 0; i < vtx_count; i++) - { - _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; - _VtxWritePtr++; - } - for (int i = 2; i < points_count; i++) - { - _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+i-1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+i); - _IdxWritePtr += 3; - } - _VtxCurrentIdx += (ImDrawIdx)vtx_count; - } -} - -void ImDrawList::PathArcToFast(const ImVec2& centre, float radius, int a_min_of_12, int a_max_of_12) -{ - if (radius == 0.0f || a_min_of_12 > a_max_of_12) - { - _Path.push_back(centre); - return; - } - _Path.reserve(_Path.Size + (a_max_of_12 - a_min_of_12 + 1)); - for (int a = a_min_of_12; a <= a_max_of_12; a++) - { - const ImVec2& c = _Data->CircleVtx12[a % IM_ARRAYSIZE(_Data->CircleVtx12)]; - _Path.push_back(ImVec2(centre.x + c.x * radius, centre.y + c.y * radius)); - } -} - -void ImDrawList::PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments) -{ - if (radius == 0.0f) - { - _Path.push_back(centre); - return; - } - _Path.reserve(_Path.Size + (num_segments + 1)); - for (int i = 0; i <= num_segments; i++) - { - const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min); - _Path.push_back(ImVec2(centre.x + cosf(a) * radius, centre.y + sinf(a) * radius)); - } -} - -static void PathBezierToCasteljau(ImVector* path, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level) -{ - float dx = x4 - x1; - float dy = y4 - y1; - float d2 = ((x2 - x4) * dy - (y2 - y4) * dx); - float d3 = ((x3 - x4) * dy - (y3 - y4) * dx); - d2 = (d2 >= 0) ? d2 : -d2; - d3 = (d3 >= 0) ? d3 : -d3; - if ((d2+d3) * (d2+d3) < tess_tol * (dx*dx + dy*dy)) - { - path->push_back(ImVec2(x4, y4)); - } - else if (level < 10) - { - float x12 = (x1+x2)*0.5f, y12 = (y1+y2)*0.5f; - float x23 = (x2+x3)*0.5f, y23 = (y2+y3)*0.5f; - float x34 = (x3+x4)*0.5f, y34 = (y3+y4)*0.5f; - float x123 = (x12+x23)*0.5f, y123 = (y12+y23)*0.5f; - float x234 = (x23+x34)*0.5f, y234 = (y23+y34)*0.5f; - float x1234 = (x123+x234)*0.5f, y1234 = (y123+y234)*0.5f; - - PathBezierToCasteljau(path, x1,y1, x12,y12, x123,y123, x1234,y1234, tess_tol, level+1); - PathBezierToCasteljau(path, x1234,y1234, x234,y234, x34,y34, x4,y4, tess_tol, level+1); - } -} - -void ImDrawList::PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments) -{ - ImVec2 p1 = _Path.back(); - if (num_segments == 0) - { - // Auto-tessellated - PathBezierToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, _Data->CurveTessellationTol, 0); - } - else - { - float t_step = 1.0f / (float)num_segments; - for (int i_step = 1; i_step <= num_segments; i_step++) - { - float t = t_step * i_step; - float u = 1.0f - t; - float w1 = u*u*u; - float w2 = 3*u*u*t; - float w3 = 3*u*t*t; - float w4 = t*t*t; - _Path.push_back(ImVec2(w1*p1.x + w2*p2.x + w3*p3.x + w4*p4.x, w1*p1.y + w2*p2.y + w3*p3.y + w4*p4.y)); - } - } -} - -void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, int rounding_corners) -{ - rounding = ImMin(rounding, fabsf(b.x - a.x) * ( ((rounding_corners & ImDrawCornerFlags_Top) == ImDrawCornerFlags_Top) || ((rounding_corners & ImDrawCornerFlags_Bot) == ImDrawCornerFlags_Bot) ? 0.5f : 1.0f ) - 1.0f); - rounding = ImMin(rounding, fabsf(b.y - a.y) * ( ((rounding_corners & ImDrawCornerFlags_Left) == ImDrawCornerFlags_Left) || ((rounding_corners & ImDrawCornerFlags_Right) == ImDrawCornerFlags_Right) ? 0.5f : 1.0f ) - 1.0f); - - if (rounding <= 0.0f || rounding_corners == 0) - { - PathLineTo(a); - PathLineTo(ImVec2(b.x, a.y)); - PathLineTo(b); - PathLineTo(ImVec2(a.x, b.y)); - } - else - { - const float rounding_tl = (rounding_corners & ImDrawCornerFlags_TopLeft) ? rounding : 0.0f; - const float rounding_tr = (rounding_corners & ImDrawCornerFlags_TopRight) ? rounding : 0.0f; - const float rounding_br = (rounding_corners & ImDrawCornerFlags_BotRight) ? rounding : 0.0f; - const float rounding_bl = (rounding_corners & ImDrawCornerFlags_BotLeft) ? rounding : 0.0f; - PathArcToFast(ImVec2(a.x + rounding_tl, a.y + rounding_tl), rounding_tl, 6, 9); - PathArcToFast(ImVec2(b.x - rounding_tr, a.y + rounding_tr), rounding_tr, 9, 12); - PathArcToFast(ImVec2(b.x - rounding_br, b.y - rounding_br), rounding_br, 0, 3); - PathArcToFast(ImVec2(a.x + rounding_bl, b.y - rounding_bl), rounding_bl, 3, 6); - } -} - -void ImDrawList::AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - PathLineTo(a + ImVec2(0.5f,0.5f)); - PathLineTo(b + ImVec2(0.5f,0.5f)); - PathStroke(col, false, thickness); -} - -// a: upper-left, b: lower-right. we don't render 1 px sized rectangles properly. -void ImDrawList::AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners_flags, float thickness) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - PathRect(a + ImVec2(0.5f,0.5f), b - ImVec2(0.5f,0.5f), rounding, rounding_corners_flags); - PathStroke(col, true, thickness); -} - -void ImDrawList::AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners_flags) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - if (rounding > 0.0f) - { - PathRect(a, b, rounding, rounding_corners_flags); - PathFillConvex(col); - } - else - { - PrimReserve(6, 4); - PrimRect(a, b, col); - } -} - -void ImDrawList::AddRectFilledMultiColor(const ImVec2& a, const ImVec2& c, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left) -{ - if (((col_upr_left | col_upr_right | col_bot_right | col_bot_left) & IM_COL32_A_MASK) == 0) - return; - - const ImVec2 uv = _Data->TexUvWhitePixel; - PrimReserve(6, 4); - PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+1)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+2)); - PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+2)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+3)); - PrimWriteVtx(a, uv, col_upr_left); - PrimWriteVtx(ImVec2(c.x, a.y), uv, col_upr_right); - PrimWriteVtx(c, uv, col_bot_right); - PrimWriteVtx(ImVec2(a.x, c.y), uv, col_bot_left); -} - -void ImDrawList::AddQuad(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col, float thickness) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - PathLineTo(a); - PathLineTo(b); - PathLineTo(c); - PathLineTo(d); - PathStroke(col, true, thickness); -} - -void ImDrawList::AddQuadFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - PathLineTo(a); - PathLineTo(b); - PathLineTo(c); - PathLineTo(d); - PathFillConvex(col); -} - -void ImDrawList::AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - PathLineTo(a); - PathLineTo(b); - PathLineTo(c); - PathStroke(col, true, thickness); -} - -void ImDrawList::AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - PathLineTo(a); - PathLineTo(b); - PathLineTo(c); - PathFillConvex(col); -} - -void ImDrawList::AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments, float thickness) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments; - PathArcTo(centre, radius-0.5f, 0.0f, a_max, num_segments); - PathStroke(col, true, thickness); -} - -void ImDrawList::AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments; - PathArcTo(centre, radius, 0.0f, a_max, num_segments); - PathFillConvex(col); -} - -void ImDrawList::AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - PathLineTo(pos0); - PathBezierCurveTo(cp0, cp1, pos1, num_segments); - PathStroke(col, false, thickness); -} - -void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end, float wrap_width, const ImVec4* cpu_fine_clip_rect) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - if (text_end == NULL) - text_end = text_begin + strlen(text_begin); - if (text_begin == text_end) - return; - - // Pull default font/size from the shared ImDrawListSharedData instance - if (font == NULL) - font = _Data->Font; - if (font_size == 0.0f) - font_size = _Data->FontSize; - - IM_ASSERT(font->ContainerAtlas->TexID == _TextureIdStack.back()); // Use high-level ImGui::PushFont() or low-level ImDrawList::PushTextureId() to change font. - - ImVec4 clip_rect = _ClipRectStack.back(); - if (cpu_fine_clip_rect) - { - clip_rect.x = ImMax(clip_rect.x, cpu_fine_clip_rect->x); - clip_rect.y = ImMax(clip_rect.y, cpu_fine_clip_rect->y); - clip_rect.z = ImMin(clip_rect.z, cpu_fine_clip_rect->z); - clip_rect.w = ImMin(clip_rect.w, cpu_fine_clip_rect->w); - } - font->RenderText(this, font_size, pos, col, clip_rect, text_begin, text_end, wrap_width, cpu_fine_clip_rect != NULL); -} - -void ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end) -{ - AddText(NULL, 0.0f, pos, col, text_begin, text_end); -} - -void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back(); - if (push_texture_id) - PushTextureID(user_texture_id); - - PrimReserve(6, 4); - PrimRectUV(a, b, uv_a, uv_b, col); - - if (push_texture_id) - PopTextureID(); -} - -void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back(); - if (push_texture_id) - PushTextureID(user_texture_id); - - PrimReserve(6, 4); - PrimQuadUV(a, b, c, d, uv_a, uv_b, uv_c, uv_d, col); - - if (push_texture_id) - PopTextureID(); -} - -void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col, float rounding, int rounding_corners) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - if (rounding <= 0.0f || (rounding_corners & ImDrawCornerFlags_All) == 0) - { - AddImage(user_texture_id, a, b, uv_a, uv_b, col); - return; - } - - const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back(); - if (push_texture_id) - PushTextureID(user_texture_id); - - int vert_start_idx = VtxBuffer.Size; - PathRect(a, b, rounding, rounding_corners); - PathFillConvex(col); - int vert_end_idx = VtxBuffer.Size; - ImGui::ShadeVertsLinearUV(VtxBuffer.Data + vert_start_idx, VtxBuffer.Data + vert_end_idx, a, b, uv_a, uv_b, true); - - if (push_texture_id) - PopTextureID(); -} - -//----------------------------------------------------------------------------- -// ImDrawData -//----------------------------------------------------------------------------- - -// For backward compatibility: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! -void ImDrawData::DeIndexAllBuffers() -{ - ImVector new_vtx_buffer; - TotalVtxCount = TotalIdxCount = 0; - for (int i = 0; i < CmdListsCount; i++) - { - ImDrawList* cmd_list = CmdLists[i]; - if (cmd_list->IdxBuffer.empty()) - continue; - new_vtx_buffer.resize(cmd_list->IdxBuffer.Size); - for (int j = 0; j < cmd_list->IdxBuffer.Size; j++) - new_vtx_buffer[j] = cmd_list->VtxBuffer[cmd_list->IdxBuffer[j]]; - cmd_list->VtxBuffer.swap(new_vtx_buffer); - cmd_list->IdxBuffer.resize(0); - TotalVtxCount += cmd_list->VtxBuffer.Size; - } -} - -// Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than ImGui expects, or if there is a difference between your window resolution and framebuffer resolution. -void ImDrawData::ScaleClipRects(const ImVec2& scale) -{ - for (int i = 0; i < CmdListsCount; i++) - { - ImDrawList* cmd_list = CmdLists[i]; - for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) - { - ImDrawCmd* cmd = &cmd_list->CmdBuffer[cmd_i]; - cmd->ClipRect = ImVec4(cmd->ClipRect.x * scale.x, cmd->ClipRect.y * scale.y, cmd->ClipRect.z * scale.x, cmd->ClipRect.w * scale.y); - } - } -} - -//----------------------------------------------------------------------------- -// Shade functions -//----------------------------------------------------------------------------- - -// Generic linear color gradient, write to RGB fields, leave A untouched. -void ImGui::ShadeVertsLinearColorGradientKeepAlpha(ImDrawVert* vert_start, ImDrawVert* vert_end, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1) -{ - ImVec2 gradient_extent = gradient_p1 - gradient_p0; - float gradient_inv_length2 = 1.0f / ImLengthSqr(gradient_extent); - for (ImDrawVert* vert = vert_start; vert < vert_end; vert++) - { - float d = ImDot(vert->pos - gradient_p0, gradient_extent); - float t = ImClamp(d * gradient_inv_length2, 0.0f, 1.0f); - int r = ImLerp((int)(col0 >> IM_COL32_R_SHIFT) & 0xFF, (int)(col1 >> IM_COL32_R_SHIFT) & 0xFF, t); - int g = ImLerp((int)(col0 >> IM_COL32_G_SHIFT) & 0xFF, (int)(col1 >> IM_COL32_G_SHIFT) & 0xFF, t); - int b = ImLerp((int)(col0 >> IM_COL32_B_SHIFT) & 0xFF, (int)(col1 >> IM_COL32_B_SHIFT) & 0xFF, t); - vert->col = (r << IM_COL32_R_SHIFT) | (g << IM_COL32_G_SHIFT) | (b << IM_COL32_B_SHIFT) | (vert->col & IM_COL32_A_MASK); - } -} - -// Scan and shade backward from the end of given vertices. Assume vertices are text only (= vert_start..vert_end going left to right) so we can break as soon as we are out the gradient bounds. -void ImGui::ShadeVertsLinearAlphaGradientForLeftToRightText(ImDrawVert* vert_start, ImDrawVert* vert_end, float gradient_p0_x, float gradient_p1_x) -{ - float gradient_extent_x = gradient_p1_x - gradient_p0_x; - float gradient_inv_length2 = 1.0f / (gradient_extent_x * gradient_extent_x); - int full_alpha_count = 0; - for (ImDrawVert* vert = vert_end - 1; vert >= vert_start; vert--) - { - float d = (vert->pos.x - gradient_p0_x) * (gradient_extent_x); - float alpha_mul = 1.0f - ImClamp(d * gradient_inv_length2, 0.0f, 1.0f); - if (alpha_mul >= 1.0f && ++full_alpha_count > 2) - return; // Early out - int a = (int)(((vert->col >> IM_COL32_A_SHIFT) & 0xFF) * alpha_mul); - vert->col = (vert->col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT); - } -} - -// Distribute UV over (a, b) rectangle -void ImGui::ShadeVertsLinearUV(ImDrawVert* vert_start, ImDrawVert* vert_end, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp) -{ - const ImVec2 size = b - a; - const ImVec2 uv_size = uv_b - uv_a; - const ImVec2 scale = ImVec2( - size.x != 0.0f ? (uv_size.x / size.x) : 0.0f, - size.y != 0.0f ? (uv_size.y / size.y) : 0.0f); - - if (clamp) - { - const ImVec2 min = ImMin(uv_a, uv_b); - const ImVec2 max = ImMax(uv_a, uv_b); - - for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex) - vertex->uv = ImClamp(uv_a + ImMul(ImVec2(vertex->pos.x, vertex->pos.y) - a, scale), min, max); - } - else - { - for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex) - vertex->uv = uv_a + ImMul(ImVec2(vertex->pos.x, vertex->pos.y) - a, scale); - } -} - -//----------------------------------------------------------------------------- -// ImFontConfig -//----------------------------------------------------------------------------- - -ImFontConfig::ImFontConfig() -{ - FontData = NULL; - FontDataSize = 0; - FontDataOwnedByAtlas = true; - FontNo = 0; - SizePixels = 0.0f; - OversampleH = 3; - OversampleV = 1; - PixelSnapH = false; - GlyphExtraSpacing = ImVec2(0.0f, 0.0f); - GlyphOffset = ImVec2(0.0f, 0.0f); - GlyphRanges = NULL; - MergeMode = false; - RasterizerFlags = 0x00; - RasterizerMultiply = 1.0f; - memset(Name, 0, sizeof(Name)); - DstFont = NULL; -} - -//----------------------------------------------------------------------------- -// ImFontAtlas -//----------------------------------------------------------------------------- - -// A work of art lies ahead! (. = white layer, X = black layer, others are blank) -// The white texels on the top left are the ones we'll use everywhere in ImGui to render filled shapes. -const int FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF = 90; -const int FONT_ATLAS_DEFAULT_TEX_DATA_H = 27; -const unsigned int FONT_ATLAS_DEFAULT_TEX_DATA_ID = 0x80000000; -static const char FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF * FONT_ATLAS_DEFAULT_TEX_DATA_H + 1] = -{ - "..- -XXXXXXX- X - X -XXXXXXX - XXXXXXX" - "..- -X.....X- X.X - X.X -X.....X - X.....X" - "--- -XXX.XXX- X...X - X...X -X....X - X....X" - "X - X.X - X.....X - X.....X -X...X - X...X" - "XX - X.X -X.......X- X.......X -X..X.X - X.X..X" - "X.X - X.X -XXXX.XXXX- XXXX.XXXX -X.X X.X - X.X X.X" - "X..X - X.X - X.X - X.X -XX X.X - X.X XX" - "X...X - X.X - X.X - XX X.X XX - X.X - X.X " - "X....X - X.X - X.X - X.X X.X X.X - X.X - X.X " - "X.....X - X.X - X.X - X..X X.X X..X - X.X - X.X " - "X......X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X XX-XX X.X " - "X.......X - X.X - X.X -X.....................X- X.X X.X-X.X X.X " - "X........X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X..X-X..X.X " - "X.........X -XXX.XXX- X.X - X..X X.X X..X - X...X-X...X " - "X..........X-X.....X- X.X - X.X X.X X.X - X....X-X....X " - "X......XXXXX-XXXXXXX- X.X - XX X.X XX - X.....X-X.....X " - "X...X..X --------- X.X - X.X - XXXXXXX-XXXXXXX " - "X..X X..X - -XXXX.XXXX- XXXX.XXXX ------------------------------------" - "X.X X..X - -X.......X- X.......X - XX XX - " - "XX X..X - - X.....X - X.....X - X.X X.X - " - " X..X - X...X - X...X - X..X X..X - " - " XX - X.X - X.X - X...XXXXXXXXXXXXX...X - " - "------------ - X - X -X.....................X- " - " ----------------------------------- X...XXXXXXXXXXXXX...X - " - " - X..X X..X - " - " - X.X X.X - " - " - XX XX - " -}; - -static const ImVec2 FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[ImGuiMouseCursor_Count_][3] = -{ - // Pos ........ Size ......... Offset ...... - { ImVec2(0,3), ImVec2(12,19), ImVec2( 0, 0) }, // ImGuiMouseCursor_Arrow - { ImVec2(13,0), ImVec2(7,16), ImVec2( 4, 8) }, // ImGuiMouseCursor_TextInput - { ImVec2(31,0), ImVec2(23,23), ImVec2(11,11) }, // ImGuiMouseCursor_Move - { ImVec2(21,0), ImVec2( 9,23), ImVec2( 5,11) }, // ImGuiMouseCursor_ResizeNS - { ImVec2(55,18),ImVec2(23, 9), ImVec2(11, 5) }, // ImGuiMouseCursor_ResizeEW - { ImVec2(73,0), ImVec2(17,17), ImVec2( 9, 9) }, // ImGuiMouseCursor_ResizeNESW - { ImVec2(55,0), ImVec2(17,17), ImVec2( 9, 9) }, // ImGuiMouseCursor_ResizeNWSE -}; - - -ImFontAtlas::ImFontAtlas() -{ - TexID = NULL; - TexDesiredWidth = 0; - TexGlyphPadding = 1; - TexPixelsAlpha8 = NULL; - TexPixelsRGBA32 = NULL; - TexWidth = TexHeight = 0; - TexUvWhitePixel = ImVec2(0, 0); - for (int n = 0; n < IM_ARRAYSIZE(CustomRectIds); n++) - CustomRectIds[n] = -1; -} - -ImFontAtlas::~ImFontAtlas() -{ - Clear(); -} - -void ImFontAtlas::ClearInputData() -{ - for (int i = 0; i < ConfigData.Size; i++) - if (ConfigData[i].FontData && ConfigData[i].FontDataOwnedByAtlas) - { - ImGui::MemFree(ConfigData[i].FontData); - ConfigData[i].FontData = NULL; - } - - // When clearing this we lose access to the font name and other information used to build the font. - for (int i = 0; i < Fonts.Size; i++) - if (Fonts[i]->ConfigData >= ConfigData.Data && Fonts[i]->ConfigData < ConfigData.Data + ConfigData.Size) - { - Fonts[i]->ConfigData = NULL; - Fonts[i]->ConfigDataCount = 0; - } - ConfigData.clear(); - CustomRects.clear(); - for (int n = 0; n < IM_ARRAYSIZE(CustomRectIds); n++) - CustomRectIds[n] = -1; -} - -void ImFontAtlas::ClearTexData() -{ - if (TexPixelsAlpha8) - ImGui::MemFree(TexPixelsAlpha8); - if (TexPixelsRGBA32) - ImGui::MemFree(TexPixelsRGBA32); - TexPixelsAlpha8 = NULL; - TexPixelsRGBA32 = NULL; -} - -void ImFontAtlas::ClearFonts() -{ - for (int i = 0; i < Fonts.Size; i++) - IM_DELETE(Fonts[i]); - Fonts.clear(); -} - -void ImFontAtlas::Clear() -{ - ClearInputData(); - ClearTexData(); - ClearFonts(); -} - -void ImFontAtlas::GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel) -{ - // Build atlas on demand - if (TexPixelsAlpha8 == NULL) - { - if (ConfigData.empty()) - AddFontDefault(); - Build(); - } - - *out_pixels = TexPixelsAlpha8; - if (out_width) *out_width = TexWidth; - if (out_height) *out_height = TexHeight; - if (out_bytes_per_pixel) *out_bytes_per_pixel = 1; -} - -void ImFontAtlas::GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel) -{ - // Convert to RGBA32 format on demand - // Although it is likely to be the most commonly used format, our font rendering is 1 channel / 8 bpp - if (!TexPixelsRGBA32) - { - unsigned char* pixels; - GetTexDataAsAlpha8(&pixels, NULL, NULL); - TexPixelsRGBA32 = (unsigned int*)ImGui::MemAlloc((size_t)(TexWidth * TexHeight * 4)); - const unsigned char* src = pixels; - unsigned int* dst = TexPixelsRGBA32; - for (int n = TexWidth * TexHeight; n > 0; n--) - *dst++ = IM_COL32(255, 255, 255, (unsigned int)(*src++)); - } - - *out_pixels = (unsigned char*)TexPixelsRGBA32; - if (out_width) *out_width = TexWidth; - if (out_height) *out_height = TexHeight; - if (out_bytes_per_pixel) *out_bytes_per_pixel = 4; -} - -ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg) -{ - IM_ASSERT(font_cfg->FontData != NULL && font_cfg->FontDataSize > 0); - IM_ASSERT(font_cfg->SizePixels > 0.0f); - - // Create new font - if (!font_cfg->MergeMode) - Fonts.push_back(IM_NEW(ImFont)); - else - IM_ASSERT(!Fonts.empty()); // When using MergeMode make sure that a font has already been added before. You can use ImGui::GetIO().Fonts->AddFontDefault() to add the default imgui font. - - ConfigData.push_back(*font_cfg); - ImFontConfig& new_font_cfg = ConfigData.back(); - if (!new_font_cfg.DstFont) - new_font_cfg.DstFont = Fonts.back(); - if (!new_font_cfg.FontDataOwnedByAtlas) - { - new_font_cfg.FontData = ImGui::MemAlloc(new_font_cfg.FontDataSize); - new_font_cfg.FontDataOwnedByAtlas = true; - memcpy(new_font_cfg.FontData, font_cfg->FontData, (size_t)new_font_cfg.FontDataSize); - } - - // Invalidate texture - ClearTexData(); - return new_font_cfg.DstFont; -} - -// Default font TTF is compressed with stb_compress then base85 encoded (see extra_fonts/binary_to_compressed_c.cpp for encoder) -static unsigned int stb_decompress_length(unsigned char *input); -static unsigned int stb_decompress(unsigned char *output, unsigned char *i, unsigned int length); -static const char* GetDefaultCompressedFontDataTTFBase85(); -static unsigned int Decode85Byte(char c) { return c >= '\\' ? c-36 : c-35; } -static void Decode85(const unsigned char* src, unsigned char* dst) -{ - while (*src) - { - unsigned int tmp = Decode85Byte(src[0]) + 85*(Decode85Byte(src[1]) + 85*(Decode85Byte(src[2]) + 85*(Decode85Byte(src[3]) + 85*Decode85Byte(src[4])))); - dst[0] = ((tmp >> 0) & 0xFF); dst[1] = ((tmp >> 8) & 0xFF); dst[2] = ((tmp >> 16) & 0xFF); dst[3] = ((tmp >> 24) & 0xFF); // We can't assume little-endianness. - src += 5; - dst += 4; - } -} - -// Load embedded ProggyClean.ttf at size 13, disable oversampling -ImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template) -{ - ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); - if (!font_cfg_template) - { - font_cfg.OversampleH = font_cfg.OversampleV = 1; - font_cfg.PixelSnapH = true; - } - if (font_cfg.Name[0] == '\0') strcpy(font_cfg.Name, "ProggyClean.ttf, 13px"); - if (font_cfg.SizePixels <= 0.0f) font_cfg.SizePixels = 13.0f; - - const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85(); - ImFont* font = AddFontFromMemoryCompressedBase85TTF(ttf_compressed_base85, font_cfg.SizePixels, &font_cfg, GetGlyphRangesDefault()); - return font; -} - -ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) -{ - int data_size = 0; - void* data = ImFileLoadToMemory(filename, "rb", &data_size, 0); - if (!data) - { - IM_ASSERT(0); // Could not load file. - return NULL; - } - ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); - if (font_cfg.Name[0] == '\0') - { - // Store a short copy of filename into into the font name for convenience - const char* p; - for (p = filename + strlen(filename); p > filename && p[-1] != '/' && p[-1] != '\\'; p--) {} - snprintf(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "%s, %.0fpx", p, size_pixels); - } - return AddFontFromMemoryTTF(data, data_size, size_pixels, &font_cfg, glyph_ranges); -} - -// NB: Transfer ownership of 'ttf_data' to ImFontAtlas, unless font_cfg_template->FontDataOwnedByAtlas == false. Owned TTF buffer will be deleted after Build(). -ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) -{ - ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); - IM_ASSERT(font_cfg.FontData == NULL); - font_cfg.FontData = ttf_data; - font_cfg.FontDataSize = ttf_size; - font_cfg.SizePixels = size_pixels; - if (glyph_ranges) - font_cfg.GlyphRanges = glyph_ranges; - return AddFont(&font_cfg); -} - -ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_data, int compressed_ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) -{ - const unsigned int buf_decompressed_size = stb_decompress_length((unsigned char*)compressed_ttf_data); - unsigned char* buf_decompressed_data = (unsigned char *)ImGui::MemAlloc(buf_decompressed_size); - stb_decompress(buf_decompressed_data, (unsigned char*)compressed_ttf_data, (unsigned int)compressed_ttf_size); - - ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); - IM_ASSERT(font_cfg.FontData == NULL); - font_cfg.FontDataOwnedByAtlas = true; - return AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, size_pixels, &font_cfg, glyph_ranges); -} - -ImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges) -{ - int compressed_ttf_size = (((int)strlen(compressed_ttf_data_base85) + 4) / 5) * 4; - void* compressed_ttf = ImGui::MemAlloc((size_t)compressed_ttf_size); - Decode85((const unsigned char*)compressed_ttf_data_base85, (unsigned char*)compressed_ttf); - ImFont* font = AddFontFromMemoryCompressedTTF(compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges); - ImGui::MemFree(compressed_ttf); - return font; -} - -int ImFontAtlas::AddCustomRectRegular(unsigned int id, int width, int height) -{ - IM_ASSERT(id >= 0x10000); - IM_ASSERT(width > 0 && width <= 0xFFFF); - IM_ASSERT(height > 0 && height <= 0xFFFF); - CustomRect r; - r.ID = id; - r.Width = (unsigned short)width; - r.Height = (unsigned short)height; - CustomRects.push_back(r); - return CustomRects.Size - 1; // Return index -} - -int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset) -{ - IM_ASSERT(font != NULL); - IM_ASSERT(width > 0 && width <= 0xFFFF); - IM_ASSERT(height > 0 && height <= 0xFFFF); - CustomRect r; - r.ID = id; - r.Width = (unsigned short)width; - r.Height = (unsigned short)height; - r.GlyphAdvanceX = advance_x; - r.GlyphOffset = offset; - r.Font = font; - CustomRects.push_back(r); - return CustomRects.Size - 1; // Return index -} - -void ImFontAtlas::CalcCustomRectUV(const CustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) -{ - IM_ASSERT(TexWidth > 0 && TexHeight > 0); // Font atlas needs to be built before we can calculate UV coordinates - IM_ASSERT(rect->IsPacked()); // Make sure the rectangle has been packed - *out_uv_min = ImVec2((float)rect->X / TexWidth, (float)rect->Y / TexHeight); - *out_uv_max = ImVec2((float)(rect->X + rect->Width) / TexWidth, (float)(rect->Y + rect->Height) / TexHeight); -} - -bool ImFontAtlas::Build() -{ - return ImFontAtlasBuildWithStbTruetype(this); -} - -void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_brighten_factor) -{ - for (unsigned int i = 0; i < 256; i++) - { - unsigned int value = (unsigned int)(i * in_brighten_factor); - out_table[i] = value > 255 ? 255 : (value & 0xFF); - } -} - -void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride) -{ - unsigned char* data = pixels + x + y * stride; - for (int j = h; j > 0; j--, data += stride) - for (int i = 0; i < w; i++) - data[i] = table[data[i]]; -} - -bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) -{ - IM_ASSERT(atlas->ConfigData.Size > 0); - - ImFontAtlasBuildRegisterDefaultCustomRects(atlas); - - atlas->TexID = NULL; - atlas->TexWidth = atlas->TexHeight = 0; - atlas->TexUvWhitePixel = ImVec2(0, 0); - atlas->ClearTexData(); - - // Count glyphs/ranges - int total_glyphs_count = 0; - int total_ranges_count = 0; - for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++) - { - ImFontConfig& cfg = atlas->ConfigData[input_i]; - if (!cfg.GlyphRanges) - cfg.GlyphRanges = atlas->GetGlyphRangesDefault(); - for (const ImWchar* in_range = cfg.GlyphRanges; in_range[0] && in_range[1]; in_range += 2, total_ranges_count++) - total_glyphs_count += (in_range[1] - in_range[0]) + 1; - } - - // We need a width for the skyline algorithm. Using a dumb heuristic here to decide of width. User can override TexDesiredWidth and TexGlyphPadding if they wish. - // Width doesn't really matter much, but some API/GPU have texture size limitations and increasing width can decrease height. - atlas->TexWidth = (atlas->TexDesiredWidth > 0) ? atlas->TexDesiredWidth : (total_glyphs_count > 4000) ? 4096 : (total_glyphs_count > 2000) ? 2048 : (total_glyphs_count > 1000) ? 1024 : 512; - atlas->TexHeight = 0; - - // Start packing - const int max_tex_height = 1024*32; - stbtt_pack_context spc = {}; - stbtt_PackBegin(&spc, NULL, atlas->TexWidth, max_tex_height, 0, atlas->TexGlyphPadding, NULL); - stbtt_PackSetOversampling(&spc, 1, 1); - - // Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values). - ImFontAtlasBuildPackCustomRects(atlas, spc.pack_info); - - // Initialize font information (so we can error without any cleanup) - struct ImFontTempBuildData - { - stbtt_fontinfo FontInfo; - stbrp_rect* Rects; - int RectsCount; - stbtt_pack_range* Ranges; - int RangesCount; - }; - ImFontTempBuildData* tmp_array = (ImFontTempBuildData*)ImGui::MemAlloc((size_t)atlas->ConfigData.Size * sizeof(ImFontTempBuildData)); - for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++) - { - ImFontConfig& cfg = atlas->ConfigData[input_i]; - ImFontTempBuildData& tmp = tmp_array[input_i]; - IM_ASSERT(cfg.DstFont && (!cfg.DstFont->IsLoaded() || cfg.DstFont->ContainerAtlas == atlas)); - - const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo); - IM_ASSERT(font_offset >= 0); - if (!stbtt_InitFont(&tmp.FontInfo, (unsigned char*)cfg.FontData, font_offset)) - { - ImGui::MemFree(tmp_array); - return false; - } - } - - // Allocate packing character data and flag packed characters buffer as non-packed (x0=y0=x1=y1=0) - int buf_packedchars_n = 0, buf_rects_n = 0, buf_ranges_n = 0; - stbtt_packedchar* buf_packedchars = (stbtt_packedchar*)ImGui::MemAlloc(total_glyphs_count * sizeof(stbtt_packedchar)); - stbrp_rect* buf_rects = (stbrp_rect*)ImGui::MemAlloc(total_glyphs_count * sizeof(stbrp_rect)); - stbtt_pack_range* buf_ranges = (stbtt_pack_range*)ImGui::MemAlloc(total_ranges_count * sizeof(stbtt_pack_range)); - memset(buf_packedchars, 0, total_glyphs_count * sizeof(stbtt_packedchar)); - memset(buf_rects, 0, total_glyphs_count * sizeof(stbrp_rect)); // Unnecessary but let's clear this for the sake of sanity. - memset(buf_ranges, 0, total_ranges_count * sizeof(stbtt_pack_range)); - - // First font pass: pack all glyphs (no rendering at this point, we are working with rectangles in an infinitely tall texture at this point) - for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++) - { - ImFontConfig& cfg = atlas->ConfigData[input_i]; - ImFontTempBuildData& tmp = tmp_array[input_i]; - - // Setup ranges - int font_glyphs_count = 0; - int font_ranges_count = 0; - for (const ImWchar* in_range = cfg.GlyphRanges; in_range[0] && in_range[1]; in_range += 2, font_ranges_count++) - font_glyphs_count += (in_range[1] - in_range[0]) + 1; - tmp.Ranges = buf_ranges + buf_ranges_n; - tmp.RangesCount = font_ranges_count; - buf_ranges_n += font_ranges_count; - for (int i = 0; i < font_ranges_count; i++) - { - const ImWchar* in_range = &cfg.GlyphRanges[i * 2]; - stbtt_pack_range& range = tmp.Ranges[i]; - range.font_size = cfg.SizePixels; - range.first_unicode_codepoint_in_range = in_range[0]; - range.num_chars = (in_range[1] - in_range[0]) + 1; - range.chardata_for_range = buf_packedchars + buf_packedchars_n; - buf_packedchars_n += range.num_chars; - } - - // Pack - tmp.Rects = buf_rects + buf_rects_n; - tmp.RectsCount = font_glyphs_count; - buf_rects_n += font_glyphs_count; - stbtt_PackSetOversampling(&spc, cfg.OversampleH, cfg.OversampleV); - int n = stbtt_PackFontRangesGatherRects(&spc, &tmp.FontInfo, tmp.Ranges, tmp.RangesCount, tmp.Rects); - IM_ASSERT(n == font_glyphs_count); - stbrp_pack_rects((stbrp_context*)spc.pack_info, tmp.Rects, n); - - // Extend texture height - for (int i = 0; i < n; i++) - if (tmp.Rects[i].was_packed) - atlas->TexHeight = ImMax(atlas->TexHeight, tmp.Rects[i].y + tmp.Rects[i].h); - } - IM_ASSERT(buf_rects_n == total_glyphs_count); - IM_ASSERT(buf_packedchars_n == total_glyphs_count); - IM_ASSERT(buf_ranges_n == total_ranges_count); - - // Create texture - atlas->TexHeight = ImUpperPowerOfTwo(atlas->TexHeight); - atlas->TexPixelsAlpha8 = (unsigned char*)ImGui::MemAlloc(atlas->TexWidth * atlas->TexHeight); - memset(atlas->TexPixelsAlpha8, 0, atlas->TexWidth * atlas->TexHeight); - spc.pixels = atlas->TexPixelsAlpha8; - spc.height = atlas->TexHeight; - - // Second pass: render font characters - for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++) - { - ImFontConfig& cfg = atlas->ConfigData[input_i]; - ImFontTempBuildData& tmp = tmp_array[input_i]; - stbtt_PackSetOversampling(&spc, cfg.OversampleH, cfg.OversampleV); - stbtt_PackFontRangesRenderIntoRects(&spc, &tmp.FontInfo, tmp.Ranges, tmp.RangesCount, tmp.Rects); - if (cfg.RasterizerMultiply != 1.0f) - { - unsigned char multiply_table[256]; - ImFontAtlasBuildMultiplyCalcLookupTable(multiply_table, cfg.RasterizerMultiply); - for (const stbrp_rect* r = tmp.Rects; r != tmp.Rects + tmp.RectsCount; r++) - if (r->was_packed) - ImFontAtlasBuildMultiplyRectAlpha8(multiply_table, spc.pixels, r->x, r->y, r->w, r->h, spc.stride_in_bytes); - } - tmp.Rects = NULL; - } - - // End packing - stbtt_PackEnd(&spc); - ImGui::MemFree(buf_rects); - buf_rects = NULL; - - // Third pass: setup ImFont and glyphs for runtime - for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++) - { - ImFontConfig& cfg = atlas->ConfigData[input_i]; - ImFontTempBuildData& tmp = tmp_array[input_i]; - ImFont* dst_font = cfg.DstFont; // We can have multiple input fonts writing into a same destination font (when using MergeMode=true) - - const float font_scale = stbtt_ScaleForPixelHeight(&tmp.FontInfo, cfg.SizePixels); - int unscaled_ascent, unscaled_descent, unscaled_line_gap; - stbtt_GetFontVMetrics(&tmp.FontInfo, &unscaled_ascent, &unscaled_descent, &unscaled_line_gap); - - const float ascent = unscaled_ascent * font_scale; - const float descent = unscaled_descent * font_scale; - ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent); - const float off_x = cfg.GlyphOffset.x; - const float off_y = cfg.GlyphOffset.y + (float)(int)(dst_font->Ascent + 0.5f); - - for (int i = 0; i < tmp.RangesCount; i++) - { - stbtt_pack_range& range = tmp.Ranges[i]; - for (int char_idx = 0; char_idx < range.num_chars; char_idx += 1) - { - const stbtt_packedchar& pc = range.chardata_for_range[char_idx]; - if (!pc.x0 && !pc.x1 && !pc.y0 && !pc.y1) - continue; - - const int codepoint = range.first_unicode_codepoint_in_range + char_idx; - if (cfg.MergeMode && dst_font->FindGlyph((unsigned short)codepoint)) - continue; - - stbtt_aligned_quad q; - float dummy_x = 0.0f, dummy_y = 0.0f; - stbtt_GetPackedQuad(range.chardata_for_range, atlas->TexWidth, atlas->TexHeight, char_idx, &dummy_x, &dummy_y, &q, 0); - dst_font->AddGlyph((ImWchar)codepoint, q.x0 + off_x, q.y0 + off_y, q.x1 + off_x, q.y1 + off_y, q.s0, q.t0, q.s1, q.t1, pc.xadvance); - } - } - } - - // Cleanup temporaries - ImGui::MemFree(buf_packedchars); - ImGui::MemFree(buf_ranges); - ImGui::MemFree(tmp_array); - - ImFontAtlasBuildFinish(atlas); - - return true; -} - -void ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas) -{ - if (atlas->CustomRectIds[0] < 0) - atlas->CustomRectIds[0] = atlas->AddCustomRectRegular(FONT_ATLAS_DEFAULT_TEX_DATA_ID, FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF*2+1, FONT_ATLAS_DEFAULT_TEX_DATA_H); -} - -void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent) -{ - if (!font_config->MergeMode) - { - font->ClearOutputData(); - font->FontSize = font_config->SizePixels; - font->ConfigData = font_config; - font->ContainerAtlas = atlas; - font->Ascent = ascent; - font->Descent = descent; - } - font->ConfigDataCount++; -} - -void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* pack_context_opaque) -{ - stbrp_context* pack_context = (stbrp_context*)pack_context_opaque; - - ImVector& user_rects = atlas->CustomRects; - IM_ASSERT(user_rects.Size >= 1); // We expect at least the default custom rects to be registered, else something went wrong. - - ImVector pack_rects; - pack_rects.resize(user_rects.Size); - memset(pack_rects.Data, 0, sizeof(stbrp_rect) * user_rects.Size); - for (int i = 0; i < user_rects.Size; i++) - { - pack_rects[i].w = user_rects[i].Width; - pack_rects[i].h = user_rects[i].Height; - } - stbrp_pack_rects(pack_context, &pack_rects[0], pack_rects.Size); - for (int i = 0; i < pack_rects.Size; i++) - if (pack_rects[i].was_packed) - { - user_rects[i].X = pack_rects[i].x; - user_rects[i].Y = pack_rects[i].y; - IM_ASSERT(pack_rects[i].w == user_rects[i].Width && pack_rects[i].h == user_rects[i].Height); - atlas->TexHeight = ImMax(atlas->TexHeight, pack_rects[i].y + pack_rects[i].h); - } -} - -static void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas) -{ - IM_ASSERT(atlas->CustomRectIds[0] >= 0); - ImFontAtlas::CustomRect& r = atlas->CustomRects[atlas->CustomRectIds[0]]; - IM_ASSERT(r.ID == FONT_ATLAS_DEFAULT_TEX_DATA_ID); - IM_ASSERT(r.Width == FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF*2+1); - IM_ASSERT(r.Height == FONT_ATLAS_DEFAULT_TEX_DATA_H); - IM_ASSERT(r.IsPacked()); - IM_ASSERT(atlas->TexPixelsAlpha8 != NULL); - - // Render/copy pixels - for (int y = 0, n = 0; y < FONT_ATLAS_DEFAULT_TEX_DATA_H; y++) - for (int x = 0; x < FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF; x++, n++) - { - const int offset0 = (int)(r.X + x) + (int)(r.Y + y) * atlas->TexWidth; - const int offset1 = offset0 + FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF + 1; - atlas->TexPixelsAlpha8[offset0] = FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[n] == '.' ? 0xFF : 0x00; - atlas->TexPixelsAlpha8[offset1] = FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[n] == 'X' ? 0xFF : 0x00; - } - const ImVec2 tex_uv_scale(1.0f / atlas->TexWidth, 1.0f / atlas->TexHeight); - atlas->TexUvWhitePixel = ImVec2((r.X + 0.5f) * tex_uv_scale.x, (r.Y + 0.5f) * tex_uv_scale.y); - - // Setup mouse cursors - for (int type = 0; type < ImGuiMouseCursor_Count_; type++) - { - ImGuiMouseCursorData& cursor_data = GImGui->MouseCursorData[type]; - ImVec2 pos = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[type][0] + ImVec2((float)r.X, (float)r.Y); - const ImVec2 size = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[type][1]; - cursor_data.Type = type; - cursor_data.Size = size; - cursor_data.HotOffset = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[type][2]; - cursor_data.TexUvMin[0] = (pos) * tex_uv_scale; - cursor_data.TexUvMax[0] = (pos + size) * tex_uv_scale; - pos.x += FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF + 1; - cursor_data.TexUvMin[1] = (pos) * tex_uv_scale; - cursor_data.TexUvMax[1] = (pos + size) * tex_uv_scale; - } -} - -void ImFontAtlasBuildFinish(ImFontAtlas* atlas) -{ - // Render into our custom data block - ImFontAtlasBuildRenderDefaultTexData(atlas); - - // Register custom rectangle glyphs - for (int i = 0; i < atlas->CustomRects.Size; i++) - { - const ImFontAtlas::CustomRect& r = atlas->CustomRects[i]; - if (r.Font == NULL || r.ID > 0x10000) - continue; - - IM_ASSERT(r.Font->ContainerAtlas == atlas); - ImVec2 uv0, uv1; - atlas->CalcCustomRectUV(&r, &uv0, &uv1); - r.Font->AddGlyph((ImWchar)r.ID, r.GlyphOffset.x, r.GlyphOffset.y, r.GlyphOffset.x + r.Width, r.GlyphOffset.y + r.Height, uv0.x, uv0.y, uv1.x, uv1.y, r.GlyphAdvanceX); - } - - // Build all fonts lookup tables - for (int i = 0; i < atlas->Fonts.Size; i++) - atlas->Fonts[i]->BuildLookupTable(); -} - -// Retrieve list of range (2 int per range, values are inclusive) -const ImWchar* ImFontAtlas::GetGlyphRangesDefault() -{ - static const ImWchar ranges[] = - { - 0x0020, 0x00FF, // Basic Latin + Latin Supplement - 0, - }; - return &ranges[0]; -} - -const ImWchar* ImFontAtlas::GetGlyphRangesKorean() -{ - static const ImWchar ranges[] = - { - 0x0020, 0x00FF, // Basic Latin + Latin Supplement - 0x3131, 0x3163, // Korean alphabets - 0xAC00, 0xD79D, // Korean characters - 0, - }; - return &ranges[0]; -} - -const ImWchar* ImFontAtlas::GetGlyphRangesChinese() -{ - static const ImWchar ranges[] = - { - 0x0020, 0x00FF, // Basic Latin + Latin Supplement - 0x3000, 0x30FF, // Punctuations, Hiragana, Katakana - 0x31F0, 0x31FF, // Katakana Phonetic Extensions - 0xFF00, 0xFFEF, // Half-width characters - 0x4e00, 0x9FAF, // CJK Ideograms - 0, - }; - return &ranges[0]; -} - -const ImWchar* ImFontAtlas::GetGlyphRangesJapanese() -{ - // Store the 1946 ideograms code points as successive offsets from the initial unicode codepoint 0x4E00. Each offset has an implicit +1. - // This encoding is designed to helps us reduce the source code size. - // FIXME: Source a list of the revised 2136 joyo kanji list from 2010 and rebuild this. - // The current list was sourced from http://theinstructionlimit.com/author/renaudbedardrenaudbedard/page/3 - // Note that you may use ImFontAtlas::GlyphRangesBuilder to create your own ranges, by merging existing ranges or adding new characters. - static const short offsets_from_0x4E00[] = - { - -1,0,1,3,0,0,0,0,1,0,5,1,1,0,7,4,6,10,0,1,9,9,7,1,3,19,1,10,7,1,0,1,0,5,1,0,6,4,2,6,0,0,12,6,8,0,3,5,0,1,0,9,0,0,8,1,1,3,4,5,13,0,0,8,2,17, - 4,3,1,1,9,6,0,0,0,2,1,3,2,22,1,9,11,1,13,1,3,12,0,5,9,2,0,6,12,5,3,12,4,1,2,16,1,1,4,6,5,3,0,6,13,15,5,12,8,14,0,0,6,15,3,6,0,18,8,1,6,14,1, - 5,4,12,24,3,13,12,10,24,0,0,0,1,0,1,1,2,9,10,2,2,0,0,3,3,1,0,3,8,0,3,2,4,4,1,6,11,10,14,6,15,3,4,15,1,0,0,5,2,2,0,0,1,6,5,5,6,0,3,6,5,0,0,1,0, - 11,2,2,8,4,7,0,10,0,1,2,17,19,3,0,2,5,0,6,2,4,4,6,1,1,11,2,0,3,1,2,1,2,10,7,6,3,16,0,8,24,0,0,3,1,1,3,0,1,6,0,0,0,2,0,1,5,15,0,1,0,0,2,11,19, - 1,4,19,7,6,5,1,0,0,0,0,5,1,0,1,9,0,0,5,0,2,0,1,0,3,0,11,3,0,2,0,0,0,0,0,9,3,6,4,12,0,14,0,0,29,10,8,0,14,37,13,0,31,16,19,0,8,30,1,20,8,3,48, - 21,1,0,12,0,10,44,34,42,54,11,18,82,0,2,1,2,12,1,0,6,2,17,2,12,7,0,7,17,4,2,6,24,23,8,23,39,2,16,23,1,0,5,1,2,15,14,5,6,2,11,0,8,6,2,2,2,14, - 20,4,15,3,4,11,10,10,2,5,2,1,30,2,1,0,0,22,5,5,0,3,1,5,4,1,0,0,2,2,21,1,5,1,2,16,2,1,3,4,0,8,4,0,0,5,14,11,2,16,1,13,1,7,0,22,15,3,1,22,7,14, - 22,19,11,24,18,46,10,20,64,45,3,2,0,4,5,0,1,4,25,1,0,0,2,10,0,0,0,1,0,1,2,0,0,9,1,2,0,0,0,2,5,2,1,1,5,5,8,1,1,1,5,1,4,9,1,3,0,1,0,1,1,2,0,0, - 2,0,1,8,22,8,1,0,0,0,0,4,2,1,0,9,8,5,0,9,1,30,24,2,6,4,39,0,14,5,16,6,26,179,0,2,1,1,0,0,0,5,2,9,6,0,2,5,16,7,5,1,1,0,2,4,4,7,15,13,14,0,0, - 3,0,1,0,0,0,2,1,6,4,5,1,4,9,0,3,1,8,0,0,10,5,0,43,0,2,6,8,4,0,2,0,0,9,6,0,9,3,1,6,20,14,6,1,4,0,7,2,3,0,2,0,5,0,3,1,0,3,9,7,0,3,4,0,4,9,1,6,0, - 9,0,0,2,3,10,9,28,3,6,2,4,1,2,32,4,1,18,2,0,3,1,5,30,10,0,2,2,2,0,7,9,8,11,10,11,7,2,13,7,5,10,0,3,40,2,0,1,6,12,0,4,5,1,5,11,11,21,4,8,3,7, - 8,8,33,5,23,0,0,19,8,8,2,3,0,6,1,1,1,5,1,27,4,2,5,0,3,5,6,3,1,0,3,1,12,5,3,3,2,0,7,7,2,1,0,4,0,1,1,2,0,10,10,6,2,5,9,7,5,15,15,21,6,11,5,20, - 4,3,5,5,2,5,0,2,1,0,1,7,28,0,9,0,5,12,5,5,18,30,0,12,3,3,21,16,25,32,9,3,14,11,24,5,66,9,1,2,0,5,9,1,5,1,8,0,8,3,3,0,1,15,1,4,8,1,2,7,0,7,2, - 8,3,7,5,3,7,10,2,1,0,0,2,25,0,6,4,0,10,0,4,2,4,1,12,5,38,4,0,4,1,10,5,9,4,0,14,4,2,5,18,20,21,1,3,0,5,0,7,0,3,7,1,3,1,1,8,1,0,0,0,3,2,5,2,11, - 6,0,13,1,3,9,1,12,0,16,6,2,1,0,2,1,12,6,13,11,2,0,28,1,7,8,14,13,8,13,0,2,0,5,4,8,10,2,37,42,19,6,6,7,4,14,11,18,14,80,7,6,0,4,72,12,36,27, - 7,7,0,14,17,19,164,27,0,5,10,7,3,13,6,14,0,2,2,5,3,0,6,13,0,0,10,29,0,4,0,3,13,0,3,1,6,51,1,5,28,2,0,8,0,20,2,4,0,25,2,10,13,10,0,16,4,0,1,0, - 2,1,7,0,1,8,11,0,0,1,2,7,2,23,11,6,6,4,16,2,2,2,0,22,9,3,3,5,2,0,15,16,21,2,9,20,15,15,5,3,9,1,0,0,1,7,7,5,4,2,2,2,38,24,14,0,0,15,5,6,24,14, - 5,5,11,0,21,12,0,3,8,4,11,1,8,0,11,27,7,2,4,9,21,59,0,1,39,3,60,62,3,0,12,11,0,3,30,11,0,13,88,4,15,5,28,13,1,4,48,17,17,4,28,32,46,0,16,0, - 18,11,1,8,6,38,11,2,6,11,38,2,0,45,3,11,2,7,8,4,30,14,17,2,1,1,65,18,12,16,4,2,45,123,12,56,33,1,4,3,4,7,0,0,0,3,2,0,16,4,2,4,2,0,7,4,5,2,26, - 2,25,6,11,6,1,16,2,6,17,77,15,3,35,0,1,0,5,1,0,38,16,6,3,12,3,3,3,0,9,3,1,3,5,2,9,0,18,0,25,1,3,32,1,72,46,6,2,7,1,3,14,17,0,28,1,40,13,0,20, - 15,40,6,38,24,12,43,1,1,9,0,12,6,0,6,2,4,19,3,7,1,48,0,9,5,0,5,6,9,6,10,15,2,11,19,3,9,2,0,1,10,1,27,8,1,3,6,1,14,0,26,0,27,16,3,4,9,6,2,23, - 9,10,5,25,2,1,6,1,1,48,15,9,15,14,3,4,26,60,29,13,37,21,1,6,4,0,2,11,22,23,16,16,2,2,1,3,0,5,1,6,4,0,0,4,0,0,8,3,0,2,5,0,7,1,7,3,13,2,4,10, - 3,0,2,31,0,18,3,0,12,10,4,1,0,7,5,7,0,5,4,12,2,22,10,4,2,15,2,8,9,0,23,2,197,51,3,1,1,4,13,4,3,21,4,19,3,10,5,40,0,4,1,1,10,4,1,27,34,7,21, - 2,17,2,9,6,4,2,3,0,4,2,7,8,2,5,1,15,21,3,4,4,2,2,17,22,1,5,22,4,26,7,0,32,1,11,42,15,4,1,2,5,0,19,3,1,8,6,0,10,1,9,2,13,30,8,2,24,17,19,1,4, - 4,25,13,0,10,16,11,39,18,8,5,30,82,1,6,8,18,77,11,13,20,75,11,112,78,33,3,0,0,60,17,84,9,1,1,12,30,10,49,5,32,158,178,5,5,6,3,3,1,3,1,4,7,6, - 19,31,21,0,2,9,5,6,27,4,9,8,1,76,18,12,1,4,0,3,3,6,3,12,2,8,30,16,2,25,1,5,5,4,3,0,6,10,2,3,1,0,5,1,19,3,0,8,1,5,2,6,0,0,0,19,1,2,0,5,1,2,5, - 1,3,7,0,4,12,7,3,10,22,0,9,5,1,0,2,20,1,1,3,23,30,3,9,9,1,4,191,14,3,15,6,8,50,0,1,0,0,4,0,0,1,0,2,4,2,0,2,3,0,2,0,2,2,8,7,0,1,1,1,3,3,17,11, - 91,1,9,3,2,13,4,24,15,41,3,13,3,1,20,4,125,29,30,1,0,4,12,2,21,4,5,5,19,11,0,13,11,86,2,18,0,7,1,8,8,2,2,22,1,2,6,5,2,0,1,2,8,0,2,0,5,2,1,0, - 2,10,2,0,5,9,2,1,2,0,1,0,4,0,0,10,2,5,3,0,6,1,0,1,4,4,33,3,13,17,3,18,6,4,7,1,5,78,0,4,1,13,7,1,8,1,0,35,27,15,3,0,0,0,1,11,5,41,38,15,22,6, - 14,14,2,1,11,6,20,63,5,8,27,7,11,2,2,40,58,23,50,54,56,293,8,8,1,5,1,14,0,1,12,37,89,8,8,8,2,10,6,0,0,0,4,5,2,1,0,1,1,2,7,0,3,3,0,4,6,0,3,2, - 19,3,8,0,0,0,4,4,16,0,4,1,5,1,3,0,3,4,6,2,17,10,10,31,6,4,3,6,10,126,7,3,2,2,0,9,0,0,5,20,13,0,15,0,6,0,2,5,8,64,50,3,2,12,2,9,0,0,11,8,20, - 109,2,18,23,0,0,9,61,3,0,28,41,77,27,19,17,81,5,2,14,5,83,57,252,14,154,263,14,20,8,13,6,57,39,38, - }; - static ImWchar base_ranges[] = - { - 0x0020, 0x00FF, // Basic Latin + Latin Supplement - 0x3000, 0x30FF, // Punctuations, Hiragana, Katakana - 0x31F0, 0x31FF, // Katakana Phonetic Extensions - 0xFF00, 0xFFEF, // Half-width characters - }; - static bool full_ranges_unpacked = false; - static ImWchar full_ranges[IM_ARRAYSIZE(base_ranges) + IM_ARRAYSIZE(offsets_from_0x4E00)*2 + 1]; - if (!full_ranges_unpacked) - { - // Unpack - int codepoint = 0x4e00; - memcpy(full_ranges, base_ranges, sizeof(base_ranges)); - ImWchar* dst = full_ranges + IM_ARRAYSIZE(base_ranges);; - for (int n = 0; n < IM_ARRAYSIZE(offsets_from_0x4E00); n++, dst += 2) - dst[0] = dst[1] = (ImWchar)(codepoint += (offsets_from_0x4E00[n] + 1)); - dst[0] = 0; - full_ranges_unpacked = true; - } - return &full_ranges[0]; -} - -const ImWchar* ImFontAtlas::GetGlyphRangesCyrillic() -{ - static const ImWchar ranges[] = - { - 0x0020, 0x00FF, // Basic Latin + Latin Supplement - 0x0400, 0x052F, // Cyrillic + Cyrillic Supplement - 0x2DE0, 0x2DFF, // Cyrillic Extended-A - 0xA640, 0xA69F, // Cyrillic Extended-B - 0, - }; - return &ranges[0]; -} - -const ImWchar* ImFontAtlas::GetGlyphRangesThai() -{ - static const ImWchar ranges[] = - { - 0x0020, 0x00FF, // Basic Latin - 0x2010, 0x205E, // Punctuations - 0x0E00, 0x0E7F, // Thai - 0, - }; - return &ranges[0]; -} - -//----------------------------------------------------------------------------- -// ImFontAtlas::GlyphRangesBuilder -//----------------------------------------------------------------------------- - -void ImFontAtlas::GlyphRangesBuilder::AddText(const char* text, const char* text_end) -{ - while (text_end ? (text < text_end) : *text) - { - unsigned int c = 0; - int c_len = ImTextCharFromUtf8(&c, text, text_end); - text += c_len; - if (c_len == 0) - break; - if (c < 0x10000) - AddChar((ImWchar)c); - } -} - -void ImFontAtlas::GlyphRangesBuilder::AddRanges(const ImWchar* ranges) -{ - for (; ranges[0]; ranges += 2) - for (ImWchar c = ranges[0]; c <= ranges[1]; c++) - AddChar(c); -} - -void ImFontAtlas::GlyphRangesBuilder::BuildRanges(ImVector* out_ranges) -{ - for (int n = 0; n < 0x10000; n++) - if (GetBit(n)) - { - out_ranges->push_back((ImWchar)n); - while (n < 0x10000 && GetBit(n + 1)) - n++; - out_ranges->push_back((ImWchar)n); - } - out_ranges->push_back(0); -} - -//----------------------------------------------------------------------------- -// ImFont -//----------------------------------------------------------------------------- - -ImFont::ImFont() -{ - Scale = 1.0f; - FallbackChar = (ImWchar)'?'; - DisplayOffset = ImVec2(0.0f, 1.0f); - ClearOutputData(); -} - -ImFont::~ImFont() -{ - // Invalidate active font so that the user gets a clear crash instead of a dangling pointer. - // If you want to delete fonts you need to do it between Render() and NewFrame(). - // FIXME-CLEANUP - /* - ImGuiContext& g = *GImGui; - if (g.Font == this) - g.Font = NULL; - */ - ClearOutputData(); -} - -void ImFont::ClearOutputData() -{ - FontSize = 0.0f; - Glyphs.clear(); - IndexAdvanceX.clear(); - IndexLookup.clear(); - FallbackGlyph = NULL; - FallbackAdvanceX = 0.0f; - ConfigDataCount = 0; - ConfigData = NULL; - ContainerAtlas = NULL; - Ascent = Descent = 0.0f; - MetricsTotalSurface = 0; -} - -void ImFont::BuildLookupTable() -{ - int max_codepoint = 0; - for (int i = 0; i != Glyphs.Size; i++) - max_codepoint = ImMax(max_codepoint, (int)Glyphs[i].Codepoint); - - IM_ASSERT(Glyphs.Size < 0xFFFF); // -1 is reserved - IndexAdvanceX.clear(); - IndexLookup.clear(); - GrowIndex(max_codepoint + 1); - for (int i = 0; i < Glyphs.Size; i++) - { - int codepoint = (int)Glyphs[i].Codepoint; - IndexAdvanceX[codepoint] = Glyphs[i].AdvanceX; - IndexLookup[codepoint] = (unsigned short)i; - } - - // Create a glyph to handle TAB - // FIXME: Needs proper TAB handling but it needs to be contextualized (or we could arbitrary say that each string starts at "column 0" ?) - if (FindGlyph((unsigned short)' ')) - { - if (Glyphs.back().Codepoint != '\t') // So we can call this function multiple times - Glyphs.resize(Glyphs.Size + 1); - ImFontGlyph& tab_glyph = Glyphs.back(); - tab_glyph = *FindGlyph((unsigned short)' '); - tab_glyph.Codepoint = '\t'; - tab_glyph.AdvanceX *= 4; - IndexAdvanceX[(int)tab_glyph.Codepoint] = (float)tab_glyph.AdvanceX; - IndexLookup[(int)tab_glyph.Codepoint] = (unsigned short)(Glyphs.Size-1); - } - - FallbackGlyph = NULL; - FallbackGlyph = FindGlyph(FallbackChar); - FallbackAdvanceX = FallbackGlyph ? FallbackGlyph->AdvanceX : 0.0f; - for (int i = 0; i < max_codepoint + 1; i++) - if (IndexAdvanceX[i] < 0.0f) - IndexAdvanceX[i] = FallbackAdvanceX; -} - -void ImFont::SetFallbackChar(ImWchar c) -{ - FallbackChar = c; - BuildLookupTable(); -} - -void ImFont::GrowIndex(int new_size) -{ - IM_ASSERT(IndexAdvanceX.Size == IndexLookup.Size); - if (new_size <= IndexLookup.Size) - return; - IndexAdvanceX.resize(new_size, -1.0f); - IndexLookup.resize(new_size, (unsigned short)-1); -} - -void ImFont::AddGlyph(ImWchar codepoint, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x) -{ - Glyphs.resize(Glyphs.Size + 1); - ImFontGlyph& glyph = Glyphs.back(); - glyph.Codepoint = (ImWchar)codepoint; - glyph.X0 = x0; - glyph.Y0 = y0; - glyph.X1 = x1; - glyph.Y1 = y1; - glyph.U0 = u0; - glyph.V0 = v0; - glyph.U1 = u1; - glyph.V1 = v1; - glyph.AdvanceX = advance_x + ConfigData->GlyphExtraSpacing.x; // Bake spacing into AdvanceX - - if (ConfigData->PixelSnapH) - glyph.AdvanceX = (float)(int)(glyph.AdvanceX + 0.5f); - - // Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round) - MetricsTotalSurface += (int)((glyph.U1 - glyph.U0) * ContainerAtlas->TexWidth + 1.99f) * (int)((glyph.V1 - glyph.V0) * ContainerAtlas->TexHeight + 1.99f); -} - -void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst) -{ - IM_ASSERT(IndexLookup.Size > 0); // Currently this can only be called AFTER the font has been built, aka after calling ImFontAtlas::GetTexDataAs*() function. - int index_size = IndexLookup.Size; - - if (dst < index_size && IndexLookup.Data[dst] == (unsigned short)-1 && !overwrite_dst) // 'dst' already exists - return; - if (src >= index_size && dst >= index_size) // both 'dst' and 'src' don't exist -> no-op - return; - - GrowIndex(dst + 1); - IndexLookup[dst] = (src < index_size) ? IndexLookup.Data[src] : (unsigned short)-1; - IndexAdvanceX[dst] = (src < index_size) ? IndexAdvanceX.Data[src] : 1.0f; -} - -const ImFontGlyph* ImFont::FindGlyph(ImWchar c) const -{ - if (c < IndexLookup.Size) - { - const unsigned short i = IndexLookup[c]; - if (i != (unsigned short)-1) - return &Glyphs.Data[i]; - } - return FallbackGlyph; -} - -const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const -{ - // Simple word-wrapping for English, not full-featured. Please submit failing cases! - // FIXME: Much possible improvements (don't cut things like "word !", "word!!!" but cut within "word,,,,", more sensible support for punctuations, support for Unicode punctuations, etc.) - - // For references, possible wrap point marked with ^ - // "aaa bbb, ccc,ddd. eee fff. ggg!" - // ^ ^ ^ ^ ^__ ^ ^ - - // List of hardcoded separators: .,;!?'" - - // Skip extra blanks after a line returns (that includes not counting them in width computation) - // e.g. "Hello world" --> "Hello" "World" - - // Cut words that cannot possibly fit within one line. - // e.g.: "The tropical fish" with ~5 characters worth of width --> "The tr" "opical" "fish" - - float line_width = 0.0f; - float word_width = 0.0f; - float blank_width = 0.0f; - wrap_width /= scale; // We work with unscaled widths to avoid scaling every characters - - const char* word_end = text; - const char* prev_word_end = NULL; - bool inside_word = true; - - const char* s = text; - while (s < text_end) - { - unsigned int c = (unsigned int)*s; - const char* next_s; - if (c < 0x80) - next_s = s + 1; - else - next_s = s + ImTextCharFromUtf8(&c, s, text_end); - if (c == 0) - break; - - if (c < 32) - { - if (c == '\n') - { - line_width = word_width = blank_width = 0.0f; - inside_word = true; - s = next_s; - continue; - } - if (c == '\r') - { - s = next_s; - continue; - } - } - - const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX[(int)c] : FallbackAdvanceX); - if (ImCharIsSpace(c)) - { - if (inside_word) - { - line_width += blank_width; - blank_width = 0.0f; - word_end = s; - } - blank_width += char_width; - inside_word = false; - } - else - { - word_width += char_width; - if (inside_word) - { - word_end = next_s; - } - else - { - prev_word_end = word_end; - line_width += word_width + blank_width; - word_width = blank_width = 0.0f; - } - - // Allow wrapping after punctuation. - inside_word = !(c == '.' || c == ',' || c == ';' || c == '!' || c == '?' || c == '\"'); - } - - // We ignore blank width at the end of the line (they can be skipped) - if (line_width + word_width >= wrap_width) - { - // Words that cannot possibly fit within an entire line will be cut anywhere. - if (word_width < wrap_width) - s = prev_word_end ? prev_word_end : word_end; - break; - } - - s = next_s; - } - - return s; -} - -ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end, const char** remaining) const -{ - if (!text_end) - text_end = text_begin + strlen(text_begin); // FIXME-OPT: Need to avoid this. - - const float line_height = size; - const float scale = size / FontSize; - - ImVec2 text_size = ImVec2(0,0); - float line_width = 0.0f; - - const bool word_wrap_enabled = (wrap_width > 0.0f); - const char* word_wrap_eol = NULL; - - const char* s = text_begin; - while (s < text_end) - { - if (word_wrap_enabled) - { - // Calculate how far we can render. Requires two passes on the string data but keeps the code simple and not intrusive for what's essentially an uncommon feature. - if (!word_wrap_eol) - { - word_wrap_eol = CalcWordWrapPositionA(scale, s, text_end, wrap_width - line_width); - if (word_wrap_eol == s) // Wrap_width is too small to fit anything. Force displaying 1 character to minimize the height discontinuity. - word_wrap_eol++; // +1 may not be a character start point in UTF-8 but it's ok because we use s >= word_wrap_eol below - } - - if (s >= word_wrap_eol) - { - if (text_size.x < line_width) - text_size.x = line_width; - text_size.y += line_height; - line_width = 0.0f; - word_wrap_eol = NULL; - - // Wrapping skips upcoming blanks - while (s < text_end) - { - const char c = *s; - if (ImCharIsSpace(c)) { s++; } else if (c == '\n') { s++; break; } else { break; } - } - continue; - } - } - - // Decode and advance source - const char* prev_s = s; - unsigned int c = (unsigned int)*s; - if (c < 0x80) - { - s += 1; - } - else - { - s += ImTextCharFromUtf8(&c, s, text_end); - if (c == 0) // Malformed UTF-8? - break; - } - - if (c < 32) - { - if (c == '\n') - { - text_size.x = ImMax(text_size.x, line_width); - text_size.y += line_height; - line_width = 0.0f; - continue; - } - if (c == '\r') - continue; - } - - const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX[(int)c] : FallbackAdvanceX) * scale; - if (line_width + char_width >= max_width) - { - s = prev_s; - break; - } - - line_width += char_width; - } - - if (text_size.x < line_width) - text_size.x = line_width; - - if (line_width > 0 || text_size.y == 0.0f) - text_size.y += line_height; - - if (remaining) - *remaining = s; - - return text_size; -} - -void ImFont::RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, unsigned short c) const -{ - if (c == ' ' || c == '\t' || c == '\n' || c == '\r') // Match behavior of RenderText(), those 4 codepoints are hard-coded. - return; - if (const ImFontGlyph* glyph = FindGlyph(c)) - { - float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f; - pos.x = (float)(int)pos.x + DisplayOffset.x; - pos.y = (float)(int)pos.y + DisplayOffset.y; - draw_list->PrimReserve(6, 4); - draw_list->PrimRectUV(ImVec2(pos.x + glyph->X0 * scale, pos.y + glyph->Y0 * scale), ImVec2(pos.x + glyph->X1 * scale, pos.y + glyph->Y1 * scale), ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col); - } -} - -void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width, bool cpu_fine_clip) const -{ - if (!text_end) - text_end = text_begin + strlen(text_begin); // ImGui functions generally already provides a valid text_end, so this is merely to handle direct calls. - - // Align to be pixel perfect - pos.x = (float)(int)pos.x + DisplayOffset.x; - pos.y = (float)(int)pos.y + DisplayOffset.y; - float x = pos.x; - float y = pos.y; - if (y > clip_rect.w) - return; - - const float scale = size / FontSize; - const float line_height = FontSize * scale; - const bool word_wrap_enabled = (wrap_width > 0.0f); - const char* word_wrap_eol = NULL; - - // Skip non-visible lines - const char* s = text_begin; - if (!word_wrap_enabled && y + line_height < clip_rect.y) - while (s < text_end && *s != '\n') // Fast-forward to next line - s++; - - // Reserve vertices for remaining worse case (over-reserving is useful and easily amortized) - const int vtx_count_max = (int)(text_end - s) * 4; - const int idx_count_max = (int)(text_end - s) * 6; - const int idx_expected_size = draw_list->IdxBuffer.Size + idx_count_max; - draw_list->PrimReserve(idx_count_max, vtx_count_max); - - ImDrawVert* vtx_write = draw_list->_VtxWritePtr; - ImDrawIdx* idx_write = draw_list->_IdxWritePtr; - unsigned int vtx_current_idx = draw_list->_VtxCurrentIdx; - - while (s < text_end) - { - if (word_wrap_enabled) - { - // Calculate how far we can render. Requires two passes on the string data but keeps the code simple and not intrusive for what's essentially an uncommon feature. - if (!word_wrap_eol) - { - word_wrap_eol = CalcWordWrapPositionA(scale, s, text_end, wrap_width - (x - pos.x)); - if (word_wrap_eol == s) // Wrap_width is too small to fit anything. Force displaying 1 character to minimize the height discontinuity. - word_wrap_eol++; // +1 may not be a character start point in UTF-8 but it's ok because we use s >= word_wrap_eol below - } - - if (s >= word_wrap_eol) - { - x = pos.x; - y += line_height; - word_wrap_eol = NULL; - - // Wrapping skips upcoming blanks - while (s < text_end) - { - const char c = *s; - if (ImCharIsSpace(c)) { s++; } else if (c == '\n') { s++; break; } else { break; } - } - continue; - } - } - - // Decode and advance source - unsigned int c = (unsigned int)*s; - if (c < 0x80) - { - s += 1; - } - else - { - s += ImTextCharFromUtf8(&c, s, text_end); - if (c == 0) // Malformed UTF-8? - break; - } - - if (c < 32) - { - if (c == '\n') - { - x = pos.x; - y += line_height; - - if (y > clip_rect.w) - break; - if (!word_wrap_enabled && y + line_height < clip_rect.y) - while (s < text_end && *s != '\n') // Fast-forward to next line - s++; - continue; - } - if (c == '\r') - continue; - } - - float char_width = 0.0f; - if (const ImFontGlyph* glyph = FindGlyph((unsigned short)c)) - { - char_width = glyph->AdvanceX * scale; - - // Arbitrarily assume that both space and tabs are empty glyphs as an optimization - if (c != ' ' && c != '\t') - { - // We don't do a second finer clipping test on the Y axis as we've already skipped anything before clip_rect.y and exit once we pass clip_rect.w - float x1 = x + glyph->X0 * scale; - float x2 = x + glyph->X1 * scale; - float y1 = y + glyph->Y0 * scale; - float y2 = y + glyph->Y1 * scale; - if (x1 <= clip_rect.z && x2 >= clip_rect.x) - { - // Render a character - float u1 = glyph->U0; - float v1 = glyph->V0; - float u2 = glyph->U1; - float v2 = glyph->V1; - - // CPU side clipping used to fit text in their frame when the frame is too small. Only does clipping for axis aligned quads. - if (cpu_fine_clip) - { - if (x1 < clip_rect.x) - { - u1 = u1 + (1.0f - (x2 - clip_rect.x) / (x2 - x1)) * (u2 - u1); - x1 = clip_rect.x; - } - if (y1 < clip_rect.y) - { - v1 = v1 + (1.0f - (y2 - clip_rect.y) / (y2 - y1)) * (v2 - v1); - y1 = clip_rect.y; - } - if (x2 > clip_rect.z) - { - u2 = u1 + ((clip_rect.z - x1) / (x2 - x1)) * (u2 - u1); - x2 = clip_rect.z; - } - if (y2 > clip_rect.w) - { - v2 = v1 + ((clip_rect.w - y1) / (y2 - y1)) * (v2 - v1); - y2 = clip_rect.w; - } - if (y1 >= y2) - { - x += char_width; - continue; - } - } - - // We are NOT calling PrimRectUV() here because non-inlined causes too much overhead in a debug builds. Inlined here: - { - idx_write[0] = (ImDrawIdx)(vtx_current_idx); idx_write[1] = (ImDrawIdx)(vtx_current_idx+1); idx_write[2] = (ImDrawIdx)(vtx_current_idx+2); - idx_write[3] = (ImDrawIdx)(vtx_current_idx); idx_write[4] = (ImDrawIdx)(vtx_current_idx+2); idx_write[5] = (ImDrawIdx)(vtx_current_idx+3); - vtx_write[0].pos.x = x1; vtx_write[0].pos.y = y1; vtx_write[0].col = col; vtx_write[0].uv.x = u1; vtx_write[0].uv.y = v1; - vtx_write[1].pos.x = x2; vtx_write[1].pos.y = y1; vtx_write[1].col = col; vtx_write[1].uv.x = u2; vtx_write[1].uv.y = v1; - vtx_write[2].pos.x = x2; vtx_write[2].pos.y = y2; vtx_write[2].col = col; vtx_write[2].uv.x = u2; vtx_write[2].uv.y = v2; - vtx_write[3].pos.x = x1; vtx_write[3].pos.y = y2; vtx_write[3].col = col; vtx_write[3].uv.x = u1; vtx_write[3].uv.y = v2; - vtx_write += 4; - vtx_current_idx += 4; - idx_write += 6; - } - } - } - } - - x += char_width; - } - - // Give back unused vertices - draw_list->VtxBuffer.resize((int)(vtx_write - draw_list->VtxBuffer.Data)); - draw_list->IdxBuffer.resize((int)(idx_write - draw_list->IdxBuffer.Data)); - draw_list->CmdBuffer[draw_list->CmdBuffer.Size-1].ElemCount -= (idx_expected_size - draw_list->IdxBuffer.Size); - draw_list->_VtxWritePtr = vtx_write; - draw_list->_IdxWritePtr = idx_write; - draw_list->_VtxCurrentIdx = (unsigned int)draw_list->VtxBuffer.Size; -} - -//----------------------------------------------------------------------------- -// Internals Drawing Helpers -//----------------------------------------------------------------------------- - -static inline float ImAcos01(float x) -{ - if (x <= 0.0f) return IM_PI * 0.5f; - if (x >= 1.0f) return 0.0f; - return acosf(x); - //return (-0.69813170079773212f * x * x - 0.87266462599716477f) * x + 1.5707963267948966f; // Cheap approximation, may be enough for what we do. -} - -// FIXME: Cleanup and move code to ImDrawList. -void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding) -{ - if (x_end_norm == x_start_norm) - return; - if (x_start_norm > x_end_norm) - ImSwap(x_start_norm, x_end_norm); - - ImVec2 p0 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_start_norm), rect.Min.y); - ImVec2 p1 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_end_norm), rect.Max.y); - if (rounding == 0.0f) - { - draw_list->AddRectFilled(p0, p1, col, 0.0f); - return; - } - - rounding = ImClamp(ImMin((rect.Max.x - rect.Min.x) * 0.5f, (rect.Max.y - rect.Min.y) * 0.5f) - 1.0f, 0.0f, rounding); - const float inv_rounding = 1.0f / rounding; - const float arc0_b = ImAcos01(1.0f - (p0.x - rect.Min.x) * inv_rounding); - const float arc0_e = ImAcos01(1.0f - (p1.x - rect.Min.x) * inv_rounding); - const float x0 = ImMax(p0.x, rect.Min.x + rounding); - if (arc0_b == arc0_e) - { - draw_list->PathLineTo(ImVec2(x0, p1.y)); - draw_list->PathLineTo(ImVec2(x0, p0.y)); - } - else if (arc0_b == 0.0f && arc0_e == IM_PI*0.5f) - { - draw_list->PathArcToFast(ImVec2(x0, p1.y - rounding), rounding, 3, 6); // BL - draw_list->PathArcToFast(ImVec2(x0, p0.y + rounding), rounding, 6, 9); // TR - } - else - { - draw_list->PathArcTo(ImVec2(x0, p1.y - rounding), rounding, IM_PI - arc0_e, IM_PI - arc0_b, 3); // BL - draw_list->PathArcTo(ImVec2(x0, p0.y + rounding), rounding, IM_PI + arc0_b, IM_PI + arc0_e, 3); // TR - } - if (p1.x > rect.Min.x + rounding) - { - const float arc1_b = ImAcos01(1.0f - (rect.Max.x - p1.x) * inv_rounding); - const float arc1_e = ImAcos01(1.0f - (rect.Max.x - p0.x) * inv_rounding); - const float x1 = ImMin(p1.x, rect.Max.x - rounding); - if (arc1_b == arc1_e) - { - draw_list->PathLineTo(ImVec2(x1, p0.y)); - draw_list->PathLineTo(ImVec2(x1, p1.y)); - } - else if (arc1_b == 0.0f && arc1_e == IM_PI*0.5f) - { - draw_list->PathArcToFast(ImVec2(x1, p0.y + rounding), rounding, 9, 12); // TR - draw_list->PathArcToFast(ImVec2(x1, p1.y - rounding), rounding, 0, 3); // BR - } - else - { - draw_list->PathArcTo(ImVec2(x1, p0.y + rounding), rounding, -arc1_e, -arc1_b, 3); // TR - draw_list->PathArcTo(ImVec2(x1, p1.y - rounding), rounding, +arc1_b, +arc1_e, 3); // BR - } - } - draw_list->PathFillConvex(col); -} - -//----------------------------------------------------------------------------- -// DEFAULT FONT DATA -//----------------------------------------------------------------------------- -// Compressed with stb_compress() then converted to a C array. -// Use the program in extra_fonts/binary_to_compressed_c.cpp to create the array from a TTF file. -// Decompression from stb.h (public domain) by Sean Barrett https://github.com/nothings/stb/blob/master/stb.h -//----------------------------------------------------------------------------- - -static unsigned int stb_decompress_length(unsigned char *input) -{ - return (input[8] << 24) + (input[9] << 16) + (input[10] << 8) + input[11]; -} - -static unsigned char *stb__barrier, *stb__barrier2, *stb__barrier3, *stb__barrier4; -static unsigned char *stb__dout; -static void stb__match(unsigned char *data, unsigned int length) -{ - // INVERSE of memmove... write each byte before copying the next... - IM_ASSERT (stb__dout + length <= stb__barrier); - if (stb__dout + length > stb__barrier) { stb__dout += length; return; } - if (data < stb__barrier4) { stb__dout = stb__barrier+1; return; } - while (length--) *stb__dout++ = *data++; -} - -static void stb__lit(unsigned char *data, unsigned int length) -{ - IM_ASSERT (stb__dout + length <= stb__barrier); - if (stb__dout + length > stb__barrier) { stb__dout += length; return; } - if (data < stb__barrier2) { stb__dout = stb__barrier+1; return; } - memcpy(stb__dout, data, length); - stb__dout += length; -} - -#define stb__in2(x) ((i[x] << 8) + i[(x)+1]) -#define stb__in3(x) ((i[x] << 16) + stb__in2((x)+1)) -#define stb__in4(x) ((i[x] << 24) + stb__in3((x)+1)) - -static unsigned char *stb_decompress_token(unsigned char *i) -{ - if (*i >= 0x20) { // use fewer if's for cases that expand small - if (*i >= 0x80) stb__match(stb__dout-i[1]-1, i[0] - 0x80 + 1), i += 2; - else if (*i >= 0x40) stb__match(stb__dout-(stb__in2(0) - 0x4000 + 1), i[2]+1), i += 3; - else /* *i >= 0x20 */ stb__lit(i+1, i[0] - 0x20 + 1), i += 1 + (i[0] - 0x20 + 1); - } else { // more ifs for cases that expand large, since overhead is amortized - if (*i >= 0x18) stb__match(stb__dout-(stb__in3(0) - 0x180000 + 1), i[3]+1), i += 4; - else if (*i >= 0x10) stb__match(stb__dout-(stb__in3(0) - 0x100000 + 1), stb__in2(3)+1), i += 5; - else if (*i >= 0x08) stb__lit(i+2, stb__in2(0) - 0x0800 + 1), i += 2 + (stb__in2(0) - 0x0800 + 1); - else if (*i == 0x07) stb__lit(i+3, stb__in2(1) + 1), i += 3 + (stb__in2(1) + 1); - else if (*i == 0x06) stb__match(stb__dout-(stb__in3(1)+1), i[4]+1), i += 5; - else if (*i == 0x04) stb__match(stb__dout-(stb__in3(1)+1), stb__in2(4)+1), i += 6; - } - return i; -} - -static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, unsigned int buflen) -{ - const unsigned long ADLER_MOD = 65521; - unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16; - unsigned long blocklen, i; - - blocklen = buflen % 5552; - while (buflen) { - for (i=0; i + 7 < blocklen; i += 8) { - s1 += buffer[0], s2 += s1; - s1 += buffer[1], s2 += s1; - s1 += buffer[2], s2 += s1; - s1 += buffer[3], s2 += s1; - s1 += buffer[4], s2 += s1; - s1 += buffer[5], s2 += s1; - s1 += buffer[6], s2 += s1; - s1 += buffer[7], s2 += s1; - - buffer += 8; - } - - for (; i < blocklen; ++i) - s1 += *buffer++, s2 += s1; - - s1 %= ADLER_MOD, s2 %= ADLER_MOD; - buflen -= blocklen; - blocklen = 5552; - } - return (unsigned int)(s2 << 16) + (unsigned int)s1; -} - -static unsigned int stb_decompress(unsigned char *output, unsigned char *i, unsigned int length) -{ - unsigned int olen; - if (stb__in4(0) != 0x57bC0000) return 0; - if (stb__in4(4) != 0) return 0; // error! stream is > 4GB - olen = stb_decompress_length(i); - stb__barrier2 = i; - stb__barrier3 = i+length; - stb__barrier = output + olen; - stb__barrier4 = output; - i += 16; - - stb__dout = output; - for (;;) { - unsigned char *old_i = i; - i = stb_decompress_token(i); - if (i == old_i) { - if (*i == 0x05 && i[1] == 0xfa) { - IM_ASSERT(stb__dout == output + olen); - if (stb__dout != output + olen) return 0; - if (stb_adler32(1, output, olen) != (unsigned int) stb__in4(2)) - return 0; - return olen; - } else { - IM_ASSERT(0); /* NOTREACHED */ - return 0; - } - } - IM_ASSERT(stb__dout <= output + olen); - if (stb__dout > output + olen) - return 0; - } -} - -//----------------------------------------------------------------------------- -// ProggyClean.ttf -// Copyright (c) 2004, 2005 Tristan Grimmer -// MIT license (see License.txt in http://www.upperbounds.net/download/ProggyClean.ttf.zip) -// Download and more information at http://upperbounds.net -//----------------------------------------------------------------------------- -// File: 'ProggyClean.ttf' (41208 bytes) -// Exported using binary_to_compressed_c.cpp -//----------------------------------------------------------------------------- -static const char proggy_clean_ttf_compressed_data_base85[11980+1] = - "7])#######hV0qs'/###[),##/l:$#Q6>##5[n42>c-TH`->>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCp#-i>.r$<$6pD>Lb';9Crc6tgXmKVeU2cD4Eo3R/" - "2*>]b(MC;$jPfY.;h^`IWM9Qo#t'X#(v#Y9w0#1D$CIf;W'#pWUPXOuxXuU(H9M(1=Ke$$'5F%)]0^#0X@U.a$FBjVQTSDgEKnIS7EM9>ZY9w0#L;>>#Mx&4Mvt//L[MkA#W@lK.N'[0#7RL_&#w+F%HtG9M#XL`N&.,GM4Pg;--VsM.M0rJfLH2eTM`*oJMHRC`N" - "kfimM2J,W-jXS:)r0wK#@Fge$U>`w'N7G#$#fB#$E^$#:9:hk+eOe--6x)F7*E%?76%^GMHePW-Z5l'&GiF#$956:rS?dA#fiK:)Yr+`�j@'DbG&#^$PG.Ll+DNa&VZ>1i%h1S9u5o@YaaW$e+bROPOpxTO7Stwi1::iB1q)C_=dV26J;2,]7op$]uQr@_V7$q^%lQwtuHY]=DX,n3L#0PHDO4f9>dC@O>HBuKPpP*E,N+b3L#lpR/MrTEH.IAQk.a>D[.e;mc." - "x]Ip.PH^'/aqUO/$1WxLoW0[iLAw=4h(9.`G" - "CRUxHPeR`5Mjol(dUWxZa(>STrPkrJiWx`5U7F#.g*jrohGg`cg:lSTvEY/EV_7H4Q9[Z%cnv;JQYZ5q.l7Zeas:HOIZOB?Ggv:[7MI2k).'2($5FNP&EQ(,)" - "U]W]+fh18.vsai00);D3@4ku5P?DP8aJt+;qUM]=+b'8@;mViBKx0DE[-auGl8:PJ&Dj+M6OC]O^((##]`0i)drT;-7X`=-H3[igUnPG-NZlo.#k@h#=Ork$m>a>$-?Tm$UV(?#P6YY#" - "'/###xe7q.73rI3*pP/$1>s9)W,JrM7SN]'/4C#v$U`0#V.[0>xQsH$fEmPMgY2u7Kh(G%siIfLSoS+MK2eTM$=5,M8p`A.;_R%#u[K#$x4AG8.kK/HSB==-'Ie/QTtG?-.*^N-4B/ZM" - "_3YlQC7(p7q)&](`6_c)$/*JL(L-^(]$wIM`dPtOdGA,U3:w2M-0+WomX2u7lqM2iEumMTcsF?-aT=Z-97UEnXglEn1K-bnEO`gu" - "Ft(c%=;Am_Qs@jLooI&NX;]0#j4#F14;gl8-GQpgwhrq8'=l_f-b49'UOqkLu7-##oDY2L(te+Mch&gLYtJ,MEtJfLh'x'M=$CS-ZZ%P]8bZ>#S?YY#%Q&q'3^Fw&?D)UDNrocM3A76/" - "/oL?#h7gl85[qW/NDOk%16ij;+:1a'iNIdb-ou8.P*w,v5#EI$TWS>Pot-R*H'-SEpA:g)f+O$%%`kA#G=8RMmG1&O`>to8bC]T&$,n.LoO>29sp3dt-52U%VM#q7'DHpg+#Z9%H[Ket`e;)f#Km8&+DC$I46>#Kr]]u-[=99tts1.qb#q72g1WJO81q+eN'03'eM>&1XxY-caEnO" - "j%2n8)),?ILR5^.Ibn<-X-Mq7[a82Lq:F&#ce+S9wsCK*x`569E8ew'He]h:sI[2LM$[guka3ZRd6:t%IG:;$%YiJ:Nq=?eAw;/:nnDq0(CYcMpG)qLN4$##&J-XTt,%OVU4)S1+R-#dg0/Nn?Ku1^0f$B*P:Rowwm-`0PKjYDDM'3]d39VZHEl4,.j']Pk-M.h^&:0FACm$maq-&sgw0t7/6(^xtk%" - "LuH88Fj-ekm>GA#_>568x6(OFRl-IZp`&b,_P'$MhLbxfc$mj`,O;&%W2m`Zh:/)Uetw:aJ%]K9h:TcF]u_-Sj9,VK3M.*'&0D[Ca]J9gp8,kAW]" - "%(?A%R$f<->Zts'^kn=-^@c4%-pY6qI%J%1IGxfLU9CP8cbPlXv);C=b),<2mOvP8up,UVf3839acAWAW-W?#ao/^#%KYo8fRULNd2.>%m]UK:n%r$'sw]J;5pAoO_#2mO3n,'=H5(et" - "Hg*`+RLgv>=4U8guD$I%D:W>-r5V*%j*W:Kvej.Lp$'?;++O'>()jLR-^u68PHm8ZFWe+ej8h:9r6L*0//c&iH&R8pRbA#Kjm%upV1g:" - "a_#Ur7FuA#(tRh#.Y5K+@?3<-8m0$PEn;J:rh6?I6uG<-`wMU'ircp0LaE_OtlMb&1#6T.#FDKu#1Lw%u%+GM+X'e?YLfjM[VO0MbuFp7;>Q&#WIo)0@F%q7c#4XAXN-U&VBpqB>0ie&jhZ[?iLR@@_AvA-iQC(=ksRZRVp7`.=+NpBC%rh&3]R:8XDmE5^V8O(x<-+k?'(^](H.aREZSi,#1:[IXaZFOm<-ui#qUq2$##Ri;u75OK#(RtaW-K-F`S+cF]uN`-KMQ%rP/Xri.LRcB##=YL3BgM/3M" - "D?@f&1'BW-)Ju#bmmWCMkk&#TR`C,5d>g)F;t,4:@_l8G/5h4vUd%&%950:VXD'QdWoY-F$BtUwmfe$YqL'8(PWX(" - "P?^@Po3$##`MSs?DWBZ/S>+4%>fX,VWv/w'KD`LP5IbH;rTV>n3cEK8U#bX]l-/V+^lj3;vlMb&[5YQ8#pekX9JP3XUC72L,,?+Ni&co7ApnO*5NK,((W-i:$,kp'UDAO(G0Sq7MVjJs" - "bIu)'Z,*[>br5fX^:FPAWr-m2KgLQ_nN6'8uTGT5g)uLv:873UpTLgH+#FgpH'_o1780Ph8KmxQJ8#H72L4@768@Tm&Q" - "h4CB/5OvmA&,Q&QbUoi$a_%3M01H)4x7I^&KQVgtFnV+;[Pc>[m4k//,]1?#`VY[Jr*3&&slRfLiVZJ:]?=K3Sw=[$=uRB?3xk48@aege0jT6'N#(q%.O=?2S]u*(m<-" - "V8J'(1)G][68hW$5'q[GC&5j`TE?m'esFGNRM)j,ffZ?-qx8;->g4t*:CIP/[Qap7/9'#(1sao7w-.qNUdkJ)tCF&#B^;xGvn2r9FEPFFFcL@.iFNkTve$m%#QvQS8U@)2Z+3K:AKM5i" - "sZ88+dKQ)W6>J%CL`.d*(B`-n8D9oK-XV1q['-5k'cAZ69e;D_?$ZPP&s^+7])$*$#@QYi9,5P r+$%CE=68>K8r0=dSC%%(@p7" - ".m7jilQ02'0-VWAgTlGW'b)Tq7VT9q^*^$$.:&N@@" - "$&)WHtPm*5_rO0&e%K&#-30j(E4#'Zb.o/(Tpm$>K'f@[PvFl,hfINTNU6u'0pao7%XUp9]5.>%h`8_=VYbxuel.NTSsJfLacFu3B'lQSu/m6-Oqem8T+oE--$0a/k]uj9EwsG>%veR*" - "hv^BFpQj:K'#SJ,sB-'#](j.Lg92rTw-*n%@/;39rrJF,l#qV%OrtBeC6/,;qB3ebNW[?,Hqj2L.1NP&GjUR=1D8QaS3Up&@*9wP?+lo7b?@%'k4`p0Z$22%K3+iCZj?XJN4Nm&+YF]u" - "@-W$U%VEQ/,,>>#)D#%8cY#YZ?=,`Wdxu/ae&#" - "w6)R89tI#6@s'(6Bf7a&?S=^ZI_kS&ai`&=tE72L_D,;^R)7[$so8lKN%5/$(vdfq7+ebA#" - "u1p]ovUKW&Y%q]'>$1@-[xfn$7ZTp7mM,G,Ko7a&Gu%G[RMxJs[0MM%wci.LFDK)(%:_i2B5CsR8&9Z&#=mPEnm0f`<&c)QL5uJ#%u%lJj+D-r;BoFDoS97h5g)E#o:&S4weDF,9^Hoe`h*L+_a*NrLW-1pG_&2UdB8" - "6e%B/:=>)N4xeW.*wft-;$'58-ESqr#U`'6AQ]m&6/`Z>#S?YY#Vc;r7U2&326d=w&H####?TZ`*4?&.MK?LP8Vxg>$[QXc%QJv92.(Db*B)gb*BM9dM*hJMAo*c&#" - "b0v=Pjer]$gG&JXDf->'StvU7505l9$AFvgYRI^&<^b68?j#q9QX4SM'RO#&sL1IM.rJfLUAj221]d##DW=m83u5;'bYx,*Sl0hL(W;;$doB&O/TQ:(Z^xBdLjLV#*8U_72Lh+2Q8Cj0i:6hp&$C/:p(HK>T8Y[gHQ4`4)'$Ab(Nof%V'8hL&#SfD07&6D@M.*J:;$-rv29'M]8qMv-tLp,'886iaC=Hb*YJoKJ,(j%K=H`K.v9HggqBIiZu'QvBT.#=)0ukruV&.)3=(^1`o*Pj4<-#MJ+gLq9-##@HuZPN0]u:h7.T..G:;$/Usj(T7`Q8tT72LnYl<-qx8;-HV7Q-&Xdx%1a,hC=0u+HlsV>nuIQL-5" - "_>@kXQtMacfD.m-VAb8;IReM3$wf0''hra*so568'Ip&vRs849'MRYSp%:t:h5qSgwpEr$B>Q,;s(C#$)`svQuF$##-D,##,g68@2[T;.XSdN9Qe)rpt._K-#5wF)sP'##p#C0c%-Gb%" - "hd+<-j'Ai*x&&HMkT]C'OSl##5RG[JXaHN;d'uA#x._U;.`PU@(Z3dt4r152@:v,'R.Sj'w#0<-;kPI)FfJ&#AYJ&#//)>-k=m=*XnK$>=)72L]0I%>.G690a:$##<,);?;72#?x9+d;" - "^V'9;jY@;)br#q^YQpx:X#Te$Z^'=-=bGhLf:D6&bNwZ9-ZD#n^9HhLMr5G;']d&6'wYmTFmLq9wI>P(9mI[>kC-ekLC/R&CH+s'B;K-M6$EB%is00:" - "+A4[7xks.LrNk0&E)wILYF@2L'0Nb$+pv<(2.768/FrY&h$^3i&@+G%JT'<-,v`3;_)I9M^AE]CN?Cl2AZg+%4iTpT3$U4O]GKx'm9)b@p7YsvK3w^YR-" - "CdQ*:Ir<($u&)#(&?L9Rg3H)4fiEp^iI9O8KnTj,]H?D*r7'M;PwZ9K0E^k&-cpI;.p/6_vwoFMV<->#%Xi.LxVnrU(4&8/P+:hLSKj$#U%]49t'I:rgMi'FL@a:0Y-uA[39',(vbma*" - "hU%<-SRF`Tt:542R_VV$p@[p8DV[A,?1839FWdFTi1O*H&#(AL8[_P%.M>v^-))qOT*F5Cq0`Ye%+$B6i:7@0IXSsDiWP,##P`%/L-" - "S(qw%sf/@%#B6;/U7K]uZbi^Oc^2n%t<)'mEVE''n`WnJra$^TKvX5B>;_aSEK',(hwa0:i4G?.Bci.(X[?b*($,=-n<.Q%`(X=?+@Am*Js0&=3bh8K]mL69=Lb,OcZV/);TTm8VI;?%OtJ<(b4mq7M6:u?KRdFl*:xP?Yb.5)%w_I?7uk5JC+FS(m#i'k.'a0i)9<7b'fs'59hq$*5Uhv##pi^8+hIEBF`nvo`;'l0.^S1<-wUK2/Coh58KKhLj" - "M=SO*rfO`+qC`W-On.=AJ56>>i2@2LH6A:&5q`?9I3@@'04&p2/LVa*T-4<-i3;M9UvZd+N7>b*eIwg:CC)c<>nO&#$(>.Z-I&J(Q0Hd5Q%7Co-b`-cP)hI;*_F]u`Rb[.j8_Q/<&>uu+VsH$sM9TA%?)(vmJ80),P7E>)tjD%2L=-t#fK[%`v=Q8WlA2);Sa" - ">gXm8YB`1d@K#n]76-a$U,mF%Ul:#/'xoFM9QX-$.QN'>" - "[%$Z$uF6pA6Ki2O5:8w*vP1<-1`[G,)-m#>0`P&#eb#.3i)rtB61(o'$?X3B2Qft^ae_5tKL9MUe9b*sLEQ95C&`=G?@Mj=wh*'3E>=-<)Gt*Iw)'QG:`@I" - "wOf7&]1i'S01B+Ev/Nac#9S;=;YQpg_6U`*kVY39xK,[/6Aj7:'1Bm-_1EYfa1+o&o4hp7KN_Q(OlIo@S%;jVdn0'1h19w,WQhLI)3S#f$2(eb,jr*b;3Vw]*7NH%$c4Vs,eD9>XW8?N]o+(*pgC%/72LV-uW%iewS8W6m2rtCpo'RS1R84=@paTKt)>=%&1[)*vp'u+x,VrwN;&]kuO9JDbg=pO$J*.jVe;u'm0dr9l,<*wMK*Oe=g8lV_KEBFkO'oU]^=[-792#ok,)" - "i]lR8qQ2oA8wcRCZ^7w/Njh;?.stX?Q1>S1q4Bn$)K1<-rGdO'$Wr.Lc.CG)$/*JL4tNR/,SVO3,aUw'DJN:)Ss;wGn9A32ijw%FL+Z0Fn.U9;reSq)bmI32U==5ALuG&#Vf1398/pVo" - "1*c-(aY168o<`JsSbk-,1N;$>0:OUas(3:8Z972LSfF8eb=c-;>SPw7.6hn3m`9^Xkn(r.qS[0;T%&Qc=+STRxX'q1BNk3&*eu2;&8q$&x>Q#Q7^Tf+6<(d%ZVmj2bDi%.3L2n+4W'$P" - "iDDG)g,r%+?,$@?uou5tSe2aN_AQU*'IAO" - "URQ##V^Fv-XFbGM7Fl(N<3DhLGF%q.1rC$#:T__&Pi68%0xi_&[qFJ(77j_&JWoF.V735&T,[R*:xFR*K5>>#`bW-?4Ne_&6Ne_&6Ne_&n`kr-#GJcM6X;uM6X;uM(.a..^2TkL%oR(#" - ";u.T%fAr%4tJ8&><1=GHZ_+m9/#H1F^R#SC#*N=BA9(D?v[UiFY>>^8p,KKF.W]L29uLkLlu/+4T" - "w$)F./^n3+rlo+DB;5sIYGNk+i1t-69Jg--0pao7Sm#K)pdHW&;LuDNH@H>#/X-TI(;P>#,Gc>#0Su>#4`1?#8lC?#xL$#B.`$#F:r$#JF.%#NR@%#R_R%#Vke%#Zww%#_-4^Rh%Sflr-k'MS.o?.5/sWel/wpEM0%3'/1)K^f1-d>G21&v(35>V`39V7A4=onx4" - "A1OY5EI0;6Ibgr6M$HS7Q<)58C5w,;WoA*#[%T*#`1g*#d=#+#hI5+#lUG+#pbY+#tnl+#x$),#&1;,#*=M,#.I`,#2Ur,#6b.-#;w[H#iQtA#m^0B#qjBB#uvTB##-hB#'9$C#+E6C#" - "/QHC#3^ZC#7jmC#;v)D#?,)4kMYD4lVu`4m`:&5niUA5@(A5BA1]PBB:xlBCC=2CDLXMCEUtiCf&0g2'tN?PGT4CPGT4CPGT4CPGT4CPGT4CPGT4CPGT4CP" - "GT4CPGT4CPGT4CPGT4CPGT4CPGT4CP-qekC`.9kEg^+F$kwViFJTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5o,^<-28ZI'O?;xp" - "O?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xp;7q-#lLYI:xvD=#"; - -static const char* GetDefaultCompressedFontDataTTFBase85() -{ - return proggy_clean_ttf_compressed_data_base85; -} diff --git a/vendor/librw/skeleton/imgui/imgui_impl_rw.cpp b/vendor/librw/skeleton/imgui/imgui_impl_rw.cpp deleted file mode 100644 index 6ea726f..0000000 --- a/vendor/librw/skeleton/imgui/imgui_impl_rw.cpp +++ /dev/null @@ -1,219 +0,0 @@ -#include -#include -#include - -#include "imgui/imgui.h" -#include "imgui_impl_rw.h" - -using namespace rw::RWDEVICE; - -static rw::Texture *g_FontTexture; -static Im2DVertex *g_vertbuf; -static int g_vertbufSize; - -void -ImGui_ImplRW_RenderDrawLists(ImDrawData* draw_data) -{ - ImGuiIO &io = ImGui::GetIO(); - - // minimized - if (io.DisplaySize.x <= 0.0f || io.DisplaySize.y <= 0.0f) - return; - - if(g_vertbuf == nil || g_vertbufSize < draw_data->TotalVtxCount){ - if(g_vertbuf){ - rwFree(g_vertbuf); - g_vertbuf = nil; - } - g_vertbufSize = draw_data->TotalVtxCount + 5000; - g_vertbuf = rwNewT(Im2DVertex, g_vertbufSize, 0); - } - - float xoff = 0.0f; - float yoff = 0.0f; -#ifdef RWHALFPIXEL - xoff = -0.5; - yoff = 0.5; -#endif - - rw::Camera *cam = (rw::Camera*)rw::engine->currentCamera; - Im2DVertex *vtx_dst = g_vertbuf; - float recipZ = 1.0f/cam->nearPlane; - for(int n = 0; n < draw_data->CmdListsCount; n++){ - const ImDrawList *cmd_list = draw_data->CmdLists[n]; - const ImDrawVert *vtx_src = cmd_list->VtxBuffer.Data; - for(int i = 0; i < cmd_list->VtxBuffer.Size; i++){ - vtx_dst[i].setScreenX(vtx_src[i].pos.x + xoff); - vtx_dst[i].setScreenY(vtx_src[i].pos.y + yoff); - vtx_dst[i].setScreenZ(rw::im2d::GetNearZ()); - vtx_dst[i].setCameraZ(cam->nearPlane); - vtx_dst[i].setRecipCameraZ(recipZ); - vtx_dst[i].setColor(vtx_src[i].col&0xFF, vtx_src[i].col>>8 & 0xFF, vtx_src[i].col>>16 & 0xFF, vtx_src[i].col>>24 & 0xFF); - vtx_dst[i].setU(vtx_src[i].uv.x, recipZ); - vtx_dst[i].setV(vtx_src[i].uv.y, recipZ); - } - vtx_dst += cmd_list->VtxBuffer.Size; - } - - rw::SetRenderState(rw::VERTEXALPHA, 1); - rw::SetRenderState(rw::SRCBLEND, rw::BLENDSRCALPHA); - rw::SetRenderState(rw::DESTBLEND, rw::BLENDINVSRCALPHA); - rw::SetRenderState(rw::ZTESTENABLE, 0); - - int vtx_offset = 0; - for(int n = 0; n < draw_data->CmdListsCount; n++){ - const ImDrawList *cmd_list = draw_data->CmdLists[n]; - int idx_offset = 0; - for(int i = 0; i < cmd_list->CmdBuffer.Size; i++){ - const ImDrawCmd *pcmd = &cmd_list->CmdBuffer[i]; - if(pcmd->UserCallback) - pcmd->UserCallback(cmd_list, pcmd); - else{ - rw::Texture *tex = (rw::Texture*)pcmd->TextureId; - if(tex && tex->raster){ - rw::SetRenderStatePtr(rw::TEXTURERASTER, tex->raster); - rw::SetRenderState(rw::TEXTUREADDRESSU, tex->getAddressU()); - rw::SetRenderState(rw::TEXTUREADDRESSV, tex->getAddressV()); - rw::SetRenderState(rw::TEXTUREFILTER, tex->getFilter()); - }else - rw::SetRenderStatePtr(rw::TEXTURERASTER, nil); - rw::im2d::RenderIndexedPrimitive(rw::PRIMTYPETRILIST, - g_vertbuf+vtx_offset, cmd_list->VtxBuffer.Size, - cmd_list->IdxBuffer.Data+idx_offset, pcmd->ElemCount); - } - idx_offset += pcmd->ElemCount; - } - vtx_offset += cmd_list->VtxBuffer.Size; - } -} - -bool -ImGui_ImplRW_Init(void) -{ - using namespace sk; - ImGuiIO &io = ImGui::GetIO(); - - io.KeyMap[ImGuiKey_Tab] = KEY_TAB; - io.KeyMap[ImGuiKey_LeftArrow] = KEY_LEFT; - io.KeyMap[ImGuiKey_RightArrow] = KEY_RIGHT; - io.KeyMap[ImGuiKey_UpArrow] = KEY_UP; - io.KeyMap[ImGuiKey_DownArrow] = KEY_DOWN; - io.KeyMap[ImGuiKey_PageUp] = KEY_PGUP; - io.KeyMap[ImGuiKey_PageDown] = KEY_PGDN; - io.KeyMap[ImGuiKey_Home] = KEY_HOME; - io.KeyMap[ImGuiKey_End] = KEY_END; - io.KeyMap[ImGuiKey_Delete] = KEY_DEL; - io.KeyMap[ImGuiKey_Backspace] = KEY_BACKSP; - io.KeyMap[ImGuiKey_Enter] = KEY_ENTER; - io.KeyMap[ImGuiKey_Escape] = KEY_ESC; - io.KeyMap[ImGuiKey_A] = 'A'; - io.KeyMap[ImGuiKey_C] = 'C'; - io.KeyMap[ImGuiKey_V] = 'V'; - io.KeyMap[ImGuiKey_X] = 'X'; - io.KeyMap[ImGuiKey_Y] = 'Y'; - io.KeyMap[ImGuiKey_Z] = 'Z'; - - io.RenderDrawListsFn = ImGui_ImplRW_RenderDrawLists; - - return true; -} - -void -ImGui_ImplRW_Shutdown(void) -{ -} - -static bool -ImGui_ImplRW_CreateFontsTexture() -{ - // Build texture atlas - ImGuiIO &io = ImGui::GetIO(); - unsigned char *pixels; - int width, height; - io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height, nil); - - rw::Image *image; - image = rw::Image::create(width, height, 32); - image->allocate(); - for(int y = 0; y < height; y++) - memcpy(image->pixels + image->stride*y, pixels + width*4* y, width*4); - g_FontTexture = rw::Texture::create(rw::Raster::createFromImage(image)); - g_FontTexture->setFilter(rw::Texture::LINEAR); - image->destroy(); - - // Store our identifier - io.Fonts->TexID = (void*)g_FontTexture; - - return true; -} - -bool -ImGui_ImplRW_CreateDeviceObjects() -{ -// if(!g_pd3dDevice) -// return false; - if(!ImGui_ImplRW_CreateFontsTexture()) - return false; - return true; -} - -void -ImGui_ImplRW_NewFrame(float timeDelta) -{ - if(!g_FontTexture) - ImGui_ImplRW_CreateDeviceObjects(); - - ImGuiIO &io = ImGui::GetIO(); - - io.DisplaySize = ImVec2(sk::globals.width, sk::globals.height); - io.DeltaTime = timeDelta; - - io.KeyCtrl = io.KeysDown[sk::KEY_LCTRL] || io.KeysDown[sk::KEY_RCTRL]; - io.KeyShift = io.KeysDown[sk::KEY_LSHIFT] || io.KeysDown[sk::KEY_RSHIFT]; - io.KeyAlt = io.KeysDown[sk::KEY_LALT] || io.KeysDown[sk::KEY_RALT]; - io.KeySuper = false; - - if(io.WantMoveMouse) - sk::SetMousePosition(io.MousePos.x, io.MousePos.y); - - ImGui::NewFrame(); -} - -sk::EventStatus -ImGuiEventHandler(sk::Event e, void *param) -{ - using namespace sk; - - ImGuiIO &io = ImGui::GetIO(); - MouseState *ms; - uint c; - - switch(e){ - case KEYDOWN: - c = *(int*)param; - if(c < 256) - io.KeysDown[c] = 1; - return EVENTPROCESSED; - case KEYUP: - c = *(int*)param; - if(c < 256) - io.KeysDown[c] = 0; - return EVENTPROCESSED; - case CHARINPUT: - c = (uint)(uintptr)param; - io.AddInputCharacter((unsigned short)c); - return EVENTPROCESSED; - case MOUSEMOVE: - ms = (MouseState*)param; - io.MousePos.x = ms->posx; - io.MousePos.y = ms->posy; - return EVENTPROCESSED; - case MOUSEBTN: - ms = (MouseState*)param; - io.MouseDown[0] = !!(ms->buttons & 1); - io.MouseDown[2] = !!(ms->buttons & 2); - io.MouseDown[1] = !!(ms->buttons & 4); - return EVENTPROCESSED; - } - return EVENTPROCESSED; -} diff --git a/vendor/librw/skeleton/imgui/imgui_impl_rw.h b/vendor/librw/skeleton/imgui/imgui_impl_rw.h deleted file mode 100644 index 965a619..0000000 --- a/vendor/librw/skeleton/imgui/imgui_impl_rw.h +++ /dev/null @@ -1,4 +0,0 @@ -IMGUI_API bool ImGui_ImplRW_Init(void); -IMGUI_API void ImGui_ImplRW_Shutdown(void); -IMGUI_API void ImGui_ImplRW_NewFrame(float timeDelta); -sk::EventStatus ImGuiEventHandler(sk::Event e, void *param); diff --git a/vendor/librw/skeleton/imgui/imgui_internal.h b/vendor/librw/skeleton/imgui/imgui_internal.h deleted file mode 100644 index 797d66d..0000000 --- a/vendor/librw/skeleton/imgui/imgui_internal.h +++ /dev/null @@ -1,985 +0,0 @@ -// dear imgui, v1.54 WIP -// (internals) - -// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility! -// Set: -// #define IMGUI_DEFINE_MATH_OPERATORS -// To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators) - -#pragma once - -#ifndef IMGUI_VERSION -#error Must include imgui.h before imgui_internal.h -#endif - -#include // FILE* -#include // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf - -#ifdef _MSC_VER -#pragma warning (push) -#pragma warning (disable: 4251) // class 'xxx' needs to have dll-interface to be used by clients of struct 'xxx' // when IMGUI_API is set to__declspec(dllexport) -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h -#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h -#pragma clang diagnostic ignored "-Wold-style-cast" -#endif - -//----------------------------------------------------------------------------- -// Forward Declarations -//----------------------------------------------------------------------------- - -struct ImRect; -struct ImGuiColMod; -struct ImGuiStyleMod; -struct ImGuiGroupData; -struct ImGuiSimpleColumns; -struct ImGuiDrawContext; -struct ImGuiTextEditState; -struct ImGuiMouseCursorData; -struct ImGuiPopupRef; -struct ImGuiWindow; -struct ImGuiWindowSettings; - -typedef int ImGuiLayoutType; // enum: horizontal or vertical // enum ImGuiLayoutType_ -typedef int ImGuiButtonFlags; // flags: for ButtonEx(), ButtonBehavior() // enum ImGuiButtonFlags_ -typedef int ImGuiItemFlags; // flags: for PushItemFlag() // enum ImGuiItemFlags_ -typedef int ImGuiSeparatorFlags; // flags: for Separator() - internal // enum ImGuiSeparatorFlags_ -typedef int ImGuiSliderFlags; // flags: for SliderBehavior() // enum ImGuiSliderFlags_ - -//------------------------------------------------------------------------- -// STB libraries -//------------------------------------------------------------------------- - -namespace ImGuiStb -{ - -#undef STB_TEXTEDIT_STRING -#undef STB_TEXTEDIT_CHARTYPE -#define STB_TEXTEDIT_STRING ImGuiTextEditState -#define STB_TEXTEDIT_CHARTYPE ImWchar -#define STB_TEXTEDIT_GETWIDTH_NEWLINE -1.0f -#include "stb_textedit.h" - -} // namespace ImGuiStb - -//----------------------------------------------------------------------------- -// Context -//----------------------------------------------------------------------------- - -#ifndef GImGui -extern IMGUI_API ImGuiContext* GImGui; // Current implicit ImGui context pointer -#endif - -//----------------------------------------------------------------------------- -// Helpers -//----------------------------------------------------------------------------- - -#define IM_PI 3.14159265358979323846f -#define IM_OFFSETOF(_TYPE,_ELM) ((size_t)&(((_TYPE*)0)->_ELM)) - -// Helpers: UTF-8 <> wchar -IMGUI_API int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count -IMGUI_API int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end); // return input UTF-8 bytes count -IMGUI_API int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count -IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count) -IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string as UTF-8 code-points - -// Helpers: Misc -IMGUI_API ImU32 ImHash(const void* data, int data_size, ImU32 seed = 0); // Pass data_size==0 for zero-terminated strings -IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* file_open_mode, int* out_file_size = NULL, int padding_bytes = 0); -IMGUI_API FILE* ImFileOpen(const char* filename, const char* file_open_mode); -static inline bool ImCharIsSpace(int c) { return c == ' ' || c == '\t' || c == 0x3000; } -static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; } -static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; } - -// Helpers: Geometry -IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p); -IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); -IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); -IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w); - -// Helpers: String -IMGUI_API int ImStricmp(const char* str1, const char* str2); -IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); -IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); -IMGUI_API char* ImStrdup(const char* str); -IMGUI_API char* ImStrchrRange(const char* str_begin, const char* str_end, char c); -IMGUI_API int ImStrlenW(const ImWchar* str); -IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line -IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); -IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3); -IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3); - -// Helpers: Math -// We are keeping those not leaking to the user by default, in the case the user has implicit cast operators between ImVec2 and its own types (when IM_VEC2_CLASS_EXTRA is defined) -#ifdef IMGUI_DEFINE_MATH_OPERATORS -static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x*rhs, lhs.y*rhs); } -static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x/rhs, lhs.y/rhs); } -static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x+rhs.x, lhs.y+rhs.y); } -static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x-rhs.x, lhs.y-rhs.y); } -static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x*rhs.x, lhs.y*rhs.y); } -static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x/rhs.x, lhs.y/rhs.y); } -static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; } -static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; } -static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; } -static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; } -static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x+rhs.x, lhs.y+rhs.y, lhs.z+rhs.z, lhs.w+rhs.w); } -static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x-rhs.x, lhs.y-rhs.y, lhs.z-rhs.z, lhs.w-rhs.w); } -static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x*rhs.x, lhs.y*rhs.y, lhs.z*rhs.z, lhs.w*rhs.w); } -#endif - -static inline int ImMin(int lhs, int rhs) { return lhs < rhs ? lhs : rhs; } -static inline int ImMax(int lhs, int rhs) { return lhs >= rhs ? lhs : rhs; } -static inline float ImMin(float lhs, float rhs) { return lhs < rhs ? lhs : rhs; } -static inline float ImMax(float lhs, float rhs) { return lhs >= rhs ? lhs : rhs; } -static inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(ImMin(lhs.x,rhs.x), ImMin(lhs.y,rhs.y)); } -static inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(ImMax(lhs.x,rhs.x), ImMax(lhs.y,rhs.y)); } -static inline int ImClamp(int v, int mn, int mx) { return (v < mn) ? mn : (v > mx) ? mx : v; } -static inline float ImClamp(float v, float mn, float mx) { return (v < mn) ? mn : (v > mx) ? mx : v; } -static inline ImVec2 ImClamp(const ImVec2& f, const ImVec2& mn, ImVec2 mx) { return ImVec2(ImClamp(f.x,mn.x,mx.x), ImClamp(f.y,mn.y,mx.y)); } -static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; } -static inline void ImSwap(int& a, int& b) { int tmp = a; a = b; b = tmp; } -static inline void ImSwap(float& a, float& b) { float tmp = a; a = b; b = tmp; } -static inline int ImLerp(int a, int b, float t) { return (int)(a + (b - a) * t); } -static inline float ImLerp(float a, float b, float t) { return a + (b - a) * t; } -static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t) { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); } -static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); } -static inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t) { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); } -static inline float ImLengthSqr(const ImVec2& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y; } -static inline float ImLengthSqr(const ImVec4& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y + lhs.z*lhs.z + lhs.w*lhs.w; } -static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / sqrtf(d); return fail_value; } -static inline float ImFloor(float f) { return (float)(int)f; } -static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)v.x, (float)(int)v.y); } -static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; } -static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); } -static inline float ImLinearSweep(float current, float target, float speed) { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; } -static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } - -// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax. -// Defining a custom placement new() with a dummy parameter allows us to bypass including which on some platforms complains when user has disabled exceptions. -struct ImNewPlacementDummy {}; -inline void* operator new(size_t, ImNewPlacementDummy, void* ptr) { return ptr; } -inline void operator delete(void*, ImNewPlacementDummy, void*) {} // This is only required so we can use the symetrical new() -#define IM_PLACEMENT_NEW(_PTR) new(ImNewPlacementDummy(), _PTR) -#define IM_NEW(_TYPE) new(ImNewPlacementDummy(), ImGui::MemAlloc(sizeof(_TYPE))) _TYPE -template void IM_DELETE(T*& p) { if (p) { p->~T(); ImGui::MemFree(p); p = NULL; } } - -//----------------------------------------------------------------------------- -// Types -//----------------------------------------------------------------------------- - -// Internal Drag and Drop payload types. String starting with '_' are reserved for Dear ImGui. -#define IMGUI_PAYLOAD_TYPE_DOCKABLE "_IMDOCK" // ImGuiWindow* // [Internal] Docking/tabs - -enum ImGuiButtonFlags_ -{ - ImGuiButtonFlags_Repeat = 1 << 0, // hold to repeat - ImGuiButtonFlags_PressedOnClickRelease = 1 << 1, // return true on click + release on same item [DEFAULT if no PressedOn* flag is set] - ImGuiButtonFlags_PressedOnClick = 1 << 2, // return true on click (default requires click+release) - ImGuiButtonFlags_PressedOnRelease = 1 << 3, // return true on release (default requires click+release) - ImGuiButtonFlags_PressedOnDoubleClick = 1 << 4, // return true on double-click (default requires click+release) - ImGuiButtonFlags_FlattenChildren = 1 << 5, // allow interactions even if a child window is overlapping - ImGuiButtonFlags_AllowItemOverlap = 1 << 6, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap() - ImGuiButtonFlags_DontClosePopups = 1 << 7, // disable automatically closing parent popup on press // [UNUSED] - ImGuiButtonFlags_Disabled = 1 << 8, // disable interactions - ImGuiButtonFlags_AlignTextBaseLine = 1 << 9, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine - ImGuiButtonFlags_NoKeyModifiers = 1 << 10, // disable interaction if a key modifier is held - ImGuiButtonFlags_NoHoldingActiveID = 1 << 11, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only) - ImGuiButtonFlags_PressedOnDragDropHold = 1 << 12 // press when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers) -}; - -enum ImGuiSliderFlags_ -{ - ImGuiSliderFlags_Vertical = 1 << 0 -}; - -enum ImGuiColumnsFlags_ -{ - // Default: 0 - ImGuiColumnsFlags_NoBorder = 1 << 0, // Disable column dividers - ImGuiColumnsFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers - ImGuiColumnsFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns - ImGuiColumnsFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window - ImGuiColumnsFlags_GrowParentContentsSize= 1 << 4 // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove. -}; - -enum ImGuiSelectableFlagsPrivate_ -{ - // NB: need to be in sync with last value of ImGuiSelectableFlags_ - ImGuiSelectableFlags_Menu = 1 << 3, // -> PressedOnClick - ImGuiSelectableFlags_MenuItem = 1 << 4, // -> PressedOnRelease - ImGuiSelectableFlags_Disabled = 1 << 5, - ImGuiSelectableFlags_DrawFillAvailWidth = 1 << 6 -}; - -enum ImGuiSeparatorFlags_ -{ - ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar - ImGuiSeparatorFlags_Vertical = 1 << 1 -}; - -// FIXME: this is in development, not exposed/functional as a generic feature yet. -enum ImGuiLayoutType_ -{ - ImGuiLayoutType_Vertical, - ImGuiLayoutType_Horizontal -}; - -enum ImGuiAxis -{ - ImGuiAxis_None = -1, - ImGuiAxis_X = 0, - ImGuiAxis_Y = 1 -}; - -enum ImGuiPlotType -{ - ImGuiPlotType_Lines, - ImGuiPlotType_Histogram -}; - -enum ImGuiDataType -{ - ImGuiDataType_Int, - ImGuiDataType_Float, - ImGuiDataType_Float2 -}; - -enum ImGuiDir -{ - ImGuiDir_None = -1, - ImGuiDir_Left = 0, - ImGuiDir_Right = 1, - ImGuiDir_Up = 2, - ImGuiDir_Down = 3, - ImGuiDir_Count_ -}; - -// 2D axis aligned bounding-box -// NB: we can't rely on ImVec2 math operators being available here -struct IMGUI_API ImRect -{ - ImVec2 Min; // Upper-left - ImVec2 Max; // Lower-right - - ImRect() : Min(FLT_MAX,FLT_MAX), Max(-FLT_MAX,-FLT_MAX) {} - ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {} - ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {} - ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {} - - ImVec2 GetCenter() const { return ImVec2((Min.x+Max.x)*0.5f, (Min.y+Max.y)*0.5f); } - ImVec2 GetSize() const { return ImVec2(Max.x-Min.x, Max.y-Min.y); } - float GetWidth() const { return Max.x-Min.x; } - float GetHeight() const { return Max.y-Min.y; } - ImVec2 GetTL() const { return Min; } // Top-left - ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right - ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left - ImVec2 GetBR() const { return Max; } // Bottom-right - bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; } - bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x < Max.x && r.Max.y < Max.y; } - bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; } - void Add(const ImVec2& rhs) { if (Min.x > rhs.x) Min.x = rhs.x; if (Min.y > rhs.y) Min.y = rhs.y; if (Max.x < rhs.x) Max.x = rhs.x; if (Max.y < rhs.y) Max.y = rhs.y; } - void Add(const ImRect& rhs) { if (Min.x > rhs.Min.x) Min.x = rhs.Min.x; if (Min.y > rhs.Min.y) Min.y = rhs.Min.y; if (Max.x < rhs.Max.x) Max.x = rhs.Max.x; if (Max.y < rhs.Max.y) Max.y = rhs.Max.y; } - void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; } - void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; } - void Translate(const ImVec2& v) { Min.x += v.x; Min.y += v.y; Max.x += v.x; Max.y += v.y; } - void ClipWith(const ImRect& clip) { if (Min.x < clip.Min.x) Min.x = clip.Min.x; if (Min.y < clip.Min.y) Min.y = clip.Min.y; if (Max.x > clip.Max.x) Max.x = clip.Max.x; if (Max.y > clip.Max.y) Max.y = clip.Max.y; } - void Floor() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; } - void FixInverted() { if (Min.x > Max.x) ImSwap(Min.x, Max.x); if (Min.y > Max.y) ImSwap(Min.y, Max.y); } - bool IsFinite() const { return Min.x != FLT_MAX; } - ImVec2 GetClosestPoint(ImVec2 p, bool on_edge) const - { - if (!on_edge && Contains(p)) - return p; - if (p.x > Max.x) p.x = Max.x; - else if (p.x < Min.x) p.x = Min.x; - if (p.y > Max.y) p.y = Max.y; - else if (p.y < Min.y) p.y = Min.y; - return p; - } -}; - -// Stacked color modifier, backup of modified data so we can restore it -struct ImGuiColMod -{ - ImGuiCol Col; - ImVec4 BackupValue; -}; - -// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable. -struct ImGuiStyleMod -{ - ImGuiStyleVar VarIdx; - union { int BackupInt[2]; float BackupFloat[2]; }; - ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; } - ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; } - ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; } -}; - -// Stacked data for BeginGroup()/EndGroup() -struct ImGuiGroupData -{ - ImVec2 BackupCursorPos; - ImVec2 BackupCursorMaxPos; - float BackupIndentX; - float BackupGroupOffsetX; - float BackupCurrentLineHeight; - float BackupCurrentLineTextBaseOffset; - float BackupLogLinePosY; - bool BackupActiveIdIsAlive; - bool AdvanceCursor; -}; - -// Simple column measurement currently used for MenuItem() only. This is very short-sighted/throw-away code and NOT a generic helper. -struct IMGUI_API ImGuiSimpleColumns -{ - int Count; - float Spacing; - float Width, NextWidth; - float Pos[8], NextWidths[8]; - - ImGuiSimpleColumns(); - void Update(int count, float spacing, bool clear); - float DeclColumns(float w0, float w1, float w2); - float CalcExtraSpace(float avail_w); -}; - -// Internal state of the currently focused/edited text input box -struct IMGUI_API ImGuiTextEditState -{ - ImGuiID Id; // widget id owning the text state - ImVector Text; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer. - ImVector InitialText; // backup of end-user buffer at the time of focus (in UTF-8, unaltered) - ImVector TempTextBuffer; - int CurLenA, CurLenW; // we need to maintain our buffer length in both UTF-8 and wchar format. - int BufSizeA; // end-user buffer size - float ScrollX; - ImGuiStb::STB_TexteditState StbState; - float CursorAnim; - bool CursorFollow; - bool SelectedAllMouseLock; - - ImGuiTextEditState() { memset(this, 0, sizeof(*this)); } - void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking - void CursorClamp() { StbState.cursor = ImMin(StbState.cursor, CurLenW); StbState.select_start = ImMin(StbState.select_start, CurLenW); StbState.select_end = ImMin(StbState.select_end, CurLenW); } - bool HasSelection() const { return StbState.select_start != StbState.select_end; } - void ClearSelection() { StbState.select_start = StbState.select_end = StbState.cursor; } - void SelectAll() { StbState.select_start = 0; StbState.select_end = CurLenW; StbState.cursor = StbState.select_end; StbState.has_preferred_x = false; } - void OnKeyPressed(int key); -}; - -// Data saved in imgui.ini file -struct ImGuiWindowSettings -{ - char* Name; - ImGuiID Id; - ImVec2 Pos; - ImVec2 Size; - bool Collapsed; - - ImGuiWindowSettings() { Name = NULL; Id = 0; Pos = Size = ImVec2(0,0); Collapsed = false; } -}; - -struct ImGuiSettingsHandler -{ - const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']' - ImGuiID TypeHash; // == ImHash(TypeName, 0, 0) - void* (*ReadOpenFn)(ImGuiContext& ctx, const char* name); - void (*ReadLineFn)(ImGuiContext& ctx, void* entry, const char* line); - void (*WriteAllFn)(ImGuiContext& ctx, ImGuiTextBuffer* out_buf); -}; - -// Mouse cursor data (used when io.MouseDrawCursor is set) -struct ImGuiMouseCursorData -{ - ImGuiMouseCursor Type; - ImVec2 HotOffset; - ImVec2 Size; - ImVec2 TexUvMin[2]; - ImVec2 TexUvMax[2]; -}; - -// Storage for current popup stack -struct ImGuiPopupRef -{ - ImGuiID PopupId; // Set on OpenPopup() - ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() - ImGuiWindow* ParentWindow; // Set on OpenPopup() - ImGuiID ParentMenuSet; // Set on OpenPopup() - ImVec2 MousePosOnOpen; // Copy of mouse position at the time of opening popup - - ImGuiPopupRef(ImGuiID id, ImGuiWindow* parent_window, ImGuiID parent_menu_set, const ImVec2& mouse_pos) { PopupId = id; Window = NULL; ParentWindow = parent_window; ParentMenuSet = parent_menu_set; MousePosOnOpen = mouse_pos; } -}; - -struct ImGuiColumnData -{ - float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right) - float OffsetNormBeforeResize; - ImGuiColumnsFlags Flags; // Not exposed - ImRect ClipRect; - - ImGuiColumnData() { OffsetNorm = OffsetNormBeforeResize = 0.0f; Flags = 0; } -}; - -struct ImGuiColumnsSet -{ - ImGuiID ID; - ImGuiColumnsFlags Flags; - bool IsFirstFrame; - bool IsBeingResized; - int Current; - int Count; - float MinX, MaxX; - float StartPosY; - float StartMaxPosX; // Backup of CursorMaxPos - float CellMinY, CellMaxY; - ImVector Columns; - - ImGuiColumnsSet() { Clear(); } - void Clear() - { - ID = 0; - Flags = 0; - IsFirstFrame = false; - IsBeingResized = false; - Current = 0; - Count = 1; - MinX = MaxX = 0.0f; - StartPosY = 0.0f; - StartMaxPosX = 0.0f; - CellMinY = CellMaxY = 0.0f; - Columns.clear(); - } -}; - -struct ImDrawListSharedData -{ - ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas - ImFont* Font; // Current/default font (optional, for simplified AddText overload) - float FontSize; // Current/default font size (optional, for simplified AddText overload) - float CurveTessellationTol; - ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen() - - // Const data - // FIXME: Bake rounded corners fill/borders in atlas - ImVec2 CircleVtx12[12]; - - ImDrawListSharedData(); -}; - -// Main state for ImGui -struct ImGuiContext -{ - bool Initialized; - ImGuiIO IO; - ImGuiStyle Style; - ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back() - float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window. - float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height. - ImDrawListSharedData DrawListSharedData; - - float Time; - int FrameCount; - int FrameCountEnded; - int FrameCountRendered; - ImVector Windows; - ImVector WindowsSortBuffer; - ImVector CurrentWindowStack; - ImGuiStorage WindowsById; - int WindowsActiveCount; - ImGuiWindow* CurrentWindow; // Being drawn into - ImGuiWindow* NavWindow; // Nav/focused window for navigation - ImGuiWindow* HoveredWindow; // Will catch mouse inputs - ImGuiWindow* HoveredRootWindow; // Will catch mouse inputs (for focus/move only) - ImGuiID HoveredId; // Hovered widget - bool HoveredIdAllowOverlap; - ImGuiID HoveredIdPreviousFrame; - float HoveredIdTimer; - ImGuiID ActiveId; // Active widget - ImGuiID ActiveIdPreviousFrame; - float ActiveIdTimer; - bool ActiveIdIsAlive; // Active widget has been seen this frame - bool ActiveIdIsJustActivated; // Set at the time of activation for one frame - bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always) - ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior) - ImGuiWindow* ActiveIdWindow; - ImGuiWindow* MovingWindow; // Track the child window we clicked on to move a window. - ImGuiID MovingWindowMoveId; // == MovingWindow->MoveId - ImVector ColorModifiers; // Stack for PushStyleColor()/PopStyleColor() - ImVector StyleModifiers; // Stack for PushStyleVar()/PopStyleVar() - ImVector FontStack; // Stack for PushFont()/PopFont() - ImVector OpenPopupStack; // Which popups are open (persistent) - ImVector CurrentPopupStack; // Which level of BeginPopup() we are in (reset every frame) - - // Storage for SetNexWindow** and SetNextTreeNode*** functions - ImVec2 SetNextWindowPosVal; - ImVec2 SetNextWindowPosPivot; - ImVec2 SetNextWindowSizeVal; - ImVec2 SetNextWindowContentSizeVal; - bool SetNextWindowCollapsedVal; - ImGuiCond SetNextWindowPosCond; - ImGuiCond SetNextWindowSizeCond; - ImGuiCond SetNextWindowContentSizeCond; - ImGuiCond SetNextWindowCollapsedCond; - ImRect SetNextWindowSizeConstraintRect; // Valid if 'SetNextWindowSizeConstraint' is true - ImGuiSizeConstraintCallback SetNextWindowSizeConstraintCallback; - void* SetNextWindowSizeConstraintCallbackUserData; - bool SetNextWindowSizeConstraint; - bool SetNextWindowFocus; - bool SetNextTreeNodeOpenVal; - ImGuiCond SetNextTreeNodeOpenCond; - - // Render - ImDrawData RenderDrawData; // Main ImDrawData instance to pass render information to the user - ImVector RenderDrawLists[3]; - float ModalWindowDarkeningRatio; - ImDrawList OverlayDrawList; // Optional software render of mouse cursors, if io.MouseDrawCursor is set + a few debug overlays - ImGuiMouseCursor MouseCursor; - ImGuiMouseCursorData MouseCursorData[ImGuiMouseCursor_Count_]; - - // Drag and Drop - bool DragDropActive; - ImGuiDragDropFlags DragDropSourceFlags; - int DragDropMouseButton; - ImGuiPayload DragDropPayload; - ImRect DragDropTargetRect; - ImGuiID DragDropTargetId; - float DragDropAcceptIdCurrRectSurface; - ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload) - ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets) - int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source - ImVector DragDropPayloadBufHeap; // We don't expose the ImVector<> directly - unsigned char DragDropPayloadBufLocal[8]; - - // Widget state - ImGuiTextEditState InputTextState; - ImFont InputTextPasswordFont; - ImGuiID ScalarAsInputTextId; // Temporary text input when CTRL+clicking on a slider, etc. - ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets - ImVec4 ColorPickerRef; - float DragCurrentValue; // Currently dragged value, always float, not rounded by end-user precision settings - ImVec2 DragLastMouseDelta; - float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio - float DragSpeedScaleSlow; - float DragSpeedScaleFast; - ImVec2 ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage? - int TooltipOverrideCount; - ImVector PrivateClipboard; // If no custom clipboard handler is defined - ImVec2 OsImePosRequest, OsImePosSet; // Cursor position request & last passed to the OS Input Method Editor - - // Settings - float SettingsDirtyTimer; // Save .ini Settings on disk when time reaches zero - ImVector SettingsWindows; // .ini settings for ImGuiWindow - ImVector SettingsHandlers; // List of .ini settings handlers - - // Logging - bool LogEnabled; - FILE* LogFile; // If != NULL log to stdout/ file - ImGuiTextBuffer* LogClipboard; // Else log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators. - int LogStartDepth; - int LogAutoExpandMaxDepth; - - // Misc - float FramerateSecPerFrame[120]; // calculate estimate of framerate for user - int FramerateSecPerFrameIdx; - float FramerateSecPerFrameAccum; - int WantCaptureMouseNextFrame; // explicit capture via CaptureInputs() sets those flags - int WantCaptureKeyboardNextFrame; - int WantTextInputNextFrame; - char TempBuffer[1024*3+1]; // temporary text buffer - - ImGuiContext() : OverlayDrawList(NULL) - { - Initialized = false; - Font = NULL; - FontSize = FontBaseSize = 0.0f; - - Time = 0.0f; - FrameCount = 0; - FrameCountEnded = FrameCountRendered = -1; - WindowsActiveCount = 0; - CurrentWindow = NULL; - NavWindow = NULL; - HoveredWindow = NULL; - HoveredRootWindow = NULL; - HoveredId = 0; - HoveredIdAllowOverlap = false; - HoveredIdPreviousFrame = 0; - HoveredIdTimer = 0.0f; - ActiveId = 0; - ActiveIdPreviousFrame = 0; - ActiveIdTimer = 0.0f; - ActiveIdIsAlive = false; - ActiveIdIsJustActivated = false; - ActiveIdAllowOverlap = false; - ActiveIdClickOffset = ImVec2(-1,-1); - ActiveIdWindow = NULL; - MovingWindow = NULL; - MovingWindowMoveId = 0; - - SetNextWindowPosVal = ImVec2(0.0f, 0.0f); - SetNextWindowSizeVal = ImVec2(0.0f, 0.0f); - SetNextWindowCollapsedVal = false; - SetNextWindowPosCond = 0; - SetNextWindowSizeCond = 0; - SetNextWindowContentSizeCond = 0; - SetNextWindowCollapsedCond = 0; - SetNextWindowSizeConstraintRect = ImRect(); - SetNextWindowSizeConstraintCallback = NULL; - SetNextWindowSizeConstraintCallbackUserData = NULL; - SetNextWindowSizeConstraint = false; - SetNextWindowFocus = false; - SetNextTreeNodeOpenVal = false; - SetNextTreeNodeOpenCond = 0; - - DragDropActive = false; - DragDropSourceFlags = 0; - DragDropMouseButton = -1; - DragDropTargetId = 0; - DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0; - DragDropAcceptFrameCount = -1; - memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal)); - - ScalarAsInputTextId = 0; - ColorEditOptions = ImGuiColorEditFlags__OptionsDefault; - DragCurrentValue = 0.0f; - DragLastMouseDelta = ImVec2(0.0f, 0.0f); - DragSpeedDefaultRatio = 1.0f / 100.0f; - DragSpeedScaleSlow = 1.0f / 100.0f; - DragSpeedScaleFast = 10.0f; - ScrollbarClickDeltaToGrabCenter = ImVec2(0.0f, 0.0f); - TooltipOverrideCount = 0; - OsImePosRequest = OsImePosSet = ImVec2(-1.0f, -1.0f); - - ModalWindowDarkeningRatio = 0.0f; - OverlayDrawList._Data = &DrawListSharedData; - OverlayDrawList._OwnerName = "##Overlay"; // Give it a name for debugging - MouseCursor = ImGuiMouseCursor_Arrow; - memset(MouseCursorData, 0, sizeof(MouseCursorData)); - - SettingsDirtyTimer = 0.0f; - - LogEnabled = false; - LogFile = NULL; - LogClipboard = NULL; - LogStartDepth = 0; - LogAutoExpandMaxDepth = 2; - - memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame)); - FramerateSecPerFrameIdx = 0; - FramerateSecPerFrameAccum = 0.0f; - WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1; - memset(TempBuffer, 0, sizeof(TempBuffer)); - } -}; - -// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin(). -enum ImGuiItemFlags_ -{ - ImGuiItemFlags_AllowKeyboardFocus = 1 << 0, // true - ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings. - ImGuiItemFlags_Disabled = 1 << 2, // false // FIXME-WIP: Disable interactions but doesn't affect visuals. Should be: grey out and disable interactions with widgets that affect data + view widgets (WIP) - //ImGuiItemFlags_NoNav = 1 << 3, // false - //ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false - ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // MenuItem/Selectable() automatically closes current Popup window - ImGuiItemFlags_Default_ = ImGuiItemFlags_AllowKeyboardFocus -}; - -// Transient per-window data, reset at the beginning of the frame -// FIXME: That's theory, in practice the delimitation between ImGuiWindow and ImGuiDrawContext is quite tenuous and could be reconsidered. -struct IMGUI_API ImGuiDrawContext -{ - ImVec2 CursorPos; - ImVec2 CursorPosPrevLine; - ImVec2 CursorStartPos; - ImVec2 CursorMaxPos; // Used to implicitly calculate the size of our contents, always growing during the frame. Turned into window->SizeContents at the beginning of next frame - float CurrentLineHeight; - float CurrentLineTextBaseOffset; - float PrevLineHeight; - float PrevLineTextBaseOffset; - float LogLinePosY; - int TreeDepth; - ImGuiID LastItemId; - ImRect LastItemRect; - bool LastItemRectHoveredRect; - bool MenuBarAppending; - float MenuBarOffsetX; - ImVector ChildWindows; - ImGuiStorage* StateStorage; - ImGuiLayoutType LayoutType; - - // We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings. - ImGuiItemFlags ItemFlags; // == ItemFlagsStack.back() [empty == ImGuiItemFlags_Default] - float ItemWidth; // == ItemWidthStack.back(). 0.0: default, >0.0: width in pixels, <0.0: align xx pixels to the right of window - float TextWrapPos; // == TextWrapPosStack.back() [empty == -1.0f] - ImVectorItemFlagsStack; - ImVector ItemWidthStack; - ImVector TextWrapPosStack; - ImVectorGroupStack; - int StackSizesBackup[6]; // Store size of various stacks for asserting - - float IndentX; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.) - float GroupOffsetX; - float ColumnsOffsetX; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API. - ImGuiColumnsSet* ColumnsSet; // Current columns set - - ImGuiDrawContext() - { - CursorPos = CursorPosPrevLine = CursorStartPos = CursorMaxPos = ImVec2(0.0f, 0.0f); - CurrentLineHeight = PrevLineHeight = 0.0f; - CurrentLineTextBaseOffset = PrevLineTextBaseOffset = 0.0f; - LogLinePosY = -1.0f; - TreeDepth = 0; - LastItemId = 0; - LastItemRect = ImRect(); - LastItemRectHoveredRect = false; - MenuBarAppending = false; - MenuBarOffsetX = 0.0f; - StateStorage = NULL; - LayoutType = ImGuiLayoutType_Vertical; - ItemWidth = 0.0f; - ItemFlags = ImGuiItemFlags_Default_; - TextWrapPos = -1.0f; - memset(StackSizesBackup, 0, sizeof(StackSizesBackup)); - - IndentX = 0.0f; - GroupOffsetX = 0.0f; - ColumnsOffsetX = 0.0f; - ColumnsSet = NULL; - } -}; - -// Windows data -struct IMGUI_API ImGuiWindow -{ - char* Name; - ImGuiID ID; // == ImHash(Name) - ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_ - ImVec2 PosFloat; - ImVec2 Pos; // Position rounded-up to nearest pixel - ImVec2 Size; // Current size (==SizeFull or collapsed title bar size) - ImVec2 SizeFull; // Size when non collapsed - ImVec2 SizeFullAtLastBegin; // Copy of SizeFull at the end of Begin. This is the reference value we'll use on the next frame to decide if we need scrollbars. - ImVec2 SizeContents; // Size of contents (== extents reach of the drawing cursor) from previous frame. Include decoration, window title, border, menu, etc. - ImVec2 SizeContentsExplicit; // Size of contents explicitly set by the user via SetNextWindowContentSize() - ImRect ContentsRegionRect; // Maximum visible content position in window coordinates. ~~ (SizeContentsExplicit ? SizeContentsExplicit : Size - ScrollbarSizes) - CursorStartPos, per axis - ImVec2 WindowPadding; // Window padding at the time of begin. - float WindowRounding; // Window rounding at the time of begin. - float WindowBorderSize; // Window border size at the time of begin. - ImGuiID MoveId; // == window->GetID("#MOVE") - ImVec2 Scroll; - ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change) - ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered - bool ScrollbarX, ScrollbarY; - ImVec2 ScrollbarSizes; - bool Active; // Set to true on Begin() - bool WasActive; - bool WriteAccessed; // Set to true when any widget access the current window - bool Collapsed; // Set when collapsing window to become only title-bar - bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed) - bool Appearing; // Set during the frame where the window is appearing (or re-appearing) - bool CloseButton; // Set when the window has a close button (p_open != NULL) - int BeginOrderWithinParent; // Order within immediate parent window, if we are a child window. Otherwise 0. - int BeginOrderWithinContext; // Order within entire imgui context. This is mostly used for debugging submission order related issues. - int BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs) - ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling) - int AutoFitFramesX, AutoFitFramesY; - bool AutoFitOnlyGrows; - int AutoFitChildAxises; - ImGuiDir AutoPosLastDirection; - int HiddenFrames; - ImGuiCond SetWindowPosAllowFlags; // store condition flags for next SetWindowPos() call. - ImGuiCond SetWindowSizeAllowFlags; // store condition flags for next SetWindowSize() call. - ImGuiCond SetWindowCollapsedAllowFlags; // store condition flags for next SetWindowCollapsed() call. - ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size) - ImVec2 SetWindowPosPivot; // store window pivot for positioning. ImVec2(0,0) when positioning from top-left corner; ImVec2(0.5f,0.5f) for centering; ImVec2(1,1) for bottom right. - - ImGuiDrawContext DC; // Temporary per-window data, reset at the beginning of the frame - ImVector IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack - ImRect ClipRect; // = DrawList->clip_rect_stack.back(). Scissoring / clipping rectangle. x1, y1, x2, y2. - ImRect WindowRectClipped; // = WindowRect just after setup in Begin(). == window->Rect() for root window. - ImRect InnerRect; - int LastFrameActive; - float ItemWidthDefault; - ImGuiSimpleColumns MenuColumns; // Simplified columns storage for menu items - ImGuiStorage StateStorage; - ImVector ColumnsStorage; - float FontWindowScale; // Scale multiplier per-window - ImDrawList* DrawList; - ImGuiWindow* ParentWindow; // If we are a child _or_ popup window, this is pointing to our parent. Otherwise NULL. - ImGuiWindow* RootWindow; // Generally point to ourself. If we are a child window, this is pointing to the first non-child parent window. - ImGuiWindow* RootNonPopupWindow; // Generally point to ourself. Used to display TitleBgActive color and for selecting which window to use for NavWindowing - - // Navigation / Focus - int FocusIdxAllCounter; // Start at -1 and increase as assigned via FocusItemRegister() - int FocusIdxTabCounter; // (same, but only count widgets which you can Tab through) - int FocusIdxAllRequestCurrent; // Item being requested for focus - int FocusIdxTabRequestCurrent; // Tab-able item being requested for focus - int FocusIdxAllRequestNext; // Item being requested for focus, for next update (relies on layout to be stable between the frame pressing TAB and the next frame) - int FocusIdxTabRequestNext; // " - -public: - ImGuiWindow(ImGuiContext* context, const char* name); - ~ImGuiWindow(); - - ImGuiID GetID(const char* str, const char* str_end = NULL); - ImGuiID GetID(const void* ptr); - ImGuiID GetIDNoKeepAlive(const char* str, const char* str_end = NULL); - ImGuiID GetIDFromRectangle(const ImRect& r_abs); - - // We don't use g.FontSize because the window may be != g.CurrentWidow. - ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x+Size.x, Pos.y+Size.y); } - float CalcFontSize() const { return GImGui->FontBaseSize * FontWindowScale; } - float TitleBarHeight() const { return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f; } - ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); } - float MenuBarHeight() const { return (Flags & ImGuiWindowFlags_MenuBar) ? CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f : 0.0f; } - ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); } -}; - -// Backup and restore just enough data to be able to use IsItemHovered() on item A after another B in the same window has overwritten the data. -struct ImGuiItemHoveredDataBackup -{ - ImGuiID LastItemId; - ImRect LastItemRect; - bool LastItemRectHoveredRect; - - ImGuiItemHoveredDataBackup() { Backup(); } - void Backup() { ImGuiWindow* window = GImGui->CurrentWindow; LastItemId = window->DC.LastItemId; LastItemRect = window->DC.LastItemRect; LastItemRectHoveredRect = window->DC.LastItemRectHoveredRect; } - void Restore() const { ImGuiWindow* window = GImGui->CurrentWindow; window->DC.LastItemId = LastItemId; window->DC.LastItemRect = LastItemRect; window->DC.LastItemRectHoveredRect = LastItemRectHoveredRect; } -}; - -//----------------------------------------------------------------------------- -// Internal API -// No guarantee of forward compatibility here. -//----------------------------------------------------------------------------- - -namespace ImGui -{ - // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window) - // If this ever crash because g.CurrentWindow is NULL it means that either - // - ImGui::NewFrame() has never been called, which is illegal. - // - You are calling ImGui functions after ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal. - inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; } - inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; } - IMGUI_API ImGuiWindow* FindWindowByName(const char* name); - IMGUI_API void FocusWindow(ImGuiWindow* window); - IMGUI_API void BringWindowToFront(ImGuiWindow* window); - IMGUI_API void BringWindowToBack(ImGuiWindow* window); - IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent); - - IMGUI_API void Initialize(); - - IMGUI_API void MarkIniSettingsDirty(); - IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(ImGuiID type_id); - IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id); - - IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window); - IMGUI_API void ClearActiveID(); - IMGUI_API void SetHoveredID(ImGuiID id); - IMGUI_API void KeepAliveID(ImGuiID id); - - IMGUI_API void ItemSize(const ImVec2& size, float text_offset_y = 0.0f); - IMGUI_API void ItemSize(const ImRect& bb, float text_offset_y = 0.0f); - IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id); - IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id); - IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged); - IMGUI_API bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop = true); // Return true if focus is requested - IMGUI_API void FocusableItemUnregister(ImGuiWindow* window); - IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_x, float default_y); - IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x); - IMGUI_API void PushMultiItemsWidths(int components, float width_full = 0.0f); - IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled); - IMGUI_API void PopItemFlag(); - - IMGUI_API void OpenPopupEx(ImGuiID id, bool reopen_existing); - IMGUI_API void ClosePopup(ImGuiID id); - IMGUI_API bool IsPopupOpen(ImGuiID id); - IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags); - IMGUI_API void BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip = true); - - IMGUI_API int CalcTypematicPressedRepeatAmount(float t, float t_prev, float repeat_delay, float repeat_rate); - - IMGUI_API void Scrollbar(ImGuiLayoutType direction); - IMGUI_API void VerticalSeparator(); // Vertical separator, for menu bars (use current line height). not exposed because it is misleading what it doesn't have an effect on regular layout. - IMGUI_API bool SplitterBehavior(ImGuiID id, const ImRect& bb, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f); - - IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id); - IMGUI_API void ClearDragDrop(); - IMGUI_API bool IsDragDropPayloadBeingAccepted(); - - // FIXME-WIP: New Columns API - IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiColumnsFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns(). - IMGUI_API void EndColumns(); // close columns - IMGUI_API void PushColumnClipRect(int column_index = -1); - - // NB: All position are in absolute pixels coordinates (never using window coordinates internally) - // AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT. - IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true); - IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width); - IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0,0), const ImRect* clip_rect = NULL); - IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f); - IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f); - IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, int rounding_corners_flags = ~0); - IMGUI_API void RenderTriangle(ImVec2 pos, ImGuiDir dir, float scale = 1.0f); - IMGUI_API void RenderBullet(ImVec2 pos); - IMGUI_API void RenderCheckMark(ImVec2 pos, ImU32 col, float sz); - IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding); - IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text. - - IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0); - IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0,0), ImGuiButtonFlags flags = 0); - IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos, float radius); - IMGUI_API bool ArrowButton(ImGuiID id, ImGuiDir dir, ImVec2 padding, ImGuiButtonFlags flags = 0); - - IMGUI_API bool SliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_min, float v_max, float power, int decimal_precision, ImGuiSliderFlags flags = 0); - IMGUI_API bool SliderFloatN(const char* label, float* v, int components, float v_min, float v_max, const char* display_format, float power); - IMGUI_API bool SliderIntN(const char* label, int* v, int components, int v_min, int v_max, const char* display_format); - - IMGUI_API bool DragBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_speed, float v_min, float v_max, int decimal_precision, float power); - IMGUI_API bool DragFloatN(const char* label, float* v, int components, float v_speed, float v_min, float v_max, const char* display_format, float power); - IMGUI_API bool DragIntN(const char* label, int* v, int components, float v_speed, int v_min, int v_max, const char* display_format); - - IMGUI_API bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback = NULL, void* user_data = NULL); - IMGUI_API bool InputFloatN(const char* label, float* v, int components, int decimal_precision, ImGuiInputTextFlags extra_flags); - IMGUI_API bool InputIntN(const char* label, int* v, int components, ImGuiInputTextFlags extra_flags); - IMGUI_API bool InputScalarEx(const char* label, ImGuiDataType data_type, void* data_ptr, void* step_ptr, void* step_fast_ptr, const char* scalar_format, ImGuiInputTextFlags extra_flags); - IMGUI_API bool InputScalarAsWidgetReplacement(const ImRect& aabb, const char* label, ImGuiDataType data_type, void* data_ptr, ImGuiID id, int decimal_precision); - - IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags); - IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags); - - IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL); - IMGUI_API bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0); // Consume previous SetNextTreeNodeOpened() data, if any. May return true when logging - IMGUI_API void TreePushRawID(ImGuiID id); - - IMGUI_API void PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size); - - IMGUI_API int ParseFormatPrecision(const char* fmt, int default_value); - IMGUI_API float RoundScalar(float value, int decimal_precision); - - // Shade functions - IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawVert* vert_start, ImDrawVert* vert_end, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1); - IMGUI_API void ShadeVertsLinearAlphaGradientForLeftToRightText(ImDrawVert* vert_start, ImDrawVert* vert_end, float gradient_p0_x, float gradient_p1_x); - IMGUI_API void ShadeVertsLinearUV(ImDrawVert* vert_start, ImDrawVert* vert_end, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp); - -} // namespace ImGui - -// ImFontAtlas internals -IMGUI_API bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas); -IMGUI_API void ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas); -IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent); -IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* spc); -IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas); -IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor); -IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride); - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#ifdef _MSC_VER -#pragma warning (pop) -#endif diff --git a/vendor/librw/skeleton/imgui/stb_rect_pack.h b/vendor/librw/skeleton/imgui/stb_rect_pack.h deleted file mode 100644 index c75527d..0000000 --- a/vendor/librw/skeleton/imgui/stb_rect_pack.h +++ /dev/null @@ -1,583 +0,0 @@ -// stb_rect_pack.h - v0.10 - public domain - rectangle packing -// Sean Barrett 2014 -// -// Useful for e.g. packing rectangular textures into an atlas. -// Does not do rotation. -// -// Not necessarily the awesomest packing method, but better than -// the totally naive one in stb_truetype (which is primarily what -// this is meant to replace). -// -// Has only had a few tests run, may have issues. -// -// More docs to come. -// -// No memory allocations; uses qsort() and assert() from stdlib. -// Can override those by defining STBRP_SORT and STBRP_ASSERT. -// -// This library currently uses the Skyline Bottom-Left algorithm. -// -// Please note: better rectangle packers are welcome! Please -// implement them to the same API, but with a different init -// function. -// -// Credits -// -// Library -// Sean Barrett -// Minor features -// Martins Mozeiko -// Bugfixes / warning fixes -// Jeremy Jaussaud -// -// Version history: -// -// 0.10 (2016-10-25) remove cast-away-const to avoid warnings -// 0.09 (2016-08-27) fix compiler warnings -// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0) -// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0) -// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort -// 0.05: added STBRP_ASSERT to allow replacing assert -// 0.04: fixed minor bug in STBRP_LARGE_RECTS support -// 0.01: initial release -// -// LICENSE -// -// This software is dual-licensed to the public domain and under the following -// license: you are granted a perpetual, irrevocable license to copy, modify, -// publish, and distribute this file as you see fit. - -////////////////////////////////////////////////////////////////////////////// -// -// INCLUDE SECTION -// - -#ifndef STB_INCLUDE_STB_RECT_PACK_H -#define STB_INCLUDE_STB_RECT_PACK_H - -#define STB_RECT_PACK_VERSION 1 - -#ifdef STBRP_STATIC -#define STBRP_DEF static -#else -#define STBRP_DEF extern -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct stbrp_context stbrp_context; -typedef struct stbrp_node stbrp_node; -typedef struct stbrp_rect stbrp_rect; - -#ifdef STBRP_LARGE_RECTS -typedef int stbrp_coord; -#else -typedef unsigned short stbrp_coord; -#endif - -STBRP_DEF void stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects); -// Assign packed locations to rectangles. The rectangles are of type -// 'stbrp_rect' defined below, stored in the array 'rects', and there -// are 'num_rects' many of them. -// -// Rectangles which are successfully packed have the 'was_packed' flag -// set to a non-zero value and 'x' and 'y' store the minimum location -// on each axis (i.e. bottom-left in cartesian coordinates, top-left -// if you imagine y increasing downwards). Rectangles which do not fit -// have the 'was_packed' flag set to 0. -// -// You should not try to access the 'rects' array from another thread -// while this function is running, as the function temporarily reorders -// the array while it executes. -// -// To pack into another rectangle, you need to call stbrp_init_target -// again. To continue packing into the same rectangle, you can call -// this function again. Calling this multiple times with multiple rect -// arrays will probably produce worse packing results than calling it -// a single time with the full rectangle array, but the option is -// available. - -struct stbrp_rect -{ - // reserved for your use: - int id; - - // input: - stbrp_coord w, h; - - // output: - stbrp_coord x, y; - int was_packed; // non-zero if valid packing - -}; // 16 bytes, nominally - - -STBRP_DEF void stbrp_init_target (stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes); -// Initialize a rectangle packer to: -// pack a rectangle that is 'width' by 'height' in dimensions -// using temporary storage provided by the array 'nodes', which is 'num_nodes' long -// -// You must call this function every time you start packing into a new target. -// -// There is no "shutdown" function. The 'nodes' memory must stay valid for -// the following stbrp_pack_rects() call (or calls), but can be freed after -// the call (or calls) finish. -// -// Note: to guarantee best results, either: -// 1. make sure 'num_nodes' >= 'width' -// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1' -// -// If you don't do either of the above things, widths will be quantized to multiples -// of small integers to guarantee the algorithm doesn't run out of temporary storage. -// -// If you do #2, then the non-quantized algorithm will be used, but the algorithm -// may run out of temporary storage and be unable to pack some rectangles. - -STBRP_DEF void stbrp_setup_allow_out_of_mem (stbrp_context *context, int allow_out_of_mem); -// Optionally call this function after init but before doing any packing to -// change the handling of the out-of-temp-memory scenario, described above. -// If you call init again, this will be reset to the default (false). - - -STBRP_DEF void stbrp_setup_heuristic (stbrp_context *context, int heuristic); -// Optionally select which packing heuristic the library should use. Different -// heuristics will produce better/worse results for different data sets. -// If you call init again, this will be reset to the default. - -enum -{ - STBRP_HEURISTIC_Skyline_default=0, - STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, - STBRP_HEURISTIC_Skyline_BF_sortHeight -}; - - -////////////////////////////////////////////////////////////////////////////// -// -// the details of the following structures don't matter to you, but they must -// be visible so you can handle the memory allocations for them - -struct stbrp_node -{ - stbrp_coord x,y; - stbrp_node *next; -}; - -struct stbrp_context -{ - int width; - int height; - int align; - int init_mode; - int heuristic; - int num_nodes; - stbrp_node *active_head; - stbrp_node *free_head; - stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' -}; - -#ifdef __cplusplus -} -#endif - -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// IMPLEMENTATION SECTION -// - -#ifdef STB_RECT_PACK_IMPLEMENTATION -#ifndef STBRP_SORT -#include -#define STBRP_SORT qsort -#endif - -#ifndef STBRP_ASSERT -#include -#define STBRP_ASSERT assert -#endif - -#ifdef _MSC_VER -#define STBRP__NOTUSED(v) (void)(v) -#else -#define STBRP__NOTUSED(v) (void)sizeof(v) -#endif - -enum -{ - STBRP__INIT_skyline = 1 -}; - -STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic) -{ - switch (context->init_mode) { - case STBRP__INIT_skyline: - STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight); - context->heuristic = heuristic; - break; - default: - STBRP_ASSERT(0); - } -} - -STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem) -{ - if (allow_out_of_mem) - // if it's ok to run out of memory, then don't bother aligning them; - // this gives better packing, but may fail due to OOM (even though - // the rectangles easily fit). @TODO a smarter approach would be to only - // quantize once we've hit OOM, then we could get rid of this parameter. - context->align = 1; - else { - // if it's not ok to run out of memory, then quantize the widths - // so that num_nodes is always enough nodes. - // - // I.e. num_nodes * align >= width - // align >= width / num_nodes - // align = ceil(width/num_nodes) - - context->align = (context->width + context->num_nodes-1) / context->num_nodes; - } -} - -STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes) -{ - int i; -#ifndef STBRP_LARGE_RECTS - STBRP_ASSERT(width <= 0xffff && height <= 0xffff); -#endif - - for (i=0; i < num_nodes-1; ++i) - nodes[i].next = &nodes[i+1]; - nodes[i].next = NULL; - context->init_mode = STBRP__INIT_skyline; - context->heuristic = STBRP_HEURISTIC_Skyline_default; - context->free_head = &nodes[0]; - context->active_head = &context->extra[0]; - context->width = width; - context->height = height; - context->num_nodes = num_nodes; - stbrp_setup_allow_out_of_mem(context, 0); - - // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) - context->extra[0].x = 0; - context->extra[0].y = 0; - context->extra[0].next = &context->extra[1]; - context->extra[1].x = (stbrp_coord) width; -#ifdef STBRP_LARGE_RECTS - context->extra[1].y = (1<<30); -#else - context->extra[1].y = 65535; -#endif - context->extra[1].next = NULL; -} - -// find minimum y position if it starts at x1 -static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste) -{ - stbrp_node *node = first; - int x1 = x0 + width; - int min_y, visited_width, waste_area; - - STBRP__NOTUSED(c); - - STBRP_ASSERT(first->x <= x0); - - #if 0 - // skip in case we're past the node - while (node->next->x <= x0) - ++node; - #else - STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency - #endif - - STBRP_ASSERT(node->x <= x0); - - min_y = 0; - waste_area = 0; - visited_width = 0; - while (node->x < x1) { - if (node->y > min_y) { - // raise min_y higher. - // we've accounted for all waste up to min_y, - // but we'll now add more waste for everything we've visted - waste_area += visited_width * (node->y - min_y); - min_y = node->y; - // the first time through, visited_width might be reduced - if (node->x < x0) - visited_width += node->next->x - x0; - else - visited_width += node->next->x - node->x; - } else { - // add waste area - int under_width = node->next->x - node->x; - if (under_width + visited_width > width) - under_width = width - visited_width; - waste_area += under_width * (min_y - node->y); - visited_width += under_width; - } - node = node->next; - } - - *pwaste = waste_area; - return min_y; -} - -typedef struct -{ - int x,y; - stbrp_node **prev_link; -} stbrp__findresult; - -static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height) -{ - int best_waste = (1<<30), best_x, best_y = (1 << 30); - stbrp__findresult fr; - stbrp_node **prev, *node, *tail, **best = NULL; - - // align to multiple of c->align - width = (width + c->align - 1); - width -= width % c->align; - STBRP_ASSERT(width % c->align == 0); - - node = c->active_head; - prev = &c->active_head; - while (node->x + width <= c->width) { - int y,waste; - y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); - if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL - // bottom left - if (y < best_y) { - best_y = y; - best = prev; - } - } else { - // best-fit - if (y + height <= c->height) { - // can only use it if it first vertically - if (y < best_y || (y == best_y && waste < best_waste)) { - best_y = y; - best_waste = waste; - best = prev; - } - } - } - prev = &node->next; - node = node->next; - } - - best_x = (best == NULL) ? 0 : (*best)->x; - - // if doing best-fit (BF), we also have to try aligning right edge to each node position - // - // e.g, if fitting - // - // ____________________ - // |____________________| - // - // into - // - // | | - // | ____________| - // |____________| - // - // then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned - // - // This makes BF take about 2x the time - - if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) { - tail = c->active_head; - node = c->active_head; - prev = &c->active_head; - // find first node that's admissible - while (tail->x < width) - tail = tail->next; - while (tail) { - int xpos = tail->x - width; - int y,waste; - STBRP_ASSERT(xpos >= 0); - // find the left position that matches this - while (node->next->x <= xpos) { - prev = &node->next; - node = node->next; - } - STBRP_ASSERT(node->next->x > xpos && node->x <= xpos); - y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); - if (y + height < c->height) { - if (y <= best_y) { - if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) { - best_x = xpos; - STBRP_ASSERT(y <= best_y); - best_y = y; - best_waste = waste; - best = prev; - } - } - } - tail = tail->next; - } - } - - fr.prev_link = best; - fr.x = best_x; - fr.y = best_y; - return fr; -} - -static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height) -{ - // find best position according to heuristic - stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height); - stbrp_node *node, *cur; - - // bail if: - // 1. it failed - // 2. the best node doesn't fit (we don't always check this) - // 3. we're out of memory - if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) { - res.prev_link = NULL; - return res; - } - - // on success, create new node - node = context->free_head; - node->x = (stbrp_coord) res.x; - node->y = (stbrp_coord) (res.y + height); - - context->free_head = node->next; - - // insert the new node into the right starting point, and - // let 'cur' point to the remaining nodes needing to be - // stiched back in - - cur = *res.prev_link; - if (cur->x < res.x) { - // preserve the existing one, so start testing with the next one - stbrp_node *next = cur->next; - cur->next = node; - cur = next; - } else { - *res.prev_link = node; - } - - // from here, traverse cur and free the nodes, until we get to one - // that shouldn't be freed - while (cur->next && cur->next->x <= res.x + width) { - stbrp_node *next = cur->next; - // move the current node to the free list - cur->next = context->free_head; - context->free_head = cur; - cur = next; - } - - // stitch the list back in - node->next = cur; - - if (cur->x < res.x + width) - cur->x = (stbrp_coord) (res.x + width); - -#ifdef _DEBUG - cur = context->active_head; - while (cur->x < context->width) { - STBRP_ASSERT(cur->x < cur->next->x); - cur = cur->next; - } - STBRP_ASSERT(cur->next == NULL); - - { - stbrp_node *L1 = NULL, *L2 = NULL; - int count=0; - cur = context->active_head; - while (cur) { - L1 = cur; - cur = cur->next; - ++count; - } - cur = context->free_head; - while (cur) { - L2 = cur; - cur = cur->next; - ++count; - } - STBRP_ASSERT(count == context->num_nodes+2); - } -#endif - - return res; -} - -static int rect_height_compare(const void *a, const void *b) -{ - const stbrp_rect *p = (const stbrp_rect *) a; - const stbrp_rect *q = (const stbrp_rect *) b; - if (p->h > q->h) - return -1; - if (p->h < q->h) - return 1; - return (p->w > q->w) ? -1 : (p->w < q->w); -} - -static int rect_width_compare(const void *a, const void *b) -{ - const stbrp_rect *p = (const stbrp_rect *) a; - const stbrp_rect *q = (const stbrp_rect *) b; - if (p->w > q->w) - return -1; - if (p->w < q->w) - return 1; - return (p->h > q->h) ? -1 : (p->h < q->h); -} - -static int rect_original_order(const void *a, const void *b) -{ - const stbrp_rect *p = (const stbrp_rect *) a; - const stbrp_rect *q = (const stbrp_rect *) b; - return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); -} - -#ifdef STBRP_LARGE_RECTS -#define STBRP__MAXVAL 0xffffffff -#else -#define STBRP__MAXVAL 0xffff -#endif - -STBRP_DEF void stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects) -{ - int i; - - // we use the 'was_packed' field internally to allow sorting/unsorting - for (i=0; i < num_rects; ++i) { - rects[i].was_packed = i; - #ifndef STBRP_LARGE_RECTS - STBRP_ASSERT(rects[i].w <= 0xffff && rects[i].h <= 0xffff); - #endif - } - - // sort according to heuristic - STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare); - - for (i=0; i < num_rects; ++i) { - if (rects[i].w == 0 || rects[i].h == 0) { - rects[i].x = rects[i].y = 0; // empty rect needs no space - } else { - stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); - if (fr.prev_link) { - rects[i].x = (stbrp_coord) fr.x; - rects[i].y = (stbrp_coord) fr.y; - } else { - rects[i].x = rects[i].y = STBRP__MAXVAL; - } - } - } - - // unsort - STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); - - // set was_packed flags - for (i=0; i < num_rects; ++i) - rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); -} -#endif diff --git a/vendor/librw/skeleton/imgui/stb_textedit.h b/vendor/librw/skeleton/imgui/stb_textedit.h deleted file mode 100644 index 4b731a0..0000000 --- a/vendor/librw/skeleton/imgui/stb_textedit.h +++ /dev/null @@ -1,1322 +0,0 @@ -// [ImGui] this is a slightly modified version of stb_truetype.h 1.9. Those changes would need to be pushed into nothings/sb -// [ImGui] - fixed linestart handler when over last character of multi-line buffer + simplified existing code (#588, #815) -// [ImGui] - fixed a state corruption/crash bug in stb_text_redo and stb_textedit_discard_redo (#715) -// [ImGui] - fixed a crash bug in stb_textedit_discard_redo (#681) -// [ImGui] - fixed some minor warnings - -// stb_textedit.h - v1.9 - public domain - Sean Barrett -// Development of this library was sponsored by RAD Game Tools -// -// This C header file implements the guts of a multi-line text-editing -// widget; you implement display, word-wrapping, and low-level string -// insertion/deletion, and stb_textedit will map user inputs into -// insertions & deletions, plus updates to the cursor position, -// selection state, and undo state. -// -// It is intended for use in games and other systems that need to build -// their own custom widgets and which do not have heavy text-editing -// requirements (this library is not recommended for use for editing large -// texts, as its performance does not scale and it has limited undo). -// -// Non-trivial behaviors are modelled after Windows text controls. -// -// -// LICENSE -// -// This software is dual-licensed to the public domain and under the following -// license: you are granted a perpetual, irrevocable license to copy, modify, -// publish, and distribute this file as you see fit. -// -// -// DEPENDENCIES -// -// Uses the C runtime function 'memmove', which you can override -// by defining STB_TEXTEDIT_memmove before the implementation. -// Uses no other functions. Performs no runtime allocations. -// -// -// VERSION HISTORY -// -// 1.9 (2016-08-27) customizable move-by-word -// 1.8 (2016-04-02) better keyboard handling when mouse button is down -// 1.7 (2015-09-13) change y range handling in case baseline is non-0 -// 1.6 (2015-04-15) allow STB_TEXTEDIT_memmove -// 1.5 (2014-09-10) add support for secondary keys for OS X -// 1.4 (2014-08-17) fix signed/unsigned warnings -// 1.3 (2014-06-19) fix mouse clicking to round to nearest char boundary -// 1.2 (2014-05-27) fix some RAD types that had crept into the new code -// 1.1 (2013-12-15) move-by-word (requires STB_TEXTEDIT_IS_SPACE ) -// 1.0 (2012-07-26) improve documentation, initial public release -// 0.3 (2012-02-24) bugfixes, single-line mode; insert mode -// 0.2 (2011-11-28) fixes to undo/redo -// 0.1 (2010-07-08) initial version -// -// ADDITIONAL CONTRIBUTORS -// -// Ulf Winklemann: move-by-word in 1.1 -// Fabian Giesen: secondary key inputs in 1.5 -// Martins Mozeiko: STB_TEXTEDIT_memmove -// -// Bugfixes: -// Scott Graham -// Daniel Keller -// Omar Cornut -// -// USAGE -// -// This file behaves differently depending on what symbols you define -// before including it. -// -// -// Header-file mode: -// -// If you do not define STB_TEXTEDIT_IMPLEMENTATION before including this, -// it will operate in "header file" mode. In this mode, it declares a -// single public symbol, STB_TexteditState, which encapsulates the current -// state of a text widget (except for the string, which you will store -// separately). -// -// To compile in this mode, you must define STB_TEXTEDIT_CHARTYPE to a -// primitive type that defines a single character (e.g. char, wchar_t, etc). -// -// To save space or increase undo-ability, you can optionally define the -// following things that are used by the undo system: -// -// STB_TEXTEDIT_POSITIONTYPE small int type encoding a valid cursor position -// STB_TEXTEDIT_UNDOSTATECOUNT the number of undo states to allow -// STB_TEXTEDIT_UNDOCHARCOUNT the number of characters to store in the undo buffer -// -// If you don't define these, they are set to permissive types and -// moderate sizes. The undo system does no memory allocations, so -// it grows STB_TexteditState by the worst-case storage which is (in bytes): -// -// [4 + sizeof(STB_TEXTEDIT_POSITIONTYPE)] * STB_TEXTEDIT_UNDOSTATE_COUNT -// + sizeof(STB_TEXTEDIT_CHARTYPE) * STB_TEXTEDIT_UNDOCHAR_COUNT -// -// -// Implementation mode: -// -// If you define STB_TEXTEDIT_IMPLEMENTATION before including this, it -// will compile the implementation of the text edit widget, depending -// on a large number of symbols which must be defined before the include. -// -// The implementation is defined only as static functions. You will then -// need to provide your own APIs in the same file which will access the -// static functions. -// -// The basic concept is that you provide a "string" object which -// behaves like an array of characters. stb_textedit uses indices to -// refer to positions in the string, implicitly representing positions -// in the displayed textedit. This is true for both plain text and -// rich text; even with rich text stb_truetype interacts with your -// code as if there was an array of all the displayed characters. -// -// Symbols that must be the same in header-file and implementation mode: -// -// STB_TEXTEDIT_CHARTYPE the character type -// STB_TEXTEDIT_POSITIONTYPE small type that a valid cursor position -// STB_TEXTEDIT_UNDOSTATECOUNT the number of undo states to allow -// STB_TEXTEDIT_UNDOCHARCOUNT the number of characters to store in the undo buffer -// -// Symbols you must define for implementation mode: -// -// STB_TEXTEDIT_STRING the type of object representing a string being edited, -// typically this is a wrapper object with other data you need -// -// STB_TEXTEDIT_STRINGLEN(obj) the length of the string (ideally O(1)) -// STB_TEXTEDIT_LAYOUTROW(&r,obj,n) returns the results of laying out a line of characters -// starting from character #n (see discussion below) -// STB_TEXTEDIT_GETWIDTH(obj,n,i) returns the pixel delta from the xpos of the i'th character -// to the xpos of the i+1'th char for a line of characters -// starting at character #n (i.e. accounts for kerning -// with previous char) -// STB_TEXTEDIT_KEYTOTEXT(k) maps a keyboard input to an insertable character -// (return type is int, -1 means not valid to insert) -// STB_TEXTEDIT_GETCHAR(obj,i) returns the i'th character of obj, 0-based -// STB_TEXTEDIT_NEWLINE the character returned by _GETCHAR() we recognize -// as manually wordwrapping for end-of-line positioning -// -// STB_TEXTEDIT_DELETECHARS(obj,i,n) delete n characters starting at i -// STB_TEXTEDIT_INSERTCHARS(obj,i,c*,n) insert n characters at i (pointed to by STB_TEXTEDIT_CHARTYPE*) -// -// STB_TEXTEDIT_K_SHIFT a power of two that is or'd in to a keyboard input to represent the shift key -// -// STB_TEXTEDIT_K_LEFT keyboard input to move cursor left -// STB_TEXTEDIT_K_RIGHT keyboard input to move cursor right -// STB_TEXTEDIT_K_UP keyboard input to move cursor up -// STB_TEXTEDIT_K_DOWN keyboard input to move cursor down -// STB_TEXTEDIT_K_LINESTART keyboard input to move cursor to start of line // e.g. HOME -// STB_TEXTEDIT_K_LINEEND keyboard input to move cursor to end of line // e.g. END -// STB_TEXTEDIT_K_TEXTSTART keyboard input to move cursor to start of text // e.g. ctrl-HOME -// STB_TEXTEDIT_K_TEXTEND keyboard input to move cursor to end of text // e.g. ctrl-END -// STB_TEXTEDIT_K_DELETE keyboard input to delete selection or character under cursor -// STB_TEXTEDIT_K_BACKSPACE keyboard input to delete selection or character left of cursor -// STB_TEXTEDIT_K_UNDO keyboard input to perform undo -// STB_TEXTEDIT_K_REDO keyboard input to perform redo -// -// Optional: -// STB_TEXTEDIT_K_INSERT keyboard input to toggle insert mode -// STB_TEXTEDIT_IS_SPACE(ch) true if character is whitespace (e.g. 'isspace'), -// required for default WORDLEFT/WORDRIGHT handlers -// STB_TEXTEDIT_MOVEWORDLEFT(obj,i) custom handler for WORDLEFT, returns index to move cursor to -// STB_TEXTEDIT_MOVEWORDRIGHT(obj,i) custom handler for WORDRIGHT, returns index to move cursor to -// STB_TEXTEDIT_K_WORDLEFT keyboard input to move cursor left one word // e.g. ctrl-LEFT -// STB_TEXTEDIT_K_WORDRIGHT keyboard input to move cursor right one word // e.g. ctrl-RIGHT -// STB_TEXTEDIT_K_LINESTART2 secondary keyboard input to move cursor to start of line -// STB_TEXTEDIT_K_LINEEND2 secondary keyboard input to move cursor to end of line -// STB_TEXTEDIT_K_TEXTSTART2 secondary keyboard input to move cursor to start of text -// STB_TEXTEDIT_K_TEXTEND2 secondary keyboard input to move cursor to end of text -// -// Todo: -// STB_TEXTEDIT_K_PGUP keyboard input to move cursor up a page -// STB_TEXTEDIT_K_PGDOWN keyboard input to move cursor down a page -// -// Keyboard input must be encoded as a single integer value; e.g. a character code -// and some bitflags that represent shift states. to simplify the interface, SHIFT must -// be a bitflag, so we can test the shifted state of cursor movements to allow selection, -// i.e. (STB_TEXTED_K_RIGHT|STB_TEXTEDIT_K_SHIFT) should be shifted right-arrow. -// -// You can encode other things, such as CONTROL or ALT, in additional bits, and -// then test for their presence in e.g. STB_TEXTEDIT_K_WORDLEFT. For example, -// my Windows implementations add an additional CONTROL bit, and an additional KEYDOWN -// bit. Then all of the STB_TEXTEDIT_K_ values bitwise-or in the KEYDOWN bit, -// and I pass both WM_KEYDOWN and WM_CHAR events to the "key" function in the -// API below. The control keys will only match WM_KEYDOWN events because of the -// keydown bit I add, and STB_TEXTEDIT_KEYTOTEXT only tests for the KEYDOWN -// bit so it only decodes WM_CHAR events. -// -// STB_TEXTEDIT_LAYOUTROW returns information about the shape of one displayed -// row of characters assuming they start on the i'th character--the width and -// the height and the number of characters consumed. This allows this library -// to traverse the entire layout incrementally. You need to compute word-wrapping -// here. -// -// Each textfield keeps its own insert mode state, which is not how normal -// applications work. To keep an app-wide insert mode, update/copy the -// "insert_mode" field of STB_TexteditState before/after calling API functions. -// -// API -// -// void stb_textedit_initialize_state(STB_TexteditState *state, int is_single_line) -// -// void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) -// void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) -// int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -// int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len) -// void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int key) -// -// Each of these functions potentially updates the string and updates the -// state. -// -// initialize_state: -// set the textedit state to a known good default state when initially -// constructing the textedit. -// -// click: -// call this with the mouse x,y on a mouse down; it will update the cursor -// and reset the selection start/end to the cursor point. the x,y must -// be relative to the text widget, with (0,0) being the top left. -// -// drag: -// call this with the mouse x,y on a mouse drag/up; it will update the -// cursor and the selection end point -// -// cut: -// call this to delete the current selection; returns true if there was -// one. you should FIRST copy the current selection to the system paste buffer. -// (To copy, just copy the current selection out of the string yourself.) -// -// paste: -// call this to paste text at the current cursor point or over the current -// selection if there is one. -// -// key: -// call this for keyboard inputs sent to the textfield. you can use it -// for "key down" events or for "translated" key events. if you need to -// do both (as in Win32), or distinguish Unicode characters from control -// inputs, set a high bit to distinguish the two; then you can define the -// various definitions like STB_TEXTEDIT_K_LEFT have the is-key-event bit -// set, and make STB_TEXTEDIT_KEYTOCHAR check that the is-key-event bit is -// clear. -// -// When rendering, you can read the cursor position and selection state from -// the STB_TexteditState. -// -// -// Notes: -// -// This is designed to be usable in IMGUI, so it allows for the possibility of -// running in an IMGUI that has NOT cached the multi-line layout. For this -// reason, it provides an interface that is compatible with computing the -// layout incrementally--we try to make sure we make as few passes through -// as possible. (For example, to locate the mouse pointer in the text, we -// could define functions that return the X and Y positions of characters -// and binary search Y and then X, but if we're doing dynamic layout this -// will run the layout algorithm many times, so instead we manually search -// forward in one pass. Similar logic applies to e.g. up-arrow and -// down-arrow movement.) -// -// If it's run in a widget that *has* cached the layout, then this is less -// efficient, but it's not horrible on modern computers. But you wouldn't -// want to edit million-line files with it. - - -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// -//// -//// Header-file mode -//// -//// - -#ifndef INCLUDE_STB_TEXTEDIT_H -#define INCLUDE_STB_TEXTEDIT_H - -//////////////////////////////////////////////////////////////////////// -// -// STB_TexteditState -// -// Definition of STB_TexteditState which you should store -// per-textfield; it includes cursor position, selection state, -// and undo state. -// - -#ifndef STB_TEXTEDIT_UNDOSTATECOUNT -#define STB_TEXTEDIT_UNDOSTATECOUNT 99 -#endif -#ifndef STB_TEXTEDIT_UNDOCHARCOUNT -#define STB_TEXTEDIT_UNDOCHARCOUNT 999 -#endif -#ifndef STB_TEXTEDIT_CHARTYPE -#define STB_TEXTEDIT_CHARTYPE int -#endif -#ifndef STB_TEXTEDIT_POSITIONTYPE -#define STB_TEXTEDIT_POSITIONTYPE int -#endif - -typedef struct -{ - // private data - STB_TEXTEDIT_POSITIONTYPE where; - short insert_length; - short delete_length; - short char_storage; -} StbUndoRecord; - -typedef struct -{ - // private data - StbUndoRecord undo_rec [STB_TEXTEDIT_UNDOSTATECOUNT]; - STB_TEXTEDIT_CHARTYPE undo_char[STB_TEXTEDIT_UNDOCHARCOUNT]; - short undo_point, redo_point; - short undo_char_point, redo_char_point; -} StbUndoState; - -typedef struct -{ - ///////////////////// - // - // public data - // - - int cursor; - // position of the text cursor within the string - - int select_start; // selection start point - int select_end; - // selection start and end point in characters; if equal, no selection. - // note that start may be less than or greater than end (e.g. when - // dragging the mouse, start is where the initial click was, and you - // can drag in either direction) - - unsigned char insert_mode; - // each textfield keeps its own insert mode state. to keep an app-wide - // insert mode, copy this value in/out of the app state - - ///////////////////// - // - // private data - // - unsigned char cursor_at_end_of_line; // not implemented yet - unsigned char initialized; - unsigned char has_preferred_x; - unsigned char single_line; - unsigned char padding1, padding2, padding3; - float preferred_x; // this determines where the cursor up/down tries to seek to along x - StbUndoState undostate; -} STB_TexteditState; - - -//////////////////////////////////////////////////////////////////////// -// -// StbTexteditRow -// -// Result of layout query, used by stb_textedit to determine where -// the text in each row is. - -// result of layout query -typedef struct -{ - float x0,x1; // starting x location, end x location (allows for align=right, etc) - float baseline_y_delta; // position of baseline relative to previous row's baseline - float ymin,ymax; // height of row above and below baseline - int num_chars; -} StbTexteditRow; -#endif //INCLUDE_STB_TEXTEDIT_H - - -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// -//// -//// Implementation mode -//// -//// - - -// implementation isn't include-guarded, since it might have indirectly -// included just the "header" portion -#ifdef STB_TEXTEDIT_IMPLEMENTATION - -#ifndef STB_TEXTEDIT_memmove -#include -#define STB_TEXTEDIT_memmove memmove -#endif - - -///////////////////////////////////////////////////////////////////////////// -// -// Mouse input handling -// - -// traverse the layout to locate the nearest character to a display position -static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y) -{ - StbTexteditRow r; - int n = STB_TEXTEDIT_STRINGLEN(str); - float base_y = 0, prev_x; - int i=0, k; - - r.x0 = r.x1 = 0; - r.ymin = r.ymax = 0; - r.num_chars = 0; - - // search rows to find one that straddles 'y' - while (i < n) { - STB_TEXTEDIT_LAYOUTROW(&r, str, i); - if (r.num_chars <= 0) - return n; - - if (i==0 && y < base_y + r.ymin) - return 0; - - if (y < base_y + r.ymax) - break; - - i += r.num_chars; - base_y += r.baseline_y_delta; - } - - // below all text, return 'after' last character - if (i >= n) - return n; - - // check if it's before the beginning of the line - if (x < r.x0) - return i; - - // check if it's before the end of the line - if (x < r.x1) { - // search characters in row for one that straddles 'x' - prev_x = r.x0; - for (k=0; k < r.num_chars; ++k) { - float w = STB_TEXTEDIT_GETWIDTH(str, i, k); - if (x < prev_x+w) { - if (x < prev_x+w/2) - return k+i; - else - return k+i+1; - } - prev_x += w; - } - // shouldn't happen, but if it does, fall through to end-of-line case - } - - // if the last character is a newline, return that. otherwise return 'after' the last character - if (STB_TEXTEDIT_GETCHAR(str, i+r.num_chars-1) == STB_TEXTEDIT_NEWLINE) - return i+r.num_chars-1; - else - return i+r.num_chars; -} - -// API click: on mouse down, move the cursor to the clicked location, and reset the selection -static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) -{ - state->cursor = stb_text_locate_coord(str, x, y); - state->select_start = state->cursor; - state->select_end = state->cursor; - state->has_preferred_x = 0; -} - -// API drag: on mouse drag, move the cursor and selection endpoint to the clicked location -static void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) -{ - int p = stb_text_locate_coord(str, x, y); - if (state->select_start == state->select_end) - state->select_start = state->cursor; - state->cursor = state->select_end = p; -} - -///////////////////////////////////////////////////////////////////////////// -// -// Keyboard input handling -// - -// forward declarations -static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state); -static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state); -static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length); -static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length); -static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length); - -typedef struct -{ - float x,y; // position of n'th character - float height; // height of line - int first_char, length; // first char of row, and length - int prev_first; // first char of previous row -} StbFindState; - -// find the x/y location of a character, and remember info about the previous row in -// case we get a move-up event (for page up, we'll have to rescan) -static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *str, int n, int single_line) -{ - StbTexteditRow r; - int prev_start = 0; - int z = STB_TEXTEDIT_STRINGLEN(str); - int i=0, first; - - if (n == z) { - // if it's at the end, then find the last line -- simpler than trying to - // explicitly handle this case in the regular code - if (single_line) { - STB_TEXTEDIT_LAYOUTROW(&r, str, 0); - find->y = 0; - find->first_char = 0; - find->length = z; - find->height = r.ymax - r.ymin; - find->x = r.x1; - } else { - find->y = 0; - find->x = 0; - find->height = 1; - while (i < z) { - STB_TEXTEDIT_LAYOUTROW(&r, str, i); - prev_start = i; - i += r.num_chars; - } - find->first_char = i; - find->length = 0; - find->prev_first = prev_start; - } - return; - } - - // search rows to find the one that straddles character n - find->y = 0; - - for(;;) { - STB_TEXTEDIT_LAYOUTROW(&r, str, i); - if (n < i + r.num_chars) - break; - prev_start = i; - i += r.num_chars; - find->y += r.baseline_y_delta; - } - - find->first_char = first = i; - find->length = r.num_chars; - find->height = r.ymax - r.ymin; - find->prev_first = prev_start; - - // now scan to find xpos - find->x = r.x0; - i = 0; - for (i=0; first+i < n; ++i) - find->x += STB_TEXTEDIT_GETWIDTH(str, first, i); -} - -#define STB_TEXT_HAS_SELECTION(s) ((s)->select_start != (s)->select_end) - -// make the selection/cursor state valid if client altered the string -static void stb_textedit_clamp(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -{ - int n = STB_TEXTEDIT_STRINGLEN(str); - if (STB_TEXT_HAS_SELECTION(state)) { - if (state->select_start > n) state->select_start = n; - if (state->select_end > n) state->select_end = n; - // if clamping forced them to be equal, move the cursor to match - if (state->select_start == state->select_end) - state->cursor = state->select_start; - } - if (state->cursor > n) state->cursor = n; -} - -// delete characters while updating undo -static void stb_textedit_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int len) -{ - stb_text_makeundo_delete(str, state, where, len); - STB_TEXTEDIT_DELETECHARS(str, where, len); - state->has_preferred_x = 0; -} - -// delete the section -static void stb_textedit_delete_selection(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -{ - stb_textedit_clamp(str, state); - if (STB_TEXT_HAS_SELECTION(state)) { - if (state->select_start < state->select_end) { - stb_textedit_delete(str, state, state->select_start, state->select_end - state->select_start); - state->select_end = state->cursor = state->select_start; - } else { - stb_textedit_delete(str, state, state->select_end, state->select_start - state->select_end); - state->select_start = state->cursor = state->select_end; - } - state->has_preferred_x = 0; - } -} - -// canoncialize the selection so start <= end -static void stb_textedit_sortselection(STB_TexteditState *state) -{ - if (state->select_end < state->select_start) { - int temp = state->select_end; - state->select_end = state->select_start; - state->select_start = temp; - } -} - -// move cursor to first character of selection -static void stb_textedit_move_to_first(STB_TexteditState *state) -{ - if (STB_TEXT_HAS_SELECTION(state)) { - stb_textedit_sortselection(state); - state->cursor = state->select_start; - state->select_end = state->select_start; - state->has_preferred_x = 0; - } -} - -// move cursor to last character of selection -static void stb_textedit_move_to_last(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -{ - if (STB_TEXT_HAS_SELECTION(state)) { - stb_textedit_sortselection(state); - stb_textedit_clamp(str, state); - state->cursor = state->select_end; - state->select_start = state->select_end; - state->has_preferred_x = 0; - } -} - -#ifdef STB_TEXTEDIT_IS_SPACE -static int is_word_boundary( STB_TEXTEDIT_STRING *str, int idx ) -{ - return idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str,idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str, idx) ) ) : 1; -} - -#ifndef STB_TEXTEDIT_MOVEWORDLEFT -static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *str, int c ) -{ - --c; // always move at least one character - while( c >= 0 && !is_word_boundary( str, c ) ) - --c; - - if( c < 0 ) - c = 0; - - return c; -} -#define STB_TEXTEDIT_MOVEWORDLEFT stb_textedit_move_to_word_previous -#endif - -#ifndef STB_TEXTEDIT_MOVEWORDRIGHT -static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *str, int c ) -{ - const int len = STB_TEXTEDIT_STRINGLEN(str); - ++c; // always move at least one character - while( c < len && !is_word_boundary( str, c ) ) - ++c; - - if( c > len ) - c = len; - - return c; -} -#define STB_TEXTEDIT_MOVEWORDRIGHT stb_textedit_move_to_word_next -#endif - -#endif - -// update selection and cursor to match each other -static void stb_textedit_prep_selection_at_cursor(STB_TexteditState *state) -{ - if (!STB_TEXT_HAS_SELECTION(state)) - state->select_start = state->select_end = state->cursor; - else - state->cursor = state->select_end; -} - -// API cut: delete selection -static int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -{ - if (STB_TEXT_HAS_SELECTION(state)) { - stb_textedit_delete_selection(str,state); // implicity clamps - state->has_preferred_x = 0; - return 1; - } - return 0; -} - -// API paste: replace existing selection with passed-in text -static int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE const *ctext, int len) -{ - STB_TEXTEDIT_CHARTYPE *text = (STB_TEXTEDIT_CHARTYPE *) ctext; - // if there's a selection, the paste should delete it - stb_textedit_clamp(str, state); - stb_textedit_delete_selection(str,state); - // try to insert the characters - if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, text, len)) { - stb_text_makeundo_insert(state, state->cursor, len); - state->cursor += len; - state->has_preferred_x = 0; - return 1; - } - // remove the undo since we didn't actually insert the characters - if (state->undostate.undo_point) - --state->undostate.undo_point; - return 0; -} - -// API key: process a keyboard input -static void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int key) -{ -retry: - switch (key) { - default: { - int c = STB_TEXTEDIT_KEYTOTEXT(key); - if (c > 0) { - STB_TEXTEDIT_CHARTYPE ch = (STB_TEXTEDIT_CHARTYPE) c; - - // can't add newline in single-line mode - if (c == '\n' && state->single_line) - break; - - if (state->insert_mode && !STB_TEXT_HAS_SELECTION(state) && state->cursor < STB_TEXTEDIT_STRINGLEN(str)) { - stb_text_makeundo_replace(str, state, state->cursor, 1, 1); - STB_TEXTEDIT_DELETECHARS(str, state->cursor, 1); - if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) { - ++state->cursor; - state->has_preferred_x = 0; - } - } else { - stb_textedit_delete_selection(str,state); // implicity clamps - if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) { - stb_text_makeundo_insert(state, state->cursor, 1); - ++state->cursor; - state->has_preferred_x = 0; - } - } - } - break; - } - -#ifdef STB_TEXTEDIT_K_INSERT - case STB_TEXTEDIT_K_INSERT: - state->insert_mode = !state->insert_mode; - break; -#endif - - case STB_TEXTEDIT_K_UNDO: - stb_text_undo(str, state); - state->has_preferred_x = 0; - break; - - case STB_TEXTEDIT_K_REDO: - stb_text_redo(str, state); - state->has_preferred_x = 0; - break; - - case STB_TEXTEDIT_K_LEFT: - // if currently there's a selection, move cursor to start of selection - if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_first(state); - else - if (state->cursor > 0) - --state->cursor; - state->has_preferred_x = 0; - break; - - case STB_TEXTEDIT_K_RIGHT: - // if currently there's a selection, move cursor to end of selection - if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_last(str, state); - else - ++state->cursor; - stb_textedit_clamp(str, state); - state->has_preferred_x = 0; - break; - - case STB_TEXTEDIT_K_LEFT | STB_TEXTEDIT_K_SHIFT: - stb_textedit_clamp(str, state); - stb_textedit_prep_selection_at_cursor(state); - // move selection left - if (state->select_end > 0) - --state->select_end; - state->cursor = state->select_end; - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_MOVEWORDLEFT - case STB_TEXTEDIT_K_WORDLEFT: - if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_first(state); - else { - state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor); - stb_textedit_clamp( str, state ); - } - break; - - case STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT: - if( !STB_TEXT_HAS_SELECTION( state ) ) - stb_textedit_prep_selection_at_cursor(state); - - state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor); - state->select_end = state->cursor; - - stb_textedit_clamp( str, state ); - break; -#endif - -#ifdef STB_TEXTEDIT_MOVEWORDRIGHT - case STB_TEXTEDIT_K_WORDRIGHT: - if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_last(str, state); - else { - state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor); - stb_textedit_clamp( str, state ); - } - break; - - case STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT: - if( !STB_TEXT_HAS_SELECTION( state ) ) - stb_textedit_prep_selection_at_cursor(state); - - state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor); - state->select_end = state->cursor; - - stb_textedit_clamp( str, state ); - break; -#endif - - case STB_TEXTEDIT_K_RIGHT | STB_TEXTEDIT_K_SHIFT: - stb_textedit_prep_selection_at_cursor(state); - // move selection right - ++state->select_end; - stb_textedit_clamp(str, state); - state->cursor = state->select_end; - state->has_preferred_x = 0; - break; - - case STB_TEXTEDIT_K_DOWN: - case STB_TEXTEDIT_K_DOWN | STB_TEXTEDIT_K_SHIFT: { - StbFindState find; - StbTexteditRow row; - int i, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0; - - if (state->single_line) { - // on windows, up&down in single-line behave like left&right - key = STB_TEXTEDIT_K_RIGHT | (key & STB_TEXTEDIT_K_SHIFT); - goto retry; - } - - if (sel) - stb_textedit_prep_selection_at_cursor(state); - else if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_last(str,state); - - // compute current position of cursor point - stb_textedit_clamp(str, state); - stb_textedit_find_charpos(&find, str, state->cursor, state->single_line); - - // now find character position down a row - if (find.length) { - float goal_x = state->has_preferred_x ? state->preferred_x : find.x; - float x; - int start = find.first_char + find.length; - state->cursor = start; - STB_TEXTEDIT_LAYOUTROW(&row, str, state->cursor); - x = row.x0; - for (i=0; i < row.num_chars; ++i) { - float dx = STB_TEXTEDIT_GETWIDTH(str, start, i); - #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE - if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE) - break; - #endif - x += dx; - if (x > goal_x) - break; - ++state->cursor; - } - stb_textedit_clamp(str, state); - - state->has_preferred_x = 1; - state->preferred_x = goal_x; - - if (sel) - state->select_end = state->cursor; - } - break; - } - - case STB_TEXTEDIT_K_UP: - case STB_TEXTEDIT_K_UP | STB_TEXTEDIT_K_SHIFT: { - StbFindState find; - StbTexteditRow row; - int i, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0; - - if (state->single_line) { - // on windows, up&down become left&right - key = STB_TEXTEDIT_K_LEFT | (key & STB_TEXTEDIT_K_SHIFT); - goto retry; - } - - if (sel) - stb_textedit_prep_selection_at_cursor(state); - else if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_first(state); - - // compute current position of cursor point - stb_textedit_clamp(str, state); - stb_textedit_find_charpos(&find, str, state->cursor, state->single_line); - - // can only go up if there's a previous row - if (find.prev_first != find.first_char) { - // now find character position up a row - float goal_x = state->has_preferred_x ? state->preferred_x : find.x; - float x; - state->cursor = find.prev_first; - STB_TEXTEDIT_LAYOUTROW(&row, str, state->cursor); - x = row.x0; - for (i=0; i < row.num_chars; ++i) { - float dx = STB_TEXTEDIT_GETWIDTH(str, find.prev_first, i); - #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE - if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE) - break; - #endif - x += dx; - if (x > goal_x) - break; - ++state->cursor; - } - stb_textedit_clamp(str, state); - - state->has_preferred_x = 1; - state->preferred_x = goal_x; - - if (sel) - state->select_end = state->cursor; - } - break; - } - - case STB_TEXTEDIT_K_DELETE: - case STB_TEXTEDIT_K_DELETE | STB_TEXTEDIT_K_SHIFT: - if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_delete_selection(str, state); - else { - int n = STB_TEXTEDIT_STRINGLEN(str); - if (state->cursor < n) - stb_textedit_delete(str, state, state->cursor, 1); - } - state->has_preferred_x = 0; - break; - - case STB_TEXTEDIT_K_BACKSPACE: - case STB_TEXTEDIT_K_BACKSPACE | STB_TEXTEDIT_K_SHIFT: - if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_delete_selection(str, state); - else { - stb_textedit_clamp(str, state); - if (state->cursor > 0) { - stb_textedit_delete(str, state, state->cursor-1, 1); - --state->cursor; - } - } - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_K_TEXTSTART2 - case STB_TEXTEDIT_K_TEXTSTART2: -#endif - case STB_TEXTEDIT_K_TEXTSTART: - state->cursor = state->select_start = state->select_end = 0; - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_K_TEXTEND2 - case STB_TEXTEDIT_K_TEXTEND2: -#endif - case STB_TEXTEDIT_K_TEXTEND: - state->cursor = STB_TEXTEDIT_STRINGLEN(str); - state->select_start = state->select_end = 0; - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_K_TEXTSTART2 - case STB_TEXTEDIT_K_TEXTSTART2 | STB_TEXTEDIT_K_SHIFT: -#endif - case STB_TEXTEDIT_K_TEXTSTART | STB_TEXTEDIT_K_SHIFT: - stb_textedit_prep_selection_at_cursor(state); - state->cursor = state->select_end = 0; - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_K_TEXTEND2 - case STB_TEXTEDIT_K_TEXTEND2 | STB_TEXTEDIT_K_SHIFT: -#endif - case STB_TEXTEDIT_K_TEXTEND | STB_TEXTEDIT_K_SHIFT: - stb_textedit_prep_selection_at_cursor(state); - state->cursor = state->select_end = STB_TEXTEDIT_STRINGLEN(str); - state->has_preferred_x = 0; - break; - - -#ifdef STB_TEXTEDIT_K_LINESTART2 - case STB_TEXTEDIT_K_LINESTART2: -#endif - case STB_TEXTEDIT_K_LINESTART: - stb_textedit_clamp(str, state); - stb_textedit_move_to_first(state); - if (state->single_line) - state->cursor = 0; - else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE) - --state->cursor; - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_K_LINEEND2 - case STB_TEXTEDIT_K_LINEEND2: -#endif - case STB_TEXTEDIT_K_LINEEND: { - int n = STB_TEXTEDIT_STRINGLEN(str); - stb_textedit_clamp(str, state); - stb_textedit_move_to_first(state); - if (state->single_line) - state->cursor = n; - else while (state->cursor < n && STB_TEXTEDIT_GETCHAR(str, state->cursor) != STB_TEXTEDIT_NEWLINE) - ++state->cursor; - state->has_preferred_x = 0; - break; - } - -#ifdef STB_TEXTEDIT_K_LINESTART2 - case STB_TEXTEDIT_K_LINESTART2 | STB_TEXTEDIT_K_SHIFT: -#endif - case STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT: - stb_textedit_clamp(str, state); - stb_textedit_prep_selection_at_cursor(state); - if (state->single_line) - state->cursor = 0; - else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE) - --state->cursor; - state->select_end = state->cursor; - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_K_LINEEND2 - case STB_TEXTEDIT_K_LINEEND2 | STB_TEXTEDIT_K_SHIFT: -#endif - case STB_TEXTEDIT_K_LINEEND | STB_TEXTEDIT_K_SHIFT: { - int n = STB_TEXTEDIT_STRINGLEN(str); - stb_textedit_clamp(str, state); - stb_textedit_prep_selection_at_cursor(state); - if (state->single_line) - state->cursor = n; - else while (state->cursor < n && STB_TEXTEDIT_GETCHAR(str, state->cursor) != STB_TEXTEDIT_NEWLINE) - ++state->cursor; - state->select_end = state->cursor; - state->has_preferred_x = 0; - break; - } - -// @TODO: -// STB_TEXTEDIT_K_PGUP - move cursor up a page -// STB_TEXTEDIT_K_PGDOWN - move cursor down a page - } -} - -///////////////////////////////////////////////////////////////////////////// -// -// Undo processing -// -// @OPTIMIZE: the undo/redo buffer should be circular - -static void stb_textedit_flush_redo(StbUndoState *state) -{ - state->redo_point = STB_TEXTEDIT_UNDOSTATECOUNT; - state->redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT; -} - -// discard the oldest entry in the undo list -static void stb_textedit_discard_undo(StbUndoState *state) -{ - if (state->undo_point > 0) { - // if the 0th undo state has characters, clean those up - if (state->undo_rec[0].char_storage >= 0) { - int n = state->undo_rec[0].insert_length, i; - // delete n characters from all other records - state->undo_char_point = state->undo_char_point - (short) n; // vsnet05 - STB_TEXTEDIT_memmove(state->undo_char, state->undo_char + n, (size_t) ((size_t)state->undo_char_point*sizeof(STB_TEXTEDIT_CHARTYPE))); - for (i=0; i < state->undo_point; ++i) - if (state->undo_rec[i].char_storage >= 0) - state->undo_rec[i].char_storage = state->undo_rec[i].char_storage - (short) n; // vsnet05 // @OPTIMIZE: get rid of char_storage and infer it - } - --state->undo_point; - STB_TEXTEDIT_memmove(state->undo_rec, state->undo_rec+1, (size_t) ((size_t)state->undo_point*sizeof(state->undo_rec[0]))); - } -} - -// discard the oldest entry in the redo list--it's bad if this -// ever happens, but because undo & redo have to store the actual -// characters in different cases, the redo character buffer can -// fill up even though the undo buffer didn't -static void stb_textedit_discard_redo(StbUndoState *state) -{ - int k = STB_TEXTEDIT_UNDOSTATECOUNT-1; - - if (state->redo_point <= k) { - // if the k'th undo state has characters, clean those up - if (state->undo_rec[k].char_storage >= 0) { - int n = state->undo_rec[k].insert_length, i; - // delete n characters from all other records - state->redo_char_point = state->redo_char_point + (short) n; // vsnet05 - STB_TEXTEDIT_memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((size_t)(STB_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point)*sizeof(STB_TEXTEDIT_CHARTYPE))); - for (i=state->redo_point; i < k; ++i) - if (state->undo_rec[i].char_storage >= 0) - state->undo_rec[i].char_storage = state->undo_rec[i].char_storage + (short) n; // vsnet05 - } - STB_TEXTEDIT_memmove(state->undo_rec + state->redo_point, state->undo_rec + state->redo_point-1, (size_t) ((size_t)(STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point)*sizeof(state->undo_rec[0]))); - ++state->redo_point; - } -} - -static StbUndoRecord *stb_text_create_undo_record(StbUndoState *state, int numchars) -{ - // any time we create a new undo record, we discard redo - stb_textedit_flush_redo(state); - - // if we have no free records, we have to make room, by sliding the - // existing records down - if (state->undo_point == STB_TEXTEDIT_UNDOSTATECOUNT) - stb_textedit_discard_undo(state); - - // if the characters to store won't possibly fit in the buffer, we can't undo - if (numchars > STB_TEXTEDIT_UNDOCHARCOUNT) { - state->undo_point = 0; - state->undo_char_point = 0; - return NULL; - } - - // if we don't have enough free characters in the buffer, we have to make room - while (state->undo_char_point + numchars > STB_TEXTEDIT_UNDOCHARCOUNT) - stb_textedit_discard_undo(state); - - return &state->undo_rec[state->undo_point++]; -} - -static STB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, int insert_len, int delete_len) -{ - StbUndoRecord *r = stb_text_create_undo_record(state, insert_len); - if (r == NULL) - return NULL; - - r->where = pos; - r->insert_length = (short) insert_len; - r->delete_length = (short) delete_len; - - if (insert_len == 0) { - r->char_storage = -1; - return NULL; - } else { - r->char_storage = state->undo_char_point; - state->undo_char_point = state->undo_char_point + (short) insert_len; - return &state->undo_char[r->char_storage]; - } -} - -static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -{ - StbUndoState *s = &state->undostate; - StbUndoRecord u, *r; - if (s->undo_point == 0) - return; - - // we need to do two things: apply the undo record, and create a redo record - u = s->undo_rec[s->undo_point-1]; - r = &s->undo_rec[s->redo_point-1]; - r->char_storage = -1; - - r->insert_length = u.delete_length; - r->delete_length = u.insert_length; - r->where = u.where; - - if (u.delete_length) { - // if the undo record says to delete characters, then the redo record will - // need to re-insert the characters that get deleted, so we need to store - // them. - - // there are three cases: - // there's enough room to store the characters - // characters stored for *redoing* don't leave room for redo - // characters stored for *undoing* don't leave room for redo - // if the last is true, we have to bail - - if (s->undo_char_point + u.delete_length >= STB_TEXTEDIT_UNDOCHARCOUNT) { - // the undo records take up too much character space; there's no space to store the redo characters - r->insert_length = 0; - } else { - int i; - - // there's definitely room to store the characters eventually - while (s->undo_char_point + u.delete_length > s->redo_char_point) { - // there's currently not enough room, so discard a redo record - stb_textedit_discard_redo(s); - // should never happen: - if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT) - return; - } - r = &s->undo_rec[s->redo_point-1]; - - r->char_storage = s->redo_char_point - u.delete_length; - s->redo_char_point = s->redo_char_point - (short) u.delete_length; - - // now save the characters - for (i=0; i < u.delete_length; ++i) - s->undo_char[r->char_storage + i] = STB_TEXTEDIT_GETCHAR(str, u.where + i); - } - - // now we can carry out the deletion - STB_TEXTEDIT_DELETECHARS(str, u.where, u.delete_length); - } - - // check type of recorded action: - if (u.insert_length) { - // easy case: was a deletion, so we need to insert n characters - STB_TEXTEDIT_INSERTCHARS(str, u.where, &s->undo_char[u.char_storage], u.insert_length); - s->undo_char_point -= u.insert_length; - } - - state->cursor = u.where + u.insert_length; - - s->undo_point--; - s->redo_point--; -} - -static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -{ - StbUndoState *s = &state->undostate; - StbUndoRecord *u, r; - if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT) - return; - - // we need to do two things: apply the redo record, and create an undo record - u = &s->undo_rec[s->undo_point]; - r = s->undo_rec[s->redo_point]; - - // we KNOW there must be room for the undo record, because the redo record - // was derived from an undo record - - u->delete_length = r.insert_length; - u->insert_length = r.delete_length; - u->where = r.where; - u->char_storage = -1; - - if (r.delete_length) { - // the redo record requires us to delete characters, so the undo record - // needs to store the characters - - if (s->undo_char_point + u->insert_length > s->redo_char_point) { - u->insert_length = 0; - u->delete_length = 0; - } else { - int i; - u->char_storage = s->undo_char_point; - s->undo_char_point = s->undo_char_point + u->insert_length; - - // now save the characters - for (i=0; i < u->insert_length; ++i) - s->undo_char[u->char_storage + i] = STB_TEXTEDIT_GETCHAR(str, u->where + i); - } - - STB_TEXTEDIT_DELETECHARS(str, r.where, r.delete_length); - } - - if (r.insert_length) { - // easy case: need to insert n characters - STB_TEXTEDIT_INSERTCHARS(str, r.where, &s->undo_char[r.char_storage], r.insert_length); - s->redo_char_point += r.insert_length; - } - - state->cursor = r.where + r.insert_length; - - s->undo_point++; - s->redo_point++; -} - -static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length) -{ - stb_text_createundo(&state->undostate, where, 0, length); -} - -static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length) -{ - int i; - STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, length, 0); - if (p) { - for (i=0; i < length; ++i) - p[i] = STB_TEXTEDIT_GETCHAR(str, where+i); - } -} - -static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length) -{ - int i; - STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, old_length, new_length); - if (p) { - for (i=0; i < old_length; ++i) - p[i] = STB_TEXTEDIT_GETCHAR(str, where+i); - } -} - -// reset the state to default -static void stb_textedit_clear_state(STB_TexteditState *state, int is_single_line) -{ - state->undostate.undo_point = 0; - state->undostate.undo_char_point = 0; - state->undostate.redo_point = STB_TEXTEDIT_UNDOSTATECOUNT; - state->undostate.redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT; - state->select_end = state->select_start = 0; - state->cursor = 0; - state->has_preferred_x = 0; - state->preferred_x = 0; - state->cursor_at_end_of_line = 0; - state->initialized = 1; - state->single_line = (unsigned char) is_single_line; - state->insert_mode = 0; -} - -// API initialize -static void stb_textedit_initialize_state(STB_TexteditState *state, int is_single_line) -{ - stb_textedit_clear_state(state, is_single_line); -} -#endif//STB_TEXTEDIT_IMPLEMENTATION diff --git a/vendor/librw/skeleton/imgui/stb_truetype.h b/vendor/librw/skeleton/imgui/stb_truetype.h deleted file mode 100644 index 92b9a87..0000000 --- a/vendor/librw/skeleton/imgui/stb_truetype.h +++ /dev/null @@ -1,4018 +0,0 @@ -// stb_truetype.h - v1.14 - public domain -// authored from 2009-2016 by Sean Barrett / RAD Game Tools -// -// This library processes TrueType files: -// parse files -// extract glyph metrics -// extract glyph shapes -// render glyphs to one-channel bitmaps with antialiasing (box filter) -// -// Todo: -// non-MS cmaps -// crashproof on bad data -// hinting? (no longer patented) -// cleartype-style AA? -// optimize: use simple memory allocator for intermediates -// optimize: build edge-list directly from curves -// optimize: rasterize directly from curves? -// -// ADDITIONAL CONTRIBUTORS -// -// Mikko Mononen: compound shape support, more cmap formats -// Tor Andersson: kerning, subpixel rendering -// Dougall Johnson: OpenType / Type 2 font handling -// -// Misc other: -// Ryan Gordon -// Simon Glass -// github:IntellectualKitty -// -// Bug/warning reports/fixes: -// "Zer" on mollyrocket (with fix) -// Cass Everitt -// stoiko (Haemimont Games) -// Brian Hook -// Walter van Niftrik -// David Gow -// David Given -// Ivan-Assen Ivanov -// Anthony Pesch -// Johan Duparc -// Hou Qiming -// Fabian "ryg" Giesen -// Martins Mozeiko -// Cap Petschulat -// Omar Cornut -// github:aloucks -// Peter LaValle -// Sergey Popov -// Giumo X. Clanjor -// Higor Euripedes -// Thomas Fields -// Derek Vinyard -// -// VERSION HISTORY -// -// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts, num-fonts-in-TTC function -// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual -// 1.11 (2016-04-02) fix unused-variable warning -// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef -// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly -// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges -// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; -// variant PackFontRanges to pack and render in separate phases; -// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); -// fixed an assert() bug in the new rasterizer -// replace assert() with STBTT_assert() in new rasterizer -// -// Full history can be found at the end of this file. -// -// LICENSE -// -// This software is dual-licensed to the public domain and under the following -// license: you are granted a perpetual, irrevocable license to copy, modify, -// publish, and distribute this file as you see fit. -// -// USAGE -// -// Include this file in whatever places neeed to refer to it. In ONE C/C++ -// file, write: -// #define STB_TRUETYPE_IMPLEMENTATION -// before the #include of this file. This expands out the actual -// implementation into that C/C++ file. -// -// To make the implementation private to the file that generates the implementation, -// #define STBTT_STATIC -// -// Simple 3D API (don't ship this, but it's fine for tools and quick start) -// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture -// stbtt_GetBakedQuad() -- compute quad to draw for a given char -// -// Improved 3D API (more shippable): -// #include "stb_rect_pack.h" -- optional, but you really want it -// stbtt_PackBegin() -// stbtt_PackSetOversample() -- for improved quality on small fonts -// stbtt_PackFontRanges() -- pack and renders -// stbtt_PackEnd() -// stbtt_GetPackedQuad() -// -// "Load" a font file from a memory buffer (you have to keep the buffer loaded) -// stbtt_InitFont() -// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections -// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections -// -// Render a unicode codepoint to a bitmap -// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap -// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide -// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be -// -// Character advance/positioning -// stbtt_GetCodepointHMetrics() -// stbtt_GetFontVMetrics() -// stbtt_GetCodepointKernAdvance() -// -// Starting with version 1.06, the rasterizer was replaced with a new, -// faster and generally-more-precise rasterizer. The new rasterizer more -// accurately measures pixel coverage for anti-aliasing, except in the case -// where multiple shapes overlap, in which case it overestimates the AA pixel -// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If -// this turns out to be a problem, you can re-enable the old rasterizer with -// #define STBTT_RASTERIZER_VERSION 1 -// which will incur about a 15% speed hit. -// -// ADDITIONAL DOCUMENTATION -// -// Immediately after this block comment are a series of sample programs. -// -// After the sample programs is the "header file" section. This section -// includes documentation for each API function. -// -// Some important concepts to understand to use this library: -// -// Codepoint -// Characters are defined by unicode codepoints, e.g. 65 is -// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is -// the hiragana for "ma". -// -// Glyph -// A visual character shape (every codepoint is rendered as -// some glyph) -// -// Glyph index -// A font-specific integer ID representing a glyph -// -// Baseline -// Glyph shapes are defined relative to a baseline, which is the -// bottom of uppercase characters. Characters extend both above -// and below the baseline. -// -// Current Point -// As you draw text to the screen, you keep track of a "current point" -// which is the origin of each character. The current point's vertical -// position is the baseline. Even "baked fonts" use this model. -// -// Vertical Font Metrics -// The vertical qualities of the font, used to vertically position -// and space the characters. See docs for stbtt_GetFontVMetrics. -// -// Font Size in Pixels or Points -// The preferred interface for specifying font sizes in stb_truetype -// is to specify how tall the font's vertical extent should be in pixels. -// If that sounds good enough, skip the next paragraph. -// -// Most font APIs instead use "points", which are a common typographic -// measurement for describing font size, defined as 72 points per inch. -// stb_truetype provides a point API for compatibility. However, true -// "per inch" conventions don't make much sense on computer displays -// since they different monitors have different number of pixels per -// inch. For example, Windows traditionally uses a convention that -// there are 96 pixels per inch, thus making 'inch' measurements have -// nothing to do with inches, and thus effectively defining a point to -// be 1.333 pixels. Additionally, the TrueType font data provides -// an explicit scale factor to scale a given font's glyphs to points, -// but the author has observed that this scale factor is often wrong -// for non-commercial fonts, thus making fonts scaled in points -// according to the TrueType spec incoherently sized in practice. -// -// ADVANCED USAGE -// -// Quality: -// -// - Use the functions with Subpixel at the end to allow your characters -// to have subpixel positioning. Since the font is anti-aliased, not -// hinted, this is very import for quality. (This is not possible with -// baked fonts.) -// -// - Kerning is now supported, and if you're supporting subpixel rendering -// then kerning is worth using to give your text a polished look. -// -// Performance: -// -// - Convert Unicode codepoints to glyph indexes and operate on the glyphs; -// if you don't do this, stb_truetype is forced to do the conversion on -// every call. -// -// - There are a lot of memory allocations. We should modify it to take -// a temp buffer and allocate from the temp buffer (without freeing), -// should help performance a lot. -// -// NOTES -// -// The system uses the raw data found in the .ttf file without changing it -// and without building auxiliary data structures. This is a bit inefficient -// on little-endian systems (the data is big-endian), but assuming you're -// caching the bitmaps or glyph shapes this shouldn't be a big deal. -// -// It appears to be very hard to programmatically determine what font a -// given file is in a general way. I provide an API for this, but I don't -// recommend it. -// -// -// SOURCE STATISTICS (based on v0.6c, 2050 LOC) -// -// Documentation & header file 520 LOC \___ 660 LOC documentation -// Sample code 140 LOC / -// Truetype parsing 620 LOC ---- 620 LOC TrueType -// Software rasterization 240 LOC \ . -// Curve tesselation 120 LOC \__ 550 LOC Bitmap creation -// Bitmap management 100 LOC / -// Baked bitmap interface 70 LOC / -// Font name matching & access 150 LOC ---- 150 -// C runtime library abstraction 60 LOC ---- 60 -// -// -// PERFORMANCE MEASUREMENTS FOR 1.06: -// -// 32-bit 64-bit -// Previous release: 8.83 s 7.68 s -// Pool allocations: 7.72 s 6.34 s -// Inline sort : 6.54 s 5.65 s -// New rasterizer : 5.63 s 5.00 s - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -//// -//// SAMPLE PROGRAMS -//// -// -// Incomplete text-in-3d-api example, which draws quads properly aligned to be lossless -// -#if 0 -#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation -#include "stb_truetype.h" - -unsigned char ttf_buffer[1<<20]; -unsigned char temp_bitmap[512*512]; - -stbtt_bakedchar cdata[96]; // ASCII 32..126 is 95 glyphs -GLuint ftex; - -void my_stbtt_initfont(void) -{ - fread(ttf_buffer, 1, 1<<20, fopen("c:/windows/fonts/times.ttf", "rb")); - stbtt_BakeFontBitmap(ttf_buffer,0, 32.0, temp_bitmap,512,512, 32,96, cdata); // no guarantee this fits! - // can free ttf_buffer at this point - glGenTextures(1, &ftex); - glBindTexture(GL_TEXTURE_2D, ftex); - glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 512,512, 0, GL_ALPHA, GL_UNSIGNED_BYTE, temp_bitmap); - // can free temp_bitmap at this point - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -} - -void my_stbtt_print(float x, float y, char *text) -{ - // assume orthographic projection with units = screen pixels, origin at top left - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, ftex); - glBegin(GL_QUADS); - while (*text) { - if (*text >= 32 && *text < 128) { - stbtt_aligned_quad q; - stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9 - glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y0); - glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y0); - glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y1); - glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y1); - } - ++text; - } - glEnd(); -} -#endif -// -// -////////////////////////////////////////////////////////////////////////////// -// -// Complete program (this compiles): get a single bitmap, print as ASCII art -// -#if 0 -#include -#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation -#include "stb_truetype.h" - -char ttf_buffer[1<<25]; - -int main(int argc, char **argv) -{ - stbtt_fontinfo font; - unsigned char *bitmap; - int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); - - fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); - - stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); - bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); - - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) - putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); - putchar('\n'); - } - return 0; -} -#endif -// -// Output: -// -// .ii. -// @@@@@@. -// V@Mio@@o -// :i. V@V -// :oM@@M -// :@@@MM@M -// @@o o@M -// :@@. M@M -// @@@o@@@@ -// :M@@V:@@. -// -////////////////////////////////////////////////////////////////////////////// -// -// Complete program: print "Hello World!" banner, with bugs -// -#if 0 -char buffer[24<<20]; -unsigned char screen[20][79]; - -int main(int arg, char **argv) -{ - stbtt_fontinfo font; - int i,j,ascent,baseline,ch=0; - float scale, xpos=2; // leave a little padding in case the character extends left - char *text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness - - fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); - stbtt_InitFont(&font, buffer, 0); - - scale = stbtt_ScaleForPixelHeight(&font, 15); - stbtt_GetFontVMetrics(&font, &ascent,0,0); - baseline = (int) (ascent*scale); - - while (text[ch]) { - int advance,lsb,x0,y0,x1,y1; - float x_shift = xpos - (float) floor(xpos); - stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); - stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); - stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); - // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong - // because this API is really for baking character bitmaps into textures. if you want to render - // a sequence of characters, you really need to render each bitmap to a temp buffer, then - // "alpha blend" that into the working buffer - xpos += (advance * scale); - if (text[ch+1]) - xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); - ++ch; - } - - for (j=0; j < 20; ++j) { - for (i=0; i < 78; ++i) - putchar(" .:ioVM@"[screen[j][i]>>5]); - putchar('\n'); - } - - return 0; -} -#endif - - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -//// -//// INTEGRATION WITH YOUR CODEBASE -//// -//// The following sections allow you to supply alternate definitions -//// of C library functions used by stb_truetype. - -#ifdef STB_TRUETYPE_IMPLEMENTATION - // #define your own (u)stbtt_int8/16/32 before including to override this - #ifndef stbtt_uint8 - typedef unsigned char stbtt_uint8; - typedef signed char stbtt_int8; - typedef unsigned short stbtt_uint16; - typedef signed short stbtt_int16; - typedef unsigned int stbtt_uint32; - typedef signed int stbtt_int32; - #endif - - typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; - typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; - - // #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h - #ifndef STBTT_ifloor - #include - #define STBTT_ifloor(x) ((int) floor(x)) - #define STBTT_iceil(x) ((int) ceil(x)) - #endif - - #ifndef STBTT_sqrt - #include - #define STBTT_sqrt(x) sqrt(x) - #endif - - #ifndef STBTT_fabs - #include - #define STBTT_fabs(x) fabs(x) - #endif - - // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h - #ifndef STBTT_malloc - #include - #define STBTT_malloc(x,u) ((void)(u),malloc(x)) - #define STBTT_free(x,u) ((void)(u),free(x)) - #endif - - #ifndef STBTT_assert - #include - #define STBTT_assert(x) assert(x) - #endif - - #ifndef STBTT_strlen - #include - #define STBTT_strlen(x) strlen(x) - #endif - - #ifndef STBTT_memcpy - #include - #define STBTT_memcpy memcpy - #define STBTT_memset memset - #endif -#endif - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -//// -//// INTERFACE -//// -//// - -#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ -#define __STB_INCLUDE_STB_TRUETYPE_H__ - -#ifdef STBTT_STATIC -#define STBTT_DEF static -#else -#define STBTT_DEF extern -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// private structure -typedef struct -{ - unsigned char *data; - int cursor; - int size; -} stbtt__buf; - -////////////////////////////////////////////////////////////////////////////// -// -// TEXTURE BAKING API -// -// If you use this API, you only have to call two functions ever. -// - -typedef struct -{ - unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap - float xoff,yoff,xadvance; -} stbtt_bakedchar; - -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) - float pixel_height, // height of font in pixels - unsigned char *pixels, int pw, int ph, // bitmap to be filled in - int first_char, int num_chars, // characters to bake - stbtt_bakedchar *chardata); // you allocate this, it's num_chars long -// if return is positive, the first unused row of the bitmap -// if return is negative, returns the negative of the number of characters that fit -// if return is 0, no characters fit and no rows were used -// This uses a very crappy packing. - -typedef struct -{ - float x0,y0,s0,t0; // top-left - float x1,y1,s1,t1; // bottom-right -} stbtt_aligned_quad; - -STBTT_DEF void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph, // same data as above - int char_index, // character to display - float *xpos, float *ypos, // pointers to current position in screen pixel space - stbtt_aligned_quad *q, // output: quad to draw - int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier -// Call GetBakedQuad with char_index = 'character - first_char', and it -// creates the quad you need to draw and advances the current position. -// -// The coordinate system used assumes y increases downwards. -// -// Characters will extend both above and below the current position; -// see discussion of "BASELINE" above. -// -// It's inefficient; you might want to c&p it and optimize it. - - - -////////////////////////////////////////////////////////////////////////////// -// -// NEW TEXTURE BAKING API -// -// This provides options for packing multiple fonts into one atlas, not -// perfectly but better than nothing. - -typedef struct -{ - unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap - float xoff,yoff,xadvance; - float xoff2,yoff2; -} stbtt_packedchar; - -typedef struct stbtt_pack_context stbtt_pack_context; -typedef struct stbtt_fontinfo stbtt_fontinfo; -#ifndef STB_RECT_PACK_VERSION -typedef struct stbrp_rect stbrp_rect; -#endif - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context); -// Initializes a packing context stored in the passed-in stbtt_pack_context. -// Future calls using this context will pack characters into the bitmap passed -// in here: a 1-channel bitmap that is width * height. stride_in_bytes is -// the distance from one row to the next (or 0 to mean they are packed tightly -// together). "padding" is the amount of padding to leave between each -// character (normally you want '1' for bitmaps you'll use as textures with -// bilinear filtering). -// -// Returns 0 on failure, 1 on success. - -STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc); -// Cleans up the packing context and frees all memory. - -#define STBTT_POINT_SIZE(x) (-(x)) - -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, float font_size, - int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range); -// Creates character bitmaps from the font_index'th font found in fontdata (use -// font_index=0 if you don't know what that is). It creates num_chars_in_range -// bitmaps for characters with unicode values starting at first_unicode_char_in_range -// and increasing. Data for how to render them is stored in chardata_for_range; -// pass these to stbtt_GetPackedQuad to get back renderable quads. -// -// font_size is the full height of the character from ascender to descender, -// as computed by stbtt_ScaleForPixelHeight. To use a point size as computed -// by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE() -// and pass that result as 'font_size': -// ..., 20 , ... // font max minus min y is 20 pixels tall -// ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall - -typedef struct -{ - float font_size; - int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint - int *array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints - int num_chars; - stbtt_packedchar *chardata_for_range; // output - unsigned char h_oversample, v_oversample; // don't set these, they're used internally -} stbtt_pack_range; - -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges); -// Creates character bitmaps from multiple ranges of characters stored in -// ranges. This will usually create a better-packed bitmap than multiple -// calls to stbtt_PackFontRange. Note that you can call this multiple -// times within a single PackBegin/PackEnd. - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample); -// Oversampling a font increases the quality by allowing higher-quality subpixel -// positioning, and is especially valuable at smaller text sizes. -// -// This function sets the amount of oversampling for all following calls to -// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given -// pack context. The default (no oversampling) is achieved by h_oversample=1 -// and v_oversample=1. The total number of pixels required is -// h_oversample*v_oversample larger than the default; for example, 2x2 -// oversampling requires 4x the storage of 1x1. For best results, render -// oversampled textures with bilinear filtering. Look at the readme in -// stb/tests/oversample for information about oversampled fonts -// -// To use with PackFontRangesGather etc., you must set it before calls -// call to PackFontRangesGatherRects. - -STBTT_DEF void stbtt_GetPackedQuad(stbtt_packedchar *chardata, int pw, int ph, // same data as above - int char_index, // character to display - float *xpos, float *ypos, // pointers to current position in screen pixel space - stbtt_aligned_quad *q, // output: quad to draw - int align_to_integer); - -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects); -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); -// Calling these functions in sequence is roughly equivalent to calling -// stbtt_PackFontRanges(). If you more control over the packing of multiple -// fonts, or if you want to pack custom data into a font texture, take a look -// at the source to of stbtt_PackFontRanges() and create a custom version -// using these functions, e.g. call GatherRects multiple times, -// building up a single array of rects, then call PackRects once, -// then call RenderIntoRects repeatedly. This may result in a -// better packing than calling PackFontRanges multiple times -// (or it may not). - -// this is an opaque structure that you shouldn't mess with which holds -// all the context needed from PackBegin to PackEnd. -struct stbtt_pack_context { - void *user_allocator_context; - void *pack_info; - int width; - int height; - int stride_in_bytes; - int padding; - unsigned int h_oversample, v_oversample; - unsigned char *pixels; - void *nodes; -}; - -////////////////////////////////////////////////////////////////////////////// -// -// FONT LOADING -// -// - -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data); -// This function will determine the number of fonts in a font file. TrueType -// collection (.ttc) files may contain multiple fonts, while TrueType font -// (.ttf) files only contain one font. The number of fonts can be used for -// indexing with the previous function where the index is between zero and one -// less than the total fonts. If an error occurs, -1 is returned. - -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); -// Each .ttf/.ttc file may have more than one font. Each font has a sequential -// index number starting from 0. Call this function to get the font offset for -// a given index; it returns -1 if the index is out of range. A regular .ttf -// file will only define one font and it always be at offset 0, so it will -// return '0' for index 0, and -1 for all other indices. - -// The following structure is defined publically so you can declare one on -// the stack or as a global or etc, but you should treat it as opaque. -struct stbtt_fontinfo -{ - void * userdata; - unsigned char * data; // pointer to .ttf file - int fontstart; // offset of start of font - - int numGlyphs; // number of glyphs, needed for range checking - - int loca,head,glyf,hhea,hmtx,kern; // table locations as offset from start of .ttf - int index_map; // a cmap mapping for our chosen character encoding - int indexToLocFormat; // format needed to map from glyph index to glyph - - stbtt__buf cff; // cff font data - stbtt__buf charstrings; // the charstring index - stbtt__buf gsubrs; // global charstring subroutines index - stbtt__buf subrs; // private charstring subroutines index - stbtt__buf fontdicts; // array of font dicts - stbtt__buf fdselect; // map from glyph to fontdict -}; - -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); -// Given an offset into the file that defines a font, this function builds -// the necessary cached info for the rest of the system. You must allocate -// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't -// need to do anything special to free it, because the contents are pure -// value data with no additional data structures. Returns 0 on failure. - - -////////////////////////////////////////////////////////////////////////////// -// -// CHARACTER TO GLYPH-INDEX CONVERSIOn - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); -// If you're going to perform multiple operations on the same character -// and you want a speed-up, call this function with the character you're -// going to process, then use glyph-based functions instead of the -// codepoint-based functions. - - -////////////////////////////////////////////////////////////////////////////// -// -// CHARACTER PROPERTIES -// - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); -// computes a scale factor to produce a font whose "height" is 'pixels' tall. -// Height is measured as the distance from the highest ascender to the lowest -// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics -// and computing: -// scale = pixels / (ascent - descent) -// so if you prefer to measure height by the ascent only, use a similar calculation. - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels); -// computes a scale factor to produce a font whose EM size is mapped to -// 'pixels' tall. This is probably what traditional APIs compute, but -// I'm not positive. - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); -// ascent is the coordinate above the baseline the font extends; descent -// is the coordinate below the baseline the font extends (i.e. it is typically negative) -// lineGap is the spacing between one row's descent and the next row's ascent... -// so you should advance the vertical position by "*ascent - *descent + *lineGap" -// these are expressed in unscaled coordinates, so you must multiply by -// the scale factor for a given size - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1); -// the bounding box around all possible characters - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); -// leftSideBearing is the offset from the current horizontal position to the left edge of the character -// advanceWidth is the offset from the current horizontal position to the next horizontal position -// these are expressed in unscaled coordinates - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); -// an additional amount to add to the 'advance' value between ch1 and ch2 - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); -// Gets the bounding box of the visible part of the glyph, in unscaled coordinates - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); -// as above, but takes one or more glyph indices for greater efficiency - - -////////////////////////////////////////////////////////////////////////////// -// -// GLYPH SHAPES (you probably don't need these, but they have to go before -// the bitmaps for C declaration-order reasons) -// - -#ifndef STBTT_vmove // you can predefine these to use different values (but why?) - enum { - STBTT_vmove=1, - STBTT_vline, - STBTT_vcurve, - STBTT_vcubic - }; -#endif - -#ifndef stbtt_vertex // you can predefine this to use different values - // (we share this with other code at RAD) - #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file - typedef struct - { - stbtt_vertex_type x,y,cx,cy,cx1,cy1; - unsigned char type,padding; - } stbtt_vertex; -#endif - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index); -// returns non-zero if nothing is drawn for this glyph - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); -// returns # of vertices and fills *vertices with the pointer to them -// these are expressed in "unscaled" coordinates -// -// The shape is a series of countours. Each one starts with -// a STBTT_moveto, then consists of a series of mixed -// STBTT_lineto and STBTT_curveto segments. A lineto -// draws a line from previous endpoint to its x,y; a curveto -// draws a quadratic bezier from previous endpoint to -// its x,y, using cx,cy as the bezier control point. - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); -// frees the data allocated above - -////////////////////////////////////////////////////////////////////////////// -// -// BITMAP RENDERING -// - -STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); -// frees the bitmap allocated below - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); -// allocates a large-enough single-channel 8bpp bitmap and renders the -// specified character/glyph at the specified scale into it, with -// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). -// *width & *height are filled out with the width & height of the bitmap, -// which is stored left-to-right, top-to-bottom. -// -// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); -// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel -// shift for the character - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); -// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap -// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap -// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the -// width and height and positioning info for it first. - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); -// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel -// shift for the character - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); -// get the bbox of the bitmap centered around the glyph origin; so the -// bitmap width is ix1-ix0, height is iy1-iy0, and location to place -// the bitmap top left is (leftSideBearing*scale,iy0). -// (Note that the bitmap uses y-increases-down, but the shape uses -// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); -// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel -// shift for the character - -// the following functions are equivalent to the above functions, but operate -// on glyph indices instead of Unicode codepoints (for efficiency) -STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); - - -// @TODO: don't expose this structure -typedef struct -{ - int w,h,stride; - unsigned char *pixels; -} stbtt__bitmap; - -// rasterize a shape with quadratic beziers into a bitmap -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, // 1-channel bitmap to draw into - float flatness_in_pixels, // allowable error of curve in pixels - stbtt_vertex *vertices, // array of vertices defining shape - int num_verts, // number of vertices in above array - float scale_x, float scale_y, // scale applied to input vertices - float shift_x, float shift_y, // translation applied to input vertices - int x_off, int y_off, // another translation applied to input - int invert, // if non-zero, vertically flip shape - void *userdata); // context for to STBTT_MALLOC - -////////////////////////////////////////////////////////////////////////////// -// -// Finding the right font... -// -// You should really just solve this offline, keep your own tables -// of what font is what, and don't try to get it out of the .ttf file. -// That's because getting it out of the .ttf file is really hard, because -// the names in the file can appear in many possible encodings, in many -// possible languages, and e.g. if you need a case-insensitive comparison, -// the details of that depend on the encoding & language in a complex way -// (actually underspecified in truetype, but also gigantic). -// -// But you can use the provided functions in two possible ways: -// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on -// unicode-encoded names to try to find the font you want; -// you can run this before calling stbtt_InitFont() -// -// stbtt_GetFontNameString() lets you get any of the various strings -// from the file yourself and do your own comparisons on them. -// You have to have called stbtt_InitFont() first. - - -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); -// returns the offset (not index) of the font that matches, or -1 if none -// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". -// if you use any other flag, use a font name like "Arial"; this checks -// the 'macStyle' header field; i don't know if fonts set this consistently -#define STBTT_MACSTYLE_DONTCARE 0 -#define STBTT_MACSTYLE_BOLD 1 -#define STBTT_MACSTYLE_ITALIC 2 -#define STBTT_MACSTYLE_UNDERSCORE 4 -#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 - -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); -// returns 1/0 whether the first string interpreted as utf8 is identical to -// the second string interpreted as big-endian utf16... useful for strings from next func - -STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); -// returns the string (which may be big-endian double byte, e.g. for unicode) -// and puts the length in bytes in *length. -// -// some of the values for the IDs are below; for more see the truetype spec: -// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html -// http://www.microsoft.com/typography/otspec/name.htm - -enum { // platformID - STBTT_PLATFORM_ID_UNICODE =0, - STBTT_PLATFORM_ID_MAC =1, - STBTT_PLATFORM_ID_ISO =2, - STBTT_PLATFORM_ID_MICROSOFT =3 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_UNICODE - STBTT_UNICODE_EID_UNICODE_1_0 =0, - STBTT_UNICODE_EID_UNICODE_1_1 =1, - STBTT_UNICODE_EID_ISO_10646 =2, - STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, - STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT - STBTT_MS_EID_SYMBOL =0, - STBTT_MS_EID_UNICODE_BMP =1, - STBTT_MS_EID_SHIFTJIS =2, - STBTT_MS_EID_UNICODE_FULL =10 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes - STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, - STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, - STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, - STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 -}; - -enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... - // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs - STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, - STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, - STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, - STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, - STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, - STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D -}; - -enum { // languageID for STBTT_PLATFORM_ID_MAC - STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, - STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, - STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, - STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , - STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , - STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, - STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 -}; - -#ifdef __cplusplus -} -#endif - -#endif // __STB_INCLUDE_STB_TRUETYPE_H__ - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -//// -//// IMPLEMENTATION -//// -//// - -#ifdef STB_TRUETYPE_IMPLEMENTATION - -#ifndef STBTT_MAX_OVERSAMPLE -#define STBTT_MAX_OVERSAMPLE 8 -#endif - -#if STBTT_MAX_OVERSAMPLE > 255 -#error "STBTT_MAX_OVERSAMPLE cannot be > 255" -#endif - -typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1]; - -#ifndef STBTT_RASTERIZER_VERSION -#define STBTT_RASTERIZER_VERSION 2 -#endif - -#ifdef _MSC_VER -#define STBTT__NOTUSED(v) (void)(v) -#else -#define STBTT__NOTUSED(v) (void)sizeof(v) -#endif - -////////////////////////////////////////////////////////////////////////// -// -// stbtt__buf helpers to parse data from file -// - -static stbtt_uint8 stbtt__buf_get8(stbtt__buf *b) -{ - if (b->cursor >= b->size) - return 0; - return b->data[b->cursor++]; -} - -static stbtt_uint8 stbtt__buf_peek8(stbtt__buf *b) -{ - if (b->cursor >= b->size) - return 0; - return b->data[b->cursor]; -} - -static void stbtt__buf_seek(stbtt__buf *b, int o) -{ - STBTT_assert(!(o > b->size || o < 0)); - b->cursor = (o > b->size || o < 0) ? b->size : o; -} - -static void stbtt__buf_skip(stbtt__buf *b, int o) -{ - stbtt__buf_seek(b, b->cursor + o); -} - -static stbtt_uint32 stbtt__buf_get(stbtt__buf *b, int n) -{ - stbtt_uint32 v = 0; - int i; - STBTT_assert(n >= 1 && n <= 4); - for (i = 0; i < n; i++) - v = (v << 8) | stbtt__buf_get8(b); - return v; -} - -static stbtt__buf stbtt__new_buf(const void *p, size_t size) -{ - stbtt__buf r; - STBTT_assert(size < 0x40000000); - r.data = (stbtt_uint8*) p; - r.size = (int) size; - r.cursor = 0; - return r; -} - -#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) -#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) - -static stbtt__buf stbtt__buf_range(const stbtt__buf *b, int o, int s) -{ - stbtt__buf r = stbtt__new_buf(NULL, 0); - if (o < 0 || s < 0 || o > b->size || s > b->size - o) return r; - r.data = b->data + o; - r.size = s; - return r; -} - -static stbtt__buf stbtt__cff_get_index(stbtt__buf *b) -{ - int count, start, offsize; - start = b->cursor; - count = stbtt__buf_get16(b); - if (count) { - offsize = stbtt__buf_get8(b); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(b, offsize * count); - stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); - } - return stbtt__buf_range(b, start, b->cursor - start); -} - -static stbtt_uint32 stbtt__cff_int(stbtt__buf *b) -{ - int b0 = stbtt__buf_get8(b); - if (b0 >= 32 && b0 <= 246) return b0 - 139; - else if (b0 >= 247 && b0 <= 250) return (b0 - 247)*256 + stbtt__buf_get8(b) + 108; - else if (b0 >= 251 && b0 <= 254) return -(b0 - 251)*256 - stbtt__buf_get8(b) - 108; - else if (b0 == 28) return stbtt__buf_get16(b); - else if (b0 == 29) return stbtt__buf_get32(b); - STBTT_assert(0); - return 0; -} - -static void stbtt__cff_skip_operand(stbtt__buf *b) { - int v, b0 = stbtt__buf_peek8(b); - STBTT_assert(b0 >= 28); - if (b0 == 30) { - stbtt__buf_skip(b, 1); - while (b->cursor < b->size) { - v = stbtt__buf_get8(b); - if ((v & 0xF) == 0xF || (v >> 4) == 0xF) - break; - } - } else { - stbtt__cff_int(b); - } -} - -static stbtt__buf stbtt__dict_get(stbtt__buf *b, int key) -{ - stbtt__buf_seek(b, 0); - while (b->cursor < b->size) { - int start = b->cursor, end, op; - while (stbtt__buf_peek8(b) >= 28) - stbtt__cff_skip_operand(b); - end = b->cursor; - op = stbtt__buf_get8(b); - if (op == 12) op = stbtt__buf_get8(b) | 0x100; - if (op == key) return stbtt__buf_range(b, start, end-start); - } - return stbtt__buf_range(b, 0, 0); -} - -static void stbtt__dict_get_ints(stbtt__buf *b, int key, int outcount, stbtt_uint32 *out) -{ - int i; - stbtt__buf operands = stbtt__dict_get(b, key); - for (i = 0; i < outcount && operands.cursor < operands.size; i++) - out[i] = stbtt__cff_int(&operands); -} - -static int stbtt__cff_index_count(stbtt__buf *b) -{ - stbtt__buf_seek(b, 0); - return stbtt__buf_get16(b); -} - -static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) -{ - int count, offsize, start, end; - stbtt__buf_seek(&b, 0); - count = stbtt__buf_get16(&b); - offsize = stbtt__buf_get8(&b); - STBTT_assert(i >= 0 && i < count); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(&b, i*offsize); - start = stbtt__buf_get(&b, offsize); - end = stbtt__buf_get(&b, offsize); - return stbtt__buf_range(&b, 2+(count+1)*offsize+start, end - start); -} - -////////////////////////////////////////////////////////////////////////// -// -// accessors to parse data from file -// - -// on platforms that don't allow misaligned reads, if we want to allow -// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE - -#define ttBYTE(p) (* (stbtt_uint8 *) (p)) -#define ttCHAR(p) (* (stbtt_int8 *) (p)) -#define ttFixed(p) ttLONG(p) - -static stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } -static stbtt_int16 ttSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } -static stbtt_uint32 ttULONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } -static stbtt_int32 ttLONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } - -#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) -#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) - -static int stbtt__isfont(stbtt_uint8 *font) -{ - // check the version number - if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1 - if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! - if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF - if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0 - if (stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts - return 0; -} - -// @OPTIMIZE: binary search -static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) -{ - stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); - stbtt_uint32 tabledir = fontstart + 12; - stbtt_int32 i; - for (i=0; i < num_tables; ++i) { - stbtt_uint32 loc = tabledir + 16*i; - if (stbtt_tag(data+loc+0, tag)) - return ttULONG(data+loc+8); - } - return 0; -} - -static int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_collection, int index) -{ - // if it's just a font, there's only one valid index - if (stbtt__isfont(font_collection)) - return index == 0 ? 0 : -1; - - // check if it's a TTC - if (stbtt_tag(font_collection, "ttcf")) { - // version 1? - if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { - stbtt_int32 n = ttLONG(font_collection+8); - if (index >= n) - return -1; - return ttULONG(font_collection+12+index*4); - } - } - return -1; -} - -static int stbtt_GetNumberOfFonts_internal(unsigned char *font_collection) -{ - // if it's just a font, there's only one valid font - if (stbtt__isfont(font_collection)) - return 1; - - // check if it's a TTC - if (stbtt_tag(font_collection, "ttcf")) { - // version 1? - if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { - return ttLONG(font_collection+8); - } - } - return 0; -} - -static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) -{ - stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; - stbtt__buf pdict; - stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); - if (!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); - pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); - stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); - if (!subrsoff) return stbtt__new_buf(NULL, 0); - stbtt__buf_seek(&cff, private_loc[1]+subrsoff); - return stbtt__cff_get_index(&cff); -} - -static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart) -{ - stbtt_uint32 cmap, t; - stbtt_int32 i,numTables; - - info->data = data; - info->fontstart = fontstart; - info->cff = stbtt__new_buf(NULL, 0); - - cmap = stbtt__find_table(data, fontstart, "cmap"); // required - info->loca = stbtt__find_table(data, fontstart, "loca"); // required - info->head = stbtt__find_table(data, fontstart, "head"); // required - info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required - info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required - info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required - info->kern = stbtt__find_table(data, fontstart, "kern"); // not required - - if (!cmap || !info->head || !info->hhea || !info->hmtx) - return 0; - if (info->glyf) { - // required for truetype - if (!info->loca) return 0; - } else { - // initialization for CFF / Type2 fonts (OTF) - stbtt__buf b, topdict, topdictidx; - stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; - stbtt_uint32 cff; - - cff = stbtt__find_table(data, fontstart, "CFF "); - if (!cff) return 0; - - info->fontdicts = stbtt__new_buf(NULL, 0); - info->fdselect = stbtt__new_buf(NULL, 0); - - // @TODO this should use size from table (not 512MB) - info->cff = stbtt__new_buf(data+cff, 512*1024*1024); - b = info->cff; - - // read the header - stbtt__buf_skip(&b, 2); - stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize - - // @TODO the name INDEX could list multiple fonts, - // but we just use the first one. - stbtt__cff_get_index(&b); // name INDEX - topdictidx = stbtt__cff_get_index(&b); - topdict = stbtt__cff_index_get(topdictidx, 0); - stbtt__cff_get_index(&b); // string INDEX - info->gsubrs = stbtt__cff_get_index(&b); - - stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); - stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); - stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); - stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); - info->subrs = stbtt__get_subrs(b, topdict); - - // we only support Type 2 charstrings - if (cstype != 2) return 0; - if (charstrings == 0) return 0; - - if (fdarrayoff) { - // looks like a CID font - if (!fdselectoff) return 0; - stbtt__buf_seek(&b, fdarrayoff); - info->fontdicts = stbtt__cff_get_index(&b); - info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size-fdselectoff); - } - - stbtt__buf_seek(&b, charstrings); - info->charstrings = stbtt__cff_get_index(&b); - } - - t = stbtt__find_table(data, fontstart, "maxp"); - if (t) - info->numGlyphs = ttUSHORT(data+t+4); - else - info->numGlyphs = 0xffff; - - // find a cmap encoding table we understand *now* to avoid searching - // later. (todo: could make this installable) - // the same regardless of glyph. - numTables = ttUSHORT(data + cmap + 2); - info->index_map = 0; - for (i=0; i < numTables; ++i) { - stbtt_uint32 encoding_record = cmap + 4 + 8 * i; - // find an encoding we understand: - switch(ttUSHORT(data+encoding_record)) { - case STBTT_PLATFORM_ID_MICROSOFT: - switch (ttUSHORT(data+encoding_record+2)) { - case STBTT_MS_EID_UNICODE_BMP: - case STBTT_MS_EID_UNICODE_FULL: - // MS/Unicode - info->index_map = cmap + ttULONG(data+encoding_record+4); - break; - } - break; - case STBTT_PLATFORM_ID_UNICODE: - // Mac/iOS has these - // all the encodingIDs are unicode, so we don't bother to check it - info->index_map = cmap + ttULONG(data+encoding_record+4); - break; - } - } - if (info->index_map == 0) - return 0; - - info->indexToLocFormat = ttUSHORT(data+info->head + 50); - return 1; -} - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) -{ - stbtt_uint8 *data = info->data; - stbtt_uint32 index_map = info->index_map; - - stbtt_uint16 format = ttUSHORT(data + index_map + 0); - if (format == 0) { // apple byte encoding - stbtt_int32 bytes = ttUSHORT(data + index_map + 2); - if (unicode_codepoint < bytes-6) - return ttBYTE(data + index_map + 6 + unicode_codepoint); - return 0; - } else if (format == 6) { - stbtt_uint32 first = ttUSHORT(data + index_map + 6); - stbtt_uint32 count = ttUSHORT(data + index_map + 8); - if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) - return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); - return 0; - } else if (format == 2) { - STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean - return 0; - } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges - stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; - stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; - stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); - stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; - - // do a binary search of the segments - stbtt_uint32 endCount = index_map + 14; - stbtt_uint32 search = endCount; - - if (unicode_codepoint > 0xffff) - return 0; - - // they lie from endCount .. endCount + segCount - // but searchRange is the nearest power of two, so... - if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) - search += rangeShift*2; - - // now decrement to bias correctly to find smallest - search -= 2; - while (entrySelector) { - stbtt_uint16 end; - searchRange >>= 1; - end = ttUSHORT(data + search + searchRange*2); - if (unicode_codepoint > end) - search += searchRange*2; - --entrySelector; - } - search += 2; - - { - stbtt_uint16 offset, start; - stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1); - - STBTT_assert(unicode_codepoint <= ttUSHORT(data + endCount + 2*item)); - start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); - if (unicode_codepoint < start) - return 0; - - offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); - if (offset == 0) - return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); - - return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); - } - } else if (format == 12 || format == 13) { - stbtt_uint32 ngroups = ttULONG(data+index_map+12); - stbtt_int32 low,high; - low = 0; high = (stbtt_int32)ngroups; - // Binary search the right group. - while (low < high) { - stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high - stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); - stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); - if ((stbtt_uint32) unicode_codepoint < start_char) - high = mid; - else if ((stbtt_uint32) unicode_codepoint > end_char) - low = mid+1; - else { - stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); - if (format == 12) - return start_glyph + unicode_codepoint-start_char; - else // format == 13 - return start_glyph; - } - } - return 0; // not found - } - // @TODO - STBTT_assert(0); - return 0; -} - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) -{ - return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); -} - -static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) -{ - v->type = type; - v->x = (stbtt_int16) x; - v->y = (stbtt_int16) y; - v->cx = (stbtt_int16) cx; - v->cy = (stbtt_int16) cy; -} - -static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) -{ - int g1,g2; - - STBTT_assert(!info->cff.size); - - if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range - if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format - - if (info->indexToLocFormat == 0) { - g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; - g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; - } else { - g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); - g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); - } - - return g1==g2 ? -1 : g1; // if length is 0, return -1 -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); - -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) -{ - if (info->cff.size) { - stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); - } else { - int g = stbtt__GetGlyfOffset(info, glyph_index); - if (g < 0) return 0; - - if (x0) *x0 = ttSHORT(info->data + g + 2); - if (y0) *y0 = ttSHORT(info->data + g + 4); - if (x1) *x1 = ttSHORT(info->data + g + 6); - if (y1) *y1 = ttSHORT(info->data + g + 8); - } - return 1; -} - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) -{ - return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); -} - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index) -{ - stbtt_int16 numberOfContours; - int g; - if (info->cff.size) - return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; - g = stbtt__GetGlyfOffset(info, glyph_index); - if (g < 0) return 1; - numberOfContours = ttSHORT(info->data + g); - return numberOfContours == 0; -} - -static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, - stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) -{ - if (start_off) { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); - } else { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); - } - return num_vertices; -} - -static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - stbtt_int16 numberOfContours; - stbtt_uint8 *endPtsOfContours; - stbtt_uint8 *data = info->data; - stbtt_vertex *vertices=0; - int num_vertices=0; - int g = stbtt__GetGlyfOffset(info, glyph_index); - - *pvertices = NULL; - - if (g < 0) return 0; - - numberOfContours = ttSHORT(data + g); - - if (numberOfContours > 0) { - stbtt_uint8 flags=0,flagcount; - stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; - stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; - stbtt_uint8 *points; - endPtsOfContours = (data + g + 10); - ins = ttUSHORT(data + g + 10 + numberOfContours * 2); - points = data + g + 10 + numberOfContours * 2 + 2 + ins; - - n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); - - m = n + 2*numberOfContours; // a loose bound on how many vertices we might need - vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); - if (vertices == 0) - return 0; - - next_move = 0; - flagcount=0; - - // in first pass, we load uninterpreted data into the allocated array - // above, shifted to the end of the array so we won't overwrite it when - // we create our final data starting from the front - - off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated - - // first load flags - - for (i=0; i < n; ++i) { - if (flagcount == 0) { - flags = *points++; - if (flags & 8) - flagcount = *points++; - } else - --flagcount; - vertices[off+i].type = flags; - } - - // now load x coordinates - x=0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - if (flags & 2) { - stbtt_int16 dx = *points++; - x += (flags & 16) ? dx : -dx; // ??? - } else { - if (!(flags & 16)) { - x = x + (stbtt_int16) (points[0]*256 + points[1]); - points += 2; - } - } - vertices[off+i].x = (stbtt_int16) x; - } - - // now load y coordinates - y=0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - if (flags & 4) { - stbtt_int16 dy = *points++; - y += (flags & 32) ? dy : -dy; // ??? - } else { - if (!(flags & 32)) { - y = y + (stbtt_int16) (points[0]*256 + points[1]); - points += 2; - } - } - vertices[off+i].y = (stbtt_int16) y; - } - - // now convert them to our format - num_vertices=0; - sx = sy = cx = cy = scx = scy = 0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - x = (stbtt_int16) vertices[off+i].x; - y = (stbtt_int16) vertices[off+i].y; - - if (next_move == i) { - if (i != 0) - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); - - // now start the new one - start_off = !(flags & 1); - if (start_off) { - // if we start off with an off-curve point, then when we need to find a point on the curve - // where we can start, and we need to save some state for when we wraparound. - scx = x; - scy = y; - if (!(vertices[off+i+1].type & 1)) { - // next point is also a curve point, so interpolate an on-point curve - sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; - sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; - } else { - // otherwise just use the next point as our start point - sx = (stbtt_int32) vertices[off+i+1].x; - sy = (stbtt_int32) vertices[off+i+1].y; - ++i; // we're using point i+1 as the starting point, so skip it - } - } else { - sx = x; - sy = y; - } - stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); - was_off = 0; - next_move = 1 + ttUSHORT(endPtsOfContours+j*2); - ++j; - } else { - if (!(flags & 1)) { // if it's a curve - if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); - cx = x; - cy = y; - was_off = 1; - } else { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); - was_off = 0; - } - } - } - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); - } else if (numberOfContours == -1) { - // Compound shapes. - int more = 1; - stbtt_uint8 *comp = data + g + 10; - num_vertices = 0; - vertices = 0; - while (more) { - stbtt_uint16 flags, gidx; - int comp_num_verts = 0, i; - stbtt_vertex *comp_verts = 0, *tmp = 0; - float mtx[6] = {1,0,0,1,0,0}, m, n; - - flags = ttSHORT(comp); comp+=2; - gidx = ttSHORT(comp); comp+=2; - - if (flags & 2) { // XY values - if (flags & 1) { // shorts - mtx[4] = ttSHORT(comp); comp+=2; - mtx[5] = ttSHORT(comp); comp+=2; - } else { - mtx[4] = ttCHAR(comp); comp+=1; - mtx[5] = ttCHAR(comp); comp+=1; - } - } - else { - // @TODO handle matching point - STBTT_assert(0); - } - if (flags & (1<<3)) { // WE_HAVE_A_SCALE - mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = mtx[2] = 0; - } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE - mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = mtx[2] = 0; - mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO - mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - } - - // Find transformation scales. - m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); - n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); - - // Get indexed glyph. - comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); - if (comp_num_verts > 0) { - // Transform vertices. - for (i = 0; i < comp_num_verts; ++i) { - stbtt_vertex* v = &comp_verts[i]; - stbtt_vertex_type x,y; - x=v->x; y=v->y; - v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); - v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); - x=v->cx; y=v->cy; - v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); - v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); - } - // Append vertices. - tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); - if (!tmp) { - if (vertices) STBTT_free(vertices, info->userdata); - if (comp_verts) STBTT_free(comp_verts, info->userdata); - return 0; - } - if (num_vertices > 0) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); - STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); - if (vertices) STBTT_free(vertices, info->userdata); - vertices = tmp; - STBTT_free(comp_verts, info->userdata); - num_vertices += comp_num_verts; - } - // More components ? - more = flags & (1<<5); - } - } else if (numberOfContours < 0) { - // @TODO other compound variations? - STBTT_assert(0); - } else { - // numberOfCounters == 0, do nothing - } - - *pvertices = vertices; - return num_vertices; -} - -typedef struct -{ - int bounds; - int started; - float first_x, first_y; - float x, y; - stbtt_int32 min_x, max_x, min_y, max_y; - - stbtt_vertex *pvertices; - int num_vertices; -} stbtt__csctx; - -#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} - -static void stbtt__track_vertex(stbtt__csctx *c, stbtt_int32 x, stbtt_int32 y) -{ - if (x > c->max_x || !c->started) c->max_x = x; - if (y > c->max_y || !c->started) c->max_y = y; - if (x < c->min_x || !c->started) c->min_x = x; - if (y < c->min_y || !c->started) c->min_y = y; - c->started = 1; -} - -static void stbtt__csctx_v(stbtt__csctx *c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) -{ - if (c->bounds) { - stbtt__track_vertex(c, x, y); - if (type == STBTT_vcubic) { - stbtt__track_vertex(c, cx, cy); - stbtt__track_vertex(c, cx1, cy1); - } - } else { - stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); - c->pvertices[c->num_vertices].cx1 = (stbtt_int16) cx1; - c->pvertices[c->num_vertices].cy1 = (stbtt_int16) cy1; - } - c->num_vertices++; -} - -static void stbtt__csctx_close_shape(stbtt__csctx *ctx) -{ - if (ctx->first_x != ctx->x || ctx->first_y != ctx->y) - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rmove_to(stbtt__csctx *ctx, float dx, float dy) -{ - stbtt__csctx_close_shape(ctx); - ctx->first_x = ctx->x = ctx->x + dx; - ctx->first_y = ctx->y = ctx->y + dy; - stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rline_to(stbtt__csctx *ctx, float dx, float dy) -{ - ctx->x += dx; - ctx->y += dy; - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rccurve_to(stbtt__csctx *ctx, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) -{ - float cx1 = ctx->x + dx1; - float cy1 = ctx->y + dy1; - float cx2 = cx1 + dx2; - float cy2 = cy1 + dy2; - ctx->x = cx2 + dx3; - ctx->y = cy2 + dy3; - stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); -} - -static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) -{ - int count = stbtt__cff_index_count(&idx); - int bias = 107; - if (count >= 33900) - bias = 32768; - else if (count >= 1240) - bias = 1131; - n += bias; - if (n < 0 || n >= count) - return stbtt__new_buf(NULL, 0); - return stbtt__cff_index_get(idx, n); -} - -static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info, int glyph_index) -{ - stbtt__buf fdselect = info->fdselect; - int nranges, start, end, v, fmt, fdselector = -1, i; - - stbtt__buf_seek(&fdselect, 0); - fmt = stbtt__buf_get8(&fdselect); - if (fmt == 0) { - // untested - stbtt__buf_skip(&fdselect, glyph_index); - fdselector = stbtt__buf_get8(&fdselect); - } else if (fmt == 3) { - nranges = stbtt__buf_get16(&fdselect); - start = stbtt__buf_get16(&fdselect); - for (i = 0; i < nranges; i++) { - v = stbtt__buf_get8(&fdselect); - end = stbtt__buf_get16(&fdselect); - if (glyph_index >= start && glyph_index < end) { - fdselector = v; - break; - } - start = end; - } - } - if (fdselector == -1) stbtt__new_buf(NULL, 0); - return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); -} - -static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, stbtt__csctx *c) -{ - int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; - int has_subrs = 0, clear_stack; - float s[48]; - stbtt__buf subr_stack[10], subrs = info->subrs, b; - float f; - -#define STBTT__CSERR(s) (0) - - // this currently ignores the initial width value, which isn't needed if we have hmtx - b = stbtt__cff_index_get(info->charstrings, glyph_index); - while (b.cursor < b.size) { - i = 0; - clear_stack = 1; - b0 = stbtt__buf_get8(&b); - switch (b0) { - // @TODO implement hinting - case 0x13: // hintmask - case 0x14: // cntrmask - if (in_header) - maskbits += (sp / 2); // implicit "vstem" - in_header = 0; - stbtt__buf_skip(&b, (maskbits + 7) / 8); - break; - - case 0x01: // hstem - case 0x03: // vstem - case 0x12: // hstemhm - case 0x17: // vstemhm - maskbits += (sp / 2); - break; - - case 0x15: // rmoveto - in_header = 0; - if (sp < 2) return STBTT__CSERR("rmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp-2], s[sp-1]); - break; - case 0x04: // vmoveto - in_header = 0; - if (sp < 1) return STBTT__CSERR("vmoveto stack"); - stbtt__csctx_rmove_to(c, 0, s[sp-1]); - break; - case 0x16: // hmoveto - in_header = 0; - if (sp < 1) return STBTT__CSERR("hmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp-1], 0); - break; - - case 0x05: // rlineto - if (sp < 2) return STBTT__CSERR("rlineto stack"); - for (; i + 1 < sp; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i+1]); - break; - - // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical - // starting from a different place. - - case 0x07: // vlineto - if (sp < 1) return STBTT__CSERR("vlineto stack"); - goto vlineto; - case 0x06: // hlineto - if (sp < 1) return STBTT__CSERR("hlineto stack"); - for (;;) { - if (i >= sp) break; - stbtt__csctx_rline_to(c, s[i], 0); - i++; - vlineto: - if (i >= sp) break; - stbtt__csctx_rline_to(c, 0, s[i]); - i++; - } - break; - - case 0x1F: // hvcurveto - if (sp < 4) return STBTT__CSERR("hvcurveto stack"); - goto hvcurveto; - case 0x1E: // vhcurveto - if (sp < 4) return STBTT__CSERR("vhcurveto stack"); - for (;;) { - if (i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, 0, s[i], s[i+1], s[i+2], s[i+3], (sp - i == 5) ? s[i + 4] : 0.0f); - i += 4; - hvcurveto: - if (i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, s[i], 0, s[i+1], s[i+2], (sp - i == 5) ? s[i+4] : 0.0f, s[i+3]); - i += 4; - } - break; - - case 0x08: // rrcurveto - if (sp < 6) return STBTT__CSERR("rcurveline stack"); - for (; i + 5 < sp; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - break; - - case 0x18: // rcurveline - if (sp < 8) return STBTT__CSERR("rcurveline stack"); - for (; i + 5 < sp - 2; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - if (i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); - stbtt__csctx_rline_to(c, s[i], s[i+1]); - break; - - case 0x19: // rlinecurve - if (sp < 8) return STBTT__CSERR("rlinecurve stack"); - for (; i + 1 < sp - 6; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i+1]); - if (i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - break; - - case 0x1A: // vvcurveto - case 0x1B: // hhcurveto - if (sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); - f = 0.0; - if (sp & 1) { f = s[i]; i++; } - for (; i + 3 < sp; i += 4) { - if (b0 == 0x1B) - stbtt__csctx_rccurve_to(c, s[i], f, s[i+1], s[i+2], s[i+3], 0.0); - else - stbtt__csctx_rccurve_to(c, f, s[i], s[i+1], s[i+2], 0.0, s[i+3]); - f = 0.0; - } - break; - - case 0x0A: // callsubr - if (!has_subrs) { - if (info->fdselect.size) - subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); - has_subrs = 1; - } - // fallthrough - case 0x1D: // callgsubr - if (sp < 1) return STBTT__CSERR("call(g|)subr stack"); - v = (int) s[--sp]; - if (subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); - subr_stack[subr_stack_height++] = b; - b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); - if (b.size == 0) return STBTT__CSERR("subr not found"); - b.cursor = 0; - clear_stack = 0; - break; - - case 0x0B: // return - if (subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); - b = subr_stack[--subr_stack_height]; - clear_stack = 0; - break; - - case 0x0E: // endchar - stbtt__csctx_close_shape(c); - return 1; - - case 0x0C: { // two-byte escape - float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; - float dx, dy; - int b1 = stbtt__buf_get8(&b); - switch (b1) { - // @TODO These "flex" implementations ignore the flex-depth and resolution, - // and always draw beziers. - case 0x22: // hflex - if (sp < 7) return STBTT__CSERR("hflex stack"); - dx1 = s[0]; - dx2 = s[1]; - dy2 = s[2]; - dx3 = s[3]; - dx4 = s[4]; - dx5 = s[5]; - dx6 = s[6]; - stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); - break; - - case 0x23: // flex - if (sp < 13) return STBTT__CSERR("flex stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = s[10]; - dy6 = s[11]; - //fd is s[12] - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - case 0x24: // hflex1 - if (sp < 9) return STBTT__CSERR("hflex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dx4 = s[5]; - dx5 = s[6]; - dy5 = s[7]; - dx6 = s[8]; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1+dy2+dy5)); - break; - - case 0x25: // flex1 - if (sp < 11) return STBTT__CSERR("flex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = dy6 = s[10]; - dx = dx1+dx2+dx3+dx4+dx5; - dy = dy1+dy2+dy3+dy4+dy5; - if (STBTT_fabs(dx) > STBTT_fabs(dy)) - dy6 = -dy; - else - dx6 = -dx; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - default: - return STBTT__CSERR("unimplemented"); - } - } break; - - default: - if (b0 != 255 && b0 != 28 && (b0 < 32 || b0 > 254)) - return STBTT__CSERR("reserved operator"); - - // push immediate - if (b0 == 255) { - f = (float)stbtt__buf_get32(&b) / 0x10000; - } else { - stbtt__buf_skip(&b, -1); - f = (float)(stbtt_int16)stbtt__cff_int(&b); - } - if (sp >= 48) return STBTT__CSERR("push stack overflow"); - s[sp++] = f; - clear_stack = 0; - break; - } - if (clear_stack) sp = 0; - } - return STBTT__CSERR("no endchar"); - -#undef STBTT__CSERR -} - -static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - // runs the charstring twice, once to count and once to output (to avoid realloc) - stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); - stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); - if (stbtt__run_charstring(info, glyph_index, &count_ctx)) { - *pvertices = (stbtt_vertex*)STBTT_malloc(count_ctx.num_vertices*sizeof(stbtt_vertex), info->userdata); - output_ctx.pvertices = *pvertices; - if (stbtt__run_charstring(info, glyph_index, &output_ctx)) { - STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); - return output_ctx.num_vertices; - } - } - *pvertices = NULL; - return 0; -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) -{ - stbtt__csctx c = STBTT__CSCTX_INIT(1); - int r = stbtt__run_charstring(info, glyph_index, &c); - if (x0) { - *x0 = r ? c.min_x : 0; - *y0 = r ? c.min_y : 0; - *x1 = r ? c.max_x : 0; - *y1 = r ? c.max_y : 0; - } - return r ? c.num_vertices : 0; -} - -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - if (!info->cff.size) - return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); - else - return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); -} - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) -{ - stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); - if (glyph_index < numOfLongHorMetrics) { - if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); - if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); - } else { - if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); - if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); - } -} - -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) -{ - stbtt_uint8 *data = info->data + info->kern; - stbtt_uint32 needle, straw; - int l, r, m; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - l = 0; - r = ttUSHORT(data+10) - 1; - needle = glyph1 << 16 | glyph2; - while (l <= r) { - m = (l + r) >> 1; - straw = ttULONG(data+18+(m*6)); // note: unaligned read - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else - return ttSHORT(data+22+(m*6)); - } - return 0; -} - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) -{ - if (!info->kern) // if no kerning table, don't waste time looking up both codepoint->glyphs - return 0; - return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); -} - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) -{ - stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); -} - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) -{ - if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); - if (descent) *descent = ttSHORT(info->data+info->hhea + 6); - if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); -} - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1) -{ - *x0 = ttSHORT(info->data + info->head + 36); - *y0 = ttSHORT(info->data + info->head + 38); - *x1 = ttSHORT(info->data + info->head + 40); - *y1 = ttSHORT(info->data + info->head + 42); -} - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) -{ - int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); - return (float) height / fheight; -} - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels) -{ - int unitsPerEm = ttUSHORT(info->data + info->head + 18); - return pixels / unitsPerEm; -} - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) -{ - STBTT_free(v, info->userdata); -} - -////////////////////////////////////////////////////////////////////////////// -// -// antialiasing software rasterizer -// - -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - int x0=0,y0=0,x1,y1; // =0 suppresses compiler warning - if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) { - // e.g. space character - if (ix0) *ix0 = 0; - if (iy0) *iy0 = 0; - if (ix1) *ix1 = 0; - if (iy1) *iy1 = 0; - } else { - // move to integral bboxes (treating pixels as little squares, what pixels get touched)? - if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x); - if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); - if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x); - if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y); - } -} - -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); -} - -////////////////////////////////////////////////////////////////////////////// -// -// Rasterizer - -typedef struct stbtt__hheap_chunk -{ - struct stbtt__hheap_chunk *next; -} stbtt__hheap_chunk; - -typedef struct stbtt__hheap -{ - struct stbtt__hheap_chunk *head; - void *first_free; - int num_remaining_in_head_chunk; -} stbtt__hheap; - -static void *stbtt__hheap_alloc(stbtt__hheap *hh, size_t size, void *userdata) -{ - if (hh->first_free) { - void *p = hh->first_free; - hh->first_free = * (void **) p; - return p; - } else { - if (hh->num_remaining_in_head_chunk == 0) { - int count = (size < 32 ? 2000 : size < 128 ? 800 : 100); - stbtt__hheap_chunk *c = (stbtt__hheap_chunk *) STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); - if (c == NULL) - return NULL; - c->next = hh->head; - hh->head = c; - hh->num_remaining_in_head_chunk = count; - } - --hh->num_remaining_in_head_chunk; - return (char *) (hh->head) + size * hh->num_remaining_in_head_chunk; - } -} - -static void stbtt__hheap_free(stbtt__hheap *hh, void *p) -{ - *(void **) p = hh->first_free; - hh->first_free = p; -} - -static void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata) -{ - stbtt__hheap_chunk *c = hh->head; - while (c) { - stbtt__hheap_chunk *n = c->next; - STBTT_free(c, userdata); - c = n; - } -} - -typedef struct stbtt__edge { - float x0,y0, x1,y1; - int invert; -} stbtt__edge; - - -typedef struct stbtt__active_edge -{ - struct stbtt__active_edge *next; - #if STBTT_RASTERIZER_VERSION==1 - int x,dx; - float ey; - int direction; - #elif STBTT_RASTERIZER_VERSION==2 - float fx,fdx,fdy; - float direction; - float sy; - float ey; - #else - #error "Unrecognized value of STBTT_RASTERIZER_VERSION" - #endif -} stbtt__active_edge; - -#if STBTT_RASTERIZER_VERSION == 1 -#define STBTT_FIXSHIFT 10 -#define STBTT_FIX (1 << STBTT_FIXSHIFT) -#define STBTT_FIXMASK (STBTT_FIX-1) - -static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) -{ - stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - if (!z) return z; - - // round dx down to avoid overshooting - if (dxdy < 0) - z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); - else - z->dx = STBTT_ifloor(STBTT_FIX * dxdy); - - z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); // use z->dx so when we offset later it's by the same amount - z->x -= off_x * STBTT_FIX; - - z->ey = e->y1; - z->next = 0; - z->direction = e->invert ? 1 : -1; - return z; -} -#elif STBTT_RASTERIZER_VERSION == 2 -static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) -{ - stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - //STBTT_assert(e->y0 <= start_point); - if (!z) return z; - z->fdx = dxdy; - z->fdy = dxdy != 0.0f ? (1.0f/dxdy) : 0.0f; - z->fx = e->x0 + dxdy * (start_point - e->y0); - z->fx -= off_x; - z->direction = e->invert ? 1.0f : -1.0f; - z->sy = e->y0; - z->ey = e->y1; - z->next = 0; - return z; -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#if STBTT_RASTERIZER_VERSION == 1 -// note: this routine clips fills that extend off the edges... ideally this -// wouldn't happen, but it could happen if the truetype glyph bounding boxes -// are wrong, or if the user supplies a too-small bitmap -static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) -{ - // non-zero winding fill - int x0=0, w=0; - - while (e) { - if (w == 0) { - // if we're currently at zero, we need to record the edge start point - x0 = e->x; w += e->direction; - } else { - int x1 = e->x; w += e->direction; - // if we went to zero, we need to draw - if (w == 0) { - int i = x0 >> STBTT_FIXSHIFT; - int j = x1 >> STBTT_FIXSHIFT; - - if (i < len && j >= 0) { - if (i == j) { - // x0,x1 are the same pixel, so compute combined coverage - scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> STBTT_FIXSHIFT); - } else { - if (i >= 0) // add antialiasing for x0 - scanline[i] = scanline[i] + (stbtt_uint8) (((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); - else - i = -1; // clip - - if (j < len) // add antialiasing for x1 - scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); - else - j = len; // clip - - for (++i; i < j; ++i) // fill pixels between x0 and x1 - scanline[i] = scanline[i] + (stbtt_uint8) max_weight; - } - } - } - } - - e = e->next; - } -} - -static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge *active = NULL; - int y,j=0; - int max_weight = (255 / vsubsample); // weight per vertical scanline - int s; // vertical subsample index - unsigned char scanline_data[512], *scanline; - - if (result->w > 512) - scanline = (unsigned char *) STBTT_malloc(result->w, userdata); - else - scanline = scanline_data; - - y = off_y * vsubsample; - e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; - - while (j < result->h) { - STBTT_memset(scanline, 0, result->w); - for (s=0; s < vsubsample; ++s) { - // find center of pixel for this scanline - float scan_y = y + 0.5f; - stbtt__active_edge **step = &active; - - // update all active edges; - // remove all active edges that terminate before the center of this scanline - while (*step) { - stbtt__active_edge * z = *step; - if (z->ey <= scan_y) { - *step = z->next; // delete from list - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } else { - z->x += z->dx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - } - - // resort the list if needed - for(;;) { - int changed=0; - step = &active; - while (*step && (*step)->next) { - if ((*step)->x > (*step)->next->x) { - stbtt__active_edge *t = *step; - stbtt__active_edge *q = t->next; - - t->next = q->next; - q->next = t; - *step = q; - changed = 1; - } - step = &(*step)->next; - } - if (!changed) break; - } - - // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline - while (e->y0 <= scan_y) { - if (e->y1 > scan_y) { - stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); - if (z != NULL) { - // find insertion point - if (active == NULL) - active = z; - else if (z->x < active->x) { - // insert at front - z->next = active; - active = z; - } else { - // find thing to insert AFTER - stbtt__active_edge *p = active; - while (p->next && p->next->x < z->x) - p = p->next; - // at this point, p->next->x is NOT < z->x - z->next = p->next; - p->next = z; - } - } - } - ++e; - } - - // now process all active edges in XOR fashion - if (active) - stbtt__fill_active_edges(scanline, result->w, active, max_weight); - - ++y; - } - STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if (scanline != scanline_data) - STBTT_free(scanline, userdata); -} - -#elif STBTT_RASTERIZER_VERSION == 2 - -// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 -// (i.e. it has already been clipped to those) -static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edge *e, float x0, float y0, float x1, float y1) -{ - if (y0 == y1) return; - STBTT_assert(y0 < y1); - STBTT_assert(e->sy <= e->ey); - if (y0 > e->ey) return; - if (y1 < e->sy) return; - if (y0 < e->sy) { - x0 += (x1-x0) * (e->sy - y0) / (y1-y0); - y0 = e->sy; - } - if (y1 > e->ey) { - x1 += (x1-x0) * (e->ey - y1) / (y1-y0); - y1 = e->ey; - } - - if (x0 == x) - STBTT_assert(x1 <= x+1); - else if (x0 == x+1) - STBTT_assert(x1 >= x); - else if (x0 <= x) - STBTT_assert(x1 <= x); - else if (x0 >= x+1) - STBTT_assert(x1 >= x+1); - else - STBTT_assert(x1 >= x && x1 <= x+1); - - if (x0 <= x && x1 <= x) - scanline[x] += e->direction * (y1-y0); - else if (x0 >= x+1 && x1 >= x+1) - ; - else { - STBTT_assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1); - scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); // coverage = 1 - average x position - } -} - -static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top) -{ - float y_bottom = y_top+1; - - while (e) { - // brute force every pixel - - // compute intersection points with top & bottom - STBTT_assert(e->ey >= y_top); - - if (e->fdx == 0) { - float x0 = e->fx; - if (x0 < len) { - if (x0 >= 0) { - stbtt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom); - stbtt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom); - } else { - stbtt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom); - } - } - } else { - float x0 = e->fx; - float dx = e->fdx; - float xb = x0 + dx; - float x_top, x_bottom; - float sy0,sy1; - float dy = e->fdy; - STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); - - // compute endpoints of line segment clipped to this scanline (if the - // line segment starts on this scanline. x0 is the intersection of the - // line with y_top, but that may be off the line segment. - if (e->sy > y_top) { - x_top = x0 + dx * (e->sy - y_top); - sy0 = e->sy; - } else { - x_top = x0; - sy0 = y_top; - } - if (e->ey < y_bottom) { - x_bottom = x0 + dx * (e->ey - y_top); - sy1 = e->ey; - } else { - x_bottom = xb; - sy1 = y_bottom; - } - - if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { - // from here on, we don't have to range check x values - - if ((int) x_top == (int) x_bottom) { - float height; - // simple case, only spans one pixel - int x = (int) x_top; - height = sy1 - sy0; - STBTT_assert(x >= 0 && x < len); - scanline[x] += e->direction * (1-((x_top - x) + (x_bottom-x))/2) * height; - scanline_fill[x] += e->direction * height; // everything right of this pixel is filled - } else { - int x,x1,x2; - float y_crossing, step, sign, area; - // covers 2+ pixels - if (x_top > x_bottom) { - // flip scanline vertically; signed area is the same - float t; - sy0 = y_bottom - (sy0 - y_top); - sy1 = y_bottom - (sy1 - y_top); - t = sy0, sy0 = sy1, sy1 = t; - t = x_bottom, x_bottom = x_top, x_top = t; - dx = -dx; - dy = -dy; - t = x0, x0 = xb, xb = t; - } - - x1 = (int) x_top; - x2 = (int) x_bottom; - // compute intersection with y axis at x1+1 - y_crossing = (x1+1 - x0) * dy + y_top; - - sign = e->direction; - // area of the rectangle covered from y0..y_crossing - area = sign * (y_crossing-sy0); - // area of the triangle (x_top,y0), (x+1,y0), (x+1,y_crossing) - scanline[x1] += area * (1-((x_top - x1)+(x1+1-x1))/2); - - step = sign * dy; - for (x = x1+1; x < x2; ++x) { - scanline[x] += area + step/2; - area += step; - } - y_crossing += dy * (x2 - (x1+1)); - - STBTT_assert(STBTT_fabs(area) <= 1.01f); - - scanline[x2] += area + sign * (1-((x2-x2)+(x_bottom-x2))/2) * (sy1-y_crossing); - - scanline_fill[x2] += sign * (sy1-sy0); - } - } else { - // if edge goes outside of box we're drawing, we require - // clipping logic. since this does not match the intended use - // of this library, we use a different, very slow brute - // force implementation - int x; - for (x=0; x < len; ++x) { - // cases: - // - // there can be up to two intersections with the pixel. any intersection - // with left or right edges can be handled by splitting into two (or three) - // regions. intersections with top & bottom do not necessitate case-wise logic. - // - // the old way of doing this found the intersections with the left & right edges, - // then used some simple logic to produce up to three segments in sorted order - // from top-to-bottom. however, this had a problem: if an x edge was epsilon - // across the x border, then the corresponding y position might not be distinct - // from the other y segment, and it might ignored as an empty segment. to avoid - // that, we need to explicitly produce segments based on x positions. - - // rename variables to clear pairs - float y0 = y_top; - float x1 = (float) (x); - float x2 = (float) (x+1); - float x3 = xb; - float y3 = y_bottom; - float y1,y2; - - // x = e->x + e->dx * (y-y_top) - // (y-y_top) = (x - e->x) / e->dx - // y = (x - e->x) / e->dx + y_top - y1 = (x - x0) / dx + y_top; - y2 = (x+1 - x0) / dx + y_top; - - if (x0 < x1 && x3 > x2) { // three segments descending down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else if (x3 < x1 && x0 > x2) { // three segments descending down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x0 < x1 && x3 > x1) { // two segments across x, down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x3 < x1 && x0 > x1) { // two segments across x, down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x0 < x2 && x3 > x2) { // two segments across x+1, down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else if (x3 < x2 && x0 > x2) { // two segments across x+1, down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else { // one segment - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x3,y3); - } - } - } - } - e = e->next; - } -} - -// directly AA rasterize edges w/o supersampling -static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge *active = NULL; - int y,j=0, i; - float scanline_data[129], *scanline, *scanline2; - - STBTT__NOTUSED(vsubsample); - - if (result->w > 64) - scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata); - else - scanline = scanline_data; - - scanline2 = scanline + result->w; - - y = off_y; - e[n].y0 = (float) (off_y + result->h) + 1; - - while (j < result->h) { - // find center of pixel for this scanline - float scan_y_top = y + 0.0f; - float scan_y_bottom = y + 1.0f; - stbtt__active_edge **step = &active; - - STBTT_memset(scanline , 0, result->w*sizeof(scanline[0])); - STBTT_memset(scanline2, 0, (result->w+1)*sizeof(scanline[0])); - - // update all active edges; - // remove all active edges that terminate before the top of this scanline - while (*step) { - stbtt__active_edge * z = *step; - if (z->ey <= scan_y_top) { - *step = z->next; // delete from list - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } else { - step = &((*step)->next); // advance through list - } - } - - // insert all edges that start before the bottom of this scanline - while (e->y0 <= scan_y_bottom) { - if (e->y0 != e->y1) { - stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); - if (z != NULL) { - STBTT_assert(z->ey >= scan_y_top); - // insert at front - z->next = active; - active = z; - } - } - ++e; - } - - // now process all active edges - if (active) - stbtt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top); - - { - float sum = 0; - for (i=0; i < result->w; ++i) { - float k; - int m; - sum += scanline2[i]; - k = scanline[i] + sum; - k = (float) STBTT_fabs(k)*255 + 0.5f; - m = (int) k; - if (m > 255) m = 255; - result->pixels[j*result->stride + i] = (unsigned char) m; - } - } - // advance all the edges - step = &active; - while (*step) { - stbtt__active_edge *z = *step; - z->fx += z->fdx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - - ++y; - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if (scanline != scanline_data) - STBTT_free(scanline, userdata); -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) - -static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n) -{ - int i,j; - for (i=1; i < n; ++i) { - stbtt__edge t = p[i], *a = &t; - j = i; - while (j > 0) { - stbtt__edge *b = &p[j-1]; - int c = STBTT__COMPARE(a,b); - if (!c) break; - p[j] = p[j-1]; - --j; - } - if (i != j) - p[j] = t; - } -} - -static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n) -{ - /* threshhold for transitioning to insertion sort */ - while (n > 12) { - stbtt__edge t; - int c01,c12,c,m,i,j; - - /* compute median of three */ - m = n >> 1; - c01 = STBTT__COMPARE(&p[0],&p[m]); - c12 = STBTT__COMPARE(&p[m],&p[n-1]); - /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ - if (c01 != c12) { - /* otherwise, we'll need to swap something else to middle */ - int z; - c = STBTT__COMPARE(&p[0],&p[n-1]); - /* 0>mid && midn => n; 0 0 */ - /* 0n: 0>n => 0; 0 n */ - z = (c == c12) ? 0 : n-1; - t = p[z]; - p[z] = p[m]; - p[m] = t; - } - /* now p[m] is the median-of-three */ - /* swap it to the beginning so it won't move around */ - t = p[0]; - p[0] = p[m]; - p[m] = t; - - /* partition loop */ - i=1; - j=n-1; - for(;;) { - /* handling of equality is crucial here */ - /* for sentinels & efficiency with duplicates */ - for (;;++i) { - if (!STBTT__COMPARE(&p[i], &p[0])) break; - } - for (;;--j) { - if (!STBTT__COMPARE(&p[0], &p[j])) break; - } - /* make sure we haven't crossed */ - if (i >= j) break; - t = p[i]; - p[i] = p[j]; - p[j] = t; - - ++i; - --j; - } - /* recurse on smaller side, iterate on larger */ - if (j < (n-i)) { - stbtt__sort_edges_quicksort(p,j); - p = p+i; - n = n-i; - } else { - stbtt__sort_edges_quicksort(p+i, n-i); - n = j; - } - } -} - -static void stbtt__sort_edges(stbtt__edge *p, int n) -{ - stbtt__sort_edges_quicksort(p, n); - stbtt__sort_edges_ins_sort(p, n); -} - -typedef struct -{ - float x,y; -} stbtt__point; - -static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) -{ - float y_scale_inv = invert ? -scale_y : scale_y; - stbtt__edge *e; - int n,i,j,k,m; -#if STBTT_RASTERIZER_VERSION == 1 - int vsubsample = result->h < 8 ? 15 : 5; -#elif STBTT_RASTERIZER_VERSION == 2 - int vsubsample = 1; -#else - #error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - // vsubsample should divide 255 evenly; otherwise we won't reach full opacity - - // now we have to blow out the windings into explicit edge lists - n = 0; - for (i=0; i < windings; ++i) - n += wcount[i]; - - e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel - if (e == 0) return; - n = 0; - - m=0; - for (i=0; i < windings; ++i) { - stbtt__point *p = pts + m; - m += wcount[i]; - j = wcount[i]-1; - for (k=0; k < wcount[i]; j=k++) { - int a=k,b=j; - // skip the edge if horizontal - if (p[j].y == p[k].y) - continue; - // add edge from j to k to the list - e[n].invert = 0; - if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { - e[n].invert = 1; - a=j,b=k; - } - e[n].x0 = p[a].x * scale_x + shift_x; - e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; - e[n].x1 = p[b].x * scale_x + shift_x; - e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; - ++n; - } - } - - // now sort the edges by their highest point (should snap to integer, and then by x) - //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); - stbtt__sort_edges(e, n); - - // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule - stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); - - STBTT_free(e, userdata); -} - -static void stbtt__add_point(stbtt__point *points, int n, float x, float y) -{ - if (!points) return; // during first pass, it's unallocated - points[n].x = x; - points[n].y = y; -} - -// tesselate until threshhold p is happy... @TODO warped to compensate for non-linear stretching -static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) -{ - // midpoint - float mx = (x0 + 2*x1 + x2)/4; - float my = (y0 + 2*y1 + y2)/4; - // versus directly drawn line - float dx = (x0+x2)/2 - mx; - float dy = (y0+y2)/2 - my; - if (n > 16) // 65536 segments on one curve better be enough! - return 1; - if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA - stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); - stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); - } else { - stbtt__add_point(points, *num_points,x2,y2); - *num_points = *num_points+1; - } - return 1; -} - -static void stbtt__tesselate_cubic(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) -{ - // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough - float dx0 = x1-x0; - float dy0 = y1-y0; - float dx1 = x2-x1; - float dy1 = y2-y1; - float dx2 = x3-x2; - float dy2 = y3-y2; - float dx = x3-x0; - float dy = y3-y0; - float longlen = (float) (STBTT_sqrt(dx0*dx0+dy0*dy0)+STBTT_sqrt(dx1*dx1+dy1*dy1)+STBTT_sqrt(dx2*dx2+dy2*dy2)); - float shortlen = (float) STBTT_sqrt(dx*dx+dy*dy); - float flatness_squared = longlen*longlen-shortlen*shortlen; - - if (n > 16) // 65536 segments on one curve better be enough! - return; - - if (flatness_squared > objspace_flatness_squared) { - float x01 = (x0+x1)/2; - float y01 = (y0+y1)/2; - float x12 = (x1+x2)/2; - float y12 = (y1+y2)/2; - float x23 = (x2+x3)/2; - float y23 = (y2+y3)/2; - - float xa = (x01+x12)/2; - float ya = (y01+y12)/2; - float xb = (x12+x23)/2; - float yb = (y12+y23)/2; - - float mx = (xa+xb)/2; - float my = (ya+yb)/2; - - stbtt__tesselate_cubic(points, num_points, x0,y0, x01,y01, xa,ya, mx,my, objspace_flatness_squared,n+1); - stbtt__tesselate_cubic(points, num_points, mx,my, xb,yb, x23,y23, x3,y3, objspace_flatness_squared,n+1); - } else { - stbtt__add_point(points, *num_points,x3,y3); - *num_points = *num_points+1; - } -} - -// returns number of contours -static stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) -{ - stbtt__point *points=0; - int num_points=0; - - float objspace_flatness_squared = objspace_flatness * objspace_flatness; - int i,n=0,start=0, pass; - - // count how many "moves" there are to get the contour count - for (i=0; i < num_verts; ++i) - if (vertices[i].type == STBTT_vmove) - ++n; - - *num_contours = n; - if (n == 0) return 0; - - *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); - - if (*contour_lengths == 0) { - *num_contours = 0; - return 0; - } - - // make two passes through the points so we don't need to realloc - for (pass=0; pass < 2; ++pass) { - float x=0,y=0; - if (pass == 1) { - points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); - if (points == NULL) goto error; - } - num_points = 0; - n= -1; - for (i=0; i < num_verts; ++i) { - switch (vertices[i].type) { - case STBTT_vmove: - // start the next contour - if (n >= 0) - (*contour_lengths)[n] = num_points - start; - ++n; - start = num_points; - - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x,y); - break; - case STBTT_vline: - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x, y); - break; - case STBTT_vcurve: - stbtt__tesselate_curve(points, &num_points, x,y, - vertices[i].cx, vertices[i].cy, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - case STBTT_vcubic: - stbtt__tesselate_cubic(points, &num_points, x,y, - vertices[i].cx, vertices[i].cy, - vertices[i].cx1, vertices[i].cy1, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - } - } - (*contour_lengths)[n] = num_points - start; - } - - return points; -error: - STBTT_free(points, userdata); - STBTT_free(*contour_lengths, userdata); - *contour_lengths = 0; - *num_contours = 0; - return NULL; -} - -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) -{ - float scale = scale_x > scale_y ? scale_y : scale_x; - int winding_count, *winding_lengths; - stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); - if (windings) { - stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); - STBTT_free(winding_lengths, userdata); - STBTT_free(windings, userdata); - } -} - -STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) -{ - STBTT_free(bitmap, userdata); -} - -STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) -{ - int ix0,iy0,ix1,iy1; - stbtt__bitmap gbm; - stbtt_vertex *vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - - if (scale_x == 0) scale_x = scale_y; - if (scale_y == 0) { - if (scale_x == 0) { - STBTT_free(vertices, info->userdata); - return NULL; - } - scale_y = scale_x; - } - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); - - // now we get the size - gbm.w = (ix1 - ix0); - gbm.h = (iy1 - iy0); - gbm.pixels = NULL; // in case we error - - if (width ) *width = gbm.w; - if (height) *height = gbm.h; - if (xoff ) *xoff = ix0; - if (yoff ) *yoff = iy0; - - if (gbm.w && gbm.h) { - gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); - if (gbm.pixels) { - gbm.stride = gbm.w; - - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); - } - } - STBTT_free(vertices, info->userdata); - return gbm.pixels; -} - -STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) -{ - int ix0,iy0; - stbtt_vertex *vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - stbtt__bitmap gbm; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); - gbm.pixels = output; - gbm.w = out_w; - gbm.h = out_h; - gbm.stride = out_stride; - - if (gbm.w && gbm.h) - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); - - STBTT_free(vertices, info->userdata); -} - -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); -} - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); -} - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) -{ - stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); -} - -////////////////////////////////////////////////////////////////////////////// -// -// bitmap baking -// -// This is SUPER-CRAPPY packing to keep source code small - -static int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) - float pixel_height, // height of font in pixels - unsigned char *pixels, int pw, int ph, // bitmap to be filled in - int first_char, int num_chars, // characters to bake - stbtt_bakedchar *chardata) -{ - float scale; - int x,y,bottom_y, i; - stbtt_fontinfo f; - f.userdata = NULL; - if (!stbtt_InitFont(&f, data, offset)) - return -1; - STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels - x=y=1; - bottom_y = 1; - - scale = stbtt_ScaleForPixelHeight(&f, pixel_height); - - for (i=0; i < num_chars; ++i) { - int advance, lsb, x0,y0,x1,y1,gw,gh; - int g = stbtt_FindGlyphIndex(&f, first_char + i); - stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); - stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); - gw = x1-x0; - gh = y1-y0; - if (x + gw + 1 >= pw) - y = bottom_y, x = 1; // advance to next row - if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row - return -i; - STBTT_assert(x+gw < pw); - STBTT_assert(y+gh < ph); - stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); - chardata[i].x0 = (stbtt_int16) x; - chardata[i].y0 = (stbtt_int16) y; - chardata[i].x1 = (stbtt_int16) (x + gw); - chardata[i].y1 = (stbtt_int16) (y + gh); - chardata[i].xadvance = scale * advance; - chardata[i].xoff = (float) x0; - chardata[i].yoff = (float) y0; - x = x + gw + 1; - if (y+gh+1 > bottom_y) - bottom_y = y+gh+1; - } - return bottom_y; -} - -STBTT_DEF void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) -{ - float d3d_bias = opengl_fillrule ? 0 : -0.5f; - float ipw = 1.0f / pw, iph = 1.0f / ph; - stbtt_bakedchar *b = chardata + char_index; - int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); - int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); - - q->x0 = round_x + d3d_bias; - q->y0 = round_y + d3d_bias; - q->x1 = round_x + b->x1 - b->x0 + d3d_bias; - q->y1 = round_y + b->y1 - b->y0 + d3d_bias; - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -////////////////////////////////////////////////////////////////////////////// -// -// rectangle packing replacement routines if you don't have stb_rect_pack.h -// - -#ifndef STB_RECT_PACK_VERSION - -typedef int stbrp_coord; - -//////////////////////////////////////////////////////////////////////////////////// -// // -// // -// COMPILER WARNING ?!?!? // -// // -// // -// if you get a compile warning due to these symbols being defined more than // -// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // -// // -//////////////////////////////////////////////////////////////////////////////////// - -typedef struct -{ - int width,height; - int x,y,bottom_y; -} stbrp_context; - -typedef struct -{ - unsigned char x; -} stbrp_node; - -struct stbrp_rect -{ - stbrp_coord x,y; - int id,w,h,was_packed; -}; - -static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes) -{ - con->width = pw; - con->height = ph; - con->x = 0; - con->y = 0; - con->bottom_y = 0; - STBTT__NOTUSED(nodes); - STBTT__NOTUSED(num_nodes); -} - -static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects) -{ - int i; - for (i=0; i < num_rects; ++i) { - if (con->x + rects[i].w > con->width) { - con->x = 0; - con->y = con->bottom_y; - } - if (con->y + rects[i].h > con->height) - break; - rects[i].x = con->x; - rects[i].y = con->y; - rects[i].was_packed = 1; - con->x += rects[i].w; - if (con->y + rects[i].h > con->bottom_y) - con->bottom_y = con->y + rects[i].h; - } - for ( ; i < num_rects; ++i) - rects[i].was_packed = 0; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// bitmap baking -// -// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If -// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context) -{ - stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context) ,alloc_context); - int num_nodes = pw - padding; - stbrp_node *nodes = (stbrp_node *) STBTT_malloc(sizeof(*nodes ) * num_nodes,alloc_context); - - if (context == NULL || nodes == NULL) { - if (context != NULL) STBTT_free(context, alloc_context); - if (nodes != NULL) STBTT_free(nodes , alloc_context); - return 0; - } - - spc->user_allocator_context = alloc_context; - spc->width = pw; - spc->height = ph; - spc->pixels = pixels; - spc->pack_info = context; - spc->nodes = nodes; - spc->padding = padding; - spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; - spc->h_oversample = 1; - spc->v_oversample = 1; - - stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes); - - if (pixels) - STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels - - return 1; -} - -STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc) -{ - STBTT_free(spc->nodes , spc->user_allocator_context); - STBTT_free(spc->pack_info, spc->user_allocator_context); -} - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample) -{ - STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); - STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); - if (h_oversample <= STBTT_MAX_OVERSAMPLE) - spc->h_oversample = h_oversample; - if (v_oversample <= STBTT_MAX_OVERSAMPLE) - spc->v_oversample = v_oversample; -} - -#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) - -static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_w = w - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze - for (j=0; j < h; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - // make kernel_width a constant in common cases so compiler can optimize out the divide - switch (kernel_width) { - case 2: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 2); - } - break; - case 3: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 3); - } - break; - case 4: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 4); - } - break; - case 5: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 5); - } - break; - default: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / kernel_width); - } - break; - } - - for (; i < w; ++i) { - STBTT_assert(pixels[i] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i] = (unsigned char) (total / kernel_width); - } - - pixels += stride_in_bytes; - } -} - -static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_h = h - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze - for (j=0; j < w; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - // make kernel_width a constant in common cases so compiler can optimize out the divide - switch (kernel_width) { - case 2: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 2); - } - break; - case 3: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 3); - } - break; - case 4: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 4); - } - break; - case 5: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 5); - } - break; - default: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); - } - break; - } - - for (; i < h; ++i) { - STBTT_assert(pixels[i*stride_in_bytes] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); - } - - pixels += 1; - } -} - -static float stbtt__oversample_shift(int oversample) -{ - if (!oversample) - return 0.0f; - - // The prefilter is a box filter of width "oversample", - // which shifts phase by (oversample - 1)/2 pixels in - // oversampled space. We want to shift in the opposite - // direction to counter this. - return (float)-(oversample - 1) / (2.0f * (float)oversample); -} - -// rects array must be big enough to accommodate all characters in the given ranges -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) -{ - int i,j,k; - - k=0; - for (i=0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - ranges[i].h_oversample = (unsigned char) spc->h_oversample; - ranges[i].v_oversample = (unsigned char) spc->v_oversample; - for (j=0; j < ranges[i].num_chars; ++j) { - int x0,y0,x1,y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - stbtt_GetGlyphBitmapBoxSubpixel(info,glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0,0, - &x0,&y0,&x1,&y1); - rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1); - rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1); - ++k; - } - } - - return k; -} - -// rects array must be big enough to accommodate all characters in the given ranges -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) -{ - int i,j,k, return_value = 1; - - // save current values - int old_h_over = spc->h_oversample; - int old_v_over = spc->v_oversample; - - k = 0; - for (i=0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - float recip_h,recip_v,sub_x,sub_y; - spc->h_oversample = ranges[i].h_oversample; - spc->v_oversample = ranges[i].v_oversample; - recip_h = 1.0f / spc->h_oversample; - recip_v = 1.0f / spc->v_oversample; - sub_x = stbtt__oversample_shift(spc->h_oversample); - sub_y = stbtt__oversample_shift(spc->v_oversample); - for (j=0; j < ranges[i].num_chars; ++j) { - stbrp_rect *r = &rects[k]; - if (r->was_packed) { - stbtt_packedchar *bc = &ranges[i].chardata_for_range[j]; - int advance, lsb, x0,y0,x1,y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - stbrp_coord pad = (stbrp_coord) spc->padding; - - // pad on left and top - r->x += pad; - r->y += pad; - r->w -= pad; - r->h -= pad; - stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); - stbtt_GetGlyphBitmapBox(info, glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - &x0,&y0,&x1,&y1); - stbtt_MakeGlyphBitmapSubpixel(info, - spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w - spc->h_oversample+1, - r->h - spc->v_oversample+1, - spc->stride_in_bytes, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0,0, - glyph); - - if (spc->h_oversample > 1) - stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->h_oversample); - - if (spc->v_oversample > 1) - stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->v_oversample); - - bc->x0 = (stbtt_int16) r->x; - bc->y0 = (stbtt_int16) r->y; - bc->x1 = (stbtt_int16) (r->x + r->w); - bc->y1 = (stbtt_int16) (r->y + r->h); - bc->xadvance = scale * advance; - bc->xoff = (float) x0 * recip_h + sub_x; - bc->yoff = (float) y0 * recip_v + sub_y; - bc->xoff2 = (x0 + r->w) * recip_h + sub_x; - bc->yoff2 = (y0 + r->h) * recip_v + sub_y; - } else { - return_value = 0; // if any fail, report failure - } - - ++k; - } - } - - // restore original values - spc->h_oversample = old_h_over; - spc->v_oversample = old_v_over; - - return return_value; -} - -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects) -{ - stbrp_pack_rects((stbrp_context *) spc->pack_info, rects, num_rects); -} - -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges) -{ - stbtt_fontinfo info; - int i,j,n, return_value = 1; - //stbrp_context *context = (stbrp_context *) spc->pack_info; - stbrp_rect *rects; - - // flag all characters as NOT packed - for (i=0; i < num_ranges; ++i) - for (j=0; j < ranges[i].num_chars; ++j) - ranges[i].chardata_for_range[j].x0 = - ranges[i].chardata_for_range[j].y0 = - ranges[i].chardata_for_range[j].x1 = - ranges[i].chardata_for_range[j].y1 = 0; - - n = 0; - for (i=0; i < num_ranges; ++i) - n += ranges[i].num_chars; - - rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); - if (rects == NULL) - return 0; - - info.userdata = spc->user_allocator_context; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index)); - - n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); - - stbtt_PackFontRangesPackRects(spc, rects, n); - - return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); - - STBTT_free(rects, spc->user_allocator_context); - return return_value; -} - -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, float font_size, - int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range) -{ - stbtt_pack_range range; - range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; - range.array_of_unicode_codepoints = NULL; - range.num_chars = num_chars_in_range; - range.chardata_for_range = chardata_for_range; - range.font_size = font_size; - return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); -} - -STBTT_DEF void stbtt_GetPackedQuad(stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer) -{ - float ipw = 1.0f / pw, iph = 1.0f / ph; - stbtt_packedchar *b = chardata + char_index; - - if (align_to_integer) { - float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5f); - float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5f); - q->x0 = x; - q->y0 = y; - q->x1 = x + b->xoff2 - b->xoff; - q->y1 = y + b->yoff2 - b->yoff; - } else { - q->x0 = *xpos + b->xoff; - q->y0 = *ypos + b->yoff; - q->x1 = *xpos + b->xoff2; - q->y1 = *ypos + b->yoff2; - } - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - - -////////////////////////////////////////////////////////////////////////////// -// -// font name matching -- recommended not to use this -// - -// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string -static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2) -{ - stbtt_int32 i=0; - - // convert utf16 to utf8 and compare the results while converting - while (len2) { - stbtt_uint16 ch = s2[0]*256 + s2[1]; - if (ch < 0x80) { - if (i >= len1) return -1; - if (s1[i++] != ch) return -1; - } else if (ch < 0x800) { - if (i+1 >= len1) return -1; - if (s1[i++] != 0xc0 + (ch >> 6)) return -1; - if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; - } else if (ch >= 0xd800 && ch < 0xdc00) { - stbtt_uint32 c; - stbtt_uint16 ch2 = s2[2]*256 + s2[3]; - if (i+3 >= len1) return -1; - c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; - if (s1[i++] != 0xf0 + (c >> 18)) return -1; - if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; - s2 += 2; // plus another 2 below - len2 -= 2; - } else if (ch >= 0xdc00 && ch < 0xe000) { - return -1; - } else { - if (i+2 >= len1) return -1; - if (s1[i++] != 0xe0 + (ch >> 12)) return -1; - if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; - } - s2 += 2; - len2 -= 2; - } - return i; -} - -static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2) -{ - return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2); -} - -// returns results in whatever encoding you request... but note that 2-byte encodings -// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare -STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) -{ - stbtt_int32 i,count,stringOffset; - stbtt_uint8 *fc = font->data; - stbtt_uint32 offset = font->fontstart; - stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); - if (!nm) return NULL; - - count = ttUSHORT(fc+nm+2); - stringOffset = nm + ttUSHORT(fc+nm+4); - for (i=0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) - && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { - *length = ttUSHORT(fc+loc+8); - return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); - } - } - return NULL; -} - -static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) -{ - stbtt_int32 i; - stbtt_int32 count = ttUSHORT(fc+nm+2); - stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); - - for (i=0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - stbtt_int32 id = ttUSHORT(fc+loc+6); - if (id == target_id) { - // find the encoding - stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); - - // is this a Unicode encoding? - if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { - stbtt_int32 slen = ttUSHORT(fc+loc+8); - stbtt_int32 off = ttUSHORT(fc+loc+10); - - // check if there's a prefix match - stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); - if (matchlen >= 0) { - // check for target_id+1 immediately following, with same encoding & language - if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { - slen = ttUSHORT(fc+loc+12+8); - off = ttUSHORT(fc+loc+12+10); - if (slen == 0) { - if (matchlen == nlen) - return 1; - } else if (matchlen < nlen && name[matchlen] == ' ') { - ++matchlen; - if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) - return 1; - } - } else { - // if nothing immediately following - if (matchlen == nlen) - return 1; - } - } - } - - // @TODO handle other encodings - } - } - return 0; -} - -static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) -{ - stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name); - stbtt_uint32 nm,hd; - if (!stbtt__isfont(fc+offset)) return 0; - - // check italics/bold/underline flags in macStyle... - if (flags) { - hd = stbtt__find_table(fc, offset, "head"); - if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; - } - - nm = stbtt__find_table(fc, offset, "name"); - if (!nm) return 0; - - if (flags) { - // if we checked the macStyle flags, then just check the family and ignore the subfamily - if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } else { - if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } - - return 0; -} - -static int stbtt_FindMatchingFont_internal(unsigned char *font_collection, char *name_utf8, stbtt_int32 flags) -{ - stbtt_int32 i; - for (i=0;;++i) { - stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); - if (off < 0) return off; - if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) - return off; - } -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-qual" -#endif - -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, - float pixel_height, unsigned char *pixels, int pw, int ph, - int first_char, int num_chars, stbtt_bakedchar *chardata) -{ - return stbtt_BakeFontBitmap_internal((unsigned char *) data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); -} - -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index) -{ - return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index); -} - -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data) -{ - return stbtt_GetNumberOfFonts_internal((unsigned char *) data); -} - -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset) -{ - return stbtt_InitFont_internal(info, (unsigned char *) data, offset); -} - -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags) -{ - return stbtt_FindMatchingFont_internal((unsigned char *) fontdata, (char *) name, flags); -} - -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) -{ - return stbtt_CompareUTF8toUTF16_bigendian_internal((char *) s1, len1, (char *) s2, len2); -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic pop -#endif - -#endif // STB_TRUETYPE_IMPLEMENTATION - - -// FULL VERSION HISTORY -// -// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual -// 1.11 (2016-04-02) fix unused-variable warning -// 1.10 (2016-04-02) allow user-defined fabs() replacement -// fix memory leak if fontsize=0.0 -// fix warning from duplicate typedef -// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges -// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges -// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; -// allow PackFontRanges to pack and render in separate phases; -// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); -// fixed an assert() bug in the new rasterizer -// replace assert() with STBTT_assert() in new rasterizer -// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) -// also more precise AA rasterizer, except if shapes overlap -// remove need for STBTT_sort -// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC -// 1.04 (2015-04-15) typo in example -// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes -// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ -// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match -// non-oversampled; STBTT_POINT_SIZE for packed case only -// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling -// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) -// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID -// 0.8b (2014-07-07) fix a warning -// 0.8 (2014-05-25) fix a few more warnings -// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back -// 0.6c (2012-07-24) improve documentation -// 0.6b (2012-07-20) fix a few more warnings -// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, -// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty -// 0.5 (2011-12-09) bugfixes: -// subpixel glyph renderer computed wrong bounding box -// first vertex of shape can be off-curve (FreeSans) -// 0.4b (2011-12-03) fixed an error in the font baking example -// 0.4 (2011-12-01) kerning, subpixel rendering (tor) -// bugfixes for: -// codepoint-to-glyph conversion using table fmt=12 -// codepoint-to-glyph conversion using table fmt=4 -// stbtt_GetBakedQuad with non-square texture (Zer) -// updated Hello World! sample to use kerning and subpixel -// fixed some warnings -// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) -// userdata, malloc-from-userdata, non-zero fill (stb) -// 0.2 (2009-03-11) Fix unsigned/signed char warnings -// 0.1 (2009-03-09) First public release -// diff --git a/vendor/librw/skeleton/sdl2.cpp b/vendor/librw/skeleton/sdl2.cpp deleted file mode 100644 index 4cb7c0f..0000000 --- a/vendor/librw/skeleton/sdl2.cpp +++ /dev/null @@ -1,325 +0,0 @@ -#ifdef LIBRW_SDL2 - -#include -#include "skeleton.h" - -using namespace sk; -using namespace rw; - -#ifdef RW_OPENGL - -SDL_Window *window; - -static int keyCodeToSkKey(SDL_Keycode keycode) { - switch (keycode) { - case SDLK_SPACE: return ' '; - case SDLK_QUOTE: return '\''; - case SDLK_COMMA: return ','; - case SDLK_MINUS: return '-'; - case SDLK_PERIOD: return '.'; - case SDLK_SLASH: return '/'; - - case SDLK_0: return '0'; - case SDLK_1: return '1'; - case SDLK_2: return '2'; - case SDLK_3: return '3'; - case SDLK_4: return '4'; - case SDLK_5: return '5'; - case SDLK_6: return '6'; - case SDLK_7: return '7'; - case SDLK_8: return '8'; - case SDLK_9: return '9'; - - case SDLK_SEMICOLON: return ';'; - case SDLK_EQUALS: return '='; - - case SDLK_a: return 'A'; - case SDLK_b: return 'B'; - case SDLK_c: return 'C'; - case SDLK_d: return 'D'; - case SDLK_e: return 'E'; - case SDLK_f: return 'F'; - case SDLK_g: return 'G'; - case SDLK_h: return 'H'; - case SDLK_i: return 'I'; - case SDLK_j: return 'J'; - case SDLK_k: return 'K'; - case SDLK_l: return 'L'; - case SDLK_m: return 'M'; - case SDLK_n: return 'N'; - case SDLK_o: return 'O'; - case SDLK_p: return 'P'; - case SDLK_q: return 'Q'; - case SDLK_r: return 'R'; - case SDLK_s: return 'S'; - case SDLK_t: return 'T'; - case SDLK_u: return 'U'; - case SDLK_v: return 'V'; - case SDLK_w: return 'W'; - case SDLK_x: return 'X'; - case SDLK_y: return 'Y'; - case SDLK_z: return 'Z'; - - case SDLK_LEFTBRACKET: return '['; - case SDLK_BACKSLASH: return '\\'; - case SDLK_RIGHTBRACKET: return ']'; - case SDLK_BACKQUOTE: return '`'; - case SDLK_ESCAPE: return KEY_ESC; - case SDLK_RETURN: return KEY_ENTER; - case SDLK_TAB: return KEY_TAB; - case SDLK_BACKSPACE: return KEY_BACKSP; - case SDLK_INSERT: return KEY_INS; - case SDLK_DELETE: return KEY_DEL; - case SDLK_RIGHT: return KEY_RIGHT; - case SDLK_DOWN: return KEY_DOWN; - case SDLK_UP: return KEY_UP; - case SDLK_PAGEUP: return KEY_PGUP; - case SDLK_PAGEDOWN: return KEY_PGDN; - case SDLK_HOME: return KEY_HOME; - case SDLK_END: return KEY_END; - case SDLK_CAPSLOCK: return KEY_CAPSLK; - case SDLK_SCROLLLOCK: return KEY_NULL; - case SDLK_NUMLOCKCLEAR: return KEY_NULL; - case SDLK_PRINTSCREEN: return KEY_NULL; - case SDLK_PAUSE: return KEY_NULL; - - case SDLK_F1: return KEY_F1; - case SDLK_F2: return KEY_F2; - case SDLK_F3: return KEY_F3; - case SDLK_F4: return KEY_F4; - case SDLK_F5: return KEY_F5; - case SDLK_F6: return KEY_F6; - case SDLK_F7: return KEY_F7; - case SDLK_F8: return KEY_F8; - case SDLK_F9: return KEY_F9; - case SDLK_F10: return KEY_F10; - case SDLK_F11: return KEY_F11; - case SDLK_F12: return KEY_F12; - case SDLK_F13: return KEY_NULL; - case SDLK_F14: return KEY_NULL; - case SDLK_F15: return KEY_NULL; - case SDLK_F16: return KEY_NULL; - case SDLK_F17: return KEY_NULL; - case SDLK_F18: return KEY_NULL; - case SDLK_F19: return KEY_NULL; - case SDLK_F20: return KEY_NULL; - case SDLK_F21: return KEY_NULL; - case SDLK_F22: return KEY_NULL; - case SDLK_F23: return KEY_NULL; - case SDLK_F24: return KEY_NULL; - - case SDLK_KP_0: return KEY_NULL; - case SDLK_KP_1: return KEY_NULL; - case SDLK_KP_2: return KEY_NULL; - case SDLK_KP_3: return KEY_NULL; - case SDLK_KP_4: return KEY_NULL; - case SDLK_KP_5: return KEY_NULL; - case SDLK_KP_6: return KEY_NULL; - case SDLK_KP_7: return KEY_NULL; - case SDLK_KP_8: return KEY_NULL; - case SDLK_KP_9: return KEY_NULL; - case SDLK_KP_DECIMAL: return KEY_NULL; - case SDLK_KP_DIVIDE: return KEY_NULL; - case SDLK_KP_MULTIPLY: return KEY_NULL; - case SDLK_KP_MINUS: return KEY_NULL; - case SDLK_KP_PLUS: return KEY_NULL; - case SDLK_KP_ENTER: return KEY_NULL; - case SDLK_KP_EQUALS: return KEY_NULL; - - case SDLK_LSHIFT: return KEY_LSHIFT; - case SDLK_LCTRL: return KEY_LCTRL; - case SDLK_LALT: return KEY_LALT; - case SDLK_LGUI: return KEY_NULL; - case SDLK_RSHIFT: return KEY_RSHIFT; - case SDLK_RCTRL: return KEY_RCTRL; - case SDLK_RALT: return KEY_RALT; - case SDLK_RGUI: return KEY_NULL; - case SDLK_MENU: return KEY_NULL; - } - return KEY_NULL; -} - -#if 0 -static void -keypress(SDL_Window *window, int key, int scancode, int action, int mods) -{ - if(key >= 0 && key <= GLFW_KEY_LAST){ - if(action == GLFW_RELEASE) KeyUp(keymap[key]); - else if(action == GLFW_PRESS) KeyDown(keymap[key]); - else if(action == GLFW_REPEAT) KeyDown(keymap[key]); - } -} - -static void -charinput(GLFWwindow *window, unsigned int c) -{ - EventHandler(CHARINPUT, (void*)(uintptr)c); -} - -static void -resize(GLFWwindow *window, int w, int h) -{ - rw::Rect r; - r.x = 0; - r.y = 0; - r.w = w; - r.h = h; - EventHandler(RESIZE, &r); -} - -static void -mousebtn(GLFWwindow *window, int button, int action, int mods) -{ - static int buttons = 0; - sk::MouseState ms; - - switch(button){ - case GLFW_MOUSE_BUTTON_LEFT: - if(action == GLFW_PRESS) - buttons |= 1; - else - buttons &= ~1; - break; - case GLFW_MOUSE_BUTTON_MIDDLE: - if(action == GLFW_PRESS) - buttons |= 2; - else - buttons &= ~2; - break; - case GLFW_MOUSE_BUTTON_RIGHT: - if(action == GLFW_PRESS) - buttons |= 4; - else - buttons &= ~4; - break; - } - - sk::MouseState ms; - ms.buttons = buttons; - EventHandler(MOUSEBTN, &ms); -} -#endif - -enum mousebutton { -BUTTON_LEFT = 0x1, -BUTTON_MIDDLE = 0x2, -BUTTON_RIGHT = 0x4, -}; - -int -main(int argc, char *argv[]) -{ - args.argc = argc; - args.argv = argv; - - if(EventHandler(INITIALIZE, nil) == EVENTERROR) - return 0; - - engineOpenParams.width = sk::globals.width; - engineOpenParams.height = sk::globals.height; - engineOpenParams.windowtitle = sk::globals.windowtitle; - engineOpenParams.window = &window; - - if(EventHandler(RWINITIALIZE, nil) == EVENTERROR) - return 0; - - float lastTime = SDL_GetTicks(); - SDL_Event event; - int mouseButtons = 0; - - SDL_StartTextInput(); - - while(!sk::globals.quit){ - while(SDL_PollEvent(&event)){ - switch(event.type){ - case SDL_QUIT: - sk::globals.quit = true; - break; - case SDL_WINDOWEVENT: - switch (event.window.event) { - case SDL_WINDOWEVENT_RESIZED: { - rw::Rect r; - SDL_GetWindowPosition(window, &r.x, &r.y); - r.w = event.window.data1; - r.h = event.window.data2; - EventHandler(RESIZE, &r); - break; - } - } - break; - case SDL_KEYUP: { - int c = keyCodeToSkKey(event.key.keysym.sym); - EventHandler(KEYUP, &c); - break; - } - case SDL_KEYDOWN: { - int c = keyCodeToSkKey(event.key.keysym.sym); - EventHandler(KEYDOWN, &c); - break; - } - case SDL_TEXTINPUT: { - char *c = event.text.text; - while (int ci = *c) { - EventHandler(CHARINPUT, (void*)(uintptr)ci); - ++c; - } - break; - } - case SDL_MOUSEMOTION: { - sk::MouseState ms; - ms.posx = event.motion.x; - ms.posy = event.motion.y; - EventHandler(MOUSEMOVE, &ms); - break; - } - case SDL_MOUSEBUTTONDOWN: { - switch (event.button.button) { - case SDL_BUTTON_LEFT: mouseButtons |= BUTTON_LEFT; break; - case SDL_BUTTON_MIDDLE: mouseButtons |= BUTTON_MIDDLE; break; - case SDL_BUTTON_RIGHT: mouseButtons |= BUTTON_RIGHT; break; - } - sk::MouseState ms; - ms.buttons = mouseButtons; - EventHandler(MOUSEBTN, &ms); - break; - } - case SDL_MOUSEBUTTONUP: { - switch (event.button.button) { - case SDL_BUTTON_LEFT: mouseButtons &= ~BUTTON_LEFT; break; - case SDL_BUTTON_MIDDLE: mouseButtons &= ~BUTTON_MIDDLE; break; - case SDL_BUTTON_RIGHT: mouseButtons &= ~BUTTON_RIGHT; break; - } - sk::MouseState ms; - ms.buttons = mouseButtons; - EventHandler(MOUSEBTN, &ms); - break; - } - } - } - float currTime = SDL_GetTicks(); - float timeDelta = (currTime - lastTime) * 0.001f; - - EventHandler(IDLE, &timeDelta); - - lastTime = currTime; - } - - SDL_StopTextInput(); - - EventHandler(RWTERMINATE, nil); - - return 0; -} - -namespace sk { - -void -SetMousePosition(int x, int y) -{ - SDL_WarpMouseInWindow(*engineOpenParams.window, x, y); -} - -} - -#endif -#endif diff --git a/vendor/librw/skeleton/skeleton.cpp b/vendor/librw/skeleton/skeleton.cpp deleted file mode 100644 index ad84d1a..0000000 --- a/vendor/librw/skeleton/skeleton.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include -#include "skeleton.h" - - -namespace sk { - -Globals globals; -Args args; - - -bool -InitRW(void) -{ - if(!rw::Engine::init()) - return false; - if(AppEventHandler(sk::PLUGINATTACH, nil) == EVENTERROR) - return false; - if(!rw::Engine::open(&engineOpenParams)) - return false; - - SubSystemInfo info; - int i, n; - n = Engine::getNumSubSystems(); - for(i = 0; i < n; i++) - if(Engine::getSubSystemInfo(&info, i)) - printf("subsystem: %s\n", info.name); - Engine::setSubSystem(n-1); - - int want = -1; - VideoMode mode; - n = Engine::getNumVideoModes(); - for(i = 0; i < n; i++) - if(Engine::getVideoModeInfo(&mode, i)){ -// if(mode.width == 640 && mode.height == 480 && mode.depth == 32) - if(mode.width == 1920 && mode.height == 1080 && mode.depth == 32) - want = i; - printf("mode: %dx%dx%d %d\n", mode.width, mode.height, mode.depth, mode.flags); - } -// if(want >= 0) Engine::setVideoMode(want); - Engine::getVideoModeInfo(&mode, Engine::getCurrentVideoMode()); - - if(mode.flags & VIDEOMODEEXCLUSIVE){ - globals.width = mode.width; - globals.height = mode.height; - } - - if(!rw::Engine::start()) - return false; - - rw::Image::setSearchPath("./"); - return true; -} - -void -TerminateRW(void) -{ - // TODO: delete all tex dicts - rw::Engine::stop(); - rw::Engine::close(); - rw::Engine::term(); -} - -Camera* -CameraCreate(int32 width, int32 height, bool32 z) -{ - Camera *cam; - cam = Camera::create(); - cam->setFrame(Frame::create()); - cam->frameBuffer = Raster::create(width, height, 0, Raster::CAMERA); - cam->zBuffer = Raster::create(width, height, 0, Raster::ZBUFFER); - return cam; -} - -void -CameraSize(Camera *cam, Rect *r) -{ - if(cam->frameBuffer){ - cam->frameBuffer->destroy(); - cam->frameBuffer = nil; - } - if(cam->zBuffer){ - cam->zBuffer->destroy(); - cam->zBuffer = nil; - } - cam->frameBuffer = Raster::create(r->w, r->h, 0, Raster::CAMERA); - cam->zBuffer = Raster::create(r->w, r->h, 0, Raster::ZBUFFER); -} - -EventStatus -EventHandler(Event e, void *param) -{ - EventStatus s; - s = AppEventHandler(e, param); - if(e == QUIT){ - globals.quit = 1; - return EVENTPROCESSED; - } - if(s == EVENTNOTPROCESSED) - switch(e){ - case RWINITIALIZE: - return InitRW() ? EVENTPROCESSED : EVENTERROR; - case RWTERMINATE: - TerminateRW(); - return EVENTPROCESSED; - default: - break; - } - return s; -} - -} diff --git a/vendor/librw/skeleton/skeleton.h b/vendor/librw/skeleton/skeleton.h deleted file mode 100644 index 9604602..0000000 --- a/vendor/librw/skeleton/skeleton.h +++ /dev/null @@ -1,115 +0,0 @@ -extern rw::EngineOpenParams engineOpenParams; - -namespace sk { - -using namespace rw; - -// same as RW skeleton -enum Key -{ - // ascii... - - KEY_ESC = 128, - - KEY_F1 = 129, - KEY_F2 = 130, - KEY_F3 = 131, - KEY_F4 = 132, - KEY_F5 = 133, - KEY_F6 = 134, - KEY_F7 = 135, - KEY_F8 = 136, - KEY_F9 = 137, - KEY_F10 = 138, - KEY_F11 = 139, - KEY_F12 = 140, - - KEY_INS = 141, - KEY_DEL = 142, - KEY_HOME = 143, - KEY_END = 144, - KEY_PGUP = 145, - KEY_PGDN = 146, - - KEY_UP = 147, - KEY_DOWN = 148, - KEY_LEFT = 149, - KEY_RIGHT = 150, - - // some stuff ommitted - - KEY_BACKSP = 168, - KEY_TAB = 169, - KEY_CAPSLK = 170, - KEY_ENTER = 171, - KEY_LSHIFT = 172, - KEY_RSHIFT = 173, - KEY_LCTRL = 174, - KEY_RCTRL = 175, - KEY_LALT = 176, - KEY_RALT = 177, - - KEY_NULL, // unused - KEY_NUMKEYS, -}; - -enum EventStatus -{ - EVENTERROR, - EVENTPROCESSED, - EVENTNOTPROCESSED -}; - -enum Event -{ - INITIALIZE, - RWINITIALIZE, - RWTERMINATE, - SELECTDEVICE, - PLUGINATTACH, - KEYDOWN, - KEYUP, - CHARINPUT, - MOUSEMOVE, - MOUSEBTN, - RESIZE, - IDLE, - QUIT -}; - -struct Globals -{ - const char *windowtitle; - int32 width; - int32 height; - bool32 quit; -}; -extern Globals globals; - -// Argument to mouse events -struct MouseState -{ - int posx, posy; - int buttons; // bits 0-2 are left, middle, right button down -}; - -struct Args -{ - int argc; - char **argv; -}; -extern Args args; - -bool InitRW(void); -void TerminateRW(void); -Camera *CameraCreate(int32 width, int32 height, bool32 z); -void CameraSize(Camera *cam, Rect *r); -void SetMousePosition(int x, int y); -EventStatus EventHandler(Event e, void *param); - -} - -sk::EventStatus AppEventHandler(sk::Event e, void *param); - -#include "imgui/imgui.h" -#include "imgui/imgui_impl_rw.h" diff --git a/vendor/librw/skeleton/win.cpp b/vendor/librw/skeleton/win.cpp deleted file mode 100644 index 9f1ee5a..0000000 --- a/vendor/librw/skeleton/win.cpp +++ /dev/null @@ -1,315 +0,0 @@ -#ifdef _WIN32 -#include -#include -#include "skeleton.h" - -using namespace sk; -using namespace rw; - -#ifdef RW_D3D9 - -#ifndef VK_OEM_NEC_EQUAL -#define VK_OEM_NEC_EQUAL 0x92 -#endif - -static int keymap[256]; -static void -initkeymap(void) -{ - int i; - for(i = 0; i < 256; i++) - keymap[i] = KEY_NULL; - keymap[VK_SPACE] = ' '; - keymap[VK_OEM_7] = '\''; - keymap[VK_OEM_COMMA] = ','; - keymap[VK_OEM_MINUS] = '-'; - keymap[VK_OEM_PERIOD] = '.'; - keymap[VK_OEM_2] = '/'; - for(i = '0'; i <= '9'; i++) - keymap[i] = i; - keymap[VK_OEM_1] = ';'; - keymap[VK_OEM_NEC_EQUAL] = '='; - for(i = 'A'; i <= 'Z'; i++) - keymap[i] = i; - keymap[VK_OEM_4] = '['; - keymap[VK_OEM_5] = '\\'; - keymap[VK_OEM_6] = ']'; - keymap[VK_OEM_3] = '`'; - keymap[VK_ESCAPE] = KEY_ESC; - keymap[VK_RETURN] = KEY_ENTER; - keymap[VK_TAB] = KEY_TAB; - keymap[VK_BACK] = KEY_BACKSP; - keymap[VK_INSERT] = KEY_INS; - keymap[VK_DELETE] = KEY_DEL; - keymap[VK_RIGHT] = KEY_RIGHT; - keymap[VK_LEFT] = KEY_LEFT; - keymap[VK_DOWN] = KEY_DOWN; - keymap[VK_UP] = KEY_UP; - keymap[VK_PRIOR] = KEY_PGUP; - keymap[VK_NEXT] = KEY_PGDN; - keymap[VK_HOME] = KEY_HOME; - keymap[VK_END] = KEY_END; - keymap[VK_MODECHANGE] = KEY_CAPSLK; - for(i = VK_F1; i <= VK_F24; i++) - keymap[i] = i-VK_F1+KEY_F1; - keymap[VK_LSHIFT] = KEY_LSHIFT; - keymap[VK_LCONTROL] = KEY_LCTRL; - keymap[VK_LMENU] = KEY_LALT; - keymap[VK_RSHIFT] = KEY_RSHIFT; - keymap[VK_RCONTROL] = KEY_RCTRL; - keymap[VK_RMENU] = KEY_RALT; -} -bool running; - -static void KeyUp(int key) { EventHandler(KEYUP, &key); } -static void KeyDown(int key) { EventHandler(KEYDOWN, &key); } - -LRESULT CALLBACK -WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - static int resizing = 0; - static int buttons = 0; - POINTS p; - - MouseState ms; - switch(msg){ - case WM_DESTROY: - PostQuitMessage(0); - break; - - case WM_SYSKEYDOWN: - case WM_KEYDOWN: - if(wParam == VK_MENU){ - if(GetKeyState(VK_LMENU) & 0x8000) KeyDown(keymap[VK_LMENU]); - if(GetKeyState(VK_RMENU) & 0x8000) KeyDown(keymap[VK_RMENU]); - }else if(wParam == VK_CONTROL){ - if(GetKeyState(VK_LCONTROL) & 0x8000) KeyDown(keymap[VK_LCONTROL]); - if(GetKeyState(VK_RCONTROL) & 0x8000) KeyDown(keymap[VK_RCONTROL]); - }else if(wParam == VK_SHIFT){ - if(GetKeyState(VK_LSHIFT) & 0x8000) KeyDown(keymap[VK_LSHIFT]); - if(GetKeyState(VK_RSHIFT) & 0x8000) KeyDown(keymap[VK_RSHIFT]); - }else - KeyDown(keymap[wParam]); - break; - - case WM_SYSKEYUP: - case WM_KEYUP: - if(wParam == VK_MENU){ - if((GetKeyState(VK_LMENU) & 0x8000) == 0) KeyUp(keymap[VK_LMENU]); - if((GetKeyState(VK_RMENU) & 0x8000) == 0) KeyUp(keymap[VK_RMENU]); - }else if(wParam == VK_CONTROL){ - if((GetKeyState(VK_LCONTROL) & 0x8000) == 0) KeyUp(keymap[VK_LCONTROL]); - if((GetKeyState(VK_RCONTROL) & 0x8000) == 0) KeyUp(keymap[VK_RCONTROL]); - }else if(wParam == VK_SHIFT){ - if((GetKeyState(VK_LSHIFT) & 0x8000) == 0) KeyUp(keymap[VK_LSHIFT]); - if((GetKeyState(VK_RSHIFT) & 0x8000) == 0) KeyUp(keymap[VK_RSHIFT]); - }else - KeyUp(keymap[wParam]); - break; - - case WM_CHAR: - if(wParam > 0 && wParam < 0x10000) - EventHandler(CHARINPUT, (void*)wParam); - break; - - case WM_MOUSEMOVE: - p = MAKEPOINTS(lParam); - ms.posx = p.x; - ms.posy = p.y; - EventHandler(MOUSEMOVE, &ms); - break; - - case WM_LBUTTONDOWN: - buttons |= 1; goto mbtn; - case WM_LBUTTONUP: - buttons &= ~1; goto mbtn; - case WM_MBUTTONDOWN: - buttons |= 2; goto mbtn; - case WM_MBUTTONUP: - buttons &= ~2; goto mbtn; - case WM_RBUTTONDOWN: - buttons |= 4; goto mbtn; - case WM_RBUTTONUP: - buttons &= ~4; - mbtn: - ms.buttons = buttons; - EventHandler(MOUSEBTN, &ms); - break; - - case WM_SIZE: - rw::Rect r; - r.x = 0; - r.y = 0; - r.w = LOWORD(lParam); - r.h = HIWORD(lParam); - EventHandler(RESIZE, &r); - break; - - case WM_CLOSE: - DestroyWindow(hwnd); - break; - - case WM_SYSCOMMAND: - if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu - return 0; - break; - - case WM_QUIT: - running = false; - break; - } - return DefWindowProc(hwnd, msg, wParam, lParam); -} - -HWND -MakeWindow(HINSTANCE instance, int width, int height, const char *title) -{ - WNDCLASS wc; - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = instance; - wc.hIcon = LoadIcon(0, IDI_APPLICATION); - wc.hCursor = LoadCursor(0, IDC_ARROW); - wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); - wc.lpszMenuName = 0; - wc.lpszClassName = "librwD3D9"; - if(!RegisterClass(&wc)){ - MessageBox(0, "RegisterClass() - FAILED", 0, 0); - return 0; - } - - int offx = 100; - int offy = 100; - RECT rect; - rect.left = 0; - rect.top = 0; - rect.right = width; - rect.bottom = height; - DWORD style = WS_OVERLAPPEDWINDOW; - AdjustWindowRect(&rect, style, FALSE); - rect.right += -rect.left; - rect.bottom += -rect.top; - HWND win; - win = CreateWindow("librwD3D9", title, style, - offx, offy, rect.right, rect.bottom, 0, 0, instance, 0); - if(!win){ - MessageBox(0, "CreateWindow() - FAILED", 0, 0); - return 0; - } - ShowWindow(win, SW_SHOW); - UpdateWindow(win); - return win; -} - -void -pollEvents(void) -{ - MSG msg; - while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){ - if(msg.message == WM_QUIT){ - running = false; - break; - }else{ - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } -} - -int WINAPI -WinMain(HINSTANCE instance, HINSTANCE, - PSTR cmdLine, int showCmd) -{ -/* - AllocConsole(); - freopen("CONIN$", "r", stdin); - freopen("CONOUT$", "w", stdout); - freopen("CONOUT$", "w", stderr); -*/ - - INT64 ticks; - INT64 ticksPerSecond; - if(!QueryPerformanceFrequency((LARGE_INTEGER*)&ticksPerSecond)) - return 0; - if(!QueryPerformanceCounter((LARGE_INTEGER*)&ticks)) - return 0; - -#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) - args.argc = _argc; - args.argv = _argv; -#else - args.argc = __argc; - args.argv = __argv; -#endif - - if(EventHandler(INITIALIZE, nil) == EVENTERROR) - return 0; - - HWND win = MakeWindow(instance, - sk::globals.width, sk::globals.height, - sk::globals.windowtitle); - if(win == 0){ - MessageBox(0, "MakeWindow() - FAILED", 0, 0); - return 0; - } - engineOpenParams.window = win; - initkeymap(); - - if(EventHandler(RWINITIALIZE, nil) == EVENTERROR) - return 0; - - INT64 lastTicks; - QueryPerformanceCounter((LARGE_INTEGER *)&lastTicks); - running = true; - while((pollEvents(), running) && !globals.quit){ - QueryPerformanceCounter((LARGE_INTEGER *)&ticks); - float timeDelta = (float)(ticks - lastTicks)/ticksPerSecond; - - EventHandler(IDLE, &timeDelta); - - lastTicks = ticks; - } - - EventHandler(RWTERMINATE, nil); - - return 0; -} - -namespace sk { - -void -SetMousePosition(int x, int y) -{ - POINT pos = { x, y }; - ClientToScreen(engineOpenParams.window, &pos); - SetCursorPos(pos.x, pos.y); -} - -} - -#endif - -#ifdef RW_OPENGL -int main(int argc, char *argv[]); - -int WINAPI -WinMain(HINSTANCE instance, HINSTANCE, - PSTR cmdLine, int showCmd) -{ -/* - AllocConsole(); - freopen("CONIN$", "r", stdin); - freopen("CONOUT$", "w", stdout); - freopen("CONOUT$", "w", stderr); -*/ - -#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) - return main(_argc, _argv); -#else - return main(__argc, __argv); -#endif -} -#endif -#endif diff --git a/vendor/librw/src/CMakeLists.txt b/vendor/librw/src/CMakeLists.txt deleted file mode 100644 index aeb6afc..0000000 --- a/vendor/librw/src/CMakeLists.txt +++ /dev/null @@ -1,251 +0,0 @@ -add_library(librw - "${PROJECT_SOURCE_DIR}/args.h" - "${PROJECT_SOURCE_DIR}/rw.h" - - anim.cpp - base.cpp - bmp.cpp - camera.cpp - charset.cpp - clump.cpp - engine.cpp - error.cpp - frame.cpp - geometry.cpp - geoplg.cpp - hanim.cpp - image.cpp - light.cpp - matfx.cpp - pipeline.cpp - plg.cpp - png.cpp - prim.cpp - raster.cpp - render.cpp - rwanim.h - rwengine.h - rwerror.h - rwobjects.h - rwpipeline.h - rwplg.h - rwplugins.h - rwrender.h - rwuserdata.h - skin.cpp - texture.cpp - tga.cpp - tristrip.cpp - userdata.cpp - uvanim.cpp - world.cpp - - d3d/d3d8.cpp - d3d/d3d8matfx.cpp - d3d/d3d8render.cpp - d3d/d3d8skin.cpp - d3d/d3d9.cpp - d3d/d3d9matfx.cpp - d3d/d3d9render.cpp - d3d/d3d9skin.cpp - d3d/d3d.cpp - d3d/d3ddevice.cpp - d3d/d3dimmed.cpp - d3d/d3drender.cpp - d3d/rwd3d8.h - d3d/rwd3d9.h - d3d/rwd3d.h - d3d/rwd3dimpl.h - d3d/rwxbox.h - d3d/rwxboximpl.h - d3d/xbox.cpp - d3d/xboxmatfx.cpp - d3d/xboxskin.cpp - d3d/xboxvfmt.cpp - - gl/gl3.cpp - gl/gl3device.cpp - gl/gl3immed.cpp - gl/gl3matfx.cpp - gl/gl3pipe.cpp - gl/gl3raster.cpp - gl/gl3render.cpp - gl/gl3shader.cpp - gl/gl3skin.cpp - gl/rwgl3.h - gl/rwgl3impl.h - gl/rwgl3plg.h - gl/rwgl3shader.h - gl/rwwdgl.h - gl/wdgl.cpp - gl/glad/glad.h - gl/glad/glad.c - gl/glad/khrplatform.h - - lodepng/lodepng.h - lodepng/lodepng.cpp - - ps2/pds.cpp - ps2/ps2.cpp - ps2/ps2device.cpp - ps2/ps2matfx.cpp - ps2/ps2raster.cpp - ps2/ps2skin.cpp - ps2/rwps2.h - ps2/rwps2impl.h - ps2/rwps2plg.h -) -add_library(librw::librw ALIAS librw) - -target_include_directories(librw - INTERFACE - $ -) - -target_compile_definitions(librw - PRIVATE - LODEPNG_NO_COMPILE_CPP - "$,DEBUG,NDEBUG>" - PUBLIC - "RW_${LIBRW_PLATFORM}" -) - -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - target_link_libraries(librw - PRIVATE - m - ) -endif() -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") - target_compile_options(librw - PRIVATE - "-Wall" - ) - if (NOT LIBRW_PLATFORM_PS2) - target_compile_options(librw - PRIVATE - "-Wextra" - "-Wdouble-promotion" - "-Wpedantic" - ) - endif() -elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - target_compile_options(librw - PUBLIC - /wd4996 /wd4244 - ) -endif() - -set_target_properties(librw - PROPERTIES - C_STANDARD 11 - C_EXTENSIONS OFF - C_STANDARD_REQUIRED ON - CXX_STANDARD 11 - CXX_EXTENSIONS OFF - CXX_STANDARD_REQUIRED ON - PREFIX "" -) - -if(LIBRW_PLATFORM_GL3) - set(OpenGL_GL_PREFERENCE GLVND) - find_package(OpenGL REQUIRED) - - target_link_libraries(librw - PUBLIC - OpenGL::GL - ) - if (LIBRW_GL3_GFXLIB STREQUAL "GLFW") - find_package(glfw3 REQUIRED) - target_link_libraries(librw - PUBLIC - glfw - ) - elseif (LIBRW_GL3_GFXLIB STREQUAL "SDL2") - find_package(SDL2 REQUIRED) - target_compile_definitions(librw PUBLIC LIBRW_SDL2) - target_link_libraries(librw - PUBLIC - SDL2::SDL2 - ) - if(TARGET SDL2::SDL2main) - target_link_libraries(librw - PUBLIC - SDL2::SDL2main - ) - endif() - endif() -elseif(LIBRW_PLATFORM_D3D9) - target_link_libraries(librw - PUBLIC - d3d9 - xinput - ) -endif() - -if(LIBRW_INSTALL) - target_include_directories(librw - INTERFACE - $ - ) - - install( - FILES - "${PROJECT_SOURCE_DIR}/args.h" - "${PROJECT_SOURCE_DIR}/rw.h" - DESTINATION "${LIBRW_INSTALL_INCLUDEDIR}" - ) - install( - FILES - base.err - rwbase.h - rwcharset.h - rwerror.h - rwplg.h - rwrender.h - rwengine.h - rwpipeline.h - rwobjects.h - rwanim.h - rwplugins.h - rwuserdata.h - DESTINATION "${LIBRW_INSTALL_INCLUDEDIR}/src" - ) - install( - FILES - d3d/rwxbox.h - d3d/rwd3d.h - d3d/rwd3d8.h - d3d/rwd3d9.h - DESTINATION "${LIBRW_INSTALL_INCLUDEDIR}/src/d3d" - ) - install( - FILES - ps2/rwps2.h - ps2/rwps2plg.h - DESTINATION "${LIBRW_INSTALL_INCLUDEDIR}/src/ps2" - ) - install( - FILES - gl/rwwdgl.h - gl/rwgl3.h - gl/rwgl3plg.h - gl/rwgl3shader.h - DESTINATION "${LIBRW_INSTALL_INCLUDEDIR}/src/gl" - ) - - install( - FILES - gl/glad/glad.h - gl/glad/khrplatform.h - DESTINATION "${LIBRW_INSTALL_INCLUDEDIR}/src/gl/glad" - ) - - install( - TARGETS librw - EXPORT librw-targets - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ) -endif() diff --git a/vendor/librw/src/anim.cpp b/vendor/librw/src/anim.cpp deleted file mode 100644 index 2003f1b..0000000 --- a/vendor/librw/src/anim.cpp +++ /dev/null @@ -1,293 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" -#include "rwanim.h" -#include "rwplugins.h" - -#define PLUGIN_ID ID_ANIMANIMATION - -namespace rw { - -// -// AnimInterpolatorInfo -// - -#define MAXINTERPINFO 10 - -static AnimInterpolatorInfo *interpInfoList[MAXINTERPINFO]; - -void -AnimInterpolatorInfo::registerInterp(AnimInterpolatorInfo *interpInfo) -{ - for(int32 i = 0; i < MAXINTERPINFO; i++) - if(interpInfoList[i] == nil){ - interpInfoList[i] = interpInfo; - return; - } - assert(0 && "no room for interpolatorInfo"); -} - -void -AnimInterpolatorInfo::unregisterInterp(AnimInterpolatorInfo *interpInfo) -{ - for(int32 i = 0; i < MAXINTERPINFO; i++) - if(interpInfoList[i] == interpInfo){ - rwFree(interpInfoList[i]); - interpInfoList[i] = nil; - return; - } -} - -AnimInterpolatorInfo* -AnimInterpolatorInfo::find(int32 id) -{ - for(int32 i = 0; i < MAXINTERPINFO; i++){ - if(interpInfoList[i] && interpInfoList[i]->id == id) - return interpInfoList[i]; - } - return nil; -} - -// -// Animation -// - -Animation* -Animation::create(AnimInterpolatorInfo *interpInfo, int32 numFrames, - int32 flags, float duration) -{ - int32 sz = sizeof(Animation) + - numFrames*interpInfo->animKeyFrameSize + - interpInfo->customDataSize; - uint8 *data = (uint8*)rwMalloc(sz, MEMDUR_EVENT | ID_ANIMANIMATION); - if(data == nil){ - RWERROR((ERR_ALLOC, sz)); - return nil; - } - Animation *anim = (Animation*)data; - data += sizeof(Animation); - anim->interpInfo = interpInfo; - anim->numFrames = numFrames; - anim->flags = flags; - anim->duration = duration; - anim->keyframes = data; - data += anim->numFrames*interpInfo->animKeyFrameSize; - anim->customData = data; - return anim; -} - -void -Animation::destroy(void) -{ - rwFree(this); -} - -int32 -Animation::getNumNodes(void) -{ - int32 sz = this->interpInfo->animKeyFrameSize; - KeyFrameHeader *first = (KeyFrameHeader*)this->keyframes; - int32 n = 0; - for(KeyFrameHeader *f = first; f->prev != first; f = f->next(sz)) - n++; - return n; -} - -Animation* -Animation::streamRead(Stream *stream) -{ - Animation *anim; - if(stream->readI32() != 0x100) - return nil; - int32 typeID = stream->readI32(); - AnimInterpolatorInfo *interpInfo = AnimInterpolatorInfo::find(typeID); - int32 numFrames = stream->readI32(); - int32 flags = stream->readI32(); - float duration = stream->readF32(); - anim = Animation::create(interpInfo, numFrames, flags, duration); - interpInfo->streamRead(stream, anim); - return anim; -} - -Animation* -Animation::streamReadLegacy(Stream *stream) -{ - Animation *anim; - AnimInterpolatorInfo *interpInfo = AnimInterpolatorInfo::find(1); - int32 numFrames = stream->readI32(); - int32 flags = stream->readI32(); - float duration = stream->readF32(); - anim = Animation::create(interpInfo, numFrames, flags, duration); - HAnimKeyFrame *frames = (HAnimKeyFrame*)anim->keyframes; - for(int32 i = 0; i < anim->numFrames; i++){ - stream->read32(&frames[i].q, 4*4); - frames[i].q = conj(frames[i].q); - stream->read32(&frames[i].t, 3*4); - frames[i].time = stream->readF32(); - int32 prev = stream->readI32()/0x24; - frames[i].prev = &frames[prev]; - } - return anim; -} - -bool -Animation::streamWrite(Stream *stream) -{ - writeChunkHeader(stream, ID_ANIMANIMATION, this->streamGetSize()); - stream->writeI32(0x100); - stream->writeI32(this->interpInfo->id); - stream->writeI32(this->numFrames); - stream->writeI32(this->flags); - stream->writeF32(this->duration); - this->interpInfo->streamWrite(stream, this); - return true; -} - -bool -Animation::streamWriteLegacy(Stream *stream) -{ - stream->writeI32(this->numFrames); - stream->writeI32(this->flags); - stream->writeF32(this->duration); - assert(interpInfo->id == 1); - HAnimKeyFrame *frames = (HAnimKeyFrame*)this->keyframes; - for(int32 i = 0; i < this->numFrames; i++){ - frames[i].q = conj(frames[i].q); - stream->write32(&frames[i].q, 4*4); - frames[i].q = conj(frames[i].q); - stream->write32(&frames[i].t, 3*4); - stream->writeF32(frames[i].time); - stream->writeI32((frames[i].prev - frames)*0x24); - } - return true; -} - -uint32 -Animation::streamGetSize(void) -{ - uint32 size = 4 + 4 + 4 + 4 + 4; - size += this->interpInfo->streamGetSize(this); - return size; -} - -// -// AnimInterpolator -// - -AnimInterpolator* -AnimInterpolator::create(int32 numNodes, int32 maxFrameSize) -{ - AnimInterpolator *interp; - int32 sz; - int32 realsz = maxFrameSize; - - // Add some space for pointers and padding, hopefully this will be - // enough. Don't change maxFrameSize not to mess up streaming. - if(sizeof(void*) > 4) - realsz += 16; - sz = sizeof(AnimInterpolator) + numNodes*realsz; - interp = (AnimInterpolator*)rwMalloc(sz, MEMDUR_EVENT | ID_ANIMANIMATION); - if(interp == nil){ - RWERROR((ERR_ALLOC, sz)); - return nil; - } - interp->currentAnim = nil; - interp->currentTime = 0.0f; - interp->nextFrame = nil; - interp->maxInterpKeyFrameSize = maxFrameSize; - interp->currentInterpKeyFrameSize = maxFrameSize; - interp->currentAnimKeyFrameSize = -1; - interp->numNodes = numNodes;; - - return interp; -} - -void -AnimInterpolator::destroy(void) -{ - rwFree(this); -} - -bool32 -AnimInterpolator::setCurrentAnim(Animation *anim) -{ - int32 i; - AnimInterpolatorInfo *interpInfo = anim->interpInfo; - this->currentAnim = anim; - this->currentTime = 0.0f; - int32 maxkf = this->maxInterpKeyFrameSize; - if(sizeof(void*) > 4) // see above in create() - maxkf += 16; - if(interpInfo->interpKeyFrameSize > maxkf){ - RWERROR((ERR_GENERAL, "interpolation frame too big")); - return 0; - } - this->currentInterpKeyFrameSize = interpInfo->interpKeyFrameSize; - this->currentAnimKeyFrameSize = interpInfo->animKeyFrameSize; - this->applyCB = interpInfo->applyCB; - this->blendCB = interpInfo->blendCB; - this->interpCB = interpInfo->interpCB; - this->addCB = interpInfo->addCB; - for(i = 0; i < numNodes; i++){ - InterpFrameHeader *intf; - KeyFrameHeader *kf1, *kf2; - intf = this->getInterpFrame(i); - kf1 = this->getAnimFrame(i); - kf2 = this->getAnimFrame(i+numNodes); - intf->keyFrame1 = kf1; - intf->keyFrame2 = kf2; - // TODO: perhaps just implement all interpolator infos? - if(this->interpCB) - this->interpCB(intf, kf1, kf2, 0.0f, anim->customData); - } - this->nextFrame = this->getAnimFrame(numNodes*2); - return 1; -} - -void -AnimInterpolator::addTime(float32 t) -{ - int32 i; - if(t <= 0.0f) - return; - this->currentTime += t; - // reset animation - if(this->currentTime > this->currentAnim->duration){ - this->setCurrentAnim(this->currentAnim); - return; - } - KeyFrameHeader *last = this->getAnimFrame(this->currentAnim->numFrames); - KeyFrameHeader *next = (KeyFrameHeader*)this->nextFrame; - InterpFrameHeader *ifrm = nil; - while(next < last && next->prev->time <= this->currentTime){ - // find next interpolation frame to expire - for(i = 0; i < this->numNodes; i++){ - ifrm = this->getInterpFrame(i); - if(ifrm->keyFrame2 == next->prev) - break; - } - // advance interpolation frame - ifrm->keyFrame1 = ifrm->keyFrame2; - ifrm->keyFrame2 = next; - // ... and next frame - next = (KeyFrameHeader*)((uint8*)this->nextFrame + - currentAnimKeyFrameSize); - this->nextFrame = next; - } - for(i = 0; i < this->numNodes; i++){ - ifrm = this->getInterpFrame(i); - this->interpCB(ifrm, ifrm->keyFrame1, ifrm->keyFrame2, - this->currentTime, - this->currentAnim->customData); - } -} - -} diff --git a/vendor/librw/src/base.cpp b/vendor/librw/src/base.cpp deleted file mode 100644 index fae47da..0000000 --- a/vendor/librw/src/base.cpp +++ /dev/null @@ -1,1121 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#define PSEP_C '/' -#define PSEP_S "/" -#ifdef __unix__ -#include -#include -#endif - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -namespace rw { - -#define PLUGIN_ID 0 - -int32 version = 0x36003; -int32 build = 0xFFFF; -#ifdef RW_PS2 - int32 platform = PLATFORM_PS2; -#elif RW_WDGL - int32 platform = PLATFORM_WDGL; -#elif RW_GL3 - int32 platform = PLATFORM_GL3; -#elif RW_D3D9 - int32 platform = PLATFORM_D3D9; -#else - int32 platform = PLATFORM_NULL; -#endif -bool32 streamAppendFrames = 0; -char *debugFile = nil; - -static Matrix identMat = { - { 1.0f, 0.0f, 0.0f }, Matrix::IDENTITY|Matrix::TYPEORTHONORMAL, - { 0.0f, 1.0f, 0.0f }, 0, - { 0.0f, 0.0f, 1.0f }, 0, - { 0.0f, 0.0f, 0.0f }, 0 -}; - -// lazy implementation -int -strcmp_ci(const char *s1, const char *s2) -{ - char c1, c2; - for(;;){ - c1 = tolower(*s1); - c2 = tolower(*s2); - if(c1 != c2) - return c1 - c2; - if(c1 == '\0') - return 0; - s1++; - s2++; - } -} - -int -strncmp_ci(const char *s1, const char *s2, int n) -{ - char c1, c2; - while(n--){ - c1 = tolower(*s1); - c2 = tolower(*s2); - if(c1 != c2) - return c1 - c2; - if(c1 == '\0') - return 0; - s1++; - s2++; - } - return 0; -} - -Quat -mult(const Quat &q, const Quat &p) -{ - return makeQuat(q.w*p.w - q.x*p.x - q.y*p.y - q.z*p.z, - q.w*p.x + q.x*p.w + q.y*p.z - q.z*p.y, - q.w*p.y + q.y*p.w + q.z*p.x - q.x*p.z, - q.w*p.z + q.z*p.w + q.x*p.y - q.y*p.x); -} - - -Quat* -Quat::rotate(const V3d *axis, float32 angle, CombineOp op) -{ - Quat rot = rotation(angle, *axis); - switch(op){ - case COMBINEREPLACE: - *this = rot; - break; - case COMBINEPRECONCAT: - *this = mult(*this, rot); - break; - case COMBINEPOSTCONCAT: - *this = mult(rot, *this); - break; - } - return this; -} - -Quat -lerp(const Quat &q, const Quat &p, float32 r) -{ - float32 c; - Quat q1 = q; - c = dot(q1, p); - if(c < 0.0f){ - c = -c; - q1 = negate(q1); - } - return makeQuat(q1.w + r*(p.w - q1.w), - q1.x + r*(p.x - q1.x), - q1.y + r*(p.y - q1.y), - q1.z + r*(p.z - q1.z)); -}; - -Quat -slerp(const Quat &q, const Quat &p, float32 a) -{ - float32 c; - Quat q1 = q; - c = dot(q1, p); - if(c < 0.0f){ - c = -c; - q1 = negate(q1); - } - float32 phi = acosf(c); - if(phi > 0.00001f){ - float32 s = sinf(phi); - return add(scale(q1, sinf((1.0f-a)*phi)/s), - scale(p, sinf(a*phi)/s)); - } - return q1; -} - -// -// V3d -// - -V3d -cross(const V3d &a, const V3d &b) -{ - return makeV3d(a.y*b.z - a.z*b.y, - a.z*b.x - a.x*b.z, - a.x*b.y - a.y*b.x); -} - -void -V3d::transformPoints(V3d *out, const V3d *in, int32 n, const Matrix *m) -{ - int32 i; - V3d tmp; - for(i = 0; i < n; i++){ - tmp.x = in[i].x*m->right.x + in[i].y*m->up.x + in[i].z*m->at.x + m->pos.x; - tmp.y = in[i].x*m->right.y + in[i].y*m->up.y + in[i].z*m->at.y + m->pos.y; - tmp.z = in[i].x*m->right.z + in[i].y*m->up.z + in[i].z*m->at.z + m->pos.z; - out[i] = tmp; - } -} - -void -V3d::transformVectors(V3d *out, const V3d *in, int32 n, const Matrix *m) -{ - int32 i; - V3d tmp; - for(i = 0; i < n; i++){ - tmp.x = in[i].x*m->right.x + in[i].y*m->up.x + in[i].z*m->at.x; - tmp.y = in[i].x*m->right.y + in[i].y*m->up.y + in[i].z*m->at.y; - tmp.z = in[i].x*m->right.z + in[i].y*m->up.z + in[i].z*m->at.z; - out[i] = tmp; - } -} - -// -// RawMatrix -// - -void -RawMatrix::mult(RawMatrix *dst, RawMatrix *src1, RawMatrix *src2) -{ - dst->right.x = src1->right.x*src2->right.x + src1->right.y*src2->up.x + src1->right.z*src2->at.x + src1->rightw*src2->pos.x; - dst->right.y = src1->right.x*src2->right.y + src1->right.y*src2->up.y + src1->right.z*src2->at.y + src1->rightw*src2->pos.y; - dst->right.z = src1->right.x*src2->right.z + src1->right.y*src2->up.z + src1->right.z*src2->at.z + src1->rightw*src2->pos.z; - dst->rightw = src1->right.x*src2->rightw + src1->right.y*src2->upw + src1->right.z*src2->atw + src1->rightw*src2->posw; - dst->up.x = src1->up.x*src2->right.x + src1->up.y*src2->up.x + src1->up.z*src2->at.x + src1->upw*src2->pos.x; - dst->up.y = src1->up.x*src2->right.y + src1->up.y*src2->up.y + src1->up.z*src2->at.y + src1->upw*src2->pos.y; - dst->up.z = src1->up.x*src2->right.z + src1->up.y*src2->up.z + src1->up.z*src2->at.z + src1->upw*src2->pos.z; - dst->upw = src1->up.x*src2->rightw + src1->up.y*src2->upw + src1->up.z*src2->atw + src1->upw*src2->posw; - dst->at.x = src1->at.x*src2->right.x + src1->at.y*src2->up.x + src1->at.z*src2->at.x + src1->atw*src2->pos.x; - dst->at.y = src1->at.x*src2->right.y + src1->at.y*src2->up.y + src1->at.z*src2->at.y + src1->atw*src2->pos.y; - dst->at.z = src1->at.x*src2->right.z + src1->at.y*src2->up.z + src1->at.z*src2->at.z + src1->atw*src2->pos.z; - dst->atw = src1->at.x*src2->rightw + src1->at.y*src2->upw + src1->at.z*src2->atw + src1->atw*src2->posw; - dst->pos.x = src1->pos.x*src2->right.x + src1->pos.y*src2->up.x + src1->pos.z*src2->at.x + src1->posw*src2->pos.x; - dst->pos.y = src1->pos.x*src2->right.y + src1->pos.y*src2->up.y + src1->pos.z*src2->at.y + src1->posw*src2->pos.y; - dst->pos.z = src1->pos.x*src2->right.z + src1->pos.y*src2->up.z + src1->pos.z*src2->at.z + src1->posw*src2->pos.z; - dst->posw = src1->pos.x*src2->rightw + src1->pos.y*src2->upw + src1->pos.z*src2->atw + src1->posw*src2->posw; -} - -void -RawMatrix::transpose(RawMatrix *dst, RawMatrix *src) -{ - dst->right.x = src->right.x; - dst->up.x = src->right.y; - dst->at.x = src->right.z; - dst->pos.x = src->rightw; - dst->right.y = src->up.x; - dst->up.y = src->up.y; - dst->at.y = src->up.z; - dst->pos.y = src->upw; - dst->right.z = src->at.x; - dst->up.z = src->at.y; - dst->at.z = src->at.z; - dst->pos.z = src->atw; - dst->rightw = src->pos.x; - dst->upw = src->pos.y; - dst->atw = src->pos.z; - dst->posw = src->posw; -} - -void -RawMatrix::setIdentity(RawMatrix *dst) -{ - static RawMatrix identity = { - { 1.0f, 0.0f, 0.0f }, 0.0f, - { 0.0f, 1.0f, 0.0f }, 0.0f, - { 0.0f, 0.0f, 1.0f }, 0.0f, - { 0.0f, 0.0f, 0.0f }, 1.0f - }; - *dst = identity; -} - -// -// Matrix -// - -static Matrix::Tolerance matrixDefaultTolerance = { 0.01f, 0.01f, 0.01f }; - -Matrix* -Matrix::create(void) -{ - Matrix *m = (Matrix*)rwMalloc(sizeof(Matrix), MEMDUR_EVENT | ID_MATRIX); - m->setIdentity(); - return m; -} - -void -Matrix::destroy(void) -{ - rwFree(this); -} - -void -Matrix::setIdentity(void) -{ - *this = identMat; -} - -void -Matrix::optimize(Tolerance *tolerance) -{ - bool32 isnormal, isorthogonal, isidentity; - if(tolerance == nil) - tolerance = &matrixDefaultTolerance; - isnormal = normalError() <= tolerance->normal; - isorthogonal = orthogonalError() <= tolerance->orthogonal; - isidentity = isnormal && isorthogonal && identityError() <= tolerance->identity; - if(isnormal) - flags |= TYPENORMAL; - else - flags &= ~TYPENORMAL; - if(isorthogonal) - flags |= TYPEORTHOGONAL; - else - flags &= ~TYPEORTHOGONAL; - if(isidentity) - flags |= IDENTITY; - else - flags &= ~IDENTITY; -} - -Matrix* -Matrix::mult(Matrix *dst, const Matrix *src1, const Matrix *src2) -{ - if(src1->flags & IDENTITY) - *dst = *src2; - else if(src2->flags & IDENTITY) - *dst = *src1; - else{ - mult_(dst, src1, src2); - dst->flags = src1->flags & src2->flags; - } - return dst; -} - -Matrix* -Matrix::invert(Matrix *dst, const Matrix *src) -{ - if(src->flags & IDENTITY) - *dst = *src; - else if((src->flags & TYPEMASK) == TYPEORTHONORMAL) - invertOrthonormal(dst, src); - else - return invertGeneral(dst, src); - return dst; -} - -// transpose the 3x3 submatrix, pos is set to 0 -Matrix* -Matrix::transpose(Matrix *dst, const Matrix *src) -{ - if(src->flags & IDENTITY) - *dst = *src; - dst->right.x = src->right.x; - dst->up.x = src->right.y; - dst->at.x = src->right.z; - dst->right.y = src->up.x; - dst->up.y = src->up.y; - dst->at.y = src->up.z; - dst->right.z = src->at.x; - dst->up.z = src->at.y; - dst->at.z = src->at.z; - dst->pos.x = 0.0; - dst->pos.y = 0.0; - dst->pos.z = 0.0; - return dst; -} - -Matrix* -Matrix::rotate(const V3d *axis, float32 angle, CombineOp op) -{ - Matrix tmp, rot; - makeRotation(&rot, axis, angle); - switch(op){ - case COMBINEREPLACE: - *this = rot; - break; - case COMBINEPRECONCAT: - mult(&tmp, &rot, this); - *this = tmp; - break; - case COMBINEPOSTCONCAT: - mult(&tmp, this, &rot); - *this = tmp; - break; - } - return this; -} - -Matrix* -Matrix::rotate(const Quat &q, CombineOp op) -{ - Matrix tmp, rot; - makeRotation(&rot, q); - switch(op){ - case COMBINEREPLACE: - *this = rot; - break; - case COMBINEPRECONCAT: - mult(&tmp, &rot, this); - *this = tmp; - break; - case COMBINEPOSTCONCAT: - mult(&tmp, this, &rot); - *this = tmp; - break; - } - return this; -} -Matrix* -Matrix::translate(const V3d *translation, CombineOp op) -{ - Matrix tmp; - Matrix trans = identMat; - trans.pos = *translation; - trans.flags &= ~IDENTITY; - switch(op){ - case COMBINEREPLACE: - *this = trans; - break; - case COMBINEPRECONCAT: - mult(&tmp, &trans, this); - *this = tmp; - break; - case COMBINEPOSTCONCAT: - mult(&tmp, this, &trans); - *this = tmp; - break; - } - return this; -} - -Matrix* -Matrix::scale(const V3d *scale, CombineOp op) -{ - Matrix tmp; - Matrix scl = identMat; - scl.right.x = scale->x; - scl.up.y = scale->y; - scl.at.z = scale->z; - scl.flags &= ~IDENTITY; - switch(op){ - case COMBINEREPLACE: - *this = scl; - break; - case COMBINEPRECONCAT: - mult(&tmp, &scl, this); - *this = tmp; - break; - case COMBINEPOSTCONCAT: - mult(&tmp, this, &scl); - *this = tmp; - break; - } - return this; -} - -Matrix* -Matrix::transform(const Matrix *mat, CombineOp op) -{ - Matrix tmp; - switch(op){ - case COMBINEREPLACE: - *this = *mat; - break; - case COMBINEPRECONCAT: - mult(&tmp, mat, this); - *this = tmp; - break; - case COMBINEPOSTCONCAT: - mult(&tmp, this, mat); - *this = tmp; - break; - } - return this; -} - -Quat -Matrix::getRotation(void) -{ - Quat q = { 0.0f, 0.0f, 0.0f, 1.0f }; - float32 tr = right.x + up.y + at.z; - float s; - if(tr > 0.0f){ - s = sqrtf(1.0f + tr) * 2.0f; - q.w = s / 4.0f; - q.x = (up.z - at.y) / s; - q.y = (at.x - right.z) / s; - q.z = (right.y - up.x) / s; - }else if(right.x > up.y && right.x > at.z){ - s = sqrtf(1.0f + right.x - up.y - at.z) * 2.0f; - q.w = (up.z - at.y) / s; - q.x = s / 4.0f; - q.y = (up.x + right.y) / s; - q.z = (at.x + right.z) / s; - }else if(up.y > at.z){ - s = sqrtf(1.0f + up.y - right.x - at.z) * 2.0f; - q.w = (at.x - right.z) / s; - q.x = (up.x + right.y) / s; - q.y = s / 4.0f; - q.z = (at.y + up.z) / s; - }else{ - s = sqrtf(1.0f + at.z - right.x - up.y) * 2.0f; - q.w = (right.y - up.x) / s; - q.x = (at.x + right.z) / s; - q.y = (at.y + up.z) / s; - q.z = s / 4.0f; - } - return q; -} - -void -Matrix::lookAt(const V3d &dir, const V3d &up) -{ - // this->right is really pointing left - this->at = normalize(dir); - this->right = normalize(cross(up, this->at)); - this->up = cross(this->at, this->right); - this->flags = TYPEORTHONORMAL; -} - -/* For a row-major representation, this calculates src1 * src2. - * For column-major src2 * src1. - * i.e. a vector is first xformed by src1, then by src2 - */ -void -Matrix::mult_(Matrix *dst, const Matrix *src1, const Matrix *src2) -{ - dst->right.x = src1->right.x*src2->right.x + src1->right.y*src2->up.x + src1->right.z*src2->at.x; - dst->right.y = src1->right.x*src2->right.y + src1->right.y*src2->up.y + src1->right.z*src2->at.y; - dst->right.z = src1->right.x*src2->right.z + src1->right.y*src2->up.z + src1->right.z*src2->at.z; - dst->up.x = src1->up.x*src2->right.x + src1->up.y*src2->up.x + src1->up.z*src2->at.x; - dst->up.y = src1->up.x*src2->right.y + src1->up.y*src2->up.y + src1->up.z*src2->at.y; - dst->up.z = src1->up.x*src2->right.z + src1->up.y*src2->up.z + src1->up.z*src2->at.z; - dst->at.x = src1->at.x*src2->right.x + src1->at.y*src2->up.x + src1->at.z*src2->at.x; - dst->at.y = src1->at.x*src2->right.y + src1->at.y*src2->up.y + src1->at.z*src2->at.y; - dst->at.z = src1->at.x*src2->right.z + src1->at.y*src2->up.z + src1->at.z*src2->at.z; - dst->pos.x = src1->pos.x*src2->right.x + src1->pos.y*src2->up.x + src1->pos.z*src2->at.x + src2->pos.x; - dst->pos.y = src1->pos.x*src2->right.y + src1->pos.y*src2->up.y + src1->pos.z*src2->at.y + src2->pos.y; - dst->pos.z = src1->pos.x*src2->right.z + src1->pos.y*src2->up.z + src1->pos.z*src2->at.z + src2->pos.z; -} - -void -Matrix::invertOrthonormal(Matrix *dst, const Matrix *src) -{ - dst->right.x = src->right.x; - dst->right.y = src->up.x; - dst->right.z = src->at.x; - dst->up.x = src->right.y; - dst->up.y = src->up.y; - dst->up.z = src->at.y; - dst->at.x = src->right.z; - dst->at.y = src->up.z; - dst->at.z = src->at.z; - dst->pos.x = -(src->pos.x*src->right.x + - src->pos.y*src->right.y + - src->pos.z*src->right.z); - dst->pos.y = -(src->pos.x*src->up.x + - src->pos.y*src->up.y + - src->pos.z*src->up.z); - dst->pos.z = -(src->pos.x*src->at.x + - src->pos.y*src->at.y + - src->pos.z*src->at.z); - dst->flags = TYPEORTHONORMAL; -} - -Matrix* -Matrix::invertGeneral(Matrix *dst, const Matrix *src) -{ - float32 det, invdet; - // calculate a few cofactors - dst->right.x = src->up.y*src->at.z - src->up.z*src->at.y; - dst->right.y = src->at.y*src->right.z - src->at.z*src->right.y; - dst->right.z = src->right.y*src->up.z - src->right.z*src->up.y; - // get the determinant from that - det = src->up.x * dst->right.y + src->at.x * dst->right.z + dst->right.x * src->right.x; - invdet = 1.0; - if(det != 0.0f) - invdet = 1.0f/det; - dst->right.x *= invdet; - dst->right.y *= invdet; - dst->right.z *= invdet; - dst->up.x = invdet * (src->up.z*src->at.x - src->up.x*src->at.z); - dst->up.y = invdet * (src->at.z*src->right.x - src->at.x*src->right.z); - dst->up.z = invdet * (src->right.z*src->up.x - src->right.x*src->up.z); - dst->at.x = invdet * (src->up.x*src->at.y - src->up.y*src->at.x); - dst->at.y = invdet * (src->at.x*src->right.y - src->at.y*src->right.x); - dst->at.z = invdet * (src->right.x*src->up.y - src->right.y*src->up.x); - dst->pos.x = -(src->pos.x*dst->right.x + src->pos.y*dst->up.x + src->pos.z*dst->at.x); - dst->pos.y = -(src->pos.x*dst->right.y + src->pos.y*dst->up.y + src->pos.z*dst->at.y); - dst->pos.z = -(src->pos.x*dst->right.z + src->pos.y*dst->up.z + src->pos.z*dst->at.z); - dst->flags &= ~IDENTITY; - return dst; -} - -void -Matrix::makeRotation(Matrix *dst, const V3d *axis, float32 angle) -{ -// V3d v = normalize(*axis); - float32 len = dot(*axis, *axis); - if(len != 0.0f) len = 1.0f/sqrtf(len); - V3d v = rw::scale(*axis, len); - angle = angle*(float)M_PI/180.0f; - float32 s = sinf(angle); - float32 c = cosf(angle); - float32 t = 1.0f - c; - - dst->right.x = c + v.x*v.x*t; - dst->right.y = v.x*v.y*t + v.z*s; - dst->right.z = v.z*v.x*t - v.y*s; - dst->up.x = v.x*v.y*t - v.z*s; - dst->up.y = c + v.y*v.y*t; - dst->up.z = v.y*v.z*t + v.x*s; - dst->at.x = v.z*v.x*t + v.y*s; - dst->at.y = v.y*v.z*t - v.x*s; - dst->at.z = c + v.z*v.z*t; - dst->pos.x = 0.0; - dst->pos.y = 0.0; - dst->pos.z = 0.0; - dst->flags = TYPEORTHONORMAL; -} - -/* q must be normalized */ -void -Matrix::makeRotation(Matrix *dst, const Quat &q) -{ - float xx = q.x*q.x; - float yy = q.y*q.y; - float zz = q.z*q.z; - float yz = q.y*q.z; - float zx = q.z*q.x; - float xy = q.x*q.y; - float wx = q.w*q.x; - float wy = q.w*q.y; - float wz = q.w*q.z; - - dst->right.x = 1.0f - 2.0f*(yy + zz); - dst->right.y = 2.0f*(xy + wz); - dst->right.z = 2.0f*(zx - wy); - dst->up.x = 2.0f*(xy - wz); - dst->up.y = 1.0f - 2.0f*(xx + zz); - dst->up.z = 2.0f*(yz + wx); - dst->at.x = 2.0f*(zx + wy); - dst->at.y = 2.0f*(yz - wx); - dst->at.z = 1.0f - 2.0f*(xx + yy); - dst->pos.x = 0.0; - dst->pos.y = 0.0; - dst->pos.z = 0.0; - dst->flags = TYPEORTHONORMAL; -} - -float32 -Matrix::normalError(void) -{ - float32 x, y, z; - x = dot(right, right) - 1.0f; - y = dot(up, up) - 1.0f; - z = dot(at, at) - 1.0f; - return x*x + y*y + z*z; -} - -float32 -Matrix::orthogonalError(void) -{ - float32 x, y, z; - x = dot(at, up); - y = dot(at, right); - z = dot(up, right); - return x*x + y*y + z*z; -} - -float32 -Matrix::identityError(void) -{ - V3d r = { right.x-1.0f, right.y, right.z }; - V3d u = { up.x, up.y-1.0f, up.z }; - V3d a = { at.x, at.y, at.z-1.0f }; - return dot(r,r) + dot(u,u) + dot(a,a) + dot(pos,pos); -} - -void -correctPathCase(char *filename) -{ -#ifdef __unix__ - DIR *direct; - struct dirent *dirent; - - char *dir, *arg; - char copy[1024], sofar[1024] = "."; - strncpy(copy, filename, 1024); - arg = copy; - // hack for absolute paths - if(filename[0] == '/'){ - sofar[0] = '/'; - sofar[1] = '/'; - sofar[2] = '\0'; - arg++; - } - while((dir = strtok(arg, PSEP_S))){ - arg = nil; - if(direct = opendir(sofar), dir == nil) - return; - while(dirent = readdir(direct), dirent != nil) - if(strncmp_ci(dirent->d_name, dir, 1024) == 0){ - strncat(sofar, PSEP_S, 1024); - strncat(sofar, dirent->d_name, 1024); - break; - } - closedir(direct); - if(dirent == nil) - return; - } - strcpy(filename, sofar+2); -#endif -} - -void -makePath(char *filename) -{ - size_t len = strlen(filename); - for(size_t i = 0; i < len; i++) - if(filename[i] == '/' || filename[i] == '\\') - filename[i] = PSEP_C; -#ifdef __unix__ - correctPathCase(filename); -#endif -} - -void -memNative32_func(void *data, uint32 size) -{ - uint8 *bytes = (uint8*)data; - uint32 *words = (uint32*)data; - size >>= 2; - while(size--){ - *words++ = (uint32)bytes[0] | (uint32)bytes[1]<<8 | - (uint32)bytes[2]<<16 | (uint32)bytes[3]<<24; - bytes += 4; - } -} - -void -memNative16_func(void *data, uint32 size) -{ - uint8 *bytes = (uint8*)data; - uint16 *words = (uint16*)data; - size >>= 1; - while(size--){ - *words++ = (uint16)bytes[0] | (uint16)bytes[1]<<8; - bytes += 2; - } -} - -void -memLittle32_func(void *data, uint32 size) -{ - uint32 w; - uint8 *bytes = (uint8*)data; - uint32 *words = (uint32*)data; - size >>= 2; - while(size--){ - w = *words++; - *bytes++ = w; - *bytes++ = w >> 8; - *bytes++ = w >> 16; - *bytes++ = w >> 24; - } -} - -void -memLittle16_func(void *data, uint32 size) -{ - uint16 w; - uint8 *bytes = (uint8*)data; - uint16 *words = (uint16*)data; - size >>= 1; - while(size--){ - w = *words++; - *bytes++ = (uint8)w; - *bytes++ = w >> 8; - } -} - -uint32 -Stream::write32(const void *data, uint32 length) -{ -#ifdef BIGENDIAN - uint8 *src = (uint8*)data; - uint32 buf[256]; - int32 n, len; - for(len = length >>= 2; len > 0; len -= 256){ - n = len < 256 ? len : 256; - memcpy(buf, src, n*4); - memLittle32(buf, n*4); - write8(buf, n*4); - src += n*4; - } - return length; -#else - return write8(data, length); -#endif -} - -uint32 -Stream::write16(const void *data, uint32 length) -{ -#ifdef BIGENDIAN - uint8 *src = (uint8*)data; - uint16 buf[256]; - int32 n, len; - for(len = length >>= 1; len > 0; len -= 256){ - n = len < 256 ? len : 256; - memcpy(buf, src, n*2); - memLittle16(buf, n*2); - write8(buf, n*2); - src += n*2; - } - return length; -#else - return write8(data, length); -#endif -} - -uint32 -Stream::read32(void *data, uint32 length) -{ - uint32 ret; - ret = read8(data, length); - memNative32(data, length); - return ret; -} - -uint32 -Stream::read16(void *data, uint32 length) -{ - uint32 ret; - ret = read8(data, length); - memNative16(data, length); - return ret; -} - -int32 -Stream::writeI8(int8 val) -{ - return write8(&val, sizeof(int8)); -} - -int32 -Stream::writeU8(uint8 val) -{ - return write8(&val, sizeof(uint8)); -} - -int32 -Stream::writeI16(int16 val) -{ - return write16(&val, sizeof(int16)); -} - -int32 -Stream::writeU16(uint16 val) -{ - return write16(&val, sizeof(uint16)); -} - -int32 -Stream::writeI32(int32 val) -{ - return write32(&val, sizeof(int32)); -} - -int32 -Stream::writeU32(uint32 val) -{ - return write32(&val, sizeof(uint32)); -} - -int32 -Stream::writeF32(float32 val) -{ - return write32(&val, sizeof(float32)); -} - -int8 -Stream::readI8(void) -{ - int8 tmp; - read8(&tmp, sizeof(int8)); - return tmp; -} - -uint8 -Stream::readU8(void) -{ - uint8 tmp; - read8(&tmp, sizeof(uint8)); - return tmp; -} - -int16 -Stream::readI16(void) -{ - int16 tmp; - read16(&tmp, sizeof(int16)); - return tmp; -} - -uint16 -Stream::readU16(void) -{ - uint16 tmp; - read16(&tmp, sizeof(uint16)); - return tmp; -} - -int32 -Stream::readI32(void) -{ - int32 tmp; - read32(&tmp, sizeof(int32)); - return tmp; -} - -uint32 -Stream::readU32(void) -{ - uint32 tmp; - read32(&tmp, sizeof(uint32)); - return tmp; -} - -float32 -Stream::readF32(void) -{ - float32 tmp; - read32(&tmp, sizeof(float32)); - return tmp; -} - - - -void -StreamMemory::close(void) -{ -} - -uint32 -StreamMemory::write8(const void *data, uint32 len) -{ - if(this->eof()) - return 0; - uint32 l = len; - if(this->position+l > this->length){ - if(this->position+l > this->capacity) - l = this->capacity-this->position; - this->length = this->position+l; - } - memcpy(&this->data[this->position], data, l); - this->position += l; - if(len != l) - this->position = S_EOF; - return l; -} - -uint32 -StreamMemory::read8(void *data, uint32 len) -{ - if(this->eof()) - return 0; - uint32 l = len; - if(this->position+l > this->length) - l = this->length-this->position; - memcpy(data, &this->data[this->position], l); - this->position += l; - if(len != l) - this->position = S_EOF; - return l; -} - -void -StreamMemory::seek(int32 offset, int32 whence) -{ - if(whence == 0) - this->position = offset; - else if(whence == 1) - this->position += offset; - else - this->position = this->length-offset; - if(this->position > this->length){ - // TODO: ideally this would depend on the mode - if(this->position > this->capacity) - this->position = S_EOF; - else - this->length = this->position; - } -} - -uint32 -StreamMemory::tell(void) -{ - return this->position; -} - -bool -StreamMemory::eof(void) -{ - return this->position == S_EOF; -} - -StreamMemory* -StreamMemory::open(uint8 *data, uint32 length, uint32 capacity) -{ - this->data = data; - this->capacity = capacity; - this->length = length; - if(this->capacity < this->length) - this->capacity = this->length; - this->position = 0; - return this; -} - -uint32 -StreamMemory::getLength(void) -{ - return this->length; -} - - -StreamFile* -StreamFile::open(const char *path, const char *mode) -{ - assert(this->file == nil); - this->file = fopen(path, mode); - if(this->file == nil){ - RWERROR((ERR_FILE, path)); - return nil; - } - return this; -} - -void -StreamFile::close(void) -{ - assert(this->file); - fclose(this->file); - this->file = nil; -} - -uint32 -StreamFile::write8(const void *data, uint32 length) -{ - return (uint32)fwrite(data, 1, length, this->file); -} - -uint32 -StreamFile::read8(void *data, uint32 length) -{ - return (uint32)fread(data, 1, length, this->file); -} - -void -StreamFile::seek(int32 offset, int32 whence) -{ - fseek(this->file, offset, whence); -} - -uint32 -StreamFile::tell(void) -{ - return ftell(this->file); -} - -bool -StreamFile::eof(void) -{ - return ( feof(this->file) != 0 ); -} - -bool -writeChunkHeader(Stream *s, int32 type, int32 size) -{ - struct { - int32 type, size; - uint32 id; - } buf = { type, size, libraryIDPack(version, build) }; - s->write32(&buf, 12); - return true; -} - -bool -readChunkHeaderInfo(Stream *s, ChunkHeaderInfo *header) -{ - struct { - int32 type, size; - uint32 id; - } buf; - s->read32(&buf, 12); - if(s->eof()) - return false; - assert(header != nil); - header->type = buf.type; - header->length = buf.size; - header->version = libraryIDUnpackVersion(buf.id); - header->build = libraryIDUnpackBuild(buf.id); - return true; -} - -bool -findChunk(Stream *s, uint32 type, uint32 *length, uint32 *version) -{ - ChunkHeaderInfo header; - while(readChunkHeaderInfo(s, &header)){ - if(header.type == ID_NAOBJECT) - return false; - if(header.type == type){ - if(length) - *length = header.length; - if(version) - *version = header.version; - return true; - } - s->seek(header.length); - } - return false; -} - -int32 -findPointer(void *p, void **list, int32 num) -{ - int i; - for(i = 0; i < num; i++) - if(list[i] == p) - return i; - return -1; -} - -uint8* -getFileContents(const char *name, uint32 *len) -{ - FILE *cf = fopen(name, "rb"); - if(cf == nil) - return nil; - fseek(cf, 0, SEEK_END); - *len = ftell(cf); - fseek(cf, 0, SEEK_SET); - uint8 *data = rwNewT(uint8, *len, MEMDUR_EVENT); - fread(data, 1, *len, cf); - fclose(cf); - return data; -} - -} diff --git a/vendor/librw/src/base.err b/vendor/librw/src/base.err deleted file mode 100644 index 2d413e8..0000000 --- a/vendor/librw/src/base.err +++ /dev/null @@ -1,24 +0,0 @@ -ECODE(ERR_GENERAL, - "Error: %s"), -ECODE(ERR_ALLOC, - "Couldn't allocate 0x%X bytes"), -ECODE(ERR_FILE, - "Couldn't open file %s"), -ECODE(ERR_CHUNK, - "Couldn't find chunk %s"), -ECODE(ERR_VERSION, - "Unsupported version %X"), -ECODE(ERR_PLATFORM, - "Unsupported platform %d"), -ECODE(ERR_ENGINEINIT, - "Engine could not be initialized"), -ECODE(ERR_ENGINEOPEN, - "Engine could not be opened"), -ECODE(ERR_ENGINESTART, - "Engine could not be started"), -ECODE(ERR_INVRASTER, - "Invalid raster format"), -ECODE(ERR_NOTEXTURE, - "Could not create texture"), -ECODE(ERR_FORMAT_UNSUPPORTED, - "Unsupported raster format") diff --git a/vendor/librw/src/bmp.cpp b/vendor/librw/src/bmp.cpp deleted file mode 100644 index f69e58d..0000000 --- a/vendor/librw/src/bmp.cpp +++ /dev/null @@ -1,284 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -#define PLUGIN_ID 0 - -namespace rw { - -// NB: this has padding and cannot be streamed directly! -struct BMPheader -{ - uint16 magic; - uint32 size; - uint16 reserved[2]; - uint32 offset; - - bool32 read(Stream *stream); - void write(Stream *stream); -}; - -// This one is aligned and can be streamed directly -struct DIBheader -{ - uint32 headerSize; - int32 width; - int32 height; - int16 numPlanes; - int16 depth; - uint32 compression; - uint32 imgSize; - int32 hres; - int32 vres; - int32 paletteLen; - int32 numImportant; - // end of 40 btyes - - uint32 rmask, gmask, bmask, amask; -}; - -bool32 -BMPheader::read(Stream *stream) -{ - magic = stream->readU16(); - size = stream->readU32(); - reserved[0] = stream->readU16(); - reserved[1] = stream->readU16(); - offset = stream->readU32(); - return magic == 0x4D42; -} - -void -BMPheader::write(Stream *stream) -{ - - stream->writeU16(magic); - stream->writeU32(size); - stream->writeU16(reserved[0]); - stream->writeU16(reserved[1]); - stream->writeU32(offset); -} - -Image* -readBMP(const char *filename) -{ - ASSERTLITTLE; - Image *image; - uint32 length; - uint8 *data; - StreamMemory file; - int i, x, y; - - bool32 noalpha; - int pad; - - data = getFileContents(filename, &length); - if(data == nil) - return nil; - file.open(data, length); - - /* read headers */ - BMPheader bmp; - DIBheader dib; - if(!bmp.read(&file)) - goto lose; - file.read8(&dib, sizeof(dib)); - file.seek(dib.headerSize-sizeof(dib)); // skip the part of the header we're ignoring - if(dib.headerSize <= 16){ - dib.compression = 0; - dib.paletteLen = 0; - } - - noalpha = true; - - // Recognize 32 bit formats - if(dib.compression == 3){ - if(dib.rmask != 0xFF0000 || - dib.gmask != 0x00FF00 || - dib.bmask != 0x0000FF) - goto lose; - dib.compression = 0; - if(dib.headerSize > 52 && dib.amask == 0xFF000000) - noalpha = false; - } - - if(dib.compression != 0) - goto lose; - - image = Image::create(dib.width, dib.height, dib.depth); - image->allocate(); - - - if(image->palette){ - int len = 1<palette; - for(i = 0; i < len; i++){ - color[i][2] = file.readU8(); // blue - color[i][1] = file.readU8(); // green - color[i][0] = file.readU8(); // red - color[i][3] = file.readU8(); // alpha - if(noalpha) - color[i][3] = 0xFF; - } - } - - file.seek(bmp.offset, 0); - - pad = image->width*image->bpp % 4; - - uint8 *px, *line; - line = image->pixels + (image->height-1)*image->stride; - for(y = 0; y < image->height; y++){ - px = line; - for(x = 0; x < image->width; x++){ - switch(image->depth){ - case 4: - i = file.readU8();; - px[x+0] = (i>>4)&0xF; - px[x+1] = i&0xF; - x++; - break; - - case 8: - px[x] = file.readU8(); - break; - - case 16: - // TODO: what format is this even? and what does Image expect? - px[x*2 + 0] = file.readU8(); - px[x*2 + 1] = file.readU8(); - break; - - case 24: - px[x*3 + 2] = file.readU8(); - px[x*3 + 1] = file.readU8(); - px[x*3 + 0] = file.readU8(); - break; - - case 32: - px[x*4 + 2] = file.readU8(); - px[x*4 + 1] = file.readU8(); - px[x*4 + 0] = file.readU8(); - px[x*4 + 3] = file.readU8(); - if(noalpha) - px[x*4 + 3] = 0xFF; - break; - - default: - goto lose; - } - } - - line -= image->stride; - file.seek(pad); - } - - - file.close(); - rwFree(data); - return image; - -lose: - file.close(); - rwFree(data); - return nil; -} - -/* can't write alpha */ -void -writeBMP(Image *image, const char *filename) -{ - ASSERTLITTLE; - uint8 *p; - StreamFile file; - if(!file.open(filename, "wb")){ - RWERROR((ERR_FILE, filename)); - return; - } - - int32 pallen = image->depth > 8 ? 0 : - image->depth == 4 ? 16 : 256; - int32 stride = image->width*image->depth/8; - int32 depth = image->depth == 32 ? 24 : image->depth; - stride = stride+3 & ~3; - - // File headers - BMPheader bmp; - bmp.magic = 0x4D42; // BM - bmp.size = 0x36 + 4*pallen + image->height*stride; - bmp.reserved[0] = 0; - bmp.reserved[1] = 0; - bmp.offset = 0x36 + 4*pallen; - bmp.write(&file); - - DIBheader dib; - dib.headerSize = 0x28; - dib.width = image->width; - dib.height = image->height; - dib.numPlanes = 1; - dib.depth = depth; - dib.compression = 0; - dib.imgSize = 0; - dib.hres = 2835; // 72dpi - dib.vres = 2835; // 72dpi - dib.paletteLen = 0; - dib.numImportant = 0; - file.write8(&dib, dib.headerSize); - - for(int i = 0; i < pallen; i++){ - file.writeU8(image->palette[i*4+2]); - file.writeU8(image->palette[i*4+1]); - file.writeU8(image->palette[i*4+0]); - file.writeU8(0xFF); - } - - uint8 *line = image->pixels + (image->height-1)*image->stride; - int32 n; - for(int y = 0; y < image->height; y++){ - p = line; - for(int x = 0; x < image->width; x++){ - switch(image->depth){ - case 4: - file.writeU8((p[0]&0xF)<<4 | (p[1]&0xF)); - p += 2; - x++; - break; - case 8: - file.writeU8(*p++); - break; - case 16: - file.writeU8(p[0]); - file.writeU8(p[1]); - p += 2; - break; - case 24: - file.writeU8(p[2]); - file.writeU8(p[1]); - file.writeU8(p[0]); - p += 3; - break; - case 32: - file.writeU8(p[2]); - file.writeU8(p[1]); - file.writeU8(p[0]); - p += 4; - } - } - n = (p-line) % 4; - while(n--) - file.writeU8(0); - line -= image->stride; - } - - file.close(); -} - -} diff --git a/vendor/librw/src/camera.cpp b/vendor/librw/src/camera.cpp deleted file mode 100644 index 4a87ed3..0000000 --- a/vendor/librw/src/camera.cpp +++ /dev/null @@ -1,524 +0,0 @@ -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -#define PLUGIN_ID ID_CAMERA - -namespace rw { - -int32 Camera::numAllocated; - -PluginList Camera::s_plglist(sizeof(Camera)); - -void -defaultBeginUpdateCB(Camera *cam) -{ - engine->currentCamera = cam; - Frame::syncDirty(); - engine->device.beginUpdate(cam); -} - -void -defaultEndUpdateCB(Camera *cam) -{ - engine->device.endUpdate(cam); -} - -static void -buildPlanes(Camera *cam) -{ - V3d *c = cam->frustumCorners; - FrustumPlane *p = cam->frustumPlanes; - V3d v51 = sub(c[1], c[5]); - V3d v73 = sub(c[3], c[7]); - - /* Far plane */ - p[0].plane.normal = cam->getFrame()->getLTM()->at; - p[0].plane.distance = dot(p[0].plane.normal, c[4]); - p[0].closestX = p[0].plane.normal.x < 0.0f ? 0 : 1; - p[0].closestY = p[0].plane.normal.y < 0.0f ? 0 : 1; - p[0].closestZ = p[0].plane.normal.z < 0.0f ? 0 : 1; - - /* Near plane */ - p[1].plane.normal = neg(p[0].plane.normal); - p[1].plane.distance = dot(p[1].plane.normal, c[0]); - p[1].closestX = p[1].plane.normal.x < 0.0f ? 0 : 1; - p[1].closestY = p[1].plane.normal.y < 0.0f ? 0 : 1; - p[1].closestZ = p[1].plane.normal.z < 0.0f ? 0 : 1; - - /* Right plane */ - p[2].plane.normal = normalize(cross(v51, - sub(c[6], c[5]))); - p[2].plane.distance = dot(p[2].plane.normal, c[1]); - p[2].closestX = p[2].plane.normal.x < 0.0f ? 0 : 1; - p[2].closestY = p[2].plane.normal.y < 0.0f ? 0 : 1; - p[2].closestZ = p[2].plane.normal.z < 0.0f ? 0 : 1; - - /* Top plane */ - p[3].plane.normal = normalize(cross(sub(c[4], c[5]), - v51)); - p[3].plane.distance = dot(p[3].plane.normal, c[1]); - p[3].closestX = p[3].plane.normal.x < 0.0f ? 0 : 1; - p[3].closestY = p[3].plane.normal.y < 0.0f ? 0 : 1; - p[3].closestZ = p[3].plane.normal.z < 0.0f ? 0 : 1; - - /* Left plane */ - p[4].plane.normal = normalize(cross(v73, - sub(c[4], c[7]))); - p[4].plane.distance = dot(p[4].plane.normal, c[3]); - p[4].closestX = p[4].plane.normal.x < 0.0f ? 0 : 1; - p[4].closestY = p[4].plane.normal.y < 0.0f ? 0 : 1; - p[4].closestZ = p[4].plane.normal.z < 0.0f ? 0 : 1; - - /* Bottom plane */ - p[5].plane.normal = normalize(cross(sub(c[6], c[7]), - v73)); - p[5].plane.distance = dot(p[5].plane.normal, c[3]); - p[5].closestX = p[5].plane.normal.x < 0.0f ? 0 : 1; - p[5].closestY = p[5].plane.normal.y < 0.0f ? 0 : 1; - p[5].closestZ = p[5].plane.normal.z < 0.0f ? 0 : 1; -} - -static void -buildClipPersp(Camera *cam) -{ - Matrix *ltm = cam->getFrame()->getLTM(); - - /* First we calculate the 4 points on the view window. */ - V3d up = scale(ltm->up, cam->viewWindow.y); - V3d left = scale(ltm->right, cam->viewWindow.x); - V3d *c = cam->frustumCorners; - c[0] = add(add(ltm->at, up), left); // top left - c[1] = sub(add(ltm->at, up), left); // top right - c[2] = sub(sub(ltm->at, up), left); // bottom right - c[3] = add(sub(ltm->at, up), left); // bottom left - - /* Now Calculate near and far corners. */ - V3d off = sub(scale(ltm->up, cam->viewOffset.y), - scale(ltm->right, cam->viewOffset.x)); - for(int32 i = 0; i < 4; i++){ - V3d corner = sub(cam->frustumCorners[i], off); - V3d pos = add(ltm->pos, off); - c[i] = add(scale(corner, cam->nearPlane), pos); - c[i+4] = add(scale(corner, cam->farPlane), pos); - } - - buildPlanes(cam); -} - -static void -buildClipParallel(Camera *cam) -{ - Matrix *ltm = cam->getFrame()->getLTM(); - float32 nearoffx = -(1.0f - cam->nearPlane)*cam->viewOffset.x; - float32 nearoffy = (1.0f - cam->nearPlane)*cam->viewOffset.y; - float32 faroffx = -(1.0f - cam->farPlane)*cam->viewOffset.x; - float32 faroffy = (1.0f - cam->farPlane)*cam->viewOffset.y; - - V3d *c = cam->frustumCorners; - c[0].x = nearoffx + cam->viewWindow.x; - c[0].y = nearoffy + cam->viewWindow.y; - c[0].z = cam->nearPlane; - - c[1].x = nearoffx - cam->viewWindow.x; - c[1].y = nearoffy + cam->viewWindow.y; - c[1].z = cam->nearPlane; - - c[2].x = nearoffx - cam->viewWindow.x; - c[2].y = nearoffy - cam->viewWindow.y; - c[2].z = cam->nearPlane; - - c[3].x = nearoffx + cam->viewWindow.x; - c[3].y = nearoffy - cam->viewWindow.y; - c[3].z = cam->nearPlane; - - c[4].x = faroffx + cam->viewWindow.x; - c[4].y = faroffy + cam->viewWindow.y; - c[4].z = cam->farPlane; - - c[5].x = faroffx - cam->viewWindow.x; - c[5].y = faroffy + cam->viewWindow.y; - c[5].z = cam->farPlane; - - c[6].x = faroffx - cam->viewWindow.x; - c[6].y = faroffy - cam->viewWindow.y; - c[6].z = cam->farPlane; - - c[7].x = faroffx + cam->viewWindow.x; - c[7].y = faroffy - cam->viewWindow.y; - c[7].z = cam->farPlane; - - V3d::transformPoints(c, c, 8, ltm); - - buildPlanes(cam); -} - -static void -cameraSync(ObjectWithFrame *obj) -{ - /* - * RW projection matrix looks like this: - * (cf. Camera View Matrix white paper) - * w = viewWindow width - * h = viewWindow height - * o = view offset - * - * perspective: - * 1/2w 0 ox/2w + 1/2 -ox/2w - * 0 -1/2h -oy/2h + 1/2 oy/2h - * 0 0 1 0 - * 0 0 1 0 - * - * parallel: - * 1/2w 0 ox/2w -ox/2w + 1/2 - * 0 -1/2h -oy/2h oy/2h + 1/2 - * 0 0 1 0 - * 0 0 0 1 - * - * The view matrix transforms from world to clip space, it is however - * not used for OpenGL or D3D since transformation to camera space - * and to clip space are handled by separate matrices there. - * On these platforms the two matrices are built in the platform's - * beginUpdate function. - * On the PS2 the z- and w-rows are the same and the - * 1/2 translation/shear is removed again on the VU1 by - * subtracting the w-row/2 from the x- and y-rows. - * - * perspective: - * 1/2w 0 ox/2w -ox/2w - * 0 -1/2h -oy/2h oy/2h - * 0 0 1 0 - * 0 0 1 0 - * - * parallel: - * 1/2w 0 ox/2w -ox/2w - * 0 -1/2h -oy/2h oy/2h - * 0 0 1 0 - * 0 0 0 1 - * - * RW builds this matrix directly without using explicit - * inversion and matrix multiplication. - */ - - Camera *cam = (Camera*)obj; - Matrix inv, proj; - Matrix::invertOrthonormal(&inv, cam->getFrame()->getLTM()); - - inv.right.x = -inv.right.x; - inv.up.x = -inv.up.x; - inv.at.x = -inv.at.x; - inv.pos.x = -inv.pos.x; - - float32 xscl = 1.0f/(2.0f*cam->viewWindow.x); - float32 yscl = 1.0f/(2.0f*cam->viewWindow.y); - - proj.flags = 0; - proj.right.x = xscl; - proj.right.y = 0.0f; - proj.right.z = 0.0f; - - proj.up.x = 0.0f; - proj.up.y = -yscl; - proj.up.z = 0.0f; - - if(cam->projection == Camera::PERSPECTIVE){ - proj.pos.x = -cam->viewOffset.x*xscl; - proj.pos.y = cam->viewOffset.y*yscl; - proj.pos.z = 0.0f; - - proj.at.x = -proj.pos.x + 0.5f; - proj.at.y = -proj.pos.y + 0.5f; - proj.at.z = 1.0f; - proj.optimize(); - Matrix::mult(&cam->viewMatrix, &inv, &proj); - buildClipPersp(cam); - }else{ - proj.at.x = cam->viewOffset.x*xscl; - proj.at.y = -cam->viewOffset.y*yscl; - proj.at.z = 1.0f; - - proj.pos.x = -proj.at.x + 0.5f; - proj.pos.y = -proj.at.y + 0.5f; - proj.pos.z = 0.0f; - proj.optimize(); - Matrix::mult(&cam->viewMatrix, &inv, &proj); - buildClipParallel(cam); - } - cam->frustumBoundBox.calculate(cam->frustumCorners, 8); -} - -void -worldBeginUpdateCB(Camera *cam) -{ - engine->currentWorld = cam->world; - cam->originalBeginUpdate(cam); -} - -void -worldEndUpdateCB(Camera *cam) -{ - cam->originalEndUpdate(cam); -} - -static void -worldCameraSync(ObjectWithFrame *obj) -{ - Camera *camera = (Camera*)obj; - camera->originalSync(obj); -} - -Camera* -Camera::create(void) -{ - Camera *cam = (Camera*)rwMalloc(s_plglist.size, MEMDUR_EVENT | ID_CAMERA); - if(cam == nil){ - RWERROR((ERR_ALLOC, s_plglist.size)); - return nil; - } - numAllocated++; - cam->object.object.init(Camera::ID, 0); - cam->object.syncCB = cameraSync; - cam->beginUpdateCB = defaultBeginUpdateCB; - cam->endUpdateCB = defaultEndUpdateCB; - cam->viewWindow.set(1.0f, 1.0f); - cam->viewOffset.set(0.0f, 0.0f); - cam->nearPlane = 0.05f; - cam->farPlane = 10.0f; - cam->fogPlane = 5.0f; - cam->projection = Camera::PERSPECTIVE; - - cam->frameBuffer = nil; - cam->zBuffer = nil; - - // clump extension - cam->clump = nil; - cam->inClump.init(); - - // world extension - cam->world = nil; - cam->originalSync = cam->object.syncCB; - cam->originalBeginUpdate = cam->beginUpdateCB; - cam->originalEndUpdate = cam->endUpdateCB; - cam->object.syncCB = worldCameraSync; - cam->beginUpdateCB = worldBeginUpdateCB; - cam->endUpdateCB = worldEndUpdateCB; - - s_plglist.construct(cam); - return cam; -} - -Camera* -Camera::clone(void) -{ - Camera *cam = Camera::create(); - if(cam == nil) - return nil; - cam->object.object.copy(&this->object.object); - cam->setFrame(this->getFrame()); - cam->viewWindow = this->viewWindow; - cam->viewOffset = this->viewOffset; - cam->nearPlane = this->nearPlane; - cam->farPlane = this->farPlane; - cam->fogPlane = this->fogPlane; - cam->projection = this->projection; - - cam->frameBuffer = this->frameBuffer; - cam->zBuffer = this->zBuffer; - - if(this->world) - this->world->addCamera(cam); - - s_plglist.copy(cam, this); - return cam; -} - -void -Camera::destroy(void) -{ - s_plglist.destruct(this); - assert(this->clump == nil); - assert(this->world == nil); - this->setFrame(nil); - rwFree(this); - numAllocated--; -} - -void -Camera::clear(RGBA *col, uint32 mode) -{ - engine->device.clearCamera(this, col, mode); -} - -void -Camera::showRaster(uint32 flags) -{ - this->frameBuffer->show(flags); -} - -void -calczShiftScale(Camera *cam) -{ - float32 n = cam->nearPlane; - float32 f = cam->farPlane; - float32 N = engine->device.zNear; - float32 F = engine->device.zFar; - // RW does this - N += (F - N)/10000.0f; - F -= (F - N)/10000.0f; - if(cam->projection == Camera::PERSPECTIVE){ - cam->zScale = (N - F)*n*f/(f - n); - cam->zShift = (F*f - N*n)/(f - n); - }else{ - cam->zScale = (F - N)/(f -n); - cam->zShift = (N*f - F*n)/(f - n); - } -} - -void -Camera::setNearPlane(float32 near) -{ - this->nearPlane = near; - calczShiftScale(this); - if(this->getFrame()) - this->getFrame()->updateObjects(); -} - -void -Camera::setFarPlane(float32 far) -{ - this->farPlane = far; - calczShiftScale(this); - if(this->getFrame()) - this->getFrame()->updateObjects(); -} - -void -Camera::setViewWindow(const V2d *window) -{ - this->viewWindow = *window; - if(this->getFrame()) - this->getFrame()->updateObjects(); -} - -void -Camera::setViewOffset(const V2d *offset) -{ - this->viewOffset = *offset; - if(this->getFrame()) - this->getFrame()->updateObjects(); -} - -void -Camera::setProjection(int32 proj) -{ - this->projection = proj; - if(this->getFrame()) - this->getFrame()->updateObjects(); -} - -int32 -Camera::frustumTestSphere(const Sphere *s) const -{ - int32 res = SPHEREINSIDE; - const FrustumPlane *p = this->frustumPlanes; - for(int32 i = 0; i < 6; i++){ - float32 dist = dot(p->plane.normal, s->center) - p->plane.distance; - if(s->radius < dist) - return SPHEREOUTSIDE; - if(s->radius > -dist) - res = SPHEREBOUNDARY; - p++; - } - return res; -} - -struct CameraChunkData -{ - V2d viewWindow; - V2d viewOffset; - float32 nearPlane, farPlane; - float32 fogPlane; - int32 projection; -}; - -Camera* -Camera::streamRead(Stream *stream) -{ - CameraChunkData buf; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - stream->read32(&buf, sizeof(CameraChunkData)); - Camera *cam = Camera::create(); - cam->viewWindow = buf.viewWindow; - cam->viewOffset = buf.viewOffset; - cam->nearPlane = buf.nearPlane; - cam->farPlane = buf.farPlane; - cam->fogPlane = buf.fogPlane; - cam->projection = buf.projection; - if(s_plglist.streamRead(stream, cam)) - return cam; - cam->destroy(); - return nil; -} - -bool -Camera::streamWrite(Stream *stream) -{ - CameraChunkData buf; - writeChunkHeader(stream, ID_CAMERA, this->streamGetSize()); - writeChunkHeader(stream, ID_STRUCT, sizeof(CameraChunkData)); - buf.viewWindow = this->viewWindow; - buf.viewOffset = this->viewOffset; - buf.nearPlane = this->nearPlane; - buf.farPlane = this->farPlane; - buf.fogPlane = this->fogPlane; - buf.projection = this->projection; - stream->write32(&buf, sizeof(CameraChunkData)); - s_plglist.streamWrite(stream, this); - return true; -} - -uint32 -Camera::streamGetSize(void) -{ - return 12 + sizeof(CameraChunkData) + 12 + - s_plglist.streamGetSize(this); -} - -// Assumes horizontal FOV for 4:3, but we convert to vertical FOV -void -Camera::setFOV(float32 hfov, float32 ratio) -{ - V2d v; - float w, h; - - w = (float)this->frameBuffer->width; - h = (float)this->frameBuffer->height; - if(w < 1 || h < 1){ - w = 1; - h = 1; - } - hfov = hfov*3.14159f/360.0f; // deg to rad and halved - - float ar1 = 4.0f/3.0f; - float ar2 = w/h; - float vfov = atanf(tanf(hfov/2) / ar1) *2; - hfov = atanf(tanf(vfov/2) * ar2) *2; - - float32 a = tanf(hfov); - v.set(a, a/ratio); - this->setViewWindow(&v); - v.set(0.0f, 0.0f); - this->setViewOffset(&v); -} - -} diff --git a/vendor/librw/src/charset.cpp b/vendor/librw/src/charset.cpp deleted file mode 100644 index 0d94be8..0000000 --- a/vendor/librw/src/charset.cpp +++ /dev/null @@ -1,236 +0,0 @@ -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwrender.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" -#include "rwcharset.h" - -#include "ps2/rwps2.h" -#include "d3d/rwd3d.h" -#include "gl/rwgl3.h" - - -#define PLUGIN_ID 1000 // TODO: find a better ID - -#ifndef RW_NULL - -#ifdef RWHALFPIXEL -#define HALFPX (0.5f) -#else -#define HALFPX (0.0f) -#endif - -namespace rw { - -const uint8 fontbits[256*256] = { -#include "vgafont.inc" -}; - -#define NUMCHARS 100 -static uint16 *indices; -static RWDEVICE::Im2DVertex *vertices; -static int32 numChars; -static Raster *lastRaster; - -bool32 -Charset::open(void) -{ - if(indices || vertices) - return 0; - numChars = 0; - lastRaster = nil; - indices = rwNewT(uint16, NUMCHARS*6, MEMDUR_EVENT); - vertices = rwNewT(RWDEVICE::Im2DVertex, NUMCHARS*4, MEMDUR_EVENT); - if(indices == nil || vertices == nil){ - close(); - return 0; - } - return 1; -} - -void -Charset::close(void) -{ - rwFree(indices); - indices = nil; - rwFree(vertices); - vertices = nil; -} - -Charset* -Charset::create(const RGBA *foreground, const RGBA *background) -{ - Charset *charset = (Charset*)rwMalloc(sizeof(Charset), MEMDUR_EVENT); - if(charset == nil){ - RWERROR((ERR_ALLOC, sizeof(Charset))); - return nil; - } - charset->raster = nil; - if(charset->setColors(foreground, background) == nil){ - charset->destroy(); - return nil; - } - charset->desc.count = 256; - charset->desc.tileWidth = 28; - charset->desc.tileHeight = 10; - charset->desc.width = 9; - charset->desc.height = 16; - charset->desc.width_internal = 9; - charset->desc.height_internal = 16; - return charset; -} - -void -Charset::destroy(void) -{ - if(raster) - raster->destroy(); - rwFree(this); -} - -Charset* -Charset::setColors(const RGBA *foreground, const RGBA *background) -{ - Image *img = Image::create(256, 256, 8); - if(img == nil) - return nil; - img->pixels = (uint8*)fontbits; - img->stride = 256; - img->allocate(); - img->palette[0] = background->red; - img->palette[1] = background->green; - img->palette[2] = background->blue; - img->palette[3] = background->alpha; - img->palette[4] = foreground->red; - img->palette[5] = foreground->green; - img->palette[6] = foreground->blue; - img->palette[7] = foreground->alpha; - - Raster *newRaster = Raster::createFromImage(img); - img->destroy(); - if(newRaster == nil) - return nil; - if(this->raster) - this->raster->destroy(); - this->raster = newRaster; - return this; -} - -void -Charset::flushBuffer(void) -{ - if(numChars){ - rw::SetRenderStatePtr(rw::TEXTURERASTER, lastRaster); - rw::SetRenderState(rw::TEXTUREADDRESS, rw::Texture::WRAP); - rw::SetRenderState(rw::TEXTUREFILTER, rw::Texture::NEAREST); - - im2d::RenderIndexedPrimitive(rw::PRIMTYPETRILIST, - vertices, numChars*4, indices, numChars*6); - } - - numChars = 0; - lastRaster = nil; -} - -void -Charset::printChar(int32 c, int32 x, int32 y) -{ - Camera *cam; - float recipZ; - float u, v, du, dv; - RWDEVICE::Im2DVertex *vert; - uint16 *ix; - - if(c >= this->desc.count) - return; - - if(this->raster != lastRaster || numChars >= NUMCHARS) - flushBuffer(); - lastRaster = this->raster; - - cam = (Camera*)engine->currentCamera; - vert = &vertices[numChars*4]; - ix = &indices[numChars*6]; - recipZ = 1.0f/cam->nearPlane; - - u = ((c % this->desc.tileWidth)*this->desc.width_internal + HALFPX) / (float32)this->raster->width; - v = ((c / this->desc.tileWidth)*this->desc.height_internal + HALFPX) / (float32)this->raster->height; - du = this->desc.width_internal/(float32)this->raster->width; - dv = this->desc.height_internal/(float32)this->raster->height; - - vert->setScreenX((float)x); - vert->setScreenY((float)y); - vert->setScreenZ(rw::im2d::GetNearZ()); - vert->setCameraZ(cam->nearPlane); - vert->setRecipCameraZ(recipZ); - vert->setColor(255, 255, 255, 255); - vert->setU(u, recipZ); - vert->setV(v, recipZ); - vert++; - - vert->setScreenX(float(x+this->desc.width_internal)); - vert->setScreenY((float)y); - vert->setScreenZ(rw::im2d::GetNearZ()); - vert->setCameraZ(cam->nearPlane); - vert->setRecipCameraZ(recipZ); - vert->setColor(255, 255, 255, 255); - vert->setU(u+du, recipZ); - vert->setV(v, recipZ); - vert++; - - vert->setScreenX((float)x); - vert->setScreenY(float(y+this->desc.height_internal)); - vert->setScreenZ(rw::im2d::GetNearZ()); - vert->setCameraZ(cam->nearPlane); - vert->setRecipCameraZ(recipZ); - vert->setColor(255, 255, 255, 255); - vert->setU(u, recipZ); - vert->setV(v+dv, recipZ); - vert++; - - vert->setScreenX(float(x+this->desc.width_internal)); - vert->setScreenY(float(y+this->desc.height_internal)); - vert->setScreenZ(rw::im2d::GetNearZ()); - vert->setCameraZ(cam->nearPlane); - vert->setRecipCameraZ(recipZ); - vert->setColor(255, 255, 255, 255); - vert->setU(u+du, recipZ); - vert->setV(v+dv, recipZ); - vert++; - - *ix++ = numChars*4; - *ix++ = numChars*4+1; - *ix++ = numChars*4+2; - *ix++ = numChars*4+2; - *ix++ = numChars*4+1; - *ix++ = numChars*4+3; - - numChars++; -} - -void -Charset::print(const char *str, int32 x, int32 y, bool32 hideSpaces) -{ - this->printBuffered(str, x, y, hideSpaces); - flushBuffer(); -} - -void -Charset::printBuffered(const char *str, int32 x, int32 y, bool32 hideSpaces) -{ - while(*str){ - if(!hideSpaces || *str != ' ') - printChar((uint8)*str, x, y); - x += this->desc.width; - str++; - } -} - -} - -#endif - diff --git a/vendor/librw/src/clump.cpp b/vendor/librw/src/clump.cpp deleted file mode 100644 index f228298..0000000 --- a/vendor/librw/src/clump.cpp +++ /dev/null @@ -1,669 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -#define PLUGIN_ID 2 - -namespace rw { - -int32 Clump::numAllocated; -int32 Atomic::numAllocated; - -PluginList Clump::s_plglist(sizeof(Clump)); -PluginList Atomic::s_plglist(sizeof(Atomic)); - -// -// Clump -// - -Clump* -Clump::create(void) -{ - Clump *clump = (Clump*)rwMalloc(s_plglist.size, MEMDUR_EVENT | ID_CLUMP); - if(clump == nil){ - RWERROR((ERR_ALLOC, s_plglist.size)); - return nil; - } - numAllocated++; - clump->object.init(Clump::ID, 0); - clump->atomics.init(); - clump->lights.init(); - clump->cameras.init(); - - // World extension - clump->world = nil; - clump->inWorld.init(); - - s_plglist.construct(clump); - return clump; -} - -Clump* -Clump::clone(void) -{ - Clump *clump = Clump::create(); - Frame *root = this->getFrame()->cloneAndLink(); - clump->setFrame(root); - FORLIST(lnk, this->atomics){ - Atomic *a = Atomic::fromClump(lnk); - Atomic *atomic = a->clone(); - atomic->setFrame(a->getFrame()->root); - clump->addAtomic(atomic); - } - this->getFrame()->purgeClone(); - - // World extension - if(this->world) - this->world->addClump(clump); - - s_plglist.copy(clump, this); - return clump; -} - -void -Clump::destroy(void) -{ - Frame *f; - s_plglist.destruct(this); - FORLIST(lnk, this->atomics){ - Atomic *a = Atomic::fromClump(lnk); - this->removeAtomic(a); - a->destroy(); - } - FORLIST(lnk, this->lights){ - Light *l = Light::fromClump(lnk); - this->removeLight(l); - l->destroy(); - } - FORLIST(lnk, this->cameras){ - Camera *c = Camera::fromClump(lnk); - this->removeCamera(c); - c->destroy(); - } - if(f = this->getFrame(), f) - f->destroyHierarchy(); - assert(this->world == nil); - rwFree(this); - numAllocated--; -} - -void -Clump::addAtomic(Atomic *a) -{ - assert(a->clump == nil); - a->clump = this; - this->atomics.append(&a->inClump); -} - -void -Clump::removeAtomic(Atomic *a) -{ - assert(a->clump == this); - a->inClump.remove(); - a->clump = nil; -} - -void -Clump::addLight(Light *l) -{ - assert(l->clump == nil); - l->clump = this; - this->lights.append(&l->inClump); -} - -void -Clump::removeLight(Light *l) -{ - assert(l->clump == this); - l->inClump.remove(); - l->clump = nil; -} - -void -Clump::addCamera(Camera *c) -{ - assert(c->clump == nil); - c->clump = this; - this->cameras.append(&c->inClump); -} - -void -Clump::removeCamera(Camera *c) -{ - assert(c->clump == this); - c->inClump.remove(); - c->clump = nil; -} - - -Clump* -Clump::streamRead(Stream *stream) -{ - uint32 length, version; - int32 buf[3]; - Clump *clump; - int32 numGeometries; - Geometry **geometryList; - - if(!findChunk(stream, ID_STRUCT, &length, &version)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - stream->read32(buf, length); - int32 numAtomics = buf[0]; - int32 numLights = 0; - int32 numCameras = 0; - if(version > 0x33000){ - numLights = buf[1]; - numCameras = buf[2]; - } - clump = Clump::create(); - if(clump == nil) - return nil; - - // Frame list - FrameList_ frmlst; - frmlst.frames = nil; - if(!findChunk(stream, ID_FRAMELIST, nil, nil)){ - RWERROR((ERR_CHUNK, "FRAMELIST")); - goto fail; - } - if(frmlst.streamRead(stream) == nil) - goto fail; - clump->setFrame(frmlst.frames[0]); - - // Geometry list - numGeometries = 0; - geometryList = nil; - if(version >= 0x30400){ - if(!findChunk(stream, ID_GEOMETRYLIST, nil, nil)){ - RWERROR((ERR_CHUNK, "GEOMETRYLIST")); - goto fail; - } - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - goto fail; - } - numGeometries = stream->readI32(); - if(numGeometries){ - size_t sz = numGeometries*sizeof(Geometry*); - geometryList = (Geometry**)rwMalloc(sz, MEMDUR_FUNCTION | ID_CLUMP); - if(geometryList == nil){ - RWERROR((ERR_ALLOC, sz)); - goto fail; - } - memset(geometryList, 0, sz); - } - for(int32 i = 0; i < numGeometries; i++){ - if(!findChunk(stream, ID_GEOMETRY, nil, nil)){ - RWERROR((ERR_CHUNK, "GEOMETRY")); - goto failgeo; - } - geometryList[i] = Geometry::streamRead(stream); - if(geometryList[i] == nil) - goto failgeo; - } - } - - // Atomics - Atomic *a; - for(int32 i = 0; i < numAtomics; i++){ - if(!findChunk(stream, ID_ATOMIC, nil, nil)){ - RWERROR((ERR_CHUNK, "ATOMIC")); - goto failgeo; - } - a = Atomic::streamReadClump(stream, &frmlst, geometryList); - if(a == nil) - goto failgeo; - clump->addAtomic(a); - } - - // Lights - int32 frm; - Light *l; - for(int32 i = 0; i < numLights; i++){ - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - goto failgeo; - } - frm = stream->readI32(); - if(!findChunk(stream, ID_LIGHT, nil, nil)){ - RWERROR((ERR_CHUNK, "LIGHT")); - goto failgeo; - } - l = Light::streamRead(stream); - if(l == nil) - goto failgeo; - l->setFrame(frmlst.frames[frm]); - clump->addLight(l); - } - - // Cameras - Camera *cam; - for(int32 i = 0; i < numCameras; i++){ - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - goto failgeo; - } - frm = stream->readI32(); - if(!findChunk(stream, ID_CAMERA, nil, nil)){ - RWERROR((ERR_CHUNK, "CAMERA")); - goto failgeo; - } - cam = Camera::streamRead(stream); - if(cam == nil) - goto failgeo; - cam->setFrame(frmlst.frames[frm]); - clump->addCamera(cam); - } - - for(int32 i = 0; i < numGeometries; i++) - if(geometryList[i]) - geometryList[i]->destroy(); - rwFree(geometryList); - rwFree(frmlst.frames); - if(s_plglist.streamRead(stream, clump)) - return clump; - -failgeo: - for(int32 i = 0; i < numGeometries; i++) - if(geometryList[i]) - geometryList[i]->destroy(); - rwFree(geometryList); -fail: - rwFree(frmlst.frames); - clump->destroy(); - return nil; -} - -bool -Clump::streamWrite(Stream *stream) -{ - int size = this->streamGetSize(); - writeChunkHeader(stream, ID_CLUMP, size); - int32 numAtomics = this->countAtomics(); - int32 numLights = this->countLights(); - int32 numCameras = this->countCameras(); - int32 buf[3] = { numAtomics, numLights, numCameras }; - size = version > 0x33000 ? 12 : 4; - writeChunkHeader(stream, ID_STRUCT, size); - stream->write32(buf, size); - - FrameList_ frmlst; - frmlst.numFrames = this->getFrame()->count(); - frmlst.frames = (Frame**)rwMalloc(frmlst.numFrames*sizeof(Frame*), MEMDUR_FUNCTION | ID_CLUMP); - makeFrameList(this->getFrame(), frmlst.frames); - frmlst.streamWrite(stream); - - if(rw::version >= 0x30400){ - size = 12+4; - FORLIST(lnk, this->atomics) - size += 12 + Atomic::fromClump(lnk)->geometry->streamGetSize(); - writeChunkHeader(stream, ID_GEOMETRYLIST, size); - writeChunkHeader(stream, ID_STRUCT, 4); - stream->writeI32(numAtomics); // same as numGeometries - FORLIST(lnk, this->atomics) - Atomic::fromClump(lnk)->geometry->streamWrite(stream); - } - - FORLIST(lnk, this->atomics) - Atomic::fromClump(lnk)->streamWriteClump(stream, &frmlst); - - FORLIST(lnk, this->lights){ - Light *l = Light::fromClump(lnk); - int frm = findPointer(l->getFrame(), (void**)frmlst.frames, frmlst.numFrames); - if(frm < 0) - return false; - writeChunkHeader(stream, ID_STRUCT, 4); - stream->writeI32(frm); - l->streamWrite(stream); - } - - FORLIST(lnk, this->cameras){ - Camera *c = Camera::fromClump(lnk); - int frm = findPointer(c->getFrame(), (void**)frmlst.frames, frmlst.numFrames); - if(frm < 0) - return false; - writeChunkHeader(stream, ID_STRUCT, 4); - stream->writeI32(frm); - c->streamWrite(stream); - } - - rwFree(frmlst.frames); - - s_plglist.streamWrite(stream, this); - return true; -} - -uint32 -Clump::streamGetSize(void) -{ - uint32 size = 0; - size += 12; // Struct - size += 4; // numAtomics - if(version > 0x33000) - size += 8; // numLights, numCameras - - // Frame list - size += FrameList_::streamGetSize(this->getFrame()); - - if(rw::version >= 0x30400){ - // Geometry list - size += 12 + 12 + 4; - FORLIST(lnk, this->atomics) - size += 12 + Atomic::fromClump(lnk)->geometry->streamGetSize(); - } - - // Atomics - FORLIST(lnk, this->atomics) - size += 12 + Atomic::fromClump(lnk)->streamGetSize(); - - // Lights - FORLIST(lnk, this->lights) - size += 16 + 12 + Light::fromClump(lnk)->streamGetSize(); - - // Cameras - FORLIST(lnk, this->cameras) - size += 16 + 12 + Camera::fromClump(lnk)->streamGetSize(); - - size += 12 + s_plglist.streamGetSize(this); - return size; -} - -void -Clump::render(void) -{ - Atomic *a; - FORLIST(lnk, this->atomics){ - a = Atomic::fromClump(lnk); - if(a->object.object.flags & Atomic::RENDER) - a->render(); - } -} - -// -// Atomic -// - -static void -atomicSync(ObjectWithFrame *obj) -{ - // TODO: interpolate - obj->object.privateFlags |= Atomic::WORLDBOUNDDIRTY; -} - - -static void -worldAtomicSync(ObjectWithFrame *obj) -{ - Atomic *atomic = (Atomic*)obj; - atomic->originalSync(obj); -} - -Atomic* -Atomic::create(void) -{ - Atomic *atomic = (Atomic*)rwMalloc(s_plglist.size, MEMDUR_EVENT | ID_ATOMIC); - if(atomic == nil){ - RWERROR((ERR_ALLOC, s_plglist.size)); - return nil; - } - numAllocated++; - atomic->object.object.init(Atomic::ID, 0); - atomic->object.syncCB = atomicSync; - atomic->geometry = nil; - atomic->boundingSphere.center.set(0.0f, 0.0f, 0.0f); - atomic->boundingSphere.radius = 0.0f; - atomic->worldBoundingSphere.center.set(0.0f, 0.0f, 0.0f); - atomic->worldBoundingSphere.radius = 0.0f; - atomic->setFrame(nil); - atomic->object.object.privateFlags |= WORLDBOUNDDIRTY; - atomic->clump = nil; - atomic->inClump.init(); - atomic->pipeline = nil; - atomic->renderCB = Atomic::defaultRenderCB; - atomic->object.object.flags = Atomic::COLLISIONTEST | Atomic::RENDER; - // TODO: interpolator - - // World extension - atomic->world = nil; - atomic->originalSync = atomic->object.syncCB; - atomic->object.syncCB = worldAtomicSync; - - s_plglist.construct(atomic); - return atomic; -} - -Atomic* -Atomic::clone() -{ - Atomic *atomic = Atomic::create(); - if(atomic == nil) - return nil; - atomic->object.object.copy(&this->object.object); - atomic->object.object.privateFlags |= WORLDBOUNDDIRTY; - if(this->geometry) - atomic->setGeometry(this->geometry, 0); - atomic->renderCB = this->renderCB; - atomic->pipeline = this->pipeline; - - // World extension doesn't add to world - - s_plglist.copy(atomic, this); - return atomic; -} - -void -Atomic::destroy(void) -{ - s_plglist.destruct(this); - if(this->geometry) - this->geometry->destroy(); - assert(this->clump == nil); - assert(this->world == nil); - this->setFrame(nil); - rwFree(this); - numAllocated--; -} - -void -Atomic::setGeometry(Geometry *geo, uint32 flags) -{ - if(this->geometry) - this->geometry->destroy(); - if(geo) - geo->addRef(); - this->geometry = geo; - if(flags & SAMEBOUNDINGSPHERE) - return; - if(geo){ - this->boundingSphere = geo->morphTargets[0].boundingSphere; - if(this->getFrame()) // TODO: && getWorld??? - this->getFrame()->updateObjects(); - } -} - -Sphere* -Atomic::getWorldBoundingSphere(void) -{ - Sphere *s = &this->worldBoundingSphere; - // TODO: if we ever support morphing, check interpolation - if(!this->getFrame()->dirty() && - (this->object.object.privateFlags & WORLDBOUNDDIRTY) == 0) - return s; - Matrix *ltm = this->getFrame()->getLTM(); - // TODO: support scaling - V3d::transformPoints(&s->center, &this->boundingSphere.center, 1, ltm); - s->radius = this->boundingSphere.radius; - this->object.object.privateFlags &= ~WORLDBOUNDDIRTY; - return s; -} - -static uint32 atomicRights[2]; - -Atomic* -Atomic::streamReadClump(Stream *stream, - FrameList_ *frameList, Geometry **geometryList) -{ - int32 buf[4]; - uint32 version; - if(!findChunk(stream, ID_STRUCT, nil, &version)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - stream->read32(buf, version < 0x30400 ? 12 : 16); - Atomic *atomic = Atomic::create(); - if(atomic == nil) - return nil; - atomic->setFrame(frameList->frames[buf[0]]); - Geometry *g; - if(version < 0x30400){ - if(!findChunk(stream, ID_GEOMETRY, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - goto fail; - } - g = Geometry::streamRead(stream); - if(g == nil) - goto fail; - atomic->setGeometry(g, 0); - g->destroy(); - }else - atomic->setGeometry(geometryList[buf[1]], 0); - atomic->object.object.flags = buf[2]; - - atomicRights[0] = 0; - if(!s_plglist.streamRead(stream, atomic)) - goto fail; - if(atomicRights[0]) - s_plglist.assertRights(atomic, atomicRights[0], atomicRights[1]); - return atomic; - -fail: - atomic->destroy(); - return nil; -} - -bool -Atomic::streamWriteClump(Stream *stream, FrameList_ *frmlst) -{ - int32 buf[4] = { 0, 0, 0, 0 }; - Clump *c = this->clump; - if(c == nil) - return false; - writeChunkHeader(stream, ID_ATOMIC, this->streamGetSize()); - writeChunkHeader(stream, ID_STRUCT, rw::version < 0x30400 ? 12 : 16); - buf[0] = findPointer(this->getFrame(), (void**)frmlst->frames, frmlst->numFrames); - - if(version < 0x30400){ - buf[1] = this->object.object.flags; - stream->write32(buf, sizeof(int32[3])); - this->geometry->streamWrite(stream); - }else{ - buf[1] = 0; - FORLIST(lnk, c->atomics){ - if(Atomic::fromClump(lnk)->geometry == this->geometry) - goto foundgeo; - buf[1]++; - } - return false; - foundgeo: - buf[2] = this->object.object.flags; - stream->write32(buf, sizeof(buf)); - } - - s_plglist.streamWrite(stream, this); - return true; -} - -uint32 -Atomic::streamGetSize(void) -{ - uint32 size = 12 + 12 + 12 + s_plglist.streamGetSize(this); - if(rw::version < 0x30400) - size += 12 + this->geometry->streamGetSize(); - else - size += 4; - return size; -} - -ObjPipeline* -Atomic::getPipeline(void) -{ - return this->pipeline ? - this->pipeline : - engine->driver[platform]->defaultPipeline; -} - -void -Atomic::instance(void) -{ - if(this->geometry->flags & Geometry::NATIVE) - return; - this->getPipeline()->instance(this); - this->geometry->flags |= Geometry::NATIVE; -} - -void -Atomic::uninstance(void) -{ - if(!(this->geometry->flags & Geometry::NATIVE)) - return; - this->getPipeline()->uninstance(this); - // this should be done by the CB already, just make sure - this->geometry->flags &= ~Geometry::NATIVE; -} - -void -Atomic::defaultRenderCB(Atomic *atomic) -{ - atomic->getPipeline()->render(atomic); -} - -// Atomic Rights plugin - -static Stream* -readAtomicRights(Stream *stream, int32, void *, int32, int32) -{ - stream->read32(atomicRights, 8); - return stream; -} - -static Stream* -writeAtomicRights(Stream *stream, int32, void *object, int32, int32) -{ - Atomic *atomic = (Atomic*)object; - uint32 buffer[2]; - buffer[0] = atomic->pipeline->pluginID; - buffer[1] = atomic->pipeline->pluginData; - stream->write32(buffer, 8); - return stream; -} - -static int32 -getSizeAtomicRights(void *object, int32, int32) -{ - Atomic *atomic = (Atomic*)object; - if(atomic->pipeline == nil || atomic->pipeline->pluginID == 0) - return 0; - return 8; -} - -void -registerAtomicRightsPlugin(void) -{ - Atomic::registerPlugin(0, ID_RIGHTTORENDER, nil, nil, nil); - Atomic::registerPluginStream(ID_RIGHTTORENDER, - readAtomicRights, - writeAtomicRights, - getSizeAtomicRights); -} - -} diff --git a/vendor/librw/src/d3d/d3d.cpp b/vendor/librw/src/d3d/d3d.cpp deleted file mode 100644 index 55608a5..0000000 --- a/vendor/librw/src/d3d/d3d.cpp +++ /dev/null @@ -1,1087 +0,0 @@ -#include -#include -#include -#include - -#define WITH_D3D -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#include "rwd3d.h" -#include "rwd3dimpl.h" - -#define PLUGIN_ID ID_DRIVER - -namespace rw { -namespace d3d { - -bool32 isP8supported = 1; - -// stolen from d3d8to9 -static uint32 -calculateTextureSize(uint32 width, uint32 height, uint32 depth, uint32 format) -{ -#define D3DFMT_W11V11U10 65 - switch(format){ - default: - case D3DFMT_UNKNOWN: - return 0; - case D3DFMT_R3G3B2: - case D3DFMT_A8: - case D3DFMT_P8: - case D3DFMT_L8: - case D3DFMT_A4L4: - return width * height * depth; - case D3DFMT_R5G6B5: - case D3DFMT_X1R5G5B5: - case D3DFMT_A1R5G5B5: - case D3DFMT_A4R4G4B4: - case D3DFMT_A8R3G3B2: - case D3DFMT_X4R4G4B4: - case D3DFMT_A8P8: - case D3DFMT_A8L8: - case D3DFMT_V8U8: - case D3DFMT_L6V5U5: - case D3DFMT_D16_LOCKABLE: - case D3DFMT_D15S1: - case D3DFMT_D16: - case D3DFMT_UYVY: - case D3DFMT_YUY2: - return width * 2 * height * depth; - case D3DFMT_R8G8B8: - return width * 3 * height * depth; - case D3DFMT_A8R8G8B8: - case D3DFMT_X8R8G8B8: - case D3DFMT_A2B10G10R10: - case D3DFMT_A8B8G8R8: - case D3DFMT_X8B8G8R8: - case D3DFMT_G16R16: - case D3DFMT_X8L8V8U8: - case D3DFMT_Q8W8V8U8: - case D3DFMT_V16U16: - case D3DFMT_W11V11U10: - case D3DFMT_A2W10V10U10: - case D3DFMT_D32: - case D3DFMT_D24S8: - case D3DFMT_D24X8: - case D3DFMT_D24X4S4: - return width * 4 * height * depth; - case D3DFMT_DXT1: - assert(depth <= 1); - return ((width + 3) >> 2) * ((height + 3) >> 2) * 8; - case D3DFMT_DXT2: - case D3DFMT_DXT3: - case D3DFMT_DXT4: - case D3DFMT_DXT5: - assert(depth <= 1); - return ((width + 3) >> 2) * ((height + 3) >> 2) * 16; - } -} - -int vertFormatMap[] = { - -1, VERT_FLOAT2, VERT_FLOAT3, VERT_FLOAT4, VERT_ARGB, VERT_RGBA /* blend indices */ -}; - -void* -createIndexBuffer(uint32 length, bool dynamic) -{ -#ifdef RW_D3D9 - IDirect3DIndexBuffer9 *ibuf; - if(dynamic) - d3ddevice->CreateIndexBuffer(length, D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &ibuf, 0); - else - d3ddevice->CreateIndexBuffer(length, D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &ibuf, 0); - if(ibuf) - d3d9Globals.numIndexBuffers++; - return ibuf; -#else - return rwNewT(uint8, length, MEMDUR_EVENT | ID_DRIVER); -#endif -} - -void -destroyIndexBuffer(void *indexBuffer) -{ -#ifdef RW_D3D9 - if(indexBuffer){ - if(((IUnknown*)indexBuffer)->Release() != 0) - printf("indexBuffer wasn't destroyed\n"); - d3d9Globals.numIndexBuffers--; - } -#else - rwFree(indexBuffer); -#endif -} - -uint16* -lockIndices(void *indexBuffer, uint32 offset, uint32 size, uint32 flags) -{ - if(indexBuffer == nil) - return nil; -#ifdef RW_D3D9 - uint16 *indices; - IDirect3DIndexBuffer9 *ibuf = (IDirect3DIndexBuffer9*)indexBuffer; - ibuf->Lock(offset, size, (void**)&indices, flags); - return indices; -#else - (void)offset; - (void)size; - (void)flags; - return (uint16*)indexBuffer; -#endif -} - -void -unlockIndices(void *indexBuffer) -{ - if(indexBuffer == nil) - return; -#ifdef RW_D3D9 - IDirect3DIndexBuffer9 *ibuf = (IDirect3DIndexBuffer9*)indexBuffer; - ibuf->Unlock(); -#endif -} - -void* -createVertexBuffer(uint32 length, uint32 fvf, bool dynamic) -{ -#ifdef RW_D3D9 - IDirect3DVertexBuffer9 *vbuf; - if(dynamic) - d3ddevice->CreateVertexBuffer(length, D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, fvf, D3DPOOL_DEFAULT, &vbuf, 0); - else - d3ddevice->CreateVertexBuffer(length, D3DUSAGE_WRITEONLY, fvf, D3DPOOL_MANAGED, &vbuf, 0); - if(vbuf) - d3d9Globals.numVertexBuffers++; - return vbuf; -#else - (void)fvf; - return rwNewT(uint8, length, MEMDUR_EVENT | ID_DRIVER); -#endif -} - -void -destroyVertexBuffer(void *vertexBuffer) -{ -#ifdef RW_D3D9 - if(vertexBuffer){ - if(((IUnknown*)vertexBuffer)->Release() != 0) - printf("vertexBuffer wasn't destroyed\n"); - d3d9Globals.numVertexBuffers--; - } -#else - rwFree(vertexBuffer); -#endif -} - -uint8* -lockVertices(void *vertexBuffer, uint32 offset, uint32 size, uint32 flags) -{ - if(vertexBuffer == nil) - return nil; -#ifdef RW_D3D9 - uint8 *verts; - IDirect3DVertexBuffer9 *vertbuf = (IDirect3DVertexBuffer9*)vertexBuffer; - vertbuf->Lock(offset, size, (void**)&verts, flags); - return verts; -#else - (void)offset; - (void)size; - (void)flags; - return (uint8*)vertexBuffer; -#endif -} - -void -unlockVertices(void *vertexBuffer) -{ - if(vertexBuffer == nil) - return; -#ifdef RW_D3D9 - IDirect3DVertexBuffer9 *vertbuf = (IDirect3DVertexBuffer9*)vertexBuffer; - vertbuf->Unlock(); -#endif -} - -void* -createTexture(int32 width, int32 height, int32 numlevels, uint32 usage, uint32 format) -{ -#ifdef RW_D3D9 - IDirect3DTexture9 *tex; - d3ddevice->CreateTexture(width, height, numlevels, usage, - (D3DFORMAT)format, D3DPOOL_MANAGED, &tex, nil); - if(tex) - d3d9Globals.numTextures++; - return tex; -#else - int32 w = width; - int32 h = height; - int32 size = 0; - for(int32 i = 0; i < numlevels; i++){ - size += calculateTextureSize(w, h, 1, format); - w /= 2; - if(w == 0) w = 1; - h /= 2; - if(h == 0) h = 1; - } - uint8 *data = (uint8*)rwNew(sizeof(RasterLevels)+sizeof(RasterLevels::Level)*(numlevels-1)+size, - MEMDUR_EVENT | ID_DRIVER); - RasterLevels *levels = (RasterLevels*)data; - data += sizeof(RasterLevels)+sizeof(RasterLevels::Level)*(numlevels-1); - levels->numlevels = numlevels; - levels->format = format; - w = width; - h = height; - for(int32 i = 0; i < numlevels; i++){ - levels->levels[i].width = w; - levels->levels[i].height = h; - levels->levels[i].data = data; - levels->levels[i].size = calculateTextureSize(w, h, 1, format); - data += levels->levels[i].size; - w /= 2; - if(w == 0) w = 1; - h /= 2; - if(h == 0) h = 1; - } - return levels; -#endif -} - -void -destroyTexture(void *texture) -{ -#ifdef RW_D3D9 - if(texture){ - if(((IUnknown*)texture)->Release() != 0) - printf("texture wasn't destroyed\n"); - d3d9Globals.numTextures--; - } -#else - rwFree(texture); -#endif -} - -// Native Raster - -int32 nativeRasterOffset; - -struct RasterFormatInfo -{ - uint32 d3dformat; - int32 depth; - bool32 hasAlpha; - uint32 rwFormat; -}; - -// indexed directly by RW format -static RasterFormatInfo formatInfoRW[16] = { - { 0, 0, 0, 0}, - { D3DFMT_A1R5G5B5, 16, 1, Raster::C1555 }, - { D3DFMT_R5G6B5, 16, 0, Raster::C565 }, - { D3DFMT_A4R4G4B4, 16, 1, Raster::C4444 }, - { D3DFMT_L8, 8, 0, Raster::LUM8 }, - { D3DFMT_A8R8G8B8, 32, 1, Raster::C8888 }, - { D3DFMT_X8R8G8B8, 32, 0, Raster::C888 }, - { D3DFMT_D16, 16, 0, Raster::D16 }, - { D3DFMT_D24X8, 32, 0, Raster::D24 }, - { D3DFMT_D32, 32, 0, Raster::D32 }, - { D3DFMT_X1R5G5B5, 16, 0, Raster::C555 }, -}; - -static RasterFormatInfo formatInfoFull[] = { - { D3DFMT_R8G8B8, 0, 24, 0 }, - { D3DFMT_A8R8G8B8, 1, 32, Raster::C8888 }, - { D3DFMT_X8R8G8B8, 0, 32, Raster::C888 }, - { D3DFMT_R5G6B5, 0, 16, Raster::C565 }, - { D3DFMT_X1R5G5B5, 0, 16, Raster::C555 }, - { D3DFMT_A1R5G5B5, 1, 16, Raster::C1555 }, - { D3DFMT_A4R4G4B4, 1, 16, Raster::C4444 }, - { D3DFMT_R3G3B2, 0, 8, 0 }, - { D3DFMT_A8, 1, 8, 0 }, - { D3DFMT_A8R3G3B2, 1, 16, 0 }, - { D3DFMT_X4R4G4B4, 0, 16, 0 }, - { D3DFMT_A2B10G10R10, 1, 32, 0 }, - { D3DFMT_A8B8G8R8, 1, 32, 0 }, - { D3DFMT_X8B8G8R8, 0, 32, 0 }, - { D3DFMT_G16R16, 0, 32, 0 }, - { D3DFMT_A2R10G10B10, 1, 32, 0 }, - { D3DFMT_A16B16G16R16, 1, 64, 0 }, - { D3DFMT_A8P8, 1, 16, 0 }, -// { D3DFMT_P8, 0, 8, ... }, -// { D3DFMT_L8, 0, 8, ... }, - { D3DFMT_A8L8, 1, 16, 0 }, - { D3DFMT_A4L4, 1, 8, 0 }, - { D3DFMT_V8U8, 0, 16, 0 }, - { D3DFMT_L6V5U5, 0, 16, 0 }, - { D3DFMT_X8L8V8U8, 0, 32, 0 }, - { D3DFMT_Q8W8V8U8, 0, 32, 0 }, - { D3DFMT_V16U16, 0, 32, 0 }, - { D3DFMT_A2W10V10U10, 1, 32, 0 }, - { D3DFMT_D16_LOCKABLE, 0, 16, Raster::D16 }, - { D3DFMT_D32, 0, 32, Raster::D32 }, - { D3DFMT_D15S1, 0, 16, Raster::D16 }, - { D3DFMT_D24S8, 0, 32, Raster::D32 }, - { D3DFMT_D24X8, 0, 32, Raster::D32 }, - { D3DFMT_D24X4S4, 0, 32, Raster::D32 }, - { D3DFMT_D16, 0, 16, Raster::D16 }, - { D3DFMT_D32F_LOCKABLE, 0, 32, Raster::D32 }, - { D3DFMT_D24FS8, 0, 32, Raster::D32 }, - { D3DFMT_L16, 0, 16, 0 }, - { D3DFMT_Q16W16V16U16, 0, 64, 0 }, - { D3DFMT_R16F, 0, 16, 0 }, - { D3DFMT_G16R16F, 0, 32, 0 }, - { D3DFMT_A16B16G16R16F, 1, 64, 0 }, - { D3DFMT_R32F, 0, 32, 0 }, - { D3DFMT_G32R32F, 0, 64, 0 }, - { D3DFMT_A32B32G32R32F, 1, 128, 0 }, - { D3DFMT_CxV8U8, 0, 16, 0 }, -}; - -RasterFormatInfo* -findFormatInfoD3D(uint32 d3dformat) -{ - static RasterFormatInfo fake = { 0, 0, 0, 0 }; - int i; - for(i = 0; i < (int)nelem(formatInfoFull); i++) - if(formatInfoFull[i].d3dformat == d3dformat) - return &formatInfoFull[i]; - return &fake; -} - - -static void -rasterSetFormat(Raster *raster) -{ - if(raster->format == 0){ - // have to find a format first - // this could perhaps be a bit more intelligent - - switch(raster->type){ - case Raster::NORMAL: - case Raster::TEXTURE: - raster->format = Raster::C8888; - break; - -#ifdef RW_D3D9 - case Raster::ZBUFFER: - // TODO: allow other formats - raster->format = findFormatInfoD3D(d3d9Globals.present.AutoDepthStencilFormat)->rwFormat; - // can this even happen? just do something... - if(raster->format == 0) - raster->format = Raster::D32; - break; - - case Raster::CAMERATEXTURE: -// let's not use this because we apparently don't want alpha -// raster->format = findFormatInfoD3D(d3d9Globals.present.BackBufferFormat)->rwFormat; - raster->format = findFormatInfoD3D(d3d9Globals.startMode.mode.Format)->rwFormat; - // can this even happen? just do something... - if(raster->format == 0) - raster->format = Raster::C888; - break; - case Raster::CAMERA: - raster->format = findFormatInfoD3D(d3d9Globals.present.BackBufferFormat)->rwFormat; - // can this even happen? just do something... - if(raster->format == 0) - raster->format = Raster::C8888; - break; -#endif - } - } - - - D3dRaster *natras = GETD3DRASTEREXT(raster); - if(raster->format & (Raster::PAL4 | Raster::PAL8)){ - // TODO: do we even allow PAL4? - natras->format = D3DFMT_P8; - raster->depth = 8; - }else{ - natras->format = formatInfoRW[(raster->format >> 8) & 0xF].d3dformat; - raster->depth = formatInfoRW[(raster->format >> 8) & 0xF].depth; - } - natras->bpp = raster->depth/8; - natras->hasAlpha = formatInfoRW[(raster->format >> 8) & 0xF].hasAlpha; - raster->stride = raster->width*natras->bpp; - - natras->autogenMipmap = (raster->format & (Raster::MIPMAP|Raster::AUTOMIPMAP)) == (Raster::MIPMAP|Raster::AUTOMIPMAP); -} - -static Raster* -rasterCreateTexture(Raster *raster) -{ - int32 levels; - D3dRaster *natras = GETD3DRASTEREXT(raster); - - if(natras->format == D3DFMT_P8) - natras->palette = (uint8*)rwNew(4*256, MEMDUR_EVENT | ID_DRIVER); - if(natras->autogenMipmap) - levels = 0; - else if(raster->format & Raster::MIPMAP) - levels = Raster::calculateNumLevels(raster->width, raster->height); - else - levels = 1; - - assert(natras->texture == nil); - natras->texture = createTexture(raster->width, raster->height, - levels, - natras->autogenMipmap ? D3DUSAGE_AUTOGENMIPMAP : 0, - natras->format); - if(natras->texture == nil){ - RWERROR((ERR_NOTEXTURE)); - return nil; - } - return raster; -} - -#ifdef RW_D3D9 - -static Raster* -rasterCreateCameraTexture(Raster *raster) -{ - if(raster->format & (Raster::PAL4 | Raster::PAL8)){ - RWERROR((ERR_NOTEXTURE)); - return nil; - } - - int32 levels; - D3dRaster *natras = GETD3DRASTEREXT(raster); - if(natras->autogenMipmap) - levels = 0; - else if(raster->format & Raster::MIPMAP) - levels = Raster::calculateNumLevels(raster->width, raster->height); - else - levels = 1; - - IDirect3DTexture9 *tex; - d3ddevice->CreateTexture(raster->width, raster->height, - levels, - (natras->autogenMipmap ? D3DUSAGE_AUTOGENMIPMAP : 0) | D3DUSAGE_RENDERTARGET, - (D3DFORMAT)natras->format, D3DPOOL_DEFAULT, &tex, nil); - assert(natras->texture == nil); - natras->texture = tex; - if(natras->texture == nil){ - RWERROR((ERR_NOTEXTURE)); - return nil; - } - d3d9Globals.numTextures++; - addVidmemRaster(raster); - return raster; -} - -static Raster* -rasterCreateCamera(Raster *raster) -{ - D3dRaster *natras = GETD3DRASTEREXT(raster); - - natras->autogenMipmap = 0; - - natras->format = d3d9Globals.present.BackBufferFormat; - raster->depth = findFormatDepth(natras->format); - - natras->texture = nil; // global default render target - return raster; -} - -static Raster* -rasterCreateZbuffer(Raster *raster) -{ - D3dRaster *natras = GETD3DRASTEREXT(raster); - - natras->autogenMipmap = 0; - - // TODO: allow other formats - natras->format = d3d9Globals.present.AutoDepthStencilFormat; - raster->depth = findFormatDepth(natras->format); - - RECT rect; - GetClientRect(d3d9Globals.window, &rect); - // This check is done by RW but it's rather strange... - if(rect.right == raster->width && rect.bottom == raster->height) - natras->texture = d3d9Globals.defaultDepthSurf; - else{ - IDirect3DSurface9 *surf = nil; - d3ddevice->CreateDepthStencilSurface(raster->width, raster->height, (D3DFORMAT)natras->format, - d3d9Globals.present.MultiSampleType, d3d9Globals.present.MultiSampleQuality, - FALSE, &surf, nil); - assert(natras->texture == nil); - natras->texture = surf; - if(natras->texture == nil){ - RWERROR((ERR_NOTEXTURE)); - return nil; - } - } - addVidmemRaster(raster); - - return raster; -} -#endif - -Raster* -rasterCreate(Raster *raster) -{ - rasterSetFormat(raster); - - Raster *ret = raster; - - if(raster->width == 0 || raster->height == 0){ - raster->flags |= Raster::DONTALLOCATE; - raster->stride = 0; - goto ret; - } - if(raster->flags & Raster::DONTALLOCATE) - goto ret; - - switch(raster->type){ - case Raster::NORMAL: - case Raster::TEXTURE: - ret = rasterCreateTexture(raster); - break; - -#ifdef RW_D3D9 - case Raster::CAMERATEXTURE: - ret = rasterCreateCameraTexture(raster); - break; - case Raster::ZBUFFER: - ret = rasterCreateZbuffer(raster); - break; - case Raster::CAMERA: - ret = rasterCreateCamera(raster); - break; -#endif - - default: - RWERROR((ERR_INVRASTER)); - return nil; - } - -ret: - raster->originalWidth = raster->width; - raster->originalHeight = raster->height; - raster->originalStride = raster->stride; - raster->originalPixels = raster->pixels; - return ret; -} - -uint8* -rasterLock(Raster *raster, int32 level, int32 lockMode) -{ - D3dRaster *natras = GETD3DRASTEREXT(raster); - - // check if already locked - if(raster->privateFlags & (Raster::PRIVATELOCK_READ|Raster::PRIVATELOCK_WRITE)) - return nil; - -#ifdef RW_D3D9 - DWORD flags = D3DLOCK_NOSYSLOCK; - if(lockMode & Raster::LOCKREAD) - flags |= D3DLOCK_READONLY | D3DLOCK_NO_DIRTY_UPDATE; - IDirect3DTexture9 *tex = (IDirect3DTexture9*)natras->texture; - IDirect3DSurface9 *surf, *rt; - D3DLOCKED_RECT lr; - - switch(raster->type){ - case Raster::NORMAL: - case Raster::TEXTURE: { - tex->GetSurfaceLevel(level, &surf); - natras->lockedSurf = surf; - HRESULT res = surf->LockRect(&lr, 0, flags); - assert(res == D3D_OK); - break; - } - - case Raster::CAMERATEXTURE: - case Raster::CAMERA: { - if(lockMode & Raster::PRIVATELOCK_WRITE) - assert(0 && "can't lock framebuffer for writing"); - if(raster->type == Raster::CAMERA) - rt = d3d9Globals.defaultRenderTarget; - else - tex->GetSurfaceLevel(level, &rt); - D3DSURFACE_DESC desc; - rt->GetDesc(&desc); - HRESULT res = d3ddevice->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &surf, nil); - if(res != D3D_OK) - return nil; - d3ddevice->GetRenderTargetData(rt, surf); - natras->lockedSurf = surf; - res = surf->LockRect(&lr, 0, flags); - assert(res == D3D_OK); - break; - } - - default: - assert(0 && "can't lock this raster type (yet)"); - } - - raster->pixels = (uint8*)lr.pBits; - raster->width >>= level; - raster->height >>= level; - raster->stride = lr.Pitch; - if(raster->width == 0) raster->width = 1; - if(raster->height == 0) raster->height = 1; -#else - RasterLevels *levels = (RasterLevels*)natras->texture; - raster->pixels = levels->levels[level].data; - raster->width = levels->levels[level].width; - raster->height = levels->levels[level].height; - raster->stride = raster->width*natras->bpp; -#endif - if(lockMode & Raster::LOCKREAD) raster->privateFlags |= Raster::PRIVATELOCK_READ; - if(lockMode & Raster::LOCKWRITE) raster->privateFlags |= Raster::PRIVATELOCK_WRITE; - - return raster->pixels; -} - -void -rasterUnlock(Raster *raster, int32 level) -{ -#if RW_D3D9 - D3dRaster *natras = GETD3DRASTEREXT(raster); - IDirect3DSurface9 *surf = (IDirect3DSurface9*)natras->lockedSurf; - surf->UnlockRect(); - surf->Release(); - natras->lockedSurf = nil; -#endif - raster->width = raster->originalWidth; - raster->height = raster->originalHeight; - raster->stride = raster->originalStride; - raster->pixels = raster->originalPixels; - - raster->privateFlags &= ~(Raster::PRIVATELOCK_READ|Raster::PRIVATELOCK_WRITE); -} - -int32 -rasterNumLevels(Raster *raster) -{ - D3dRaster *natras = GETD3DRASTEREXT(raster); -#ifdef RW_D3D9 - IDirect3DTexture9 *tex = (IDirect3DTexture9*)natras->texture; - return tex->GetLevelCount(); -#else - RasterLevels *levels = (RasterLevels*)natras->texture; - return levels->numlevels; -#endif -} - -// Almost the same as ps2 and gl3 function -bool32 -imageFindRasterFormat(Image *img, int32 type, - int32 *pWidth, int32 *pHeight, int32 *pDepth, int32 *pFormat) -{ - int32 width, height, depth, format; - - assert((type&0xF) == Raster::TEXTURE); - -// for(width = 1; width < img->width; width <<= 1); -// for(height = 1; height < img->height; height <<= 1); - // Perhaps non-power-of-2 textures are acceptable? - width = img->width; - height = img->height; - - depth = img->depth; - - if(depth <= 8 && !isP8supported) - depth = 32; - - switch(depth){ - case 32: - if(img->hasAlpha()) - format = Raster::C8888; - else{ - format = Raster::C888; - depth = 24; - } - break; - case 24: - format = Raster::C888; - break; - case 16: - format = Raster::C1555; - break; - case 8: - format = Raster::PAL8 | Raster::C8888; - break; - case 4: - format = Raster::PAL4 | Raster::C8888; - break; - default: - RWERROR((ERR_INVRASTER)); - return 0; - } - - format |= type; - - *pWidth = width; - *pHeight = height; - *pDepth = depth; - *pFormat = format; - - return 1; -} - -bool32 -rasterFromImage(Raster *raster, Image *image) -{ - if((raster->type&0xF) != Raster::TEXTURE) - return 0; - - void (*conv)(uint8 *out, uint8 *in) = nil; - - // Unpalettize image if necessary but don't change original - Image *truecolimg = nil; - if(image->depth <= 8 && !isP8supported){ - truecolimg = Image::create(image->width, image->height, image->depth); - truecolimg->pixels = image->pixels; - truecolimg->stride = image->stride; - truecolimg->palette = image->palette; - truecolimg->unpalettize(); - image = truecolimg; - } - - D3dRaster *natras = GETD3DRASTEREXT(raster); - int32 format = raster->format&(Raster::PAL8 | Raster::PAL4 | 0xF00); - switch(image->depth){ - case 32: - if(format == Raster::C8888) - conv = conv_BGRA8888_from_RGBA8888; - else if(format == Raster::C888) - conv = conv_BGR888_from_RGB888; - else - goto err; - break; - case 24: - if(format == Raster::C8888) - conv = conv_BGRA8888_from_RGB888; - else if(format == Raster::C888) - conv = conv_BGR888_from_RGB888; - else - goto err; - break; - case 16: - if(format == Raster::C1555) - conv = conv_ARGB1555_from_ARGB1555; - else - goto err; - break; - case 8: - if(format == (Raster::PAL8 | Raster::C8888)) - conv = conv_8_from_8; - else - goto err; - break; - case 4: - if(format == (Raster::PAL4 | Raster::C8888) || - format == (Raster::PAL8 | Raster::C8888)) - conv = conv_8_from_8; - else - goto err; - break; - default: - err: -fprintf(stderr, "%d %x\n", image->depth, format); fflush(stdout); - RWERROR((ERR_INVRASTER)); - return 0; - } - - uint8 *in, *out; - int pallength = 0; - if(raster->format & Raster::PAL4) - pallength = 16; - else if(raster->format & Raster::PAL8) - pallength = 256; - if(pallength){ - in = image->palette; - out = (uint8*)natras->palette; - for(int32 i = 0; i < pallength; i++){ - conv_RGBA8888_from_RGBA8888(out, in); - in += 4; - out += 4; - } - } - - bool unlock = false; - if(raster->pixels == nil){ - raster->lock(0, Raster::LOCKWRITE|Raster::LOCKNOFETCH); - unlock = true; - } - - uint8 *pixels = raster->pixels; - assert(pixels); - uint8 *imgpixels = image->pixels; - - int x, y; - assert(image->width == raster->width); - assert(image->height == raster->height); - for(y = 0; y < image->height; y++){ - uint8 *imgrow = imgpixels; - uint8 *rasrow = pixels; - for(x = 0; x < image->width; x++){ - conv(rasrow, imgrow); - imgrow += image->bpp; - rasrow += natras->bpp; - } - imgpixels += image->stride; - pixels += raster->stride; - } - if(unlock) - raster->unlock(0); - - if(truecolimg) - truecolimg->destroy(); - - return 1; -} - -Image* -rasterToImage(Raster *raster) -{ - int32 depth; - Image *image; - - bool unlock = false; - if(raster->pixels == nil){ - raster->lock(0, Raster::LOCKREAD); - unlock = true; - } - - D3dRaster *natras = GETD3DRASTEREXT(raster); - if(natras->customFormat){ - int w = raster->width; - int h = raster->height; - // pixels are in the upper right corner - if(w < 4) w = 4; - if(h < 4) h = 4; - image = Image::create(w, h, 32); - image->allocate(); - uint8 *pix = raster->pixels; - switch(natras->format){ - case D3DFMT_DXT1: - image->setPixelsDXT(1, pix); - if((raster->format & 0xF00) == Raster::C565) - image->removeMask(); - break; - case D3DFMT_DXT3: - image->setPixelsDXT(3, pix); - break; - case D3DFMT_DXT5: - image->setPixelsDXT(5, pix); - break; - default: - image->destroy(); - if(unlock) - raster->unlock(0); - return nil; - } - // fix it up again - image->width = raster->width; - image->height = raster->height; - - if(unlock) - raster->unlock(0); - return image; - } - - void (*conv)(uint8 *out, uint8 *in) = nil; - switch(raster->format & 0xF00){ - case Raster::C1555: - depth = 16; - conv = conv_ARGB1555_from_ARGB1555; - break; - case Raster::C8888: - depth = 32; - conv = conv_RGBA8888_from_BGRA8888; - break; - case Raster::C888: - depth = 24; - conv = conv_RGB888_from_BGR888; - break; - case Raster::C555: - depth = 16; - conv = conv_ARGB1555_from_RGB555; - break; - - default: - case Raster::C565: - case Raster::C4444: - case Raster::LUM8: - RWERROR((ERR_INVRASTER)); - return nil; - } - int32 pallength = 0; - if((raster->format & Raster::PAL4) == Raster::PAL4){ - depth = 4; - pallength = 16; - }else if((raster->format & Raster::PAL8) == Raster::PAL8){ - depth = 8; - pallength = 256; - } - - uint8 *in, *out; - image = Image::create(raster->width, raster->height, depth); - image->allocate(); - - if(pallength){ - out = image->palette; - in = (uint8*)natras->palette; - for(int32 i = 0; i < pallength; i++){ - conv_RGBA8888_from_RGBA8888(out, in); - in += 4; - out += 4; - } - } - - uint8 *imgpixels = image->pixels; - uint8 *pixels = raster->pixels; - - int x, y; - assert(image->width == raster->width); - assert(image->height == raster->height); - for(y = 0; y < image->height; y++){ - uint8 *imgrow = imgpixels; - uint8 *rasrow = pixels; - for(x = 0; x < image->width; x++){ - conv(imgrow, rasrow); - imgrow += image->bpp; - rasrow += natras->bpp; - } - imgpixels += image->stride; - pixels += raster->stride; - } - image->compressPalette(); - - if(unlock) - raster->unlock(0); - - return image; -} - -int32 -getLevelSize(Raster *raster, int32 level) -{ - D3dRaster *ras = GETD3DRASTEREXT(raster); -#ifdef RW_D3D9 - IDirect3DTexture9 *tex = (IDirect3DTexture9*)ras->texture; - D3DSURFACE_DESC desc; - tex->GetLevelDesc(level, &desc); - return calculateTextureSize(desc.Width, desc.Height, 1, desc.Format); -#else - RasterLevels *levels = (RasterLevels*)ras->texture; - return levels->levels[level].size; -#endif -} - -void -allocateDXT(Raster *raster, int32 dxt, int32 numLevels, bool32 hasAlpha) -{ - static uint32 dxtMap[] = { - 0x31545844, // DXT1 - 0x32545844, // DXT2 - 0x33545844, // DXT3 - 0x34545844, // DXT4 - 0x35545844, // DXT5 - }; - D3dRaster *ras = GETD3DRASTEREXT(raster); - ras->format = dxtMap[dxt-1]; - ras->hasAlpha = hasAlpha; - ras->customFormat = 1; - if(ras->autogenMipmap) - numLevels = 0; - else if(raster->format & Raster::MIPMAP) - {} - else - numLevels = 1; - ras->texture = createTexture(raster->width, raster->height, - numLevels, - ras->autogenMipmap ? D3DUSAGE_AUTOGENMIPMAP : 0, - ras->format); - raster->flags &= ~Raster::DONTALLOCATE; -} - -void -setPalette(Raster *raster, void *palette, int32 size) -{ - D3dRaster *ras = GETD3DRASTEREXT(raster); - memcpy(ras->palette, palette, 4*size); -} - -void -setTexels(Raster *raster, void *texels, int32 level) -{ - uint8 *dst = raster->lock(level, Raster::LOCKWRITE|Raster::LOCKNOFETCH); - memcpy(dst, texels, getLevelSize(raster, level)); - raster->unlock(level); -} - -static void* -createNativeRaster(void *object, int32 offset, int32) -{ - D3dRaster *raster = PLUGINOFFSET(D3dRaster, object, offset); - raster->texture = nil; - raster->palette = nil; - raster->lockedSurf = nil; - raster->format = 0; - raster->hasAlpha = 0; - raster->customFormat = 0; - return object; -} - -static void* -destroyNativeRaster(void *object, int32 offset, int32) -{ - Raster *raster = (Raster*)object; - D3dRaster *natras = PLUGINOFFSET(D3dRaster, raster, offset); -#ifdef RW_D3D9 - removeVidmemRaster(raster); - evictD3D9Raster(raster); -#endif - switch(raster->type){ - case Raster::NORMAL: - case Raster::TEXTURE: - case Raster::CAMERATEXTURE: - destroyTexture(natras->texture); - break; - - case Raster::ZBUFFER: -#ifdef RW_D3D9 - if(raster->flags & Raster::DONTALLOCATE) - break; - if(natras->texture != d3d9Globals.defaultDepthSurf) - ((IDirect3DSurface9*)natras->texture)->Release(); - natras->texture = nil; -#endif - break; - case Raster::CAMERA: - break; - } - rwFree(natras->palette); - return object; -} - -static void* -copyNativeRaster(void *dst, void *, int32 offset, int32) -{ - D3dRaster *raster = PLUGINOFFSET(D3dRaster, dst, offset); - raster->texture = nil; - raster->palette = nil; - raster->lockedSurf = nil; - raster->format = 0; - raster->hasAlpha = 0; - raster->customFormat = 0; - return dst; -} - -void -registerNativeRaster(void) -{ - nativeRasterOffset = Raster::registerPlugin(sizeof(D3dRaster), - ID_RASTERD3D9, - createNativeRaster, - destroyNativeRaster, - copyNativeRaster); -} - -} -} diff --git a/vendor/librw/src/d3d/d3d8.cpp b/vendor/librw/src/d3d/d3d8.cpp deleted file mode 100644 index 78bef2d..0000000 --- a/vendor/librw/src/d3d/d3d8.cpp +++ /dev/null @@ -1,677 +0,0 @@ -#include -#include -#include -#include - -#define WITH_D3D -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#include "rwd3d.h" -#include "rwd3d8.h" - -#include "rwd3dimpl.h" - -#define PLUGIN_ID 2 - -namespace rw { -namespace d3d8 { -using namespace d3d; - -static void* -driverOpen(void *o, int32, int32) -{ - engine->driver[PLATFORM_D3D8]->defaultPipeline = makeDefaultPipeline(); - - engine->driver[PLATFORM_D3D8]->rasterNativeOffset = nativeRasterOffset; - engine->driver[PLATFORM_D3D8]->rasterCreate = rasterCreate; - engine->driver[PLATFORM_D3D8]->rasterLock = rasterLock; - engine->driver[PLATFORM_D3D8]->rasterUnlock = rasterUnlock; - engine->driver[PLATFORM_D3D8]->rasterNumLevels = rasterNumLevels; - engine->driver[PLATFORM_D3D8]->imageFindRasterFormat = imageFindRasterFormat; - engine->driver[PLATFORM_D3D8]->rasterFromImage = rasterFromImage; - engine->driver[PLATFORM_D3D8]->rasterToImage = rasterToImage; - return o; -} - -static void* -driverClose(void *o, int32, int32) -{ - return o; -} - -void -registerPlatformPlugins(void) -{ - Driver::registerPlugin(PLATFORM_D3D8, 0, PLATFORM_D3D8, - driverOpen, driverClose); - // shared between D3D8 and 9 - if(nativeRasterOffset == 0) - registerNativeRaster(); -} - -uint32 -makeFVFDeclaration(uint32 flags, int32 numTex) -{ - uint32 fvf = 0x2; - if(flags & Geometry::NORMALS) - fvf |= 0x10; - if(flags & Geometry::PRELIT) - fvf |= 0x40; - fvf |= numTex << 8; - return fvf; -} - -int32 -getStride(uint32 flags, int32 numTex) -{ - int32 stride = 12; - if(flags & Geometry::NORMALS) - stride += 12;; - if(flags & Geometry::PRELIT) - stride += 4; - stride += numTex*8; - return stride; -} - -void* -destroyNativeData(void *object, int32, int32) -{ - Geometry *geometry = (Geometry*)object; - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_D3D8) - return object; - InstanceDataHeader *header = - (InstanceDataHeader*)geometry->instData; - geometry->instData = nil; - InstanceData *inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - destroyIndexBuffer(inst->indexBuffer); - destroyVertexBuffer(inst->vertexBuffer); - inst++; - } - rwFree(header->inst); - rwFree(header); - return object; -} - -Stream* -readNativeData(Stream *stream, int32, void *object, int32, int32) -{ - ASSERTLITTLE; - Geometry *geometry = (Geometry*)object; - uint32 platform; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - platform = stream->readU32(); - if(platform != PLATFORM_D3D8){ - RWERROR((ERR_PLATFORM, platform)); - return nil; - } - InstanceDataHeader *header = rwNewT(InstanceDataHeader, 1, MEMDUR_EVENT | ID_GEOMETRY); - geometry->instData = header; - header->platform = PLATFORM_D3D8; - - int32 size = stream->readI32(); - uint8 *data = rwNewT(uint8, size, MEMDUR_FUNCTION | ID_GEOMETRY); - stream->read8(data, size); - uint8 *p = data; - header->serialNumber = *(uint16*)p; p += 2; - header->numMeshes = *(uint16*)p; p += 2; - header->inst = rwNewT(InstanceData, header->numMeshes, MEMDUR_EVENT | ID_GEOMETRY); - - InstanceData *inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - inst->minVert = *(uint32*)p; p += 4; - inst->stride = *(uint32*)p; p += 4; - inst->numVertices = *(uint32*)p; p += 4; - inst->numIndices = *(uint32*)p; p += 4; - uint32 matid = *(uint32*)p; p += 4; - inst->material = geometry->matList.materials[matid]; - inst->vertexShader = *(uint32*)p; p += 4; - inst->primType = *(uint32*)p; p += 4; - inst->indexBuffer = nil; p += 4; - inst->vertexBuffer = nil; p += 4; - inst->baseIndex = 0; p += 4; - inst->vertexAlpha = *p++; - inst->managed = 0; p++; - inst->remapped = 0; p++; // TODO: really unused? and what's that anyway? - inst++; - } - rwFree(data); - - inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - assert(inst->indexBuffer == nil); - inst->indexBuffer = createIndexBuffer(inst->numIndices*2, false); - uint16 *indices = lockIndices(inst->indexBuffer, 0, 0, 0); - stream->read8(indices, 2*inst->numIndices); - unlockIndices(inst->indexBuffer); - - inst->managed = 1; - assert(inst->vertexBuffer == nil); - inst->vertexBuffer = createVertexBuffer(inst->stride*inst->numVertices, 0, false); - uint8 *verts = lockVertices(inst->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK); - stream->read8(verts, inst->stride*inst->numVertices); - unlockVertices(inst->vertexBuffer); - - inst++; - } - return stream; -} - -Stream* -writeNativeData(Stream *stream, int32 len, void *object, int32, int32) -{ - ASSERTLITTLE; - Geometry *geometry = (Geometry*)object; - writeChunkHeader(stream, ID_STRUCT, len-12); - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_D3D8) - return stream; - stream->writeU32(PLATFORM_D3D8); - InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - - int32 size = 4 + geometry->meshHeader->numMeshes*0x2C; - uint8 *data = rwNewT(uint8, size, MEMDUR_FUNCTION | ID_GEOMETRY); - stream->writeI32(size); - uint8 *p = data; - *(uint16*)p = header->serialNumber; p += 2; - *(uint16*)p = header->numMeshes; p += 2; - - InstanceData *inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - *(uint32*)p = inst->minVert; p += 4; - *(uint32*)p = inst->stride; p += 4; - *(uint32*)p = inst->numVertices; p += 4; - *(uint32*)p = inst->numIndices; p += 4; - int32 matid = geometry->matList.findIndex(inst->material); - *(int32*)p = matid; p += 4; - *(uint32*)p = inst->vertexShader; p += 4; - *(uint32*)p = inst->primType; p += 4; - *(uint32*)p = 0; p += 4; // index buffer - *(uint32*)p = 0; p += 4; // vertex buffer - *(uint32*)p = inst->baseIndex; p += 4; - *p++ = inst->vertexAlpha; - *p++ = inst->managed; - *p++ = inst->remapped; - inst++; - } - stream->write8(data, size); - rwFree(data); - - inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - uint16 *indices = lockIndices(inst->indexBuffer, 0, 0, 0); - stream->write8(indices, 2*inst->numIndices); - unlockIndices(inst->indexBuffer); - - uint8 *verts = lockVertices(inst->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK); - stream->write8(verts, inst->stride*inst->numVertices); - unlockVertices(inst->vertexBuffer); - inst++; - } - return stream; -} - -int32 -getSizeNativeData(void *object, int32, int32) -{ - Geometry *geometry = (Geometry*)object; - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_D3D8) - return 0; - - InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - InstanceData *inst = header->inst; - int32 size = 12 + 4 + 4 + 4 + header->numMeshes*0x2C; - for(int32 i = 0; i < header->numMeshes; i++){ - size += inst->numIndices*2 + inst->numVertices*inst->stride; - inst++; - } - return size; -} - -void -registerNativeDataPlugin(void) -{ - Geometry::registerPlugin(0, ID_NATIVEDATA, - nil, destroyNativeData, nil); - Geometry::registerPluginStream(ID_NATIVEDATA, - readNativeData, - writeNativeData, - getSizeNativeData); -} - - -static void -instance(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - // TODO: allow for REINSTANCE - if(geo->instData) - return; - InstanceDataHeader *header = rwNewT(InstanceDataHeader, 1, MEMDUR_EVENT | ID_GEOMETRY); - MeshHeader *meshh = geo->meshHeader; - geo->instData = header; - header->platform = PLATFORM_D3D8; - - header->serialNumber = meshh->serialNum; - header->numMeshes = meshh->numMeshes; - header->inst = rwNewT(InstanceData, header->numMeshes, MEMDUR_EVENT | ID_GEOMETRY); - - InstanceData *inst = header->inst; - Mesh *mesh = meshh->getMeshes(); - for(uint32 i = 0; i < header->numMeshes; i++){ - findMinVertAndNumVertices(mesh->indices, mesh->numIndices, - &inst->minVert, &inst->numVertices); - inst->numIndices = mesh->numIndices; - inst->material = mesh->material; - inst->vertexShader = 0; - inst->primType = meshh->flags == 1 ? D3DPT_TRIANGLESTRIP : D3DPT_TRIANGLELIST; - inst->vertexBuffer = nil; - inst->baseIndex = 0; // (maybe) not used by us - inst->vertexAlpha = 0; - inst->managed = 0; - inst->remapped = 0; - - inst->indexBuffer = createIndexBuffer(inst->numIndices*2, false); - uint16 *indices = lockIndices(inst->indexBuffer, 0, 0, 0); - if(inst->minVert == 0) - memcpy(indices, mesh->indices, inst->numIndices*2); - else - for(int32 j = 0; j < inst->numIndices; j++) - indices[j] = mesh->indices[j] - inst->minVert; - unlockIndices(inst->indexBuffer); - - pipe->instanceCB(geo, inst); - mesh++; - inst++; - } -} - -static void -uninstance(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - if((geo->flags & Geometry::NATIVE) == 0) - return; - assert(geo->instData != nil); - assert(geo->instData->platform == PLATFORM_D3D8); - geo->numTriangles = geo->meshHeader->guessNumTriangles(); - geo->allocateData(); - geo->allocateMeshes(geo->meshHeader->numMeshes, geo->meshHeader->totalIndices, 0); - - InstanceDataHeader *header = (InstanceDataHeader*)geo->instData; - InstanceData *inst = header->inst; - Mesh *mesh = geo->meshHeader->getMeshes(); - for(uint32 i = 0; i < header->numMeshes; i++){ - uint16 *indices = lockIndices(inst->indexBuffer, 0, 0, 0); - if(inst->minVert == 0) - memcpy(mesh->indices, indices, inst->numIndices*2); - else - for(int32 j = 0; j < inst->numIndices; j++) - mesh->indices[j] = indices[j] + inst->minVert; - unlockIndices(inst->indexBuffer); - - pipe->uninstanceCB(geo, inst); - mesh++; - inst++; - } - geo->generateTriangles(); - geo->flags &= ~Geometry::NATIVE; - destroyNativeData(geo, 0, 0); -} - -static void -render(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - // TODO: allow for REINSTANCE - if(geo->instData == nil) - pipe->instance(atomic); - assert(geo->instData != nil); - assert(geo->instData->platform == PLATFORM_D3D8); - if(pipe->renderCB) - pipe->renderCB(atomic, (InstanceDataHeader*)geo->instData); -} - -void -ObjPipeline::init(void) -{ - this->rw::ObjPipeline::init(PLATFORM_D3D8); - this->impl.instance = d3d8::instance; - this->impl.uninstance = d3d8::uninstance; - this->impl.render = d3d8::render; - this->instanceCB = nil; - this->uninstanceCB = nil; - this->renderCB = nil; -} - -ObjPipeline* -ObjPipeline::create(void) -{ - ObjPipeline *pipe = rwNewT(ObjPipeline, 1, MEMDUR_GLOBAL); - pipe->init(); - return pipe; -} - -void -defaultInstanceCB(Geometry *geo, InstanceData *inst) -{ - inst->vertexShader = makeFVFDeclaration(geo->flags, geo->numTexCoordSets); - inst->stride = getStride(geo->flags, geo->numTexCoordSets); - - assert(inst->vertexBuffer == nil); - inst->vertexBuffer = createVertexBuffer(inst->numVertices*inst->stride, - inst->vertexShader, false); - inst->managed = 1; - - uint8 *dst = lockVertices(inst->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK); - instV3d(VERT_FLOAT3, dst, - &geo->morphTargets[0].vertices[inst->minVert], - inst->numVertices, inst->stride); - dst += 12; - - if(geo->flags & Geometry::NORMALS){ - instV3d(VERT_FLOAT3, dst, - &geo->morphTargets[0].normals[inst->minVert], - inst->numVertices, inst->stride); - dst += 12; - } - - inst->vertexAlpha = 0; - if(geo->flags & Geometry::PRELIT){ - inst->vertexAlpha = instColor(VERT_ARGB, dst, &geo->colors[inst->minVert], - inst->numVertices, inst->stride); - dst += 4; - } - - for(int32 i = 0; i < geo->numTexCoordSets; i++){ - instTexCoords(VERT_FLOAT2, dst, &geo->texCoords[i][inst->minVert], - inst->numVertices, inst->stride); - dst += 8; - } - unlockVertices(inst->vertexBuffer); -} - -void -defaultUninstanceCB(Geometry *geo, InstanceData *inst) -{ - uint8 *src = lockVertices(inst->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK); - uninstV3d(VERT_FLOAT3, - &geo->morphTargets[0].vertices[inst->minVert], - src, inst->numVertices, inst->stride); - src += 12; - - if(geo->flags & Geometry::NORMALS){ - uninstV3d(VERT_FLOAT3, - &geo->morphTargets[0].normals[inst->minVert], - src, inst->numVertices, inst->stride); - src += 12; - } - - inst->vertexAlpha = 0; - if(geo->flags & Geometry::PRELIT){ - uninstColor(VERT_ARGB, &geo->colors[inst->minVert], src, - inst->numVertices, inst->stride); - src += 4; - } - - for(int32 i = 0; i < geo->numTexCoordSets; i++){ - uninstTexCoords(VERT_FLOAT2, &geo->texCoords[i][inst->minVert], src, - inst->numVertices, inst->stride); - src += 8; - } - unlockVertices(inst->vertexBuffer); -} - -ObjPipeline* -makeDefaultPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->instanceCB = defaultInstanceCB; - pipe->uninstanceCB = defaultUninstanceCB; - pipe->renderCB = defaultRenderCB; - return pipe; -} - -// Native Texture and Raster - -// only handles 4 and 8 bit textures right now -Raster* -readAsImage(Stream *stream, int32 width, int32 height, int32 depth, int32 format, int32 numLevels) -{ - uint8 palette[256*4]; - int32 pallen = 0; - uint8 *data = nil; - - Image *img = Image::create(width, height, 32); - img->allocate(); - - if(format & Raster::PAL4){ - pallen = 16; - stream->read8(palette, 4*32); - }else if(format & Raster::PAL8){ - pallen = 256; - stream->read8(palette, 4*256); - } - if(!Raster::formatHasAlpha(format)) - for(int32 i = 0; i < pallen; i++) - palette[i*4+3] = 0xFF; - - Raster *ras = nil; - - for(int i = 0; i < numLevels; i++){ - uint32 size = stream->readU32(); - - // don't read levels that don't exist - if(ras && i >= ras->getNumLevels()){ - stream->seek(size); - continue; - } - - // one allocation is enough, first level is largest - if(data == nil) - data = rwNewT(uint8, size, MEMDUR_FUNCTION | ID_IMAGE); - stream->read8(data, size); - - if(ras){ - ras->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH); - img->width = ras->width; - img->height = ras->height; - img->stride = img->width*img->bpp; - } - - if(format & (Raster::PAL4 | Raster::PAL8)){ - uint8 *idx = data; - uint8 *pixels = img->pixels; - for(int y = 0; y < img->height; y++){ - uint8 *line = pixels; - for(int x = 0; x < img->width; x++){ - line[0] = palette[*idx*4+0]; - line[1] = palette[*idx*4+1]; - line[2] = palette[*idx*4+2]; - line[3] = palette[*idx*4+3]; - line += img->bpp; - idx++; - } - pixels += img->stride; - } - } - - if(ras == nil){ - // Important to have filled the image with data - int32 newformat; - Raster::imageFindRasterFormat(img, format&7, &width, &height, &depth, &newformat); - newformat |= format & (Raster::MIPMAP | Raster::AUTOMIPMAP); - ras = Raster::create(width, height, depth, newformat); - ras->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH); - } - - ras->setFromImage(img); - ras->unlock(i); - } - - rwFree(data); - img->destroy(); - return ras; -} - -Texture* -readNativeTexture(Stream *stream) -{ - uint32 platform; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - platform = stream->readU32(); - if(platform != PLATFORM_D3D8){ - RWERROR((ERR_PLATFORM, platform)); - return nil; - } - Texture *tex = Texture::create(nil); - if(tex == nil) - return nil; - - // Texture - tex->filterAddressing = stream->readU32(); - stream->read8(tex->name, 32); - stream->read8(tex->mask, 32); - - // Raster - uint32 format = stream->readU32(); - bool32 hasAlpha = stream->readI32(); - int32 width = stream->readU16(); - int32 height = stream->readU16(); - int32 depth = stream->readU8(); - int32 numLevels = stream->readU8(); - int32 type = stream->readU8(); - int32 compression = stream->readU8(); - - int32 pallength = 0; - if(format & Raster::PAL4 || format & Raster::PAL8){ - pallength = format & Raster::PAL4 ? 32 : 256; - if(!d3d::isP8supported){ - tex->raster = readAsImage(stream, width, height, depth, format|type, numLevels); - return tex; - } - } - - Raster *raster; - D3dRaster *ras; - if(compression){ - raster = Raster::create(width, height, depth, format | type | Raster::DONTALLOCATE, PLATFORM_D3D8); - ras = GETD3DRASTEREXT(raster); - allocateDXT(raster, compression, numLevels, hasAlpha); - ras->customFormat = 1; - }else{ - raster = Raster::create(width, height, depth, format | type, PLATFORM_D3D8); - ras = GETD3DRASTEREXT(raster); - } - tex->raster = raster; - - // TODO: check if format supported and convert if necessary - - if(pallength != 0) - stream->read8(ras->palette, 4*pallength); - - uint32 size; - uint8 *data; - for(int32 i = 0; i < numLevels; i++){ - size = stream->readU32(); - if(i < raster->getNumLevels()){ - data = raster->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH); - stream->read8(data, size); - raster->unlock(i); - }else - stream->seek(size); - } - return tex; -} - -void -writeNativeTexture(Texture *tex, Stream *stream) -{ - int32 chunksize = getSizeNativeTexture(tex); - writeChunkHeader(stream, ID_STRUCT, chunksize-12); - stream->writeU32(PLATFORM_D3D8); - - // Texture - stream->writeU32(tex->filterAddressing); - stream->write8(tex->name, 32); - stream->write8(tex->mask, 32); - - // Raster - Raster *raster = tex->raster; - D3dRaster *ras = GETD3DRASTEREXT(raster); - int32 numLevels = raster->getNumLevels(); - stream->writeI32(raster->format); - stream->writeI32(ras->hasAlpha); - stream->writeU16(raster->width); - stream->writeU16(raster->height); - stream->writeU8(raster->depth); - stream->writeU8(numLevels); - stream->writeU8(raster->type); - int32 compression = 0; - if(ras->format) - switch(ras->format){ - case 0x31545844: // DXT1 - compression = 1; - break; - case 0x32545844: // DXT2 - compression = 2; - break; - case 0x33545844: // DXT3 - compression = 3; - break; - case 0x34545844: // DXT4 - compression = 4; - break; - case 0x35545844: // DXT5 - compression = 5; - break; - } - stream->writeU8(compression); - - if(raster->format & Raster::PAL4) - stream->write8(ras->palette, 4*32); - else if(raster->format & Raster::PAL8) - stream->write8(ras->palette, 4*256); - - uint32 size; - uint8 *data; - for(int32 i = 0; i < numLevels; i++){ - size = getLevelSize(raster, i); - stream->writeU32(size); - data = raster->lock(i, Raster::LOCKREAD); - stream->write8(data, size); - raster->unlock(i); - } -} - -uint32 -getSizeNativeTexture(Texture *tex) -{ - uint32 size = 12 + 72 + 16; - int32 levels = tex->raster->getNumLevels(); - if(tex->raster->format & Raster::PAL4) - size += 4*32; - else if(tex->raster->format & Raster::PAL8) - size += 4*256; - for(int32 i = 0; i < levels; i++) - size += 4 + getLevelSize(tex->raster, i); - return size; -} - -} -} diff --git a/vendor/librw/src/d3d/d3d8matfx.cpp b/vendor/librw/src/d3d/d3d8matfx.cpp deleted file mode 100644 index 580203e..0000000 --- a/vendor/librw/src/d3d/d3d8matfx.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwanim.h" -#include "../rwengine.h" -#include "../rwplugins.h" -#include "rwd3d.h" -#include "rwd3d8.h" - -namespace rw { -namespace d3d8 { -using namespace d3d; - -static void* -matfxOpen(void *o, int32, int32) -{ - matFXGlobals.pipelines[PLATFORM_D3D8] = makeMatFXPipeline(); - return o; -} - -static void* -matfxClose(void *o, int32, int32) -{ - ((ObjPipeline*)matFXGlobals.pipelines[PLATFORM_D3D8])->destroy(); - matFXGlobals.pipelines[PLATFORM_D3D8] = nil; - return o; -} - -void -initMatFX(void) -{ - Driver::registerPlugin(PLATFORM_D3D8, 0, ID_MATFX, - matfxOpen, matfxClose); -} - -ObjPipeline* -makeMatFXPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->instanceCB = defaultInstanceCB; - pipe->uninstanceCB = defaultUninstanceCB; - pipe->renderCB = defaultRenderCB; - pipe->pluginID = ID_MATFX; - pipe->pluginData = 0; - return pipe; -} - -} -} diff --git a/vendor/librw/src/d3d/d3d8render.cpp b/vendor/librw/src/d3d/d3d8render.cpp deleted file mode 100644 index c5375cb..0000000 --- a/vendor/librw/src/d3d/d3d8render.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include -#include -#include - -#define WITH_D3D -#include "../rwbase.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#include "rwd3d.h" -#include "rwd3d8.h" - -namespace rw { -namespace d3d8 { -using namespace d3d; - -#ifndef RW_D3D9 -void defaultRenderCB(Atomic*, InstanceDataHeader*) {} -#else - -// This is a bit abandoned, use d3d9 instead - -void -defaultRenderCB(Atomic *atomic, InstanceDataHeader *header) -{ - RawMatrix world; - - d3d::lightingCB_Fix(atomic); - - uint32 flags = atomic->geometry->flags; - d3d::setRenderState(D3DRS_LIGHTING, !!(flags & rw::Geometry::LIGHT)); - - Frame *f = atomic->getFrame(); - convMatrix(&world, f->getLTM()); - d3ddevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&world); - - InstanceData *inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - d3d::setTexture(0, inst->material->texture); - d3d::setMaterial(flags, inst->material->color, inst->material->surfaceProps); - - - d3d::setRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL); - d3d::setRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL); - if(flags & Geometry::PRELIT) - d3d::setRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_COLOR1); - else - d3d::setRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL); - - d3ddevice->SetFVF(inst->vertexShader); - setStreamSource(0, (IDirect3DVertexBuffer9*)inst->vertexBuffer, 0, inst->stride); - setIndices((IDirect3DIndexBuffer9*)inst->indexBuffer); - uint32 numPrim = inst->primType == D3DPT_TRIANGLESTRIP ? inst->numIndices-2 : inst->numIndices/3; - d3d::flushCache(); - d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)inst->primType, inst->baseIndex, - 0, inst->numVertices, 0, numPrim); - inst++; - } -} - -#endif -} -} diff --git a/vendor/librw/src/d3d/d3d8skin.cpp b/vendor/librw/src/d3d/d3d8skin.cpp deleted file mode 100644 index d9b0921..0000000 --- a/vendor/librw/src/d3d/d3d8skin.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwanim.h" -#include "../rwengine.h" -#include "../rwplugins.h" -#include "rwd3d.h" -#include "rwd3d8.h" - -namespace rw { -namespace d3d8 { -using namespace d3d; - -static void* -skinOpen(void *o, int32, int32) -{ - skinGlobals.pipelines[PLATFORM_D3D8] = makeSkinPipeline(); - return o; -} - -static void* -skinClose(void *o, int32, int32) -{ - ((ObjPipeline*)skinGlobals.pipelines[PLATFORM_D3D8])->destroy(); - skinGlobals.pipelines[PLATFORM_D3D8] = nil; - return o; -} - -void -initSkin(void) -{ - Driver::registerPlugin(PLATFORM_D3D8, 0, ID_SKIN, - skinOpen, skinClose); -} - -ObjPipeline* -makeSkinPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->instanceCB = defaultInstanceCB; - pipe->uninstanceCB = defaultUninstanceCB; - pipe->renderCB = defaultRenderCB; - pipe->pluginID = ID_SKIN; - pipe->pluginData = 1; - return pipe; -} - -} -} diff --git a/vendor/librw/src/d3d/d3d9.cpp b/vendor/librw/src/d3d/d3d9.cpp deleted file mode 100644 index 851397b..0000000 --- a/vendor/librw/src/d3d/d3d9.cpp +++ /dev/null @@ -1,853 +0,0 @@ -#include -#include -#include -#include - -#define WITH_D3D -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#include "rwd3d.h" -#include "rwd3d9.h" - -#include "rwd3dimpl.h" - -#define PLUGIN_ID 2 - -namespace rw { -namespace d3d9 { -using namespace d3d; - -// TODO: move to header, but not as #define -#ifndef RW_D3D9 -static VertexElement _d3ddec_end = {0xFF,0,D3DDECLTYPE_UNUSED,0,0,0}; -#define D3DDECL_END() _d3ddec_end -#endif - -#define NUMDECLELT 12 - -static void* -driverOpen(void *o, int32, int32) -{ -#ifdef RW_D3D9 - createDefaultShaders(); -#endif - engine->driver[PLATFORM_D3D9]->defaultPipeline = makeDefaultPipeline(); - - engine->driver[PLATFORM_D3D9]->rasterNativeOffset = nativeRasterOffset; - engine->driver[PLATFORM_D3D9]->rasterCreate = rasterCreate; - engine->driver[PLATFORM_D3D9]->rasterLock = rasterLock; - engine->driver[PLATFORM_D3D9]->rasterUnlock = rasterUnlock; - engine->driver[PLATFORM_D3D9]->rasterNumLevels = rasterNumLevels; - engine->driver[PLATFORM_D3D9]->imageFindRasterFormat = imageFindRasterFormat; - engine->driver[PLATFORM_D3D9]->rasterFromImage = rasterFromImage; - engine->driver[PLATFORM_D3D9]->rasterToImage = rasterToImage; - return o; -} - -static void* -driverClose(void *o, int32, int32) -{ -#ifdef RW_D3D9 - destroyDefaultShaders(); -#endif - return o; -} - -void -registerPlatformPlugins(void) -{ - Driver::registerPlugin(PLATFORM_D3D9, 0, PLATFORM_D3D9, - driverOpen, driverClose); - // shared between D3D8 and 9 - if(nativeRasterOffset == 0) - registerNativeRaster(); -} - -void* -createVertexDeclaration(VertexElement *elements) -{ -#ifdef RW_D3D9 - IDirect3DVertexDeclaration9 *decl = 0; - d3ddevice->CreateVertexDeclaration((D3DVERTEXELEMENT9*)elements, &decl); - if(decl) - d3d9Globals.numVertexDeclarations++; - return decl; -#else - int n = 0; - VertexElement *e = (VertexElement*)elements; - while(e[n++].stream != 0xFF) - ; - e = rwNewT(VertexElement, n, MEMDUR_EVENT | ID_DRIVER); - memcpy(e, elements, n*sizeof(VertexElement)); - return e; -#endif -} - -void -destroyVertexDeclaration(void *declaration) -{ -#ifdef RW_D3D9 - if(declaration){ - if(((IUnknown*)declaration)->Release() != 0) - printf("declaration wasn't destroyed\n"); - d3d9Globals.numVertexDeclarations--; - } -#else - rwFree(declaration); -#endif -} - -uint32 -getDeclaration(void *declaration, VertexElement *elements) -{ -#ifdef RW_D3D9 - IDirect3DVertexDeclaration9 *decl = (IDirect3DVertexDeclaration9*)declaration; - UINT numElt; - decl->GetDeclaration((D3DVERTEXELEMENT9*)elements, &numElt); - return numElt; -#else - int n = 0; - VertexElement *e = (VertexElement*)declaration; - while(e[n++].stream != 0xFF) - ; - if(elements) - memcpy(elements, declaration, n*sizeof(VertexElement)); - return n; -#endif -} - -void -freeInstanceData(Geometry *geometry) -{ - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_D3D9) - return; - InstanceDataHeader *header = - (InstanceDataHeader*)geometry->instData; - geometry->instData = nil; - destroyVertexDeclaration(header->vertexDeclaration); - destroyIndexBuffer(header->indexBuffer); - destroyVertexBuffer(header->vertexStream[0].vertexBuffer); - destroyVertexBuffer(header->vertexStream[1].vertexBuffer); - rwFree(header->inst); - rwFree(header); - return; -} - - -void* -destroyNativeData(void *object, int32, int32) -{ - freeInstanceData((Geometry*)object); - return object; -} - -Stream* -readNativeData(Stream *stream, int32, void *object, int32, int32) -{ - ASSERTLITTLE; - Geometry *geometry = (Geometry*)object; - uint32 platform; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - platform = stream->readU32(); - if(platform != PLATFORM_D3D9){ - RWERROR((ERR_PLATFORM, platform)); - return nil; - } - InstanceDataHeader *header = rwNewT(InstanceDataHeader, 1, MEMDUR_EVENT | ID_GEOMETRY); - geometry->instData = header; - header->platform = PLATFORM_D3D9; - - int32 size = stream->readI32(); - uint8 *data = rwNewT(uint8, size, MEMDUR_FUNCTION | ID_GEOMETRY); - stream->read8(data, size); - uint8 *p = data; - header->serialNumber = *(uint32*)p; p += 4; - header->numMeshes = *(uint32*)p; p += 4; - header->indexBuffer = nil; p += 4; - header->primType = *(uint32*)p; p += 4; - p += 16*2; // skip vertex streams, they're repeated with the vertex buffers - header->useOffsets = *(bool32*)p; p += 4; - header->vertexDeclaration = nil; p += 4; - header->totalNumIndex = *(uint32*)p; p += 4; - header->totalNumVertex = *(uint32*)p; p += 4; - header->inst = rwNewT(InstanceData, header->numMeshes, MEMDUR_EVENT | ID_GEOMETRY); - - InstanceData *inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - inst->numIndex = *(uint32*)p; p += 4; - inst->minVert = *(uint32*)p; p += 4; - uint32 matid = *(uint32*)p; p += 4; - inst->material = geometry->matList.materials[matid]; - inst->vertexAlpha = *(bool32*)p; p += 4; - inst->vertexShader = nil; p += 4; - inst->baseIndex = 0; p += 4; - inst->numVertices = *(uint32*)p; p += 4; - inst->startIndex = *(uint32*)p; p += 4; - inst->numPrimitives = *(uint32*)p; p += 4; - inst++; - } - - VertexElement elements[NUMDECLELT]; - uint32 numDeclarations = stream->readU32(); - stream->read8(elements, numDeclarations*8); - header->vertexDeclaration = createVertexDeclaration(elements); - - assert(header->indexBuffer == nil); - header->indexBuffer = createIndexBuffer(header->totalNumIndex*2, false); - uint16 *indices = lockIndices(header->indexBuffer, 0, 0, 0); - stream->read8(indices, 2*header->totalNumIndex); - unlockIndices(header->indexBuffer); - - VertexStream *s; - p = data; - for(int i = 0; i < 2; i++){ - stream->read8(p, 16); - s = &header->vertexStream[i]; - s->vertexBuffer = (void*)(uintptr)*(uint32*)p; p += 4; - s->offset = 0; p += 4; - s->stride = *(uint32*)p; p += 4; - s->geometryFlags = *(uint16*)p; p += 2; - s->managed = *p++; - s->dynamicLock = *p++; - - if(s->vertexBuffer == nil) - continue; - // TODO: use dynamic VB when doing morphing - assert(s->vertexBuffer == nil); - s->vertexBuffer = createVertexBuffer(s->stride*header->totalNumVertex, 0, false); - uint8 *verts = lockVertices(s->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK); - stream->read8(verts, s->stride*header->totalNumVertex); - unlockVertices(s->vertexBuffer); - } - - // TODO: somehow depends on number of streams used (baseIndex = minVert when more than one) - inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - inst->baseIndex = inst->minVert + header->vertexStream[0].offset / header->vertexStream[0].stride; - inst++; - } - - rwFree(data); - return stream; -} - -Stream* -writeNativeData(Stream *stream, int32 len, void *object, int32, int32) -{ - ASSERTLITTLE; - Geometry *geometry = (Geometry*)object; - writeChunkHeader(stream, ID_STRUCT, len-12); - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_D3D9) - return stream; - stream->writeU32(PLATFORM_D3D9); - InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - int32 size = 64 + geometry->meshHeader->numMeshes*36; - uint8 *data = rwNewT(uint8, size, MEMDUR_FUNCTION | ID_GEOMETRY); - stream->writeI32(size); - - uint8 *p = data; - *(uint32*)p = header->serialNumber; p += 4; - *(uint32*)p = header->numMeshes; p += 4; - p += 4; // skip index buffer - *(uint32*)p = header->primType; p += 4; - p += 16*2; // skip vertex streams, they're repeated with the vertex buffers - *(bool32*)p = header->useOffsets; p += 4; - p += 4; // skip vertex declaration - *(uint32*)p = header->totalNumIndex; p += 4; - *(uint32*)p = header->totalNumVertex; p += 4; - - InstanceData *inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - *(uint32*)p = inst->numIndex; p += 4; - *(uint32*)p = inst->minVert; p += 4; - int32 matid = geometry->matList.findIndex(inst->material); - *(int32*)p = matid; p += 4; - *(bool32*)p = inst->vertexAlpha; p += 4; - *(uint32*)p = 0; p += 4; // vertex shader - *(uint32*)p = inst->baseIndex; p += 4; // not used but meh... - *(uint32*)p = inst->numVertices; p += 4; - *(uint32*)p = inst->startIndex; p += 4; - *(uint32*)p = inst->numPrimitives; p += 4; - inst++; - } - stream->write8(data, size); - - VertexElement elements[NUMDECLELT]; - uint32 numElt = getDeclaration(header->vertexDeclaration, elements); - stream->writeU32(numElt); - stream->write8(elements, 8*numElt); - - uint16 *indices = lockIndices(header->indexBuffer, 0, 0, 0); - stream->write8(indices, 2*header->totalNumIndex); - unlockIndices(header->indexBuffer); - - VertexStream *s; - for(int i = 0; i < 2; i++){ - s = &header->vertexStream[i]; - p = data; - *(uint32*)p = s->vertexBuffer ? 0xbadeaffe : 0; p += 4; - *(uint32*)p = s->offset; p += 4; - *(uint32*)p = s->stride; p += 4; - *(uint16*)p = s->geometryFlags; p += 2; - *p++ = s->managed; - *p++ = s->dynamicLock; - stream->write8(data, 16); - - if(s->vertexBuffer == nil) - continue; - uint8 *verts = lockVertices(s->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK); - stream->write8(verts, s->stride*header->totalNumVertex); - unlockVertices(s->vertexBuffer); - } - - rwFree(data); - return stream; -} - -int32 -getSizeNativeData(void *object, int32, int32) -{ - Geometry *geometry = (Geometry*)object; - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_D3D9) - return 0; - InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - int32 size = 12 + 4 + 4 + 64 + header->numMeshes*36; - uint32 numElt = getDeclaration(header->vertexDeclaration, nil); - size += 4 + numElt*8; - size += 2*header->totalNumIndex; - size += 0x10 + header->vertexStream[0].stride*header->totalNumVertex; - size += 0x10 + header->vertexStream[1].stride*header->totalNumVertex; - return size; -} - -void -registerNativeDataPlugin(void) -{ - Geometry::registerPlugin(0, ID_NATIVEDATA, - nil, destroyNativeData, nil); - Geometry::registerPluginStream(ID_NATIVEDATA, - readNativeData, - writeNativeData, - getSizeNativeData); -} - -static InstanceDataHeader* -instanceMesh(rw::ObjPipeline *rwpipe, Geometry *geo) -{ - InstanceDataHeader *header = rwNewT(InstanceDataHeader, 1, MEMDUR_EVENT | ID_GEOMETRY); - MeshHeader *meshh = geo->meshHeader; - header->platform = PLATFORM_D3D9; - - header->serialNumber = meshh->serialNum; - header->numMeshes = meshh->numMeshes; - header->primType = meshh->flags == 1 ? D3DPT_TRIANGLESTRIP : D3DPT_TRIANGLELIST; - header->useOffsets = 0; - header->vertexDeclaration = nil; - header->totalNumVertex = geo->numVertices; - header->totalNumIndex = meshh->totalIndices; - header->inst = rwNewT(InstanceData, header->numMeshes, MEMDUR_EVENT | ID_GEOMETRY); - - header->indexBuffer = createIndexBuffer(header->totalNumIndex*2, false); - - uint16 *indices = lockIndices(header->indexBuffer, 0, 0, 0); - InstanceData *inst = header->inst; - Mesh *mesh = meshh->getMeshes(); - uint32 startindex = 0; - for(uint32 i = 0; i < header->numMeshes; i++){ - findMinVertAndNumVertices(mesh->indices, mesh->numIndices, - &inst->minVert, (int32*)&inst->numVertices); - inst->numIndex = mesh->numIndices; - inst->material = mesh->material; - inst->vertexAlpha = 0; - inst->vertexShader = nil; - inst->baseIndex = inst->minVert; - inst->startIndex = startindex; - inst->numPrimitives = header->primType == D3DPT_TRIANGLESTRIP ? inst->numIndex-2 : inst->numIndex/3; - if(inst->minVert == 0) - memcpy(&indices[inst->startIndex], mesh->indices, inst->numIndex*2); - else - for(uint32 j = 0; j < inst->numIndex; j++) - indices[inst->startIndex+j] = mesh->indices[j] - inst->minVert; - startindex += inst->numIndex; - mesh++; - inst++; - } - unlockIndices(header->indexBuffer); - - memset(&header->vertexStream, 0, 2*sizeof(VertexStream)); - - return header; -} - -static void -instance(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - // don't try to (re)instance native data - if(geo->flags & Geometry::NATIVE) - return; - - InstanceDataHeader *header = (InstanceDataHeader*)geo->instData; - if(geo->instData){ - // Already have instanced data, so check if we have to reinstance - assert(header->platform == PLATFORM_D3D9); - if(header->serialNumber != geo->meshHeader->serialNum){ - // Mesh changed, so reinstance everything - freeInstanceData(geo); - } - } - - // no instance or complete reinstance - if(geo->instData == nil){ - geo->instData = instanceMesh(rwpipe, geo); - pipe->instanceCB(geo, (InstanceDataHeader*)geo->instData, 0); - }else if(geo->lockedSinceInst) - pipe->instanceCB(geo, (InstanceDataHeader*)geo->instData, 1); - - geo->lockedSinceInst = 0; -} - -static void -uninstance(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - if((geo->flags & Geometry::NATIVE) == 0) - return; - assert(geo->instData != nil); - assert(geo->instData->platform == PLATFORM_D3D9); - geo->numTriangles = geo->meshHeader->guessNumTriangles(); - geo->allocateData(); - geo->allocateMeshes(geo->meshHeader->numMeshes, geo->meshHeader->totalIndices, 0); - - InstanceDataHeader *header = (InstanceDataHeader*)geo->instData; - uint16 *indices = lockIndices(header->indexBuffer, 0, 0, 0); - InstanceData *inst = header->inst; - Mesh *mesh = geo->meshHeader->getMeshes(); - for(uint32 i = 0; i < header->numMeshes; i++){ - if(inst->minVert == 0) - memcpy(mesh->indices, &indices[inst->startIndex], inst->numIndex*2); - else - for(uint32 j = 0; j < inst->numIndex; j++) - mesh->indices[j] = indices[inst->startIndex+j] + inst->minVert; - mesh++; - inst++; - } - unlockIndices(header->indexBuffer); - - pipe->uninstanceCB(geo, header); - geo->generateTriangles(); - geo->flags &= ~Geometry::NATIVE; - destroyNativeData(geo, 0, 0); -} - -static void -render(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - pipe->instance(atomic); - assert(geo->instData != nil); - assert(geo->instData->platform == PLATFORM_D3D9); - if(pipe->renderCB) - pipe->renderCB(atomic, (InstanceDataHeader*)geo->instData); -} - -void -ObjPipeline::init(void) -{ - this->rw::ObjPipeline::init(PLATFORM_D3D9); - this->impl.instance = d3d9::instance; - this->impl.uninstance = d3d9::uninstance; - this->impl.render = d3d9::render; - this->instanceCB = nil; - this->uninstanceCB = nil; - this->renderCB = nil; -} - -ObjPipeline* -ObjPipeline::create(void) -{ - ObjPipeline *pipe = rwNewT(ObjPipeline, 1, MEMDUR_GLOBAL); - pipe->init(); - return pipe; -} - -void -defaultInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance) -{ - int i = 0; - VertexElement dcl[NUMDECLELT]; - VertexStream *s = &header->vertexStream[0]; - - bool isPrelit = (geo->flags & Geometry::PRELIT) != 0; - bool hasNormals = (geo->flags & Geometry::NORMALS) != 0; - - // TODO: support both vertex buffers - - if(!reinstance){ - // Create declarations and buffers only the first time - - assert(s->vertexBuffer == nil); - s->offset = 0; - s->managed = 1; - s->geometryFlags = 0; - s->dynamicLock = 0; - - dcl[i].stream = 0; - dcl[i].offset = 0; - dcl[i].type = D3DDECLTYPE_FLOAT3; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_POSITION; - dcl[i].usageIndex = 0; - i++; - uint16 stride = 12; - s->geometryFlags |= 0x2; - - if(isPrelit){ - dcl[i].stream = 0; - dcl[i].offset = stride; - dcl[i].type = D3DDECLTYPE_D3DCOLOR; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_COLOR; - dcl[i].usageIndex = 0; - i++; - s->geometryFlags |= 0x8; - stride += 4; - } - - for(int32 n = 0; n < geo->numTexCoordSets; n++){ - dcl[i].stream = 0; - dcl[i].offset = stride; - dcl[i].type = D3DDECLTYPE_FLOAT2; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_TEXCOORD; - dcl[i].usageIndex = (uint8)n; - i++; - s->geometryFlags |= 0x10 << n; - stride += 8; - } - - if(hasNormals){ - dcl[i].stream = 0; - dcl[i].offset = stride; - dcl[i].type = D3DDECLTYPE_FLOAT3; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_NORMAL; - dcl[i].usageIndex = 0; - i++; - s->geometryFlags |= 0x4; - stride += 12; - } - - // We expect some attributes to always be there, use the constant buffer as fallback - if(!isPrelit){ - dcl[i].stream = 2; - dcl[i].offset = offsetof(VertexConstantData, color); - dcl[i].type = D3DDECLTYPE_D3DCOLOR; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_COLOR; - dcl[i].usageIndex = 0; - i++; - } - if(geo->numTexCoordSets == 0){ - dcl[i].stream = 2; - dcl[i].offset = offsetof(VertexConstantData, texCoors[0]); - dcl[i].type = D3DDECLTYPE_FLOAT2; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_TEXCOORD; - dcl[i].usageIndex = 0; - i++; - } - - dcl[i] = D3DDECL_END(); - s->stride = stride; - - assert(header->vertexDeclaration == nil); - header->vertexDeclaration = createVertexDeclaration((VertexElement*)dcl); - - assert(s->vertexBuffer == nil); - s->vertexBuffer = createVertexBuffer(header->totalNumVertex*s->stride, 0, false); - }else - getDeclaration(header->vertexDeclaration, dcl); - - uint8 *verts = lockVertices(s->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK); - - // Instance vertices - if(!reinstance || geo->lockedSinceInst&Geometry::LOCKVERTICES){ - for(i = 0; dcl[i].usage != D3DDECLUSAGE_POSITION || dcl[i].usageIndex != 0; i++) - ; - instV3d(vertFormatMap[dcl[i].type], verts + dcl[i].offset, - geo->morphTargets[0].vertices, - header->totalNumVertex, - header->vertexStream[dcl[i].stream].stride); - } - - // Instance prelight colors - if(isPrelit && (!reinstance || geo->lockedSinceInst&Geometry::LOCKPRELIGHT)){ - for(i = 0; dcl[i].usage != D3DDECLUSAGE_COLOR || dcl[i].usageIndex != 0; i++) - ; - InstanceData *inst = header->inst; - uint32 n = header->numMeshes; - while(n--){ - uint32 stride = header->vertexStream[dcl[i].stream].stride; - inst->vertexAlpha = instColor(vertFormatMap[dcl[i].type], - verts + dcl[i].offset + stride*inst->minVert, - geo->colors + inst->minVert, - inst->numVertices, - stride); - inst++; - } - } - - // Instance tex coords - for(int32 n = 0; n < geo->numTexCoordSets; n++){ - if(!reinstance || geo->lockedSinceInst&(Geometry::LOCKTEXCOORDS<texCoords[n], - header->totalNumVertex, - header->vertexStream[dcl[i].stream].stride); - } - } - - // Instance normals - if(hasNormals && (!reinstance || geo->lockedSinceInst&Geometry::LOCKNORMALS)){ - for(i = 0; dcl[i].usage != D3DDECLUSAGE_NORMAL || dcl[i].usageIndex != 0; i++) - ; - instV3d(vertFormatMap[dcl[i].type], verts + dcl[i].offset, - geo->morphTargets[0].normals, - header->totalNumVertex, - header->vertexStream[dcl[i].stream].stride); - } - unlockVertices(s->vertexBuffer); -} - -void -defaultUninstanceCB(Geometry *geo, InstanceDataHeader *header) -{ - VertexElement dcl[NUMDECLELT]; - - uint8 *verts[2]; - verts[0] = lockVertices(header->vertexStream[0].vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK); - verts[1] = lockVertices(header->vertexStream[1].vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK); - getDeclaration(header->vertexDeclaration, dcl); - - int i; - for(i = 0; dcl[i].usage != D3DDECLUSAGE_POSITION || dcl[i].usageIndex != 0; i++) - ; - uninstV3d(vertFormatMap[dcl[i].type], - geo->morphTargets[0].vertices, - verts[dcl[i].stream] + dcl[i].offset, - header->totalNumVertex, - header->vertexStream[dcl[i].stream].stride); - - if(geo->flags & Geometry::PRELIT){ - for(i = 0; dcl[i].usage != D3DDECLUSAGE_COLOR || dcl[i].usageIndex != 0; i++) - ; - uninstColor(vertFormatMap[dcl[i].type], - geo->colors, - verts[dcl[i].stream] + dcl[i].offset, - header->totalNumVertex, - header->vertexStream[dcl[i].stream].stride); - } - - for(int32 n = 0; n < geo->numTexCoordSets; n++){ - for(i = 0; dcl[i].usage != D3DDECLUSAGE_TEXCOORD || dcl[i].usageIndex != n; i++) - ; - uninstTexCoords(vertFormatMap[dcl[i].type], - geo->texCoords[n], - verts[dcl[i].stream] + dcl[i].offset, - header->totalNumVertex, - header->vertexStream[dcl[i].stream].stride); - } - - if(geo->flags & Geometry::NORMALS){ - for(i = 0; dcl[i].usage != D3DDECLUSAGE_NORMAL || dcl[i].usageIndex != 0; i++) - ; - uninstV3d(vertFormatMap[dcl[i].type], - geo->morphTargets[0].normals, - verts[dcl[i].stream] + dcl[i].offset, - header->totalNumVertex, - header->vertexStream[dcl[i].stream].stride); - } - - unlockVertices(verts[0]); - unlockVertices(verts[1]); -} - -ObjPipeline* -makeDefaultPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->instanceCB = defaultInstanceCB; - pipe->uninstanceCB = defaultUninstanceCB; - pipe->renderCB = defaultRenderCB_Shader; - return pipe; -} - -// Native Texture and Raster - -Texture* -readNativeTexture(Stream *stream) -{ - uint32 platform; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - platform = stream->readU32(); - if(platform != PLATFORM_D3D9){ - RWERROR((ERR_PLATFORM, platform)); - return nil; - } - Texture *tex = Texture::create(nil); - if(tex == nil) - return nil; - - // Texture - tex->filterAddressing = stream->readU32(); - stream->read8(tex->name, 32); - stream->read8(tex->mask, 32); - - // Raster - int32 format = stream->readI32(); - int32 d3dformat = stream->readI32(); - int32 width = stream->readU16(); - int32 height = stream->readU16(); - int32 depth = stream->readU8(); - int32 numLevels = stream->readU8(); - int32 type = stream->readU8(); -/* -#define HAS_ALPHA (1<<0) -#define IS_CUBE (1<<1) -#define USE_AUTOMIPMAPGEN (1<<2) -#define IS_COMPRESSED (1<<3) -*/ - int32 flags = stream->readU8(); - - Raster *raster; - D3dRaster *ext; - - if(flags & 8){ - // is compressed - assert((flags & 2) == 0 && "Can't have cube maps yet"); - raster = Raster::create(width, height, depth, format | type | Raster::DONTALLOCATE, PLATFORM_D3D9); - assert(raster); - ext = GETD3DRASTEREXT(raster); - ext->format = d3dformat; - ext->hasAlpha = flags & 1; - ext->texture = createTexture(raster->width, raster->height, - raster->format & Raster::MIPMAP ? numLevels : 1, - 0, - ext->format); - assert(ext->texture); - raster->flags &= ~Raster::DONTALLOCATE; - ext->customFormat = 1; - }else if(flags & 2){ - assert(0 && "Can't have cube maps yet"); - }else{ - raster = Raster::create(width, height, depth, format | type, PLATFORM_D3D9); - assert(raster); - ext = GETD3DRASTEREXT(raster); - } - tex->raster = raster; - - // TODO: check if format supported and convert if necessary - - if(raster->format & Raster::PAL4) - stream->read8(ext->palette, 4*32); - else if(raster->format & Raster::PAL8) - stream->read8(ext->palette, 4*256); - - uint32 size; - uint8 *data; - for(int32 i = 0; i < numLevels; i++){ - size = stream->readU32(); - if(i < raster->getNumLevels()){ - data = raster->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH); - stream->read8(data, size); - raster->unlock(i); - }else - stream->seek(size); - } - return tex; -} - -void -writeNativeTexture(Texture *tex, Stream *stream) -{ - int32 chunksize = getSizeNativeTexture(tex); - writeChunkHeader(stream, ID_STRUCT, chunksize-12); - stream->writeU32(PLATFORM_D3D9); - - // Texture - stream->writeU32(tex->filterAddressing); - stream->write8(tex->name, 32); - stream->write8(tex->mask, 32); - - // Raster - Raster *raster = tex->raster; - D3dRaster *ext = GETD3DRASTEREXT(raster); - int32 numLevels = raster->getNumLevels(); - stream->writeI32(raster->format); - stream->writeU32(ext->format); - stream->writeU16(raster->width); - stream->writeU16(raster->height); - stream->writeU8(raster->depth); - stream->writeU8(numLevels); - stream->writeU8(raster->type); - uint8 flags = 0; - if(ext->hasAlpha) - flags |= 1; - // no cube supported yet - if(ext->autogenMipmap) - flags |= 4; - if(ext->customFormat) - flags |= 8; - stream->writeU8(flags); - - if(raster->format & Raster::PAL4) - stream->write8(ext->palette, 4*32); - else if(raster->format & Raster::PAL8) - stream->write8(ext->palette, 4*256); - - uint32 size; - uint8 *data; - for(int32 i = 0; i < numLevels; i++){ - size = getLevelSize(raster, i); - stream->writeU32(size); - data = raster->lock(i, Raster::LOCKREAD); - stream->write8(data, size); - raster->unlock(i); - } -} - -uint32 -getSizeNativeTexture(Texture *tex) -{ - uint32 size = 12 + 72 + 16; - int32 levels = tex->raster->getNumLevels(); - if(tex->raster->format & Raster::PAL4) - size += 4*32; - else if(tex->raster->format & Raster::PAL8) - size += 4*256; - for(int32 i = 0; i < levels; i++) - size += 4 + getLevelSize(tex->raster, i); - return size; -} - -} -} diff --git a/vendor/librw/src/d3d/d3d9matfx.cpp b/vendor/librw/src/d3d/d3d9matfx.cpp deleted file mode 100644 index f4fcfe2..0000000 --- a/vendor/librw/src/d3d/d3d9matfx.cpp +++ /dev/null @@ -1,304 +0,0 @@ -#include -#include -#include -#include - -#define WITH_D3D -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwanim.h" -#include "../rwengine.h" -#include "../rwrender.h" -#include "../rwplugins.h" -#include "rwd3d.h" -#include "rwd3d9.h" - -namespace rw { -namespace d3d9 { -using namespace d3d; - -#ifndef RW_D3D9 -void matfxRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header) {} -#else - -static void *matfx_env_amb_VS; -static void *matfx_env_amb_dir_VS; -static void *matfx_env_all_VS; -static void *matfx_env_PS; -static void *matfx_env_tex_PS; - -enum -{ - VSLOC_texMat = VSLOC_afterLights, - - PSLOC_shininess = 1, - PSLOC_colorClamp = 2 -}; - -void -matfxRender_Default(InstanceDataHeader *header, InstanceData *inst, int32 lightBits) -{ - Material *m = inst->material; - - // Pick a shader - if((lightBits & VSLIGHT_MASK) == 0) - setVertexShader(default_amb_VS); - else if((lightBits & VSLIGHT_MASK) == VSLIGHT_DIRECT) - setVertexShader(default_amb_dir_VS); - else - setVertexShader(default_all_VS); - - SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); - - if(inst->material->texture){ - d3d::setTexture(0, m->texture); - setPixelShader(default_tex_PS); - }else - setPixelShader(default_PS); - - drawInst(header, inst); -} - -static Frame *lastEnvFrame; - -static RawMatrix normal2texcoord = { - { 0.5f, 0.0f, 0.0f }, 0.0f, - { 0.0f, -0.5f, 0.0f }, 0.0f, - { 0.0f, 0.0f, 1.0f }, 0.0f, - { 0.5f, 0.5f, 0.0f }, 1.0f -}; - -void -uploadEnvMatrix(Frame *frame) -{ - Matrix invMat; - if(frame == nil) - frame = engine->currentCamera->getFrame(); - - // cache the matrix across multiple meshes -// can't do it, frame matrix may change -// if(frame == lastEnvFrame) -// return; -// lastEnvFrame = frame; - - RawMatrix envMtx, invMtx; - Matrix::invert(&invMat, frame->getLTM()); - convMatrix(&invMtx, &invMat); - invMtx.pos.set(0.0f, 0.0f, 0.0f); - RawMatrix::mult(&envMtx, &invMtx, &normal2texcoord); - d3ddevice->SetVertexShaderConstantF(VSLOC_texMat, (float*)&envMtx, 4); -} - -void -matfxRender_EnvMap(InstanceDataHeader *header, InstanceData *inst, int32 lightBits, MatFX::Env *env) -{ - Material *m = inst->material; - - if(env->tex == nil || env->coefficient == 0.0f){ - matfxRender_Default(header, inst, lightBits); - return; - } - - d3d::setTexture(1, env->tex); - uploadEnvMatrix(env->frame); - - SetRenderState(SRCBLEND, BLENDONE); - - static float zero[4]; - static float one[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; - struct { - float shininess; - float disableFBA; - float unused[2]; - } fxparams; - fxparams.shininess = env->coefficient; - fxparams.disableFBA = env->fbAlpha ? 0.0f : 1.0f; - d3ddevice->SetPixelShaderConstantF(PSLOC_shininess, (float*)&fxparams, 1); - // This clamps the vertex color below. With it we can achieve both PC and PS2 style matfx - if(MatFX::modulateEnvMap) - d3ddevice->SetPixelShaderConstantF(PSLOC_colorClamp, zero, 1); - else - d3ddevice->SetPixelShaderConstantF(PSLOC_colorClamp, one, 1); - - // Pick a shader - if((lightBits & VSLIGHT_MASK) == 0) - setVertexShader(matfx_env_amb_VS); - else if((lightBits & VSLIGHT_MASK) == VSLIGHT_DIRECT) - setVertexShader(matfx_env_amb_dir_VS); - else - setVertexShader(matfx_env_all_VS); - - bool32 texAlpha = GETD3DRASTEREXT(env->tex->raster)->hasAlpha; - - if(inst->material->texture){ - d3d::setTexture(0, m->texture); - setPixelShader(matfx_env_tex_PS); - }else - setPixelShader(matfx_env_PS); - - SetRenderState(VERTEXALPHA, texAlpha || inst->vertexAlpha || m->color.alpha != 255); - - drawInst(header, inst); - - SetRenderState(SRCBLEND, BLENDSRCALPHA); -} - -void -matfxRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header) -{ - int vsBits; - uint32 flags = atomic->geometry->flags; - setStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer, - 0, header->vertexStream[0].stride); - setIndices((IDirect3DIndexBuffer9*)header->indexBuffer); - setVertexDeclaration((IDirect3DVertexDeclaration9*)header->vertexDeclaration); - - lastEnvFrame = nil; - - vsBits = lightingCB_Shader(atomic); - uploadMatrices(atomic->getFrame()->getLTM()); - - bool normals = !!(atomic->geometry->flags & Geometry::NORMALS); - - InstanceData *inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - Material *m = inst->material; - - setMaterial(flags, m->color, m->surfaceProps); - - MatFX *matfx = MatFX::get(m); - if(matfx == nil) - matfxRender_Default(header, inst, vsBits); - else switch(matfx->type){ - case MatFX::ENVMAP: - if(normals) - matfxRender_EnvMap(header, inst, vsBits, &matfx->fx[0].env); - else - matfxRender_Default(header, inst, vsBits); - break; - case MatFX::NOTHING: - case MatFX::BUMPMAP: - case MatFX::BUMPENVMAP: - case MatFX::DUAL: - case MatFX::UVTRANSFORM: - case MatFX::DUALUVTRANSFORM: - // not supported yet - matfxRender_Default(header, inst, vsBits); - break; - } - - inst++; - } - d3d::setTexture(1, nil); -} - -#define VS_NAME g_vs20_main -#define PS_NAME g_ps20_main - -void -createMatFXShaders(void) -{ - { - static -#include "shaders/matfx_env_amb_VS.h" - matfx_env_amb_VS = createVertexShader((void*)VS_NAME); - assert(matfx_env_amb_VS); - } - { - static -#include "shaders/matfx_env_amb_dir_VS.h" - matfx_env_amb_dir_VS = createVertexShader((void*)VS_NAME); - assert(matfx_env_amb_dir_VS); - } - { - static -#include "shaders/matfx_env_all_VS.h" - matfx_env_all_VS = createVertexShader((void*)VS_NAME); - assert(matfx_env_all_VS); - } - - - { - static -#include "shaders/matfx_env_PS.h" - matfx_env_PS = createPixelShader((void*)PS_NAME); - assert(matfx_env_PS); - } - { - static -#include "shaders/matfx_env_tex_PS.h" - matfx_env_tex_PS = createPixelShader((void*)PS_NAME); - assert(matfx_env_tex_PS); - } - -} - -void -destroyMatFXShaders(void) -{ - destroyVertexShader(matfx_env_amb_VS); - matfx_env_amb_VS = nil; - - destroyVertexShader(matfx_env_amb_dir_VS); - matfx_env_amb_dir_VS = nil; - - destroyVertexShader(matfx_env_all_VS); - matfx_env_all_VS = nil; - - - destroyPixelShader(matfx_env_PS); - matfx_env_PS = nil; - - destroyPixelShader(matfx_env_tex_PS); - matfx_env_tex_PS = nil; -} - -#endif - -static void* -matfxOpen(void *o, int32, int32) -{ -#ifdef RW_D3D9 - createMatFXShaders(); -#endif - - matFXGlobals.pipelines[PLATFORM_D3D9] = makeMatFXPipeline(); - return o; -} - -static void* -matfxClose(void *o, int32, int32) -{ -#ifdef RW_D3D9 - destroyMatFXShaders(); -#endif - - ((ObjPipeline*)matFXGlobals.pipelines[PLATFORM_D3D9])->destroy(); - matFXGlobals.pipelines[PLATFORM_D3D9] = nil; - return o; -} - -void -initMatFX(void) -{ - Driver::registerPlugin(PLATFORM_D3D9, 0, ID_MATFX, - matfxOpen, matfxClose); -} - -ObjPipeline* -makeMatFXPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->instanceCB = defaultInstanceCB; - pipe->uninstanceCB = defaultUninstanceCB; - pipe->renderCB = matfxRenderCB_Shader; - pipe->pluginID = ID_MATFX; - pipe->pluginData = 0; - return pipe; -} - -} -} diff --git a/vendor/librw/src/d3d/d3d9render.cpp b/vendor/librw/src/d3d/d3d9render.cpp deleted file mode 100644 index 89d937f..0000000 --- a/vendor/librw/src/d3d/d3d9render.cpp +++ /dev/null @@ -1,185 +0,0 @@ -#include -#include -#include -#include - -#define WITH_D3D -#include "../rwbase.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#include "../rwrender.h" -#include "rwd3d.h" -#include "rwd3d9.h" - -namespace rw { -namespace d3d9 { -using namespace d3d; - -#ifndef RW_D3D9 -void defaultRenderCB(Atomic*, InstanceDataHeader*) {} -void defaultRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header) {} -#else - -void -drawInst_simple(d3d9::InstanceDataHeader *header, d3d9::InstanceData *inst) -{ - d3d::flushCache(); - d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)header->primType, inst->baseIndex, - 0, inst->numVertices, - inst->startIndex, inst->numPrimitives); -} - -// Emulate PS2 GS alpha test FB_ONLY case: failed alpha writes to frame- but not to depth buffer -void -drawInst_GSemu(d3d9::InstanceDataHeader *header, InstanceData *inst) -{ - uint32 hasAlpha; - int alphafunc, alpharef, gsalpharef; - int zwrite; - d3d::getRenderState(D3DRS_ALPHABLENDENABLE, &hasAlpha); - if(hasAlpha){ - zwrite = rw::GetRenderState(rw::ZWRITEENABLE); - alphafunc = rw::GetRenderState(rw::ALPHATESTFUNC); - if(zwrite){ - alpharef = rw::GetRenderState(rw::ALPHATESTREF); - gsalpharef = rw::GetRenderState(rw::GSALPHATESTREF); - - SetRenderState(rw::ALPHATESTFUNC, rw::ALPHAGREATEREQUAL); - SetRenderState(rw::ALPHATESTREF, gsalpharef); - drawInst_simple(header, inst); - SetRenderState(rw::ALPHATESTFUNC, rw::ALPHALESS); - SetRenderState(rw::ZWRITEENABLE, 0); - drawInst_simple(header, inst); - SetRenderState(rw::ZWRITEENABLE, 1); - SetRenderState(rw::ALPHATESTFUNC, alphafunc); - SetRenderState(rw::ALPHATESTREF, alpharef); - }else{ - SetRenderState(rw::ALPHATESTFUNC, rw::ALPHAALWAYS); - drawInst_simple(header, inst); - SetRenderState(rw::ALPHATESTFUNC, alphafunc); - } - }else - drawInst_simple(header, inst); -} - -void -drawInst(d3d9::InstanceDataHeader *header, d3d9::InstanceData *inst) -{ - if(rw::GetRenderState(rw::GSALPHATEST)) - drawInst_GSemu(header, inst); - else - drawInst_simple(header, inst); -} - -/* -void -defaultRenderCB_Fix(Atomic *atomic, InstanceDataHeader *header) -{ - RawMatrix world; - Geometry *geo = atomic->geometry; - - int lighting = !!(geo->flags & rw::Geometry::LIGHT); - if(lighting) - d3d::lightingCB_Fix(atomic); - - d3d::setRenderState(D3DRS_LIGHTING, lighting); - - Frame *f = atomic->getFrame(); - convMatrix(&world, f->getLTM()); - d3ddevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&world); - - setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); - setIndices(header->indexBuffer); - setVertexDeclaration(header->vertexDeclaration); - - InstanceData *inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - SetRenderState(VERTEXALPHA, inst->vertexAlpha || inst->material->color.alpha != 255); - const static rw::RGBA white = { 255, 255, 255, 255 }; - d3d::setMaterial(white, inst->material->surfaceProps); - - d3d::setRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL); - if(geo->flags & Geometry::PRELIT) - d3d::setRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_COLOR1); - else - d3d::setRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL); - d3d::setRenderState(D3DRS_DIFFUSEMATERIALSOURCE, inst->vertexAlpha ? D3DMCS_COLOR1 : D3DMCS_MATERIAL); - - if(inst->material->texture){ - // Texture - d3d::setTexture(0, inst->material->texture); - d3d::setTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); - d3d::setTextureStageState(0, D3DTSS_COLORARG1, D3DTA_CURRENT); - d3d::setTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE); - d3d::setTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); - d3d::setTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_CURRENT); - d3d::setTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); - }else{ - d3d::setTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); - d3d::setTextureStageState(0, D3DTSS_COLORARG1, D3DTA_CURRENT); - d3d::setTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - d3d::setTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_CURRENT); - } - - // Material colour - const rw::RGBA *col = &inst->material->color; - d3d::setTextureStageState(1, D3DTSS_CONSTANT, D3DCOLOR_ARGB(col->alpha,col->red,col->green,col->blue)); - d3d::setTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE); - d3d::setTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT); - d3d::setTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CONSTANT); - d3d::setTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_MODULATE); - d3d::setTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT); - d3d::setTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CONSTANT); - - drawInst(header, inst); - inst++; - } - d3d::setTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - d3d::setTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); -} -*/ - -void -defaultRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header) -{ - int vsBits; - uint32 flags = atomic->geometry->flags; - 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()); - - // Pick a shader - if((vsBits & VSLIGHT_MASK) == 0) - setVertexShader(default_amb_VS); - else if((vsBits & VSLIGHT_MASK) == VSLIGHT_DIRECT) - setVertexShader(default_amb_dir_VS); - else - setVertexShader(default_all_VS); - - InstanceData *inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - Material *m = inst->material; - - SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); - - setMaterial(flags, m->color, m->surfaceProps); - - if(m->texture){ - d3d::setTexture(0, m->texture); - setPixelShader(default_tex_PS); - }else - setPixelShader(default_PS); - - drawInst(header, inst); - inst++; - } -} - -#endif -} -} diff --git a/vendor/librw/src/d3d/d3d9skin.cpp b/vendor/librw/src/d3d/d3d9skin.cpp deleted file mode 100644 index 86c79ab..0000000 --- a/vendor/librw/src/d3d/d3d9skin.cpp +++ /dev/null @@ -1,418 +0,0 @@ -#include -#include -#include -#include - -#define WITH_D3D -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwrender.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwanim.h" -#include "../rwengine.h" -#include "../rwplugins.h" -#include "rwd3d.h" -#include "rwd3d9.h" - -namespace rw { -namespace d3d9 { -using namespace d3d; - -#ifndef RW_D3D9 -void skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance) {} -void skinRenderCB(Atomic *atomic, InstanceDataHeader *header) {} -#else - - -static void *skin_amb_VS; -static void *skin_amb_dir_VS; -static void *skin_all_VS; - -#define NUMDECLELT 14 - -void -skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance) -{ - int i = 0; - VertexElement dcl[NUMDECLELT]; - VertexStream *s = &header->vertexStream[0]; - - bool isPrelit = (geo->flags & Geometry::PRELIT) != 0; - bool hasNormals = (geo->flags & Geometry::NORMALS) != 0; - - // TODO: support both vertex buffers - - if(!reinstance){ - // Create declarations and buffers only the first time - - assert(s->vertexBuffer == nil); - s->offset = 0; - s->managed = 1; - s->geometryFlags = 0; - s->dynamicLock = 0; - - dcl[i].stream = 0; - dcl[i].offset = 0; - dcl[i].type = D3DDECLTYPE_FLOAT3; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_POSITION; - dcl[i].usageIndex = 0; - i++; - uint16 stride = 12; - s->geometryFlags |= 0x2; - - if(isPrelit){ - dcl[i].stream = 0; - dcl[i].offset = stride; - dcl[i].type = D3DDECLTYPE_D3DCOLOR; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_COLOR; - dcl[i].usageIndex = 0; - i++; - s->geometryFlags |= 0x8; - stride += 4; - } - - for(int32 n = 0; n < geo->numTexCoordSets; n++){ - dcl[i].stream = 0; - dcl[i].offset = stride; - dcl[i].type = D3DDECLTYPE_FLOAT2; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_TEXCOORD; - dcl[i].usageIndex = (uint8)n; - i++; - s->geometryFlags |= 0x10 << n; - stride += 8; - } - - if(hasNormals){ - dcl[i].stream = 0; - dcl[i].offset = stride; - dcl[i].type = D3DDECLTYPE_FLOAT3; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_NORMAL; - dcl[i].usageIndex = 0; - i++; - s->geometryFlags |= 0x4; - stride += 12; - } - - dcl[i].stream = 0; - dcl[i].offset = stride; - dcl[i].type = D3DDECLTYPE_FLOAT4; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_BLENDWEIGHT; - dcl[i].usageIndex = 0; - i++; - stride += 16; - - dcl[i].stream = 0; - dcl[i].offset = stride; - dcl[i].type = D3DDECLTYPE_UBYTE4; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_BLENDINDICES; - dcl[i].usageIndex = 0; - i++; - stride += 4; - - // We expect some attributes to always be there, use the constant buffer as fallback - if(!isPrelit){ - dcl[i].stream = 2; - dcl[i].offset = offsetof(VertexConstantData, color); - dcl[i].type = D3DDECLTYPE_D3DCOLOR; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_COLOR; - dcl[i].usageIndex = 0; - i++; - } - if(geo->numTexCoordSets == 0){ - dcl[i].stream = 2; - dcl[i].offset = offsetof(VertexConstantData, texCoors[0]); - dcl[i].type = D3DDECLTYPE_FLOAT2; - dcl[i].method = D3DDECLMETHOD_DEFAULT; - dcl[i].usage = D3DDECLUSAGE_TEXCOORD; - dcl[i].usageIndex = 0; - i++; - } - - dcl[i] = D3DDECL_END(); - s->stride = stride; - - assert(header->vertexDeclaration == nil); - header->vertexDeclaration = createVertexDeclaration((VertexElement*)dcl); - - assert(s->vertexBuffer == nil); - s->vertexBuffer = createVertexBuffer(header->totalNumVertex*s->stride, 0, false); - }else - getDeclaration(header->vertexDeclaration, dcl); - - Skin *skin = Skin::get(geo); - uint8 *verts = lockVertices(s->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK); - - // Instance vertices - if(!reinstance || geo->lockedSinceInst&Geometry::LOCKVERTICES){ - for(i = 0; dcl[i].usage != D3DDECLUSAGE_POSITION || dcl[i].usageIndex != 0; i++) - ; - instV3d(vertFormatMap[dcl[i].type], verts + dcl[i].offset, - geo->morphTargets[0].vertices, - header->totalNumVertex, - header->vertexStream[dcl[i].stream].stride); - } - - // Instance prelight colors - if(isPrelit && (!reinstance || geo->lockedSinceInst&Geometry::LOCKPRELIGHT)){ - for(i = 0; dcl[i].usage != D3DDECLUSAGE_COLOR || dcl[i].usageIndex != 0; i++) - ; - InstanceData *inst = header->inst; - uint32 n = header->numMeshes; - while(n--){ - uint32 stride = header->vertexStream[dcl[i].stream].stride; - inst->vertexAlpha = instColor(vertFormatMap[dcl[i].type], - verts + dcl[i].offset + stride*inst->minVert, - geo->colors + inst->minVert, - inst->numVertices, - stride); - inst++; - } - } - - // Instance tex coords - for(int32 n = 0; n < geo->numTexCoordSets; n++){ - if(!reinstance || geo->lockedSinceInst&(Geometry::LOCKTEXCOORDS<texCoords[n], - header->totalNumVertex, - header->vertexStream[dcl[i].stream].stride); - } - } - - // Instance normals - if(hasNormals && (!reinstance || geo->lockedSinceInst&Geometry::LOCKNORMALS)){ - for(i = 0; dcl[i].usage != D3DDECLUSAGE_NORMAL || dcl[i].usageIndex != 0; i++) - ; - instV3d(vertFormatMap[dcl[i].type], verts + dcl[i].offset, - geo->morphTargets[0].normals, - header->totalNumVertex, - header->vertexStream[dcl[i].stream].stride); - } - - // Instance skin weights - if(!reinstance){ - for(i = 0; dcl[i].usage != D3DDECLUSAGE_BLENDWEIGHT || dcl[i].usageIndex != 0; i++) - ; - instV4d(vertFormatMap[dcl[i].type], verts + dcl[i].offset, - (V4d*)skin->weights, - header->totalNumVertex, - header->vertexStream[dcl[i].stream].stride); - } - - // Instance skin indices - if(!reinstance){ - for(i = 0; dcl[i].usage != D3DDECLUSAGE_BLENDINDICES || dcl[i].usageIndex != 0; i++) - ; - // not really colors of course but what the heck - instColor(vertFormatMap[dcl[i].type], verts + dcl[i].offset, - (RGBA*)skin->indices, - header->totalNumVertex, - header->vertexStream[dcl[i].stream].stride); - } - - unlockVertices(s->vertexBuffer); -} - -enum -{ - VSLOC_boneMatrices = VSLOC_afterLights -}; - -static float skinMatrices[64*16]; - -void -uploadSkinMatrices(Atomic *a) -{ - int i; - Skin *skin = Skin::get(a->geometry); - float *m = skinMatrices; - HAnimHierarchy *hier = Skin::getHierarchy(a); - - if(hier){ - Matrix *invMats = (Matrix*)skin->inverseMatrices; - Matrix tmp, tmp2; - - assert(skin->numBones == hier->numNodes); - if(hier->flags & HAnimHierarchy::LOCALSPACEMATRICES){ - for(i = 0; i < hier->numNodes; i++){ - invMats[i].flags = 0; - Matrix::mult(&tmp, &invMats[i], &hier->matrices[i]); - RawMatrix::transpose((RawMatrix*)m, (RawMatrix*)&tmp); - m += 12; - } - }else{ - Matrix invAtmMat; - Matrix::invert(&invAtmMat, a->getFrame()->getLTM()); - for(i = 0; i < hier->numNodes; i++){ - invMats[i].flags = 0; - Matrix::mult(&tmp, &hier->matrices[i], &invAtmMat); - Matrix::mult(&tmp2, &invMats[i], &tmp); - RawMatrix::transpose((RawMatrix*)m, (RawMatrix*)&tmp2); - m += 12; - } - } - }else{ - for(i = 0; i < skin->numBones; i++){ - m[0] = 1.0f; - m[1] = 0.0f; - m[2] = 0.0f; - m[3] = 0.0f; - - m[4] = 0.0f; - m[5] = 1.0f; - m[6] = 0.0f; - m[7] = 0.0f; - - m[8] = 0.0f; - m[9] = 0.0f; - m[10] = 1.0f; - m[11] = 0.0f; - - m += 12; - } - } - d3ddevice->SetVertexShaderConstantF(VSLOC_boneMatrices, skinMatrices, skin->numBones*3); -} - -void -skinRenderCB(Atomic *atomic, InstanceDataHeader *header) -{ - int vsBits; - uint32 flags = atomic->geometry->flags; - 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); - - // Pick a shader - if((vsBits & VSLIGHT_MASK) == 0) - setVertexShader(skin_amb_VS); - else if((vsBits & VSLIGHT_MASK) == VSLIGHT_DIRECT) - setVertexShader(skin_amb_dir_VS); - else - setVertexShader(skin_all_VS); - - InstanceData *inst = header->inst; - for(uint32 i = 0; i < header->numMeshes; i++){ - Material *m = inst->material; - - SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); - - setMaterial(flags, 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++; - } -} - -#define VS_NAME g_vs20_main -#define PS_NAME g_ps20_main - -void -createSkinShaders(void) -{ - { - static -#include "shaders/skin_amb_VS.h" - skin_amb_VS = createVertexShader((void*)VS_NAME); - assert(skin_amb_VS); - } - { - static -#include "shaders/skin_amb_dir_VS.h" - skin_amb_dir_VS = createVertexShader((void*)VS_NAME); - assert(skin_amb_dir_VS); - } - // Skinning takes a lot of instructions....lighting may be not possible - // TODO: should do something about this - { - static -#include "shaders/skin_all_VS.h" - skin_all_VS = createVertexShader((void*)VS_NAME); -// assert(skin_all_VS); - } -} - -void -destroySkinShaders(void) -{ - destroyVertexShader(skin_amb_VS); - skin_amb_VS = nil; - - destroyVertexShader(skin_amb_dir_VS); - skin_amb_dir_VS = nil; - - if(skin_all_VS){ - destroyVertexShader(skin_all_VS); - skin_all_VS = nil; - } -} - -#endif - -static void* -skinOpen(void *o, int32, int32) -{ -#ifdef RW_D3D9 - createSkinShaders(); -#endif - - skinGlobals.pipelines[PLATFORM_D3D9] = makeSkinPipeline(); - return o; -} - -static void* -skinClose(void *o, int32, int32) -{ -#ifdef RW_D3D9 - destroySkinShaders(); -#endif - - ((ObjPipeline*)skinGlobals.pipelines[PLATFORM_D3D9])->destroy(); - skinGlobals.pipelines[PLATFORM_D3D9] = nil; - return o; -} - -void -initSkin(void) -{ - Driver::registerPlugin(PLATFORM_D3D9, 0, ID_SKIN, - skinOpen, skinClose); -} - -ObjPipeline* -makeSkinPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->instanceCB = skinInstanceCB; - pipe->uninstanceCB = nil; - pipe->renderCB = skinRenderCB; - pipe->pluginID = ID_SKIN; - pipe->pluginData = 1; - return pipe; -} - -} -} diff --git a/vendor/librw/src/d3d/d3ddevice.cpp b/vendor/librw/src/d3d/d3ddevice.cpp deleted file mode 100644 index 9b77623..0000000 --- a/vendor/librw/src/d3d/d3ddevice.cpp +++ /dev/null @@ -1,2011 +0,0 @@ -#include -#include -#include -#include - -#define WITH_D3D -#include "../rwbase.h" -#include "../rwplg.h" -#include "../rwerror.h" -#include "../rwrender.h" -#include "../rwengine.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "rwd3d.h" -#include "rwd3dimpl.h" - -#define PLUGIN_ID 0 - -namespace rw { -namespace d3d { - -#ifdef RW_D3D9 - -D3d9Globals d3d9Globals; - -// Keep track of rasters exclusively in video memory -// as they need special treatment sometimes -struct VidmemRaster -{ - Raster *raster; - VidmemRaster *next; -}; -static VidmemRaster *vidmemRasters; -void addVidmemRaster(Raster *raster); -void removeVidmemRaster(Raster *raster); - -// Same thing for dynamic vertex buffers -struct DynamicVB -{ - uint32 length; - uint32 fvf; - IDirect3DVertexBuffer9 **buf; - DynamicVB *next; -}; -static DynamicVB *dynamicVBs; -void addDynamicVB(uint32 length, uint32 fvf, IDirect3DVertexBuffer9 **buf); -void removeDynamicVB(IDirect3DVertexBuffer9 **buf); - -// Same thing for dynamic index buffers -struct DynamicIB -{ - uint32 length; - IDirect3DIndexBuffer9 **buf; - DynamicIB *next; -}; -static DynamicIB *dynamicIBs; -void addDynamicIB(uint32 length, IDirect3DIndexBuffer9 **buf); -void removeDynamicIB(IDirect3DIndexBuffer9 **buf); - - -struct RwRasterStateCache { - Raster *raster; - Texture::Addressing addressingU; - Texture::Addressing addressingV; - Texture::FilterMode filter; - int32 maxAniso; -}; - -#define MAXNUMSTAGES 8 - -// cached RW render states -struct RwStateCache { - bool32 vertexAlpha; - bool32 textureAlpha; - uint32 srcblend, destblend; - uint32 zwrite; - uint32 ztest; - uint32 fogenable; - RGBA fogcolor; - uint32 cullmode; - uint32 stencilenable; - uint32 stencilpass; - uint32 stencilfail; - uint32 stencilzfail; - uint32 stencilfunc; - uint32 stencilref; - uint32 stencilmask; - uint32 stencilwritemask; - uint32 alphafunc; - uint32 alpharef; - - // emulation of PS2 GS - bool32 gsalpha; - uint32 gsalpharef; - - RwRasterStateCache texstage[MAXNUMSTAGES]; -}; -static RwStateCache rwStateCache; - -void *constantVertexStream; -static IDirect3DTexture9 *whiteTex; - -D3dShaderState d3dShaderState; - -#define MAXNUMSTATES (D3DRS_BLENDOPALPHA+1) -#define MAXNUMTEXSTATES (D3DTSS_CONSTANT+1) -#define MAXNUMSAMPLERSTATES (D3DSAMP_DMAPOFFSET+1) -#define MAXNUMSTREAMS (3) -#define MAXNUMRENDERTARGETS (4) - -static int32 numDirtyStates; -static uint32 dirtyStates[MAXNUMSTATES]; -static struct { - uint32 value; - bool32 dirty; -} stateCache[MAXNUMSTATES]; -static uint32 d3dStates[MAXNUMSTATES]; - -// Things that aren't just integers -struct D3dDeviceCache { - IDirect3DVertexShader9 *vertexShader; - IDirect3DPixelShader9 *pixelShader; - IDirect3DVertexDeclaration9 *vertexDeclaration; - IDirect3DIndexBuffer9 *indices; - struct { - IDirect3DVertexBuffer9 *buffer; - uint32 offset; - uint32 stride; - } vertexStreams[MAXNUMSTREAMS]; - IDirect3DSurface9 *renderTargets[MAXNUMRENDERTARGETS]; - IDirect3DSurface9 *depthSurface; -}; -static D3dDeviceCache deviceCache; - -static int32 numDirtyTextureStageStates; -static struct { - uint32 stage; - uint32 type; -} dirtyTextureStageStates[MAXNUMTEXSTATES*MAXNUMSTAGES]; -static struct { - uint32 value; - bool32 dirty; -} textureStageStateCache[MAXNUMTEXSTATES][MAXNUMSTAGES]; -static uint32 d3dTextureStageStates[MAXNUMTEXSTATES][MAXNUMSTAGES]; - -static uint32 d3dSamplerStates[MAXNUMSAMPLERSTATES][MAXNUMSTAGES]; - - -static bool validStates[MAXNUMSTATES]; -static bool validTexStates[MAXNUMTEXSTATES]; - -static D3DMATERIAL9 d3dmaterial; - - -static uint32 blendMap[] = { - D3DBLEND_ZERO, // actually invalid - D3DBLEND_ZERO, - D3DBLEND_ONE, - D3DBLEND_SRCCOLOR, - D3DBLEND_INVSRCCOLOR, - D3DBLEND_SRCALPHA, - D3DBLEND_INVSRCALPHA, - D3DBLEND_DESTALPHA, - D3DBLEND_INVDESTALPHA, - D3DBLEND_DESTCOLOR, - D3DBLEND_INVDESTCOLOR, - D3DBLEND_SRCALPHASAT -}; - -static uint32 stencilOpMap[] = { - D3DSTENCILOP_KEEP, // actually invalid - D3DSTENCILOP_KEEP, - D3DSTENCILOP_ZERO, - D3DSTENCILOP_REPLACE, - D3DSTENCILOP_INCRSAT, - D3DSTENCILOP_DECRSAT, - D3DSTENCILOP_INVERT, - D3DSTENCILOP_INCR, - D3DSTENCILOP_DECR -}; - -static uint32 stencilFuncMap[] = { - D3DCMP_NEVER, // actually invalid - D3DCMP_NEVER, - D3DCMP_LESS, - D3DCMP_EQUAL, - D3DCMP_LESSEQUAL, - D3DCMP_GREATER, - D3DCMP_NOTEQUAL, - D3DCMP_GREATEREQUAL, - D3DCMP_ALWAYS -}; - -static uint32 alphafuncMap[] = { - D3DCMP_ALWAYS, - D3DCMP_GREATEREQUAL, - D3DCMP_LESS -}; - -static uint32 cullmodeMap[] = { - D3DCULL_NONE, // actually invalid - D3DCULL_NONE, - D3DCULL_CW, - D3DCULL_CCW -}; - -static uint32 filterConvMap[] = { - 0, D3DTEXF_POINT, D3DTEXF_LINEAR, - D3DTEXF_POINT, D3DTEXF_LINEAR, - D3DTEXF_POINT, D3DTEXF_LINEAR -}; -static uint32 filterConvMap_MIP[] = { - 0, D3DTEXF_NONE, D3DTEXF_NONE, - D3DTEXF_POINT, D3DTEXF_POINT, - D3DTEXF_LINEAR, D3DTEXF_LINEAR -}; -static uint32 addressConvMap[] = { - 0, D3DTADDRESS_WRAP, D3DTADDRESS_MIRROR, - D3DTADDRESS_CLAMP, D3DTADDRESS_BORDER -}; - -// D3D render state - -void -setRenderState(uint32 state, uint32 value) -{ - if(stateCache[state].value != value){ - stateCache[state].value = value; - if(!stateCache[state].dirty){ - stateCache[state].dirty = 1; - dirtyStates[numDirtyStates++] = state; - } - } -} - -void -getRenderState(uint32 state, uint32 *value) -{ - *value = stateCache[state].value; -} - -void -setRenderTarget(int n, void *surf) -{ - if(surf != deviceCache.renderTargets[n]){ - deviceCache.renderTargets[n] = (IDirect3DSurface9*)surf; - d3ddevice->SetRenderTarget(n, deviceCache.renderTargets[n]); - } -} - -void -setDepthSurface(void *surf) -{ - if(surf != deviceCache.depthSurface){ - deviceCache.depthSurface = (IDirect3DSurface9*)surf; - d3ddevice->SetDepthStencilSurface(deviceCache.depthSurface); - } -} - -void -setTextureStageState(uint32 stage, uint32 type, uint32 value) -{ - if(textureStageStateCache[type][stage].value != value){ - textureStageStateCache[type][stage].value = value; - if(!textureStageStateCache[type][stage].dirty){ - textureStageStateCache[type][stage].dirty = 1; - dirtyTextureStageStates[numDirtyTextureStageStates].stage = stage; - dirtyTextureStageStates[numDirtyTextureStageStates].type = type; - numDirtyTextureStageStates++; - } - } -} - -void -getTextureStageState(uint32 stage, uint32 type, uint32 *value) -{ - *value = textureStageStateCache[type][stage].value; -} - -void -flushCache(void) -{ - uint32 s, t; - uint32 v; - for(int32 i = 0; i < numDirtyStates; i++){ - s = dirtyStates[i]; - v = stateCache[s].value; - stateCache[s].dirty = 0; - if(d3dStates[s] != v){ - d3ddevice->SetRenderState((D3DRENDERSTATETYPE)s, v); - d3dStates[s] = v; - } - } - numDirtyStates = 0; - for(int32 i = 0; i < numDirtyTextureStageStates; i++){ - s = dirtyTextureStageStates[i].stage; - t = dirtyTextureStageStates[i].type; - v = textureStageStateCache[t][s].value; - textureStageStateCache[t][s].dirty = 0; - if(d3dTextureStageStates[t][s] != v){ - d3ddevice->SetTextureStageState(s, (D3DTEXTURESTAGESTATETYPE)t, v); - d3dTextureStageStates[t][s] = v; - } - } - numDirtyTextureStageStates = 0; - - if(d3dShaderState.fogDirty){ - d3ddevice->SetVertexShaderConstantF(VSLOC_fogData, (float*)&d3dShaderState.fogData, 1); - d3ddevice->SetPixelShaderConstantF(PSLOC_fogColor, (float*)&d3dShaderState.fogColor, 1); - d3dShaderState.fogDirty = false; - } -} - -void -setSamplerState(uint32 stage, uint32 type, uint32 value) -{ - if(d3dSamplerStates[type][stage] != value){ - d3ddevice->SetSamplerState(stage, (D3DSAMPLERSTATETYPE)type, value); - d3dSamplerStates[type][stage] = value; - } -} - -void -getSamplerState(uint32 stage, uint32 type, uint32 *value) -{ - *value = d3dSamplerStates[type][stage]; -} - -// Bring D3D device in accordance with saved render states (after a reset) -static void -restoreD3d9Device(void) -{ - int32 i; - uint32 s, t; - - for(i = 0; i < MAXNUMSTAGES; i++){ - Raster *raster = rwStateCache.texstage[i].raster; - if(raster){ - D3dRaster *d3draster = GETD3DRASTEREXT(raster); - d3ddevice->SetTexture(i, (IDirect3DTexture9*)d3draster->texture); - }else - d3ddevice->SetTexture(i, nil); - setSamplerState(i, D3DSAMP_ADDRESSU, addressConvMap[rwStateCache.texstage[i].addressingU]); - setSamplerState(i, D3DSAMP_ADDRESSV, addressConvMap[rwStateCache.texstage[i].addressingV]); - setSamplerState(i, D3DSAMP_MAGFILTER, filterConvMap[rwStateCache.texstage[i].filter]); - if(rwStateCache.texstage[i].maxAniso == 1) - setSamplerState(i, D3DSAMP_MINFILTER, filterConvMap[rwStateCache.texstage[i].filter]); - else - setSamplerState(i, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC); - setSamplerState(i, D3DSAMP_MIPFILTER, filterConvMap_MIP[rwStateCache.texstage[i].filter]); - } - for(s = 0; s < MAXNUMSTATES; s++) - if(validStates[s]) - d3ddevice->SetRenderState((D3DRENDERSTATETYPE)s, d3dStates[s]); - for(t = 0; t < MAXNUMTEXSTATES; t++) - if(validTexStates[t]) - for(s = 0; s < MAXNUMSTAGES; s++) - d3ddevice->SetTextureStageState(s, (D3DTEXTURESTAGESTATETYPE)t, d3dTextureStageStates[t][s]); - for(t = 1; t < MAXNUMSAMPLERSTATES; t++) - for(s = 0; s < MAXNUMSTAGES; s++) - d3ddevice->SetSamplerState(s, (D3DSAMPLERSTATETYPE)t, d3dSamplerStates[t][s]); - d3ddevice->SetMaterial(&d3dmaterial); - - d3ddevice->SetVertexShader(deviceCache.vertexShader); - d3ddevice->SetPixelShader(deviceCache.pixelShader); - d3ddevice->SetVertexDeclaration(deviceCache.vertexDeclaration); - d3ddevice->SetIndices(deviceCache.indices); - for(i = 0; i < MAXNUMSTREAMS; i++) - d3ddevice->SetStreamSource(i, deviceCache.vertexStreams[i].buffer, deviceCache.vertexStreams[i].offset, deviceCache.vertexStreams[i].stride); - - // shader constants are zero now - d3dShaderState.fogDirty = true; - d3dShaderState.matColor.red = 0; - d3dShaderState.matColor.green = 0; - d3dShaderState.matColor.blue = 0; - d3dShaderState.matColor.alpha = 0; - d3dShaderState.surfProps.ambient = 0.0f; - d3dShaderState.surfProps.specular = 0.0f; - d3dShaderState.surfProps.diffuse = 0.0f; - d3dShaderState.extraSurfProp = 0.0f; - d3dShaderState.numDir = 0; - d3dShaderState.numPoint = 0; - d3dShaderState.numSpot = 0; - d3dShaderState.ambient.red = 0.0f; - d3dShaderState.ambient.green = 0.0f; - d3dShaderState.ambient.blue = 0.0f; - d3dShaderState.ambient.alpha = 0.0f; -} - -void -evictD3D9Raster(Raster *raster) -{ - int i; - // Make sure we're not still referencing this raster - D3dRaster *natras = GETD3DRASTEREXT(raster); - switch(raster->type){ - case Raster::CAMERATEXTURE: - for(i = 0; i < MAXNUMRENDERTARGETS; i++) - if(deviceCache.renderTargets[i] == natras->texture) - setRenderTarget(i, i == 0 ? d3d9Globals.defaultRenderTarget : nil); - // fall through - case Raster::NORMAL: - case Raster::TEXTURE: - for(i = 0; i < MAXNUMSTAGES; i++) - if(rwStateCache.texstage[i].raster == raster) - rwStateCache.texstage[i].raster = nil; - break; - case Raster::ZBUFFER: - if(natras->texture == deviceCache.depthSurface) - setDepthSurface(d3d9Globals.defaultDepthSurf); - break; - } -} - -// RW render state - -static void -setDepthTest(bool32 enable) -{ - if(rwStateCache.ztest != enable){ - rwStateCache.ztest = enable; - if(rwStateCache.zwrite && !enable){ - // If we still want to write, enable but set mode to always - setRenderState(D3DRS_ZENABLE, TRUE); - setRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); - }else{ - setRenderState(D3DRS_ZENABLE, rwStateCache.ztest); - setRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); - } - } -} - -static void -setDepthWrite(bool32 enable) -{ - if(rwStateCache.zwrite != enable){ - rwStateCache.zwrite = enable; - if(enable && !rwStateCache.ztest){ - // Have to switch on ztest so writing can work - setRenderState(D3DRS_ZENABLE, TRUE); - setRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); - } - setRenderState(D3DRS_ZWRITEENABLE, rwStateCache.zwrite); - } -} - -static void -setVertexAlpha(bool32 enable) -{ - if(rwStateCache.vertexAlpha != enable){ - if(!rwStateCache.textureAlpha){ - setRenderState(D3DRS_ALPHABLENDENABLE, enable); - setRenderState(D3DRS_ALPHATESTENABLE, enable); - } - rwStateCache.vertexAlpha = enable; - } -} - -void -setRasterStage(uint32 stage, Raster *raster) -{ - bool32 alpha; - D3dRaster *d3draster = nil; - if(raster != rwStateCache.texstage[stage].raster){ - rwStateCache.texstage[stage].raster = raster; - if(raster){ - assert(raster->platform == PLATFORM_D3D8 || - raster->platform == PLATFORM_D3D9); - d3draster = GETD3DRASTEREXT(raster); - d3ddevice->SetTexture(stage, (IDirect3DTexture9*)d3draster->texture); - alpha = d3draster->hasAlpha; - }else{ - d3ddevice->SetTexture(stage, whiteTex); - alpha = 0; - } - if(stage == 0){ - if(rwStateCache.textureAlpha != alpha){ - rwStateCache.textureAlpha = alpha; - if(!rwStateCache.vertexAlpha){ - setRenderState(D3DRS_ALPHABLENDENABLE, alpha); - setRenderState(D3DRS_ALPHATESTENABLE, alpha); - } - } - } - } -} - -static void -setFilterMode(uint32 stage, int32 filter, int32 maxAniso = 1) -{ - if(rwStateCache.texstage[stage].filter != (Texture::FilterMode)filter){ - rwStateCache.texstage[stage].filter = (Texture::FilterMode)filter; - setSamplerState(stage, D3DSAMP_MAGFILTER, filterConvMap[filter]); - if(maxAniso == 1) - setSamplerState(stage, D3DSAMP_MINFILTER, filterConvMap[filter]); - else - setSamplerState(stage, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC); - setSamplerState(stage, D3DSAMP_MIPFILTER, filterConvMap_MIP[filter]); - } - if(rwStateCache.texstage[stage].maxAniso != maxAniso){ - rwStateCache.texstage[stage].maxAniso = maxAniso; - if(maxAniso == 1) - setSamplerState(stage, D3DSAMP_MINFILTER, filterConvMap[filter]); - else - setSamplerState(stage, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC); - setSamplerState(stage, D3DSAMP_MAXANISOTROPY, maxAniso); - } -} - -static void -setAddressU(uint32 stage, int32 addressing) -{ - if(rwStateCache.texstage[stage].addressingU != (Texture::Addressing)addressing){ - rwStateCache.texstage[stage].addressingU = (Texture::Addressing)addressing; - setSamplerState(stage, D3DSAMP_ADDRESSU, addressConvMap[addressing]); - } -} - -static void -setAddressV(uint32 stage, int32 addressing) -{ - if(rwStateCache.texstage[stage].addressingV != (Texture::Addressing)addressing){ - rwStateCache.texstage[stage].addressingV = (Texture::Addressing)addressing; - setSamplerState(stage, D3DSAMP_ADDRESSV, addressConvMap[addressing]); - } -} - -void -setTexture(uint32 stage, Texture *tex) -{ - if(tex == nil){ - setRasterStage(stage, nil); - return; - } - if(tex->raster){ - setFilterMode(stage, tex->getFilter(), tex->getMaxAnisotropy()); - setAddressU(stage, tex->getAddressU()); - setAddressV(stage, tex->getAddressV()); - } - setRasterStage(stage, tex->raster); -} - -void -setD3dMaterial(D3DMATERIAL9 *mat9) -{ - if(d3dmaterial.Diffuse.r != mat9->Diffuse.r || - d3dmaterial.Diffuse.g != mat9->Diffuse.g || - d3dmaterial.Diffuse.b != mat9->Diffuse.b || - d3dmaterial.Diffuse.a != mat9->Diffuse.a || - d3dmaterial.Ambient.r != mat9->Ambient.r || - d3dmaterial.Ambient.g != mat9->Ambient.g || - d3dmaterial.Ambient.b != mat9->Ambient.b || - d3dmaterial.Ambient.a != mat9->Ambient.a || - d3dmaterial.Specular.r != mat9->Specular.r || - d3dmaterial.Specular.g != mat9->Specular.g || - d3dmaterial.Specular.b != mat9->Specular.b || - d3dmaterial.Specular.a != mat9->Specular.a || - d3dmaterial.Emissive.r != mat9->Emissive.r || - d3dmaterial.Emissive.g != mat9->Emissive.g || - d3dmaterial.Emissive.b != mat9->Emissive.b || - d3dmaterial.Emissive.a != mat9->Emissive.a || - d3dmaterial.Power != mat9->Power){ - d3ddevice->SetMaterial(mat9); - d3dmaterial = *mat9; - } -} - -void -setMaterial_fix(const RGBA &color, const SurfaceProperties &surfProps) -{ - D3DMATERIAL9 mat9; - D3DCOLORVALUE black = { 0, 0, 0, 0 }; - float ambmult = surfProps.ambient/255.0f; - float diffmult = surfProps.diffuse/255.0f; - mat9.Ambient.r = color.red*ambmult; - mat9.Ambient.g = color.green*ambmult; - mat9.Ambient.b = color.blue*ambmult; - mat9.Ambient.a = color.alpha; - mat9.Diffuse.r = color.red*diffmult; - mat9.Diffuse.g = color.green*diffmult; - mat9.Diffuse.b = color.blue*diffmult; - mat9.Diffuse.a = color.alpha; - mat9.Power = 0.0f; - mat9.Emissive = black; - mat9.Specular = black; - setD3dMaterial(&mat9); -} - - -void -setMaterial(const RGBA &color, const SurfaceProperties &surfaceprops, float extraSurfProp) -{ - if(!equal(d3dShaderState.matColor, color)){ - rw::RGBAf col; - convColor(&col, &color); - d3ddevice->SetVertexShaderConstantF(VSLOC_matColor, (float*)&col, 1); - d3dShaderState.matColor = color; - } - - if(d3dShaderState.surfProps.ambient != surfaceprops.ambient || - d3dShaderState.surfProps.specular != surfaceprops.specular || - d3dShaderState.surfProps.diffuse != surfaceprops.diffuse || - d3dShaderState.extraSurfProp != extraSurfProp){ - float surfProps[4]; - surfProps[0] = surfaceprops.ambient; - surfProps[1] = surfaceprops.specular; - surfProps[2] = surfaceprops.diffuse; - surfProps[3] = extraSurfProp; - d3ddevice->SetVertexShaderConstantF(VSLOC_surfProps, surfProps, 1); - d3dShaderState.surfProps = surfaceprops; - d3dShaderState.extraSurfProp = extraSurfProp; - } -} - -static void -setRwRenderState(int32 state, void *pvalue) -{ - uint32 value = (uint32)(uintptr)pvalue; - uint32 bval = value ? TRUE : FALSE; - switch(state){ - case TEXTURERASTER: - setRasterStage(0, (Raster*)pvalue); - break; - case TEXTUREADDRESS: - setAddressU(0, value); - setAddressV(0, value); - break; - case TEXTUREADDRESSU: - setAddressU(0, value); - break; - case TEXTUREADDRESSV: - setAddressV(0, value); - break; - case TEXTUREFILTER: - setFilterMode(0, value); - break; - case VERTEXALPHA: - setVertexAlpha(bval); - break; - case SRCBLEND: - if(rwStateCache.srcblend != value){ - rwStateCache.srcblend = value; - setRenderState(D3DRS_SRCBLEND, blendMap[value]); - } - break; - case DESTBLEND: - if(rwStateCache.destblend != value){ - rwStateCache.destblend = value; - setRenderState(D3DRS_DESTBLEND, blendMap[value]); - } - break; - case ZTESTENABLE: - setDepthTest(bval); - break; - case ZWRITEENABLE: - setDepthWrite(bval); - break; - case FOGENABLE: - if(rwStateCache.fogenable != bval){ - rwStateCache.fogenable = bval; -// setRenderState(D3DRS_FOGENABLE, rwStateCache.fogenable); - d3dShaderState.fogData.disable = bval ? 0.0f : 1.0f; - d3dShaderState.fogDirty = true; - }; - break; - case FOGCOLOR:{ - RGBA c; - c.red = value; - c.green = value>>8; - c.blue = value>>16; - c.alpha = value>>24; - if(!equal(rwStateCache.fogcolor, c)){ - rwStateCache.fogcolor = c; - setRenderState(D3DRS_FOGCOLOR, D3DCOLOR_RGBA(c.red, c.green, c.blue, c.alpha)); - convColor(&d3dShaderState.fogColor, &c); - d3dShaderState.fogDirty = true; - }} break; - case CULLMODE: - if(rwStateCache.cullmode != value){ - rwStateCache.cullmode = value; - setRenderState(D3DRS_CULLMODE, cullmodeMap[value]); - } - break; - - case STENCILENABLE: - if(rwStateCache.stencilenable != bval){ - rwStateCache.stencilenable = bval; - setRenderState(D3DRS_STENCILENABLE, bval); - } - break; - case STENCILFAIL: - if(rwStateCache.stencilfail != value){ - rwStateCache.stencilfail = value; - setRenderState(D3DRS_STENCILFAIL, stencilOpMap[value]); - } - break; - case STENCILZFAIL: - if(rwStateCache.stencilzfail != value){ - rwStateCache.stencilzfail = value; - setRenderState(D3DRS_STENCILZFAIL, stencilOpMap[value]); - } - break; - case STENCILPASS: - if(rwStateCache.stencilpass != value){ - rwStateCache.stencilpass = value; - setRenderState(D3DRS_STENCILPASS, stencilOpMap[value]); - } - break; - case STENCILFUNCTION: - if(rwStateCache.stencilfunc != value){ - rwStateCache.stencilfunc = value; - setRenderState(D3DRS_STENCILFUNC, stencilFuncMap[value]); - } - break; - case STENCILFUNCTIONREF: - if(rwStateCache.stencilref != value){ - rwStateCache.stencilref = value; - setRenderState(D3DRS_STENCILREF, value); - } - break; - case STENCILFUNCTIONMASK: - if(rwStateCache.stencilmask != value){ - rwStateCache.stencilmask = value; - setRenderState(D3DRS_STENCILMASK, value); - } - break; - case STENCILFUNCTIONWRITEMASK: - if(rwStateCache.stencilwritemask != value){ - rwStateCache.stencilwritemask = value; - setRenderState(D3DRS_STENCILWRITEMASK, value); - } - break; - - case ALPHATESTFUNC: - if(rwStateCache.alphafunc != value){ - rwStateCache.alphafunc = value; - setRenderState(D3DRS_ALPHAFUNC, alphafuncMap[rwStateCache.alphafunc]); - } - break; - case ALPHATESTREF: - if(rwStateCache.alpharef != value){ - rwStateCache.alpharef = value; - setRenderState(D3DRS_ALPHAREF, rwStateCache.alpharef); - } - break; - case GSALPHATEST: - rwStateCache.gsalpha = value; - break; - case GSALPHATESTREF: - rwStateCache.gsalpharef = value; - break; - } -} - -static void* -getRwRenderState(int32 state) -{ - uint32 val; - switch(state){ - case TEXTURERASTER: - return rwStateCache.texstage[0].raster; - case TEXTUREADDRESS: - if(rwStateCache.texstage[0].addressingU == rwStateCache.texstage[0].addressingV) - val = rwStateCache.texstage[0].addressingU; - else - val = 0; // invalid - break; - case TEXTUREADDRESSU: - val = rwStateCache.texstage[0].addressingU; - break; - case TEXTUREADDRESSV: - val = rwStateCache.texstage[0].addressingV; - break; - case TEXTUREFILTER: - val = rwStateCache.texstage[0].filter; - break; - - case VERTEXALPHA: - val = rwStateCache.vertexAlpha; - break; - case SRCBLEND: - val = rwStateCache.srcblend; - break; - case DESTBLEND: - val = rwStateCache.destblend; - break; - case ZTESTENABLE: - val = rwStateCache.ztest; - break; - case ZWRITEENABLE: - val = rwStateCache.zwrite; - break; - case FOGENABLE: - val = rwStateCache.fogenable; - break; - case FOGCOLOR: - val = RWRGBAINT(rwStateCache.fogcolor.red, rwStateCache.fogcolor.green, - rwStateCache.fogcolor.blue, rwStateCache.fogcolor.alpha); - break; - case CULLMODE: - val = rwStateCache.cullmode; - break; - - case STENCILENABLE: - val = rwStateCache.stencilenable; - break; - case STENCILFAIL: - val = rwStateCache.stencilfail; - break; - case STENCILZFAIL: - val = rwStateCache.stencilzfail; - break; - case STENCILPASS: - val = rwStateCache.stencilpass; - break; - case STENCILFUNCTION: - val = rwStateCache.stencilfunc; - break; - case STENCILFUNCTIONREF: - val = rwStateCache.stencilref; - break; - case STENCILFUNCTIONMASK: - val = rwStateCache.stencilmask; - break; - case STENCILFUNCTIONWRITEMASK: - val = rwStateCache.stencilwritemask; - break; - - case ALPHATESTFUNC: - val = rwStateCache.alphafunc; - break; - case ALPHATESTREF: - val = rwStateCache.alpharef; - break; - case GSALPHATEST: - val = rwStateCache.gsalpha; - break; - case GSALPHATESTREF: - val = rwStateCache.gsalpharef; - break; - default: - val = 0; - } - return (void*)(uintptr)val; -} - -// Shaders - -void -setVertexShader(void *vs) -{ - if(deviceCache.vertexShader != vs){ - deviceCache.vertexShader = (IDirect3DVertexShader9*)vs; - d3ddevice->SetVertexShader(deviceCache.vertexShader); - } -} - -void -setPixelShader(void *ps) -{ - if(deviceCache.pixelShader != ps){ - deviceCache.pixelShader = (IDirect3DPixelShader9*)ps; - d3ddevice->SetPixelShader(deviceCache.pixelShader); - } -} - -void -setIndices(void *indexBuffer) -{ - if(deviceCache.indices != indexBuffer){ - deviceCache.indices = (IDirect3DIndexBuffer9*)indexBuffer; - d3ddevice->SetIndices(deviceCache.indices); - } -} - -void -setStreamSource(int n, void *buffer, uint32 offset, uint32 stride) -{ - if(deviceCache.vertexStreams[n].buffer != buffer || - deviceCache.vertexStreams[n].offset != offset || - deviceCache.vertexStreams[n].stride != stride){ - deviceCache.vertexStreams[n].buffer = (IDirect3DVertexBuffer9*)buffer; - deviceCache.vertexStreams[n].offset = offset; - deviceCache.vertexStreams[n].stride = stride; - d3ddevice->SetStreamSource(n, deviceCache.vertexStreams[n].buffer, offset, stride); - } -} - -void -setVertexDeclaration(void *declaration) -{ - if(deviceCache.vertexDeclaration != declaration){ - deviceCache.vertexDeclaration = (IDirect3DVertexDeclaration9*)declaration; - d3ddevice->SetVertexDeclaration(deviceCache.vertexDeclaration); - } -} - -void* -createVertexShader(void *csosrc) -{ - void *shdr; - if(d3ddevice->CreateVertexShader((DWORD*)csosrc, (IDirect3DVertexShader9**)&shdr) == D3D_OK){ - d3d9Globals.numVertexShaders++; - return shdr; - } - return nil; -} - -void* -createPixelShader(void *csosrc) -{ - void *shdr; - if(d3ddevice->CreatePixelShader((DWORD*)csosrc, (IDirect3DPixelShader9**)&shdr) == D3D_OK){ - d3d9Globals.numPixelShaders++; - return shdr; - } - return nil; -} - -void -destroyVertexShader(void *shader) -{ - if(shader){ - ((IDirect3DVertexShader9*)shader)->Release(); - d3d9Globals.numVertexShaders--; - } -} - -void -destroyPixelShader(void *shader) -{ - if(shader){ - ((IDirect3DPixelShader9*)shader)->Release(); - d3d9Globals.numPixelShaders--; - } -} - - -// Camera - -static void -setRenderSurfaces(Camera *cam) -{ - Raster *fbuf = cam->frameBuffer; - assert(fbuf); - { - D3dRaster *natras = GETD3DRASTEREXT(fbuf); - assert(fbuf->type == Raster::CAMERA || fbuf->type == Raster::CAMERATEXTURE); - if(natras->texture == nil) - setRenderTarget(0, d3d9Globals.defaultRenderTarget); - else{ - assert(fbuf->type == Raster::CAMERATEXTURE); - IDirect3DSurface9 *surf; - ((IDirect3DTexture9*)natras->texture)->GetSurfaceLevel(0, &surf); - setRenderTarget(0, surf); - surf->Release(); - } - } - - Raster *zbuf = cam->zBuffer; - if(zbuf){ - D3dRaster *natras = GETD3DRASTEREXT(zbuf); - assert(zbuf->type == Raster::ZBUFFER); - setDepthSurface(natras->texture); - }else - setDepthSurface(nil); - -} - -static void -beginUpdate(Camera *cam) -{ - float view[16], proj[16]; - - // View Matrix - Matrix inv; - Matrix::invert(&inv, cam->getFrame()->getLTM()); - // Since we're looking into positive Z, - // flip X to ge a left handed view space. - view[0] = -inv.right.x; - view[1] = inv.right.y; - view[2] = inv.right.z; - view[3] = 0.0f; - view[4] = -inv.up.x; - view[5] = inv.up.y; - view[6] = inv.up.z; - view[7] = 0.0f; - view[8] = -inv.at.x; - view[9] = inv.at.y; - view[10] = inv.at.z; - view[11] = 0.0f; - view[12] = -inv.pos.x; - view[13] = inv.pos.y; - view[14] = inv.pos.z; - view[15] = 1.0f; - memcpy(&cam->devView, view, sizeof(RawMatrix)); -// d3ddevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)view); - - // Projection Matrix - float32 invwx = 1.0f/cam->viewWindow.x; - float32 invwy = 1.0f/cam->viewWindow.y; - float32 invz = 1.0f/(cam->farPlane-cam->nearPlane); - - proj[0] = invwx; - proj[1] = 0.0f; - proj[2] = 0.0f; - proj[3] = 0.0f; - - proj[4] = 0.0f; - proj[5] = invwy; - proj[6] = 0.0f; - proj[7] = 0.0f; - - proj[8] = cam->viewOffset.x*invwx; - proj[9] = cam->viewOffset.y*invwy; - proj[12] = -proj[8]; - proj[13] = -proj[9]; - if(cam->projection == Camera::PERSPECTIVE){ - proj[10] = cam->farPlane*invz; - proj[11] = 1.0f; - - proj[15] = 0.0f; - }else{ - proj[10] = invz; - proj[11] = 0.0f; - - proj[15] = 1.0f; - } - proj[14] = -cam->nearPlane*proj[10]; - memcpy(&cam->devProj, proj, sizeof(RawMatrix)); -// d3ddevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)proj); - - // TODO: figure out where this is really done -// setRenderState(D3DRS_FOGSTART, *(uint32*)&cam->fogPlane); -// setRenderState(D3DRS_FOGEND, *(uint32*)&cam->farPlane); - d3dShaderState.fogData.start = cam->fogPlane; - d3dShaderState.fogData.end = cam->farPlane; - d3dShaderState.fogData.range = 1.0f/(cam->fogPlane - cam->farPlane); - // TODO: not quite sure this is the right place to do this... - d3dShaderState.fogData.disable = rwStateCache.fogenable ? 0.0f : 1.0f; - d3dShaderState.fogDisable.start = 0.0f; - d3dShaderState.fogDisable.end = 0.0f; - d3dShaderState.fogDisable.range = 0.0f; - d3dShaderState.fogDisable.disable = 1.0f; - d3dShaderState.fogDirty = true; - - setRenderSurfaces(cam); - - D3DVIEWPORT9 vp; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - vp.X = cam->frameBuffer->offsetX; - vp.Y = cam->frameBuffer->offsetY; - vp.Width = cam->frameBuffer->width; - vp.Height = cam->frameBuffer->height; - d3ddevice->SetViewport(&vp); - - // TODO: figure out when to call this - d3ddevice->BeginScene(); -} - -static void -endUpdate(Camera *cam) -{ - // TODO: figure out when to call this - d3ddevice->EndScene(); -} - -// Manage video memory - -void -addVidmemRaster(Raster *raster) -{ - VidmemRaster *vmr = rwNewT(VidmemRaster, 1, ID_DRIVER | MEMDUR_EVENT); - vmr->raster = raster; - vmr->next = vidmemRasters; - vidmemRasters = vmr; -} - -void -removeVidmemRaster(Raster *raster) -{ - VidmemRaster **p, *vmr; - for(p = &vidmemRasters; *p; p = &(*p)->next) - if((*p)->raster == raster) - goto found; - return; -found: - vmr = *p; - *p = vmr->next; - rwFree(vmr); -} - -static void -releaseVidmemRasters(void) -{ - VidmemRaster *vmr; - Raster *raster; - D3dRaster *natras; - for(vmr = vidmemRasters; vmr; vmr = vmr->next){ - raster = vmr->raster; - natras = GETD3DRASTEREXT(raster); - switch(raster->type){ - case Raster::CAMERATEXTURE: - destroyTexture(natras->texture); - natras->texture = nil; - break; - - case Raster::ZBUFFER: - // we'll leave the default surface dangling so we can tell the difference - if(natras->texture != d3d9Globals.defaultDepthSurf){ - ((IDirect3DSurface9*)natras->texture)->Release(); - natras->texture = nil; - } - break; - } - } -} - -static void -recreateVidmemRasters(void) -{ - VidmemRaster *vmr; - Raster *raster; - D3dRaster *natras; - for(vmr = vidmemRasters; vmr; vmr = vmr->next){ - raster = vmr->raster; - natras = GETD3DRASTEREXT(raster); - switch(raster->type){ - case Raster::CAMERATEXTURE: { - int32 levels = Raster::calculateNumLevels(raster->width, raster->height); - IDirect3DTexture9 *tex; - d3ddevice->CreateTexture(raster->width, raster->height, - raster->format & Raster::MIPMAP ? levels : 1, - D3DUSAGE_RENDERTARGET, - (D3DFORMAT)natras->format, D3DPOOL_DEFAULT, &tex, nil); - natras->texture = tex; - if(natras->texture) - d3d9Globals.numTextures++; - break; - } - - case Raster::ZBUFFER: - if(natras->texture){ - RECT rect; - GetClientRect(d3d9Globals.window, &rect); - raster->width = rect.right; - raster->height = rect.bottom; - natras->texture = d3d9Globals.defaultDepthSurf; - natras->format = d3d9Globals.present.AutoDepthStencilFormat; - raster->depth = findFormatDepth(natras->format); - }else{ - IDirect3DSurface9 *surf = nil; - d3ddevice->CreateDepthStencilSurface(raster->width, raster->height, (D3DFORMAT)natras->format, - d3d9Globals.present.MultiSampleType, d3d9Globals.present.MultiSampleQuality, - FALSE, &surf, nil); - natras->texture = surf; - } - break; - } - } -} - -void -addDynamicVB(uint32 length, uint32 fvf, IDirect3DVertexBuffer9 **buf) -{ - DynamicVB *dvb = rwNewT(DynamicVB, 1, ID_DRIVER | MEMDUR_EVENT); - dvb->length = length; - dvb->fvf = fvf; - dvb->buf = buf; - dvb->next = dynamicVBs; - dynamicVBs = dvb; -} - -void -removeDynamicVB(IDirect3DVertexBuffer9 **buf) -{ - DynamicVB **p, *dvb; - for(p = &dynamicVBs; *p; p = &(*p)->next) - if((*p)->buf == buf) - goto found; - return; -found: - dvb = *p; - *p = dvb->next; - rwFree(dvb); -} - -static void -releaseDynamicVBs(void) -{ - DynamicVB *dvb; - int i; - for(dvb = dynamicVBs; dvb; dvb = dvb->next){ - for(i = 0; i < MAXNUMSTREAMS; i++) - if(deviceCache.vertexStreams[i].buffer == *dvb->buf) - deviceCache.vertexStreams[i].buffer = nil; - destroyVertexBuffer(*dvb->buf); - *dvb->buf = nil; - } -} - -static void -recreateDynamicVBs(void) -{ - DynamicVB *dvb; - for(dvb = dynamicVBs; dvb; dvb = dvb->next){ - assert(*dvb->buf == nil); - *dvb->buf = (IDirect3DVertexBuffer9*)createVertexBuffer(dvb->length, dvb->fvf, true); - } -} - - -void -addDynamicIB(uint32 length, IDirect3DIndexBuffer9 **buf) -{ - DynamicIB *ivb = rwNewT(DynamicIB, 1, ID_DRIVER | MEMDUR_EVENT); - ivb->length = length; - ivb->buf = buf; - ivb->next = dynamicIBs; - dynamicIBs = ivb; -} - -void -removeDynamicIB(IDirect3DIndexBuffer9 **buf) -{ - DynamicIB **p, *ivb; - for(p = &dynamicIBs; *p; p = &(*p)->next) - if((*p)->buf == buf) - goto found; - return; -found: - ivb = *p; - *p = ivb->next; - rwFree(ivb); -} - -static void -releaseDynamicIBs(void) -{ - DynamicIB *ivb; - for(ivb = dynamicIBs; ivb; ivb = ivb->next){ - if(deviceCache.indices == *ivb->buf) - deviceCache.indices = nil; - destroyIndexBuffer(*ivb->buf); - *ivb->buf = nil; - } -} - -static void -recreateDynamicIBs(void) -{ - DynamicIB *ivb; - for(ivb = dynamicIBs; ivb; ivb = ivb->next){ - assert(*ivb->buf == nil); - *ivb->buf = (IDirect3DIndexBuffer9*)createIndexBuffer(ivb->length, true); - } -} - -static void -releaseVideoMemory(void) -{ - int32 i; - for(i = 0; i < MAXNUMSTAGES; i++) - d3ddevice->SetTexture(i, nil); - d3ddevice->SetVertexDeclaration(nil); - d3ddevice->SetVertexShader(nil); - d3ddevice->SetPixelShader(nil); - d3ddevice->SetIndices(nil); - for(i = 0; i < MAXNUMSTREAMS; i++) - d3ddevice->SetStreamSource(0, nil, 0, 0); - - setRenderTarget(0, d3d9Globals.defaultRenderTarget); - for(i = 1; i < MAXNUMRENDERTARGETS; i++) - setRenderTarget(i, nil); - setDepthSurface(d3d9Globals.defaultDepthSurf); - - releaseVidmemRasters(); - releaseDynamicVBs(); - releaseDynamicIBs(); -} - -static void -restoreVideoMemory(void) -{ - // Have to get these back before recreating rasters - d3ddevice->GetRenderTarget(0, &d3d9Globals.defaultRenderTarget); - d3d9Globals.defaultRenderTarget->Release(); // refcount increased by Get - deviceCache.renderTargets[0] = d3d9Globals.defaultRenderTarget; - d3ddevice->GetDepthStencilSurface(&d3d9Globals.defaultDepthSurf); - d3d9Globals.defaultDepthSurf->Release(); // refcount increased by Get - deviceCache.depthSurface = d3d9Globals.defaultDepthSurf; - - recreateDynamicIBs(); - recreateDynamicVBs(); - // important that we get all raster back before restoring state - recreateVidmemRasters(); - - restoreD3d9Device(); -} - -static void -clearCamera(Camera *cam, RGBA *col, uint32 mode) -{ - int flags = 0; - if(mode & Camera::CLEARIMAGE) - mode |= D3DCLEAR_TARGET; - if(mode & Camera::CLEARZ) - mode |= D3DCLEAR_ZBUFFER; - if(mode & Camera::CLEARSTENCIL) - mode |= D3DCLEAR_STENCIL; - D3DCOLOR c = D3DCOLOR_RGBA(col->red, col->green, col->blue, col->alpha); - - RECT r; - GetClientRect(d3d9Globals.window, &r); - BOOL icon = IsIconic(d3d9Globals.window); - Raster *ras = cam->frameBuffer; - if(!icon && - (r.right != d3d9Globals.present.BackBufferWidth || r.bottom != d3d9Globals.present.BackBufferHeight)){ - - d3d9Globals.present.BackBufferWidth = r.right; - d3d9Globals.present.BackBufferHeight = r.bottom; - - releaseVideoMemory(); - d3d::d3ddevice->Reset(&d3d9Globals.present); - restoreVideoMemory(); - } - - setRenderSurfaces(cam); - - d3ddevice->Clear(0, 0, mode, c, 1.0f, 0); -} - -static void -showRaster(Raster *raster, uint32 flag) -{ - UINT interval = flag & Raster::FLIPWAITVSYNCH ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; - if(d3d9Globals.present.PresentationInterval != interval){ - d3d9Globals.present.PresentationInterval = interval; - releaseVideoMemory(); - d3d::d3ddevice->Reset(&d3d9Globals.present); - restoreVideoMemory(); - } - - // not used but we want cameras to have rasters - assert(raster); - HRESULT res = d3ddevice->Present(nil, nil, 0, nil); - - if(res == D3DERR_DEVICELOST){ - res = d3ddevice->TestCooperativeLevel(); - // lost while being minimized, not reset once we're back - if(res == D3DERR_DEVICENOTRESET){ - releaseVideoMemory(); - d3d::d3ddevice->Reset(&d3d9Globals.present); - restoreVideoMemory(); - } - } -} - -static bool32 -rasterRenderFast(Raster *raster, int32 x, int32 y) -{ - IDirect3DTexture9 *dsttex; - IDirect3DSurface9 *srcsurf, *dstsurf; - D3DSURFACE_DESC srcdesc, dstdesc; - RECT rect = { x, y, x, y }; - - Raster *src = raster; - Raster *dst = Raster::getCurrentContext(); - D3dRaster *natdst = GETD3DRASTEREXT(dst); - D3dRaster *natsrc = GETD3DRASTEREXT(src); - - switch(dst->type){ - case Raster::CAMERATEXTURE: - switch(src->type){ - case Raster::CAMERA: - dsttex = (IDirect3DTexture9*)natdst->texture; - dsttex->GetSurfaceLevel(0, &dstsurf); - assert(dstsurf); - dstsurf->GetDesc(&dstdesc); - - d3ddevice->GetRenderTarget(0, &srcsurf); - assert(srcsurf); - srcsurf->GetDesc(&srcdesc); - - rect.right += srcdesc.Width; - rect.bottom += srcdesc.Height; - - d3ddevice->StretchRect(srcsurf, &rect, dstsurf, &rect, D3DTEXF_NONE); - dstsurf->Release(); - srcsurf->Release(); - return 1; - } - break; - } - - return 0; -} - - -// -// Device -// - -int -findFormatDepth(uint32 format) -{ - // not all formats actually - switch(format){ - case D3DFMT_R8G8B8: return 24; - case D3DFMT_A8R8G8B8: return 32; - case D3DFMT_X8R8G8B8: return 32; - case D3DFMT_R5G6B5: return 16; - case D3DFMT_X1R5G5B5: return 16; - case D3DFMT_A1R5G5B5: return 16; - case D3DFMT_A4R4G4B4: return 16; - case D3DFMT_R3G3B2: return 8; - case D3DFMT_A8: return 8; - case D3DFMT_A8R3G3B2: return 16; - case D3DFMT_X4R4G4B4: return 16; - case D3DFMT_A2B10G10R10: return 32; - case D3DFMT_A8B8G8R8: return 32; - case D3DFMT_X8B8G8R8: return 32; - case D3DFMT_G16R16: return 32; - case D3DFMT_A2R10G10B10: return 32; - case D3DFMT_A16B16G16R16: return 64; - - case D3DFMT_L8: return 8; - case D3DFMT_D16: return 16; - case D3DFMT_D24S8: return 32; - case D3DFMT_D24X8: return 32; - case D3DFMT_D24X4S4: return 32; - case D3DFMT_D32: return 32; - - default: return 0; - } -} - -// the commented ones don't "work" -static D3DFORMAT fbFormats[] = { -// D3DFMT_A1R5G5B5, -/// D3DFMT_A2R10G10B10, // works but let's not use it... -// D3DFMT_A8R8G8B8, - D3DFMT_X8R8G8B8, -// D3DFMT_X1R5G5B5, - D3DFMT_R5G6B5 -}; - -static void -addVideoMode(D3DDISPLAYMODE *mode) -{ - int i; - - for(i = 1; i < d3d9Globals.numModes; i++){ - if(d3d9Globals.modes[i].mode.Width == mode->Width && - d3d9Globals.modes[i].mode.Height == mode->Height && - d3d9Globals.modes[i].mode.Format == mode->Format){ - // had this format already, remember highest refresh rate - if(mode->RefreshRate > d3d9Globals.modes[i].mode.RefreshRate) - d3d9Globals.modes[i].mode.RefreshRate = mode->RefreshRate; - return; - } - } - - // none found, add - d3d9Globals.modes[d3d9Globals.numModes].mode = *mode; - d3d9Globals.modes[d3d9Globals.numModes].flags = VIDEOMODEEXCLUSIVE; - d3d9Globals.numModes++; -} - -static void -makeVideoModeList(void) -{ - int i, j; - D3DDISPLAYMODE mode; - - d3d9Globals.numModes = 1; - for(i = 0; i < nelem(fbFormats); i++) - d3d9Globals.numModes += d3d9Globals.d3d9->GetAdapterModeCount(d3d9Globals.adapter, fbFormats[i]); - - rwFree(d3d9Globals.modes); - d3d9Globals.modes = rwNewT(DisplayMode, d3d9Globals.numModes, ID_DRIVER | MEMDUR_EVENT); - - // first mode is current mode as windowed - d3d9Globals.d3d9->GetAdapterDisplayMode(d3d9Globals.adapter, &d3d9Globals.modes[0].mode); - d3d9Globals.modes[0].flags = 0; - d3d9Globals.numModes = 1; - - for(i = 0; i < nelem(fbFormats); i++){ - int n = d3d9Globals.d3d9->GetAdapterModeCount(d3d9Globals.adapter, fbFormats[i]); - for(j = 0; j < n; j++){ - d3d9Globals.d3d9->EnumAdapterModes(d3d9Globals.adapter, fbFormats[i], j, &mode); - addVideoMode(&mode); - } - } -} - -static int -openD3D(EngineOpenParams *params) -{ - HWND win = params->window; - - d3d9Globals.window = win; - d3d9Globals.numAdapters = 0; - d3d9Globals.modes = nil; - d3d9Globals.numModes = 0; - d3d9Globals.currentMode = 0; - - d3d9Globals.d3d9 = Direct3DCreate9(D3D_SDK_VERSION); - if(d3d9Globals.d3d9 == nil){ - RWERROR((ERR_GENERAL, "Direct3DCreate9() failed")); - return 0; - } - - d3d9Globals.numAdapters = d3d9Globals.d3d9->GetAdapterCount(); - d3d9Globals.adapter = 0; - - for(d3d9Globals.adapter = 0; d3d9Globals.adapter < d3d9Globals.numAdapters; d3d9Globals.adapter++) - if(d3d9Globals.d3d9->GetDeviceCaps(d3d9Globals.adapter, D3DDEVTYPE_HAL, &d3d9Globals.caps) == D3D_OK) - goto found; - // no adapter - d3d9Globals.d3d9->Release(); - d3d9Globals.d3d9 = nil; - RWERROR((ERR_GENERAL, "Direct3DCreate9() failed")); - return 0; - -found: - makeVideoModeList(); - return 1; -} - -static int -closeD3D(void) -{ - ULONG ref = d3d9Globals.d3d9->Release(); - if(ref != 0) - printf("IDirect3D9_Release did not destroy\n"); - d3d9Globals.d3d9 = nil; - rwFree(d3d9Globals.modes); - d3d9Globals.modes = nil; - d3d9Globals.numModes = 0; - d3d9Globals.currentMode = 0; - return 1; -} - -static int -startD3D(void) -{ - HRESULT hr; - int vp; - if(d3d9Globals.caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) - vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; - else - vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; - - uint32 width, height, depth; - D3DFORMAT format, zformat; - d3d9Globals.startMode = d3d9Globals.modes[d3d9Globals.currentMode]; - format = d3d9Globals.startMode.mode.Format; - - bool windowed = !(d3d9Globals.startMode.flags & VIDEOMODEEXCLUSIVE); - - // Use window size in windowed mode, otherwise get size from video mode - if(windowed){ - RECT rect; - GetClientRect(d3d9Globals.window, &rect); - width = rect.right - rect.left; - height = rect.bottom - rect.top; - }else{ - // this will be much better for restoring after iconification - SetWindowLong(d3d9Globals.window, GWL_STYLE, WS_POPUP); - width = d3d9Globals.startMode.mode.Width; - height = d3d9Globals.startMode.mode.Height; - } - - // See if we can get an alpha channel - if(format == D3DFMT_X8R8G8B8){ - if(d3d9Globals.d3d9->CheckDeviceType(d3d9Globals.adapter, D3DDEVTYPE_HAL, format, D3DFMT_A8R8G8B8, windowed) == D3D_OK) - format = D3DFMT_A8R8G8B8; - } - - depth = findFormatDepth(format); - - // TOOD: use something more sophisticated maybe? - if(depth == 32) - zformat = D3DFMT_D24S8; - else - zformat = D3DFMT_D16; - - d3d9Globals.present.BackBufferWidth = width; - d3d9Globals.present.BackBufferHeight = height; - d3d9Globals.present.BackBufferFormat = format; - d3d9Globals.present.BackBufferCount = 1; - d3d9Globals.present.MultiSampleType = d3d9Globals.msLevel == 1 ? - D3DMULTISAMPLE_NONE : (D3DMULTISAMPLE_TYPE)d3d9Globals.msLevel; - d3d9Globals.present.MultiSampleQuality = 0; - d3d9Globals.present.SwapEffect = D3DSWAPEFFECT_DISCARD; - d3d9Globals.present.hDeviceWindow = d3d9Globals.window; - d3d9Globals.present.Windowed = windowed; - d3d9Globals.present.EnableAutoDepthStencil = true; - d3d9Globals.present.AutoDepthStencilFormat = zformat; - d3d9Globals.present.Flags = 0; - d3d9Globals.present.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; -// d3d9Globals.present.PresentationInterval = D3DPRESENT_INTERVAL_ONE; - d3d9Globals.present.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - - assert(d3d::d3ddevice == nil); - - BOOL icon = IsIconic(d3d9Globals.window); - IDirect3DDevice9 *dev; - hr = d3d9Globals.d3d9->CreateDevice(d3d9Globals.adapter, D3DDEVTYPE_HAL, - d3d9Globals.window, vp, &d3d9Globals.present, &dev); - if(FAILED(hr)){ - RWERROR((ERR_GENERAL, "CreateDevice() failed")); - return 0; - } - d3d::d3ddevice = dev; - return 1; -} - -static int -initD3D(void) -{ - int32 s, t; - - memset(&deviceCache, 0, sizeof(deviceCache)); - d3ddevice->GetRenderTarget(0, &d3d9Globals.defaultRenderTarget); - d3d9Globals.defaultRenderTarget->Release(); // refcount increased by Get - deviceCache.renderTargets[0] = d3d9Globals.defaultRenderTarget; - d3ddevice->GetDepthStencilSurface(&d3d9Globals.defaultDepthSurf); - d3d9Globals.defaultDepthSurf->Release(); // refcount increased by Get - deviceCache.depthSurface = d3d9Globals.defaultDepthSurf; - - d3d9Globals.numTextures = 0; - d3d9Globals.numVertexShaders = 0; - d3d9Globals.numPixelShaders = 0; - d3d9Globals.numVertexBuffers = 0; - d3d9Globals.numIndexBuffers = 0; - d3d9Globals.numVertexDeclarations = 0; - - VertexConstantData constants; - constants.normal.x = 0.0f; - constants.normal.y = 0.0f; - constants.normal.z = 0.0f; - constants.color.red = 0; - constants.color.green = 0; - constants.color.blue = 0; - constants.color.alpha = 255; - for(s = 0; s < 8; s++){ - constants.texCoors[s].u = 0.0f; - constants.texCoors[s].v = 0.0f; - } - assert(constantVertexStream == nil); - constantVertexStream = createVertexBuffer(sizeof(constants)*10000, 0, false); - assert(constantVertexStream); - uint8 *lockedvertices = lockVertices(constantVertexStream, 0, sizeof(constants), D3DLOCK_NOSYSLOCK); - assert(lockedvertices); - memcpy(lockedvertices, &constants, sizeof(constants)); - unlockVertices(constantVertexStream); - setStreamSource(2, constantVertexStream, 0, 0); - - d3ddevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); - rwStateCache.alphafunc = ALPHAGREATEREQUAL; - d3ddevice->SetRenderState(D3DRS_ALPHAREF, 10); - rwStateCache.alpharef = 10; - - rwStateCache.gsalpha = 0; - rwStateCache.gsalpharef = 128; - - d3ddevice->SetRenderState(D3DRS_FOGENABLE, FALSE); - rwStateCache.fogenable = 0; - d3ddevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR); - - d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - rwStateCache.cullmode = CULLNONE; - - d3ddevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); - d3ddevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - rwStateCache.srcblend = BLENDSRCALPHA; - d3ddevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); - rwStateCache.destblend = BLENDINVSRCALPHA; - d3ddevice->SetRenderState(D3DRS_ALPHABLENDENABLE, 0); - rwStateCache.vertexAlpha = 0; - rwStateCache.textureAlpha = 0; - - rwStateCache.stencilenable = 0; - d3ddevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); - rwStateCache.stencilfail = STENCILKEEP; - d3ddevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); - rwStateCache.stencilzfail = STENCILKEEP; - d3ddevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); - rwStateCache.stencilpass = STENCILKEEP; - d3ddevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP); - rwStateCache.stencilfunc = STENCILALWAYS; - d3ddevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); - rwStateCache.stencilref = 0; - d3ddevice->SetRenderState(D3DRS_STENCILREF, 0); - rwStateCache.stencilmask = 0xFFFFFFFF; - d3ddevice->SetRenderState(D3DRS_STENCILMASK, 0xFFFFFFFF); - rwStateCache.stencilwritemask = 0xFFFFFFFF; - d3ddevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF); - - setTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); -// setTextureStageState(0, D3DTSS_CONSTANT, 0xFFFFFFFF); -// setTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); -// setTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_CONSTANT); -// setTextureStageState(0, D3DTSS_COLOROP, D3DTA_CONSTANT); - - // These states exist, not all do - validStates[D3DRS_ZENABLE] = 1; - validStates[D3DRS_FILLMODE] = 1; - validStates[D3DRS_SHADEMODE] = 1; - validStates[D3DRS_ZWRITEENABLE] = 1; - validStates[D3DRS_ALPHATESTENABLE] = 1; - validStates[D3DRS_LASTPIXEL] = 1; - validStates[D3DRS_SRCBLEND] = 1; - validStates[D3DRS_DESTBLEND] = 1; - validStates[D3DRS_CULLMODE] = 1; - validStates[D3DRS_ZFUNC] = 1; - validStates[D3DRS_ALPHAREF] = 1; - validStates[D3DRS_ALPHAFUNC] = 1; - validStates[D3DRS_DITHERENABLE] = 1; - validStates[D3DRS_ALPHABLENDENABLE] = 1; - validStates[D3DRS_FOGENABLE] = 1; - validStates[D3DRS_SPECULARENABLE] = 1; - validStates[D3DRS_FOGCOLOR] = 1; - validStates[D3DRS_FOGTABLEMODE] = 1; - validStates[D3DRS_FOGSTART] = 1; - validStates[D3DRS_FOGEND] = 1; - validStates[D3DRS_FOGDENSITY] = 1; - validStates[D3DRS_RANGEFOGENABLE] = 1; - validStates[D3DRS_STENCILENABLE] = 1; - validStates[D3DRS_STENCILFAIL] = 1; - validStates[D3DRS_STENCILZFAIL] = 1; - validStates[D3DRS_STENCILPASS] = 1; - validStates[D3DRS_STENCILFUNC] = 1; - validStates[D3DRS_STENCILREF] = 1; - validStates[D3DRS_STENCILMASK] = 1; - validStates[D3DRS_STENCILWRITEMASK] = 1; - validStates[D3DRS_TEXTUREFACTOR] = 1; - validStates[D3DRS_WRAP0] = 1; - validStates[D3DRS_WRAP1] = 1; - validStates[D3DRS_WRAP2] = 1; - validStates[D3DRS_WRAP3] = 1; - validStates[D3DRS_WRAP4] = 1; - validStates[D3DRS_WRAP5] = 1; - validStates[D3DRS_WRAP6] = 1; - validStates[D3DRS_WRAP7] = 1; - validStates[D3DRS_CLIPPING] = 1; - validStates[D3DRS_LIGHTING] = 1; - validStates[D3DRS_AMBIENT] = 1; - validStates[D3DRS_FOGVERTEXMODE] = 1; - validStates[D3DRS_COLORVERTEX] = 1; - validStates[D3DRS_LOCALVIEWER] = 1; - validStates[D3DRS_NORMALIZENORMALS] = 1; - validStates[D3DRS_DIFFUSEMATERIALSOURCE] = 1; - validStates[D3DRS_SPECULARMATERIALSOURCE] = 1; - validStates[D3DRS_AMBIENTMATERIALSOURCE] = 1; - validStates[D3DRS_EMISSIVEMATERIALSOURCE] = 1; - validStates[D3DRS_VERTEXBLEND] = 1; - validStates[D3DRS_CLIPPLANEENABLE] = 1; - validStates[D3DRS_POINTSIZE] = 1; - validStates[D3DRS_POINTSIZE_MIN] = 1; - validStates[D3DRS_POINTSPRITEENABLE] = 1; - validStates[D3DRS_POINTSCALEENABLE] = 1; - validStates[D3DRS_POINTSCALE_A] = 1; - validStates[D3DRS_POINTSCALE_B] = 1; - validStates[D3DRS_POINTSCALE_C] = 1; - validStates[D3DRS_MULTISAMPLEANTIALIAS] = 1; - validStates[D3DRS_MULTISAMPLEMASK] = 1; - validStates[D3DRS_PATCHEDGESTYLE] = 1; - validStates[D3DRS_DEBUGMONITORTOKEN] = 1; - validStates[D3DRS_POINTSIZE_MAX] = 1; - validStates[D3DRS_INDEXEDVERTEXBLENDENABLE] = 1; - validStates[D3DRS_COLORWRITEENABLE] = 1; - validStates[D3DRS_TWEENFACTOR] = 1; - validStates[D3DRS_BLENDOP] = 1; - validStates[D3DRS_POSITIONDEGREE] = 1; - validStates[D3DRS_NORMALDEGREE] = 1; - validStates[D3DRS_SCISSORTESTENABLE] = 1; - validStates[D3DRS_SLOPESCALEDEPTHBIAS] = 1; - validStates[D3DRS_ANTIALIASEDLINEENABLE] = 1; - validStates[D3DRS_MINTESSELLATIONLEVEL] = 1; - validStates[D3DRS_MAXTESSELLATIONLEVEL] = 1; - validStates[D3DRS_ADAPTIVETESS_X] = 1; - validStates[D3DRS_ADAPTIVETESS_Y] = 1; - validStates[D3DRS_ADAPTIVETESS_Z] = 1; - validStates[D3DRS_ADAPTIVETESS_W] = 1; - validStates[D3DRS_ENABLEADAPTIVETESSELLATION] = 1; - validStates[D3DRS_TWOSIDEDSTENCILMODE] = 1; - validStates[D3DRS_CCW_STENCILFAIL] = 1; - validStates[D3DRS_CCW_STENCILZFAIL] = 1; - validStates[D3DRS_CCW_STENCILPASS] = 1; - validStates[D3DRS_CCW_STENCILFUNC] = 1; - validStates[D3DRS_COLORWRITEENABLE1] = 1; - validStates[D3DRS_COLORWRITEENABLE2] = 1; - validStates[D3DRS_COLORWRITEENABLE3] = 1; - validStates[D3DRS_BLENDFACTOR] = 1; - validStates[D3DRS_SRGBWRITEENABLE] = 1; - validStates[D3DRS_DEPTHBIAS] = 1; - validStates[D3DRS_WRAP8] = 1; - validStates[D3DRS_WRAP9] = 1; - validStates[D3DRS_WRAP10] = 1; - validStates[D3DRS_WRAP11] = 1; - validStates[D3DRS_WRAP12] = 1; - validStates[D3DRS_WRAP13] = 1; - validStates[D3DRS_WRAP14] = 1; - validStates[D3DRS_WRAP15] = 1; - validStates[D3DRS_SEPARATEALPHABLENDENABLE] = 1; - validStates[D3DRS_SRCBLENDALPHA] = 1; - validStates[D3DRS_DESTBLENDALPHA] = 1; - validStates[D3DRS_BLENDOPALPHA] = 1; - - validTexStates[D3DTSS_COLOROP] = 1; - validTexStates[D3DTSS_COLORARG1] = 1; - validTexStates[D3DTSS_COLORARG2] = 1; - validTexStates[D3DTSS_ALPHAOP] = 1; - validTexStates[D3DTSS_ALPHAARG1] = 1; - validTexStates[D3DTSS_ALPHAARG2] = 1; - validTexStates[D3DTSS_BUMPENVMAT00] = 1; - validTexStates[D3DTSS_BUMPENVMAT01] = 1; - validTexStates[D3DTSS_BUMPENVMAT10] = 1; - validTexStates[D3DTSS_BUMPENVMAT11] = 1; - validTexStates[D3DTSS_TEXCOORDINDEX] = 1; - validTexStates[D3DTSS_BUMPENVLSCALE] = 1; - validTexStates[D3DTSS_BUMPENVLOFFSET] = 1; - validTexStates[D3DTSS_TEXTURETRANSFORMFLAGS] = 1; - validTexStates[D3DTSS_COLORARG0] = 1; - validTexStates[D3DTSS_ALPHAARG0] = 1; - validTexStates[D3DTSS_RESULTARG] = 1; - validTexStates[D3DTSS_CONSTANT] = 1; - - // Save the current states - for(s = 0; s < MAXNUMSTATES; s++) - if(validStates[s]){ - d3ddevice->GetRenderState((D3DRENDERSTATETYPE)s, (DWORD*)&d3dStates[s]); - stateCache[s].value = d3dStates[s]; - } - for(t = 0; t < MAXNUMTEXSTATES; t++) - if(validTexStates[t]) - for(s = 0; s < MAXNUMSTAGES; s++){ - d3ddevice->GetTextureStageState(s, (D3DTEXTURESTAGESTATETYPE)t, (DWORD*)&d3dTextureStageStates[t][s]); - textureStageStateCache[t][s].value = d3dTextureStageStates[t][s]; - } - for(t = 1; t < MAXNUMSAMPLERSTATES; t++) - for(s = 0; s < MAXNUMSTAGES; s++){ - d3ddevice->GetSamplerState(s, (D3DSAMPLERSTATETYPE)t, (DWORD*)&d3dSamplerStates[t][s]); - d3dSamplerStates[t][s] = d3dSamplerStates[t][s]; - } - // init rw cache - for(t = 0; t < MAXNUMSTAGES; t++){ - setFilterMode(t, Texture::NEAREST); - setAddressU(t, Texture::WRAP); - setAddressV(t, Texture::WRAP); - } - - IDirect3DSurface9 *surf; - D3DLOCKED_RECT lr; - uint8 whitepixel[4] = {0xFF, 0xFF, 0xFF, 0xFF}; - whiteTex = (IDirect3DTexture9*)createTexture(1, 1, 1, 0, D3DFMT_X8R8G8B8); - whiteTex->GetSurfaceLevel(0, &surf); - HRESULT res = surf->LockRect(&lr, 0, D3DLOCK_NOSYSLOCK); - assert(res == D3D_OK); - memcpy(lr.pBits, whitepixel, 4); - surf->UnlockRect(); - surf->Release(); - - openIm2D(); - openIm3D(); - - return 1; -} - -static int -termD3D(void) -{ - destroyVertexBuffer(constantVertexStream); - constantVertexStream = nil; - - destroyTexture(whiteTex); - whiteTex = nil; - - closeIm3D(); - closeIm2D(); - - releaseVideoMemory(); - - ULONG ref = d3d::d3ddevice->Release(); - if(ref != 0) - printf("IDirect3D9Device_Release did not destroy\n"); - d3d::d3ddevice = nil; - return 1; -} - -static int -finalizeD3D(void) -{ - return 1; -} - -static int -deviceSystem(DeviceReq req, void *arg, int32 n) -{ - D3DADAPTER_IDENTIFIER9 adapter; - VideoMode *rwmode; - - switch(req){ - case DEVICEOPEN: - return openD3D((EngineOpenParams*)arg); - case DEVICECLOSE: - return closeD3D(); - - case DEVICEINIT: - return startD3D() && initD3D(); - case DEVICETERM: - return termD3D(); - - case DEVICEFINALIZE: - return finalizeD3D(); - - - case DEVICEGETNUMSUBSYSTEMS: - return d3d9Globals.numAdapters; - - case DEVICEGETCURRENTSUBSYSTEM: - return d3d9Globals.adapter; - - case DEVICESETSUBSYSTEM: - if(n >= d3d9Globals.numAdapters) - return 0; - d3d9Globals.adapter = n; - if(d3d9Globals.d3d9->GetDeviceCaps(d3d9Globals.adapter, D3DDEVTYPE_HAL, &d3d9Globals.caps) != D3D_OK) - return 0; - makeVideoModeList(); - return 1; - - case DEVICEGETSUBSSYSTEMINFO: - if(n >= d3d9Globals.numAdapters) - return 0; - if(d3d9Globals.d3d9->GetAdapterIdentifier(d3d9Globals.adapter, 0, &adapter) != D3D_OK) - return 0; - strncpy(((SubSystemInfo*)arg)->name, adapter.Description, sizeof(SubSystemInfo::name)); - return 1; - - - case DEVICEGETNUMVIDEOMODES: - return d3d9Globals.numModes; - - case DEVICEGETCURRENTVIDEOMODE: - return d3d9Globals.currentMode; - - case DEVICESETVIDEOMODE: - if(n >= d3d9Globals.numModes) - return 0; - d3d9Globals.currentMode = n; - return 1; - - case DEVICEGETVIDEOMODEINFO: - rwmode = (VideoMode*)arg; - rwmode->width = d3d9Globals.modes[n].mode.Width; - rwmode->height = d3d9Globals.modes[n].mode.Height; - rwmode->depth = findFormatDepth(d3d9Globals.modes[n].mode.Format); - rwmode->flags = d3d9Globals.modes[n].flags; - return 1; - case DEVICEGETMAXMULTISAMPLINGLEVELS: - { - assert(d3d9Globals.d3d9 != nil); - uint32 level; - DWORD quality; - for (level = D3DMULTISAMPLE_16_SAMPLES; level > D3DMULTISAMPLE_NONMASKABLE; level--) { - if (SUCCEEDED(d3d9Globals.d3d9->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3d9Globals.startMode.mode.Format, - !(d3d9Globals.startMode.flags & VIDEOMODEEXCLUSIVE), (D3DMULTISAMPLE_TYPE)level, - &quality))) - return level; - } - } - return 1; - case DEVICEGETMULTISAMPLINGLEVELS: - if(d3d9Globals.msLevel == 0) - return 1; - return d3d9Globals.msLevel; - case DEVICESETMULTISAMPLINGLEVELS: - d3d9Globals.msLevel = (uint32)n; - return 1; - } - return 1; -} - -Device renderdevice = { - 0.0f, 1.0f, - d3d::beginUpdate, - d3d::endUpdate, - d3d::clearCamera, - d3d::showRaster, - d3d::rasterRenderFast, - d3d::setRwRenderState, - d3d::getRwRenderState, - d3d::im2DRenderLine, - d3d::im2DRenderTriangle, - d3d::im2DRenderPrimitive, - d3d::im2DRenderIndexedPrimitive, - d3d::im3DTransform, - d3d::im3DRenderPrimitive, - d3d::im3DRenderIndexedPrimitive, - d3d::im3DEnd, - d3d::deviceSystem, -}; - -#endif -} -} diff --git a/vendor/librw/src/d3d/d3dimmed.cpp b/vendor/librw/src/d3d/d3dimmed.cpp deleted file mode 100644 index 331434b..0000000 --- a/vendor/librw/src/d3d/d3dimmed.cpp +++ /dev/null @@ -1,386 +0,0 @@ -#include -#include -#include -#include - -#define WITH_D3D -#include "../rwbase.h" -#include "../rwplg.h" -#include "../rwrender.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#include "rwd3d.h" -#include "rwd3d9.h" -#include "rwd3dimpl.h" - -namespace rw { -namespace d3d { - -#ifdef RW_D3D9 - -// might want to tweak this -#define NUMINDICES 10000 -#define NUMVERTICES 10000 - -static int primTypeMap[] = { - D3DPT_POINTLIST, // invalid - D3DPT_LINELIST, - D3DPT_LINESTRIP, - D3DPT_TRIANGLELIST, - D3DPT_TRIANGLESTRIP, - D3DPT_TRIANGLEFAN, - D3DPT_POINTLIST, // actually not supported! -}; - -static IDirect3DVertexDeclaration9 *im2ddecl; -static IDirect3DVertexBuffer9 *im2dvertbuf; -static IDirect3DIndexBuffer9 *im2dindbuf; - -void *im2dOverridePS; - -void -openIm2D(void) -{ - D3DVERTEXELEMENT9 elements[4] = { -// can't get proper fog with this :( -// { 0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITIONT, 0 }, - { 0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, - { 0, offsetof(Im2DVertex, color), D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, - { 0, offsetof(Im2DVertex, u), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, - D3DDECL_END() - }; - assert(im2ddecl == nil); - im2ddecl = (IDirect3DVertexDeclaration9*)d3d9::createVertexDeclaration((d3d9::VertexElement*)elements); - assert(im2ddecl); - - assert(im2dvertbuf == nil); - im2dvertbuf = (IDirect3DVertexBuffer9*)createVertexBuffer(NUMVERTICES*sizeof(Im2DVertex), 0, true); - assert(im2dvertbuf); - addDynamicVB(NUMVERTICES*sizeof(Im2DVertex), 0, &im2dvertbuf); - - assert(im2dindbuf == nil); - im2dindbuf = (IDirect3DIndexBuffer9*)createIndexBuffer(NUMINDICES*sizeof(uint16), true); - assert(im2dindbuf); - addDynamicIB(NUMINDICES*sizeof(uint16), &im2dindbuf); -} - -void -closeIm2D(void) -{ - d3d9::destroyVertexDeclaration(im2ddecl); - im2ddecl = nil; - - removeDynamicVB(&im2dvertbuf); - destroyVertexBuffer(im2dvertbuf); - im2dvertbuf = nil; - - removeDynamicIB(&im2dindbuf); - destroyIndexBuffer(im2dindbuf); - im2dindbuf = nil; -} - -static Im2DVertex tmpprimbuf[3]; - -void -im2DRenderLine(void *vertices, int32 numVertices, int32 vert1, int32 vert2) -{ - Im2DVertex *verts = (Im2DVertex*)vertices; - tmpprimbuf[0] = verts[vert1]; - tmpprimbuf[1] = verts[vert2]; - im2DRenderPrimitive(PRIMTYPELINELIST, tmpprimbuf, 2); -} - -void -im2DRenderTriangle(void *vertices, int32 numVertices, int32 vert1, int32 vert2, int32 vert3) -{ - Im2DVertex *verts = (Im2DVertex*)vertices; - tmpprimbuf[0] = verts[vert1]; - tmpprimbuf[1] = verts[vert2]; - tmpprimbuf[2] = verts[vert3]; - im2DRenderPrimitive(PRIMTYPETRILIST, tmpprimbuf, 3); -} - -void -im2DSetXform(void) -{ - float xform[4]; - Camera *cam; - cam = (Camera*)engine->currentCamera; - xform[0] = 2.0f/cam->frameBuffer->width; - xform[1] = -2.0f/cam->frameBuffer->height; - xform[2] = -1.0f; - xform[3] = 1.0f; - // TODO: should cache this... - d3ddevice->SetVertexShaderConstantF(VSLOC_afterLights, xform, 1); -} - -void -im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices) -{ - if(numVertices > NUMVERTICES){ - // TODO: error - return; - } - uint8 *lockedvertices = lockVertices(im2dvertbuf, 0, numVertices*sizeof(Im2DVertex), D3DLOCK_DISCARD); - memcpy(lockedvertices, vertices, numVertices*sizeof(Im2DVertex)); - unlockVertices(im2dvertbuf); - - setStreamSource(0, im2dvertbuf, 0, sizeof(Im2DVertex)); - setVertexDeclaration(im2ddecl); - - im2DSetXform(); - - setVertexShader(im2d_VS); - if(im2dOverridePS) - setPixelShader(im2dOverridePS); - else if(engine->device.getRenderState(TEXTURERASTER)) - setPixelShader(im2d_tex_PS); - else - setPixelShader(im2d_PS); - - d3d::flushCache(); - - uint32 primCount = 0; - switch(primType){ - case PRIMTYPELINELIST: - primCount = numVertices/2; - break; - case PRIMTYPEPOLYLINE: - primCount = numVertices-1; - break; - case PRIMTYPETRILIST: - primCount = numVertices/3; - break; - case PRIMTYPETRISTRIP: - primCount = numVertices-2; - break; - case PRIMTYPETRIFAN: - primCount = numVertices-2; - break; - case PRIMTYPEPOINTLIST: - primCount = numVertices; - break; - } - d3ddevice->DrawPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0, primCount); -} - -void -im2DRenderIndexedPrimitive(PrimitiveType primType, - void *vertices, int32 numVertices, void *indices, int32 numIndices) -{ - if(numVertices > NUMVERTICES || - numIndices > NUMINDICES){ - // TODO: error - return; - } - uint16 *lockedindices = lockIndices(im2dindbuf, 0, numIndices*sizeof(uint16), D3DLOCK_DISCARD); - memcpy(lockedindices, indices, numIndices*sizeof(uint16)); - unlockIndices(im2dindbuf); - - uint8 *lockedvertices = lockVertices(im2dvertbuf, 0, numVertices*sizeof(Im2DVertex), D3DLOCK_DISCARD); - memcpy(lockedvertices, vertices, numVertices*sizeof(Im2DVertex)); - unlockVertices(im2dvertbuf); - - setStreamSource(0, im2dvertbuf, 0, sizeof(Im2DVertex)); - setIndices(im2dindbuf); - setVertexDeclaration(im2ddecl); - - im2DSetXform(); - - setVertexShader(im2d_VS); - if(im2dOverridePS) - setPixelShader(im2dOverridePS); - else if(engine->device.getRenderState(TEXTURERASTER)) - setPixelShader(im2d_tex_PS); - else - setPixelShader(im2d_PS); - - d3d::flushCache(); - - uint32 primCount = 0; - switch(primType){ - case PRIMTYPELINELIST: - primCount = numIndices/2; - break; - case PRIMTYPEPOLYLINE: - primCount = numIndices-1; - break; - case PRIMTYPETRILIST: - primCount = numIndices/3; - break; - case PRIMTYPETRISTRIP: - primCount = numIndices-2; - break; - case PRIMTYPETRIFAN: - primCount = numIndices-2; - break; - case PRIMTYPEPOINTLIST: - primCount = numIndices; - break; - } - d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0, - 0, numVertices, - 0, primCount); -} - - -// Im3D - - -static IDirect3DVertexDeclaration9 *im3ddecl; -static IDirect3DVertexBuffer9 *im3dvertbuf; -static IDirect3DIndexBuffer9 *im3dindbuf; -static int32 num3DVertices; - -void -openIm3D(void) -{ - D3DVERTEXELEMENT9 elements[4] = { - { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, - { 0, offsetof(Im3DVertex, color), D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, - { 0, offsetof(Im3DVertex, u), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, - D3DDECL_END() - }; - - assert(im3ddecl == nil); - im3ddecl = (IDirect3DVertexDeclaration9*)d3d9::createVertexDeclaration((d3d9::VertexElement*)elements); - assert(im3ddecl); - - assert(im3dvertbuf == nil); - im3dvertbuf = (IDirect3DVertexBuffer9*)createVertexBuffer(NUMVERTICES*sizeof(Im3DVertex), 0, true); - assert(im3dvertbuf); - addDynamicVB(NUMVERTICES*sizeof(Im3DVertex), 0, &im3dvertbuf); - - assert(im3dindbuf == nil); - im3dindbuf = (IDirect3DIndexBuffer9*)createIndexBuffer(NUMINDICES*sizeof(uint16), true); - assert(im3dindbuf); - addDynamicIB(NUMINDICES*sizeof(uint16), &im3dindbuf); -} - -void -closeIm3D(void) -{ - d3d9::destroyVertexDeclaration(im3ddecl); - im3ddecl = nil; - - removeDynamicVB(&im3dvertbuf); - destroyVertexBuffer(im3dvertbuf); - im3dvertbuf = nil; - - removeDynamicIB(&im3dindbuf); - destroyIndexBuffer(im3dindbuf); - im3dindbuf = nil; -} - -void -im3DTransform(void *vertices, int32 numVertices, Matrix *world, uint32 flags) -{ - if(world == nil) - uploadMatrices(); - else - uploadMatrices(world); - - if((flags & im3d::VERTEXUV) == 0) - SetRenderStatePtr(TEXTURERASTER, nil); - - static RGBA white = { 255, 255, 255, 255 }; - static SurfaceProperties surfprops = { 0.0f, 0.0f, 0.0f }; - setMaterial(white, surfprops); - - uint8 *lockedvertices = lockVertices(im3dvertbuf, 0, numVertices*sizeof(Im3DVertex), D3DLOCK_DISCARD); - memcpy(lockedvertices, vertices, numVertices*sizeof(Im3DVertex)); - unlockVertices(im3dvertbuf); - - setStreamSource(0, im3dvertbuf, 0, sizeof(Im3DVertex)); - setVertexDeclaration(im3ddecl); - - setVertexShader(default_amb_VS); - - num3DVertices = numVertices; -} - -void -im3DRenderPrimitive(PrimitiveType primType) -{ - if(engine->device.getRenderState(TEXTURERASTER)) - setPixelShader(default_tex_PS); - else - setPixelShader(default_PS); - - d3d::flushCache(); - - uint32 primCount = 0; - switch(primType){ - case PRIMTYPELINELIST: - primCount = num3DVertices/2; - break; - case PRIMTYPEPOLYLINE: - primCount = num3DVertices-1; - break; - case PRIMTYPETRILIST: - primCount = num3DVertices/3; - break; - case PRIMTYPETRISTRIP: - primCount = num3DVertices-2; - break; - case PRIMTYPETRIFAN: - primCount = num3DVertices-2; - break; - case PRIMTYPEPOINTLIST: - primCount = num3DVertices; - break; - } - d3ddevice->DrawPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0, primCount); -} - -void -im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices) -{ - uint16 *lockedindices = lockIndices(im3dindbuf, 0, numIndices*sizeof(uint16), D3DLOCK_DISCARD); - memcpy(lockedindices, indices, numIndices*sizeof(uint16)); - unlockIndices(im3dindbuf); - - setIndices(im3dindbuf); - - if(engine->device.getRenderState(TEXTURERASTER)) - setPixelShader(default_tex_PS); - else - setPixelShader(default_PS); - - d3d::flushCache(); - - uint32 primCount = 0; - switch(primType){ - case PRIMTYPELINELIST: - primCount = numIndices/2; - break; - case PRIMTYPEPOLYLINE: - primCount = numIndices-1; - break; - case PRIMTYPETRILIST: - primCount = numIndices/3; - break; - case PRIMTYPETRISTRIP: - primCount = numIndices-2; - break; - case PRIMTYPETRIFAN: - primCount = numIndices-2; - break; - case PRIMTYPEPOINTLIST: - primCount = numIndices; - break; - } - d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0, - 0, num3DVertices, - 0, primCount); -} - -void -im3DEnd(void) -{ -} - -#endif -} -} diff --git a/vendor/librw/src/d3d/d3drender.cpp b/vendor/librw/src/d3d/d3drender.cpp deleted file mode 100644 index 86b7edc..0000000 --- a/vendor/librw/src/d3d/d3drender.cpp +++ /dev/null @@ -1,413 +0,0 @@ -#include -#include -#include -#include - -#define WITH_D3D -#include "../rwbase.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#include "rwd3d.h" - -namespace rw { -namespace d3d { - -#ifdef RW_D3D9 -IDirect3DDevice9 *d3ddevice = nil; - -#define MAX_LIGHTS 8 - - -#define VS_NAME g_vs20_main -#define PS_NAME g_ps20_main -void *default_amb_VS; -void *default_amb_dir_VS; -void *default_all_VS; -void *default_PS; -void *default_tex_PS; -void *im2d_VS; -void *im2d_PS; -void *im2d_tex_PS; - - -void -createDefaultShaders(void) -{ - { - static -#include "shaders/default_amb_VS.h" - default_amb_VS = createVertexShader((void*)VS_NAME); - assert(default_amb_VS); - } - { - static -#include "shaders/default_amb_dir_VS.h" - default_amb_dir_VS = createVertexShader((void*)VS_NAME); - assert(default_amb_dir_VS); - } - { - static -#include "shaders/default_all_VS.h" - default_all_VS = createVertexShader((void*)VS_NAME); - assert(default_all_VS); - } - - { - static -#include "shaders/default_PS.h" - default_PS = createPixelShader((void*)PS_NAME); - assert(default_PS); - } - { - static -#include "shaders/default_tex_PS.h" - default_tex_PS = createPixelShader((void*)PS_NAME); - assert(default_tex_PS); - } - - { - static -#include "shaders/im2d_VS.h" - im2d_VS = createVertexShader((void*)VS_NAME); - assert(im2d_VS); - } - { - static -#include "shaders/im2d_PS.h" - im2d_PS = createPixelShader((void*)PS_NAME); - assert(im2d_PS); - } - { - static -#include "shaders/im2d_tex_PS.h" - im2d_tex_PS = createPixelShader((void*)PS_NAME); - assert(im2d_tex_PS); - } -} - -void -destroyDefaultShaders(void) -{ - destroyVertexShader(default_amb_VS); - default_amb_VS = nil; - destroyVertexShader(default_amb_dir_VS); - default_amb_dir_VS = nil; - destroyVertexShader(default_all_VS); - default_all_VS = nil; - - destroyPixelShader(default_PS); - default_PS = nil; - destroyPixelShader(default_tex_PS); - default_tex_PS = nil; - - destroyVertexShader(im2d_VS); - im2d_VS = nil; - destroyPixelShader(im2d_PS); - im2d_PS = nil; - destroyPixelShader(im2d_tex_PS); - im2d_tex_PS = nil; -} - - -void -lightingCB_Fix(Atomic *atomic) -{ - WorldLights lightData; - Light *directionals[8]; - Light *locals[8]; - lightData.directionals = directionals; - lightData.numDirectionals = 8; - lightData.locals = locals; - lightData.numLocals = 8; - - ((World*)engine->currentWorld)->enumerateLights(atomic, &lightData); - - int i, n; - RGBA amb; - D3DLIGHT9 light; - light.Type = D3DLIGHT_DIRECTIONAL; - //light.Diffuse = { 0.8f, 0.8f, 0.8f, 1.0f }; - light.Specular = { 0.0f, 0.0f, 0.0f, 0.0f }; - light.Ambient = { 0.0f, 0.0f, 0.0f, 0.0f }; - light.Position = { 0.0f, 0.0f, 0.0f }; - //light.Direction = { 0.0f, 0.0f, -1.0f }; - light.Range = 0.0f; - light.Falloff = 0.0f; - light.Attenuation0 = 0.0f; - light.Attenuation1 = 0.0f; - light.Attenuation2 = 0.0f; - light.Theta = 0.0f; - light.Phi = 0.0f; - - convColor(&amb, &lightData.ambient); - d3d::setRenderState(D3DRS_AMBIENT, D3DCOLOR_RGBA(amb.red, amb.green, amb.blue, amb.alpha)); - - n = 0; - for(i = 0; i < lightData.numDirectionals; i++){ - if(n >= MAX_LIGHTS) - return; - Light *l = lightData.directionals[i]; - light.Type = D3DLIGHT_DIRECTIONAL; - light.Diffuse = *(D3DCOLORVALUE*)&l->color; - light.Direction = *(D3DVECTOR*)&l->getFrame()->getLTM()->at; - d3ddevice->SetLight(n, &light); - d3ddevice->LightEnable(n, TRUE); - n++; - } - - for(i = 0; i < lightData.numLocals; i++){ - if(n >= MAX_LIGHTS) - return; - Light *l = lightData.locals[i]; - switch(l->getType()){ - case Light::POINT: - light.Type = D3DLIGHT_POINT; - light.Diffuse = *(D3DCOLORVALUE*)&l->color; - light.Position = *(D3DVECTOR*)&l->getFrame()->getLTM()->pos; - light.Direction.x = 0.0f; - light.Direction.y = 0.0f; - light.Direction.z = 0.0f; - light.Range = l->radius; - light.Falloff = 1.0f; - light.Attenuation0 = 1.0f; - light.Attenuation1 = 0.0f/l->radius; - light.Attenuation2 = 5.0f/(l->radius*l->radius); - d3ddevice->SetLight(n, &light); - d3ddevice->LightEnable(n, TRUE); - n++; - break; - - case Light::SPOT: - light.Type = D3DLIGHT_SPOT; - light.Diffuse = *(D3DCOLORVALUE*)&l->color; - light.Position = *(D3DVECTOR*)&l->getFrame()->getLTM()->pos; - light.Direction = *(D3DVECTOR*)&l->getFrame()->getLTM()->at; - light.Range = l->radius; - light.Falloff = 1.0f; - light.Attenuation0 = 1.0f; - light.Attenuation1 = 0.0f/l->radius; - light.Attenuation2 = 5.0f/(l->radius*l->radius); - light.Theta = l->getAngle()*2.0f; - light.Phi = light.Theta; - d3ddevice->SetLight(n, &light); - d3ddevice->LightEnable(n, TRUE); - n++; - break; - - case Light::SOFTSPOT: - light.Type = D3DLIGHT_SPOT; - light.Diffuse = *(D3DCOLORVALUE*)&l->color; - light.Position = *(D3DVECTOR*)&l->getFrame()->getLTM()->pos; - light.Direction = *(D3DVECTOR*)&l->getFrame()->getLTM()->at; - light.Range = l->radius; - light.Falloff = 1.0f; - light.Attenuation0 = 1.0f; - light.Attenuation1 = 0.0f/l->radius; - light.Attenuation2 = 5.0f/(l->radius*l->radius); - light.Theta = 0.0f; - light.Phi = l->getAngle()*2.0f; - d3ddevice->SetLight(n, &light); - d3ddevice->LightEnable(n, TRUE); - n++; - break; - } - } - - for(; n < MAX_LIGHTS; n++) - d3ddevice->LightEnable(n, FALSE); -} - - -struct LightVS -{ - V3d color; float param0; - V3d position; float param1; - V3d direction; float param2; -}; - -void -setAmbient(const RGBAf &color) -{ - if(!equal(d3dShaderState.ambient, color)){ - d3dShaderState.ambient = color; - d3ddevice->SetVertexShaderConstantF(VSLOC_ambLight, (float*)&color, 1); - } -} - -void -setNumLights(int numDir, int numPoint, int numSpot) -{ - static int32 numLights[4*3]; - if(d3dShaderState.numDir != numDir || - d3dShaderState.numPoint != numPoint || - d3dShaderState.numSpot != numSpot){ - numLights[0] = d3dShaderState.numDir = numDir; - numLights[4] = d3dShaderState.numPoint = numPoint; - numLights[8] = d3dShaderState.numSpot = numSpot; - d3ddevice->SetVertexShaderConstantI(VSLOC_numLights, numLights, 3); - } -} - -int32 -uploadLights(WorldLights *lightData) -{ - int i; - int bits = 0; - float32 firstLight[4]; - firstLight[0] = 0; // directional - firstLight[1] = 0; // point - firstLight[2] = 0; // spot - firstLight[3] = 0; - - if(lightData->numAmbients) - bits |= VSLIGHT_AMBIENT; - - LightVS directionals[8]; - LightVS points[8]; - LightVS spots[8]; - for(i = 0; i < lightData->numDirectionals; i++){ - Light *l = lightData->directionals[i]; - directionals[i].color.x = l->color.red; - directionals[i].color.y = l->color.green; - directionals[i].color.z = l->color.blue; - directionals[i].direction = l->getFrame()->getLTM()->at; - bits |= VSLIGHT_DIRECT; - } - - int np = 0; - int ns = 0; - for(i = 0; i < lightData->numLocals; i++){ - Light *l = lightData->locals[i]; - - switch(l->getType()){ - case Light::POINT: - points[np].color.x = l->color.red; - points[np].color.y = l->color.green; - points[np].color.z = l->color.blue; - points[np].param0 = l->radius; - points[np].position = l->getFrame()->getLTM()->pos; - np++; - bits |= VSLIGHT_POINT; - break; - case Light::SPOT: - case Light::SOFTSPOT: - spots[ns].color.x = l->color.red; - spots[ns].color.y = l->color.green; - spots[ns].color.z = l->color.blue; - spots[ns].param0 = l->radius; - spots[ns].position = l->getFrame()->getLTM()->pos; - spots[ns].direction = l->getFrame()->getLTM()->at; - spots[ns].param1 = l->minusCosAngle; - // lower bound of falloff - if(l->getType() == Light::SOFTSPOT) - spots[ns].param2 = 0.0f; - else - spots[ns].param2 = 1.0f; - bits |= VSLIGHT_SPOT; - ns++; - break; - } - } - - firstLight[0] = 0; - int numDir = lightData->numDirectionals; - firstLight[1] = numDir + firstLight[0]; - int numPoint = np; - firstLight[2] = numPoint + firstLight[1]; - int numSpot = ns; - - setNumLights(numDir, numPoint, numSpot); - if(d3dShaderState.lightOffset[0] != firstLight[0] || - d3dShaderState.lightOffset[1] != firstLight[1] || - d3dShaderState.lightOffset[2] != firstLight[2]){ - d3dShaderState.lightOffset[0] = firstLight[0]; - d3dShaderState.lightOffset[1] = firstLight[1]; - d3dShaderState.lightOffset[2] = firstLight[2]; - d3ddevice->SetVertexShaderConstantF(VSLOC_lightOffset, firstLight, 1); - } - - int32 off = VSLOC_lights; - if(numDir) - d3ddevice->SetVertexShaderConstantF(off, (float*)&directionals, numDir*3); - off += numDir*3; - - if(numPoint) - d3ddevice->SetVertexShaderConstantF(off, (float*)&points, numPoint*3); - off += numPoint*3; - - if(numSpot) - d3ddevice->SetVertexShaderConstantF(off, (float*)&spots, numSpot*3); - - return bits; -} - -int32 -lightingCB_Shader(Atomic *atomic) -{ - WorldLights lightData; - Light *directionals[8]; - Light *locals[8]; - lightData.directionals = directionals; - lightData.numDirectionals = 8; - lightData.locals = locals; - lightData.numLocals = 8; - - if(atomic->geometry->flags & rw::Geometry::LIGHT){ - ((World*)engine->currentWorld)->enumerateLights(atomic, &lightData); - setAmbient(lightData.ambient); - if((atomic->geometry->flags & rw::Geometry::NORMALS) == 0){ - // Get rid of lights that need normals when we don't have any - lightData.numDirectionals = 0; - lightData.numLocals = 0; - } - return uploadLights(&lightData); - }else{ - static const RGBAf black = { 0.0f, 0.0f, 0.0f, 0.0f }; - setAmbient(black); - setNumLights(0, 0, 0); - return 0; - } -} - -static RawMatrix identityXform = { - { 1.0f, 0.0f, 0.0f }, 0.0f, - { 0.0f, 1.0f, 0.0f }, 0.0f, - { 0.0f, 0.0f, 1.0f }, 0.0f, - { 0.0f, 0.0f, 0.0f }, 1.0f -}; - -void -uploadMatrices(void) -{ - RawMatrix combined; - Camera *cam = engine->currentCamera; - d3ddevice->SetVertexShaderConstantF(VSLOC_world, (float*)&identityXform, 4); - d3ddevice->SetVertexShaderConstantF(VSLOC_normal, (float*)&identityXform, 4); - - RawMatrix::mult(&combined, &cam->devView, &cam->devProj); - d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&combined, 4); -} - -void -uploadMatrices(Matrix *worldMat) -{ - RawMatrix combined, world, worldview; - Camera *cam = engine->currentCamera; - convMatrix(&world, worldMat); - d3ddevice->SetVertexShaderConstantF(VSLOC_world, (float*)&world, 4); - // TODO: inverse transpose - d3ddevice->SetVertexShaderConstantF(VSLOC_normal, (float*)&world, 4); - - RawMatrix::mult(&worldview, &world, &cam->devView); - RawMatrix::mult(&combined, &worldview, &cam->devProj); - d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&combined, 4); -} - - - -#endif - -} -} diff --git a/vendor/librw/src/d3d/rwd3d.h b/vendor/librw/src/d3d/rwd3d.h deleted file mode 100644 index 4ce29be..0000000 --- a/vendor/librw/src/d3d/rwd3d.h +++ /dev/null @@ -1,411 +0,0 @@ -#ifdef RW_D3D9 -#ifdef WITH_D3D -#include -#endif -#endif - -namespace rw { - -#ifdef RW_D3D9 - -#ifdef _WINDOWS_ -struct EngineOpenParams -{ - HWND window; -}; -#else -struct EngineOpenParams -{ - uint32 please_include_windows_h; -}; -#endif -#else -#ifdef _D3D9_H_ -#error "please don't include d3d9.h for non-d3d9 platforms" -#endif -#endif - -namespace d3d { - -extern bool32 isP8supported; - -extern Device renderdevice; - -#ifdef RW_D3D9 -#ifdef _D3D9_H_ -extern IDirect3DDevice9 *d3ddevice; -void setD3dMaterial(D3DMATERIAL9 *mat9); -#endif - -#define COLOR_ARGB(a, r, g, b) ((rw::uint32)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff))) - -struct Im3DVertex -{ - V3d position; - uint32 color; - float32 u, v; - - void setX(float32 x) { this->position.x = x; } - void setY(float32 y) { this->position.y = y; } - void setZ(float32 z) { this->position.z = z; } - void setColor(uint8 r, uint8 g, uint8 b, uint8 a) { this->color = COLOR_ARGB(a, r, g, b); } - void setU(float32 u) { this->u = u; } - void setV(float32 v) { this->v = v; } - - float getX(void) { return this->position.x; } - float getY(void) { return this->position.y; } - float getZ(void) { return this->position.z; } - RGBA getColor(void) { return makeRGBA(this->color>>16 & 0xFF, this->color>>8 & 0xFF, - this->color & 0xFF, this->color>>24 & 0xFF); } - float getU(void) { return this->u; } - float getV(void) { return this->v; } -}; - -struct Im2DVertex -{ - float32 x, y, z; - //float32 q; // recipz no longer used because we have a vertex stage now - float32 w; - uint32 color; - float32 u, v; - - void setScreenX(float32 x) { this->x = x; } - void setScreenY(float32 y) { this->y = y; } - void setScreenZ(float32 z) { this->z = z; } - void setCameraZ(float32 z) { this->w = z; } -// void setRecipCameraZ(float32 recipz) { this->q = recipz; } - void setRecipCameraZ(float32 recipz) { this->w = 1.0f/recipz; } - void setColor(uint8 r, uint8 g, uint8 b, uint8 a) { this->color = COLOR_ARGB(a, r, g, b); } - void setU(float32 u, float recipZ) { this->u = u; } - void setV(float32 v, float recipZ) { this->v = v; } - - float getScreenX(void) { return this->x; } - float getScreenY(void) { return this->y; } - float getScreenZ(void) { return this->z; } -// float getCameraZ(void) { return 1.0f/this->q; } -// float getRecipCameraZ(void) { return this->q; } - float getCameraZ(void) { return this->w; } - float getRecipCameraZ(void) { return 1.0f/this->w; } - RGBA getColor(void) { return makeRGBA(this->color>>16 & 0xFF, this->color>>8 & 0xFF, - this->color & 0xFF, this->color>>24 & 0xFF); } - float getU(void) { return this->u; } - float getV(void) { return this->v; } -}; - -#else -#ifndef MAKEFOURCC -#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ - ((uint32)(uint8)(ch0) | ((uint32)(uint8)(ch1) << 8) | \ - ((uint32)(uint8)(ch2) << 16) | ((uint32)(uint8)(ch3) << 24 )) -#endif -enum { - D3DFMT_UNKNOWN = 0, - - D3DFMT_R8G8B8 = 20, - D3DFMT_A8R8G8B8 = 21, - D3DFMT_X8R8G8B8 = 22, - D3DFMT_R5G6B5 = 23, - D3DFMT_X1R5G5B5 = 24, - D3DFMT_A1R5G5B5 = 25, - D3DFMT_A4R4G4B4 = 26, - D3DFMT_R3G3B2 = 27, - D3DFMT_A8 = 28, - D3DFMT_A8R3G3B2 = 29, - D3DFMT_X4R4G4B4 = 30, - D3DFMT_A2B10G10R10 = 31, - D3DFMT_A8B8G8R8 = 32, - D3DFMT_X8B8G8R8 = 33, - D3DFMT_G16R16 = 34, - D3DFMT_A2R10G10B10 = 35, - D3DFMT_A16B16G16R16 = 36, - - D3DFMT_A8P8 = 40, - D3DFMT_P8 = 41, - - D3DFMT_L8 = 50, - D3DFMT_A8L8 = 51, - D3DFMT_A4L4 = 52, - - D3DFMT_V8U8 = 60, - D3DFMT_L6V5U5 = 61, - D3DFMT_X8L8V8U8 = 62, - D3DFMT_Q8W8V8U8 = 63, - D3DFMT_V16U16 = 64, - D3DFMT_A2W10V10U10 = 67, - - D3DFMT_UYVY = MAKEFOURCC('U', 'Y', 'V', 'Y'), - D3DFMT_R8G8_B8G8 = MAKEFOURCC('R', 'G', 'B', 'G'), - D3DFMT_YUY2 = MAKEFOURCC('Y', 'U', 'Y', '2'), - D3DFMT_G8R8_G8B8 = MAKEFOURCC('G', 'R', 'G', 'B'), - D3DFMT_DXT1 = MAKEFOURCC('D', 'X', 'T', '1'), - D3DFMT_DXT2 = MAKEFOURCC('D', 'X', 'T', '2'), - D3DFMT_DXT3 = MAKEFOURCC('D', 'X', 'T', '3'), - D3DFMT_DXT4 = MAKEFOURCC('D', 'X', 'T', '4'), - D3DFMT_DXT5 = MAKEFOURCC('D', 'X', 'T', '5'), - - D3DFMT_D16_LOCKABLE = 70, - D3DFMT_D32 = 71, - D3DFMT_D15S1 = 73, - D3DFMT_D24S8 = 75, - D3DFMT_D24X8 = 77, - D3DFMT_D24X4S4 = 79, - D3DFMT_D16 = 80, - - D3DFMT_D32F_LOCKABLE = 82, - D3DFMT_D24FS8 = 83, - - // d3d9ex only - /* Z-Stencil formats valid for CPU access */ - D3DFMT_D32_LOCKABLE = 84, - D3DFMT_S8_LOCKABLE = 85, - - D3DFMT_L16 = 81, - - D3DFMT_VERTEXDATA =100, - D3DFMT_INDEX16 =101, - D3DFMT_INDEX32 =102, - - D3DFMT_Q16W16V16U16 =110, - - D3DFMT_MULTI2_ARGB8 = MAKEFOURCC('M','E','T','1'), - - // Floating point surface formats - - // s10e5 formats (16-bits per channel) - D3DFMT_R16F = 111, - D3DFMT_G16R16F = 112, - D3DFMT_A16B16G16R16F = 113, - - // IEEE s23e8 formats (32-bits per channel) - D3DFMT_R32F = 114, - D3DFMT_G32R32F = 115, - D3DFMT_A32B32G32R32F = 116, - - D3DFMT_CxV8U8 = 117, - - // d3d9ex only - // Monochrome 1 bit per pixel format - D3DFMT_A1 = 118, - // 2.8 biased fixed point - D3DFMT_A2B10G10R10_XR_BIAS = 119, - // Binary format indicating that the data has no inherent type - D3DFMT_BINARYBUFFER = 199 -}; - -enum { - D3DLOCK_NOSYSLOCK = 0, // ignored - D3DPOOL_MANAGED = 0, // ignored - D3DPT_TRIANGLELIST = 4, - D3DPT_TRIANGLESTRIP = 5, - - - D3DDECLTYPE_FLOAT1 = 0, // 1D float expanded to (value, 0., 0., 1.) - D3DDECLTYPE_FLOAT2 = 1, // 2D float expanded to (value, value, 0., 1.) - D3DDECLTYPE_FLOAT3 = 2, // 3D float expanded to (value, value, value, 1.) - D3DDECLTYPE_FLOAT4 = 3, // 4D float - D3DDECLTYPE_D3DCOLOR = 4, // 4D packed unsigned bytes mapped to 0. to 1. range - // Input is in D3DCOLOR format (ARGB) expanded to (R, G, B, A) - D3DDECLTYPE_UBYTE4 = 5, // 4D unsigned byte - D3DDECLTYPE_SHORT2 = 6, // 2D signed short expanded to (value, value, 0., 1.) - D3DDECLTYPE_SHORT4 = 7, // 4D signed short - - D3DDECLTYPE_UBYTE4N = 8, // Each of 4 bytes is normalized by dividing to 255.0 - D3DDECLTYPE_SHORT2N = 9, // 2D signed short normalized (v[0]/32767.0,v[1]/32767.0,0,1) - D3DDECLTYPE_SHORT4N = 10, // 4D signed short normalized (v[0]/32767.0,v[1]/32767.0,v[2]/32767.0,v[3]/32767.0) - D3DDECLTYPE_USHORT2N = 11, // 2D unsigned short normalized (v[0]/65535.0,v[1]/65535.0,0,1) - D3DDECLTYPE_USHORT4N = 12, // 4D unsigned short normalized (v[0]/65535.0,v[1]/65535.0,v[2]/65535.0,v[3]/65535.0) - D3DDECLTYPE_UDEC3 = 13, // 3D unsigned 10 10 10 format expanded to (value, value, value, 1) - D3DDECLTYPE_DEC3N = 14, // 3D signed 10 10 10 format normalized and expanded to (v[0]/511.0, v[1]/511.0, v[2]/511.0, 1) - D3DDECLTYPE_FLOAT16_2 = 15, // Two 16-bit floating point values, expanded to (value, value, 0, 1) - D3DDECLTYPE_FLOAT16_4 = 16, // Four 16-bit floating point values - D3DDECLTYPE_UNUSED = 17, // When the type field in a decl is unused. - - - D3DDECLMETHOD_DEFAULT = 0, - - - D3DDECLUSAGE_POSITION = 0, - D3DDECLUSAGE_BLENDWEIGHT, // 1 - D3DDECLUSAGE_BLENDINDICES, // 2 - D3DDECLUSAGE_NORMAL, // 3 - D3DDECLUSAGE_PSIZE, // 4 - D3DDECLUSAGE_TEXCOORD, // 5 - D3DDECLUSAGE_TANGENT, // 6 - D3DDECLUSAGE_BINORMAL, // 7 - D3DDECLUSAGE_TESSFACTOR, // 8 - D3DDECLUSAGE_POSITIONT, // 9 - D3DDECLUSAGE_COLOR, // 10 - D3DDECLUSAGE_FOG, // 11 - D3DDECLUSAGE_DEPTH, // 12 - D3DDECLUSAGE_SAMPLE // 13 - , - - D3DUSAGE_AUTOGENMIPMAP = 0x400 -}; -#endif - -extern int vertFormatMap[]; - -void *createIndexBuffer(uint32 length, bool dynamic); -void destroyIndexBuffer(void *indexBuffer); -uint16 *lockIndices(void *indexBuffer, uint32 offset, uint32 size, uint32 flags); -void unlockIndices(void *indexBuffer); - -void *createVertexBuffer(uint32 length, uint32 fvf, bool dynamic); -void destroyVertexBuffer(void *vertexBuffer); -uint8 *lockVertices(void *vertexBuffer, uint32 offset, uint32 size, uint32 flags); -void unlockVertices(void *vertexBuffer); - -void *createTexture(int32 width, int32 height, int32 levels, uint32 usage, uint32 format); -void destroyTexture(void *texture); -uint8 *lockTexture(void *texture, int32 level); -void unlockTexture(void *texture, int32 level); - -// Native Texture and Raster - -struct D3dRaster -{ - void *texture; - void *palette; - void *lockedSurf; - uint32 format; - uint32 bpp; // bytes per pixel - bool hasAlpha; - bool customFormat; - bool autogenMipmap; -}; - -int32 getLevelSize(Raster *raster, int32 level); -void allocateDXT(Raster *raster, int32 dxt, int32 numLevels, bool32 hasAlpha); -void setPalette(Raster *raster, void *palette, int32 size); -void setTexels(Raster *raster, void *texels, int32 level); - -extern int32 nativeRasterOffset; -void registerNativeRaster(void); -#define GETD3DRASTEREXT(raster) PLUGINOFFSET(rw::d3d::D3dRaster, raster, rw::d3d::nativeRasterOffset) - -// Rendering - -void setRenderState(uint32 state, uint32 value); -void getRenderState(uint32 state, uint32 *value); -void setTextureStageState(uint32 stage, uint32 type, uint32 value); -void getTextureStageState(uint32 stage, uint32 type, uint32 *value); -void setSamplerState(uint32 stage, uint32 type, uint32 value); -void getSamplerState(uint32 stage, uint32 type, uint32 *value); -void flushCache(void); - -void setTexture(uint32 stage, Texture *tex); -void setMaterial(const RGBA &color, const SurfaceProperties &surfaceprops, float extraSurfProp = 0.0f); -inline void setMaterial(uint32 flags, const RGBA &color, const SurfaceProperties &surfaceprops, float extraSurfProp = 0.0f) -{ - static RGBA white = { 255, 255, 255, 255 }; - if(flags & Geometry::MODULATE) - setMaterial(color, surfaceprops, extraSurfProp); - else - setMaterial(white, surfaceprops, extraSurfProp); -} - -void setVertexShader(void *vs); -void setPixelShader(void *ps); -void setIndices(void *indexBuffer); -void setStreamSource(int n, void *buffer, uint32 offset, uint32 stride); -void setVertexDeclaration(void *declaration); - -void *createVertexShader(void *csosrc); -void *createPixelShader(void *csosrc); -void destroyVertexShader(void *shader); -void destroyPixelShader(void *shader); - - -/* - * Vertex shaders and common pipeline stuff - */ - -// This data will be available in vertex stream 2 -struct VertexConstantData -{ - V3d normal; - RGBA color; - TexCoords texCoors[8]; -}; -extern void *constantVertexStream; - -// TODO: figure out why this even still exists... -struct D3dShaderState -{ - // for VS - struct { - float32 start; - float32 end; - float32 range; // 1/(start-end) - float32 disable; // lower clamp - } fogData, fogDisable; - RGBA matColor; - SurfaceProperties surfProps; - float extraSurfProp; - float lightOffset[3]; - int32 numDir, numPoint, numSpot; - RGBAf ambient; - // for PS - RGBAf fogColor; - - bool fogDirty; -}; -extern D3dShaderState d3dShaderState; - -// Standard Vertex shader locations -enum -{ - VSLOC_combined = 0, - VSLOC_world = 4, - VSLOC_normal = 8, - VSLOC_matColor = 12, - VSLOC_surfProps = 13, - VSLOC_fogData = 14, - VSLOC_ambLight = 15, - VSLOC_lightOffset = 16, - VSLOC_lights = 17, - VSLOC_afterLights = VSLOC_lights + 8*3, - - VSLOC_numLights = 0, - - PSLOC_fogColor = 0 -}; - -// Vertex shader bits -enum -{ - // These should be low so they could be used as indices - VSLIGHT_DIRECT = 1, - VSLIGHT_POINT = 2, - VSLIGHT_SPOT = 4, - VSLIGHT_MASK = 7, // all the above - // less critical - VSLIGHT_AMBIENT = 8, -}; - -void lightingCB_Fix(Atomic *atomic); -int32 lightingCB_Shader(Atomic *atomic); -// for VS -void uploadMatrices(void); // no world transform -void uploadMatrices(Matrix *worldMat); -void setAmbient(const RGBAf &color); -void setNumLights(int numDir, int numPoint, int numSpot); -int32 uploadLights(WorldLights *lightData); // called by lightingCB_Shader - -extern void *im2dOverridePS; - -extern void *default_amb_VS; -extern void *default_amb_dir_VS; -extern void *default_all_VS; -extern void *default_PS; -extern void *default_tex_PS; -extern void *im2d_VS; -extern void *im2d_PS; -extern void *im2d_tex_PS; -void createDefaultShaders(void); -void destroyDefaultShaders(void); - - -} -} diff --git a/vendor/librw/src/d3d/rwd3d8.h b/vendor/librw/src/d3d/rwd3d8.h deleted file mode 100644 index 422379d..0000000 --- a/vendor/librw/src/d3d/rwd3d8.h +++ /dev/null @@ -1,74 +0,0 @@ -namespace rw { -namespace d3d8 { - -void registerPlatformPlugins(void); - -struct InstanceData -{ - uint32 minVert; - int32 stride; - int32 numVertices; - int32 numIndices; - Material *material; - uint32 vertexShader; - uint32 primType; - void *indexBuffer; - void *vertexBuffer; - uint32 baseIndex; - uint8 vertexAlpha; - uint8 managed; - uint8 remapped; -}; - -struct InstanceDataHeader : rw::InstanceDataHeader -{ - uint16 serialNumber; - uint16 numMeshes; - - InstanceData *inst; -}; - -uint32 makeFVFDeclaration(uint32 flags, int32 numTex); -int32 getStride(uint32 flags, int32 numTex); - -void *destroyNativeData(void *object, int32, int32); -Stream *readNativeData(Stream *stream, int32 len, void *object, int32, int32); -Stream *writeNativeData(Stream *stream, int32 len, void *object, int32, int32); -int32 getSizeNativeData(void *object, int32, int32); -void registerNativeDataPlugin(void); - -class ObjPipeline : public rw::ObjPipeline -{ -public: - void init(void); - static ObjPipeline *create(void); - - void (*instanceCB)(Geometry *geo, InstanceData *header); - void (*uninstanceCB)(Geometry *geo, InstanceData *header); - void (*renderCB)(Atomic *atomic, InstanceDataHeader *header); -}; - -void defaultInstanceCB(Geometry *geo, InstanceData *header); -void defaultUninstanceCB(Geometry *geo, InstanceData *header); -void defaultRenderCB(Atomic *atomic, InstanceDataHeader *header); - -ObjPipeline *makeDefaultPipeline(void); - -// Skin plugin - -void initSkin(void); -ObjPipeline *makeSkinPipeline(void); - -// MatFX plugin - -void initMatFX(void); -ObjPipeline *makeMatFXPipeline(void); - -// Native Texture and Raster - -Texture *readNativeTexture(Stream *stream); -void writeNativeTexture(Texture *tex, Stream *stream); -uint32 getSizeNativeTexture(Texture *tex); - -} -} diff --git a/vendor/librw/src/d3d/rwd3d9.h b/vendor/librw/src/d3d/rwd3d9.h deleted file mode 100644 index 03eccd5..0000000 --- a/vendor/librw/src/d3d/rwd3d9.h +++ /dev/null @@ -1,112 +0,0 @@ -namespace rw { -namespace d3d9 { - -void registerPlatformPlugins(void); - -struct VertexElement -{ - uint16 stream; - uint16 offset; - uint8 type; - uint8 method; - uint8 usage; - uint8 usageIndex; -}; - -struct VertexStream -{ - void *vertexBuffer; - uint32 offset; - uint32 stride; - uint16 geometryFlags; - uint8 managed; - uint8 dynamicLock; -}; - -struct InstanceData -{ - uint32 numIndex; - uint32 minVert; - Material *material; - bool32 vertexAlpha; - void *vertexShader; - uint32 baseIndex; - uint32 numVertices; - uint32 startIndex; - uint32 numPrimitives; -}; - -struct InstanceDataHeader : rw::InstanceDataHeader -{ - uint32 serialNumber; - uint32 numMeshes; - void *indexBuffer; - uint32 primType; - VertexStream vertexStream[2]; - bool32 useOffsets; - void *vertexDeclaration; - uint32 totalNumIndex; - uint32 totalNumVertex; - - InstanceData *inst; -}; - -void *createVertexDeclaration(VertexElement *elements); -void destroyVertexDeclaration(void *delaration); -uint32 getDeclaration(void *declaration, VertexElement *elements); - -void drawInst_simple(d3d9::InstanceDataHeader *header, d3d9::InstanceData *inst); -// Emulate PS2 GS alpha test FB_ONLY case: failed alpha writes to frame- but not to depth buffer -void drawInst_GSemu(d3d9::InstanceDataHeader *header, InstanceData *inst); -// This one switches between the above two depending on render state; -void drawInst(d3d9::InstanceDataHeader *header, d3d9::InstanceData *inst); - - - - -void *destroyNativeData(void *object, int32, int32); -Stream *readNativeData(Stream *stream, int32 len, void *object, int32, int32); -Stream *writeNativeData(Stream *stream, int32 len, void *object, int32, int32); -int32 getSizeNativeData(void *object, int32, int32); -void registerNativeDataPlugin(void); - -class ObjPipeline : public rw::ObjPipeline -{ -public: - void init(void); - static ObjPipeline *create(void); - - void (*instanceCB)(Geometry *geo, InstanceDataHeader *header, bool32 reinstance); - void (*uninstanceCB)(Geometry *geo, InstanceDataHeader *header); - void (*renderCB)(Atomic *atomic, InstanceDataHeader *header); -}; - -void defaultInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance); -void defaultUninstanceCB(Geometry *geo, InstanceDataHeader *header); -void defaultRenderCB_Fix(Atomic *atomic, InstanceDataHeader *header); -void defaultRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header); - -ObjPipeline *makeDefaultPipeline(void); - - -// Skin plugin - -void initSkin(void); -void uploadSkinMatrices(Atomic *atomic); -void skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance); -void skinRenderCB(Atomic *atomic, InstanceDataHeader *header); -ObjPipeline *makeSkinPipeline(void); - -// MatFX plugin - -void initMatFX(void); -ObjPipeline *makeMatFXPipeline(void); - -// Native Texture and Raster - -Texture *readNativeTexture(Stream *stream); -void writeNativeTexture(Texture *tex, Stream *stream); -uint32 getSizeNativeTexture(Texture *tex); - -} -} diff --git a/vendor/librw/src/d3d/rwd3dimpl.h b/vendor/librw/src/d3d/rwd3dimpl.h deleted file mode 100644 index 82f8a13..0000000 --- a/vendor/librw/src/d3d/rwd3dimpl.h +++ /dev/null @@ -1,81 +0,0 @@ -namespace rw { -namespace d3d { - -#ifdef RW_D3D9 -void openIm2D(void); -void closeIm2D(void); -void im2DRenderLine(void *vertices, int32 numVertices, int32 vert1, int32 vert2); -void im2DRenderTriangle(void *vertices, int32 numVertices, int32 vert1, int32 vert2, int32 vert3); -void im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices); -void im2DRenderIndexedPrimitive(PrimitiveType primType, void *vertices, int32 numVertices, void *indices, int32 numIndices); - -void openIm3D(void); -void closeIm3D(void); -void im3DTransform(void *vertices, int32 numVertices, Matrix *world, uint32 flags); -void im3DRenderPrimitive(PrimitiveType primType); -void im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices); -void im3DEnd(void); - - -struct DisplayMode -{ - D3DDISPLAYMODE mode; - uint32 flags; -}; - -struct D3d9Globals -{ - HWND window; - - IDirect3D9 *d3d9; - int numAdapters; - int adapter; - D3DCAPS9 caps; - DisplayMode *modes; - int numModes; - int currentMode; - DisplayMode startMode; - - uint32 msLevel; - - D3DPRESENT_PARAMETERS present; - - IDirect3DSurface9 *defaultRenderTarget; - IDirect3DSurface9 *defaultDepthSurf; - - int numTextures; - int numVertexShaders; - int numPixelShaders; - int numVertexBuffers; - int numIndexBuffers; - int numVertexDeclarations; -}; - -extern D3d9Globals d3d9Globals; - -void addVidmemRaster(Raster *raster); -void removeVidmemRaster(Raster *raster); - -void addDynamicVB(uint32 length, uint32 fvf, IDirect3DVertexBuffer9 **buf); // NB: don't share this pointer -void removeDynamicVB(IDirect3DVertexBuffer9 **buf); - -void addDynamicIB(uint32 length, IDirect3DIndexBuffer9 **buf); // NB: don't share this pointer -void removeDynamicIB(IDirect3DIndexBuffer9 **buf); - - -int findFormatDepth(uint32 format); -void evictD3D9Raster(Raster *raster); - -#endif - -Raster *rasterCreate(Raster *raster); -uint8 *rasterLock(Raster *raster, int32 level, int32 lockMode); -void rasterUnlock(Raster *raster, int32 level); -int32 rasterNumLevels(Raster *raster); -bool32 imageFindRasterFormat(Image *img, int32 type, - int32 *width, int32 *height, int32 *depth, int32 *format); -bool32 rasterFromImage(Raster *raster, Image *image); -Image *rasterToImage(Raster *raster); - -} -} diff --git a/vendor/librw/src/d3d/rwxbox.h b/vendor/librw/src/d3d/rwxbox.h deleted file mode 100644 index 1abebe1..0000000 --- a/vendor/librw/src/d3d/rwxbox.h +++ /dev/null @@ -1,195 +0,0 @@ -namespace rw { -namespace xbox { - -void registerPlatformPlugins(void); - -extern int v3dFormatMap[6]; -extern int v2dFormatMap[6]; - -struct InstanceData -{ - uint32 minVert; - int32 numVertices; - int32 numIndices; - void *indexBuffer; - Material *material; - uint32 vertexShader; -}; - -struct InstanceDataHeader : rw::InstanceDataHeader -{ - int32 size; - uint16 serialNumber; - uint16 numMeshes; - uint32 primType; - int32 numVertices; - int32 stride; - void *vertexBuffer; - bool32 vertexAlpha; - InstanceData *begin; - InstanceData *end; - - uint8 *data; -}; - -void *destroyNativeData(void *object, int32, int32); -Stream *readNativeData(Stream *stream, int32 len, void *object, int32, int32); -Stream *writeNativeData(Stream *stream, int32 len, void *object, int32, int32); -int32 getSizeNativeData(void *object, int32, int32); -void registerNativeDataPlugin(void); - -class ObjPipeline : public rw::ObjPipeline -{ -public: - void init(void); - static ObjPipeline *create(void); - - void (*instanceCB)(Geometry *geo, InstanceDataHeader *header); - void (*uninstanceCB)(Geometry *geo, InstanceDataHeader *header); -}; - -ObjPipeline *makeDefaultPipeline(void); - -void defaultInstanceCB(Geometry *geo, InstanceDataHeader *header); -void defaultUninstanceCB(Geometry *geo, InstanceDataHeader *header); - -// Skin plugin - -Stream *readNativeSkin(Stream *stream, int32, void *object, int32 offset); -Stream *writeNativeSkin(Stream *stream, int32 len, void *object, int32 offset); -int32 getSizeNativeSkin(void *object, int32 offset); - -void initSkin(void); -ObjPipeline *makeSkinPipeline(void); - -// MatFX plugin - -void initMatFX(void); -ObjPipeline *makeMatFXPipeline(void); - -// Vertex Format plugin - -extern uint32 vertexFormatSizes[6]; - -uint32 *getVertexFmt(Geometry *g); -uint32 makeVertexFmt(int32 flags, uint32 numTexSets); -uint32 getVertexFmtStride(uint32 fmt); - -void registerVertexFormatPlugin(void); - -// Native Texture and Raster - -struct XboxRaster -{ - void *texture; - void *palette; - uint32 format; - uint32 bpp; // bytes per pixel - bool hasAlpha; - bool customFormat; - bool32 unknownFlag; -}; - -int32 getLevelSize(Raster *raster, int32 level); - -extern int32 nativeRasterOffset; -void registerNativeRaster(void); -#define GETXBOXRASTEREXT(raster) PLUGINOFFSET(rw::xbox::XboxRaster, raster, rw::xbox::nativeRasterOffset) - -Texture *readNativeTexture(Stream *stream); -void writeNativeTexture(Texture *tex, Stream *stream); -uint32 getSizeNativeTexture(Texture *tex); - -enum { - D3DFMT_UNKNOWN = 0xFFFFFFFF, - - /* Swizzled formats */ - - D3DFMT_A8R8G8B8 = 0x00000006, - D3DFMT_X8R8G8B8 = 0x00000007, - D3DFMT_R5G6B5 = 0x00000005, - D3DFMT_R6G5B5 = 0x00000027, - D3DFMT_X1R5G5B5 = 0x00000003, - D3DFMT_A1R5G5B5 = 0x00000002, - D3DFMT_A4R4G4B4 = 0x00000004, - D3DFMT_A8 = 0x00000019, - D3DFMT_A8B8G8R8 = 0x0000003A, - D3DFMT_B8G8R8A8 = 0x0000003B, - D3DFMT_R4G4B4A4 = 0x00000039, - D3DFMT_R5G5B5A1 = 0x00000038, - D3DFMT_R8G8B8A8 = 0x0000003C, - D3DFMT_R8B8 = 0x00000029, - D3DFMT_G8B8 = 0x00000028, - - D3DFMT_P8 = 0x0000000B, - - D3DFMT_L8 = 0x00000000, - D3DFMT_A8L8 = 0x0000001A, - D3DFMT_AL8 = 0x00000001, - D3DFMT_L16 = 0x00000032, - - D3DFMT_V8U8 = 0x00000028, - D3DFMT_L6V5U5 = 0x00000027, - D3DFMT_X8L8V8U8 = 0x00000007, - D3DFMT_Q8W8V8U8 = 0x0000003A, - D3DFMT_V16U16 = 0x00000033, - - D3DFMT_D16_LOCKABLE = 0x0000002C, - D3DFMT_D16 = 0x0000002C, - D3DFMT_D24S8 = 0x0000002A, - D3DFMT_F16 = 0x0000002D, - D3DFMT_F24S8 = 0x0000002B, - - /* YUV formats */ - - D3DFMT_YUY2 = 0x00000024, - D3DFMT_UYVY = 0x00000025, - - /* Compressed formats */ - - D3DFMT_DXT1 = 0x0000000C, - D3DFMT_DXT2 = 0x0000000E, - D3DFMT_DXT3 = 0x0000000E, - D3DFMT_DXT4 = 0x0000000F, - D3DFMT_DXT5 = 0x0000000F, - - /* Linear formats */ - - D3DFMT_LIN_A1R5G5B5 = 0x00000010, - D3DFMT_LIN_A4R4G4B4 = 0x0000001D, - D3DFMT_LIN_A8 = 0x0000001F, - D3DFMT_LIN_A8B8G8R8 = 0x0000003F, - D3DFMT_LIN_A8R8G8B8 = 0x00000012, - D3DFMT_LIN_B8G8R8A8 = 0x00000040, - D3DFMT_LIN_G8B8 = 0x00000017, - D3DFMT_LIN_R4G4B4A4 = 0x0000003E, - D3DFMT_LIN_R5G5B5A1 = 0x0000003D, - D3DFMT_LIN_R5G6B5 = 0x00000011, - D3DFMT_LIN_R6G5B5 = 0x00000037, - D3DFMT_LIN_R8B8 = 0x00000016, - D3DFMT_LIN_R8G8B8A8 = 0x00000041, - D3DFMT_LIN_X1R5G5B5 = 0x0000001C, - D3DFMT_LIN_X8R8G8B8 = 0x0000001E, - - D3DFMT_LIN_A8L8 = 0x00000020, - D3DFMT_LIN_AL8 = 0x0000001B, - D3DFMT_LIN_L16 = 0x00000035, - D3DFMT_LIN_L8 = 0x00000013, - - D3DFMT_LIN_V16U16 = 0x00000036, - D3DFMT_LIN_V8U8 = 0x00000017, - D3DFMT_LIN_L6V5U5 = 0x00000037, - D3DFMT_LIN_X8L8V8U8 = 0x0000001E, - D3DFMT_LIN_Q8W8V8U8 = 0x00000012, - - D3DFMT_LIN_D24S8 = 0x0000002E, - D3DFMT_LIN_F24S8 = 0x0000002F, - D3DFMT_LIN_D16 = 0x00000030, - D3DFMT_LIN_F16 = 0x00000031, - - D3DFMT_VERTEXDATA = 100, - D3DFMT_INDEX16 = 101 -}; - -} -} diff --git a/vendor/librw/src/d3d/rwxboximpl.h b/vendor/librw/src/d3d/rwxboximpl.h deleted file mode 100644 index 524ec28..0000000 --- a/vendor/librw/src/d3d/rwxboximpl.h +++ /dev/null @@ -1,11 +0,0 @@ -namespace rw { -namespace xbox { - -Raster *rasterCreate(Raster *raster); -uint8 *rasterLock(Raster *raster, int32 level, int32 lockMode); -void rasterUnlock(Raster*, int32); -int32 rasterNumLevels(Raster *raster); -Image *rasterToImage(Raster *raster); - -} -} diff --git a/vendor/librw/src/d3d/shaders/default_PS.h b/vendor/librw/src/d3d/shaders/default_PS.h deleted file mode 100644 index 9f2cb31..0000000 --- a/vendor/librw/src/d3d/shaders/default_PS.h +++ /dev/null @@ -1,72 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T ps_2_0 /Fh default_PS.h default_PS.hlsl -// -// -// Parameters: -// -// float4 fogColor; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// fogColor c0 1 -// - - ps_2_0 - dcl t0.xyz - dcl v0 - add r0.xyz, v0, -c0 - mad r0.xyz, t0.z, r0, c0 - mov r0.w, v0.w - mov oC0, r0 - -// approximately 4 instruction slots used -#endif - -const BYTE g_ps20_main[] = -{ - 0, 2, 255, 255, 254, 255, - 34, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 83, 0, - 0, 0, 0, 2, 255, 255, - 1, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 76, 0, 0, 0, 48, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 2, 0, 60, 0, - 0, 0, 0, 0, 0, 0, - 102, 111, 103, 67, 111, 108, - 111, 114, 0, 171, 171, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 112, 115, - 95, 50, 95, 48, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 57, 46, - 50, 57, 46, 57, 53, 50, - 46, 51, 49, 49, 49, 0, - 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 7, 176, - 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 15, 144, - 2, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 228, 144, - 0, 0, 228, 161, 4, 0, - 0, 4, 0, 0, 7, 128, - 0, 0, 170, 176, 0, 0, - 228, 128, 0, 0, 228, 160, - 1, 0, 0, 2, 0, 0, - 8, 128, 0, 0, 255, 144, - 1, 0, 0, 2, 0, 8, - 15, 128, 0, 0, 228, 128, - 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/default_PS.hlsl b/vendor/librw/src/d3d/shaders/default_PS.hlsl deleted file mode 100644 index eaf279d..0000000 --- a/vendor/librw/src/d3d/shaders/default_PS.hlsl +++ /dev/null @@ -1,19 +0,0 @@ -struct VS_out { - float4 Position : POSITION; - float3 TexCoord0 : TEXCOORD0; - float4 Color : COLOR0; -}; - -sampler2D tex0 : register(s0); - -float4 fogColor : register(c0); - -float4 main(VS_out input) : COLOR -{ - float4 color = input.Color; -#ifdef TEX - color *= tex2D(tex0, input.TexCoord0.xy); -#endif - color.rgb = lerp(fogColor.rgb, color.rgb, input.TexCoord0.z); - return color; -} diff --git a/vendor/librw/src/d3d/shaders/default_VS.hlsl b/vendor/librw/src/d3d/shaders/default_VS.hlsl deleted file mode 100644 index d2f5452..0000000 --- a/vendor/librw/src/d3d/shaders/default_VS.hlsl +++ /dev/null @@ -1,51 +0,0 @@ -#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 - 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.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/vendor/librw/src/d3d/shaders/default_all_VS.h b/vendor/librw/src/d3d/shaders/default_all_VS.h deleted file mode 100644 index e6afa5d..0000000 --- a/vendor/librw/src/d3d/shaders/default_all_VS.h +++ /dev/null @@ -1,491 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T vs_2_0 /DDIRECTIONALS /DPOINTLIGHTS /DSPOTLIGHTS /Fh -// default_all_VS.h default_VS.hlsl -// -// -// Parameters: -// -// float4 ambientLight; -// float4x4 combinedMat; -// int4 firstLight; -// float4 fogData; -// -// struct -// { -// float4 color; -// float4 position; -// float4 direction; -// -// } lights[8]; -// -// float4 matCol; -// float3x3 normalMat; -// int numDirLights; -// int numPointLights; -// int numSpotLights; -// float4 surfProps; -// float4x4 worldMat; -// -// -// Registers: -// -// Name Reg Size -// -------------- ----- ---- -// numDirLights i0 1 -// numPointLights i1 1 -// numSpotLights i2 1 -// combinedMat c0 4 -// worldMat c4 4 -// normalMat c8 3 -// matCol c12 1 -// surfProps c13 1 -// fogData c14 1 -// ambientLight c15 1 -// firstLight c16 1 -// lights c17 24 -// - - vs_2_0 - def c11, 0, 3, 1, 0 - dcl_position v0 - dcl_normal v1 - dcl_texcoord v2 - dcl_color v3 - mul r0, v0.y, c1 - mad r0, c0, v0.x, r0 - mad r0, c2, v0.z, r0 - mad r0, c3, v0.w, r0 - mov oPos, r0 - mul r0.xyz, v0.y, c5 - mad r0.xyz, c4, v0.x, r0 - mad r0.xyz, c6, v0.z, r0 - mad r0.xyz, c7, v0.w, r0 - mul r1.xyz, v1.y, c9 - mad r1.xyz, c8, v1.x, r1 - mad r1.xyz, c10, v1.z, r1 - mov r2.x, c13.x - mad r2.xyz, c15, r2.x, v3 - mov r3.xyz, r2 - mov r1.w, c11.x - rep i0 - add r2.w, r1.w, c16.x - mul r2.w, r2.w, c11.y - mova a0.x, r2.w - dp3 r2.w, r1, -c19[a0.x] - max r2.w, r2.w, c11.x - mul r4.xyz, r2.w, c17[a0.x] - mad r3.xyz, r4, c13.z, r3 - add r1.w, r1.w, c11.z - endrep - mov r2.xyz, r3 - mov r1.w, c11.x - rep i1 - add r2.w, r1.w, c16.y - mul r2.w, r2.w, c11.y - mova a0.x, r2.w - add r4.xyz, r0, -c18[a0.x] - dp3 r2.w, r4, r4 - rsq r2.w, r2.w - mul r4.xyz, r2.w, r4 - dp3 r3.w, r1, -r4 - max r3.w, r3.w, c11.x - mul r4.xyz, r3.w, c17[a0.x] - rcp r2.w, r2.w - rcp r3.w, c17[a0.x].w - mad r2.w, r2.w, -r3.w, c11.z - max r2.w, r2.w, c11.x - mul r4.xyz, r2.w, r4 - mad r2.xyz, r4, c13.z, r2 - add r1.w, r1.w, c11.z - endrep - mov r3.xyz, r2 - mov r1.w, c11.x - rep i2 - add r2.w, r1.w, c16.z - mul r2.w, r2.w, c11.y - mova a0.x, r2.w - add r4.xyz, r0, -c18[a0.x] - dp3 r2.w, r4, r4 - rsq r2.w, r2.w - mul r4.xyz, r2.w, r4 - dp3 r4.w, r1, -r4 - dp3 r4.x, r4, c19[a0.x] - max r4.y, r4.w, c11.x - mov r4.z, c11.z - add r4.xz, r4, c18[a0.x].w - rcp r4.z, r4.z - mul r4.x, r4.z, r4.x - slt r4.z, r4.x, c11.x - mad r4.y, r4.z, -r4.y, r4.y - max r4.x, r4.x, c19[a0.x].w - mul r4.x, r4.x, r4.y - mul r4.xyz, r4.x, c17[a0.x] - rcp r2.w, r2.w - rcp r4.w, c17[a0.x].w - mad r2.w, r2.w, -r4.w, c11.z - max r2.w, r2.w, c11.x - mul r4.xyz, r2.w, r4 - mad r3.xyz, r4, c13.z, r3 - add r1.w, r1.w, c11.z - endrep - mov r3.w, v3.w - max r1, r3, c11.x - min r1, r1, c11.z - mul oD0, r1, c12 - add r0.x, r0.w, -c14.y - mul r0.x, r0.x, c14.z - max r0.x, r0.x, c14.w - min oT0.z, r0.x, c11.z - mov oT0.xy, v2 - -// approximately 95 instruction slots used -#endif - -const BYTE g_vs20_main[] = -{ - 0, 2, 254, 255, 254, 255, - 158, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 67, 2, - 0, 0, 0, 2, 254, 255, - 12, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 60, 2, 0, 0, 12, 1, - 0, 0, 2, 0, 15, 0, - 1, 0, 62, 0, 28, 1, - 0, 0, 0, 0, 0, 0, - 44, 1, 0, 0, 2, 0, - 0, 0, 4, 0, 2, 0, - 56, 1, 0, 0, 0, 0, - 0, 0, 72, 1, 0, 0, - 2, 0, 16, 0, 1, 0, - 66, 0, 84, 1, 0, 0, - 0, 0, 0, 0, 100, 1, - 0, 0, 2, 0, 14, 0, - 1, 0, 58, 0, 28, 1, - 0, 0, 0, 0, 0, 0, - 108, 1, 0, 0, 2, 0, - 17, 0, 24, 0, 70, 0, - 184, 1, 0, 0, 0, 0, - 0, 0, 200, 1, 0, 0, - 2, 0, 12, 0, 1, 0, - 50, 0, 28, 1, 0, 0, - 0, 0, 0, 0, 207, 1, - 0, 0, 2, 0, 8, 0, - 3, 0, 34, 0, 220, 1, - 0, 0, 0, 0, 0, 0, - 236, 1, 0, 0, 1, 0, - 0, 0, 1, 0, 2, 0, - 252, 1, 0, 0, 0, 0, - 0, 0, 12, 2, 0, 0, - 1, 0, 1, 0, 1, 0, - 6, 0, 252, 1, 0, 0, - 0, 0, 0, 0, 27, 2, - 0, 0, 1, 0, 2, 0, - 1, 0, 10, 0, 252, 1, - 0, 0, 0, 0, 0, 0, - 41, 2, 0, 0, 2, 0, - 13, 0, 1, 0, 54, 0, - 28, 1, 0, 0, 0, 0, - 0, 0, 51, 2, 0, 0, - 2, 0, 4, 0, 4, 0, - 18, 0, 56, 1, 0, 0, - 0, 0, 0, 0, 97, 109, - 98, 105, 101, 110, 116, 76, - 105, 103, 104, 116, 0, 171, - 171, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 99, 111, 109, 98, 105, 110, - 101, 100, 77, 97, 116, 0, - 3, 0, 3, 0, 4, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 102, 105, - 114, 115, 116, 76, 105, 103, - 104, 116, 0, 171, 1, 0, - 2, 0, 1, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 102, 111, 103, 68, - 97, 116, 97, 0, 108, 105, - 103, 104, 116, 115, 0, 99, - 111, 108, 111, 114, 0, 171, - 171, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 112, 111, 115, 105, 116, 105, - 111, 110, 0, 100, 105, 114, - 101, 99, 116, 105, 111, 110, - 0, 171, 115, 1, 0, 0, - 124, 1, 0, 0, 140, 1, - 0, 0, 124, 1, 0, 0, - 149, 1, 0, 0, 124, 1, - 0, 0, 5, 0, 0, 0, - 1, 0, 12, 0, 8, 0, - 3, 0, 160, 1, 0, 0, - 109, 97, 116, 67, 111, 108, - 0, 110, 111, 114, 109, 97, - 108, 77, 97, 116, 0, 171, - 171, 171, 3, 0, 3, 0, - 3, 0, 3, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 110, 117, 109, 68, 105, 114, - 76, 105, 103, 104, 116, 115, - 0, 171, 171, 171, 0, 0, - 2, 0, 1, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 110, 117, 109, 80, - 111, 105, 110, 116, 76, 105, - 103, 104, 116, 115, 0, 110, - 117, 109, 83, 112, 111, 116, - 76, 105, 103, 104, 116, 115, - 0, 115, 117, 114, 102, 80, - 114, 111, 112, 115, 0, 119, - 111, 114, 108, 100, 77, 97, - 116, 0, 118, 115, 95, 50, - 95, 48, 0, 77, 105, 99, - 114, 111, 115, 111, 102, 116, - 32, 40, 82, 41, 32, 72, - 76, 83, 76, 32, 83, 104, - 97, 100, 101, 114, 32, 67, - 111, 109, 112, 105, 108, 101, - 114, 32, 57, 46, 50, 57, - 46, 57, 53, 50, 46, 51, - 49, 49, 49, 0, 81, 0, - 0, 5, 11, 0, 15, 160, - 0, 0, 0, 0, 0, 0, - 64, 64, 0, 0, 128, 63, - 0, 0, 0, 0, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 15, 144, 31, 0, - 0, 2, 3, 0, 0, 128, - 1, 0, 15, 144, 31, 0, - 0, 2, 5, 0, 0, 128, - 2, 0, 15, 144, 31, 0, - 0, 2, 10, 0, 0, 128, - 3, 0, 15, 144, 5, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 85, 144, 1, 0, - 228, 160, 4, 0, 0, 4, - 0, 0, 15, 128, 0, 0, - 228, 160, 0, 0, 0, 144, - 0, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 2, 0, 228, 160, 0, 0, - 170, 144, 0, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 15, 128, 3, 0, 228, 160, - 0, 0, 255, 144, 0, 0, - 228, 128, 1, 0, 0, 2, - 0, 0, 15, 192, 0, 0, - 228, 128, 5, 0, 0, 3, - 0, 0, 7, 128, 0, 0, - 85, 144, 5, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 7, 128, 4, 0, 228, 160, - 0, 0, 0, 144, 0, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 7, 128, 6, 0, - 228, 160, 0, 0, 170, 144, - 0, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 7, 128, - 7, 0, 228, 160, 0, 0, - 255, 144, 0, 0, 228, 128, - 5, 0, 0, 3, 1, 0, - 7, 128, 1, 0, 85, 144, - 9, 0, 228, 160, 4, 0, - 0, 4, 1, 0, 7, 128, - 8, 0, 228, 160, 1, 0, - 0, 144, 1, 0, 228, 128, - 4, 0, 0, 4, 1, 0, - 7, 128, 10, 0, 228, 160, - 1, 0, 170, 144, 1, 0, - 228, 128, 1, 0, 0, 2, - 2, 0, 1, 128, 13, 0, - 0, 160, 4, 0, 0, 4, - 2, 0, 7, 128, 15, 0, - 228, 160, 2, 0, 0, 128, - 3, 0, 228, 144, 1, 0, - 0, 2, 3, 0, 7, 128, - 2, 0, 228, 128, 1, 0, - 0, 2, 1, 0, 8, 128, - 11, 0, 0, 160, 38, 0, - 0, 1, 0, 0, 228, 240, - 2, 0, 0, 3, 2, 0, - 8, 128, 1, 0, 255, 128, - 16, 0, 0, 160, 5, 0, - 0, 3, 2, 0, 8, 128, - 2, 0, 255, 128, 11, 0, - 85, 160, 46, 0, 0, 2, - 0, 0, 1, 176, 2, 0, - 255, 128, 8, 0, 0, 4, - 2, 0, 8, 128, 1, 0, - 228, 128, 19, 32, 228, 161, - 0, 0, 0, 176, 11, 0, - 0, 3, 2, 0, 8, 128, - 2, 0, 255, 128, 11, 0, - 0, 160, 5, 0, 0, 4, - 4, 0, 7, 128, 2, 0, - 255, 128, 17, 32, 228, 160, - 0, 0, 0, 176, 4, 0, - 0, 4, 3, 0, 7, 128, - 4, 0, 228, 128, 13, 0, - 170, 160, 3, 0, 228, 128, - 2, 0, 0, 3, 1, 0, - 8, 128, 1, 0, 255, 128, - 11, 0, 170, 160, 39, 0, - 0, 0, 1, 0, 0, 2, - 2, 0, 7, 128, 3, 0, - 228, 128, 1, 0, 0, 2, - 1, 0, 8, 128, 11, 0, - 0, 160, 38, 0, 0, 1, - 1, 0, 228, 240, 2, 0, - 0, 3, 2, 0, 8, 128, - 1, 0, 255, 128, 16, 0, - 85, 160, 5, 0, 0, 3, - 2, 0, 8, 128, 2, 0, - 255, 128, 11, 0, 85, 160, - 46, 0, 0, 2, 0, 0, - 1, 176, 2, 0, 255, 128, - 2, 0, 0, 4, 4, 0, - 7, 128, 0, 0, 228, 128, - 18, 32, 228, 161, 0, 0, - 0, 176, 8, 0, 0, 3, - 2, 0, 8, 128, 4, 0, - 228, 128, 4, 0, 228, 128, - 7, 0, 0, 2, 2, 0, - 8, 128, 2, 0, 255, 128, - 5, 0, 0, 3, 4, 0, - 7, 128, 2, 0, 255, 128, - 4, 0, 228, 128, 8, 0, - 0, 3, 3, 0, 8, 128, - 1, 0, 228, 128, 4, 0, - 228, 129, 11, 0, 0, 3, - 3, 0, 8, 128, 3, 0, - 255, 128, 11, 0, 0, 160, - 5, 0, 0, 4, 4, 0, - 7, 128, 3, 0, 255, 128, - 17, 32, 228, 160, 0, 0, - 0, 176, 6, 0, 0, 2, - 2, 0, 8, 128, 2, 0, - 255, 128, 6, 0, 0, 3, - 3, 0, 8, 128, 17, 32, - 255, 160, 0, 0, 0, 176, - 4, 0, 0, 4, 2, 0, - 8, 128, 2, 0, 255, 128, - 3, 0, 255, 129, 11, 0, - 170, 160, 11, 0, 0, 3, - 2, 0, 8, 128, 2, 0, - 255, 128, 11, 0, 0, 160, - 5, 0, 0, 3, 4, 0, - 7, 128, 2, 0, 255, 128, - 4, 0, 228, 128, 4, 0, - 0, 4, 2, 0, 7, 128, - 4, 0, 228, 128, 13, 0, - 170, 160, 2, 0, 228, 128, - 2, 0, 0, 3, 1, 0, - 8, 128, 1, 0, 255, 128, - 11, 0, 170, 160, 39, 0, - 0, 0, 1, 0, 0, 2, - 3, 0, 7, 128, 2, 0, - 228, 128, 1, 0, 0, 2, - 1, 0, 8, 128, 11, 0, - 0, 160, 38, 0, 0, 1, - 2, 0, 228, 240, 2, 0, - 0, 3, 2, 0, 8, 128, - 1, 0, 255, 128, 16, 0, - 170, 160, 5, 0, 0, 3, - 2, 0, 8, 128, 2, 0, - 255, 128, 11, 0, 85, 160, - 46, 0, 0, 2, 0, 0, - 1, 176, 2, 0, 255, 128, - 2, 0, 0, 4, 4, 0, - 7, 128, 0, 0, 228, 128, - 18, 32, 228, 161, 0, 0, - 0, 176, 8, 0, 0, 3, - 2, 0, 8, 128, 4, 0, - 228, 128, 4, 0, 228, 128, - 7, 0, 0, 2, 2, 0, - 8, 128, 2, 0, 255, 128, - 5, 0, 0, 3, 4, 0, - 7, 128, 2, 0, 255, 128, - 4, 0, 228, 128, 8, 0, - 0, 3, 4, 0, 8, 128, - 1, 0, 228, 128, 4, 0, - 228, 129, 8, 0, 0, 4, - 4, 0, 1, 128, 4, 0, - 228, 128, 19, 32, 228, 160, - 0, 0, 0, 176, 11, 0, - 0, 3, 4, 0, 2, 128, - 4, 0, 255, 128, 11, 0, - 0, 160, 1, 0, 0, 2, - 4, 0, 4, 128, 11, 0, - 170, 160, 2, 0, 0, 4, - 4, 0, 5, 128, 4, 0, - 228, 128, 18, 32, 255, 160, - 0, 0, 0, 176, 6, 0, - 0, 2, 4, 0, 4, 128, - 4, 0, 170, 128, 5, 0, - 0, 3, 4, 0, 1, 128, - 4, 0, 170, 128, 4, 0, - 0, 128, 12, 0, 0, 3, - 4, 0, 4, 128, 4, 0, - 0, 128, 11, 0, 0, 160, - 4, 0, 0, 4, 4, 0, - 2, 128, 4, 0, 170, 128, - 4, 0, 85, 129, 4, 0, - 85, 128, 11, 0, 0, 4, - 4, 0, 1, 128, 4, 0, - 0, 128, 19, 32, 255, 160, - 0, 0, 0, 176, 5, 0, - 0, 3, 4, 0, 1, 128, - 4, 0, 0, 128, 4, 0, - 85, 128, 5, 0, 0, 4, - 4, 0, 7, 128, 4, 0, - 0, 128, 17, 32, 228, 160, - 0, 0, 0, 176, 6, 0, - 0, 2, 2, 0, 8, 128, - 2, 0, 255, 128, 6, 0, - 0, 3, 4, 0, 8, 128, - 17, 32, 255, 160, 0, 0, - 0, 176, 4, 0, 0, 4, - 2, 0, 8, 128, 2, 0, - 255, 128, 4, 0, 255, 129, - 11, 0, 170, 160, 11, 0, - 0, 3, 2, 0, 8, 128, - 2, 0, 255, 128, 11, 0, - 0, 160, 5, 0, 0, 3, - 4, 0, 7, 128, 2, 0, - 255, 128, 4, 0, 228, 128, - 4, 0, 0, 4, 3, 0, - 7, 128, 4, 0, 228, 128, - 13, 0, 170, 160, 3, 0, - 228, 128, 2, 0, 0, 3, - 1, 0, 8, 128, 1, 0, - 255, 128, 11, 0, 170, 160, - 39, 0, 0, 0, 1, 0, - 0, 2, 3, 0, 8, 128, - 3, 0, 255, 144, 11, 0, - 0, 3, 1, 0, 15, 128, - 3, 0, 228, 128, 11, 0, - 0, 160, 10, 0, 0, 3, - 1, 0, 15, 128, 1, 0, - 228, 128, 11, 0, 170, 160, - 5, 0, 0, 3, 0, 0, - 15, 208, 1, 0, 228, 128, - 12, 0, 228, 160, 2, 0, - 0, 3, 0, 0, 1, 128, - 0, 0, 255, 128, 14, 0, - 85, 161, 5, 0, 0, 3, - 0, 0, 1, 128, 0, 0, - 0, 128, 14, 0, 170, 160, - 11, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 0, 128, - 14, 0, 255, 160, 10, 0, - 0, 3, 0, 0, 4, 224, - 0, 0, 0, 128, 11, 0, - 170, 160, 1, 0, 0, 2, - 0, 0, 3, 224, 2, 0, - 228, 144, 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/default_amb_VS.h b/vendor/librw/src/d3d/shaders/default_amb_VS.h deleted file mode 100644 index 6c22e23..0000000 --- a/vendor/librw/src/d3d/shaders/default_amb_VS.h +++ /dev/null @@ -1,156 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T vs_2_0 /Fh default_amb_VS.h default_VS.hlsl -// -// -// Parameters: -// -// float4 ambientLight; -// float4x4 combinedMat; -// float4 fogData; -// float4 matCol; -// float4 surfProps; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// combinedMat c0 4 -// matCol c12 1 -// surfProps c13 1 -// fogData c14 1 -// ambientLight c15 1 -// - - vs_2_0 - def c4, 0, 1, 0, 0 - dcl_position v0 - dcl_texcoord v1 - dcl_color v2 - mov r0.xyz, c15 - mad r0.xyz, r0, c13.x, v2 - mov r0.w, v2.w - max r0, r0, c4.x - min r0, r0, c4.y - mul oD0, r0, c12 - mul r0, v0.y, c1 - mad r0, c0, v0.x, r0 - mad r0, c2, v0.z, r0 - mad r0, c3, v0.w, r0 - add r1.x, r0.w, -c14.y - mov oPos, r0 - mul r0.x, r1.x, c14.z - max r0.x, r0.x, c14.w - min oT0.z, r0.x, c4.y - mov oT0.xy, v1 - -// approximately 16 instruction slots used -#endif - -const BYTE g_vs20_main[] = -{ - 0, 2, 254, 255, 254, 255, - 69, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 220, 0, - 0, 0, 0, 2, 254, 255, - 5, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 213, 0, 0, 0, 128, 0, - 0, 0, 2, 0, 15, 0, - 1, 0, 62, 0, 144, 0, - 0, 0, 0, 0, 0, 0, - 160, 0, 0, 0, 2, 0, - 0, 0, 4, 0, 2, 0, - 172, 0, 0, 0, 0, 0, - 0, 0, 188, 0, 0, 0, - 2, 0, 14, 0, 1, 0, - 58, 0, 144, 0, 0, 0, - 0, 0, 0, 0, 196, 0, - 0, 0, 2, 0, 12, 0, - 1, 0, 50, 0, 144, 0, - 0, 0, 0, 0, 0, 0, - 203, 0, 0, 0, 2, 0, - 13, 0, 1, 0, 54, 0, - 144, 0, 0, 0, 0, 0, - 0, 0, 97, 109, 98, 105, - 101, 110, 116, 76, 105, 103, - 104, 116, 0, 171, 171, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 99, 111, - 109, 98, 105, 110, 101, 100, - 77, 97, 116, 0, 3, 0, - 3, 0, 4, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 102, 111, 103, 68, - 97, 116, 97, 0, 109, 97, - 116, 67, 111, 108, 0, 115, - 117, 114, 102, 80, 114, 111, - 112, 115, 0, 118, 115, 95, - 50, 95, 48, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 57, 46, 50, - 57, 46, 57, 53, 50, 46, - 51, 49, 49, 49, 0, 171, - 171, 171, 81, 0, 0, 5, - 4, 0, 15, 160, 0, 0, - 0, 0, 0, 0, 128, 63, - 0, 0, 0, 0, 0, 0, - 0, 0, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 15, 144, 31, 0, 0, 2, - 5, 0, 0, 128, 1, 0, - 15, 144, 31, 0, 0, 2, - 10, 0, 0, 128, 2, 0, - 15, 144, 1, 0, 0, 2, - 0, 0, 7, 128, 15, 0, - 228, 160, 4, 0, 0, 4, - 0, 0, 7, 128, 0, 0, - 228, 128, 13, 0, 0, 160, - 2, 0, 228, 144, 1, 0, - 0, 2, 0, 0, 8, 128, - 2, 0, 255, 144, 11, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 4, 0, - 0, 160, 10, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 4, 0, 85, 160, - 5, 0, 0, 3, 0, 0, - 15, 208, 0, 0, 228, 128, - 12, 0, 228, 160, 5, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 85, 144, 1, 0, - 228, 160, 4, 0, 0, 4, - 0, 0, 15, 128, 0, 0, - 228, 160, 0, 0, 0, 144, - 0, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 2, 0, 228, 160, 0, 0, - 170, 144, 0, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 15, 128, 3, 0, 228, 160, - 0, 0, 255, 144, 0, 0, - 228, 128, 2, 0, 0, 3, - 1, 0, 1, 128, 0, 0, - 255, 128, 14, 0, 85, 161, - 1, 0, 0, 2, 0, 0, - 15, 192, 0, 0, 228, 128, - 5, 0, 0, 3, 0, 0, - 1, 128, 1, 0, 0, 128, - 14, 0, 170, 160, 11, 0, - 0, 3, 0, 0, 1, 128, - 0, 0, 0, 128, 14, 0, - 255, 160, 10, 0, 0, 3, - 0, 0, 4, 224, 0, 0, - 0, 128, 4, 0, 85, 160, - 1, 0, 0, 2, 0, 0, - 3, 224, 1, 0, 228, 144, - 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/default_amb_dir_VS.h b/vendor/librw/src/d3d/shaders/default_amb_dir_VS.h deleted file mode 100644 index 768042f..0000000 --- a/vendor/librw/src/d3d/shaders/default_amb_dir_VS.h +++ /dev/null @@ -1,272 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T vs_2_0 /DDIRECTIONALS /Fh default_amb_dir_VS.h -// default_VS.hlsl -// -// -// Parameters: -// -// float4 ambientLight; -// float4x4 combinedMat; -// int4 firstLight; -// float4 fogData; -// -// struct -// { -// float4 color; -// float4 position; -// float4 direction; -// -// } lights[8]; -// -// float4 matCol; -// float3x3 normalMat; -// int numDirLights; -// float4 surfProps; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// numDirLights i0 1 -// combinedMat c0 4 -// normalMat c8 3 -// matCol c12 1 -// surfProps c13 1 -// fogData c14 1 -// ambientLight c15 1 -// firstLight c16 1 -// lights c17 24 -// - - vs_2_0 - def c4, 0, 3, 1, 0 - dcl_position v0 - dcl_normal v1 - dcl_texcoord v2 - dcl_color v3 - mul r0, v0.y, c1 - mad r0, c0, v0.x, r0 - mad r0, c2, v0.z, r0 - mad r0, c3, v0.w, r0 - mov oPos, r0 - mul r0.xyz, v1.y, c9 - mad r0.xyz, c8, v1.x, r0 - mad r0.xyz, c10, v1.z, r0 - mov r1.x, c13.x - mad r1.xyz, c15, r1.x, v3 - mov r2.xyz, r1 - mov r1.w, c4.x - rep i0 - add r3.x, r1.w, c16.x - mul r3.x, r3.x, c4.y - mova a0.x, r3.x - dp3 r3.x, r0, -c19[a0.x] - max r3.x, r3.x, c4.x - mul r3.xyz, r3.x, c17[a0.x] - mad r2.xyz, r3, c13.z, r2 - add r1.w, r1.w, c4.z - endrep - mov r2.w, v3.w - max r1, r2, c4.x - min r1, r1, c4.z - mul oD0, r1, c12 - add r0.x, r0.w, -c14.y - mul r0.x, r0.x, c14.z - max r0.x, r0.x, c14.w - min oT0.z, r0.x, c4.z - mov oT0.xy, v2 - -// approximately 34 instruction slots used -#endif - -const BYTE g_vs20_main[] = -{ - 0, 2, 254, 255, 254, 255, - 134, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 225, 1, - 0, 0, 0, 2, 254, 255, - 9, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 218, 1, 0, 0, 208, 0, - 0, 0, 2, 0, 15, 0, - 1, 0, 62, 0, 224, 0, - 0, 0, 0, 0, 0, 0, - 240, 0, 0, 0, 2, 0, - 0, 0, 4, 0, 2, 0, - 252, 0, 0, 0, 0, 0, - 0, 0, 12, 1, 0, 0, - 2, 0, 16, 0, 1, 0, - 66, 0, 24, 1, 0, 0, - 0, 0, 0, 0, 40, 1, - 0, 0, 2, 0, 14, 0, - 1, 0, 58, 0, 224, 0, - 0, 0, 0, 0, 0, 0, - 48, 1, 0, 0, 2, 0, - 17, 0, 24, 0, 70, 0, - 124, 1, 0, 0, 0, 0, - 0, 0, 140, 1, 0, 0, - 2, 0, 12, 0, 1, 0, - 50, 0, 224, 0, 0, 0, - 0, 0, 0, 0, 147, 1, - 0, 0, 2, 0, 8, 0, - 3, 0, 34, 0, 160, 1, - 0, 0, 0, 0, 0, 0, - 176, 1, 0, 0, 1, 0, - 0, 0, 1, 0, 2, 0, - 192, 1, 0, 0, 0, 0, - 0, 0, 208, 1, 0, 0, - 2, 0, 13, 0, 1, 0, - 54, 0, 224, 0, 0, 0, - 0, 0, 0, 0, 97, 109, - 98, 105, 101, 110, 116, 76, - 105, 103, 104, 116, 0, 171, - 171, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 99, 111, 109, 98, 105, 110, - 101, 100, 77, 97, 116, 0, - 3, 0, 3, 0, 4, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 102, 105, - 114, 115, 116, 76, 105, 103, - 104, 116, 0, 171, 1, 0, - 2, 0, 1, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 102, 111, 103, 68, - 97, 116, 97, 0, 108, 105, - 103, 104, 116, 115, 0, 99, - 111, 108, 111, 114, 0, 171, - 171, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 112, 111, 115, 105, 116, 105, - 111, 110, 0, 100, 105, 114, - 101, 99, 116, 105, 111, 110, - 0, 171, 55, 1, 0, 0, - 64, 1, 0, 0, 80, 1, - 0, 0, 64, 1, 0, 0, - 89, 1, 0, 0, 64, 1, - 0, 0, 5, 0, 0, 0, - 1, 0, 12, 0, 8, 0, - 3, 0, 100, 1, 0, 0, - 109, 97, 116, 67, 111, 108, - 0, 110, 111, 114, 109, 97, - 108, 77, 97, 116, 0, 171, - 171, 171, 3, 0, 3, 0, - 3, 0, 3, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 110, 117, 109, 68, 105, 114, - 76, 105, 103, 104, 116, 115, - 0, 171, 171, 171, 0, 0, - 2, 0, 1, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 115, 117, 114, 102, - 80, 114, 111, 112, 115, 0, - 118, 115, 95, 50, 95, 48, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 57, 46, 50, 57, 46, 57, - 53, 50, 46, 51, 49, 49, - 49, 0, 171, 171, 81, 0, - 0, 5, 4, 0, 15, 160, - 0, 0, 0, 0, 0, 0, - 64, 64, 0, 0, 128, 63, - 0, 0, 0, 0, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 15, 144, 31, 0, - 0, 2, 3, 0, 0, 128, - 1, 0, 15, 144, 31, 0, - 0, 2, 5, 0, 0, 128, - 2, 0, 15, 144, 31, 0, - 0, 2, 10, 0, 0, 128, - 3, 0, 15, 144, 5, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 85, 144, 1, 0, - 228, 160, 4, 0, 0, 4, - 0, 0, 15, 128, 0, 0, - 228, 160, 0, 0, 0, 144, - 0, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 2, 0, 228, 160, 0, 0, - 170, 144, 0, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 15, 128, 3, 0, 228, 160, - 0, 0, 255, 144, 0, 0, - 228, 128, 1, 0, 0, 2, - 0, 0, 15, 192, 0, 0, - 228, 128, 5, 0, 0, 3, - 0, 0, 7, 128, 1, 0, - 85, 144, 9, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 7, 128, 8, 0, 228, 160, - 1, 0, 0, 144, 0, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 7, 128, 10, 0, - 228, 160, 1, 0, 170, 144, - 0, 0, 228, 128, 1, 0, - 0, 2, 1, 0, 1, 128, - 13, 0, 0, 160, 4, 0, - 0, 4, 1, 0, 7, 128, - 15, 0, 228, 160, 1, 0, - 0, 128, 3, 0, 228, 144, - 1, 0, 0, 2, 2, 0, - 7, 128, 1, 0, 228, 128, - 1, 0, 0, 2, 1, 0, - 8, 128, 4, 0, 0, 160, - 38, 0, 0, 1, 0, 0, - 228, 240, 2, 0, 0, 3, - 3, 0, 1, 128, 1, 0, - 255, 128, 16, 0, 0, 160, - 5, 0, 0, 3, 3, 0, - 1, 128, 3, 0, 0, 128, - 4, 0, 85, 160, 46, 0, - 0, 2, 0, 0, 1, 176, - 3, 0, 0, 128, 8, 0, - 0, 4, 3, 0, 1, 128, - 0, 0, 228, 128, 19, 32, - 228, 161, 0, 0, 0, 176, - 11, 0, 0, 3, 3, 0, - 1, 128, 3, 0, 0, 128, - 4, 0, 0, 160, 5, 0, - 0, 4, 3, 0, 7, 128, - 3, 0, 0, 128, 17, 32, - 228, 160, 0, 0, 0, 176, - 4, 0, 0, 4, 2, 0, - 7, 128, 3, 0, 228, 128, - 13, 0, 170, 160, 2, 0, - 228, 128, 2, 0, 0, 3, - 1, 0, 8, 128, 1, 0, - 255, 128, 4, 0, 170, 160, - 39, 0, 0, 0, 1, 0, - 0, 2, 2, 0, 8, 128, - 3, 0, 255, 144, 11, 0, - 0, 3, 1, 0, 15, 128, - 2, 0, 228, 128, 4, 0, - 0, 160, 10, 0, 0, 3, - 1, 0, 15, 128, 1, 0, - 228, 128, 4, 0, 170, 160, - 5, 0, 0, 3, 0, 0, - 15, 208, 1, 0, 228, 128, - 12, 0, 228, 160, 2, 0, - 0, 3, 0, 0, 1, 128, - 0, 0, 255, 128, 14, 0, - 85, 161, 5, 0, 0, 3, - 0, 0, 1, 128, 0, 0, - 0, 128, 14, 0, 170, 160, - 11, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 0, 128, - 14, 0, 255, 160, 10, 0, - 0, 3, 0, 0, 4, 224, - 0, 0, 0, 128, 4, 0, - 170, 160, 1, 0, 0, 2, - 0, 0, 3, 224, 2, 0, - 228, 144, 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/default_tex_PS.h b/vendor/librw/src/d3d/shaders/default_tex_PS.h deleted file mode 100644 index a25f918..0000000 --- a/vendor/librw/src/d3d/shaders/default_tex_PS.h +++ /dev/null @@ -1,89 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T ps_2_0 /DTEX /Fh default_tex_PS.h default_PS.hlsl -// -// -// Parameters: -// -// float4 fogColor; -// sampler2D tex0; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// fogColor c0 1 -// tex0 s0 1 -// - - ps_2_0 - dcl t0.xyz - dcl v0 - dcl_2d s0 - texld r0, t0, s0 - mad r0.xyz, v0, r0, -c0 - mul r1.w, r0.w, v0.w - mad r1.xyz, t0.z, r0, c0 - mov oC0, r1 - -// approximately 5 instruction slots used (1 texture, 4 arithmetic) -#endif - -const BYTE g_ps20_main[] = -{ - 0, 2, 255, 255, 254, 255, - 45, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 127, 0, - 0, 0, 0, 2, 255, 255, - 2, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 120, 0, 0, 0, 68, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 2, 0, 80, 0, - 0, 0, 0, 0, 0, 0, - 96, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 2, 0, - 104, 0, 0, 0, 0, 0, - 0, 0, 102, 111, 103, 67, - 111, 108, 111, 114, 0, 171, - 171, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 116, 101, 120, 48, 0, 171, - 171, 171, 4, 0, 12, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 112, 115, 95, 50, 95, 48, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 57, 46, 50, 57, 46, 57, - 53, 50, 46, 51, 49, 49, - 49, 0, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 7, 176, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 15, 144, 31, 0, 0, 2, - 0, 0, 0, 144, 0, 8, - 15, 160, 66, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 176, 0, 8, 228, 160, - 4, 0, 0, 4, 0, 0, - 7, 128, 0, 0, 228, 144, - 0, 0, 228, 128, 0, 0, - 228, 161, 5, 0, 0, 3, - 1, 0, 8, 128, 0, 0, - 255, 128, 0, 0, 255, 144, - 4, 0, 0, 4, 1, 0, - 7, 128, 0, 0, 170, 176, - 0, 0, 228, 128, 0, 0, - 228, 160, 1, 0, 0, 2, - 0, 8, 15, 128, 1, 0, - 228, 128, 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/im2d_PS.h b/vendor/librw/src/d3d/shaders/im2d_PS.h deleted file mode 100644 index 71f8b28..0000000 --- a/vendor/librw/src/d3d/shaders/im2d_PS.h +++ /dev/null @@ -1,72 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T ps_2_0 /Fh im2d_PS.h im2d_PS.hlsl -// -// -// Parameters: -// -// float4 fogColor; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// fogColor c0 1 -// - - ps_2_0 - dcl t0.xyz - dcl v0 - add r0.xyz, v0, -c0 - mad r0.xyz, t0.z, r0, c0 - mov r0.w, v0.w - mov oC0, r0 - -// approximately 4 instruction slots used -#endif - -const BYTE g_ps20_main[] = -{ - 0, 2, 255, 255, 254, 255, - 34, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 83, 0, - 0, 0, 0, 2, 255, 255, - 1, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 76, 0, 0, 0, 48, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 2, 0, 60, 0, - 0, 0, 0, 0, 0, 0, - 102, 111, 103, 67, 111, 108, - 111, 114, 0, 171, 171, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 112, 115, - 95, 50, 95, 48, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 57, 46, - 50, 57, 46, 57, 53, 50, - 46, 51, 49, 49, 49, 0, - 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 7, 176, - 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 15, 144, - 2, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 228, 144, - 0, 0, 228, 161, 4, 0, - 0, 4, 0, 0, 7, 128, - 0, 0, 170, 176, 0, 0, - 228, 128, 0, 0, 228, 160, - 1, 0, 0, 2, 0, 0, - 8, 128, 0, 0, 255, 144, - 1, 0, 0, 2, 0, 8, - 15, 128, 0, 0, 228, 128, - 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/im2d_PS.hlsl b/vendor/librw/src/d3d/shaders/im2d_PS.hlsl deleted file mode 100644 index eaf279d..0000000 --- a/vendor/librw/src/d3d/shaders/im2d_PS.hlsl +++ /dev/null @@ -1,19 +0,0 @@ -struct VS_out { - float4 Position : POSITION; - float3 TexCoord0 : TEXCOORD0; - float4 Color : COLOR0; -}; - -sampler2D tex0 : register(s0); - -float4 fogColor : register(c0); - -float4 main(VS_out input) : COLOR -{ - float4 color = input.Color; -#ifdef TEX - color *= tex2D(tex0, input.TexCoord0.xy); -#endif - color.rgb = lerp(fogColor.rgb, color.rgb, input.TexCoord0.z); - return color; -} diff --git a/vendor/librw/src/d3d/shaders/im2d_VS.h b/vendor/librw/src/d3d/shaders/im2d_VS.h deleted file mode 100644 index bc36b1f..0000000 --- a/vendor/librw/src/d3d/shaders/im2d_VS.h +++ /dev/null @@ -1,107 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T vs_2_0 /Fh im2d_VS.h im2d_VS.hlsl -// -// -// Parameters: -// -// float4 fogData; -// float4 xform; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// fogData c14 1 -// xform c41 1 -// - - vs_2_0 - def c0, 1, 0, 0, 0 - dcl_position v0 - dcl_texcoord v1 - dcl_color v2 - add r0.x, v0.w, -c14.y - mul r0.x, r0.x, c14.z - max r0.x, r0.x, c14.w - min oT0.z, r0.x, c0.x - mad r0.xy, v0, c41, c41.zwzw - mov r0.z, v0.z - mul oPos.xyz, r0, v0.w - mov oPos.w, v0.w - mov oT0.xy, v1 - mov oD0, v2 - -// approximately 10 instruction slots used -#endif - -const BYTE g_vs20_main[] = -{ - 0, 2, 254, 255, 254, 255, - 40, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 105, 0, - 0, 0, 0, 2, 254, 255, - 2, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 98, 0, 0, 0, 68, 0, - 0, 0, 2, 0, 14, 0, - 1, 0, 58, 0, 76, 0, - 0, 0, 0, 0, 0, 0, - 92, 0, 0, 0, 2, 0, - 41, 0, 1, 0, 166, 0, - 76, 0, 0, 0, 0, 0, - 0, 0, 102, 111, 103, 68, - 97, 116, 97, 0, 1, 0, - 3, 0, 1, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 120, 102, 111, 114, - 109, 0, 118, 115, 95, 50, - 95, 48, 0, 77, 105, 99, - 114, 111, 115, 111, 102, 116, - 32, 40, 82, 41, 32, 72, - 76, 83, 76, 32, 83, 104, - 97, 100, 101, 114, 32, 67, - 111, 109, 112, 105, 108, 101, - 114, 32, 57, 46, 50, 57, - 46, 57, 53, 50, 46, 51, - 49, 49, 49, 0, 171, 171, - 81, 0, 0, 5, 0, 0, - 15, 160, 0, 0, 128, 63, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 15, 144, - 31, 0, 0, 2, 5, 0, - 0, 128, 1, 0, 15, 144, - 31, 0, 0, 2, 10, 0, - 0, 128, 2, 0, 15, 144, - 2, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 255, 144, - 14, 0, 85, 161, 5, 0, - 0, 3, 0, 0, 1, 128, - 0, 0, 0, 128, 14, 0, - 170, 160, 11, 0, 0, 3, - 0, 0, 1, 128, 0, 0, - 0, 128, 14, 0, 255, 160, - 10, 0, 0, 3, 0, 0, - 4, 224, 0, 0, 0, 128, - 0, 0, 0, 160, 4, 0, - 0, 4, 0, 0, 3, 128, - 0, 0, 228, 144, 41, 0, - 228, 160, 41, 0, 238, 160, - 1, 0, 0, 2, 0, 0, - 4, 128, 0, 0, 170, 144, - 5, 0, 0, 3, 0, 0, - 7, 192, 0, 0, 228, 128, - 0, 0, 255, 144, 1, 0, - 0, 2, 0, 0, 8, 192, - 0, 0, 255, 144, 1, 0, - 0, 2, 0, 0, 3, 224, - 1, 0, 228, 144, 1, 0, - 0, 2, 0, 0, 15, 208, - 2, 0, 228, 144, 255, 255, - 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/im2d_VS.hlsl b/vendor/librw/src/d3d/shaders/im2d_VS.hlsl deleted file mode 100644 index 20cf3ce..0000000 --- a/vendor/librw/src/d3d/shaders/im2d_VS.hlsl +++ /dev/null @@ -1,30 +0,0 @@ -#include "standardConstants.h" - -struct VS_in -{ - float4 Position : POSITION; - float2 TexCoord : TEXCOORD0; - float4 Color : COLOR0; -}; - -struct VS_out { - float4 Position : POSITION; - float3 TexCoord0 : TEXCOORD0; - float4 Color : COLOR0; -}; - -float4 xform : register(c41); - -VS_out main(in VS_in input) -{ - VS_out output; - - output.Position = input.Position; - output.Position.xy = output.Position.xy * xform.xy + xform.zw; - output.TexCoord0.z = clamp((output.Position.w - fogEnd)*fogRange, fogDisable, 1.0); - output.Position.xyz *= output.Position.w; - output.Color = input.Color; - output.TexCoord0.xy = input.TexCoord; - - return output; -} diff --git a/vendor/librw/src/d3d/shaders/im2d_tex_PS.h b/vendor/librw/src/d3d/shaders/im2d_tex_PS.h deleted file mode 100644 index a91888b..0000000 --- a/vendor/librw/src/d3d/shaders/im2d_tex_PS.h +++ /dev/null @@ -1,89 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T ps_2_0 /DTEX /Fh im2d_tex_PS.h im2d_PS.hlsl -// -// -// Parameters: -// -// float4 fogColor; -// sampler2D tex0; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// fogColor c0 1 -// tex0 s0 1 -// - - ps_2_0 - dcl t0.xyz - dcl v0 - dcl_2d s0 - texld r0, t0, s0 - mad r0.xyz, v0, r0, -c0 - mul r1.w, r0.w, v0.w - mad r1.xyz, t0.z, r0, c0 - mov oC0, r1 - -// approximately 5 instruction slots used (1 texture, 4 arithmetic) -#endif - -const BYTE g_ps20_main[] = -{ - 0, 2, 255, 255, 254, 255, - 45, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 127, 0, - 0, 0, 0, 2, 255, 255, - 2, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 120, 0, 0, 0, 68, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 2, 0, 80, 0, - 0, 0, 0, 0, 0, 0, - 96, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 2, 0, - 104, 0, 0, 0, 0, 0, - 0, 0, 102, 111, 103, 67, - 111, 108, 111, 114, 0, 171, - 171, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 116, 101, 120, 48, 0, 171, - 171, 171, 4, 0, 12, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 112, 115, 95, 50, 95, 48, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 57, 46, 50, 57, 46, 57, - 53, 50, 46, 51, 49, 49, - 49, 0, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 7, 176, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 15, 144, 31, 0, 0, 2, - 0, 0, 0, 144, 0, 8, - 15, 160, 66, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 176, 0, 8, 228, 160, - 4, 0, 0, 4, 0, 0, - 7, 128, 0, 0, 228, 144, - 0, 0, 228, 128, 0, 0, - 228, 161, 5, 0, 0, 3, - 1, 0, 8, 128, 0, 0, - 255, 128, 0, 0, 255, 144, - 4, 0, 0, 4, 1, 0, - 7, 128, 0, 0, 170, 176, - 0, 0, 228, 128, 0, 0, - 228, 160, 1, 0, 0, 2, - 0, 8, 15, 128, 1, 0, - 228, 128, 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/lighting.h b/vendor/librw/src/d3d/shaders/lighting.h deleted file mode 100644 index 4b08196..0000000 --- a/vendor/librw/src/d3d/shaders/lighting.h +++ /dev/null @@ -1,44 +0,0 @@ -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/vendor/librw/src/d3d/shaders/make_default.cmd b/vendor/librw/src/d3d/shaders/make_default.cmd deleted file mode 100644 index bc44429..0000000 --- a/vendor/librw/src/d3d/shaders/make_default.cmd +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T vs_2_0 /Fh default_amb_VS.h default_VS.hlsl -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T vs_2_0 /DDIRECTIONALS /Fh default_amb_dir_VS.h default_VS.hlsl -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T vs_2_0 /DDIRECTIONALS /DPOINTLIGHTS /DSPOTLIGHTS /Fh default_all_VS.h default_VS.hlsl - -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T ps_2_0 /Fh default_PS.h default_PS.hlsl -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T ps_2_0 /DTEX /Fh default_tex_PS.h default_PS.hlsl - -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T vs_2_0 /Fh im2d_VS.h im2d_VS.hlsl -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T ps_2_0 /Fh im2d_PS.h im2d_PS.hlsl -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T ps_2_0 /DTEX /Fh im2d_tex_PS.h im2d_PS.hlsl diff --git a/vendor/librw/src/d3d/shaders/make_matfx.cmd b/vendor/librw/src/d3d/shaders/make_matfx.cmd deleted file mode 100644 index d0bc4fa..0000000 --- a/vendor/librw/src/d3d/shaders/make_matfx.cmd +++ /dev/null @@ -1,7 +0,0 @@ -@echo off -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T vs_2_0 /Fh matfx_env_amb_VS.h matfx_env_VS.hlsl -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T vs_2_0 /DDIRECTIONALS /Fh matfx_env_amb_dir_VS.h matfx_env_VS.hlsl -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T vs_2_0 /DDIRECTIONALS /DPOINTLIGHTS /DSPOTLIGHTS /Fh matfx_env_all_VS.h matfx_env_VS.hlsl - -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T ps_2_0 /Fh matfx_env_PS.h matfx_env_PS.hlsl -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T ps_2_0 /DTEX /Fh matfx_env_tex_PS.h matfx_env_PS.hlsl diff --git a/vendor/librw/src/d3d/shaders/make_skin.cmd b/vendor/librw/src/d3d/shaders/make_skin.cmd deleted file mode 100644 index b7822ca..0000000 --- a/vendor/librw/src/d3d/shaders/make_skin.cmd +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T vs_2_0 /Fh skin_amb_VS.h skin_VS.hlsl -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T vs_2_0 /DDIRECTIONALS /Fh skin_amb_dir_VS.h skin_VS.hlsl -"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /nologo /T vs_2_0 /DDIRECTIONALS /DPOINTLIGHTS /DSPOTLIGHTS /Fh skin_all_VS.h skin_VS.hlsl diff --git a/vendor/librw/src/d3d/shaders/matfx_env_PS.h b/vendor/librw/src/d3d/shaders/matfx_env_PS.h deleted file mode 100644 index 558ccdc..0000000 --- a/vendor/librw/src/d3d/shaders/matfx_env_PS.h +++ /dev/null @@ -1,131 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T ps_2_0 /Fh matfx_env_PS.h matfx_env_PS.hlsl -// -// -// Parameters: -// -// float4 colorClamp; -// sampler2D envTex; -// float4 fogColor; -// float4 fxparams; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// fogColor c0 1 -// fxparams c1 1 -// colorClamp c2 1 -// envTex s1 1 -// - - ps_2_0 - dcl t0.xyz - dcl t1.xy - dcl v0 - dcl_2d s1 - texld r0, t1, s1 - max r1.xyz, v0, c2 - mul r1.xyz, r1, c1.x - mul r0.xyz, r0, r1 - mul r0.xyz, r0, t0.z - max r0.w, v0.w, c1.y - mul r0.xyz, r0.w, r0 - add r1.xyz, v0, -c0 - mad r1.xyz, t0.z, r1, c0 - mad r0.xyz, r1, v0.w, r0 - mov r0.w, v0.w - mov oC0, r0 - -// approximately 12 instruction slots used (1 texture, 11 arithmetic) -#endif - -const BYTE g_ps20_main[] = -{ - 0, 2, 255, 255, 254, 255, - 60, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 185, 0, - 0, 0, 0, 2, 255, 255, - 4, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 178, 0, 0, 0, 108, 0, - 0, 0, 2, 0, 2, 0, - 1, 0, 10, 0, 120, 0, - 0, 0, 0, 0, 0, 0, - 136, 0, 0, 0, 3, 0, - 1, 0, 1, 0, 6, 0, - 144, 0, 0, 0, 0, 0, - 0, 0, 160, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 2, 0, 120, 0, 0, 0, - 0, 0, 0, 0, 169, 0, - 0, 0, 2, 0, 1, 0, - 1, 0, 6, 0, 120, 0, - 0, 0, 0, 0, 0, 0, - 99, 111, 108, 111, 114, 67, - 108, 97, 109, 112, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 101, 110, - 118, 84, 101, 120, 0, 171, - 4, 0, 12, 0, 1, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 102, 111, - 103, 67, 111, 108, 111, 114, - 0, 102, 120, 112, 97, 114, - 97, 109, 115, 0, 112, 115, - 95, 50, 95, 48, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 57, 46, - 50, 57, 46, 57, 53, 50, - 46, 51, 49, 49, 49, 0, - 171, 171, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 7, 176, 31, 0, 0, 2, - 0, 0, 0, 128, 1, 0, - 3, 176, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 15, 144, 31, 0, 0, 2, - 0, 0, 0, 144, 1, 8, - 15, 160, 66, 0, 0, 3, - 0, 0, 15, 128, 1, 0, - 228, 176, 1, 8, 228, 160, - 11, 0, 0, 3, 1, 0, - 7, 128, 0, 0, 228, 144, - 2, 0, 228, 160, 5, 0, - 0, 3, 1, 0, 7, 128, - 1, 0, 228, 128, 1, 0, - 0, 160, 5, 0, 0, 3, - 0, 0, 7, 128, 0, 0, - 228, 128, 1, 0, 228, 128, - 5, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 228, 128, - 0, 0, 170, 176, 11, 0, - 0, 3, 0, 0, 8, 128, - 0, 0, 255, 144, 1, 0, - 85, 160, 5, 0, 0, 3, - 0, 0, 7, 128, 0, 0, - 255, 128, 0, 0, 228, 128, - 2, 0, 0, 3, 1, 0, - 7, 128, 0, 0, 228, 144, - 0, 0, 228, 161, 4, 0, - 0, 4, 1, 0, 7, 128, - 0, 0, 170, 176, 1, 0, - 228, 128, 0, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 7, 128, 1, 0, 228, 128, - 0, 0, 255, 144, 0, 0, - 228, 128, 1, 0, 0, 2, - 0, 0, 8, 128, 0, 0, - 255, 144, 1, 0, 0, 2, - 0, 8, 15, 128, 0, 0, - 228, 128, 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/matfx_env_PS.hlsl b/vendor/librw/src/d3d/shaders/matfx_env_PS.hlsl deleted file mode 100644 index ccdd5cd..0000000 --- a/vendor/librw/src/d3d/shaders/matfx_env_PS.hlsl +++ /dev/null @@ -1,43 +0,0 @@ -struct VS_out { - float4 Position : POSITION; - float3 TexCoord0 : TEXCOORD0; - float2 TexCoord1 : TEXCOORD1; - float4 Color : COLOR0; -}; - -sampler2D diffTex : register(s0); -sampler2D envTex : register(s1); - -float4 fogColor : register(c0); - -float4 fxparams : register(c1); -float4 colorClamp : register(c2); - -#define shininess (fxparams.x) -#define disableFBA (fxparams.y) - -float4 main(VS_out input) : COLOR -{ - float4 pass1 = input.Color; - float4 envColor = max(pass1, colorClamp); -#ifdef TEX - pass1 *= tex2D(diffTex, input.TexCoord0.xy); -#endif - - float4 pass2 = envColor*shininess*tex2D(envTex, input.TexCoord1.xy); - - pass1.rgb = lerp(fogColor.rgb, pass1.rgb, input.TexCoord0.z); - pass2.rgb = lerp(float3(0.0, 0.0, 0.0), pass2.rgb, input.TexCoord0.z); - - // We simulate drawing this in two passes. - // First pass with standard blending, second with addition - // We premultiply alpha so render state should be one. - // For FB alpha rendering assume that diffuse alpha (pass1.a) was - // written to framebuffer, so just multiply pass2 by it as well then. - float fba = max(pass1.a, disableFBA); - float4 color; - color.rgb = pass1.rgb*pass1.a + pass2.rgb*fba; - color.a = pass1.a; - - return color; -} diff --git a/vendor/librw/src/d3d/shaders/matfx_env_VS.hlsl b/vendor/librw/src/d3d/shaders/matfx_env_VS.hlsl deleted file mode 100644 index 73179ab..0000000 --- a/vendor/librw/src/d3d/shaders/matfx_env_VS.hlsl +++ /dev/null @@ -1,55 +0,0 @@ -#include "standardConstants.h" - -float4x4 texMat : register(c41); - -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; -}; - - -VS_out main(in VS_in input) -{ - VS_out output; - - output.Position = mul(combinedMat, input.Position); - float3 V = mul(worldMat, input.Position).xyz; - float3 N = mul(normalMat, input.Normal); - - output.TexCoord0.xy = input.TexCoord; - output.TexCoord1 = mul(texMat, float4(N, 1.0)).xy; - - 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], N)*surfDiffuse; -#endif -#ifdef POINTLIGHTS - for(i = 0; i < numPointLights; i++) - output.Color.xyz += DoPointLight(lights[i+firstPointLight], V, N)*surfDiffuse; -#endif -#ifdef SPOTLIGHTS - for(i = 0; i < numSpotLights; i++) - output.Color.xyz += DoSpotLight(lights[i+firstSpotLight], V, N)*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/vendor/librw/src/d3d/shaders/matfx_env_all_VS.h b/vendor/librw/src/d3d/shaders/matfx_env_all_VS.h deleted file mode 100644 index c049dae..0000000 --- a/vendor/librw/src/d3d/shaders/matfx_env_all_VS.h +++ /dev/null @@ -1,514 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T vs_2_0 /DDIRECTIONALS /DPOINTLIGHTS /DSPOTLIGHTS /Fh -// matfx_env_all_VS.h matfx_env_VS.hlsl -// -// -// Parameters: -// -// float4 ambientLight; -// float4x4 combinedMat; -// int4 firstLight; -// float4 fogData; -// -// struct -// { -// float4 color; -// float4 position; -// float4 direction; -// -// } lights[8]; -// -// float4 matCol; -// float3x3 normalMat; -// int numDirLights; -// int numPointLights; -// int numSpotLights; -// float4 surfProps; -// float4x4 texMat; -// float4x4 worldMat; -// -// -// Registers: -// -// Name Reg Size -// -------------- ----- ---- -// numDirLights i0 1 -// numPointLights i1 1 -// numSpotLights i2 1 -// combinedMat c0 4 -// worldMat c4 4 -// normalMat c8 3 -// matCol c12 1 -// surfProps c13 1 -// fogData c14 1 -// ambientLight c15 1 -// firstLight c16 1 -// lights c17 24 -// texMat c41 4 -// - - vs_2_0 - def c11, 0, 3, 1, 0 - dcl_position v0 - dcl_normal v1 - dcl_texcoord v2 - dcl_color v3 - mul r0, v0.y, c1 - mad r0, c0, v0.x, r0 - mad r0, c2, v0.z, r0 - mad r0, c3, v0.w, r0 - mov oPos, r0 - mul r0.xyz, v0.y, c5 - mad r0.xyz, c4, v0.x, r0 - mad r0.xyz, c6, v0.z, r0 - mad r0.xyz, c7, v0.w, r0 - mul r1.xyz, v1.y, c9 - mad r1.xyz, c8, v1.x, r1 - mad r1.xyz, c10, v1.z, r1 - mov r2.x, c13.x - mad r2.xyz, c15, r2.x, v3 - mov r3.xyz, r2 - mov r1.w, c11.x - rep i0 - add r2.w, r1.w, c16.x - mul r2.w, r2.w, c11.y - mova a0.x, r2.w - dp3 r2.w, r1, -c19[a0.x] - max r2.w, r2.w, c11.x - mul r4.xyz, r2.w, c17[a0.x] - mad r3.xyz, r4, c13.z, r3 - add r1.w, r1.w, c11.z - endrep - mov r2.xyz, r3 - mov r1.w, c11.x - rep i1 - add r2.w, r1.w, c16.y - mul r2.w, r2.w, c11.y - mova a0.x, r2.w - add r4.xyz, r0, -c18[a0.x] - dp3 r2.w, r4, r4 - rsq r2.w, r2.w - mul r4.xyz, r2.w, r4 - dp3 r3.w, r1, -r4 - max r3.w, r3.w, c11.x - mul r4.xyz, r3.w, c17[a0.x] - rcp r2.w, r2.w - rcp r3.w, c17[a0.x].w - mad r2.w, r2.w, -r3.w, c11.z - max r2.w, r2.w, c11.x - mul r4.xyz, r2.w, r4 - mad r2.xyz, r4, c13.z, r2 - add r1.w, r1.w, c11.z - endrep - mov r3.xyz, r2 - mov r1.w, c11.x - rep i2 - add r2.w, r1.w, c16.z - mul r2.w, r2.w, c11.y - mova a0.x, r2.w - add r4.xyz, r0, -c18[a0.x] - dp3 r2.w, r4, r4 - rsq r2.w, r2.w - mul r4.xyz, r2.w, r4 - dp3 r4.w, r1, -r4 - dp3 r4.x, r4, c19[a0.x] - max r4.y, r4.w, c11.x - mov r4.z, c11.z - add r4.xz, r4, c18[a0.x].w - rcp r4.z, r4.z - mul r4.x, r4.z, r4.x - slt r4.z, r4.x, c11.x - mad r4.y, r4.z, -r4.y, r4.y - max r4.x, r4.x, c19[a0.x].w - mul r4.x, r4.x, r4.y - mul r4.xyz, r4.x, c17[a0.x] - rcp r2.w, r2.w - rcp r4.w, c17[a0.x].w - mad r2.w, r2.w, -r4.w, c11.z - max r2.w, r2.w, c11.x - mul r4.xyz, r2.w, r4 - mad r3.xyz, r4, c13.z, r3 - add r1.w, r1.w, c11.z - endrep - mov r3.w, v3.w - max r2, r3, c11.x - min r2, r2, c11.z - mul oD0, r2, c12 - mul r0.xy, r1.y, c42 - mad r0.xy, c41, r1.x, r0 - mad r0.xy, c43, r1.z, r0 - add oT1.xy, r0, c44 - add r0.x, r0.w, -c14.y - mul r0.x, r0.x, c14.z - max r0.x, r0.x, c14.w - min oT0.z, r0.x, c11.z - mov oT0.xy, v2 - -// approximately 99 instruction slots used -#endif - -const BYTE g_vs20_main[] = -{ - 0, 2, 254, 255, 254, 255, - 165, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 94, 2, - 0, 0, 0, 2, 254, 255, - 13, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 87, 2, 0, 0, 32, 1, - 0, 0, 2, 0, 15, 0, - 1, 0, 62, 0, 48, 1, - 0, 0, 0, 0, 0, 0, - 64, 1, 0, 0, 2, 0, - 0, 0, 4, 0, 2, 0, - 76, 1, 0, 0, 0, 0, - 0, 0, 92, 1, 0, 0, - 2, 0, 16, 0, 1, 0, - 66, 0, 104, 1, 0, 0, - 0, 0, 0, 0, 120, 1, - 0, 0, 2, 0, 14, 0, - 1, 0, 58, 0, 48, 1, - 0, 0, 0, 0, 0, 0, - 128, 1, 0, 0, 2, 0, - 17, 0, 24, 0, 70, 0, - 204, 1, 0, 0, 0, 0, - 0, 0, 220, 1, 0, 0, - 2, 0, 12, 0, 1, 0, - 50, 0, 48, 1, 0, 0, - 0, 0, 0, 0, 227, 1, - 0, 0, 2, 0, 8, 0, - 3, 0, 34, 0, 240, 1, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 1, 0, - 0, 0, 1, 0, 2, 0, - 16, 2, 0, 0, 0, 0, - 0, 0, 32, 2, 0, 0, - 1, 0, 1, 0, 1, 0, - 6, 0, 16, 2, 0, 0, - 0, 0, 0, 0, 47, 2, - 0, 0, 1, 0, 2, 0, - 1, 0, 10, 0, 16, 2, - 0, 0, 0, 0, 0, 0, - 61, 2, 0, 0, 2, 0, - 13, 0, 1, 0, 54, 0, - 48, 1, 0, 0, 0, 0, - 0, 0, 71, 2, 0, 0, - 2, 0, 41, 0, 4, 0, - 166, 0, 76, 1, 0, 0, - 0, 0, 0, 0, 78, 2, - 0, 0, 2, 0, 4, 0, - 4, 0, 18, 0, 76, 1, - 0, 0, 0, 0, 0, 0, - 97, 109, 98, 105, 101, 110, - 116, 76, 105, 103, 104, 116, - 0, 171, 171, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 99, 111, 109, 98, - 105, 110, 101, 100, 77, 97, - 116, 0, 3, 0, 3, 0, - 4, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 102, 105, 114, 115, 116, 76, - 105, 103, 104, 116, 0, 171, - 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 102, 111, - 103, 68, 97, 116, 97, 0, - 108, 105, 103, 104, 116, 115, - 0, 99, 111, 108, 111, 114, - 0, 171, 171, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 112, 111, 115, 105, - 116, 105, 111, 110, 0, 100, - 105, 114, 101, 99, 116, 105, - 111, 110, 0, 171, 135, 1, - 0, 0, 144, 1, 0, 0, - 160, 1, 0, 0, 144, 1, - 0, 0, 169, 1, 0, 0, - 144, 1, 0, 0, 5, 0, - 0, 0, 1, 0, 12, 0, - 8, 0, 3, 0, 180, 1, - 0, 0, 109, 97, 116, 67, - 111, 108, 0, 110, 111, 114, - 109, 97, 108, 77, 97, 116, - 0, 171, 171, 171, 3, 0, - 3, 0, 3, 0, 3, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 110, 117, 109, 68, - 105, 114, 76, 105, 103, 104, - 116, 115, 0, 171, 171, 171, - 0, 0, 2, 0, 1, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 110, 117, - 109, 80, 111, 105, 110, 116, - 76, 105, 103, 104, 116, 115, - 0, 110, 117, 109, 83, 112, - 111, 116, 76, 105, 103, 104, - 116, 115, 0, 115, 117, 114, - 102, 80, 114, 111, 112, 115, - 0, 116, 101, 120, 77, 97, - 116, 0, 119, 111, 114, 108, - 100, 77, 97, 116, 0, 118, - 115, 95, 50, 95, 48, 0, - 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, - 32, 83, 104, 97, 100, 101, - 114, 32, 67, 111, 109, 112, - 105, 108, 101, 114, 32, 57, - 46, 50, 57, 46, 57, 53, - 50, 46, 51, 49, 49, 49, - 0, 171, 81, 0, 0, 5, - 11, 0, 15, 160, 0, 0, - 0, 0, 0, 0, 64, 64, - 0, 0, 128, 63, 0, 0, - 0, 0, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 15, 144, 31, 0, 0, 2, - 3, 0, 0, 128, 1, 0, - 15, 144, 31, 0, 0, 2, - 5, 0, 0, 128, 2, 0, - 15, 144, 31, 0, 0, 2, - 10, 0, 0, 128, 3, 0, - 15, 144, 5, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 85, 144, 1, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 15, 128, 0, 0, 228, 160, - 0, 0, 0, 144, 0, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 15, 128, 2, 0, - 228, 160, 0, 0, 170, 144, - 0, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 3, 0, 228, 160, 0, 0, - 255, 144, 0, 0, 228, 128, - 1, 0, 0, 2, 0, 0, - 15, 192, 0, 0, 228, 128, - 5, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 85, 144, - 5, 0, 228, 160, 4, 0, - 0, 4, 0, 0, 7, 128, - 4, 0, 228, 160, 0, 0, - 0, 144, 0, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 7, 128, 6, 0, 228, 160, - 0, 0, 170, 144, 0, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 7, 128, 7, 0, - 228, 160, 0, 0, 255, 144, - 0, 0, 228, 128, 5, 0, - 0, 3, 1, 0, 7, 128, - 1, 0, 85, 144, 9, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 7, 128, 8, 0, - 228, 160, 1, 0, 0, 144, - 1, 0, 228, 128, 4, 0, - 0, 4, 1, 0, 7, 128, - 10, 0, 228, 160, 1, 0, - 170, 144, 1, 0, 228, 128, - 1, 0, 0, 2, 2, 0, - 1, 128, 13, 0, 0, 160, - 4, 0, 0, 4, 2, 0, - 7, 128, 15, 0, 228, 160, - 2, 0, 0, 128, 3, 0, - 228, 144, 1, 0, 0, 2, - 3, 0, 7, 128, 2, 0, - 228, 128, 1, 0, 0, 2, - 1, 0, 8, 128, 11, 0, - 0, 160, 38, 0, 0, 1, - 0, 0, 228, 240, 2, 0, - 0, 3, 2, 0, 8, 128, - 1, 0, 255, 128, 16, 0, - 0, 160, 5, 0, 0, 3, - 2, 0, 8, 128, 2, 0, - 255, 128, 11, 0, 85, 160, - 46, 0, 0, 2, 0, 0, - 1, 176, 2, 0, 255, 128, - 8, 0, 0, 4, 2, 0, - 8, 128, 1, 0, 228, 128, - 19, 32, 228, 161, 0, 0, - 0, 176, 11, 0, 0, 3, - 2, 0, 8, 128, 2, 0, - 255, 128, 11, 0, 0, 160, - 5, 0, 0, 4, 4, 0, - 7, 128, 2, 0, 255, 128, - 17, 32, 228, 160, 0, 0, - 0, 176, 4, 0, 0, 4, - 3, 0, 7, 128, 4, 0, - 228, 128, 13, 0, 170, 160, - 3, 0, 228, 128, 2, 0, - 0, 3, 1, 0, 8, 128, - 1, 0, 255, 128, 11, 0, - 170, 160, 39, 0, 0, 0, - 1, 0, 0, 2, 2, 0, - 7, 128, 3, 0, 228, 128, - 1, 0, 0, 2, 1, 0, - 8, 128, 11, 0, 0, 160, - 38, 0, 0, 1, 1, 0, - 228, 240, 2, 0, 0, 3, - 2, 0, 8, 128, 1, 0, - 255, 128, 16, 0, 85, 160, - 5, 0, 0, 3, 2, 0, - 8, 128, 2, 0, 255, 128, - 11, 0, 85, 160, 46, 0, - 0, 2, 0, 0, 1, 176, - 2, 0, 255, 128, 2, 0, - 0, 4, 4, 0, 7, 128, - 0, 0, 228, 128, 18, 32, - 228, 161, 0, 0, 0, 176, - 8, 0, 0, 3, 2, 0, - 8, 128, 4, 0, 228, 128, - 4, 0, 228, 128, 7, 0, - 0, 2, 2, 0, 8, 128, - 2, 0, 255, 128, 5, 0, - 0, 3, 4, 0, 7, 128, - 2, 0, 255, 128, 4, 0, - 228, 128, 8, 0, 0, 3, - 3, 0, 8, 128, 1, 0, - 228, 128, 4, 0, 228, 129, - 11, 0, 0, 3, 3, 0, - 8, 128, 3, 0, 255, 128, - 11, 0, 0, 160, 5, 0, - 0, 4, 4, 0, 7, 128, - 3, 0, 255, 128, 17, 32, - 228, 160, 0, 0, 0, 176, - 6, 0, 0, 2, 2, 0, - 8, 128, 2, 0, 255, 128, - 6, 0, 0, 3, 3, 0, - 8, 128, 17, 32, 255, 160, - 0, 0, 0, 176, 4, 0, - 0, 4, 2, 0, 8, 128, - 2, 0, 255, 128, 3, 0, - 255, 129, 11, 0, 170, 160, - 11, 0, 0, 3, 2, 0, - 8, 128, 2, 0, 255, 128, - 11, 0, 0, 160, 5, 0, - 0, 3, 4, 0, 7, 128, - 2, 0, 255, 128, 4, 0, - 228, 128, 4, 0, 0, 4, - 2, 0, 7, 128, 4, 0, - 228, 128, 13, 0, 170, 160, - 2, 0, 228, 128, 2, 0, - 0, 3, 1, 0, 8, 128, - 1, 0, 255, 128, 11, 0, - 170, 160, 39, 0, 0, 0, - 1, 0, 0, 2, 3, 0, - 7, 128, 2, 0, 228, 128, - 1, 0, 0, 2, 1, 0, - 8, 128, 11, 0, 0, 160, - 38, 0, 0, 1, 2, 0, - 228, 240, 2, 0, 0, 3, - 2, 0, 8, 128, 1, 0, - 255, 128, 16, 0, 170, 160, - 5, 0, 0, 3, 2, 0, - 8, 128, 2, 0, 255, 128, - 11, 0, 85, 160, 46, 0, - 0, 2, 0, 0, 1, 176, - 2, 0, 255, 128, 2, 0, - 0, 4, 4, 0, 7, 128, - 0, 0, 228, 128, 18, 32, - 228, 161, 0, 0, 0, 176, - 8, 0, 0, 3, 2, 0, - 8, 128, 4, 0, 228, 128, - 4, 0, 228, 128, 7, 0, - 0, 2, 2, 0, 8, 128, - 2, 0, 255, 128, 5, 0, - 0, 3, 4, 0, 7, 128, - 2, 0, 255, 128, 4, 0, - 228, 128, 8, 0, 0, 3, - 4, 0, 8, 128, 1, 0, - 228, 128, 4, 0, 228, 129, - 8, 0, 0, 4, 4, 0, - 1, 128, 4, 0, 228, 128, - 19, 32, 228, 160, 0, 0, - 0, 176, 11, 0, 0, 3, - 4, 0, 2, 128, 4, 0, - 255, 128, 11, 0, 0, 160, - 1, 0, 0, 2, 4, 0, - 4, 128, 11, 0, 170, 160, - 2, 0, 0, 4, 4, 0, - 5, 128, 4, 0, 228, 128, - 18, 32, 255, 160, 0, 0, - 0, 176, 6, 0, 0, 2, - 4, 0, 4, 128, 4, 0, - 170, 128, 5, 0, 0, 3, - 4, 0, 1, 128, 4, 0, - 170, 128, 4, 0, 0, 128, - 12, 0, 0, 3, 4, 0, - 4, 128, 4, 0, 0, 128, - 11, 0, 0, 160, 4, 0, - 0, 4, 4, 0, 2, 128, - 4, 0, 170, 128, 4, 0, - 85, 129, 4, 0, 85, 128, - 11, 0, 0, 4, 4, 0, - 1, 128, 4, 0, 0, 128, - 19, 32, 255, 160, 0, 0, - 0, 176, 5, 0, 0, 3, - 4, 0, 1, 128, 4, 0, - 0, 128, 4, 0, 85, 128, - 5, 0, 0, 4, 4, 0, - 7, 128, 4, 0, 0, 128, - 17, 32, 228, 160, 0, 0, - 0, 176, 6, 0, 0, 2, - 2, 0, 8, 128, 2, 0, - 255, 128, 6, 0, 0, 3, - 4, 0, 8, 128, 17, 32, - 255, 160, 0, 0, 0, 176, - 4, 0, 0, 4, 2, 0, - 8, 128, 2, 0, 255, 128, - 4, 0, 255, 129, 11, 0, - 170, 160, 11, 0, 0, 3, - 2, 0, 8, 128, 2, 0, - 255, 128, 11, 0, 0, 160, - 5, 0, 0, 3, 4, 0, - 7, 128, 2, 0, 255, 128, - 4, 0, 228, 128, 4, 0, - 0, 4, 3, 0, 7, 128, - 4, 0, 228, 128, 13, 0, - 170, 160, 3, 0, 228, 128, - 2, 0, 0, 3, 1, 0, - 8, 128, 1, 0, 255, 128, - 11, 0, 170, 160, 39, 0, - 0, 0, 1, 0, 0, 2, - 3, 0, 8, 128, 3, 0, - 255, 144, 11, 0, 0, 3, - 2, 0, 15, 128, 3, 0, - 228, 128, 11, 0, 0, 160, - 10, 0, 0, 3, 2, 0, - 15, 128, 2, 0, 228, 128, - 11, 0, 170, 160, 5, 0, - 0, 3, 0, 0, 15, 208, - 2, 0, 228, 128, 12, 0, - 228, 160, 5, 0, 0, 3, - 0, 0, 3, 128, 1, 0, - 85, 128, 42, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 3, 128, 41, 0, 228, 160, - 1, 0, 0, 128, 0, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 3, 128, 43, 0, - 228, 160, 1, 0, 170, 128, - 0, 0, 228, 128, 2, 0, - 0, 3, 1, 0, 3, 224, - 0, 0, 228, 128, 44, 0, - 228, 160, 2, 0, 0, 3, - 0, 0, 1, 128, 0, 0, - 255, 128, 14, 0, 85, 161, - 5, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 0, 128, - 14, 0, 170, 160, 11, 0, - 0, 3, 0, 0, 1, 128, - 0, 0, 0, 128, 14, 0, - 255, 160, 10, 0, 0, 3, - 0, 0, 4, 224, 0, 0, - 0, 128, 11, 0, 170, 160, - 1, 0, 0, 2, 0, 0, - 3, 224, 2, 0, 228, 144, - 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/matfx_env_amb_VS.h b/vendor/librw/src/d3d/shaders/matfx_env_amb_VS.h deleted file mode 100644 index c6314fb..0000000 --- a/vendor/librw/src/d3d/shaders/matfx_env_amb_VS.h +++ /dev/null @@ -1,204 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T vs_2_0 /Fh matfx_env_amb_VS.h matfx_env_VS.hlsl -// -// -// Parameters: -// -// float4 ambientLight; -// float4x4 combinedMat; -// float4 fogData; -// float4 matCol; -// float3x3 normalMat; -// float4 surfProps; -// float4x4 texMat; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// combinedMat c0 4 -// normalMat c8 3 -// matCol c12 1 -// surfProps c13 1 -// fogData c14 1 -// ambientLight c15 1 -// texMat c41 4 -// - - vs_2_0 - def c4, 0, 1, 0, 0 - dcl_position v0 - dcl_normal v1 - dcl_texcoord v2 - dcl_color v3 - mul r0.xyz, v1.y, c9 - mad r0.xyz, c8, v1.x, r0 - mad r0.xyz, c10, v1.z, r0 - mul r0.yw, r0.y, c42.xxzy - mad r0.xy, c41, r0.x, r0.ywzw - mad r0.xy, c43, r0.z, r0 - add oT1.xy, r0, c44 - mov r0.xyz, c15 - mad r0.xyz, r0, c13.x, v3 - mov r0.w, v3.w - max r0, r0, c4.x - min r0, r0, c4.y - mul oD0, r0, c12 - mul r0, v0.y, c1 - mad r0, c0, v0.x, r0 - mad r0, c2, v0.z, r0 - mad r0, c3, v0.w, r0 - add r1.x, r0.w, -c14.y - mov oPos, r0 - mul r0.x, r1.x, c14.z - max r0.x, r0.x, c14.w - min oT0.z, r0.x, c4.y - mov oT0.xy, v2 - -// approximately 23 instruction slots used -#endif - -const BYTE g_vs20_main[] = -{ - 0, 2, 254, 255, 254, 255, - 88, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 40, 1, - 0, 0, 0, 2, 254, 255, - 7, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 33, 1, 0, 0, 168, 0, - 0, 0, 2, 0, 15, 0, - 1, 0, 62, 0, 184, 0, - 0, 0, 0, 0, 0, 0, - 200, 0, 0, 0, 2, 0, - 0, 0, 4, 0, 2, 0, - 212, 0, 0, 0, 0, 0, - 0, 0, 228, 0, 0, 0, - 2, 0, 14, 0, 1, 0, - 58, 0, 184, 0, 0, 0, - 0, 0, 0, 0, 236, 0, - 0, 0, 2, 0, 12, 0, - 1, 0, 50, 0, 184, 0, - 0, 0, 0, 0, 0, 0, - 243, 0, 0, 0, 2, 0, - 8, 0, 3, 0, 34, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 16, 1, 0, 0, - 2, 0, 13, 0, 1, 0, - 54, 0, 184, 0, 0, 0, - 0, 0, 0, 0, 26, 1, - 0, 0, 2, 0, 41, 0, - 4, 0, 166, 0, 212, 0, - 0, 0, 0, 0, 0, 0, - 97, 109, 98, 105, 101, 110, - 116, 76, 105, 103, 104, 116, - 0, 171, 171, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 99, 111, 109, 98, - 105, 110, 101, 100, 77, 97, - 116, 0, 3, 0, 3, 0, - 4, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 102, 111, 103, 68, 97, 116, - 97, 0, 109, 97, 116, 67, - 111, 108, 0, 110, 111, 114, - 109, 97, 108, 77, 97, 116, - 0, 171, 171, 171, 3, 0, - 3, 0, 3, 0, 3, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 115, 117, 114, 102, - 80, 114, 111, 112, 115, 0, - 116, 101, 120, 77, 97, 116, - 0, 118, 115, 95, 50, 95, - 48, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, - 32, 57, 46, 50, 57, 46, - 57, 53, 50, 46, 51, 49, - 49, 49, 0, 171, 171, 171, - 81, 0, 0, 5, 4, 0, - 15, 160, 0, 0, 0, 0, - 0, 0, 128, 63, 0, 0, - 0, 0, 0, 0, 0, 0, - 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 15, 144, - 31, 0, 0, 2, 3, 0, - 0, 128, 1, 0, 15, 144, - 31, 0, 0, 2, 5, 0, - 0, 128, 2, 0, 15, 144, - 31, 0, 0, 2, 10, 0, - 0, 128, 3, 0, 15, 144, - 5, 0, 0, 3, 0, 0, - 7, 128, 1, 0, 85, 144, - 9, 0, 228, 160, 4, 0, - 0, 4, 0, 0, 7, 128, - 8, 0, 228, 160, 1, 0, - 0, 144, 0, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 7, 128, 10, 0, 228, 160, - 1, 0, 170, 144, 0, 0, - 228, 128, 5, 0, 0, 3, - 0, 0, 10, 128, 0, 0, - 85, 128, 42, 0, 96, 160, - 4, 0, 0, 4, 0, 0, - 3, 128, 41, 0, 228, 160, - 0, 0, 0, 128, 0, 0, - 237, 128, 4, 0, 0, 4, - 0, 0, 3, 128, 43, 0, - 228, 160, 0, 0, 170, 128, - 0, 0, 228, 128, 2, 0, - 0, 3, 1, 0, 3, 224, - 0, 0, 228, 128, 44, 0, - 228, 160, 1, 0, 0, 2, - 0, 0, 7, 128, 15, 0, - 228, 160, 4, 0, 0, 4, - 0, 0, 7, 128, 0, 0, - 228, 128, 13, 0, 0, 160, - 3, 0, 228, 144, 1, 0, - 0, 2, 0, 0, 8, 128, - 3, 0, 255, 144, 11, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 4, 0, - 0, 160, 10, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 4, 0, 85, 160, - 5, 0, 0, 3, 0, 0, - 15, 208, 0, 0, 228, 128, - 12, 0, 228, 160, 5, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 85, 144, 1, 0, - 228, 160, 4, 0, 0, 4, - 0, 0, 15, 128, 0, 0, - 228, 160, 0, 0, 0, 144, - 0, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 2, 0, 228, 160, 0, 0, - 170, 144, 0, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 15, 128, 3, 0, 228, 160, - 0, 0, 255, 144, 0, 0, - 228, 128, 2, 0, 0, 3, - 1, 0, 1, 128, 0, 0, - 255, 128, 14, 0, 85, 161, - 1, 0, 0, 2, 0, 0, - 15, 192, 0, 0, 228, 128, - 5, 0, 0, 3, 0, 0, - 1, 128, 1, 0, 0, 128, - 14, 0, 170, 160, 11, 0, - 0, 3, 0, 0, 1, 128, - 0, 0, 0, 128, 14, 0, - 255, 160, 10, 0, 0, 3, - 0, 0, 4, 224, 0, 0, - 0, 128, 4, 0, 85, 160, - 1, 0, 0, 2, 0, 0, - 3, 224, 2, 0, 228, 144, - 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/matfx_env_amb_dir_VS.h b/vendor/librw/src/d3d/shaders/matfx_env_amb_dir_VS.h deleted file mode 100644 index 98d537a..0000000 --- a/vendor/librw/src/d3d/shaders/matfx_env_amb_dir_VS.h +++ /dev/null @@ -1,295 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T vs_2_0 /DDIRECTIONALS /Fh matfx_env_amb_dir_VS.h -// matfx_env_VS.hlsl -// -// -// Parameters: -// -// float4 ambientLight; -// float4x4 combinedMat; -// int4 firstLight; -// float4 fogData; -// -// struct -// { -// float4 color; -// float4 position; -// float4 direction; -// -// } lights[8]; -// -// float4 matCol; -// float3x3 normalMat; -// int numDirLights; -// float4 surfProps; -// float4x4 texMat; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// numDirLights i0 1 -// combinedMat c0 4 -// normalMat c8 3 -// matCol c12 1 -// surfProps c13 1 -// fogData c14 1 -// ambientLight c15 1 -// firstLight c16 1 -// lights c17 24 -// texMat c41 4 -// - - vs_2_0 - def c4, 0, 3, 1, 0 - dcl_position v0 - dcl_normal v1 - dcl_texcoord v2 - dcl_color v3 - mul r0, v0.y, c1 - mad r0, c0, v0.x, r0 - mad r0, c2, v0.z, r0 - mad r0, c3, v0.w, r0 - mov oPos, r0 - mul r0.xyz, v1.y, c9 - mad r0.xyz, c8, v1.x, r0 - mad r0.xyz, c10, v1.z, r0 - mov r1.x, c13.x - mad r1.xyz, c15, r1.x, v3 - mov r2.xyz, r1 - mov r1.w, c4.x - rep i0 - add r3.x, r1.w, c16.x - mul r3.x, r3.x, c4.y - mova a0.x, r3.x - dp3 r3.x, r0, -c19[a0.x] - max r3.x, r3.x, c4.x - mul r3.xyz, r3.x, c17[a0.x] - mad r2.xyz, r3, c13.z, r2 - add r1.w, r1.w, c4.z - endrep - mov r2.w, v3.w - max r1, r2, c4.x - min r1, r1, c4.z - mul oD0, r1, c12 - mul r1.xy, r0.y, c42 - mad r0.xy, c41, r0.x, r1 - mad r0.xy, c43, r0.z, r0 - add oT1.xy, r0, c44 - add r0.x, r0.w, -c14.y - mul r0.x, r0.x, c14.z - max r0.x, r0.x, c14.w - min oT0.z, r0.x, c4.z - mov oT0.xy, v2 - -// approximately 38 instruction slots used -#endif - -const BYTE g_vs20_main[] = -{ - 0, 2, 254, 255, 254, 255, - 141, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 252, 1, - 0, 0, 0, 2, 254, 255, - 10, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 245, 1, 0, 0, 228, 0, - 0, 0, 2, 0, 15, 0, - 1, 0, 62, 0, 244, 0, - 0, 0, 0, 0, 0, 0, - 4, 1, 0, 0, 2, 0, - 0, 0, 4, 0, 2, 0, - 16, 1, 0, 0, 0, 0, - 0, 0, 32, 1, 0, 0, - 2, 0, 16, 0, 1, 0, - 66, 0, 44, 1, 0, 0, - 0, 0, 0, 0, 60, 1, - 0, 0, 2, 0, 14, 0, - 1, 0, 58, 0, 244, 0, - 0, 0, 0, 0, 0, 0, - 68, 1, 0, 0, 2, 0, - 17, 0, 24, 0, 70, 0, - 144, 1, 0, 0, 0, 0, - 0, 0, 160, 1, 0, 0, - 2, 0, 12, 0, 1, 0, - 50, 0, 244, 0, 0, 0, - 0, 0, 0, 0, 167, 1, - 0, 0, 2, 0, 8, 0, - 3, 0, 34, 0, 180, 1, - 0, 0, 0, 0, 0, 0, - 196, 1, 0, 0, 1, 0, - 0, 0, 1, 0, 2, 0, - 212, 1, 0, 0, 0, 0, - 0, 0, 228, 1, 0, 0, - 2, 0, 13, 0, 1, 0, - 54, 0, 244, 0, 0, 0, - 0, 0, 0, 0, 238, 1, - 0, 0, 2, 0, 41, 0, - 4, 0, 166, 0, 16, 1, - 0, 0, 0, 0, 0, 0, - 97, 109, 98, 105, 101, 110, - 116, 76, 105, 103, 104, 116, - 0, 171, 171, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 99, 111, 109, 98, - 105, 110, 101, 100, 77, 97, - 116, 0, 3, 0, 3, 0, - 4, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 102, 105, 114, 115, 116, 76, - 105, 103, 104, 116, 0, 171, - 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 102, 111, - 103, 68, 97, 116, 97, 0, - 108, 105, 103, 104, 116, 115, - 0, 99, 111, 108, 111, 114, - 0, 171, 171, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 112, 111, 115, 105, - 116, 105, 111, 110, 0, 100, - 105, 114, 101, 99, 116, 105, - 111, 110, 0, 171, 75, 1, - 0, 0, 84, 1, 0, 0, - 100, 1, 0, 0, 84, 1, - 0, 0, 109, 1, 0, 0, - 84, 1, 0, 0, 5, 0, - 0, 0, 1, 0, 12, 0, - 8, 0, 3, 0, 120, 1, - 0, 0, 109, 97, 116, 67, - 111, 108, 0, 110, 111, 114, - 109, 97, 108, 77, 97, 116, - 0, 171, 171, 171, 3, 0, - 3, 0, 3, 0, 3, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 110, 117, 109, 68, - 105, 114, 76, 105, 103, 104, - 116, 115, 0, 171, 171, 171, - 0, 0, 2, 0, 1, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 115, 117, - 114, 102, 80, 114, 111, 112, - 115, 0, 116, 101, 120, 77, - 97, 116, 0, 118, 115, 95, - 50, 95, 48, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 57, 46, 50, - 57, 46, 57, 53, 50, 46, - 51, 49, 49, 49, 0, 171, - 171, 171, 81, 0, 0, 5, - 4, 0, 15, 160, 0, 0, - 0, 0, 0, 0, 64, 64, - 0, 0, 128, 63, 0, 0, - 0, 0, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 15, 144, 31, 0, 0, 2, - 3, 0, 0, 128, 1, 0, - 15, 144, 31, 0, 0, 2, - 5, 0, 0, 128, 2, 0, - 15, 144, 31, 0, 0, 2, - 10, 0, 0, 128, 3, 0, - 15, 144, 5, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 85, 144, 1, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 15, 128, 0, 0, 228, 160, - 0, 0, 0, 144, 0, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 15, 128, 2, 0, - 228, 160, 0, 0, 170, 144, - 0, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 3, 0, 228, 160, 0, 0, - 255, 144, 0, 0, 228, 128, - 1, 0, 0, 2, 0, 0, - 15, 192, 0, 0, 228, 128, - 5, 0, 0, 3, 0, 0, - 7, 128, 1, 0, 85, 144, - 9, 0, 228, 160, 4, 0, - 0, 4, 0, 0, 7, 128, - 8, 0, 228, 160, 1, 0, - 0, 144, 0, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 7, 128, 10, 0, 228, 160, - 1, 0, 170, 144, 0, 0, - 228, 128, 1, 0, 0, 2, - 1, 0, 1, 128, 13, 0, - 0, 160, 4, 0, 0, 4, - 1, 0, 7, 128, 15, 0, - 228, 160, 1, 0, 0, 128, - 3, 0, 228, 144, 1, 0, - 0, 2, 2, 0, 7, 128, - 1, 0, 228, 128, 1, 0, - 0, 2, 1, 0, 8, 128, - 4, 0, 0, 160, 38, 0, - 0, 1, 0, 0, 228, 240, - 2, 0, 0, 3, 3, 0, - 1, 128, 1, 0, 255, 128, - 16, 0, 0, 160, 5, 0, - 0, 3, 3, 0, 1, 128, - 3, 0, 0, 128, 4, 0, - 85, 160, 46, 0, 0, 2, - 0, 0, 1, 176, 3, 0, - 0, 128, 8, 0, 0, 4, - 3, 0, 1, 128, 0, 0, - 228, 128, 19, 32, 228, 161, - 0, 0, 0, 176, 11, 0, - 0, 3, 3, 0, 1, 128, - 3, 0, 0, 128, 4, 0, - 0, 160, 5, 0, 0, 4, - 3, 0, 7, 128, 3, 0, - 0, 128, 17, 32, 228, 160, - 0, 0, 0, 176, 4, 0, - 0, 4, 2, 0, 7, 128, - 3, 0, 228, 128, 13, 0, - 170, 160, 2, 0, 228, 128, - 2, 0, 0, 3, 1, 0, - 8, 128, 1, 0, 255, 128, - 4, 0, 170, 160, 39, 0, - 0, 0, 1, 0, 0, 2, - 2, 0, 8, 128, 3, 0, - 255, 144, 11, 0, 0, 3, - 1, 0, 15, 128, 2, 0, - 228, 128, 4, 0, 0, 160, - 10, 0, 0, 3, 1, 0, - 15, 128, 1, 0, 228, 128, - 4, 0, 170, 160, 5, 0, - 0, 3, 0, 0, 15, 208, - 1, 0, 228, 128, 12, 0, - 228, 160, 5, 0, 0, 3, - 1, 0, 3, 128, 0, 0, - 85, 128, 42, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 3, 128, 41, 0, 228, 160, - 0, 0, 0, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 3, 128, 43, 0, - 228, 160, 0, 0, 170, 128, - 0, 0, 228, 128, 2, 0, - 0, 3, 1, 0, 3, 224, - 0, 0, 228, 128, 44, 0, - 228, 160, 2, 0, 0, 3, - 0, 0, 1, 128, 0, 0, - 255, 128, 14, 0, 85, 161, - 5, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 0, 128, - 14, 0, 170, 160, 11, 0, - 0, 3, 0, 0, 1, 128, - 0, 0, 0, 128, 14, 0, - 255, 160, 10, 0, 0, 3, - 0, 0, 4, 224, 0, 0, - 0, 128, 4, 0, 170, 160, - 1, 0, 0, 2, 0, 0, - 3, 224, 2, 0, 228, 144, - 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/matfx_env_tex_PS.h b/vendor/librw/src/d3d/shaders/matfx_env_tex_PS.h deleted file mode 100644 index 3a2d442..0000000 --- a/vendor/librw/src/d3d/shaders/matfx_env_tex_PS.h +++ /dev/null @@ -1,149 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T ps_2_0 /DTEX /Fh matfx_env_tex_PS.h matfx_env_PS.hlsl -// -// -// Parameters: -// -// float4 colorClamp; -// sampler2D diffTex; -// sampler2D envTex; -// float4 fogColor; -// float4 fxparams; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// fogColor c0 1 -// fxparams c1 1 -// colorClamp c2 1 -// diffTex s0 1 -// envTex s1 1 -// - - ps_2_0 - dcl t0.xyz - dcl t1.xy - dcl v0 - dcl_2d s0 - dcl_2d s1 - texld r0, t1, s1 - texld r1, t0, s0 - max r2.xyz, v0, c2 - mul r2.xyz, r2, c1.x - mul r0.xyz, r0, r2 - mul r0.xyz, r0, t0.z - mul r2.w, r1.w, v0.w - mad r1.xyz, v0, r1, -c0 - mad r1.xyz, t0.z, r1, c0 - max r0.w, r2.w, c1.y - mul r0.xyz, r0.w, r0 - mad r2.xyz, r1, r2.w, r0 - mov oC0, r2 - -// approximately 13 instruction slots used (2 texture, 11 arithmetic) -#endif - -const BYTE g_ps20_main[] = -{ - 0, 2, 255, 255, 254, 255, - 71, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 229, 0, - 0, 0, 0, 2, 255, 255, - 5, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 222, 0, 0, 0, 128, 0, - 0, 0, 2, 0, 2, 0, - 1, 0, 10, 0, 140, 0, - 0, 0, 0, 0, 0, 0, - 156, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 2, 0, - 164, 0, 0, 0, 0, 0, - 0, 0, 180, 0, 0, 0, - 3, 0, 1, 0, 1, 0, - 6, 0, 188, 0, 0, 0, - 0, 0, 0, 0, 204, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 2, 0, 140, 0, - 0, 0, 0, 0, 0, 0, - 213, 0, 0, 0, 2, 0, - 1, 0, 1, 0, 6, 0, - 140, 0, 0, 0, 0, 0, - 0, 0, 99, 111, 108, 111, - 114, 67, 108, 97, 109, 112, - 0, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 100, 105, 102, 102, 84, 101, - 120, 0, 4, 0, 12, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 101, 110, 118, 84, 101, 120, - 0, 171, 4, 0, 12, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 102, 111, 103, 67, 111, 108, - 111, 114, 0, 102, 120, 112, - 97, 114, 97, 109, 115, 0, - 112, 115, 95, 50, 95, 48, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 57, 46, 50, 57, 46, 57, - 53, 50, 46, 51, 49, 49, - 49, 0, 171, 171, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 7, 176, 31, 0, - 0, 2, 0, 0, 0, 128, - 1, 0, 3, 176, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 15, 144, 31, 0, - 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 31, 0, - 0, 2, 0, 0, 0, 144, - 1, 8, 15, 160, 66, 0, - 0, 3, 0, 0, 15, 128, - 1, 0, 228, 176, 1, 8, - 228, 160, 66, 0, 0, 3, - 1, 0, 15, 128, 0, 0, - 228, 176, 0, 8, 228, 160, - 11, 0, 0, 3, 2, 0, - 7, 128, 0, 0, 228, 144, - 2, 0, 228, 160, 5, 0, - 0, 3, 2, 0, 7, 128, - 2, 0, 228, 128, 1, 0, - 0, 160, 5, 0, 0, 3, - 0, 0, 7, 128, 0, 0, - 228, 128, 2, 0, 228, 128, - 5, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 228, 128, - 0, 0, 170, 176, 5, 0, - 0, 3, 2, 0, 8, 128, - 1, 0, 255, 128, 0, 0, - 255, 144, 4, 0, 0, 4, - 1, 0, 7, 128, 0, 0, - 228, 144, 1, 0, 228, 128, - 0, 0, 228, 161, 4, 0, - 0, 4, 1, 0, 7, 128, - 0, 0, 170, 176, 1, 0, - 228, 128, 0, 0, 228, 160, - 11, 0, 0, 3, 0, 0, - 8, 128, 2, 0, 255, 128, - 1, 0, 85, 160, 5, 0, - 0, 3, 0, 0, 7, 128, - 0, 0, 255, 128, 0, 0, - 228, 128, 4, 0, 0, 4, - 2, 0, 7, 128, 1, 0, - 228, 128, 2, 0, 255, 128, - 0, 0, 228, 128, 1, 0, - 0, 2, 0, 8, 15, 128, - 2, 0, 228, 128, 255, 255, - 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/skin_VS.hlsl b/vendor/librw/src/d3d/shaders/skin_VS.hlsl deleted file mode 100644 index bede50f..0000000 --- a/vendor/librw/src/d3d/shaders/skin_VS.hlsl +++ /dev/null @@ -1,63 +0,0 @@ -#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; -}; - - -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 - // 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/vendor/librw/src/d3d/shaders/skin_all_VS.h b/vendor/librw/src/d3d/shaders/skin_all_VS.h deleted file mode 100644 index 67f89f3..0000000 --- a/vendor/librw/src/d3d/shaders/skin_all_VS.h +++ /dev/null @@ -1,664 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T vs_2_0 /DDIRECTIONALS /DPOINTLIGHTS /DSPOTLIGHTS /Fh -// skin_all_VS.h skin_VS.hlsl -// -// -// Parameters: -// -// float4 ambientLight; -// float4x3 boneMatrices[64]; -// float4x4 combinedMat; -// int4 firstLight; -// float4 fogData; -// -// struct -// { -// float4 color; -// float4 position; -// float4 direction; -// -// } lights[8]; -// -// float4 matCol; -// float3x3 normalMat; -// int numDirLights; -// int numPointLights; -// int numSpotLights; -// float4 surfProps; -// float4x4 worldMat; -// -// -// Registers: -// -// Name Reg Size -// -------------- ----- ---- -// numDirLights i0 1 -// numPointLights i1 1 -// numSpotLights i2 1 -// combinedMat c0 4 -// worldMat c4 4 -// normalMat c8 3 -// matCol c12 1 -// surfProps c13 1 -// fogData c14 1 -// ambientLight c15 1 -// firstLight c16 1 -// lights c17 24 -// boneMatrices c41 192 -// - - vs_2_0 - def c11, 3, 0, 1, 0 - dcl_position v0 - dcl_normal v1 - dcl_texcoord v2 - dcl_color v3 - dcl_blendweight v4 - dcl_blendindices v5 - mul r0, v5, c11.x - mova a0.x, r0.x - dp3 r1.z, v1, c43[a0.x] - dp4 r2.x, v0, c41[a0.x] - dp4 r2.y, v0, c42[a0.x] - dp4 r2.z, v0, c43[a0.x] - dp3 r1.x, v1, c41[a0.x] - dp3 r1.y, v1, c42[a0.x] - mova a0.x, r0.y - dp3 r3.z, v1, c43[a0.x] - dp4 r4.x, v0, c41[a0.x] - dp4 r4.y, v0, c42[a0.x] - dp4 r4.z, v0, c43[a0.x] - mul r4.xyz, r4, v4.y - mad r2.xyz, r2, v4.x, r4 - dp3 r3.x, v1, c41[a0.x] - dp3 r3.y, v1, c42[a0.x] - mul r3.xyz, r3, v4.y - mad r1.xyz, r1, v4.x, r3 - mova a0.x, r0.z - dp3 r0.z, v1, c43[a0.x] - dp4 r3.x, v0, c41[a0.x] - dp4 r3.y, v0, c42[a0.x] - dp4 r3.z, v0, c43[a0.x] - mad r2.xyz, r3, v4.z, r2 - dp3 r0.x, v1, c41[a0.x] - dp3 r0.y, v1, c42[a0.x] - mad r0.xyz, r0, v4.z, r1 - mova a0.x, r0.w - dp3 r1.z, v1, c43[a0.x] - dp4 r3.x, v0, c41[a0.x] - dp4 r3.y, v0, c42[a0.x] - dp4 r3.z, v0, c43[a0.x] - mad r2.xyz, r3, v4.w, r2 - dp3 r1.x, v1, c41[a0.x] - dp3 r1.y, v1, c42[a0.x] - mad r0.xyz, r1, v4.w, r0 - mul r1.xyz, r2.y, c5 - mad r1.xyz, c4, r2.x, r1 - mad r1.xyz, c6, r2.z, r1 - add r1.xyz, r1, c7 - mul r3.xyz, r0.y, c9 - mad r0.xyw, c8.xyzz, r0.x, r3.xyzz - mad r0.xyz, c10, r0.z, r0.xyww - mov r3.x, c13.x - mad r3.xyz, c15, r3.x, v3 - mov r4.xyz, r3 - mov r0.w, c11.y - rep i0 - add r1.w, r0.w, c16.x - mul r1.w, r1.w, c11.x - mova a0.x, r1.w - dp3 r1.w, r0, -c19[a0.x] - max r1.w, r1.w, c11.y - mul r5.xyz, r1.w, c17[a0.x] - mad r4.xyz, r5, c13.z, r4 - add r0.w, r0.w, c11.z - endrep - mov r3.xyz, r4 - mov r0.w, c11.y - rep i1 - add r1.w, r0.w, c16.y - mul r1.w, r1.w, c11.x - mova a0.x, r1.w - add r5.xyz, r1, -c18[a0.x] - dp3 r1.w, r5, r5 - rsq r1.w, r1.w - mul r5.xyz, r1.w, r5 - dp3 r2.w, r0, -r5 - max r2.w, r2.w, c11.y - mul r5.xyz, r2.w, c17[a0.x] - rcp r1.w, r1.w - rcp r2.w, c17[a0.x].w - mad r1.w, r1.w, -r2.w, c11.z - max r1.w, r1.w, c11.y - mul r5.xyz, r1.w, r5 - mad r3.xyz, r5, c13.z, r3 - add r0.w, r0.w, c11.z - endrep - mov r4.xyz, r3 - mov r0.w, c11.y - rep i2 - add r1.w, r0.w, c16.z - mul r1.w, r1.w, c11.x - mova a0.x, r1.w - add r5.xyz, r1, -c18[a0.x] - dp3 r1.w, r5, r5 - rsq r1.w, r1.w - mul r5.xyz, r1.w, r5 - dp3 r2.w, r0, -r5 - dp3 r3.w, r5, c19[a0.x] - max r2.w, r2.w, c11.y - add r3.w, r3.w, c18[a0.x].w - mov r5.z, c11.z - add r5.x, r5.z, c18[a0.x].w - rcp r5.x, r5.x - mul r3.w, r3.w, r5.x - slt r5.x, r3.w, c11.y - mad r2.w, r5.x, -r2.w, r2.w - max r3.w, r3.w, c19[a0.x].w - mul r2.w, r2.w, r3.w - mul r5.xyz, r2.w, c17[a0.x] - rcp r1.w, r1.w - rcp r2.w, c17[a0.x].w - mad r1.w, r1.w, -r2.w, c11.z - max r1.w, r1.w, c11.y - mul r5.xyz, r1.w, r5 - mad r4.xyz, r5, c13.z, r4 - add r0.w, r0.w, c11.z - endrep - mov r4.w, v3.w - max r0, r4, c11.y - min r0, r0, c11.z - mul oD0, r0, c12 - mul r0, r2.y, c1 - mad r0, c0, r2.x, r0 - mad r0, c2, r2.z, r0 - add r0, r0, c3 - mov oPos, r0 - add r0.x, r0.w, -c14.y - mul r0.x, r0.x, c14.z - max r0.x, r0.x, c14.w - min oT0.z, r0.x, c11.z - mov oT0.xy, v2 - -// approximately 133 instruction slots used -#endif - -const BYTE g_vs20_main[] = -{ - 0, 2, 254, 255, 254, 255, - 171, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 119, 2, - 0, 0, 0, 2, 254, 255, - 13, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 112, 2, 0, 0, 32, 1, - 0, 0, 2, 0, 15, 0, - 1, 0, 62, 0, 48, 1, - 0, 0, 0, 0, 0, 0, - 64, 1, 0, 0, 2, 0, - 41, 0, 192, 0, 166, 0, - 80, 1, 0, 0, 0, 0, - 0, 0, 96, 1, 0, 0, - 2, 0, 0, 0, 4, 0, - 2, 0, 108, 1, 0, 0, - 0, 0, 0, 0, 124, 1, - 0, 0, 2, 0, 16, 0, - 1, 0, 66, 0, 136, 1, - 0, 0, 0, 0, 0, 0, - 152, 1, 0, 0, 2, 0, - 14, 0, 1, 0, 58, 0, - 48, 1, 0, 0, 0, 0, - 0, 0, 160, 1, 0, 0, - 2, 0, 17, 0, 24, 0, - 70, 0, 236, 1, 0, 0, - 0, 0, 0, 0, 252, 1, - 0, 0, 2, 0, 12, 0, - 1, 0, 50, 0, 48, 1, - 0, 0, 0, 0, 0, 0, - 3, 2, 0, 0, 2, 0, - 8, 0, 3, 0, 34, 0, - 16, 2, 0, 0, 0, 0, - 0, 0, 32, 2, 0, 0, - 1, 0, 0, 0, 1, 0, - 2, 0, 48, 2, 0, 0, - 0, 0, 0, 0, 64, 2, - 0, 0, 1, 0, 1, 0, - 1, 0, 6, 0, 48, 2, - 0, 0, 0, 0, 0, 0, - 79, 2, 0, 0, 1, 0, - 2, 0, 1, 0, 10, 0, - 48, 2, 0, 0, 0, 0, - 0, 0, 93, 2, 0, 0, - 2, 0, 13, 0, 1, 0, - 54, 0, 48, 1, 0, 0, - 0, 0, 0, 0, 103, 2, - 0, 0, 2, 0, 4, 0, - 4, 0, 18, 0, 108, 1, - 0, 0, 0, 0, 0, 0, - 97, 109, 98, 105, 101, 110, - 116, 76, 105, 103, 104, 116, - 0, 171, 171, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 98, 111, 110, 101, - 77, 97, 116, 114, 105, 99, - 101, 115, 0, 171, 171, 171, - 3, 0, 3, 0, 4, 0, - 3, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 99, 111, - 109, 98, 105, 110, 101, 100, - 77, 97, 116, 0, 3, 0, - 3, 0, 4, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 102, 105, 114, 115, - 116, 76, 105, 103, 104, 116, - 0, 171, 1, 0, 2, 0, - 1, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 102, 111, 103, 68, 97, 116, - 97, 0, 108, 105, 103, 104, - 116, 115, 0, 99, 111, 108, - 111, 114, 0, 171, 171, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 112, 111, - 115, 105, 116, 105, 111, 110, - 0, 100, 105, 114, 101, 99, - 116, 105, 111, 110, 0, 171, - 167, 1, 0, 0, 176, 1, - 0, 0, 192, 1, 0, 0, - 176, 1, 0, 0, 201, 1, - 0, 0, 176, 1, 0, 0, - 5, 0, 0, 0, 1, 0, - 12, 0, 8, 0, 3, 0, - 212, 1, 0, 0, 109, 97, - 116, 67, 111, 108, 0, 110, - 111, 114, 109, 97, 108, 77, - 97, 116, 0, 171, 171, 171, - 3, 0, 3, 0, 3, 0, - 3, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 110, 117, - 109, 68, 105, 114, 76, 105, - 103, 104, 116, 115, 0, 171, - 171, 171, 0, 0, 2, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 110, 117, 109, 80, 111, 105, - 110, 116, 76, 105, 103, 104, - 116, 115, 0, 110, 117, 109, - 83, 112, 111, 116, 76, 105, - 103, 104, 116, 115, 0, 115, - 117, 114, 102, 80, 114, 111, - 112, 115, 0, 119, 111, 114, - 108, 100, 77, 97, 116, 0, - 118, 115, 95, 50, 95, 48, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 57, 46, 50, 57, 46, 57, - 53, 50, 46, 51, 49, 49, - 49, 0, 81, 0, 0, 5, - 11, 0, 15, 160, 0, 0, - 64, 64, 0, 0, 0, 0, - 0, 0, 128, 63, 0, 0, - 0, 0, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 15, 144, 31, 0, 0, 2, - 3, 0, 0, 128, 1, 0, - 15, 144, 31, 0, 0, 2, - 5, 0, 0, 128, 2, 0, - 15, 144, 31, 0, 0, 2, - 10, 0, 0, 128, 3, 0, - 15, 144, 31, 0, 0, 2, - 1, 0, 0, 128, 4, 0, - 15, 144, 31, 0, 0, 2, - 2, 0, 0, 128, 5, 0, - 15, 144, 5, 0, 0, 3, - 0, 0, 15, 128, 5, 0, - 228, 144, 11, 0, 0, 160, - 46, 0, 0, 2, 0, 0, - 1, 176, 0, 0, 0, 128, - 8, 0, 0, 4, 1, 0, - 4, 128, 1, 0, 228, 144, - 43, 32, 228, 160, 0, 0, - 0, 176, 9, 0, 0, 4, - 2, 0, 1, 128, 0, 0, - 228, 144, 41, 32, 228, 160, - 0, 0, 0, 176, 9, 0, - 0, 4, 2, 0, 2, 128, - 0, 0, 228, 144, 42, 32, - 228, 160, 0, 0, 0, 176, - 9, 0, 0, 4, 2, 0, - 4, 128, 0, 0, 228, 144, - 43, 32, 228, 160, 0, 0, - 0, 176, 8, 0, 0, 4, - 1, 0, 1, 128, 1, 0, - 228, 144, 41, 32, 228, 160, - 0, 0, 0, 176, 8, 0, - 0, 4, 1, 0, 2, 128, - 1, 0, 228, 144, 42, 32, - 228, 160, 0, 0, 0, 176, - 46, 0, 0, 2, 0, 0, - 1, 176, 0, 0, 85, 128, - 8, 0, 0, 4, 3, 0, - 4, 128, 1, 0, 228, 144, - 43, 32, 228, 160, 0, 0, - 0, 176, 9, 0, 0, 4, - 4, 0, 1, 128, 0, 0, - 228, 144, 41, 32, 228, 160, - 0, 0, 0, 176, 9, 0, - 0, 4, 4, 0, 2, 128, - 0, 0, 228, 144, 42, 32, - 228, 160, 0, 0, 0, 176, - 9, 0, 0, 4, 4, 0, - 4, 128, 0, 0, 228, 144, - 43, 32, 228, 160, 0, 0, - 0, 176, 5, 0, 0, 3, - 4, 0, 7, 128, 4, 0, - 228, 128, 4, 0, 85, 144, - 4, 0, 0, 4, 2, 0, - 7, 128, 2, 0, 228, 128, - 4, 0, 0, 144, 4, 0, - 228, 128, 8, 0, 0, 4, - 3, 0, 1, 128, 1, 0, - 228, 144, 41, 32, 228, 160, - 0, 0, 0, 176, 8, 0, - 0, 4, 3, 0, 2, 128, - 1, 0, 228, 144, 42, 32, - 228, 160, 0, 0, 0, 176, - 5, 0, 0, 3, 3, 0, - 7, 128, 3, 0, 228, 128, - 4, 0, 85, 144, 4, 0, - 0, 4, 1, 0, 7, 128, - 1, 0, 228, 128, 4, 0, - 0, 144, 3, 0, 228, 128, - 46, 0, 0, 2, 0, 0, - 1, 176, 0, 0, 170, 128, - 8, 0, 0, 4, 0, 0, - 4, 128, 1, 0, 228, 144, - 43, 32, 228, 160, 0, 0, - 0, 176, 9, 0, 0, 4, - 3, 0, 1, 128, 0, 0, - 228, 144, 41, 32, 228, 160, - 0, 0, 0, 176, 9, 0, - 0, 4, 3, 0, 2, 128, - 0, 0, 228, 144, 42, 32, - 228, 160, 0, 0, 0, 176, - 9, 0, 0, 4, 3, 0, - 4, 128, 0, 0, 228, 144, - 43, 32, 228, 160, 0, 0, - 0, 176, 4, 0, 0, 4, - 2, 0, 7, 128, 3, 0, - 228, 128, 4, 0, 170, 144, - 2, 0, 228, 128, 8, 0, - 0, 4, 0, 0, 1, 128, - 1, 0, 228, 144, 41, 32, - 228, 160, 0, 0, 0, 176, - 8, 0, 0, 4, 0, 0, - 2, 128, 1, 0, 228, 144, - 42, 32, 228, 160, 0, 0, - 0, 176, 4, 0, 0, 4, - 0, 0, 7, 128, 0, 0, - 228, 128, 4, 0, 170, 144, - 1, 0, 228, 128, 46, 0, - 0, 2, 0, 0, 1, 176, - 0, 0, 255, 128, 8, 0, - 0, 4, 1, 0, 4, 128, - 1, 0, 228, 144, 43, 32, - 228, 160, 0, 0, 0, 176, - 9, 0, 0, 4, 3, 0, - 1, 128, 0, 0, 228, 144, - 41, 32, 228, 160, 0, 0, - 0, 176, 9, 0, 0, 4, - 3, 0, 2, 128, 0, 0, - 228, 144, 42, 32, 228, 160, - 0, 0, 0, 176, 9, 0, - 0, 4, 3, 0, 4, 128, - 0, 0, 228, 144, 43, 32, - 228, 160, 0, 0, 0, 176, - 4, 0, 0, 4, 2, 0, - 7, 128, 3, 0, 228, 128, - 4, 0, 255, 144, 2, 0, - 228, 128, 8, 0, 0, 4, - 1, 0, 1, 128, 1, 0, - 228, 144, 41, 32, 228, 160, - 0, 0, 0, 176, 8, 0, - 0, 4, 1, 0, 2, 128, - 1, 0, 228, 144, 42, 32, - 228, 160, 0, 0, 0, 176, - 4, 0, 0, 4, 0, 0, - 7, 128, 1, 0, 228, 128, - 4, 0, 255, 144, 0, 0, - 228, 128, 5, 0, 0, 3, - 1, 0, 7, 128, 2, 0, - 85, 128, 5, 0, 228, 160, - 4, 0, 0, 4, 1, 0, - 7, 128, 4, 0, 228, 160, - 2, 0, 0, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 1, 0, 7, 128, 6, 0, - 228, 160, 2, 0, 170, 128, - 1, 0, 228, 128, 2, 0, - 0, 3, 1, 0, 7, 128, - 1, 0, 228, 128, 7, 0, - 228, 160, 5, 0, 0, 3, - 3, 0, 7, 128, 0, 0, - 85, 128, 9, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 11, 128, 8, 0, 164, 160, - 0, 0, 0, 128, 3, 0, - 164, 128, 4, 0, 0, 4, - 0, 0, 7, 128, 10, 0, - 228, 160, 0, 0, 170, 128, - 0, 0, 244, 128, 1, 0, - 0, 2, 3, 0, 1, 128, - 13, 0, 0, 160, 4, 0, - 0, 4, 3, 0, 7, 128, - 15, 0, 228, 160, 3, 0, - 0, 128, 3, 0, 228, 144, - 1, 0, 0, 2, 4, 0, - 7, 128, 3, 0, 228, 128, - 1, 0, 0, 2, 0, 0, - 8, 128, 11, 0, 85, 160, - 38, 0, 0, 1, 0, 0, - 228, 240, 2, 0, 0, 3, - 1, 0, 8, 128, 0, 0, - 255, 128, 16, 0, 0, 160, - 5, 0, 0, 3, 1, 0, - 8, 128, 1, 0, 255, 128, - 11, 0, 0, 160, 46, 0, - 0, 2, 0, 0, 1, 176, - 1, 0, 255, 128, 8, 0, - 0, 4, 1, 0, 8, 128, - 0, 0, 228, 128, 19, 32, - 228, 161, 0, 0, 0, 176, - 11, 0, 0, 3, 1, 0, - 8, 128, 1, 0, 255, 128, - 11, 0, 85, 160, 5, 0, - 0, 4, 5, 0, 7, 128, - 1, 0, 255, 128, 17, 32, - 228, 160, 0, 0, 0, 176, - 4, 0, 0, 4, 4, 0, - 7, 128, 5, 0, 228, 128, - 13, 0, 170, 160, 4, 0, - 228, 128, 2, 0, 0, 3, - 0, 0, 8, 128, 0, 0, - 255, 128, 11, 0, 170, 160, - 39, 0, 0, 0, 1, 0, - 0, 2, 3, 0, 7, 128, - 4, 0, 228, 128, 1, 0, - 0, 2, 0, 0, 8, 128, - 11, 0, 85, 160, 38, 0, - 0, 1, 1, 0, 228, 240, - 2, 0, 0, 3, 1, 0, - 8, 128, 0, 0, 255, 128, - 16, 0, 85, 160, 5, 0, - 0, 3, 1, 0, 8, 128, - 1, 0, 255, 128, 11, 0, - 0, 160, 46, 0, 0, 2, - 0, 0, 1, 176, 1, 0, - 255, 128, 2, 0, 0, 4, - 5, 0, 7, 128, 1, 0, - 228, 128, 18, 32, 228, 161, - 0, 0, 0, 176, 8, 0, - 0, 3, 1, 0, 8, 128, - 5, 0, 228, 128, 5, 0, - 228, 128, 7, 0, 0, 2, - 1, 0, 8, 128, 1, 0, - 255, 128, 5, 0, 0, 3, - 5, 0, 7, 128, 1, 0, - 255, 128, 5, 0, 228, 128, - 8, 0, 0, 3, 2, 0, - 8, 128, 0, 0, 228, 128, - 5, 0, 228, 129, 11, 0, - 0, 3, 2, 0, 8, 128, - 2, 0, 255, 128, 11, 0, - 85, 160, 5, 0, 0, 4, - 5, 0, 7, 128, 2, 0, - 255, 128, 17, 32, 228, 160, - 0, 0, 0, 176, 6, 0, - 0, 2, 1, 0, 8, 128, - 1, 0, 255, 128, 6, 0, - 0, 3, 2, 0, 8, 128, - 17, 32, 255, 160, 0, 0, - 0, 176, 4, 0, 0, 4, - 1, 0, 8, 128, 1, 0, - 255, 128, 2, 0, 255, 129, - 11, 0, 170, 160, 11, 0, - 0, 3, 1, 0, 8, 128, - 1, 0, 255, 128, 11, 0, - 85, 160, 5, 0, 0, 3, - 5, 0, 7, 128, 1, 0, - 255, 128, 5, 0, 228, 128, - 4, 0, 0, 4, 3, 0, - 7, 128, 5, 0, 228, 128, - 13, 0, 170, 160, 3, 0, - 228, 128, 2, 0, 0, 3, - 0, 0, 8, 128, 0, 0, - 255, 128, 11, 0, 170, 160, - 39, 0, 0, 0, 1, 0, - 0, 2, 4, 0, 7, 128, - 3, 0, 228, 128, 1, 0, - 0, 2, 0, 0, 8, 128, - 11, 0, 85, 160, 38, 0, - 0, 1, 2, 0, 228, 240, - 2, 0, 0, 3, 1, 0, - 8, 128, 0, 0, 255, 128, - 16, 0, 170, 160, 5, 0, - 0, 3, 1, 0, 8, 128, - 1, 0, 255, 128, 11, 0, - 0, 160, 46, 0, 0, 2, - 0, 0, 1, 176, 1, 0, - 255, 128, 2, 0, 0, 4, - 5, 0, 7, 128, 1, 0, - 228, 128, 18, 32, 228, 161, - 0, 0, 0, 176, 8, 0, - 0, 3, 1, 0, 8, 128, - 5, 0, 228, 128, 5, 0, - 228, 128, 7, 0, 0, 2, - 1, 0, 8, 128, 1, 0, - 255, 128, 5, 0, 0, 3, - 5, 0, 7, 128, 1, 0, - 255, 128, 5, 0, 228, 128, - 8, 0, 0, 3, 2, 0, - 8, 128, 0, 0, 228, 128, - 5, 0, 228, 129, 8, 0, - 0, 4, 3, 0, 8, 128, - 5, 0, 228, 128, 19, 32, - 228, 160, 0, 0, 0, 176, - 11, 0, 0, 3, 2, 0, - 8, 128, 2, 0, 255, 128, - 11, 0, 85, 160, 2, 0, - 0, 4, 3, 0, 8, 128, - 3, 0, 255, 128, 18, 32, - 255, 160, 0, 0, 0, 176, - 1, 0, 0, 2, 5, 0, - 4, 128, 11, 0, 170, 160, - 2, 0, 0, 4, 5, 0, - 1, 128, 5, 0, 170, 128, - 18, 32, 255, 160, 0, 0, - 0, 176, 6, 0, 0, 2, - 5, 0, 1, 128, 5, 0, - 0, 128, 5, 0, 0, 3, - 3, 0, 8, 128, 3, 0, - 255, 128, 5, 0, 0, 128, - 12, 0, 0, 3, 5, 0, - 1, 128, 3, 0, 255, 128, - 11, 0, 85, 160, 4, 0, - 0, 4, 2, 0, 8, 128, - 5, 0, 0, 128, 2, 0, - 255, 129, 2, 0, 255, 128, - 11, 0, 0, 4, 3, 0, - 8, 128, 3, 0, 255, 128, - 19, 32, 255, 160, 0, 0, - 0, 176, 5, 0, 0, 3, - 2, 0, 8, 128, 2, 0, - 255, 128, 3, 0, 255, 128, - 5, 0, 0, 4, 5, 0, - 7, 128, 2, 0, 255, 128, - 17, 32, 228, 160, 0, 0, - 0, 176, 6, 0, 0, 2, - 1, 0, 8, 128, 1, 0, - 255, 128, 6, 0, 0, 3, - 2, 0, 8, 128, 17, 32, - 255, 160, 0, 0, 0, 176, - 4, 0, 0, 4, 1, 0, - 8, 128, 1, 0, 255, 128, - 2, 0, 255, 129, 11, 0, - 170, 160, 11, 0, 0, 3, - 1, 0, 8, 128, 1, 0, - 255, 128, 11, 0, 85, 160, - 5, 0, 0, 3, 5, 0, - 7, 128, 1, 0, 255, 128, - 5, 0, 228, 128, 4, 0, - 0, 4, 4, 0, 7, 128, - 5, 0, 228, 128, 13, 0, - 170, 160, 4, 0, 228, 128, - 2, 0, 0, 3, 0, 0, - 8, 128, 0, 0, 255, 128, - 11, 0, 170, 160, 39, 0, - 0, 0, 1, 0, 0, 2, - 4, 0, 8, 128, 3, 0, - 255, 144, 11, 0, 0, 3, - 0, 0, 15, 128, 4, 0, - 228, 128, 11, 0, 85, 160, - 10, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 11, 0, 170, 160, 5, 0, - 0, 3, 0, 0, 15, 208, - 0, 0, 228, 128, 12, 0, - 228, 160, 5, 0, 0, 3, - 0, 0, 15, 128, 2, 0, - 85, 128, 1, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 15, 128, 0, 0, 228, 160, - 2, 0, 0, 128, 0, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 15, 128, 2, 0, - 228, 160, 2, 0, 170, 128, - 0, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 3, 0, - 228, 160, 1, 0, 0, 2, - 0, 0, 15, 192, 0, 0, - 228, 128, 2, 0, 0, 3, - 0, 0, 1, 128, 0, 0, - 255, 128, 14, 0, 85, 161, - 5, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 0, 128, - 14, 0, 170, 160, 11, 0, - 0, 3, 0, 0, 1, 128, - 0, 0, 0, 128, 14, 0, - 255, 160, 10, 0, 0, 3, - 0, 0, 4, 224, 0, 0, - 0, 128, 11, 0, 170, 160, - 1, 0, 0, 2, 0, 0, - 3, 224, 2, 0, 228, 144, - 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/skin_amb_VS.h b/vendor/librw/src/d3d/shaders/skin_amb_VS.h deleted file mode 100644 index e0a5548..0000000 --- a/vendor/librw/src/d3d/shaders/skin_amb_VS.h +++ /dev/null @@ -1,253 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T vs_2_0 /Fh skin_amb_VS.h skin_VS.hlsl -// -// -// Parameters: -// -// float4 ambientLight; -// float4x3 boneMatrices[64]; -// float4x4 combinedMat; -// float4 fogData; -// float4 matCol; -// float4 surfProps; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// combinedMat c0 4 -// matCol c12 1 -// surfProps c13 1 -// fogData c14 1 -// ambientLight c15 1 -// boneMatrices c41 192 -// - - vs_2_0 - def c4, 3, 0, 1, 0 - dcl_position v0 - dcl_texcoord v1 - dcl_color v2 - dcl_blendweight v3 - dcl_blendindices v4 - mov r0.xyz, c15 - mad r0.xyz, r0, c13.x, v2 - mov r0.w, v2.w - max r0, r0, c4.y - min r0, r0, c4.z - mul oD0, r0, c12 - mul r0, v4, c4.x - mova a0.x, r0.y - dp4 r1.x, v0, c41[a0.x] - dp4 r1.y, v0, c42[a0.x] - dp4 r1.z, v0, c43[a0.x] - mul r1.xyz, r1, v3.y - mova a0.x, r0.x - dp4 r2.x, v0, c41[a0.x] - dp4 r2.y, v0, c42[a0.x] - dp4 r2.z, v0, c43[a0.x] - mad r1.xyz, r2, v3.x, r1 - mova a0.xy, r0.zwzw - dp4 r0.x, v0, c41[a0.x] - dp4 r0.y, v0, c42[a0.x] - dp4 r0.z, v0, c43[a0.x] - mad r0.xyz, r0, v3.z, r1 - dp4 r1.x, v0, c41[a0.y] - dp4 r1.y, v0, c42[a0.y] - dp4 r1.z, v0, c43[a0.y] - mad r0.xyz, r1, v3.w, r0 - mul r1, r0.y, c1 - mad r1, c0, r0.x, r1 - mad r0, c2, r0.z, r1 - add r0, r0, c3 - add r1.x, r0.w, -c14.y - mov oPos, r0 - mul r0.x, r1.x, c14.z - max r0.x, r0.x, c14.w - min oT0.z, r0.x, c4.z - mov oT0.xy, v1 - -// approximately 36 instruction slots used -#endif - -const BYTE g_vs20_main[] = -{ - 0, 2, 254, 255, 254, 255, - 82, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 16, 1, - 0, 0, 0, 2, 254, 255, - 6, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 9, 1, 0, 0, 148, 0, - 0, 0, 2, 0, 15, 0, - 1, 0, 62, 0, 164, 0, - 0, 0, 0, 0, 0, 0, - 180, 0, 0, 0, 2, 0, - 41, 0, 192, 0, 166, 0, - 196, 0, 0, 0, 0, 0, - 0, 0, 212, 0, 0, 0, - 2, 0, 0, 0, 4, 0, - 2, 0, 224, 0, 0, 0, - 0, 0, 0, 0, 240, 0, - 0, 0, 2, 0, 14, 0, - 1, 0, 58, 0, 164, 0, - 0, 0, 0, 0, 0, 0, - 248, 0, 0, 0, 2, 0, - 12, 0, 1, 0, 50, 0, - 164, 0, 0, 0, 0, 0, - 0, 0, 255, 0, 0, 0, - 2, 0, 13, 0, 1, 0, - 54, 0, 164, 0, 0, 0, - 0, 0, 0, 0, 97, 109, - 98, 105, 101, 110, 116, 76, - 105, 103, 104, 116, 0, 171, - 171, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 98, 111, 110, 101, 77, 97, - 116, 114, 105, 99, 101, 115, - 0, 171, 171, 171, 3, 0, - 3, 0, 4, 0, 3, 0, - 64, 0, 0, 0, 0, 0, - 0, 0, 99, 111, 109, 98, - 105, 110, 101, 100, 77, 97, - 116, 0, 3, 0, 3, 0, - 4, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 102, 111, 103, 68, 97, 116, - 97, 0, 109, 97, 116, 67, - 111, 108, 0, 115, 117, 114, - 102, 80, 114, 111, 112, 115, - 0, 118, 115, 95, 50, 95, - 48, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, - 32, 57, 46, 50, 57, 46, - 57, 53, 50, 46, 51, 49, - 49, 49, 0, 171, 171, 171, - 81, 0, 0, 5, 4, 0, - 15, 160, 0, 0, 64, 64, - 0, 0, 0, 0, 0, 0, - 128, 63, 0, 0, 0, 0, - 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 15, 144, - 31, 0, 0, 2, 5, 0, - 0, 128, 1, 0, 15, 144, - 31, 0, 0, 2, 10, 0, - 0, 128, 2, 0, 15, 144, - 31, 0, 0, 2, 1, 0, - 0, 128, 3, 0, 15, 144, - 31, 0, 0, 2, 2, 0, - 0, 128, 4, 0, 15, 144, - 1, 0, 0, 2, 0, 0, - 7, 128, 15, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 7, 128, 0, 0, 228, 128, - 13, 0, 0, 160, 2, 0, - 228, 144, 1, 0, 0, 2, - 0, 0, 8, 128, 2, 0, - 255, 144, 11, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 4, 0, 85, 160, - 10, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 4, 0, 170, 160, 5, 0, - 0, 3, 0, 0, 15, 208, - 0, 0, 228, 128, 12, 0, - 228, 160, 5, 0, 0, 3, - 0, 0, 15, 128, 4, 0, - 228, 144, 4, 0, 0, 160, - 46, 0, 0, 2, 0, 0, - 1, 176, 0, 0, 85, 128, - 9, 0, 0, 4, 1, 0, - 1, 128, 0, 0, 228, 144, - 41, 32, 228, 160, 0, 0, - 0, 176, 9, 0, 0, 4, - 1, 0, 2, 128, 0, 0, - 228, 144, 42, 32, 228, 160, - 0, 0, 0, 176, 9, 0, - 0, 4, 1, 0, 4, 128, - 0, 0, 228, 144, 43, 32, - 228, 160, 0, 0, 0, 176, - 5, 0, 0, 3, 1, 0, - 7, 128, 1, 0, 228, 128, - 3, 0, 85, 144, 46, 0, - 0, 2, 0, 0, 1, 176, - 0, 0, 0, 128, 9, 0, - 0, 4, 2, 0, 1, 128, - 0, 0, 228, 144, 41, 32, - 228, 160, 0, 0, 0, 176, - 9, 0, 0, 4, 2, 0, - 2, 128, 0, 0, 228, 144, - 42, 32, 228, 160, 0, 0, - 0, 176, 9, 0, 0, 4, - 2, 0, 4, 128, 0, 0, - 228, 144, 43, 32, 228, 160, - 0, 0, 0, 176, 4, 0, - 0, 4, 1, 0, 7, 128, - 2, 0, 228, 128, 3, 0, - 0, 144, 1, 0, 228, 128, - 46, 0, 0, 2, 0, 0, - 3, 176, 0, 0, 238, 128, - 9, 0, 0, 4, 0, 0, - 1, 128, 0, 0, 228, 144, - 41, 32, 228, 160, 0, 0, - 0, 176, 9, 0, 0, 4, - 0, 0, 2, 128, 0, 0, - 228, 144, 42, 32, 228, 160, - 0, 0, 0, 176, 9, 0, - 0, 4, 0, 0, 4, 128, - 0, 0, 228, 144, 43, 32, - 228, 160, 0, 0, 0, 176, - 4, 0, 0, 4, 0, 0, - 7, 128, 0, 0, 228, 128, - 3, 0, 170, 144, 1, 0, - 228, 128, 9, 0, 0, 4, - 1, 0, 1, 128, 0, 0, - 228, 144, 41, 32, 228, 160, - 0, 0, 85, 176, 9, 0, - 0, 4, 1, 0, 2, 128, - 0, 0, 228, 144, 42, 32, - 228, 160, 0, 0, 85, 176, - 9, 0, 0, 4, 1, 0, - 4, 128, 0, 0, 228, 144, - 43, 32, 228, 160, 0, 0, - 85, 176, 4, 0, 0, 4, - 0, 0, 7, 128, 1, 0, - 228, 128, 3, 0, 255, 144, - 0, 0, 228, 128, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 85, 128, 1, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 15, 128, 0, 0, - 228, 160, 0, 0, 0, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 2, 0, 228, 160, 0, 0, - 170, 128, 1, 0, 228, 128, - 2, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 3, 0, 228, 160, 2, 0, - 0, 3, 1, 0, 1, 128, - 0, 0, 255, 128, 14, 0, - 85, 161, 1, 0, 0, 2, - 0, 0, 15, 192, 0, 0, - 228, 128, 5, 0, 0, 3, - 0, 0, 1, 128, 1, 0, - 0, 128, 14, 0, 170, 160, - 11, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 0, 128, - 14, 0, 255, 160, 10, 0, - 0, 3, 0, 0, 4, 224, - 0, 0, 0, 128, 4, 0, - 170, 160, 1, 0, 0, 2, - 0, 0, 3, 224, 1, 0, - 228, 144, 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/skin_amb_dir_VS.h b/vendor/librw/src/d3d/shaders/skin_amb_dir_VS.h deleted file mode 100644 index 7949749..0000000 --- a/vendor/librw/src/d3d/shaders/skin_amb_dir_VS.h +++ /dev/null @@ -1,503 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 -// -// fxc /nologo /T vs_2_0 /DDIRECTIONALS /Fh skin_amb_dir_VS.h skin_VS.hlsl -// -// -// Parameters: -// -// float4 ambientLight; -// float4x3 boneMatrices[64]; -// float4x4 combinedMat; -// int4 firstLight; -// float4 fogData; -// -// struct -// { -// float4 color; -// float4 position; -// float4 direction; -// -// } lights[8]; -// -// float4 matCol; -// float3x3 normalMat; -// int numDirLights; -// float4 surfProps; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// numDirLights i0 1 -// combinedMat c0 4 -// normalMat c8 3 -// matCol c12 1 -// surfProps c13 1 -// fogData c14 1 -// ambientLight c15 1 -// firstLight c16 1 -// lights c17 24 -// boneMatrices c41 192 -// - - vs_2_0 - def c4, 3, 0, 1, 0 - dcl_position v0 - dcl_normal v1 - dcl_texcoord v2 - dcl_color v3 - dcl_blendweight v4 - dcl_blendindices v5 - mul r0, v5, c4.x - mova a0.w, r0.x - dp3 r1.z, v1, c43[a0.w] - mova a0.w, r0.x - dp3 r1.x, v1, c41[a0.w] - mova a0.w, r0.x - dp3 r1.y, v1, c42[a0.w] - mova a0.w, r0.y - dp3 r2.z, v1, c43[a0.w] - mova a0.w, r0.y - dp3 r2.x, v1, c41[a0.w] - mova a0.w, r0.y - dp3 r2.y, v1, c42[a0.w] - mul r2.xyz, r2, v4.y - mad r1.xyz, r1, v4.x, r2 - mova a0.w, r0.z - dp3 r2.z, v1, c43[a0.w] - mova a0.w, r0.z - dp3 r2.x, v1, c41[a0.w] - mova a0.w, r0.z - dp3 r2.y, v1, c42[a0.w] - mad r1.xyz, r2, v4.z, r1 - mova a0.w, r0.w - dp3 r2.z, v1, c43[a0.w] - mova a0.w, r0.w - dp3 r2.x, v1, c41[a0.w] - mova a0.w, r0.w - dp3 r2.y, v1, c42[a0.w] - mad r1.xyz, r2, v4.w, r1 - mul r2.xyz, r1.y, c9 - mad r1.xyw, c8.xyzz, r1.x, r2.xyzz - mad r1.xyz, c10, r1.z, r1.xyww - mov r2.x, c13.x - mad r2.xyz, c15, r2.x, v3 - mov r3.xyz, r2 - mov r1.w, c4.y - rep i0 - add r2.w, r1.w, c16.x - mul r2.w, r2.w, c4.x - mova a0.w, r2.w - dp3 r4.x, r1, -c19[a0.w] - max r4.x, r4.x, c4.y - mova a0.w, r2.w - mul r4.xyz, r4.x, c17[a0.w] - mad r3.xyz, r4, c13.z, r3 - add r1.w, r1.w, c4.z - endrep - mov r3.w, v3.w - max r1, r3, c4.y - min r1, r1, c4.z - mul oD0, r1, c12 - mova a0.w, r0.y - dp4 r1.x, v0, c41[a0.w] - mova a0.w, r0.y - dp4 r1.y, v0, c42[a0.w] - mova a0.w, r0.y - dp4 r1.z, v0, c43[a0.w] - mul r1.xyz, r1, v4.y - mova a0.w, r0.x - dp4 r2.x, v0, c41[a0.w] - mova a0.w, r0.x - dp4 r2.y, v0, c42[a0.w] - mova a0.w, r0.x - dp4 r2.z, v0, c43[a0.w] - mad r1.xyz, r2, v4.x, r1 - mova a0.w, r0.z - dp4 r2.x, v0, c41[a0.w] - mova a0.w, r0.z - dp4 r2.y, v0, c42[a0.w] - mova a0.w, r0.z - dp4 r2.z, v0, c43[a0.w] - mad r0.xyz, r2, v4.z, r1 - mova a0.w, r0.w - dp4 r1.x, v0, c41[a0.w] - mova a0.w, r0.w - dp4 r1.y, v0, c42[a0.w] - mova a0.w, r0.w - dp4 r1.z, v0, c43[a0.w] - mad r0.xyz, r1, v4.w, r0 - mul r1, r0.y, c1 - mad r1, c0, r0.x, r1 - mad r0, c2, r0.z, r1 - add r0, r0, c3 - mov oPos, r0 - add r0.x, r0.w, -c14.y - mul r0.x, r0.x, c14.z - max r0.x, r0.x, c14.w - min oT0.z, r0.x, c4.z - mov oT0.xy, v2 - -// approximately 92 instruction slots used -#endif - -const BYTE g_vs20_main[] = -{ - 0, 2, 254, 255, 254, 255, - 147, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 21, 2, - 0, 0, 0, 2, 254, 255, - 10, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 14, 2, 0, 0, 228, 0, - 0, 0, 2, 0, 15, 0, - 1, 0, 62, 0, 244, 0, - 0, 0, 0, 0, 0, 0, - 4, 1, 0, 0, 2, 0, - 41, 0, 192, 0, 166, 0, - 20, 1, 0, 0, 0, 0, - 0, 0, 36, 1, 0, 0, - 2, 0, 0, 0, 4, 0, - 2, 0, 48, 1, 0, 0, - 0, 0, 0, 0, 64, 1, - 0, 0, 2, 0, 16, 0, - 1, 0, 66, 0, 76, 1, - 0, 0, 0, 0, 0, 0, - 92, 1, 0, 0, 2, 0, - 14, 0, 1, 0, 58, 0, - 244, 0, 0, 0, 0, 0, - 0, 0, 100, 1, 0, 0, - 2, 0, 17, 0, 24, 0, - 70, 0, 176, 1, 0, 0, - 0, 0, 0, 0, 192, 1, - 0, 0, 2, 0, 12, 0, - 1, 0, 50, 0, 244, 0, - 0, 0, 0, 0, 0, 0, - 199, 1, 0, 0, 2, 0, - 8, 0, 3, 0, 34, 0, - 212, 1, 0, 0, 0, 0, - 0, 0, 228, 1, 0, 0, - 1, 0, 0, 0, 1, 0, - 2, 0, 244, 1, 0, 0, - 0, 0, 0, 0, 4, 2, - 0, 0, 2, 0, 13, 0, - 1, 0, 54, 0, 244, 0, - 0, 0, 0, 0, 0, 0, - 97, 109, 98, 105, 101, 110, - 116, 76, 105, 103, 104, 116, - 0, 171, 171, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 98, 111, 110, 101, - 77, 97, 116, 114, 105, 99, - 101, 115, 0, 171, 171, 171, - 3, 0, 3, 0, 4, 0, - 3, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 99, 111, - 109, 98, 105, 110, 101, 100, - 77, 97, 116, 0, 3, 0, - 3, 0, 4, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 102, 105, 114, 115, - 116, 76, 105, 103, 104, 116, - 0, 171, 1, 0, 2, 0, - 1, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 102, 111, 103, 68, 97, 116, - 97, 0, 108, 105, 103, 104, - 116, 115, 0, 99, 111, 108, - 111, 114, 0, 171, 171, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 112, 111, - 115, 105, 116, 105, 111, 110, - 0, 100, 105, 114, 101, 99, - 116, 105, 111, 110, 0, 171, - 107, 1, 0, 0, 116, 1, - 0, 0, 132, 1, 0, 0, - 116, 1, 0, 0, 141, 1, - 0, 0, 116, 1, 0, 0, - 5, 0, 0, 0, 1, 0, - 12, 0, 8, 0, 3, 0, - 152, 1, 0, 0, 109, 97, - 116, 67, 111, 108, 0, 110, - 111, 114, 109, 97, 108, 77, - 97, 116, 0, 171, 171, 171, - 3, 0, 3, 0, 3, 0, - 3, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 110, 117, - 109, 68, 105, 114, 76, 105, - 103, 104, 116, 115, 0, 171, - 171, 171, 0, 0, 2, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 115, 117, 114, 102, 80, 114, - 111, 112, 115, 0, 118, 115, - 95, 50, 95, 48, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 57, 46, - 50, 57, 46, 57, 53, 50, - 46, 51, 49, 49, 49, 0, - 171, 171, 81, 0, 0, 5, - 4, 0, 15, 160, 0, 0, - 64, 64, 0, 0, 0, 0, - 0, 0, 128, 63, 0, 0, - 0, 0, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 15, 144, 31, 0, 0, 2, - 3, 0, 0, 128, 1, 0, - 15, 144, 31, 0, 0, 2, - 5, 0, 0, 128, 2, 0, - 15, 144, 31, 0, 0, 2, - 10, 0, 0, 128, 3, 0, - 15, 144, 31, 0, 0, 2, - 1, 0, 0, 128, 4, 0, - 15, 144, 31, 0, 0, 2, - 2, 0, 0, 128, 5, 0, - 15, 144, 5, 0, 0, 3, - 0, 0, 15, 128, 5, 0, - 228, 144, 4, 0, 0, 160, - 46, 0, 0, 2, 0, 0, - 8, 176, 0, 0, 0, 128, - 8, 0, 0, 4, 1, 0, - 4, 128, 1, 0, 228, 144, - 43, 32, 228, 160, 0, 0, - 255, 176, 46, 0, 0, 2, - 0, 0, 8, 176, 0, 0, - 0, 128, 8, 0, 0, 4, - 1, 0, 1, 128, 1, 0, - 228, 144, 41, 32, 228, 160, - 0, 0, 255, 176, 46, 0, - 0, 2, 0, 0, 8, 176, - 0, 0, 0, 128, 8, 0, - 0, 4, 1, 0, 2, 128, - 1, 0, 228, 144, 42, 32, - 228, 160, 0, 0, 255, 176, - 46, 0, 0, 2, 0, 0, - 8, 176, 0, 0, 85, 128, - 8, 0, 0, 4, 2, 0, - 4, 128, 1, 0, 228, 144, - 43, 32, 228, 160, 0, 0, - 255, 176, 46, 0, 0, 2, - 0, 0, 8, 176, 0, 0, - 85, 128, 8, 0, 0, 4, - 2, 0, 1, 128, 1, 0, - 228, 144, 41, 32, 228, 160, - 0, 0, 255, 176, 46, 0, - 0, 2, 0, 0, 8, 176, - 0, 0, 85, 128, 8, 0, - 0, 4, 2, 0, 2, 128, - 1, 0, 228, 144, 42, 32, - 228, 160, 0, 0, 255, 176, - 5, 0, 0, 3, 2, 0, - 7, 128, 2, 0, 228, 128, - 4, 0, 85, 144, 4, 0, - 0, 4, 1, 0, 7, 128, - 1, 0, 228, 128, 4, 0, - 0, 144, 2, 0, 228, 128, - 46, 0, 0, 2, 0, 0, - 8, 176, 0, 0, 170, 128, - 8, 0, 0, 4, 2, 0, - 4, 128, 1, 0, 228, 144, - 43, 32, 228, 160, 0, 0, - 255, 176, 46, 0, 0, 2, - 0, 0, 8, 176, 0, 0, - 170, 128, 8, 0, 0, 4, - 2, 0, 1, 128, 1, 0, - 228, 144, 41, 32, 228, 160, - 0, 0, 255, 176, 46, 0, - 0, 2, 0, 0, 8, 176, - 0, 0, 170, 128, 8, 0, - 0, 4, 2, 0, 2, 128, - 1, 0, 228, 144, 42, 32, - 228, 160, 0, 0, 255, 176, - 4, 0, 0, 4, 1, 0, - 7, 128, 2, 0, 228, 128, - 4, 0, 170, 144, 1, 0, - 228, 128, 46, 0, 0, 2, - 0, 0, 8, 176, 0, 0, - 255, 128, 8, 0, 0, 4, - 2, 0, 4, 128, 1, 0, - 228, 144, 43, 32, 228, 160, - 0, 0, 255, 176, 46, 0, - 0, 2, 0, 0, 8, 176, - 0, 0, 255, 128, 8, 0, - 0, 4, 2, 0, 1, 128, - 1, 0, 228, 144, 41, 32, - 228, 160, 0, 0, 255, 176, - 46, 0, 0, 2, 0, 0, - 8, 176, 0, 0, 255, 128, - 8, 0, 0, 4, 2, 0, - 2, 128, 1, 0, 228, 144, - 42, 32, 228, 160, 0, 0, - 255, 176, 4, 0, 0, 4, - 1, 0, 7, 128, 2, 0, - 228, 128, 4, 0, 255, 144, - 1, 0, 228, 128, 5, 0, - 0, 3, 2, 0, 7, 128, - 1, 0, 85, 128, 9, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 11, 128, 8, 0, - 164, 160, 1, 0, 0, 128, - 2, 0, 164, 128, 4, 0, - 0, 4, 1, 0, 7, 128, - 10, 0, 228, 160, 1, 0, - 170, 128, 1, 0, 244, 128, - 1, 0, 0, 2, 2, 0, - 1, 128, 13, 0, 0, 160, - 4, 0, 0, 4, 2, 0, - 7, 128, 15, 0, 228, 160, - 2, 0, 0, 128, 3, 0, - 228, 144, 1, 0, 0, 2, - 3, 0, 7, 128, 2, 0, - 228, 128, 1, 0, 0, 2, - 1, 0, 8, 128, 4, 0, - 85, 160, 38, 0, 0, 1, - 0, 0, 228, 240, 2, 0, - 0, 3, 2, 0, 8, 128, - 1, 0, 255, 128, 16, 0, - 0, 160, 5, 0, 0, 3, - 2, 0, 8, 128, 2, 0, - 255, 128, 4, 0, 0, 160, - 46, 0, 0, 2, 0, 0, - 8, 176, 2, 0, 255, 128, - 8, 0, 0, 4, 4, 0, - 1, 128, 1, 0, 228, 128, - 19, 32, 228, 161, 0, 0, - 255, 176, 11, 0, 0, 3, - 4, 0, 1, 128, 4, 0, - 0, 128, 4, 0, 85, 160, - 46, 0, 0, 2, 0, 0, - 8, 176, 2, 0, 255, 128, - 5, 0, 0, 4, 4, 0, - 7, 128, 4, 0, 0, 128, - 17, 32, 228, 160, 0, 0, - 255, 176, 4, 0, 0, 4, - 3, 0, 7, 128, 4, 0, - 228, 128, 13, 0, 170, 160, - 3, 0, 228, 128, 2, 0, - 0, 3, 1, 0, 8, 128, - 1, 0, 255, 128, 4, 0, - 170, 160, 39, 0, 0, 0, - 1, 0, 0, 2, 3, 0, - 8, 128, 3, 0, 255, 144, - 11, 0, 0, 3, 1, 0, - 15, 128, 3, 0, 228, 128, - 4, 0, 85, 160, 10, 0, - 0, 3, 1, 0, 15, 128, - 1, 0, 228, 128, 4, 0, - 170, 160, 5, 0, 0, 3, - 0, 0, 15, 208, 1, 0, - 228, 128, 12, 0, 228, 160, - 46, 0, 0, 2, 0, 0, - 8, 176, 0, 0, 85, 128, - 9, 0, 0, 4, 1, 0, - 1, 128, 0, 0, 228, 144, - 41, 32, 228, 160, 0, 0, - 255, 176, 46, 0, 0, 2, - 0, 0, 8, 176, 0, 0, - 85, 128, 9, 0, 0, 4, - 1, 0, 2, 128, 0, 0, - 228, 144, 42, 32, 228, 160, - 0, 0, 255, 176, 46, 0, - 0, 2, 0, 0, 8, 176, - 0, 0, 85, 128, 9, 0, - 0, 4, 1, 0, 4, 128, - 0, 0, 228, 144, 43, 32, - 228, 160, 0, 0, 255, 176, - 5, 0, 0, 3, 1, 0, - 7, 128, 1, 0, 228, 128, - 4, 0, 85, 144, 46, 0, - 0, 2, 0, 0, 8, 176, - 0, 0, 0, 128, 9, 0, - 0, 4, 2, 0, 1, 128, - 0, 0, 228, 144, 41, 32, - 228, 160, 0, 0, 255, 176, - 46, 0, 0, 2, 0, 0, - 8, 176, 0, 0, 0, 128, - 9, 0, 0, 4, 2, 0, - 2, 128, 0, 0, 228, 144, - 42, 32, 228, 160, 0, 0, - 255, 176, 46, 0, 0, 2, - 0, 0, 8, 176, 0, 0, - 0, 128, 9, 0, 0, 4, - 2, 0, 4, 128, 0, 0, - 228, 144, 43, 32, 228, 160, - 0, 0, 255, 176, 4, 0, - 0, 4, 1, 0, 7, 128, - 2, 0, 228, 128, 4, 0, - 0, 144, 1, 0, 228, 128, - 46, 0, 0, 2, 0, 0, - 8, 176, 0, 0, 170, 128, - 9, 0, 0, 4, 2, 0, - 1, 128, 0, 0, 228, 144, - 41, 32, 228, 160, 0, 0, - 255, 176, 46, 0, 0, 2, - 0, 0, 8, 176, 0, 0, - 170, 128, 9, 0, 0, 4, - 2, 0, 2, 128, 0, 0, - 228, 144, 42, 32, 228, 160, - 0, 0, 255, 176, 46, 0, - 0, 2, 0, 0, 8, 176, - 0, 0, 170, 128, 9, 0, - 0, 4, 2, 0, 4, 128, - 0, 0, 228, 144, 43, 32, - 228, 160, 0, 0, 255, 176, - 4, 0, 0, 4, 0, 0, - 7, 128, 2, 0, 228, 128, - 4, 0, 170, 144, 1, 0, - 228, 128, 46, 0, 0, 2, - 0, 0, 8, 176, 0, 0, - 255, 128, 9, 0, 0, 4, - 1, 0, 1, 128, 0, 0, - 228, 144, 41, 32, 228, 160, - 0, 0, 255, 176, 46, 0, - 0, 2, 0, 0, 8, 176, - 0, 0, 255, 128, 9, 0, - 0, 4, 1, 0, 2, 128, - 0, 0, 228, 144, 42, 32, - 228, 160, 0, 0, 255, 176, - 46, 0, 0, 2, 0, 0, - 8, 176, 0, 0, 255, 128, - 9, 0, 0, 4, 1, 0, - 4, 128, 0, 0, 228, 144, - 43, 32, 228, 160, 0, 0, - 255, 176, 4, 0, 0, 4, - 0, 0, 7, 128, 1, 0, - 228, 128, 4, 0, 255, 144, - 0, 0, 228, 128, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 85, 128, 1, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 15, 128, 0, 0, - 228, 160, 0, 0, 0, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 2, 0, 228, 160, 0, 0, - 170, 128, 1, 0, 228, 128, - 2, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 3, 0, 228, 160, 1, 0, - 0, 2, 0, 0, 15, 192, - 0, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 1, 128, - 0, 0, 255, 128, 14, 0, - 85, 161, 5, 0, 0, 3, - 0, 0, 1, 128, 0, 0, - 0, 128, 14, 0, 170, 160, - 11, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 0, 128, - 14, 0, 255, 160, 10, 0, - 0, 3, 0, 0, 4, 224, - 0, 0, 0, 128, 4, 0, - 170, 160, 1, 0, 0, 2, - 0, 0, 3, 224, 2, 0, - 228, 144, 255, 255, 0, 0 -}; diff --git a/vendor/librw/src/d3d/shaders/standardConstants.h b/vendor/librw/src/d3d/shaders/standardConstants.h deleted file mode 100644 index 088df7d..0000000 --- a/vendor/librw/src/d3d/shaders/standardConstants.h +++ /dev/null @@ -1,28 +0,0 @@ -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/vendor/librw/src/d3d/xbox.cpp b/vendor/librw/src/d3d/xbox.cpp deleted file mode 100644 index 62fab0c..0000000 --- a/vendor/librw/src/d3d/xbox.cpp +++ /dev/null @@ -1,1005 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#include "rwxbox.h" - -#include "rwxboximpl.h" - -#define PLUGIN_ID 2 - -namespace rw { -namespace xbox { - -static void* -driverOpen(void *o, int32, int32) -{ - engine->driver[PLATFORM_XBOX]->defaultPipeline = makeDefaultPipeline(); - - engine->driver[PLATFORM_XBOX]->rasterNativeOffset = nativeRasterOffset; - engine->driver[PLATFORM_XBOX]->rasterCreate = rasterCreate; - engine->driver[PLATFORM_XBOX]->rasterLock = rasterLock; - engine->driver[PLATFORM_XBOX]->rasterUnlock = rasterUnlock; - engine->driver[PLATFORM_XBOX]->rasterNumLevels = rasterNumLevels; - engine->driver[PLATFORM_XBOX]->rasterToImage = rasterToImage; - - return o; -} - -static void* -driverClose(void *o, int32, int32) -{ - return o; -} - -void -registerPlatformPlugins(void) -{ - Driver::registerPlugin(PLATFORM_XBOX, 0, PLATFORM_XBOX, - driverOpen, driverClose); - registerNativeRaster(); -} - -void* -destroyNativeData(void *object, int32, int32) -{ - Geometry *geometry = (Geometry*)object; - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_XBOX) - return object; - InstanceDataHeader *header = - (InstanceDataHeader*)geometry->instData; - geometry->instData = nil; - rwFree(header->vertexBuffer); - rwFree(header->begin); - rwFree(header->data); - rwFree(header); - return object; -} - -Stream* -readNativeData(Stream *stream, int32, void *object, int32, int32) -{ - ASSERTLITTLE; - Geometry *geometry = (Geometry*)object; - uint32 vers; - uint32 platform; - if(!findChunk(stream, ID_STRUCT, nil, &vers)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - platform = stream->readU32(); - if(platform != PLATFORM_XBOX){ - RWERROR((ERR_PLATFORM, platform)); - return nil; - } - if(vers < 0x35000){ - RWERROR((ERR_VERSION, vers)); - return nil; - } - InstanceDataHeader *header = rwNewT(InstanceDataHeader, 1, MEMDUR_EVENT | ID_GEOMETRY); - geometry->instData = header; - header->platform = PLATFORM_XBOX; - - int32 size = stream->readI32(); - // The 0x18 byte are the resentryheader. - // We don't have it but it's used for alignment. - header->data = rwNewT(uint8, size + 0x18, MEMDUR_EVENT | ID_GEOMETRY); - uint8 *p = header->data+0x18+4; - stream->read8(p, size-4); - - header->size = size; - header->serialNumber = *(uint16*)p; p += 2; - header->numMeshes = *(uint16*)p; p += 2; - header->primType = *(uint32*)p; p += 4; - header->numVertices = *(uint32*)p; p += 4; - header->stride = *(uint32*)p; p += 4; - // RxXboxVertexFormat in 3.3 here - p += 4; // skip vertexBuffer pointer - header->vertexAlpha = *(bool32*)p; p += 4; - p += 8; // skip begin, end pointers - - InstanceData *inst = rwNewT(InstanceData, header->numMeshes, MEMDUR_EVENT | ID_GEOMETRY); - header->begin = inst; - for(int i = 0; i < header->numMeshes; i++){ - inst->minVert = *(uint32*)p; p += 4; - inst->numVertices = *(int32*)p; p += 4; - inst->numIndices = *(int32*)p; p += 4; - inst->indexBuffer = header->data + *(uint32*)p; p += 4; - p += 8; // skip material and vertexShader - inst->vertexShader = 0; - // pixelShader in 3.3 here - inst++; - } - header->end = inst; - - header->vertexBuffer = rwNewT(uint8, header->stride*header->numVertices, MEMDUR_EVENT | ID_GEOMETRY); - stream->read8(header->vertexBuffer, header->stride*header->numVertices); - return stream; -} - -Stream* -writeNativeData(Stream *stream, int32 len, void *object, int32, int32) -{ - ASSERTLITTLE; - Geometry *geometry = (Geometry*)object; - writeChunkHeader(stream, ID_STRUCT, len-12); - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_XBOX) - return stream; - stream->writeU32(PLATFORM_XBOX); - assert(rw::version >= 0x35000 && "can't write native Xbox data < 0x35000"); - InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - - // we just fill header->data and write that - uint8 *p = header->data+0x18; - *(int32*)p = header->size; p += 4; - *(uint16*)p = header->serialNumber; p += 2; - *(uint16*)p = header->numMeshes; p += 2; - *(uint32*)p = header->primType; p += 4; - *(uint32*)p = header->numVertices; p += 4; - *(uint32*)p = header->stride; p += 4; - // RxXboxVertexFormat in 3.3 here - p += 4; // skip vertexBuffer pointer - *(bool32*)p = header->vertexAlpha; p += 4; - p += 8; // skip begin, end pointers - - InstanceData *inst = header->begin; - for(int i = 0; i < header->numMeshes; i++){ - *(uint32*)p = inst->minVert; p += 4; - *(int32*)p = inst->numVertices; p += 4; - *(int32*)p = inst->numIndices; p += 4; - *(uint32*)p = (uint8*)inst->indexBuffer - header->data; p += 4; - p += 8; // skip material and vertexShader - // pixelShader in 3.3 here - inst++; - } - - stream->write8(header->data+0x18, header->size); - stream->write8(header->vertexBuffer, header->stride*header->numVertices); - return stream; -} - -int32 -getSizeNativeData(void *object, int32, int32) -{ - Geometry *geometry = (Geometry*)object; - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_XBOX) - return 0; - InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - return 12 + 4 + header->size + header->stride*header->numVertices; -} - -void -registerNativeDataPlugin(void) -{ - Geometry::registerPlugin(0, ID_NATIVEDATA, - nil, destroyNativeData, nil); - Geometry::registerPluginStream(ID_NATIVEDATA, - readNativeData, - writeNativeData, - getSizeNativeData); -} - -enum { - D3DPT_TRIANGLELIST = 5, - D3DPT_TRIANGLESTRIP = 6 -}; - -static void -instance(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - // TODO: allow for REINSTANCE (or not, xbox can't render) - if(geo->instData) - return; - InstanceDataHeader *header = rwNewT(InstanceDataHeader, 1, MEMDUR_EVENT | ID_GEOMETRY); - MeshHeader *meshh = geo->meshHeader; - geo->instData = header; - header->platform = PLATFORM_XBOX; - - header->size = 0x24 + meshh->numMeshes*0x18 + 0x10; - Mesh *mesh = meshh->getMeshes(); - for(uint32 i = 0; i < meshh->numMeshes; i++) - header->size += (mesh++->numIndices*2 + 0xF) & ~0xF; - // The 0x18 byte are the resentryheader. - // We don't have it but it's used for alignment. - header->data = rwNewT(uint8, header->size + 0x18, MEMDUR_EVENT | ID_GEOMETRY); - header->serialNumber = meshh->serialNum; - header->numMeshes = meshh->numMeshes; - header->primType = meshh->flags == MeshHeader::TRISTRIP ? - D3DPT_TRIANGLESTRIP : D3DPT_TRIANGLELIST; - header->numVertices = geo->numVertices; - header->vertexAlpha = 0; - // set by the instanceCB - header->stride = 0; - header->vertexBuffer = nil; - - InstanceData *inst = rwNewT(InstanceData, header->numMeshes, MEMDUR_EVENT | ID_GEOMETRY); - header->begin = inst; - mesh = meshh->getMeshes(); - uint8 *indexbuf = (uint8*)header->data + ((0x18 + 0x24 + header->numMeshes*0x18 + 0xF)&~0xF); - for(uint32 i = 0; i < header->numMeshes; i++){ - findMinVertAndNumVertices(mesh->indices, mesh->numIndices, - &inst->minVert, &inst->numVertices); - inst->numIndices = mesh->numIndices; - inst->indexBuffer = indexbuf; - memcpy(inst->indexBuffer, mesh->indices, inst->numIndices*sizeof(uint16)); - indexbuf += (inst->numIndices*2 + 0xF) & ~0xF; - inst->material = mesh->material; - inst->vertexShader = 0; // TODO? - mesh++; - inst++; - } - header->end = inst; - - pipe->instanceCB(geo, header); -} - -static void -uninstance(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - if((geo->flags & Geometry::NATIVE) == 0) - return; - assert(geo->instData != nil); - assert(geo->instData->platform == PLATFORM_XBOX); - - InstanceDataHeader *header = (InstanceDataHeader*)geo->instData; - InstanceData *inst = header->begin; - Mesh *mesh = geo->meshHeader->getMeshes(); - // For some reason numIndices in mesh and instance data are not always equal - // And primitive isn't always correct either. Maybe some internal conversion... - geo->meshHeader->totalIndices = 0; - for(uint32 i = 0; i < header->numMeshes; i++){ - mesh[i].numIndices = inst[i].numIndices; - geo->meshHeader->totalIndices += mesh[i].numIndices; - } - geo->meshHeader->flags = header->primType == D3DPT_TRIANGLESTRIP ? - MeshHeader::TRISTRIP : 0; - - geo->numTriangles = geo->meshHeader->guessNumTriangles(); - geo->allocateData(); - geo->allocateMeshes(geo->meshHeader->numMeshes, geo->meshHeader->totalIndices, 0); - - mesh = geo->meshHeader->getMeshes(); - for(uint32 i = 0; i < header->numMeshes; i++){ - uint16 *indices = (uint16*)inst->indexBuffer; - memcpy(mesh->indices, indices, inst->numIndices*2); - mesh++; - inst++; - } - - pipe->uninstanceCB(geo, header); - geo->generateTriangles(); - geo->flags &= ~Geometry::NATIVE; - destroyNativeData(geo, 0, 0); -} - -void -ObjPipeline::init(void) -{ - this->rw::ObjPipeline::init(PLATFORM_XBOX); - this->impl.instance = xbox::instance; - this->impl.uninstance = xbox::uninstance; - this->instanceCB = nil; - this->uninstanceCB = nil; -} - -ObjPipeline* -ObjPipeline::create(void) -{ - ObjPipeline *pipe = rwNewT(ObjPipeline, 1, MEMDUR_GLOBAL); - pipe->init(); - return pipe; -} - -int v3dFormatMap[] = { - -1, VERT_BYTE3, VERT_SHORT3, VERT_NORMSHORT3, VERT_COMPNORM, VERT_FLOAT3 -}; - -int v2dFormatMap[] = { - -1, VERT_BYTE2, VERT_SHORT2, VERT_NORMSHORT2, VERT_COMPNORM, VERT_FLOAT2 -}; - -void -defaultInstanceCB(Geometry *geo, InstanceDataHeader *header) -{ - uint32 *vertexFmt = getVertexFmt(geo); - if(*vertexFmt == 0) - *vertexFmt = makeVertexFmt(geo->flags, geo->numTexCoordSets); - header->stride = getVertexFmtStride(*vertexFmt); - header->vertexBuffer = rwNewT(uint8, header->stride*header->numVertices, MEMDUR_EVENT | ID_GEOMETRY); - uint8 *dst = (uint8*)header->vertexBuffer; - - uint32 fmt = *vertexFmt; - uint32 sel = fmt & 0xF; - instV3d(v3dFormatMap[sel], dst, geo->morphTargets[0].vertices, - header->numVertices, header->stride); - dst += sel == 4 ? 4 : 3*vertexFormatSizes[sel]; - - sel = (fmt >> 4) & 0xF; - if(sel){ - instV3d(v3dFormatMap[sel], dst, geo->morphTargets[0].normals, - header->numVertices, header->stride); - dst += sel == 4 ? 4 : 3*vertexFormatSizes[sel]; - } - - if(fmt & 0x1000000){ - header->vertexAlpha = instColor(VERT_ARGB, dst, geo->colors, - header->numVertices, header->stride); - dst += 4; - } - - for(int i = 0; i < 4; i++){ - sel = (fmt >> (i*4 + 8)) & 0xF; - if(sel == 0) - break; - instTexCoords(v2dFormatMap[sel], dst, geo->texCoords[i], - header->numVertices, header->stride); - dst += sel == 4 ? 4 : 2*vertexFormatSizes[sel]; - } - - if(fmt & 0xE000000) - assert(0 && "can't instance tangents or whatever it is"); -} - -void -defaultUninstanceCB(Geometry *geo, InstanceDataHeader *header) -{ - uint32 *vertexFmt = getVertexFmt(geo); - uint32 fmt = *vertexFmt; - assert(fmt != 0); - uint8 *src = (uint8*)header->vertexBuffer; - - uint32 sel = fmt & 0xF; - uninstV3d(v3dFormatMap[sel], geo->morphTargets[0].vertices, src, - header->numVertices, header->stride); - src += sel == 4 ? 4 : 3*vertexFormatSizes[sel]; - - sel = (fmt >> 4) & 0xF; - if(sel){ - uninstV3d(v3dFormatMap[sel], geo->morphTargets[0].normals, src, - header->numVertices, header->stride); - src += sel == 4 ? 4 : 3*vertexFormatSizes[sel]; - } - - if(fmt & 0x1000000){ - uninstColor(VERT_ARGB, geo->colors, src, - header->numVertices, header->stride); - src += 4; - } - - for(int i = 0; i < 4; i++){ - sel = (fmt >> (i*4 + 8)) & 0xF; - if(sel == 0) - break; - uninstTexCoords(v2dFormatMap[sel], geo->texCoords[i], src, - header->numVertices, header->stride); - src += sel == 4 ? 4 : 2*vertexFormatSizes[sel]; - } -} - -ObjPipeline* -makeDefaultPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->instanceCB = defaultInstanceCB; - pipe->uninstanceCB = defaultUninstanceCB; - return pipe; -} - -// Native Texture and Raster - -int32 nativeRasterOffset; - -static uint32 -calculateTextureSize(uint32 width, uint32 height, uint32 depth, uint32 format) -{ -#define D3DFMT_W11V11U10 65 - switch(format){ - default: - case D3DFMT_UNKNOWN: - return 0; - case D3DFMT_A8: - case D3DFMT_P8: - case D3DFMT_L8: - case D3DFMT_AL8: - case D3DFMT_LIN_A8: - case D3DFMT_LIN_AL8: - case D3DFMT_LIN_L8: - return width * height * depth; - case D3DFMT_R5G6B5: - case D3DFMT_R6G5B5: - case D3DFMT_X1R5G5B5: - case D3DFMT_A1R5G5B5: - case D3DFMT_A4R4G4B4: - case D3DFMT_R4G4B4A4: - case D3DFMT_R5G5B5A1: - case D3DFMT_R8B8: - case D3DFMT_G8B8: - case D3DFMT_A8L8: - case D3DFMT_L16: - //case D3DFMT_V8U8: - //case D3DFMT_L6V5U5: - case D3DFMT_D16_LOCKABLE: - //case D3DFMT_D16: - case D3DFMT_F16: - case D3DFMT_YUY2: - case D3DFMT_UYVY: - case D3DFMT_LIN_A1R5G5B5: - case D3DFMT_LIN_A4R4G4B4: - case D3DFMT_LIN_G8B8: - case D3DFMT_LIN_R4G4B4A4: - case D3DFMT_LIN_R5G5B5A1: - case D3DFMT_LIN_R5G6B5: - case D3DFMT_LIN_R6G5B5: - case D3DFMT_LIN_R8B8: - case D3DFMT_LIN_X1R5G5B5: - case D3DFMT_LIN_A8L8: - case D3DFMT_LIN_L16: - //case D3DFMT_LIN_V8U8: - //case D3DFMT_LIN_L6V5U5: - case D3DFMT_LIN_D16: - case D3DFMT_LIN_F16: - return width * 2 * height * depth; - case D3DFMT_A8R8G8B8: - case D3DFMT_X8R8G8B8: - case D3DFMT_A8B8G8R8: - case D3DFMT_B8G8R8A8: - case D3DFMT_R8G8B8A8: - //case D3DFMT_X8L8V8U8: - //case D3DFMT_Q8W8V8U8: - case D3DFMT_V16U16: - case D3DFMT_D24S8: - case D3DFMT_F24S8: - case D3DFMT_LIN_A8B8G8R8: - case D3DFMT_LIN_A8R8G8B8: - case D3DFMT_LIN_B8G8R8A8: - case D3DFMT_LIN_R8G8B8A8: - case D3DFMT_LIN_X8R8G8B8: - case D3DFMT_LIN_V16U16: - //case D3DFMT_LIN_X8L8V8U8: - //case D3DFMT_LIN_Q8W8V8U8: - case D3DFMT_LIN_D24S8: - case D3DFMT_LIN_F24S8: - return width * 4 * height * depth; - case D3DFMT_DXT1: - assert(depth <= 1); - return ((width + 3) >> 2) * ((height + 3) >> 2) * 8; - //case D3DFMT_DXT2: - case D3DFMT_DXT3: - //case D3DFMT_DXT4: - case D3DFMT_DXT5: - assert(depth <= 1); - return ((width + 3) >> 2) * ((height + 3) >> 2) * 16; - } -} - -static void* -createTexture(int32 width, int32 height, int32 numlevels, uint32 format) -{ - int32 w = width; - int32 h = height; - int32 size = 0; - for(int32 i = 0; i < numlevels; i++){ - size += calculateTextureSize(w, h, 1, format); - w /= 2; - if(w == 0) w = 1; - h /= 2; - if(h == 0) h = 1; - } - size = (size+3)&~3; - uint8 *data = (uint8*)rwNew(sizeof(RasterLevels)+sizeof(RasterLevels::Level)*(numlevels-1)+size, - MEMDUR_EVENT | ID_DRIVER); - RasterLevels *levels = (RasterLevels*)data; - data += sizeof(RasterLevels)+sizeof(RasterLevels::Level)*(numlevels-1); - levels->numlevels = numlevels; - levels->format = format; - w = width; - h = height; - for(int32 i = 0; i < numlevels; i++){ - levels->levels[i].width = w; - levels->levels[i].height = h; - levels->levels[i].data = data; - levels->levels[i].size = calculateTextureSize(w, h, 1, format); - data += levels->levels[i].size; - w /= 2; - if(w == 0) w = 1; - h /= 2; - if(h == 0) h = 1; - } - return levels; -} - -struct RasterFormatInfo -{ - uint32 d3dformat; - int32 depth; - bool32 hasAlpha; - uint32 rwFormat; -}; - -// indexed directly by RW format -static RasterFormatInfo formatInfoRW[16] = { - { 0, 0, 0, 0}, - { D3DFMT_A1R5G5B5, 16, 1, Raster::C1555 }, - { D3DFMT_R5G6B5, 16, 0, Raster::C565 }, - { D3DFMT_A4R4G4B4, 16, 1, Raster::C4444 }, - { D3DFMT_L8, 8, 0, Raster::LUM8 }, - { D3DFMT_A8R8G8B8, 32, 1, Raster::C8888 }, - { D3DFMT_X8R8G8B8, 32, 0, Raster::C888 }, - { D3DFMT_UNKNOWN, 16, 0, Raster::D16 }, - { D3DFMT_UNKNOWN, 32, 0, Raster::D24 }, - { D3DFMT_UNKNOWN, 32, 0, Raster::D32 }, - { D3DFMT_X1R5G5B5, 16, 0, Raster::C555 } -}; - -static void -rasterSetFormat(Raster *raster) -{ - assert(raster->format != 0); // no default yet - - XboxRaster *natras = GETXBOXRASTEREXT(raster); - if(raster->format & (Raster::PAL4 | Raster::PAL8)){ - natras->format = D3DFMT_P8; - raster->depth = 8; - }else{ - natras->format = formatInfoRW[(raster->format >> 8) & 0xF].d3dformat; - raster->depth = formatInfoRW[(raster->format >> 8) & 0xF].depth; - } - natras->bpp = raster->depth/8; - natras->hasAlpha = formatInfoRW[(raster->format >> 8) & 0xF].hasAlpha; - raster->stride = raster->width&natras->bpp; -} - -static Raster* -rasterCreateTexture(Raster *raster) -{ - XboxRaster *natras = GETXBOXRASTEREXT(raster); - int32 levels; - - if(natras->format == D3DFMT_P8) - natras->palette = (uint8*)rwNew(4*256, MEMDUR_EVENT | ID_DRIVER); - levels = Raster::calculateNumLevels(raster->width, raster->height); - assert(natras->texture == nil); - natras->texture = createTexture(raster->width, raster->height, - raster->format & Raster::MIPMAP ? levels : 1, - natras->format); - if(natras->texture == nil){ - RWERROR((ERR_NOTEXTURE)); - return nil; - } - return raster; -} - -Raster* -rasterCreate(Raster *raster) -{ - rasterSetFormat(raster); - - Raster *ret = raster; - - // Dummy to use as subraster - if(raster->width == 0 || raster->height == 0){ - raster->flags |= Raster::DONTALLOCATE; - raster->stride = 0; - goto ret; - } - if(raster->flags & Raster::DONTALLOCATE) - goto ret; - - switch(raster->type){ - case Raster::NORMAL: - case Raster::TEXTURE: - ret = rasterCreateTexture(raster); - break; - default: - RWERROR((ERR_INVRASTER)); - return nil; - } - -ret: - raster->originalWidth = raster->width; - raster->originalHeight = raster->height; - raster->originalStride = raster->stride; - raster->originalPixels = raster->pixels; - return ret; -} - -uint8* -rasterLock(Raster *raster, int32 level, int32 lockMode) -{ - XboxRaster *natras = GETXBOXRASTEREXT(raster); - - // check if already locked - if(raster->privateFlags & (Raster::PRIVATELOCK_READ|Raster::PRIVATELOCK_WRITE)) - return nil; - - RasterLevels *levels = (RasterLevels*)natras->texture; - raster->pixels = levels->levels[level].data; - raster->width = levels->levels[level].width; - raster->height = levels->levels[level].height; - raster->stride = raster->width*natras->bpp; - - if(lockMode & Raster::LOCKREAD) raster->privateFlags |= Raster::PRIVATELOCK_READ; - if(lockMode & Raster::LOCKWRITE) raster->privateFlags |= Raster::PRIVATELOCK_WRITE; - - return raster->pixels; -} - -void -rasterUnlock(Raster *raster, int32 level) -{ - raster->width = raster->originalWidth; - raster->height = raster->originalHeight; - raster->stride = raster->originalStride; - raster->pixels = raster->originalPixels; - - raster->privateFlags &= ~(Raster::PRIVATELOCK_READ|Raster::PRIVATELOCK_WRITE); -} - -int32 -rasterNumLevels(Raster *raster) -{ - XboxRaster *natras = GETXBOXRASTEREXT(raster); - RasterLevels *levels = (RasterLevels*)natras->texture; - return levels->numlevels; -} - -static void -unswizzle(uint8 *dst, uint8 *src, int32 w, int32 h, int32 bpp) -{ - uint32 maskU = 0; - uint32 maskV = 0; - int32 i = 1; - int32 j = 1; - int32 c; - do{ - c = 0; - if(i < w){ - maskU |= j; - j <<= 1; - c = j; - } - if(i < h){ - maskV |= j; - j <<= 1; - c = j; - } - i <<= 1; - }while(c); - int32 x, y, u, v; - v = 0; - for(y = 0; y < h; y++){ - u = 0; - for(x = 0; x < w; x++){ - memcpy(&dst[(y*w + x)*bpp], &src[(u|v)*bpp], bpp); - u = (u - maskU) & maskU; - } - v = (v - maskV) & maskV; - } -} - -Image* -rasterToImage(Raster *raster) -{ - int32 depth; - Image *image; - - bool unlock = false; - if(raster->pixels == nil){ - raster->lock(0, Raster::LOCKREAD); - unlock = true; - } - - XboxRaster *natras = GETXBOXRASTEREXT(raster); - if(natras->customFormat){ - int w = raster->width; - int h = raster->height; - // pixels are in the upper right corner - if(w < 4) w = 4; - if(h < 4) h = 4; - image = Image::create(w, h, 32); - image->allocate(); - uint8 *pix = raster->pixels; - switch(natras->format){ - case D3DFMT_DXT1: - image->setPixelsDXT(1, pix); - // TODO: is this correct? - if(!natras->hasAlpha) - image->removeMask(); - break; - case D3DFMT_DXT3: - image->setPixelsDXT(3, pix); - break; - case D3DFMT_DXT5: - image->setPixelsDXT(5, pix); - break; - default: - assert(0 && "unknown format"); - image->destroy(); - if(unlock) - raster->unlock(0); - return nil; - } - // fix it up again - image->width = raster->width; - image->height = raster->height; - - if(unlock) - raster->unlock(0); - return image; - } - - switch(raster->format & 0xF00){ - case Raster::C1555: - depth = 16; - break; - case Raster::C8888: - depth = 32; - break; - case Raster::C888: - depth = 24; - break; - case Raster::C555: - depth = 16; - break; - - default: - case Raster::C565: - case Raster::C4444: - case Raster::LUM8: - assert(0 && "unsupported raster format"); - } - int32 pallength = 0; - if((raster->format & Raster::PAL4) == Raster::PAL4){ - depth = 4; - pallength = 16; - }else if((raster->format & Raster::PAL8) == Raster::PAL8){ - depth = 8; - pallength = 256; - } - - image = Image::create(raster->width, raster->height, depth); - image->allocate(); - - if(pallength){ - uint8 *out = image->palette; - uint8 *in = (uint8*)natras->palette; - // bytes are BGRA unlike regular d3d! - for(int32 i = 0; i < pallength; i++){ - conv_BGRA8888_from_RGBA8888(out, in); - in += 4; - out += 4; - } - } - - uint8 *imgpixels = image->pixels; - uint8 *pixels = raster->pixels; - - // NB: - assert(image->bpp == (int)natras->bpp); - assert(image->stride == raster->stride); - unswizzle(imgpixels, pixels, image->width, image->height, image->bpp); - // Fix RGB order - uint8 tmp; - if(depth > 8) - for(int32 y = 0; y < image->height; y++){ - uint8 *imgrow = imgpixels; - // uint8 *rasrow = pixels; - for(int32 x = 0; x < image->width; x++){ - switch(raster->format & 0xF00){ - case Raster::C8888: - case Raster::C888: - tmp = imgrow[0]; - imgrow[0] = imgrow[2]; - imgrow[2] = tmp; - imgrow += image->bpp; - break; - } - } - imgpixels += image->stride; - // pixels += raster->stride; - } - image->compressPalette(); - - if(unlock) - raster->unlock(0); - - return image; -} - -int32 -getLevelSize(Raster *raster, int32 level) -{ - XboxRaster *ras = GETXBOXRASTEREXT(raster); - RasterLevels *levels = (RasterLevels*)ras->texture; - return levels->levels[level].size; -} - -static void* -createNativeRaster(void *object, int32 offset, int32) -{ - XboxRaster *raster = PLUGINOFFSET(XboxRaster, object, offset); - raster->texture = nil; - raster->palette = nil; - raster->format = 0; - raster->hasAlpha = 0; - raster->customFormat = 0; - raster->unknownFlag = 0; - return object; -} - -static void* -destroyNativeRaster(void *object, int32, int32) -{ - // TODO: - return object; -} - -static void* -copyNativeRaster(void *dst, void *, int32 offset, int32) -{ - XboxRaster *raster = PLUGINOFFSET(XboxRaster, dst, offset); - raster->texture = nil; - raster->palette = nil; - raster->format = 0; - raster->hasAlpha = 0; - raster->unknownFlag = 0; - return dst; -} - -void -registerNativeRaster(void) -{ - nativeRasterOffset = Raster::registerPlugin(sizeof(XboxRaster), - ID_RASTERXBOX, - createNativeRaster, - destroyNativeRaster, - copyNativeRaster); -} - -Texture* -readNativeTexture(Stream *stream) -{ - uint32 vers, platform; - if(!findChunk(stream, ID_STRUCT, nil, &vers)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - platform = stream->readU32(); - if(platform != PLATFORM_XBOX){ - RWERROR((ERR_PLATFORM, platform)); - return nil; - } - if(vers < 0x34001){ - RWERROR((ERR_VERSION, vers)); - return nil; - } - Texture *tex = Texture::create(nil); - if(tex == nil) - return nil; - - - // Texture - tex->filterAddressing = stream->readU32(); - stream->read8(tex->name, 32); - stream->read8(tex->mask, 32); - -//if(strcmp(tex->name, "bluallu") == 0) -//__debugbreak(); - - // Raster - int32 format = stream->readI32(); - bool32 hasAlpha = stream->readI16(); - bool32 unknownFlag = stream->readI16(); - int32 width = stream->readU16(); - int32 height = stream->readU16(); - int32 depth = stream->readU8(); - int32 numLevels = stream->readU8(); - int32 type = stream->readU8(); - int32 compression = stream->readU8(); - int32 totalSize = stream->readI32(); - - // isn't this the cube map flag? - assert(unknownFlag == 0); - Raster *raster; - if(compression){ - raster = Raster::create(width, height, depth, format | type | Raster::DONTALLOCATE, PLATFORM_XBOX); - XboxRaster *ras = GETXBOXRASTEREXT(raster); - ras->format = compression; - ras->hasAlpha = hasAlpha; - ras->texture = createTexture(raster->width, raster->height, - raster->format & Raster::MIPMAP ? numLevels : 1, - ras->format); - ras->customFormat = 1; - raster->flags &= ~Raster::DONTALLOCATE; - }else - raster = Raster::create(width, height, depth, format | type, PLATFORM_XBOX); - XboxRaster *ras = GETXBOXRASTEREXT(raster); - tex->raster = raster; - - if(raster->format & Raster::PAL4) - stream->read8(ras->palette, 4*32); - else if(raster->format & Raster::PAL8) - stream->read8(ras->palette, 4*256); - - // exploit the fact that mipmaps are allocated consecutively - uint8 *data = raster->lock(0, Raster::LOCKWRITE|Raster::LOCKNOFETCH); - stream->read8(data, totalSize); - raster->unlock(0); - - return tex; -} - -void -writeNativeTexture(Texture *tex, Stream *stream) -{ - int32 chunksize = getSizeNativeTexture(tex); - writeChunkHeader(stream, ID_STRUCT, chunksize-12); - stream->writeU32(PLATFORM_XBOX); - - // Texture - stream->writeU32(tex->filterAddressing); - stream->write8(tex->name, 32); - stream->write8(tex->mask, 32); - - // Raster - Raster *raster = tex->raster; - XboxRaster *ras = GETXBOXRASTEREXT(raster); - int32 numLevels = raster->getNumLevels(); - stream->writeI32(raster->format); - stream->writeI16(ras->hasAlpha); - stream->writeI16(ras->unknownFlag); - stream->writeU16(raster->width); - stream->writeU16(raster->height); - stream->writeU8(raster->depth); - stream->writeU8(numLevels); - stream->writeU8(raster->type); - stream->writeU8(ras->format); - - int32 totalSize = 0; - for(int32 i = 0; i < numLevels; i++) - totalSize += getLevelSize(tex->raster, i); - totalSize = (totalSize+3)&~3; - stream->writeI32(totalSize); - - if(raster->format & Raster::PAL4) - stream->write8(ras->palette, 4*32); - else if(raster->format & Raster::PAL8) - stream->write8(ras->palette, 4*256); - - // exploit the fact that mipmaps are allocated consecutively - uint8 *data = raster->lock(0, Raster::LOCKREAD); - stream->write8(data, totalSize); - raster->unlock(0); -} - -uint32 -getSizeNativeTexture(Texture *tex) -{ - uint32 size = 12 + 72 + 16 + 4; - int32 levels = tex->raster->getNumLevels(); - for(int32 i = 0; i < levels; i++) - size += getLevelSize(tex->raster, i); - size = (size+3)&~3; - if(tex->raster->format & Raster::PAL4) - size += 4*32; - else if(tex->raster->format & Raster::PAL8) - size += 4*256; - return size; -} - -} -} diff --git a/vendor/librw/src/d3d/xboxmatfx.cpp b/vendor/librw/src/d3d/xboxmatfx.cpp deleted file mode 100644 index a6b8718..0000000 --- a/vendor/librw/src/d3d/xboxmatfx.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwanim.h" -#include "../rwengine.h" -#include "../rwplugins.h" -#include "rwxbox.h" - -namespace rw { -namespace xbox { - -static void* -matfxOpen(void *o, int32, int32) -{ - matFXGlobals.pipelines[PLATFORM_XBOX] = makeMatFXPipeline(); - return o; -} - -static void* -matfxClose(void *o, int32, int32) -{ - ((ObjPipeline*)matFXGlobals.pipelines[PLATFORM_XBOX])->destroy(); - matFXGlobals.pipelines[PLATFORM_XBOX] = nil; - return o; -} - -void -initMatFX(void) -{ - Driver::registerPlugin(PLATFORM_XBOX, 0, ID_MATFX, - matfxOpen, matfxClose); -} - -ObjPipeline* -makeMatFXPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->instanceCB = defaultInstanceCB; - pipe->uninstanceCB = defaultUninstanceCB; - pipe->pluginID = ID_MATFX; - pipe->pluginData = 0; - return pipe; -} - -} -} diff --git a/vendor/librw/src/d3d/xboxskin.cpp b/vendor/librw/src/d3d/xboxskin.cpp deleted file mode 100644 index 0ce5cba..0000000 --- a/vendor/librw/src/d3d/xboxskin.cpp +++ /dev/null @@ -1,252 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwanim.h" -#include "../rwengine.h" -#include "../rwplugins.h" -#include "rwxbox.h" - -#define PLUGIN_ID ID_SKIN - -namespace rw { -namespace xbox { - -struct NativeSkin -{ - int32 table1[256]; // maps indices to bones - int32 table2[256]; // maps bones to indices - int32 numUsedBones; - void *vertexBuffer; - int32 stride; -}; - -Stream* -readNativeSkin(Stream *stream, int32, void *object, int32 offset) -{ - ASSERTLITTLE; - Geometry *geometry = (Geometry*)object; - uint32 vers, platform; - if(!findChunk(stream, ID_STRUCT, nil, &vers)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - platform = stream->readU32(); - if(platform != PLATFORM_XBOX){ - RWERROR((ERR_PLATFORM, platform)); - return nil; - } - if(vers < 0x35000){ - RWERROR((ERR_VERSION, vers)); - return nil; - } - - Skin *skin = rwNewT(Skin, 1, MEMDUR_EVENT | ID_SKIN); - *PLUGINOFFSET(Skin*, geometry, offset) = skin; - - int32 numBones = stream->readI32(); - skin->init(numBones, 0, 0); - NativeSkin *natskin = rwNewT(NativeSkin, 1, MEMDUR_EVENT | ID_SKIN); - skin->platformData = natskin; - stream->read32(natskin->table1, 256*sizeof(int32)); - stream->read32(natskin->table2, 256*sizeof(int32)); - natskin->numUsedBones = stream->readI32(); - skin->numWeights = stream->readI32(); - stream->seek(4); // skip pointer to vertexBuffer - natskin->stride = stream->readI32(); - int32 size = geometry->numVertices*natskin->stride; - natskin->vertexBuffer = rwNewT(uint8, size, MEMDUR_EVENT | ID_SKIN); - stream->read8(natskin->vertexBuffer, size); - stream->read32(skin->inverseMatrices, skin->numBones*64); - - readSkinSplitData(stream, skin); - return stream; -} - -Stream* -writeNativeSkin(Stream *stream, int32 len, void *object, int32 offset) -{ - ASSERTLITTLE; - Geometry *geometry = (Geometry*)object; - Skin *skin = *PLUGINOFFSET(Skin*, object, offset); - assert(skin->platformData); - assert(rw::version >= 0x35000 && "can't handle native xbox skin < 0x35000"); - NativeSkin *natskin = (NativeSkin*)skin->platformData; - - writeChunkHeader(stream, ID_STRUCT, len-12); - stream->writeU32(PLATFORM_XBOX); - stream->writeI32(skin->numBones); - stream->write32(natskin->table1, 256*sizeof(int32)); - stream->write32(natskin->table2, 256*sizeof(int32)); - stream->writeI32(natskin->numUsedBones); - stream->writeI32(skin->numWeights); - stream->writeU32(0xBADEAFFE); // pointer to vertexBuffer - stream->writeI32(natskin->stride); - stream->write8(natskin->vertexBuffer, - geometry->numVertices*natskin->stride); - stream->write32(skin->inverseMatrices, skin->numBones*64); - - writeSkinSplitData(stream, skin); - return stream; -} - -int32 -getSizeNativeSkin(void *object, int32 offset) -{ - Geometry *geometry = (Geometry*)object; - Skin *skin = *PLUGINOFFSET(Skin*, object, offset); - if(skin == nil) - return -1; - if(skin->platformData == nil) - return -1; - NativeSkin *natskin = (NativeSkin*)skin->platformData; - return 12 + 8 + 2*256*4 + 4*4 + - natskin->stride*geometry->numVertices + skin->numBones*64 + - skinSplitDataSize(skin); -} - -void -skinInstanceCB(Geometry *geo, InstanceDataHeader *header) -{ - defaultInstanceCB(geo, header); - - Skin *skin = Skin::get(geo); - if(skin == nil) - return; - NativeSkin *natskin = rwNewT(NativeSkin, 1, MEMDUR_EVENT | ID_SKIN); - skin->platformData = natskin; - - natskin->numUsedBones = skin->numUsedBones; - memset(natskin->table1, 0xFF, sizeof(natskin->table1)); - memset(natskin->table2, 0x00, sizeof(natskin->table2)); - for(int32 i = 0; i < skin->numUsedBones; i++){ - natskin->table1[i] = skin->usedBones[i]; - natskin->table2[skin->usedBones[i]] = i; - } - - natskin->stride = 3*skin->numWeights; - uint8 *vbuf = rwNewT(uint8, header->numVertices*natskin->stride, MEMDUR_EVENT | ID_SKIN); - natskin->vertexBuffer = vbuf; - - int32 w[4]; - int sum; - float32 *weights = skin->weights; - uint8 *p = vbuf; - int32 numVertices = header->numVertices; - while(numVertices--){ - sum = 0; - for(int i = 1; i < skin->numWeights; i++){ - w[i] = (int32)(weights[i]*255.0f + 0.5f); - sum += w[i]; - } - w[0] = 255 - sum; - for(int i = 0; i < skin->numWeights; i++) - p[i] = w[i]; - p += natskin->stride; - weights += 4; - } - - numVertices = header->numVertices; - p = vbuf + skin->numWeights; - uint8 *indices = skin->indices; - uint16 *idx; - while(numVertices--){ - idx = (uint16*)p; - for(int i = 0; i < skin->numWeights; i++) - idx[i] = 3*natskin->table2[indices[i]]; - p += natskin->stride; - indices += 4; - } -} - -void -skinUninstanceCB(Geometry *geo, InstanceDataHeader *header) -{ - defaultUninstanceCB(geo, header); - - Skin *skin = Skin::get(geo); - if(skin == nil) - return; - NativeSkin *natskin = (NativeSkin*)skin->platformData; - - uint8 *data = skin->data; - float *invMats = skin->inverseMatrices; - skin->init(skin->numBones, natskin->numUsedBones, geo->numVertices); - memcpy(skin->inverseMatrices, invMats, skin->numBones*64); - rwFree(data); - - for(int32 j = 0; j < skin->numUsedBones; j++) - skin->usedBones[j] = natskin->table1[j]; - - float *weights = skin->weights; - uint8 *indices = skin->indices; - uint8 *p = (uint8*)natskin->vertexBuffer; - int32 numVertices = header->numVertices; - float w[4]; - uint8 i[4]; - uint16 *ip; - while(numVertices--){ - w[0] = w[1] = w[2] = w[3] = 0.0f; - i[0] = i[1] = i[2] = i[3] = 0; - - for(int32 j = 0; j < skin->numWeights; j++) - w[j] = *p++/255.0f; - - ip = (uint16*)p; - for(int32 j = 0; j < skin->numWeights; j++){ - i[j] = natskin->table1[*ip++/3]; - if(w[j] == 0.0f) i[j] = 0; // clean up a bit - } - p = (uint8*)ip; - - for(int32 j = 0; j < 4; j++){ - *weights++ = w[j]; - *indices++ = i[j]; - } - } - - rwFree(natskin->vertexBuffer); - rwFree(natskin); -} - -static void* -skinOpen(void *o, int32, int32) -{ - skinGlobals.pipelines[PLATFORM_XBOX] = makeSkinPipeline(); - return o; -} - -static void* -skinClose(void *o, int32, int32) -{ - ((ObjPipeline*)skinGlobals.pipelines[PLATFORM_XBOX])->destroy(); - skinGlobals.pipelines[PLATFORM_XBOX] = nil; - return o; -} - -void -initSkin(void) -{ - Driver::registerPlugin(PLATFORM_XBOX, 0, ID_SKIN, - skinOpen, skinClose); -} - -ObjPipeline* -makeSkinPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->instanceCB = skinInstanceCB; - pipe->uninstanceCB = skinUninstanceCB; - pipe->pluginID = ID_SKIN; - pipe->pluginData = 1; - return pipe; -} - -} -} diff --git a/vendor/librw/src/d3d/xboxvfmt.cpp b/vendor/librw/src/d3d/xboxvfmt.cpp deleted file mode 100644 index b6569dc..0000000 --- a/vendor/librw/src/d3d/xboxvfmt.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwanim.h" -#include "../rwengine.h" -#include "../rwplugins.h" -#include "rwxbox.h" - -namespace rw { -namespace xbox { - -static int32 vertexFmtOffset; - -uint32 vertexFormatSizes[6] = { - 0, 1, 2, 2, 4, 4 -}; - -uint32* -getVertexFmt(Geometry *g) -{ - return PLUGINOFFSET(uint32, g, vertexFmtOffset); -} - -uint32 -makeVertexFmt(int32 flags, uint32 numTexSets) -{ - if(numTexSets > 4) - numTexSets = 4; - uint32 fmt = 0x5; // FLOAT3 - if(flags & Geometry::NORMALS) - fmt |= 0x40; // NORMPACKED3 - for(uint32 i = 0; i < numTexSets; i++) - fmt |= 0x500 << i*4; // FLOAT2 - if(flags & Geometry::PRELIT) - fmt |= 0x1000000; // D3DCOLOR - return fmt; -} - -uint32 -getVertexFmtStride(uint32 fmt) -{ - uint32 stride = 0; - uint32 v = fmt & 0xF; - uint32 n = (fmt >> 4) & 0xF; - stride += v == 4 ? 4 : 3*vertexFormatSizes[v]; - stride += n == 4 ? 4 : 3*vertexFormatSizes[n]; - if(fmt & 0x1000000) - stride += 4; - for(int i = 0; i < 4; i++){ - uint32 t = (fmt >> (i*4 + 8)) & 0xF; - stride += t == 4 ? 4 : 2*vertexFormatSizes[t]; - } - if(fmt & 0xE000000) - stride += 8; - return stride; -} - -static void* -createVertexFmt(void *object, int32 offset, int32) -{ - *PLUGINOFFSET(uint32, object, offset) = 0; - return object; -} - -static void* -copyVertexFmt(void *dst, void *src, int32 offset, int32) -{ - *PLUGINOFFSET(uint32, dst, offset) = *PLUGINOFFSET(uint32, src, offset); - return dst; -} - -static Stream* -readVertexFmt(Stream *stream, int32, void *object, int32 offset, int32) -{ - uint32 fmt = stream->readU32(); - *PLUGINOFFSET(uint32, object, offset) = fmt; - // TODO: ? create and attach "vertex shader" - return stream; -} - -static Stream* -writeVertexFmt(Stream *stream, int32, void *object, int32 offset, int32) -{ - stream->writeI32(*PLUGINOFFSET(uint32, object, offset)); - return stream; -} - -static int32 -getSizeVertexFmt(void*, int32, int32) -{ - if(rw::platform != PLATFORM_XBOX) - return -1; - return 4; -} - -void -registerVertexFormatPlugin(void) -{ - vertexFmtOffset = Geometry::registerPlugin(sizeof(uint32), ID_VERTEXFMT, - createVertexFmt, nil, copyVertexFmt); - Geometry::registerPluginStream(ID_VERTEXFMT, - readVertexFmt, - writeVertexFmt, - getSizeVertexFmt); -} - -} -} diff --git a/vendor/librw/src/engine.cpp b/vendor/librw/src/engine.cpp deleted file mode 100644 index 74dae02..0000000 --- a/vendor/librw/src/engine.cpp +++ /dev/null @@ -1,566 +0,0 @@ -#include -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" -#include "ps2/rwps2.h" -#include "d3d/rwxbox.h" -#include "d3d/rwd3d.h" -#include "d3d/rwd3d8.h" -#include "d3d/rwd3d9.h" -#include "gl/rwgl3.h" -#include "gl/rwwdgl.h" - -#define PLUGIN_ID 0 - -// on windows -//#ifdef DEBUG -//#include -//#define free(p) _free_dbg(p, _NORMAL_BLOCK); -//#define malloc(sz) _malloc_dbg(sz, _NORMAL_BLOCK, __FILE__, __LINE__) -//#define realloc(p, sz) _realloc_dbg(p, sz, _NORMAL_BLOCK, __FILE__, __LINE__) -//#endif - -namespace rw { - -Engine *engine; -PluginList Engine::s_plglist(sizeof(Engine)); -Engine::State Engine::state = Dead; -MemoryFunctions Engine::memfuncs; -PluginList Driver::s_plglist[NUM_PLATFORMS]; - -const char *allocLocation; - -void *malloc_h(size_t sz, uint32 hint) { if(sz == 0) return nil; return malloc(sz); } -void *realloc_h(void *p, size_t sz, uint32 hint) { return realloc(p, sz); } - -struct MemoryBlock -{ - size_t sz; - uint32 hint; - void *origPtr; - const char *codeline; - LLLink inAllocList; -}; -LinkList allocations; -size_t totalMemoryAllocated; - -// We align managed memory blocks on a 16 byte boundary - -#define ALIGN16(x) ((x) + 0xF & ~0xF) -void* -malloc_managed(size_t sz, uint32 hint) -{ - void *origPtr; - uint8 *data; - MemoryBlock *mem; - - if(sz == 0) return nil; - origPtr = malloc(sz + sizeof(MemoryBlock) + 15); - if(origPtr == nil) - return nil; - totalMemoryAllocated += sz; - data = (uint8*)origPtr; - data += sizeof(MemoryBlock); - data = (uint8*)ALIGN16((uintptr)data); - mem = (MemoryBlock*)(data-sizeof(MemoryBlock)); - - mem->sz = sz; - mem->hint = hint; - mem->origPtr = origPtr; - mem->codeline = allocLocation; - allocations.add(&mem->inAllocList); - - return data; -} - -void* -realloc_managed(void *p, size_t sz, uint32 hint) -{ - void *origPtr; - MemoryBlock *mem; - uint32 offset; - - if(p == nil) - return malloc_managed(sz, hint); - - mem = (MemoryBlock*)((uint8*)p-sizeof(MemoryBlock)); - offset = (uint8*)p - (uint8*)mem->origPtr; - - mem->inAllocList.remove(); - - origPtr = realloc(mem->origPtr, sz + sizeof(MemoryBlock) + 15); - if(origPtr == nil){ - allocations.add(&mem->inAllocList); - return nil; - } - p = (uint8*)origPtr + offset; - mem = (MemoryBlock*)((uint8*)p-sizeof(MemoryBlock)); - totalMemoryAllocated -= mem->sz; - mem->sz = sz; - mem->hint = hint; - mem->origPtr = origPtr; - mem->codeline = allocLocation; - allocations.add(&mem->inAllocList); - totalMemoryAllocated += mem->sz; - - return p; -} - -void -free_managed(void *p) -{ - MemoryBlock *mem; - if(p == nil) - return; - mem = (MemoryBlock*)((uint8*)p-sizeof(MemoryBlock)); - mem->inAllocList.remove(); - totalMemoryAllocated -= mem->sz; - free(mem->origPtr); -} - -void -printleaks(void) -{ - FORLIST(lnk, allocations){ - MemoryBlock *mem = LLLinkGetData(lnk, MemoryBlock, inAllocList); - printf("sz %zu hint %X\n %s\n", mem->sz, mem->hint, mem->codeline); - } -} - -// TODO: make the debug out configurable -void *mustmalloc_h(size_t sz, uint32 hint) -{ - void *ret; - ret = Engine::memfuncs.rwmalloc(sz, hint); - if(ret || sz == 0) - return ret; - fprintf(stderr, "Error: out of memory\n"); - exit(1); - return nil; -} -void *mustrealloc_h(void *p, size_t sz, uint32 hint) -{ - void *ret; - ret = Engine::memfuncs.rwrealloc(p, sz, hint); - if(ret || sz == 0) - return ret; - fprintf(stderr, "Error: out of memory\n"); - exit(1); - return nil; -} - -char *strdup_LOC(const char *s, uint32 hint, const char *here) { - char *t; - size_t sz = strlen(s)+1; - t = (char*)malloc_LOC(sz, hint, here); - if(t) - memcpy(t, s, sz); - return t; -} - -MemoryFunctions defaultMemfuncs = { - malloc_h, - realloc_h, - free, - nil, - nil -}; - -MemoryFunctions managedMemfuncs = { - malloc_managed, - realloc_managed, - free_managed, - nil, - nil -}; - -// This function mainly registers engine plugins -bool32 -Engine::init(MemoryFunctions *memfuncs) -{ - if(engine || Engine::state != Dead){ - RWERROR((ERR_ENGINEINIT)); - return 0; - } - - totalMemoryAllocated = 0; - allocations.init(); - - if(memfuncs) - Engine::memfuncs = *memfuncs; - else - Engine::memfuncs = defaultMemfuncs; - - if(Engine::memfuncs.rwmustmalloc == nil) - Engine::memfuncs.rwmustmalloc = mustmalloc_h; - if(Engine::memfuncs.rwmustrealloc == nil) - Engine::memfuncs.rwmustrealloc = mustrealloc_h; - - PluginList::open(); - - for(uint i = 0; i < NUM_PLATFORMS; i++) - new (&Driver::s_plglist[i]) PluginList(sizeof(Driver)); - - // core plugin attach here - Frame::registerModule(); - Image::registerModule(); - Raster::registerModule(); - Texture::registerModule(); - - // TODO: reset all allocation counts here. or maybe do that in modules? - Frame::numAllocated = 0; - Image::numAllocated = 0; - Raster::numAllocated = 0; - Texture::numAllocated = 0; - TexDictionary::numAllocated = 0; - Geometry::numAllocated = 0; - Material::numAllocated = 0; - Atomic::numAllocated = 0; - Light::numAllocated = 0; - Camera::numAllocated = 0; - Clump::numAllocated = 0; - World::numAllocated = 0; - - // driver plugin attach - ps2::registerPlatformPlugins(); - xbox::registerPlatformPlugins(); - d3d8::registerPlatformPlugins(); - d3d9::registerPlatformPlugins(); - wdgl::registerPlatformPlugins(); - gl3::registerPlatformPlugins(); - - Engine::state = Initialized; - return 1; -} - -// This is where RW allocates the engine and e.g. opens d3d -bool32 -Engine::open(EngineOpenParams *p) -{ - if(engine || Engine::state != Initialized){ - RWERROR((ERR_ENGINEOPEN)); - return 0; - } - - // Allocate engine - engine = (Engine*)rwNew(Engine::s_plglist.size, MEMDUR_GLOBAL); - engine->currentCamera = nil; - engine->currentWorld = nil; - - // Initialize device - // Device and possibly OS specific! -#ifdef RW_PS2 - engine->device = ps2::renderdevice; -#elif RW_GL3 - engine->device = gl3::renderdevice; -#elif RW_D3D9 - engine->device = d3d::renderdevice; -#else - engine->device = null::renderdevice; -#endif - - engine->device.system(DEVICEOPEN, (void*)p, 0); - - engine->dummyDefaultPipeline = ObjPipeline::create(); - for(uint i = 0; i < NUM_PLATFORMS; i++){ - rw::engine->driver[i] = (Driver*)rwNew(Driver::s_plglist[i].size, - MEMDUR_GLOBAL); - - engine->driver[i]->defaultPipeline = engine->dummyDefaultPipeline; - - engine->driver[i]->rasterCreate = null::rasterCreate; - engine->driver[i]->rasterLock = null::rasterLock; - engine->driver[i]->rasterUnlock = null::rasterUnlock; - engine->driver[i]->rasterLockPalette = null::rasterLockPalette; - engine->driver[i]->rasterUnlockPalette = null::rasterUnlockPalette; - engine->driver[i]->rasterNumLevels = null::rasterNumLevels; - engine->driver[i]->imageFindRasterFormat = null::imageFindRasterFormat; - engine->driver[i]->rasterFromImage = null::rasterFromImage; - engine->driver[i]->rasterToImage = null::rasterToImage; - } - - Engine::state = Opened; - return 1; -} - -// This is where RW creates the actual rendering device -// and calls the engine plugin ctors -bool32 -Engine::start(void) -{ - if(engine == nil || Engine::state != Opened){ - RWERROR((ERR_ENGINESTART)); - return 0; - } - - engine->device.system(DEVICEINIT, nil, 0); - - Engine::s_plglist.construct(engine); - for(uint i = 0; i < NUM_PLATFORMS; i++) - Driver::s_plglist[i].construct(rw::engine->driver[i]); - - engine->device.system(DEVICEFINALIZE, nil, 0); - - // Register some image formats. Or should we leave that to the user? - Image::registerFileFormat("tga", readTGA, writeTGA); - Image::registerFileFormat("bmp", readBMP, writeBMP); - Image::registerFileFormat("png", readPNG, writePNG); - - Engine::state = Started; - return 1; -} - -void -Engine::term(void) -{ - if(engine || Engine::state != Initialized){ - RWERROR((ERR_GENERAL)); - return; - } - - PluginList::close(); - - // This has to be reset because it won't be opened again otherwise - // TODO: maybe reset more stuff here? - d3d::nativeRasterOffset = 0; - - Engine::state = Dead; -} - -void -Engine::close(void) -{ - if(engine == nil || Engine::state != Opened){ - RWERROR((ERR_GENERAL)); - return; - } - - engine->device.system(DEVICECLOSE, nil, 0); - for(uint i = 0; i < NUM_PLATFORMS; i++) - rwFree(rw::engine->driver[i]); - engine->dummyDefaultPipeline->destroy(); - rwFree(engine); - engine = nil; - Engine::state = Initialized; -} - -void -Engine::stop(void) -{ - if(engine == nil || Engine::state != Started){ - RWERROR((ERR_GENERAL)); - return; - } - - for(uint i = 0; i < NUM_PLATFORMS; i++) - Driver::s_plglist[i].destruct(rw::engine->driver[i]); - Engine::s_plglist.destruct(engine); - - engine->device.system(DEVICETERM, nil, 0); - - Engine::state = Opened; -} - - -int32 -Engine::getNumSubSystems(void) -{ - return engine->device.system(DEVICEGETNUMSUBSYSTEMS, nil, 0); -} - -int32 -Engine::getCurrentSubSystem(void) -{ - return engine->device.system(DEVICEGETCURRENTSUBSYSTEM, nil, 0); -} - -bool32 -Engine::setSubSystem(int32 subsys) -{ - return engine->device.system(DEVICESETSUBSYSTEM, nil, subsys); -} - -SubSystemInfo* -Engine::getSubSystemInfo(SubSystemInfo *info, int32 subsys) -{ - if(engine->device.system(DEVICEGETSUBSSYSTEMINFO, info, subsys)) - return info; - return nil; -} - - -int32 -Engine::getNumVideoModes(void) -{ - return engine->device.system(DEVICEGETNUMVIDEOMODES, nil, 0); -} - -int32 -Engine::getCurrentVideoMode(void) -{ - return engine->device.system(DEVICEGETCURRENTVIDEOMODE, nil, 0); -} - -bool32 -Engine::setVideoMode(int32 mode) -{ - return engine->device.system(DEVICESETVIDEOMODE, nil, mode); -} - -VideoMode* -Engine::getVideoModeInfo(VideoMode *info, int32 mode) -{ - if(engine->device.system(DEVICEGETVIDEOMODEINFO, info, mode)) - return info; - return nil; -} - - -uint32 -Engine::getMaxMultiSamplingLevels(void) -{ - return engine->device.system(DEVICEGETMAXMULTISAMPLINGLEVELS, nil, 0); -} - -uint32 -Engine::getMultiSamplingLevels(void) -{ - return engine->device.system(DEVICEGETMULTISAMPLINGLEVELS, nil, 0); -} - -bool32 -Engine::setMultiSamplingLevels(uint32 levels) -{ - return engine->device.system(DEVICESETMULTISAMPLINGLEVELS, nil, levels); -} - - -namespace null { - -void beginUpdate(Camera*) { } -void endUpdate(Camera*) { } -void clearCamera(Camera*,RGBA*,uint32) { } -void showRaster(Raster*,uint32) { } - -void setRenderState(int32, void*) { } -void *getRenderState(int32) { return 0; } - -bool32 rasterRenderFast(Raster *raster, int32 x, int32 y) { return 0; } - -void im2DRenderLine(void*, int32, int32, int32) { } -void im2DRenderTriangle(void*, int32, int32, int32, int32) { } -void im2DRenderPrimitive(PrimitiveType, void*, int32) { } -void im2DRenderIndexedPrimitive(PrimitiveType, void*, int32, void*, int32) { } - -void im3DTransform(void *vertices, int32 numVertices, Matrix *world, uint32 flags) { } -void im3DRenderPrimitive(PrimitiveType primType) { } -void im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices) { } -void im3DEnd(void) { } - -Raster* -rasterCreate(Raster*) -{ - assert(0 && "rasterCreate not implemented"); - return nil; -} - -uint8* -rasterLock(Raster*, int32, int32) -{ - assert(0 && "lockRaster not implemented"); - return nil; -} - -void -rasterUnlock(Raster*, int32) -{ - assert(0 && "unlockRaster not implemented"); -} - -uint8* -rasterLockPalette(Raster*, int32) -{ - assert(0 && "rasterLockPalette not implemented"); - return nil; -} - -void -rasterUnlockPalette(Raster*) -{ - assert(0 && "rasterUnlockPalette not implemented"); -} - -int32 -rasterNumLevels(Raster*) -{ - assert(0 && "rasterNumLevels not implemented"); - return 0; -} - -bool32 -imageFindRasterFormat(Image *img, int32 type, - int32 *width, int32 *height, int32 *depth, int32 *format) -{ - assert(0 && "imageFindRasterFormat not implemented"); - return 0; -} - -bool32 -rasterFromImage(Raster*, Image*) -{ - assert(0 && "rasterFromImage not implemented"); - return 0; -} - -Image* -rasterToImage(Raster*) -{ - assert(0 && "rasterToImage not implemented"); - return nil; -} - -int -deviceSystem(DeviceReq req, void *arg0, int32 n) -{ - switch(req){ - case DEVICEGETNUMSUBSYSTEMS: - return 0; - case DEVICEGETCURRENTSUBSYSTEM: - return 0; - case DEVICEGETSUBSSYSTEMINFO: - return 0; - default: break; - } - return 1; -} - -Device renderdevice = { - 0.0f, 1.0f, - null::beginUpdate, - null::endUpdate, - null::clearCamera, - null::showRaster, - null::rasterRenderFast, - null::setRenderState, - null::getRenderState, - null::im2DRenderLine, - null::im2DRenderTriangle, - null::im2DRenderPrimitive, - null::im2DRenderIndexedPrimitive, - null::im3DTransform, - null::im3DRenderPrimitive, - null::im3DRenderIndexedPrimitive, - null::im3DEnd, - null::deviceSystem -}; - -} -} diff --git a/vendor/librw/src/error.cpp b/vendor/librw/src/error.cpp deleted file mode 100644 index bdf4080..0000000 --- a/vendor/librw/src/error.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include - -#include "rwbase.h" -#include "rwerror.h" - -namespace rw { - -static Error error; - -void -setError(Error *e) -{ - error = *e; -} - -Error* -getError(Error *e) -{ - *e = error; - error.plugin = 0; - error.code = 0; - return e; -} - -#define ECODE(c, s) s - -const char *errstrs[] = { - "No error", -#include "base.err" -}; - -#undef ECODE - -char* -dbgsprint(uint32 code, ...) -{ - va_list ap; - static char strbuf[512]; - - if(code & 0x80000000) - code &= ~0x80000000; - va_start(ap, code); - vsprintf(strbuf, errstrs[code], ap); - va_end(ap); - return strbuf; -} - -} diff --git a/vendor/librw/src/frame.cpp b/vendor/librw/src/frame.cpp deleted file mode 100644 index c8dabd5..0000000 --- a/vendor/librw/src/frame.cpp +++ /dev/null @@ -1,463 +0,0 @@ -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -#define PLUGIN_ID ID_FRAMELIST - -namespace rw { - -int32 Frame::numAllocated; - -PluginList Frame::s_plglist(sizeof(Frame)); -static void *frameOpen(void *object, int32 offset, int32 size) { engine->frameDirtyList.init(); return object; } -static void *frameClose(void *object, int32 offset, int32 size) { return object; } - -void -Frame::registerModule(void) -{ - Engine::registerPlugin(0, ID_FRAMEMODULE, frameOpen, frameClose); -} - -Frame* -Frame::create(void) -{ - Frame *f = (Frame*)rwMalloc(s_plglist.size, MEMDUR_EVENT | ID_FRAMELIST); - if(f == nil){ - RWERROR((ERR_ALLOC, s_plglist.size)); - return nil; - } - numAllocated++; - f->object.init(Frame::ID, 0); - f->objectList.init(); - f->child = nil; - f->next = nil; - f->root = f; - f->matrix.setIdentity(); - f->ltm.setIdentity(); - s_plglist.construct(f); - return f; -} - -Frame* -Frame::cloneHierarchy(void) -{ - Frame *frame = this->cloneAndLink(); - this->purgeClone(); - return frame; -} -void -Frame::destroy(void) -{ - FORLIST(lnk, this->objectList) - ObjectWithFrame::fromFrame(lnk)->setFrame(nil); - s_plglist.destruct(this); - if(this->getParent()) - this->removeChild(); - if(this->object.privateFlags & Frame::HIERARCHYSYNC) - this->inDirtyList.remove(); - for(Frame *f = this->child; f; f = f->next) - f->object.parent = nil; - rwFree(this); - numAllocated--; -} - -void -Frame::destroyHierarchy(void) -{ - Frame *next; - for(Frame *child = this->child; child; child = next){ - next = child->next; - child->destroyHierarchy(); - } - assert(this->objectList.isEmpty()); - s_plglist.destruct(this); - if(this->object.privateFlags & Frame::HIERARCHYSYNC) - this->inDirtyList.remove(); - rwFree(this); -} - -Frame* -Frame::addChild(Frame *child, bool32 append) -{ - Frame *c; - if(child->getParent()) - child->removeChild(); - if(append){ - if(this->child == nil) - this->child = child; - else{ - for(c = this->child; c->next; c = c->next); - c->next = child; - } - child->next = nil; - }else{ - child->next = this->child; - this->child = child; - } - child->object.parent = this; - child->root = this->root; - for(c = child->child; c; c = c->next) - c->setHierarchyRoot(this); - // If the child was a root, remove from dirty list - if(child->object.privateFlags & Frame::HIERARCHYSYNC){ - child->inDirtyList.remove(); - child->object.privateFlags &= ~Frame::HIERARCHYSYNC; - } - this->updateObjects(); - return this; -} - -Frame* -Frame::removeChild(void) -{ - Frame *parent = this->getParent(); - Frame *child = parent->child; - if(child == this) - parent->child = this->next; - else{ - while(child->next != this) - child = child->next; - child->next = this->next; - } - this->object.parent = this->next = nil; - // give the hierarchy a new root - this->setHierarchyRoot(this); - this->updateObjects(); - return this; -} - -Frame* -Frame::forAllChildren(Callback cb, void *data) -{ - Frame *next; - for(Frame *f = this->child; f; f = next){ - next = f->next; - if(cb(f, data) == nil) - return this; - } - return this; -} - -static Frame* -countCB(Frame *f, void *count) -{ - (*(int32*)count)++; - f->forAllChildren(countCB, count); - return f; -} - -int32 -Frame::count(void) -{ - int32 count = 1; - this->forAllChildren(countCB, (void*)&count); - return count; -} - -/* - * Synching is a bit complicated. If anything in the hierarchy is not synched, - * the root of the hierarchy is marked with the HIERARCHYSYNC flags. - * Every unsynched frame is marked with the SUBTREESYNC flags. - * If the LTM is not synched, the LTM flags are set. - * If attached objects need synching, the OBJ flags are set. - */ - -/* Synch just LTM matrices in a hierarchy */ -static void -syncLTMRecurse(Frame *frame, uint8 hierarchyFlags) -{ - for(; frame; frame = frame->next){ - // If frame is dirty or any parent was dirty, update LTM - hierarchyFlags |= frame->object.privateFlags; - if(hierarchyFlags & Frame::SUBTREESYNCLTM){ - Matrix::mult(&frame->ltm, &frame->matrix, - &frame->getParent()->ltm); - frame->object.privateFlags &= ~Frame::SUBTREESYNCLTM; - } - // And synch all children - syncLTMRecurse(frame->child, hierarchyFlags); - } -} - -/* Synch just objects in a hierarchy */ -static void -syncObjRecurse(Frame *frame) -{ - for(; frame; frame = frame->next){ - // Synch attached objects - FORLIST(lnk, frame->objectList) - ObjectWithFrame::fromFrame(lnk)->sync(); - frame->object.privateFlags &= ~Frame::SUBTREESYNCOBJ; - // And synch all children - syncObjRecurse(frame->child); - } -} - -/* Synch LTM and objects */ -static void -syncRecurse(Frame *frame, uint8 hierarchyFlags) -{ - for(; frame; frame = frame->next){ - // If frame is dirty or any parent was dirty, update LTM - hierarchyFlags |= frame->object.privateFlags; - if(hierarchyFlags & Frame::SUBTREESYNCLTM) - Matrix::mult(&frame->ltm, &frame->matrix, - &frame->getParent()->ltm); - // Synch attached objects - FORLIST(lnk, frame->objectList) - ObjectWithFrame::fromFrame(lnk)->sync(); - frame->object.privateFlags &= ~Frame::SUBTREESYNC; - // And synch all children - syncRecurse(frame->child, hierarchyFlags); - } -} - -/* Sync the LTMs of the hierarchy of which 'this' is the root */ -void -Frame::syncHierarchyLTM(void) -{ - // Sync root's LTM - if(this->object.privateFlags & Frame::SUBTREESYNCLTM) - this->ltm = this->matrix; - // ...and children - syncLTMRecurse(this->child, this->object.privateFlags); - // all clean now - this->object.privateFlags &= ~Frame::SYNCLTM; -} - -Matrix* -Frame::getLTM(void) -{ - if(this->root->object.privateFlags & Frame::HIERARCHYSYNCLTM) - this->root->syncHierarchyLTM(); - return &this->ltm; -} - -/* Synch all dirty frames; LTMs and objects */ -void -Frame::syncDirty(void) -{ - Frame *frame; - FORLIST(lnk, engine->frameDirtyList){ - frame = LLLinkGetData(lnk, Frame, inDirtyList); - if(frame->object.privateFlags & Frame::HIERARCHYSYNCLTM){ - // Sync root's LTM - if(frame->object.privateFlags & Frame::SUBTREESYNCLTM) - frame->ltm = frame->matrix; - // Synch attached objects - FORLIST(lnk, frame->objectList) - ObjectWithFrame::fromFrame(lnk)->sync(); - // ...and children - syncRecurse(frame->child, frame->object.privateFlags); - }else{ - // LTMs are clean, just synch objects - FORLIST(lnk, frame->objectList) - ObjectWithFrame::fromFrame(lnk)->sync(); - syncObjRecurse(frame->child); - } - // all clean now - frame->object.privateFlags &= ~(Frame::SYNCLTM | Frame::SYNCOBJ); - } - engine->frameDirtyList.init(); -} - -void -Frame::rotate(const V3d *axis, float32 angle, CombineOp op) -{ - this->matrix.rotate(axis, angle, op); - updateObjects(); -} - -void -Frame::translate(const V3d *trans, CombineOp op) -{ - this->matrix.translate(trans, op); - updateObjects(); -} - -void -Frame::scale(const V3d *scl, CombineOp op) -{ - this->matrix.scale(scl, op); - updateObjects(); -} - -void -Frame::transform(const Matrix *mat, CombineOp op) -{ - this->matrix.transform(mat, op); - updateObjects(); -} - -void -Frame::updateObjects(void) -{ - // Mark root as dirty and insert into dirty list if necessary - if((this->root->object.privateFlags & HIERARCHYSYNC) == 0) - engine->frameDirtyList.add(&this->root->inDirtyList); - this->root->object.privateFlags |= HIERARCHYSYNC; - // Mark subtree as dirty as well - this->object.privateFlags |= SUBTREESYNC; -} - -void -Frame::setHierarchyRoot(Frame *root) -{ - this->root = root; - for(Frame *child = this->child; child; child = child->next) - child->setHierarchyRoot(root); -} - -static Frame* -cloneRecurse(Frame *old, Frame *newroot) -{ - Frame *frame = Frame::create(); - if(newroot == nil) - newroot = frame; - frame->object.copy(&old->object); - frame->matrix = old->matrix; - frame->root = newroot; - old->root = frame; // Remember cloned frame - for(Frame *child = old->child; child; child = child->next){ - Frame *clonedchild = cloneRecurse(child, newroot); - clonedchild->next = frame->child; - frame->child = clonedchild; - clonedchild->object.parent = frame; - } - Frame::s_plglist.copy(frame, old); - return frame; -} - -// Clone a frame hierarchy. Link cloned frames into Frame::root of the originals. -Frame* -Frame::cloneAndLink(void) -{ - Frame *newhier = cloneRecurse(this, nil); - if(newhier){ - // frame is not in dirty list so important to get this flag right - newhier->object.privateFlags &= ~HIERARCHYSYNC; - newhier->updateObjects(); - } - return newhier; -} - -// Remove links to cloned frames from hierarchy. -void -Frame::purgeClone(void) -{ - Frame *parent = this->getParent(); - this->setHierarchyRoot(parent ? parent->root : this); -} - -struct FrameStreamData -{ - V3d right, up, at, pos; - int32 parent; - int32 matflag; -}; - -FrameList_* -FrameList_::streamRead(Stream *stream) -{ - FrameStreamData buf; - this->numFrames = 0; - this->frames = nil; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - this->numFrames = stream->readI32(); - this->frames = (Frame**)rwMalloc(this->numFrames*sizeof(Frame*), MEMDUR_EVENT | ID_FRAMELIST); - if(this->frames == nil){ - RWERROR((ERR_ALLOC, this->numFrames*sizeof(Frame*))); - return nil; - } - for(int32 i = 0; i < this->numFrames; i++){ - Frame *f; - stream->read32(&buf, sizeof(buf)); - this->frames[i] = f = Frame::create(); - if(f == nil){ - // TODO: clean up frames? - rwFree(this->frames); - return nil; - } - f->matrix.right = buf.right; - f->matrix.up = buf.up; - f->matrix.at = buf.at; - f->matrix.pos = buf.pos; - f->matrix.optimize(); - // RW always removes identity flag - f->matrix.flags &= ~Matrix::IDENTITY; - if(buf.parent >= 0) - this->frames[buf.parent]->addChild(f, rw::streamAppendFrames); - } - for(int32 i = 0; i < this->numFrames; i++) - Frame::s_plglist.streamRead(stream, this->frames[i]); - return this; -} - -void -FrameList_::streamWrite(Stream *stream) -{ - FrameStreamData buf; - - int size = 0, structsize = 0; - structsize = 4 + this->numFrames*sizeof(FrameStreamData); - size += 12 + structsize; - for(int32 i = 0; i < this->numFrames; i++) - size += 12 + Frame::s_plglist.streamGetSize(this->frames[i]); - - writeChunkHeader(stream, ID_FRAMELIST, size); - writeChunkHeader(stream, ID_STRUCT, structsize); - stream->writeU32(this->numFrames); - for(int32 i = 0; i < this->numFrames; i++){ - Frame *f = this->frames[i]; - buf.right = f->matrix.right; - buf.up = f->matrix.up; - buf.at = f->matrix.at; - buf.pos = f->matrix.pos; - buf.parent = findPointer(f->getParent(), (void**)this->frames, - this->numFrames); - buf.matflag = 0; //f->matflag; - stream->write32(&buf, sizeof(buf)); - } - for(int32 i = 0; i < this->numFrames; i++) - Frame::s_plglist.streamWrite(stream, this->frames[i]); -} - -static Frame* -sizeCB(Frame *f, void *size) -{ - *(int32*)size += Frame::s_plglist.streamGetSize(f); - f->forAllChildren(sizeCB, size); - return f; -} - -uint32 -FrameList_::streamGetSize(Frame *f) -{ - int32 numFrames = f->count(); - uint32 size = 12 + 12 + 4 + numFrames*(sizeof(FrameStreamData)+12); - sizeCB(f, (void*)&size); - return size; -} - -Frame** -makeFrameList(Frame *frame, Frame **flist) -{ - *flist++ = frame; - if(frame->next) - flist = makeFrameList(frame->next, flist); - if(frame->child) - flist = makeFrameList(frame->child, flist); - return flist; -} - -} diff --git a/vendor/librw/src/geometry.cpp b/vendor/librw/src/geometry.cpp deleted file mode 100644 index 5d31c34..0000000 --- a/vendor/librw/src/geometry.cpp +++ /dev/null @@ -1,1052 +0,0 @@ -#include -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -#define PLUGIN_ID ID_GEOMETRY - -namespace rw { - -int32 Geometry::numAllocated; -int32 Material::numAllocated; - -PluginList Geometry::s_plglist(sizeof(Geometry)); -PluginList Material::s_plglist(sizeof(Material)); - -static SurfaceProperties defaultSurfaceProps = { 1.0f, 1.0f, 1.0f }; - -// We allocate twice because we have to allocate the data separately for uninstancing -Geometry* -Geometry::create(int32 numVerts, int32 numTris, uint32 flags) -{ - Geometry *geo = (Geometry*)rwMalloc(s_plglist.size, MEMDUR_EVENT | ID_GEOMETRY); - if(geo == nil){ - RWERROR((ERR_ALLOC, s_plglist.size)); - return nil; - } - numAllocated++; - geo->object.init(Geometry::ID, 0); - geo->flags = flags & 0xFF00FFFF; - geo->numTexCoordSets = (flags & 0xFF0000) >> 16; - if(geo->numTexCoordSets == 0) - geo->numTexCoordSets = (geo->flags & TEXTURED) ? 1 : - (geo->flags & TEXTURED2) ? 2 : 0; - geo->numTriangles = numTris; - geo->numVertices = numVerts; - - geo->colors = nil; - for(int32 i = 0; i < 8; i++) - geo->texCoords[i] = nil; - geo->triangles = nil; - // Allocate all attributes at once. The triangle pointer - // will hold the first address (even when there are no triangles) - // so we can free easily. - if(!(geo->flags & NATIVE)){ - int32 sz = geo->numTriangles*sizeof(Triangle); - if(geo->flags & PRELIT) - sz += geo->numVertices*sizeof(RGBA); - sz += geo->numTexCoordSets*geo->numVertices*sizeof(TexCoords); - - uint8 *data = (uint8*)rwNew(sz, MEMDUR_EVENT | ID_GEOMETRY); - geo->triangles = (Triangle*)data; - data += geo->numTriangles*sizeof(Triangle); - if(geo->flags & PRELIT && geo->numVertices){ - geo->colors = (RGBA*)data; - data += geo->numVertices*sizeof(RGBA); - } - if(geo->numVertices) - for(int32 i = 0; i < geo->numTexCoordSets; i++){ - geo->texCoords[i] = (TexCoords*)data; - data += geo->numVertices*sizeof(TexCoords); - } - - // init triangles - for(int32 i = 0; i < geo->numTriangles; i++) - geo->triangles[i].matId = 0xFFFF; - } - geo->numMorphTargets = 0; - geo->morphTargets = nil; - geo->addMorphTargets(1); - - geo->matList.init(); - geo->lockedSinceInst = 0; - geo->meshHeader = nil; - geo->instData = nil; - geo->refCount = 1; - - s_plglist.construct(geo); - return geo; -} - -void -Geometry::destroy(void) -{ - this->refCount--; - if(this->refCount <= 0){ - s_plglist.destruct(this); - // Also frees colors and tex coords - rwFree(this->triangles); - // Also frees their data - rwFree(this->morphTargets); - // Also frees indices - rwFree(this->meshHeader); - this->matList.deinit(); - rwFree(this); - numAllocated--; - } -} - -void -Geometry::lock(int32 lockFlags) -{ - lockedSinceInst |= lockFlags; - if(lockFlags & LOCKPOLYGONS){ - rwFree(this->meshHeader); - this->meshHeader = nil; - } -} - -void -Geometry::unlock(void) -{ - if(this->meshHeader == nil) - this->buildMeshes(); - -} - -struct GeoStreamData -{ - uint32 flags; - int32 numTriangles; - int32 numVertices; - int32 numMorphTargets; -}; - -Geometry* -Geometry::streamRead(Stream *stream) -{ - uint32 version; - GeoStreamData buf; - SurfaceProperties surfProps; - MaterialList *ret; - static SurfaceProperties reset = { 1.0f, 1.0f, 1.0f }; - - if(!findChunk(stream, ID_STRUCT, nil, &version)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - stream->read32(&buf, sizeof(buf)); - Geometry *geo = Geometry::create(buf.numVertices, - buf.numTriangles, buf.flags); - if(geo == nil) - return nil; - geo->addMorphTargets(buf.numMorphTargets-1); - if(version < 0x34000) - stream->read32(&surfProps, 12); - - if(!(geo->flags & NATIVE)){ - if(geo->flags & PRELIT) - stream->read8(geo->colors, 4*geo->numVertices); - for(int32 i = 0; i < geo->numTexCoordSets; i++) - stream->read32(geo->texCoords[i], - 2*geo->numVertices*4); - for(int32 i = 0; i < geo->numTriangles; i++){ - uint32 tribuf[2]; - stream->read32(tribuf, 8); - geo->triangles[i].v[0] = tribuf[0] >> 16; - geo->triangles[i].v[1] = tribuf[0]; - geo->triangles[i].v[2] = tribuf[1] >> 16; - geo->triangles[i].matId = tribuf[1]; - } - } - - for(int32 i = 0; i < geo->numMorphTargets; i++){ - MorphTarget *m = &geo->morphTargets[i]; - stream->read32(&m->boundingSphere, 4*4); - int32 hasVertices = stream->readI32(); - int32 hasNormals = stream->readI32(); - if(hasVertices) - stream->read32(m->vertices, 3*geo->numVertices*4); - if(hasNormals) - stream->read32(m->normals, 3*geo->numVertices*4); - } - - if(!findChunk(stream, ID_MATLIST, nil, nil)){ - RWERROR((ERR_CHUNK, "MATLIST")); - goto fail; - } - if(version < 0x34000) - defaultSurfaceProps = surfProps; - - ret = MaterialList::streamRead(stream, &geo->matList); - if(version < 0x34000) - defaultSurfaceProps = reset; - if(ret == nil) - goto fail; - if(s_plglist.streamRead(stream, geo)) - return geo; - -fail: - geo->destroy(); - return nil; -} - -static uint32 -geoStructSize(Geometry *geo) -{ - uint32 size = 0; - size += sizeof(GeoStreamData); - if(version < 0x34000) - size += 12; // surface properties - if(!(geo->flags & Geometry::NATIVE)){ - if(geo->flags&geo->PRELIT) - size += 4*geo->numVertices; - for(int32 i = 0; i < geo->numTexCoordSets; i++) - size += 2*geo->numVertices*4; - size += 4*geo->numTriangles*2; - } - for(int32 i = 0; i < geo->numMorphTargets; i++){ - MorphTarget *m = &geo->morphTargets[i]; - size += 4*4 + 2*4; // bounding sphere and bools - if(!(geo->flags & Geometry::NATIVE)){ - if(m->vertices) - size += 3*geo->numVertices*4; - if(m->normals) - size += 3*geo->numVertices*4; - } - } - return size; -} - -bool -Geometry::streamWrite(Stream *stream) -{ - GeoStreamData buf; - static float32 fbuf[3] = { 1.0f, 1.0f, 1.0f }; - - writeChunkHeader(stream, ID_GEOMETRY, this->streamGetSize()); - writeChunkHeader(stream, ID_STRUCT, geoStructSize(this)); - - buf.flags = this->flags | this->numTexCoordSets << 16; - buf.numTriangles = this->numTriangles; - buf.numVertices = this->numVertices; - buf.numMorphTargets = this->numMorphTargets; - stream->write32(&buf, sizeof(buf)); - if(version < 0x34000) - stream->write32(fbuf, sizeof(fbuf)); - - if(!(this->flags & NATIVE)){ - if(this->flags & PRELIT) - stream->write8(this->colors, 4*this->numVertices); - for(int32 i = 0; i < this->numTexCoordSets; i++) - stream->write32(this->texCoords[i], - 2*this->numVertices*4); - for(int32 i = 0; i < this->numTriangles; i++){ - uint32 tribuf[2]; - tribuf[0] = this->triangles[i].v[0] << 16 | - this->triangles[i].v[1]; - tribuf[1] = this->triangles[i].v[2] << 16 | - this->triangles[i].matId; - stream->write32(tribuf, 8); - } - } - - for(int32 i = 0; i < this->numMorphTargets; i++){ - MorphTarget *m = &this->morphTargets[i]; - stream->write32(&m->boundingSphere, 4*4); - if(!(this->flags & NATIVE)){ - stream->writeI32(m->vertices != nil); - stream->writeI32(m->normals != nil); - if(m->vertices) - stream->write32(m->vertices, - 3*this->numVertices*4); - if(m->normals) - stream->write32(m->normals, - 3*this->numVertices*4); - }else{ - stream->writeI32(0); - stream->writeI32(0); - } - } - - this->matList.streamWrite(stream); - - s_plglist.streamWrite(stream, this); - return true; -} - -uint32 -Geometry::streamGetSize(void) -{ - uint32 size = 0; - size += 12 + geoStructSize(this); - size += 12 + this->matList.streamGetSize(); - size += 12 + s_plglist.streamGetSize(this); - return size; -} - -void -Geometry::addMorphTargets(int32 n) -{ - if(n == 0) - return; - n += this->numMorphTargets; - - int32 sz; - sz = sizeof(MorphTarget); - if(!(this->flags & NATIVE)){ - sz += this->numVertices*sizeof(V3d); - if(this->flags & NORMALS) - sz += this->numVertices*sizeof(V3d); - } - - // Memory layout: MorphTarget[n]; (vertices and normals)[n] - MorphTarget *mts; - if(this->numMorphTargets){ - mts = (MorphTarget*)rwResize(this->morphTargets, n*sz, MEMDUR_EVENT | ID_GEOMETRY); - this->morphTargets = mts; - // Since we now have more morph targets than before, move the vertex data up - uint8 *src = (uint8*)mts + sz*this->numMorphTargets; - uint8 *dst = (uint8*)mts + sz*n; - uint32 len = (sz-sizeof(MorphTarget))*this->numMorphTargets; - while(len--) - *--dst = *--src; - }else{ - mts = (MorphTarget*)rwNew(n*sz, MEMDUR_EVENT | ID_GEOMETRY); - this->morphTargets = mts; - } - - // Set up everything and initialize the bounding sphere for new morph targets - V3d *data = (V3d*)&mts[n]; - for(int32 i = 0; i < n; i++){ - mts->parent = this; - mts->vertices = nil; - mts->normals = nil; - if(i >= this->numMorphTargets){ - mts->boundingSphere.center.x = 0.0f; - mts->boundingSphere.center.y = 0.0f; - mts->boundingSphere.center.z = 0.0f; - mts->boundingSphere.radius = 0.0f; - } - if(!(this->flags & NATIVE) && this->numVertices){ - mts->vertices = data; - data += this->numVertices; - if(this->flags & NORMALS){ - mts->normals = data; - data += this->numVertices; - } - } - mts++; - } - this->numMorphTargets = n; -} - -void -Geometry::calculateBoundingSphere(void) -{ - for(int32 i = 0; i < this->numMorphTargets; i++){ - MorphTarget *m = &this->morphTargets[i]; - m->boundingSphere = m->calculateBoundingSphere(); - } -} - -bool32 -Geometry::hasColoredMaterial(void) -{ - for(int32 i = 0; i < this->matList.numMaterials; i++) - if(this->matList.materials[i]->color.red != 255 || - this->matList.materials[i]->color.green != 255 || - this->matList.materials[i]->color.blue != 255 || - this->matList.materials[i]->color.alpha != 255) - return 1; - return 0; -} - -// Force allocate data, even when native flag is set -void -Geometry::allocateData(void) -{ - // Geometry data - // Pretty much copy pasted from ::create above - int32 sz = this->numTriangles*sizeof(Triangle); - if(this->flags & PRELIT) - sz += this->numVertices*sizeof(RGBA); - sz += this->numTexCoordSets*this->numVertices*sizeof(TexCoords); - - uint8 *data = (uint8*)rwNew(sz, MEMDUR_EVENT | ID_GEOMETRY); - this->triangles = (Triangle*)data; - data += this->numTriangles*sizeof(Triangle); - for(int32 i = 0; i < this->numTriangles; i++) - this->triangles[i].matId = 0xFFFF; - if(this->flags & PRELIT){ - this->colors = (RGBA*)data; - data += this->numVertices*sizeof(RGBA); - } - for(int32 i = 0; i < this->numTexCoordSets; i++){ - this->texCoords[i] = (TexCoords*)data; - data += this->numVertices*sizeof(TexCoords); - } - - // MorphTarget data - // Bounding sphere is copied by realloc. - sz = sizeof(MorphTarget) + this->numVertices*sizeof(V3d); - if(this->flags & NORMALS) - sz += this->numVertices*sizeof(V3d); - - MorphTarget *mt = (MorphTarget*)rwResize(this->morphTargets, - sz*this->numMorphTargets, MEMDUR_EVENT | ID_GEOMETRY); - this->morphTargets = mt; - V3d *vdata = (V3d*)&mt[this->numMorphTargets]; - for(int32 i = 0; i < this->numMorphTargets; i++){ - mt->parent = this; - mt->vertices = nil; - mt->normals = nil; - if(this->numVertices){ - mt->vertices = vdata; - vdata += this->numVertices; - if(this->flags & NORMALS){ - mt->normals = vdata; - vdata += this->numVertices; - } - } - mt++; - } -} - -static int -isDegenerate(uint16 *idx) -{ - return idx[0] == idx[1] || - idx[0] == idx[2] || - idx[1] == idx[2]; -} - -// This functions assumes there is enough space allocated -// for triangles. Use MeshHeader::guessNumTriangles() and -// Geometry::allocateData() -void -Geometry::generateTriangles(int8 *adc) -{ - MeshHeader *header = this->meshHeader; - assert(header != nil); - - this->numTriangles = 0; - Mesh *m = header->getMeshes(); - int8 *adcbits = adc; - for(uint32 i = 0; i < header->numMeshes; i++){ - if(m->numIndices < 3){ - // shouldn't happen but it does - adcbits += m->numIndices; - m++; - continue; - } - if(header->flags == MeshHeader::TRISTRIP){ - for(uint32 j = 0; j < m->numIndices-2; j++){ - if(!(adc && adcbits[j+2]) && - !isDegenerate(&m->indices[j])) - this->numTriangles++; - } - }else - this->numTriangles += m->numIndices/3; - adcbits += m->numIndices; - m++; - } - - Triangle *tri = this->triangles; - m = header->getMeshes(); - adcbits = adc; - for(uint32 i = 0; i < header->numMeshes; i++){ - if(m->numIndices < 3){ - adcbits += m->numIndices; - m++; - continue; - } - int32 matid = this->matList.findIndex(m->material); - if(header->flags == MeshHeader::TRISTRIP) - for(uint32 j = 0; j < m->numIndices-2; j++){ - if((adc && adcbits[j+2]) || - isDegenerate(&m->indices[j])) - continue; - tri->v[0] = m->indices[j+0]; - tri->v[1] = m->indices[j+1 + (j%2)]; - tri->v[2] = m->indices[j+2 - (j%2)]; - tri->matId = matid; - tri++; - } - else - for(uint32 j = 0; j < m->numIndices-2; j+=3){ - tri->v[0] = m->indices[j+0]; - tri->v[1] = m->indices[j+1]; - tri->v[2] = m->indices[j+2]; - tri->matId = matid; - tri++; - } - adcbits += m->numIndices; - m++; - } -} - -static void -dumpMesh(Mesh *m) -{ - for(uint32 i = 0; i < m->numIndices-2; i++) -// if(i % 2) -// printf("%3d %3d %3d\n", -// m->indices[i+1], -// m->indices[i], -// m->indices[i+2]); -// else - printf("%d %d %d\n", - m->indices[i], - m->indices[i+1], - m->indices[i+2]); -} - -void -Geometry::buildMeshes(void) -{ - Triangle *tri; - Mesh *mesh; - - if(this->flags & Geometry::NATIVE){ - fprintf(stderr, "WARNING: trying Geometry::buildMeshes() on pre-instanced geometry\n"); - return; - } - - rwFree(this->meshHeader); - this->meshHeader = nil; - int32 numMeshes = this->matList.numMaterials; - if((this->flags & Geometry::TRISTRIP) == 0){ - int32 *numIndices = rwNewT(int32, numMeshes, - MEMDUR_FUNCTION | ID_GEOMETRY); - memset(numIndices, 0, numMeshes*sizeof(int32)); - - // count indices per mesh - tri = this->triangles; - for(int32 i = 0; i < this->numTriangles; i++){ - assert(tri->matId < numMeshes); - numIndices[tri->matId] += 3; - tri++; - } - // setup meshes - this->allocateMeshes(numMeshes, this->numTriangles*3, 0); - mesh = this->meshHeader->getMeshes(); - for(int32 i = 0; i < numMeshes; i++){ - mesh[i].material = this->matList.materials[i]; - mesh[i].numIndices = numIndices[i]; - } - this->meshHeader->setupIndices(); - rwFree(numIndices); - - // now fill in the indices - for(int32 i = 0; i < numMeshes; i++) - mesh[i].numIndices = 0; - tri = this->triangles; - for(int32 i = 0; i < this->numTriangles; i++){ - uint32 idx = mesh[tri->matId].numIndices; - mesh[tri->matId].indices[idx++] = tri->v[0]; - mesh[tri->matId].indices[idx++] = tri->v[1]; - mesh[tri->matId].indices[idx++] = tri->v[2]; - mesh[tri->matId].numIndices = idx; - tri++; - } - }else - this->buildTristrips(); -} - -/* The idea is that even in meshes where winding is not preserved - * every tristrip starts at an even vertex. So find the start of - * strips and insert duplicate vertices if necessary. */ -void -Geometry::correctTristripWinding(void) -{ - MeshHeader *header = this->meshHeader; - if(this->flags & NATIVE || header == nil || - header->flags != MeshHeader::TRISTRIP) - return; - this->meshHeader = nil; - // Allocate no indices, we realloc later - MeshHeader *newhead = this->allocateMeshes(header->numMeshes, 0, 1); - newhead->flags = header->flags; - /* get a temporary working buffer */ - uint16 *indices = rwNewT(uint16, header->totalIndices*2, - MEMDUR_FUNCTION | ID_GEOMETRY); - - Mesh *mesh = header->getMeshes(); - Mesh *newmesh = newhead->getMeshes(); - for(uint16 i = 0; i < header->numMeshes; i++){ - newmesh->numIndices = 0; - newmesh->indices = &indices[newhead->totalIndices]; - newmesh->material = mesh->material; - - bool inStrip = 0; - uint32 j; - for(j = 0; j < mesh->numIndices-2; j++){ - /* Duplicate vertices indicate end of strip */ - if(mesh->indices[j] == mesh->indices[j+1] || - mesh->indices[j+1] == mesh->indices[j+2]) - inStrip = 0; - else if(!inStrip){ - /* Entering strip now, - * make sure winding is correct */ - inStrip = 1; - if(newmesh->numIndices % 2){ - newmesh->indices[newmesh->numIndices] = - newmesh->indices[newmesh->numIndices-1]; - newmesh->numIndices++; - } - } - newmesh->indices[newmesh->numIndices++] = mesh->indices[j]; - } - for(; j < mesh->numIndices; j++) - newmesh->indices[newmesh->numIndices++] = mesh->indices[j]; - newhead->totalIndices += newmesh->numIndices; - - mesh++; - newmesh++; - } - rwFree(header); - // Now allocate indices and copy them - this->allocateMeshes(newhead->numMeshes, newhead->totalIndices, 0); - memcpy(this->meshHeader->getMeshes()->indices, indices, this->meshHeader->totalIndices*2); - rwFree(indices); -} - -void -Geometry::removeUnusedMaterials(void) -{ - if(this->meshHeader == nil) - return; - MeshHeader *mh = this->meshHeader; - Mesh *m = mh->getMeshes(); - for(uint32 i = 0; i < mh->numMeshes; i++) - if(m[i].indices == nil) - return; - - int32 *map = rwNewT(int32, this->matList.numMaterials, - MEMDUR_FUNCTION | ID_GEOMETRY); - Material **materials = rwNewT(Material*,this->matList.numMaterials, - MEMDUR_EVENT | ID_MATERIAL); - int32 numMaterials = 0; - /* Build new material list and map */ - for(uint32 i = 0; i < mh->numMeshes; i++){ - if(m[i].numIndices <= 0) - continue; - materials[numMaterials] = m[i].material; - m[i].material->addRef(); - int32 oldid = this->matList.findIndex(m[i].material); - map[oldid] = numMaterials; - numMaterials++; - } - for(int32 i = 0; i < this->matList.numMaterials; i++) - this->matList.materials[i]->destroy(); - rwFree(this->matList.materials); - this->matList.materials = materials; - this->matList.space = this->matList.numMaterials; - this->matList.numMaterials = numMaterials; - - /* Build new meshes */ - this->meshHeader = nil; - MeshHeader *newmh = this->allocateMeshes(numMaterials, mh->totalIndices, 0); - newmh->flags = mh->flags; - Mesh *newm = newmh->getMeshes(); - for(uint32 i = 0; i < mh->numMeshes; i++){ - if(m[i].numIndices <= 0) - continue; - newm->numIndices = m[i].numIndices; - newm->material = m[i].material; - newm++; - } - newmh->setupIndices(); - /* Copy indices */ - newm = newmh->getMeshes();; - for(uint32 i = 0; i < mh->numMeshes; i++){ - if(m[i].numIndices <= 0) - continue; - memcpy(newm->indices, m[i].indices, - m[i].numIndices*sizeof(*m[i].indices)); - newm++; - } - rwFree(mh); - - /* Remap triangle material IDs */ - for(int32 i = 0; i < this->numTriangles; i++) - this->triangles[i].matId = map[this->triangles[i].matId]; - rwFree(map); -} - -Sphere -MorphTarget::calculateBoundingSphere(void) const -{ - Sphere sphere; - V3d min = { 1000000.0f, 1000000.0f, 1000000.0f }; - V3d max = { -1000000.0f, -1000000.0f, -1000000.0f }; - V3d *v = this->vertices; - for(int32 j = 0; j < this->parent->numVertices; j++){ - if(v->x > max.x) max.x = v->x; - if(v->x < min.x) min.x = v->x; - if(v->y > max.y) max.y = v->y; - if(v->y < min.y) min.y = v->y; - if(v->z > max.z) max.z = v->z; - if(v->z < min.z) min.z = v->z; - v++; - } - sphere.center = scale(add(min, max), 1/2.0f); - max = sub(max, sphere.center); - sphere.radius = length(max); - return sphere; -} - - -// -// MaterialList -// -#undef PLUGIN_ID -#define PLUGIN_ID ID_MATERIAL - -void -MaterialList::init(void) -{ - this->materials = nil; - this->numMaterials = 0; - this->space = 0; -} - -void -MaterialList::deinit(void) -{ - if(this->materials){ - for(int32 i = 0; i < this->numMaterials; i++) - this->materials[i]->destroy(); - rwFree(this->materials); - } -} - -int32 -MaterialList::appendMaterial(Material *mat) -{ - Material **ml; - int32 space; - if(this->numMaterials >= this->space){ - space = this->space + 20; - if(this->materials) - ml = rwReallocT(Material*, this->materials, space, - MEMDUR_EVENT | ID_MATERIAL); - else - ml = rwMallocT(Material*, space, MEMDUR_EVENT | ID_MATERIAL); - if(ml == nil) - return -1; - this->space = space; - this->materials = ml; - } - this->materials[this->numMaterials++] = mat; - mat->addRef(); - return this->numMaterials-1; -} - -int32 -MaterialList::findIndex(Material *mat) -{ - for(int32 i = 0; i < this->numMaterials; i++) - if(this->materials[i] == mat) - return i; - return -1; -} - -MaterialList* -MaterialList::streamRead(Stream *stream, MaterialList *matlist) -{ - int32 *indices = nil; - int32 numMat; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - goto fail; - } - matlist->init(); - numMat = stream->readI32(); - if(numMat == 0) - return matlist; - matlist->materials = rwMallocT(Material*,numMat, MEMDUR_EVENT | ID_MATERIAL); - if(matlist->materials == nil) - goto fail; - matlist->space = numMat; - - indices = (int32*)rwMalloc(numMat*4, MEMDUR_FUNCTION | ID_MATERIAL); - stream->read32(indices, numMat*4); - - Material *m; - for(int32 i = 0; i < numMat; i++){ - if(indices[i] >= 0){ - m = matlist->materials[indices[i]]; - m->addRef(); - }else{ - if(!findChunk(stream, ID_MATERIAL, nil, nil)){ - RWERROR((ERR_CHUNK, "MATERIAL")); - goto fail; - } - m = Material::streamRead(stream); - if(m == nil) - goto fail; - } - matlist->appendMaterial(m); - m->destroy(); - } - rwFree(indices); - return matlist; -fail: - rwFree(indices); - matlist->deinit(); - return nil; -} - -bool -MaterialList::streamWrite(Stream *stream) -{ - uint32 size = this->streamGetSize(); - writeChunkHeader(stream, ID_MATLIST, size); - writeChunkHeader(stream, ID_STRUCT, 4 + this->numMaterials*4); - stream->writeI32(this->numMaterials); - - int32 idx; - for(int32 i = 0; i < this->numMaterials; i++){ - idx = -1; - for(int32 j = i-1; j >= 0; j--) - if(this->materials[i] == this->materials[j]){ - idx = j; - break; - } - stream->writeI32(idx); - } - for(int32 i = 0; i < this->numMaterials; i++){ - for(int32 j = i-1; j >= 0; j--) - if(this->materials[i] == this->materials[j]) - goto found; - this->materials[i]->streamWrite(stream); - found:; - } - return true; -} - -uint32 -MaterialList::streamGetSize(void) -{ - uint32 size = 12 + 4 + this->numMaterials*4; - for(int32 i = 0; i < this->numMaterials; i++){ - for(int32 j = i-1; j >= 0; j--) - if(this->materials[i] == this->materials[j]) - goto found; - size += 12 + this->materials[i]->streamGetSize(); - found:; - } - return size; -} - -// -// Material -// - -Material* -Material::create(void) -{ - Material *mat = (Material*)rwMalloc(s_plglist.size, MEMDUR_EVENT | ID_MATERIAL); - if(mat == nil){ - RWERROR((ERR_ALLOC, s_plglist.size)); - return nil; - } - numAllocated++; - mat->texture = nil; - memset(&mat->color, 0xFF, 4); - mat->surfaceProps = defaultSurfaceProps; - mat->pipeline = nil; - mat->refCount = 1; - s_plglist.construct(mat); - return mat; -} - -Material* -Material::clone(void) -{ - Material *mat = Material::create(); - if(mat == nil){ - RWERROR((ERR_ALLOC, s_plglist.size)); - return nil; - } - mat->color = this->color; - mat->surfaceProps = this->surfaceProps; - if(this->texture) - mat->setTexture(this->texture); - mat->pipeline = this->pipeline; - s_plglist.copy(mat, this); - return mat; -} - -void -Material::destroy(void) -{ - this->refCount--; - if(this->refCount <= 0){ - s_plglist.destruct(this); - if(this->texture) - this->texture->destroy(); - rwFree(this); - numAllocated--; - } -} - -void -Material::setTexture(Texture *tex) -{ - if(this->texture) - this->texture->destroy(); - if(tex) - tex->addRef(); - this->texture = tex; -} - -struct MatStreamData -{ - int32 flags; // unused according to RW - RGBA color; - int32 unused; - int32 textured; -}; - -static uint32 materialRights[2]; - -Material* -Material::streamRead(Stream *stream) -{ - uint32 length, version; - MatStreamData buf; - - if(!findChunk(stream, ID_STRUCT, nil, &version)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - stream->read8(&buf, sizeof(buf)); - RGBA col = buf.color; - memNative32(&buf, sizeof(buf)); - buf.color = col; - Material *mat = Material::create(); - if(mat == nil) - return nil; - mat->color = buf.color; - if(version < 0x30400) - mat->surfaceProps = defaultSurfaceProps; - else - stream->read32(&mat->surfaceProps, sizeof(SurfaceProperties)); - if(buf.textured){ - if(!findChunk(stream, ID_TEXTURE, &length, nil)){ - RWERROR((ERR_CHUNK, "TEXTURE")); - goto fail; - } - mat->texture = Texture::streamRead(stream); - } - - materialRights[0] = 0; - if(!s_plglist.streamRead(stream, mat)) - goto fail; - if(materialRights[0]) - s_plglist.assertRights(mat, materialRights[0], materialRights[1]); - return mat; - -fail: - mat->destroy(); - return nil; -} - -bool -Material::streamWrite(Stream *stream) -{ - MatStreamData buf; - - writeChunkHeader(stream, ID_MATERIAL, this->streamGetSize()); - writeChunkHeader(stream, ID_STRUCT, sizeof(MatStreamData) - + (rw::version >= 0x30400 ? 12 : 0)); - - buf.color = this->color; - buf.flags = 0; - buf.unused = 0; - buf.textured = this->texture != nil; - memLittle32(&buf, sizeof(buf)); - buf.color = this->color; - stream->write8(&buf, sizeof(buf)); - - if(rw::version >= 0x30400){ - float32 surfaceProps[3]; - surfaceProps[0] = this->surfaceProps.ambient; - surfaceProps[1] = this->surfaceProps.specular; - surfaceProps[2] = this->surfaceProps.diffuse; - stream->write32(surfaceProps, sizeof(surfaceProps)); - } - - if(this->texture) - this->texture->streamWrite(stream); - - s_plglist.streamWrite(stream, this); - return true; -} - -uint32 -Material::streamGetSize(void) -{ - uint32 size = 0; - size += 12 + sizeof(MatStreamData); - if(rw::version >= 0x30400) - size += 12; - if(this->texture) - size += 12 + this->texture->streamGetSize(); - size += 12 + s_plglist.streamGetSize(this); - return size; -} - -// Material Rights plugin - -static Stream* -readMaterialRights(Stream *stream, int32, void *, int32, int32) -{ - stream->read32(materialRights, 8); -// printf("materialrights: %X %X\n", materialRights[0], materialRights[1]); - return stream; -} - -static Stream* -writeMaterialRights(Stream *stream, int32, void *object, int32, int32) -{ - Material *material = (Material*)object; - uint32 buffer[2]; - buffer[0] = material->pipeline->pluginID; - buffer[1] = material->pipeline->pluginData; - stream->write32(buffer, 8); - return stream; -} - -static int32 -getSizeMaterialRights(void *object, int32, int32) -{ - Material *material = (Material*)object; - if(material->pipeline == nil || material->pipeline->pluginID == 0) - return 0; - return 8; -} - -void -registerMaterialRightsPlugin(void) -{ - Material::registerPlugin(0, ID_RIGHTTORENDER, nil, nil, nil); - Material::registerPluginStream(ID_RIGHTTORENDER, - readMaterialRights, - writeMaterialRights, - getSizeMaterialRights); -} - - -} diff --git a/vendor/librw/src/geoplg.cpp b/vendor/librw/src/geoplg.cpp deleted file mode 100644 index c1e1356..0000000 --- a/vendor/librw/src/geoplg.cpp +++ /dev/null @@ -1,339 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" -#include "rwanim.h" -#include "rwplugins.h" -#include "ps2/rwps2.h" -#include "ps2/rwps2plg.h" -#include "d3d/rwxbox.h" -#include "d3d/rwd3d8.h" -#include "d3d/rwd3d9.h" -#include "gl/rwwdgl.h" -#include "gl/rwgl3.h" - -#define PLUGIN_ID 2 - -namespace rw { - -static uint16 nextSerialNum = 1; - -// Mesh - -// Allocate a mesh header, meshes and optionally indices. -// If existing meshes already exist, retain their information. -MeshHeader* -Geometry::allocateMeshes(int32 numMeshes, uint32 numIndices, bool32 noIndices) -{ - uint32 sz; - MeshHeader *mh; - Mesh *m; - uint16 *indices; - int32 oldNumMeshes; - int32 i; - sz = sizeof(MeshHeader) + numMeshes*sizeof(Mesh); - if(!noIndices) - sz += numIndices*sizeof(uint16); - if(this->meshHeader){ - oldNumMeshes = this->meshHeader->numMeshes; - mh = (MeshHeader*)rwResize(this->meshHeader, sz, MEMDUR_EVENT | ID_GEOMETRY); - this->meshHeader = mh; - }else{ - oldNumMeshes = 0; - mh = (MeshHeader*)rwNew(sz, MEMDUR_EVENT | ID_GEOMETRY); - mh->flags = 0; - this->meshHeader = mh; - } - mh->numMeshes = numMeshes; - mh->serialNum = nextSerialNum++; - mh->totalIndices = numIndices; - m = mh->getMeshes(); - indices = (uint16*)&m[numMeshes]; - for(i = 0; i < mh->numMeshes; i++){ - // keep these - if(i >= oldNumMeshes){ - m->material = nil; - m->numIndices = 0; - } - // always init indices - if(noIndices) - m->indices = nil; - else{ - m->indices = indices; - indices += m->numIndices; - } - m++; - } - return mh; -} - -void -MeshHeader::setupIndices(void) -{ - int32 i; - uint16 *indices; - Mesh *m; - m = this->getMeshes(); - indices = m->indices; - // return if native - if(indices == nil) - return; - for(i = 0; i < this->numMeshes; i++){ - m->indices = indices; - indices += m->numIndices; - m++; - } -} - -struct MeshHeaderStream -{ - uint32 flags; - uint32 numMeshes; - uint32 totalIndices; -}; - -struct MeshStream -{ - uint32 numIndices; - int32 matIndex; -}; - -static Stream* -readMesh(Stream *stream, int32 len, void *object, int32, int32) -{ - MeshHeaderStream mhs; - MeshStream ms; - MeshHeader *mh; - Mesh *mesh; - int32 indbuf[256]; - uint16 *indices; - Geometry *geo = (Geometry*)object; - - stream->read32(&mhs, sizeof(MeshHeaderStream)); - // Have to do this dance for War Drum's meshes - bool32 hasData = len > int32(sizeof(MeshHeaderStream)+mhs.numMeshes*sizeof(MeshStream)); - assert(geo->meshHeader == nil); - geo->meshHeader = nil; - mh = geo->allocateMeshes(mhs.numMeshes, mhs.totalIndices, - geo->flags & Geometry::NATIVE && !hasData); - mh->flags = mhs.flags; - - mesh = mh->getMeshes(); - indices = mesh->indices; - for(uint32 i = 0; i < mh->numMeshes; i++){ - stream->read32(&ms, sizeof(MeshStream)); - mesh->numIndices = ms.numIndices; - mesh->material = geo->matList.materials[ms.matIndex]; - if(geo->flags & Geometry::NATIVE){ - // War Drum OpenGL stores uint16 indices here - if(hasData){ - mesh->indices = indices; - indices += mesh->numIndices; - stream->read16(mesh->indices, - mesh->numIndices*2); - } - }else{ - mesh->indices = indices; - indices += mesh->numIndices; - uint16 *ind = mesh->indices; - int32 numIndices = mesh->numIndices; - for(; numIndices > 0; numIndices -= 256){ - int32 n = numIndices < 256 ? numIndices : 256; - stream->read32(indbuf, n*4); - for(int32 j = 0; j < n; j++) - ind[j] = indbuf[j]; - ind += n; - } - } - mesh++; - } - return stream; -} - -static Stream* -writeMesh(Stream *stream, int32, void *object, int32, int32) -{ - MeshHeaderStream mhs; - MeshStream ms; - int32 indbuf[256]; - Geometry *geo = (Geometry*)object; - mhs.flags = geo->meshHeader->flags; - mhs.numMeshes = geo->meshHeader->numMeshes; - mhs.totalIndices = geo->meshHeader->totalIndices; - stream->write32(&mhs, sizeof(MeshHeaderStream)); - Mesh *mesh = geo->meshHeader->getMeshes(); - for(uint32 i = 0; i < geo->meshHeader->numMeshes; i++){ - ms.numIndices = mesh->numIndices; - ms.matIndex = geo->matList.findIndex(mesh->material); - stream->write32(&ms, sizeof(MeshStream)); - if(geo->flags & Geometry::NATIVE){ - assert(geo->instData != nil); - if(geo->instData->platform == PLATFORM_WDGL) - stream->write16(mesh->indices, - mesh->numIndices*2); - }else{ - uint16 *ind = mesh->indices; - int32 numIndices = mesh->numIndices; - for(; numIndices > 0; numIndices -= 256){ - int32 n = numIndices < 256 ? numIndices : 256; - for(int32 j = 0; j < n; j++) - indbuf[j] = ind[j]; - stream->write32(indbuf, n*4); - ind += n; - } - } - mesh++; - } - return stream; -} - -static int32 -getSizeMesh(void *object, int32, int32) -{ - Geometry *geo = (Geometry*)object; - if(geo->meshHeader == nil) - return -1; - int32 size = 12 + geo->meshHeader->numMeshes*8; - if(geo->flags & Geometry::NATIVE){ - assert(geo->instData != nil); - if(geo->instData->platform == PLATFORM_WDGL) - size += geo->meshHeader->totalIndices*2; - }else{ - size += geo->meshHeader->totalIndices*4; - } - return size; -} - -void -registerMeshPlugin(void) -{ - Geometry::registerPlugin(0, ID_MESH, nil, nil, nil); - Geometry::registerPluginStream(ID_MESH, readMesh, writeMesh, getSizeMesh); -} - -// Returns the maximum number of triangles. Just so -// we can allocate enough before instancing. This does not -// take into account degerate triangles or ADC bits as -// we don't look at the data. -uint32 -MeshHeader::guessNumTriangles(void) -{ - if(this->flags == MeshHeader::TRISTRIP) - return this->totalIndices - 2*this->numMeshes; - else - return this->totalIndices/3; -} - -// Native Data - -static void* -destroyNativeData(void *object, int32 offset, int32 size) -{ - Geometry *geometry = (Geometry*)object; - if(geometry->instData == nil) - return object; - if(geometry->instData->platform == PLATFORM_PS2) - return ps2::destroyNativeData(object, offset, size); - if(geometry->instData->platform == PLATFORM_WDGL) - return wdgl::destroyNativeData(object, offset, size); - if(geometry->instData->platform == PLATFORM_XBOX) - return xbox::destroyNativeData(object, offset, size); - if(geometry->instData->platform == PLATFORM_D3D8) - return d3d8::destroyNativeData(object, offset, size); - if(geometry->instData->platform == PLATFORM_D3D9) - return d3d9::destroyNativeData(object, offset, size); - if(geometry->instData->platform == PLATFORM_GL3) - return gl3::destroyNativeData(object, offset, size); - return object; -} - -static Stream* -readNativeData(Stream *stream, int32 len, void *object, int32 o, int32 s) -{ - ChunkHeaderInfo header; - uint32 libid; - uint32 platform; - // ugly hack to find out platform - stream->seek(-4); - libid = stream->readU32(); - readChunkHeaderInfo(stream, &header); - if(header.type == ID_STRUCT && - libraryIDPack(header.version, header.build) == libid){ - platform = stream->readU32(); - stream->seek(-16); - if(platform == PLATFORM_PS2) - return ps2::readNativeData(stream, len, object, o, s); - else if(platform == PLATFORM_XBOX) - return xbox::readNativeData(stream, len, object, o, s); - else if(platform == PLATFORM_D3D8) - return d3d8::readNativeData(stream, len, object, o, s); - else if(platform == PLATFORM_D3D9) - return d3d9::readNativeData(stream, len, object, o, s); - else{ - fprintf(stderr, "unknown platform %d\n", platform); - stream->seek(len); - } - }else{ - stream->seek(-12); - wdgl::readNativeData(stream, len, object, o, s); - } - return stream; -} - -static Stream* -writeNativeData(Stream *stream, int32 len, void *object, int32 o, int32 s) -{ - Geometry *geometry = (Geometry*)object; - if(geometry->instData == nil) - return stream; - if(geometry->instData->platform == PLATFORM_PS2) - return ps2::writeNativeData(stream, len, object, o, s); - else if(geometry->instData->platform == PLATFORM_WDGL) - return wdgl::writeNativeData(stream, len, object, o, s); - else if(geometry->instData->platform == PLATFORM_XBOX) - return xbox::writeNativeData(stream, len, object, o, s); - else if(geometry->instData->platform == PLATFORM_D3D8) - return d3d8::writeNativeData(stream, len, object, o, s); - else if(geometry->instData->platform == PLATFORM_D3D9) - return d3d9::writeNativeData(stream, len, object, o, s); - return stream; -} - -static int32 -getSizeNativeData(void *object, int32 offset, int32 size) -{ - Geometry *geometry = (Geometry*)object; - if(geometry->instData == nil) - return 0; - if(geometry->instData->platform == PLATFORM_PS2) - return ps2::getSizeNativeData(object, offset, size); - else if(geometry->instData->platform == PLATFORM_WDGL) - return wdgl::getSizeNativeData(object, offset, size); - else if(geometry->instData->platform == PLATFORM_XBOX) - return xbox::getSizeNativeData(object, offset, size); - else if(geometry->instData->platform == PLATFORM_D3D8) - return d3d8::getSizeNativeData(object, offset, size); - else if(geometry->instData->platform == PLATFORM_D3D9) - return d3d9::getSizeNativeData(object, offset, size); - return 0; -} - -void -registerNativeDataPlugin(void) -{ - Geometry::registerPlugin(0, ID_NATIVEDATA, - nil, destroyNativeData, nil); - Geometry::registerPluginStream(ID_NATIVEDATA, - readNativeData, - writeNativeData, - getSizeNativeData); -} - -} diff --git a/vendor/librw/src/gl/gl3.cpp b/vendor/librw/src/gl/gl3.cpp deleted file mode 100644 index b876fc9..0000000 --- a/vendor/librw/src/gl/gl3.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" - -#include "rwgl3.h" -#include "rwgl3shader.h" - -#include "rwgl3impl.h" - -namespace rw { -namespace gl3 { - -// TODO: make some of these things platform-independent - -static void* -driverOpen(void *o, int32, int32) -{ -#ifdef RW_OPENGL - engine->driver[PLATFORM_GL3]->defaultPipeline = makeDefaultPipeline(); -#endif - engine->driver[PLATFORM_GL3]->rasterNativeOffset = nativeRasterOffset; - engine->driver[PLATFORM_GL3]->rasterCreate = rasterCreate; - engine->driver[PLATFORM_GL3]->rasterLock = rasterLock; - engine->driver[PLATFORM_GL3]->rasterUnlock = rasterUnlock; - engine->driver[PLATFORM_GL3]->rasterNumLevels = rasterNumLevels; - engine->driver[PLATFORM_GL3]->imageFindRasterFormat = imageFindRasterFormat; - engine->driver[PLATFORM_GL3]->rasterFromImage = rasterFromImage; - engine->driver[PLATFORM_GL3]->rasterToImage = rasterToImage; - - return o; -} - -static void* -driverClose(void *o, int32, int32) -{ - return o; -} - -void -registerPlatformPlugins(void) -{ - Driver::registerPlugin(PLATFORM_GL3, 0, PLATFORM_GL3, - driverOpen, driverClose); - registerNativeRaster(); -} - -} -} diff --git a/vendor/librw/src/gl/gl3device.cpp b/vendor/librw/src/gl/gl3device.cpp deleted file mode 100644 index b1036c0..0000000 --- a/vendor/librw/src/gl/gl3device.cpp +++ /dev/null @@ -1,2083 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwrender.h" -#include "../rwengine.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#ifdef RW_OPENGL - -#include "rwgl3.h" -#include "rwgl3shader.h" -#include "rwgl3impl.h" - -#define PLUGIN_ID 0 - -namespace rw { -namespace gl3 { - -GlGlobals glGlobals; - -Gl3Caps gl3Caps; -// terrible hack for GLES -bool32 needToReadBackTextures; - -int32 alphaFunc; -float32 alphaRef; - -struct UniformState -{ - float32 alphaRefLow; - float32 alphaRefHigh; - int32 pad[2]; - - float32 fogStart; - float32 fogEnd; - float32 fogRange; - float32 fogDisable; - - RGBAf fogColor; -}; - -struct UniformScene -{ - float32 proj[16]; - float32 view[16]; -}; - -#define MAX_LIGHTS 8 - -struct UniformObject -{ - RawMatrix world; - RGBAf ambLight; - struct { - float type; - float radius; - float minusCosAngle; - float hardSpot; - } lightParams[MAX_LIGHTS]; - V4d lightPosition[MAX_LIGHTS]; - V4d lightDirection[MAX_LIGHTS]; - RGBAf lightColor[MAX_LIGHTS]; -}; - -struct GLShaderState -{ - RGBA matColor; - SurfaceProperties surfProps; - float extraSurfProp; -}; - -const char *shaderDecl120 = -"#version 120\n" -"#define GL2\n" -"#define texture texture2D\n" -"#define VSIN(index) attribute\n" -"#define VSOUT varying\n" -"#define FSIN varying\n" -"#define FRAGCOLOR(c) (gl_FragColor = c)\n"; -const char *shaderDecl330 = -"#version 330\n" -"#define VSIN(index) layout(location = index) in\n" -"#define VSOUT out\n" -"#define FSIN in\n" -"#define FRAGCOLOR(c) (fragColor = c)\n"; -const char *shaderDecl100es = -"#version 100\n" -"#define GL2\n" -"#define texture texture2D\n" -"#define VSIN(index) attribute\n" -"#define VSOUT varying\n" -"#define FSIN varying\n" -"#define FRAGCOLOR(c) (gl_FragColor = c)\n" -"precision highp float;\n" -"precision highp int;\n"; -const char *shaderDecl310es = -"#version 310 es\n" -"#define VSIN(index) layout(location = index) in\n" -"#define VSOUT out\n" -"#define FSIN in\n" -"#define FRAGCOLOR(c) (fragColor = c)\n" -"precision highp float;\n" -"precision highp int;\n"; - -const char *shaderDecl; - -// this needs a define in the shaders as well! -//#define RW_GL_USE_UBOS - -static GLuint vao; -#ifdef RW_GL_USE_UBOS -static GLuint ubo_state, ubo_scene, ubo_object; -#endif -static GLuint whitetex; -static UniformState uniformState; -static UniformScene uniformScene; -static UniformObject uniformObject; -static GLShaderState shaderState; - -#ifndef RW_GL_USE_UBOS -// State -int32 u_alphaRef; -int32 u_fogData; -//int32 u_fogStart; -//int32 u_fogEnd; -//int32 u_fogRange; -//int32 u_fogDisable; -int32 u_fogColor; - -// Scene -int32 u_proj; -int32 u_view; - -// Object -int32 u_world; -int32 u_ambLight; -int32 u_lightParams; -int32 u_lightPosition; -int32 u_lightDirection; -int32 u_lightColor; -#endif - -int32 u_matColor; -int32 u_surfProps; - -Shader *defaultShader; - -static bool32 stateDirty = 1; -static bool32 sceneDirty = 1; -static bool32 objectDirty = 1; - -struct RwRasterStateCache { - Raster *raster; - Texture::Addressing addressingU; - Texture::Addressing addressingV; - Texture::FilterMode filter; -}; - -#define MAXNUMSTAGES 8 - -// cached RW render states -struct RwStateCache { - bool32 vertexAlpha; - uint32 alphaTestEnable; - uint32 alphaFunc; - bool32 textureAlpha; - bool32 blendEnable; - uint32 srcblend, destblend; - uint32 zwrite; - uint32 ztest; - uint32 cullmode; - uint32 stencilenable; - uint32 stencilpass; - uint32 stencilfail; - uint32 stencilzfail; - uint32 stencilfunc; - uint32 stencilref; - uint32 stencilmask; - uint32 stencilwritemask; - uint32 fogEnable; - float32 fogStart; - float32 fogEnd; - - // emulation of PS2 GS - bool32 gsalpha; - uint32 gsalpharef; - - RwRasterStateCache texstage[MAXNUMSTAGES]; -}; -static RwStateCache rwStateCache; - -enum -{ - // actual gl states - RWGL_BLEND, - RWGL_SRCBLEND, - RWGL_DESTBLEND, - RWGL_DEPTHTEST, - RWGL_DEPTHFUNC, - RWGL_DEPTHMASK, - RWGL_CULL, - RWGL_CULLFACE, - RWGL_STENCIL, - RWGL_STENCILFUNC, - RWGL_STENCILFAIL, - RWGL_STENCILZFAIL, - RWGL_STENCILPASS, - RWGL_STENCILREF, - RWGL_STENCILMASK, - RWGL_STENCILWRITEMASK, - - // uniforms - RWGL_ALPHAFUNC, - RWGL_ALPHAREF, - RWGL_FOG, - RWGL_FOGSTART, - RWGL_FOGEND, - RWGL_FOGCOLOR, - - RWGL_NUM_STATES -}; -static bool uniformStateDirty[RWGL_NUM_STATES]; - -struct GlState { - bool32 blendEnable; - uint32 srcblend, destblend; - - bool32 depthTest; - uint32 depthFunc; - - uint32 depthMask; - - bool32 cullEnable; - uint32 cullFace; - - bool32 stencilEnable; - // glStencilFunc - uint32 stencilFunc; - uint32 stencilRef; - uint32 stencilMask; - // glStencilOp - uint32 stencilPass; - uint32 stencilFail; - uint32 stencilZFail; - // glStencilMask - uint32 stencilWriteMask; -}; -static GlState curGlState, oldGlState; - -static int32 activeTexture; -static uint32 boundTexture[MAXNUMSTAGES]; - -static uint32 currentFramebuffer; - -static uint32 blendMap[] = { - GL_ZERO, // actually invalid - GL_ZERO, - GL_ONE, - GL_SRC_COLOR, - GL_ONE_MINUS_SRC_COLOR, - GL_SRC_ALPHA, - GL_ONE_MINUS_SRC_ALPHA, - GL_DST_ALPHA, - GL_ONE_MINUS_DST_ALPHA, - GL_DST_COLOR, - GL_ONE_MINUS_DST_COLOR, - GL_SRC_ALPHA_SATURATE, -}; - -static uint32 stencilOpMap[] = { - GL_KEEP, // actually invalid - GL_KEEP, - GL_ZERO, - GL_REPLACE, - GL_INCR, - GL_DECR, - GL_INVERT, - GL_INCR_WRAP, - GL_DECR_WRAP -}; - -static uint32 stencilFuncMap[] = { - GL_NEVER, // actually invalid - GL_NEVER, - GL_LESS, - GL_EQUAL, - GL_LEQUAL, - GL_GREATER, - GL_NOTEQUAL, - GL_GEQUAL, - GL_ALWAYS -}; - -static float maxAnisotropy; - -/* - * GL state cache - */ - -void -setGlRenderState(uint32 state, uint32 value) -{ - switch(state){ - case RWGL_BLEND: curGlState.blendEnable = value; break; - case RWGL_SRCBLEND: curGlState.srcblend = value; break; - case RWGL_DESTBLEND: curGlState.destblend = value; break; - case RWGL_DEPTHTEST: curGlState.depthTest = value; break; - case RWGL_DEPTHFUNC: curGlState.depthFunc = value; break; - case RWGL_DEPTHMASK: curGlState.depthMask = value; break; - case RWGL_CULL: curGlState.cullEnable = value; break; - case RWGL_CULLFACE: curGlState.cullFace = value; break; - case RWGL_STENCIL: curGlState.stencilEnable = value; break; - case RWGL_STENCILFUNC: curGlState.stencilFunc = value; break; - case RWGL_STENCILFAIL: curGlState.stencilFail = value; break; - case RWGL_STENCILZFAIL: curGlState.stencilZFail = value; break; - case RWGL_STENCILPASS: curGlState.stencilPass = value; break; - case RWGL_STENCILREF: curGlState.stencilRef = value; break; - case RWGL_STENCILMASK: curGlState.stencilMask = value; break; - case RWGL_STENCILWRITEMASK: curGlState.stencilWriteMask = value; break; - } -} - -void -flushGlRenderState(void) -{ - if(oldGlState.blendEnable != curGlState.blendEnable){ - oldGlState.blendEnable = curGlState.blendEnable; - (oldGlState.blendEnable ? glEnable : glDisable)(GL_BLEND); - } - - if(oldGlState.srcblend != curGlState.srcblend || - oldGlState.destblend != curGlState.destblend){ - oldGlState.srcblend = curGlState.srcblend; - oldGlState.destblend = curGlState.destblend; - glBlendFunc(oldGlState.srcblend, oldGlState.destblend); - } - - if(oldGlState.depthTest != curGlState.depthTest){ - oldGlState.depthTest = curGlState.depthTest; - (oldGlState.depthTest ? glEnable : glDisable)(GL_DEPTH_TEST); - } - if(oldGlState.depthFunc != curGlState.depthFunc){ - oldGlState.depthFunc = curGlState.depthFunc; - glDepthFunc(oldGlState.depthFunc); - } - if(oldGlState.depthMask != curGlState.depthMask){ - oldGlState.depthMask = curGlState.depthMask; - glDepthMask(oldGlState.depthMask); - } - - if(oldGlState.stencilEnable != curGlState.stencilEnable){ - oldGlState.stencilEnable = curGlState.stencilEnable; - (oldGlState.stencilEnable ? glEnable : glDisable)(GL_STENCIL_TEST); - } - if(oldGlState.stencilFunc != curGlState.stencilFunc || - oldGlState.stencilRef != curGlState.stencilRef || - oldGlState.stencilMask != curGlState.stencilMask){ - oldGlState.stencilFunc = curGlState.stencilFunc; - oldGlState.stencilRef = curGlState.stencilRef; - oldGlState.stencilMask = curGlState.stencilMask; - glStencilFunc(oldGlState.stencilFunc, oldGlState.stencilRef, oldGlState.stencilMask); - } - if(oldGlState.stencilPass != curGlState.stencilPass || - oldGlState.stencilFail != curGlState.stencilFail || - oldGlState.stencilZFail != curGlState.stencilZFail){ - oldGlState.stencilPass = curGlState.stencilPass; - oldGlState.stencilFail = curGlState.stencilFail; - oldGlState.stencilZFail = curGlState.stencilZFail; - glStencilOp(oldGlState.stencilFail, oldGlState.stencilZFail, oldGlState.stencilPass); - } - if(oldGlState.stencilWriteMask != curGlState.stencilWriteMask){ - oldGlState.stencilWriteMask = curGlState.stencilWriteMask; - glStencilMask(oldGlState.stencilWriteMask); - } - - if(oldGlState.cullEnable != curGlState.cullEnable){ - oldGlState.cullEnable = curGlState.cullEnable; - (oldGlState.cullEnable ? glEnable : glDisable)(GL_CULL_FACE); - } - if(oldGlState.cullFace != curGlState.cullFace){ - oldGlState.cullFace = curGlState.cullFace; - glCullFace(oldGlState.cullFace); - } -} - - - -void -setAlphaBlend(bool32 enable) -{ - if(rwStateCache.blendEnable != enable){ - rwStateCache.blendEnable = enable; - setGlRenderState(RWGL_BLEND, enable); - } -} - -bool32 -getAlphaBlend(void) -{ - return rwStateCache.blendEnable; -} - -static void -setDepthTest(bool32 enable) -{ - if(rwStateCache.ztest != enable){ - rwStateCache.ztest = enable; - if(rwStateCache.zwrite && !enable){ - // If we still want to write, enable but set mode to always - setGlRenderState(RWGL_DEPTHTEST, true); - setGlRenderState(RWGL_DEPTHFUNC, GL_ALWAYS); - }else{ - setGlRenderState(RWGL_DEPTHTEST, rwStateCache.ztest); - setGlRenderState(RWGL_DEPTHFUNC, GL_LEQUAL); - } - } -} - -static void -setDepthWrite(bool32 enable) -{ - enable = enable ? GL_TRUE : GL_FALSE; - if(rwStateCache.zwrite != enable){ - rwStateCache.zwrite = enable; - if(enable && !rwStateCache.ztest){ - // Have to switch on ztest so writing can work - setGlRenderState(RWGL_DEPTHTEST, true); - setGlRenderState(RWGL_DEPTHFUNC, GL_ALWAYS); - } - setGlRenderState(RWGL_DEPTHMASK, rwStateCache.zwrite); - } -} - -static void -setAlphaTest(bool32 enable) -{ - uint32 shaderfunc; - if(rwStateCache.alphaTestEnable != enable){ - rwStateCache.alphaTestEnable = enable; - shaderfunc = rwStateCache.alphaTestEnable ? rwStateCache.alphaFunc : ALPHAALWAYS; - if(alphaFunc != shaderfunc){ - alphaFunc = shaderfunc; - uniformStateDirty[RWGL_ALPHAFUNC] = true; - stateDirty = 1; - } - } -} - -static void -setAlphaTestFunction(uint32 function) -{ - uint32 shaderfunc; - if(rwStateCache.alphaFunc != function){ - rwStateCache.alphaFunc = function; - shaderfunc = rwStateCache.alphaTestEnable ? rwStateCache.alphaFunc : ALPHAALWAYS; - if(alphaFunc != shaderfunc){ - alphaFunc = shaderfunc; - uniformStateDirty[RWGL_ALPHAFUNC] = true; - stateDirty = 1; - } - } -} - -static void -setVertexAlpha(bool32 enable) -{ - if(rwStateCache.vertexAlpha != enable){ - if(!rwStateCache.textureAlpha){ - setAlphaBlend(enable); - setAlphaTest(enable); - } - rwStateCache.vertexAlpha = enable; - } -} - -static void -setActiveTexture(int32 n) -{ - if(activeTexture != n){ - activeTexture = n; - glActiveTexture(GL_TEXTURE0+n); - } -} - -uint32 -bindTexture(uint32 texid) -{ - uint32 prev = boundTexture[activeTexture]; - boundTexture[activeTexture] = texid; - glBindTexture(GL_TEXTURE_2D, texid); - return prev; -} - -void -bindFramebuffer(uint32 fbo) -{ - if(currentFramebuffer != fbo){ - glBindFramebuffer(GL_FRAMEBUFFER, fbo); - currentFramebuffer = fbo; - } -} - -static GLint filterConvMap_NoMIP[] = { - 0, GL_NEAREST, GL_LINEAR, - GL_NEAREST, GL_LINEAR, - GL_NEAREST, GL_LINEAR -}; -static GLint filterConvMap_MIP[] = { - 0, GL_NEAREST, GL_LINEAR, - GL_NEAREST_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_NEAREST, - GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_LINEAR -}; - -static GLint addressConvMap[] = { - 0, GL_REPEAT, GL_MIRRORED_REPEAT, - GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER -}; - -static void -setFilterMode(uint32 stage, int32 filter, int32 maxAniso = 1) -{ - if(rwStateCache.texstage[stage].filter != (Texture::FilterMode)filter){ - rwStateCache.texstage[stage].filter = (Texture::FilterMode)filter; - Raster *raster = rwStateCache.texstage[stage].raster; - if(raster){ - Gl3Raster *natras = PLUGINOFFSET(Gl3Raster, rwStateCache.texstage[stage].raster, nativeRasterOffset); - if(natras->filterMode != filter){ - setActiveTexture(stage); - if(natras->autogenMipmap || natras->numLevels > 1){ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterConvMap_MIP[filter]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterConvMap_MIP[filter]); - }else{ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterConvMap_NoMIP[filter]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterConvMap_NoMIP[filter]); - } - natras->filterMode = filter; - } - if(natras->maxAnisotropy != maxAniso){ - setActiveTexture(stage); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)maxAniso); - natras->maxAnisotropy = maxAniso; - } - } - } -} - -static void -setAddressU(uint32 stage, int32 addressing) -{ - if(rwStateCache.texstage[stage].addressingU != (Texture::Addressing)addressing){ - rwStateCache.texstage[stage].addressingU = (Texture::Addressing)addressing; - Raster *raster = rwStateCache.texstage[stage].raster; - if(raster){ - Gl3Raster *natras = PLUGINOFFSET(Gl3Raster, raster, nativeRasterOffset); - if(natras->addressU == addressing){ - setActiveTexture(stage); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, addressConvMap[addressing]); - natras->addressU = addressing; - } - } - } -} - -static void -setAddressV(uint32 stage, int32 addressing) -{ - if(rwStateCache.texstage[stage].addressingV != (Texture::Addressing)addressing){ - rwStateCache.texstage[stage].addressingV = (Texture::Addressing)addressing; - Raster *raster = rwStateCache.texstage[stage].raster; - if(raster){ - Gl3Raster *natras = PLUGINOFFSET(Gl3Raster, rwStateCache.texstage[stage].raster, nativeRasterOffset); - if(natras->addressV == addressing){ - setActiveTexture(stage); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, addressConvMap[addressing]); - natras->addressV = addressing; - } - } - } -} - -static void -setRasterStageOnly(uint32 stage, Raster *raster) -{ - bool32 alpha; - if(raster != rwStateCache.texstage[stage].raster){ - rwStateCache.texstage[stage].raster = raster; - setActiveTexture(stage); - if(raster){ - assert(raster->platform == PLATFORM_GL3); - Gl3Raster *natras = PLUGINOFFSET(Gl3Raster, raster, nativeRasterOffset); - bindTexture(natras->texid); - - rwStateCache.texstage[stage].filter = (rw::Texture::FilterMode)natras->filterMode; - rwStateCache.texstage[stage].addressingU = (rw::Texture::Addressing)natras->addressU; - rwStateCache.texstage[stage].addressingV = (rw::Texture::Addressing)natras->addressV; - - alpha = natras->hasAlpha; - }else{ - bindTexture(whitetex); - alpha = 0; - } - - if(stage == 0){ - if(alpha != rwStateCache.textureAlpha){ - rwStateCache.textureAlpha = alpha; - if(!rwStateCache.vertexAlpha){ - setAlphaBlend(alpha); - setAlphaTest(alpha); - } - } - } - } -} - -static void -setRasterStage(uint32 stage, Raster *raster) -{ - bool32 alpha; - if(raster != rwStateCache.texstage[stage].raster){ - rwStateCache.texstage[stage].raster = raster; - setActiveTexture(stage); - if(raster){ - assert(raster->platform == PLATFORM_GL3); - Gl3Raster *natras = PLUGINOFFSET(Gl3Raster, raster, nativeRasterOffset); - bindTexture(natras->texid); - uint32 filter = rwStateCache.texstage[stage].filter; - uint32 addrU = rwStateCache.texstage[stage].addressingU; - uint32 addrV = rwStateCache.texstage[stage].addressingV; - if(natras->filterMode != filter){ - if(natras->autogenMipmap || natras->numLevels > 1){ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterConvMap_MIP[filter]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterConvMap_MIP[filter]); - }else{ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterConvMap_NoMIP[filter]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterConvMap_NoMIP[filter]); - } - natras->filterMode = filter; - } - if(natras->addressU != addrU){ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, addressConvMap[addrU]); - natras->addressU = addrU; - } - if(natras->addressV != addrV){ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, addressConvMap[addrV]); - natras->addressV = addrV; - } - alpha = natras->hasAlpha; - }else{ - bindTexture(whitetex); - alpha = 0; - } - - if(stage == 0){ - if(alpha != rwStateCache.textureAlpha){ - rwStateCache.textureAlpha = alpha; - if(!rwStateCache.vertexAlpha){ - setAlphaBlend(alpha); - setAlphaTest(alpha); - } - } - } - } -} - -void -setTexture(int32 stage, Texture *tex) -{ - if(tex == nil || tex->raster == nil){ - setRasterStage(stage, nil); - return; - } - setRasterStageOnly(stage, tex->raster); - setFilterMode(stage, tex->getFilter(), tex->getMaxAnisotropy()); - setAddressU(stage, tex->getAddressU()); - setAddressV(stage, tex->getAddressV()); -} - -static void -setRenderState(int32 state, void *pvalue) -{ - uint32 value = (uint32)(uintptr)pvalue; - switch(state){ - case TEXTURERASTER: - setRasterStage(0, (Raster*)pvalue); - break; - case TEXTUREADDRESS: - setAddressU(0, value); - setAddressV(0, value); - break; - case TEXTUREADDRESSU: - setAddressU(0, value); - break; - case TEXTUREADDRESSV: - setAddressV(0, value); - break; - case TEXTUREFILTER: - setFilterMode(0, value); - break; - case VERTEXALPHA: - setVertexAlpha(value); - break; - case SRCBLEND: - if(rwStateCache.srcblend != value){ - rwStateCache.srcblend = value; - setGlRenderState(RWGL_SRCBLEND, blendMap[rwStateCache.srcblend]); - } - break; - case DESTBLEND: - if(rwStateCache.destblend != value){ - rwStateCache.destblend = value; - setGlRenderState(RWGL_DESTBLEND, blendMap[rwStateCache.destblend]); - } - break; - case ZTESTENABLE: - setDepthTest(value); - break; - case ZWRITEENABLE: - setDepthWrite(value); - break; - case FOGENABLE: - if(rwStateCache.fogEnable != value){ - rwStateCache.fogEnable = value; - uniformStateDirty[RWGL_FOG] = true; - stateDirty = 1; - } - break; - case FOGCOLOR: - // no cache check here...too lazy - RGBA c; - c.red = value; - c.green = value>>8; - c.blue = value>>16; - c.alpha = value>>24; - convColor(&uniformState.fogColor, &c); - uniformStateDirty[RWGL_FOGCOLOR] = true; - stateDirty = 1; - break; - case CULLMODE: - if(rwStateCache.cullmode != value){ - rwStateCache.cullmode = value; - if(rwStateCache.cullmode == CULLNONE) - setGlRenderState(RWGL_CULL, false); - else{ - setGlRenderState(RWGL_CULL, true); - setGlRenderState(RWGL_CULLFACE, rwStateCache.cullmode == CULLBACK ? GL_BACK : GL_FRONT); - } - } - break; - - case STENCILENABLE: - if(rwStateCache.stencilenable != value){ - rwStateCache.stencilenable = value; - setGlRenderState(RWGL_STENCIL, value); - } - break; - case STENCILFAIL: - if(rwStateCache.stencilfail != value){ - rwStateCache.stencilfail = value; - setGlRenderState(RWGL_STENCILFAIL, stencilOpMap[value]); - } - break; - case STENCILZFAIL: - if(rwStateCache.stencilzfail != value){ - rwStateCache.stencilzfail = value; - setGlRenderState(RWGL_STENCILZFAIL, stencilOpMap[value]); - } - break; - case STENCILPASS: - if(rwStateCache.stencilpass != value){ - rwStateCache.stencilpass = value; - setGlRenderState(RWGL_STENCILPASS, stencilOpMap[value]); - } - break; - case STENCILFUNCTION: - if(rwStateCache.stencilfunc != value){ - rwStateCache.stencilfunc = value; - setGlRenderState(RWGL_STENCILFUNC, stencilFuncMap[value]); - } - break; - case STENCILFUNCTIONREF: - if(rwStateCache.stencilref != value){ - rwStateCache.stencilref = value; - setGlRenderState(RWGL_STENCILREF, value); - } - break; - case STENCILFUNCTIONMASK: - if(rwStateCache.stencilmask != value){ - rwStateCache.stencilmask = value; - setGlRenderState(RWGL_STENCILMASK, value); - } - break; - case STENCILFUNCTIONWRITEMASK: - if(rwStateCache.stencilwritemask != value){ - rwStateCache.stencilwritemask = value; - setGlRenderState(RWGL_STENCILWRITEMASK, value); - } - break; - - case ALPHATESTFUNC: - setAlphaTestFunction(value); - break; - case ALPHATESTREF: - if(alphaRef != value/255.0f){ - alphaRef = value/255.0f; - uniformStateDirty[RWGL_ALPHAREF] = true; - stateDirty = 1; - } - break; - case GSALPHATEST: - rwStateCache.gsalpha = value; - break; - case GSALPHATESTREF: - rwStateCache.gsalpharef = value; - } -} - -static void* -getRenderState(int32 state) -{ - uint32 val; - RGBA rgba; - switch(state){ - case TEXTURERASTER: - return rwStateCache.texstage[0].raster; - case TEXTUREADDRESS: - if(rwStateCache.texstage[0].addressingU == rwStateCache.texstage[0].addressingV) - val = rwStateCache.texstage[0].addressingU; - else - val = 0; // invalid - break; - case TEXTUREADDRESSU: - val = rwStateCache.texstage[0].addressingU; - break; - case TEXTUREADDRESSV: - val = rwStateCache.texstage[0].addressingV; - break; - case TEXTUREFILTER: - val = rwStateCache.texstage[0].filter; - break; - - case VERTEXALPHA: - val = rwStateCache.vertexAlpha; - break; - case SRCBLEND: - val = rwStateCache.srcblend; - break; - case DESTBLEND: - val = rwStateCache.destblend; - break; - case ZTESTENABLE: - val = rwStateCache.ztest; - break; - case ZWRITEENABLE: - val = rwStateCache.zwrite; - break; - case FOGENABLE: - val = rwStateCache.fogEnable; - break; - case FOGCOLOR: - convColor(&rgba, &uniformState.fogColor); - val = RWRGBAINT(rgba.red, rgba.green, rgba.blue, rgba.alpha); - break; - case CULLMODE: - val = rwStateCache.cullmode; - break; - - case STENCILENABLE: - val = rwStateCache.stencilenable; - break; - case STENCILFAIL: - val = rwStateCache.stencilfail; - break; - case STENCILZFAIL: - val = rwStateCache.stencilzfail; - break; - case STENCILPASS: - val = rwStateCache.stencilpass; - break; - case STENCILFUNCTION: - val = rwStateCache.stencilfunc; - break; - case STENCILFUNCTIONREF: - val = rwStateCache.stencilref; - break; - case STENCILFUNCTIONMASK: - val = rwStateCache.stencilmask; - break; - case STENCILFUNCTIONWRITEMASK: - val = rwStateCache.stencilwritemask; - break; - - case ALPHATESTFUNC: - val = rwStateCache.alphaFunc; - break; - case ALPHATESTREF: - val = (uint32)(alphaRef*255.0f); - break; - case GSALPHATEST: - val = rwStateCache.gsalpha; - break; - case GSALPHATESTREF: - val = rwStateCache.gsalpharef; - break; - default: - val = 0; - } - return (void*)(uintptr)val; -} - -static void -resetRenderState(void) -{ - rwStateCache.alphaFunc = ALPHAGREATEREQUAL; - alphaFunc = 0; - alphaRef = 10.0f/255.0f; - uniformState.fogDisable = 1.0f; - uniformState.fogStart = 0.0f; - uniformState.fogEnd = 0.0f; - uniformState.fogRange = 0.0f; - uniformState.fogColor = { 1.0f, 1.0f, 1.0f, 1.0f }; - rwStateCache.gsalpha = 0; - rwStateCache.gsalpharef = 128; - stateDirty = 1; - - rwStateCache.vertexAlpha = 0; - rwStateCache.textureAlpha = 0; - rwStateCache.alphaTestEnable = 0; - - memset(&oldGlState, 0xFE, sizeof(oldGlState)); - - rwStateCache.blendEnable = 0; - setGlRenderState(RWGL_BLEND, false); - rwStateCache.srcblend = BLENDSRCALPHA; - rwStateCache.destblend = BLENDINVSRCALPHA; - setGlRenderState(RWGL_SRCBLEND, blendMap[rwStateCache.srcblend]); - setGlRenderState(RWGL_DESTBLEND, blendMap[rwStateCache.destblend]); - - rwStateCache.zwrite = GL_TRUE; - setGlRenderState(RWGL_DEPTHMASK, rwStateCache.zwrite); - - rwStateCache.ztest = 1; - setGlRenderState(RWGL_DEPTHTEST, true); - setGlRenderState(RWGL_DEPTHFUNC, GL_LEQUAL); - - rwStateCache.cullmode = CULLNONE; - setGlRenderState(RWGL_CULL, false); - setGlRenderState(RWGL_CULLFACE, GL_BACK); - - rwStateCache.stencilenable = 0; - setGlRenderState(RWGL_STENCIL, GL_FALSE); - rwStateCache.stencilfail = STENCILKEEP; - setGlRenderState(RWGL_STENCILFAIL, GL_KEEP); - rwStateCache.stencilzfail = STENCILKEEP; - setGlRenderState(RWGL_STENCILZFAIL, GL_KEEP); - rwStateCache.stencilpass = STENCILKEEP; - setGlRenderState(RWGL_STENCILPASS, GL_KEEP); - rwStateCache.stencilfunc = STENCILALWAYS; - setGlRenderState(RWGL_STENCILFUNC, GL_ALWAYS); - rwStateCache.stencilref = 0; - setGlRenderState(RWGL_STENCILREF, 0); - rwStateCache.stencilmask = 0xFFFFFFFF; - setGlRenderState(RWGL_STENCILMASK, 0xFFFFFFFF); - rwStateCache.stencilwritemask = 0xFFFFFFFF; - setGlRenderState(RWGL_STENCILWRITEMASK, 0xFFFFFFFF); - - activeTexture = -1; - for(int i = 0; i < MAXNUMSTAGES; i++){ - setActiveTexture(i); - bindTexture(whitetex); - } - setActiveTexture(0); -} - -void -setWorldMatrix(Matrix *mat) -{ - convMatrix(&uniformObject.world, mat); - objectDirty = 1; -} - -int32 -setLights(WorldLights *lightData) -{ - int i, n; - Light *l; - int32 bits; - - uniformObject.ambLight = lightData->ambient; - - bits = 0; - - if(lightData->numAmbients) - bits |= VSLIGHT_AMBIENT; - - n = 0; - for(i = 0; i < lightData->numDirectionals && i < 8; i++){ - l = lightData->directionals[i]; - uniformObject.lightParams[n].type = 1.0f; - uniformObject.lightColor[n] = l->color; - memcpy(&uniformObject.lightDirection[n], &l->getFrame()->getLTM()->at, sizeof(V3d)); - bits |= VSLIGHT_POINT; - n++; - if(n >= MAX_LIGHTS) - goto out; - } - - for(i = 0; i < lightData->numLocals; i++){ - Light *l = lightData->locals[i]; - - switch(l->getType()){ - case Light::POINT: - uniformObject.lightParams[n].type = 2.0f; - uniformObject.lightParams[n].radius = l->radius; - uniformObject.lightColor[n] = l->color; - memcpy(&uniformObject.lightPosition[n], &l->getFrame()->getLTM()->pos, sizeof(V3d)); - bits |= VSLIGHT_POINT; - n++; - if(n >= MAX_LIGHTS) - goto out; - break; - case Light::SPOT: - case Light::SOFTSPOT: - uniformObject.lightParams[n].type = 3.0f; - uniformObject.lightParams[n].minusCosAngle = l->minusCosAngle; - uniformObject.lightParams[n].radius = l->radius; - uniformObject.lightColor[n] = l->color; - memcpy(&uniformObject.lightPosition[n], &l->getFrame()->getLTM()->pos, sizeof(V3d)); - memcpy(&uniformObject.lightDirection[n], &l->getFrame()->getLTM()->at, sizeof(V3d)); - // lower bound of falloff - if(l->getType() == Light::SOFTSPOT) - uniformObject.lightParams[n].hardSpot = 0.0f; - else - uniformObject.lightParams[n].hardSpot = 1.0f; - bits |= VSLIGHT_SPOT; - n++; - if(n >= MAX_LIGHTS) - goto out; - break; - } - } - - uniformObject.lightParams[n].type = 0.0f; -out: - objectDirty = 1; - return bits; -} - -void -setProjectionMatrix(float32 *mat) -{ - memcpy(&uniformScene.proj, mat, 64); - sceneDirty = 1; -} - -void -setViewMatrix(float32 *mat) -{ - memcpy(&uniformScene.view, mat, 64); - sceneDirty = 1; -} - -Shader *lastShaderUploaded; - -#define U(i) currentShader->uniformLocations[i] - -void -setMaterial(const RGBA &color, const SurfaceProperties &surfaceprops, float extraSurfProp) -{ - bool force = lastShaderUploaded != currentShader; - if(force || !equal(shaderState.matColor, color)){ - rw::RGBAf col; - convColor(&col, &color); - glUniform4fv(U(u_matColor), 1, (GLfloat*)&col); - shaderState.matColor = color; - } - - if(force || - shaderState.surfProps.ambient != surfaceprops.ambient || - shaderState.surfProps.specular != surfaceprops.specular || - shaderState.surfProps.diffuse != surfaceprops.diffuse || - shaderState.extraSurfProp != extraSurfProp){ - float surfProps[4]; - surfProps[0] = surfaceprops.ambient; - surfProps[1] = surfaceprops.specular; - surfProps[2] = surfaceprops.diffuse; - surfProps[3] = extraSurfProp; - glUniform4fv(U(u_surfProps), 1, surfProps); - shaderState.surfProps = surfaceprops; - } -} - -void -flushCache(void) -{ - flushGlRenderState(); - -#ifndef RW_GL_USE_UBOS - - // TODO: this is probably a stupid way to do it without UBOs - if(lastShaderUploaded != currentShader){ - lastShaderUploaded = currentShader; - objectDirty = 1; - sceneDirty = 1; - stateDirty = 1; - - int i; - for(i = 0; i < RWGL_NUM_STATES; i++) - uniformStateDirty[i] = true; - } - - if(sceneDirty){ - glUniformMatrix4fv(U(u_proj), 1, 0, uniformScene.proj); - glUniformMatrix4fv(U(u_view), 1, 0, uniformScene.view); - sceneDirty = 0; - } - - if(objectDirty){ - glUniformMatrix4fv(U(u_world), 1, 0, (float*)&uniformObject.world); - glUniform4fv(U(u_ambLight), 1, (float*)&uniformObject.ambLight); - glUniform4fv(U(u_lightParams), MAX_LIGHTS, (float*)uniformObject.lightParams); - glUniform4fv(U(u_lightPosition), MAX_LIGHTS, (float*)uniformObject.lightPosition); - glUniform4fv(U(u_lightDirection), MAX_LIGHTS, (float*)uniformObject.lightDirection); - glUniform4fv(U(u_lightColor), MAX_LIGHTS, (float*)uniformObject.lightColor); - objectDirty = 0; - } - -// if(stateDirty){ - - uniformState.fogDisable = rwStateCache.fogEnable ? 0.0f : 1.0f; - uniformState.fogStart = rwStateCache.fogStart; - uniformState.fogEnd = rwStateCache.fogEnd; - uniformState.fogRange = 1.0f/(rwStateCache.fogStart - rwStateCache.fogEnd); - - if(uniformStateDirty[RWGL_ALPHAFUNC] || uniformStateDirty[RWGL_ALPHAREF]){ - switch(alphaFunc){ - case ALPHAALWAYS: - default: - glUniform2f(U(u_alphaRef), -1000.0f, 1000.0f); - break; - case ALPHAGREATEREQUAL: - glUniform2f(U(u_alphaRef), alphaRef, 1000.0f); - break; - case ALPHALESS: - glUniform2f(U(u_alphaRef), -1000.0f, alphaRef); - break; - } - uniformStateDirty[RWGL_ALPHAFUNC] = false; - uniformStateDirty[RWGL_ALPHAREF] = false; - } - - if(uniformStateDirty[RWGL_FOG] || - uniformStateDirty[RWGL_FOGSTART] || - uniformStateDirty[RWGL_FOGEND]){ - float fogData[4] = { - uniformState.fogStart, - uniformState.fogEnd, - uniformState.fogRange, - uniformState.fogDisable - }; - glUniform4fv(U(u_fogData), 1, fogData); - uniformStateDirty[RWGL_FOG] = false; - uniformStateDirty[RWGL_FOGSTART] = false; - uniformStateDirty[RWGL_FOGEND] = false; - } - - if(uniformStateDirty[RWGL_FOGCOLOR]){ - glUniform4fv(U(u_fogColor), 1, (float*)&uniformState.fogColor); - uniformStateDirty[RWGL_FOGCOLOR] = false; - } - -// stateDirty = 0; -// } -#else - if(objectDirty){ - glBindBuffer(GL_UNIFORM_BUFFER, ubo_object); - glBufferData(GL_UNIFORM_BUFFER, sizeof(UniformObject), nil, GL_STREAM_DRAW); - glBufferData(GL_UNIFORM_BUFFER, sizeof(UniformObject), &uniformObject, GL_STREAM_DRAW); - objectDirty = 0; - } - if(sceneDirty){ - glBindBuffer(GL_UNIFORM_BUFFER, ubo_scene); - glBufferData(GL_UNIFORM_BUFFER, sizeof(UniformScene), nil, GL_STREAM_DRAW); - glBufferData(GL_UNIFORM_BUFFER, sizeof(UniformScene), &uniformScene, GL_STREAM_DRAW); - sceneDirty = 0; - } - if(stateDirty){ - switch(alphaFunc){ - case ALPHAALWAYS: - default: - uniformState.alphaRefLow = -1000.0f; - uniformState.alphaRefHigh = 1000.0f; - break; - case ALPHAGREATEREQUAL: - uniformState.alphaRefLow = alphaRef; - uniformState.alphaRefHigh = 1000.0f; - break; - case ALPHALESS: - uniformState.alphaRefLow = -1000.0f; - uniformState.alphaRefHigh = alphaRef; - break; - } - uniformState.fogDisable = rwStateCache.fogEnable ? 0.0f : 1.0f; - uniformState.fogStart = rwStateCache.fogStart; - uniformState.fogEnd = rwStateCache.fogEnd; - uniformState.fogRange = 1.0f/(rwStateCache.fogStart - rwStateCache.fogEnd); - glBindBuffer(GL_UNIFORM_BUFFER, ubo_state); - glBufferData(GL_UNIFORM_BUFFER, sizeof(UniformState), nil, GL_STREAM_DRAW); - glBufferData(GL_UNIFORM_BUFFER, sizeof(UniformState), &uniformState, GL_STREAM_DRAW); - stateDirty = 0; - } -#endif -} - -static void -setFrameBuffer(Camera *cam) -{ - Raster *fbuf = cam->frameBuffer->parent; - Raster *zbuf = cam->zBuffer->parent; - assert(fbuf); - - Gl3Raster *natfb = PLUGINOFFSET(Gl3Raster, fbuf, nativeRasterOffset); - Gl3Raster *natzb = PLUGINOFFSET(Gl3Raster, zbuf, nativeRasterOffset); - assert(fbuf->type == Raster::CAMERA || fbuf->type == Raster::CAMERATEXTURE); - - // Have to make sure depth buffer is attached to FB's fbo - bindFramebuffer(natfb->fbo); - if(zbuf){ - if(natfb->fboMate == zbuf){ - // all good - assert(natzb->fboMate == fbuf); - }else{ - if(natzb->fboMate){ - // have to detatch from fbo first! - Gl3Raster *oldfb = PLUGINOFFSET(Gl3Raster, natzb->fboMate, nativeRasterOffset); - if(oldfb->fbo){ - bindFramebuffer(oldfb->fbo); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0); - bindFramebuffer(natfb->fbo); - } - oldfb->fboMate = nil; - } - natfb->fboMate = zbuf; - natzb->fboMate = fbuf; - if(natfb->fbo){ - if(gl3Caps.gles) - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, natzb->texid); - else - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, natzb->texid, 0); - } - } - }else{ - // remove z-buffer - if(natfb->fboMate && natfb->fbo) - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0); - natfb->fboMate = nil; - } -} - -static void -beginUpdate(Camera *cam) -{ - float view[16], proj[16]; - // View Matrix - Matrix inv; - Matrix::invert(&inv, cam->getFrame()->getLTM()); - // Since we're looking into positive Z, - // flip X to ge a left handed view space. - view[0] = -inv.right.x; - view[1] = inv.right.y; - view[2] = inv.right.z; - view[3] = 0.0f; - view[4] = -inv.up.x; - view[5] = inv.up.y; - view[6] = inv.up.z; - view[7] = 0.0f; - view[8] = -inv.at.x; - view[9] = inv.at.y; - view[10] = inv.at.z; - view[11] = 0.0f; - view[12] = -inv.pos.x; - view[13] = inv.pos.y; - view[14] = inv.pos.z; - view[15] = 1.0f; - memcpy(&cam->devView, &view, sizeof(RawMatrix)); - setViewMatrix(view); - - // Projection Matrix - float32 invwx = 1.0f/cam->viewWindow.x; - float32 invwy = 1.0f/cam->viewWindow.y; - float32 invz = 1.0f/(cam->farPlane-cam->nearPlane); - - proj[0] = invwx; - proj[1] = 0.0f; - proj[2] = 0.0f; - proj[3] = 0.0f; - - proj[4] = 0.0f; - proj[5] = invwy; - proj[6] = 0.0f; - proj[7] = 0.0f; - - proj[8] = cam->viewOffset.x*invwx; - proj[9] = cam->viewOffset.y*invwy; - proj[12] = -proj[8]; - proj[13] = -proj[9]; - if(cam->projection == Camera::PERSPECTIVE){ - proj[10] = (cam->farPlane+cam->nearPlane)*invz; - proj[11] = 1.0f; - - proj[14] = -2.0f*cam->nearPlane*cam->farPlane*invz; - proj[15] = 0.0f; - }else{ - proj[10] = -(cam->farPlane+cam->nearPlane)*invz; - proj[11] = 0.0f; - - proj[14] = 2.0f*invz; - proj[15] = 1.0f; - } - memcpy(&cam->devProj, &proj, sizeof(RawMatrix)); - setProjectionMatrix(proj); - - if(rwStateCache.fogStart != cam->fogPlane){ - rwStateCache.fogStart = cam->fogPlane; - uniformStateDirty[RWGL_FOGSTART] = true; - stateDirty = 1; - } - if(rwStateCache.fogEnd != cam->farPlane){ - rwStateCache.fogEnd = cam->farPlane; - uniformStateDirty[RWGL_FOGEND] = true; - stateDirty = 1; - } - - setFrameBuffer(cam); - - int w, h; - int x, y; - Raster *fb = cam->frameBuffer->parent; - if(fb->type == Raster::CAMERA){ -#ifdef LIBRW_SDL2 - SDL_GetWindowSize(glGlobals.window, &w, &h); -#else - glfwGetFramebufferSize(glGlobals.window, &w, &h); -#endif - }else{ - w = fb->width; - h = fb->height; - } - x = 0; - y = 0; - - // Got a subraster - if(cam->frameBuffer != fb){ - x = cam->frameBuffer->offsetX; - // GL y offset is from bottom - y = h - cam->frameBuffer->height - cam->frameBuffer->offsetY; - w = cam->frameBuffer->width; - h = cam->frameBuffer->height; - } - - if(w != glGlobals.presentWidth || h != glGlobals.presentHeight || - x != glGlobals.presentOffX || y != glGlobals.presentOffY){ - glViewport(x, y, w, h); - glGlobals.presentWidth = w; - glGlobals.presentHeight = h; - glGlobals.presentOffX = x; - glGlobals.presentOffY = y; - } -} - -static void -endUpdate(Camera *cam) -{ -} - -static void -clearCamera(Camera *cam, RGBA *col, uint32 mode) -{ - RGBAf colf; - GLbitfield mask; - - setFrameBuffer(cam); - - convColor(&colf, col); - glClearColor(colf.red, colf.green, colf.blue, colf.alpha); - mask = 0; - if(mode & Camera::CLEARIMAGE) - mask |= GL_COLOR_BUFFER_BIT; - if(mode & Camera::CLEARZ) - mask |= GL_DEPTH_BUFFER_BIT; - if(mode & Camera::CLEARSTENCIL) - mask |= GL_STENCIL_BUFFER_BIT; - glDepthMask(GL_TRUE); - glClear(mask); - glDepthMask(rwStateCache.zwrite); -} - -static void -showRaster(Raster *raster, uint32 flags) -{ - // TODO: do this properly! -#ifdef LIBRW_SDL2 - if(flags & Raster::FLIPWAITVSYNCH) - SDL_GL_SetSwapInterval(1); - else - SDL_GL_SetSwapInterval(0); - SDL_GL_SwapWindow(glGlobals.window); -#else - if(flags & Raster::FLIPWAITVSYNCH) - glfwSwapInterval(1); - else - glfwSwapInterval(0); - glfwSwapBuffers(glGlobals.window); -#endif -} - -static bool32 -rasterRenderFast(Raster *raster, int32 x, int32 y) -{ - Raster *src = raster; - Raster *dst = Raster::getCurrentContext(); - Gl3Raster *natdst = PLUGINOFFSET(Gl3Raster, dst, nativeRasterOffset); - Gl3Raster *natsrc = PLUGINOFFSET(Gl3Raster, src, nativeRasterOffset); - - switch(dst->type){ - case Raster::NORMAL: - case Raster::TEXTURE: - case Raster::CAMERATEXTURE: - switch(src->type){ - case Raster::CAMERA: - setActiveTexture(0); - glBindTexture(GL_TEXTURE_2D, natdst->texid); - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, x, (dst->height-src->height)-y, - 0, 0, src->width, src->height); - glBindTexture(GL_TEXTURE_2D, boundTexture[0]); - return 1; - } - break; - } - return 0; -} - -#ifdef LIBRW_SDL2 - -static void -addVideoMode(int displayIndex, int modeIndex) -{ - int i; - SDL_DisplayMode mode; - - SDL_GetDisplayMode(displayIndex, modeIndex, &mode); - - for(i = 1; i < glGlobals.numModes; i++){ - if(glGlobals.modes[i].mode.w == mode.w && - glGlobals.modes[i].mode.h == mode.h && - glGlobals.modes[i].mode.format == mode.format){ - // had this mode already, remember highest refresh rate - if(mode.refresh_rate > glGlobals.modes[i].mode.refresh_rate) - glGlobals.modes[i].mode.refresh_rate = mode.refresh_rate; - return; - } - } - - // none found, add - glGlobals.modes[glGlobals.numModes].mode = mode; - glGlobals.modes[glGlobals.numModes].flags = VIDEOMODEEXCLUSIVE; - glGlobals.numModes++; -} - -static void -makeVideoModeList(int displayIndex) -{ - int i, num, depth; - - num = SDL_GetNumDisplayModes(displayIndex); - rwFree(glGlobals.modes); - glGlobals.modes = rwNewT(DisplayMode, num+1, ID_DRIVER | MEMDUR_EVENT); - - SDL_GetCurrentDisplayMode(displayIndex, &glGlobals.modes[0].mode); - glGlobals.modes[0].flags = 0; - glGlobals.numModes = 1; - - for(i = 0; i < num; i++) - addVideoMode(displayIndex, i); - - for(i = 0; i < glGlobals.numModes; i++){ - depth = SDL_BITSPERPIXEL(glGlobals.modes[i].mode.format); - // set depth to power of two - for(glGlobals.modes[i].depth = 1; glGlobals.modes[i].depth < depth; glGlobals.modes[i].depth <<= 1); - } -} - -static int -openSDL2(EngineOpenParams *openparams) -{ - glGlobals.winWidth = openparams->width; - glGlobals.winHeight = openparams->height; - glGlobals.winTitle = openparams->windowtitle; - glGlobals.pWindow = openparams->window; - - memset(&gl3Caps, 0, sizeof(gl3Caps)); - - /* Init SDL */ - if(SDL_InitSubSystem(SDL_INIT_VIDEO)){ - RWERROR((ERR_GENERAL, SDL_GetError())); - return 0; - } - - makeVideoModeList(0); - - return 1; -} - -static int -closeSDL2(void) -{ - SDL_QuitSubSystem(SDL_INIT_VIDEO); - return 1; -} - -static struct { - int gl; - int major, minor; -} profiles[] = { - { SDL_GL_CONTEXT_PROFILE_CORE, 3, 3 }, - { SDL_GL_CONTEXT_PROFILE_CORE, 2, 1 }, - { SDL_GL_CONTEXT_PROFILE_ES, 3, 1 }, - { SDL_GL_CONTEXT_PROFILE_ES, 2, 0 }, - { 0, 0, 0 }, -}; - -static int -startSDL2(void) -{ - SDL_Window *win; - SDL_GLContext ctx; - DisplayMode *mode; - - mode = &glGlobals.modes[glGlobals.currentMode]; - - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, glGlobals.numSamples); - - int i; - for(i = 0; profiles[i].gl; i++){ - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profiles[i].gl); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, profiles[i].major); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, profiles[i].minor); - - if(mode->flags & VIDEOMODEEXCLUSIVE) { - win = SDL_CreateWindow(glGlobals.winTitle, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, mode->mode.w, mode->mode.h, SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN); - if (win) - SDL_SetWindowDisplayMode(win, &mode->mode); - } else { - win = SDL_CreateWindow(glGlobals.winTitle, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, glGlobals.winWidth, glGlobals.winHeight, SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL); - if (win) - SDL_SetWindowDisplayMode(win, NULL); - } - if(win){ - gl3Caps.gles = profiles[i].gl == SDL_GL_CONTEXT_PROFILE_ES; - gl3Caps.glversion = profiles[i].major*10 + profiles[i].minor; - break; - } - } - if(win == nil){ - RWERROR((ERR_GENERAL, SDL_GetError())); - return 0; - } - ctx = SDL_GL_CreateContext(win); - - if (!((gl3Caps.gles ? gladLoadGLES2Loader : gladLoadGLLoader) ((GLADloadproc) SDL_GL_GetProcAddress, gl3Caps.glversion)) ) { - RWERROR((ERR_GENERAL, "gladLoadGLLoader failed")); - SDL_GL_DeleteContext(ctx); - SDL_DestroyWindow(win); - return 0; - } - - printf("OpenGL version: %s\n", glGetString(GL_VERSION)); - - glGlobals.window = win; - glGlobals.glcontext = ctx; - *glGlobals.pWindow = win; - glGlobals.presentWidth = 0; - glGlobals.presentHeight = 0; - glGlobals.presentOffX = 0; - glGlobals.presentOffY = 0; - return 1; -} - -static int -stopSDL2(void) -{ - SDL_GL_DeleteContext(glGlobals.glcontext); - SDL_DestroyWindow(glGlobals.window); - return 1; -} -#else - -static void -addVideoMode(const GLFWvidmode *mode) -{ - int i; - - for(i = 1; i < glGlobals.numModes; i++){ - if(glGlobals.modes[i].mode.width == mode->width && - glGlobals.modes[i].mode.height == mode->height && - glGlobals.modes[i].mode.redBits == mode->redBits && - glGlobals.modes[i].mode.greenBits == mode->greenBits && - glGlobals.modes[i].mode.blueBits == mode->blueBits){ - // had this mode already, remember highest refresh rate - if(mode->refreshRate > glGlobals.modes[i].mode.refreshRate) - glGlobals.modes[i].mode.refreshRate = mode->refreshRate; - return; - } - } - - // none found, add - glGlobals.modes[glGlobals.numModes].mode = *mode; - glGlobals.modes[glGlobals.numModes].flags = VIDEOMODEEXCLUSIVE; - glGlobals.numModes++; -} - -static void -makeVideoModeList(void) -{ - int i, num; - const GLFWvidmode *modes; - - modes = glfwGetVideoModes(glGlobals.monitor, &num); - rwFree(glGlobals.modes); - glGlobals.modes = rwNewT(DisplayMode, num+1, ID_DRIVER | MEMDUR_EVENT); - - glGlobals.modes[0].mode = *glfwGetVideoMode(glGlobals.monitor); - glGlobals.modes[0].flags = 0; - glGlobals.numModes = 1; - - for(i = 0; i < num; i++) - addVideoMode(&modes[i]); - - for(i = 0; i < glGlobals.numModes; i++){ - num = glGlobals.modes[i].mode.redBits + - glGlobals.modes[i].mode.greenBits + - glGlobals.modes[i].mode.blueBits; - // set depth to power of two - for(glGlobals.modes[i].depth = 1; glGlobals.modes[i].depth < num; glGlobals.modes[i].depth <<= 1); - } -} - -static int -openGLFW(EngineOpenParams *openparams) -{ - glGlobals.winWidth = openparams->width; - glGlobals.winHeight = openparams->height; - glGlobals.winTitle = openparams->windowtitle; - glGlobals.pWindow = openparams->window; - - memset(&gl3Caps, 0, sizeof(gl3Caps)); - - /* Init GLFW */ - if(!glfwInit()){ - RWERROR((ERR_GENERAL, "glfwInit() failed")); - return 0; - } - - glGlobals.monitor = glfwGetMonitors(&glGlobals.numMonitors)[0]; - - makeVideoModeList(); - - return 1; -} - -static int -closeGLFW(void) -{ - glfwTerminate(); - return 1; -} - -static void -glfwerr(int error, const char *desc) -{ - fprintf(stderr, "GLFW Error: %s\n", desc); -} - -static struct { - int gl; - int major, minor; -} profiles[] = { - { GLFW_OPENGL_API, 3, 3 }, - { GLFW_OPENGL_API, 2, 1 }, - { GLFW_OPENGL_ES_API, 3, 1 }, - { GLFW_OPENGL_ES_API, 2, 0 }, - { 0, 0, 0 }, -}; - -static int -startGLFW(void) -{ - GLFWwindow *win; - DisplayMode *mode; - - mode = &glGlobals.modes[glGlobals.currentMode]; - - glfwSetErrorCallback(glfwerr); - glfwWindowHint(GLFW_RED_BITS, mode->mode.redBits); - glfwWindowHint(GLFW_GREEN_BITS, mode->mode.greenBits); - glfwWindowHint(GLFW_BLUE_BITS, mode->mode.blueBits); - glfwWindowHint(GLFW_REFRESH_RATE, mode->mode.refreshRate); - glfwWindowHint(GLFW_SAMPLES, glGlobals.numSamples); - - int i; - for(i = 0; profiles[i].gl; i++){ - glfwWindowHint(GLFW_CLIENT_API, profiles[i].gl); - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, profiles[i].major); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, profiles[i].minor); - - if(mode->flags & VIDEOMODEEXCLUSIVE) - win = glfwCreateWindow(mode->mode.width, mode->mode.height, glGlobals.winTitle, glGlobals.monitor, nil); - else - win = glfwCreateWindow(glGlobals.winWidth, glGlobals.winHeight, glGlobals.winTitle, nil, nil); - if(win){ - gl3Caps.gles = profiles[i].gl == GLFW_OPENGL_ES_API; - gl3Caps.glversion = profiles[i].major*10 + profiles[i].minor; - break; - } - } - if(win == nil){ - RWERROR((ERR_GENERAL, "glfwCreateWindow() failed")); - return 0; - } - glfwMakeContextCurrent(win); - - /* Init GLAD */ - if (!((gl3Caps.gles ? gladLoadGLES2Loader : gladLoadGLLoader) ((GLADloadproc) glfwGetProcAddress, gl3Caps.glversion)) ) { - RWERROR((ERR_GENERAL, "gladLoadGLLoader failed")); - glfwDestroyWindow(win); - return 0; - } - - printf("OpenGL version: %s\n", glGetString(GL_VERSION)); - - glGlobals.window = win; - *glGlobals.pWindow = win; - glGlobals.presentWidth = 0; - glGlobals.presentHeight = 0; - glGlobals.presentOffX = 0; - glGlobals.presentOffY = 0; - return 1; -} - -static int -stopGLFW(void) -{ - glfwDestroyWindow(glGlobals.window); - return 1; -} -#endif - -static int -initOpenGL(void) -{ -/* - // this only works from 3.0 onward, - // but luckily GLAD has already taken care of extensions for us - int numExt; - glGetIntegerv(GL_NUM_EXTENSIONS, &numExt); - for(int i = 0; i < numExt; i++){ - const char *ext = (const char*)glGetStringi(GL_EXTENSIONS, i); - if(ext == nil) - continue; // apparently that can happen... - if(strcmp(ext, "GL_EXT_texture_compression_s3tc") == 0) - gl3Caps.dxtSupported = true; - else if(strcmp(ext, "GL_KHR_texture_compression_astc_ldr") == 0) - gl3Caps.astcSupported = true; -// printf("%d %s\n", i, ext); - } -*/ - gl3Caps.dxtSupported = GLAD_GL_EXT_texture_compression_s3tc; - gl3Caps.astcSupported = GLAD_GL_KHR_texture_compression_astc_ldr; - - glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl3Caps.maxAnisotropy); - - if(gl3Caps.gles){ - if(gl3Caps.glversion >= 30) - shaderDecl = shaderDecl310es; - else - shaderDecl = shaderDecl100es; - }else{ - if(gl3Caps.glversion >= 30) - shaderDecl = shaderDecl330; - else - shaderDecl = shaderDecl120; - } - -#ifndef RW_GL_USE_UBOS - u_alphaRef = registerUniform("u_alphaRef"); - u_fogData = registerUniform("u_fogData"); -// u_fogStart = registerUniform("u_fogStart"); -// u_fogEnd = registerUniform("u_fogEnd"); -// u_fogRange = registerUniform("u_fogRange"); -// u_fogDisable = registerUniform("u_fogDisable"); - u_fogColor = registerUniform("u_fogColor"); - u_proj = registerUniform("u_proj"); - u_view = registerUniform("u_view"); - u_world = registerUniform("u_world"); - u_ambLight = registerUniform("u_ambLight"); - u_lightParams = registerUniform("u_lightParams"); - u_lightPosition = registerUniform("u_lightPosition"); - u_lightDirection = registerUniform("u_lightDirection"); - u_lightColor = registerUniform("u_lightColor"); - lastShaderUploaded = nil; -#else - registerBlock("Scene"); - registerBlock("Object"); - registerBlock("State"); -#endif - u_matColor = registerUniform("u_matColor"); - u_surfProps = registerUniform("u_surfProps"); - - glClearColor(0.25, 0.25, 0.25, 1.0); - - byte whitepixel[4] = {0xFF, 0xFF, 0xFF, 0xFF}; - glGenTextures(1, &whitetex); - glBindTexture(GL_TEXTURE_2D, whitetex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, - 0, GL_RGBA, GL_UNSIGNED_BYTE, &whitepixel); - - resetRenderState(); - - glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropy); - - if(gl3Caps.glversion >= 30){ - glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - } - -#ifdef RW_GL_USE_UBOS - glGenBuffers(1, &ubo_state); - glBindBuffer(GL_UNIFORM_BUFFER, ubo_state); - glBindBufferBase(GL_UNIFORM_BUFFER, gl3::findBlock("State"), ubo_state); - glBufferData(GL_UNIFORM_BUFFER, sizeof(UniformState), &uniformState, - GL_STREAM_DRAW); - glBindBuffer(GL_UNIFORM_BUFFER, 0); - - glGenBuffers(1, &ubo_scene); - glBindBuffer(GL_UNIFORM_BUFFER, ubo_scene); - glBindBufferBase(GL_UNIFORM_BUFFER, gl3::findBlock("Scene"), ubo_scene); - glBufferData(GL_UNIFORM_BUFFER, sizeof(UniformScene), &uniformScene, - GL_STREAM_DRAW); - glBindBuffer(GL_UNIFORM_BUFFER, 0); - - glGenBuffers(1, &ubo_object); - glBindBuffer(GL_UNIFORM_BUFFER, ubo_object); - glBindBufferBase(GL_UNIFORM_BUFFER, gl3::findBlock("Object"), ubo_object); - glBufferData(GL_UNIFORM_BUFFER, sizeof(UniformObject), &uniformObject, - GL_STREAM_DRAW); - glBindBuffer(GL_UNIFORM_BUFFER, 0); -#endif - -#include "shaders/default_vs_gl.inc" -#include "shaders/simple_fs_gl.inc" - const char *vs[] = { shaderDecl, header_vert_src, default_vert_src, nil }; - const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil }; - defaultShader = Shader::create(vs, fs); - assert(defaultShader); - - openIm2D(); - openIm3D(); - - return 1; -} - -static int -termOpenGL(void) -{ - closeIm3D(); - closeIm2D(); - return 1; -} - -static int -finalizeOpenGL(void) -{ - return 1; -} - -#ifdef LIBRW_SDL2 -static int -deviceSystemSDL2(DeviceReq req, void *arg, int32 n) -{ - VideoMode *rwmode; - - switch(req){ - case DEVICEOPEN: - return openSDL2((EngineOpenParams*)arg); - case DEVICECLOSE: - return closeSDL2(); - - case DEVICEINIT: - return startSDL2() && initOpenGL(); - case DEVICETERM: - return termOpenGL() && stopSDL2(); - - case DEVICEFINALIZE: - return finalizeOpenGL(); - - // TODO: implement subsystems - - case DEVICEGETNUMVIDEOMODES: - return glGlobals.numModes; - - case DEVICEGETCURRENTVIDEOMODE: - return glGlobals.currentMode; - - case DEVICESETVIDEOMODE: - if(n >= glGlobals.numModes) - return 0; - glGlobals.currentMode = n; - return 1; - - case DEVICEGETVIDEOMODEINFO: - rwmode = (VideoMode*)arg; - rwmode->width = glGlobals.modes[n].mode.w; - rwmode->height = glGlobals.modes[n].mode.h; - rwmode->depth = glGlobals.modes[n].depth; - rwmode->flags = glGlobals.modes[n].flags; - return 1; - - case DEVICEGETMAXMULTISAMPLINGLEVELS: - { - GLint maxSamples; - glGetIntegerv(GL_MAX_SAMPLES, &maxSamples); - if(maxSamples == 0) - return 1; - return maxSamples; - } - case DEVICEGETMULTISAMPLINGLEVELS: - if(glGlobals.numSamples == 0) - return 1; - return glGlobals.numSamples; - case DEVICESETMULTISAMPLINGLEVELS: - glGlobals.numSamples = (uint32)n; - return 1; - default: - assert(0 && "not implemented"); - return 0; - } - return 1; -} - -#else - -static int -deviceSystemGLFW(DeviceReq req, void *arg, int32 n) -{ - GLFWmonitor **monitors; - VideoMode *rwmode; - - switch(req){ - case DEVICEOPEN: - return openGLFW((EngineOpenParams*)arg); - case DEVICECLOSE: - return closeGLFW(); - - case DEVICEINIT: - return startGLFW() && initOpenGL(); - case DEVICETERM: - return termOpenGL() && stopGLFW(); - - case DEVICEFINALIZE: - return finalizeOpenGL(); - - - case DEVICEGETNUMSUBSYSTEMS: - return glGlobals.numMonitors; - - case DEVICEGETCURRENTSUBSYSTEM: - return glGlobals.currentMonitor; - - case DEVICESETSUBSYSTEM: - monitors = glfwGetMonitors(&glGlobals.numMonitors); - if(n >= glGlobals.numMonitors) - return 0; - glGlobals.currentMonitor = n; - glGlobals.monitor = monitors[glGlobals.currentMonitor]; - return 1; - - case DEVICEGETSUBSSYSTEMINFO: - monitors = glfwGetMonitors(&glGlobals.numMonitors); - if(n >= glGlobals.numMonitors) - return 0; - strncpy(((SubSystemInfo*)arg)->name, glfwGetMonitorName(monitors[n]), sizeof(SubSystemInfo::name)); - return 1; - - - case DEVICEGETNUMVIDEOMODES: - return glGlobals.numModes; - - case DEVICEGETCURRENTVIDEOMODE: - return glGlobals.currentMode; - - case DEVICESETVIDEOMODE: - if(n >= glGlobals.numModes) - return 0; - glGlobals.currentMode = n; - return 1; - - case DEVICEGETVIDEOMODEINFO: - rwmode = (VideoMode*)arg; - rwmode->width = glGlobals.modes[n].mode.width; - rwmode->height = glGlobals.modes[n].mode.height; - rwmode->depth = glGlobals.modes[n].depth; - rwmode->flags = glGlobals.modes[n].flags; - return 1; - - case DEVICEGETMAXMULTISAMPLINGLEVELS: - { - GLint maxSamples; - glGetIntegerv(GL_MAX_SAMPLES, &maxSamples); - if(maxSamples == 0) - return 1; - return maxSamples; - } - case DEVICEGETMULTISAMPLINGLEVELS: - if(glGlobals.numSamples == 0) - return 1; - return glGlobals.numSamples; - case DEVICESETMULTISAMPLINGLEVELS: - glGlobals.numSamples = (uint32)n; - return 1; - default: - assert(0 && "not implemented"); - return 0; - } - return 1; -} - -#endif - -Device renderdevice = { - -1.0f, 1.0f, - gl3::beginUpdate, - gl3::endUpdate, - gl3::clearCamera, - gl3::showRaster, - gl3::rasterRenderFast, - gl3::setRenderState, - gl3::getRenderState, - gl3::im2DRenderLine, - gl3::im2DRenderTriangle, - gl3::im2DRenderPrimitive, - gl3::im2DRenderIndexedPrimitive, - gl3::im3DTransform, - gl3::im3DRenderPrimitive, - gl3::im3DRenderIndexedPrimitive, - gl3::im3DEnd, -#ifdef LIBRW_SDL2 - gl3::deviceSystemSDL2 -#else - gl3::deviceSystemGLFW -#endif -}; - -} -} - -#else -// urgh, probably should get rid of that eventually -#include "rwgl3.h" -namespace rw { -namespace gl3 { -Gl3Caps gl3Caps; -bool32 needToReadBackTextures; -} -} -#endif diff --git a/vendor/librw/src/gl/gl3immed.cpp b/vendor/librw/src/gl/gl3immed.cpp deleted file mode 100644 index 2a5361d..0000000 --- a/vendor/librw/src/gl/gl3immed.cpp +++ /dev/null @@ -1,304 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwrender.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#ifdef RW_OPENGL -#include "rwgl3.h" -#include "rwgl3impl.h" -#include "rwgl3shader.h" - -namespace rw { -namespace gl3 { - -uint32 im2DVbo, im2DIbo; -#ifdef RW_GL_USE_VAOS -uint32 im2DVao; -#endif - -Shader *im2dOverrideShader; - -static int32 u_xform; - -#define STARTINDICES 10000 -#define STARTVERTICES 10000 - -static Shader *im2dShader; -static AttribDesc im2dattribDesc[3] = { - { ATTRIB_POS, GL_FLOAT, GL_FALSE, 4, - sizeof(Im2DVertex), 0 }, - { ATTRIB_COLOR, GL_UNSIGNED_BYTE, GL_TRUE, 4, - sizeof(Im2DVertex), offsetof(Im2DVertex, r) }, - { ATTRIB_TEXCOORDS0, GL_FLOAT, GL_FALSE, 2, - sizeof(Im2DVertex), offsetof(Im2DVertex, u) }, -}; - -static int primTypeMap[] = { - GL_POINTS, // invalid - GL_LINES, - GL_LINE_STRIP, - GL_TRIANGLES, - GL_TRIANGLE_STRIP, - GL_TRIANGLE_FAN, - GL_POINTS -}; - -void -openIm2D(void) -{ - u_xform = registerUniform("u_xform"); - -#include "shaders/im2d_gl.inc" -#include "shaders/simple_fs_gl.inc" - const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil }; - const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil }; - im2dShader = Shader::create(vs, fs); - assert(im2dShader); - - glGenBuffers(1, &im2DIbo); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im2DIbo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, STARTINDICES*2, nil, GL_STREAM_DRAW); - - glGenBuffers(1, &im2DVbo); - glBindBuffer(GL_ARRAY_BUFFER, im2DVbo); - glBufferData(GL_ARRAY_BUFFER, STARTVERTICES*sizeof(Im2DVertex), nil, GL_STREAM_DRAW); - -#ifdef RW_GL_USE_VAOS - glGenVertexArrays(1, &im2DVao); - glBindVertexArray(im2DVao); - setAttribPointers(im2dattribDesc, 3); -#endif -} - -void -closeIm2D(void) -{ - glDeleteBuffers(1, &im2DIbo); - glDeleteBuffers(1, &im2DVbo); -#ifdef RW_GL_USE_VAOS - glDeleteVertexArrays(1, &im2DVao); -#endif - im2dShader->destroy(); - im2dShader = nil; -} - -static Im2DVertex tmpprimbuf[3]; - -void -im2DRenderLine(void *vertices, int32 numVertices, int32 vert1, int32 vert2) -{ - Im2DVertex *verts = (Im2DVertex*)vertices; - tmpprimbuf[0] = verts[vert1]; - tmpprimbuf[1] = verts[vert2]; - im2DRenderPrimitive(PRIMTYPELINELIST, tmpprimbuf, 2); -} - -void -im2DRenderTriangle(void *vertices, int32 numVertices, int32 vert1, int32 vert2, int32 vert3) -{ - Im2DVertex *verts = (Im2DVertex*)vertices; - tmpprimbuf[0] = verts[vert1]; - tmpprimbuf[1] = verts[vert2]; - tmpprimbuf[2] = verts[vert3]; - im2DRenderPrimitive(PRIMTYPETRILIST, tmpprimbuf, 3); -} - -void -im2DSetXform(void) -{ - GLfloat xform[4]; - Camera *cam; - cam = (Camera*)engine->currentCamera; - xform[0] = 2.0f/cam->frameBuffer->width; - xform[1] = -2.0f/cam->frameBuffer->height; - xform[2] = -1.0f; - xform[3] = 1.0f; - glUniform4fv(currentShader->uniformLocations[u_xform], 1, xform); -} - -void -im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices) -{ -#ifdef RW_GL_USE_VAOS - glBindVertexArray(im2DVao); -#endif - - glBindBuffer(GL_ARRAY_BUFFER, im2DVbo); - glBufferData(GL_ARRAY_BUFFER, STARTVERTICES*sizeof(Im2DVertex), nil, GL_STREAM_DRAW); - glBufferSubData(GL_ARRAY_BUFFER, 0, numVertices*sizeof(Im2DVertex), vertices); - - if(im2dOverrideShader) - im2dOverrideShader->use(); - else - im2dShader->use(); -#ifndef RW_GL_USE_VAOS - setAttribPointers(im2dattribDesc, 3); -#endif - - im2DSetXform(); - - flushCache(); - glDrawArrays(primTypeMap[primType], 0, numVertices); -#ifndef RW_GL_USE_VAOS - disableAttribPointers(im2dattribDesc, 3); -#endif -} - -void -im2DRenderIndexedPrimitive(PrimitiveType primType, - void *vertices, int32 numVertices, - void *indices, int32 numIndices) -{ -#ifdef RW_GL_USE_VAOS - glBindVertexArray(im2DVao); -#endif - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im2DIbo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, STARTINDICES*2, nil, GL_STREAM_DRAW); - glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, numIndices*2, indices); - - glBindBuffer(GL_ARRAY_BUFFER, im2DVbo); - glBufferData(GL_ARRAY_BUFFER, STARTVERTICES*sizeof(Im2DVertex), nil, GL_STREAM_DRAW); - glBufferSubData(GL_ARRAY_BUFFER, 0, numVertices*sizeof(Im2DVertex), vertices); - - if(im2dOverrideShader) - im2dOverrideShader->use(); - else - im2dShader->use(); -#ifndef RW_GL_USE_VAOS - setAttribPointers(im2dattribDesc, 3); -#endif - - im2DSetXform(); - - flushCache(); - glDrawElements(primTypeMap[primType], numIndices, - GL_UNSIGNED_SHORT, nil); -#ifndef RW_GL_USE_VAOS - disableAttribPointers(im2dattribDesc, 3); -#endif -} - - -// Im3D - - -static Shader *im3dShader; -static AttribDesc im3dattribDesc[3] = { - { ATTRIB_POS, GL_FLOAT, GL_FALSE, 3, - sizeof(Im3DVertex), 0 }, - { ATTRIB_COLOR, GL_UNSIGNED_BYTE, GL_TRUE, 4, - sizeof(Im3DVertex), offsetof(Im3DVertex, r) }, - { ATTRIB_TEXCOORDS0, GL_FLOAT, GL_FALSE, 2, - sizeof(Im3DVertex), offsetof(Im3DVertex, u) }, -}; -static uint32 im3DVbo, im3DIbo; -#ifdef RW_GL_USE_VAOS -static uint32 im3DVao; -#endif -static int32 num3DVertices; // not actually needed here - -void -openIm3D(void) -{ -#include "shaders/im3d_gl.inc" -#include "shaders/simple_fs_gl.inc" - const char *vs[] = { shaderDecl, header_vert_src, im3d_vert_src, nil }; - const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil }; - im3dShader = Shader::create(vs, fs); - assert(im3dShader); - - glGenBuffers(1, &im3DIbo); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im3DIbo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, STARTINDICES*2, nil, GL_STREAM_DRAW); - - glGenBuffers(1, &im3DVbo); - glBindBuffer(GL_ARRAY_BUFFER, im3DVbo); - glBufferData(GL_ARRAY_BUFFER, STARTVERTICES*sizeof(Im3DVertex), nil, GL_STREAM_DRAW); - -#ifdef RW_GL_USE_VAOS - glGenVertexArrays(1, &im3DVao); - glBindVertexArray(im3DVao); - setAttribPointers(im3dattribDesc, 3); -#endif -} - -void -closeIm3D(void) -{ - glDeleteBuffers(1, &im3DIbo); - glDeleteBuffers(1, &im3DVbo); -#ifdef RW_GL_USE_VAOS - glDeleteVertexArrays(1, &im3DVao); -#endif - im3dShader->destroy(); - im3dShader = nil; -} - -void -im3DTransform(void *vertices, int32 numVertices, Matrix *world, uint32 flags) -{ - if(world == nil){ - static Matrix ident; - ident.setIdentity(); - world = &ident; - } - setWorldMatrix(world); - im3dShader->use(); - - if((flags & im3d::VERTEXUV) == 0) - SetRenderStatePtr(TEXTURERASTER, nil); - -#ifdef RW_GL_USE_VAOS - glBindVertexArray(im2DVao); -#endif - - glBindBuffer(GL_ARRAY_BUFFER, im3DVbo); - glBufferData(GL_ARRAY_BUFFER, STARTVERTICES*sizeof(Im3DVertex), nil, GL_STREAM_DRAW); - glBufferSubData(GL_ARRAY_BUFFER, 0, numVertices*sizeof(Im3DVertex), vertices); -#ifndef RW_GL_USE_VAOS - setAttribPointers(im3dattribDesc, 3); -#endif - num3DVertices = numVertices; -} - -void -im3DRenderPrimitive(PrimitiveType primType) -{ - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im3DIbo); - - flushCache(); - glDrawArrays(primTypeMap[primType], 0, num3DVertices); -} - -void -im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices) -{ - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im3DIbo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, STARTINDICES*2, nil, GL_STREAM_DRAW); - glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, numIndices*2, indices); - - flushCache(); - glDrawElements(primTypeMap[primType], numIndices, - GL_UNSIGNED_SHORT, nil); -} - -void -im3DEnd(void) -{ -#ifndef RW_GL_USE_VAOS - disableAttribPointers(im3dattribDesc, 3); -#endif -} - -} -} - -#endif diff --git a/vendor/librw/src/gl/gl3matfx.cpp b/vendor/librw/src/gl/gl3matfx.cpp deleted file mode 100644 index df7cb34..0000000 --- a/vendor/librw/src/gl/gl3matfx.cpp +++ /dev/null @@ -1,212 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwrender.h" -#include "../rwengine.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwanim.h" -#include "../rwplugins.h" - -#include "rwgl3.h" -#include "rwgl3shader.h" -#include "rwgl3plg.h" - -#include "rwgl3impl.h" - -namespace rw { -namespace gl3 { - -#ifdef RW_OPENGL - -#define U(i) currentShader->uniformLocations[i] - -static Shader *envShader; -static int32 u_texMatrix; -static int32 u_fxparams; -static int32 u_colorClamp; - -void -matfxDefaultRender(InstanceDataHeader *header, InstanceData *inst, uint32 flags) -{ - Material *m; - m = inst->material; - - defaultShader->use(); - - setMaterial(flags, m->color, m->surfaceProps); - - setTexture(0, m->texture); - - rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); - - drawInst(header, inst); -} - -static Frame *lastEnvFrame; - -static RawMatrix normal2texcoord = { - { 0.5f, 0.0f, 0.0f }, 0.0f, - { 0.0f, -0.5f, 0.0f }, 0.0f, - { 0.0f, 0.0f, 1.0f }, 0.0f, - { 0.5f, 0.5f, 0.0f }, 1.0f -}; - -void -uploadEnvMatrix(Frame *frame) -{ - Matrix invMat; - if(frame == nil) - frame = engine->currentCamera->getFrame(); - - // cache the matrix across multiple meshes - static RawMatrix envMtx; -// can't do it, frame matrix may change -// if(frame != lastEnvFrame){ -// lastEnvFrame = frame; - { - - RawMatrix invMtx; - Matrix::invert(&invMat, frame->getLTM()); - convMatrix(&invMtx, &invMat); - invMtx.pos.set(0.0f, 0.0f, 0.0f); - RawMatrix::mult(&envMtx, &invMtx, &normal2texcoord); - } - glUniformMatrix4fv(U(u_texMatrix), 1, GL_FALSE, (float*)&envMtx); -} - -void -matfxEnvRender(InstanceDataHeader *header, InstanceData *inst, uint32 flags, MatFX::Env *env) -{ - Material *m; - m = inst->material; - - if(env->tex == nil || env->coefficient == 0.0f){ - matfxDefaultRender(header, inst, flags); - return; - } - - envShader->use(); - - setTexture(0, m->texture); - setTexture(1, env->tex); - uploadEnvMatrix(env->frame); - - setMaterial(flags, m->color, m->surfaceProps); - - float fxparams[2]; - fxparams[0] = env->coefficient; - fxparams[1] = env->fbAlpha ? 0.0f : 1.0f; - - glUniform2fv(U(u_fxparams), 1, fxparams); - static float zero[4]; - static float one[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; - // This clamps the vertex color below. With it we can achieve both PC and PS2 style matfx - if(MatFX::modulateEnvMap) - glUniform4fv(U(u_colorClamp), 1, zero); - else - glUniform4fv(U(u_colorClamp), 1, one); - - rw::SetRenderState(VERTEXALPHA, 1); - rw::SetRenderState(SRCBLEND, BLENDONE); - - drawInst(header, inst); - - rw::SetRenderState(SRCBLEND, BLENDSRCALPHA); -} - -void -matfxRenderCB(Atomic *atomic, InstanceDataHeader *header) -{ - uint32 flags = atomic->geometry->flags; - setWorldMatrix(atomic->getFrame()->getLTM()); - lightingCB(atomic); - - setupVertexInput(header); - - lastEnvFrame = nil; - - InstanceData *inst = header->inst; - int32 n = header->numMeshes; - - while(n--){ - MatFX *matfx = MatFX::get(inst->material); - - if(matfx == nil) - matfxDefaultRender(header, inst, flags); - else switch(matfx->type){ - case MatFX::ENVMAP: - matfxEnvRender(header, inst, flags, &matfx->fx[0].env); - break; - default: - matfxDefaultRender(header, inst, flags); - break; - } - inst++; - } - teardownVertexInput(header); -} - -ObjPipeline* -makeMatFXPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->instanceCB = defaultInstanceCB; - pipe->uninstanceCB = defaultUninstanceCB; - pipe->renderCB = matfxRenderCB; - pipe->pluginID = ID_MATFX; - pipe->pluginData = 0; - return pipe; -} - -static void* -matfxOpen(void *o, int32, int32) -{ - matFXGlobals.pipelines[PLATFORM_GL3] = makeMatFXPipeline(); - -#include "shaders/matfx_gl.inc" - const char *vs[] = { shaderDecl, header_vert_src, matfx_env_vert_src, nil }; - const char *fs[] = { shaderDecl, header_frag_src, matfx_env_frag_src, nil }; - envShader = Shader::create(vs, fs); - assert(envShader); - - return o; -} - -static void* -matfxClose(void *o, int32, int32) -{ - ((ObjPipeline*)matFXGlobals.pipelines[PLATFORM_GL3])->destroy(); - matFXGlobals.pipelines[PLATFORM_GL3] = nil; - - envShader->destroy(); - envShader = nil; - - return o; -} - -void -initMatFX(void) -{ - u_texMatrix = registerUniform("u_texMatrix"); - u_fxparams = registerUniform("u_fxparams"); - u_colorClamp = registerUniform("u_colorClamp"); - - Driver::registerPlugin(PLATFORM_GL3, 0, ID_MATFX, - matfxOpen, matfxClose); -} - -#else - -void initMatFX(void) { } - -#endif - -} -} - diff --git a/vendor/librw/src/gl/gl3pipe.cpp b/vendor/librw/src/gl/gl3pipe.cpp deleted file mode 100644 index 4df0b7c..0000000 --- a/vendor/librw/src/gl/gl3pipe.cpp +++ /dev/null @@ -1,333 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" - -#include "rwgl3.h" -#include "rwgl3shader.h" - -namespace rw { -namespace gl3 { - -// TODO: make some of these things platform-independent - -#ifdef RW_OPENGL - -void -freeInstanceData(Geometry *geometry) -{ - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_GL3) - return; - InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - geometry->instData = nil; - glDeleteBuffers(1, &header->ibo); - glDeleteBuffers(1, &header->vbo); -#ifdef RW_GL_USE_VAOS - glDeleteBuffers(1, &header->vao); -#endif - rwFree(header->indexBuffer); - rwFree(header->vertexBuffer); - rwFree(header->attribDesc); - rwFree(header->inst); - rwFree(header); -} - -void* -destroyNativeData(void *object, int32, int32) -{ - freeInstanceData((Geometry*)object); - return object; -} - -static InstanceDataHeader* -instanceMesh(rw::ObjPipeline *rwpipe, Geometry *geo) -{ - InstanceDataHeader *header = rwNewT(InstanceDataHeader, 1, MEMDUR_EVENT | ID_GEOMETRY); - MeshHeader *meshh = geo->meshHeader; - geo->instData = header; - header->platform = PLATFORM_GL3; - - header->serialNumber = meshh->serialNum; - header->numMeshes = meshh->numMeshes; - header->primType = meshh->flags == 1 ? GL_TRIANGLE_STRIP : GL_TRIANGLES; - header->totalNumVertex = geo->numVertices; - header->totalNumIndex = meshh->totalIndices; - header->inst = rwNewT(InstanceData, header->numMeshes, MEMDUR_EVENT | ID_GEOMETRY); - - header->indexBuffer = rwNewT(uint16, header->totalNumIndex, MEMDUR_EVENT | ID_GEOMETRY); - InstanceData *inst = header->inst; - Mesh *mesh = meshh->getMeshes(); - uint32 offset = 0; - for(uint32 i = 0; i < header->numMeshes; i++){ - findMinVertAndNumVertices(mesh->indices, mesh->numIndices, - &inst->minVert, &inst->numVertices); - assert(inst->minVert != 0xFFFFFFFF); - inst->numIndex = mesh->numIndices; - inst->material = mesh->material; - inst->vertexAlpha = 0; - inst->program = 0; - inst->offset = offset; - memcpy((uint8*)header->indexBuffer + inst->offset, - mesh->indices, inst->numIndex*2); - offset += inst->numIndex*2; - mesh++; - inst++; - } - - header->vertexBuffer = nil; - header->numAttribs = 0; - header->attribDesc = nil; - header->ibo = 0; - header->vbo = 0; - -#ifdef RW_GL_USE_VAOS - glGenVertexArrays(1, &header->vao); - glBindVertexArray(header->vao); -#endif - glGenBuffers(1, &header->ibo); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, header->totalNumIndex*2, - header->indexBuffer, GL_STATIC_DRAW); - - return header; -} - -static void -instance(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - // don't try to (re)instance native data - if(geo->flags & Geometry::NATIVE) - return; - - InstanceDataHeader *header = (InstanceDataHeader*)geo->instData; - if(geo->instData){ - // Already have instanced data, so check if we have to reinstance - assert(header->platform == PLATFORM_GL3); - if(header->serialNumber != geo->meshHeader->serialNum){ - // Mesh changed, so reinstance everything - freeInstanceData(geo); - } - } - - // no instance or complete reinstance - if(geo->instData == nil){ - geo->instData = instanceMesh(rwpipe, geo); - pipe->instanceCB(geo, (InstanceDataHeader*)geo->instData, 0); - }else if(geo->lockedSinceInst) - pipe->instanceCB(geo, (InstanceDataHeader*)geo->instData, 1); - - geo->lockedSinceInst = 0; -} - -static void -uninstance(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - assert(0 && "can't uninstance"); -} - -static void -render(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - pipe->instance(atomic); - assert(geo->instData != nil); - assert(geo->instData->platform == PLATFORM_GL3); - if(pipe->renderCB) - pipe->renderCB(atomic, (InstanceDataHeader*)geo->instData); -} - -void -ObjPipeline::init(void) -{ - this->rw::ObjPipeline::init(PLATFORM_GL3); - this->impl.instance = gl3::instance; - this->impl.uninstance = gl3::uninstance; - this->impl.render = gl3::render; - this->instanceCB = nil; - this->uninstanceCB = nil; - this->renderCB = nil; -} - -ObjPipeline* -ObjPipeline::create(void) -{ - ObjPipeline *pipe = rwNewT(ObjPipeline, 1, MEMDUR_GLOBAL); - pipe->init(); - return pipe; -} - -void -defaultInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance) -{ - AttribDesc *attribs, *a; - - bool isPrelit = !!(geo->flags & Geometry::PRELIT); - bool hasNormals = !!(geo->flags & Geometry::NORMALS); - - if(!reinstance){ - AttribDesc tmpAttribs[12]; - uint32 stride; - - // - // Create attribute descriptions - // - a = tmpAttribs; - stride = 0; - - // Positions - a->index = ATTRIB_POS; - a->size = 3; - a->type = GL_FLOAT; - a->normalized = GL_FALSE; - a->offset = stride; - stride += 12; - a++; - - // Normals - // TODO: compress - if(hasNormals){ - a->index = ATTRIB_NORMAL; - a->size = 3; - a->type = GL_FLOAT; - a->normalized = GL_FALSE; - a->offset = stride; - stride += 12; - a++; - } - - // Prelighting - if(isPrelit){ - a->index = ATTRIB_COLOR; - a->size = 4; - a->type = GL_UNSIGNED_BYTE; - a->normalized = GL_TRUE; - a->offset = stride; - stride += 4; - a++; - } - - // Texture coordinates - for(int32 n = 0; n < geo->numTexCoordSets; n++){ - a->index = ATTRIB_TEXCOORDS0+n; - a->size = 2; - a->type = GL_FLOAT; - a->normalized = GL_FALSE; - a->offset = stride; - stride += 8; - a++; - } - - header->numAttribs = a - tmpAttribs; - for(a = tmpAttribs; a != &tmpAttribs[header->numAttribs]; a++) - a->stride = stride; - header->attribDesc = rwNewT(AttribDesc, header->numAttribs, MEMDUR_EVENT | ID_GEOMETRY); - memcpy(header->attribDesc, tmpAttribs, - header->numAttribs*sizeof(AttribDesc)); - - // - // Allocate vertex buffer - // - header->vertexBuffer = rwNewT(uint8, header->totalNumVertex*stride, MEMDUR_EVENT | ID_GEOMETRY); - assert(header->vbo == 0); - glGenBuffers(1, &header->vbo); - } - - attribs = header->attribDesc; - - // - // Fill vertex buffer - // - - uint8 *verts = header->vertexBuffer; - - // Positions - if(!reinstance || geo->lockedSinceInst&Geometry::LOCKVERTICES){ - for(a = attribs; a->index != ATTRIB_POS; a++) - ; - instV3d(VERT_FLOAT3, verts + a->offset, - geo->morphTargets[0].vertices, - header->totalNumVertex, a->stride); - } - - // Normals - if(hasNormals && (!reinstance || geo->lockedSinceInst&Geometry::LOCKNORMALS)){ - for(a = attribs; a->index != ATTRIB_NORMAL; a++) - ; - instV3d(VERT_FLOAT3, verts + a->offset, - geo->morphTargets[0].normals, - header->totalNumVertex, a->stride); - } - - // Prelighting - if(isPrelit && (!reinstance || geo->lockedSinceInst&Geometry::LOCKPRELIGHT)){ - for(a = attribs; a->index != ATTRIB_COLOR; a++) - ; - int n = header->numMeshes; - InstanceData *inst = header->inst; - while(n--){ - assert(inst->minVert != 0xFFFFFFFF); - inst->vertexAlpha = instColor(VERT_RGBA, - verts + a->offset + a->stride*inst->minVert, - geo->colors + inst->minVert, - inst->numVertices, a->stride); - inst++; - } - } - - // Texture coordinates - for(int32 n = 0; n < geo->numTexCoordSets; n++){ - if(!reinstance || geo->lockedSinceInst&(Geometry::LOCKTEXCOORDS<index != ATTRIB_TEXCOORDS0+n; a++) - ; - instTexCoords(VERT_FLOAT2, verts + a->offset, - geo->texCoords[n], - header->totalNumVertex, a->stride); - } - } - -#ifdef RW_GL_USE_VAOS - glBindVertexArray(header->vao); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); -#endif - glBindBuffer(GL_ARRAY_BUFFER, header->vbo); - glBufferData(GL_ARRAY_BUFFER, header->totalNumVertex*attribs[0].stride, - header->vertexBuffer, GL_STATIC_DRAW); -#ifdef RW_GL_USE_VAOS - setAttribPointers(header->attribDesc, header->numAttribs); - glBindVertexArray(0); -#endif -} - -void -defaultUninstanceCB(Geometry *geo, InstanceDataHeader *header) -{ - assert(0 && "can't uninstance"); -} - -ObjPipeline* -makeDefaultPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->instanceCB = defaultInstanceCB; - pipe->uninstanceCB = defaultUninstanceCB; - pipe->renderCB = defaultRenderCB; - return pipe; -} - -#else -void *destroyNativeData(void *object, int32, int32) { return object; } -#endif - -} -} diff --git a/vendor/librw/src/gl/gl3raster.cpp b/vendor/librw/src/gl/gl3raster.cpp deleted file mode 100644 index 89881b4..0000000 --- a/vendor/librw/src/gl/gl3raster.cpp +++ /dev/null @@ -1,1042 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" - -#include "rwgl3.h" -#include "rwgl3shader.h" -#include "rwgl3impl.h" - -#define PLUGIN_ID ID_DRIVER - -namespace rw { -namespace gl3 { - -int32 nativeRasterOffset; - -static uint32 -getLevelSize(Raster *raster, int32 level) -{ - int i; - Gl3Raster *natras = GETGL3RASTEREXT(raster); - - int w = raster->originalWidth; - int h = raster->originalHeight; - int s = raster->originalStride; - int minDim = 1; - -#ifdef RW_OPENGL - switch(natras->internalFormat){ - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: - minDim = 4; - break; - } -#endif - - for(i = 0; i < level; i++){ - if(w > minDim){ - w /= 2; - s /= 2; - } - if(h > minDim) - h /= 2; - } - - return s*h; -} - -#ifdef RW_OPENGL - -static Raster* -rasterCreateTexture(Raster *raster) -{ - if(raster->format & (Raster::PAL4 | Raster::PAL8)){ - RWERROR((ERR_NOTEXTURE)); - return nil; - } - - Gl3Raster *natras = GETGL3RASTEREXT(raster); - switch(raster->format & 0xF00){ - case Raster::C8888: - natras->internalFormat = GL_RGBA8; - natras->format = GL_RGBA; - natras->type = GL_UNSIGNED_BYTE; - natras->hasAlpha = 1; - natras->bpp = 4; - raster->depth = 32; - break; - case Raster::C888: - natras->internalFormat = GL_RGB8; - natras->format = GL_RGB; - natras->type = GL_UNSIGNED_BYTE; - natras->hasAlpha = 0; - natras->bpp = 3; - raster->depth = 24; - break; - case Raster::C1555: - natras->internalFormat = GL_RGB5_A1; - natras->format = GL_RGBA; - natras->type = GL_UNSIGNED_SHORT_5_5_5_1; - natras->hasAlpha = 1; - natras->bpp = 2; - raster->depth = 16; - break; - default: - RWERROR((ERR_INVRASTER)); - return nil; - } - - if(gl3Caps.gles){ - // glReadPixels only supports GL_RGBA - natras->internalFormat = GL_RGBA8; - natras->format = GL_RGBA; - natras->type = GL_UNSIGNED_BYTE; - natras->bpp = 4; - } - - raster->stride = raster->width*natras->bpp; - - if(raster->format & Raster::MIPMAP){ - int w = raster->width; - int h = raster->height; - natras->numLevels = 1; - while(w != 1 || h != 1){ - natras->numLevels++; - if(w > 1) w /= 2; - if(h > 1) h /= 2; - } - } - natras->autogenMipmap = (raster->format & (Raster::MIPMAP|Raster::AUTOMIPMAP)) == (Raster::MIPMAP|Raster::AUTOMIPMAP); - if(natras->autogenMipmap) - natras->numLevels = 1; - - glGenTextures(1, &natras->texid); - uint32 prev = bindTexture(natras->texid); - glTexImage2D(GL_TEXTURE_2D, 0, natras->internalFormat, - raster->width, raster->height, - 0, natras->format, natras->type, nil); - // TODO: allocate other levels...probably - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, natras->numLevels-1); - natras->filterMode = 0; - natras->addressU = 0; - natras->addressV = 0; - natras->maxAnisotropy = 1; - - bindTexture(prev); - return raster; -} - -static Raster* -rasterCreateCameraTexture(Raster *raster) -{ - if(raster->format & (Raster::PAL4 | Raster::PAL8)){ - RWERROR((ERR_NOTEXTURE)); - return nil; - } - - // TODO: figure out what the backbuffer is and use that as a default - Gl3Raster *natras = GETGL3RASTEREXT(raster); - switch(raster->format & 0xF00){ - case Raster::C8888: - natras->internalFormat = GL_RGBA8; - natras->format = GL_RGBA; - natras->type = GL_UNSIGNED_BYTE; - natras->hasAlpha = 1; - natras->bpp = 4; - break; - case Raster::C888: - default: - natras->internalFormat = GL_RGB8; - natras->format = GL_RGB; - natras->type = GL_UNSIGNED_BYTE; - natras->hasAlpha = 0; - natras->bpp = 3; - break; - case Raster::C1555: - natras->internalFormat = GL_RGB5_A1; - natras->format = GL_RGBA; - natras->type = GL_UNSIGNED_SHORT_5_5_5_1; - natras->hasAlpha = 1; - natras->bpp = 2; - break; - } - - // i don't remember why this was once here... - if(gl3Caps.gles){ - // glReadPixels only supports GL_RGBA -// natras->internalFormat = GL_RGBA8; -// natras->format = GL_RGBA; -// natras->type = GL_UNSIGNED_BYTE; -// natras->bpp = 4; - } - - raster->stride = raster->width*natras->bpp; - - natras->autogenMipmap = (raster->format & (Raster::MIPMAP|Raster::AUTOMIPMAP)) == (Raster::MIPMAP|Raster::AUTOMIPMAP); - - glGenTextures(1, &natras->texid); - uint32 prev = bindTexture(natras->texid); - glTexImage2D(GL_TEXTURE_2D, 0, natras->internalFormat, - raster->width, raster->height, - 0, natras->format, natras->type, nil); - natras->filterMode = 0; - natras->addressU = 0; - natras->addressV = 0; - natras->maxAnisotropy = 1; - - bindTexture(prev); - - - glGenFramebuffers(1, &natras->fbo); - bindFramebuffer(natras->fbo); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, natras->texid, 0); - bindFramebuffer(0); - natras->fboMate = nil; - - return raster; -} - -static Raster* -rasterCreateCamera(Raster *raster) -{ - Gl3Raster *natras = GETGL3RASTEREXT(raster); - - // TODO: set/check width, height, depth, format? - - // used for locking right now - raster->format = Raster::C888; - natras->internalFormat = GL_RGB8; - natras->format = GL_RGB; - natras->type = GL_UNSIGNED_BYTE; - natras->hasAlpha = 0; - natras->bpp = 3; - - natras->autogenMipmap = 0; - - natras->texid = 0; - natras->fbo = 0; - natras->fboMate = nil; - - return raster; -} - -static Raster* -rasterCreateZbuffer(Raster *raster) -{ - Gl3Raster *natras = GETGL3RASTEREXT(raster); - - if(gl3Caps.gles){ - // have to use RBO on GLES!! - glGenRenderbuffers(1, &natras->texid); - glBindRenderbuffer(GL_RENDERBUFFER, natras->texid); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, raster->width, raster->height); - }else{ - // TODO: set/check width, height, depth, format? - natras->internalFormat = GL_DEPTH_STENCIL; - natras->format = GL_DEPTH_STENCIL; - natras->type = GL_UNSIGNED_INT_24_8; - - natras->autogenMipmap = 0; - - glGenTextures(1, &natras->texid); - uint32 prev = bindTexture(natras->texid); - glTexImage2D(GL_TEXTURE_2D, 0, natras->internalFormat, - raster->width, raster->height, - 0, natras->format, natras->type, nil); - natras->filterMode = 0; - natras->addressU = 0; - natras->addressV = 0; - natras->maxAnisotropy = 1; - - bindTexture(prev); - } - natras->fbo = 0; - natras->fboMate = nil; - - return raster; -} - - -#endif - - -void -allocateDXT(Raster *raster, int32 dxt, int32 numLevels, bool32 hasAlpha) -{ -#ifdef RW_OPENGL - assert(raster->type == Raster::TEXTURE); - - Gl3Raster *natras = GETGL3RASTEREXT(raster); - switch(dxt){ - case 1: - if(hasAlpha){ - natras->internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; - natras->format = GL_RGBA; - }else{ - natras->internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; - natras->format = GL_RGB; - } - // bogus, but stride*height should be the size of the image - // 4x4 in 8 bytes - raster->stride = raster->width/2; - break; - case 3: - natras->internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; - natras->format = GL_RGBA; - // 4x4 in 16 bytes - raster->stride = raster->width; - break; - case 5: - natras->internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; - natras->format = GL_RGBA; - // 4x4 in 16 bytes - raster->stride = raster->width; - break; - default: - assert(0 && "invalid DXT format"); - } - natras->type = GL_UNSIGNED_BYTE; - natras->hasAlpha = hasAlpha; - natras->bpp = 2; - raster->depth = 16; - - natras->isCompressed = 1; - if(raster->format & Raster::MIPMAP) - natras->numLevels = numLevels; - natras->autogenMipmap = (raster->format & (Raster::MIPMAP|Raster::AUTOMIPMAP)) == (Raster::MIPMAP|Raster::AUTOMIPMAP); - if(natras->autogenMipmap) - natras->numLevels = 1; - - glGenTextures(1, &natras->texid); - uint32 prev = bindTexture(natras->texid); - glTexImage2D(GL_TEXTURE_2D, 0, natras->internalFormat, - raster->width, raster->height, - 0, natras->format, natras->type, nil); - // TODO: allocate other levels...probably - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, natras->numLevels-1); - natras->filterMode = 0; - natras->addressU = 0; - natras->addressV = 0; - natras->maxAnisotropy = 1; - - bindTexture(prev); - - raster->originalStride = raster->stride; - - if(gl3Caps.gles && needToReadBackTextures){ - // Uh oh, need to keep a copy in cpu memory - int32 i; - int32 size = 0; - for(i = 0; i < natras->numLevels; i++) - size += getLevelSize(raster, i); - uint8 *data = (uint8*)rwNew(sizeof(RasterLevels)+sizeof(RasterLevels::Level)*(natras->numLevels-1)+size, - MEMDUR_EVENT | ID_DRIVER); - RasterLevels *levels = (RasterLevels*)data; - data += sizeof(RasterLevels)+sizeof(RasterLevels::Level)*(natras->numLevels-1); - levels->numlevels = natras->numLevels; - levels->format = 0; // not needed - for(i = 0; i < natras->numLevels; i++){ - levels->levels[i].data = data; - levels->levels[i].size = getLevelSize(raster, i); - levels->levels[i].width = 0; // we don't need those here, maybe later... - levels->levels[i].height = 0; - data += levels->levels[i].size; - } - natras->backingStore = levels; - } - - raster->flags &= ~Raster::DONTALLOCATE; -#endif -} - -/* -{ 0, 0, 0 }, -{ 16, 4, GL_RGBA }, // 1555 -{ 16, 3, GL_RGB }, // 565 -{ 16, 4, GL_RGBA }, // 4444 -{ 0, 0, 0 }, // LUM8 -{ 32, 4, GL_RGBA }, // 8888 -{ 24, 3, GL_RGB }, // 888 -{ 16, 3, GL_RGB }, // D16 -{ 24, 3, GL_RGB }, // D24 -{ 32, 4, GL_RGBA }, // D32 -{ 16, 3, GL_RGB }, // 555 - -0, -GL_RGB5_A1, -GL_RGB5, -GL_RGBA4, -0, -GL_RGBA8, -GL_RGB8, -GL_RGB5, -GL_RGB8, -GL_RGBA8, -GL_RGB5 -*/ - -Raster* -rasterCreate(Raster *raster) -{ - Gl3Raster *natras = GETGL3RASTEREXT(raster); - - natras->isCompressed = 0; - natras->hasAlpha = 0; - natras->numLevels = 1; - - Raster *ret = raster; - - if(raster->width == 0 || raster->height == 0){ - raster->flags |= Raster::DONTALLOCATE; - raster->stride = 0; - goto ret; - } - if(raster->flags & Raster::DONTALLOCATE) - goto ret; - - switch(raster->type){ -#ifdef RW_OPENGL - case Raster::NORMAL: - case Raster::TEXTURE: - ret = rasterCreateTexture(raster); - break; - case Raster::CAMERATEXTURE: - ret = rasterCreateCameraTexture(raster); - break; - case Raster::ZBUFFER: - ret = rasterCreateZbuffer(raster); - break; - case Raster::CAMERA: - ret = rasterCreateCamera(raster); - break; -#endif - - default: - RWERROR((ERR_INVRASTER)); - return nil; - } - -ret: - raster->originalWidth = raster->width; - raster->originalHeight = raster->height; - raster->originalStride = raster->stride; - raster->originalPixels = raster->pixels; - return ret; -} - -uint8* -rasterLock(Raster *raster, int32 level, int32 lockMode) -{ -#ifdef RW_OPENGL - Gl3Raster *natras GETGL3RASTEREXT(raster); - uint8 *px; - uint32 allocSz; - int i; - - assert(raster->privateFlags == 0); - - switch(raster->type){ - case Raster::NORMAL: - case Raster::TEXTURE: - case Raster::CAMERATEXTURE: - for(i = 0; i < level; i++){ - if(raster->width > 1){ - raster->width /= 2; - raster->stride /= 2; - } - if(raster->height > 1) - raster->height /= 2; - } - - allocSz = getLevelSize(raster, level); - px = (uint8*)rwMalloc(allocSz, MEMDUR_EVENT | ID_DRIVER); - assert(raster->pixels == nil); - raster->pixels = px; - - if(lockMode & Raster::LOCKREAD || !(lockMode & Raster::LOCKNOFETCH)){ - if(natras->isCompressed){ - if(natras->backingStore){ - assert(level < natras->backingStore->numlevels); - assert(allocSz >= natras->backingStore->levels[level].size); - memcpy(px, natras->backingStore->levels[level].data, allocSz); - }else{ - // GLES is losing here - uint32 prev = bindTexture(natras->texid); - glGetCompressedTexImage(GL_TEXTURE_2D, level, px); - bindTexture(prev); - } - }else if(gl3Caps.gles){ - GLuint fbo; - glGenFramebuffers(1, &fbo); - bindFramebuffer(fbo); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, natras->texid, 0); - GLenum e = glCheckFramebufferStatus(GL_FRAMEBUFFER); -assert(natras->format == GL_RGBA); - glReadPixels(0, 0, raster->width, raster->height, natras->format, natras->type, px); -//e = glGetError(); printf("GL err4 %x (%x)\n", e, natras->format); - bindFramebuffer(0); - glDeleteFramebuffers(1, &fbo); - }else{ - uint32 prev = bindTexture(natras->texid); - glPixelStorei(GL_PACK_ALIGNMENT, 1); - glGetTexImage(GL_TEXTURE_2D, level, natras->format, natras->type, px); - bindTexture(prev); - } - } - - raster->privateFlags = lockMode; - break; - - case Raster::CAMERA: - if(lockMode & Raster::PRIVATELOCK_WRITE) - assert(0 && "can't lock framebuffer for writing"); - raster->width = glGlobals.presentWidth; - raster->height = glGlobals.presentHeight; - raster->stride = raster->width*natras->bpp; - assert(natras->bpp == 3); - allocSz = raster->height*raster->stride; - px = (uint8*)rwMalloc(allocSz, MEMDUR_EVENT | ID_DRIVER); - assert(raster->pixels == nil); - raster->pixels = px; - glReadBuffer(GL_BACK); - glReadPixels(0, 0, raster->width, raster->height, GL_RGB, GL_UNSIGNED_BYTE, px); - - raster->privateFlags = lockMode; - break; - - default: - assert(0 && "cannot lock this type of raster yet"); - return nil; - } - - return px; -#else - return nil; -#endif -} - -void -rasterUnlock(Raster *raster, int32 level) -{ -#ifdef RW_OPENGL - Gl3Raster *natras = GETGL3RASTEREXT(raster); - - assert(raster->pixels); - - switch(raster->type){ - case Raster::NORMAL: - case Raster::TEXTURE: - case Raster::CAMERATEXTURE: - if(raster->privateFlags & Raster::LOCKWRITE){ - uint32 prev = bindTexture(natras->texid); - if(natras->isCompressed){ - glCompressedTexImage2D(GL_TEXTURE_2D, level, natras->internalFormat, - raster->width, raster->height, 0, - getLevelSize(raster, level), - raster->pixels); - if(natras->backingStore){ - assert(level < natras->backingStore->numlevels); - memcpy(natras->backingStore->levels[level].data, raster->pixels, - natras->backingStore->levels[level].size); - } - }else{ - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glTexImage2D(GL_TEXTURE_2D, level, natras->internalFormat, - raster->width, raster->height, - 0, natras->format, natras->type, raster->pixels); - } - if(level == 0 && natras->autogenMipmap) - glGenerateMipmap(GL_TEXTURE_2D); - bindTexture(prev); - } - break; - - case Raster::CAMERA: - // TODO: write? - break; - } - - rwFree(raster->pixels); - raster->pixels = nil; -#endif - raster->width = raster->originalWidth; - raster->height = raster->originalHeight; - raster->stride = raster->originalStride; - raster->pixels = raster->originalPixels; - raster->privateFlags = 0; -} - -int32 -rasterNumLevels(Raster *raster) -{ - return GETGL3RASTEREXT(raster)->numLevels; -} - -// Almost the same as d3d9 and ps2 function -bool32 -imageFindRasterFormat(Image *img, int32 type, - int32 *pWidth, int32 *pHeight, int32 *pDepth, int32 *pFormat) -{ - int32 width, height, depth, format; - - assert((type&0xF) == Raster::TEXTURE); - -// for(width = 1; width < img->width; width <<= 1); -// for(height = 1; height < img->height; height <<= 1); - // Perhaps non-power-of-2 textures are acceptable? - width = img->width; - height = img->height; - - depth = img->depth; - - if(depth <= 8) - depth = 32; - - switch(depth){ - case 32: - if(img->hasAlpha()) - format = Raster::C8888; - else{ - format = Raster::C888; - depth = 24; - } - break; - case 24: - format = Raster::C888; - break; - case 16: - format = Raster::C1555; - break; - - case 8: - case 4: - default: - RWERROR((ERR_INVRASTER)); - return 0; - } - - format |= type; - - *pWidth = width; - *pHeight = height; - *pDepth = depth; - *pFormat = format; - - return 1; -} - -bool32 -rasterFromImage(Raster *raster, Image *image) -{ - if((raster->type&0xF) != Raster::TEXTURE) - return 0; - - void (*conv)(uint8 *out, uint8 *in) = nil; - - // Unpalettize image if necessary but don't change original - Image *truecolimg = nil; - if(image->depth <= 8){ - truecolimg = Image::create(image->width, image->height, image->depth); - truecolimg->pixels = image->pixels; - truecolimg->stride = image->stride; - truecolimg->palette = image->palette; - truecolimg->unpalettize(); - image = truecolimg; - } - - Gl3Raster *natras = GETGL3RASTEREXT(raster); - int32 format = raster->format&0xF00; - assert(!natras->isCompressed); - switch(image->depth){ - case 32: - if(gl3Caps.gles) - conv = conv_RGBA8888_from_RGBA8888; - else if(format == Raster::C8888) - conv = conv_RGBA8888_from_RGBA8888; - else if(format == Raster::C888) - conv = conv_RGB888_from_RGB888; - else - goto err; - break; - case 24: - if(gl3Caps.gles) - conv = conv_RGBA8888_from_RGB888; - else if(format == Raster::C8888) - conv = conv_RGBA8888_from_RGB888; - else if(format == Raster::C888) - conv = conv_RGB888_from_RGB888; - else - goto err; - break; - case 16: - if(gl3Caps.gles) - conv = conv_RGBA8888_from_ARGB1555; - else if(format == Raster::C1555) - conv = conv_RGBA5551_from_ARGB1555; - else - goto err; - break; - - case 8: - case 4: - default: - err: - RWERROR((ERR_INVRASTER)); - return 0; - } - - natras->hasAlpha = image->hasAlpha(); - - bool unlock = false; - if(raster->pixels == nil){ - raster->lock(0, Raster::LOCKWRITE|Raster::LOCKNOFETCH); - unlock = true; - } - - uint8 *pixels = raster->pixels; - assert(pixels); - uint8 *imgpixels = image->pixels + (image->height-1)*image->stride; - - int x, y; - assert(image->width == raster->width); - assert(image->height == raster->height); - for(y = 0; y < image->height; y++){ - uint8 *imgrow = imgpixels; - uint8 *rasrow = pixels; - for(x = 0; x < image->width; x++){ - conv(rasrow, imgrow); - imgrow += image->bpp; - rasrow += natras->bpp; - } - imgpixels -= image->stride; - pixels += raster->stride; - } - if(unlock) - raster->unlock(0); - - if(truecolimg) - truecolimg->destroy(); - - return 1; -} - -Image* -rasterToImage(Raster *raster) -{ - int32 depth; - Image *image; - - bool unlock = false; - if(raster->pixels == nil){ - raster->lock(0, Raster::LOCKREAD); - unlock = true; - } - - Gl3Raster *natras = GETGL3RASTEREXT(raster); - if(natras->isCompressed){ - // TODO - RWERROR((ERR_INVRASTER)); - return nil; - } - - void (*conv)(uint8 *out, uint8 *in) = nil; - switch(raster->format & 0xF00){ - case Raster::C1555: - depth = 16; - conv = conv_ARGB1555_from_RGBA5551; - break; - case Raster::C8888: - depth = 32; - conv = conv_RGBA8888_from_RGBA8888; - break; - case Raster::C888: - depth = 24; - conv = conv_RGB888_from_RGB888; - break; - - default: - case Raster::C555: - case Raster::C565: - case Raster::C4444: - case Raster::LUM8: - RWERROR((ERR_INVRASTER)); - return nil; - } - - if(raster->format & Raster::PAL4 || - raster->format & Raster::PAL8){ - RWERROR((ERR_INVRASTER)); - return nil; - } - - uint8 *in, *out; - image = Image::create(raster->width, raster->height, depth); - image->allocate(); - - uint8 *imgpixels = image->pixels + (image->height-1)*image->stride; - uint8 *pixels = raster->pixels; - - int x, y; - assert(image->width == raster->width); - assert(image->height == raster->height); - for(y = 0; y < image->height; y++){ - uint8 *imgrow = imgpixels; - uint8 *rasrow = pixels; - for(x = 0; x < image->width; x++){ - conv(imgrow, rasrow); - imgrow += image->bpp; - rasrow += natras->bpp; - } - imgpixels -= image->stride; - pixels += raster->stride; - } - - if(unlock) - raster->unlock(0); - - return image; -} - -static void* -createNativeRaster(void *object, int32 offset, int32) -{ - Gl3Raster *ras = PLUGINOFFSET(Gl3Raster, object, offset); - ras->texid = 0; - ras->fbo = 0; - ras->fboMate = nil; - ras->backingStore = nil; - return object; -} - -static void* -destroyNativeRaster(void *object, int32 offset, int32) -{ - Raster *raster = (Raster*)object; - Gl3Raster *natras = PLUGINOFFSET(Gl3Raster, object, offset); -#ifdef RW_OPENGL - switch(raster->type){ - case Raster::NORMAL: - case Raster::TEXTURE: - glDeleteTextures(1, &natras->texid); - break; - - case Raster::CAMERATEXTURE: - if(natras->fboMate){ - // Break apart from currently associated zbuffer - Gl3Raster *zras = GETGL3RASTEREXT(natras->fboMate); - zras->fboMate = nil; - natras->fboMate = nil; - } - glDeleteFramebuffers(1, &natras->fbo); - glDeleteTextures(1, &natras->texid); - break; - - case Raster::ZBUFFER: - if(natras->fboMate){ - // Detatch from FBO we may be attached to - Gl3Raster *oldfb = GETGL3RASTEREXT(natras->fboMate); - if(oldfb->fbo){ - bindFramebuffer(oldfb->fbo); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0); - } - oldfb->fboMate = nil; - } - if(gl3Caps.gles) - glDeleteRenderbuffers(1, &natras->texid); - else - glDeleteTextures(1, &natras->texid); - break; - - case Raster::CAMERA: - if(natras->fboMate){ - // Break apart from currently associated zbuffer - Gl3Raster *zras = GETGL3RASTEREXT(natras->fboMate); - zras->fboMate = nil; - natras->fboMate = nil; - } - break; - } - natras->texid = 0; - natras->fbo = 0; - - free(natras->backingStore); - -#endif - return object; -} - -static void* -copyNativeRaster(void *dst, void *, int32 offset, int32) -{ - Gl3Raster *d = PLUGINOFFSET(Gl3Raster, dst, offset); - d->texid = 0; - d->fbo = 0; - d->fboMate = nil; - d->backingStore = nil; - return dst; -} - -Texture* -readNativeTexture(Stream *stream) -{ - uint32 platform; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - platform = stream->readU32(); - if(platform != PLATFORM_GL3){ - RWERROR((ERR_PLATFORM, platform)); - return nil; - } - Texture *tex = Texture::create(nil); - if(tex == nil) - return nil; - - // Texture - tex->filterAddressing = stream->readU32(); - stream->read8(tex->name, 32); - stream->read8(tex->mask, 32); - - // Raster - uint32 format = stream->readU32(); - int32 width = stream->readI32(); - int32 height = stream->readI32(); - int32 depth = stream->readI32(); - int32 numLevels = stream->readI32(); - - // Native raster - int32 subplatform = stream->readI32(); - int32 flags = stream->readI32(); - int32 compression = stream->readI32(); - - if(subplatform != gl3Caps.gles){ - tex->destroy(); - RWERROR((ERR_PLATFORM, platform)); - return nil; - } - - Raster *raster; - Gl3Raster *natras; - if(flags & 2){ - if(!gl3Caps.dxtSupported){ - tex->destroy(); - RWERROR((ERR_FORMAT_UNSUPPORTED)); - return nil; - } - raster = Raster::create(width, height, depth, format | Raster::TEXTURE | Raster::DONTALLOCATE, PLATFORM_GL3); - allocateDXT(raster, compression, numLevels, flags & 1); - }else{ - raster = Raster::create(width, height, depth, format | Raster::TEXTURE, PLATFORM_GL3); - } - assert(raster); - natras = GETGL3RASTEREXT(raster); - tex->raster = raster; - - uint32 size; - uint8 *data; - for(int32 i = 0; i < numLevels; i++){ - size = stream->readU32(); - data = raster->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH); - stream->read8(data, size); - raster->unlock(i); - } - return tex; -} - -void -writeNativeTexture(Texture *tex, Stream *stream) -{ - Raster *raster = tex->raster; - Gl3Raster *natras = GETGL3RASTEREXT(raster); - - int32 chunksize = getSizeNativeTexture(tex); - writeChunkHeader(stream, ID_STRUCT, chunksize-12); - stream->writeU32(PLATFORM_GL3); - - // Texture - stream->writeU32(tex->filterAddressing); - stream->write8(tex->name, 32); - stream->write8(tex->mask, 32); - - // Raster - int32 numLevels = natras->numLevels; - stream->writeI32(raster->format); - stream->writeI32(raster->width); - stream->writeI32(raster->height); - stream->writeI32(raster->depth); - stream->writeI32(numLevels); - - // Native raster - int32 flags = 0; - int32 compression = 0; - if(natras->hasAlpha) - flags |= 1; - if(natras->isCompressed){ - flags |= 2; - switch(natras->internalFormat){ -#ifdef RW_OPENGL - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: - compression = 1; - break; - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: - compression = 3; - break; - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: - compression = 5; - break; -#endif - default: - assert(0 && "unknown compression"); - } - } - stream->writeI32(gl3Caps.gles); - stream->writeI32(flags); - stream->writeI32(compression); - // TODO: auto mipmaps? - - uint32 size; - uint8 *data; - for(int32 i = 0; i < numLevels; i++){ - size = getLevelSize(raster, i); - stream->writeU32(size); - data = raster->lock(i, Raster::LOCKREAD); - stream->write8(data, size); - raster->unlock(i); - } -} - -uint32 -getSizeNativeTexture(Texture *tex) -{ - uint32 size = 12 + 72 + 32; - int32 levels = tex->raster->getNumLevels(); - for(int32 i = 0; i < levels; i++) - size += 4 + getLevelSize(tex->raster, i); - return size; -} - - - -void registerNativeRaster(void) -{ - nativeRasterOffset = Raster::registerPlugin(sizeof(Gl3Raster), - ID_RASTERGL3, - createNativeRaster, - destroyNativeRaster, - copyNativeRaster); -} - -} -} diff --git a/vendor/librw/src/gl/gl3render.cpp b/vendor/librw/src/gl/gl3render.cpp deleted file mode 100644 index fadbb45..0000000 --- a/vendor/librw/src/gl/gl3render.cpp +++ /dev/null @@ -1,174 +0,0 @@ -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwrender.h" -#include "../rwengine.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#ifdef RW_OPENGL -#include "rwgl3.h" -#include "rwgl3shader.h" - -#include "rwgl3impl.h" - -namespace rw { -namespace gl3 { - -#define MAX_LIGHTS - -void -drawInst_simple(InstanceDataHeader *header, InstanceData *inst) -{ - flushCache(); - glDrawElements(header->primType, inst->numIndex, - GL_UNSIGNED_SHORT, (void*)(uintptr)inst->offset); -} - -// Emulate PS2 GS alpha test FB_ONLY case: failed alpha writes to frame- but not to depth buffer -void -drawInst_GSemu(InstanceDataHeader *header, InstanceData *inst) -{ - uint32 hasAlpha; - int alphafunc, alpharef, gsalpharef; - int zwrite; - hasAlpha = getAlphaBlend(); - if(hasAlpha){ - zwrite = rw::GetRenderState(rw::ZWRITEENABLE); - alphafunc = rw::GetRenderState(rw::ALPHATESTFUNC); - if(zwrite){ - alpharef = rw::GetRenderState(rw::ALPHATESTREF); - gsalpharef = rw::GetRenderState(rw::GSALPHATESTREF); - - SetRenderState(rw::ALPHATESTFUNC, rw::ALPHAGREATEREQUAL); - SetRenderState(rw::ALPHATESTREF, gsalpharef); - drawInst_simple(header, inst); - SetRenderState(rw::ALPHATESTFUNC, rw::ALPHALESS); - SetRenderState(rw::ZWRITEENABLE, 0); - drawInst_simple(header, inst); - SetRenderState(rw::ZWRITEENABLE, 1); - SetRenderState(rw::ALPHATESTFUNC, alphafunc); - SetRenderState(rw::ALPHATESTREF, alpharef); - }else{ - SetRenderState(rw::ALPHATESTFUNC, rw::ALPHAALWAYS); - drawInst_simple(header, inst); - SetRenderState(rw::ALPHATESTFUNC, alphafunc); - } - }else - drawInst_simple(header, inst); -} - -void -drawInst(InstanceDataHeader *header, InstanceData *inst) -{ - if(rw::GetRenderState(rw::GSALPHATEST)) - drawInst_GSemu(header, inst); - else - drawInst_simple(header, inst); -} - - -void -setAttribPointers(AttribDesc *attribDescs, int32 numAttribs) -{ - AttribDesc *a; - for(a = attribDescs; a != &attribDescs[numAttribs]; a++){ - glEnableVertexAttribArray(a->index); - glVertexAttribPointer(a->index, a->size, a->type, a->normalized, - a->stride, (void*)(uint64)a->offset); - } -} - -void -disableAttribPointers(AttribDesc *attribDescs, int32 numAttribs) -{ - AttribDesc *a; - for(a = attribDescs; a != &attribDescs[numAttribs]; a++) - glDisableVertexAttribArray(a->index); -} - -void -setupVertexInput(InstanceDataHeader *header) -{ -#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 -} - -void -teardownVertexInput(InstanceDataHeader *header) -{ -#ifndef RW_GL_USE_VAOS - disableAttribPointers(header->attribDesc, header->numAttribs); -#endif -} - -int32 -lightingCB(Atomic *atomic) -{ - WorldLights lightData; - Light *directionals[8]; - Light *locals[8]; - lightData.directionals = directionals; - lightData.numDirectionals = 8; - lightData.locals = locals; - lightData.numLocals = 8; - - if(atomic->geometry->flags & rw::Geometry::LIGHT){ - ((World*)engine->currentWorld)->enumerateLights(atomic, &lightData); - if((atomic->geometry->flags & rw::Geometry::NORMALS) == 0){ - // Get rid of lights that need normals when we don't have any - lightData.numDirectionals = 0; - lightData.numLocals = 0; - } - return setLights(&lightData); - }else{ - memset(&lightData, 0, sizeof(lightData)); - return setLights(&lightData); - } -} - -void -defaultRenderCB(Atomic *atomic, InstanceDataHeader *header) -{ - Material *m; - - uint32 flags = atomic->geometry->flags; - setWorldMatrix(atomic->getFrame()->getLTM()); - lightingCB(atomic); - - setupVertexInput(header); - - InstanceData *inst = header->inst; - int32 n = header->numMeshes; - - defaultShader->use(); - - while(n--){ - m = inst->material; - - setMaterial(flags, m->color, m->surfaceProps); - - setTexture(0, m->texture); - - rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); - - drawInst(header, inst); - inst++; - } - teardownVertexInput(header); -} - - -} -} - -#endif - diff --git a/vendor/librw/src/gl/gl3shader.cpp b/vendor/librw/src/gl/gl3shader.cpp deleted file mode 100644 index 1b20231..0000000 --- a/vendor/librw/src/gl/gl3shader.cpp +++ /dev/null @@ -1,282 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#ifdef RW_OPENGL -#include "rwgl3.h" -#include "rwgl3shader.h" - -namespace rw { -namespace gl3 { - -#include "shaders/header_vs.inc" -#include "shaders/header_fs.inc" - -UniformRegistry uniformRegistry; -static char nameBuffer[(MAX_UNIFORMS + MAX_BLOCKS)*32]; // static because memory system isn't up yet when we register -static uint32 nameBufPtr; - -static char* -shader_strdup(const char *name) -{ - size_t len = strlen(name)+1; - char *s = &nameBuffer[nameBufPtr]; - nameBufPtr += len; - assert(nameBufPtr <= nelem(nameBuffer)); - memcpy(s, name, len); - return s; -} - -int32 -registerUniform(const char *name) -{ - int i; - i = findUniform(name); - if(i >= 0) return i; - // TODO: print error - if(uniformRegistry.numUniforms+1 >= MAX_UNIFORMS){ - assert(0 && "no space for uniform"); - return -1; - } - uniformRegistry.uniformNames[uniformRegistry.numUniforms] = shader_strdup(name); - return uniformRegistry.numUniforms++; -} - -int32 -findUniform(const char *name) -{ - int i; - for(i = 0; i < uniformRegistry.numUniforms; i++) - if(strcmp(name, uniformRegistry.uniformNames[i]) == 0) - return i; - return -1; -} - -int32 -registerBlock(const char *name) -{ - int i; - i = findBlock(name); - if(i >= 0) return i; - // TODO: print error - if(uniformRegistry.numBlocks+1 >= MAX_BLOCKS) - return -1; - uniformRegistry.blockNames[uniformRegistry.numBlocks] = shader_strdup(name); - return uniformRegistry.numBlocks++; -} - -int32 -findBlock(const char *name) -{ - int i; - for(i = 0; i < uniformRegistry.numBlocks; i++) - if(strcmp(name, uniformRegistry.blockNames[i]) == 0) - return i; - return -1; -} - -Shader *currentShader; - -static void -printShaderSource(const char **src) -{ - int f; - const char *file; - bool printline; - int line = 1; - for(f = 0; src[f]; f++){ - int fileline = 1; - char c; - file = src[f]; - printline = true; - while(c = *file++, c != '\0'){ - if(printline) - printf("%.4d/%d:%.4d: ", line++, f, fileline++); - putchar(c); - printline = c == '\n'; - } - putchar('\n'); - } -} - -static int -compileshader(GLenum type, const char **src, GLuint *shader) -{ - GLint n; - GLint shdr, success; - GLint len; - char *log; - - for(n = 0; src[n]; n++); - - shdr = glCreateShader(type); - glShaderSource(shdr, n, src, nil); - glCompileShader(shdr); - glGetShaderiv(shdr, GL_COMPILE_STATUS, &success); - if(!success){ - printShaderSource(src); - fprintf(stderr, "Error in %s shader\n", - type == GL_VERTEX_SHADER ? "vertex" : "fragment"); - glGetShaderiv(shdr, GL_INFO_LOG_LENGTH, &len); - log = (char*)rwMalloc(len, MEMDUR_FUNCTION); - glGetShaderInfoLog(shdr, len, nil, log); - fprintf(stderr, "%s\n", log); - rwFree(log); - return 1; - } - *shader = shdr; - return 0; -} - -static int -linkprogram(GLint vs, GLint fs, GLuint *program) -{ - GLint prog, success; - GLint len; - char *log; - - prog = glCreateProgram(); - - if(gl3Caps.glversion < 30){ - // TODO: perhaps just do this always and get rid of the layout stuff? - glBindAttribLocation(prog, ATTRIB_POS, "in_pos"); - glBindAttribLocation(prog, ATTRIB_NORMAL, "in_normal"); - glBindAttribLocation(prog, ATTRIB_COLOR, "in_color"); - glBindAttribLocation(prog, ATTRIB_WEIGHTS, "in_weights"); - glBindAttribLocation(prog, ATTRIB_INDICES, "in_indices"); - glBindAttribLocation(prog, ATTRIB_TEXCOORDS0, "in_tex0"); - glBindAttribLocation(prog, ATTRIB_TEXCOORDS1, "in_tex1"); - } - - glAttachShader(prog, vs); - glAttachShader(prog, fs); - glLinkProgram(prog); - glGetProgramiv(prog, GL_LINK_STATUS, &success); - if(!success){ - fprintf(stderr, "Error in program\n"); - glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len); - log = (char*)rwMalloc(len, MEMDUR_FUNCTION); - glGetProgramInfoLog(prog, len, nil, log); - fprintf(stderr, "%s\n", log); - rwFree(log); - return 1; - } - *program = prog; - return 0; -} - -Shader* -Shader::create(const char **vsrc, const char **fsrc) -{ - GLuint vs, fs, program; - int i; - int fail; - - fail = compileshader(GL_VERTEX_SHADER, vsrc, &vs); - if(fail) - return nil; - - fail = compileshader(GL_FRAGMENT_SHADER, fsrc, &fs); - if(fail){ - glDeleteShader(vs); - return nil; - } - - fail = linkprogram(vs, fs, &program); - if(fail){ - glDeleteShader(fs); - glDeleteShader(vs); - return nil; - } - glDeleteProgram(vs); - glDeleteProgram(fs); - - Shader *sh = rwNewT(Shader, 1, MEMDUR_EVENT | ID_DRIVER); // or global? - -#ifdef xxxRW_GLES2 - int numUniforms; - glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &numUniforms); - for(i = 0; i < numUniforms; i++){ - GLint size; - GLenum type; - char name[100]; - glGetActiveUniform(program, i, 100, nil, &size, &type, name); - printf("%d %d %s\n", size, type, name); - } - printf("\n"); -#endif - -#ifdef xxxRW_GLES2 - int numAttribs; - glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &numAttribs); - for(i = 0; i < numAttribs; i++){ - GLint size; - GLenum type; - char name[100]; - glGetActiveAttrib(program, i, 100, nil, &size, &type, name); - GLint bind = glGetAttribLocation(program, name); - printf("%d %d %s. %d\n", size, type, name, bind); - } - printf("\n"); -#endif - - // set uniform block binding - for(i = 0; i < uniformRegistry.numBlocks; i++){ - int idx = glGetUniformBlockIndex(program, - uniformRegistry.blockNames[i]); - if(idx >= 0) - glUniformBlockBinding(program, idx, i); - } - - // query uniform locations - sh->program = program; - sh->uniformLocations = rwNewT(GLint, uniformRegistry.numUniforms, MEMDUR_EVENT | ID_DRIVER); - for(i = 0; i < uniformRegistry.numUniforms; i++) - sh->uniformLocations[i] = glGetUniformLocation(program, - uniformRegistry.uniformNames[i]); - - // set samplers - glUseProgram(program); - char name[64]; - GLint loc; - for(i = 0; i < 4; i++){ - sprintf(name, "tex%d", i); - loc = glGetUniformLocation(program, name); - glUniform1i(loc, i); - } - - // reset program - if(currentShader) - glUseProgram(currentShader->program); - - return sh; -} - -void -Shader::use(void) -{ - if(currentShader != this){ - glUseProgram(this->program); - currentShader = this; - } -} - -void -Shader::destroy(void) -{ - glDeleteProgram(this->program); - rwFree(this->uniformLocations); - rwFree(this); -} - -} -} - -#endif diff --git a/vendor/librw/src/gl/gl3skin.cpp b/vendor/librw/src/gl/gl3skin.cpp deleted file mode 100644 index d97498a..0000000 --- a/vendor/librw/src/gl/gl3skin.cpp +++ /dev/null @@ -1,342 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwrender.h" -#include "../rwengine.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwanim.h" -#include "../rwplugins.h" - -#include "rwgl3.h" -#include "rwgl3shader.h" -#include "rwgl3plg.h" - -#include "rwgl3impl.h" - -namespace rw { -namespace gl3 { - -#ifdef RW_OPENGL - -#define U(i) currentShader->uniformLocations[i] - -static Shader *skinShader; -static int32 u_boneMatrices; - -void -skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance) -{ - AttribDesc *attribs, *a; - - bool isPrelit = !!(geo->flags & Geometry::PRELIT); - bool hasNormals = !!(geo->flags & Geometry::NORMALS); - - if(!reinstance){ - AttribDesc tmpAttribs[14]; - uint32 stride; - - // - // Create attribute descriptions - // - a = tmpAttribs; - stride = 0; - - // Positions - a->index = ATTRIB_POS; - a->size = 3; - a->type = GL_FLOAT; - a->normalized = GL_FALSE; - a->offset = stride; - stride += 12; - a++; - - // Normals - // TODO: compress - if(hasNormals){ - a->index = ATTRIB_NORMAL; - a->size = 3; - a->type = GL_FLOAT; - a->normalized = GL_FALSE; - a->offset = stride; - stride += 12; - a++; - } - - // Prelighting - if(isPrelit){ - a->index = ATTRIB_COLOR; - a->size = 4; - a->type = GL_UNSIGNED_BYTE; - a->normalized = GL_TRUE; - a->offset = stride; - stride += 4; - a++; - } - - // Texture coordinates - for(int32 n = 0; n < geo->numTexCoordSets; n++){ - a->index = ATTRIB_TEXCOORDS0+n; - a->size = 2; - a->type = GL_FLOAT; - a->normalized = GL_FALSE; - a->offset = stride; - stride += 8; - a++; - } - - // Weights - a->index = ATTRIB_WEIGHTS; - a->size = 4; - a->type = GL_FLOAT; - a->normalized = GL_FALSE; - a->offset = stride; - stride += 16; - a++; - - // Indices - a->index = ATTRIB_INDICES; - a->size = 4; - a->type = GL_UNSIGNED_BYTE; - a->normalized = GL_FALSE; - a->offset = stride; - stride += 4; - a++; - - header->numAttribs = a - tmpAttribs; - for(a = tmpAttribs; a != &tmpAttribs[header->numAttribs]; a++) - a->stride = stride; - header->attribDesc = rwNewT(AttribDesc, header->numAttribs, MEMDUR_EVENT | ID_GEOMETRY); - memcpy(header->attribDesc, tmpAttribs, - header->numAttribs*sizeof(AttribDesc)); - - // - // Allocate vertex buffer - // - header->vertexBuffer = rwNewT(uint8, header->totalNumVertex*stride, MEMDUR_EVENT | ID_GEOMETRY); - assert(header->vbo == 0); - glGenBuffers(1, &header->vbo); - } - - Skin *skin = Skin::get(geo); - attribs = header->attribDesc; - - // - // Fill vertex buffer - // - - uint8 *verts = header->vertexBuffer; - - // Positions - if(!reinstance || geo->lockedSinceInst&Geometry::LOCKVERTICES){ - for(a = attribs; a->index != ATTRIB_POS; a++) - ; - instV3d(VERT_FLOAT3, verts + a->offset, - geo->morphTargets[0].vertices, - header->totalNumVertex, a->stride); - } - - // Normals - if(hasNormals && (!reinstance || geo->lockedSinceInst&Geometry::LOCKNORMALS)){ - for(a = attribs; a->index != ATTRIB_NORMAL; a++) - ; - instV3d(VERT_FLOAT3, verts + a->offset, - geo->morphTargets[0].normals, - header->totalNumVertex, a->stride); - } - - // Prelighting - if(isPrelit && (!reinstance || geo->lockedSinceInst&Geometry::LOCKPRELIGHT)){ - for(a = attribs; a->index != ATTRIB_COLOR; a++) - ; - instColor(VERT_RGBA, verts + a->offset, - geo->colors, - header->totalNumVertex, a->stride); - } - - // Texture coordinates - for(int32 n = 0; n < geo->numTexCoordSets; n++){ - if(!reinstance || geo->lockedSinceInst&(Geometry::LOCKTEXCOORDS<index != ATTRIB_TEXCOORDS0+n; a++) - ; - instTexCoords(VERT_FLOAT2, verts + a->offset, - geo->texCoords[n], - header->totalNumVertex, a->stride); - } - } - - // Weights - if(!reinstance){ - for(a = attribs; a->index != ATTRIB_WEIGHTS; a++) - ; - float *w = skin->weights; - instV4d(VERT_FLOAT4, verts + a->offset, - (V4d*)w, - header->totalNumVertex, a->stride); - } - - // Indices - if(!reinstance){ - for(a = attribs; a->index != ATTRIB_INDICES; a++) - ; - // not really colors of course but what the heck - instColor(VERT_RGBA, verts + a->offset, - (RGBA*)skin->indices, - header->totalNumVertex, a->stride); - } - -#ifdef RW_GL_USE_VAOS - glBindVertexArray(header->vao); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); -#endif - glBindBuffer(GL_ARRAY_BUFFER, header->vbo); - glBufferData(GL_ARRAY_BUFFER, header->totalNumVertex*attribs[0].stride, - header->vertexBuffer, GL_STATIC_DRAW); -#ifdef RW_GL_USE_VAOS - setAttribPointers(header->attribDesc, header->numAttribs); - glBindVertexArray(0); -#endif -} - -void -skinUninstanceCB(Geometry *geo, InstanceDataHeader *header) -{ - assert(0 && "can't uninstance"); -} - -static float skinMatrices[64*16]; - -void -uploadSkinMatrices(Atomic *a) -{ - int i; - Skin *skin = Skin::get(a->geometry); - Matrix *m = (Matrix*)skinMatrices; - HAnimHierarchy *hier = Skin::getHierarchy(a); - - if(hier){ - Matrix *invMats = (Matrix*)skin->inverseMatrices; - Matrix tmp; - - assert(skin->numBones == hier->numNodes); - if(hier->flags & HAnimHierarchy::LOCALSPACEMATRICES){ - for(i = 0; i < hier->numNodes; i++){ - invMats[i].flags = 0; - Matrix::mult(m, &invMats[i], &hier->matrices[i]); - m++; - } - }else{ - Matrix invAtmMat; - Matrix::invert(&invAtmMat, a->getFrame()->getLTM()); - for(i = 0; i < hier->numNodes; i++){ - invMats[i].flags = 0; - Matrix::mult(&tmp, &hier->matrices[i], &invAtmMat); - Matrix::mult(m, &invMats[i], &tmp); - m++; - } - } - }else{ - for(i = 0; i < skin->numBones; i++){ - m->setIdentity(); - m++; - } - } - glUniformMatrix4fv(U(u_boneMatrices), 64, GL_FALSE, - (GLfloat*)skinMatrices); -} - -void -skinRenderCB(Atomic *atomic, InstanceDataHeader *header) -{ - Material *m; - - uint32 flags = atomic->geometry->flags; - setWorldMatrix(atomic->getFrame()->getLTM()); - lightingCB(atomic); - - setupVertexInput(header); - - InstanceData *inst = header->inst; - int32 n = header->numMeshes; - - skinShader->use(); - - uploadSkinMatrices(atomic); - - while(n--){ - m = inst->material; - - setMaterial(flags, m->color, m->surfaceProps); - - setTexture(0, m->texture); - - rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); - - drawInst(header, inst); - inst++; - } - teardownVertexInput(header); -} - -static void* -skinOpen(void *o, int32, int32) -{ - skinGlobals.pipelines[PLATFORM_GL3] = makeSkinPipeline(); - -#include "shaders/simple_fs_gl.inc" -#include "shaders/skin_gl.inc" - const char *vs[] = { shaderDecl, header_vert_src, skin_vert_src, nil }; - const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil }; - skinShader = Shader::create(vs, fs); - assert(skinShader); - - return o; -} - -static void* -skinClose(void *o, int32, int32) -{ - ((ObjPipeline*)skinGlobals.pipelines[PLATFORM_GL3])->destroy(); - skinGlobals.pipelines[PLATFORM_GL3] = nil; - - skinShader->destroy(); - skinShader = nil; - - return o; -} - -void -initSkin(void) -{ - u_boneMatrices = registerUniform("u_boneMatrices"); - - Driver::registerPlugin(PLATFORM_GL3, 0, ID_SKIN, - skinOpen, skinClose); -} - -ObjPipeline* -makeSkinPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->instanceCB = skinInstanceCB; - pipe->uninstanceCB = skinUninstanceCB; - pipe->renderCB = skinRenderCB; - pipe->pluginID = ID_SKIN; - pipe->pluginData = 1; - return pipe; -} - -#else - -void initSkin(void) { } - -#endif - -} -} - diff --git a/vendor/librw/src/gl/glad/glad.c b/vendor/librw/src/gl/glad/glad.c deleted file mode 100644 index 05161d1..0000000 --- a/vendor/librw/src/gl/glad/glad.c +++ /dev/null @@ -1,1590 +0,0 @@ -/* - - OpenGL, OpenGL ES loader generated by glad 0.1.34 on Wed Feb 17 15:35:25 2021. - - Language/Generator: C/C++ - Specification: gl - APIs: gl=3.3, gles2=3.1 - Profile: core - Extensions: - GL_EXT_framebuffer_object, - GL_EXT_texture_compression_s3tc, - GL_EXT_texture_filter_anisotropic, - GL_KHR_debug, - GL_KHR_texture_compression_astc_ldr - Loader: False - Local files: False - Omit khrplatform: False - Reproducible: False - - Commandline: - --profile="core" --api="gl=3.3,gles2=3.1" --generator="c" --spec="gl" --no-loader --extensions="GL_EXT_framebuffer_object,GL_EXT_texture_compression_s3tc,GL_EXT_texture_filter_anisotropic,GL_KHR_debug,GL_KHR_texture_compression_astc_ldr" - Online: - https://glad.dav1d.de/#profile=core&language=c&specification=gl&api=gl%3D3.3&api=gles2%3D3.1&extensions=GL_EXT_framebuffer_object&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_filter_anisotropic&extensions=GL_KHR_debug&extensions=GL_KHR_texture_compression_astc_ldr -*/ - -#include -#include -#include -#include "glad.h" - -struct gladGLversionStruct GLVersion = { 0, 0 }; - -static int requested_major_version; -static int requested_minor_version; - -#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) -#define _GLAD_IS_SOME_NEW_VERSION 1 -#endif - -static int max_loaded_major; -static int max_loaded_minor; - -static const char *exts = NULL; -static int num_exts_i = 0; -static char **exts_i = NULL; - -static int get_exts(void) { -#ifdef _GLAD_IS_SOME_NEW_VERSION - if(max_loaded_major < 3) { -#endif - exts = (const char *)glGetString(GL_EXTENSIONS); -#ifdef _GLAD_IS_SOME_NEW_VERSION - } else { - unsigned int index; - - num_exts_i = 0; - glGetIntegerv(GL_NUM_EXTENSIONS, &num_exts_i); - if (num_exts_i > 0) { - exts_i = (char **)malloc((size_t)num_exts_i * (sizeof *exts_i)); - } - - if (exts_i == NULL) { - return 0; - } - - for(index = 0; index < (unsigned)num_exts_i; index++) { - const char *gl_str_tmp = (const char*)glGetStringi(GL_EXTENSIONS, index); - size_t len = strlen(gl_str_tmp); - - char *local_str = (char*)malloc((len+1) * sizeof(char)); - if(local_str != NULL) { - memcpy(local_str, gl_str_tmp, (len+1) * sizeof(char)); - } - exts_i[index] = local_str; - } - } -#endif - return 1; -} - -static void free_exts(void) { - if (exts_i != NULL) { - int index; - for(index = 0; index < num_exts_i; index++) { - free((char *)exts_i[index]); - } - free((void *)exts_i); - exts_i = NULL; - } -} - -static int has_ext(const char *ext) { -#ifdef _GLAD_IS_SOME_NEW_VERSION - if(max_loaded_major < 3) { -#endif - const char *extensions; - const char *loc; - const char *terminator; - extensions = exts; - if(extensions == NULL || ext == NULL) { - return 0; - } - - while(1) { - loc = strstr(extensions, ext); - if(loc == NULL) { - return 0; - } - - terminator = loc + strlen(ext); - if((loc == extensions || *(loc - 1) == ' ') && - (*terminator == ' ' || *terminator == '\0')) { - return 1; - } - extensions = terminator; - } -#ifdef _GLAD_IS_SOME_NEW_VERSION - } else { - int index; - if(exts_i == NULL) return 0; - for(index = 0; index < num_exts_i; index++) { - const char *e = exts_i[index]; - - if(exts_i[index] != NULL && strcmp(e, ext) == 0) { - return 1; - } - } - } -#endif - - return 0; -} -int GLAD_GL_VERSION_1_0 = 0; -int GLAD_GL_VERSION_1_1 = 0; -int GLAD_GL_VERSION_1_2 = 0; -int GLAD_GL_VERSION_1_3 = 0; -int GLAD_GL_VERSION_1_4 = 0; -int GLAD_GL_VERSION_1_5 = 0; -int GLAD_GL_VERSION_2_0 = 0; -int GLAD_GL_VERSION_2_1 = 0; -int GLAD_GL_VERSION_3_0 = 0; -int GLAD_GL_VERSION_3_1 = 0; -int GLAD_GL_VERSION_3_2 = 0; -int GLAD_GL_VERSION_3_3 = 0; -int GLAD_GL_ES_VERSION_2_0 = 0; -int GLAD_GL_ES_VERSION_3_0 = 0; -int GLAD_GL_ES_VERSION_3_1 = 0; -PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram = NULL; -PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL; -PFNGLATTACHSHADERPROC glad_glAttachShader = NULL; -PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender = NULL; -PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL; -PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL; -PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL; -PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL; -PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase = NULL; -PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange = NULL; -PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation = NULL; -PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed = NULL; -PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL; -PFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture = NULL; -PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline = NULL; -PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL; -PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL; -PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL; -PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback = NULL; -PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL; -PFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer = NULL; -PFNGLBLENDCOLORPROC glad_glBlendColor = NULL; -PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL; -PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL; -PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL; -PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL; -PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL; -PFNGLBUFFERDATAPROC glad_glBufferData = NULL; -PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL; -PFNGLCLAMPCOLORPROC glad_glClampColor = NULL; -PFNGLCLEARPROC glad_glClear = NULL; -PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL; -PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL; -PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL; -PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL; -PFNGLCLEARCOLORPROC glad_glClearColor = NULL; -PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL; -PFNGLCLEARDEPTHFPROC glad_glClearDepthf = NULL; -PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL; -PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL; -PFNGLCOLORMASKPROC glad_glColorMask = NULL; -PFNGLCOLORMASKIPROC glad_glColorMaski = NULL; -PFNGLCOLORP3UIPROC glad_glColorP3ui = NULL; -PFNGLCOLORP3UIVPROC glad_glColorP3uiv = NULL; -PFNGLCOLORP4UIPROC glad_glColorP4ui = NULL; -PFNGLCOLORP4UIVPROC glad_glColorP4uiv = NULL; -PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL; -PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL; -PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL; -PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL; -PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL; -PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL; -PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL; -PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL; -PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL; -PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL; -PFNGLCREATESHADERPROC glad_glCreateShader = NULL; -PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv = NULL; -PFNGLCULLFACEPROC glad_glCullFace = NULL; -PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL; -PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL; -PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL; -PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines = NULL; -PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL; -PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL; -PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL; -PFNGLDELETESHADERPROC glad_glDeleteShader = NULL; -PFNGLDELETESYNCPROC glad_glDeleteSync = NULL; -PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL; -PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks = NULL; -PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL; -PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL; -PFNGLDEPTHMASKPROC glad_glDepthMask = NULL; -PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL; -PFNGLDEPTHRANGEFPROC glad_glDepthRangef = NULL; -PFNGLDETACHSHADERPROC glad_glDetachShader = NULL; -PFNGLDISABLEPROC glad_glDisable = NULL; -PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL; -PFNGLDISABLEIPROC glad_glDisablei = NULL; -PFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute = NULL; -PFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect = NULL; -PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL; -PFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect = NULL; -PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL; -PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL; -PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL; -PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL; -PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex = NULL; -PFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect = NULL; -PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex = NULL; -PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL; -PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex = NULL; -PFNGLENABLEPROC glad_glEnable = NULL; -PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL; -PFNGLENABLEIPROC glad_glEnablei = NULL; -PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender = NULL; -PFNGLENDQUERYPROC glad_glEndQuery = NULL; -PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL; -PFNGLFENCESYNCPROC glad_glFenceSync = NULL; -PFNGLFINISHPROC glad_glFinish = NULL; -PFNGLFLUSHPROC glad_glFlush = NULL; -PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL; -PFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri = NULL; -PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL; -PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL; -PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL; -PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL; -PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL; -PFNGLFRONTFACEPROC glad_glFrontFace = NULL; -PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL; -PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL; -PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines = NULL; -PFNGLGENQUERIESPROC glad_glGenQueries = NULL; -PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL; -PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL; -PFNGLGENTEXTURESPROC glad_glGenTextures = NULL; -PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks = NULL; -PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL; -PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL; -PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL; -PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL; -PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL; -PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL; -PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName = NULL; -PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv = NULL; -PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders = NULL; -PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL; -PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v = NULL; -PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL; -PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v = NULL; -PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL; -PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL; -PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL; -PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage = NULL; -PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL; -PFNGLGETERRORPROC glad_glGetError = NULL; -PFNGLGETFLOATVPROC glad_glGetFloatv = NULL; -PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex = NULL; -PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL; -PFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv = NULL; -PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL; -PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL; -PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL; -PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL; -PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ = NULL; -PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv = NULL; -PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary = NULL; -PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL; -PFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv = NULL; -PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog = NULL; -PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv = NULL; -PFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex = NULL; -PFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation = NULL; -PFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName = NULL; -PFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv = NULL; -PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL; -PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL; -PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv = NULL; -PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v = NULL; -PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv = NULL; -PFNGLGETQUERYIVPROC glad_glGetQueryiv = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL; -PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv = NULL; -PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv = NULL; -PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL; -PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL; -PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL; -PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat = NULL; -PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL; -PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL; -PFNGLGETSTRINGPROC glad_glGetString = NULL; -PFNGLGETSTRINGIPROC glad_glGetStringi = NULL; -PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL; -PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL; -PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL; -PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv = NULL; -PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv = NULL; -PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv = NULL; -PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL; -PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying = NULL; -PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL; -PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL; -PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL; -PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL; -PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL; -PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL; -PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL; -PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL; -PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL; -PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL; -PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL; -PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL; -PFNGLHINTPROC glad_glHint = NULL; -PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer = NULL; -PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer = NULL; -PFNGLISBUFFERPROC glad_glIsBuffer = NULL; -PFNGLISENABLEDPROC glad_glIsEnabled = NULL; -PFNGLISENABLEDIPROC glad_glIsEnabledi = NULL; -PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL; -PFNGLISPROGRAMPROC glad_glIsProgram = NULL; -PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline = NULL; -PFNGLISQUERYPROC glad_glIsQuery = NULL; -PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL; -PFNGLISSAMPLERPROC glad_glIsSampler = NULL; -PFNGLISSHADERPROC glad_glIsShader = NULL; -PFNGLISSYNCPROC glad_glIsSync = NULL; -PFNGLISTEXTUREPROC glad_glIsTexture = NULL; -PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback = NULL; -PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL; -PFNGLLINEWIDTHPROC glad_glLineWidth = NULL; -PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL; -PFNGLLOGICOPPROC glad_glLogicOp = NULL; -PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL; -PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL; -PFNGLMEMORYBARRIERPROC glad_glMemoryBarrier = NULL; -PFNGLMEMORYBARRIERBYREGIONPROC glad_glMemoryBarrierByRegion = NULL; -PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays = NULL; -PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements = NULL; -PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex = NULL; -PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui = NULL; -PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv = NULL; -PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui = NULL; -PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv = NULL; -PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui = NULL; -PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv = NULL; -PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui = NULL; -PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv = NULL; -PFNGLNORMALP3UIPROC glad_glNormalP3ui = NULL; -PFNGLNORMALP3UIVPROC glad_glNormalP3uiv = NULL; -PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback = NULL; -PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL; -PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL; -PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL; -PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv = NULL; -PFNGLPOINTPARAMETERIPROC glad_glPointParameteri = NULL; -PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv = NULL; -PFNGLPOINTSIZEPROC glad_glPointSize = NULL; -PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL; -PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL; -PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL; -PFNGLPROGRAMBINARYPROC glad_glProgramBinary = NULL; -PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri = NULL; -PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f = NULL; -PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv = NULL; -PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i = NULL; -PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv = NULL; -PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui = NULL; -PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv = NULL; -PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f = NULL; -PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv = NULL; -PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i = NULL; -PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv = NULL; -PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui = NULL; -PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv = NULL; -PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f = NULL; -PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv = NULL; -PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i = NULL; -PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv = NULL; -PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui = NULL; -PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv = NULL; -PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f = NULL; -PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv = NULL; -PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i = NULL; -PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv = NULL; -PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui = NULL; -PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv = NULL; -PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL; -PFNGLQUERYCOUNTERPROC glad_glQueryCounter = NULL; -PFNGLREADBUFFERPROC glad_glReadBuffer = NULL; -PFNGLREADPIXELSPROC glad_glReadPixels = NULL; -PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler = NULL; -PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL; -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL; -PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback = NULL; -PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL; -PFNGLSAMPLEMASKIPROC glad_glSampleMaski = NULL; -PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv = NULL; -PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv = NULL; -PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf = NULL; -PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv = NULL; -PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL; -PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL; -PFNGLSCISSORPROC glad_glScissor = NULL; -PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui = NULL; -PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv = NULL; -PFNGLSHADERBINARYPROC glad_glShaderBinary = NULL; -PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL; -PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL; -PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL; -PFNGLSTENCILMASKPROC glad_glStencilMask = NULL; -PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL; -PFNGLSTENCILOPPROC glad_glStencilOp = NULL; -PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL; -PFNGLTEXBUFFERPROC glad_glTexBuffer = NULL; -PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui = NULL; -PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv = NULL; -PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui = NULL; -PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv = NULL; -PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui = NULL; -PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv = NULL; -PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui = NULL; -PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv = NULL; -PFNGLTEXIMAGE1DPROC glad_glTexImage1D = NULL; -PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL; -PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample = NULL; -PFNGLTEXIMAGE3DPROC glad_glTexImage3D = NULL; -PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample = NULL; -PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv = NULL; -PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv = NULL; -PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL; -PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL; -PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL; -PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL; -PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D = NULL; -PFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample = NULL; -PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D = NULL; -PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL; -PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL; -PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL; -PFNGLUNIFORM1FPROC glad_glUniform1f = NULL; -PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL; -PFNGLUNIFORM1IPROC glad_glUniform1i = NULL; -PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL; -PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL; -PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL; -PFNGLUNIFORM2FPROC glad_glUniform2f = NULL; -PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL; -PFNGLUNIFORM2IPROC glad_glUniform2i = NULL; -PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL; -PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL; -PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL; -PFNGLUNIFORM3FPROC glad_glUniform3f = NULL; -PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL; -PFNGLUNIFORM3IPROC glad_glUniform3i = NULL; -PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL; -PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL; -PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL; -PFNGLUNIFORM4FPROC glad_glUniform4f = NULL; -PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL; -PFNGLUNIFORM4IPROC glad_glUniform4i = NULL; -PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL; -PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL; -PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL; -PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL; -PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL; -PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL; -PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL; -PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL; -PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL; -PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL; -PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL; -PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL; -PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL; -PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL; -PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL; -PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages = NULL; -PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL; -PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline = NULL; -PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL; -PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL; -PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL; -PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL; -PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s = NULL; -PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv = NULL; -PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d = NULL; -PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv = NULL; -PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL; -PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL; -PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s = NULL; -PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv = NULL; -PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d = NULL; -PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv = NULL; -PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL; -PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL; -PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s = NULL; -PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv = NULL; -PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv = NULL; -PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv = NULL; -PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv = NULL; -PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub = NULL; -PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv = NULL; -PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv = NULL; -PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv = NULL; -PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv = NULL; -PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d = NULL; -PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv = NULL; -PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL; -PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL; -PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv = NULL; -PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s = NULL; -PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL; -PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL; -PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL; -PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL; -PFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding = NULL; -PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL; -PFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat = NULL; -PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i = NULL; -PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv = NULL; -PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui = NULL; -PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv = NULL; -PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i = NULL; -PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv = NULL; -PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui = NULL; -PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv = NULL; -PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i = NULL; -PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv = NULL; -PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui = NULL; -PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv = NULL; -PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv = NULL; -PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i = NULL; -PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv = NULL; -PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv = NULL; -PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv = NULL; -PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL; -PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL; -PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv = NULL; -PFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat = NULL; -PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL; -PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui = NULL; -PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv = NULL; -PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui = NULL; -PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv = NULL; -PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui = NULL; -PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv = NULL; -PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui = NULL; -PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv = NULL; -PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL; -PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor = NULL; -PFNGLVERTEXP2UIPROC glad_glVertexP2ui = NULL; -PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv = NULL; -PFNGLVERTEXP3UIPROC glad_glVertexP3ui = NULL; -PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv = NULL; -PFNGLVERTEXP4UIPROC glad_glVertexP4ui = NULL; -PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv = NULL; -PFNGLVIEWPORTPROC glad_glViewport = NULL; -PFNGLWAITSYNCPROC glad_glWaitSync = NULL; -int GLAD_GL_EXT_framebuffer_object = 0; -int GLAD_GL_EXT_texture_compression_s3tc = 0; -int GLAD_GL_EXT_texture_filter_anisotropic = 0; -int GLAD_GL_KHR_debug = 0; -int GLAD_GL_KHR_texture_compression_astc_ldr = 0; -PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl = NULL; -PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert = NULL; -PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback = NULL; -PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog = NULL; -PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup = NULL; -PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup = NULL; -PFNGLOBJECTLABELPROC glad_glObjectLabel = NULL; -PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel = NULL; -PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel = NULL; -PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel = NULL; -PFNGLGETPOINTERVPROC glad_glGetPointerv = NULL; -PFNGLDEBUGMESSAGECONTROLKHRPROC glad_glDebugMessageControlKHR = NULL; -PFNGLDEBUGMESSAGEINSERTKHRPROC glad_glDebugMessageInsertKHR = NULL; -PFNGLDEBUGMESSAGECALLBACKKHRPROC glad_glDebugMessageCallbackKHR = NULL; -PFNGLGETDEBUGMESSAGELOGKHRPROC glad_glGetDebugMessageLogKHR = NULL; -PFNGLPUSHDEBUGGROUPKHRPROC glad_glPushDebugGroupKHR = NULL; -PFNGLPOPDEBUGGROUPKHRPROC glad_glPopDebugGroupKHR = NULL; -PFNGLOBJECTLABELKHRPROC glad_glObjectLabelKHR = NULL; -PFNGLGETOBJECTLABELKHRPROC glad_glGetObjectLabelKHR = NULL; -PFNGLOBJECTPTRLABELKHRPROC glad_glObjectPtrLabelKHR = NULL; -PFNGLGETOBJECTPTRLABELKHRPROC glad_glGetObjectPtrLabelKHR = NULL; -PFNGLGETPOINTERVKHRPROC glad_glGetPointervKHR = NULL; -static void load_GL_VERSION_1_0(GLADloadproc load) { - if(!GLAD_GL_VERSION_1_0) return; - glad_glCullFace = (PFNGLCULLFACEPROC)load("glCullFace"); - glad_glFrontFace = (PFNGLFRONTFACEPROC)load("glFrontFace"); - glad_glHint = (PFNGLHINTPROC)load("glHint"); - glad_glLineWidth = (PFNGLLINEWIDTHPROC)load("glLineWidth"); - glad_glPointSize = (PFNGLPOINTSIZEPROC)load("glPointSize"); - glad_glPolygonMode = (PFNGLPOLYGONMODEPROC)load("glPolygonMode"); - glad_glScissor = (PFNGLSCISSORPROC)load("glScissor"); - glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC)load("glTexParameterf"); - glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC)load("glTexParameterfv"); - glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC)load("glTexParameteri"); - glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC)load("glTexParameteriv"); - glad_glTexImage1D = (PFNGLTEXIMAGE1DPROC)load("glTexImage1D"); - glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC)load("glTexImage2D"); - glad_glDrawBuffer = (PFNGLDRAWBUFFERPROC)load("glDrawBuffer"); - glad_glClear = (PFNGLCLEARPROC)load("glClear"); - glad_glClearColor = (PFNGLCLEARCOLORPROC)load("glClearColor"); - glad_glClearStencil = (PFNGLCLEARSTENCILPROC)load("glClearStencil"); - glad_glClearDepth = (PFNGLCLEARDEPTHPROC)load("glClearDepth"); - glad_glStencilMask = (PFNGLSTENCILMASKPROC)load("glStencilMask"); - glad_glColorMask = (PFNGLCOLORMASKPROC)load("glColorMask"); - glad_glDepthMask = (PFNGLDEPTHMASKPROC)load("glDepthMask"); - glad_glDisable = (PFNGLDISABLEPROC)load("glDisable"); - glad_glEnable = (PFNGLENABLEPROC)load("glEnable"); - glad_glFinish = (PFNGLFINISHPROC)load("glFinish"); - glad_glFlush = (PFNGLFLUSHPROC)load("glFlush"); - glad_glBlendFunc = (PFNGLBLENDFUNCPROC)load("glBlendFunc"); - glad_glLogicOp = (PFNGLLOGICOPPROC)load("glLogicOp"); - glad_glStencilFunc = (PFNGLSTENCILFUNCPROC)load("glStencilFunc"); - glad_glStencilOp = (PFNGLSTENCILOPPROC)load("glStencilOp"); - glad_glDepthFunc = (PFNGLDEPTHFUNCPROC)load("glDepthFunc"); - glad_glPixelStoref = (PFNGLPIXELSTOREFPROC)load("glPixelStoref"); - glad_glPixelStorei = (PFNGLPIXELSTOREIPROC)load("glPixelStorei"); - glad_glReadBuffer = (PFNGLREADBUFFERPROC)load("glReadBuffer"); - glad_glReadPixels = (PFNGLREADPIXELSPROC)load("glReadPixels"); - glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC)load("glGetBooleanv"); - glad_glGetDoublev = (PFNGLGETDOUBLEVPROC)load("glGetDoublev"); - glad_glGetError = (PFNGLGETERRORPROC)load("glGetError"); - glad_glGetFloatv = (PFNGLGETFLOATVPROC)load("glGetFloatv"); - glad_glGetIntegerv = (PFNGLGETINTEGERVPROC)load("glGetIntegerv"); - glad_glGetString = (PFNGLGETSTRINGPROC)load("glGetString"); - glad_glGetTexImage = (PFNGLGETTEXIMAGEPROC)load("glGetTexImage"); - glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC)load("glGetTexParameterfv"); - glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC)load("glGetTexParameteriv"); - glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC)load("glGetTexLevelParameterfv"); - glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC)load("glGetTexLevelParameteriv"); - glad_glIsEnabled = (PFNGLISENABLEDPROC)load("glIsEnabled"); - glad_glDepthRange = (PFNGLDEPTHRANGEPROC)load("glDepthRange"); - glad_glViewport = (PFNGLVIEWPORTPROC)load("glViewport"); -} -static void load_GL_VERSION_1_1(GLADloadproc load) { - if(!GLAD_GL_VERSION_1_1) return; - glad_glDrawArrays = (PFNGLDRAWARRAYSPROC)load("glDrawArrays"); - glad_glDrawElements = (PFNGLDRAWELEMENTSPROC)load("glDrawElements"); - glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC)load("glPolygonOffset"); - glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC)load("glCopyTexImage1D"); - glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC)load("glCopyTexImage2D"); - glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC)load("glCopyTexSubImage1D"); - glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)load("glCopyTexSubImage2D"); - glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC)load("glTexSubImage1D"); - glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)load("glTexSubImage2D"); - glad_glBindTexture = (PFNGLBINDTEXTUREPROC)load("glBindTexture"); - glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC)load("glDeleteTextures"); - glad_glGenTextures = (PFNGLGENTEXTURESPROC)load("glGenTextures"); - glad_glIsTexture = (PFNGLISTEXTUREPROC)load("glIsTexture"); -} -static void load_GL_VERSION_1_2(GLADloadproc load) { - if(!GLAD_GL_VERSION_1_2) return; - glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)load("glDrawRangeElements"); - glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC)load("glTexImage3D"); - glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)load("glTexSubImage3D"); - glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)load("glCopyTexSubImage3D"); -} -static void load_GL_VERSION_1_3(GLADloadproc load) { - if(!GLAD_GL_VERSION_1_3) return; - glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC)load("glActiveTexture"); - glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)load("glSampleCoverage"); - glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)load("glCompressedTexImage3D"); - glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)load("glCompressedTexImage2D"); - glad_glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)load("glCompressedTexImage1D"); - glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)load("glCompressedTexSubImage3D"); - glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)load("glCompressedTexSubImage2D"); - glad_glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)load("glCompressedTexSubImage1D"); - glad_glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)load("glGetCompressedTexImage"); -} -static void load_GL_VERSION_1_4(GLADloadproc load) { - if(!GLAD_GL_VERSION_1_4) return; - glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)load("glBlendFuncSeparate"); - glad_glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)load("glMultiDrawArrays"); - glad_glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)load("glMultiDrawElements"); - glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC)load("glPointParameterf"); - glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)load("glPointParameterfv"); - glad_glPointParameteri = (PFNGLPOINTPARAMETERIPROC)load("glPointParameteri"); - glad_glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)load("glPointParameteriv"); - glad_glBlendColor = (PFNGLBLENDCOLORPROC)load("glBlendColor"); - glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC)load("glBlendEquation"); -} -static void load_GL_VERSION_1_5(GLADloadproc load) { - if(!GLAD_GL_VERSION_1_5) return; - glad_glGenQueries = (PFNGLGENQUERIESPROC)load("glGenQueries"); - glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC)load("glDeleteQueries"); - glad_glIsQuery = (PFNGLISQUERYPROC)load("glIsQuery"); - glad_glBeginQuery = (PFNGLBEGINQUERYPROC)load("glBeginQuery"); - glad_glEndQuery = (PFNGLENDQUERYPROC)load("glEndQuery"); - glad_glGetQueryiv = (PFNGLGETQUERYIVPROC)load("glGetQueryiv"); - glad_glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)load("glGetQueryObjectiv"); - glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)load("glGetQueryObjectuiv"); - glad_glBindBuffer = (PFNGLBINDBUFFERPROC)load("glBindBuffer"); - glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)load("glDeleteBuffers"); - glad_glGenBuffers = (PFNGLGENBUFFERSPROC)load("glGenBuffers"); - glad_glIsBuffer = (PFNGLISBUFFERPROC)load("glIsBuffer"); - glad_glBufferData = (PFNGLBUFFERDATAPROC)load("glBufferData"); - glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC)load("glBufferSubData"); - glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)load("glGetBufferSubData"); - glad_glMapBuffer = (PFNGLMAPBUFFERPROC)load("glMapBuffer"); - glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)load("glUnmapBuffer"); - glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)load("glGetBufferParameteriv"); - glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)load("glGetBufferPointerv"); -} -static void load_GL_VERSION_2_0(GLADloadproc load) { - if(!GLAD_GL_VERSION_2_0) return; - glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)load("glBlendEquationSeparate"); - glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC)load("glDrawBuffers"); - glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)load("glStencilOpSeparate"); - glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)load("glStencilFuncSeparate"); - glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)load("glStencilMaskSeparate"); - glad_glAttachShader = (PFNGLATTACHSHADERPROC)load("glAttachShader"); - glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)load("glBindAttribLocation"); - glad_glCompileShader = (PFNGLCOMPILESHADERPROC)load("glCompileShader"); - glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC)load("glCreateProgram"); - glad_glCreateShader = (PFNGLCREATESHADERPROC)load("glCreateShader"); - glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC)load("glDeleteProgram"); - glad_glDeleteShader = (PFNGLDELETESHADERPROC)load("glDeleteShader"); - glad_glDetachShader = (PFNGLDETACHSHADERPROC)load("glDetachShader"); - glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)load("glDisableVertexAttribArray"); - glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)load("glEnableVertexAttribArray"); - glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)load("glGetActiveAttrib"); - glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)load("glGetActiveUniform"); - glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)load("glGetAttachedShaders"); - glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)load("glGetAttribLocation"); - glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC)load("glGetProgramiv"); - glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)load("glGetProgramInfoLog"); - glad_glGetShaderiv = (PFNGLGETSHADERIVPROC)load("glGetShaderiv"); - glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)load("glGetShaderInfoLog"); - glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)load("glGetShaderSource"); - glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)load("glGetUniformLocation"); - glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC)load("glGetUniformfv"); - glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC)load("glGetUniformiv"); - glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)load("glGetVertexAttribdv"); - glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)load("glGetVertexAttribfv"); - glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)load("glGetVertexAttribiv"); - glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)load("glGetVertexAttribPointerv"); - glad_glIsProgram = (PFNGLISPROGRAMPROC)load("glIsProgram"); - glad_glIsShader = (PFNGLISSHADERPROC)load("glIsShader"); - glad_glLinkProgram = (PFNGLLINKPROGRAMPROC)load("glLinkProgram"); - glad_glShaderSource = (PFNGLSHADERSOURCEPROC)load("glShaderSource"); - glad_glUseProgram = (PFNGLUSEPROGRAMPROC)load("glUseProgram"); - glad_glUniform1f = (PFNGLUNIFORM1FPROC)load("glUniform1f"); - glad_glUniform2f = (PFNGLUNIFORM2FPROC)load("glUniform2f"); - glad_glUniform3f = (PFNGLUNIFORM3FPROC)load("glUniform3f"); - glad_glUniform4f = (PFNGLUNIFORM4FPROC)load("glUniform4f"); - glad_glUniform1i = (PFNGLUNIFORM1IPROC)load("glUniform1i"); - glad_glUniform2i = (PFNGLUNIFORM2IPROC)load("glUniform2i"); - glad_glUniform3i = (PFNGLUNIFORM3IPROC)load("glUniform3i"); - glad_glUniform4i = (PFNGLUNIFORM4IPROC)load("glUniform4i"); - glad_glUniform1fv = (PFNGLUNIFORM1FVPROC)load("glUniform1fv"); - glad_glUniform2fv = (PFNGLUNIFORM2FVPROC)load("glUniform2fv"); - glad_glUniform3fv = (PFNGLUNIFORM3FVPROC)load("glUniform3fv"); - glad_glUniform4fv = (PFNGLUNIFORM4FVPROC)load("glUniform4fv"); - glad_glUniform1iv = (PFNGLUNIFORM1IVPROC)load("glUniform1iv"); - glad_glUniform2iv = (PFNGLUNIFORM2IVPROC)load("glUniform2iv"); - glad_glUniform3iv = (PFNGLUNIFORM3IVPROC)load("glUniform3iv"); - glad_glUniform4iv = (PFNGLUNIFORM4IVPROC)load("glUniform4iv"); - glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)load("glUniformMatrix2fv"); - glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)load("glUniformMatrix3fv"); - glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)load("glUniformMatrix4fv"); - glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)load("glValidateProgram"); - glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)load("glVertexAttrib1d"); - glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)load("glVertexAttrib1dv"); - glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)load("glVertexAttrib1f"); - glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)load("glVertexAttrib1fv"); - glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)load("glVertexAttrib1s"); - glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)load("glVertexAttrib1sv"); - glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)load("glVertexAttrib2d"); - glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)load("glVertexAttrib2dv"); - glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)load("glVertexAttrib2f"); - glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)load("glVertexAttrib2fv"); - glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)load("glVertexAttrib2s"); - glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)load("glVertexAttrib2sv"); - glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)load("glVertexAttrib3d"); - glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)load("glVertexAttrib3dv"); - glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)load("glVertexAttrib3f"); - glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)load("glVertexAttrib3fv"); - glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)load("glVertexAttrib3s"); - glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)load("glVertexAttrib3sv"); - glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)load("glVertexAttrib4Nbv"); - glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)load("glVertexAttrib4Niv"); - glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)load("glVertexAttrib4Nsv"); - glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)load("glVertexAttrib4Nub"); - glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)load("glVertexAttrib4Nubv"); - glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)load("glVertexAttrib4Nuiv"); - glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)load("glVertexAttrib4Nusv"); - glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)load("glVertexAttrib4bv"); - glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)load("glVertexAttrib4d"); - glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)load("glVertexAttrib4dv"); - glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)load("glVertexAttrib4f"); - glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)load("glVertexAttrib4fv"); - glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)load("glVertexAttrib4iv"); - glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)load("glVertexAttrib4s"); - glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)load("glVertexAttrib4sv"); - glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)load("glVertexAttrib4ubv"); - glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)load("glVertexAttrib4uiv"); - glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)load("glVertexAttrib4usv"); - glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)load("glVertexAttribPointer"); -} -static void load_GL_VERSION_2_1(GLADloadproc load) { - if(!GLAD_GL_VERSION_2_1) return; - glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)load("glUniformMatrix2x3fv"); - glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)load("glUniformMatrix3x2fv"); - glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)load("glUniformMatrix2x4fv"); - glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)load("glUniformMatrix4x2fv"); - glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)load("glUniformMatrix3x4fv"); - glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)load("glUniformMatrix4x3fv"); -} -static void load_GL_VERSION_3_0(GLADloadproc load) { - if(!GLAD_GL_VERSION_3_0) return; - glad_glColorMaski = (PFNGLCOLORMASKIPROC)load("glColorMaski"); - glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)load("glGetBooleani_v"); - glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)load("glGetIntegeri_v"); - glad_glEnablei = (PFNGLENABLEIPROC)load("glEnablei"); - glad_glDisablei = (PFNGLDISABLEIPROC)load("glDisablei"); - glad_glIsEnabledi = (PFNGLISENABLEDIPROC)load("glIsEnabledi"); - glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)load("glBeginTransformFeedback"); - glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)load("glEndTransformFeedback"); - glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)load("glBindBufferRange"); - glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)load("glBindBufferBase"); - glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)load("glTransformFeedbackVaryings"); - glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)load("glGetTransformFeedbackVarying"); - glad_glClampColor = (PFNGLCLAMPCOLORPROC)load("glClampColor"); - glad_glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)load("glBeginConditionalRender"); - glad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)load("glEndConditionalRender"); - glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)load("glVertexAttribIPointer"); - glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)load("glGetVertexAttribIiv"); - glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)load("glGetVertexAttribIuiv"); - glad_glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)load("glVertexAttribI1i"); - glad_glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)load("glVertexAttribI2i"); - glad_glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)load("glVertexAttribI3i"); - glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)load("glVertexAttribI4i"); - glad_glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)load("glVertexAttribI1ui"); - glad_glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)load("glVertexAttribI2ui"); - glad_glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)load("glVertexAttribI3ui"); - glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)load("glVertexAttribI4ui"); - glad_glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)load("glVertexAttribI1iv"); - glad_glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)load("glVertexAttribI2iv"); - glad_glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)load("glVertexAttribI3iv"); - glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)load("glVertexAttribI4iv"); - glad_glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)load("glVertexAttribI1uiv"); - glad_glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)load("glVertexAttribI2uiv"); - glad_glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)load("glVertexAttribI3uiv"); - glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)load("glVertexAttribI4uiv"); - glad_glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)load("glVertexAttribI4bv"); - glad_glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)load("glVertexAttribI4sv"); - glad_glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)load("glVertexAttribI4ubv"); - glad_glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)load("glVertexAttribI4usv"); - glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)load("glGetUniformuiv"); - glad_glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)load("glBindFragDataLocation"); - glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)load("glGetFragDataLocation"); - glad_glUniform1ui = (PFNGLUNIFORM1UIPROC)load("glUniform1ui"); - glad_glUniform2ui = (PFNGLUNIFORM2UIPROC)load("glUniform2ui"); - glad_glUniform3ui = (PFNGLUNIFORM3UIPROC)load("glUniform3ui"); - glad_glUniform4ui = (PFNGLUNIFORM4UIPROC)load("glUniform4ui"); - glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC)load("glUniform1uiv"); - glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC)load("glUniform2uiv"); - glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC)load("glUniform3uiv"); - glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC)load("glUniform4uiv"); - glad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)load("glTexParameterIiv"); - glad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)load("glTexParameterIuiv"); - glad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)load("glGetTexParameterIiv"); - glad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)load("glGetTexParameterIuiv"); - glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)load("glClearBufferiv"); - glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)load("glClearBufferuiv"); - glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)load("glClearBufferfv"); - glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)load("glClearBufferfi"); - glad_glGetStringi = (PFNGLGETSTRINGIPROC)load("glGetStringi"); - glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)load("glIsRenderbuffer"); - glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)load("glBindRenderbuffer"); - glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)load("glDeleteRenderbuffers"); - glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)load("glGenRenderbuffers"); - glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)load("glRenderbufferStorage"); - glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)load("glGetRenderbufferParameteriv"); - glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)load("glIsFramebuffer"); - glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)load("glBindFramebuffer"); - glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)load("glDeleteFramebuffers"); - glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)load("glGenFramebuffers"); - glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)load("glCheckFramebufferStatus"); - glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)load("glFramebufferTexture1D"); - glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)load("glFramebufferTexture2D"); - glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)load("glFramebufferTexture3D"); - glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)load("glFramebufferRenderbuffer"); - glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)load("glGetFramebufferAttachmentParameteriv"); - glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)load("glGenerateMipmap"); - glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)load("glBlitFramebuffer"); - glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)load("glRenderbufferStorageMultisample"); - glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)load("glFramebufferTextureLayer"); - glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)load("glMapBufferRange"); - glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)load("glFlushMappedBufferRange"); - glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)load("glBindVertexArray"); - glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)load("glDeleteVertexArrays"); - glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)load("glGenVertexArrays"); - glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC)load("glIsVertexArray"); -} -static void load_GL_VERSION_3_1(GLADloadproc load) { - if(!GLAD_GL_VERSION_3_1) return; - glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)load("glDrawArraysInstanced"); - glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)load("glDrawElementsInstanced"); - glad_glTexBuffer = (PFNGLTEXBUFFERPROC)load("glTexBuffer"); - glad_glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)load("glPrimitiveRestartIndex"); - glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)load("glCopyBufferSubData"); - glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)load("glGetUniformIndices"); - glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)load("glGetActiveUniformsiv"); - glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)load("glGetActiveUniformName"); - glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)load("glGetUniformBlockIndex"); - glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)load("glGetActiveUniformBlockiv"); - glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)load("glGetActiveUniformBlockName"); - glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)load("glUniformBlockBinding"); - glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)load("glBindBufferRange"); - glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)load("glBindBufferBase"); - glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)load("glGetIntegeri_v"); -} -static void load_GL_VERSION_3_2(GLADloadproc load) { - if(!GLAD_GL_VERSION_3_2) return; - glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)load("glDrawElementsBaseVertex"); - glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)load("glDrawRangeElementsBaseVertex"); - glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)load("glDrawElementsInstancedBaseVertex"); - glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)load("glMultiDrawElementsBaseVertex"); - glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)load("glProvokingVertex"); - glad_glFenceSync = (PFNGLFENCESYNCPROC)load("glFenceSync"); - glad_glIsSync = (PFNGLISSYNCPROC)load("glIsSync"); - glad_glDeleteSync = (PFNGLDELETESYNCPROC)load("glDeleteSync"); - glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)load("glClientWaitSync"); - glad_glWaitSync = (PFNGLWAITSYNCPROC)load("glWaitSync"); - glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC)load("glGetInteger64v"); - glad_glGetSynciv = (PFNGLGETSYNCIVPROC)load("glGetSynciv"); - glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)load("glGetInteger64i_v"); - glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)load("glGetBufferParameteri64v"); - glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)load("glFramebufferTexture"); - glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)load("glTexImage2DMultisample"); - glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)load("glTexImage3DMultisample"); - glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)load("glGetMultisamplefv"); - glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC)load("glSampleMaski"); -} -static void load_GL_VERSION_3_3(GLADloadproc load) { - if(!GLAD_GL_VERSION_3_3) return; - glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)load("glBindFragDataLocationIndexed"); - glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)load("glGetFragDataIndex"); - glad_glGenSamplers = (PFNGLGENSAMPLERSPROC)load("glGenSamplers"); - glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)load("glDeleteSamplers"); - glad_glIsSampler = (PFNGLISSAMPLERPROC)load("glIsSampler"); - glad_glBindSampler = (PFNGLBINDSAMPLERPROC)load("glBindSampler"); - glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)load("glSamplerParameteri"); - glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)load("glSamplerParameteriv"); - glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)load("glSamplerParameterf"); - glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)load("glSamplerParameterfv"); - glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)load("glSamplerParameterIiv"); - glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)load("glSamplerParameterIuiv"); - glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)load("glGetSamplerParameteriv"); - glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)load("glGetSamplerParameterIiv"); - glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)load("glGetSamplerParameterfv"); - glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)load("glGetSamplerParameterIuiv"); - glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC)load("glQueryCounter"); - glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)load("glGetQueryObjecti64v"); - glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)load("glGetQueryObjectui64v"); - glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)load("glVertexAttribDivisor"); - glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)load("glVertexAttribP1ui"); - glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)load("glVertexAttribP1uiv"); - glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)load("glVertexAttribP2ui"); - glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)load("glVertexAttribP2uiv"); - glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)load("glVertexAttribP3ui"); - glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)load("glVertexAttribP3uiv"); - glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)load("glVertexAttribP4ui"); - glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)load("glVertexAttribP4uiv"); - glad_glVertexP2ui = (PFNGLVERTEXP2UIPROC)load("glVertexP2ui"); - glad_glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)load("glVertexP2uiv"); - glad_glVertexP3ui = (PFNGLVERTEXP3UIPROC)load("glVertexP3ui"); - glad_glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)load("glVertexP3uiv"); - glad_glVertexP4ui = (PFNGLVERTEXP4UIPROC)load("glVertexP4ui"); - glad_glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)load("glVertexP4uiv"); - glad_glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)load("glTexCoordP1ui"); - glad_glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)load("glTexCoordP1uiv"); - glad_glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)load("glTexCoordP2ui"); - glad_glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)load("glTexCoordP2uiv"); - glad_glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)load("glTexCoordP3ui"); - glad_glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)load("glTexCoordP3uiv"); - glad_glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)load("glTexCoordP4ui"); - glad_glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)load("glTexCoordP4uiv"); - glad_glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)load("glMultiTexCoordP1ui"); - glad_glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)load("glMultiTexCoordP1uiv"); - glad_glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)load("glMultiTexCoordP2ui"); - glad_glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)load("glMultiTexCoordP2uiv"); - glad_glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)load("glMultiTexCoordP3ui"); - glad_glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)load("glMultiTexCoordP3uiv"); - glad_glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)load("glMultiTexCoordP4ui"); - glad_glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)load("glMultiTexCoordP4uiv"); - glad_glNormalP3ui = (PFNGLNORMALP3UIPROC)load("glNormalP3ui"); - glad_glNormalP3uiv = (PFNGLNORMALP3UIVPROC)load("glNormalP3uiv"); - glad_glColorP3ui = (PFNGLCOLORP3UIPROC)load("glColorP3ui"); - glad_glColorP3uiv = (PFNGLCOLORP3UIVPROC)load("glColorP3uiv"); - glad_glColorP4ui = (PFNGLCOLORP4UIPROC)load("glColorP4ui"); - glad_glColorP4uiv = (PFNGLCOLORP4UIVPROC)load("glColorP4uiv"); - glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)load("glSecondaryColorP3ui"); - glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)load("glSecondaryColorP3uiv"); -} -static void load_GL_EXT_framebuffer_object(GLADloadproc load) { - if(!GLAD_GL_EXT_framebuffer_object || GLAD_GL_VERSION_3_0) return; - glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)load("glIsRenderbufferEXT"); - glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)load("glBindRenderbufferEXT"); - glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)load("glDeleteRenderbuffersEXT"); - glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)load("glGenRenderbuffersEXT"); - glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)load("glRenderbufferStorageEXT"); - glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)load("glGetRenderbufferParameterivEXT"); - glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)load("glIsFramebufferEXT"); - glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)load("glBindFramebufferEXT"); - glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)load("glDeleteFramebuffersEXT"); - glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)load("glGenFramebuffersEXT"); - glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)load("glCheckFramebufferStatusEXT"); - glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)load("glFramebufferTexture1DEXT"); - glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)load("glFramebufferTexture2DEXT"); - glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)load("glFramebufferTexture3DEXT"); - glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)load("glFramebufferRenderbufferEXT"); - glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)load("glGetFramebufferAttachmentParameterivEXT"); - glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)load("glGenerateMipmapEXT"); -} -static void load_GL_KHR_debug(GLADloadproc load) { - if(!GLAD_GL_KHR_debug) return; - glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)load("glDebugMessageControl"); - glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)load("glDebugMessageInsert"); - glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)load("glDebugMessageCallback"); - glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)load("glGetDebugMessageLog"); - glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)load("glPushDebugGroup"); - glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)load("glPopDebugGroup"); - glad_glObjectLabel = (PFNGLOBJECTLABELPROC)load("glObjectLabel"); - glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)load("glGetObjectLabel"); - glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)load("glObjectPtrLabel"); - glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)load("glGetObjectPtrLabel"); - glad_glGetPointerv = (PFNGLGETPOINTERVPROC)load("glGetPointerv"); - glad_glDebugMessageControlKHR = (PFNGLDEBUGMESSAGECONTROLKHRPROC)load("glDebugMessageControlKHR"); - glad_glDebugMessageInsertKHR = (PFNGLDEBUGMESSAGEINSERTKHRPROC)load("glDebugMessageInsertKHR"); - glad_glDebugMessageCallbackKHR = (PFNGLDEBUGMESSAGECALLBACKKHRPROC)load("glDebugMessageCallbackKHR"); - glad_glGetDebugMessageLogKHR = (PFNGLGETDEBUGMESSAGELOGKHRPROC)load("glGetDebugMessageLogKHR"); - glad_glPushDebugGroupKHR = (PFNGLPUSHDEBUGGROUPKHRPROC)load("glPushDebugGroupKHR"); - glad_glPopDebugGroupKHR = (PFNGLPOPDEBUGGROUPKHRPROC)load("glPopDebugGroupKHR"); - glad_glObjectLabelKHR = (PFNGLOBJECTLABELKHRPROC)load("glObjectLabelKHR"); - glad_glGetObjectLabelKHR = (PFNGLGETOBJECTLABELKHRPROC)load("glGetObjectLabelKHR"); - glad_glObjectPtrLabelKHR = (PFNGLOBJECTPTRLABELKHRPROC)load("glObjectPtrLabelKHR"); - glad_glGetObjectPtrLabelKHR = (PFNGLGETOBJECTPTRLABELKHRPROC)load("glGetObjectPtrLabelKHR"); - glad_glGetPointervKHR = (PFNGLGETPOINTERVKHRPROC)load("glGetPointervKHR"); -} -static int find_extensionsGL(void) { - if (!get_exts()) return 0; - GLAD_GL_EXT_framebuffer_object = has_ext("GL_EXT_framebuffer_object"); - GLAD_GL_EXT_texture_compression_s3tc = has_ext("GL_EXT_texture_compression_s3tc"); - GLAD_GL_EXT_texture_filter_anisotropic = has_ext("GL_EXT_texture_filter_anisotropic"); - GLAD_GL_KHR_debug = has_ext("GL_KHR_debug"); - GLAD_GL_KHR_texture_compression_astc_ldr = has_ext("GL_KHR_texture_compression_astc_ldr"); - free_exts(); - return 1; -} - -static void find_coreGL(void) { - - /* Thank you @elmindreda - * https://github.com/elmindreda/greg/blob/master/templates/greg.c.in#L176 - * https://github.com/glfw/glfw/blob/master/src/context.c#L36 - */ - int i, major, minor; - - const char* version; - const char* prefixes[] = { - "OpenGL ES-CM ", - "OpenGL ES-CL ", - "OpenGL ES ", - NULL - }; - - version = (const char*) glGetString(GL_VERSION); - if (!version) return; - - for (i = 0; prefixes[i]; i++) { - const size_t length = strlen(prefixes[i]); - if (strncmp(version, prefixes[i], length) == 0) { - version += length; - break; - } - } - -/* PR #18 */ -#ifdef _MSC_VER - sscanf_s(version, "%d.%d", &major, &minor); -#else - sscanf(version, "%d.%d", &major, &minor); -#endif - - if(major > requested_major_version) { - major = requested_major_version; - } - - if(major == requested_major_version && minor > requested_minor_version) { - minor = requested_minor_version; - } - - GLVersion.major = major; GLVersion.minor = minor; - max_loaded_major = major; max_loaded_minor = minor; - GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; - GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; - GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; - GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; - GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; - GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; - GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; - GLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2; - GLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; - GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; - GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; - GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3; - if (GLVersion.major > 3 || (GLVersion.major >= 3 && GLVersion.minor >= 3)) { - max_loaded_major = 3; - max_loaded_minor = 3; - } -} - -int gladLoadGLLoader(GLADloadproc load, int requestedVersion) { - requested_major_version = requestedVersion / 10; - requested_minor_version = requestedVersion % 10; - GLVersion.major = 0; GLVersion.minor = 0; - glGetString = (PFNGLGETSTRINGPROC)load("glGetString"); - if(glGetString == NULL) return 0; - if(glGetString(GL_VERSION) == NULL) return 0; - find_coreGL(); - load_GL_VERSION_1_0(load); - load_GL_VERSION_1_1(load); - load_GL_VERSION_1_2(load); - load_GL_VERSION_1_3(load); - load_GL_VERSION_1_4(load); - load_GL_VERSION_1_5(load); - load_GL_VERSION_2_0(load); - load_GL_VERSION_2_1(load); - load_GL_VERSION_3_0(load); - load_GL_VERSION_3_1(load); - load_GL_VERSION_3_2(load); - load_GL_VERSION_3_3(load); - - if (!find_extensionsGL()) return 0; - load_GL_EXT_framebuffer_object(load); - load_GL_KHR_debug(load); - return GLVersion.major != 0 || GLVersion.minor != 0; -} - -static void load_GL_ES_VERSION_2_0(GLADloadproc load) { - if(!GLAD_GL_ES_VERSION_2_0) return; - glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC)load("glActiveTexture"); - glad_glAttachShader = (PFNGLATTACHSHADERPROC)load("glAttachShader"); - glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)load("glBindAttribLocation"); - glad_glBindBuffer = (PFNGLBINDBUFFERPROC)load("glBindBuffer"); - glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)load("glBindFramebuffer"); - glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)load("glBindRenderbuffer"); - glad_glBindTexture = (PFNGLBINDTEXTUREPROC)load("glBindTexture"); - glad_glBlendColor = (PFNGLBLENDCOLORPROC)load("glBlendColor"); - glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC)load("glBlendEquation"); - glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)load("glBlendEquationSeparate"); - glad_glBlendFunc = (PFNGLBLENDFUNCPROC)load("glBlendFunc"); - glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)load("glBlendFuncSeparate"); - glad_glBufferData = (PFNGLBUFFERDATAPROC)load("glBufferData"); - glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC)load("glBufferSubData"); - glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)load("glCheckFramebufferStatus"); - glad_glClear = (PFNGLCLEARPROC)load("glClear"); - glad_glClearColor = (PFNGLCLEARCOLORPROC)load("glClearColor"); - glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC)load("glClearDepthf"); - glad_glClearStencil = (PFNGLCLEARSTENCILPROC)load("glClearStencil"); - glad_glColorMask = (PFNGLCOLORMASKPROC)load("glColorMask"); - glad_glCompileShader = (PFNGLCOMPILESHADERPROC)load("glCompileShader"); - glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)load("glCompressedTexImage2D"); - glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)load("glCompressedTexSubImage2D"); - glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC)load("glCopyTexImage2D"); - glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)load("glCopyTexSubImage2D"); - glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC)load("glCreateProgram"); - glad_glCreateShader = (PFNGLCREATESHADERPROC)load("glCreateShader"); - glad_glCullFace = (PFNGLCULLFACEPROC)load("glCullFace"); - glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)load("glDeleteBuffers"); - glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)load("glDeleteFramebuffers"); - glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC)load("glDeleteProgram"); - glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)load("glDeleteRenderbuffers"); - glad_glDeleteShader = (PFNGLDELETESHADERPROC)load("glDeleteShader"); - glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC)load("glDeleteTextures"); - glad_glDepthFunc = (PFNGLDEPTHFUNCPROC)load("glDepthFunc"); - glad_glDepthMask = (PFNGLDEPTHMASKPROC)load("glDepthMask"); - glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC)load("glDepthRangef"); - glad_glDetachShader = (PFNGLDETACHSHADERPROC)load("glDetachShader"); - glad_glDisable = (PFNGLDISABLEPROC)load("glDisable"); - glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)load("glDisableVertexAttribArray"); - glad_glDrawArrays = (PFNGLDRAWARRAYSPROC)load("glDrawArrays"); - glad_glDrawElements = (PFNGLDRAWELEMENTSPROC)load("glDrawElements"); - glad_glEnable = (PFNGLENABLEPROC)load("glEnable"); - glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)load("glEnableVertexAttribArray"); - glad_glFinish = (PFNGLFINISHPROC)load("glFinish"); - glad_glFlush = (PFNGLFLUSHPROC)load("glFlush"); - glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)load("glFramebufferRenderbuffer"); - glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)load("glFramebufferTexture2D"); - glad_glFrontFace = (PFNGLFRONTFACEPROC)load("glFrontFace"); - glad_glGenBuffers = (PFNGLGENBUFFERSPROC)load("glGenBuffers"); - glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)load("glGenerateMipmap"); - glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)load("glGenFramebuffers"); - glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)load("glGenRenderbuffers"); - glad_glGenTextures = (PFNGLGENTEXTURESPROC)load("glGenTextures"); - glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)load("glGetActiveAttrib"); - glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)load("glGetActiveUniform"); - glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)load("glGetAttachedShaders"); - glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)load("glGetAttribLocation"); - glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC)load("glGetBooleanv"); - glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)load("glGetBufferParameteriv"); - glad_glGetError = (PFNGLGETERRORPROC)load("glGetError"); - glad_glGetFloatv = (PFNGLGETFLOATVPROC)load("glGetFloatv"); - glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)load("glGetFramebufferAttachmentParameteriv"); - glad_glGetIntegerv = (PFNGLGETINTEGERVPROC)load("glGetIntegerv"); - glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC)load("glGetProgramiv"); - glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)load("glGetProgramInfoLog"); - glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)load("glGetRenderbufferParameteriv"); - glad_glGetShaderiv = (PFNGLGETSHADERIVPROC)load("glGetShaderiv"); - glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)load("glGetShaderInfoLog"); - glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)load("glGetShaderPrecisionFormat"); - glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)load("glGetShaderSource"); - glad_glGetString = (PFNGLGETSTRINGPROC)load("glGetString"); - glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC)load("glGetTexParameterfv"); - glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC)load("glGetTexParameteriv"); - glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC)load("glGetUniformfv"); - glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC)load("glGetUniformiv"); - glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)load("glGetUniformLocation"); - glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)load("glGetVertexAttribfv"); - glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)load("glGetVertexAttribiv"); - glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)load("glGetVertexAttribPointerv"); - glad_glHint = (PFNGLHINTPROC)load("glHint"); - glad_glIsBuffer = (PFNGLISBUFFERPROC)load("glIsBuffer"); - glad_glIsEnabled = (PFNGLISENABLEDPROC)load("glIsEnabled"); - glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)load("glIsFramebuffer"); - glad_glIsProgram = (PFNGLISPROGRAMPROC)load("glIsProgram"); - glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)load("glIsRenderbuffer"); - glad_glIsShader = (PFNGLISSHADERPROC)load("glIsShader"); - glad_glIsTexture = (PFNGLISTEXTUREPROC)load("glIsTexture"); - glad_glLineWidth = (PFNGLLINEWIDTHPROC)load("glLineWidth"); - glad_glLinkProgram = (PFNGLLINKPROGRAMPROC)load("glLinkProgram"); - glad_glPixelStorei = (PFNGLPIXELSTOREIPROC)load("glPixelStorei"); - glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC)load("glPolygonOffset"); - glad_glReadPixels = (PFNGLREADPIXELSPROC)load("glReadPixels"); - glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)load("glReleaseShaderCompiler"); - glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)load("glRenderbufferStorage"); - glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)load("glSampleCoverage"); - glad_glScissor = (PFNGLSCISSORPROC)load("glScissor"); - glad_glShaderBinary = (PFNGLSHADERBINARYPROC)load("glShaderBinary"); - glad_glShaderSource = (PFNGLSHADERSOURCEPROC)load("glShaderSource"); - glad_glStencilFunc = (PFNGLSTENCILFUNCPROC)load("glStencilFunc"); - glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)load("glStencilFuncSeparate"); - glad_glStencilMask = (PFNGLSTENCILMASKPROC)load("glStencilMask"); - glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)load("glStencilMaskSeparate"); - glad_glStencilOp = (PFNGLSTENCILOPPROC)load("glStencilOp"); - glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)load("glStencilOpSeparate"); - glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC)load("glTexImage2D"); - glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC)load("glTexParameterf"); - glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC)load("glTexParameterfv"); - glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC)load("glTexParameteri"); - glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC)load("glTexParameteriv"); - glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)load("glTexSubImage2D"); - glad_glUniform1f = (PFNGLUNIFORM1FPROC)load("glUniform1f"); - glad_glUniform1fv = (PFNGLUNIFORM1FVPROC)load("glUniform1fv"); - glad_glUniform1i = (PFNGLUNIFORM1IPROC)load("glUniform1i"); - glad_glUniform1iv = (PFNGLUNIFORM1IVPROC)load("glUniform1iv"); - glad_glUniform2f = (PFNGLUNIFORM2FPROC)load("glUniform2f"); - glad_glUniform2fv = (PFNGLUNIFORM2FVPROC)load("glUniform2fv"); - glad_glUniform2i = (PFNGLUNIFORM2IPROC)load("glUniform2i"); - glad_glUniform2iv = (PFNGLUNIFORM2IVPROC)load("glUniform2iv"); - glad_glUniform3f = (PFNGLUNIFORM3FPROC)load("glUniform3f"); - glad_glUniform3fv = (PFNGLUNIFORM3FVPROC)load("glUniform3fv"); - glad_glUniform3i = (PFNGLUNIFORM3IPROC)load("glUniform3i"); - glad_glUniform3iv = (PFNGLUNIFORM3IVPROC)load("glUniform3iv"); - glad_glUniform4f = (PFNGLUNIFORM4FPROC)load("glUniform4f"); - glad_glUniform4fv = (PFNGLUNIFORM4FVPROC)load("glUniform4fv"); - glad_glUniform4i = (PFNGLUNIFORM4IPROC)load("glUniform4i"); - glad_glUniform4iv = (PFNGLUNIFORM4IVPROC)load("glUniform4iv"); - glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)load("glUniformMatrix2fv"); - glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)load("glUniformMatrix3fv"); - glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)load("glUniformMatrix4fv"); - glad_glUseProgram = (PFNGLUSEPROGRAMPROC)load("glUseProgram"); - glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)load("glValidateProgram"); - glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)load("glVertexAttrib1f"); - glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)load("glVertexAttrib1fv"); - glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)load("glVertexAttrib2f"); - glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)load("glVertexAttrib2fv"); - glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)load("glVertexAttrib3f"); - glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)load("glVertexAttrib3fv"); - glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)load("glVertexAttrib4f"); - glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)load("glVertexAttrib4fv"); - glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)load("glVertexAttribPointer"); - glad_glViewport = (PFNGLVIEWPORTPROC)load("glViewport"); -} -static void load_GL_ES_VERSION_3_0(GLADloadproc load) { - if(!GLAD_GL_ES_VERSION_3_0) return; - glad_glReadBuffer = (PFNGLREADBUFFERPROC)load("glReadBuffer"); - glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)load("glDrawRangeElements"); - glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC)load("glTexImage3D"); - glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)load("glTexSubImage3D"); - glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)load("glCopyTexSubImage3D"); - glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)load("glCompressedTexImage3D"); - glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)load("glCompressedTexSubImage3D"); - glad_glGenQueries = (PFNGLGENQUERIESPROC)load("glGenQueries"); - glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC)load("glDeleteQueries"); - glad_glIsQuery = (PFNGLISQUERYPROC)load("glIsQuery"); - glad_glBeginQuery = (PFNGLBEGINQUERYPROC)load("glBeginQuery"); - glad_glEndQuery = (PFNGLENDQUERYPROC)load("glEndQuery"); - glad_glGetQueryiv = (PFNGLGETQUERYIVPROC)load("glGetQueryiv"); - glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)load("glGetQueryObjectuiv"); - glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)load("glUnmapBuffer"); - glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)load("glGetBufferPointerv"); - glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC)load("glDrawBuffers"); - glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)load("glUniformMatrix2x3fv"); - glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)load("glUniformMatrix3x2fv"); - glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)load("glUniformMatrix2x4fv"); - glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)load("glUniformMatrix4x2fv"); - glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)load("glUniformMatrix3x4fv"); - glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)load("glUniformMatrix4x3fv"); - glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)load("glBlitFramebuffer"); - glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)load("glRenderbufferStorageMultisample"); - glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)load("glFramebufferTextureLayer"); - glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)load("glMapBufferRange"); - glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)load("glFlushMappedBufferRange"); - glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)load("glBindVertexArray"); - glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)load("glDeleteVertexArrays"); - glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)load("glGenVertexArrays"); - glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC)load("glIsVertexArray"); - glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)load("glGetIntegeri_v"); - glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)load("glBeginTransformFeedback"); - glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)load("glEndTransformFeedback"); - glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)load("glBindBufferRange"); - glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)load("glBindBufferBase"); - glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)load("glTransformFeedbackVaryings"); - glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)load("glGetTransformFeedbackVarying"); - glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)load("glVertexAttribIPointer"); - glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)load("glGetVertexAttribIiv"); - glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)load("glGetVertexAttribIuiv"); - glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)load("glVertexAttribI4i"); - glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)load("glVertexAttribI4ui"); - glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)load("glVertexAttribI4iv"); - glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)load("glVertexAttribI4uiv"); - glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)load("glGetUniformuiv"); - glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)load("glGetFragDataLocation"); - glad_glUniform1ui = (PFNGLUNIFORM1UIPROC)load("glUniform1ui"); - glad_glUniform2ui = (PFNGLUNIFORM2UIPROC)load("glUniform2ui"); - glad_glUniform3ui = (PFNGLUNIFORM3UIPROC)load("glUniform3ui"); - glad_glUniform4ui = (PFNGLUNIFORM4UIPROC)load("glUniform4ui"); - glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC)load("glUniform1uiv"); - glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC)load("glUniform2uiv"); - glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC)load("glUniform3uiv"); - glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC)load("glUniform4uiv"); - glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)load("glClearBufferiv"); - glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)load("glClearBufferuiv"); - glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)load("glClearBufferfv"); - glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)load("glClearBufferfi"); - glad_glGetStringi = (PFNGLGETSTRINGIPROC)load("glGetStringi"); - glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)load("glCopyBufferSubData"); - glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)load("glGetUniformIndices"); - glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)load("glGetActiveUniformsiv"); - glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)load("glGetUniformBlockIndex"); - glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)load("glGetActiveUniformBlockiv"); - glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)load("glGetActiveUniformBlockName"); - glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)load("glUniformBlockBinding"); - glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)load("glDrawArraysInstanced"); - glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)load("glDrawElementsInstanced"); - glad_glFenceSync = (PFNGLFENCESYNCPROC)load("glFenceSync"); - glad_glIsSync = (PFNGLISSYNCPROC)load("glIsSync"); - glad_glDeleteSync = (PFNGLDELETESYNCPROC)load("glDeleteSync"); - glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)load("glClientWaitSync"); - glad_glWaitSync = (PFNGLWAITSYNCPROC)load("glWaitSync"); - glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC)load("glGetInteger64v"); - glad_glGetSynciv = (PFNGLGETSYNCIVPROC)load("glGetSynciv"); - glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)load("glGetInteger64i_v"); - glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)load("glGetBufferParameteri64v"); - glad_glGenSamplers = (PFNGLGENSAMPLERSPROC)load("glGenSamplers"); - glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)load("glDeleteSamplers"); - glad_glIsSampler = (PFNGLISSAMPLERPROC)load("glIsSampler"); - glad_glBindSampler = (PFNGLBINDSAMPLERPROC)load("glBindSampler"); - glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)load("glSamplerParameteri"); - glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)load("glSamplerParameteriv"); - glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)load("glSamplerParameterf"); - glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)load("glSamplerParameterfv"); - glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)load("glGetSamplerParameteriv"); - glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)load("glGetSamplerParameterfv"); - glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)load("glVertexAttribDivisor"); - glad_glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)load("glBindTransformFeedback"); - glad_glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)load("glDeleteTransformFeedbacks"); - glad_glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)load("glGenTransformFeedbacks"); - glad_glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)load("glIsTransformFeedback"); - glad_glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)load("glPauseTransformFeedback"); - glad_glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)load("glResumeTransformFeedback"); - glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)load("glGetProgramBinary"); - glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC)load("glProgramBinary"); - glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)load("glProgramParameteri"); - glad_glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)load("glInvalidateFramebuffer"); - glad_glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC)load("glInvalidateSubFramebuffer"); - glad_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)load("glTexStorage2D"); - glad_glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)load("glTexStorage3D"); - glad_glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)load("glGetInternalformativ"); -} -static void load_GL_ES_VERSION_3_1(GLADloadproc load) { - if(!GLAD_GL_ES_VERSION_3_1) return; - glad_glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)load("glDispatchCompute"); - glad_glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC)load("glDispatchComputeIndirect"); - glad_glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)load("glDrawArraysIndirect"); - glad_glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)load("glDrawElementsIndirect"); - glad_glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC)load("glFramebufferParameteri"); - glad_glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC)load("glGetFramebufferParameteriv"); - glad_glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC)load("glGetProgramInterfaceiv"); - glad_glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)load("glGetProgramResourceIndex"); - glad_glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)load("glGetProgramResourceName"); - glad_glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)load("glGetProgramResourceiv"); - glad_glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC)load("glGetProgramResourceLocation"); - glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)load("glUseProgramStages"); - glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)load("glActiveShaderProgram"); - glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)load("glCreateShaderProgramv"); - glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)load("glBindProgramPipeline"); - glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)load("glDeleteProgramPipelines"); - glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)load("glGenProgramPipelines"); - glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)load("glIsProgramPipeline"); - glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)load("glGetProgramPipelineiv"); - glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)load("glProgramUniform1i"); - glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)load("glProgramUniform2i"); - glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)load("glProgramUniform3i"); - glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)load("glProgramUniform4i"); - glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)load("glProgramUniform1ui"); - glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)load("glProgramUniform2ui"); - glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)load("glProgramUniform3ui"); - glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)load("glProgramUniform4ui"); - glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)load("glProgramUniform1f"); - glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)load("glProgramUniform2f"); - glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)load("glProgramUniform3f"); - glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)load("glProgramUniform4f"); - glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)load("glProgramUniform1iv"); - glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)load("glProgramUniform2iv"); - glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)load("glProgramUniform3iv"); - glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)load("glProgramUniform4iv"); - glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)load("glProgramUniform1uiv"); - glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)load("glProgramUniform2uiv"); - glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)load("glProgramUniform3uiv"); - glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)load("glProgramUniform4uiv"); - glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)load("glProgramUniform1fv"); - glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)load("glProgramUniform2fv"); - glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)load("glProgramUniform3fv"); - glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)load("glProgramUniform4fv"); - glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)load("glProgramUniformMatrix2fv"); - glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)load("glProgramUniformMatrix3fv"); - glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)load("glProgramUniformMatrix4fv"); - glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)load("glProgramUniformMatrix2x3fv"); - glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)load("glProgramUniformMatrix3x2fv"); - glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)load("glProgramUniformMatrix2x4fv"); - glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)load("glProgramUniformMatrix4x2fv"); - glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)load("glProgramUniformMatrix3x4fv"); - glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)load("glProgramUniformMatrix4x3fv"); - glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)load("glValidateProgramPipeline"); - glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)load("glGetProgramPipelineInfoLog"); - glad_glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)load("glBindImageTexture"); - glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)load("glGetBooleani_v"); - glad_glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)load("glMemoryBarrier"); - glad_glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC)load("glMemoryBarrierByRegion"); - glad_glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)load("glTexStorage2DMultisample"); - glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)load("glGetMultisamplefv"); - glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC)load("glSampleMaski"); - glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC)load("glGetTexLevelParameteriv"); - glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC)load("glGetTexLevelParameterfv"); - glad_glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC)load("glBindVertexBuffer"); - glad_glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC)load("glVertexAttribFormat"); - glad_glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC)load("glVertexAttribIFormat"); - glad_glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC)load("glVertexAttribBinding"); - glad_glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC)load("glVertexBindingDivisor"); -} -static int find_extensionsGLES2(void) { - if (!get_exts()) return 0; - GLAD_GL_EXT_texture_compression_s3tc = has_ext("GL_EXT_texture_compression_s3tc"); - GLAD_GL_EXT_texture_filter_anisotropic = has_ext("GL_EXT_texture_filter_anisotropic"); - GLAD_GL_KHR_debug = has_ext("GL_KHR_debug"); - GLAD_GL_KHR_texture_compression_astc_ldr = has_ext("GL_KHR_texture_compression_astc_ldr"); - free_exts(); - return 1; -} - -static void find_coreGLES2(void) { - - /* Thank you @elmindreda - * https://github.com/elmindreda/greg/blob/master/templates/greg.c.in#L176 - * https://github.com/glfw/glfw/blob/master/src/context.c#L36 - */ - int i, major, minor; - - const char* version; - const char* prefixes[] = { - "OpenGL ES-CM ", - "OpenGL ES-CL ", - "OpenGL ES ", - NULL - }; - - version = (const char*) glGetString(GL_VERSION); - if (!version) return; - - for (i = 0; prefixes[i]; i++) { - const size_t length = strlen(prefixes[i]); - if (strncmp(version, prefixes[i], length) == 0) { - version += length; - break; - } - } - -/* PR #18 */ -#ifdef _MSC_VER - sscanf_s(version, "%d.%d", &major, &minor); -#else - sscanf(version, "%d.%d", &major, &minor); -#endif - - if(major > requested_major_version) { - major = requested_major_version; - } - - if(major == requested_major_version && minor > requested_minor_version) { - minor = requested_minor_version; - } - - GLVersion.major = major; GLVersion.minor = minor; - max_loaded_major = major; max_loaded_minor = minor; - GLAD_GL_ES_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; - GLAD_GL_ES_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; - GLAD_GL_ES_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; - if (GLVersion.major > 3 || (GLVersion.major >= 3 && GLVersion.minor >= 1)) { - max_loaded_major = 3; - max_loaded_minor = 1; - } -} - -int gladLoadGLES2Loader(GLADloadproc load, int requestedVersion) { - requested_major_version = requestedVersion / 10; - requested_minor_version = requestedVersion % 10; - GLVersion.major = 0; GLVersion.minor = 0; - glGetString = (PFNGLGETSTRINGPROC)load("glGetString"); - if(glGetString == NULL) return 0; - if(glGetString(GL_VERSION) == NULL) return 0; - find_coreGLES2(); - load_GL_ES_VERSION_2_0(load); - load_GL_ES_VERSION_3_0(load); - load_GL_ES_VERSION_3_1(load); - - if (!find_extensionsGLES2()) return 0; - load_GL_KHR_debug(load); - return GLVersion.major != 0 || GLVersion.minor != 0; -} diff --git a/vendor/librw/src/gl/glad/glad.h b/vendor/librw/src/gl/glad/glad.h deleted file mode 100644 index 8f785d5..0000000 --- a/vendor/librw/src/gl/glad/glad.h +++ /dev/null @@ -1,2808 +0,0 @@ -/* - - OpenGL, OpenGL ES loader generated by glad 0.1.34 on Wed Feb 17 15:35:25 2021. - - Language/Generator: C/C++ - Specification: gl - APIs: gl=3.3, gles2=3.1 - Profile: core - Extensions: - GL_EXT_framebuffer_object, - GL_EXT_texture_compression_s3tc, - GL_EXT_texture_filter_anisotropic, - GL_KHR_debug, - GL_KHR_texture_compression_astc_ldr - Loader: False - Local files: False - Omit khrplatform: False - Reproducible: False - - Commandline: - --profile="core" --api="gl=3.3,gles2=3.1" --generator="c" --spec="gl" --no-loader --extensions="GL_EXT_framebuffer_object,GL_EXT_texture_compression_s3tc,GL_EXT_texture_filter_anisotropic,GL_KHR_debug,GL_KHR_texture_compression_astc_ldr" - Online: - https://glad.dav1d.de/#profile=core&language=c&specification=gl&api=gl%3D3.3&api=gles2%3D3.1&extensions=GL_EXT_framebuffer_object&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_filter_anisotropic&extensions=GL_KHR_debug&extensions=GL_KHR_texture_compression_astc_ldr -*/ - - -#ifndef __glad_h_ -#define __glad_h_ - -#ifdef __gl_h_ -#error OpenGL header already included, remove this include, glad already provides it -#endif -#define __gl_h_ - -#ifdef __gl2_h_ -#error OpenGL ES 2 header already included, remove this include, glad already provides it -#endif -#define __gl2_h_ - -#ifdef __gl3_h_ -#error OpenGL ES 3 header already included, remove this include, glad already provides it -#endif -#define __gl3_h_ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) -#define APIENTRY __stdcall -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif -#ifndef APIENTRYP -#define APIENTRYP APIENTRY * -#endif - -#ifndef GLAPIENTRY -#define GLAPIENTRY APIENTRY -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -struct gladGLversionStruct { - int major; - int minor; -}; - -typedef void* (* GLADloadproc)(const char *name); - -#ifndef GLAPI -# if defined(GLAD_GLAPI_EXPORT) -# if defined(_WIN32) || defined(__CYGWIN__) -# if defined(GLAD_GLAPI_EXPORT_BUILD) -# if defined(__GNUC__) -# define GLAPI __attribute__ ((dllexport)) extern -# else -# define GLAPI __declspec(dllexport) extern -# endif -# else -# if defined(__GNUC__) -# define GLAPI __attribute__ ((dllimport)) extern -# else -# define GLAPI __declspec(dllimport) extern -# endif -# endif -# elif defined(__GNUC__) && defined(GLAD_GLAPI_EXPORT_BUILD) -# define GLAPI __attribute__ ((visibility ("default"))) extern -# else -# define GLAPI extern -# endif -# else -# define GLAPI extern -# endif -#endif - -GLAPI struct gladGLversionStruct GLVersion; -GLAPI int gladLoadGLLoader(GLADloadproc, int requestedVersion); - -GLAPI int gladLoadGLES2Loader(GLADloadproc, int requestedVersion); - -#include "khrplatform.h" -typedef unsigned int GLenum; -typedef unsigned char GLboolean; -typedef unsigned int GLbitfield; -typedef void GLvoid; -typedef khronos_int8_t GLbyte; -typedef khronos_uint8_t GLubyte; -typedef khronos_int16_t GLshort; -typedef khronos_uint16_t GLushort; -typedef int GLint; -typedef unsigned int GLuint; -typedef khronos_int32_t GLclampx; -typedef int GLsizei; -typedef khronos_float_t GLfloat; -typedef khronos_float_t GLclampf; -typedef double GLdouble; -typedef double GLclampd; -typedef void *GLeglClientBufferEXT; -typedef void *GLeglImageOES; -typedef char GLchar; -typedef char GLcharARB; -#ifdef __APPLE__ -typedef void *GLhandleARB; -#else -typedef unsigned int GLhandleARB; -#endif -typedef khronos_uint16_t GLhalf; -typedef khronos_uint16_t GLhalfARB; -typedef khronos_int32_t GLfixed; -typedef khronos_intptr_t GLintptr; -typedef khronos_intptr_t GLintptrARB; -typedef khronos_ssize_t GLsizeiptr; -typedef khronos_ssize_t GLsizeiptrARB; -typedef khronos_int64_t GLint64; -typedef khronos_int64_t GLint64EXT; -typedef khronos_uint64_t GLuint64; -typedef khronos_uint64_t GLuint64EXT; -typedef struct __GLsync *GLsync; -struct _cl_context; -struct _cl_event; -typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); -typedef unsigned short GLhalfNV; -typedef GLintptr GLvdpauSurfaceNV; -typedef void (APIENTRY *GLVULKANPROCNV)(void); -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_FALSE 0 -#define GL_TRUE 1 -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_ZERO 0 -#define GL_ONE 1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_NONE 0 -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_LEFT 0x0406 -#define GL_RIGHT 0x0407 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_NO_ERROR 0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_RANGE 0x0B12 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_LINE_SMOOTH 0x0B20 -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINE_WIDTH_RANGE 0x0B22 -#define GL_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_VIEWPORT 0x0BA2 -#define GL_DITHER 0x0BD0 -#define GL_BLEND_DST 0x0BE0 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND 0x0BE2 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_READ_BUFFER 0x0C02 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_STEREO 0x0C33 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_POLYGON_SMOOTH_HINT 0x0C53 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_CLEAR 0x1500 -#define GL_AND 0x1501 -#define GL_AND_REVERSE 0x1502 -#define GL_COPY 0x1503 -#define GL_AND_INVERTED 0x1504 -#define GL_NOOP 0x1505 -#define GL_XOR 0x1506 -#define GL_OR 0x1507 -#define GL_NOR 0x1508 -#define GL_EQUIV 0x1509 -#define GL_INVERT 0x150A -#define GL_OR_REVERSE 0x150B -#define GL_COPY_INVERTED 0x150C -#define GL_OR_INVERTED 0x150D -#define GL_NAND 0x150E -#define GL_SET 0x150F -#define GL_TEXTURE 0x1702 -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 -#define GL_STENCIL_INDEX 0x1901 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_POINT 0x1B00 -#define GL_LINE 0x1B01 -#define GL_FILL 0x1B02 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_REPEAT 0x2901 -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_DOUBLE 0x140A -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_R3_G3_B2 0x2A10 -#define GL_RGB4 0x804F -#define GL_RGB5 0x8050 -#define GL_RGB8 0x8051 -#define GL_RGB10 0x8052 -#define GL_RGB12 0x8053 -#define GL_RGB16 0x8054 -#define GL_RGBA2 0x8055 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_RGBA12 0x805A -#define GL_RGBA16 0x805B -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_BLEND_COLOR 0x8005 -#define GL_BLEND_EQUATION 0x8009 -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_FUNC_ADD 0x8006 -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_FUNC_SUBTRACT 0x800A -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 -#define GL_SRC1_ALPHA 0x8589 -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#define GL_COMPARE_REF_TO_TEXTURE 0x884E -#define GL_CLIP_DISTANCE0 0x3000 -#define GL_CLIP_DISTANCE1 0x3001 -#define GL_CLIP_DISTANCE2 0x3002 -#define GL_CLIP_DISTANCE3 0x3003 -#define GL_CLIP_DISTANCE4 0x3004 -#define GL_CLIP_DISTANCE5 0x3005 -#define GL_CLIP_DISTANCE6 0x3006 -#define GL_CLIP_DISTANCE7 0x3007 -#define GL_MAX_CLIP_DISTANCES 0x0D32 -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_CONTEXT_FLAGS 0x821E -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RG 0x8226 -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_CLAMP_READ_COLOR 0x891C -#define GL_FIXED_ONLY 0x891D -#define GL_MAX_VARYING_COMPONENTS 0x8B4B -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_GREEN_INTEGER 0x8D95 -#define GL_BLUE_INTEGER 0x8D96 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_BGR_INTEGER 0x8D9A -#define GL_BGRA_INTEGER 0x8D9B -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_QUERY_WAIT 0x8E13 -#define GL_QUERY_NO_WAIT 0x8E14 -#define GL_QUERY_BY_REGION_WAIT 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_COLOR_ATTACHMENT16 0x8CF0 -#define GL_COLOR_ATTACHMENT17 0x8CF1 -#define GL_COLOR_ATTACHMENT18 0x8CF2 -#define GL_COLOR_ATTACHMENT19 0x8CF3 -#define GL_COLOR_ATTACHMENT20 0x8CF4 -#define GL_COLOR_ATTACHMENT21 0x8CF5 -#define GL_COLOR_ATTACHMENT22 0x8CF6 -#define GL_COLOR_ATTACHMENT23 0x8CF7 -#define GL_COLOR_ATTACHMENT24 0x8CF8 -#define GL_COLOR_ATTACHMENT25 0x8CF9 -#define GL_COLOR_ATTACHMENT26 0x8CFA -#define GL_COLOR_ATTACHMENT27 0x8CFB -#define GL_COLOR_ATTACHMENT28 0x8CFC -#define GL_COLOR_ATTACHMENT29 0x8CFD -#define GL_COLOR_ATTACHMENT30 0x8CFE -#define GL_COLOR_ATTACHMENT31 0x8CFF -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_STENCIL_INDEX1 0x8D46 -#define GL_STENCIL_INDEX4 0x8D47 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_INDEX16 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 -#define GL_FRAMEBUFFER_SRGB 0x8DB9 -#define GL_HALF_FLOAT 0x140B -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#define GL_COMPRESSED_RED_RGTC1 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define GL_COMPRESSED_RG_RGTC2 0x8DBD -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART 0x8F9D -#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER 0x8F37 -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_INVALID_INDEX 0xFFFFFFFF -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_CONTEXT_PROFILE_MASK 0x9126 -#define GL_DEPTH_CLAMP 0x864F -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_INTEGER_SAMPLES 0x9110 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_SRC1_COLOR 0x88F9 -#define GL_ONE_MINUS_SRC1_COLOR 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC -#define GL_ANY_SAMPLES_PASSED 0x8C2F -#define GL_SAMPLER_BINDING 0x8919 -#define GL_RGB10_A2UI 0x906F -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 -#define GL_TIME_ELAPSED 0x88BF -#define GL_TIMESTAMP 0x8E28 -#define GL_INT_2_10_10_10_REV 0x8D9F -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_ALPHA_BITS 0x0D55 -#define GL_DEPTH_BITS 0x0D56 -#define GL_STENCIL_BITS 0x0D57 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_FIXED 0x140C -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_SHADER_COMPILER 0x8DFA -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_RGB565 0x8D62 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 -#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 -#define GL_COPY_READ_BUFFER_BINDING 0x8F36 -#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A -#define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 -#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 -#define GL_PROGRAM_BINARY_LENGTH 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE -#define GL_PROGRAM_BINARY_FORMATS 0x87FF -#define GL_COMPRESSED_R11_EAC 0x9270 -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#define GL_COMPRESSED_RG11_EAC 0x9272 -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#define GL_COMPRESSED_SRGB8_ETC2 0x9275 -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 -#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F -#define GL_MAX_ELEMENT_INDEX 0x8D6B -#define GL_NUM_SAMPLE_COUNTS 0x9380 -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF -#define GL_COMPUTE_SHADER 0x91B9 -#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB -#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC -#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD -#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 -#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 -#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 -#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 -#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 -#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB -#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE -#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF -#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 -#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE -#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF -#define GL_COMPUTE_SHADER_BIT 0x00000020 -#define GL_DRAW_INDIRECT_BUFFER 0x8F3F -#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 -#define GL_MAX_UNIFORM_LOCATIONS 0x826E -#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 -#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 -#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 -#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 -#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 -#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 -#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 -#define GL_UNIFORM 0x92E1 -#define GL_UNIFORM_BLOCK 0x92E2 -#define GL_PROGRAM_INPUT 0x92E3 -#define GL_PROGRAM_OUTPUT 0x92E4 -#define GL_BUFFER_VARIABLE 0x92E5 -#define GL_SHADER_STORAGE_BLOCK 0x92E6 -#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 -#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 -#define GL_ACTIVE_RESOURCES 0x92F5 -#define GL_MAX_NAME_LENGTH 0x92F6 -#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 -#define GL_NAME_LENGTH 0x92F9 -#define GL_TYPE 0x92FA -#define GL_ARRAY_SIZE 0x92FB -#define GL_OFFSET 0x92FC -#define GL_BLOCK_INDEX 0x92FD -#define GL_ARRAY_STRIDE 0x92FE -#define GL_MATRIX_STRIDE 0x92FF -#define GL_IS_ROW_MAJOR 0x9300 -#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 -#define GL_BUFFER_BINDING 0x9302 -#define GL_BUFFER_DATA_SIZE 0x9303 -#define GL_NUM_ACTIVE_VARIABLES 0x9304 -#define GL_ACTIVE_VARIABLES 0x9305 -#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 -#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A -#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B -#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C -#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D -#define GL_LOCATION 0x930E -#define GL_VERTEX_SHADER_BIT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT 0x00000002 -#define GL_ALL_SHADER_BITS 0xFFFFFFFF -#define GL_PROGRAM_SEPARABLE 0x8258 -#define GL_ACTIVE_PROGRAM 0x8259 -#define GL_PROGRAM_PIPELINE_BINDING 0x825A -#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 -#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 -#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 -#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC -#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 -#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 -#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 -#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 -#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC -#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 -#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB -#define GL_MAX_IMAGE_UNITS 0x8F38 -#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA -#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE -#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF -#define GL_IMAGE_BINDING_NAME 0x8F3A -#define GL_IMAGE_BINDING_LEVEL 0x8F3B -#define GL_IMAGE_BINDING_LAYERED 0x8F3C -#define GL_IMAGE_BINDING_LAYER 0x8F3D -#define GL_IMAGE_BINDING_ACCESS 0x8F3E -#define GL_IMAGE_BINDING_FORMAT 0x906E -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 -#define GL_COMMAND_BARRIER_BIT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 -#define GL_ALL_BARRIER_BITS 0xFFFFFFFF -#define GL_IMAGE_2D 0x904D -#define GL_IMAGE_3D 0x904E -#define GL_IMAGE_CUBE 0x9050 -#define GL_IMAGE_2D_ARRAY 0x9053 -#define GL_INT_IMAGE_2D 0x9058 -#define GL_INT_IMAGE_3D 0x9059 -#define GL_INT_IMAGE_CUBE 0x905B -#define GL_INT_IMAGE_2D_ARRAY 0x905E -#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 -#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 -#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 -#define GL_SHADER_STORAGE_BUFFER 0x90D2 -#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 -#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 -#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 -#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 -#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA -#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB -#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC -#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD -#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE -#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF -#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 -#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 -#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F -#define GL_VERTEX_ATTRIB_BINDING 0x82D4 -#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 -#define GL_VERTEX_BINDING_DIVISOR 0x82D6 -#define GL_VERTEX_BINDING_OFFSET 0x82D7 -#define GL_VERTEX_BINDING_STRIDE 0x82D8 -#define GL_VERTEX_BINDING_BUFFER 0x8F4F -#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 -#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA -#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 -#ifndef GL_VERSION_1_0 -#define GL_VERSION_1_0 1 -GLAPI int GLAD_GL_VERSION_1_0; -typedef void (APIENTRYP PFNGLCULLFACEPROC)(GLenum mode); -GLAPI PFNGLCULLFACEPROC glad_glCullFace; -#define glCullFace glad_glCullFace -typedef void (APIENTRYP PFNGLFRONTFACEPROC)(GLenum mode); -GLAPI PFNGLFRONTFACEPROC glad_glFrontFace; -#define glFrontFace glad_glFrontFace -typedef void (APIENTRYP PFNGLHINTPROC)(GLenum target, GLenum mode); -GLAPI PFNGLHINTPROC glad_glHint; -#define glHint glad_glHint -typedef void (APIENTRYP PFNGLLINEWIDTHPROC)(GLfloat width); -GLAPI PFNGLLINEWIDTHPROC glad_glLineWidth; -#define glLineWidth glad_glLineWidth -typedef void (APIENTRYP PFNGLPOINTSIZEPROC)(GLfloat size); -GLAPI PFNGLPOINTSIZEPROC glad_glPointSize; -#define glPointSize glad_glPointSize -typedef void (APIENTRYP PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode); -GLAPI PFNGLPOLYGONMODEPROC glad_glPolygonMode; -#define glPolygonMode glad_glPolygonMode -typedef void (APIENTRYP PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI PFNGLSCISSORPROC glad_glScissor; -#define glScissor glad_glScissor -typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param); -GLAPI PFNGLTEXPARAMETERFPROC glad_glTexParameterf; -#define glTexParameterf glad_glTexParameterf -typedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat *params); -GLAPI PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; -#define glTexParameterfv glad_glTexParameterfv -typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); -GLAPI PFNGLTEXPARAMETERIPROC glad_glTexParameteri; -#define glTexParameteri glad_glTexParameteri -typedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint *params); -GLAPI PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; -#define glTexParameteriv glad_glTexParameteriv -typedef void (APIENTRYP PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI PFNGLTEXIMAGE1DPROC glad_glTexImage1D; -#define glTexImage1D glad_glTexImage1D -typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI PFNGLTEXIMAGE2DPROC glad_glTexImage2D; -#define glTexImage2D glad_glTexImage2D -typedef void (APIENTRYP PFNGLDRAWBUFFERPROC)(GLenum buf); -GLAPI PFNGLDRAWBUFFERPROC glad_glDrawBuffer; -#define glDrawBuffer glad_glDrawBuffer -typedef void (APIENTRYP PFNGLCLEARPROC)(GLbitfield mask); -GLAPI PFNGLCLEARPROC glad_glClear; -#define glClear glad_glClear -typedef void (APIENTRYP PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI PFNGLCLEARCOLORPROC glad_glClearColor; -#define glClearColor glad_glClearColor -typedef void (APIENTRYP PFNGLCLEARSTENCILPROC)(GLint s); -GLAPI PFNGLCLEARSTENCILPROC glad_glClearStencil; -#define glClearStencil glad_glClearStencil -typedef void (APIENTRYP PFNGLCLEARDEPTHPROC)(GLdouble depth); -GLAPI PFNGLCLEARDEPTHPROC glad_glClearDepth; -#define glClearDepth glad_glClearDepth -typedef void (APIENTRYP PFNGLSTENCILMASKPROC)(GLuint mask); -GLAPI PFNGLSTENCILMASKPROC glad_glStencilMask; -#define glStencilMask glad_glStencilMask -typedef void (APIENTRYP PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -GLAPI PFNGLCOLORMASKPROC glad_glColorMask; -#define glColorMask glad_glColorMask -typedef void (APIENTRYP PFNGLDEPTHMASKPROC)(GLboolean flag); -GLAPI PFNGLDEPTHMASKPROC glad_glDepthMask; -#define glDepthMask glad_glDepthMask -typedef void (APIENTRYP PFNGLDISABLEPROC)(GLenum cap); -GLAPI PFNGLDISABLEPROC glad_glDisable; -#define glDisable glad_glDisable -typedef void (APIENTRYP PFNGLENABLEPROC)(GLenum cap); -GLAPI PFNGLENABLEPROC glad_glEnable; -#define glEnable glad_glEnable -typedef void (APIENTRYP PFNGLFINISHPROC)(void); -GLAPI PFNGLFINISHPROC glad_glFinish; -#define glFinish glad_glFinish -typedef void (APIENTRYP PFNGLFLUSHPROC)(void); -GLAPI PFNGLFLUSHPROC glad_glFlush; -#define glFlush glad_glFlush -typedef void (APIENTRYP PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); -GLAPI PFNGLBLENDFUNCPROC glad_glBlendFunc; -#define glBlendFunc glad_glBlendFunc -typedef void (APIENTRYP PFNGLLOGICOPPROC)(GLenum opcode); -GLAPI PFNGLLOGICOPPROC glad_glLogicOp; -#define glLogicOp glad_glLogicOp -typedef void (APIENTRYP PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); -GLAPI PFNGLSTENCILFUNCPROC glad_glStencilFunc; -#define glStencilFunc glad_glStencilFunc -typedef void (APIENTRYP PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); -GLAPI PFNGLSTENCILOPPROC glad_glStencilOp; -#define glStencilOp glad_glStencilOp -typedef void (APIENTRYP PFNGLDEPTHFUNCPROC)(GLenum func); -GLAPI PFNGLDEPTHFUNCPROC glad_glDepthFunc; -#define glDepthFunc glad_glDepthFunc -typedef void (APIENTRYP PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param); -GLAPI PFNGLPIXELSTOREFPROC glad_glPixelStoref; -#define glPixelStoref glad_glPixelStoref -typedef void (APIENTRYP PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); -GLAPI PFNGLPIXELSTOREIPROC glad_glPixelStorei; -#define glPixelStorei glad_glPixelStorei -typedef void (APIENTRYP PFNGLREADBUFFERPROC)(GLenum src); -GLAPI PFNGLREADBUFFERPROC glad_glReadBuffer; -#define glReadBuffer glad_glReadBuffer -typedef void (APIENTRYP PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); -GLAPI PFNGLREADPIXELSPROC glad_glReadPixels; -#define glReadPixels glad_glReadPixels -typedef void (APIENTRYP PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean *data); -GLAPI PFNGLGETBOOLEANVPROC glad_glGetBooleanv; -#define glGetBooleanv glad_glGetBooleanv -typedef void (APIENTRYP PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble *data); -GLAPI PFNGLGETDOUBLEVPROC glad_glGetDoublev; -#define glGetDoublev glad_glGetDoublev -typedef GLenum (APIENTRYP PFNGLGETERRORPROC)(void); -GLAPI PFNGLGETERRORPROC glad_glGetError; -#define glGetError glad_glGetError -typedef void (APIENTRYP PFNGLGETFLOATVPROC)(GLenum pname, GLfloat *data); -GLAPI PFNGLGETFLOATVPROC glad_glGetFloatv; -#define glGetFloatv glad_glGetFloatv -typedef void (APIENTRYP PFNGLGETINTEGERVPROC)(GLenum pname, GLint *data); -GLAPI PFNGLGETINTEGERVPROC glad_glGetIntegerv; -#define glGetIntegerv glad_glGetIntegerv -typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC)(GLenum name); -GLAPI PFNGLGETSTRINGPROC glad_glGetString; -#define glGetString glad_glGetString -typedef void (APIENTRYP PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -GLAPI PFNGLGETTEXIMAGEPROC glad_glGetTexImage; -#define glGetTexImage glad_glGetTexImage -typedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat *params); -GLAPI PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; -#define glGetTexParameterfv glad_glGetTexParameterfv -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); -GLAPI PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; -#define glGetTexParameteriv glad_glGetTexParameteriv -typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv; -#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv -typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv; -#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv -typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC)(GLenum cap); -GLAPI PFNGLISENABLEDPROC glad_glIsEnabled; -#define glIsEnabled glad_glIsEnabled -typedef void (APIENTRYP PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f); -GLAPI PFNGLDEPTHRANGEPROC glad_glDepthRange; -#define glDepthRange glad_glDepthRange -typedef void (APIENTRYP PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI PFNGLVIEWPORTPROC glad_glViewport; -#define glViewport glad_glViewport -#endif -#ifndef GL_VERSION_1_1 -#define GL_VERSION_1_1 1 -GLAPI int GLAD_GL_VERSION_1_1; -typedef void (APIENTRYP PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); -GLAPI PFNGLDRAWARRAYSPROC glad_glDrawArrays; -#define glDrawArrays glad_glDrawArrays -typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices); -GLAPI PFNGLDRAWELEMENTSPROC glad_glDrawElements; -#define glDrawElements glad_glDrawElements -typedef void (APIENTRYP PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); -GLAPI PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; -#define glPolygonOffset glad_glPolygonOffset -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D; -#define glCopyTexImage1D glad_glCopyTexImage1D -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; -#define glCopyTexImage2D glad_glCopyTexImage2D -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D; -#define glCopyTexSubImage1D glad_glCopyTexSubImage1D -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; -#define glCopyTexSubImage2D glad_glCopyTexSubImage2D -typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D; -#define glTexSubImage1D glad_glTexSubImage1D -typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; -#define glTexSubImage2D glad_glTexSubImage2D -typedef void (APIENTRYP PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); -GLAPI PFNGLBINDTEXTUREPROC glad_glBindTexture; -#define glBindTexture glad_glBindTexture -typedef void (APIENTRYP PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint *textures); -GLAPI PFNGLDELETETEXTURESPROC glad_glDeleteTextures; -#define glDeleteTextures glad_glDeleteTextures -typedef void (APIENTRYP PFNGLGENTEXTURESPROC)(GLsizei n, GLuint *textures); -GLAPI PFNGLGENTEXTURESPROC glad_glGenTextures; -#define glGenTextures glad_glGenTextures -typedef GLboolean (APIENTRYP PFNGLISTEXTUREPROC)(GLuint texture); -GLAPI PFNGLISTEXTUREPROC glad_glIsTexture; -#define glIsTexture glad_glIsTexture -#endif -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -GLAPI int GLAD_GL_VERSION_1_2; -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -GLAPI PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements; -#define glDrawRangeElements glad_glDrawRangeElements -typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI PFNGLTEXIMAGE3DPROC glad_glTexImage3D; -#define glTexImage3D glad_glTexImage3D -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -GLAPI PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D; -#define glTexSubImage3D glad_glTexSubImage3D -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D; -#define glCopyTexSubImage3D glad_glCopyTexSubImage3D -#endif -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 -GLAPI int GLAD_GL_VERSION_1_3; -typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC)(GLenum texture); -GLAPI PFNGLACTIVETEXTUREPROC glad_glActiveTexture; -#define glActiveTexture glad_glActiveTexture -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); -GLAPI PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; -#define glSampleCoverage glad_glSampleCoverage -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -GLAPI PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D; -#define glCompressedTexImage3D glad_glCompressedTexImage3D -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -GLAPI PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; -#define glCompressedTexImage2D glad_glCompressedTexImage2D -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -GLAPI PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D; -#define glCompressedTexImage1D glad_glCompressedTexImage1D -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -GLAPI PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D; -#define glCompressedTexSubImage3D glad_glCompressedTexSubImage3D -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -GLAPI PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; -#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -GLAPI PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D; -#define glCompressedTexSubImage1D glad_glCompressedTexSubImage1D -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void *img); -GLAPI PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage; -#define glGetCompressedTexImage glad_glGetCompressedTexImage -#endif -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 -GLAPI int GLAD_GL_VERSION_1_4; -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -GLAPI PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; -#define glBlendFuncSeparate glad_glBlendFuncSeparate -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -GLAPI PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays; -#define glMultiDrawArrays glad_glMultiDrawArrays -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); -GLAPI PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements; -#define glMultiDrawElements glad_glMultiDrawElements -typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); -GLAPI PFNGLPOINTPARAMETERFPROC glad_glPointParameterf; -#define glPointParameterf glad_glPointParameterf -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat *params); -GLAPI PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv; -#define glPointParameterfv glad_glPointParameterfv -typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param); -GLAPI PFNGLPOINTPARAMETERIPROC glad_glPointParameteri; -#define glPointParameteri glad_glPointParameteri -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint *params); -GLAPI PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv; -#define glPointParameteriv glad_glPointParameteriv -typedef void (APIENTRYP PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI PFNGLBLENDCOLORPROC glad_glBlendColor; -#define glBlendColor glad_glBlendColor -typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC)(GLenum mode); -GLAPI PFNGLBLENDEQUATIONPROC glad_glBlendEquation; -#define glBlendEquation glad_glBlendEquation -#endif -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 -GLAPI int GLAD_GL_VERSION_1_5; -typedef void (APIENTRYP PFNGLGENQUERIESPROC)(GLsizei n, GLuint *ids); -GLAPI PFNGLGENQUERIESPROC glad_glGenQueries; -#define glGenQueries glad_glGenQueries -typedef void (APIENTRYP PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint *ids); -GLAPI PFNGLDELETEQUERIESPROC glad_glDeleteQueries; -#define glDeleteQueries glad_glDeleteQueries -typedef GLboolean (APIENTRYP PFNGLISQUERYPROC)(GLuint id); -GLAPI PFNGLISQUERYPROC glad_glIsQuery; -#define glIsQuery glad_glIsQuery -typedef void (APIENTRYP PFNGLBEGINQUERYPROC)(GLenum target, GLuint id); -GLAPI PFNGLBEGINQUERYPROC glad_glBeginQuery; -#define glBeginQuery glad_glBeginQuery -typedef void (APIENTRYP PFNGLENDQUERYPROC)(GLenum target); -GLAPI PFNGLENDQUERYPROC glad_glEndQuery; -#define glEndQuery glad_glEndQuery -typedef void (APIENTRYP PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint *params); -GLAPI PFNGLGETQUERYIVPROC glad_glGetQueryiv; -#define glGetQueryiv glad_glGetQueryiv -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint *params); -GLAPI PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv; -#define glGetQueryObjectiv glad_glGetQueryObjectiv -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint *params); -GLAPI PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv; -#define glGetQueryObjectuiv glad_glGetQueryObjectuiv -typedef void (APIENTRYP PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); -GLAPI PFNGLBINDBUFFERPROC glad_glBindBuffer; -#define glBindBuffer glad_glBindBuffer -typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint *buffers); -GLAPI PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; -#define glDeleteBuffers glad_glDeleteBuffers -typedef void (APIENTRYP PFNGLGENBUFFERSPROC)(GLsizei n, GLuint *buffers); -GLAPI PFNGLGENBUFFERSPROC glad_glGenBuffers; -#define glGenBuffers glad_glGenBuffers -typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC)(GLuint buffer); -GLAPI PFNGLISBUFFERPROC glad_glIsBuffer; -#define glIsBuffer glad_glIsBuffer -typedef void (APIENTRYP PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void *data, GLenum usage); -GLAPI PFNGLBUFFERDATAPROC glad_glBufferData; -#define glBufferData glad_glBufferData -typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void *data); -GLAPI PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; -#define glBufferSubData glad_glBufferSubData -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void *data); -GLAPI PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData; -#define glGetBufferSubData glad_glGetBufferSubData -typedef void * (APIENTRYP PFNGLMAPBUFFERPROC)(GLenum target, GLenum access); -GLAPI PFNGLMAPBUFFERPROC glad_glMapBuffer; -#define glMapBuffer glad_glMapBuffer -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC)(GLenum target); -GLAPI PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer; -#define glUnmapBuffer glad_glUnmapBuffer -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); -GLAPI PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; -#define glGetBufferParameteriv glad_glGetBufferParameteriv -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void **params); -GLAPI PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv; -#define glGetBufferPointerv glad_glGetBufferPointerv -#endif -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -GLAPI int GLAD_GL_VERSION_2_0; -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); -GLAPI PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; -#define glBlendEquationSeparate glad_glBlendEquationSeparate -typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum *bufs); -GLAPI PFNGLDRAWBUFFERSPROC glad_glDrawBuffers; -#define glDrawBuffers glad_glDrawBuffers -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GLAPI PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; -#define glStencilOpSeparate glad_glStencilOpSeparate -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); -GLAPI PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; -#define glStencilFuncSeparate glad_glStencilFuncSeparate -typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); -GLAPI PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; -#define glStencilMaskSeparate glad_glStencilMaskSeparate -typedef void (APIENTRYP PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); -GLAPI PFNGLATTACHSHADERPROC glad_glAttachShader; -#define glAttachShader glad_glAttachShader -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar *name); -GLAPI PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; -#define glBindAttribLocation glad_glBindAttribLocation -typedef void (APIENTRYP PFNGLCOMPILESHADERPROC)(GLuint shader); -GLAPI PFNGLCOMPILESHADERPROC glad_glCompileShader; -#define glCompileShader glad_glCompileShader -typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC)(void); -GLAPI PFNGLCREATEPROGRAMPROC glad_glCreateProgram; -#define glCreateProgram glad_glCreateProgram -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC)(GLenum type); -GLAPI PFNGLCREATESHADERPROC glad_glCreateShader; -#define glCreateShader glad_glCreateShader -typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC)(GLuint program); -GLAPI PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; -#define glDeleteProgram glad_glDeleteProgram -typedef void (APIENTRYP PFNGLDELETESHADERPROC)(GLuint shader); -GLAPI PFNGLDELETESHADERPROC glad_glDeleteShader; -#define glDeleteShader glad_glDeleteShader -typedef void (APIENTRYP PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); -GLAPI PFNGLDETACHSHADERPROC glad_glDetachShader; -#define glDetachShader glad_glDetachShader -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); -GLAPI PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; -#define glDisableVertexAttribArray glad_glDisableVertexAttribArray -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); -GLAPI PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; -#define glEnableVertexAttribArray glad_glEnableVertexAttribArray -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; -#define glGetActiveAttrib glad_glGetActiveAttrib -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; -#define glGetActiveUniform glad_glGetActiveUniform -typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); -GLAPI PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; -#define glGetAttachedShaders glad_glGetAttachedShaders -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar *name); -GLAPI PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; -#define glGetAttribLocation glad_glGetAttribLocation -typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint *params); -GLAPI PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; -#define glGetProgramiv glad_glGetProgramiv -typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; -#define glGetProgramInfoLog glad_glGetProgramInfoLog -typedef void (APIENTRYP PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint *params); -GLAPI PFNGLGETSHADERIVPROC glad_glGetShaderiv; -#define glGetShaderiv glad_glGetShaderiv -typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; -#define glGetShaderInfoLog glad_glGetShaderInfoLog -typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -GLAPI PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; -#define glGetShaderSource glad_glGetShaderSource -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar *name); -GLAPI PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; -#define glGetUniformLocation glad_glGetUniformLocation -typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat *params); -GLAPI PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; -#define glGetUniformfv glad_glGetUniformfv -typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint *params); -GLAPI PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; -#define glGetUniformiv glad_glGetUniformiv -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble *params); -GLAPI PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv; -#define glGetVertexAttribdv glad_glGetVertexAttribdv -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat *params); -GLAPI PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; -#define glGetVertexAttribfv glad_glGetVertexAttribfv -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint *params); -GLAPI PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; -#define glGetVertexAttribiv glad_glGetVertexAttribiv -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void **pointer); -GLAPI PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; -#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC)(GLuint program); -GLAPI PFNGLISPROGRAMPROC glad_glIsProgram; -#define glIsProgram glad_glIsProgram -typedef GLboolean (APIENTRYP PFNGLISSHADERPROC)(GLuint shader); -GLAPI PFNGLISSHADERPROC glad_glIsShader; -#define glIsShader glad_glIsShader -typedef void (APIENTRYP PFNGLLINKPROGRAMPROC)(GLuint program); -GLAPI PFNGLLINKPROGRAMPROC glad_glLinkProgram; -#define glLinkProgram glad_glLinkProgram -typedef void (APIENTRYP PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); -GLAPI PFNGLSHADERSOURCEPROC glad_glShaderSource; -#define glShaderSource glad_glShaderSource -typedef void (APIENTRYP PFNGLUSEPROGRAMPROC)(GLuint program); -GLAPI PFNGLUSEPROGRAMPROC glad_glUseProgram; -#define glUseProgram glad_glUseProgram -typedef void (APIENTRYP PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); -GLAPI PFNGLUNIFORM1FPROC glad_glUniform1f; -#define glUniform1f glad_glUniform1f -typedef void (APIENTRYP PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); -GLAPI PFNGLUNIFORM2FPROC glad_glUniform2f; -#define glUniform2f glad_glUniform2f -typedef void (APIENTRYP PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI PFNGLUNIFORM3FPROC glad_glUniform3f; -#define glUniform3f glad_glUniform3f -typedef void (APIENTRYP PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI PFNGLUNIFORM4FPROC glad_glUniform4f; -#define glUniform4f glad_glUniform4f -typedef void (APIENTRYP PFNGLUNIFORM1IPROC)(GLint location, GLint v0); -GLAPI PFNGLUNIFORM1IPROC glad_glUniform1i; -#define glUniform1i glad_glUniform1i -typedef void (APIENTRYP PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); -GLAPI PFNGLUNIFORM2IPROC glad_glUniform2i; -#define glUniform2i glad_glUniform2i -typedef void (APIENTRYP PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); -GLAPI PFNGLUNIFORM3IPROC glad_glUniform3i; -#define glUniform3i glad_glUniform3i -typedef void (APIENTRYP PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI PFNGLUNIFORM4IPROC glad_glUniform4i; -#define glUniform4i glad_glUniform4i -typedef void (APIENTRYP PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat *value); -GLAPI PFNGLUNIFORM1FVPROC glad_glUniform1fv; -#define glUniform1fv glad_glUniform1fv -typedef void (APIENTRYP PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat *value); -GLAPI PFNGLUNIFORM2FVPROC glad_glUniform2fv; -#define glUniform2fv glad_glUniform2fv -typedef void (APIENTRYP PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat *value); -GLAPI PFNGLUNIFORM3FVPROC glad_glUniform3fv; -#define glUniform3fv glad_glUniform3fv -typedef void (APIENTRYP PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat *value); -GLAPI PFNGLUNIFORM4FVPROC glad_glUniform4fv; -#define glUniform4fv glad_glUniform4fv -typedef void (APIENTRYP PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint *value); -GLAPI PFNGLUNIFORM1IVPROC glad_glUniform1iv; -#define glUniform1iv glad_glUniform1iv -typedef void (APIENTRYP PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint *value); -GLAPI PFNGLUNIFORM2IVPROC glad_glUniform2iv; -#define glUniform2iv glad_glUniform2iv -typedef void (APIENTRYP PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint *value); -GLAPI PFNGLUNIFORM3IVPROC glad_glUniform3iv; -#define glUniform3iv glad_glUniform3iv -typedef void (APIENTRYP PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint *value); -GLAPI PFNGLUNIFORM4IVPROC glad_glUniform4iv; -#define glUniform4iv glad_glUniform4iv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; -#define glUniformMatrix2fv glad_glUniformMatrix2fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; -#define glUniformMatrix3fv glad_glUniformMatrix3fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; -#define glUniformMatrix4fv glad_glUniformMatrix4fv -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC)(GLuint program); -GLAPI PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; -#define glValidateProgram glad_glValidateProgram -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); -GLAPI PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d; -#define glVertexAttrib1d glad_glVertexAttrib1d -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble *v); -GLAPI PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv; -#define glVertexAttrib1dv glad_glVertexAttrib1dv -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); -GLAPI PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; -#define glVertexAttrib1f glad_glVertexAttrib1f -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat *v); -GLAPI PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; -#define glVertexAttrib1fv glad_glVertexAttrib1fv -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x); -GLAPI PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s; -#define glVertexAttrib1s glad_glVertexAttrib1s -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort *v); -GLAPI PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv; -#define glVertexAttrib1sv glad_glVertexAttrib1sv -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y); -GLAPI PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d; -#define glVertexAttrib2d glad_glVertexAttrib2d -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble *v); -GLAPI PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv; -#define glVertexAttrib2dv glad_glVertexAttrib2dv -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); -GLAPI PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; -#define glVertexAttrib2f glad_glVertexAttrib2f -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat *v); -GLAPI PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; -#define glVertexAttrib2fv glad_glVertexAttrib2fv -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y); -GLAPI PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s; -#define glVertexAttrib2s glad_glVertexAttrib2s -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort *v); -GLAPI PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv; -#define glVertexAttrib2sv glad_glVertexAttrib2sv -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d; -#define glVertexAttrib3d glad_glVertexAttrib3d -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble *v); -GLAPI PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv; -#define glVertexAttrib3dv glad_glVertexAttrib3dv -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; -#define glVertexAttrib3f glad_glVertexAttrib3f -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat *v); -GLAPI PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; -#define glVertexAttrib3fv glad_glVertexAttrib3fv -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s; -#define glVertexAttrib3s glad_glVertexAttrib3s -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort *v); -GLAPI PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv; -#define glVertexAttrib3sv glad_glVertexAttrib3sv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte *v); -GLAPI PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv; -#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint *v); -GLAPI PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv; -#define glVertexAttrib4Niv glad_glVertexAttrib4Niv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort *v); -GLAPI PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv; -#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub; -#define glVertexAttrib4Nub glad_glVertexAttrib4Nub -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte *v); -GLAPI PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv; -#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint *v); -GLAPI PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv; -#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort *v); -GLAPI PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv; -#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte *v); -GLAPI PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv; -#define glVertexAttrib4bv glad_glVertexAttrib4bv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d; -#define glVertexAttrib4d glad_glVertexAttrib4d -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble *v); -GLAPI PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv; -#define glVertexAttrib4dv glad_glVertexAttrib4dv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; -#define glVertexAttrib4f glad_glVertexAttrib4f -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat *v); -GLAPI PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; -#define glVertexAttrib4fv glad_glVertexAttrib4fv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint *v); -GLAPI PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv; -#define glVertexAttrib4iv glad_glVertexAttrib4iv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s; -#define glVertexAttrib4s glad_glVertexAttrib4s -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort *v); -GLAPI PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv; -#define glVertexAttrib4sv glad_glVertexAttrib4sv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte *v); -GLAPI PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv; -#define glVertexAttrib4ubv glad_glVertexAttrib4ubv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint *v); -GLAPI PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv; -#define glVertexAttrib4uiv glad_glVertexAttrib4uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort *v); -GLAPI PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv; -#define glVertexAttrib4usv glad_glVertexAttrib4usv -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -GLAPI PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; -#define glVertexAttribPointer glad_glVertexAttribPointer -#endif -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 -GLAPI int GLAD_GL_VERSION_2_1; -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv; -#define glUniformMatrix2x3fv glad_glUniformMatrix2x3fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv; -#define glUniformMatrix3x2fv glad_glUniformMatrix3x2fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv; -#define glUniformMatrix2x4fv glad_glUniformMatrix2x4fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv; -#define glUniformMatrix4x2fv glad_glUniformMatrix4x2fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv; -#define glUniformMatrix3x4fv glad_glUniformMatrix3x4fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv; -#define glUniformMatrix4x3fv glad_glUniformMatrix4x3fv -#endif -#ifndef GL_VERSION_3_0 -#define GL_VERSION_3_0 1 -GLAPI int GLAD_GL_VERSION_3_0; -typedef void (APIENTRYP PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GLAPI PFNGLCOLORMASKIPROC glad_glColorMaski; -#define glColorMaski glad_glColorMaski -typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean *data); -GLAPI PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v; -#define glGetBooleani_v glad_glGetBooleani_v -typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint *data); -GLAPI PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v; -#define glGetIntegeri_v glad_glGetIntegeri_v -typedef void (APIENTRYP PFNGLENABLEIPROC)(GLenum target, GLuint index); -GLAPI PFNGLENABLEIPROC glad_glEnablei; -#define glEnablei glad_glEnablei -typedef void (APIENTRYP PFNGLDISABLEIPROC)(GLenum target, GLuint index); -GLAPI PFNGLDISABLEIPROC glad_glDisablei; -#define glDisablei glad_glDisablei -typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC)(GLenum target, GLuint index); -GLAPI PFNGLISENABLEDIPROC glad_glIsEnabledi; -#define glIsEnabledi glad_glIsEnabledi -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); -GLAPI PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; -#define glBeginTransformFeedback glad_glBeginTransformFeedback -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC)(void); -GLAPI PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; -#define glEndTransformFeedback glad_glEndTransformFeedback -typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange; -#define glBindBufferRange glad_glBindBufferRange -typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer); -GLAPI PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase; -#define glBindBufferBase glad_glBindBufferBase -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); -GLAPI PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings; -#define glTransformFeedbackVaryings glad_glTransformFeedbackVaryings -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying; -#define glGetTransformFeedbackVarying glad_glGetTransformFeedbackVarying -typedef void (APIENTRYP PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp); -GLAPI PFNGLCLAMPCOLORPROC glad_glClampColor; -#define glClampColor glad_glClampColor -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); -GLAPI PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender; -#define glBeginConditionalRender glad_glBeginConditionalRender -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC)(void); -GLAPI PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender; -#define glEndConditionalRender glad_glEndConditionalRender -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer; -#define glVertexAttribIPointer glad_glVertexAttribIPointer -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint *params); -GLAPI PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv; -#define glGetVertexAttribIiv glad_glGetVertexAttribIiv -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint *params); -GLAPI PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv; -#define glGetVertexAttribIuiv glad_glGetVertexAttribIuiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x); -GLAPI PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i; -#define glVertexAttribI1i glad_glVertexAttribI1i -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y); -GLAPI PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i; -#define glVertexAttribI2i glad_glVertexAttribI2i -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z); -GLAPI PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i; -#define glVertexAttribI3i glad_glVertexAttribI3i -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i; -#define glVertexAttribI4i glad_glVertexAttribI4i -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x); -GLAPI PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui; -#define glVertexAttribI1ui glad_glVertexAttribI1ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y); -GLAPI PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui; -#define glVertexAttribI2ui glad_glVertexAttribI2ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui; -#define glVertexAttribI3ui glad_glVertexAttribI3ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui; -#define glVertexAttribI4ui glad_glVertexAttribI4ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint *v); -GLAPI PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv; -#define glVertexAttribI1iv glad_glVertexAttribI1iv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint *v); -GLAPI PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv; -#define glVertexAttribI2iv glad_glVertexAttribI2iv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint *v); -GLAPI PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv; -#define glVertexAttribI3iv glad_glVertexAttribI3iv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint *v); -GLAPI PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv; -#define glVertexAttribI4iv glad_glVertexAttribI4iv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint *v); -GLAPI PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv; -#define glVertexAttribI1uiv glad_glVertexAttribI1uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint *v); -GLAPI PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv; -#define glVertexAttribI2uiv glad_glVertexAttribI2uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint *v); -GLAPI PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv; -#define glVertexAttribI3uiv glad_glVertexAttribI3uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint *v); -GLAPI PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv; -#define glVertexAttribI4uiv glad_glVertexAttribI4uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte *v); -GLAPI PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv; -#define glVertexAttribI4bv glad_glVertexAttribI4bv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort *v); -GLAPI PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv; -#define glVertexAttribI4sv glad_glVertexAttribI4sv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte *v); -GLAPI PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv; -#define glVertexAttribI4ubv glad_glVertexAttribI4ubv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort *v); -GLAPI PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv; -#define glVertexAttribI4usv glad_glVertexAttribI4usv -typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint *params); -GLAPI PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv; -#define glGetUniformuiv glad_glGetUniformuiv -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar *name); -GLAPI PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation; -#define glBindFragDataLocation glad_glBindFragDataLocation -typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar *name); -GLAPI PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation; -#define glGetFragDataLocation glad_glGetFragDataLocation -typedef void (APIENTRYP PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0); -GLAPI PFNGLUNIFORM1UIPROC glad_glUniform1ui; -#define glUniform1ui glad_glUniform1ui -typedef void (APIENTRYP PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1); -GLAPI PFNGLUNIFORM2UIPROC glad_glUniform2ui; -#define glUniform2ui glad_glUniform2ui -typedef void (APIENTRYP PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI PFNGLUNIFORM3UIPROC glad_glUniform3ui; -#define glUniform3ui glad_glUniform3ui -typedef void (APIENTRYP PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI PFNGLUNIFORM4UIPROC glad_glUniform4ui; -#define glUniform4ui glad_glUniform4ui -typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint *value); -GLAPI PFNGLUNIFORM1UIVPROC glad_glUniform1uiv; -#define glUniform1uiv glad_glUniform1uiv -typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint *value); -GLAPI PFNGLUNIFORM2UIVPROC glad_glUniform2uiv; -#define glUniform2uiv glad_glUniform2uiv -typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint *value); -GLAPI PFNGLUNIFORM3UIVPROC glad_glUniform3uiv; -#define glUniform3uiv glad_glUniform3uiv -typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint *value); -GLAPI PFNGLUNIFORM4UIVPROC glad_glUniform4uiv; -#define glUniform4uiv glad_glUniform4uiv -typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint *params); -GLAPI PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv; -#define glTexParameterIiv glad_glTexParameterIiv -typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint *params); -GLAPI PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv; -#define glTexParameterIuiv glad_glTexParameterIuiv -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint *params); -GLAPI PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv; -#define glGetTexParameterIiv glad_glGetTexParameterIiv -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint *params); -GLAPI PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv; -#define glGetTexParameterIuiv glad_glGetTexParameterIuiv -typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint *value); -GLAPI PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv; -#define glClearBufferiv glad_glClearBufferiv -typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint *value); -GLAPI PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv; -#define glClearBufferuiv glad_glClearBufferuiv -typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat *value); -GLAPI PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv; -#define glClearBufferfv glad_glClearBufferfv -typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -GLAPI PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi; -#define glClearBufferfi glad_glClearBufferfi -typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); -GLAPI PFNGLGETSTRINGIPROC glad_glGetStringi; -#define glGetStringi glad_glGetStringi -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); -GLAPI PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; -#define glIsRenderbuffer glad_glIsRenderbuffer -typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); -GLAPI PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; -#define glBindRenderbuffer glad_glBindRenderbuffer -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers); -GLAPI PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; -#define glDeleteRenderbuffers glad_glDeleteRenderbuffers -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers); -GLAPI PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; -#define glGenRenderbuffers glad_glGenRenderbuffers -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; -#define glRenderbufferStorage glad_glRenderbufferStorage -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); -GLAPI PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; -#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); -GLAPI PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; -#define glIsFramebuffer glad_glIsFramebuffer -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); -GLAPI PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; -#define glBindFramebuffer glad_glBindFramebuffer -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers); -GLAPI PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; -#define glDeleteFramebuffers glad_glDeleteFramebuffers -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers); -GLAPI PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; -#define glGenFramebuffers glad_glGenFramebuffers -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); -GLAPI PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; -#define glCheckFramebufferStatus glad_glCheckFramebufferStatus -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D; -#define glFramebufferTexture1D glad_glFramebufferTexture1D -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; -#define glFramebufferTexture2D glad_glFramebufferTexture2D -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D; -#define glFramebufferTexture3D glad_glFramebufferTexture3D -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; -#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint *params); -GLAPI PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; -#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv -typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC)(GLenum target); -GLAPI PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; -#define glGenerateMipmap glad_glGenerateMipmap -typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -GLAPI PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer; -#define glBlitFramebuffer glad_glBlitFramebuffer -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample; -#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer; -#define glFramebufferTextureLayer glad_glFramebufferTextureLayer -typedef void * (APIENTRYP PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange; -#define glMapBufferRange glad_glMapBufferRange -typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); -GLAPI PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange; -#define glFlushMappedBufferRange glad_glFlushMappedBufferRange -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC)(GLuint array); -GLAPI PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray; -#define glBindVertexArray glad_glBindVertexArray -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint *arrays); -GLAPI PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays; -#define glDeleteVertexArrays glad_glDeleteVertexArrays -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint *arrays); -GLAPI PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays; -#define glGenVertexArrays glad_glGenVertexArrays -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC)(GLuint array); -GLAPI PFNGLISVERTEXARRAYPROC glad_glIsVertexArray; -#define glIsVertexArray glad_glIsVertexArray -#endif -#ifndef GL_VERSION_3_1 -#define GL_VERSION_3_1 1 -GLAPI int GLAD_GL_VERSION_3_1; -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -GLAPI PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced; -#define glDrawArraysInstanced glad_glDrawArraysInstanced -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); -GLAPI PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced; -#define glDrawElementsInstanced glad_glDrawElementsInstanced -typedef void (APIENTRYP PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer); -GLAPI PFNGLTEXBUFFERPROC glad_glTexBuffer; -#define glTexBuffer glad_glTexBuffer -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index); -GLAPI PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex; -#define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex -typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GLAPI PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData; -#define glCopyBufferSubData glad_glCopyBufferSubData -typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); -GLAPI PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices; -#define glGetUniformIndices glad_glGetUniformIndices -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -GLAPI PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv; -#define glGetActiveUniformsiv glad_glGetActiveUniformsiv -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -GLAPI PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName; -#define glGetActiveUniformName glad_glGetActiveUniformName -typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar *uniformBlockName); -GLAPI PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex; -#define glGetUniformBlockIndex glad_glGetUniformBlockIndex -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -GLAPI PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv; -#define glGetActiveUniformBlockiv glad_glGetActiveUniformBlockiv -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -GLAPI PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName; -#define glGetActiveUniformBlockName glad_glGetActiveUniformBlockName -typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -GLAPI PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding; -#define glUniformBlockBinding glad_glUniformBlockBinding -#endif -#ifndef GL_VERSION_3_2 -#define GL_VERSION_3_2 1 -GLAPI int GLAD_GL_VERSION_3_2; -typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GLAPI PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex; -#define glDrawElementsBaseVertex glad_glDrawElementsBaseVertex -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GLAPI PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex; -#define glDrawRangeElementsBaseVertex glad_glDrawRangeElementsBaseVertex -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -GLAPI PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex; -#define glDrawElementsInstancedBaseVertex glad_glDrawElementsInstancedBaseVertex -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); -GLAPI PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex; -#define glMultiDrawElementsBaseVertex glad_glMultiDrawElementsBaseVertex -typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC)(GLenum mode); -GLAPI PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex; -#define glProvokingVertex glad_glProvokingVertex -typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags); -GLAPI PFNGLFENCESYNCPROC glad_glFenceSync; -#define glFenceSync glad_glFenceSync -typedef GLboolean (APIENTRYP PFNGLISSYNCPROC)(GLsync sync); -GLAPI PFNGLISSYNCPROC glad_glIsSync; -#define glIsSync glad_glIsSync -typedef void (APIENTRYP PFNGLDELETESYNCPROC)(GLsync sync); -GLAPI PFNGLDELETESYNCPROC glad_glDeleteSync; -#define glDeleteSync glad_glDeleteSync -typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync; -#define glClientWaitSync glad_glClientWaitSync -typedef void (APIENTRYP PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI PFNGLWAITSYNCPROC glad_glWaitSync; -#define glWaitSync glad_glWaitSync -typedef void (APIENTRYP PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 *data); -GLAPI PFNGLGETINTEGER64VPROC glad_glGetInteger64v; -#define glGetInteger64v glad_glGetInteger64v -typedef void (APIENTRYP PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); -GLAPI PFNGLGETSYNCIVPROC glad_glGetSynciv; -#define glGetSynciv glad_glGetSynciv -typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 *data); -GLAPI PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v; -#define glGetInteger64i_v glad_glGetInteger64i_v -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 *params); -GLAPI PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v; -#define glGetBufferParameteri64v glad_glGetBufferParameteri64v -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture; -#define glFramebufferTexture glad_glFramebufferTexture -typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample; -#define glTexImage2DMultisample glad_glTexImage2DMultisample -typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample; -#define glTexImage3DMultisample glad_glTexImage3DMultisample -typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat *val); -GLAPI PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv; -#define glGetMultisamplefv glad_glGetMultisamplefv -typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask); -GLAPI PFNGLSAMPLEMASKIPROC glad_glSampleMaski; -#define glSampleMaski glad_glSampleMaski -#endif -#ifndef GL_VERSION_3_3 -#define GL_VERSION_3_3 1 -GLAPI int GLAD_GL_VERSION_3_3; -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -GLAPI PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed; -#define glBindFragDataLocationIndexed glad_glBindFragDataLocationIndexed -typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar *name); -GLAPI PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex; -#define glGetFragDataIndex glad_glGetFragDataIndex -typedef void (APIENTRYP PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint *samplers); -GLAPI PFNGLGENSAMPLERSPROC glad_glGenSamplers; -#define glGenSamplers glad_glGenSamplers -typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint *samplers); -GLAPI PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers; -#define glDeleteSamplers glad_glDeleteSamplers -typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC)(GLuint sampler); -GLAPI PFNGLISSAMPLERPROC glad_glIsSampler; -#define glIsSampler glad_glIsSampler -typedef void (APIENTRYP PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); -GLAPI PFNGLBINDSAMPLERPROC glad_glBindSampler; -#define glBindSampler glad_glBindSampler -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param); -GLAPI PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri; -#define glSamplerParameteri glad_glSamplerParameteri -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint *param); -GLAPI PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv; -#define glSamplerParameteriv glad_glSamplerParameteriv -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param); -GLAPI PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf; -#define glSamplerParameterf glad_glSamplerParameterf -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat *param); -GLAPI PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv; -#define glSamplerParameterfv glad_glSamplerParameterfv -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint *param); -GLAPI PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv; -#define glSamplerParameterIiv glad_glSamplerParameterIiv -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint *param); -GLAPI PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv; -#define glSamplerParameterIuiv glad_glSamplerParameterIuiv -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint *params); -GLAPI PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv; -#define glGetSamplerParameteriv glad_glGetSamplerParameteriv -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint *params); -GLAPI PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv; -#define glGetSamplerParameterIiv glad_glGetSamplerParameterIiv -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat *params); -GLAPI PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv; -#define glGetSamplerParameterfv glad_glGetSamplerParameterfv -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint *params); -GLAPI PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv; -#define glGetSamplerParameterIuiv glad_glGetSamplerParameterIuiv -typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target); -GLAPI PFNGLQUERYCOUNTERPROC glad_glQueryCounter; -#define glQueryCounter glad_glQueryCounter -typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 *params); -GLAPI PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v; -#define glGetQueryObjecti64v glad_glGetQueryObjecti64v -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 *params); -GLAPI PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v; -#define glGetQueryObjectui64v glad_glGetQueryObjectui64v -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); -GLAPI PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor; -#define glVertexAttribDivisor glad_glVertexAttribDivisor -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui; -#define glVertexAttribP1ui glad_glVertexAttribP1ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv; -#define glVertexAttribP1uiv glad_glVertexAttribP1uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui; -#define glVertexAttribP2ui glad_glVertexAttribP2ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv; -#define glVertexAttribP2uiv glad_glVertexAttribP2uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui; -#define glVertexAttribP3ui glad_glVertexAttribP3ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv; -#define glVertexAttribP3uiv glad_glVertexAttribP3uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui; -#define glVertexAttribP4ui glad_glVertexAttribP4ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv; -#define glVertexAttribP4uiv glad_glVertexAttribP4uiv -typedef void (APIENTRYP PFNGLVERTEXP2UIPROC)(GLenum type, GLuint value); -GLAPI PFNGLVERTEXP2UIPROC glad_glVertexP2ui; -#define glVertexP2ui glad_glVertexP2ui -typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC)(GLenum type, const GLuint *value); -GLAPI PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv; -#define glVertexP2uiv glad_glVertexP2uiv -typedef void (APIENTRYP PFNGLVERTEXP3UIPROC)(GLenum type, GLuint value); -GLAPI PFNGLVERTEXP3UIPROC glad_glVertexP3ui; -#define glVertexP3ui glad_glVertexP3ui -typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC)(GLenum type, const GLuint *value); -GLAPI PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv; -#define glVertexP3uiv glad_glVertexP3uiv -typedef void (APIENTRYP PFNGLVERTEXP4UIPROC)(GLenum type, GLuint value); -GLAPI PFNGLVERTEXP4UIPROC glad_glVertexP4ui; -#define glVertexP4ui glad_glVertexP4ui -typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC)(GLenum type, const GLuint *value); -GLAPI PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv; -#define glVertexP4uiv glad_glVertexP4uiv -typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC)(GLenum type, GLuint coords); -GLAPI PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui; -#define glTexCoordP1ui glad_glTexCoordP1ui -typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC)(GLenum type, const GLuint *coords); -GLAPI PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv; -#define glTexCoordP1uiv glad_glTexCoordP1uiv -typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC)(GLenum type, GLuint coords); -GLAPI PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui; -#define glTexCoordP2ui glad_glTexCoordP2ui -typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC)(GLenum type, const GLuint *coords); -GLAPI PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv; -#define glTexCoordP2uiv glad_glTexCoordP2uiv -typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC)(GLenum type, GLuint coords); -GLAPI PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui; -#define glTexCoordP3ui glad_glTexCoordP3ui -typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC)(GLenum type, const GLuint *coords); -GLAPI PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv; -#define glTexCoordP3uiv glad_glTexCoordP3uiv -typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC)(GLenum type, GLuint coords); -GLAPI PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui; -#define glTexCoordP4ui glad_glTexCoordP4ui -typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC)(GLenum type, const GLuint *coords); -GLAPI PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv; -#define glTexCoordP4uiv glad_glTexCoordP4uiv -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC)(GLenum texture, GLenum type, GLuint coords); -GLAPI PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui; -#define glMultiTexCoordP1ui glad_glMultiTexCoordP1ui -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); -GLAPI PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv; -#define glMultiTexCoordP1uiv glad_glMultiTexCoordP1uiv -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC)(GLenum texture, GLenum type, GLuint coords); -GLAPI PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui; -#define glMultiTexCoordP2ui glad_glMultiTexCoordP2ui -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); -GLAPI PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv; -#define glMultiTexCoordP2uiv glad_glMultiTexCoordP2uiv -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC)(GLenum texture, GLenum type, GLuint coords); -GLAPI PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui; -#define glMultiTexCoordP3ui glad_glMultiTexCoordP3ui -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); -GLAPI PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv; -#define glMultiTexCoordP3uiv glad_glMultiTexCoordP3uiv -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC)(GLenum texture, GLenum type, GLuint coords); -GLAPI PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui; -#define glMultiTexCoordP4ui glad_glMultiTexCoordP4ui -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); -GLAPI PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv; -#define glMultiTexCoordP4uiv glad_glMultiTexCoordP4uiv -typedef void (APIENTRYP PFNGLNORMALP3UIPROC)(GLenum type, GLuint coords); -GLAPI PFNGLNORMALP3UIPROC glad_glNormalP3ui; -#define glNormalP3ui glad_glNormalP3ui -typedef void (APIENTRYP PFNGLNORMALP3UIVPROC)(GLenum type, const GLuint *coords); -GLAPI PFNGLNORMALP3UIVPROC glad_glNormalP3uiv; -#define glNormalP3uiv glad_glNormalP3uiv -typedef void (APIENTRYP PFNGLCOLORP3UIPROC)(GLenum type, GLuint color); -GLAPI PFNGLCOLORP3UIPROC glad_glColorP3ui; -#define glColorP3ui glad_glColorP3ui -typedef void (APIENTRYP PFNGLCOLORP3UIVPROC)(GLenum type, const GLuint *color); -GLAPI PFNGLCOLORP3UIVPROC glad_glColorP3uiv; -#define glColorP3uiv glad_glColorP3uiv -typedef void (APIENTRYP PFNGLCOLORP4UIPROC)(GLenum type, GLuint color); -GLAPI PFNGLCOLORP4UIPROC glad_glColorP4ui; -#define glColorP4ui glad_glColorP4ui -typedef void (APIENTRYP PFNGLCOLORP4UIVPROC)(GLenum type, const GLuint *color); -GLAPI PFNGLCOLORP4UIVPROC glad_glColorP4uiv; -#define glColorP4uiv glad_glColorP4uiv -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC)(GLenum type, GLuint color); -GLAPI PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui; -#define glSecondaryColorP3ui glad_glSecondaryColorP3ui -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC)(GLenum type, const GLuint *color); -GLAPI PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv; -#define glSecondaryColorP3uiv glad_glSecondaryColorP3uiv -#endif -#ifndef GL_ES_VERSION_2_0 -#define GL_ES_VERSION_2_0 1 -GLAPI int GLAD_GL_ES_VERSION_2_0; -typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC)(GLfloat d); -GLAPI PFNGLCLEARDEPTHFPROC glad_glClearDepthf; -#define glClearDepthf glad_glClearDepthf -typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f); -GLAPI PFNGLDEPTHRANGEFPROC glad_glDepthRangef; -#define glDepthRangef glad_glDepthRangef -typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC)(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -GLAPI PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat; -#define glGetShaderPrecisionFormat glad_glGetShaderPrecisionFormat -typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC)(void); -GLAPI PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler; -#define glReleaseShaderCompiler glad_glReleaseShaderCompiler -typedef void (APIENTRYP PFNGLSHADERBINARYPROC)(GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); -GLAPI PFNGLSHADERBINARYPROC glad_glShaderBinary; -#define glShaderBinary glad_glShaderBinary -#endif -#ifndef GL_ES_VERSION_3_0 -#define GL_ES_VERSION_3_0 1 -GLAPI int GLAD_GL_ES_VERSION_3_0; -typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC)(GLenum target, GLuint id); -GLAPI PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback; -#define glBindTransformFeedback glad_glBindTransformFeedback -typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC)(GLsizei n, const GLuint *ids); -GLAPI PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks; -#define glDeleteTransformFeedbacks glad_glDeleteTransformFeedbacks -typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint *ids); -GLAPI PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks; -#define glGenTransformFeedbacks glad_glGenTransformFeedbacks -typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC)(GLuint id); -GLAPI PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback; -#define glIsTransformFeedback glad_glIsTransformFeedback -typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC)(void); -GLAPI PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback; -#define glPauseTransformFeedback glad_glPauseTransformFeedback -typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC)(void); -GLAPI PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback; -#define glResumeTransformFeedback glad_glResumeTransformFeedback -typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); -GLAPI PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary; -#define glGetProgramBinary glad_glGetProgramBinary -typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); -GLAPI PFNGLPROGRAMBINARYPROC glad_glProgramBinary; -#define glProgramBinary glad_glProgramBinary -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value); -GLAPI PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri; -#define glProgramParameteri glad_glProgramParameteri -typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum *attachments); -GLAPI PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer; -#define glInvalidateFramebuffer glad_glInvalidateFramebuffer -typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer; -#define glInvalidateSubFramebuffer glad_glInvalidateSubFramebuffer -typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D; -#define glTexStorage2D glad_glTexStorage2D -typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -GLAPI PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D; -#define glTexStorage3D glad_glTexStorage3D -typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint *params); -GLAPI PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ; -#define glGetInternalformativ glad_glGetInternalformativ -#endif -#ifndef GL_ES_VERSION_3_1 -#define GL_ES_VERSION_3_1 1 -GLAPI int GLAD_GL_ES_VERSION_3_1; -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -GLAPI PFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute; -#define glDispatchCompute glad_glDispatchCompute -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC)(GLintptr indirect); -GLAPI PFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect; -#define glDispatchComputeIndirect glad_glDispatchComputeIndirect -typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC)(GLenum mode, const void *indirect); -GLAPI PFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect; -#define glDrawArraysIndirect glad_glDrawArraysIndirect -typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void *indirect); -GLAPI PFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect; -#define glDrawElementsIndirect glad_glDrawElementsIndirect -typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); -GLAPI PFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri; -#define glFramebufferParameteri glad_glFramebufferParameteri -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); -GLAPI PFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv; -#define glGetFramebufferParameteriv glad_glGetFramebufferParameteriv -typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC)(GLuint program, GLenum programInterface, GLenum pname, GLint *params); -GLAPI PFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv; -#define glGetProgramInterfaceiv glad_glGetProgramInterfaceiv -typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC)(GLuint program, GLenum programInterface, const GLchar *name); -GLAPI PFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex; -#define glGetProgramResourceIndex glad_glGetProgramResourceIndex -typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); -GLAPI PFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName; -#define glGetProgramResourceName glad_glGetProgramResourceName -typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLint *params); -GLAPI PFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv; -#define glGetProgramResourceiv glad_glGetProgramResourceiv -typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC)(GLuint program, GLenum programInterface, const GLchar *name); -GLAPI PFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation; -#define glGetProgramResourceLocation glad_glGetProgramResourceLocation -typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC)(GLuint pipeline, GLbitfield stages, GLuint program); -GLAPI PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages; -#define glUseProgramStages glad_glUseProgramStages -typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC)(GLuint pipeline, GLuint program); -GLAPI PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram; -#define glActiveShaderProgram glad_glActiveShaderProgram -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC)(GLenum type, GLsizei count, const GLchar *const*strings); -GLAPI PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv; -#define glCreateShaderProgramv glad_glCreateShaderProgramv -typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC)(GLuint pipeline); -GLAPI PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline; -#define glBindProgramPipeline glad_glBindProgramPipeline -typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei n, const GLuint *pipelines); -GLAPI PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines; -#define glDeleteProgramPipelines glad_glDeleteProgramPipelines -typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC)(GLsizei n, GLuint *pipelines); -GLAPI PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines; -#define glGenProgramPipelines glad_glGenProgramPipelines -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC)(GLuint pipeline); -GLAPI PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline; -#define glIsProgramPipeline glad_glIsProgramPipeline -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint pipeline, GLenum pname, GLint *params); -GLAPI PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv; -#define glGetProgramPipelineiv glad_glGetProgramPipelineiv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC)(GLuint program, GLint location, GLint v0); -GLAPI PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i; -#define glProgramUniform1i glad_glProgramUniform1i -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC)(GLuint program, GLint location, GLint v0, GLint v1); -GLAPI PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i; -#define glProgramUniform2i glad_glProgramUniform2i -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GLAPI PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i; -#define glProgramUniform3i glad_glProgramUniform3i -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i; -#define glProgramUniform4i glad_glProgramUniform4i -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC)(GLuint program, GLint location, GLuint v0); -GLAPI PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui; -#define glProgramUniform1ui glad_glProgramUniform1ui -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1); -GLAPI PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui; -#define glProgramUniform2ui glad_glProgramUniform2ui -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui; -#define glProgramUniform3ui glad_glProgramUniform3ui -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui; -#define glProgramUniform4ui glad_glProgramUniform4ui -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC)(GLuint program, GLint location, GLfloat v0); -GLAPI PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f; -#define glProgramUniform1f glad_glProgramUniform1f -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1); -GLAPI PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f; -#define glProgramUniform2f glad_glProgramUniform2f -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f; -#define glProgramUniform3f glad_glProgramUniform3f -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f; -#define glProgramUniform4f glad_glProgramUniform4f -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC)(GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv; -#define glProgramUniform1iv glad_glProgramUniform1iv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC)(GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv; -#define glProgramUniform2iv glad_glProgramUniform2iv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC)(GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv; -#define glProgramUniform3iv glad_glProgramUniform3iv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC)(GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv; -#define glProgramUniform4iv glad_glProgramUniform4iv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv; -#define glProgramUniform1uiv glad_glProgramUniform1uiv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv; -#define glProgramUniform2uiv glad_glProgramUniform2uiv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv; -#define glProgramUniform3uiv glad_glProgramUniform3uiv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv; -#define glProgramUniform4uiv glad_glProgramUniform4uiv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv; -#define glProgramUniform1fv glad_glProgramUniform1fv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv; -#define glProgramUniform2fv glad_glProgramUniform2fv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv; -#define glProgramUniform3fv glad_glProgramUniform3fv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv; -#define glProgramUniform4fv glad_glProgramUniform4fv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv; -#define glProgramUniformMatrix2fv glad_glProgramUniformMatrix2fv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv; -#define glProgramUniformMatrix3fv glad_glProgramUniformMatrix3fv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv; -#define glProgramUniformMatrix4fv glad_glProgramUniformMatrix4fv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv; -#define glProgramUniformMatrix2x3fv glad_glProgramUniformMatrix2x3fv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv; -#define glProgramUniformMatrix3x2fv glad_glProgramUniformMatrix3x2fv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv; -#define glProgramUniformMatrix2x4fv glad_glProgramUniformMatrix2x4fv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv; -#define glProgramUniformMatrix4x2fv glad_glProgramUniformMatrix4x2fv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv; -#define glProgramUniformMatrix3x4fv glad_glProgramUniformMatrix3x4fv -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv; -#define glProgramUniformMatrix4x3fv glad_glProgramUniformMatrix4x3fv -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC)(GLuint pipeline); -GLAPI PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline; -#define glValidateProgramPipeline glad_glValidateProgramPipeline -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog; -#define glGetProgramPipelineInfoLog glad_glGetProgramPipelineInfoLog -typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -GLAPI PFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture; -#define glBindImageTexture glad_glBindImageTexture -typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC)(GLbitfield barriers); -GLAPI PFNGLMEMORYBARRIERPROC glad_glMemoryBarrier; -#define glMemoryBarrier glad_glMemoryBarrier -typedef void (APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC)(GLbitfield barriers); -GLAPI PFNGLMEMORYBARRIERBYREGIONPROC glad_glMemoryBarrierByRegion; -#define glMemoryBarrierByRegion glad_glMemoryBarrierByRegion -typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI PFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample; -#define glTexStorage2DMultisample glad_glTexStorage2DMultisample -typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -GLAPI PFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer; -#define glBindVertexBuffer glad_glBindVertexBuffer -typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -GLAPI PFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat; -#define glVertexAttribFormat glad_glVertexAttribFormat -typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI PFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat; -#define glVertexAttribIFormat glad_glVertexAttribIFormat -typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC)(GLuint attribindex, GLuint bindingindex); -GLAPI PFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding; -#define glVertexAttribBinding glad_glVertexAttribBinding -typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC)(GLuint bindingindex, GLuint divisor); -GLAPI PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor; -#define glVertexBindingDivisor glad_glVertexBindingDivisor -#endif -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 -#define GL_DEBUG_SOURCE_API 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION 0x824A -#define GL_DEBUG_SOURCE_OTHER 0x824B -#define GL_DEBUG_TYPE_ERROR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 -#define GL_DEBUG_TYPE_OTHER 0x8251 -#define GL_DEBUG_TYPE_MARKER 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D -#define GL_BUFFER 0x82E0 -#define GL_SHADER 0x82E1 -#define GL_PROGRAM 0x82E2 -#define GL_VERTEX_ARRAY 0x8074 -#define GL_QUERY 0x82E3 -#define GL_PROGRAM_PIPELINE 0x82E4 -#define GL_SAMPLER 0x82E6 -#define GL_MAX_LABEL_LENGTH 0x82E8 -#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES 0x9145 -#define GL_DEBUG_SEVERITY_HIGH 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 -#define GL_DEBUG_SEVERITY_LOW 0x9148 -#define GL_DEBUG_OUTPUT 0x92E0 -#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245 -#define GL_DEBUG_SOURCE_API_KHR 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A -#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B -#define GL_DEBUG_TYPE_ERROR_KHR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250 -#define GL_DEBUG_TYPE_OTHER_KHR 0x8251 -#define GL_DEBUG_TYPE_MARKER_KHR 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D -#define GL_BUFFER_KHR 0x82E0 -#define GL_SHADER_KHR 0x82E1 -#define GL_PROGRAM_KHR 0x82E2 -#define GL_VERTEX_ARRAY_KHR 0x8074 -#define GL_QUERY_KHR 0x82E3 -#define GL_PROGRAM_PIPELINE_KHR 0x82E4 -#define GL_SAMPLER_KHR 0x82E6 -#define GL_MAX_LABEL_LENGTH_KHR 0x82E8 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147 -#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148 -#define GL_DEBUG_OUTPUT_KHR 0x92E0 -#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002 -#define GL_STACK_OVERFLOW_KHR 0x0503 -#define GL_STACK_UNDERFLOW_KHR 0x0504 -#define GL_DISPLAY_LIST 0x82E7 -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 -GLAPI int GLAD_GL_EXT_framebuffer_object; -#endif -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 -GLAPI int GLAD_GL_EXT_texture_compression_s3tc; -#endif -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -GLAPI int GLAD_GL_EXT_texture_filter_anisotropic; -#endif -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 -GLAPI int GLAD_GL_KHR_debug; -typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl; -#define glDebugMessageControl glad_glDebugMessageControl -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GLAPI PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert; -#define glDebugMessageInsert glad_glDebugMessageInsert -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void *userParam); -GLAPI PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback; -#define glDebugMessageCallback glad_glDebugMessageCallback -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -GLAPI PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog; -#define glGetDebugMessageLog glad_glGetDebugMessageLog -typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar *message); -GLAPI PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup; -#define glPushDebugGroup glad_glPushDebugGroup -typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC)(void); -GLAPI PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup; -#define glPopDebugGroup glad_glPopDebugGroup -typedef void (APIENTRYP PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -GLAPI PFNGLOBJECTLABELPROC glad_glObjectLabel; -#define glObjectLabel glad_glObjectLabel -typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -GLAPI PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel; -#define glGetObjectLabel glad_glGetObjectLabel -typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC)(const void *ptr, GLsizei length, const GLchar *label); -GLAPI PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel; -#define glObjectPtrLabel glad_glObjectPtrLabel -typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC)(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -GLAPI PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel; -#define glGetObjectPtrLabel glad_glGetObjectPtrLabel -typedef void (APIENTRYP PFNGLGETPOINTERVPROC)(GLenum pname, void **params); -GLAPI PFNGLGETPOINTERVPROC glad_glGetPointerv; -#define glGetPointerv glad_glGetPointerv -typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI PFNGLDEBUGMESSAGECONTROLKHRPROC glad_glDebugMessageControlKHR; -#define glDebugMessageControlKHR glad_glDebugMessageControlKHR -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GLAPI PFNGLDEBUGMESSAGEINSERTKHRPROC glad_glDebugMessageInsertKHR; -#define glDebugMessageInsertKHR glad_glDebugMessageInsertKHR -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC)(GLDEBUGPROCKHR callback, const void *userParam); -GLAPI PFNGLDEBUGMESSAGECALLBACKKHRPROC glad_glDebugMessageCallbackKHR; -#define glDebugMessageCallbackKHR glad_glDebugMessageCallbackKHR -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC)(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -GLAPI PFNGLGETDEBUGMESSAGELOGKHRPROC glad_glGetDebugMessageLogKHR; -#define glGetDebugMessageLogKHR glad_glGetDebugMessageLogKHR -typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPKHRPROC)(GLenum source, GLuint id, GLsizei length, const GLchar *message); -GLAPI PFNGLPUSHDEBUGGROUPKHRPROC glad_glPushDebugGroupKHR; -#define glPushDebugGroupKHR glad_glPushDebugGroupKHR -typedef void (APIENTRYP PFNGLPOPDEBUGGROUPKHRPROC)(void); -GLAPI PFNGLPOPDEBUGGROUPKHRPROC glad_glPopDebugGroupKHR; -#define glPopDebugGroupKHR glad_glPopDebugGroupKHR -typedef void (APIENTRYP PFNGLOBJECTLABELKHRPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -GLAPI PFNGLOBJECTLABELKHRPROC glad_glObjectLabelKHR; -#define glObjectLabelKHR glad_glObjectLabelKHR -typedef void (APIENTRYP PFNGLGETOBJECTLABELKHRPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -GLAPI PFNGLGETOBJECTLABELKHRPROC glad_glGetObjectLabelKHR; -#define glGetObjectLabelKHR glad_glGetObjectLabelKHR -typedef void (APIENTRYP PFNGLOBJECTPTRLABELKHRPROC)(const void *ptr, GLsizei length, const GLchar *label); -GLAPI PFNGLOBJECTPTRLABELKHRPROC glad_glObjectPtrLabelKHR; -#define glObjectPtrLabelKHR glad_glObjectPtrLabelKHR -typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELKHRPROC)(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -GLAPI PFNGLGETOBJECTPTRLABELKHRPROC glad_glGetObjectPtrLabelKHR; -#define glGetObjectPtrLabelKHR glad_glGetObjectPtrLabelKHR -typedef void (APIENTRYP PFNGLGETPOINTERVKHRPROC)(GLenum pname, void **params); -GLAPI PFNGLGETPOINTERVKHRPROC glad_glGetPointervKHR; -#define glGetPointervKHR glad_glGetPointervKHR -#endif -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 -GLAPI int GLAD_GL_KHR_texture_compression_astc_ldr; -#endif -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 -GLAPI int GLAD_GL_EXT_texture_compression_s3tc; -#endif -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -GLAPI int GLAD_GL_EXT_texture_filter_anisotropic; -#endif -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 -GLAPI int GLAD_GL_KHR_debug; -#endif -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 -GLAPI int GLAD_GL_KHR_texture_compression_astc_ldr; -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/vendor/librw/src/gl/glad/khrplatform.h b/vendor/librw/src/gl/glad/khrplatform.h deleted file mode 100644 index dd22d92..0000000 --- a/vendor/librw/src/gl/glad/khrplatform.h +++ /dev/null @@ -1,290 +0,0 @@ -#ifndef __khrplatform_h_ -#define __khrplatform_h_ - -/* -** Copyright (c) 2008-2018 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -/* Khronos platform-specific types and definitions. - * - * The master copy of khrplatform.h is maintained in the Khronos EGL - * Registry repository at https://github.com/KhronosGroup/EGL-Registry - * The last semantic modification to khrplatform.h was at commit ID: - * 67a3e0864c2d75ea5287b9f3d2eb74a745936692 - * - * Adopters may modify this file to suit their platform. Adopters are - * encouraged to submit platform specific modifications to the Khronos - * group so that they can be included in future versions of this file. - * Please submit changes by filing pull requests or issues on - * the EGL Registry repository linked above. - * - * - * See the Implementer's Guidelines for information about where this file - * should be located on your system and for more details of its use: - * http://www.khronos.org/registry/implementers_guide.pdf - * - * This file should be included as - * #include - * by Khronos client API header files that use its types and defines. - * - * The types in khrplatform.h should only be used to define API-specific types. - * - * Types defined in khrplatform.h: - * khronos_int8_t signed 8 bit - * khronos_uint8_t unsigned 8 bit - * khronos_int16_t signed 16 bit - * khronos_uint16_t unsigned 16 bit - * khronos_int32_t signed 32 bit - * khronos_uint32_t unsigned 32 bit - * khronos_int64_t signed 64 bit - * khronos_uint64_t unsigned 64 bit - * khronos_intptr_t signed same number of bits as a pointer - * khronos_uintptr_t unsigned same number of bits as a pointer - * khronos_ssize_t signed size - * khronos_usize_t unsigned size - * khronos_float_t signed 32 bit floating point - * khronos_time_ns_t unsigned 64 bit time in nanoseconds - * khronos_utime_nanoseconds_t unsigned time interval or absolute time in - * nanoseconds - * khronos_stime_nanoseconds_t signed time interval in nanoseconds - * khronos_boolean_enum_t enumerated boolean type. This should - * only be used as a base type when a client API's boolean type is - * an enum. Client APIs which use an integer or other type for - * booleans cannot use this as the base type for their boolean. - * - * Tokens defined in khrplatform.h: - * - * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. - * - * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. - * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. - * - * Calling convention macros defined in this file: - * KHRONOS_APICALL - * KHRONOS_APIENTRY - * KHRONOS_APIATTRIBUTES - * - * These may be used in function prototypes as: - * - * KHRONOS_APICALL void KHRONOS_APIENTRY funcname( - * int arg1, - * int arg2) KHRONOS_APIATTRIBUTES; - */ - -#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) -# define KHRONOS_STATIC 1 -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APICALL - *------------------------------------------------------------------------- - * This precedes the return type of the function in the function prototype. - */ -#if defined(KHRONOS_STATIC) - /* If the preprocessor constant KHRONOS_STATIC is defined, make the - * header compatible with static linking. */ -# define KHRONOS_APICALL -#elif defined(_WIN32) -# define KHRONOS_APICALL __declspec(dllimport) -#elif defined (__SYMBIAN32__) -# define KHRONOS_APICALL IMPORT_C -#elif defined(__ANDROID__) -# define KHRONOS_APICALL __attribute__((visibility("default"))) -#else -# define KHRONOS_APICALL -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APIENTRY - *------------------------------------------------------------------------- - * This follows the return type of the function and precedes the function - * name in the function prototype. - */ -#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) - /* Win32 but not WinCE */ -# define KHRONOS_APIENTRY __stdcall -#else -# define KHRONOS_APIENTRY -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APIATTRIBUTES - *------------------------------------------------------------------------- - * This follows the closing parenthesis of the function prototype arguments. - */ -#if defined (__ARMCC_2__) -#define KHRONOS_APIATTRIBUTES __softfp -#else -#define KHRONOS_APIATTRIBUTES -#endif - -/*------------------------------------------------------------------------- - * basic type definitions - *-----------------------------------------------------------------------*/ -#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) - - -/* - * Using - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(__VMS ) || defined(__sgi) - -/* - * Using - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) - -/* - * Win32 - */ -typedef __int32 khronos_int32_t; -typedef unsigned __int32 khronos_uint32_t; -typedef __int64 khronos_int64_t; -typedef unsigned __int64 khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(__sun__) || defined(__digital__) - -/* - * Sun or Digital - */ -typedef int khronos_int32_t; -typedef unsigned int khronos_uint32_t; -#if defined(__arch64__) || defined(_LP64) -typedef long int khronos_int64_t; -typedef unsigned long int khronos_uint64_t; -#else -typedef long long int khronos_int64_t; -typedef unsigned long long int khronos_uint64_t; -#endif /* __arch64__ */ -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif 0 - -/* - * Hypothetical platform with no float or int64 support - */ -typedef int khronos_int32_t; -typedef unsigned int khronos_uint32_t; -#define KHRONOS_SUPPORT_INT64 0 -#define KHRONOS_SUPPORT_FLOAT 0 - -#else - -/* - * Generic fallback - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#endif - - -/* - * Types that are (so far) the same on all platforms - */ -typedef signed char khronos_int8_t; -typedef unsigned char khronos_uint8_t; -typedef signed short int khronos_int16_t; -typedef unsigned short int khronos_uint16_t; - -/* - * Types that differ between LLP64 and LP64 architectures - in LLP64, - * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears - * to be the only LLP64 architecture in current use. - */ -#ifdef _WIN64 -typedef signed long long int khronos_intptr_t; -typedef unsigned long long int khronos_uintptr_t; -typedef signed long long int khronos_ssize_t; -typedef unsigned long long int khronos_usize_t; -#else -typedef signed long int khronos_intptr_t; -typedef unsigned long int khronos_uintptr_t; -typedef signed long int khronos_ssize_t; -typedef unsigned long int khronos_usize_t; -#endif - -#if KHRONOS_SUPPORT_FLOAT -/* - * Float type - */ -typedef float khronos_float_t; -#endif - -#if KHRONOS_SUPPORT_INT64 -/* Time types - * - * These types can be used to represent a time interval in nanoseconds or - * an absolute Unadjusted System Time. Unadjusted System Time is the number - * of nanoseconds since some arbitrary system event (e.g. since the last - * time the system booted). The Unadjusted System Time is an unsigned - * 64 bit value that wraps back to 0 every 584 years. Time intervals - * may be either signed or unsigned. - */ -typedef khronos_uint64_t khronos_utime_nanoseconds_t; -typedef khronos_int64_t khronos_stime_nanoseconds_t; -#endif - -/* - * Dummy value used to pad enum types to 32 bits. - */ -#ifndef KHRONOS_MAX_ENUM -#define KHRONOS_MAX_ENUM 0x7FFFFFFF -#endif - -/* - * Enumerated boolean type - * - * Values other than zero should be considered to be true. Therefore - * comparisons should not be made against KHRONOS_TRUE. - */ -typedef enum { - KHRONOS_FALSE = 0, - KHRONOS_TRUE = 1, - KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM -} khronos_boolean_enum_t; - -#endif /* __khrplatform_h_ */ diff --git a/vendor/librw/src/gl/rwgl3.h b/vendor/librw/src/gl/rwgl3.h deleted file mode 100644 index ca732bd..0000000 --- a/vendor/librw/src/gl/rwgl3.h +++ /dev/null @@ -1,285 +0,0 @@ -#ifdef RW_GL3 -#include "glad/glad.h" -#ifdef LIBRW_SDL2 -#include -#else -#include -#endif -#endif - -namespace rw { - -#ifdef RW_GL3 -struct EngineOpenParams -{ -#ifdef LIBRW_SDL2 - SDL_Window **window; - bool32 fullscreen; -#else - GLFWwindow **window; -#endif - int width, height; - const char *windowtitle; -}; -#endif - -namespace gl3 { - -void registerPlatformPlugins(void); - -extern Device renderdevice; - -// arguments to glVertexAttribPointer basically -struct AttribDesc -{ - uint32 index; - int32 type; - bool32 normalized; - int32 size; - uint32 stride; - uint32 offset; -}; - -enum AttribIndices -{ - ATTRIB_POS = 0, - ATTRIB_NORMAL, - ATTRIB_COLOR, - ATTRIB_WEIGHTS, - ATTRIB_INDICES, - ATTRIB_TEXCOORDS0, - ATTRIB_TEXCOORDS1, - ATTRIB_TEXCOORDS2, - ATTRIB_TEXCOORDS3, - ATTRIB_TEXCOORDS4, - ATTRIB_TEXCOORDS5, - ATTRIB_TEXCOORDS6, - ATTRIB_TEXCOORDS7, -}; - -// default uniform indices -extern int32 u_matColor; -extern int32 u_surfProps; - -struct InstanceData -{ - uint32 numIndex; - uint32 minVert; // not used for rendering - int32 numVertices; // - Material *material; - bool32 vertexAlpha; - uint32 program; - uint32 offset; -}; - -struct InstanceDataHeader : rw::InstanceDataHeader -{ - uint32 serialNumber; - uint32 numMeshes; - uint16 *indexBuffer; - uint32 primType; - uint8 *vertexBuffer; - int32 numAttribs; - AttribDesc *attribDesc; - uint32 totalNumIndex; - uint32 totalNumVertex; - - uint32 ibo; - uint32 vbo; // or 2? -#ifdef RW_GL_USE_VAOS - uint32 vao; -#endif - - InstanceData *inst; -}; - -#ifdef RW_GL3 - -struct Shader; - -extern Shader *defaultShader; - -struct Im3DVertex -{ - V3d position; - uint8 r, g, b, a; - float32 u, v; - - void setX(float32 x) { this->position.x = x; } - void setY(float32 y) { this->position.y = y; } - void setZ(float32 z) { this->position.z = z; } - void setColor(uint8 r, uint8 g, uint8 b, uint8 a) { - this->r = r; this->g = g; this->b = b; this->a = a; } - void setU(float32 u) { this->u = u; } - void setV(float32 v) { this->v = v; } - - float getX(void) { return this->position.x; } - float getY(void) { return this->position.y; } - float getZ(void) { return this->position.z; } - RGBA getColor(void) { return makeRGBA(this->r, this->g, this->b, this->a); } - float getU(void) { return this->u; } - float getV(void) { return this->v; } -}; - -struct Im2DVertex -{ - float32 x, y, z, w; - uint8 r, g, b, a; - float32 u, v; - - void setScreenX(float32 x) { this->x = x; } - void setScreenY(float32 y) { this->y = y; } - void setScreenZ(float32 z) { this->z = z; } - // This is a bit unefficient but we have to counteract GL's divide, so multiply - void setCameraZ(float32 z) { this->w = z; } - void setRecipCameraZ(float32 recipz) { this->w = 1.0f/recipz; } - void setColor(uint8 r, uint8 g, uint8 b, uint8 a) { - this->r = r; this->g = g; this->b = b; this->a = a; } - void setU(float32 u, float recipz) { this->u = u; } - void setV(float32 v, float recipz) { this->v = v; } - - float getScreenX(void) { return this->x; } - float getScreenY(void) { return this->y; } - float getScreenZ(void) { return this->z; } - float getCameraZ(void) { return this->w; } - float getRecipCameraZ(void) { return 1.0f/this->w; } - RGBA getColor(void) { return makeRGBA(this->r, this->g, this->b, this->a); } - float getU(void) { return this->u; } - float getV(void) { return this->v; } -}; - -void setAttribPointers(AttribDesc *attribDescs, int32 numAttribs); -void disableAttribPointers(AttribDesc *attribDescs, int32 numAttribs); -void setupVertexInput(InstanceDataHeader *header); -void teardownVertexInput(InstanceDataHeader *header); - -// Render state - -// Vertex shader bits -enum -{ - // These should be low so they could be used as indices - VSLIGHT_DIRECT = 1, - VSLIGHT_POINT = 2, - VSLIGHT_SPOT = 4, - VSLIGHT_MASK = 7, // all the above - // less critical - VSLIGHT_AMBIENT = 8, -}; - -extern const char *shaderDecl; // #version stuff -extern const char *header_vert_src; -extern const char *header_frag_src; - -extern Shader *im2dOverrideShader; - -// per Scene -void setProjectionMatrix(float32*); -void setViewMatrix(float32*); - -// per Object -void setWorldMatrix(Matrix*); -int32 setLights(WorldLights *lightData); - -// per Mesh -void setTexture(int32 n, Texture *tex); -void setMaterial(const RGBA &color, const SurfaceProperties &surfaceprops, float extraSurfProp = 0.0f); -inline void setMaterial(uint32 flags, const RGBA &color, const SurfaceProperties &surfaceprops, float extraSurfProp = 0.0f) -{ - static RGBA white = { 255, 255, 255, 255 }; - if(flags & Geometry::MODULATE) - setMaterial(color, surfaceprops, extraSurfProp); - else - setMaterial(white, surfaceprops, extraSurfProp); -} - -void setAlphaBlend(bool32 enable); -bool32 getAlphaBlend(void); - -void bindFramebuffer(uint32 fbo); -uint32 bindTexture(uint32 texid); - -void flushCache(void); - -#endif - -class ObjPipeline : public rw::ObjPipeline -{ -public: - void init(void); - static ObjPipeline *create(void); - - void (*instanceCB)(Geometry *geo, InstanceDataHeader *header, bool32 reinstance); - void (*uninstanceCB)(Geometry *geo, InstanceDataHeader *header); - void (*renderCB)(Atomic *atomic, InstanceDataHeader *header); -}; - -void defaultInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance); -void defaultUninstanceCB(Geometry *geo, InstanceDataHeader *header); -void defaultRenderCB(Atomic *atomic, InstanceDataHeader *header); -int32 lightingCB(Atomic *atomic); - -void drawInst_simple(InstanceDataHeader *header, InstanceData *inst); -// Emulate PS2 GS alpha test FB_ONLY case: failed alpha writes to frame- but not to depth buffer -void drawInst_GSemu(InstanceDataHeader *header, InstanceData *inst); -// This one switches between the above two depending on render state; -void drawInst(InstanceDataHeader *header, InstanceData *inst); - - -void *destroyNativeData(void *object, int32, int32); - -ObjPipeline *makeDefaultPipeline(void); - -// Native Texture and Raster - -struct Gl3Raster -{ - // arguments to glTexImage2D - int32 internalFormat; - int32 type; - int32 format; - int32 bpp; // bytes per pixel - // texture object - uint32 texid; - - bool isCompressed; - bool hasAlpha; - bool autogenMipmap; - int8 numLevels; - // cached filtermode and addressing - uint8 filterMode; - uint8 addressU; - uint8 addressV; - int32 maxAnisotropy; - - uint32 fbo; // used for camera texture only! - Raster *fboMate; // color or zbuffer raster mate of this one - RasterLevels *backingStore; // if we can't read back GPU memory but have to -}; - -struct Gl3Caps -{ - int gles; - int glversion; - bool dxtSupported; - bool astcSupported; // not used yet - float maxAnisotropy; -}; -extern Gl3Caps gl3Caps; -// GLES can't read back textures very nicely. -// In most cases that's not an issue, but when it is, -// this has to be set before the texture is filled: -extern bool32 needToReadBackTextures; - -void allocateDXT(Raster *raster, int32 dxt, int32 numLevels, bool32 hasAlpha); - -Texture *readNativeTexture(Stream *stream); -void writeNativeTexture(Texture *tex, Stream *stream); -uint32 getSizeNativeTexture(Texture *tex); - -extern int32 nativeRasterOffset; -void registerNativeRaster(void); -#define GETGL3RASTEREXT(raster) PLUGINOFFSET(Gl3Raster, raster, rw::gl3::nativeRasterOffset) - -} -} diff --git a/vendor/librw/src/gl/rwgl3impl.h b/vendor/librw/src/gl/rwgl3impl.h deleted file mode 100644 index 39f0050..0000000 --- a/vendor/librw/src/gl/rwgl3impl.h +++ /dev/null @@ -1,76 +0,0 @@ -namespace rw { -namespace gl3 { - -#ifdef RW_OPENGL - -extern uint32 im2DVbo, im2DIbo; -void openIm2D(void); -void closeIm2D(void); -void im2DRenderLine(void *vertices, int32 numVertices, - int32 vert1, int32 vert2); -void im2DRenderTriangle(void *vertices, int32 numVertices, - int32 vert1, int32 vert2, int32 vert3); -void im2DRenderPrimitive(PrimitiveType primType, - void *vertices, int32 numVertices); -void im2DRenderIndexedPrimitive(PrimitiveType primType, - void *vertices, int32 numVertices, void *indices, int32 numIndices); - -void openIm3D(void); -void closeIm3D(void); -void im3DTransform(void *vertices, int32 numVertices, Matrix *world, uint32 flags); -void im3DRenderPrimitive(PrimitiveType primType); -void im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices); -void im3DEnd(void); - -struct DisplayMode -{ -#ifdef LIBRW_SDL2 - SDL_DisplayMode mode; -#else - GLFWvidmode mode; -#endif - int32 depth; - uint32 flags; -}; - -struct GlGlobals -{ -#ifdef LIBRW_SDL2 - SDL_Window **pWindow; - SDL_Window *window; - SDL_GLContext glcontext; -#else - GLFWwindow **pWindow; - GLFWwindow *window; - - GLFWmonitor *monitor; - int numMonitors; - int currentMonitor; -#endif - - DisplayMode *modes; - int numModes; - int currentMode; - int presentWidth, presentHeight; - int presentOffX, presentOffY; - - // for opening the window - int winWidth, winHeight; - const char *winTitle; - uint32 numSamples; -}; - -extern GlGlobals glGlobals; -#endif - -Raster *rasterCreate(Raster *raster); -uint8 *rasterLock(Raster*, int32 level, int32 lockMode); -void rasterUnlock(Raster*, int32); -int32 rasterNumLevels(Raster*); -bool32 imageFindRasterFormat(Image *img, int32 type, - int32 *width, int32 *height, int32 *depth, int32 *format); -bool32 rasterFromImage(Raster *raster, Image *image); -Image *rasterToImage(Raster *raster); - -} -} diff --git a/vendor/librw/src/gl/rwgl3plg.h b/vendor/librw/src/gl/rwgl3plg.h deleted file mode 100644 index 5374b3e..0000000 --- a/vendor/librw/src/gl/rwgl3plg.h +++ /dev/null @@ -1,16 +0,0 @@ -namespace rw { -namespace gl3 { - -void initMatFX(void); -ObjPipeline *makeMatFXPipeline(void); -void matfxRenderCB(Atomic *atomic, InstanceDataHeader *header); - -void initSkin(void); -ObjPipeline *makeSkinPipeline(void); -void skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance); -void skinRenderCB(Atomic *atomic, InstanceDataHeader *header); -void uploadSkinMatrices(Atomic *atomic); - - -} -} diff --git a/vendor/librw/src/gl/rwgl3shader.h b/vendor/librw/src/gl/rwgl3shader.h deleted file mode 100644 index f9bb632..0000000 --- a/vendor/librw/src/gl/rwgl3shader.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifdef RW_OPENGL - -namespace rw { -namespace gl3 { - -// TODO: make this dynamic -enum { - MAX_UNIFORMS = 40, - MAX_BLOCKS = 20 -}; - -struct UniformRegistry -{ - int32 numUniforms; - char *uniformNames[MAX_UNIFORMS]; - - int32 numBlocks; - char *blockNames[MAX_BLOCKS]; -}; - -int32 registerUniform(const char *name); -int32 findUniform(const char *name); -int32 registerBlock(const char *name); -int32 findBlock(const char *name); - -extern UniformRegistry uniformRegistry; - -struct Shader -{ - GLuint program; - // same number of elements as UniformRegistry::numUniforms - GLint *uniformLocations; - - static Shader *create(const char **vsrc, const char **fsrc); -// static Shader *fromFiles(const char *vs, const char *fs); -// static Shader *fromStrings(const char *vsrc, const char *fsrc); - void use(void); - void destroy(void); -}; - -extern Shader *currentShader; - -} -} - -#endif diff --git a/vendor/librw/src/gl/rwwdgl.h b/vendor/librw/src/gl/rwwdgl.h deleted file mode 100644 index b336ba3..0000000 --- a/vendor/librw/src/gl/rwwdgl.h +++ /dev/null @@ -1,88 +0,0 @@ - -namespace rw { -namespace wdgl { - -// NOTE: This is not really RW OpenGL! It's specific to WarDrum's GTA ports - -void registerPlatformPlugins(void); - -struct AttribDesc -{ - // arguments to glVertexAttribPointer (should use OpenGL types here) - // Vertex = 0, TexCoord, Normal, Color, Weight, Bone Index, Extra Color - uint32 index; - // float = 0, byte, ubyte, short, ushort - int32 type; - bool32 normalized; - int32 size; - uint32 stride; - uint32 offset; -}; - -struct InstanceDataHeader : rw::InstanceDataHeader -{ - int32 numAttribs; - AttribDesc *attribs; - uint32 dataSize; - uint8 *data; - - // needed for rendering - uint32 vbo; - uint32 ibo; -}; - -// only RW_OPENGL -void uploadGeo(Geometry *geo); -void setAttribPointers(InstanceDataHeader *inst); - -void packattrib(uint8 *dst, float32 *src, AttribDesc *a, float32 scale); -void unpackattrib(float *dst, uint8 *src, AttribDesc *a, float32 scale); - -void *destroyNativeData(void *object, int32, int32); -Stream *readNativeData(Stream *stream, int32 len, void *object, int32, int32); -Stream *writeNativeData(Stream *stream, int32 len, void *object, int32, int32); -int32 getSizeNativeData(void *object, int32, int32); -void registerNativeDataPlugin(void); - -void printPipeinfo(Atomic *a); - -class ObjPipeline : public rw::ObjPipeline -{ -public: - void init(void); - static ObjPipeline *create(void); - - uint32 numCustomAttribs; - uint32 (*instanceCB)(Geometry *g, int32 i, uint32 offset); - void (*uninstanceCB)(Geometry *g); -}; - -ObjPipeline *makeDefaultPipeline(void); - -// Skin plugin - -void initSkin(void); -Stream *readNativeSkin(Stream *stream, int32, void *object, int32 offset); -Stream *writeNativeSkin(Stream *stream, int32 len, void *object, int32 offset); -int32 getSizeNativeSkin(void *object, int32 offset); - -ObjPipeline *makeSkinPipeline(void); - -// MatFX plugin - -void initMatFX(void); -ObjPipeline *makeMatFXPipeline(void); - -// Raster - -struct Texture : rw::Texture -{ - void upload(void); - void bind(int n); -}; - -extern int32 nativeRasterOffset; -void registerNativeRaster(void); - -} -} diff --git a/vendor/librw/src/gl/shaders/Makefile b/vendor/librw/src/gl/shaders/Makefile deleted file mode 100644 index 6471f17..0000000 --- a/vendor/librw/src/gl/shaders/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -all: header_vs.inc header_fs.inc im2d_gl.inc im3d_gl.inc default_vs_gl.inc simple_fs_gl.inc matfx_gl.inc skin_gl.inc - -header_vs.inc: header.vert - (echo 'const char *header_vert_src =';\ - sed 's/..*/"&\\n"/' header.vert;\ - echo ';') >header_vs.inc - -header_fs.inc: header.frag - (echo 'const char *header_frag_src =';\ - sed 's/..*/"&\\n"/' header.frag;\ - echo ';') >header_fs.inc - -im2d_gl.inc: im2d.vert - (echo 'const char *im2d_vert_src =';\ - sed 's/..*/"&\\n"/' im2d.vert;\ - echo ';') >im2d_gl.inc - -im3d_gl.inc: im3d.vert - (echo 'const char *im3d_vert_src =';\ - sed 's/..*/"&\\n"/' im3d.vert;\ - echo ';') >im3d_gl.inc - -default_vs_gl.inc: default.vert - (echo 'const char *default_vert_src =';\ - sed 's/..*/"&\\n"/' default.vert;\ - echo ';') >default_vs_gl.inc - -simple_fs_gl.inc: simple.frag - (echo 'const char *simple_frag_src =';\ - sed 's/..*/"&\\n"/' simple.frag;\ - echo ';') >simple_fs_gl.inc - -matfx_gl.inc: matfx_env.frag matfx_env.vert - (echo 'const char *matfx_env_vert_src =';\ - sed 's/..*/"&\\n"/' matfx_env.vert;\ - echo ';';\ - echo 'const char *matfx_env_frag_src =';\ - sed 's/..*/"&\\n"/' matfx_env.frag;\ - echo ';') >matfx_gl.inc - -skin_gl.inc: skin.vert - (echo 'const char *skin_vert_src =';\ - sed 's/..*/"&\\n"/' skin.vert;\ - echo ';') >skin_gl.inc - diff --git a/vendor/librw/src/gl/shaders/default.vert b/vendor/librw/src/gl/shaders/default.vert deleted file mode 100644 index 8e3fad7..0000000 --- a/vendor/librw/src/gl/shaders/default.vert +++ /dev/null @@ -1,23 +0,0 @@ -VSIN(ATTRIB_POS) vec3 in_pos; - -VSOUT vec4 v_color; -VSOUT vec2 v_tex0; -VSOUT 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_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/vendor/librw/src/gl/shaders/default_vs_gl.inc b/vendor/librw/src/gl/shaders/default_vs_gl.inc deleted file mode 100644 index 6e3d6c4..0000000 --- a/vendor/librw/src/gl/shaders/default_vs_gl.inc +++ /dev/null @@ -1,25 +0,0 @@ -const char *default_vert_src = -"VSIN(ATTRIB_POS) vec3 in_pos;\n" - -"VSOUT vec4 v_color;\n" -"VSOUT vec2 v_tex0;\n" -"VSOUT 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_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/vendor/librw/src/gl/shaders/header.frag b/vendor/librw/src/gl/shaders/header.frag deleted file mode 100644 index ffe26e3..0000000 --- a/vendor/librw/src/gl/shaders/header.frag +++ /dev/null @@ -1,28 +0,0 @@ -#ifdef USE_UBOS -layout(std140) uniform State -{ - vec2 u_alphaRef; - vec4 u_fogData; - vec4 u_fogColor; -}; -#else -uniform vec2 u_alphaRef; - -uniform vec4 u_fogData; -uniform vec4 u_fogColor; -#endif - -#define u_fogStart (u_fogData.x) -#define u_fogEnd (u_fogData.y) -#define u_fogRange (u_fogData.z) -#define u_fogDisable (u_fogData.w) - -#ifndef GL2 -out vec4 fragColor; -#endif - -void DoAlphaTest(float a) -{ - if(a < u_alphaRef.x || a >= u_alphaRef.y) - discard; -} diff --git a/vendor/librw/src/gl/shaders/header.vert b/vendor/librw/src/gl/shaders/header.vert deleted file mode 100644 index 81f86bd..0000000 --- a/vendor/librw/src/gl/shaders/header.vert +++ /dev/null @@ -1,128 +0,0 @@ - -#define DIRECTIONALS -//#define POINTLIGHTS -//#define SPOTLIGHTS - -#define ATTRIB_POS 0 -#define ATTRIB_NORMAL 1 -#define ATTRIB_COLOR 2 -#define ATTRIB_WEIGHTS 3 -#define ATTRIB_INDICES 4 -#define ATTRIB_TEXCOORDS0 5 -#define ATTRIB_TEXCOORDS1 6 - - -VSIN(ATTRIB_NORMAL) vec3 in_normal; -VSIN(ATTRIB_COLOR) vec4 in_color; -VSIN(ATTRIB_WEIGHTS) vec4 in_weights; -VSIN(ATTRIB_INDICES) vec4 in_indices; -VSIN(ATTRIB_TEXCOORDS0) vec2 in_tex0; -VSIN(ATTRIB_TEXCOORDS1) vec2 in_tex1; - - -#ifdef USE_UBOS -layout(std140) uniform State -{ - vec2 u_alphaRef; - vec4 u_fogData; - vec4 u_fogColor; -}; -#else -uniform vec2 u_alphaRef; -uniform vec4 u_fogData; -uniform vec4 u_fogColor; -#endif - -#define u_fogStart (u_fogData.x) -#define u_fogEnd (u_fogData.y) -#define u_fogRange (u_fogData.z) -#define u_fogDisable (u_fogData.w) - -#ifdef USE_UBOS -layout(std140) uniform Scene -{ - mat4 u_proj; - mat4 u_view; -}; -#else -uniform mat4 u_proj; -uniform mat4 u_view; -#endif - -#define MAX_LIGHTS 8 - -#ifdef USE_UBOS -layout(std140) uniform Object -{ - mat4 u_world; - vec4 u_ambLight; - vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot - vec4 u_lightPosition[MAX_LIGHTS]; - vec4 u_lightDirection[MAX_LIGHTS]; - vec4 u_lightColor[MAX_LIGHTS]; -}; -#else -uniform mat4 u_world; -uniform vec4 u_ambLight; -uniform vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot -uniform vec4 u_lightPosition[MAX_LIGHTS]; -uniform vec4 u_lightDirection[MAX_LIGHTS]; -uniform vec4 u_lightColor[MAX_LIGHTS]; -#endif - -uniform vec4 u_matColor; -uniform vec4 u_surfProps; // amb, spec, diff, extra - -#define surfAmbient (u_surfProps.x) -#define surfSpecular (u_surfProps.y) -#define surfDiffuse (u_surfProps.z) - -vec3 DoDynamicLight(vec3 V, vec3 N) -{ - vec3 color = vec3(0.0, 0.0, 0.0); - for(int i = 0; i < MAX_LIGHTS; i++){ - if(u_lightParams[i].x == 0.0) - break; -#ifdef DIRECTIONALS - if(u_lightParams[i].x == 1.0){ - // direct - float l = max(0.0, dot(N, -u_lightDirection[i].xyz)); - color += l*u_lightColor[i].rgb; - }else -#endif -#ifdef POINTLIGHTS - if(u_lightParams[i].x == 2.0){ - // point - vec3 dir = V - u_lightPosition[i].xyz; - float dist = length(dir); - float atten = max(0.0, (1.0 - dist/u_lightParams[i].y)); - float l = max(0.0, dot(N, -normalize(dir))); - color += l*u_lightColor[i].rgb*atten; - }else -#endif -#ifdef SPOTLIGHTS - if(u_lightParams[i].x == 3.0){ - // spot - vec3 dir = V - u_lightPosition[i].xyz; - float dist = length(dir); - float atten = max(0.0, (1.0 - dist/u_lightParams[i].y)); - dir /= dist; - float l = max(0.0, dot(N, -dir)); - float pcos = dot(dir, u_lightDirection[i].xyz); // cos to point - float ccos = -u_lightParams[i].z; - float falloff = (pcos-ccos)/(1.0-ccos); - if(falloff < 0.0) // outside of cone - l = 0.0; - l *= max(falloff, u_lightParams[i].w); - return l*u_lightColor[i].rgb*atten; - }else -#endif - ; - } - return color; -} - -float DoFog(float w) -{ - return clamp((w - u_fogEnd)*u_fogRange, u_fogDisable, 1.0); -} diff --git a/vendor/librw/src/gl/shaders/header_fs.inc b/vendor/librw/src/gl/shaders/header_fs.inc deleted file mode 100644 index 62ef8f2..0000000 --- a/vendor/librw/src/gl/shaders/header_fs.inc +++ /dev/null @@ -1,30 +0,0 @@ -const char *header_frag_src = -"#ifdef USE_UBOS\n" -"layout(std140) uniform State\n" -"{\n" -" vec2 u_alphaRef;\n" -" vec4 u_fogData;\n" -" vec4 u_fogColor;\n" -"};\n" -"#else\n" -"uniform vec2 u_alphaRef;\n" - -"uniform vec4 u_fogData;\n" -"uniform vec4 u_fogColor;\n" -"#endif\n" - -"#define u_fogStart (u_fogData.x)\n" -"#define u_fogEnd (u_fogData.y)\n" -"#define u_fogRange (u_fogData.z)\n" -"#define u_fogDisable (u_fogData.w)\n" - -"#ifndef GL2\n" -"out vec4 fragColor;\n" -"#endif\n" - -"void DoAlphaTest(float a)\n" -"{\n" -" if(a < u_alphaRef.x || a >= u_alphaRef.y)\n" -" discard;\n" -"}\n" -; diff --git a/vendor/librw/src/gl/shaders/header_vs.inc b/vendor/librw/src/gl/shaders/header_vs.inc deleted file mode 100644 index cd37b25..0000000 --- a/vendor/librw/src/gl/shaders/header_vs.inc +++ /dev/null @@ -1,130 +0,0 @@ -const char *header_vert_src = - -"#define DIRECTIONALS\n" -"//#define POINTLIGHTS\n" -"//#define SPOTLIGHTS\n" - -"#define ATTRIB_POS 0\n" -"#define ATTRIB_NORMAL 1\n" -"#define ATTRIB_COLOR 2\n" -"#define ATTRIB_WEIGHTS 3\n" -"#define ATTRIB_INDICES 4\n" -"#define ATTRIB_TEXCOORDS0 5\n" -"#define ATTRIB_TEXCOORDS1 6\n" - - -"VSIN(ATTRIB_NORMAL) vec3 in_normal;\n" -"VSIN(ATTRIB_COLOR) vec4 in_color;\n" -"VSIN(ATTRIB_WEIGHTS) vec4 in_weights;\n" -"VSIN(ATTRIB_INDICES) vec4 in_indices;\n" -"VSIN(ATTRIB_TEXCOORDS0) vec2 in_tex0;\n" -"VSIN(ATTRIB_TEXCOORDS1) vec2 in_tex1;\n" - - -"#ifdef USE_UBOS\n" -"layout(std140) uniform State\n" -"{\n" -" vec2 u_alphaRef;\n" -" vec4 u_fogData;\n" -" vec4 u_fogColor;\n" -"};\n" -"#else\n" -"uniform vec2 u_alphaRef;\n" -"uniform vec4 u_fogData;\n" -"uniform vec4 u_fogColor;\n" -"#endif\n" - -"#define u_fogStart (u_fogData.x)\n" -"#define u_fogEnd (u_fogData.y)\n" -"#define u_fogRange (u_fogData.z)\n" -"#define u_fogDisable (u_fogData.w)\n" - -"#ifdef USE_UBOS\n" -"layout(std140) uniform Scene\n" -"{\n" -" mat4 u_proj;\n" -" mat4 u_view;\n" -"};\n" -"#else\n" -"uniform mat4 u_proj;\n" -"uniform mat4 u_view;\n" -"#endif\n" - -"#define MAX_LIGHTS 8\n" - -"#ifdef USE_UBOS\n" -"layout(std140) uniform Object\n" -"{\n" -" mat4 u_world;\n" -" vec4 u_ambLight;\n" -" vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot\n" -" vec4 u_lightPosition[MAX_LIGHTS];\n" -" vec4 u_lightDirection[MAX_LIGHTS];\n" -" vec4 u_lightColor[MAX_LIGHTS];\n" -"};\n" -"#else\n" -"uniform mat4 u_world;\n" -"uniform vec4 u_ambLight;\n" -"uniform vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot\n" -"uniform vec4 u_lightPosition[MAX_LIGHTS];\n" -"uniform vec4 u_lightDirection[MAX_LIGHTS];\n" -"uniform vec4 u_lightColor[MAX_LIGHTS];\n" -"#endif\n" - -"uniform vec4 u_matColor;\n" -"uniform vec4 u_surfProps; // amb, spec, diff, extra\n" - -"#define surfAmbient (u_surfProps.x)\n" -"#define surfSpecular (u_surfProps.y)\n" -"#define surfDiffuse (u_surfProps.z)\n" - -"vec3 DoDynamicLight(vec3 V, vec3 N)\n" -"{\n" -" vec3 color = vec3(0.0, 0.0, 0.0);\n" -" for(int i = 0; i < MAX_LIGHTS; i++){\n" -" if(u_lightParams[i].x == 0.0)\n" -" break;\n" -"#ifdef DIRECTIONALS\n" -" if(u_lightParams[i].x == 1.0){\n" -" // direct\n" -" float l = max(0.0, dot(N, -u_lightDirection[i].xyz));\n" -" color += l*u_lightColor[i].rgb;\n" -" }else\n" -"#endif\n" -"#ifdef POINTLIGHTS\n" -" if(u_lightParams[i].x == 2.0){\n" -" // point\n" -" vec3 dir = V - u_lightPosition[i].xyz;\n" -" float dist = length(dir);\n" -" float atten = max(0.0, (1.0 - dist/u_lightParams[i].y));\n" -" float l = max(0.0, dot(N, -normalize(dir)));\n" -" color += l*u_lightColor[i].rgb*atten;\n" -" }else\n" -"#endif\n" -"#ifdef SPOTLIGHTS\n" -" if(u_lightParams[i].x == 3.0){\n" -" // spot\n" -" vec3 dir = V - u_lightPosition[i].xyz;\n" -" float dist = length(dir);\n" -" float atten = max(0.0, (1.0 - dist/u_lightParams[i].y));\n" -" dir /= dist;\n" -" float l = max(0.0, dot(N, -dir));\n" -" float pcos = dot(dir, u_lightDirection[i].xyz); // cos to point\n" -" float ccos = -u_lightParams[i].z;\n" -" float falloff = (pcos-ccos)/(1.0-ccos);\n" -" if(falloff < 0.0) // outside of cone\n" -" l = 0.0;\n" -" l *= max(falloff, u_lightParams[i].w);\n" -" return l*u_lightColor[i].rgb*atten;\n" -" }else\n" -"#endif\n" -" ;\n" -" }\n" -" return color;\n" -"}\n" - -"float DoFog(float w)\n" -"{\n" -" return clamp((w - u_fogEnd)*u_fogRange, u_fogDisable, 1.0);\n" -"}\n" -; diff --git a/vendor/librw/src/gl/shaders/im2d.vert b/vendor/librw/src/gl/shaders/im2d.vert deleted file mode 100644 index cdb9da8..0000000 --- a/vendor/librw/src/gl/shaders/im2d.vert +++ /dev/null @@ -1,18 +0,0 @@ -uniform vec4 u_xform; - -VSIN(ATTRIB_POS) vec4 in_pos; - -VSOUT vec4 v_color; -VSOUT vec2 v_tex0; -VSOUT float v_fog; - -void -main(void) -{ - gl_Position = in_pos; - gl_Position.xy = gl_Position.xy * u_xform.xy + u_xform.zw; - v_fog = DoFog(gl_Position.w); - gl_Position.xyz *= gl_Position.w; - v_color = in_color; - v_tex0 = in_tex0; -} diff --git a/vendor/librw/src/gl/shaders/im2d_gl.inc b/vendor/librw/src/gl/shaders/im2d_gl.inc deleted file mode 100644 index 4e1d631..0000000 --- a/vendor/librw/src/gl/shaders/im2d_gl.inc +++ /dev/null @@ -1,20 +0,0 @@ -const char *im2d_vert_src = -"uniform vec4 u_xform;\n" - -"VSIN(ATTRIB_POS) vec4 in_pos;\n" - -"VSOUT vec4 v_color;\n" -"VSOUT vec2 v_tex0;\n" -"VSOUT float v_fog;\n" - -"void\n" -"main(void)\n" -"{\n" -" gl_Position = in_pos;\n" -" gl_Position.xy = gl_Position.xy * u_xform.xy + u_xform.zw;\n" -" v_fog = DoFog(gl_Position.w);\n" -" gl_Position.xyz *= gl_Position.w;\n" -" v_color = in_color;\n" -" v_tex0 = in_tex0;\n" -"}\n" -; diff --git a/vendor/librw/src/gl/shaders/im3d.vert b/vendor/librw/src/gl/shaders/im3d.vert deleted file mode 100644 index 7088352..0000000 --- a/vendor/librw/src/gl/shaders/im3d.vert +++ /dev/null @@ -1,16 +0,0 @@ -VSIN(ATTRIB_POS) vec3 in_pos; - -VSOUT vec4 v_color; -VSOUT vec2 v_tex0; -VSOUT float v_fog; - -void -main(void) -{ - vec4 Vertex = u_world * vec4(in_pos, 1.0); - vec4 CamVertex = u_view * Vertex; - gl_Position = u_proj * CamVertex; - v_color = in_color; - v_tex0 = in_tex0; - v_fog = DoFog(gl_Position.w); -} diff --git a/vendor/librw/src/gl/shaders/im3d_gl.inc b/vendor/librw/src/gl/shaders/im3d_gl.inc deleted file mode 100644 index 389589b..0000000 --- a/vendor/librw/src/gl/shaders/im3d_gl.inc +++ /dev/null @@ -1,18 +0,0 @@ -const char *im3d_vert_src = -"VSIN(ATTRIB_POS) vec3 in_pos;\n" - -"VSOUT vec4 v_color;\n" -"VSOUT vec2 v_tex0;\n" -"VSOUT float v_fog;\n" - -"void\n" -"main(void)\n" -"{\n" -" vec4 Vertex = u_world * vec4(in_pos, 1.0);\n" -" vec4 CamVertex = u_view * Vertex;\n" -" gl_Position = u_proj * CamVertex;\n" -" v_color = in_color;\n" -" v_tex0 = in_tex0;\n" -" v_fog = DoFog(gl_Position.w);\n" -"}\n" -; diff --git a/vendor/librw/src/gl/shaders/matfx_env.frag b/vendor/librw/src/gl/shaders/matfx_env.frag deleted file mode 100644 index 4164ed1..0000000 --- a/vendor/librw/src/gl/shaders/matfx_env.frag +++ /dev/null @@ -1,35 +0,0 @@ -uniform sampler2D tex0; -uniform sampler2D tex1; - -uniform vec2 u_fxparams; -uniform vec4 u_colorClamp; - -#define shininess (u_fxparams.x) -#define disableFBA (u_fxparams.y) - -FSIN vec4 v_color; -FSIN vec2 v_tex0; -FSIN vec2 v_tex1; -FSIN float v_fog; - -void -main(void) -{ - vec4 pass1 = v_color; - vec4 envColor = max(pass1, u_colorClamp); - pass1 *= texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); - - vec4 pass2 = envColor*shininess*texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y)); - - pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog); - pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_fog); - - float fba = max(pass1.a, disableFBA); - vec4 color; - color.rgb = pass1.rgb*pass1.a + pass2.rgb*fba; - color.a = pass1.a; - - DoAlphaTest(color.a); - - FRAGCOLOR(color); -} diff --git a/vendor/librw/src/gl/shaders/matfx_env.vert b/vendor/librw/src/gl/shaders/matfx_env.vert deleted file mode 100644 index b93c7ea..0000000 --- a/vendor/librw/src/gl/shaders/matfx_env.vert +++ /dev/null @@ -1,27 +0,0 @@ -uniform mat4 u_texMatrix; - -VSIN(ATTRIB_POS) vec3 in_pos; - -VSOUT vec4 v_color; -VSOUT vec2 v_tex0; -VSOUT vec2 v_tex1; -VSOUT 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 = (u_texMatrix * vec4(Normal, 1.0)).xy; - - 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/vendor/librw/src/gl/shaders/matfx_gl.inc b/vendor/librw/src/gl/shaders/matfx_gl.inc deleted file mode 100644 index f7296a8..0000000 --- a/vendor/librw/src/gl/shaders/matfx_gl.inc +++ /dev/null @@ -1,66 +0,0 @@ -const char *matfx_env_vert_src = -"uniform mat4 u_texMatrix;\n" - -"VSIN(ATTRIB_POS) vec3 in_pos;\n" - -"VSOUT vec4 v_color;\n" -"VSOUT vec2 v_tex0;\n" -"VSOUT vec2 v_tex1;\n" -"VSOUT 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 = (u_texMatrix * vec4(Normal, 1.0)).xy;\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" -; -const char *matfx_env_frag_src = -"uniform sampler2D tex0;\n" -"uniform sampler2D tex1;\n" - -"uniform vec2 u_fxparams;\n" -"uniform vec4 u_colorClamp;\n" - -"#define shininess (u_fxparams.x)\n" -"#define disableFBA (u_fxparams.y)\n" - -"FSIN vec4 v_color;\n" -"FSIN vec2 v_tex0;\n" -"FSIN vec2 v_tex1;\n" -"FSIN float v_fog;\n" - -"void\n" -"main(void)\n" -"{\n" -" vec4 pass1 = v_color;\n" -" vec4 envColor = max(pass1, u_colorClamp);\n" -" pass1 *= texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n" - -" vec4 pass2 = envColor*shininess*texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));\n" - -" pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog);\n" -" pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_fog);\n" - -" float fba = max(pass1.a, disableFBA);\n" -" vec4 color;\n" -" color.rgb = pass1.rgb*pass1.a + pass2.rgb*fba;\n" -" color.a = pass1.a;\n" - -" DoAlphaTest(color.a);\n" - -" FRAGCOLOR(color);\n" -"}\n" -; diff --git a/vendor/librw/src/gl/shaders/simple.frag b/vendor/librw/src/gl/shaders/simple.frag deleted file mode 100644 index 32b2afb..0000000 --- a/vendor/librw/src/gl/shaders/simple.frag +++ /dev/null @@ -1,15 +0,0 @@ -uniform sampler2D tex0; - -FSIN vec4 v_color; -FSIN vec2 v_tex0; -FSIN float v_fog; - -void -main(void) -{ - vec4 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); - FRAGCOLOR(color); -} - diff --git a/vendor/librw/src/gl/shaders/simple_fs_gl.inc b/vendor/librw/src/gl/shaders/simple_fs_gl.inc deleted file mode 100644 index a9216ca..0000000 --- a/vendor/librw/src/gl/shaders/simple_fs_gl.inc +++ /dev/null @@ -1,17 +0,0 @@ -const char *simple_frag_src = -"uniform sampler2D tex0;\n" - -"FSIN vec4 v_color;\n" -"FSIN vec2 v_tex0;\n" -"FSIN float v_fog;\n" - -"void\n" -"main(void)\n" -"{\n" -" vec4 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" -" FRAGCOLOR(color);\n" -"}\n" - -; diff --git a/vendor/librw/src/gl/shaders/skin.vert b/vendor/librw/src/gl/shaders/skin.vert deleted file mode 100644 index 7408542..0000000 --- a/vendor/librw/src/gl/shaders/skin.vert +++ /dev/null @@ -1,32 +0,0 @@ -uniform mat4 u_boneMatrices[64]; - -VSIN(ATTRIB_POS) vec3 in_pos; - -VSOUT vec4 v_color; -VSOUT vec2 v_tex0; -VSOUT float v_fog; - -void -main(void) -{ - vec3 SkinVertex = vec3(0.0, 0.0, 0.0); - vec3 SkinNormal = vec3(0.0, 0.0, 0.0); - for(int i = 0; i < 4; i++){ - SkinVertex += (u_boneMatrices[int(in_indices[i])] * vec4(in_pos, 1.0)).xyz * in_weights[i]; - SkinNormal += (mat3(u_boneMatrices[int(in_indices[i])]) * in_normal) * in_weights[i]; - } - - vec4 Vertex = u_world * vec4(SkinVertex, 1.0); - gl_Position = u_proj * u_view * Vertex; - vec3 Normal = mat3(u_world) * SkinNormal; - - v_tex0 = in_tex0; - - 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.z); -} diff --git a/vendor/librw/src/gl/shaders/skin_gl.inc b/vendor/librw/src/gl/shaders/skin_gl.inc deleted file mode 100644 index 7d1268e..0000000 --- a/vendor/librw/src/gl/shaders/skin_gl.inc +++ /dev/null @@ -1,34 +0,0 @@ -const char *skin_vert_src = -"uniform mat4 u_boneMatrices[64];\n" - -"VSIN(ATTRIB_POS) vec3 in_pos;\n" - -"VSOUT vec4 v_color;\n" -"VSOUT vec2 v_tex0;\n" -"VSOUT 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" -" 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/vendor/librw/src/gl/wdgl.cpp b/vendor/librw/src/gl/wdgl.cpp deleted file mode 100644 index d1ac4b8..0000000 --- a/vendor/librw/src/gl/wdgl.cpp +++ /dev/null @@ -1,875 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwanim.h" -#include "../rwengine.h" -#include "../rwplugins.h" -#include "rwwdgl.h" - -#ifdef RW_OPENGL -#include "glad/glad.h" -#endif - -#define PLUGIN_ID 2 - -namespace rw { -namespace wdgl { - -static void* -driverOpen(void *o, int32, int32) -{ - engine->driver[PLATFORM_WDGL]->defaultPipeline = makeDefaultPipeline(); - return o; -} - -static void* -driverClose(void *o, int32, int32) -{ - return o; -} - -void -registerPlatformPlugins(void) -{ - Driver::registerPlugin(PLATFORM_WDGL, 0, PLATFORM_WDGL, - driverOpen, driverClose); -} - - -// VC -// 8733 0 0 0 3 -// 45 1 0 0 2 -// 8657 1 3 0 2 -// 4610 2 1 1 3 -// 4185 3 2 1 4 -// 256 4 2 1 4 -// 201 4 4 1 4 -// 457 5 2 0 4 - -// SA -// 20303 0 0 0 3 vertices: 3 floats -// 53 1 0 0 2 texCoords: 2 floats -// 20043 1 3 0 2 texCoords: 2 shorts -// 6954 2 1 1 3 normal: 3 bytes normalized -// 13527 3 2 1 4 color: 4 ubytes normalized -// 196 4 2 1 4 weight: 4 ubytes normalized -// 225 4 4 1 4 weight: 4 ushorts normalized -// 421 5 2 0 4 indices: 4 ubytes -// 12887 6 2 1 4 extracolor:4 ubytes normalized - -/* -static void -printAttribInfo(AttribDesc *attribs, int n) -{ - for(int i = 0; i < n; i++) - printf("%x %x %x %x\n", - attribs[i].index, - attribs[i].type, - attribs[i].normalized, - attribs[i].size); -} -*/ - -#ifdef RW_OPENGL -void -uploadGeo(Geometry *geo) -{ - InstanceDataHeader *inst = (InstanceDataHeader*)geo->instData; - MeshHeader *meshHeader = geo->meshHeader; - - glGenBuffers(1, &inst->vbo); - glBindBuffer(GL_ARRAY_BUFFER, inst->vbo); - glBufferData(GL_ARRAY_BUFFER, inst->dataSize, - inst->data, GL_STATIC_DRAW); - - glGenBuffers(1, &inst->ibo); - glBindBuffer(GL_ARRAY_BUFFER, inst->ibo); - glBufferData(GL_ARRAY_BUFFER, meshHeader->totalIndices*2, - 0, GL_STATIC_DRAW); - GLintptr offset = 0; - for(uint32 i = 0; i < meshHeader->numMeshes; i++){ - Mesh *mesh = &meshHeader->getMeshes()[i]; - glBufferSubData(GL_ARRAY_BUFFER, offset, mesh->numIndices*2, - mesh->indices); - offset += mesh->numIndices*2; - } - glBindBuffer(GL_ARRAY_BUFFER, 0); -} - -void -setAttribPointers(InstanceDataHeader *inst) -{ - static GLenum attribType[] = { - GL_FLOAT, - GL_BYTE, GL_UNSIGNED_BYTE, - GL_SHORT, GL_UNSIGNED_SHORT - }; - for(int32 i = 0; i < inst->numAttribs; i++){ - AttribDesc *a = &inst->attribs[i]; - glEnableVertexAttribArray(a->index); - glVertexAttribPointer(a->index, a->size, attribType[a->type], - a->normalized, a->stride, - (void*)(uint64)a->offset); - } -} -#endif - -void -packattrib(uint8 *dst, float32 *src, AttribDesc *a, float32 scale=1.0f) -{ - int8 *i8dst; - uint16 *u16dst; - int16 *i16dst; - - switch(a->type){ - case 0: // float - memcpy(dst, src, a->size*4); - break; - - // TODO: maybe have loop inside if? - case 1: // byte - i8dst = (int8*)dst; - for(int i = 0; i < a->size; i++){ - if(!a->normalized) - i8dst[i] = src[i]*scale; - else - i8dst[i] = src[i]*127.0f; - } - break; - - case 2: // ubyte - for(int i = 0; i < a->size; i++){ - if(!a->normalized) - dst[i] = src[i]*scale; - else - dst[i] = src[i]*255.0f; - } - break; - - case 3: // short - i16dst = (int16*)dst; - for(int i = 0; i < a->size; i++){ - if(!a->normalized) - i16dst[i] = src[i]*scale; - else - i16dst[i] = src[i]*32767.0f; - } - break; - - case 4: // ushort - u16dst = (uint16*)dst; - for(int i = 0; i < a->size; i++){ - if(!a->normalized) - u16dst[i] = src[i]*scale; - else - u16dst[i] = src[i]*65535.0f; - } - break; - } -} - -void -unpackattrib(float *dst, uint8 *src, AttribDesc *a, float32 scale=1.0f) -{ - int8 *i8src; - uint16 *u16src; - int16 *i16src; - - switch(a->type){ - case 0: // float - memcpy(dst, src, a->size*4); - break; - - // TODO: maybe have loop inside if? - case 1: // byte - i8src = (int8*)src; - for(int i = 0; i < a->size; i++){ - if(!a->normalized) - dst[i] = i8src[i]/scale; - else - dst[i] = i8src[i]/127.0f; - } - break; - - case 2: // ubyte - for(int i = 0; i < a->size; i++){ - if(!a->normalized) - dst[i] = src[i]/scale; - else - dst[i] = src[i]/255.0f; - } - break; - - case 3: // short - i16src = (int16*)src; - for(int i = 0; i < a->size; i++){ - if(!a->normalized) - dst[i] = i16src[i]/scale; - else - dst[i] = i16src[i]/32767.0f; - } - break; - - case 4: // ushort - u16src = (uint16*)src; - for(int i = 0; i < a->size; i++){ - if(!a->normalized) - dst[i] = u16src[i]/scale; - else - dst[i] = u16src[i]/65435.0f; - } - break; - } -} - -void* -destroyNativeData(void *object, int32, int32) -{ - Geometry *geometry = (Geometry*)object; - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_WDGL) - return object; - InstanceDataHeader *header = - (InstanceDataHeader*)geometry->instData; - geometry->instData = nil; - // TODO: delete ibo and vbo - rwFree(header->attribs); - rwFree(header->data); - rwFree(header); - return object; -} - -Stream* -readNativeData(Stream *stream, int32, void *object, int32, int32) -{ - Geometry *geometry = (Geometry*)object; - InstanceDataHeader *header = rwNewT(InstanceDataHeader, 1, MEMDUR_EVENT | ID_GEOMETRY); - geometry->instData = header; - header->platform = PLATFORM_WDGL; - header->vbo = 0; - header->ibo = 0; - header->numAttribs = stream->readU32(); - header->attribs = rwNewT(AttribDesc, header->numAttribs, MEMDUR_EVENT | ID_GEOMETRY); - stream->read32(header->attribs, - header->numAttribs*sizeof(AttribDesc)); - header->dataSize = header->attribs[0].stride*geometry->numVertices; - header->data = rwNewT(uint8, header->dataSize, MEMDUR_EVENT | ID_GEOMETRY); - ASSERTLITTLE; - stream->read8(header->data, header->dataSize); - return stream; -} - -Stream* -writeNativeData(Stream *stream, int32, void *object, int32, int32) -{ - Geometry *geometry = (Geometry*)object; - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_WDGL) - return stream; - InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - stream->writeU32(header->numAttribs); - stream->write32(header->attribs, header->numAttribs*sizeof(AttribDesc)); - ASSERTLITTLE; - stream->write8(header->data, header->dataSize); - return stream; -} - -int32 -getSizeNativeData(void *object, int32, int32) -{ - Geometry *geometry = (Geometry*)object; - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_WDGL) - return 0; - InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - return 4 + header->numAttribs*sizeof(AttribDesc) + header->dataSize; -} - -void -registerNativeDataPlugin(void) -{ - Geometry::registerPlugin(0, ID_NATIVEDATA, - nil, destroyNativeData, nil); - Geometry::registerPluginStream(ID_NATIVEDATA, - readNativeData, - writeNativeData, - getSizeNativeData); -} - -void -printPipeinfo(Atomic *a) -{ - Geometry *g = a->geometry; - if(g->instData == nil || g->instData->platform != PLATFORM_WDGL) - return; - int32 plgid = 0; - if(a->pipeline) - plgid = a->pipeline->pluginID; - printf("%s %x: ", debugFile, plgid); - InstanceDataHeader *h = (InstanceDataHeader*)g->instData; - for(int i = 0; i < h->numAttribs; i++) - printf("%x(%x) ", h->attribs[i].index, h->attribs[i].type); - printf("\n"); -} - -static void -instance(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - // TODO: allow for REINSTANCE (or not, wdgl can't render) - if(geo->instData) - return; - InstanceDataHeader *header = rwNewT(InstanceDataHeader, 1, MEMDUR_EVENT | ID_GEOMETRY); - geo->instData = header; - header->platform = PLATFORM_WDGL; - header->vbo = 0; - header->ibo = 0; - header->numAttribs = - pipe->numCustomAttribs + 1 + (geo->numTexCoordSets > 0); - if(geo->flags & Geometry::PRELIT) - header->numAttribs++; - if(geo->flags & Geometry::NORMALS) - header->numAttribs++; - int32 offset = 0; - header->attribs = rwNewT(AttribDesc, header->numAttribs, MEMDUR_EVENT | ID_GEOMETRY); - - AttribDesc *a = header->attribs; - // Vertices - a->index = 0; - a->type = 0; - a->normalized = 0; - a->size = 3; - a->offset = offset; - offset += 12; - a++; - int32 firstCustom = 1; - - // texCoords, only one set here - if(geo->numTexCoordSets){ - a->index = 1; - a->type = 3; - a->normalized = 0; - a->size = 2; - a->offset = offset; - offset += 4; - a++; - firstCustom++; - } - - if(geo->flags & Geometry::NORMALS){ - a->index = 2; - a->type = 1; - a->normalized = 1; - a->size = 3; - a->offset = offset; - offset += 4; - a++; - firstCustom++; - } - - if(geo->flags & Geometry::PRELIT){ - a->index = 3; - a->type = 2; - a->normalized = 1; - a->size = 4; - a->offset = offset; - offset += 4; - a++; - firstCustom++; - } - - if(pipe->instanceCB) - offset += pipe->instanceCB(geo, firstCustom, offset); - else{ - header->dataSize = offset*geo->numVertices; - header->data = rwNewT(uint8, header->dataSize, MEMDUR_EVENT | ID_GEOMETRY); - } - - a = header->attribs; - for(int32 i = 0; i < header->numAttribs; i++) - a[i].stride = offset; - - uint8 *p = header->data + a->offset; - V3d *vert = geo->morphTargets->vertices; - for(int32 i = 0; i < geo->numVertices; i++){ - packattrib(p, (float32*)vert, a); - vert++; - p += a->stride; - } - a++; - - if(geo->numTexCoordSets){ - p = header->data + a->offset; - TexCoords *texcoord = geo->texCoords[0]; - for(int32 i = 0; i < geo->numVertices; i++){ - packattrib(p, (float32*)texcoord, a, 512.0f); - texcoord++; - p += a->stride; - } - a++; - } - - if(geo->flags & Geometry::NORMALS){ - p = header->data + a->offset; - V3d *norm = geo->morphTargets->normals; - for(int32 i = 0; i < geo->numVertices; i++){ - packattrib(p, (float32*)norm, a); - norm++; - p += a->stride; - } - a++; - } - - if(geo->flags & Geometry::PRELIT){ - // TODO: this seems too complicated - p = header->data + a->offset; - RGBA *color = geo->colors; - float32 f[4]; - for(int32 i = 0; i < geo->numVertices; i++){ - f[0] = color->red/255.0f; - f[1] = color->green/255.0f; - f[2] = color->blue/255.0f; - f[3] = color->alpha/255.0f; - packattrib(p, (float32*)f, a); - color++; - p += a->stride; - } - a++; - } -} - -static void -uninstance(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - if((geo->flags & Geometry::NATIVE) == 0) - return; - assert(geo->instData != nil); - assert(geo->instData->platform == PLATFORM_WDGL); - geo->numTriangles = geo->meshHeader->guessNumTriangles(); - geo->allocateData(); - - uint8 *p; - TexCoords *texcoord = geo->texCoords[0]; - RGBA *color = geo->colors; - V3d *vert = geo->morphTargets->vertices; - V3d *norm = geo->morphTargets->normals; - float32 f[4]; - - InstanceDataHeader *header = (InstanceDataHeader*)geo->instData; - for(int i = 0; i < header->numAttribs; i++){ - AttribDesc *a = &header->attribs[i]; - p = header->data + a->offset; - - switch(a->index){ - case 0: // Vertices - for(int32 i = 0; i < geo->numVertices; i++){ - unpackattrib((float32*)vert, p, a); - vert++; - p += a->stride; - } - break; - - case 1: // texCoords - for(int32 i = 0; i < geo->numVertices; i++){ - unpackattrib((float32*)texcoord, p, a, 512.0f); - texcoord++; - p += a->stride; - } - break; - - case 2: // normals - for(int32 i = 0; i < geo->numVertices; i++){ - unpackattrib((float32*)norm, p, a); - norm++; - p += a->stride; - } - break; - - case 3: // colors - for(int32 i = 0; i < geo->numVertices; i++){ - // TODO: this seems too complicated - unpackattrib(f, p, a); - color->red = f[0]*255.0f; - color->green = f[1]*255.0f; - color->blue = f[2]*255.0f; - color->alpha = f[3]*255.0f; - color++; - p += a->stride; - } - break; - } - } - - if(pipe->uninstanceCB) - pipe->uninstanceCB(geo); - - geo->generateTriangles(); - - geo->flags &= ~Geometry::NATIVE; - destroyNativeData(geo, 0, 0); -} - -void -ObjPipeline::init(void) -{ - this->rw::ObjPipeline::init(PLATFORM_GL3); - this->numCustomAttribs = 0; - this->impl.instance = wdgl::instance; - this->impl.uninstance = wdgl::uninstance; - this->instanceCB = nil; - this->uninstanceCB = nil; -} - -ObjPipeline* -ObjPipeline::create(void) -{ - ObjPipeline *pipe = rwNewT(ObjPipeline, 1, MEMDUR_GLOBAL); - pipe->init(); - return pipe; -} - -ObjPipeline* -makeDefaultPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - return pipe; -} - -// Skin - -Stream* -readNativeSkin(Stream *stream, int32, void *object, int32 offset) -{ - Geometry *geometry = (Geometry*)object; - uint32 platform; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - platform = stream->readU32(); - if(platform != PLATFORM_GL){ - RWERROR((ERR_PLATFORM, platform)); - return nil; - } - Skin *skin = rwNewT(Skin, 1, MEMDUR_EVENT | ID_SKIN); - *PLUGINOFFSET(Skin*, geometry, offset) = skin; - - int32 numBones = stream->readI32(); - skin->init(numBones, 0, 0); - stream->read32(skin->inverseMatrices, skin->numBones*64); - return stream; -} - -Stream* -writeNativeSkin(Stream *stream, int32 len, void *object, int32 offset) -{ - writeChunkHeader(stream, ID_STRUCT, len-12); - stream->writeU32(PLATFORM_GL); - Skin *skin = *PLUGINOFFSET(Skin*, object, offset); - stream->writeI32(skin->numBones); - stream->write32(skin->inverseMatrices, skin->numBones*64); - return stream; -} - -int32 -getSizeNativeSkin(void *object, int32 offset) -{ - Skin *skin = *PLUGINOFFSET(Skin*, object, offset); - if(skin == nil) - return -1; - int32 size = 12 + 4 + 4 + skin->numBones*64; - return size; -} - -uint32 -skinInstanceCB(Geometry *g, int32 i, uint32 offset) -{ - InstanceDataHeader *header = (InstanceDataHeader*)g->instData; - AttribDesc *a = &header->attribs[i]; - // weights - a->index = 4; - a->type = 2; /* but also short o_O */ - a->normalized = 1; - a->size = 4; - a->offset = offset; - offset += 4; - a++; - - // indices - a->index = 5; - a->type = 2; - a->normalized = 0; - a->size = 4; - a->offset = offset; - offset += 4; - - header->dataSize = offset*g->numVertices; - header->data = rwNewT(uint8, header->dataSize, MEMDUR_EVENT | ID_GEOMETRY); - - Skin *skin = Skin::get(g); - if(skin == nil) - return 8; - - a = &header->attribs[i]; - uint8 *wgt = header->data + a[0].offset; - uint8 *idx = header->data + a[1].offset; - uint8 *indices = skin->indices; - float32 *weights = skin->weights; - for(int32 i = 0; i < g->numVertices; i++){ - packattrib(wgt, weights, a); - weights += 4; - wgt += offset; - idx[0] = *indices++; - idx[1] = *indices++; - idx[2] = *indices++; - idx[3] = *indices++; - idx += offset; - } - - return 8; -} - -void -skinUninstanceCB(Geometry *geo) -{ - InstanceDataHeader *header = (InstanceDataHeader*)geo->instData; - - Skin *skin = Skin::get(geo); - if(skin == nil) - return; - - uint8 *data = skin->data; - float *invMats = skin->inverseMatrices; - skin->init(skin->numBones, skin->numBones, geo->numVertices); - memcpy(skin->inverseMatrices, invMats, skin->numBones*64); - rwFree(data); - - uint8 *p; - float *weights = skin->weights; - uint8 *indices = skin->indices; - for(int i = 0; i < header->numAttribs; i++){ - AttribDesc *a = &header->attribs[i]; - p = header->data + a->offset; - - switch(a->index){ - case 4: // weights - for(int32 i = 0; i < geo->numVertices; i++){ - unpackattrib(weights, p, a); -float sum = weights[0] + weights[1] + weights[2] + weights[3]; -if(sum){ - weights[0] /= sum; - weights[1] /= sum; - weights[2] /= sum; - weights[3] /= sum; -} - weights += 4; - p += a->stride; - } - break; - - case 5: // indices - for(int32 i = 0; i < geo->numVertices; i++){ - *indices++ = p[0]; - *indices++ = p[1]; - *indices++ = p[2]; - *indices++ = p[3]; - p += a->stride; - } - break; - } - } - - skin->findNumWeights(geo->numVertices); - skin->findUsedBones(geo->numVertices); -} - -// Skin - -static void* -skinOpen(void *o, int32, int32) -{ - skinGlobals.pipelines[PLATFORM_WDGL] = makeSkinPipeline(); - return o; -} - -static void* -skinClose(void *o, int32, int32) -{ - ((ObjPipeline*)skinGlobals.pipelines[PLATFORM_WDGL])->destroy(); - skinGlobals.pipelines[PLATFORM_WDGL] = nil; - return o; -} - -void -initSkin(void) -{ - Driver::registerPlugin(PLATFORM_WDGL, 0, ID_SKIN, - skinOpen, skinClose); -} - -ObjPipeline* -makeSkinPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->pluginID = ID_SKIN; - pipe->pluginData = 1; - pipe->numCustomAttribs = 2; - pipe->instanceCB = skinInstanceCB; - pipe->uninstanceCB = skinUninstanceCB; - return pipe; -} - -// MatFX - -static void* -matfxOpen(void *o, int32, int32) -{ - matFXGlobals.pipelines[PLATFORM_WDGL] = makeMatFXPipeline(); - return o; -} - -static void* -matfxClose(void *o, int32, int32) -{ - ((ObjPipeline*)matFXGlobals.pipelines[PLATFORM_WDGL])->destroy(); - matFXGlobals.pipelines[PLATFORM_WDGL] = nil; - return o; -} - -void -initMatFX(void) -{ - Driver::registerPlugin(PLATFORM_WDGL, 0, ID_MATFX, - matfxOpen, matfxClose); -} - -ObjPipeline* -makeMatFXPipeline(void) -{ - ObjPipeline *pipe = ObjPipeline::create(); - pipe->pluginID = ID_MATFX; - pipe->pluginData = 0; - return pipe; -} - -// Raster - -int32 nativeRasterOffset; - -#ifdef RW_OPENGL -struct GlRaster { - GLuint id; -}; - -static void* -createNativeRaster(void *object, int32 offset, int32) -{ - GlRaster *raster = PLUGINOFFSET(GlRaster, object, offset); - raster->id = 0; - return object; -} - -static void* -destroyNativeRaster(void *object, int32 offset, int32) -{ - // TODO: - return object; -} - -static void* -copyNativeRaster(void *dst, void *, int32 offset, int32) -{ - GlRaster *raster = PLUGINOFFSET(GlRaster, dst, offset); - raster->id = 0; - return dst; -} - -void -registerNativeRaster(void) -{ - nativeRasterOffset = Raster::registerPlugin(sizeof(GlRaster), - ID_RASTERWDGL, - createNativeRaster, - destroyNativeRaster, - copyNativeRaster); -} - -void -Texture::upload(void) -{ - GLuint id; - glGenTextures(1, &id); - glBindTexture(GL_TEXTURE_2D, id); - Raster *r = this->raster; - if(r->palette){ - printf("can't upload paletted raster\n"); - return; - } - - static GLenum filter[] = { - 0, GL_NEAREST, GL_LINEAR, - GL_NEAREST_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_NEAREST, - GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_LINEAR - }; - static GLenum filternomip[] = { - 0, GL_NEAREST, GL_LINEAR, - GL_NEAREST, GL_LINEAR, - GL_NEAREST, GL_LINEAR - }; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, - filternomip[this->filterAddressing & 0xFF]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, - filternomip[this->filterAddressing & 0xFF]); - - static GLenum wrap[] = { - 0, GL_REPEAT, GL_MIRRORED_REPEAT, - GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER - }; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, - wrap[(this->filterAddressing >> 8) & 0xF]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, - wrap[(this->filterAddressing >> 12) & 0xF]); - - switch(r->format & 0xF00){ - case Raster::C8888: - glTexImage2D(GL_TEXTURE_2D, 0, 4, r->width, r->height, - 0, GL_RGBA, GL_UNSIGNED_BYTE, r->pixels); - break; - default: - printf("unsupported raster format: %x\n", r->format); - break; - } - glBindTexture(GL_TEXTURE_2D, 0); - GlRaster *glr = PLUGINOFFSET(GlRaster, r, nativeRasterOffset); - glr->id = id; -} - -void -Texture::bind(int n) -{ - Raster *r = this->raster; - GlRaster *glr = PLUGINOFFSET(GlRaster, r, nativeRasterOffset); - glActiveTexture(GL_TEXTURE0+n); - if(r){ - if(glr->id == 0) - this->upload(); - glBindTexture(GL_TEXTURE_2D, glr->id); - }else - glBindTexture(GL_TEXTURE_2D, 0); - glActiveTexture(GL_TEXTURE0); - -} -#endif - -} -} diff --git a/vendor/librw/src/hanim.cpp b/vendor/librw/src/hanim.cpp deleted file mode 100644 index 6bc7c5e..0000000 --- a/vendor/librw/src/hanim.cpp +++ /dev/null @@ -1,414 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" -#include "rwanim.h" -#include "rwplugins.h" -#include "ps2/rwps2.h" -#include "ps2/rwps2plg.h" -#include "d3d/rwxbox.h" -#include "d3d/rwd3d8.h" -#include "d3d/rwd3d9.h" -#include "gl/rwwdgl.h" -#include "gl/rwgl3.h" - -#define PLUGIN_ID ID_HANIM - -namespace rw { - -int32 hAnimOffset; -bool32 hAnimDoStream = 1; - -HAnimHierarchy* -HAnimHierarchy::create(int32 numNodes, int32 *nodeFlags, int32 *nodeIDs, - int32 flags, int32 maxKeySize) -{ - HAnimHierarchy *hier = (HAnimHierarchy*)rwMalloc(sizeof(*hier), MEMDUR_EVENT | ID_HANIM); - if(hier == nil){ - RWERROR((ERR_ALLOC, sizeof(*hier))); - return nil; - } - hier->interpolator = AnimInterpolator::create(numNodes, maxKeySize); - - hier->numNodes = numNodes; - hier->flags = flags; - hier->parentFrame = nil; - hier->parentHierarchy = hier; - if(hier->flags & NOMATRICES){ - hier->matrices = nil; - hier->matricesUnaligned = nil; - }else{ - hier->matricesUnaligned = rwNew(hier->numNodes*64 + 0xF, MEMDUR_EVENT | ID_HANIM); - hier->matrices = - (Matrix*)(((uintptr)hier->matricesUnaligned + 0xF) & ~0xF); - } - hier->nodeInfo = rwNewT(HAnimNodeInfo, hier->numNodes, MEMDUR_EVENT | ID_HANIM); - for(int32 i = 0; i < hier->numNodes; i++){ - if(nodeIDs) - hier->nodeInfo[i].id = nodeIDs[i]; - else - hier->nodeInfo[i].id = 0; - hier->nodeInfo[i].index = i; - if(nodeFlags) - hier->nodeInfo[i].flags = nodeFlags[i]; - else - hier->nodeInfo[i].flags = 0; - hier->nodeInfo[i].frame = nil; - } - return hier; -} - -void -HAnimHierarchy::destroy(void) -{ - this->interpolator->destroy(); - rwFree(this->matricesUnaligned); - rwFree(this->nodeInfo); - rwFree(this); -} - -static Frame* -findById(Frame *f, int32 id) -{ - if(f == nil) return nil; - HAnimData *hanim = HAnimData::get(f); - if(hanim->id >= 0 && hanim->id == id) return f; - Frame *ff = findById(f->next, id); - if(ff) return ff; - return findById(f->child, id); -} - -static Frame* -findUnattachedById(HAnimHierarchy *hier, Frame *f, int32 id) -{ - if(f == nil) return nil; - HAnimData *hanim = HAnimData::get(f); - if(hanim->id >= 0 && hanim->id == id && hier->getIndex(f) == -1) return f; - Frame *ff = findUnattachedById(hier, f->next, id); - if(ff) return ff; - return findUnattachedById(hier, f->child, id); -} - -void -HAnimHierarchy::attachByIndex(int32 idx) -{ - int32 id = this->nodeInfo[idx].id; -// Frame *f = findById(this->parentFrame, id); - Frame *f = findUnattachedById(this, this->parentFrame, id); - if(f) - this->nodeInfo[idx].frame = f; -} - -void -HAnimHierarchy::attach(void) -{ - for(int32 i = 0; i < this->numNodes; i++) - this->attachByIndex(i); -} - -int32 -HAnimHierarchy::getIndex(int32 id) -{ - for(int32 i = 0; i < this->numNodes; i++) - if(this->nodeInfo[i].id == id) - return i; - return -1; -} - -int32 -HAnimHierarchy::getIndex(Frame *f) -{ - for(int32 i = 0; i < this->numNodes; i++) - if(this->nodeInfo[i].frame == f) - return i; - return -1; -} - -HAnimHierarchy* -HAnimHierarchy::get(Frame *f) -{ - return HAnimData::get(f)->hierarchy; -} - -HAnimHierarchy* -HAnimHierarchy::find(Frame *f) -{ - if(f == nil) return nil; - HAnimHierarchy *hier = HAnimHierarchy::get(f); - if(hier) return hier; - hier = HAnimHierarchy::find(f->next); - if(hier) return hier; - return HAnimHierarchy::find(f->child); -} - -void -HAnimHierarchy::updateMatrices(void) -{ - // TODO: handle more (all!) cases - - Matrix rootMat, animMat; - Matrix *curMat, *parentMat; - Matrix **sp, *stack[64]; - Frame *frm, *parfrm; - int32 i; - AnimInterpolator *anim = this->interpolator; - - sp = stack; - curMat = this->matrices; - - frm = this->parentFrame; - if(frm && (parfrm = frm->getParent()) && !(this->flags&LOCALSPACEMATRICES)) - rootMat = *parfrm->getLTM(); - else - rootMat.setIdentity(); - parentMat = &rootMat; - *sp++ = parentMat; - HAnimNodeInfo *node = this->nodeInfo; - for(i = 0; i < this->numNodes; i++){ - anim->applyCB(&animMat, anim->getInterpFrame(i)); - - // TODO: here we could update local matrices - - Matrix::mult(curMat, &animMat, parentMat); - - // TODO: here we could update LTM - - if(node->flags & PUSH) - *sp++ = parentMat; - parentMat = curMat; - if(node->flags & POP) - parentMat = *--sp; - assert(sp >= stack); - assert(sp <= &stack[64]); - - node++; - curMat++; - } -} - -HAnimData* -HAnimData::get(Frame *f) -{ - return PLUGINOFFSET(HAnimData, f, hAnimOffset); -} - -static void* -createHAnim(void *object, int32 offset, int32) -{ - HAnimData *hanim = PLUGINOFFSET(HAnimData, object, offset); - hanim->id = -1; - hanim->hierarchy = nil; - return object; -} - -static void* -destroyHAnim(void *object, int32 offset, int32) -{ - int i; - HAnimData *hanim = PLUGINOFFSET(HAnimData, object, offset); - if(hanim->hierarchy){ - for(i = 0; i < hanim->hierarchy->numNodes; i++) - hanim->hierarchy->nodeInfo[i].frame = nil; - if(object == hanim->hierarchy->parentFrame) - hanim->hierarchy->destroy(); - } - hanim->id = -1; - hanim->hierarchy = nil; - return object; -} - -static void* -copyHAnim(void *dst, void *src, int32 offset, int32) -{ - int i; - HAnimData *dsthanim = PLUGINOFFSET(HAnimData, dst, offset); - HAnimData *srchanim = PLUGINOFFSET(HAnimData, src, offset); - HAnimHierarchy *srchier, *dsthier; - dsthanim->id = srchanim->id; - dsthanim->hierarchy = nil; - srchier = srchanim->hierarchy; - if(srchier && !(srchier->flags & HAnimHierarchy::SUBHIERARCHY)){ - dsthier = HAnimHierarchy::create(srchier->numNodes, nil, nil, srchier->flags, srchier->interpolator->maxInterpKeyFrameSize); - for(i = 0; i < dsthier->numNodes; i++){ - dsthier->nodeInfo[i].frame = nil; - dsthier->nodeInfo[i].flags = srchier->nodeInfo[i].flags; - dsthier->nodeInfo[i].index = srchier->nodeInfo[i].index; - dsthier->nodeInfo[i].id = srchier->nodeInfo[i].id; - } - dsthanim->hierarchy = dsthier; - dsthier->parentFrame = (Frame*)dst; - } - return dst; -} - -static Stream* -readHAnim(Stream *stream, int32, void *object, int32 offset, int32) -{ - int32 ver, numNodes; - HAnimData *hanim = PLUGINOFFSET(HAnimData, object, offset); - ver = stream->readI32(); - assert(ver == 0x100); - hanim->id = stream->readI32(); - numNodes = stream->readI32(); - if(numNodes != 0){ - int32 flags = stream->readI32(); - int32 maxKeySize = stream->readI32(); - // Sizes are fucked for 64 bit pointers but - // AnimInterpolator::create() will take care of that - int32 *nodeFlags = rwNewT(int32, numNodes, - MEMDUR_FUNCTION | ID_HANIM); - int32 *nodeIDs = rwNewT(int32, numNodes, - MEMDUR_FUNCTION | ID_HANIM); - for(int32 i = 0; i < numNodes; i++){ - nodeIDs[i] = stream->readI32(); - stream->readI32(); // index...unused - nodeFlags[i] = stream->readI32(); - } - hanim->hierarchy = HAnimHierarchy::create(numNodes, - nodeFlags, nodeIDs, flags, maxKeySize); - hanim->hierarchy->parentFrame = (Frame*)object; - rwFree(nodeFlags); - rwFree(nodeIDs); - } - return stream; -} - -static Stream* -writeHAnim(Stream *stream, int32, void *object, int32 offset, int32) -{ - HAnimData *hanim = PLUGINOFFSET(HAnimData, object, offset); - stream->writeI32(256); - stream->writeI32(hanim->id); - if(hanim->hierarchy == nil){ - stream->writeI32(0); - return stream; - } - HAnimHierarchy *hier = hanim->hierarchy; - stream->writeI32(hier->numNodes); - stream->writeI32(hier->flags); - stream->writeI32(hier->interpolator->maxInterpKeyFrameSize); - for(int32 i = 0; i < hier->numNodes; i++){ - stream->writeI32(hier->nodeInfo[i].id); - stream->writeI32(hier->nodeInfo[i].index); - stream->writeI32(hier->nodeInfo[i].flags); - } - return stream; -} - -static int32 -getSizeHAnim(void *object, int32 offset, int32) -{ - HAnimData *hanim = PLUGINOFFSET(HAnimData, object, offset); - if(!hAnimDoStream || - (version >= 0x35000 && hanim->id == -1 && hanim->hierarchy == nil)) - return 0; - if(hanim->hierarchy) - return 12 + 8 + hanim->hierarchy->numNodes*12; - return 12; -} - -static void -hAnimFrameRead(Stream *stream, Animation *anim) -{ - HAnimKeyFrame *frames = (HAnimKeyFrame*)anim->keyframes; - for(int32 i = 0; i < anim->numFrames; i++){ - frames[i].time = stream->readF32(); - stream->read32(&frames[i].q, 4*4); - stream->read32(&frames[i].t, 3*4); - int32 prev = stream->readI32()/0x24; - frames[i].prev = &frames[prev]; - } -} - -static void -hAnimFrameWrite(Stream *stream, Animation *anim) -{ - HAnimKeyFrame *frames = (HAnimKeyFrame*)anim->keyframes; - for(int32 i = 0; i < anim->numFrames; i++){ - stream->writeF32(frames[i].time); - stream->write32(&frames[i].q, 4*4); - stream->write32(&frames[i].t, 3*4); - stream->writeI32((frames[i].prev - frames)*0x24); - } -} - -static uint32 -hAnimFrameGetSize(Animation *anim) -{ - return anim->numFrames*(4 + 4*4 + 3*4 + 4); -} - -//void hanimBlendCB(void *out, void *in1, void *in2, float32 a); -//void hanimAddCB(void *out, void *in1, void *in2); -//void hanimMulRecipCB(void *frame, void *start); - -static void -hanimApplyCB(void *result, void *frame) -{ - Matrix *m = (Matrix*)result; - HAnimInterpFrame *f = (HAnimInterpFrame*)frame; - m->rotate(f->q, COMBINEREPLACE); - m->pos = f->t; -} - -static void -hanimInterpCB(void *vout, void *vin1, void *vin2, float32 t, void*) -{ - HAnimInterpFrame *out = (HAnimInterpFrame*)vout; - HAnimKeyFrame *in1 = (HAnimKeyFrame*)vin1; - HAnimKeyFrame *in2 = (HAnimKeyFrame*)vin2; -assert(t >= in1->time && t <= in2->time); - float32 a = (t - in1->time)/(in2->time - in1->time); - out->t = lerp(in1->t, in2->t, a); - out->q = slerp(in1->q, in2->q, a); -} - -static void* -hanimOpen(void *object, int32 offset, int32 size) -{ - AnimInterpolatorInfo *info = rwNewT(AnimInterpolatorInfo, 1, MEMDUR_GLOBAL | ID_HANIM); - info->id = 1; - info->interpKeyFrameSize = sizeof(HAnimInterpFrame); - info->animKeyFrameSize = sizeof(HAnimKeyFrame); - info->customDataSize = 0; - info->applyCB = hanimApplyCB; - info->blendCB = nil; - info->interpCB = hanimInterpCB; - info->addCB = nil; - info->mulRecipCB = nil; - info->streamRead = hAnimFrameRead; - info->streamWrite = hAnimFrameWrite; - info->streamGetSize = hAnimFrameGetSize; - AnimInterpolatorInfo::registerInterp(info); - return object; -} - -static void* -hanimClose(void *object, int32 offset, int32 size) -{ - AnimInterpolatorInfo::unregisterInterp(AnimInterpolatorInfo::find(1)); - return object; -} - - -void -registerHAnimPlugin(void) -{ - Engine::registerPlugin(0, ID_HANIM, hanimOpen, hanimClose); - hAnimOffset = Frame::registerPlugin(sizeof(HAnimData), ID_HANIM, - createHAnim, - destroyHAnim, copyHAnim); - Frame::registerPluginStream(ID_HANIM, - readHAnim, - writeHAnim, - getSizeHAnim); -} - -} diff --git a/vendor/librw/src/image.cpp b/vendor/librw/src/image.cpp deleted file mode 100644 index 77adfda..0000000 --- a/vendor/librw/src/image.cpp +++ /dev/null @@ -1,1324 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" -#include "ps2/rwps2.h" -#include "d3d/rwd3d.h" -#include "d3d/rwxbox.h" -#include "d3d/rwd3d8.h" -#include "d3d/rwd3d9.h" - -#define PLUGIN_ID ID_IMAGE - -namespace rw { - -int32 Image::numAllocated; - -struct FileAssociation -{ - char *extension; - Image *(*read)(const char *afilename); - void (*write)(Image *image, const char *filename); -}; - -struct ImageGlobals -{ - char *searchPaths; - int numSearchPaths; - FileAssociation fileFormats[10]; - int numFileFormats; -}; -int32 imageModuleOffset; - -#define IMAGEGLOBAL(v) (PLUGINOFFSET(ImageGlobals, engine, imageModuleOffset)->v) - -// Image formats are as follows: -// 32 bit has 4 bytes: 8888 RGBA -// 24 bit has 3 bytes: 888 RGB -// 16 bit has 2 bytes: 1555 ARGB stored in platform native order (TODO?) -// palettes always have 4 bytes: r, g, b, a -// 8 bit has 1 byte: x -// 4 bit has 1 byte per two pixels: 0xLR, where L and R are the left and right pixel resp. - -Image* -Image::create(int32 width, int32 height, int32 depth) -{ - Image *img = (Image*)rwMalloc(sizeof(Image), MEMDUR_EVENT | ID_IMAGE); - if(img == nil){ - RWERROR((ERR_ALLOC, sizeof(Image))); - return nil; - } - numAllocated++; - img->flags = 0; - img->width = width; - img->height = height; - img->depth = depth; - img->bpp = depth < 8 ? 1 : depth/8; - img->stride = 0; - img->pixels = nil; - img->palette = nil; - return img; -} - -void -Image::destroy(void) -{ - this->free(); - rwFree(this); - numAllocated--; -} - -void -Image::allocate(void) -{ - if(this->pixels == nil){ - this->stride = this->width*this->bpp; - this->pixels = rwNewT(uint8, this->stride*this->height, MEMDUR_EVENT | ID_IMAGE); - this->flags |= 1; - } - if(this->palette == nil){ - if(this->depth == 4 || this->depth == 8) - this->palette = rwNewT(uint8, (1 << this->depth)*4, MEMDUR_EVENT | ID_IMAGE); - this->flags |= 2; - } -} - -void -Image::free(void) -{ - if(this->flags&1){ - rwFree(this->pixels); - this->pixels = nil; - } - if(this->flags&2){ - rwFree(this->palette); - this->palette = nil; - } - this->flags = 0; -} - -void -Image::setPixels(uint8 *pixels) -{ - this->pixels = pixels; - this->flags |= 1; -} - -void -decompressDXT1(uint8 *adst, int32 w, int32 h, uint8 *src) -{ - /* j loops through old texels - * x and y loop through new texels */ - int32 x = 0, y = 0; - uint32 c[4][4]; - uint8 idx[16]; - uint8 (*dst)[4] = (uint8(*)[4])adst; - for(int32 j = 0; j < w*h/2; j += 8){ - /* calculate colors */ - uint32 col0 = *((uint16*)&src[j+0]); - uint32 col1 = *((uint16*)&src[j+2]); - c[0][0] = ((col0>>11) & 0x1F)*0xFF/0x1F; - c[0][1] = ((col0>> 5) & 0x3F)*0xFF/0x3F; - c[0][2] = ( col0 & 0x1F)*0xFF/0x1F; - c[0][3] = 0xFF; - - c[1][0] = ((col1>>11) & 0x1F)*0xFF/0x1F; - c[1][1] = ((col1>> 5) & 0x3F)*0xFF/0x3F; - c[1][2] = ( col1 & 0x1F)*0xFF/0x1F; - c[1][3] = 0xFF; - if(col0 > col1){ - c[2][0] = (2*c[0][0] + 1*c[1][0])/3; - c[2][1] = (2*c[0][1] + 1*c[1][1])/3; - c[2][2] = (2*c[0][2] + 1*c[1][2])/3; - c[2][3] = 0xFF; - - c[3][0] = (1*c[0][0] + 2*c[1][0])/3; - c[3][1] = (1*c[0][1] + 2*c[1][1])/3; - c[3][2] = (1*c[0][2] + 2*c[1][2])/3; - c[3][3] = 0xFF; - }else{ - c[2][0] = (c[0][0] + c[1][0])/2; - c[2][1] = (c[0][1] + c[1][1])/2; - c[2][2] = (c[0][2] + c[1][2])/2; - c[2][3] = 0xFF; - - c[3][0] = 0x00; - c[3][1] = 0x00; - c[3][2] = 0x00; - c[3][3] = 0x00; - } - - /* make index list */ - uint32 indices = *((uint32*)&src[j+4]); - for(int32 k = 0; k < 16; k++){ - idx[k] = indices & 0x3; - indices >>= 2; - } - - /* write bytes */ - for(uint32 l = 0; l < 4; l++) - for(uint32 k = 0; k < 4; k++){ - dst[(y+l)*w + x+k][0] = c[idx[l*4+k]][0]; - dst[(y+l)*w + x+k][1] = c[idx[l*4+k]][1]; - dst[(y+l)*w + x+k][2] = c[idx[l*4+k]][2]; - dst[(y+l)*w + x+k][3] = c[idx[l*4+k]][3]; - } - x += 4; - if(x >= w){ - y += 4; - x = 0; - } - } -} - -void -decompressDXT3(uint8 *adst, int32 w, int32 h, uint8 *src) -{ - /* j loops through old texels - * x and y loop through new texels */ - int32 x = 0, y = 0; - uint32 c[4][4]; - uint8 idx[16]; - uint8 a[16]; - uint8 (*dst)[4] = (uint8(*)[4])adst; - for(int32 j = 0; j < w*h; j += 16){ - /* calculate colors */ - uint32 col0 = *((uint16*)&src[j+8]); - uint32 col1 = *((uint16*)&src[j+10]); - c[0][0] = ((col0>>11) & 0x1F)*0xFF/0x1F; - c[0][1] = ((col0>> 5) & 0x3F)*0xFF/0x3F; - c[0][2] = ( col0 & 0x1F)*0xFF/0x1F; - - c[1][0] = ((col1>>11) & 0x1F)*0xFF/0x1F; - c[1][1] = ((col1>> 5) & 0x3F)*0xFF/0x3F; - c[1][2] = ( col1 & 0x1F)*0xFF/0x1F; - - c[2][0] = (2*c[0][0] + 1*c[1][0])/3; - c[2][1] = (2*c[0][1] + 1*c[1][1])/3; - c[2][2] = (2*c[0][2] + 1*c[1][2])/3; - - c[3][0] = (1*c[0][0] + 2*c[1][0])/3; - c[3][1] = (1*c[0][1] + 2*c[1][1])/3; - c[3][2] = (1*c[0][2] + 2*c[1][2])/3; - - /* make index list */ - uint32 indices = *((uint32*)&src[j+12]); - for(int32 k = 0; k < 16; k++){ - idx[k] = indices & 0x3; - indices >>= 2; - } - uint64 alphas = *((uint64*)&src[j+0]); - for(int32 k = 0; k < 16; k++){ - a[k] = (alphas & 0xF)*17; - alphas >>= 4; - } - - /* write bytes */ - for(uint32 l = 0; l < 4; l++) - for(uint32 k = 0; k < 4; k++){ - dst[(y+l)*w + x+k][0] = c[idx[l*4+k]][0]; - dst[(y+l)*w + x+k][1] = c[idx[l*4+k]][1]; - dst[(y+l)*w + x+k][2] = c[idx[l*4+k]][2]; - dst[(y+l)*w + x+k][3] = a[l*4+k]; - } - x += 4; - if(x >= w){ - y += 4; - x = 0; - } - } -} - -void -decompressDXT5(uint8 *adst, int32 w, int32 h, uint8 *src) -{ - /* j loops through old texels - * x and y loop through new texels */ - int32 x = 0, y = 0; - uint32 c[4][4]; - uint32 a[8]; - uint8 idx[16]; - uint8 aidx[16]; - uint8 (*dst)[4] = (uint8(*)[4])adst; - for(int32 j = 0; j < w*h; j += 16){ - /* calculate colors */ - uint32 col0 = *((uint16*)&src[j+8]); - uint32 col1 = *((uint16*)&src[j+10]); - c[0][0] = ((col0>>11) & 0x1F)*0xFF/0x1F; - c[0][1] = ((col0>> 5) & 0x3F)*0xFF/0x3F; - c[0][2] = ( col0 & 0x1F)*0xFF/0x1F; - - c[1][0] = ((col1>>11) & 0x1F)*0xFF/0x1F; - c[1][1] = ((col1>> 5) & 0x3F)*0xFF/0x3F; - c[1][2] = ( col1 & 0x1F)*0xFF/0x1F; - if(col0 > col1){ - c[2][0] = (2*c[0][0] + 1*c[1][0])/3; - c[2][1] = (2*c[0][1] + 1*c[1][1])/3; - c[2][2] = (2*c[0][2] + 1*c[1][2])/3; - - c[3][0] = (1*c[0][0] + 2*c[1][0])/3; - c[3][1] = (1*c[0][1] + 2*c[1][1])/3; - c[3][2] = (1*c[0][2] + 2*c[1][2])/3; - }else{ - c[2][0] = (c[0][0] + c[1][0])/2; - c[2][1] = (c[0][1] + c[1][1])/2; - c[2][2] = (c[0][2] + c[1][2])/2; - - c[3][0] = 0x00; - c[3][1] = 0x00; - c[3][2] = 0x00; - } - - a[0] = src[j+0]; - a[1] = src[j+1]; - if(a[0] > a[1]){ - a[2] = (6*a[0] + 1*a[1])/7; - a[3] = (5*a[0] + 2*a[1])/7; - a[4] = (4*a[0] + 3*a[1])/7; - a[5] = (3*a[0] + 4*a[1])/7; - a[6] = (2*a[0] + 5*a[1])/7; - a[7] = (1*a[0] + 6*a[1])/7; - }else{ - a[2] = (4*a[0] + 1*a[1])/5; - a[3] = (3*a[0] + 2*a[1])/5; - a[4] = (2*a[0] + 3*a[1])/5; - a[5] = (1*a[0] + 4*a[1])/5; - a[6] = 0; - a[7] = 0xFF; - } - - /* make index list */ - uint32 indices = *((uint32*)&src[j+12]); - for(int32 k = 0; k < 16; k++){ - idx[k] = indices & 0x3; - indices >>= 2; - } - // only 6 indices - uint64 alphas = *((uint64*)&src[j+2]); - for(int32 k = 0; k < 16; k++){ - aidx[k] = alphas & 0x7; - alphas >>= 3; - } - - /* write bytes */ - for(uint32 l = 0; l < 4; l++) - for(uint32 k = 0; k < 4; k++){ - dst[(y+l)*w + x+k][0] = c[idx[l*4+k]][0]; - dst[(y+l)*w + x+k][1] = c[idx[l*4+k]][1]; - dst[(y+l)*w + x+k][2] = c[idx[l*4+k]][2]; - dst[(y+l)*w + x+k][3] = a[aidx[l*4+k]]; - } - x += 4; - if(x >= w){ - y += 4; - x = 0; - } - } -} - -// not strictly image but related - -// flip a DXT 2-bit block -static void -flipBlock(uint8 *dst, uint8 *src) -{ - // color - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = src[3]; - // bits - dst[4] = src[7]; - dst[5] = src[6]; - dst[6] = src[5]; - dst[7] = src[4]; -} - -// flip top 2 rows of a DXT 2-bit block -static void -flipBlock_half(uint8 *dst, uint8 *src) -{ - // color - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = src[3]; - // bits - dst[4] = src[5]; - dst[5] = src[4]; - dst[6] = src[6]; - dst[7] = src[7]; -} - -// flip a DXT3 4-bit alpha block -static void -flipAlphaBlock3(uint8 *dst, uint8 *src) -{ - dst[6] = src[0]; - dst[7] = src[1]; - dst[4] = src[2]; - dst[5] = src[3]; - dst[2] = src[4]; - dst[3] = src[5]; - dst[0] = src[6]; - dst[1] = src[7]; -} - -// flip top 2 rows of a DXT3 4-bit alpha block -static void -flipAlphaBlock3_half(uint8 *dst, uint8 *src) -{ - dst[0] = src[2]; - dst[1] = src[3]; - dst[2] = src[0]; - dst[3] = src[1]; - dst[4] = src[4]; - dst[5] = src[5]; - dst[6] = src[6]; - dst[7] = src[7]; -} - -// flip a DXT5 3-bit alpha block -static void -flipAlphaBlock5(uint8 *dst, uint8 *src) -{ - // color - dst[0] = src[0]; - dst[1] = src[1]; - // bits - uint64 bits = *(uint64*)&src[2]; - uint64 flipbits = 0; - for(int i = 0; i < 4; i++){ - flipbits <<= 12; - flipbits |= bits & 0xFFF; - bits >>= 12; - } - memcpy(dst+2, &flipbits, 6); -} - -// flip top 2 rows of a DXT5 3-bit alpha block -static void -flipAlphaBlock5_half(uint8 *dst, uint8 *src) -{ - // color - dst[0] = src[0]; - dst[1] = src[1]; - // bits - uint64 bits = *(uint64*)&src[2]; - uint64 flipbits = bits & 0xFFFFFF000000; - flipbits |= (bits>>12) & 0xFFF; - flipbits |= (bits<<12) & 0xFFF000; - memcpy(dst+2, &flipbits, 6); -} - -void -flipDXT1(uint8 *dst, uint8 *src, uint32 width, uint32 height) -{ - int x, y; - int bw = (width+3)/4; - int bh = (height+3)/4; - if(height < 4){ - // used pixels are always at the top - // so don't swap the full 4 rows - if(height == 2){ - uint8 *s = src; - uint8 *d = dst; - for(x = 0; x < bw; x++){ - flipBlock_half(dst, src); - s += 8; - d += 8; - } - }else - memcpy(dst, src, 8*bw); - return; - } - dst += 8*bw*bh; - for(y = 0; y < bh; y++){ - dst -= 8*bw; - uint8 *s = src; - uint8 *d = dst; - for(x = 0; x < bw; x++){ - flipBlock(d, s); - s += 8; - d += 8; - } - src += 8*bw; - } -} - -void -flipDXT3(uint8 *dst, uint8 *src, uint32 width, uint32 height) -{ - int x, y; - int bw = (width+3)/4; - int bh = (height+3)/4; - if(height < 4){ - // used pixels are always at the top - // so don't swap the full 4 rows - if(height == 2){ - uint8 *s = src; - uint8 *d = dst; - for(x = 0; x < bw; x++){ - flipAlphaBlock3_half(d, s); - flipBlock_half(d+8, s+8); - s += 16; - d += 16; - } - }else - memcpy(dst, src, 16*bw); - return; - } - dst += 16*bw*bh; - for(y = 0; y < bh; y++){ - dst -= 16*bw; - uint8 *s = src; - uint8 *d = dst; - for(x = 0; x < bw; x++){ - flipAlphaBlock3(d, s); - flipBlock(d+8, s+8); - s += 16; - d += 16; - } - src += 16*bw; - } -} - -void -flipDXT5(uint8 *dst, uint8 *src, uint32 width, uint32 height) -{ - int x, y; - int bw = (width+3)/4; - int bh = (height+3)/4; - if(height < 4){ - // used pixels are always at the top - // so don't swap the full 4 rows - if(height == 2){ - uint8 *s = src; - uint8 *d = dst; - for(x = 0; x < bw; x++){ - flipAlphaBlock5_half(d, s); - flipBlock_half(d+8, s+8); - s += 16; - d += 16; - } - }else - memcpy(dst, src, 16*bw); - return; - } - dst += 16*bw*bh; - for(y = 0; y < bh; y++){ - dst -= 16*bw; - uint8 *s = src; - uint8 *d = dst; - for(x = 0; x < bw; x++){ - flipAlphaBlock5(d, s); - flipBlock(d+8, s+8); - s += 16; - d += 16; - } - src += 16*bw; - } -} - -void -flipDXT(int32 type, uint8 *dst, uint8 *src, uint32 width, uint32 height) -{ - switch(type){ - case 1: - flipDXT1(dst, src, width, height); - break; - case 3: - flipDXT3(dst, src, width, height); - break; - case 5: - flipDXT5(dst, src, width, height); - break; - } -} - -void -Image::setPixelsDXT(int32 type, uint8 *pixels) -{ - switch(type){ - case 1: - decompressDXT1(this->pixels, this->width, this->height, pixels); - break; - case 3: - decompressDXT3(this->pixels, this->width, this->height, pixels); - break; - case 5: - decompressDXT5(this->pixels, this->width, this->height, pixels); - break; - } -} - -void -Image::setPalette(uint8 *palette) -{ - this->palette = palette; - this->flags |= 2; -} - -void -Image::compressPalette(void) -{ - if(this->depth != 8) - return; - uint8 *pixels = this->pixels; - for(int y = 0; y < this->height; y++){ - uint8 *line = pixels; - for(int x = 0; x < this->width; x++){ - if(*line > 0xF) return; - line += this->bpp; - } - pixels += this->stride; - } - this->depth = 4; -} - -bool32 -Image::hasAlpha(void) -{ - uint8 ret = 0xFF; - uint8 *pixels = this->pixels; - if(this->depth == 32){ - for(int y = 0; y < this->height; y++){ - uint8 *line = pixels; - for(int x = 0; x < this->width; x++){ - ret &= line[3]; - line += this->bpp; - } - pixels += this->stride; - } - }else if(this->depth == 24){ - return 0; - }else if(this->depth == 16){ - for(int y = 0; y < this->height; y++){ - uint8 *line = pixels; - for(int x = 0; x < this->width; x++){ - ret &= line[1] & 0x80; - line += this->bpp; - } - pixels += this->stride; - } - return ret != 0x80; - }else if(this->depth <= 8){ - for(int y = 0; y < this->height; y++){ - uint8 *line = pixels; - for(int x = 0; x < this->width; x++){ - ret &= this->palette[*line*4+3]; - line += this->bpp; - } - pixels += this->stride; - } - } - return ret != 0xFF; -} - -void -Image::convertTo32(void) -{ - assert(this->pixels); - uint8 *pixels = this->pixels; - int32 newstride = this->width*4; - uint8 *newpixels; - - void (*fun)(uint8 *out, uint8 *in) = nil; - switch(this->depth){ - case 4: - case 8: - assert(this->palette); - this->unpalettize(true); - return; - case 16: - fun = conv_RGBA8888_from_ARGB1555; - break; - case 24: - fun = conv_RGBA8888_from_RGB888; - break; - default: - return; - } - - newpixels = rwNewT(uint8, newstride*this->height, MEMDUR_EVENT | ID_IMAGE); - uint8 *pixels32 = newpixels; - for(int y = 0; y < this->height; y++){ - uint8 *line = pixels; - uint8 *newline = newpixels; - for(int x = 0; x < this->width; x++){ - fun(newline, line); - line += this->bpp; - newline += 4; - } - pixels += this->stride; - newpixels += newstride; - } - - this->free(); - this->depth = 32; - this->bpp = 4; - this->stride = newstride; - this->pixels = nil; - this->palette = nil; - this->setPixels(pixels32); -} - -void -Image::palettize(int32 depth) -{ - RGBA colors[256]; - ColorQuant quant; - uint8 *newpixels; - uint32 newstride; - - quant.init(); - quant.addImage(this); - assert(depth <= 8); - quant.makePalette(1<width; - newpixels = rwNewT(uint8, newstride*this->height, MEMDUR_EVENT | ID_IMAGE); - // TODO: maybe do floyd-steinberg dithering? - quant.matchImage(newpixels, newstride, this); - - this->free(); - this->depth = depth; - this->bpp = depth < 8 ? 1 : depth/8; - this->stride = newstride; - this->pixels = nil; - this->palette = nil; - this->setPixels(newpixels); - this->allocate(); - memcpy(this->palette, colors, 4*(1<depth > 8) - return; - assert(this->pixels); - assert(this->palette); - - int32 ndepth = (forceAlpha || this->hasAlpha()) ? 32 : 24; - int32 nstride = this->width*ndepth/8; - uint8 *npixels = rwNewT(uint8, nstride*this->height, MEMDUR_EVENT | ID_IMAGE); - - uint8 *line = this->pixels; - uint8 *nline = npixels; - uint8 *p, *np; - for(int32 y = 0; y < this->height; y++){ - p = line; - np = nline; - for(int32 x = 0; x < this->width; x++){ - np[0] = this->palette[*p*4+0]; - np[1] = this->palette[*p*4+1]; - np[2] = this->palette[*p*4+2]; - np += 3; - if(ndepth == 32) - *np++ = this->palette[*p*4+3]; - p++; - } - line += this->stride; - nline += nstride; - } - this->free(); - this->depth = ndepth; - this->bpp = ndepth < 8 ? 1 : ndepth/8; - this->stride = nstride; - this->setPixels(npixels); -} - -// Copy the biggest channel value to alpha -void -Image::makeMask(void) -{ - int32 maxcol; - switch(this->depth){ - case 4: - case 8: { - assert(this->palette); - int32 pallen = 1 << this->depth; - for(int32 i = 0; i < pallen; i++){ - maxcol = this->palette[i*4+0]; - if(this->palette[i*4+1] > maxcol) maxcol = this->palette[i*4+1]; - if(this->palette[i*4+2] > maxcol) maxcol = this->palette[i*4+2]; - this->palette[i*4+3] = maxcol; - } - break; - } - - case 16: - case 24: - this->convertTo32(); - // fallthrough - - case 32: { - assert(this->pixels); - uint8 *line = this->pixels; - uint8 *p; - for(int32 y = 0; y < this->height; y++){ - p = line; - for(int32 x = 0; x < this->width; x++){ - maxcol = p[0]; - if(p[1] > maxcol) maxcol = p[1]; - if(p[2] > maxcol) maxcol = p[2]; - p[3] = maxcol; - p += this->bpp; - } - line += this->stride; - } - break; - } - } -} - -void -Image::applyMask(Image *mask) -{ - if(this->width != mask->width || this->height != mask->height) - return; // TODO: set an error - // we could use alpha with 16 bits but what's the point? - if(mask->depth == 16 || mask->depth == 24) - return; - - this->convertTo32(); - assert(this->depth == 32); - - uint8 *line = this->pixels; - uint8 *mline = mask->pixels; - uint8 *p, *m; - for(int32 y = 0; y < this->height; y++){ - p = line; - m = mline; - for(int32 x = 0; x < this->width; x++){ - if(mask->depth == 32) - p[3] = m[3]; - else if(mask->depth <= 8) - p[3] = mask->palette[m[0]*4+3]; - p += this->bpp; - m += mask->bpp; - } - line += this->stride; - mline += mask->stride; - } -} - -void -Image::removeMask(void) -{ - if(this->depth <= 8){ - assert(this->palette); - int32 pallen = 4*(1 << this->depth); - for(int32 i = 0; i < pallen; i += 4) - this->palette[i+3] = 0xFF; - return; - } - if(this->depth == 24) - return; - assert(this->pixels); - uint8 *line = this->pixels; - uint8 *p; - for(int32 y = 0; y < this->height; y++){ - p = line; - for(int32 x = 0; x < this->width; x++){ - switch(this->depth){ - case 16: - p[1] |= 0x80; - p += 2; - break; - case 32: - p[3] = 0xFF; - p += 4; - break; - } - } - line += this->stride; - } -} - -Image* -Image::extractMask(void) -{ - Image *img = Image::create(this->width, this->height, 8); - img->allocate(); - - // use an 8bit palette to store all shades of grey - for(int32 i = 0; i < 256; i++){ - img->palette[i*4+0] = i; - img->palette[i*4+1] = i; - img->palette[i*4+2] = i; - img->palette[i*4+3] = 0xFF; - } - - // Then use the alpha value as palette index - uint8 *line = this->pixels; - uint8 *nline = img->pixels; - uint8 *p, *np; - for(int32 y = 0; y < this->height; y++){ - p = line; - np = nline; - for(int32 x = 0; x < this->width; x++){ - switch(this->depth){ - case 4: - case 8: - *np++ = this->palette[*p*4+3]; - p++; - break; - case 16: - *np++ = 0xFF*!!(p[1]&0x80); - p += 2; - break; - case 24: - *np++ = 0xFF; - p += 3; - break; - case 32: - *np++ = p[3]; - p += 4; - break; - } - } - line += this->stride; - nline += img->stride; - } - return img; -} - -void -Image::setSearchPath(const char *path) -{ - char *p, *end; - ImageGlobals *g = PLUGINOFFSET(ImageGlobals, engine, imageModuleOffset); - rwFree(g->searchPaths); - g->numSearchPaths = 0; - if(path) - g->searchPaths = p = rwStrdup(path, MEMDUR_EVENT); - else{ - g->searchPaths = nil; - return; - } - while(p && *p){ - end = strchr(p, ';'); - if(end) - *end++ = '\0'; - g->numSearchPaths++; - p = end; - } -} - -void -Image::printSearchPath(void) -{ - ImageGlobals *g = PLUGINOFFSET(ImageGlobals, engine, imageModuleOffset); - char *p = g->searchPaths; - for(int i = 0; i < g->numSearchPaths; i++){ - printf("%s\n", p); - p += strlen(p) + 1; - } -} - -char* -Image::getFilename(const char *name) -{ - ImageGlobals *g = PLUGINOFFSET(ImageGlobals, engine, imageModuleOffset); - FILE *f; - char *s, *p = g->searchPaths; - size_t len = strlen(name)+1; - if(g->numSearchPaths == 0){ - s = rwStrdup(name, MEMDUR_EVENT); - makePath(s); - f = fopen(s, "rb"); - if(f){ - fclose(f); - printf("found %s\n", s); - return s; - } - rwFree(s); - return nil; - }else - for(int i = 0; i < g->numSearchPaths; i++){ - s = (char*)rwMalloc(strlen(p)+len, MEMDUR_EVENT | ID_IMAGE); - if(s == nil){ - RWERROR((ERR_ALLOC, strlen(p)+len)); - return nil; - } - strcpy(s, p); - strcat(s, name); - makePath(s); - f = fopen(s, "r"); - if(f){ - fclose(f); - printf("found %s\n", name); - return s; - } - rwFree(s); - p += strlen(p) + 1; - } - return nil; -} - -Image* -Image::readMasked(const char *imageName, const char *maskName) -{ - Image *img, *mask; - - img = read(imageName); - if(img == nil) - return nil; - if(maskName && maskName[0]){ - mask = read(maskName); - if(mask == nil) - return img; - mask->makeMask(); - int32 origDepth = img->depth; - img->applyMask(mask); - mask->destroy(); - if(origDepth <= 8 && img->depth != origDepth) - img->palettize(origDepth); - } - return img; -} - -Image* -Image::read(const char *imageName) -{ - int i; - char *filename, *ext, *found; - Image *img; - - filename = rwNewT(char, strlen(imageName) + 20, MEMDUR_FUNCTION | ID_IMAGE); - strcpy(filename, imageName); - ext = filename + strlen(filename); - *ext++ = '.'; - // Try all supported extensions - for(i = 0; i < IMAGEGLOBAL(numFileFormats); i++){ - if(IMAGEGLOBAL(fileFormats)[i].read == nil) - continue; - strncpy(ext, IMAGEGLOBAL(fileFormats)[i].extension, 19); - found = getFilename(filename); - // Found a file - if(found){ - img = IMAGEGLOBAL(fileFormats)[i].read(found); - rwFree(found); - // It was a valid image of that format - if(img){ - rwFree(filename); - return img; - } - } - } - rwFree(filename); - return nil; -} - -bool32 -Image::registerFileFormat(const char *ext, fileRead read, fileWrite write) -{ - ImageGlobals *g = PLUGINOFFSET(ImageGlobals, engine, imageModuleOffset); - if(g->numFileFormats >= (int)nelem(g->fileFormats)) - return 0; - g->fileFormats[g->numFileFormats].extension = rwStrdup(ext, MEMDUR_EVENT); - g->fileFormats[g->numFileFormats].read = read; - g->fileFormats[g->numFileFormats].write = write; - g->numFileFormats++; - return 1; -} - -static void* -imageOpen(void *object, int32 offset, int32 size) -{ - imageModuleOffset = offset; - ImageGlobals *g = PLUGINOFFSET(ImageGlobals, engine, imageModuleOffset); - g->searchPaths = nil; - g->numSearchPaths = 0; - g->numFileFormats = 0; - return object; -} - -static void* -imageClose(void *object, int32 offset, int32 size) -{ - ImageGlobals *g = PLUGINOFFSET(ImageGlobals, engine, imageModuleOffset); - int i; - rwFree(g->searchPaths); - g->searchPaths = nil; - g->numSearchPaths = 0; - for(i = 0; i < g->numFileFormats; i++) - rwFree(g->fileFormats[i].extension); - g->numFileFormats = 0; - return object; -} - -void -Image::registerModule(void) -{ - Engine::registerPlugin(sizeof(ImageGlobals), ID_IMAGEMODULE, imageOpen, imageClose); -} - - - -/* - * Color Quantization - */ - -// An address for a single level is 4 bits. -// Since we have 8 bpp that is 32 bits to address any tree node. -// The lower bits address the higher level tree nodes. -// This is essentially a bit reverse and swizzle. -static uint32 -makeTreeAddr(RGBA color) -{ - int32 i; - uint32 addr = 0; - uint32 r = 1; - uint32 g = 2; - uint32 b = 4; - uint32 a = 8; - for(i = 0; i < 8; i++){ - uint32 mask = 0x80>>i; - if(color.red & mask) addr |= r; - if(color.green & mask) addr |= g; - if(color.blue & mask) addr |= b; - if(color.alpha & mask) addr |= a; - r <<= 4; - g <<= 4; - b <<= 4; - a <<= 4; - } - return addr; -} - -void -ColorQuant::Node::destroy(void) -{ - int i; - for(i = 0; i < 16; i++) - if(this->children[i]) - this->children[i]->destroy(); - if(this->link.next) - this->link.remove(); - rwFree(this); -} - -ColorQuant::Node* -ColorQuant::createNode(int32 level) -{ - int i; - ColorQuant::Node *node = rwNewT(ColorQuant::Node, 1, MEMDUR_EVENT | ID_IMAGE); - node->parent = nil; - for(i = 0; i < 16; i++) - node->children[i] = nil; - node->r = 0; - node->g = 0; - node->b = 0; - node->a = 0; - node->numPixels = 0; - node->link.init(); - - if(level == 0) - this->leaves.append(&node->link); - - return node; -} - -ColorQuant::Node* -ColorQuant::getNode(ColorQuant::Node *root, uint32 addr, int32 level) -{ - if(level == 0) - return root; - - uint32 a = addr & 0xF; - if(root->children[a] == nil){ - root->children[a] = this->createNode(level-1); - root->children[a]->parent = root; - } - - return this->getNode(root->children[a], addr>>4, level-1); -} - -ColorQuant::Node* -ColorQuant::findNode(ColorQuant::Node *root, uint32 addr, int32 level) -{ - if(level == 0) - return root; - - uint32 a = addr & 0xF; - if(root->children[a] == nil) - return root; - - return this->findNode(root->children[a], addr>>4, level-1); -} - -void -ColorQuant::reduceNode(Node *node) -{ - int i; - assert(node->numPixels == 0); - for(i = 0; i < 16; i++) - if(node->children[i]){ - node->r += node->children[i]->r; - node->g += node->children[i]->g; - node->b += node->children[i]->b; - node->a += node->children[i]->a; - node->numPixels += node->children[i]->numPixels; - node->children[i]->destroy(); - node->children[i] = nil; - } - assert(node->link.next == nil); - assert(node->link.prev == nil); - this->leaves.append(&node->link); -} - -void -ColorQuant::Node::addColor(RGBA color) -{ - this->r += color.red; - this->g += color.green; - this->b += color.blue; - this->a += color.alpha; - this->numPixels++; -} - -void -ColorQuant::init(void) -{ - this->leaves.init(); - this->root = this->createNode(QUANTDEPTH); -} - -void -ColorQuant::destroy(void) -{ - this->root->destroy(); -} - -void -ColorQuant::addColor(RGBA color) -{ - uint32 addr = makeTreeAddr(color); - ColorQuant::Node *node = this->getNode(root, addr, QUANTDEPTH); - node->addColor(color); -} - -uint8 -ColorQuant::findColor(RGBA color) -{ - uint32 addr = makeTreeAddr(color); - ColorQuant::Node *node = this->findNode(root, addr, QUANTDEPTH); - return node->numPixels; -} - -void -ColorQuant::addImage(Image *img) -{ - RGBA col; - uint8 rgba[4]; - uint8 *pixels = img->pixels; - for(int y = 0; y < img->height; y++){ - uint8 *line = pixels; - for(int x = 0; x < img->width; x++){ - uint8 *p = line; - switch(img->depth){ - case 4: case 8: - conv_RGBA8888_from_RGBA8888(rgba, &img->palette[p[0]*4]); - break; - case 32: - conv_RGBA8888_from_RGBA8888(rgba, p); - break; - case 24: - conv_RGBA8888_from_RGB888(rgba, p); - break; - case 16: - conv_RGBA8888_from_ARGB1555(rgba, p); - break; - default: assert(0 && "invalid depth"); - } - col.red = rgba[0]; - col.green = rgba[1]; - col.blue = rgba[2]; - col.alpha = rgba[3]; - this->addColor(col); - line += img->bpp; - } - pixels += img->stride; - } -} - -void -ColorQuant::makePalette(int32 numColors, RGBA *colors) -{ - while(this->leaves.count() > numColors){ - Node *n = LLLinkGetData(this->leaves.link.next, Node, link); - this->reduceNode(n->parent); - } - - int i = 0; - FORLIST(lnk, this->leaves){ - Node *n = LLLinkGetData(lnk, Node, link); - n->r /= n->numPixels; - n->g /= n->numPixels; - n->b /= n->numPixels; - n->a /= n->numPixels; - colors[i].red = n->r; - colors[i].green = n->g; - colors[i].blue = n->b; - colors[i].alpha = n->a; - n->numPixels = i++; - } -} - -void -ColorQuant::matchImage(uint8 *dstPixels, uint32 dstStride, Image *img) -{ - RGBA col; - uint8 rgba[4]; - uint8 *pixels = img->pixels; - for(int y = 0; y < img->height; y++){ - uint8 *line = pixels; - uint8 *dline = dstPixels; - for(int x = 0; x < img->width; x++){ - uint8 *p = line; - uint8 *d = dline; - switch(img->depth){ - case 4: case 8: - conv_RGBA8888_from_RGBA8888(rgba, &img->palette[p[0]*4]); - break; - case 32: - conv_RGBA8888_from_RGBA8888(rgba, p); - break; - case 24: - conv_RGBA8888_from_RGB888(rgba, p); - break; - case 16: - conv_RGBA8888_from_ARGB1555(rgba, p); - break; - default: assert(0 && "invalid depth"); - } - - col.red = rgba[0]; - col.green = rgba[1]; - col.blue = rgba[2]; - col.alpha = rgba[3]; - *d = this->findColor(col); - - line += img->bpp; - dline++; - } - pixels += img->stride; - dstPixels += dstStride; - } -} - - - -} diff --git a/vendor/librw/src/light.cpp b/vendor/librw/src/light.cpp deleted file mode 100644 index ca68cda..0000000 --- a/vendor/librw/src/light.cpp +++ /dev/null @@ -1,163 +0,0 @@ -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -#define PLUGIN_ID ID_LIGHT - -namespace rw { - -int32 Light::numAllocated; - -PluginList Light::s_plglist(sizeof(Light)); - -static void -lightSync(ObjectWithFrame*) -{ -} - -static void -worldLightSync(ObjectWithFrame *obj) -{ - Light *light = (Light*)obj; - light->originalSync(obj); -} - -Light* -Light::create(int32 type) -{ - Light *light = (Light*)rwMalloc(s_plglist.size, MEMDUR_EVENT | ID_LIGHT); - if(light == nil){ - RWERROR((ERR_ALLOC, s_plglist.size)); - return nil; - } - numAllocated++; - light->object.object.init(Light::ID, type); - light->object.syncCB = lightSync; - light->radius = 0.0f; - light->color.red = 1.0f; - light->color.green = 1.0f; - light->color.blue = 1.0f; - light->color.alpha = 1.0f; - light->minusCosAngle = 1.0f; - light->object.object.privateFlags = 1; - light->object.object.flags = LIGHTATOMICS | LIGHTWORLD; - light->inWorld.init(); - - // clump extension - light->clump = nil; - light->inClump.init(); - - // world extension - light->world = nil; - light->originalSync = light->object.syncCB; - light->object.syncCB = worldLightSync; - - s_plglist.construct(light); - return light; -} - -void -Light::destroy(void) -{ - s_plglist.destruct(this); - assert(this->clump == nil); - assert(this->world == nil); - this->setFrame(nil); - rwFree(this); - numAllocated--; -} - -void -Light::setAngle(float32 angle) -{ - this->minusCosAngle = -cosf(angle); -} - -float32 -Light::getAngle(void) -{ - return acosf(-this->minusCosAngle); -} - -void -Light::setColor(float32 r, float32 g, float32 b) -{ - this->color.red = r; - this->color.green = g; - this->color.blue = b; - this->object.object.privateFlags = r == g && r == b; -} - -struct LightChunkData -{ - float32 radius; - float32 red, green, blue; - float32 minusCosAngle; - uint32 type_flags; -}; - -Light* -Light::streamRead(Stream *stream) -{ - uint32 version; - LightChunkData buf; - - if(!findChunk(stream, ID_STRUCT, nil, &version)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - stream->read32(&buf, sizeof(LightChunkData)); - Light *light = Light::create(buf.type_flags>>16); - if(light == nil) - return nil; - light->radius = buf.radius; - light->setColor(buf.red, buf.green, buf.blue); - float32 a = buf.minusCosAngle; - if(version >= 0x30300) - light->minusCosAngle = a; - else - // tan -> -cos - light->minusCosAngle = -1.0f/sqrtf(a*a+1.0f); - light->object.object.flags = (uint8)buf.type_flags; - if(s_plglist.streamRead(stream, light)) - return light; - light->destroy(); - return nil; -} - -bool -Light::streamWrite(Stream *stream) -{ - LightChunkData buf; - writeChunkHeader(stream, ID_LIGHT, this->streamGetSize()); - writeChunkHeader(stream, ID_STRUCT, sizeof(LightChunkData)); - buf.radius = this->radius; - buf.red = this->color.red; - buf.green = this->color.green; - buf.blue = this->color.blue; - if(version >= 0x30300) - buf.minusCosAngle = this->minusCosAngle; - else - buf.minusCosAngle = tanf(acosf(-this->minusCosAngle)); - buf.type_flags = (uint32)this->object.object.flags | - (uint32)this->object.object.subType << 16; - stream->write32(&buf, sizeof(LightChunkData)); - - s_plglist.streamWrite(stream, this); - return true; -} - -uint32 -Light::streamGetSize(void) -{ - return 12 + sizeof(LightChunkData) + 12 + s_plglist.streamGetSize(this); -} - -} diff --git a/vendor/librw/src/lodepng/lodepng.cpp b/vendor/librw/src/lodepng/lodepng.cpp deleted file mode 100644 index ee8cf33..0000000 --- a/vendor/librw/src/lodepng/lodepng.cpp +++ /dev/null @@ -1,6410 +0,0 @@ -/* -LodePNG version 20200306 - -Copyright (c) 2005-2020 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ - -/* -The manual and changelog are in the header file "lodepng.h" -Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. -*/ - -#include "lodepng.h" - -#ifdef LODEPNG_COMPILE_DISK -#include /* LONG_MAX */ -#include /* file handling */ -#endif /* LODEPNG_COMPILE_DISK */ - -#ifdef LODEPNG_COMPILE_ALLOCATORS -#include /* allocations */ -#endif /* LODEPNG_COMPILE_ALLOCATORS */ - -#if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/ -#pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/ -#pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/ -#endif /*_MSC_VER */ - -const char* LODEPNG_VERSION_STRING = "20200306"; - -/* -This source file is built up in the following large parts. The code sections -with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. --Tools for C and common code for PNG and Zlib --C Code for Zlib (huffman, deflate, ...) --C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) --The C++ wrapper around all of the above -*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // Tools for C, and common code for PNG and Zlib. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*The malloc, realloc and free functions defined here with "lodepng_" in front -of the name, so that you can easily change them to others related to your -platform if needed. Everything else in the code calls these. Pass --DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out -#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and -define them in your own project's source files without needing to change -lodepng source code. Don't forget to remove "static" if you copypaste them -from here.*/ - -#ifdef LODEPNG_COMPILE_ALLOCATORS -static void* lodepng_malloc(size_t size) { -#ifdef LODEPNG_MAX_ALLOC - if(size > LODEPNG_MAX_ALLOC) return 0; -#endif - return malloc(size); -} - -/* NOTE: when realloc returns NULL, it leaves the original memory untouched */ -static void* lodepng_realloc(void* ptr, size_t new_size) { -#ifdef LODEPNG_MAX_ALLOC - if(new_size > LODEPNG_MAX_ALLOC) return 0; -#endif - return realloc(ptr, new_size); -} - -static void lodepng_free(void* ptr) { - free(ptr); -} -#else /*LODEPNG_COMPILE_ALLOCATORS*/ -/* TODO: support giving additional void* payload to the custom allocators */ -void* lodepng_malloc(size_t size); -void* lodepng_realloc(void* ptr, size_t new_size); -void lodepng_free(void* ptr); -#endif /*LODEPNG_COMPILE_ALLOCATORS*/ - -/* convince the compiler to inline a function, for use when this measurably improves performance */ -/* inline is not available in C90, but use it when supported by the compiler */ -#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || (defined(__cplusplus) && (__cplusplus >= 199711L)) -#define LODEPNG_INLINE inline -#else -#define LODEPNG_INLINE /* not available */ -#endif - -/* restrict is not available in C90, but use it when supported by the compiler */ -#if (defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) ||\ - (defined(_MSC_VER) && (_MSC_VER >= 1400)) || \ - (defined(__WATCOMC__) && (__WATCOMC__ >= 1250) && !defined(__cplusplus)) -#define LODEPNG_RESTRICT __restrict -#else -#define LODEPNG_RESTRICT /* not available */ -#endif - -/* Replacements for C library functions such as memcpy and strlen, to support platforms -where a full C library is not available. The compiler can recognize them and compile -to something as fast. */ - -static void lodepng_memcpy(void* LODEPNG_RESTRICT dst, - const void* LODEPNG_RESTRICT src, size_t size) { - size_t i; - for(i = 0; i < size; i++) ((char*)dst)[i] = ((const char*)src)[i]; -} - -static void lodepng_memset(void* LODEPNG_RESTRICT dst, - int value, size_t num) { - size_t i; - for(i = 0; i < num; i++) ((char*)dst)[i] = (char)value; -} - -/* does not check memory out of bounds, do not use on untrusted data */ -static size_t lodepng_strlen(const char* a) { - const char* orig = a; - /* avoid warning about unused function in case of disabled COMPILE... macros */ - (void)(&lodepng_strlen); - while(*a) a++; - return (size_t)(a - orig); -} - -#define LODEPNG_MAX(a, b) (((a) > (b)) ? (a) : (b)) -#define LODEPNG_MIN(a, b) (((a) < (b)) ? (a) : (b)) -#define LODEPNG_ABS(x) ((x) < 0 ? -(x) : (x)) - -#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER) -/* Safely check if adding two integers will overflow (no undefined -behavior, compiler removing the code, etc...) and output result. */ -static int lodepng_addofl(size_t a, size_t b, size_t* result) { - *result = a + b; /* Unsigned addition is well defined and safe in C90 */ - return *result < a; -} -#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER)*/ - -#ifdef LODEPNG_COMPILE_DECODER -/* Safely check if multiplying two integers will overflow (no undefined -behavior, compiler removing the code, etc...) and output result. */ -static int lodepng_mulofl(size_t a, size_t b, size_t* result) { - *result = a * b; /* Unsigned multiplication is well defined and safe in C90 */ - return (a != 0 && *result / a != b); -} - -#ifdef LODEPNG_COMPILE_ZLIB -/* Safely check if a + b > c, even if overflow could happen. */ -static int lodepng_gtofl(size_t a, size_t b, size_t c) { - size_t d; - if(lodepng_addofl(a, b, &d)) return 1; - return d > c; -} -#endif /*LODEPNG_COMPILE_ZLIB*/ -#endif /*LODEPNG_COMPILE_DECODER*/ - - -/* -Often in case of an error a value is assigned to a variable and then it breaks -out of a loop (to go to the cleanup phase of a function). This macro does that. -It makes the error handling code shorter and more readable. - -Example: if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83); -*/ -#define CERROR_BREAK(errorvar, code){\ - errorvar = code;\ - break;\ -} - -/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ -#define ERROR_BREAK(code) CERROR_BREAK(error, code) - -/*Set error var to the error code, and return it.*/ -#define CERROR_RETURN_ERROR(errorvar, code){\ - errorvar = code;\ - return code;\ -} - -/*Try the code, if it returns error, also return the error.*/ -#define CERROR_TRY_RETURN(call){\ - unsigned error = call;\ - if(error) return error;\ -} - -/*Set error var to the error code, and return from the void function.*/ -#define CERROR_RETURN(errorvar, code){\ - errorvar = code;\ - return;\ -} - -/* -About uivector, ucvector and string: --All of them wrap dynamic arrays or text strings in a similar way. --LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. --The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. --They're not used in the interface, only internally in this file as static functions. --As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. -*/ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_ENCODER -/*dynamic vector of unsigned ints*/ -typedef struct uivector { - unsigned* data; - size_t size; /*size in number of unsigned longs*/ - size_t allocsize; /*allocated size in bytes*/ -} uivector; - -static void uivector_cleanup(void* p) { - ((uivector*)p)->size = ((uivector*)p)->allocsize = 0; - lodepng_free(((uivector*)p)->data); - ((uivector*)p)->data = NULL; -} - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_resize(uivector* p, size_t size) { - size_t allocsize = size * sizeof(unsigned); - if(allocsize > p->allocsize) { - size_t newsize = allocsize + (p->allocsize >> 1u); - void* data = lodepng_realloc(p->data, newsize); - if(data) { - p->allocsize = newsize; - p->data = (unsigned*)data; - } - else return 0; /*error: not enough memory*/ - } - p->size = size; - return 1; /*success*/ -} - -static void uivector_init(uivector* p) { - p->data = NULL; - p->size = p->allocsize = 0; -} - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_push_back(uivector* p, unsigned c) { - if(!uivector_resize(p, p->size + 1)) return 0; - p->data[p->size - 1] = c; - return 1; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_ZLIB*/ - -/* /////////////////////////////////////////////////////////////////////////// */ - -/*dynamic vector of unsigned chars*/ -typedef struct ucvector { - unsigned char* data; - size_t size; /*used size*/ - size_t allocsize; /*allocated size*/ -} ucvector; - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned ucvector_resize(ucvector* p, size_t size) { - if(size > p->allocsize) { - size_t newsize = size + (p->allocsize >> 1u); - void* data = lodepng_realloc(p->data, newsize); - if(data) { - p->allocsize = newsize; - p->data = (unsigned char*)data; - } - else return 0; /*error: not enough memory*/ - } - p->size = size; - return 1; /*success*/ -} - -static ucvector ucvector_init(unsigned char* buffer, size_t size) { - ucvector v; - v.data = buffer; - v.allocsize = v.size = size; - return v; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_PNG -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -/*free string pointer and set it to NULL*/ -static void string_cleanup(char** out) { - lodepng_free(*out); - *out = NULL; -} - -static char* alloc_string_sized(const char* in, size_t insize) { - char* out = (char*)lodepng_malloc(insize + 1); - if(out) { - lodepng_memcpy(out, in, insize); - out[insize] = 0; - } - return out; -} - -/* dynamically allocates a new string with a copy of the null terminated input text */ -static char* alloc_string(const char* in) { - return alloc_string_sized(in, lodepng_strlen(in)); -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG) -static unsigned lodepng_read32bitInt(const unsigned char* buffer) { - return (((unsigned)buffer[0] << 24u) | ((unsigned)buffer[1] << 16u) | - ((unsigned)buffer[2] << 8u) | (unsigned)buffer[3]); -} -#endif /*defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG)*/ - -#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) -/*buffer must have at least 4 allocated bytes available*/ -static void lodepng_set32bitInt(unsigned char* buffer, unsigned value) { - buffer[0] = (unsigned char)((value >> 24) & 0xff); - buffer[1] = (unsigned char)((value >> 16) & 0xff); - buffer[2] = (unsigned char)((value >> 8) & 0xff); - buffer[3] = (unsigned char)((value ) & 0xff); -} -#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / File IO / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_DISK - -/* returns negative value on error. This should be pure C compatible, so no fstat. */ -static long lodepng_filesize(const char* filename) { - FILE* file; - long size; - file = fopen(filename, "rb"); - if(!file) return -1; - - if(fseek(file, 0, SEEK_END) != 0) { - fclose(file); - return -1; - } - - size = ftell(file); - /* It may give LONG_MAX as directory size, this is invalid for us. */ - if(size == LONG_MAX) size = -1; - - fclose(file); - return size; -} - -/* load file into buffer that already has the correct allocated size. Returns error code.*/ -static unsigned lodepng_buffer_file(unsigned char* out, size_t size, const char* filename) { - FILE* file; - size_t readsize; - file = fopen(filename, "rb"); - if(!file) return 78; - - readsize = fread(out, 1, size, file); - fclose(file); - - if(readsize != size) return 78; - return 0; -} - -unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) { - long size = lodepng_filesize(filename); - if(size < 0) return 78; - *outsize = (size_t)size; - - *out = (unsigned char*)lodepng_malloc((size_t)size); - if(!(*out) && size > 0) return 83; /*the above malloc failed*/ - - return lodepng_buffer_file(*out, (size_t)size, filename); -} - -/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ -unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) { - FILE* file; - file = fopen(filename, "wb" ); - if(!file) return 79; - fwrite(buffer, 1, buffersize, file); - fclose(file); - return 0; -} - -#endif /*LODEPNG_COMPILE_DISK*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // End of common code and tools. Begin of Zlib related code. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_ENCODER - -typedef struct { - ucvector* data; - unsigned char bp; /*ok to overflow, indicates bit pos inside byte*/ -} LodePNGBitWriter; - -static void LodePNGBitWriter_init(LodePNGBitWriter* writer, ucvector* data) { - writer->data = data; - writer->bp = 0; -} - -/*TODO: this ignores potential out of memory errors*/ -#define WRITEBIT(writer, bit){\ - /* append new byte */\ - if(((writer->bp) & 7u) == 0) {\ - if(!ucvector_resize(writer->data, writer->data->size + 1)) return;\ - writer->data->data[writer->data->size - 1] = 0;\ - }\ - (writer->data->data[writer->data->size - 1]) |= (bit << ((writer->bp) & 7u));\ - ++writer->bp;\ -} - -/* LSB of value is written first, and LSB of bytes is used first */ -static void writeBits(LodePNGBitWriter* writer, unsigned value, size_t nbits) { - if(nbits == 1) { /* compiler should statically compile this case if nbits == 1 */ - WRITEBIT(writer, value); - } else { - /* TODO: increase output size only once here rather than in each WRITEBIT */ - size_t i; - for(i = 0; i != nbits; ++i) { - WRITEBIT(writer, (unsigned char)((value >> i) & 1)); - } - } -} - -/* This one is to use for adding huffman symbol, the value bits are written MSB first */ -static void writeBitsReversed(LodePNGBitWriter* writer, unsigned value, size_t nbits) { - size_t i; - for(i = 0; i != nbits; ++i) { - /* TODO: increase output size only once here rather than in each WRITEBIT */ - WRITEBIT(writer, (unsigned char)((value >> (nbits - 1u - i)) & 1u)); - } -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -typedef struct { - const unsigned char* data; - size_t size; /*size of data in bytes*/ - size_t bitsize; /*size of data in bits, end of valid bp values, should be 8*size*/ - size_t bp; - unsigned buffer; /*buffer for reading bits. NOTE: 'unsigned' must support at least 32 bits*/ -} LodePNGBitReader; - -/* data size argument is in bytes. Returns error if size too large causing overflow */ -static unsigned LodePNGBitReader_init(LodePNGBitReader* reader, const unsigned char* data, size_t size) { - size_t temp; - reader->data = data; - reader->size = size; - /* size in bits, return error if overflow (if size_t is 32 bit this supports up to 500MB) */ - if(lodepng_mulofl(size, 8u, &reader->bitsize)) return 105; - /*ensure incremented bp can be compared to bitsize without overflow even when it would be incremented 32 too much and - trying to ensure 32 more bits*/ - if(lodepng_addofl(reader->bitsize, 64u, &temp)) return 105; - reader->bp = 0; - reader->buffer = 0; - return 0; /*ok*/ -} - -/* -ensureBits functions: -Ensures the reader can at least read nbits bits in one or more readBits calls, -safely even if not enough bits are available. -Returns 1 if there are enough bits available, 0 if not. -*/ - -/*See ensureBits documentation above. This one ensures exactly 1 bit */ -/*static unsigned ensureBits1(LodePNGBitReader* reader) { - if(reader->bp >= reader->bitsize) return 0; - reader->buffer = (unsigned)reader->data[reader->bp >> 3u] >> (reader->bp & 7u); - return 1; -}*/ - -/*See ensureBits documentation above. This one ensures up to 9 bits */ -static unsigned ensureBits9(LodePNGBitReader* reader, size_t nbits) { - size_t start = reader->bp >> 3u; - size_t size = reader->size; - if(start + 1u < size) { - reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u); - reader->buffer >>= (reader->bp & 7u); - return 1; - } else { - reader->buffer = 0; - if(start + 0u < size) reader->buffer |= reader->data[start + 0]; - reader->buffer >>= (reader->bp & 7u); - return reader->bp + nbits <= reader->bitsize; - } -} - -/*See ensureBits documentation above. This one ensures up to 17 bits */ -static unsigned ensureBits17(LodePNGBitReader* reader, size_t nbits) { - size_t start = reader->bp >> 3u; - size_t size = reader->size; - if(start + 2u < size) { - reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | - ((unsigned)reader->data[start + 2] << 16u); - reader->buffer >>= (reader->bp & 7u); - return 1; - } else { - reader->buffer = 0; - if(start + 0u < size) reader->buffer |= reader->data[start + 0]; - if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); - reader->buffer >>= (reader->bp & 7u); - return reader->bp + nbits <= reader->bitsize; - } -} - -/*See ensureBits documentation above. This one ensures up to 25 bits */ -static LODEPNG_INLINE unsigned ensureBits25(LodePNGBitReader* reader, size_t nbits) { - size_t start = reader->bp >> 3u; - size_t size = reader->size; - if(start + 3u < size) { - reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | - ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u); - reader->buffer >>= (reader->bp & 7u); - return 1; - } else { - reader->buffer = 0; - if(start + 0u < size) reader->buffer |= reader->data[start + 0]; - if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); - if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u); - reader->buffer >>= (reader->bp & 7u); - return reader->bp + nbits <= reader->bitsize; - } -} - -/*See ensureBits documentation above. This one ensures up to 32 bits */ -static LODEPNG_INLINE unsigned ensureBits32(LodePNGBitReader* reader, size_t nbits) { - size_t start = reader->bp >> 3u; - size_t size = reader->size; - if(start + 4u < size) { - reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | - ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u); - reader->buffer >>= (reader->bp & 7u); - reader->buffer |= (((unsigned)reader->data[start + 4] << 24u) << (8u - (reader->bp & 7u))); - return 1; - } else { - reader->buffer = 0; - if(start + 0u < size) reader->buffer |= reader->data[start + 0]; - if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); - if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u); - if(start + 3u < size) reader->buffer |= ((unsigned)reader->data[start + 3] << 24u); - reader->buffer >>= (reader->bp & 7u); - return reader->bp + nbits <= reader->bitsize; - } -} - -/* Get bits without advancing the bit pointer. Must have enough bits available with ensureBits. Max nbits is 31. */ -static unsigned peekBits(LodePNGBitReader* reader, size_t nbits) { - /* The shift allows nbits to be only up to 31. */ - return reader->buffer & ((1u << nbits) - 1u); -} - -/* Must have enough bits available with ensureBits */ -static void advanceBits(LodePNGBitReader* reader, size_t nbits) { - reader->buffer >>= nbits; - reader->bp += nbits; -} - -/* Must have enough bits available with ensureBits */ -static unsigned readBits(LodePNGBitReader* reader, size_t nbits) { - unsigned result = peekBits(reader, nbits); - advanceBits(reader, nbits); - return result; -} - -/* Public for testing only. steps and result must have numsteps values. */ -unsigned lode_png_test_bitreader(const unsigned char* data, size_t size, - size_t numsteps, const size_t* steps, unsigned* result) { - size_t i; - LodePNGBitReader reader; - unsigned error = LodePNGBitReader_init(&reader, data, size); - if(error) return 0; - for(i = 0; i < numsteps; i++) { - size_t step = steps[i]; - unsigned ok; - if(step > 25) ok = ensureBits32(&reader, step); - else if(step > 17) ok = ensureBits25(&reader, step); - else if(step > 9) ok = ensureBits17(&reader, step); - else ok = ensureBits9(&reader, step); - if(!ok) return 0; - result[i] = readBits(&reader, step); - } - return 1; -} -#endif /*LODEPNG_COMPILE_DECODER*/ - -static unsigned reverseBits(unsigned bits, unsigned num) { - /*TODO: implement faster lookup table based version when needed*/ - unsigned i, result = 0; - for(i = 0; i < num; i++) result |= ((bits >> (num - i - 1u)) & 1u) << i; - return result; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Deflate - Huffman / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#define FIRST_LENGTH_CODE_INDEX 257 -#define LAST_LENGTH_CODE_INDEX 285 -/*256 literals, the end code, some length codes, and 2 unused codes*/ -#define NUM_DEFLATE_CODE_SYMBOLS 288 -/*the distance codes have their own symbols, 30 used, 2 unused*/ -#define NUM_DISTANCE_SYMBOLS 32 -/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ -#define NUM_CODE_LENGTH_CODES 19 - -/*the base lengths represented by codes 257-285*/ -static const unsigned LENGTHBASE[29] - = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, - 67, 83, 99, 115, 131, 163, 195, 227, 258}; - -/*the extra bits used by codes 257-285 (added to base length)*/ -static const unsigned LENGTHEXTRA[29] - = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, - 4, 4, 4, 4, 5, 5, 5, 5, 0}; - -/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ -static const unsigned DISTANCEBASE[30] - = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, - 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; - -/*the extra bits of backwards distances (added to base)*/ -static const unsigned DISTANCEEXTRA[30] - = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, - 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; - -/*the order in which "code length alphabet code lengths" are stored as specified by deflate, out of this the huffman -tree of the dynamic huffman tree lengths is generated*/ -static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] - = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - -/* ////////////////////////////////////////////////////////////////////////// */ - -/* -Huffman tree struct, containing multiple representations of the tree -*/ -typedef struct HuffmanTree { - unsigned* codes; /*the huffman codes (bit patterns representing the symbols)*/ - unsigned* lengths; /*the lengths of the huffman codes*/ - unsigned maxbitlen; /*maximum number of bits a single code can get*/ - unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ - /* for reading only */ - unsigned char* table_len; /*length of symbol from lookup table, or max length if secondary lookup needed*/ - unsigned short* table_value; /*value of symbol from lookup table, or pointer to secondary table if needed*/ -} HuffmanTree; - -static void HuffmanTree_init(HuffmanTree* tree) { - tree->codes = 0; - tree->lengths = 0; - tree->table_len = 0; - tree->table_value = 0; -} - -static void HuffmanTree_cleanup(HuffmanTree* tree) { - lodepng_free(tree->codes); - lodepng_free(tree->lengths); - lodepng_free(tree->table_len); - lodepng_free(tree->table_value); -} - -/* amount of bits for first huffman table lookup (aka root bits), see HuffmanTree_makeTable and huffmanDecodeSymbol.*/ -/* values 8u and 9u work the fastest */ -#define FIRSTBITS 9u - -/* a symbol value too big to represent any valid symbol, to indicate reading disallowed huffman bits combination, -which is possible in case of only 0 or 1 present symbols. */ -#define INVALIDSYMBOL 65535u - -/* make table for huffman decoding */ -static unsigned HuffmanTree_makeTable(HuffmanTree* tree) { - static const unsigned headsize = 1u << FIRSTBITS; /*size of the first table*/ - static const unsigned mask = (1u << FIRSTBITS) /*headsize*/ - 1u; - size_t i, numpresent, pointer, size; /*total table size*/ - unsigned* maxlens = (unsigned*)lodepng_malloc(headsize * sizeof(unsigned)); - if(!maxlens) return 83; /*alloc fail*/ - - /* compute maxlens: max total bit length of symbols sharing prefix in the first table*/ - lodepng_memset(maxlens, 0, headsize * sizeof(*maxlens)); - for(i = 0; i < tree->numcodes; i++) { - unsigned symbol = tree->codes[i]; - unsigned l = tree->lengths[i]; - unsigned index; - if(l <= FIRSTBITS) continue; /*symbols that fit in first table don't increase secondary table size*/ - /*get the FIRSTBITS MSBs, the MSBs of the symbol are encoded first. See later comment about the reversing*/ - index = reverseBits(symbol >> (l - FIRSTBITS), FIRSTBITS); - maxlens[index] = LODEPNG_MAX(maxlens[index], l); - } - /* compute total table size: size of first table plus all secondary tables for symbols longer than FIRSTBITS */ - size = headsize; - for(i = 0; i < headsize; ++i) { - unsigned l = maxlens[i]; - if(l > FIRSTBITS) size += (1u << (l - FIRSTBITS)); - } - tree->table_len = (unsigned char*)lodepng_malloc(size * sizeof(*tree->table_len)); - tree->table_value = (unsigned short*)lodepng_malloc(size * sizeof(*tree->table_value)); - if(!tree->table_len || !tree->table_value) { - lodepng_free(maxlens); - /* freeing tree->table values is done at a higher scope */ - return 83; /*alloc fail*/ - } - /*initialize with an invalid length to indicate unused entries*/ - for(i = 0; i < size; ++i) tree->table_len[i] = 16; - - /*fill in the first table for long symbols: max prefix size and pointer to secondary tables*/ - pointer = headsize; - for(i = 0; i < headsize; ++i) { - unsigned l = maxlens[i]; - if(l <= FIRSTBITS) continue; - tree->table_len[i] = l; - tree->table_value[i] = pointer; - pointer += (1u << (l - FIRSTBITS)); - } - lodepng_free(maxlens); - - /*fill in the first table for short symbols, or secondary table for long symbols*/ - numpresent = 0; - for(i = 0; i < tree->numcodes; ++i) { - unsigned l = tree->lengths[i]; - unsigned symbol = tree->codes[i]; /*the huffman bit pattern. i itself is the value.*/ - /*reverse bits, because the huffman bits are given in MSB first order but the bit reader reads LSB first*/ - unsigned reverse = reverseBits(symbol, l); - if(l == 0) continue; - numpresent++; - - if(l <= FIRSTBITS) { - /*short symbol, fully in first table, replicated num times if l < FIRSTBITS*/ - unsigned num = 1u << (FIRSTBITS - l); - unsigned j; - for(j = 0; j < num; ++j) { - /*bit reader will read the l bits of symbol first, the remaining FIRSTBITS - l bits go to the MSB's*/ - unsigned index = reverse | (j << l); - if(tree->table_len[index] != 16) return 55; /*invalid tree: long symbol shares prefix with short symbol*/ - tree->table_len[index] = l; - tree->table_value[index] = i; - } - } else { - /*long symbol, shares prefix with other long symbols in first lookup table, needs second lookup*/ - /*the FIRSTBITS MSBs of the symbol are the first table index*/ - unsigned index = reverse & mask; - unsigned maxlen = tree->table_len[index]; - /*log2 of secondary table length, should be >= l - FIRSTBITS*/ - unsigned tablelen = maxlen - FIRSTBITS; - unsigned start = tree->table_value[index]; /*starting index in secondary table*/ - unsigned num = 1u << (tablelen - (l - FIRSTBITS)); /*amount of entries of this symbol in secondary table*/ - unsigned j; - if(maxlen < l) return 55; /*invalid tree: long symbol shares prefix with short symbol*/ - for(j = 0; j < num; ++j) { - unsigned reverse2 = reverse >> FIRSTBITS; /* l - FIRSTBITS bits */ - unsigned index2 = start + (reverse2 | (j << (l - FIRSTBITS))); - tree->table_len[index2] = l; - tree->table_value[index2] = i; - } - } - } - - if(numpresent < 2) { - /* In case of exactly 1 symbol, in theory the huffman symbol needs 0 bits, - but deflate uses 1 bit instead. In case of 0 symbols, no symbols can - appear at all, but such huffman tree could still exist (e.g. if distance - codes are never used). In both cases, not all symbols of the table will be - filled in. Fill them in with an invalid symbol value so returning them from - huffmanDecodeSymbol will cause error. */ - for(i = 0; i < size; ++i) { - if(tree->table_len[i] == 16) { - /* As length, use a value smaller than FIRSTBITS for the head table, - and a value larger than FIRSTBITS for the secondary table, to ensure - valid behavior for advanceBits when reading this symbol. */ - tree->table_len[i] = (i < headsize) ? 1 : (FIRSTBITS + 1); - tree->table_value[i] = INVALIDSYMBOL; - } - } - } else { - /* A good huffman tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. - If that is not the case (due to too long length codes), the table will not - have been fully used, and this is an error (not all bit combinations can be - decoded): an oversubscribed huffman tree, indicated by error 55. */ - for(i = 0; i < size; ++i) { - if(tree->table_len[i] == 16) return 55; - } - } - - return 0; -} - -/* -Second step for the ...makeFromLengths and ...makeFromFrequencies functions. -numcodes, lengths and maxbitlen must already be filled in correctly. return -value is error. -*/ -static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) { - unsigned* blcount; - unsigned* nextcode; - unsigned error = 0; - unsigned bits, n; - - tree->codes = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned)); - blcount = (unsigned*)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned)); - nextcode = (unsigned*)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned)); - if(!tree->codes || !blcount || !nextcode) error = 83; /*alloc fail*/ - - if(!error) { - for(n = 0; n != tree->maxbitlen + 1; n++) blcount[n] = nextcode[n] = 0; - /*step 1: count number of instances of each code length*/ - for(bits = 0; bits != tree->numcodes; ++bits) ++blcount[tree->lengths[bits]]; - /*step 2: generate the nextcode values*/ - for(bits = 1; bits <= tree->maxbitlen; ++bits) { - nextcode[bits] = (nextcode[bits - 1] + blcount[bits - 1]) << 1u; - } - /*step 3: generate all the codes*/ - for(n = 0; n != tree->numcodes; ++n) { - if(tree->lengths[n] != 0) { - tree->codes[n] = nextcode[tree->lengths[n]]++; - /*remove superfluous bits from the code*/ - tree->codes[n] &= ((1u << tree->lengths[n]) - 1u); - } - } - } - - lodepng_free(blcount); - lodepng_free(nextcode); - - if(!error) error = HuffmanTree_makeTable(tree); - return error; -} - -/* -given the code lengths (as stored in the PNG file), generate the tree as defined -by Deflate. maxbitlen is the maximum bits that a code in the tree can have. -return value is error. -*/ -static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen, - size_t numcodes, unsigned maxbitlen) { - unsigned i; - tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); - if(!tree->lengths) return 83; /*alloc fail*/ - for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i]; - tree->numcodes = (unsigned)numcodes; /*number of symbols*/ - tree->maxbitlen = maxbitlen; - return HuffmanTree_makeFromLengths2(tree); -} - -#ifdef LODEPNG_COMPILE_ENCODER - -/*BPM: Boundary Package Merge, see "A Fast and Space-Economical Algorithm for Length-Limited Coding", -Jyrki Katajainen, Alistair Moffat, Andrew Turpin, 1995.*/ - -/*chain node for boundary package merge*/ -typedef struct BPMNode { - int weight; /*the sum of all weights in this chain*/ - unsigned index; /*index of this leaf node (called "count" in the paper)*/ - struct BPMNode* tail; /*the next nodes in this chain (null if last)*/ - int in_use; -} BPMNode; - -/*lists of chains*/ -typedef struct BPMLists { - /*memory pool*/ - unsigned memsize; - BPMNode* memory; - unsigned numfree; - unsigned nextfree; - BPMNode** freelist; - /*two heads of lookahead chains per list*/ - unsigned listsize; - BPMNode** chains0; - BPMNode** chains1; -} BPMLists; - -/*creates a new chain node with the given parameters, from the memory in the lists */ -static BPMNode* bpmnode_create(BPMLists* lists, int weight, unsigned index, BPMNode* tail) { - unsigned i; - BPMNode* result; - - /*memory full, so garbage collect*/ - if(lists->nextfree >= lists->numfree) { - /*mark only those that are in use*/ - for(i = 0; i != lists->memsize; ++i) lists->memory[i].in_use = 0; - for(i = 0; i != lists->listsize; ++i) { - BPMNode* node; - for(node = lists->chains0[i]; node != 0; node = node->tail) node->in_use = 1; - for(node = lists->chains1[i]; node != 0; node = node->tail) node->in_use = 1; - } - /*collect those that are free*/ - lists->numfree = 0; - for(i = 0; i != lists->memsize; ++i) { - if(!lists->memory[i].in_use) lists->freelist[lists->numfree++] = &lists->memory[i]; - } - lists->nextfree = 0; - } - - result = lists->freelist[lists->nextfree++]; - result->weight = weight; - result->index = index; - result->tail = tail; - return result; -} - -/*sort the leaves with stable mergesort*/ -static void bpmnode_sort(BPMNode* leaves, size_t num) { - BPMNode* mem = (BPMNode*)lodepng_malloc(sizeof(*leaves) * num); - size_t width, counter = 0; - for(width = 1; width < num; width *= 2) { - BPMNode* a = (counter & 1) ? mem : leaves; - BPMNode* b = (counter & 1) ? leaves : mem; - size_t p; - for(p = 0; p < num; p += 2 * width) { - size_t q = (p + width > num) ? num : (p + width); - size_t r = (p + 2 * width > num) ? num : (p + 2 * width); - size_t i = p, j = q, k; - for(k = p; k < r; k++) { - if(i < q && (j >= r || a[i].weight <= a[j].weight)) b[k] = a[i++]; - else b[k] = a[j++]; - } - } - counter++; - } - if(counter & 1) lodepng_memcpy(leaves, mem, sizeof(*leaves) * num); - lodepng_free(mem); -} - -/*Boundary Package Merge step, numpresent is the amount of leaves, and c is the current chain.*/ -static void boundaryPM(BPMLists* lists, BPMNode* leaves, size_t numpresent, int c, int num) { - unsigned lastindex = lists->chains1[c]->index; - - if(c == 0) { - if(lastindex >= numpresent) return; - lists->chains0[c] = lists->chains1[c]; - lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, 0); - } else { - /*sum of the weights of the head nodes of the previous lookahead chains.*/ - int sum = lists->chains0[c - 1]->weight + lists->chains1[c - 1]->weight; - lists->chains0[c] = lists->chains1[c]; - if(lastindex < numpresent && sum > leaves[lastindex].weight) { - lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, lists->chains1[c]->tail); - return; - } - lists->chains1[c] = bpmnode_create(lists, sum, lastindex, lists->chains1[c - 1]); - /*in the end we are only interested in the chain of the last list, so no - need to recurse if we're at the last one (this gives measurable speedup)*/ - if(num + 1 < (int)(2 * numpresent - 2)) { - boundaryPM(lists, leaves, numpresent, c - 1, num); - boundaryPM(lists, leaves, numpresent, c - 1, num); - } - } -} - -unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, - size_t numcodes, unsigned maxbitlen) { - unsigned error = 0; - unsigned i; - size_t numpresent = 0; /*number of symbols with non-zero frequency*/ - BPMNode* leaves; /*the symbols, only those with > 0 frequency*/ - - if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ - if((1u << maxbitlen) < (unsigned)numcodes) return 80; /*error: represent all symbols*/ - - leaves = (BPMNode*)lodepng_malloc(numcodes * sizeof(*leaves)); - if(!leaves) return 83; /*alloc fail*/ - - for(i = 0; i != numcodes; ++i) { - if(frequencies[i] > 0) { - leaves[numpresent].weight = (int)frequencies[i]; - leaves[numpresent].index = i; - ++numpresent; - } - } - - lodepng_memset(lengths, 0, numcodes * sizeof(*lengths)); - - /*ensure at least two present symbols. There should be at least one symbol - according to RFC 1951 section 3.2.7. Some decoders incorrectly require two. To - make these work as well ensure there are at least two symbols. The - Package-Merge code below also doesn't work correctly if there's only one - symbol, it'd give it the theoretical 0 bits but in practice zlib wants 1 bit*/ - if(numpresent == 0) { - lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ - } else if(numpresent == 1) { - lengths[leaves[0].index] = 1; - lengths[leaves[0].index == 0 ? 1 : 0] = 1; - } else { - BPMLists lists; - BPMNode* node; - - bpmnode_sort(leaves, numpresent); - - lists.listsize = maxbitlen; - lists.memsize = 2 * maxbitlen * (maxbitlen + 1); - lists.nextfree = 0; - lists.numfree = lists.memsize; - lists.memory = (BPMNode*)lodepng_malloc(lists.memsize * sizeof(*lists.memory)); - lists.freelist = (BPMNode**)lodepng_malloc(lists.memsize * sizeof(BPMNode*)); - lists.chains0 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*)); - lists.chains1 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*)); - if(!lists.memory || !lists.freelist || !lists.chains0 || !lists.chains1) error = 83; /*alloc fail*/ - - if(!error) { - for(i = 0; i != lists.memsize; ++i) lists.freelist[i] = &lists.memory[i]; - - bpmnode_create(&lists, leaves[0].weight, 1, 0); - bpmnode_create(&lists, leaves[1].weight, 2, 0); - - for(i = 0; i != lists.listsize; ++i) { - lists.chains0[i] = &lists.memory[0]; - lists.chains1[i] = &lists.memory[1]; - } - - /*each boundaryPM call adds one chain to the last list, and we need 2 * numpresent - 2 chains.*/ - for(i = 2; i != 2 * numpresent - 2; ++i) boundaryPM(&lists, leaves, numpresent, (int)maxbitlen - 1, (int)i); - - for(node = lists.chains1[maxbitlen - 1]; node; node = node->tail) { - for(i = 0; i != node->index; ++i) ++lengths[leaves[i].index]; - } - } - - lodepng_free(lists.memory); - lodepng_free(lists.freelist); - lodepng_free(lists.chains0); - lodepng_free(lists.chains1); - } - - lodepng_free(leaves); - return error; -} - -/*Create the Huffman tree given the symbol frequencies*/ -static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies, - size_t mincodes, size_t numcodes, unsigned maxbitlen) { - unsigned error = 0; - while(!frequencies[numcodes - 1] && numcodes > mincodes) --numcodes; /*trim zeroes*/ - tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); - if(!tree->lengths) return 83; /*alloc fail*/ - tree->maxbitlen = maxbitlen; - tree->numcodes = (unsigned)numcodes; /*number of symbols*/ - - error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); - if(!error) error = HuffmanTree_makeFromLengths2(tree); - return error; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ -static unsigned generateFixedLitLenTree(HuffmanTree* tree) { - unsigned i, error = 0; - unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); - if(!bitlen) return 83; /*alloc fail*/ - - /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ - for(i = 0; i <= 143; ++i) bitlen[i] = 8; - for(i = 144; i <= 255; ++i) bitlen[i] = 9; - for(i = 256; i <= 279; ++i) bitlen[i] = 7; - for(i = 280; i <= 287; ++i) bitlen[i] = 8; - - error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); - - lodepng_free(bitlen); - return error; -} - -/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ -static unsigned generateFixedDistanceTree(HuffmanTree* tree) { - unsigned i, error = 0; - unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); - if(!bitlen) return 83; /*alloc fail*/ - - /*there are 32 distance codes, but 30-31 are unused*/ - for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5; - error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); - - lodepng_free(bitlen); - return error; -} - -#ifdef LODEPNG_COMPILE_DECODER - -/* -returns the code. The bit reader must already have been ensured at least 15 bits -*/ -static unsigned huffmanDecodeSymbol(LodePNGBitReader* reader, const HuffmanTree* codetree) { - unsigned short code = peekBits(reader, FIRSTBITS); - unsigned short l = codetree->table_len[code]; - unsigned short value = codetree->table_value[code]; - if(l <= FIRSTBITS) { - advanceBits(reader, l); - return value; - } else { - unsigned index2; - advanceBits(reader, FIRSTBITS); - index2 = value + peekBits(reader, l - FIRSTBITS); - advanceBits(reader, codetree->table_len[index2] - FIRSTBITS); - return codetree->table_value[index2]; - } -} -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Inflator (Decompressor) / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*get the tree of a deflated block with fixed tree, as specified in the deflate specification -Returns error code.*/ -static unsigned getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) { - unsigned error = generateFixedLitLenTree(tree_ll); - if(error) return error; - return generateFixedDistanceTree(tree_d); -} - -/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ -static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, - LodePNGBitReader* reader) { - /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ - unsigned error = 0; - unsigned n, HLIT, HDIST, HCLEN, i; - - /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ - unsigned* bitlen_ll = 0; /*lit,len code lengths*/ - unsigned* bitlen_d = 0; /*dist code lengths*/ - /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ - unsigned* bitlen_cl = 0; - HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ - - if(!ensureBits17(reader, 14)) return 49; /*error: the bit pointer is or will go past the memory*/ - - /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ - HLIT = readBits(reader, 5) + 257; - /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ - HDIST = readBits(reader, 5) + 1; - /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ - HCLEN = readBits(reader, 4) + 4; - - bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); - if(!bitlen_cl) return 83 /*alloc fail*/; - - HuffmanTree_init(&tree_cl); - - while(!error) { - /*read the code length codes out of 3 * (amount of code length codes) bits*/ - if(lodepng_gtofl(reader->bp, HCLEN * 3, reader->bitsize)) { - ERROR_BREAK(50); /*error: the bit pointer is or will go past the memory*/ - } - for(i = 0; i != HCLEN; ++i) { - ensureBits9(reader, 3); /*out of bounds already checked above */ - bitlen_cl[CLCL_ORDER[i]] = readBits(reader, 3); - } - for(i = HCLEN; i != NUM_CODE_LENGTH_CODES; ++i) { - bitlen_cl[CLCL_ORDER[i]] = 0; - } - - error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); - if(error) break; - - /*now we can use this tree to read the lengths for the tree that this function will return*/ - bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); - bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); - if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); - lodepng_memset(bitlen_ll, 0, NUM_DEFLATE_CODE_SYMBOLS * sizeof(*bitlen_ll)); - lodepng_memset(bitlen_d, 0, NUM_DISTANCE_SYMBOLS * sizeof(*bitlen_d)); - - /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ - i = 0; - while(i < HLIT + HDIST) { - unsigned code; - ensureBits25(reader, 22); /* up to 15 bits for huffman code, up to 7 extra bits below*/ - code = huffmanDecodeSymbol(reader, &tree_cl); - if(code <= 15) /*a length code*/ { - if(i < HLIT) bitlen_ll[i] = code; - else bitlen_d[i - HLIT] = code; - ++i; - } else if(code == 16) /*repeat previous*/ { - unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ - unsigned value; /*set value to the previous code*/ - - if(i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ - - replength += readBits(reader, 2); - - if(i < HLIT + 1) value = bitlen_ll[i - 1]; - else value = bitlen_d[i - HLIT - 1]; - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; ++n) { - if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ - if(i < HLIT) bitlen_ll[i] = value; - else bitlen_d[i - HLIT] = value; - ++i; - } - } else if(code == 17) /*repeat "0" 3-10 times*/ { - unsigned replength = 3; /*read in the bits that indicate repeat length*/ - replength += readBits(reader, 3); - - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; ++n) { - if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ - - if(i < HLIT) bitlen_ll[i] = 0; - else bitlen_d[i - HLIT] = 0; - ++i; - } - } else if(code == 18) /*repeat "0" 11-138 times*/ { - unsigned replength = 11; /*read in the bits that indicate repeat length*/ - replength += readBits(reader, 7); - - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; ++n) { - if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ - - if(i < HLIT) bitlen_ll[i] = 0; - else bitlen_d[i - HLIT] = 0; - ++i; - } - } else /*if(code == INVALIDSYMBOL)*/ { - ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ - } - /*check if any of the ensureBits above went out of bounds*/ - if(reader->bp > reader->bitsize) { - /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol - (10=no endcode, 11=wrong jump outside of tree)*/ - /* TODO: revise error codes 10,11,50: the above comment is no longer valid */ - ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ - } - } - if(error) break; - - if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ - - /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ - error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); - if(error) break; - error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); - - break; /*end of error-while*/ - } - - lodepng_free(bitlen_cl); - lodepng_free(bitlen_ll); - lodepng_free(bitlen_d); - HuffmanTree_cleanup(&tree_cl); - - return error; -} - -/*inflate a block with dynamic of fixed Huffman tree. btype must be 1 or 2.*/ -static unsigned inflateHuffmanBlock(ucvector* out, LodePNGBitReader* reader, - unsigned btype) { - unsigned error = 0; - HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ - HuffmanTree tree_d; /*the huffman tree for distance codes*/ - - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - - if(btype == 1) error = getTreeInflateFixed(&tree_ll, &tree_d); - else /*if(btype == 2)*/ error = getTreeInflateDynamic(&tree_ll, &tree_d, reader); - - while(!error) /*decode all symbols until end reached, breaks at end code*/ { - /*code_ll is literal, length or end code*/ - unsigned code_ll; - ensureBits25(reader, 20); /* up to 15 for the huffman symbol, up to 5 for the length extra bits */ - code_ll = huffmanDecodeSymbol(reader, &tree_ll); - if(code_ll <= 255) /*literal symbol*/ { - if(!ucvector_resize(out, out->size + 1)) ERROR_BREAK(83 /*alloc fail*/); - out->data[out->size - 1] = (unsigned char)code_ll; - } else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ { - unsigned code_d, distance; - unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ - size_t start, backward, length; - - /*part 1: get length base*/ - length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; - - /*part 2: get extra bits and add the value of that to length*/ - numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; - if(numextrabits_l != 0) { - /* bits already ensured above */ - length += readBits(reader, numextrabits_l); - } - - /*part 3: get distance code*/ - ensureBits32(reader, 28); /* up to 15 for the huffman symbol, up to 13 for the extra bits */ - code_d = huffmanDecodeSymbol(reader, &tree_d); - if(code_d > 29) { - if(code_d <= 31) { - ERROR_BREAK(18); /*error: invalid distance code (30-31 are never used)*/ - } else /* if(code_d == INVALIDSYMBOL) */{ - ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ - } - } - distance = DISTANCEBASE[code_d]; - - /*part 4: get extra bits from distance*/ - numextrabits_d = DISTANCEEXTRA[code_d]; - if(numextrabits_d != 0) { - /* bits already ensured above */ - distance += readBits(reader, numextrabits_d); - } - - /*part 5: fill in all the out[n] values based on the length and dist*/ - start = out->size; - if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ - backward = start - distance; - - if(!ucvector_resize(out, out->size + length)) ERROR_BREAK(83 /*alloc fail*/); - if(distance < length) { - size_t forward; - lodepng_memcpy(out->data + start, out->data + backward, distance); - start += distance; - for(forward = distance; forward < length; ++forward) { - out->data[start++] = out->data[backward++]; - } - } else { - lodepng_memcpy(out->data + start, out->data + backward, length); - } - } else if(code_ll == 256) { - break; /*end code, break the loop*/ - } else /*if(code_ll == INVALIDSYMBOL)*/ { - ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ - } - /*check if any of the ensureBits above went out of bounds*/ - if(reader->bp > reader->bitsize) { - /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol - (10=no endcode, 11=wrong jump outside of tree)*/ - /* TODO: revise error codes 10,11,50: the above comment is no longer valid */ - ERROR_BREAK(51); /*error, bit pointer jumps past memory*/ - } - } - - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - - return error; -} - -static unsigned inflateNoCompression(ucvector* out, LodePNGBitReader* reader, - const LodePNGDecompressSettings* settings) { - size_t bytepos; - size_t size = reader->size; - unsigned LEN, NLEN, error = 0; - - /*go to first boundary of byte*/ - bytepos = (reader->bp + 7u) >> 3u; - - /*read LEN (2 bytes) and NLEN (2 bytes)*/ - if(bytepos + 4 >= size) return 52; /*error, bit pointer will jump past memory*/ - LEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); bytepos += 2; - NLEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); bytepos += 2; - - /*check if 16-bit NLEN is really the one's complement of LEN*/ - if(!settings->ignore_nlen && LEN + NLEN != 65535) { - return 21; /*error: NLEN is not one's complement of LEN*/ - } - - if(!ucvector_resize(out, out->size + LEN)) return 83; /*alloc fail*/ - - /*read the literal data: LEN bytes are now stored in the out buffer*/ - if(bytepos + LEN > size) return 23; /*error: reading outside of in buffer*/ - - lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN); - bytepos += LEN; - - reader->bp = bytepos << 3u; - - return error; -} - -static unsigned lodepng_inflatev(ucvector* out, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) { - unsigned BFINAL = 0; - LodePNGBitReader reader; - unsigned error = LodePNGBitReader_init(&reader, in, insize); - - if(error) return error; - - while(!BFINAL) { - unsigned BTYPE; - if(!ensureBits9(&reader, 3)) return 52; /*error, bit pointer will jump past memory*/ - BFINAL = readBits(&reader, 1); - BTYPE = readBits(&reader, 2); - - if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ - else if(BTYPE == 0) error = inflateNoCompression(out, &reader, settings); /*no compression*/ - else error = inflateHuffmanBlock(out, &reader, BTYPE); /*compression, BTYPE 01 or 10*/ - - if(error) return error; - } - - return error; -} - -unsigned lodepng_inflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) { - ucvector v = ucvector_init(*out, *outsize); - unsigned error = lodepng_inflatev(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -static unsigned inflatev(ucvector* out, const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) { - if(settings->custom_inflate) { - unsigned error = settings->custom_inflate(&out->data, &out->size, in, insize, settings); - out->allocsize = out->size; - return error; - } else { - return lodepng_inflatev(out, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Deflator (Compressor) / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258; - -/*search the index in the array, that has the largest value smaller than or equal to the given value, -given array must be sorted (if no value is smaller, it returns the size of the given array)*/ -static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) { - /*binary search (only small gain over linear). TODO: use CPU log2 instruction for getting symbols instead*/ - size_t left = 1; - size_t right = array_size - 1; - - while(left <= right) { - size_t mid = (left + right) >> 1; - if(array[mid] >= value) right = mid - 1; - else left = mid + 1; - } - if(left >= array_size || array[left] > value) left--; - return left; -} - -static void addLengthDistance(uivector* values, size_t length, size_t distance) { - /*values in encoded vector are those used by deflate: - 0-255: literal bytes - 256: end - 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) - 286-287: invalid*/ - - unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); - unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); - unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); - unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); - - size_t pos = values->size; - /*TODO: return error when this fails (out of memory)*/ - unsigned ok = uivector_resize(values, values->size + 4); - if(ok) { - values->data[pos + 0] = length_code + FIRST_LENGTH_CODE_INDEX; - values->data[pos + 1] = extra_length; - values->data[pos + 2] = dist_code; - values->data[pos + 3] = extra_distance; - } -} - -/*3 bytes of data get encoded into two bytes. The hash cannot use more than 3 -bytes as input because 3 is the minimum match length for deflate*/ -static const unsigned HASH_NUM_VALUES = 65536; -static const unsigned HASH_BIT_MASK = 65535; /*HASH_NUM_VALUES - 1, but C90 does not like that as initializer*/ - -typedef struct Hash { - int* head; /*hash value to head circular pos - can be outdated if went around window*/ - /*circular pos to prev circular pos*/ - unsigned short* chain; - int* val; /*circular pos to hash value*/ - - /*TODO: do this not only for zeros but for any repeated byte. However for PNG - it's always going to be the zeros that dominate, so not important for PNG*/ - int* headz; /*similar to head, but for chainz*/ - unsigned short* chainz; /*those with same amount of zeros*/ - unsigned short* zeros; /*length of zeros streak, used as a second hash chain*/ -} Hash; - -static unsigned hash_init(Hash* hash, unsigned windowsize) { - unsigned i; - hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); - hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize); - hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); - - hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); - hash->headz = (int*)lodepng_malloc(sizeof(int) * (MAX_SUPPORTED_DEFLATE_LENGTH + 1)); - hash->chainz = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); - - if(!hash->head || !hash->chain || !hash->val || !hash->headz|| !hash->chainz || !hash->zeros) { - return 83; /*alloc fail*/ - } - - /*initialize hash table*/ - for(i = 0; i != HASH_NUM_VALUES; ++i) hash->head[i] = -1; - for(i = 0; i != windowsize; ++i) hash->val[i] = -1; - for(i = 0; i != windowsize; ++i) hash->chain[i] = i; /*same value as index indicates uninitialized*/ - - for(i = 0; i <= MAX_SUPPORTED_DEFLATE_LENGTH; ++i) hash->headz[i] = -1; - for(i = 0; i != windowsize; ++i) hash->chainz[i] = i; /*same value as index indicates uninitialized*/ - - return 0; -} - -static void hash_cleanup(Hash* hash) { - lodepng_free(hash->head); - lodepng_free(hash->val); - lodepng_free(hash->chain); - - lodepng_free(hash->zeros); - lodepng_free(hash->headz); - lodepng_free(hash->chainz); -} - - - -static unsigned getHash(const unsigned char* data, size_t size, size_t pos) { - unsigned result = 0; - if(pos + 2 < size) { - /*A simple shift and xor hash is used. Since the data of PNGs is dominated - by zeroes due to the filters, a better hash does not have a significant - effect on speed in traversing the chain, and causes more time spend on - calculating the hash.*/ - result ^= ((unsigned)data[pos + 0] << 0u); - result ^= ((unsigned)data[pos + 1] << 4u); - result ^= ((unsigned)data[pos + 2] << 8u); - } else { - size_t amount, i; - if(pos >= size) return 0; - amount = size - pos; - for(i = 0; i != amount; ++i) result ^= ((unsigned)data[pos + i] << (i * 8u)); - } - return result & HASH_BIT_MASK; -} - -static unsigned countZeros(const unsigned char* data, size_t size, size_t pos) { - const unsigned char* start = data + pos; - const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH; - if(end > data + size) end = data + size; - data = start; - while(data != end && *data == 0) ++data; - /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ - return (unsigned)(data - start); -} - -/*wpos = pos & (windowsize - 1)*/ -static void updateHashChain(Hash* hash, size_t wpos, unsigned hashval, unsigned short numzeros) { - hash->val[wpos] = (int)hashval; - if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; - hash->head[hashval] = (int)wpos; - - hash->zeros[wpos] = numzeros; - if(hash->headz[numzeros] != -1) hash->chainz[wpos] = hash->headz[numzeros]; - hash->headz[numzeros] = (int)wpos; -} - -/* -LZ77-encode the data. Return value is error code. The input are raw bytes, the output -is in the form of unsigned integers with codes representing for example literal bytes, or -length/distance pairs. -It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a -sliding window (of windowsize) is used, and all past bytes in that window can be used as -the "dictionary". A brute force search through all possible distances would be slow, and -this hash technique is one out of several ways to speed this up. -*/ -static unsigned encodeLZ77(uivector* out, Hash* hash, - const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize, - unsigned minmatch, unsigned nicematch, unsigned lazymatching) { - size_t pos; - unsigned i, error = 0; - /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ - unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8u; - unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64; - - unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/ - unsigned numzeros = 0; - - unsigned offset; /*the offset represents the distance in LZ77 terminology*/ - unsigned length; - unsigned lazy = 0; - unsigned lazylength = 0, lazyoffset = 0; - unsigned hashval; - unsigned current_offset, current_length; - unsigned prev_offset; - const unsigned char *lastptr, *foreptr, *backptr; - unsigned hashpos; - - if(windowsize == 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ - if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/ - - if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH; - - for(pos = inpos; pos < insize; ++pos) { - size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/ - unsigned chainlength = 0; - - hashval = getHash(in, insize, pos); - - if(usezeros && hashval == 0) { - if(numzeros == 0) numzeros = countZeros(in, insize, pos); - else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; - } else { - numzeros = 0; - } - - updateHashChain(hash, wpos, hashval, numzeros); - - /*the length and offset found for the current position*/ - length = 0; - offset = 0; - - hashpos = hash->chain[wpos]; - - lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; - - /*search for the longest string*/ - prev_offset = 0; - for(;;) { - if(chainlength++ >= maxchainlength) break; - current_offset = (unsigned)(hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize); - - if(current_offset < prev_offset) break; /*stop when went completely around the circular buffer*/ - prev_offset = current_offset; - if(current_offset > 0) { - /*test the next characters*/ - foreptr = &in[pos]; - backptr = &in[pos - current_offset]; - - /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ - if(numzeros >= 3) { - unsigned skip = hash->zeros[hashpos]; - if(skip > numzeros) skip = numzeros; - backptr += skip; - foreptr += skip; - } - - while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/ { - ++backptr; - ++foreptr; - } - current_length = (unsigned)(foreptr - &in[pos]); - - if(current_length > length) { - length = current_length; /*the longest length*/ - offset = current_offset; /*the offset that is related to this longest length*/ - /*jump out once a length of max length is found (speed gain). This also jumps - out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/ - if(current_length >= nicematch) break; - } - } - - if(hashpos == hash->chain[hashpos]) break; - - if(numzeros >= 3 && length > numzeros) { - hashpos = hash->chainz[hashpos]; - if(hash->zeros[hashpos] != numzeros) break; - } else { - hashpos = hash->chain[hashpos]; - /*outdated hash value, happens if particular value was not encountered in whole last window*/ - if(hash->val[hashpos] != (int)hashval) break; - } - } - - if(lazymatching) { - if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) { - lazy = 1; - lazylength = length; - lazyoffset = offset; - continue; /*try the next byte*/ - } - if(lazy) { - lazy = 0; - if(pos == 0) ERROR_BREAK(81); - if(length > lazylength + 1) { - /*push the previous character as literal*/ - if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); - } else { - length = lazylength; - offset = lazyoffset; - hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ - hash->headz[numzeros] = -1; /*idem*/ - --pos; - } - } - } - if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); - - /*encode it as length/distance pair or literal value*/ - if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/ { - if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); - } else if(length < minmatch || (length == 3 && offset > 4096)) { - /*compensate for the fact that longer offsets have more extra bits, a - length of only 3 may be not worth it then*/ - if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); - } else { - addLengthDistance(out, length, offset); - for(i = 1; i < length; ++i) { - ++pos; - wpos = pos & (windowsize - 1); - hashval = getHash(in, insize, pos); - if(usezeros && hashval == 0) { - if(numzeros == 0) numzeros = countZeros(in, insize, pos); - else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; - } else { - numzeros = 0; - } - updateHashChain(hash, wpos, hashval, numzeros); - } - } - } /*end of the loop through each character of input*/ - - return error; -} - -/* /////////////////////////////////////////////////////////////////////////// */ - -static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize) { - /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, - 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ - - size_t i, numdeflateblocks = (datasize + 65534u) / 65535u; - unsigned datapos = 0; - for(i = 0; i != numdeflateblocks; ++i) { - unsigned BFINAL, BTYPE, LEN, NLEN; - unsigned char firstbyte; - size_t pos = out->size; - - BFINAL = (i == numdeflateblocks - 1); - BTYPE = 0; - - LEN = 65535; - if(datasize - datapos < 65535u) LEN = (unsigned)datasize - datapos; - NLEN = 65535 - LEN; - - if(!ucvector_resize(out, out->size + LEN + 5)) return 83; /*alloc fail*/ - - firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1u) << 1u) + ((BTYPE & 2u) << 1u)); - out->data[pos + 0] = firstbyte; - out->data[pos + 1] = (unsigned char)(LEN & 255); - out->data[pos + 2] = (unsigned char)(LEN >> 8u); - out->data[pos + 3] = (unsigned char)(NLEN & 255); - out->data[pos + 4] = (unsigned char)(NLEN >> 8u); - lodepng_memcpy(out->data + pos + 5, data + datapos, LEN); - datapos += LEN; - } - - return 0; -} - -/* -write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. -tree_ll: the tree for lit and len codes. -tree_d: the tree for distance codes. -*/ -static void writeLZ77data(LodePNGBitWriter* writer, const uivector* lz77_encoded, - const HuffmanTree* tree_ll, const HuffmanTree* tree_d) { - size_t i = 0; - for(i = 0; i != lz77_encoded->size; ++i) { - unsigned val = lz77_encoded->data[i]; - writeBitsReversed(writer, tree_ll->codes[val], tree_ll->lengths[val]); - if(val > 256) /*for a length code, 3 more things have to be added*/ { - unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; - unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; - unsigned length_extra_bits = lz77_encoded->data[++i]; - - unsigned distance_code = lz77_encoded->data[++i]; - - unsigned distance_index = distance_code; - unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; - unsigned distance_extra_bits = lz77_encoded->data[++i]; - - writeBits(writer, length_extra_bits, n_length_extra_bits); - writeBitsReversed(writer, tree_d->codes[distance_code], tree_d->lengths[distance_code]); - writeBits(writer, distance_extra_bits, n_distance_extra_bits); - } - } -} - -/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ -static unsigned deflateDynamic(LodePNGBitWriter* writer, Hash* hash, - const unsigned char* data, size_t datapos, size_t dataend, - const LodePNGCompressSettings* settings, unsigned final) { - unsigned error = 0; - - /* - A block is compressed as follows: The PNG data is lz77 encoded, resulting in - literal bytes and length/distance pairs. This is then huffman compressed with - two huffman trees. One huffman tree is used for the lit and len values ("ll"), - another huffman tree is used for the dist values ("d"). These two trees are - stored using their code lengths, and to compress even more these code lengths - are also run-length encoded and huffman compressed. This gives a huffman tree - of code lengths "cl". The code lengths used to describe this third tree are - the code length code lengths ("clcl"). - */ - - /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ - uivector lz77_encoded; - HuffmanTree tree_ll; /*tree for lit,len values*/ - HuffmanTree tree_d; /*tree for distance codes*/ - HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ - unsigned* frequencies_ll = 0; /*frequency of lit,len codes*/ - unsigned* frequencies_d = 0; /*frequency of dist codes*/ - unsigned* frequencies_cl = 0; /*frequency of code length codes*/ - unsigned* bitlen_lld = 0; /*lit,len,dist code lengths (int bits), literally (without repeat codes).*/ - unsigned* bitlen_lld_e = 0; /*bitlen_lld encoded with repeat codes (this is a rudimentary run length compression)*/ - size_t datasize = dataend - datapos; - - /* - If we could call "bitlen_cl" the the code length code lengths ("clcl"), that is the bit lengths of codes to represent - tree_cl in CLCL_ORDER, then due to the huffman compression of huffman tree representations ("two levels"), there are - some analogies: - bitlen_lld is to tree_cl what data is to tree_ll and tree_d. - bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. - bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. - */ - - unsigned BFINAL = final; - size_t i; - size_t numcodes_ll, numcodes_d, numcodes_lld, numcodes_lld_e, numcodes_cl; - unsigned HLIT, HDIST, HCLEN; - - uivector_init(&lz77_encoded); - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - HuffmanTree_init(&tree_cl); - /* could fit on stack, but >1KB is on the larger side so allocate instead */ - frequencies_ll = (unsigned*)lodepng_malloc(286 * sizeof(*frequencies_ll)); - frequencies_d = (unsigned*)lodepng_malloc(30 * sizeof(*frequencies_d)); - frequencies_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl)); - - if(!frequencies_ll || !frequencies_d || !frequencies_cl) error = 83; /*alloc fail*/ - - /*This while loop never loops due to a break at the end, it is here to - allow breaking out of it to the cleanup phase on error conditions.*/ - while(!error) { - lodepng_memset(frequencies_ll, 0, 286 * sizeof(*frequencies_ll)); - lodepng_memset(frequencies_d, 0, 30 * sizeof(*frequencies_d)); - lodepng_memset(frequencies_cl, 0, NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl)); - - if(settings->use_lz77) { - error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, - settings->minmatch, settings->nicematch, settings->lazymatching); - if(error) break; - } else { - if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); - for(i = datapos; i < dataend; ++i) lz77_encoded.data[i - datapos] = data[i]; /*no LZ77, but still will be Huffman compressed*/ - } - - /*Count the frequencies of lit, len and dist codes*/ - for(i = 0; i != lz77_encoded.size; ++i) { - unsigned symbol = lz77_encoded.data[i]; - ++frequencies_ll[symbol]; - if(symbol > 256) { - unsigned dist = lz77_encoded.data[i + 2]; - ++frequencies_d[dist]; - i += 3; - } - } - frequencies_ll[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ - - /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ - error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll, 257, 286, 15); - if(error) break; - /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/ - error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d, 2, 30, 15); - if(error) break; - - numcodes_ll = LODEPNG_MIN(tree_ll.numcodes, 286); - numcodes_d = LODEPNG_MIN(tree_d.numcodes, 30); - /*store the code lengths of both generated trees in bitlen_lld*/ - numcodes_lld = numcodes_ll + numcodes_d; - bitlen_lld = (unsigned*)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld)); - /*numcodes_lld_e never needs more size than bitlen_lld*/ - bitlen_lld_e = (unsigned*)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld_e)); - if(!bitlen_lld || !bitlen_lld_e) ERROR_BREAK(83); /*alloc fail*/ - numcodes_lld_e = 0; - - for(i = 0; i != numcodes_ll; ++i) bitlen_lld[i] = tree_ll.lengths[i]; - for(i = 0; i != numcodes_d; ++i) bitlen_lld[numcodes_ll + i] = tree_d.lengths[i]; - - /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), - 17 (3-10 zeroes), 18 (11-138 zeroes)*/ - for(i = 0; i != numcodes_lld; ++i) { - unsigned j = 0; /*amount of repetitions*/ - while(i + j + 1 < numcodes_lld && bitlen_lld[i + j + 1] == bitlen_lld[i]) ++j; - - if(bitlen_lld[i] == 0 && j >= 2) /*repeat code for zeroes*/ { - ++j; /*include the first zero*/ - if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ { - bitlen_lld_e[numcodes_lld_e++] = 17; - bitlen_lld_e[numcodes_lld_e++] = j - 3; - } else /*repeat code 18 supports max 138 zeroes*/ { - if(j > 138) j = 138; - bitlen_lld_e[numcodes_lld_e++] = 18; - bitlen_lld_e[numcodes_lld_e++] = j - 11; - } - i += (j - 1); - } else if(j >= 3) /*repeat code for value other than zero*/ { - size_t k; - unsigned num = j / 6u, rest = j % 6u; - bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i]; - for(k = 0; k < num; ++k) { - bitlen_lld_e[numcodes_lld_e++] = 16; - bitlen_lld_e[numcodes_lld_e++] = 6 - 3; - } - if(rest >= 3) { - bitlen_lld_e[numcodes_lld_e++] = 16; - bitlen_lld_e[numcodes_lld_e++] = rest - 3; - } - else j -= rest; - i += j; - } else /*too short to benefit from repeat code*/ { - bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i]; - } - } - - /*generate tree_cl, the huffmantree of huffmantrees*/ - for(i = 0; i != numcodes_lld_e; ++i) { - ++frequencies_cl[bitlen_lld_e[i]]; - /*after a repeat code come the bits that specify the number of repetitions, - those don't need to be in the frequencies_cl calculation*/ - if(bitlen_lld_e[i] >= 16) ++i; - } - - error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl, - NUM_CODE_LENGTH_CODES, NUM_CODE_LENGTH_CODES, 7); - if(error) break; - - /*compute amount of code-length-code-lengths to output*/ - numcodes_cl = NUM_CODE_LENGTH_CODES; - /*trim zeros at the end (using CLCL_ORDER), but minimum size must be 4 (see HCLEN below)*/ - while(numcodes_cl > 4u && tree_cl.lengths[CLCL_ORDER[numcodes_cl - 1u]] == 0) { - numcodes_cl--; - } - - /* - Write everything into the output - - After the BFINAL and BTYPE, the dynamic block consists out of the following: - - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN - - (HCLEN+4)*3 bits code lengths of code length alphabet - - HLIT + 257 code lengths of lit/length alphabet (encoded using the code length - alphabet, + possible repetition codes 16, 17, 18) - - HDIST + 1 code lengths of distance alphabet (encoded using the code length - alphabet, + possible repetition codes 16, 17, 18) - - compressed data - - 256 (end code) - */ - - /*Write block type*/ - writeBits(writer, BFINAL, 1); - writeBits(writer, 0, 1); /*first bit of BTYPE "dynamic"*/ - writeBits(writer, 1, 1); /*second bit of BTYPE "dynamic"*/ - - /*write the HLIT, HDIST and HCLEN values*/ - /*all three sizes take trimmed ending zeroes into account, done either by HuffmanTree_makeFromFrequencies - or in the loop for numcodes_cl above, which saves space. */ - HLIT = (unsigned)(numcodes_ll - 257); - HDIST = (unsigned)(numcodes_d - 1); - HCLEN = (unsigned)(numcodes_cl - 4); - writeBits(writer, HLIT, 5); - writeBits(writer, HDIST, 5); - writeBits(writer, HCLEN, 4); - - /*write the code lengths of the code length alphabet ("bitlen_cl")*/ - for(i = 0; i != numcodes_cl; ++i) writeBits(writer, tree_cl.lengths[CLCL_ORDER[i]], 3); - - /*write the lengths of the lit/len AND the dist alphabet*/ - for(i = 0; i != numcodes_lld_e; ++i) { - writeBitsReversed(writer, tree_cl.codes[bitlen_lld_e[i]], tree_cl.lengths[bitlen_lld_e[i]]); - /*extra bits of repeat codes*/ - if(bitlen_lld_e[i] == 16) writeBits(writer, bitlen_lld_e[++i], 2); - else if(bitlen_lld_e[i] == 17) writeBits(writer, bitlen_lld_e[++i], 3); - else if(bitlen_lld_e[i] == 18) writeBits(writer, bitlen_lld_e[++i], 7); - } - - /*write the compressed data symbols*/ - writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); - /*error: the length of the end code 256 must be larger than 0*/ - if(tree_ll.lengths[256] == 0) ERROR_BREAK(64); - - /*write the end code*/ - writeBitsReversed(writer, tree_ll.codes[256], tree_ll.lengths[256]); - - break; /*end of error-while*/ - } - - /*cleanup*/ - uivector_cleanup(&lz77_encoded); - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - HuffmanTree_cleanup(&tree_cl); - lodepng_free(frequencies_ll); - lodepng_free(frequencies_d); - lodepng_free(frequencies_cl); - lodepng_free(bitlen_lld); - lodepng_free(bitlen_lld_e); - - return error; -} - -static unsigned deflateFixed(LodePNGBitWriter* writer, Hash* hash, - const unsigned char* data, - size_t datapos, size_t dataend, - const LodePNGCompressSettings* settings, unsigned final) { - HuffmanTree tree_ll; /*tree for literal values and length codes*/ - HuffmanTree tree_d; /*tree for distance codes*/ - - unsigned BFINAL = final; - unsigned error = 0; - size_t i; - - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - - error = generateFixedLitLenTree(&tree_ll); - if(!error) error = generateFixedDistanceTree(&tree_d); - - if(!error) { - writeBits(writer, BFINAL, 1); - writeBits(writer, 1, 1); /*first bit of BTYPE*/ - writeBits(writer, 0, 1); /*second bit of BTYPE*/ - - if(settings->use_lz77) /*LZ77 encoded*/ { - uivector lz77_encoded; - uivector_init(&lz77_encoded); - error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, - settings->minmatch, settings->nicematch, settings->lazymatching); - if(!error) writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); - uivector_cleanup(&lz77_encoded); - } else /*no LZ77, but still will be Huffman compressed*/ { - for(i = datapos; i < dataend; ++i) { - writeBitsReversed(writer, tree_ll.codes[data[i]], tree_ll.lengths[data[i]]); - } - } - /*add END code*/ - if(!error) writeBitsReversed(writer,tree_ll.codes[256], tree_ll.lengths[256]); - } - - /*cleanup*/ - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - - return error; -} - -static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings) { - unsigned error = 0; - size_t i, blocksize, numdeflateblocks; - Hash hash; - LodePNGBitWriter writer; - - LodePNGBitWriter_init(&writer, out); - - if(settings->btype > 2) return 61; - else if(settings->btype == 0) return deflateNoCompression(out, in, insize); - else if(settings->btype == 1) blocksize = insize; - else /*if(settings->btype == 2)*/ { - /*on PNGs, deflate blocks of 65-262k seem to give most dense encoding*/ - blocksize = insize / 8u + 8; - if(blocksize < 65536) blocksize = 65536; - if(blocksize > 262144) blocksize = 262144; - } - - numdeflateblocks = (insize + blocksize - 1) / blocksize; - if(numdeflateblocks == 0) numdeflateblocks = 1; - - error = hash_init(&hash, settings->windowsize); - - if(!error) { - for(i = 0; i != numdeflateblocks && !error; ++i) { - unsigned final = (i == numdeflateblocks - 1); - size_t start = i * blocksize; - size_t end = start + blocksize; - if(end > insize) end = insize; - - if(settings->btype == 1) error = deflateFixed(&writer, &hash, in, start, end, settings, final); - else if(settings->btype == 2) error = deflateDynamic(&writer, &hash, in, start, end, settings, final); - } - } - - hash_cleanup(&hash); - - return error; -} - -unsigned lodepng_deflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings) { - ucvector v = ucvector_init(*out, *outsize); - unsigned error = lodepng_deflatev(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -static unsigned deflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings) { - if(settings->custom_deflate) { - return settings->custom_deflate(out, outsize, in, insize, settings); - } else { - return lodepng_deflate(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Adler32 / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len) { - unsigned s1 = adler & 0xffffu; - unsigned s2 = (adler >> 16u) & 0xffffu; - - while(len != 0u) { - unsigned i; - /*at least 5552 sums can be done before the sums overflow, saving a lot of module divisions*/ - unsigned amount = len > 5552u ? 5552u : len; - len -= amount; - for(i = 0; i != amount; ++i) { - s1 += (*data++); - s2 += s1; - } - s1 %= 65521u; - s2 %= 65521u; - } - - return (s2 << 16u) | s1; -} - -/*Return the adler32 of the bytes data[0..len-1]*/ -static unsigned adler32(const unsigned char* data, unsigned len) { - return update_adler32(1u, data, len); -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Zlib / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_DECODER - -static unsigned lodepng_zlib_decompressv(ucvector* out, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) { - unsigned error = 0; - unsigned CM, CINFO, FDICT; - - if(insize < 2) return 53; /*error, size of zlib data too small*/ - /*read information from zlib header*/ - if((in[0] * 256 + in[1]) % 31 != 0) { - /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ - return 24; - } - - CM = in[0] & 15; - CINFO = (in[0] >> 4) & 15; - /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ - FDICT = (in[1] >> 5) & 1; - /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ - - if(CM != 8 || CINFO > 7) { - /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ - return 25; - } - if(FDICT != 0) { - /*error: the specification of PNG says about the zlib stream: - "The additional flags shall not specify a preset dictionary."*/ - return 26; - } - - error = inflatev(out, in + 2, insize - 2, settings); - if(error) return error; - - if(!settings->ignore_adler32) { - unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); - unsigned checksum = adler32(out->data, (unsigned)(out->size)); - if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ - } - - return 0; /*no error*/ -} - - -unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGDecompressSettings* settings) { - ucvector v = ucvector_init(*out, *outsize); - unsigned error = lodepng_zlib_decompressv(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -/*expected_size is expected output size, to avoid intermediate allocations. Set to 0 if not known. */ -static unsigned zlib_decompress(unsigned char** out, size_t* outsize, size_t expected_size, - const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) { - if(settings->custom_zlib) { - return settings->custom_zlib(out, outsize, in, insize, settings); - } else { - unsigned error; - ucvector v = ucvector_init(*out, *outsize); - if(expected_size) { - /*reserve the memory to avoid intermediate reallocations*/ - ucvector_resize(&v, *outsize + expected_size); - v.size = *outsize; - } - error = lodepng_zlib_decompressv(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; - } -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER - -unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGCompressSettings* settings) { - size_t i; - unsigned error; - unsigned char* deflatedata = 0; - size_t deflatesize = 0; - - error = deflate(&deflatedata, &deflatesize, in, insize, settings); - - *out = NULL; - *outsize = 0; - if(!error) { - *outsize = deflatesize + 6; - *out = (unsigned char*)lodepng_malloc(*outsize); - if(!*out) error = 83; /*alloc fail*/ - } - - if(!error) { - unsigned ADLER32 = adler32(in, (unsigned)insize); - /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ - unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ - unsigned FLEVEL = 0; - unsigned FDICT = 0; - unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; - unsigned FCHECK = 31 - CMFFLG % 31; - CMFFLG += FCHECK; - - (*out)[0] = (unsigned char)(CMFFLG >> 8); - (*out)[1] = (unsigned char)(CMFFLG & 255); - for(i = 0; i != deflatesize; ++i) (*out)[i + 2] = deflatedata[i]; - lodepng_set32bitInt(&(*out)[*outsize - 4], ADLER32); - } - - lodepng_free(deflatedata); - return error; -} - -/* compress using the default or custom zlib function */ -static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGCompressSettings* settings) { - if(settings->custom_zlib) { - return settings->custom_zlib(out, outsize, in, insize, settings); - } else { - return lodepng_zlib_compress(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#else /*no LODEPNG_COMPILE_ZLIB*/ - -#ifdef LODEPNG_COMPILE_DECODER -static unsigned zlib_decompress(unsigned char** out, size_t* outsize, size_t expected_size, - const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) { - if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ - (void)expected_size; - return settings->custom_zlib(out, outsize, in, insize, settings); -} -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER -static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGCompressSettings* settings) { - if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ - return settings->custom_zlib(out, outsize, in, insize, settings); -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#endif /*LODEPNG_COMPILE_ZLIB*/ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_ENCODER - -/*this is a good tradeoff between speed and compression ratio*/ -#define DEFAULT_WINDOWSIZE 2048 - -void lodepng_compress_settings_init(LodePNGCompressSettings* settings) { - /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ - settings->btype = 2; - settings->use_lz77 = 1; - settings->windowsize = DEFAULT_WINDOWSIZE; - settings->minmatch = 3; - settings->nicematch = 128; - settings->lazymatching = 1; - - settings->custom_zlib = 0; - settings->custom_deflate = 0; - settings->custom_context = 0; -} - -const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0}; - - -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) { - settings->ignore_adler32 = 0; - settings->ignore_nlen = 0; - - settings->custom_zlib = 0; - settings->custom_inflate = 0; - settings->custom_context = 0; -} - -const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0, 0}; - -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // End of Zlib related code. Begin of PNG related code. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_PNG - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / CRC32 / */ -/* ////////////////////////////////////////////////////////////////////////// */ - - -#ifndef LODEPNG_NO_COMPILE_CRC -/* CRC polynomial: 0xedb88320 */ -static unsigned lodepng_crc32_table[256] = { - 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, - 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, - 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, - 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, - 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, - 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, - 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, - 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, - 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, - 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, - 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, - 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, - 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, - 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, - 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, - 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, - 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, - 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, - 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, - 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, - 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, - 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, - 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, - 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, - 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, - 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, - 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, - 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, - 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, - 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, - 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, - 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u -}; - -/*Return the CRC of the bytes buf[0..len-1].*/ -unsigned lodepng_crc32(const unsigned char* data, size_t length) { - unsigned r = 0xffffffffu; - size_t i; - for(i = 0; i < length; ++i) { - r = lodepng_crc32_table[(r ^ data[i]) & 0xffu] ^ (r >> 8u); - } - return r ^ 0xffffffffu; -} -#else /* !LODEPNG_NO_COMPILE_CRC */ -unsigned lodepng_crc32(const unsigned char* data, size_t length); -#endif /* !LODEPNG_NO_COMPILE_CRC */ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Reading and writing PNG color channel bits / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/* The color channel bits of less-than-8-bit pixels are read with the MSB of bytes first, -so LodePNGBitWriter and LodePNGBitReader can't be used for those. */ - -static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) { - unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); - ++(*bitpointer); - return result; -} - -/* TODO: make this faster */ -static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) { - unsigned result = 0; - size_t i; - for(i = 0 ; i < nbits; ++i) { - result <<= 1u; - result |= (unsigned)readBitFromReversedStream(bitpointer, bitstream); - } - return result; -} - -static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) { - /*the current bit in bitstream may be 0 or 1 for this to work*/ - if(bit == 0) bitstream[(*bitpointer) >> 3u] &= (unsigned char)(~(1u << (7u - ((*bitpointer) & 7u)))); - else bitstream[(*bitpointer) >> 3u] |= (1u << (7u - ((*bitpointer) & 7u))); - ++(*bitpointer); -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG chunks / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -unsigned lodepng_chunk_length(const unsigned char* chunk) { - return lodepng_read32bitInt(&chunk[0]); -} - -void lodepng_chunk_type(char type[5], const unsigned char* chunk) { - unsigned i; - for(i = 0; i != 4; ++i) type[i] = (char)chunk[4 + i]; - type[4] = 0; /*null termination char*/ -} - -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) { - if(lodepng_strlen(type) != 4) return 0; - return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); -} - -unsigned char lodepng_chunk_ancillary(const unsigned char* chunk) { - return((chunk[4] & 32) != 0); -} - -unsigned char lodepng_chunk_private(const unsigned char* chunk) { - return((chunk[6] & 32) != 0); -} - -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk) { - return((chunk[7] & 32) != 0); -} - -unsigned char* lodepng_chunk_data(unsigned char* chunk) { - return &chunk[8]; -} - -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) { - return &chunk[8]; -} - -unsigned lodepng_chunk_check_crc(const unsigned char* chunk) { - unsigned length = lodepng_chunk_length(chunk); - unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); - /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ - unsigned checksum = lodepng_crc32(&chunk[4], length + 4); - if(CRC != checksum) return 1; - else return 0; -} - -void lodepng_chunk_generate_crc(unsigned char* chunk) { - unsigned length = lodepng_chunk_length(chunk); - unsigned CRC = lodepng_crc32(&chunk[4], length + 4); - lodepng_set32bitInt(chunk + 8 + length, CRC); -} - -unsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end) { - if(chunk >= end || end - chunk < 12) return end; /*too small to contain a chunk*/ - if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 - && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { - /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ - return chunk + 8; - } else { - size_t total_chunk_length; - unsigned char* result; - if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; - result = chunk + total_chunk_length; - if(result < chunk) return end; /*pointer overflow*/ - return result; - } -} - -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end) { - if(chunk >= end || end - chunk < 12) return end; /*too small to contain a chunk*/ - if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 - && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { - /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ - return chunk + 8; - } else { - size_t total_chunk_length; - const unsigned char* result; - if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; - result = chunk + total_chunk_length; - if(result < chunk) return end; /*pointer overflow*/ - return result; - } -} - -unsigned char* lodepng_chunk_find(unsigned char* chunk, unsigned char* end, const char type[5]) { - for(;;) { - if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */ - if(lodepng_chunk_type_equals(chunk, type)) return chunk; - chunk = lodepng_chunk_next(chunk, end); - } -} - -const unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]) { - for(;;) { - if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */ - if(lodepng_chunk_type_equals(chunk, type)) return chunk; - chunk = lodepng_chunk_next_const(chunk, end); - } -} - -unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk) { - unsigned i; - size_t total_chunk_length, new_length; - unsigned char *chunk_start, *new_buffer; - - if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return 77; - if(lodepng_addofl(*outsize, total_chunk_length, &new_length)) return 77; - - new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); - if(!new_buffer) return 83; /*alloc fail*/ - (*out) = new_buffer; - (*outsize) = new_length; - chunk_start = &(*out)[new_length - total_chunk_length]; - - for(i = 0; i != total_chunk_length; ++i) chunk_start[i] = chunk[i]; - - return 0; -} - -/*Sets length and name and allocates the space for data and crc but does not -set data or crc yet. Returns the start of the chunk in chunk. The start of -the data is at chunk + 8. To finalize chunk, add the data, then use -lodepng_chunk_generate_crc */ -static unsigned lodepng_chunk_init(unsigned char** chunk, - ucvector* out, - unsigned length, const char* type) { - size_t new_length = out->size; - if(lodepng_addofl(new_length, length, &new_length)) return 77; - if(lodepng_addofl(new_length, 12, &new_length)) return 77; - if(!ucvector_resize(out, new_length)) return 83; /*alloc fail*/ - *chunk = out->data + new_length - length - 12u; - - /*1: length*/ - lodepng_set32bitInt(*chunk, length); - - /*2: chunk name (4 letters)*/ - lodepng_memcpy(*chunk + 4, type, 4); - - return 0; -} - -/* like lodepng_chunk_create but with custom allocsize */ -static unsigned lodepng_chunk_createv(ucvector* out, - unsigned length, const char* type, const unsigned char* data) { - unsigned char* chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, length, type)); - - /*3: the data*/ - lodepng_memcpy(chunk + 8, data, length); - - /*4: CRC (of the chunkname characters and the data)*/ - lodepng_chunk_generate_crc(chunk); - - return 0; -} - -unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, - unsigned length, const char* type, const unsigned char* data) { - ucvector v = ucvector_init(*out, *outsize); - unsigned error = lodepng_chunk_createv(&v, length, type, data); - *out = v.data; - *outsize = v.size; - return error; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Color types, channels, bits / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*checks if the colortype is valid and the bitdepth bd is allowed for this colortype. -Return value is a LodePNG error code.*/ -static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) { - switch(colortype) { - case LCT_GREY: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break; - case LCT_RGB: if(!( bd == 8 || bd == 16)) return 37; break; - case LCT_PALETTE: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 )) return 37; break; - case LCT_GREY_ALPHA: if(!( bd == 8 || bd == 16)) return 37; break; - case LCT_RGBA: if(!( bd == 8 || bd == 16)) return 37; break; - case LCT_MAX_OCTET_VALUE: return 31; /* invalid color type */ - default: return 31; /* invalid color type */ - } - return 0; /*allowed color type / bits combination*/ -} - -static unsigned getNumColorChannels(LodePNGColorType colortype) { - switch(colortype) { - case LCT_GREY: return 1; - case LCT_RGB: return 3; - case LCT_PALETTE: return 1; - case LCT_GREY_ALPHA: return 2; - case LCT_RGBA: return 4; - case LCT_MAX_OCTET_VALUE: return 0; /* invalid color type */ - default: return 0; /*invalid color type*/ - } -} - -static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) { - /*bits per pixel is amount of channels * bits per channel*/ - return getNumColorChannels(colortype) * bitdepth; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -void lodepng_color_mode_init(LodePNGColorMode* info) { - info->key_defined = 0; - info->key_r = info->key_g = info->key_b = 0; - info->colortype = LCT_RGBA; - info->bitdepth = 8; - info->palette = 0; - info->palettesize = 0; -} - -/*allocates palette memory if needed, and initializes all colors to black*/ -static void lodepng_color_mode_alloc_palette(LodePNGColorMode* info) { - size_t i; - /*if the palette is already allocated, it will have size 1024 so no reallocation needed in that case*/ - /*the palette must have room for up to 256 colors with 4 bytes each.*/ - if(!info->palette) info->palette = (unsigned char*)lodepng_malloc(1024); - if(!info->palette) return; /*alloc fail*/ - for(i = 0; i != 256; ++i) { - /*Initialize all unused colors with black, the value used for invalid palette indices. - This is an error according to the PNG spec, but common PNG decoders make it black instead. - That makes color conversion slightly faster due to no error handling needed.*/ - info->palette[i * 4 + 0] = 0; - info->palette[i * 4 + 1] = 0; - info->palette[i * 4 + 2] = 0; - info->palette[i * 4 + 3] = 255; - } -} - -void lodepng_color_mode_cleanup(LodePNGColorMode* info) { - lodepng_palette_clear(info); -} - -unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) { - lodepng_color_mode_cleanup(dest); - lodepng_memcpy(dest, source, sizeof(LodePNGColorMode)); - if(source->palette) { - dest->palette = (unsigned char*)lodepng_malloc(1024); - if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ - lodepng_memcpy(dest->palette, source->palette, source->palettesize * 4); - } - return 0; -} - -LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth) { - LodePNGColorMode result; - lodepng_color_mode_init(&result); - result.colortype = colortype; - result.bitdepth = bitdepth; - return result; -} - -static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) { - size_t i; - if(a->colortype != b->colortype) return 0; - if(a->bitdepth != b->bitdepth) return 0; - if(a->key_defined != b->key_defined) return 0; - if(a->key_defined) { - if(a->key_r != b->key_r) return 0; - if(a->key_g != b->key_g) return 0; - if(a->key_b != b->key_b) return 0; - } - if(a->palettesize != b->palettesize) return 0; - for(i = 0; i != a->palettesize * 4; ++i) { - if(a->palette[i] != b->palette[i]) return 0; - } - return 1; -} - -void lodepng_palette_clear(LodePNGColorMode* info) { - if(info->palette) lodepng_free(info->palette); - info->palette = 0; - info->palettesize = 0; -} - -unsigned lodepng_palette_add(LodePNGColorMode* info, - unsigned char r, unsigned char g, unsigned char b, unsigned char a) { - if(!info->palette) /*allocate palette if empty*/ { - lodepng_color_mode_alloc_palette(info); - if(!info->palette) return 83; /*alloc fail*/ - } - if(info->palettesize >= 256) { - return 108; /*too many palette values*/ - } - info->palette[4 * info->palettesize + 0] = r; - info->palette[4 * info->palettesize + 1] = g; - info->palette[4 * info->palettesize + 2] = b; - info->palette[4 * info->palettesize + 3] = a; - ++info->palettesize; - return 0; -} - -/*calculate bits per pixel out of colortype and bitdepth*/ -unsigned lodepng_get_bpp(const LodePNGColorMode* info) { - return lodepng_get_bpp_lct(info->colortype, info->bitdepth); -} - -unsigned lodepng_get_channels(const LodePNGColorMode* info) { - return getNumColorChannels(info->colortype); -} - -unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info) { - return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; -} - -unsigned lodepng_is_alpha_type(const LodePNGColorMode* info) { - return (info->colortype & 4) != 0; /*4 or 6*/ -} - -unsigned lodepng_is_palette_type(const LodePNGColorMode* info) { - return info->colortype == LCT_PALETTE; -} - -unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) { - size_t i; - for(i = 0; i != info->palettesize; ++i) { - if(info->palette[i * 4 + 3] < 255) return 1; - } - return 0; -} - -unsigned lodepng_can_have_alpha(const LodePNGColorMode* info) { - return info->key_defined - || lodepng_is_alpha_type(info) - || lodepng_has_palette_alpha(info); -} - -static size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { - size_t bpp = lodepng_get_bpp_lct(colortype, bitdepth); - size_t n = (size_t)w * (size_t)h; - return ((n / 8u) * bpp) + ((n & 7u) * bpp + 7u) / 8u; -} - -size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) { - return lodepng_get_raw_size_lct(w, h, color->colortype, color->bitdepth); -} - - -#ifdef LODEPNG_COMPILE_PNG - -/*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer, -and in addition has one extra byte per line: the filter byte. So this gives a larger -result than lodepng_get_raw_size. Set h to 1 to get the size of 1 row including filter byte. */ -static size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, unsigned bpp) { - /* + 1 for the filter byte, and possibly plus padding bits per line. */ - /* Ignoring casts, the expression is equal to (w * bpp + 7) / 8 + 1, but avoids overflow of w * bpp */ - size_t line = ((size_t)(w / 8u) * bpp) + 1u + ((w & 7u) * bpp + 7u) / 8u; - return (size_t)h * line; -} - -#ifdef LODEPNG_COMPILE_DECODER -/*Safely checks whether size_t overflow can be caused due to amount of pixels. -This check is overcautious rather than precise. If this check indicates no overflow, -you can safely compute in a size_t (but not an unsigned): --(size_t)w * (size_t)h * 8 --amount of bytes in IDAT (including filter, padding and Adam7 bytes) --amount of bytes in raw color model -Returns 1 if overflow possible, 0 if not. -*/ -static int lodepng_pixel_overflow(unsigned w, unsigned h, - const LodePNGColorMode* pngcolor, const LodePNGColorMode* rawcolor) { - size_t bpp = LODEPNG_MAX(lodepng_get_bpp(pngcolor), lodepng_get_bpp(rawcolor)); - size_t numpixels, total; - size_t line; /* bytes per line in worst case */ - - if(lodepng_mulofl((size_t)w, (size_t)h, &numpixels)) return 1; - if(lodepng_mulofl(numpixels, 8, &total)) return 1; /* bit pointer with 8-bit color, or 8 bytes per channel color */ - - /* Bytes per scanline with the expression "(w / 8u) * bpp) + ((w & 7u) * bpp + 7u) / 8u" */ - if(lodepng_mulofl((size_t)(w / 8u), bpp, &line)) return 1; - if(lodepng_addofl(line, ((w & 7u) * bpp + 7u) / 8u, &line)) return 1; - - if(lodepng_addofl(line, 5, &line)) return 1; /* 5 bytes overhead per line: 1 filterbyte, 4 for Adam7 worst case */ - if(lodepng_mulofl(line, h, &total)) return 1; /* Total bytes in worst case */ - - return 0; /* no overflow */ -} -#endif /*LODEPNG_COMPILE_DECODER*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -static void LodePNGUnknownChunks_init(LodePNGInfo* info) { - unsigned i; - for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0; - for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0; -} - -static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) { - unsigned i; - for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]); -} - -static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) { - unsigned i; - - LodePNGUnknownChunks_cleanup(dest); - - for(i = 0; i != 3; ++i) { - size_t j; - dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; - dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]); - if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ - for(j = 0; j < src->unknown_chunks_size[i]; ++j) { - dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; - } - } - - return 0; -} - -/******************************************************************************/ - -static void LodePNGText_init(LodePNGInfo* info) { - info->text_num = 0; - info->text_keys = NULL; - info->text_strings = NULL; -} - -static void LodePNGText_cleanup(LodePNGInfo* info) { - size_t i; - for(i = 0; i != info->text_num; ++i) { - string_cleanup(&info->text_keys[i]); - string_cleanup(&info->text_strings[i]); - } - lodepng_free(info->text_keys); - lodepng_free(info->text_strings); -} - -static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) { - size_t i = 0; - dest->text_keys = 0; - dest->text_strings = 0; - dest->text_num = 0; - for(i = 0; i != source->text_num; ++i) { - CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); - } - return 0; -} - -static unsigned lodepng_add_text_sized(LodePNGInfo* info, const char* key, const char* str, size_t size) { - char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1))); - char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1))); - - if(new_keys) info->text_keys = new_keys; - if(new_strings) info->text_strings = new_strings; - - if(!new_keys || !new_strings) return 83; /*alloc fail*/ - - ++info->text_num; - info->text_keys[info->text_num - 1] = alloc_string(key); - info->text_strings[info->text_num - 1] = alloc_string_sized(str, size); - if(!info->text_keys[info->text_num - 1] || !info->text_strings[info->text_num - 1]) return 83; /*alloc fail*/ - - return 0; -} - -unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) { - return lodepng_add_text_sized(info, key, str, lodepng_strlen(str)); -} - -void lodepng_clear_text(LodePNGInfo* info) { - LodePNGText_cleanup(info); -} - -/******************************************************************************/ - -static void LodePNGIText_init(LodePNGInfo* info) { - info->itext_num = 0; - info->itext_keys = NULL; - info->itext_langtags = NULL; - info->itext_transkeys = NULL; - info->itext_strings = NULL; -} - -static void LodePNGIText_cleanup(LodePNGInfo* info) { - size_t i; - for(i = 0; i != info->itext_num; ++i) { - string_cleanup(&info->itext_keys[i]); - string_cleanup(&info->itext_langtags[i]); - string_cleanup(&info->itext_transkeys[i]); - string_cleanup(&info->itext_strings[i]); - } - lodepng_free(info->itext_keys); - lodepng_free(info->itext_langtags); - lodepng_free(info->itext_transkeys); - lodepng_free(info->itext_strings); -} - -static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) { - size_t i = 0; - dest->itext_keys = 0; - dest->itext_langtags = 0; - dest->itext_transkeys = 0; - dest->itext_strings = 0; - dest->itext_num = 0; - for(i = 0; i != source->itext_num; ++i) { - CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], - source->itext_transkeys[i], source->itext_strings[i])); - } - return 0; -} - -void lodepng_clear_itext(LodePNGInfo* info) { - LodePNGIText_cleanup(info); -} - -static unsigned lodepng_add_itext_sized(LodePNGInfo* info, const char* key, const char* langtag, - const char* transkey, const char* str, size_t size) { - char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1))); - char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1))); - char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1))); - char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1))); - - if(new_keys) info->itext_keys = new_keys; - if(new_langtags) info->itext_langtags = new_langtags; - if(new_transkeys) info->itext_transkeys = new_transkeys; - if(new_strings) info->itext_strings = new_strings; - - if(!new_keys || !new_langtags || !new_transkeys || !new_strings) return 83; /*alloc fail*/ - - ++info->itext_num; - - info->itext_keys[info->itext_num - 1] = alloc_string(key); - info->itext_langtags[info->itext_num - 1] = alloc_string(langtag); - info->itext_transkeys[info->itext_num - 1] = alloc_string(transkey); - info->itext_strings[info->itext_num - 1] = alloc_string_sized(str, size); - - return 0; -} - -unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, - const char* transkey, const char* str) { - return lodepng_add_itext_sized(info, key, langtag, transkey, str, lodepng_strlen(str)); -} - -/* same as set but does not delete */ -static unsigned lodepng_assign_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size) { - if(profile_size == 0) return 100; /*invalid ICC profile size*/ - - info->iccp_name = alloc_string(name); - info->iccp_profile = (unsigned char*)lodepng_malloc(profile_size); - - if(!info->iccp_name || !info->iccp_profile) return 83; /*alloc fail*/ - - lodepng_memcpy(info->iccp_profile, profile, profile_size); - info->iccp_profile_size = profile_size; - - return 0; /*ok*/ -} - -unsigned lodepng_set_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size) { - if(info->iccp_name) lodepng_clear_icc(info); - info->iccp_defined = 1; - - return lodepng_assign_icc(info, name, profile, profile_size); -} - -void lodepng_clear_icc(LodePNGInfo* info) { - string_cleanup(&info->iccp_name); - lodepng_free(info->iccp_profile); - info->iccp_profile = NULL; - info->iccp_profile_size = 0; - info->iccp_defined = 0; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -void lodepng_info_init(LodePNGInfo* info) { - lodepng_color_mode_init(&info->color); - info->interlace_method = 0; - info->compression_method = 0; - info->filter_method = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - info->background_defined = 0; - info->background_r = info->background_g = info->background_b = 0; - - LodePNGText_init(info); - LodePNGIText_init(info); - - info->time_defined = 0; - info->phys_defined = 0; - - info->gama_defined = 0; - info->chrm_defined = 0; - info->srgb_defined = 0; - info->iccp_defined = 0; - info->iccp_name = NULL; - info->iccp_profile = NULL; - - LodePNGUnknownChunks_init(info); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -void lodepng_info_cleanup(LodePNGInfo* info) { - lodepng_color_mode_cleanup(&info->color); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - LodePNGText_cleanup(info); - LodePNGIText_cleanup(info); - - lodepng_clear_icc(info); - - LodePNGUnknownChunks_cleanup(info); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source) { - lodepng_info_cleanup(dest); - lodepng_memcpy(dest, source, sizeof(LodePNGInfo)); - lodepng_color_mode_init(&dest->color); - CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); - CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); - if(source->iccp_defined) { - CERROR_TRY_RETURN(lodepng_assign_icc(dest, source->iccp_name, source->iccp_profile, source->iccp_profile_size)); - } - - LodePNGUnknownChunks_init(dest); - CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - return 0; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -/*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/ -static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in) { - unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/ - /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ - unsigned p = index & m; - in &= (1u << bits) - 1u; /*filter out any other bits of the input value*/ - in = in << (bits * (m - p)); - if(p == 0) out[index * bits / 8u] = in; - else out[index * bits / 8u] |= in; -} - -typedef struct ColorTree ColorTree; - -/* -One node of a color tree -This is the data structure used to count the number of unique colors and to get a palette -index for a color. It's like an octree, but because the alpha channel is used too, each -node has 16 instead of 8 children. -*/ -struct ColorTree { - ColorTree* children[16]; /*up to 16 pointers to ColorTree of next level*/ - int index; /*the payload. Only has a meaningful value if this is in the last level*/ -}; - -static void color_tree_init(ColorTree* tree) { - lodepng_memset(tree->children, 0, 16 * sizeof(*tree->children)); - tree->index = -1; -} - -static void color_tree_cleanup(ColorTree* tree) { - int i; - for(i = 0; i != 16; ++i) { - if(tree->children[i]) { - color_tree_cleanup(tree->children[i]); - lodepng_free(tree->children[i]); - } - } -} - -/*returns -1 if color not present, its index otherwise*/ -static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { - int bit = 0; - for(bit = 0; bit < 8; ++bit) { - int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); - if(!tree->children[i]) return -1; - else tree = tree->children[i]; - } - return tree ? tree->index : -1; -} - -#ifdef LODEPNG_COMPILE_ENCODER -static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { - return color_tree_get(tree, r, g, b, a) >= 0; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/*color is not allowed to already exist. -Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist") -Returns error code, or 0 if ok*/ -static unsigned color_tree_add(ColorTree* tree, - unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) { - int bit; - for(bit = 0; bit < 8; ++bit) { - int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); - if(!tree->children[i]) { - tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree)); - if(!tree->children[i]) return 83; /*alloc fail*/ - color_tree_init(tree->children[i]); - } - tree = tree->children[i]; - } - tree->index = (int)index; - return 0; -} - -/*put a pixel, given its RGBA color, into image of any color type*/ -static unsigned rgba8ToPixel(unsigned char* out, size_t i, - const LodePNGColorMode* mode, ColorTree* tree /*for palette*/, - unsigned char r, unsigned char g, unsigned char b, unsigned char a) { - if(mode->colortype == LCT_GREY) { - unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/ - if(mode->bitdepth == 8) out[i] = gray; - else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = gray; - else { - /*take the most significant bits of gray*/ - gray = ((unsigned)gray >> (8u - mode->bitdepth)) & ((1u << mode->bitdepth) - 1u); - addColorBits(out, i, mode->bitdepth, gray); - } - } else if(mode->colortype == LCT_RGB) { - if(mode->bitdepth == 8) { - out[i * 3 + 0] = r; - out[i * 3 + 1] = g; - out[i * 3 + 2] = b; - } else { - out[i * 6 + 0] = out[i * 6 + 1] = r; - out[i * 6 + 2] = out[i * 6 + 3] = g; - out[i * 6 + 4] = out[i * 6 + 5] = b; - } - } else if(mode->colortype == LCT_PALETTE) { - int index = color_tree_get(tree, r, g, b, a); - if(index < 0) return 82; /*color not in palette*/ - if(mode->bitdepth == 8) out[i] = index; - else addColorBits(out, i, mode->bitdepth, (unsigned)index); - } else if(mode->colortype == LCT_GREY_ALPHA) { - unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/ - if(mode->bitdepth == 8) { - out[i * 2 + 0] = gray; - out[i * 2 + 1] = a; - } else if(mode->bitdepth == 16) { - out[i * 4 + 0] = out[i * 4 + 1] = gray; - out[i * 4 + 2] = out[i * 4 + 3] = a; - } - } else if(mode->colortype == LCT_RGBA) { - if(mode->bitdepth == 8) { - out[i * 4 + 0] = r; - out[i * 4 + 1] = g; - out[i * 4 + 2] = b; - out[i * 4 + 3] = a; - } else { - out[i * 8 + 0] = out[i * 8 + 1] = r; - out[i * 8 + 2] = out[i * 8 + 3] = g; - out[i * 8 + 4] = out[i * 8 + 5] = b; - out[i * 8 + 6] = out[i * 8 + 7] = a; - } - } - - return 0; /*no error*/ -} - -/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ -static void rgba16ToPixel(unsigned char* out, size_t i, - const LodePNGColorMode* mode, - unsigned short r, unsigned short g, unsigned short b, unsigned short a) { - if(mode->colortype == LCT_GREY) { - unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/ - out[i * 2 + 0] = (gray >> 8) & 255; - out[i * 2 + 1] = gray & 255; - } else if(mode->colortype == LCT_RGB) { - out[i * 6 + 0] = (r >> 8) & 255; - out[i * 6 + 1] = r & 255; - out[i * 6 + 2] = (g >> 8) & 255; - out[i * 6 + 3] = g & 255; - out[i * 6 + 4] = (b >> 8) & 255; - out[i * 6 + 5] = b & 255; - } else if(mode->colortype == LCT_GREY_ALPHA) { - unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/ - out[i * 4 + 0] = (gray >> 8) & 255; - out[i * 4 + 1] = gray & 255; - out[i * 4 + 2] = (a >> 8) & 255; - out[i * 4 + 3] = a & 255; - } else if(mode->colortype == LCT_RGBA) { - out[i * 8 + 0] = (r >> 8) & 255; - out[i * 8 + 1] = r & 255; - out[i * 8 + 2] = (g >> 8) & 255; - out[i * 8 + 3] = g & 255; - out[i * 8 + 4] = (b >> 8) & 255; - out[i * 8 + 5] = b & 255; - out[i * 8 + 6] = (a >> 8) & 255; - out[i * 8 + 7] = a & 255; - } -} - -/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ -static void getPixelColorRGBA8(unsigned char* r, unsigned char* g, - unsigned char* b, unsigned char* a, - const unsigned char* in, size_t i, - const LodePNGColorMode* mode) { - if(mode->colortype == LCT_GREY) { - if(mode->bitdepth == 8) { - *r = *g = *b = in[i]; - if(mode->key_defined && *r == mode->key_r) *a = 0; - else *a = 255; - } else if(mode->bitdepth == 16) { - *r = *g = *b = in[i * 2 + 0]; - if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; - else *a = 255; - } else { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = i * mode->bitdepth; - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - *r = *g = *b = (value * 255) / highest; - if(mode->key_defined && value == mode->key_r) *a = 0; - else *a = 255; - } - } else if(mode->colortype == LCT_RGB) { - if(mode->bitdepth == 8) { - *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2]; - if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; - else *a = 255; - } else { - *r = in[i * 6 + 0]; - *g = in[i * 6 + 2]; - *b = in[i * 6 + 4]; - if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; - else *a = 255; - } - } else if(mode->colortype == LCT_PALETTE) { - unsigned index; - if(mode->bitdepth == 8) index = in[i]; - else { - size_t j = i * mode->bitdepth; - index = readBitsFromReversedStream(&j, in, mode->bitdepth); - } - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - *r = mode->palette[index * 4 + 0]; - *g = mode->palette[index * 4 + 1]; - *b = mode->palette[index * 4 + 2]; - *a = mode->palette[index * 4 + 3]; - } else if(mode->colortype == LCT_GREY_ALPHA) { - if(mode->bitdepth == 8) { - *r = *g = *b = in[i * 2 + 0]; - *a = in[i * 2 + 1]; - } else { - *r = *g = *b = in[i * 4 + 0]; - *a = in[i * 4 + 2]; - } - } else if(mode->colortype == LCT_RGBA) { - if(mode->bitdepth == 8) { - *r = in[i * 4 + 0]; - *g = in[i * 4 + 1]; - *b = in[i * 4 + 2]; - *a = in[i * 4 + 3]; - } else { - *r = in[i * 8 + 0]; - *g = in[i * 8 + 2]; - *b = in[i * 8 + 4]; - *a = in[i * 8 + 6]; - } - } -} - -/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color -mode test cases, optimized to convert the colors much faster, when converting -to the common case of RGBA with 8 bit per channel. buffer must be RGBA with -enough memory.*/ -static void getPixelColorsRGBA8(unsigned char* LODEPNG_RESTRICT buffer, size_t numpixels, - const unsigned char* LODEPNG_RESTRICT in, - const LodePNGColorMode* mode) { - unsigned num_channels = 4; - size_t i; - if(mode->colortype == LCT_GREY) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i]; - buffer[3] = 255; - } - if(mode->key_defined) { - buffer -= numpixels * num_channels; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - if(buffer[0] == mode->key_r) buffer[3] = 0; - } - } - } else if(mode->bitdepth == 16) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 2]; - buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; - } - } else { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = 0; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; - buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255; - } - } - } else if(mode->colortype == LCT_RGB) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - lodepng_memcpy(buffer, &in[i * 3], 3); - buffer[3] = 255; - } - if(mode->key_defined) { - buffer -= numpixels * num_channels; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - if(buffer[0] == mode->key_r && buffer[1]== mode->key_g && buffer[2] == mode->key_b) buffer[3] = 0; - } - } - } else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = in[i * 6 + 0]; - buffer[1] = in[i * 6 + 2]; - buffer[2] = in[i * 6 + 4]; - buffer[3] = mode->key_defined - && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255; - } - } - } else if(mode->colortype == LCT_PALETTE) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned index = in[i]; - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - lodepng_memcpy(buffer, &mode->palette[index * 4], 4); - } - } else { - size_t j = 0; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth); - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - lodepng_memcpy(buffer, &mode->palette[index * 4], 4); - } - } - } else if(mode->colortype == LCT_GREY_ALPHA) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; - buffer[3] = in[i * 2 + 1]; - } - } else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; - buffer[3] = in[i * 4 + 2]; - } - } - } else if(mode->colortype == LCT_RGBA) { - if(mode->bitdepth == 8) { - lodepng_memcpy(buffer, in, numpixels * 4); - } else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = in[i * 8 + 0]; - buffer[1] = in[i * 8 + 2]; - buffer[2] = in[i * 8 + 4]; - buffer[3] = in[i * 8 + 6]; - } - } - } -} - -/*Similar to getPixelColorsRGBA8, but with 3-channel RGB output.*/ -static void getPixelColorsRGB8(unsigned char* LODEPNG_RESTRICT buffer, size_t numpixels, - const unsigned char* LODEPNG_RESTRICT in, - const LodePNGColorMode* mode) { - const unsigned num_channels = 3; - size_t i; - if(mode->colortype == LCT_GREY) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i]; - } - } else if(mode->bitdepth == 16) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 2]; - } - } else { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = 0; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; - } - } - } else if(mode->colortype == LCT_RGB) { - if(mode->bitdepth == 8) { - lodepng_memcpy(buffer, in, numpixels * 3); - } else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = in[i * 6 + 0]; - buffer[1] = in[i * 6 + 2]; - buffer[2] = in[i * 6 + 4]; - } - } - } else if(mode->colortype == LCT_PALETTE) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned index = in[i]; - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - lodepng_memcpy(buffer, &mode->palette[index * 4], 3); - } - } else { - size_t j = 0; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth); - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - lodepng_memcpy(buffer, &mode->palette[index * 4], 3); - } - } - } else if(mode->colortype == LCT_GREY_ALPHA) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; - } - } else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; - } - } - } else if(mode->colortype == LCT_RGBA) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - lodepng_memcpy(buffer, &in[i * 4], 3); - } - } else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = in[i * 8 + 0]; - buffer[1] = in[i * 8 + 2]; - buffer[2] = in[i * 8 + 4]; - } - } - } -} - -/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with -given color type, but the given color type must be 16-bit itself.*/ -static void getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a, - const unsigned char* in, size_t i, const LodePNGColorMode* mode) { - if(mode->colortype == LCT_GREY) { - *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; - if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; - else *a = 65535; - } else if(mode->colortype == LCT_RGB) { - *r = 256u * in[i * 6 + 0] + in[i * 6 + 1]; - *g = 256u * in[i * 6 + 2] + in[i * 6 + 3]; - *b = 256u * in[i * 6 + 4] + in[i * 6 + 5]; - if(mode->key_defined - && 256u * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256u * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256u * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; - else *a = 65535; - } else if(mode->colortype == LCT_GREY_ALPHA) { - *r = *g = *b = 256u * in[i * 4 + 0] + in[i * 4 + 1]; - *a = 256u * in[i * 4 + 2] + in[i * 4 + 3]; - } else if(mode->colortype == LCT_RGBA) { - *r = 256u * in[i * 8 + 0] + in[i * 8 + 1]; - *g = 256u * in[i * 8 + 2] + in[i * 8 + 3]; - *b = 256u * in[i * 8 + 4] + in[i * 8 + 5]; - *a = 256u * in[i * 8 + 6] + in[i * 8 + 7]; - } -} - -unsigned lodepng_convert(unsigned char* out, const unsigned char* in, - const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, - unsigned w, unsigned h) { - size_t i; - ColorTree tree; - size_t numpixels = (size_t)w * (size_t)h; - unsigned error = 0; - - if(mode_in->colortype == LCT_PALETTE && !mode_in->palette) { - return 107; /* error: must provide palette if input mode is palette */ - } - - if(lodepng_color_mode_equal(mode_out, mode_in)) { - size_t numbytes = lodepng_get_raw_size(w, h, mode_in); - lodepng_memcpy(out, in, numbytes); - return 0; - } - - if(mode_out->colortype == LCT_PALETTE) { - size_t palettesize = mode_out->palettesize; - const unsigned char* palette = mode_out->palette; - size_t palsize = (size_t)1u << mode_out->bitdepth; - /*if the user specified output palette but did not give the values, assume - they want the values of the input color type (assuming that one is palette). - Note that we never create a new palette ourselves.*/ - if(palettesize == 0) { - palettesize = mode_in->palettesize; - palette = mode_in->palette; - /*if the input was also palette with same bitdepth, then the color types are also - equal, so copy literally. This to preserve the exact indices that were in the PNG - even in case there are duplicate colors in the palette.*/ - if(mode_in->colortype == LCT_PALETTE && mode_in->bitdepth == mode_out->bitdepth) { - size_t numbytes = lodepng_get_raw_size(w, h, mode_in); - lodepng_memcpy(out, in, numbytes); - return 0; - } - } - if(palettesize < palsize) palsize = palettesize; - color_tree_init(&tree); - for(i = 0; i != palsize; ++i) { - const unsigned char* p = &palette[i * 4]; - error = color_tree_add(&tree, p[0], p[1], p[2], p[3], (unsigned)i); - if(error) break; - } - } - - if(!error) { - if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) { - for(i = 0; i != numpixels; ++i) { - unsigned short r = 0, g = 0, b = 0, a = 0; - getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - rgba16ToPixel(out, i, mode_out, r, g, b, a); - } - } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) { - getPixelColorsRGBA8(out, numpixels, in, mode_in); - } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) { - getPixelColorsRGB8(out, numpixels, in, mode_in); - } else { - unsigned char r = 0, g = 0, b = 0, a = 0; - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); - error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); - if(error) break; - } - } - } - - if(mode_out->colortype == LCT_PALETTE) { - color_tree_cleanup(&tree); - } - - return error; -} - - -/* Converts a single rgb color without alpha from one type to another, color bits truncated to -their bitdepth. In case of single channel (gray or palette), only the r channel is used. Slow -function, do not use to process all pixels of an image. Alpha channel not supported on purpose: -this is for bKGD, supporting alpha may prevent it from finding a color in the palette, from the -specification it looks like bKGD should ignore the alpha values of the palette since it can use -any palette index but doesn't have an alpha channel. Idem with ignoring color key. */ -unsigned lodepng_convert_rgb( - unsigned* r_out, unsigned* g_out, unsigned* b_out, - unsigned r_in, unsigned g_in, unsigned b_in, - const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in) { - unsigned r = 0, g = 0, b = 0; - unsigned mul = 65535 / ((1u << mode_in->bitdepth) - 1u); /*65535, 21845, 4369, 257, 1*/ - unsigned shift = 16 - mode_out->bitdepth; - - if(mode_in->colortype == LCT_GREY || mode_in->colortype == LCT_GREY_ALPHA) { - r = g = b = r_in * mul; - } else if(mode_in->colortype == LCT_RGB || mode_in->colortype == LCT_RGBA) { - r = r_in * mul; - g = g_in * mul; - b = b_in * mul; - } else if(mode_in->colortype == LCT_PALETTE) { - if(r_in >= mode_in->palettesize) return 82; - r = mode_in->palette[r_in * 4 + 0] * 257u; - g = mode_in->palette[r_in * 4 + 1] * 257u; - b = mode_in->palette[r_in * 4 + 2] * 257u; - } else { - return 31; - } - - /* now convert to output format */ - if(mode_out->colortype == LCT_GREY || mode_out->colortype == LCT_GREY_ALPHA) { - *r_out = r >> shift ; - } else if(mode_out->colortype == LCT_RGB || mode_out->colortype == LCT_RGBA) { - *r_out = r >> shift ; - *g_out = g >> shift ; - *b_out = b >> shift ; - } else if(mode_out->colortype == LCT_PALETTE) { - unsigned i; - /* a 16-bit color cannot be in the palette */ - if((r >> 8) != (r & 255) || (g >> 8) != (g & 255) || (b >> 8) != (b & 255)) return 82; - for(i = 0; i < mode_out->palettesize; i++) { - unsigned j = i * 4; - if((r >> 8) == mode_out->palette[j + 0] && (g >> 8) == mode_out->palette[j + 1] && - (b >> 8) == mode_out->palette[j + 2]) { - *r_out = i; - return 0; - } - } - return 82; - } else { - return 31; - } - - return 0; -} - -#ifdef LODEPNG_COMPILE_ENCODER - -void lodepng_color_stats_init(LodePNGColorStats* stats) { - /*stats*/ - stats->colored = 0; - stats->key = 0; - stats->key_r = stats->key_g = stats->key_b = 0; - stats->alpha = 0; - stats->numcolors = 0; - stats->bits = 1; - stats->numpixels = 0; - /*settings*/ - stats->allow_palette = 1; - stats->allow_greyscale = 1; -} - -/*function used for debug purposes with C++*/ -/*void printColorStats(LodePNGColorStats* p) { - std::cout << "colored: " << (int)p->colored << ", "; - std::cout << "key: " << (int)p->key << ", "; - std::cout << "key_r: " << (int)p->key_r << ", "; - std::cout << "key_g: " << (int)p->key_g << ", "; - std::cout << "key_b: " << (int)p->key_b << ", "; - std::cout << "alpha: " << (int)p->alpha << ", "; - std::cout << "numcolors: " << (int)p->numcolors << ", "; - std::cout << "bits: " << (int)p->bits << std::endl; -}*/ - -/*Returns how many bits needed to represent given value (max 8 bit)*/ -static unsigned getValueRequiredBits(unsigned char value) { - if(value == 0 || value == 255) return 1; - /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ - if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; - return 8; -} - -/*stats must already have been inited. */ -unsigned lodepng_compute_color_stats(LodePNGColorStats* stats, - const unsigned char* in, unsigned w, unsigned h, - const LodePNGColorMode* mode_in) { - size_t i; - ColorTree tree; - size_t numpixels = (size_t)w * (size_t)h; - unsigned error = 0; - - /* mark things as done already if it would be impossible to have a more expensive case */ - unsigned colored_done = lodepng_is_greyscale_type(mode_in) ? 1 : 0; - unsigned alpha_done = lodepng_can_have_alpha(mode_in) ? 0 : 1; - unsigned numcolors_done = 0; - unsigned bpp = lodepng_get_bpp(mode_in); - unsigned bits_done = (stats->bits == 1 && bpp == 1) ? 1 : 0; - unsigned sixteen = 0; /* whether the input image is 16 bit */ - unsigned maxnumcolors = 257; - if(bpp <= 8) maxnumcolors = LODEPNG_MIN(257, stats->numcolors + (1u << bpp)); - - stats->numpixels += numpixels; - - /*if palette not allowed, no need to compute numcolors*/ - if(!stats->allow_palette) numcolors_done = 1; - - color_tree_init(&tree); - - /*If the stats was already filled in from previous data, fill its palette in tree - and mark things as done already if we know they are the most expensive case already*/ - if(stats->alpha) alpha_done = 1; - if(stats->colored) colored_done = 1; - if(stats->bits == 16) numcolors_done = 1; - if(stats->bits >= bpp) bits_done = 1; - if(stats->numcolors >= maxnumcolors) numcolors_done = 1; - - if(!numcolors_done) { - for(i = 0; i < stats->numcolors; i++) { - const unsigned char* color = &stats->palette[i * 4]; - error = color_tree_add(&tree, color[0], color[1], color[2], color[3], i); - if(error) goto cleanup; - } - } - - /*Check if the 16-bit input is truly 16-bit*/ - if(mode_in->bitdepth == 16 && !sixteen) { - unsigned short r = 0, g = 0, b = 0, a = 0; - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - if((r & 255) != ((r >> 8) & 255) || (g & 255) != ((g >> 8) & 255) || - (b & 255) != ((b >> 8) & 255) || (a & 255) != ((a >> 8) & 255)) /*first and second byte differ*/ { - stats->bits = 16; - sixteen = 1; - bits_done = 1; - numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ - break; - } - } - } - - if(sixteen) { - unsigned short r = 0, g = 0, b = 0, a = 0; - - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - - if(!colored_done && (r != g || r != b)) { - stats->colored = 1; - colored_done = 1; - } - - if(!alpha_done) { - unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b); - if(a != 65535 && (a != 0 || (stats->key && !matchkey))) { - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - } else if(a == 0 && !stats->alpha && !stats->key) { - stats->key = 1; - stats->key_r = r; - stats->key_g = g; - stats->key_b = b; - } else if(a == 65535 && stats->key && matchkey) { - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - } - } - if(alpha_done && numcolors_done && colored_done && bits_done) break; - } - - if(stats->key && !stats->alpha) { - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) { - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - } - } - } - } else /* < 16-bit */ { - unsigned char r = 0, g = 0, b = 0, a = 0; - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); - - if(!bits_done && stats->bits < 8) { - /*only r is checked, < 8 bits is only relevant for grayscale*/ - unsigned bits = getValueRequiredBits(r); - if(bits > stats->bits) stats->bits = bits; - } - bits_done = (stats->bits >= bpp); - - if(!colored_done && (r != g || r != b)) { - stats->colored = 1; - colored_done = 1; - if(stats->bits < 8) stats->bits = 8; /*PNG has no colored modes with less than 8-bit per channel*/ - } - - if(!alpha_done) { - unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b); - if(a != 255 && (a != 0 || (stats->key && !matchkey))) { - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ - } else if(a == 0 && !stats->alpha && !stats->key) { - stats->key = 1; - stats->key_r = r; - stats->key_g = g; - stats->key_b = b; - } else if(a == 255 && stats->key && matchkey) { - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ - } - } - - if(!numcolors_done) { - if(!color_tree_has(&tree, r, g, b, a)) { - error = color_tree_add(&tree, r, g, b, a, stats->numcolors); - if(error) goto cleanup; - if(stats->numcolors < 256) { - unsigned char* p = stats->palette; - unsigned n = stats->numcolors; - p[n * 4 + 0] = r; - p[n * 4 + 1] = g; - p[n * 4 + 2] = b; - p[n * 4 + 3] = a; - } - ++stats->numcolors; - numcolors_done = stats->numcolors >= maxnumcolors; - } - } - - if(alpha_done && numcolors_done && colored_done && bits_done) break; - } - - if(stats->key && !stats->alpha) { - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); - if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) { - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ - } - } - } - - /*make the stats's key always 16-bit for consistency - repeat each byte twice*/ - stats->key_r += (stats->key_r << 8); - stats->key_g += (stats->key_g << 8); - stats->key_b += (stats->key_b << 8); - } - -cleanup: - color_tree_cleanup(&tree); - return error; -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*Adds a single color to the color stats. The stats must already have been inited. The color must be given as 16-bit -(with 2 bytes repeating for 8-bit and 65535 for opaque alpha channel). This function is expensive, do not call it for -all pixels of an image but only for a few additional values. */ -static unsigned lodepng_color_stats_add(LodePNGColorStats* stats, - unsigned r, unsigned g, unsigned b, unsigned a) { - unsigned error = 0; - unsigned char image[8]; - LodePNGColorMode mode; - lodepng_color_mode_init(&mode); - image[0] = r >> 8; image[1] = r; image[2] = g >> 8; image[3] = g; - image[4] = b >> 8; image[5] = b; image[6] = a >> 8; image[7] = a; - mode.bitdepth = 16; - mode.colortype = LCT_RGBA; - error = lodepng_compute_color_stats(stats, image, 1, 1, &mode); - lodepng_color_mode_cleanup(&mode); - return error; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/*Computes a minimal PNG color model that can contain all colors as indicated by the stats. -The stats should be computed with lodepng_compute_color_stats. -mode_in is raw color profile of the image the stats were computed on, to copy palette order from when relevant. -Minimal PNG color model means the color type and bit depth that gives smallest amount of bits in the output image, -e.g. gray if only grayscale pixels, palette if less than 256 colors, color key if only single transparent color, ... -This is used if auto_convert is enabled (it is by default). -*/ -static unsigned auto_choose_color(LodePNGColorMode* mode_out, - const LodePNGColorMode* mode_in, - const LodePNGColorStats* stats) { - unsigned error = 0; - unsigned palettebits; - size_t i, n; - size_t numpixels = stats->numpixels; - unsigned palette_ok, gray_ok; - - unsigned alpha = stats->alpha; - unsigned key = stats->key; - unsigned bits = stats->bits; - - mode_out->key_defined = 0; - - if(key && numpixels <= 16) { - alpha = 1; /*too few pixels to justify tRNS chunk overhead*/ - key = 0; - if(bits < 8) bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ - } - - gray_ok = !stats->colored; - if(!stats->allow_greyscale) gray_ok = 0; - if(!gray_ok && bits < 8) bits = 8; - - n = stats->numcolors; - palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); - palette_ok = n <= 256 && bits <= 8 && n != 0; /*n==0 means likely numcolors wasn't computed*/ - if(numpixels < n * 2) palette_ok = 0; /*don't add palette overhead if image has only a few pixels*/ - if(gray_ok && !alpha && bits <= palettebits) palette_ok = 0; /*gray is less overhead*/ - if(!stats->allow_palette) palette_ok = 0; - - if(palette_ok) { - const unsigned char* p = stats->palette; - lodepng_palette_clear(mode_out); /*remove potential earlier palette*/ - for(i = 0; i != stats->numcolors; ++i) { - error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); - if(error) break; - } - - mode_out->colortype = LCT_PALETTE; - mode_out->bitdepth = palettebits; - - if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize - && mode_in->bitdepth == mode_out->bitdepth) { - /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/ - lodepng_color_mode_cleanup(mode_out); - lodepng_color_mode_copy(mode_out, mode_in); - } - } else /*8-bit or 16-bit per channel*/ { - mode_out->bitdepth = bits; - mode_out->colortype = alpha ? (gray_ok ? LCT_GREY_ALPHA : LCT_RGBA) - : (gray_ok ? LCT_GREY : LCT_RGB); - if(key) { - unsigned mask = (1u << mode_out->bitdepth) - 1u; /*stats always uses 16-bit, mask converts it*/ - mode_out->key_r = stats->key_r & mask; - mode_out->key_g = stats->key_g & mask; - mode_out->key_b = stats->key_b & mask; - mode_out->key_defined = 1; - } - } - - return error; -} - -#endif /* #ifdef LODEPNG_COMPILE_ENCODER */ - -/* -Paeth predictor, used by PNG filter type 4 -The parameters are of type short, but should come from unsigned chars, the shorts -are only needed to make the paeth calculation correct. -*/ -static unsigned char paethPredictor(short a, short b, short c) { - short pa = LODEPNG_ABS(b - c); - short pb = LODEPNG_ABS(a - c); - short pc = LODEPNG_ABS(a + b - c - c); - /* return input value associated with smallest of pa, pb, pc (with certain priority if equal) */ - if(pb < pa) { a = b; pa = pb; } - return (pc < pa) ? c : a; -} - -/*shared values used by multiple Adam7 related functions*/ - -static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ -static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ -static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ -static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ - -/* -Outputs various dimensions and positions in the image related to the Adam7 reduced images. -passw: output containing the width of the 7 passes -passh: output containing the height of the 7 passes -filter_passstart: output containing the index of the start and end of each - reduced image with filter bytes -padded_passstart output containing the index of the start and end of each - reduced image when without filter bytes but with padded scanlines -passstart: output containing the index of the start and end of each reduced - image without padding between scanlines, but still padding between the images -w, h: width and height of non-interlaced image -bpp: bits per pixel -"padded" is only relevant if bpp is less than 8 and a scanline or image does not - end at a full byte -*/ -static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], - size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) { - /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ - unsigned i; - - /*calculate width and height in pixels of each pass*/ - for(i = 0; i != 7; ++i) { - passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; - passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; - if(passw[i] == 0) passh[i] = 0; - if(passh[i] == 0) passw[i] = 0; - } - - filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; - for(i = 0; i != 7; ++i) { - /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ - filter_passstart[i + 1] = filter_passstart[i] - + ((passw[i] && passh[i]) ? passh[i] * (1u + (passw[i] * bpp + 7u) / 8u) : 0); - /*bits padded if needed to fill full byte at end of each scanline*/ - padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7u) / 8u); - /*only padded at end of reduced image*/ - passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7u) / 8u; - } -} - -#ifdef LODEPNG_COMPILE_DECODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG Decoder / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*read the information from the header and store it in the LodePNGInfo. return value is error*/ -unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, - const unsigned char* in, size_t insize) { - unsigned width, height; - LodePNGInfo* info = &state->info_png; - if(insize == 0 || in == 0) { - CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ - } - if(insize < 33) { - CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ - } - - /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ - /* TODO: remove this. One should use a new LodePNGState for new sessions */ - lodepng_info_cleanup(info); - lodepng_info_init(info); - - if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 - || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) { - CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ - } - if(lodepng_chunk_length(in + 8) != 13) { - CERROR_RETURN_ERROR(state->error, 94); /*error: header size must be 13 bytes*/ - } - if(!lodepng_chunk_type_equals(in + 8, "IHDR")) { - CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ - } - - /*read the values given in the header*/ - width = lodepng_read32bitInt(&in[16]); - height = lodepng_read32bitInt(&in[20]); - /*TODO: remove the undocumented feature that allows to give null pointers to width or height*/ - if(w) *w = width; - if(h) *h = height; - info->color.bitdepth = in[24]; - info->color.colortype = (LodePNGColorType)in[25]; - info->compression_method = in[26]; - info->filter_method = in[27]; - info->interlace_method = in[28]; - - /*errors returned only after the parsing so other values are still output*/ - - /*error: invalid image size*/ - if(width == 0 || height == 0) CERROR_RETURN_ERROR(state->error, 93); - /*error: invalid colortype or bitdepth combination*/ - state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); - if(state->error) return state->error; - /*error: only compression method 0 is allowed in the specification*/ - if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); - /*error: only filter method 0 is allowed in the specification*/ - if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); - /*error: only interlace methods 0 and 1 exist in the specification*/ - if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); - - if(!state->decoder.ignore_crc) { - unsigned CRC = lodepng_read32bitInt(&in[29]); - unsigned checksum = lodepng_crc32(&in[12], 17); - if(CRC != checksum) { - CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ - } - } - - return state->error; -} - -static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon, - size_t bytewidth, unsigned char filterType, size_t length) { - /* - For PNG filter method 0 - unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, - the filter works byte per byte (bytewidth = 1) - precon is the previous unfiltered scanline, recon the result, scanline the current one - the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead - recon and scanline MAY be the same memory address! precon must be disjoint. - */ - - size_t i; - switch(filterType) { - case 0: - for(i = 0; i != length; ++i) recon[i] = scanline[i]; - break; - case 1: - for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; - for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + recon[i - bytewidth]; - break; - case 2: - if(precon) { - for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i]; - } else { - for(i = 0; i != length; ++i) recon[i] = scanline[i]; - } - break; - case 3: - if(precon) { - for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1u); - for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) >> 1u); - } else { - for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; - for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + (recon[i - bytewidth] >> 1u); - } - break; - case 4: - if(precon) { - for(i = 0; i != bytewidth; ++i) { - recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ - } - - /* Unroll independent paths of the paeth predictor. A 6x and 8x version would also be possible but that - adds too much code. Whether this actually speeds anything up at all depends on compiler and settings. */ - if(bytewidth >= 4) { - for(; i + 3 < length; i += 4) { - size_t j = i - bytewidth; - unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2], s3 = scanline[i + 3]; - unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2], r3 = recon[j + 3]; - unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2], p3 = precon[i + 3]; - unsigned char q0 = precon[j + 0], q1 = precon[j + 1], q2 = precon[j + 2], q3 = precon[j + 3]; - recon[i + 0] = s0 + paethPredictor(r0, p0, q0); - recon[i + 1] = s1 + paethPredictor(r1, p1, q1); - recon[i + 2] = s2 + paethPredictor(r2, p2, q2); - recon[i + 3] = s3 + paethPredictor(r3, p3, q3); - } - } else if(bytewidth >= 3) { - for(; i + 2 < length; i += 3) { - size_t j = i - bytewidth; - unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2]; - unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2]; - unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2]; - unsigned char q0 = precon[j + 0], q1 = precon[j + 1], q2 = precon[j + 2]; - recon[i + 0] = s0 + paethPredictor(r0, p0, q0); - recon[i + 1] = s1 + paethPredictor(r1, p1, q1); - recon[i + 2] = s2 + paethPredictor(r2, p2, q2); - } - } else if(bytewidth >= 2) { - for(; i + 1 < length; i += 2) { - size_t j = i - bytewidth; - unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1]; - unsigned char r0 = recon[j + 0], r1 = recon[j + 1]; - unsigned char p0 = precon[i + 0], p1 = precon[i + 1]; - unsigned char q0 = precon[j + 0], q1 = precon[j + 1]; - recon[i + 0] = s0 + paethPredictor(r0, p0, q0); - recon[i + 1] = s1 + paethPredictor(r1, p1, q1); - } - } - - for(; i != length; ++i) { - recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); - } - } else { - for(i = 0; i != bytewidth; ++i) { - recon[i] = scanline[i]; - } - for(i = bytewidth; i < length; ++i) { - /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ - recon[i] = (scanline[i] + recon[i - bytewidth]); - } - } - break; - default: return 36; /*error: invalid filter type given*/ - } - return 0; -} - -static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) { - /* - For PNG filter method 0 - this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) - out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline - w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel - in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) - */ - - unsigned y; - unsigned char* prevline = 0; - - /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ - size_t bytewidth = (bpp + 7u) / 8u; - /*the width of a scanline in bytes, not including the filter type*/ - size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u; - - for(y = 0; y < h; ++y) { - size_t outindex = linebytes * y; - size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - unsigned char filterType = in[inindex]; - - CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); - - prevline = &out[outindex]; - } - - return 0; -} - -/* -in: Adam7 interlaced image, with no padding bits between scanlines, but between - reduced images so that each reduced image starts at a byte. -out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h -bpp: bits per pixel -out has the following size in bits: w * h * bpp. -in is possibly bigger due to padding bits between reduced images. -out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation -(because that's likely a little bit faster) -NOTE: comments about padding bits are only relevant if bpp < 8 -*/ -static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) { - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - if(bpp >= 8) { - for(i = 0; i != 7; ++i) { - unsigned x, y, b; - size_t bytewidth = bpp / 8u; - for(y = 0; y < passh[i]; ++y) - for(x = 0; x < passw[i]; ++x) { - size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; - size_t pixeloutstart = ((ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * (size_t)w - + ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bytewidth; - for(b = 0; b < bytewidth; ++b) { - out[pixeloutstart + b] = in[pixelinstart + b]; - } - } - } - } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ { - for(i = 0; i != 7; ++i) { - unsigned x, y, b; - unsigned ilinebits = bpp * passw[i]; - unsigned olinebits = bpp * w; - size_t obp, ibp; /*bit pointers (for out and in buffer)*/ - for(y = 0; y < passh[i]; ++y) - for(x = 0; x < passw[i]; ++x) { - ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); - obp = (ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bpp; - for(b = 0; b < bpp; ++b) { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - } - } - } -} - -static void removePaddingBits(unsigned char* out, const unsigned char* in, - size_t olinebits, size_t ilinebits, unsigned h) { - /* - After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need - to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers - for the Adam7 code, the color convert code and the output to the user. - in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must - have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits - also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 - only useful if (ilinebits - olinebits) is a value in the range 1..7 - */ - unsigned y; - size_t diff = ilinebits - olinebits; - size_t ibp = 0, obp = 0; /*input and output bit pointers*/ - for(y = 0; y < h; ++y) { - size_t x; - for(x = 0; x < olinebits; ++x) { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - ibp += diff; - } -} - -/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from -the IDAT chunks (with filter index bytes and possible padding bits) -return value is error*/ -static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, - unsigned w, unsigned h, const LodePNGInfo* info_png) { - /* - This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. - Steps: - *) if no Adam7: 1) unfilter 2) remove padding bits (= possible extra bits per scanline if bpp < 8) - *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace - NOTE: the in buffer will be overwritten with intermediate data! - */ - unsigned bpp = lodepng_get_bpp(&info_png->color); - if(bpp == 0) return 31; /*error: invalid colortype*/ - - if(info_png->interlace_method == 0) { - if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) { - CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); - removePaddingBits(out, in, w * bpp, ((w * bpp + 7u) / 8u) * 8u, h); - } - /*we can immediately filter into the out buffer, no other steps needed*/ - else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); - } else /*interlace_method is 1 (Adam7)*/ { - unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - for(i = 0; i != 7; ++i) { - CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); - /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, - move bytes instead of bits or move not at all*/ - if(bpp < 8) { - /*remove padding bits in scanlines; after this there still may be padding - bits between the different reduced images: each reduced image still starts nicely at a byte*/ - removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, - ((passw[i] * bpp + 7u) / 8u) * 8u, passh[i]); - } - } - - Adam7_deinterlace(out, in, w, h, bpp); - } - - return 0; -} - -static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) { - unsigned pos = 0, i; - color->palettesize = chunkLength / 3u; - if(color->palettesize == 0 || color->palettesize > 256) return 38; /*error: palette too small or big*/ - lodepng_color_mode_alloc_palette(color); - if(!color->palette && color->palettesize) { - color->palettesize = 0; - return 83; /*alloc fail*/ - } - - for(i = 0; i != color->palettesize; ++i) { - color->palette[4 * i + 0] = data[pos++]; /*R*/ - color->palette[4 * i + 1] = data[pos++]; /*G*/ - color->palette[4 * i + 2] = data[pos++]; /*B*/ - color->palette[4 * i + 3] = 255; /*alpha*/ - } - - return 0; /* OK */ -} - -static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) { - unsigned i; - if(color->colortype == LCT_PALETTE) { - /*error: more alpha values given than there are palette entries*/ - if(chunkLength > color->palettesize) return 39; - - for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i]; - } else if(color->colortype == LCT_GREY) { - /*error: this chunk must be 2 bytes for grayscale image*/ - if(chunkLength != 2) return 30; - - color->key_defined = 1; - color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1]; - } else if(color->colortype == LCT_RGB) { - /*error: this chunk must be 6 bytes for RGB image*/ - if(chunkLength != 6) return 41; - - color->key_defined = 1; - color->key_r = 256u * data[0] + data[1]; - color->key_g = 256u * data[2] + data[3]; - color->key_b = 256u * data[4] + data[5]; - } - else return 42; /*error: tRNS chunk not allowed for other color models*/ - - return 0; /* OK */ -} - - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*background color chunk (bKGD)*/ -static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - if(info->color.colortype == LCT_PALETTE) { - /*error: this chunk must be 1 byte for indexed color image*/ - if(chunkLength != 1) return 43; - - /*error: invalid palette index, or maybe this chunk appeared before PLTE*/ - if(data[0] >= info->color.palettesize) return 103; - - info->background_defined = 1; - info->background_r = info->background_g = info->background_b = data[0]; - } else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { - /*error: this chunk must be 2 bytes for grayscale image*/ - if(chunkLength != 2) return 44; - - /*the values are truncated to bitdepth in the PNG file*/ - info->background_defined = 1; - info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1]; - } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { - /*error: this chunk must be 6 bytes for grayscale image*/ - if(chunkLength != 6) return 45; - - /*the values are truncated to bitdepth in the PNG file*/ - info->background_defined = 1; - info->background_r = 256u * data[0] + data[1]; - info->background_g = 256u * data[2] + data[3]; - info->background_b = 256u * data[4] + data[5]; - } - - return 0; /* OK */ -} - -/*text chunk (tEXt)*/ -static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - unsigned error = 0; - char *key = 0, *str = 0; - - while(!error) /*not really a while loop, only used to break on error*/ { - unsigned length, string2_begin; - - length = 0; - while(length < chunkLength && data[length] != 0) ++length; - /*even though it's not allowed by the standard, no error is thrown if - there's no null termination char, if the text is empty*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char*)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(key, data, length); - key[length] = 0; - - string2_begin = length + 1; /*skip keyword null terminator*/ - - length = (unsigned)(chunkLength < string2_begin ? 0 : chunkLength - string2_begin); - str = (char*)lodepng_malloc(length + 1); - if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(str, data + string2_begin, length); - str[length] = 0; - - error = lodepng_add_text(info, key, str); - - break; - } - - lodepng_free(key); - lodepng_free(str); - - return error; -} - -/*compressed text chunk (zTXt)*/ -static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, - const unsigned char* data, size_t chunkLength) { - unsigned error = 0; - - unsigned length, string2_begin; - char *key = 0; - unsigned char* str = 0; - size_t size = 0; - - while(!error) /*not really a while loop, only used to break on error*/ { - for(length = 0; length < chunkLength && data[length] != 0; ++length) ; - if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char*)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(key, data, length); - key[length] = 0; - - if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ - - string2_begin = length + 2; - if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ - - length = (unsigned)chunkLength - string2_begin; - /*will fail if zlib error, e.g. if length is too small*/ - error = zlib_decompress(&str, &size, 0, &data[string2_begin], - length, zlibsettings); - if(error) break; - error = lodepng_add_text_sized(info, key, (char*)str, size); - - break; - } - - lodepng_free(key); - lodepng_free(str); - - return error; -} - -/*international text chunk (iTXt)*/ -static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, - const unsigned char* data, size_t chunkLength) { - unsigned error = 0; - unsigned i; - - unsigned length, begin, compressed; - char *key = 0, *langtag = 0, *transkey = 0; - - while(!error) /*not really a while loop, only used to break on error*/ { - /*Quick check if the chunk length isn't too small. Even without check - it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ - if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ - - /*read the key*/ - for(length = 0; length < chunkLength && data[length] != 0; ++length) ; - if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char*)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(key, data, length); - key[length] = 0; - - /*read the compression method*/ - compressed = data[length + 1]; - if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ - - /*even though it's not allowed by the standard, no error is thrown if - there's no null termination char, if the text is empty for the next 3 texts*/ - - /*read the langtag*/ - begin = length + 3; - length = 0; - for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; - - langtag = (char*)lodepng_malloc(length + 1); - if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(langtag, data + begin, length); - langtag[length] = 0; - - /*read the transkey*/ - begin += length + 1; - length = 0; - for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; - - transkey = (char*)lodepng_malloc(length + 1); - if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(transkey, data + begin, length); - transkey[length] = 0; - - /*read the actual text*/ - begin += length + 1; - - length = (unsigned)chunkLength < begin ? 0 : (unsigned)chunkLength - begin; - - if(compressed) { - unsigned char* str = 0; - size_t size = 0; - /*will fail if zlib error, e.g. if length is too small*/ - error = zlib_decompress(&str, &size, 0, &data[begin], - length, zlibsettings); - if(!error) error = lodepng_add_itext_sized(info, key, langtag, transkey, (char*)str, size); - lodepng_free(str); - } else { - error = lodepng_add_itext_sized(info, key, langtag, transkey, (char*)(data + begin), length); - } - - break; - } - - lodepng_free(key); - lodepng_free(langtag); - lodepng_free(transkey); - - return error; -} - -static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ - - info->time_defined = 1; - info->time.year = 256u * data[0] + data[1]; - info->time.month = data[2]; - info->time.day = data[3]; - info->time.hour = data[4]; - info->time.minute = data[5]; - info->time.second = data[6]; - - return 0; /* OK */ -} - -static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ - - info->phys_defined = 1; - info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; - info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7]; - info->phys_unit = data[8]; - - return 0; /* OK */ -} - -static unsigned readChunk_gAMA(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - if(chunkLength != 4) return 96; /*invalid gAMA chunk size*/ - - info->gama_defined = 1; - info->gama_gamma = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; - - return 0; /* OK */ -} - -static unsigned readChunk_cHRM(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - if(chunkLength != 32) return 97; /*invalid cHRM chunk size*/ - - info->chrm_defined = 1; - info->chrm_white_x = 16777216u * data[ 0] + 65536u * data[ 1] + 256u * data[ 2] + data[ 3]; - info->chrm_white_y = 16777216u * data[ 4] + 65536u * data[ 5] + 256u * data[ 6] + data[ 7]; - info->chrm_red_x = 16777216u * data[ 8] + 65536u * data[ 9] + 256u * data[10] + data[11]; - info->chrm_red_y = 16777216u * data[12] + 65536u * data[13] + 256u * data[14] + data[15]; - info->chrm_green_x = 16777216u * data[16] + 65536u * data[17] + 256u * data[18] + data[19]; - info->chrm_green_y = 16777216u * data[20] + 65536u * data[21] + 256u * data[22] + data[23]; - info->chrm_blue_x = 16777216u * data[24] + 65536u * data[25] + 256u * data[26] + data[27]; - info->chrm_blue_y = 16777216u * data[28] + 65536u * data[29] + 256u * data[30] + data[31]; - - return 0; /* OK */ -} - -static unsigned readChunk_sRGB(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - if(chunkLength != 1) return 98; /*invalid sRGB chunk size (this one is never ignored)*/ - - info->srgb_defined = 1; - info->srgb_intent = data[0]; - - return 0; /* OK */ -} - -static unsigned readChunk_iCCP(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, - const unsigned char* data, size_t chunkLength) { - unsigned error = 0; - unsigned i; - size_t size = 0; - - unsigned length, string2_begin; - - info->iccp_defined = 1; - if(info->iccp_name) lodepng_clear_icc(info); - - for(length = 0; length < chunkLength && data[length] != 0; ++length) ; - if(length + 2 >= chunkLength) return 75; /*no null termination, corrupt?*/ - if(length < 1 || length > 79) return 89; /*keyword too short or long*/ - - info->iccp_name = (char*)lodepng_malloc(length + 1); - if(!info->iccp_name) return 83; /*alloc fail*/ - - info->iccp_name[length] = 0; - for(i = 0; i != length; ++i) info->iccp_name[i] = (char)data[i]; - - if(data[length + 1] != 0) return 72; /*the 0 byte indicating compression must be 0*/ - - string2_begin = length + 2; - if(string2_begin > chunkLength) return 75; /*no null termination, corrupt?*/ - - length = (unsigned)chunkLength - string2_begin; - error = zlib_decompress(&info->iccp_profile, &size, 0, - &data[string2_begin], - length, zlibsettings); - info->iccp_profile_size = size; - if(!error && !info->iccp_profile_size) error = 100; /*invalid ICC profile size*/ - return error; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos, - const unsigned char* in, size_t insize) { - const unsigned char* chunk = in + pos; - unsigned chunkLength; - const unsigned char* data; - unsigned unhandled = 0; - unsigned error = 0; - - if(pos + 4 > insize) return 30; - chunkLength = lodepng_chunk_length(chunk); - if(chunkLength > 2147483647) return 63; - data = lodepng_chunk_data_const(chunk); - if(data + chunkLength + 4 > in + insize) return 30; - - if(lodepng_chunk_type_equals(chunk, "PLTE")) { - error = readChunk_PLTE(&state->info_png.color, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "tRNS")) { - error = readChunk_tRNS(&state->info_png.color, data, chunkLength); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - } else if(lodepng_chunk_type_equals(chunk, "bKGD")) { - error = readChunk_bKGD(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "tEXt")) { - error = readChunk_tEXt(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "zTXt")) { - error = readChunk_zTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "iTXt")) { - error = readChunk_iTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "tIME")) { - error = readChunk_tIME(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "pHYs")) { - error = readChunk_pHYs(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "gAMA")) { - error = readChunk_gAMA(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "cHRM")) { - error = readChunk_cHRM(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "sRGB")) { - error = readChunk_sRGB(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "iCCP")) { - error = readChunk_iCCP(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } else { - /* unhandled chunk is ok (is not an error) */ - unhandled = 1; - } - - if(!error && !unhandled && !state->decoder.ignore_crc) { - if(lodepng_chunk_check_crc(chunk)) return 57; /*invalid CRC*/ - } - - return error; -} - -/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ -static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize) { - unsigned char IEND = 0; - const unsigned char* chunk; - unsigned char* idat; /*the data from idat chunks, zlib compressed*/ - size_t idatsize = 0; - unsigned char* scanlines = 0; - size_t scanlines_size = 0, expected_size = 0; - size_t outsize = 0; - - /*for unknown chunk order*/ - unsigned unknown = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - - - /* safe output values in case error happens */ - *out = 0; - *w = *h = 0; - - state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ - if(state->error) return; - - if(lodepng_pixel_overflow(*w, *h, &state->info_png.color, &state->info_raw)) { - CERROR_RETURN(state->error, 92); /*overflow possible due to amount of pixels*/ - } - - /*the input filesize is a safe upper bound for the sum of idat chunks size*/ - idat = (unsigned char*)lodepng_malloc(insize); - if(!idat) CERROR_RETURN(state->error, 83); /*alloc fail*/ - - chunk = &in[33]; /*first byte of the first chunk after the header*/ - - /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. - IDAT data is put at the start of the in buffer*/ - while(!IEND && !state->error) { - unsigned chunkLength; - const unsigned char* data; /*the data in the chunk*/ - - /*error: size of the in buffer too small to contain next chunk*/ - if((size_t)((chunk - in) + 12) > insize || chunk < in) { - if(state->decoder.ignore_end) break; /*other errors may still happen though*/ - CERROR_BREAK(state->error, 30); - } - - /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/ - chunkLength = lodepng_chunk_length(chunk); - /*error: chunk length larger than the max PNG chunk size*/ - if(chunkLength > 2147483647) { - if(state->decoder.ignore_end) break; /*other errors may still happen though*/ - CERROR_BREAK(state->error, 63); - } - - if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) { - CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/ - } - - data = lodepng_chunk_data_const(chunk); - - unknown = 0; - - /*IDAT chunk, containing compressed image data*/ - if(lodepng_chunk_type_equals(chunk, "IDAT")) { - size_t newsize; - if(lodepng_addofl(idatsize, chunkLength, &newsize)) CERROR_BREAK(state->error, 95); - if(newsize > insize) CERROR_BREAK(state->error, 95); - lodepng_memcpy(idat + idatsize, data, chunkLength); - idatsize += chunkLength; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - critical_pos = 3; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } else if(lodepng_chunk_type_equals(chunk, "IEND")) { - /*IEND chunk*/ - IEND = 1; - } else if(lodepng_chunk_type_equals(chunk, "PLTE")) { - /*palette chunk (PLTE)*/ - state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength); - if(state->error) break; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - critical_pos = 2; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } else if(lodepng_chunk_type_equals(chunk, "tRNS")) { - /*palette transparency chunk (tRNS). Even though this one is an ancillary chunk , it is still compiled - in without 'LODEPNG_COMPILE_ANCILLARY_CHUNKS' because it contains essential color information that - affects the alpha channel of pixels. */ - state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength); - if(state->error) break; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*background color chunk (bKGD)*/ - } else if(lodepng_chunk_type_equals(chunk, "bKGD")) { - state->error = readChunk_bKGD(&state->info_png, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "tEXt")) { - /*text chunk (tEXt)*/ - if(state->decoder.read_text_chunks) { - state->error = readChunk_tEXt(&state->info_png, data, chunkLength); - if(state->error) break; - } - } else if(lodepng_chunk_type_equals(chunk, "zTXt")) { - /*compressed text chunk (zTXt)*/ - if(state->decoder.read_text_chunks) { - state->error = readChunk_zTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); - if(state->error) break; - } - } else if(lodepng_chunk_type_equals(chunk, "iTXt")) { - /*international text chunk (iTXt)*/ - if(state->decoder.read_text_chunks) { - state->error = readChunk_iTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); - if(state->error) break; - } - } else if(lodepng_chunk_type_equals(chunk, "tIME")) { - state->error = readChunk_tIME(&state->info_png, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "pHYs")) { - state->error = readChunk_pHYs(&state->info_png, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "gAMA")) { - state->error = readChunk_gAMA(&state->info_png, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "cHRM")) { - state->error = readChunk_cHRM(&state->info_png, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "sRGB")) { - state->error = readChunk_sRGB(&state->info_png, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "iCCP")) { - state->error = readChunk_iCCP(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); - if(state->error) break; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } else /*it's not an implemented chunk type, so ignore it: skip over the data*/ { - /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ - if(!state->decoder.ignore_critical && !lodepng_chunk_ancillary(chunk)) { - CERROR_BREAK(state->error, 69); - } - - unknown = 1; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(state->decoder.remember_unknown_chunks) { - state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], - &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - - if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/ { - if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ - } - - if(!IEND) chunk = lodepng_chunk_next_const(chunk, in + insize); - } - - if(state->info_png.color.colortype == LCT_PALETTE && !state->info_png.color.palette) { - state->error = 106; /* error: PNG file must have PLTE chunk if color type is palette */ - } - - if(!state->error) { - /*predict output size, to allocate exact size for output buffer to avoid more dynamic allocation. - If the decompressed size does not match the prediction, the image must be corrupt.*/ - if(state->info_png.interlace_method == 0) { - size_t bpp = lodepng_get_bpp(&state->info_png.color); - expected_size = lodepng_get_raw_size_idat(*w, *h, bpp); - } else { - size_t bpp = lodepng_get_bpp(&state->info_png.color); - /*Adam-7 interlaced: expected size is the sum of the 7 sub-images sizes*/ - expected_size = 0; - expected_size += lodepng_get_raw_size_idat((*w + 7) >> 3, (*h + 7) >> 3, bpp); - if(*w > 4) expected_size += lodepng_get_raw_size_idat((*w + 3) >> 3, (*h + 7) >> 3, bpp); - expected_size += lodepng_get_raw_size_idat((*w + 3) >> 2, (*h + 3) >> 3, bpp); - if(*w > 2) expected_size += lodepng_get_raw_size_idat((*w + 1) >> 2, (*h + 3) >> 2, bpp); - expected_size += lodepng_get_raw_size_idat((*w + 1) >> 1, (*h + 1) >> 2, bpp); - if(*w > 1) expected_size += lodepng_get_raw_size_idat((*w + 0) >> 1, (*h + 1) >> 1, bpp); - expected_size += lodepng_get_raw_size_idat((*w + 0), (*h + 0) >> 1, bpp); - } - - state->error = zlib_decompress(&scanlines, &scanlines_size, expected_size, idat, idatsize, &state->decoder.zlibsettings); - } - if(!state->error && scanlines_size != expected_size) state->error = 91; /*decompressed size doesn't match prediction*/ - lodepng_free(idat); - - if(!state->error) { - outsize = lodepng_get_raw_size(*w, *h, &state->info_png.color); - *out = (unsigned char*)lodepng_malloc(outsize); - if(!*out) state->error = 83; /*alloc fail*/ - } - if(!state->error) { - lodepng_memset(*out, 0, outsize); - state->error = postProcessScanlines(*out, scanlines, *w, *h, &state->info_png); - } - lodepng_free(scanlines); -} - -unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize) { - *out = 0; - decodeGeneric(out, w, h, state, in, insize); - if(state->error) return state->error; - if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) { - /*same color type, no copying or converting of data needed*/ - /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype - the raw image has to the end user*/ - if(!state->decoder.color_convert) { - state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); - if(state->error) return state->error; - } - } else { /*color conversion needed*/ - unsigned char* data = *out; - size_t outsize; - - /*TODO: check if this works according to the statement in the documentation: "The converter can convert - from grayscale input color type, to 8-bit grayscale or grayscale with alpha"*/ - if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) - && !(state->info_raw.bitdepth == 8)) { - return 56; /*unsupported color mode conversion*/ - } - - outsize = lodepng_get_raw_size(*w, *h, &state->info_raw); - *out = (unsigned char*)lodepng_malloc(outsize); - if(!(*out)) { - state->error = 83; /*alloc fail*/ - } - else state->error = lodepng_convert(*out, data, &state->info_raw, - &state->info_png.color, *w, *h); - lodepng_free(data); - } - return state->error; -} - -unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, - size_t insize, LodePNGColorType colortype, unsigned bitdepth) { - unsigned error; - LodePNGState state; - lodepng_state_init(&state); - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - error = lodepng_decode(out, w, h, &state, in, insize); - lodepng_state_cleanup(&state); - return error; -} - -unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) { - return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); -} - -unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) { - return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename, - LodePNGColorType colortype, unsigned bitdepth) { - unsigned char* buffer = 0; - size_t buffersize; - unsigned error; - /* safe output values in case error happens */ - *out = 0; - *w = *h = 0; - error = lodepng_load_file(&buffer, &buffersize, filename); - if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); - lodepng_free(buffer); - return error; -} - -unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) { - return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); -} - -unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) { - return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); -} -#endif /*LODEPNG_COMPILE_DISK*/ - -void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) { - settings->color_convert = 1; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - settings->read_text_chunks = 1; - settings->remember_unknown_chunks = 0; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - settings->ignore_crc = 0; - settings->ignore_critical = 0; - settings->ignore_end = 0; - lodepng_decompress_settings_init(&settings->zlibsettings); -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) - -void lodepng_state_init(LodePNGState* state) { -#ifdef LODEPNG_COMPILE_DECODER - lodepng_decoder_settings_init(&state->decoder); -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER - lodepng_encoder_settings_init(&state->encoder); -#endif /*LODEPNG_COMPILE_ENCODER*/ - lodepng_color_mode_init(&state->info_raw); - lodepng_info_init(&state->info_png); - state->error = 1; -} - -void lodepng_state_cleanup(LodePNGState* state) { - lodepng_color_mode_cleanup(&state->info_raw); - lodepng_info_cleanup(&state->info_png); -} - -void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source) { - lodepng_state_cleanup(dest); - *dest = *source; - lodepng_color_mode_init(&dest->info_raw); - lodepng_info_init(&dest->info_png); - dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); if(dest->error) return; - dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); if(dest->error) return; -} - -#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ - -#ifdef LODEPNG_COMPILE_ENCODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG Encoder / */ -/* ////////////////////////////////////////////////////////////////////////// */ - - -static unsigned writeSignature(ucvector* out) { - size_t pos = out->size; - const unsigned char signature[] = {137, 80, 78, 71, 13, 10, 26, 10}; - /*8 bytes PNG signature, aka the magic bytes*/ - if(!ucvector_resize(out, out->size + 8)) return 83; /*alloc fail*/ - lodepng_memcpy(out->data + pos, signature, 8); - return 0; -} - -static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) { - unsigned char *chunk, *data; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 13, "IHDR")); - data = chunk + 8; - - lodepng_set32bitInt(data + 0, w); /*width*/ - lodepng_set32bitInt(data + 4, h); /*height*/ - data[8] = (unsigned char)bitdepth; /*bit depth*/ - data[9] = (unsigned char)colortype; /*color type*/ - data[10] = 0; /*compression method*/ - data[11] = 0; /*filter method*/ - data[12] = interlace_method; /*interlace method*/ - - lodepng_chunk_generate_crc(chunk); - return 0; -} - -/* only adds the chunk if needed (there is a key or palette with alpha) */ -static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) { - unsigned char* chunk; - size_t i, j = 8; - - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, info->palettesize * 3, "PLTE")); - - for(i = 0; i != info->palettesize; ++i) { - /*add all channels except alpha channel*/ - chunk[j++] = info->palette[i * 4 + 0]; - chunk[j++] = info->palette[i * 4 + 1]; - chunk[j++] = info->palette[i * 4 + 2]; - } - - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) { - unsigned char* chunk = 0; - - if(info->colortype == LCT_PALETTE) { - size_t i, amount = info->palettesize; - /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ - for(i = info->palettesize; i != 0; --i) { - if(info->palette[4 * (i - 1) + 3] != 255) break; - --amount; - } - if(amount) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, amount, "tRNS")); - /*add the alpha channel values from the palette*/ - for(i = 0; i != amount; ++i) chunk[8 + i] = info->palette[4 * i + 3]; - } - } else if(info->colortype == LCT_GREY) { - if(info->key_defined) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "tRNS")); - chunk[8] = (unsigned char)(info->key_r >> 8); - chunk[9] = (unsigned char)(info->key_r & 255); - } - } else if(info->colortype == LCT_RGB) { - if(info->key_defined) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "tRNS")); - chunk[8] = (unsigned char)(info->key_r >> 8); - chunk[9] = (unsigned char)(info->key_r & 255); - chunk[10] = (unsigned char)(info->key_g >> 8); - chunk[11] = (unsigned char)(info->key_g & 255); - chunk[12] = (unsigned char)(info->key_b >> 8); - chunk[13] = (unsigned char)(info->key_b & 255); - } - } - - if(chunk) lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize, - LodePNGCompressSettings* zlibsettings) { - unsigned error = 0; - unsigned char* zlib = 0; - size_t zlibsize = 0; - - error = zlib_compress(&zlib, &zlibsize, data, datasize, zlibsettings); - if(!error) { - error = lodepng_chunk_createv(out, zlibsize, "IDAT", zlib); - } - lodepng_free(zlib); - return error; -} - -static unsigned addChunk_IEND(ucvector* out) { - return lodepng_chunk_createv(out, 0, "IEND", 0); -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) { - unsigned char* chunk = 0; - size_t keysize = lodepng_strlen(keyword), textsize = lodepng_strlen(textstring); - size_t size = keysize + 1 + textsize; - if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, size, "tEXt")); - lodepng_memcpy(chunk + 8, keyword, keysize); - chunk[8 + keysize] = 0; /*null termination char*/ - lodepng_memcpy(chunk + 9 + keysize, textstring, textsize); - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring, - LodePNGCompressSettings* zlibsettings) { - unsigned error = 0; - unsigned char* chunk = 0; - unsigned char* compressed = 0; - size_t compressedsize = 0; - size_t textsize = lodepng_strlen(textstring); - size_t keysize = lodepng_strlen(keyword); - if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ - - error = zlib_compress(&compressed, &compressedsize, - (const unsigned char*)textstring, textsize, zlibsettings); - if(!error) { - size_t size = keysize + 2 + compressedsize; - error = lodepng_chunk_init(&chunk, out, size, "zTXt"); - } - if(!error) { - lodepng_memcpy(chunk + 8, keyword, keysize); - chunk[8 + keysize] = 0; /*null termination char*/ - chunk[9 + keysize] = 0; /*compression method: 0*/ - lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize); - lodepng_chunk_generate_crc(chunk); - } - - lodepng_free(compressed); - return error; -} - -static unsigned addChunk_iTXt(ucvector* out, unsigned compress, const char* keyword, const char* langtag, - const char* transkey, const char* textstring, LodePNGCompressSettings* zlibsettings) { - unsigned error = 0; - unsigned char* chunk = 0; - unsigned char* compressed = 0; - size_t compressedsize = 0; - size_t textsize = lodepng_strlen(textstring); - size_t keysize = lodepng_strlen(keyword), langsize = lodepng_strlen(langtag), transsize = lodepng_strlen(transkey); - - if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ - - if(compress) { - error = zlib_compress(&compressed, &compressedsize, - (const unsigned char*)textstring, textsize, zlibsettings); - } - if(!error) { - size_t size = keysize + 3 + langsize + 1 + transsize + 1 + (compress ? compressedsize : textsize); - error = lodepng_chunk_init(&chunk, out, size, "iTXt"); - } - if(!error) { - size_t pos = 8; - lodepng_memcpy(chunk + pos, keyword, keysize); - pos += keysize; - chunk[pos++] = 0; /*null termination char*/ - chunk[pos++] = (compress ? 1 : 0); /*compression flag*/ - chunk[pos++] = 0; /*compression method: 0*/ - lodepng_memcpy(chunk + pos, langtag, langsize); - pos += langsize; - chunk[pos++] = 0; /*null termination char*/ - lodepng_memcpy(chunk + pos, transkey, transsize); - pos += transsize; - chunk[pos++] = 0; /*null termination char*/ - if(compress) { - lodepng_memcpy(chunk + pos, compressed, compressedsize); - } else { - lodepng_memcpy(chunk + pos, textstring, textsize); - } - lodepng_chunk_generate_crc(chunk); - } - - lodepng_free(compressed); - return error; -} - -static unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info) { - unsigned char* chunk = 0; - if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "bKGD")); - chunk[8] = (unsigned char)(info->background_r >> 8); - chunk[9] = (unsigned char)(info->background_r & 255); - } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "bKGD")); - chunk[8] = (unsigned char)(info->background_r >> 8); - chunk[9] = (unsigned char)(info->background_r & 255); - chunk[10] = (unsigned char)(info->background_g >> 8); - chunk[11] = (unsigned char)(info->background_g & 255); - chunk[12] = (unsigned char)(info->background_b >> 8); - chunk[13] = (unsigned char)(info->background_b & 255); - } else if(info->color.colortype == LCT_PALETTE) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "bKGD")); - chunk[8] = (unsigned char)(info->background_r & 255); /*palette index*/ - } - if(chunk) lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) { - unsigned char* chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 7, "tIME")); - chunk[8] = (unsigned char)(time->year >> 8); - chunk[9] = (unsigned char)(time->year & 255); - chunk[10] = (unsigned char)time->month; - chunk[11] = (unsigned char)time->day; - chunk[12] = (unsigned char)time->hour; - chunk[13] = (unsigned char)time->minute; - chunk[14] = (unsigned char)time->second; - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info) { - unsigned char* chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 9, "pHYs")); - lodepng_set32bitInt(chunk + 8, info->phys_x); - lodepng_set32bitInt(chunk + 12, info->phys_y); - chunk[16] = info->phys_unit; - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_gAMA(ucvector* out, const LodePNGInfo* info) { - unsigned char* chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "gAMA")); - lodepng_set32bitInt(chunk + 8, info->gama_gamma); - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_cHRM(ucvector* out, const LodePNGInfo* info) { - unsigned char* chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 32, "cHRM")); - lodepng_set32bitInt(chunk + 8, info->chrm_white_x); - lodepng_set32bitInt(chunk + 12, info->chrm_white_y); - lodepng_set32bitInt(chunk + 16, info->chrm_red_x); - lodepng_set32bitInt(chunk + 20, info->chrm_red_y); - lodepng_set32bitInt(chunk + 24, info->chrm_green_x); - lodepng_set32bitInt(chunk + 28, info->chrm_green_y); - lodepng_set32bitInt(chunk + 32, info->chrm_blue_x); - lodepng_set32bitInt(chunk + 36, info->chrm_blue_y); - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_sRGB(ucvector* out, const LodePNGInfo* info) { - unsigned char data = info->srgb_intent; - return lodepng_chunk_createv(out, 1, "sRGB", &data); -} - -static unsigned addChunk_iCCP(ucvector* out, const LodePNGInfo* info, LodePNGCompressSettings* zlibsettings) { - unsigned error = 0; - unsigned char* chunk = 0; - unsigned char* compressed = 0; - size_t compressedsize = 0; - size_t keysize = lodepng_strlen(info->iccp_name); - - if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ - error = zlib_compress(&compressed, &compressedsize, - info->iccp_profile, info->iccp_profile_size, zlibsettings); - if(!error) { - size_t size = keysize + 2 + compressedsize; - error = lodepng_chunk_init(&chunk, out, size, "iCCP"); - } - if(!error) { - lodepng_memcpy(chunk + 8, info->iccp_name, keysize); - chunk[8 + keysize] = 0; /*null termination char*/ - chunk[9 + keysize] = 0; /*compression method: 0*/ - lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize); - lodepng_chunk_generate_crc(chunk); - } - - lodepng_free(compressed); - return error; -} - -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, - size_t length, size_t bytewidth, unsigned char filterType) { - size_t i; - switch(filterType) { - case 0: /*None*/ - for(i = 0; i != length; ++i) out[i] = scanline[i]; - break; - case 1: /*Sub*/ - for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; - for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth]; - break; - case 2: /*Up*/ - if(prevline) { - for(i = 0; i != length; ++i) out[i] = scanline[i] - prevline[i]; - } else { - for(i = 0; i != length; ++i) out[i] = scanline[i]; - } - break; - case 3: /*Average*/ - if(prevline) { - for(i = 0; i != bytewidth; ++i) out[i] = scanline[i] - (prevline[i] >> 1); - for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) >> 1); - } else { - for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; - for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - (scanline[i - bytewidth] >> 1); - } - break; - case 4: /*Paeth*/ - if(prevline) { - /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ - for(i = 0; i != bytewidth; ++i) out[i] = (scanline[i] - prevline[i]); - for(i = bytewidth; i < length; ++i) { - out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); - } - } else { - for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; - /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ - for(i = bytewidth; i < length; ++i) out[i] = (scanline[i] - scanline[i - bytewidth]); - } - break; - default: return; /*invalid filter type given*/ - } -} - -/* integer binary logarithm, max return value is 31 */ -static size_t ilog2(size_t i) { - size_t result = 0; - if(i >= 65536) { result += 16; i >>= 16; } - if(i >= 256) { result += 8; i >>= 8; } - if(i >= 16) { result += 4; i >>= 4; } - if(i >= 4) { result += 2; i >>= 2; } - if(i >= 2) { result += 1; /*i >>= 1;*/ } - return result; -} - -/* integer approximation for i * log2(i), helper function for LFS_ENTROPY */ -static size_t ilog2i(size_t i) { - size_t l; - if(i == 0) return 0; - l = ilog2(i); - /* approximate i*log2(i): l is integer logarithm, ((i - (1u << l)) << 1u) - linearly approximates the missing fractional part multiplied by i */ - return i * l + ((i - (1u << l)) << 1u); -} - -static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, - const LodePNGColorMode* color, const LodePNGEncoderSettings* settings) { - /* - For PNG filter method 0 - out must be a buffer with as size: h + (w * h * bpp + 7u) / 8u, because there are - the scanlines with 1 extra byte per scanline - */ - - unsigned bpp = lodepng_get_bpp(color); - /*the width of a scanline in bytes, not including the filter type*/ - size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u; - - /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ - size_t bytewidth = (bpp + 7u) / 8u; - const unsigned char* prevline = 0; - unsigned x, y; - unsigned error = 0; - LodePNGFilterStrategy strategy = settings->filter_strategy; - - /* - There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: - * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. - use fixed filtering, with the filter None). - * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is - not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply - all five filters and select the filter that produces the smallest sum of absolute values per row. - This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true. - - If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed, - but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum - heuristic is used. - */ - if(settings->filter_palette_zero && - (color->colortype == LCT_PALETTE || color->bitdepth < 8)) strategy = LFS_ZERO; - - if(bpp == 0) return 31; /*error: invalid color type*/ - - if(strategy >= LFS_ZERO && strategy <= LFS_FOUR) { - unsigned char type = (unsigned char)strategy; - for(y = 0; y != h; ++y) { - size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - size_t inindex = linebytes * y; - out[outindex] = type; /*filter type byte*/ - filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); - prevline = &in[inindex]; - } - } else if(strategy == LFS_MINSUM) { - /*adaptive filtering*/ - unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t smallest = 0; - unsigned char type, bestType = 0; - - for(type = 0; type != 5; ++type) { - attempt[type] = (unsigned char*)lodepng_malloc(linebytes); - if(!attempt[type]) error = 83; /*alloc fail*/ - } - - if(!error) { - for(y = 0; y != h; ++y) { - /*try the 5 filter types*/ - for(type = 0; type != 5; ++type) { - size_t sum = 0; - filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); - - /*calculate the sum of the result*/ - if(type == 0) { - for(x = 0; x != linebytes; ++x) sum += (unsigned char)(attempt[type][x]); - } else { - for(x = 0; x != linebytes; ++x) { - /*For differences, each byte should be treated as signed, values above 127 are negative - (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. - This means filtertype 0 is almost never chosen, but that is justified.*/ - unsigned char s = attempt[type][x]; - sum += s < 128 ? s : (255U - s); - } - } - - /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || sum < smallest) { - bestType = type; - smallest = sum; - } - } - - prevline = &in[y * linebytes]; - - /*now fill the out values*/ - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; - } - } - - for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); - } else if(strategy == LFS_ENTROPY) { - unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t bestSum = 0; - unsigned type, bestType = 0; - unsigned count[256]; - - for(type = 0; type != 5; ++type) { - attempt[type] = (unsigned char*)lodepng_malloc(linebytes); - if(!attempt[type]) error = 83; /*alloc fail*/ - } - - if(!error) { - for(y = 0; y != h; ++y) { - /*try the 5 filter types*/ - for(type = 0; type != 5; ++type) { - size_t sum = 0; - filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); - lodepng_memset(count, 0, 256 * sizeof(*count)); - for(x = 0; x != linebytes; ++x) ++count[attempt[type][x]]; - ++count[type]; /*the filter type itself is part of the scanline*/ - for(x = 0; x != 256; ++x) { - sum += ilog2i(count[x]); - } - /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || sum > bestSum) { - bestType = type; - bestSum = sum; - } - } - - prevline = &in[y * linebytes]; - - /*now fill the out values*/ - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; - } - } - - for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); - } else if(strategy == LFS_PREDEFINED) { - for(y = 0; y != h; ++y) { - size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - size_t inindex = linebytes * y; - unsigned char type = settings->predefined_filters[y]; - out[outindex] = type; /*filter type byte*/ - filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); - prevline = &in[inindex]; - } - } else if(strategy == LFS_BRUTE_FORCE) { - /*brute force filter chooser. - deflate the scanline after every filter attempt to see which one deflates best. - This is very slow and gives only slightly smaller, sometimes even larger, result*/ - size_t size[5]; - unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t smallest = 0; - unsigned type = 0, bestType = 0; - unsigned char* dummy; - LodePNGCompressSettings zlibsettings; - lodepng_memcpy(&zlibsettings, &settings->zlibsettings, sizeof(LodePNGCompressSettings)); - /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, - to simulate the true case where the tree is the same for the whole image. Sometimes it gives - better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare - cases better compression. It does make this a bit less slow, so it's worth doing this.*/ - zlibsettings.btype = 1; - /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG - images only, so disable it*/ - zlibsettings.custom_zlib = 0; - zlibsettings.custom_deflate = 0; - for(type = 0; type != 5; ++type) { - attempt[type] = (unsigned char*)lodepng_malloc(linebytes); - if(!attempt[type]) error = 83; /*alloc fail*/ - } - if(!error) { - for(y = 0; y != h; ++y) /*try the 5 filter types*/ { - for(type = 0; type != 5; ++type) { - unsigned testsize = (unsigned)linebytes; - /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ - - filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); - size[type] = 0; - dummy = 0; - zlib_compress(&dummy, &size[type], attempt[type], testsize, &zlibsettings); - lodepng_free(dummy); - /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || size[type] < smallest) { - bestType = type; - smallest = size[type]; - } - } - prevline = &in[y * linebytes]; - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; - } - } - for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); - } - else return 88; /* unknown filter strategy */ - - return error; -} - -static void addPaddingBits(unsigned char* out, const unsigned char* in, - size_t olinebits, size_t ilinebits, unsigned h) { - /*The opposite of the removePaddingBits function - olinebits must be >= ilinebits*/ - unsigned y; - size_t diff = olinebits - ilinebits; - size_t obp = 0, ibp = 0; /*bit pointers*/ - for(y = 0; y != h; ++y) { - size_t x; - for(x = 0; x < ilinebits; ++x) { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - /*obp += diff; --> no, fill in some value in the padding bits too, to avoid - "Use of uninitialised value of size ###" warning from valgrind*/ - for(x = 0; x != diff; ++x) setBitOfReversedStream(&obp, out, 0); - } -} - -/* -in: non-interlaced image with size w*h -out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with - no padding bits between scanlines, but between reduced images so that each - reduced image starts at a byte. -bpp: bits per pixel -there are no padding bits, not between scanlines, not between reduced images -in has the following size in bits: w * h * bpp. -out is possibly bigger due to padding bits between reduced images -NOTE: comments about padding bits are only relevant if bpp < 8 -*/ -static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) { - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - if(bpp >= 8) { - for(i = 0; i != 7; ++i) { - unsigned x, y, b; - size_t bytewidth = bpp / 8u; - for(y = 0; y < passh[i]; ++y) - for(x = 0; x < passw[i]; ++x) { - size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; - size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; - for(b = 0; b < bytewidth; ++b) { - out[pixeloutstart + b] = in[pixelinstart + b]; - } - } - } - } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ { - for(i = 0; i != 7; ++i) { - unsigned x, y, b; - unsigned ilinebits = bpp * passw[i]; - unsigned olinebits = bpp * w; - size_t obp, ibp; /*bit pointers (for out and in buffer)*/ - for(y = 0; y < passh[i]; ++y) - for(x = 0; x < passw[i]; ++x) { - ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; - obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); - for(b = 0; b < bpp; ++b) { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - } - } - } -} - -/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. -return value is error**/ -static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in, - unsigned w, unsigned h, - const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings) { - /* - This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: - *) if no Adam7: 1) add padding bits (= possible extra bits per scanline if bpp < 8) 2) filter - *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter - */ - unsigned bpp = lodepng_get_bpp(&info_png->color); - unsigned error = 0; - - if(info_png->interlace_method == 0) { - *outsize = h + (h * ((w * bpp + 7u) / 8u)); /*image size plus an extra byte per scanline + possible padding bits*/ - *out = (unsigned char*)lodepng_malloc(*outsize); - if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ - - if(!error) { - /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ - if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) { - unsigned char* padded = (unsigned char*)lodepng_malloc(h * ((w * bpp + 7u) / 8u)); - if(!padded) error = 83; /*alloc fail*/ - if(!error) { - addPaddingBits(padded, in, ((w * bpp + 7u) / 8u) * 8u, w * bpp, h); - error = filter(*out, padded, w, h, &info_png->color, settings); - } - lodepng_free(padded); - } else { - /*we can immediately filter into the out buffer, no other steps needed*/ - error = filter(*out, in, w, h, &info_png->color, settings); - } - } - } else /*interlace_method is 1 (Adam7)*/ { - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned char* adam7; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ - *out = (unsigned char*)lodepng_malloc(*outsize); - if(!(*out)) error = 83; /*alloc fail*/ - - adam7 = (unsigned char*)lodepng_malloc(passstart[7]); - if(!adam7 && passstart[7]) error = 83; /*alloc fail*/ - - if(!error) { - unsigned i; - - Adam7_interlace(adam7, in, w, h, bpp); - for(i = 0; i != 7; ++i) { - if(bpp < 8) { - unsigned char* padded = (unsigned char*)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]); - if(!padded) ERROR_BREAK(83); /*alloc fail*/ - addPaddingBits(padded, &adam7[passstart[i]], - ((passw[i] * bpp + 7u) / 8u) * 8u, passw[i] * bpp, passh[i]); - error = filter(&(*out)[filter_passstart[i]], padded, - passw[i], passh[i], &info_png->color, settings); - lodepng_free(padded); - } else { - error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], - passw[i], passh[i], &info_png->color, settings); - } - - if(error) break; - } - } - - lodepng_free(adam7); - } - - return error; -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize) { - unsigned char* inchunk = data; - while((size_t)(inchunk - data) < datasize) { - CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); - out->allocsize = out->size; /*fix the allocsize again*/ - inchunk = lodepng_chunk_next(inchunk, data + datasize); - } - return 0; -} - -static unsigned isGrayICCProfile(const unsigned char* profile, unsigned size) { - /* - It is a gray profile if bytes 16-19 are "GRAY", rgb profile if bytes 16-19 - are "RGB ". We do not perform any full parsing of the ICC profile here, other - than check those 4 bytes to grayscale profile. Other than that, validity of - the profile is not checked. This is needed only because the PNG specification - requires using a non-gray color model if there is an ICC profile with "RGB " - (sadly limiting compression opportunities if the input data is grayscale RGB - data), and requires using a gray color model if it is "GRAY". - */ - if(size < 20) return 0; - return profile[16] == 'G' && profile[17] == 'R' && profile[18] == 'A' && profile[19] == 'Y'; -} - -static unsigned isRGBICCProfile(const unsigned char* profile, unsigned size) { - /* See comment in isGrayICCProfile*/ - if(size < 20) return 0; - return profile[16] == 'R' && profile[17] == 'G' && profile[18] == 'B' && profile[19] == ' '; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -unsigned lodepng_encode(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGState* state) { - unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/ - size_t datasize = 0; - ucvector outv = ucvector_init(NULL, 0); - LodePNGInfo info; - const LodePNGInfo* info_png = &state->info_png; - - lodepng_info_init(&info); - - /*provide some proper output values if error will happen*/ - *out = 0; - *outsize = 0; - state->error = 0; - - /*check input values validity*/ - if((info_png->color.colortype == LCT_PALETTE || state->encoder.force_palette) - && (info_png->color.palettesize == 0 || info_png->color.palettesize > 256)) { - state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ - goto cleanup; - } - if(state->encoder.zlibsettings.btype > 2) { - state->error = 61; /*error: invalid btype*/ - goto cleanup; - } - if(info_png->interlace_method > 1) { - state->error = 71; /*error: invalid interlace mode*/ - goto cleanup; - } - state->error = checkColorValidity(info_png->color.colortype, info_png->color.bitdepth); - if(state->error) goto cleanup; /*error: invalid color type given*/ - state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth); - if(state->error) goto cleanup; /*error: invalid color type given*/ - - /* color convert and compute scanline filter types */ - lodepng_info_copy(&info, &state->info_png); - if(state->encoder.auto_convert) { - LodePNGColorStats stats; - lodepng_color_stats_init(&stats); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(info_png->iccp_defined && - isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) { - /*the PNG specification does not allow to use palette with a GRAY ICC profile, even - if the palette has only gray colors, so disallow it.*/ - stats.allow_palette = 0; - } - if(info_png->iccp_defined && - isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) { - /*the PNG specification does not allow to use grayscale color with RGB ICC profile, so disallow gray.*/ - stats.allow_greyscale = 0; - } -#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ - state->error = lodepng_compute_color_stats(&stats, image, w, h, &state->info_raw); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(info_png->background_defined) { - /*the background chunk's color must be taken into account as well*/ - unsigned r = 0, g = 0, b = 0; - LodePNGColorMode mode16 = lodepng_color_mode_make(LCT_RGB, 16); - lodepng_convert_rgb(&r, &g, &b, info_png->background_r, info_png->background_g, info_png->background_b, &mode16, &info_png->color); - state->error = lodepng_color_stats_add(&stats, r, g, b, 65535); - if(state->error) goto cleanup; - } -#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ - state->error = auto_choose_color(&info.color, &state->info_raw, &stats); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*also convert the background chunk*/ - if(info_png->background_defined) { - if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b, - info_png->background_r, info_png->background_g, info_png->background_b, &info.color, &info_png->color)) { - state->error = 104; - goto cleanup; - } - } -#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ - } -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(info_png->iccp_defined) { - unsigned gray_icc = isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size); - unsigned rgb_icc = isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size); - unsigned gray_png = info.color.colortype == LCT_GREY || info.color.colortype == LCT_GREY_ALPHA; - if(!gray_icc && !rgb_icc) { - state->error = 100; /* Disallowed profile color type for PNG */ - goto cleanup; - } - if(gray_icc != gray_png) { - /*Not allowed to use RGB/RGBA/palette with GRAY ICC profile or vice versa, - or in case of auto_convert, it wasn't possible to find appropriate model*/ - state->error = state->encoder.auto_convert ? 102 : 101; - goto cleanup; - } - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) { - unsigned char* converted; - size_t size = ((size_t)w * (size_t)h * (size_t)lodepng_get_bpp(&info.color) + 7u) / 8u; - - converted = (unsigned char*)lodepng_malloc(size); - if(!converted && size) state->error = 83; /*alloc fail*/ - if(!state->error) { - state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h); - } - if(!state->error) { - state->error = preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); - } - lodepng_free(converted); - if(state->error) goto cleanup; - } else { - state->error = preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); - if(state->error) goto cleanup; - } - - /* output all PNG chunks */ { -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - size_t i; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*write signature and chunks*/ - state->error = writeSignature(&outv); - if(state->error) goto cleanup; - /*IHDR*/ - state->error = addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*unknown chunks between IHDR and PLTE*/ - if(info.unknown_chunks_data[0]) { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); - if(state->error) goto cleanup; - } - /*color profile chunks must come before PLTE */ - if(info.iccp_defined) { - state->error = addChunk_iCCP(&outv, &info, &state->encoder.zlibsettings); - if(state->error) goto cleanup; - } - if(info.srgb_defined) { - state->error = addChunk_sRGB(&outv, &info); - if(state->error) goto cleanup; - } - if(info.gama_defined) { - state->error = addChunk_gAMA(&outv, &info); - if(state->error) goto cleanup; - } - if(info.chrm_defined) { - state->error = addChunk_cHRM(&outv, &info); - if(state->error) goto cleanup; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*PLTE*/ - if(info.color.colortype == LCT_PALETTE) { - state->error = addChunk_PLTE(&outv, &info.color); - if(state->error) goto cleanup; - } - if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) { - /*force_palette means: write suggested palette for truecolor in PLTE chunk*/ - state->error = addChunk_PLTE(&outv, &info.color); - if(state->error) goto cleanup; - } - /*tRNS (this will only add if when necessary) */ - state->error = addChunk_tRNS(&outv, &info.color); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*bKGD (must come between PLTE and the IDAt chunks*/ - if(info.background_defined) { - state->error = addChunk_bKGD(&outv, &info); - if(state->error) goto cleanup; - } - /*pHYs (must come before the IDAT chunks)*/ - if(info.phys_defined) { - state->error = addChunk_pHYs(&outv, &info); - if(state->error) goto cleanup; - } - - /*unknown chunks between PLTE and IDAT*/ - if(info.unknown_chunks_data[1]) { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); - if(state->error) goto cleanup; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*IDAT (multiple IDAT chunks must be consecutive)*/ - state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*tIME*/ - if(info.time_defined) { - state->error = addChunk_tIME(&outv, &info.time); - if(state->error) goto cleanup; - } - /*tEXt and/or zTXt*/ - for(i = 0; i != info.text_num; ++i) { - if(lodepng_strlen(info.text_keys[i]) > 79) { - state->error = 66; /*text chunk too large*/ - goto cleanup; - } - if(lodepng_strlen(info.text_keys[i]) < 1) { - state->error = 67; /*text chunk too small*/ - goto cleanup; - } - if(state->encoder.text_compression) { - state->error = addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); - if(state->error) goto cleanup; - } else { - state->error = addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); - if(state->error) goto cleanup; - } - } - /*LodePNG version id in text chunk*/ - if(state->encoder.add_id) { - unsigned already_added_id_text = 0; - for(i = 0; i != info.text_num; ++i) { - const char* k = info.text_keys[i]; - /* Could use strcmp, but we're not calling or reimplementing this C library function for this use only */ - if(k[0] == 'L' && k[1] == 'o' && k[2] == 'd' && k[3] == 'e' && - k[4] == 'P' && k[5] == 'N' && k[6] == 'G' && k[7] == '\0') { - already_added_id_text = 1; - break; - } - } - if(already_added_id_text == 0) { - state->error = addChunk_tEXt(&outv, "LodePNG", LODEPNG_VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ - if(state->error) goto cleanup; - } - } - /*iTXt*/ - for(i = 0; i != info.itext_num; ++i) { - if(lodepng_strlen(info.itext_keys[i]) > 79) { - state->error = 66; /*text chunk too large*/ - goto cleanup; - } - if(lodepng_strlen(info.itext_keys[i]) < 1) { - state->error = 67; /*text chunk too small*/ - goto cleanup; - } - state->error = addChunk_iTXt( - &outv, state->encoder.text_compression, - info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], - &state->encoder.zlibsettings); - if(state->error) goto cleanup; - } - - /*unknown chunks between IDAT and IEND*/ - if(info.unknown_chunks_data[2]) { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); - if(state->error) goto cleanup; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - state->error = addChunk_IEND(&outv); - if(state->error) goto cleanup; - } - -cleanup: - lodepng_info_cleanup(&info); - lodepng_free(data); - - /*instead of cleaning the vector up, give it to the output*/ - *out = outv.data; - *outsize = outv.size; - - return state->error; -} - -unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image, - unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { - unsigned error; - LodePNGState state; - lodepng_state_init(&state); - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - state.info_png.color.colortype = colortype; - state.info_png.color.bitdepth = bitdepth; - lodepng_encode(out, outsize, image, w, h, &state); - error = state.error; - lodepng_state_cleanup(&state); - return error; -} - -unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) { - return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); -} - -unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) { - return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) { - unsigned char* buffer; - size_t buffersize; - unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); - if(!error) error = lodepng_save_file(buffer, buffersize, filename); - lodepng_free(buffer); - return error; -} - -unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) { - return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); -} - -unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) { - return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); -} -#endif /*LODEPNG_COMPILE_DISK*/ - -void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) { - lodepng_compress_settings_init(&settings->zlibsettings); - settings->filter_palette_zero = 1; - settings->filter_strategy = LFS_MINSUM; - settings->auto_convert = 1; - settings->force_palette = 0; - settings->predefined_filters = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - settings->add_id = 0; - settings->text_compression = 1; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ERROR_TEXT -/* -This returns the description of a numerical error code in English. This is also -the documentation of all the error codes. -*/ -const char* lodepng_error_text(unsigned code) { - switch(code) { - case 0: return "no error, everything went ok"; - case 1: return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ - case 10: return "end of input memory reached without huffman end code"; /*while huffman decoding*/ - case 11: return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ - case 13: return "problem while processing dynamic deflate block"; - case 14: return "problem while processing dynamic deflate block"; - case 15: return "problem while processing dynamic deflate block"; - /*this error could happen if there are only 0 or 1 symbols present in the huffman code:*/ - case 16: return "invalid code while processing dynamic deflate block"; - case 17: return "end of out buffer memory reached while inflating"; - case 18: return "invalid distance code while inflating"; - case 19: return "end of out buffer memory reached while inflating"; - case 20: return "invalid deflate block BTYPE encountered while decoding"; - case 21: return "NLEN is not ones complement of LEN in a deflate block"; - - /*end of out buffer memory reached while inflating: - This can happen if the inflated deflate data is longer than the amount of bytes required to fill up - all the pixels of the image, given the color depth and image dimensions. Something that doesn't - happen in a normal, well encoded, PNG image.*/ - case 22: return "end of out buffer memory reached while inflating"; - case 23: return "end of in buffer memory reached while inflating"; - case 24: return "invalid FCHECK in zlib header"; - case 25: return "invalid compression method in zlib header"; - case 26: return "FDICT encountered in zlib header while it's not used for PNG"; - case 27: return "PNG file is smaller than a PNG header"; - /*Checks the magic file header, the first 8 bytes of the PNG file*/ - case 28: return "incorrect PNG signature, it's no PNG or corrupted"; - case 29: return "first chunk is not the header chunk"; - case 30: return "chunk length too large, chunk broken off at end of file"; - case 31: return "illegal PNG color type or bpp"; - case 32: return "illegal PNG compression method"; - case 33: return "illegal PNG filter method"; - case 34: return "illegal PNG interlace method"; - case 35: return "chunk length of a chunk is too large or the chunk too small"; - case 36: return "illegal PNG filter type encountered"; - case 37: return "illegal bit depth for this color type given"; - case 38: return "the palette is too small or too big"; /*0, or more than 256 colors*/ - case 39: return "tRNS chunk before PLTE or has more entries than palette size"; - case 40: return "tRNS chunk has wrong size for grayscale image"; - case 41: return "tRNS chunk has wrong size for RGB image"; - case 42: return "tRNS chunk appeared while it was not allowed for this color type"; - case 43: return "bKGD chunk has wrong size for palette image"; - case 44: return "bKGD chunk has wrong size for grayscale image"; - case 45: return "bKGD chunk has wrong size for RGB image"; - case 48: return "empty input buffer given to decoder. Maybe caused by non-existing file?"; - case 49: return "jumped past memory while generating dynamic huffman tree"; - case 50: return "jumped past memory while generating dynamic huffman tree"; - case 51: return "jumped past memory while inflating huffman block"; - case 52: return "jumped past memory while inflating"; - case 53: return "size of zlib data too small"; - case 54: return "repeat symbol in tree while there was no value symbol yet"; - /*jumped past tree while generating huffman tree, this could be when the - tree will have more leaves than symbols after generating it out of the - given lengths. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ - case 55: return "jumped past tree while generating huffman tree"; - case 56: return "given output image colortype or bitdepth not supported for color conversion"; - case 57: return "invalid CRC encountered (checking CRC can be disabled)"; - case 58: return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; - case 59: return "requested color conversion not supported"; - case 60: return "invalid window size given in the settings of the encoder (must be 0-32768)"; - case 61: return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; - /*LodePNG leaves the choice of RGB to grayscale conversion formula to the user.*/ - case 62: return "conversion from color to grayscale not supported"; - /*(2^31-1)*/ - case 63: return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; - /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ - case 64: return "the length of the END symbol 256 in the Huffman tree is 0"; - case 66: return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; - case 67: return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; - case 68: return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; - case 69: return "unknown chunk type with 'critical' flag encountered by the decoder"; - case 71: return "invalid interlace mode given to encoder (must be 0 or 1)"; - case 72: return "while decoding, invalid compression method encountering in zTXt or iTXt chunk (it must be 0)"; - case 73: return "invalid tIME chunk size"; - case 74: return "invalid pHYs chunk size"; - /*length could be wrong, or data chopped off*/ - case 75: return "no null termination char found while decoding text chunk"; - case 76: return "iTXt chunk too short to contain required bytes"; - case 77: return "integer overflow in buffer size"; - case 78: return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ - case 79: return "failed to open file for writing"; - case 80: return "tried creating a tree of 0 symbols"; - case 81: return "lazy matching at pos 0 is impossible"; - case 82: return "color conversion to palette requested while a color isn't in palette, or index out of bounds"; - case 83: return "memory allocation failed"; - case 84: return "given image too small to contain all pixels to be encoded"; - case 86: return "impossible offset in lz77 encoding (internal bug)"; - case 87: return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; - case 88: return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; - case 89: return "text chunk keyword too short or long: must have size 1-79"; - /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/ - case 90: return "windowsize must be a power of two"; - case 91: return "invalid decompressed idat size"; - case 92: return "integer overflow due to too many pixels"; - case 93: return "zero width or height is invalid"; - case 94: return "header chunk must have a size of 13 bytes"; - case 95: return "integer overflow with combined idat chunk size"; - case 96: return "invalid gAMA chunk size"; - case 97: return "invalid cHRM chunk size"; - case 98: return "invalid sRGB chunk size"; - case 99: return "invalid sRGB rendering intent"; - case 100: return "invalid ICC profile color type, the PNG specification only allows RGB or GRAY"; - case 101: return "PNG specification does not allow RGB ICC profile on gray color types and vice versa"; - case 102: return "not allowed to set grayscale ICC profile with colored pixels by PNG specification"; - case 103: return "invalid palette index in bKGD chunk. Maybe it came before PLTE chunk?"; - case 104: return "invalid bKGD color while encoding (e.g. palette index out of range)"; - case 105: return "integer overflow of bitsize"; - case 106: return "PNG file must have PLTE chunk if color type is palette"; - case 107: return "color convert from palette mode requested without setting the palette data in it"; - case 108: return "tried to add more than 256 values to a palette"; - } - return "unknown error code"; -} -#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // C++ Wrapper // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_CPP -namespace lodepng { - -#ifdef LODEPNG_COMPILE_DISK -unsigned load_file(std::vector& buffer, const std::string& filename) { - long size = lodepng_filesize(filename.c_str()); - if(size < 0) return 78; - buffer.resize((size_t)size); - return size == 0 ? 0 : lodepng_buffer_file(&buffer[0], (size_t)size, filename.c_str()); -} - -/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ -unsigned save_file(const std::vector& buffer, const std::string& filename) { - return lodepng_save_file(buffer.empty() ? 0 : &buffer[0], buffer.size(), filename.c_str()); -} -#endif /* LODEPNG_COMPILE_DISK */ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_DECODER -unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGDecompressSettings& settings) { - unsigned char* buffer = 0; - size_t buffersize = 0; - unsigned error = zlib_decompress(&buffer, &buffersize, 0, in, insize, &settings); - if(buffer) { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned decompress(std::vector& out, const std::vector& in, - const LodePNGDecompressSettings& settings) { - return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); -} -#endif /* LODEPNG_COMPILE_DECODER */ - -#ifdef LODEPNG_COMPILE_ENCODER -unsigned compress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGCompressSettings& settings) { - unsigned char* buffer = 0; - size_t buffersize = 0; - unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); - if(buffer) { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned compress(std::vector& out, const std::vector& in, - const LodePNGCompressSettings& settings) { - return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); -} -#endif /* LODEPNG_COMPILE_ENCODER */ -#endif /* LODEPNG_COMPILE_ZLIB */ - - -#ifdef LODEPNG_COMPILE_PNG - -State::State() { - lodepng_state_init(this); -} - -State::State(const State& other) { - lodepng_state_init(this); - lodepng_state_copy(this, &other); -} - -State::~State() { - lodepng_state_cleanup(this); -} - -State& State::operator=(const State& other) { - lodepng_state_copy(this, &other); - return *this; -} - -#ifdef LODEPNG_COMPILE_DECODER - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, const unsigned char* in, - size_t insize, LodePNGColorType colortype, unsigned bitdepth) { - unsigned char* buffer = 0; - unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); - if(buffer && !error) { - State state; - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - } - lodepng_free(buffer); - return error; -} - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const std::vector& in, LodePNGColorType colortype, unsigned bitdepth) { - return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); -} - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const unsigned char* in, size_t insize) { - unsigned char* buffer = NULL; - unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); - if(buffer && !error) { - size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - } - lodepng_free(buffer); - return error; -} - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const std::vector& in) { - return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::string& filename, - LodePNGColorType colortype, unsigned bitdepth) { - std::vector buffer; - /* safe output values in case error happens */ - w = h = 0; - unsigned error = load_file(buffer, filename); - if(error) return error; - return decode(out, w, h, buffer, colortype, bitdepth); -} -#endif /* LODEPNG_COMPILE_DECODER */ -#endif /* LODEPNG_COMPILE_DISK */ - -#ifdef LODEPNG_COMPILE_ENCODER -unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) { - unsigned char* buffer; - size_t buffersize; - unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); - if(buffer) { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) { - if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; - return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); -} - -unsigned encode(std::vector& out, - const unsigned char* in, unsigned w, unsigned h, - State& state) { - unsigned char* buffer; - size_t buffersize; - unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); - if(buffer) { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - State& state) { - if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; - return encode(out, in.empty() ? 0 : &in[0], w, h, state); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned encode(const std::string& filename, - const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) { - std::vector buffer; - unsigned error = encode(buffer, in, w, h, colortype, bitdepth); - if(!error) error = save_file(buffer, filename); - return error; -} - -unsigned encode(const std::string& filename, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) { - if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; - return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); -} -#endif /* LODEPNG_COMPILE_DISK */ -#endif /* LODEPNG_COMPILE_ENCODER */ -#endif /* LODEPNG_COMPILE_PNG */ -} /* namespace lodepng */ -#endif /*LODEPNG_COMPILE_CPP*/ diff --git a/vendor/librw/src/lodepng/lodepng.h b/vendor/librw/src/lodepng/lodepng.h deleted file mode 100644 index a386459..0000000 --- a/vendor/librw/src/lodepng/lodepng.h +++ /dev/null @@ -1,1945 +0,0 @@ -/* -LodePNG version 20200306 - -Copyright (c) 2005-2020 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ - -#ifndef LODEPNG_H -#define LODEPNG_H - -#include /*for size_t*/ - -extern const char* LODEPNG_VERSION_STRING; - -/* -The following #defines are used to create code sections. They can be disabled -to disable code sections, which can give faster compile time and smaller binary. -The "NO_COMPILE" defines are designed to be used to pass as defines to the -compiler command to disable them without modifying this header, e.g. --DLODEPNG_NO_COMPILE_ZLIB for gcc. -In addition to those below, you can also define LODEPNG_NO_COMPILE_CRC to -allow implementing a custom lodepng_crc32. -*/ -/*deflate & zlib. If disabled, you must specify alternative zlib functions in -the custom_zlib field of the compress and decompress settings*/ -#ifndef LODEPNG_NO_COMPILE_ZLIB -#define LODEPNG_COMPILE_ZLIB -#endif - -/*png encoder and png decoder*/ -#ifndef LODEPNG_NO_COMPILE_PNG -#define LODEPNG_COMPILE_PNG -#endif - -/*deflate&zlib decoder and png decoder*/ -#ifndef LODEPNG_NO_COMPILE_DECODER -#define LODEPNG_COMPILE_DECODER -#endif - -/*deflate&zlib encoder and png encoder*/ -#ifndef LODEPNG_NO_COMPILE_ENCODER -#define LODEPNG_COMPILE_ENCODER -#endif - -/*the optional built in harddisk file loading and saving functions*/ -#ifndef LODEPNG_NO_COMPILE_DISK -#define LODEPNG_COMPILE_DISK -#endif - -/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ -#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS -#define LODEPNG_COMPILE_ANCILLARY_CHUNKS -#endif - -/*ability to convert error numerical codes to English text string*/ -#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT -#define LODEPNG_COMPILE_ERROR_TEXT -#endif - -/*Compile the default allocators (C's free, malloc and realloc). If you disable this, -you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your -source files with custom allocators.*/ -#ifndef LODEPNG_NO_COMPILE_ALLOCATORS -#define LODEPNG_COMPILE_ALLOCATORS -#endif - -/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ -#ifdef __cplusplus -#ifndef LODEPNG_NO_COMPILE_CPP -#define LODEPNG_COMPILE_CPP -#endif -#endif - -#ifdef LODEPNG_COMPILE_CPP -#include -#include -#endif /*LODEPNG_COMPILE_CPP*/ - -#ifdef LODEPNG_COMPILE_PNG -/*The PNG color types (also used for raw image).*/ -typedef enum LodePNGColorType { - LCT_GREY = 0, /*grayscale: 1,2,4,8,16 bit*/ - LCT_RGB = 2, /*RGB: 8,16 bit*/ - LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ - LCT_GREY_ALPHA = 4, /*grayscale with alpha: 8,16 bit*/ - LCT_RGBA = 6, /*RGB with alpha: 8,16 bit*/ - /*LCT_MAX_OCTET_VALUE lets the compiler allow this enum to represent any invalid - byte value from 0 to 255 that could be present in an invalid PNG file header. Do - not use, compare with or set the name LCT_MAX_OCTET_VALUE, instead either use - the valid color type names above, or numeric values like 1 or 7 when checking for - particular disallowed color type byte values, or cast to integer to print it.*/ - LCT_MAX_OCTET_VALUE = 255 -} LodePNGColorType; - -#ifdef LODEPNG_COMPILE_DECODER -/* -Converts PNG data in memory to raw pixel data. -out: Output parameter. Pointer to buffer that will contain the raw pixel data. - After decoding, its size is w * h * (bytes per pixel) bytes larger than - initially. Bytes per pixel depends on colortype and bitdepth. - Must be freed after usage with free(*out). - Note: for 16-bit per channel colors, uses big endian format like PNG does. -w: Output parameter. Pointer to width of pixel data. -h: Output parameter. Pointer to height of pixel data. -in: Memory buffer with the PNG file. -insize: size of the in buffer. -colortype: the desired color type for the raw output image. See explanation on PNG color types. -bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. -Return value: LodePNG error code (0 means no error). -*/ -unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ -unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize); - -/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ -unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize); - -#ifdef LODEPNG_COMPILE_DISK -/* -Load PNG from disk, from file with given name. -Same as the other decode functions, but instead takes a filename as input. -*/ -unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, - const char* filename, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.*/ -unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, - const char* filename); - -/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.*/ -unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, - const char* filename); -#endif /*LODEPNG_COMPILE_DISK*/ -#endif /*LODEPNG_COMPILE_DECODER*/ - - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Converts raw pixel data into a PNG image in memory. The colortype and bitdepth - of the output PNG image cannot be chosen, they are automatically determined - by the colortype, bitdepth and content of the input pixel data. - Note: for 16-bit per channel colors, needs big endian format like PNG does. -out: Output parameter. Pointer to buffer that will contain the PNG image data. - Must be freed after usage with free(*out). -outsize: Output parameter. Pointer to the size in bytes of the out buffer. -image: The raw pixel data to encode. The size of this buffer should be - w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. -w: width of the raw pixel data in pixels. -h: height of the raw pixel data in pixels. -colortype: the color type of the raw input image. See explanation on PNG color types. -bitdepth: the bit depth of the raw input image. See explanation on PNG color types. -Return value: LodePNG error code (0 means no error). -*/ -unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ -unsigned lodepng_encode32(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h); - -/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ -unsigned lodepng_encode24(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h); - -#ifdef LODEPNG_COMPILE_DISK -/* -Converts raw pixel data into a PNG file on disk. -Same as the other encode functions, but instead takes a filename as output. -NOTE: This overwrites existing files without warning! -*/ -unsigned lodepng_encode_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.*/ -unsigned lodepng_encode32_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h); - -/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.*/ -unsigned lodepng_encode24_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h); -#endif /*LODEPNG_COMPILE_DISK*/ -#endif /*LODEPNG_COMPILE_ENCODER*/ - - -#ifdef LODEPNG_COMPILE_CPP -namespace lodepng { -#ifdef LODEPNG_COMPILE_DECODER -/*Same as lodepng_decode_memory, but decodes to an std::vector. The colortype -is the format to output the pixels to. Default is RGBA 8-bit per channel.*/ -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const unsigned char* in, size_t insize, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const std::vector& in, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#ifdef LODEPNG_COMPILE_DISK -/* -Converts PNG file from disk to raw pixel data in memory. -Same as the other decode functions, but instead takes a filename as input. -*/ -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const std::string& filename, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#endif /* LODEPNG_COMPILE_DISK */ -#endif /* LODEPNG_COMPILE_DECODER */ - -#ifdef LODEPNG_COMPILE_ENCODER -/*Same as lodepng_encode_memory, but encodes to an std::vector. colortype -is that of the raw input data. The output PNG color type will be auto chosen.*/ -unsigned encode(std::vector& out, - const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#ifdef LODEPNG_COMPILE_DISK -/* -Converts 32-bit RGBA raw pixel data into a PNG file on disk. -Same as the other encode functions, but instead takes a filename as output. -NOTE: This overwrites existing files without warning! -*/ -unsigned encode(const std::string& filename, - const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned encode(const std::string& filename, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#endif /* LODEPNG_COMPILE_DISK */ -#endif /* LODEPNG_COMPILE_ENCODER */ -} /* namespace lodepng */ -#endif /*LODEPNG_COMPILE_CPP*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ERROR_TEXT -/*Returns an English description of the numerical error code.*/ -const char* lodepng_error_text(unsigned code); -#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ - -#ifdef LODEPNG_COMPILE_DECODER -/*Settings for zlib decompression*/ -typedef struct LodePNGDecompressSettings LodePNGDecompressSettings; -struct LodePNGDecompressSettings { - /* Check LodePNGDecoderSettings for more ignorable errors such as ignore_crc */ - unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ - unsigned ignore_nlen; /*ignore complement of len checksum in uncompressed blocks*/ - - /*use custom zlib decoder instead of built in one (default: null)*/ - unsigned (*custom_zlib)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGDecompressSettings*); - /*use custom deflate decoder instead of built in one (default: null) - if custom_zlib is not null, custom_inflate is ignored (the zlib format uses deflate)*/ - unsigned (*custom_inflate)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGDecompressSettings*); - - const void* custom_context; /*optional custom settings for custom functions*/ -}; - -extern const LodePNGDecompressSettings lodepng_default_decompress_settings; -void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Settings for zlib compression. Tweaking these settings tweaks the balance -between speed and compression ratio. -*/ -typedef struct LodePNGCompressSettings LodePNGCompressSettings; -struct LodePNGCompressSettings /*deflate = compress*/ { - /*LZ77 related settings*/ - unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ - unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ - unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Default value: 2048.*/ - unsigned minmatch; /*minimum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ - unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ - unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ - - /*use custom zlib encoder instead of built in one (default: null)*/ - unsigned (*custom_zlib)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGCompressSettings*); - /*use custom deflate encoder instead of built in one (default: null) - if custom_zlib is used, custom_deflate is ignored since only the built in - zlib function will call custom_deflate*/ - unsigned (*custom_deflate)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGCompressSettings*); - - const void* custom_context; /*optional custom settings for custom functions*/ -}; - -extern const LodePNGCompressSettings lodepng_default_compress_settings; -void lodepng_compress_settings_init(LodePNGCompressSettings* settings); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_PNG -/* -Color mode of an image. Contains all information required to decode the pixel -bits to RGBA colors. This information is the same as used in the PNG file -format, and is used both for PNG and raw image data in LodePNG. -*/ -typedef struct LodePNGColorMode { - /*header (IHDR)*/ - LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ - unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ - - /* - palette (PLTE and tRNS) - - Dynamically allocated with the colors of the palette, including alpha. - This field may not be allocated directly, use lodepng_color_mode_init first, - then lodepng_palette_add per color to correctly initialize it (to ensure size - of exactly 1024 bytes). - - The alpha channels must be set as well, set them to 255 for opaque images. - - When decoding, by default you can ignore this palette, since LodePNG already - fills the palette colors in the pixels of the raw RGBA output. - - The palette is only supported for color type 3. - */ - unsigned char* palette; /*palette in RGBARGBA... order. Must be either 0, or when allocated must have 1024 bytes*/ - size_t palettesize; /*palette size in number of colors (amount of used bytes is 4 * palettesize)*/ - - /* - transparent color key (tRNS) - - This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. - For grayscale PNGs, r, g and b will all 3 be set to the same. - - When decoding, by default you can ignore this information, since LodePNG sets - pixels with this key to transparent already in the raw RGBA output. - - The color key is only supported for color types 0 and 2. - */ - unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ - unsigned key_r; /*red/grayscale component of color key*/ - unsigned key_g; /*green component of color key*/ - unsigned key_b; /*blue component of color key*/ -} LodePNGColorMode; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_color_mode_init(LodePNGColorMode* info); -void lodepng_color_mode_cleanup(LodePNGColorMode* info); -/*return value is error code (0 means no error)*/ -unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source); -/* Makes a temporary LodePNGColorMode that does not need cleanup (no palette) */ -LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth); - -void lodepng_palette_clear(LodePNGColorMode* info); -/*add 1 color to the palette*/ -unsigned lodepng_palette_add(LodePNGColorMode* info, - unsigned char r, unsigned char g, unsigned char b, unsigned char a); - -/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ -unsigned lodepng_get_bpp(const LodePNGColorMode* info); -/*get the amount of color channels used, based on colortype in the struct. -If a palette is used, it counts as 1 channel.*/ -unsigned lodepng_get_channels(const LodePNGColorMode* info); -/*is it a grayscale type? (only colortype 0 or 4)*/ -unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info); -/*has it got an alpha channel? (only colortype 2 or 6)*/ -unsigned lodepng_is_alpha_type(const LodePNGColorMode* info); -/*has it got a palette? (only colortype 3)*/ -unsigned lodepng_is_palette_type(const LodePNGColorMode* info); -/*only returns true if there is a palette and there is a value in the palette with alpha < 255. -Loops through the palette to check this.*/ -unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info); -/* -Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. -Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). -Returns false if the image can only have opaque pixels. -In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, -or if "key_defined" is true. -*/ -unsigned lodepng_can_have_alpha(const LodePNGColorMode* info); -/*Returns the byte size of a raw image buffer with given width, height and color mode*/ -size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*The information of a Time chunk in PNG.*/ -typedef struct LodePNGTime { - unsigned year; /*2 bytes used (0-65535)*/ - unsigned month; /*1-12*/ - unsigned day; /*1-31*/ - unsigned hour; /*0-23*/ - unsigned minute; /*0-59*/ - unsigned second; /*0-60 (to allow for leap seconds)*/ -} LodePNGTime; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/*Information about the PNG image, except pixels, width and height.*/ -typedef struct LodePNGInfo { - /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ - unsigned compression_method;/*compression method of the original file. Always 0.*/ - unsigned filter_method; /*filter method of the original file*/ - unsigned interlace_method; /*interlace method of the original file: 0=none, 1=Adam7*/ - LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /* - Suggested background color chunk (bKGD) - - This uses the same color mode and bit depth as the PNG (except no alpha channel), - with values truncated to the bit depth in the unsigned integer. - - For grayscale and palette PNGs, the value is stored in background_r. The values - in background_g and background_b are then unused. - - So when decoding, you may get these in a different color mode than the one you requested - for the raw pixels. - - When encoding with auto_convert, you must use the color model defined in info_png.color for - these values. The encoder normally ignores info_png.color when auto_convert is on, but will - use it to interpret these values (and convert copies of them to its chosen color model). - - When encoding, avoid setting this to an expensive color, such as a non-gray value - when the image is gray, or the compression will be worse since it will be forced to - write the PNG with a more expensive color mode (when auto_convert is on). - - The decoder does not use this background color to edit the color of pixels. This is a - completely optional metadata feature. - */ - unsigned background_defined; /*is a suggested background color given?*/ - unsigned background_r; /*red/gray/palette component of suggested background color*/ - unsigned background_g; /*green component of suggested background color*/ - unsigned background_b; /*blue component of suggested background color*/ - - /* - non-international text chunks (tEXt and zTXt) - - The char** arrays each contain num strings. The actual messages are in - text_strings, while text_keys are keywords that give a short description what - the actual text represents, e.g. Title, Author, Description, or anything else. - - All the string fields below including keys, names and language tags are null terminated. - The PNG specification uses null characters for the keys, names and tags, and forbids null - characters to appear in the main text which is why we can use null termination everywhere here. - - A keyword is minimum 1 character and maximum 79 characters long. It's - discouraged to use a single line length longer than 79 characters for texts. - - Don't allocate these text buffers yourself. Use the init/cleanup functions - correctly and use lodepng_add_text and lodepng_clear_text. - */ - size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ - char** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ - char** text_strings; /*the actual text*/ - - /* - international text chunks (iTXt) - Similar to the non-international text chunks, but with additional strings - "langtags" and "transkeys". - */ - size_t itext_num; /*the amount of international texts in this PNG*/ - char** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ - char** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ - char** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ - char** itext_strings; /*the actual international text - UTF-8 string*/ - - /*time chunk (tIME)*/ - unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ - LodePNGTime time; - - /*phys chunk (pHYs)*/ - unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ - unsigned phys_x; /*pixels per unit in x direction*/ - unsigned phys_y; /*pixels per unit in y direction*/ - unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ - - /* - Color profile related chunks: gAMA, cHRM, sRGB, iCPP - - LodePNG does not apply any color conversions on pixels in the encoder or decoder and does not interpret these color - profile values. It merely passes on the information. If you wish to use color profiles and convert colors, please - use these values with a color management library. - - See the PNG, ICC and sRGB specifications for more information about the meaning of these values. - */ - - /* gAMA chunk: optional, overridden by sRGB or iCCP if those are present. */ - unsigned gama_defined; /* Whether a gAMA chunk is present (0 = not present, 1 = present). */ - unsigned gama_gamma; /* Gamma exponent times 100000 */ - - /* cHRM chunk: optional, overridden by sRGB or iCCP if those are present. */ - unsigned chrm_defined; /* Whether a cHRM chunk is present (0 = not present, 1 = present). */ - unsigned chrm_white_x; /* White Point x times 100000 */ - unsigned chrm_white_y; /* White Point y times 100000 */ - unsigned chrm_red_x; /* Red x times 100000 */ - unsigned chrm_red_y; /* Red y times 100000 */ - unsigned chrm_green_x; /* Green x times 100000 */ - unsigned chrm_green_y; /* Green y times 100000 */ - unsigned chrm_blue_x; /* Blue x times 100000 */ - unsigned chrm_blue_y; /* Blue y times 100000 */ - - /* - sRGB chunk: optional. May not appear at the same time as iCCP. - If gAMA is also present gAMA must contain value 45455. - If cHRM is also present cHRM must contain respectively 31270,32900,64000,33000,30000,60000,15000,6000. - */ - unsigned srgb_defined; /* Whether an sRGB chunk is present (0 = not present, 1 = present). */ - unsigned srgb_intent; /* Rendering intent: 0=perceptual, 1=rel. colorimetric, 2=saturation, 3=abs. colorimetric */ - - /* - iCCP chunk: optional. May not appear at the same time as sRGB. - - LodePNG does not parse or use the ICC profile (except its color space header field for an edge case), a - separate library to handle the ICC data (not included in LodePNG) format is needed to use it for color - management and conversions. - - For encoding, if iCCP is present, gAMA and cHRM are recommended to be added as well with values that match the ICC - profile as closely as possible, if you wish to do this you should provide the correct values for gAMA and cHRM and - enable their '_defined' flags since LodePNG will not automatically compute them from the ICC profile. - - For encoding, the ICC profile is required by the PNG specification to be an "RGB" profile for non-gray - PNG color types and a "GRAY" profile for gray PNG color types. If you disable auto_convert, you must ensure - the ICC profile type matches your requested color type, else the encoder gives an error. If auto_convert is - enabled (the default), and the ICC profile is not a good match for the pixel data, this will result in an encoder - error if the pixel data has non-gray pixels for a GRAY profile, or a silent less-optimal compression of the pixel - data if the pixels could be encoded as grayscale but the ICC profile is RGB. - - To avoid this do not set an ICC profile in the image unless there is a good reason for it, and when doing so - make sure you compute it carefully to avoid the above problems. - */ - unsigned iccp_defined; /* Whether an iCCP chunk is present (0 = not present, 1 = present). */ - char* iccp_name; /* Null terminated string with profile name, 1-79 bytes */ - /* - The ICC profile in iccp_profile_size bytes. - Don't allocate this buffer yourself. Use the init/cleanup functions - correctly and use lodepng_set_icc and lodepng_clear_icc. - */ - unsigned char* iccp_profile; - unsigned iccp_profile_size; /* The size of iccp_profile in bytes */ - - /* End of color profile related chunks */ - - - /* - unknown chunks: chunks not known by LodePNG, passed on byte for byte. - - There are 3 buffers, one for each position in the PNG where unknown chunks can appear. - Each buffer contains all unknown chunks for that position consecutively. - The 3 positions are: - 0: between IHDR and PLTE, 1: between PLTE and IDAT, 2: between IDAT and IEND. - - For encoding, do not store critical chunks or known chunks that are enabled with a "_defined" flag - above in here, since the encoder will blindly follow this and could then encode an invalid PNG file - (such as one with two IHDR chunks or the disallowed combination of sRGB with iCCP). But do use - this if you wish to store an ancillary chunk that is not supported by LodePNG (such as sPLT or hIST), - or any non-standard PNG chunk. - - Do not allocate or traverse this data yourself. Use the chunk traversing functions declared - later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. - */ - unsigned char* unknown_chunks_data[3]; - size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGInfo; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_info_init(LodePNGInfo* info); -void lodepng_info_cleanup(LodePNGInfo* info); -/*return value is error code (0 means no error)*/ -unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str); /*push back both texts at once*/ -void lodepng_clear_text(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ - -unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, - const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/ -void lodepng_clear_itext(LodePNGInfo* info); /*use this to clear the itexts again after you filled them in*/ - -/*replaces if exists*/ -unsigned lodepng_set_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size); -void lodepng_clear_icc(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/* -Converts raw buffer from one color type to another color type, based on -LodePNGColorMode structs to describe the input and output color type. -See the reference manual at the end of this header file to see which color conversions are supported. -return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) -The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel -of the output color type (lodepng_get_bpp). -For < 8 bpp images, there should not be padding bits at the end of scanlines. -For 16-bit per channel colors, uses big endian format like PNG does. -Return value is LodePNG error code -*/ -unsigned lodepng_convert(unsigned char* out, const unsigned char* in, - const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, - unsigned w, unsigned h); - -#ifdef LODEPNG_COMPILE_DECODER -/* -Settings for the decoder. This contains settings for the PNG and the Zlib -decoder, but not the Info settings from the Info structs. -*/ -typedef struct LodePNGDecoderSettings { - LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ - - /* Check LodePNGDecompressSettings for more ignorable errors such as ignore_adler32 */ - unsigned ignore_crc; /*ignore CRC checksums*/ - unsigned ignore_critical; /*ignore unknown critical chunks*/ - unsigned ignore_end; /*ignore issues at end of file if possible (missing IEND chunk, too large chunk, ...)*/ - /* TODO: make a system involving warnings with levels and a strict mode instead. Other potentially recoverable - errors: srgb rendering intent value, size of content of ancillary chunks, more than 79 characters for some - strings, placement/combination rules for ancillary chunks, crc of unknown chunks, allowed characters - in string keys, etc... */ - - unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ - /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ - unsigned remember_unknown_chunks; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGDecoderSettings; - -void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ -typedef enum LodePNGFilterStrategy { - /*every filter at zero*/ - LFS_ZERO = 0, - /*every filter at 1, 2, 3 or 4 (paeth), unlike LFS_ZERO not a good choice, but for testing*/ - LFS_ONE = 1, - LFS_TWO = 2, - LFS_THREE = 3, - LFS_FOUR = 4, - /*Use filter that gives minimum sum, as described in the official PNG filter heuristic.*/ - LFS_MINSUM, - /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending - on the image, this is better or worse than minsum.*/ - LFS_ENTROPY, - /* - Brute-force-search PNG filters by compressing each filter for each scanline. - Experimental, very slow, and only rarely gives better compression than MINSUM. - */ - LFS_BRUTE_FORCE, - /*use predefined_filters buffer: you specify the filter type for each scanline*/ - LFS_PREDEFINED -} LodePNGFilterStrategy; - -/*Gives characteristics about the integer RGBA colors of the image (count, alpha channel usage, bit depth, ...), -which helps decide which color model to use for encoding. -Used internally by default if "auto_convert" is enabled. Public because it's useful for custom algorithms.*/ -typedef struct LodePNGColorStats { - unsigned colored; /*not grayscale*/ - unsigned key; /*image is not opaque and color key is possible instead of full alpha*/ - unsigned short key_r; /*key values, always as 16-bit, in 8-bit case the byte is duplicated, e.g. 65535 means 255*/ - unsigned short key_g; - unsigned short key_b; - unsigned alpha; /*image is not opaque and alpha channel or alpha palette required*/ - unsigned numcolors; /*amount of colors, up to 257. Not valid if bits == 16 or allow_palette is disabled.*/ - unsigned char palette[1024]; /*Remembers up to the first 256 RGBA colors, in no particular order, only valid when numcolors is valid*/ - unsigned bits; /*bits per channel (not for palette). 1,2 or 4 for grayscale only. 16 if 16-bit per channel required.*/ - size_t numpixels; - - /*user settings for computing/using the stats*/ - unsigned allow_palette; /*default 1. if 0, disallow choosing palette colortype in auto_choose_color, and don't count numcolors*/ - unsigned allow_greyscale; /*default 1. if 0, choose RGB or RGBA even if the image only has gray colors*/ -} LodePNGColorStats; - -void lodepng_color_stats_init(LodePNGColorStats* stats); - -/*Get a LodePNGColorStats of the image. The stats must already have been inited. -Returns error code (e.g. alloc fail) or 0 if ok.*/ -unsigned lodepng_compute_color_stats(LodePNGColorStats* stats, - const unsigned char* image, unsigned w, unsigned h, - const LodePNGColorMode* mode_in); - -/*Settings for the encoder.*/ -typedef struct LodePNGEncoderSettings { - LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ - - unsigned auto_convert; /*automatically choose output PNG color type. Default: true*/ - - /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than - 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to - completely follow the official PNG heuristic, filter_palette_zero must be true and - filter_strategy must be LFS_MINSUM*/ - unsigned filter_palette_zero; - /*Which filter strategy to use when not using zeroes due to filter_palette_zero. - Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/ - LodePNGFilterStrategy filter_strategy; - /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with - the same length as the amount of scanlines in the image, and each value must <= 5. You - have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero - must be set to 0 to ensure this is also used on palette or low bitdepth images.*/ - const unsigned char* predefined_filters; - - /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). - If colortype is 3, PLTE is _always_ created.*/ - unsigned force_palette; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*add LodePNG identifier and version as a text chunk, for debugging*/ - unsigned add_id; - /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ - unsigned text_compression; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGEncoderSettings; - -void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings); -#endif /*LODEPNG_COMPILE_ENCODER*/ - - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) -/*The settings, state and information for extended encoding and decoding.*/ -typedef struct LodePNGState { -#ifdef LODEPNG_COMPILE_DECODER - LodePNGDecoderSettings decoder; /*the decoding settings*/ -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER - LodePNGEncoderSettings encoder; /*the encoding settings*/ -#endif /*LODEPNG_COMPILE_ENCODER*/ - LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ - LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ - unsigned error; -} LodePNGState; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_state_init(LodePNGState* state); -void lodepng_state_cleanup(LodePNGState* state); -void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source); -#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ - -#ifdef LODEPNG_COMPILE_DECODER -/* -Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and -getting much more information about the PNG image and color mode. -*/ -unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize); - -/* -Read the PNG header, but not the actual data. This returns only the information -that is in the IHDR chunk of the PNG, such as width, height and color type. The -information is placed in the info_png field of the LodePNGState. -*/ -unsigned lodepng_inspect(unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize); -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* -Reads one metadata chunk (other than IHDR) of the PNG file and outputs what it -read in the state. Returns error code on failure. -Use lodepng_inspect first with a new state, then e.g. lodepng_chunk_find_const -to find the desired chunk type, and if non null use lodepng_inspect_chunk (with -chunk_pointer - start_of_file as pos). -Supports most metadata chunks from the PNG standard (gAMA, bKGD, tEXt, ...). -Ignores unsupported, unknown, non-metadata or IHDR chunks (without error). -Requirements: &in[pos] must point to start of a chunk, must use regular -lodepng_inspect first since format of most other chunks depends on IHDR, and if -there is a PLTE chunk, that one must be inspected before tRNS or bKGD. -*/ -unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos, - const unsigned char* in, size_t insize); - -#ifdef LODEPNG_COMPILE_ENCODER -/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ -unsigned lodepng_encode(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGState* state); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/* -The lodepng_chunk functions are normally not needed, except to traverse the -unknown chunks stored in the LodePNGInfo struct, or add new ones to it. -It also allows traversing the chunks of an encoded PNG file yourself. - -The chunk pointer always points to the beginning of the chunk itself, that is -the first byte of the 4 length bytes. - -In the PNG file format, chunks have the following format: --4 bytes length: length of the data of the chunk in bytes (chunk itself is 12 bytes longer) --4 bytes chunk type (ASCII a-z,A-Z only, see below) --length bytes of data (may be 0 bytes if length was 0) --4 bytes of CRC, computed on chunk name + data - -The first chunk starts at the 8th byte of the PNG file, the entire rest of the file -exists out of concatenated chunks with the above format. - -PNG standard chunk ASCII naming conventions: --First byte: uppercase = critical, lowercase = ancillary --Second byte: uppercase = public, lowercase = private --Third byte: must be uppercase --Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy -*/ - -/* -Gets the length of the data of the chunk. Total chunk length has 12 bytes more. -There must be at least 4 bytes to read from. If the result value is too large, -it may be corrupt data. -*/ -unsigned lodepng_chunk_length(const unsigned char* chunk); - -/*puts the 4-byte type in null terminated string*/ -void lodepng_chunk_type(char type[5], const unsigned char* chunk); - -/*check if the type is the given type*/ -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type); - -/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ -unsigned char lodepng_chunk_ancillary(const unsigned char* chunk); - -/*0: public, 1: private (see PNG standard)*/ -unsigned char lodepng_chunk_private(const unsigned char* chunk); - -/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk); - -/*get pointer to the data of the chunk, where the input points to the header of the chunk*/ -unsigned char* lodepng_chunk_data(unsigned char* chunk); -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk); - -/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ -unsigned lodepng_chunk_check_crc(const unsigned char* chunk); - -/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ -void lodepng_chunk_generate_crc(unsigned char* chunk); - -/* -Iterate to next chunks, allows iterating through all chunks of the PNG file. -Input must be at the beginning of a chunk (result of a previous lodepng_chunk_next call, -or the 8th byte of a PNG file which always has the first chunk), or alternatively may -point to the first byte of the PNG file (which is not a chunk but the magic header, the -function will then skip over it and return the first real chunk). -Will output pointer to the start of the next chunk, or at or beyond end of the file if there -is no more chunk after this or possibly if the chunk is corrupt. -Start this process at the 8th byte of the PNG file. -In a non-corrupt PNG file, the last chunk should have name "IEND". -*/ -unsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end); -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end); - -/*Finds the first chunk with the given type in the range [chunk, end), or returns NULL if not found.*/ -unsigned char* lodepng_chunk_find(unsigned char* chunk, unsigned char* end, const char type[5]); -const unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]); - -/* -Appends chunk to the data in out. The given chunk should already have its chunk header. -The out variable and outsize are updated to reflect the new reallocated buffer. -Returns error code (0 if it went ok) -*/ -unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk); - -/* -Appends new chunk to out. The chunk to append is given by giving its length, type -and data separately. The type is a 4-letter string. -The out variable and outsize are updated to reflect the new reallocated buffer. -Returne error code (0 if it went ok) -*/ -unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length, - const char* type, const unsigned char* data); - - -/*Calculate CRC32 of buffer*/ -unsigned lodepng_crc32(const unsigned char* buf, size_t len); -#endif /*LODEPNG_COMPILE_PNG*/ - - -#ifdef LODEPNG_COMPILE_ZLIB -/* -This zlib part can be used independently to zlib compress and decompress a -buffer. It cannot be used to create gzip files however, and it only supports the -part of zlib that is required for PNG, it does not support dictionaries. -*/ - -#ifdef LODEPNG_COMPILE_DECODER -/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ -unsigned lodepng_inflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings); - -/* -Decompresses Zlib data. Reallocates the out buffer and appends the data. The -data must be according to the zlib specification. -Either, *out must be NULL and *outsize must be 0, or, *out must be a valid -buffer and *outsize its size in bytes. out must be freed by user after usage. -*/ -unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Compresses data with Zlib. Reallocates the out buffer and appends the data. -Zlib adds a small header and trailer around the deflate data. -The data is output in the format of the zlib specification. -Either, *out must be NULL and *outsize must be 0, or, *out must be a valid -buffer and *outsize its size in bytes. out must be freed by user after usage. -*/ -unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings); - -/* -Find length-limited Huffman code for given frequencies. This function is in the -public interface only for tests, it's used internally by lodepng_deflate. -*/ -unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, - size_t numcodes, unsigned maxbitlen); - -/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ -unsigned lodepng_deflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings); - -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_ZLIB*/ - -#ifdef LODEPNG_COMPILE_DISK -/* -Load a file from disk into buffer. The function allocates the out buffer, and -after usage you should free it. -out: output parameter, contains pointer to loaded buffer. -outsize: output parameter, size of the allocated out buffer -filename: the path to the file to load -return value: error code (0 means ok) -*/ -unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename); - -/* -Save a file from buffer to disk. Warning, if it exists, this function overwrites -the file without warning! -buffer: the buffer to write -buffersize: size of the buffer to write -filename: the path to the file to save to -return value: error code (0 means ok) -*/ -unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename); -#endif /*LODEPNG_COMPILE_DISK*/ - -#ifdef LODEPNG_COMPILE_CPP -/* The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. */ -namespace lodepng { -#ifdef LODEPNG_COMPILE_PNG -class State : public LodePNGState { - public: - State(); - State(const State& other); - ~State(); - State& operator=(const State& other); -}; - -#ifdef LODEPNG_COMPILE_DECODER -/* Same as other lodepng::decode, but using a State for more settings and information. */ -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const unsigned char* in, size_t insize); -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const std::vector& in); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* Same as other lodepng::encode, but using a State for more settings and information. */ -unsigned encode(std::vector& out, - const unsigned char* in, unsigned w, unsigned h, - State& state); -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - State& state); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DISK -/* -Load a file from disk into an std::vector. -return value: error code (0 means ok) -*/ -unsigned load_file(std::vector& buffer, const std::string& filename); - -/* -Save the binary data in an std::vector to a file on disk. The file is overwritten -without warning. -*/ -unsigned save_file(const std::vector& buffer, const std::string& filename); -#endif /* LODEPNG_COMPILE_DISK */ -#endif /* LODEPNG_COMPILE_PNG */ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_DECODER -/* Zlib-decompress an unsigned char buffer */ -unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); - -/* Zlib-decompress an std::vector */ -unsigned decompress(std::vector& out, const std::vector& in, - const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); -#endif /* LODEPNG_COMPILE_DECODER */ - -#ifdef LODEPNG_COMPILE_ENCODER -/* Zlib-compress an unsigned char buffer */ -unsigned compress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGCompressSettings& settings = lodepng_default_compress_settings); - -/* Zlib-compress an std::vector */ -unsigned compress(std::vector& out, const std::vector& in, - const LodePNGCompressSettings& settings = lodepng_default_compress_settings); -#endif /* LODEPNG_COMPILE_ENCODER */ -#endif /* LODEPNG_COMPILE_ZLIB */ -} /* namespace lodepng */ -#endif /*LODEPNG_COMPILE_CPP*/ - -/* -TODO: -[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often -[.] check compatibility with various compilers - done but needs to be redone for every newer version -[X] converting color to 16-bit per channel types -[X] support color profile chunk types (but never let them touch RGB values by default) -[ ] support all public PNG chunk types (almost done except sBIT, sPLT and hIST) -[ ] make sure encoder generates no chunks with size > (2^31)-1 -[ ] partial decoding (stream processing) -[X] let the "isFullyOpaque" function check color keys and transparent palettes too -[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" -[ ] allow treating some errors like warnings, when image is recoverable (e.g. 69, 57, 58) -[ ] make warnings like: oob palette, checksum fail, data after iend, wrong/unknown crit chunk, no null terminator in text, ... -[ ] error messages with line numbers (and version) -[ ] errors in state instead of as return code? -[ ] new errors/warnings like suspiciously big decompressed ztxt or iccp chunk -[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes -[ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ... -[ ] allow user to give data (void*) to custom allocator -[X] provide alternatives for C library functions not present on some platforms (memcpy, ...) -*/ - -#endif /*LODEPNG_H inclusion guard*/ - -/* -LodePNG Documentation ---------------------- - -0. table of contents --------------------- - - 1. about - 1.1. supported features - 1.2. features not supported - 2. C and C++ version - 3. security - 4. decoding - 5. encoding - 6. color conversions - 6.1. PNG color types - 6.2. color conversions - 6.3. padding bits - 6.4. A note about 16-bits per channel and endianness - 7. error values - 8. chunks and PNG editing - 9. compiler support - 10. examples - 10.1. decoder C++ example - 10.2. decoder C example - 11. state settings reference - 12. changes - 13. contact information - - -1. about --------- - -PNG is a file format to store raster images losslessly with good compression, -supporting different color types and alpha channel. - -LodePNG is a PNG codec according to the Portable Network Graphics (PNG) -Specification (Second Edition) - W3C Recommendation 10 November 2003. - -The specifications used are: - -*) Portable Network Graphics (PNG) Specification (Second Edition): - http://www.w3.org/TR/2003/REC-PNG-20031110 -*) RFC 1950 ZLIB Compressed Data Format version 3.3: - http://www.gzip.org/zlib/rfc-zlib.html -*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: - http://www.gzip.org/zlib/rfc-deflate.html - -The most recent version of LodePNG can currently be found at -http://lodev.org/lodepng/ - -LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds -extra functionality. - -LodePNG exists out of two files: --lodepng.h: the header file for both C and C++ --lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage - -If you want to start using LodePNG right away without reading this doc, get the -examples from the LodePNG website to see how to use it in code, or check the -smaller examples in chapter 13 here. - -LodePNG is simple but only supports the basic requirements. To achieve -simplicity, the following design choices were made: There are no dependencies -on any external library. There are functions to decode and encode a PNG with -a single function call, and extended versions of these functions taking a -LodePNGState struct allowing to specify or get more information. By default -the colors of the raw image are always RGB or RGBA, no matter what color type -the PNG file uses. To read and write files, there are simple functions to -convert the files to/from buffers in memory. - -This all makes LodePNG suitable for loading textures in games, demos and small -programs, ... It's less suitable for full fledged image editors, loading PNGs -over network (it requires all the image data to be available before decoding can -begin), life-critical systems, ... - -1.1. supported features ------------------------ - -The following features are supported by the decoder: - -*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, - or the same color type as the PNG -*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image -*) Adam7 interlace and deinterlace for any color type -*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk -*) support for alpha channels, including RGBA color model, translucent palettes and color keying -*) zlib decompression (inflate) -*) zlib compression (deflate) -*) CRC32 and ADLER32 checksums -*) colorimetric color profile conversions: currently experimentally available in lodepng_util.cpp only, - plus alternatively ability to pass on chroma/gamma/ICC profile information to other color management system. -*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. -*) the following chunks are supported by both encoder and decoder: - IHDR: header information - PLTE: color palette - IDAT: pixel data - IEND: the final chunk - tRNS: transparency for palettized images - tEXt: textual information - zTXt: compressed textual information - iTXt: international textual information - bKGD: suggested background color - pHYs: physical dimensions - tIME: modification time - cHRM: RGB chromaticities - gAMA: RGB gamma correction - iCCP: ICC color profile - sRGB: rendering intent - -1.2. features not supported ---------------------------- - -The following features are _not_ supported: - -*) some features needed to make a conformant PNG-Editor might be still missing. -*) partial loading/stream processing. All data must be available and is processed in one call. -*) The following public chunks are not (yet) supported but treated as unknown chunks by LodePNG: - sBIT - hIST - sPLT - - -2. C and C++ version --------------------- - -The C version uses buffers allocated with alloc that you need to free() -yourself. You need to use init and cleanup functions for each struct whenever -using a struct from the C version to avoid exploits and memory leaks. - -The C++ version has extra functions with std::vectors in the interface and the -lodepng::State class which is a LodePNGState with constructor and destructor. - -These files work without modification for both C and C++ compilers because all -the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers -ignore it, and the C code is made to compile both with strict ISO C90 and C++. - -To use the C++ version, you need to rename the source file to lodepng.cpp -(instead of lodepng.c), and compile it with a C++ compiler. - -To use the C version, you need to rename the source file to lodepng.c (instead -of lodepng.cpp), and compile it with a C compiler. - - -3. Security ------------ - -Even if carefully designed, it's always possible that LodePNG contains possible -exploits. If you discover one, please let me know, and it will be fixed. - -When using LodePNG, care has to be taken with the C version of LodePNG, as well -as the C-style structs when working with C++. The following conventions are used -for all C-style structs: - --if a struct has a corresponding init function, always call the init function when making a new one --if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks --if a struct has a corresponding copy function, use the copy function instead of "=". - The destination must also be inited already. - - -4. Decoding ------------ - -Decoding converts a PNG compressed image to a raw pixel buffer. - -Most documentation on using the decoder is at its declarations in the header -above. For C, simple decoding can be done with functions such as -lodepng_decode32, and more advanced decoding can be done with the struct -LodePNGState and lodepng_decode. For C++, all decoding can be done with the -various lodepng::decode functions, and lodepng::State can be used for advanced -features. - -When using the LodePNGState, it uses the following fields for decoding: -*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here -*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get -*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use - -LodePNGInfo info_png --------------------- - -After decoding, this contains extra information of the PNG image, except the actual -pixels, width and height because these are already gotten directly from the decoder -functions. - -It contains for example the original color type of the PNG image, text comments, -suggested background color, etc... More details about the LodePNGInfo struct are -at its declaration documentation. - -LodePNGColorMode info_raw -------------------------- - -When decoding, here you can specify which color type you want -the resulting raw image to be. If this is different from the colortype of the -PNG, then the decoder will automatically convert the result. This conversion -always works, except if you want it to convert a color PNG to grayscale or to -a palette with missing colors. - -By default, 32-bit color is used for the result. - -LodePNGDecoderSettings decoder ------------------------------- - -The settings can be used to ignore the errors created by invalid CRC and Adler32 -chunks, and to disable the decoding of tEXt chunks. - -There's also a setting color_convert, true by default. If false, no conversion -is done, the resulting data will be as it was in the PNG (after decompression) -and you'll have to puzzle the colors of the pixels together yourself using the -color type information in the LodePNGInfo. - - -5. Encoding ------------ - -Encoding converts a raw pixel buffer to a PNG compressed image. - -Most documentation on using the encoder is at its declarations in the header -above. For C, simple encoding can be done with functions such as -lodepng_encode32, and more advanced decoding can be done with the struct -LodePNGState and lodepng_encode. For C++, all encoding can be done with the -various lodepng::encode functions, and lodepng::State can be used for advanced -features. - -Like the decoder, the encoder can also give errors. However it gives less errors -since the encoder input is trusted, the decoder input (a PNG image that could -be forged by anyone) is not trusted. - -When using the LodePNGState, it uses the following fields for encoding: -*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. -*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has -*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use - -LodePNGInfo info_png --------------------- - -When encoding, you use this the opposite way as when decoding: for encoding, -you fill in the values you want the PNG to have before encoding. By default it's -not needed to specify a color type for the PNG since it's automatically chosen, -but it's possible to choose it yourself given the right settings. - -The encoder will not always exactly match the LodePNGInfo struct you give, -it tries as close as possible. Some things are ignored by the encoder. The -encoder uses, for example, the following settings from it when applicable: -colortype and bitdepth, text chunks, time chunk, the color key, the palette, the -background color, the interlace method, unknown chunks, ... - -When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. -If the palette contains any colors for which the alpha channel is not 255 (so -there are translucent colors in the palette), it'll add a tRNS chunk. - -LodePNGColorMode info_raw -------------------------- - -You specify the color type of the raw image that you give to the input here, -including a possible transparent color key and palette you happen to be using in -your raw image data. - -By default, 32-bit color is assumed, meaning your input has to be in RGBA -format with 4 bytes (unsigned chars) per pixel. - -LodePNGEncoderSettings encoder ------------------------------- - -The following settings are supported (some are in sub-structs): -*) auto_convert: when this option is enabled, the encoder will -automatically choose the smallest possible color mode (including color key) that -can encode the colors of all pixels without information loss. -*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, - 2 = dynamic huffman tree (best compression). Should be 2 for proper - compression. -*) use_lz77: whether or not to use LZ77 for compressed block types. Should be - true for proper compression. -*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value - 2048 by default, but can be set to 32768 for better, but slow, compression. -*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE - chunk if force_palette is true. This can used as suggested palette to convert - to by viewers that don't support more than 256 colors (if those still exist) -*) add_id: add text chunk "Encoder: LodePNG " to the image. -*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. - zTXt chunks use zlib compression on the text. This gives a smaller result on - large texts but a larger result on small texts (such as a single program name). - It's all tEXt or all zTXt though, there's no separate setting per text yet. - - -6. color conversions --------------------- - -An important thing to note about LodePNG, is that the color type of the PNG, and -the color type of the raw image, are completely independent. By default, when -you decode a PNG, you get the result as a raw image in the color type you want, -no matter whether the PNG was encoded with a palette, grayscale or RGBA color. -And if you encode an image, by default LodePNG will automatically choose the PNG -color type that gives good compression based on the values of colors and amount -of colors in the image. It can be configured to let you control it instead as -well, though. - -To be able to do this, LodePNG does conversions from one color mode to another. -It can convert from almost any color type to any other color type, except the -following conversions: RGB to grayscale is not supported, and converting to a -palette when the palette doesn't have a required color is not supported. This is -not supported on purpose: this is information loss which requires a color -reduction algorithm that is beyond the scope of a PNG encoder (yes, RGB to gray -is easy, but there are multiple ways if you want to give some channels more -weight). - -By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB -color, no matter what color type the PNG has. And by default when encoding, -LodePNG automatically picks the best color model for the output PNG, and expects -the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control -the color format of the images yourself, you can skip this chapter. - -6.1. PNG color types --------------------- - -A PNG image can have many color types, ranging from 1-bit color to 64-bit color, -as well as palettized color modes. After the zlib decompression and unfiltering -in the PNG image is done, the raw pixel data will have that color type and thus -a certain amount of bits per pixel. If you want the output raw image after -decoding to have another color type, a conversion is done by LodePNG. - -The PNG specification gives the following color types: - -0: grayscale, bit depths 1, 2, 4, 8, 16 -2: RGB, bit depths 8 and 16 -3: palette, bit depths 1, 2, 4 and 8 -4: grayscale with alpha, bit depths 8 and 16 -6: RGBA, bit depths 8 and 16 - -Bit depth is the amount of bits per pixel per color channel. So the total amount -of bits per pixel is: amount of channels * bitdepth. - -6.2. color conversions ----------------------- - -As explained in the sections about the encoder and decoder, you can specify -color types and bit depths in info_png and info_raw to change the default -behaviour. - -If, when decoding, you want the raw image to be something else than the default, -you need to set the color type and bit depth you want in the LodePNGColorMode, -or the parameters colortype and bitdepth of the simple decoding function. - -If, when encoding, you use another color type than the default in the raw input -image, you need to specify its color type and bit depth in the LodePNGColorMode -of the raw image, or use the parameters colortype and bitdepth of the simple -encoding function. - -If, when encoding, you don't want LodePNG to choose the output PNG color type -but control it yourself, you need to set auto_convert in the encoder settings -to false, and specify the color type you want in the LodePNGInfo of the -encoder (including palette: it can generate a palette if auto_convert is true, -otherwise not). - -If the input and output color type differ (whether user chosen or auto chosen), -LodePNG will do a color conversion, which follows the rules below, and may -sometimes result in an error. - -To avoid some confusion: --the decoder converts from PNG to raw image --the encoder converts from raw image to PNG --the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image --the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG --when encoding, the color type in LodePNGInfo is ignored if auto_convert - is enabled, it is automatically generated instead --when decoding, the color type in LodePNGInfo is set by the decoder to that of the original - PNG image, but it can be ignored since the raw image has the color type you requested instead --if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion - between the color types is done if the color types are supported. If it is not - supported, an error is returned. If the types are the same, no conversion is done. --even though some conversions aren't supported, LodePNG supports loading PNGs from any - colortype and saving PNGs to any colortype, sometimes it just requires preparing - the raw image correctly before encoding. --both encoder and decoder use the same color converter. - -The function lodepng_convert does the color conversion. It is available in the -interface but normally isn't needed since the encoder and decoder already call -it. - -Non supported color conversions: --color to grayscale when non-gray pixels are present: no error is thrown, but -the result will look ugly because only the red channel is taken (it assumes all -three channels are the same in this case so ignores green and blue). The reason -no error is given is to allow converting from three-channel grayscale images to -one-channel even if there are numerical imprecisions. --anything to palette when the palette does not have an exact match for a from-color -in it: in this case an error is thrown - -Supported color conversions: --anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA --any gray or gray+alpha, to gray or gray+alpha --anything to a palette, as long as the palette has the requested colors in it --removing alpha channel --higher to smaller bitdepth, and vice versa - -If you want no color conversion to be done (e.g. for speed or control): --In the encoder, you can make it save a PNG with any color type by giving the -raw color mode and LodePNGInfo the same color mode, and setting auto_convert to -false. --In the decoder, you can make it store the pixel data in the same color type -as the PNG has, by setting the color_convert setting to false. Settings in -info_raw are then ignored. - -6.3. padding bits ------------------ - -In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines -have a bit amount that isn't a multiple of 8, then padding bits are used so that each -scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. -The raw input image you give to the encoder, and the raw output image you get from the decoder -will NOT have these padding bits, e.g. in the case of a 1-bit image with a width -of 7 pixels, the first pixel of the second scanline will the 8th bit of the first byte, -not the first bit of a new byte. - -6.4. A note about 16-bits per channel and endianness ----------------------------------------------------- - -LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like -for any other color format. The 16-bit values are stored in big endian (most -significant byte first) in these arrays. This is the opposite order of the -little endian used by x86 CPU's. - -LodePNG always uses big endian because the PNG file format does so internally. -Conversions to other formats than PNG uses internally are not supported by -LodePNG on purpose, there are myriads of formats, including endianness of 16-bit -colors, the order in which you store R, G, B and A, and so on. Supporting and -converting to/from all that is outside the scope of LodePNG. - -This may mean that, depending on your use case, you may want to convert the big -endian output of LodePNG to little endian with a for loop. This is certainly not -always needed, many applications and libraries support big endian 16-bit colors -anyway, but it means you cannot simply cast the unsigned char* buffer to an -unsigned short* buffer on x86 CPUs. - - -7. error values ---------------- - -All functions in LodePNG that return an error code, return 0 if everything went -OK, or a non-zero code if there was an error. - -The meaning of the LodePNG error values can be retrieved with the function -lodepng_error_text: given the numerical error code, it returns a description -of the error in English as a string. - -Check the implementation of lodepng_error_text to see the meaning of each code. - - -8. chunks and PNG editing -------------------------- - -If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG -editor that should follow the rules about handling of unknown chunks, or if your -program is able to read other types of chunks than the ones handled by LodePNG, -then that's possible with the chunk functions of LodePNG. - -A PNG chunk has the following layout: - -4 bytes length -4 bytes type name -length bytes data -4 bytes CRC - -8.1. iterating through chunks ------------------------------ - -If you have a buffer containing the PNG image data, then the first chunk (the -IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the -signature of the PNG and are not part of a chunk. But if you start at byte 8 -then you have a chunk, and can check the following things of it. - -NOTE: none of these functions check for memory buffer boundaries. To avoid -exploits, always make sure the buffer contains all the data of the chunks. -When using lodepng_chunk_next, make sure the returned value is within the -allocated memory. - -unsigned lodepng_chunk_length(const unsigned char* chunk): - -Get the length of the chunk's data. The total chunk length is this length + 12. - -void lodepng_chunk_type(char type[5], const unsigned char* chunk): -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): - -Get the type of the chunk or compare if it's a certain type - -unsigned char lodepng_chunk_critical(const unsigned char* chunk): -unsigned char lodepng_chunk_private(const unsigned char* chunk): -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): - -Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). -Check if the chunk is private (public chunks are part of the standard, private ones not). -Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical -chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your -program doesn't handle that type of unknown chunk. - -unsigned char* lodepng_chunk_data(unsigned char* chunk): -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): - -Get a pointer to the start of the data of the chunk. - -unsigned lodepng_chunk_check_crc(const unsigned char* chunk): -void lodepng_chunk_generate_crc(unsigned char* chunk): - -Check if the crc is correct or generate a correct one. - -unsigned char* lodepng_chunk_next(unsigned char* chunk): -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): - -Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these -functions do no boundary checking of the allocated data whatsoever, so make sure there is enough -data available in the buffer to be able to go to the next chunk. - -unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk): -unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length, - const char* type, const unsigned char* data): - -These functions are used to create new chunks that are appended to the data in *out that has -length *outsize. The append function appends an existing chunk to the new data. The create -function creates a new chunk with the given parameters and appends it. Type is the 4-letter -name of the chunk. - -8.2. chunks in info_png ------------------------ - -The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 -buffers (each with size) to contain 3 types of unknown chunks: -the ones that come before the PLTE chunk, the ones that come between the PLTE -and the IDAT chunks, and the ones that come after the IDAT chunks. -It's necessary to make the distinction between these 3 cases because the PNG -standard forces to keep the ordering of unknown chunks compared to the critical -chunks, but does not force any other ordering rules. - -info_png.unknown_chunks_data[0] is the chunks before PLTE -info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT -info_png.unknown_chunks_data[2] is the chunks after IDAT - -The chunks in these 3 buffers can be iterated through and read by using the same -way described in the previous subchapter. - -When using the decoder to decode a PNG, you can make it store all unknown chunks -if you set the option settings.remember_unknown_chunks to 1. By default, this -option is off (0). - -The encoder will always encode unknown chunks that are stored in the info_png. -If you need it to add a particular chunk that isn't known by LodePNG, you can -use lodepng_chunk_append or lodepng_chunk_create to the chunk data in -info_png.unknown_chunks_data[x]. - -Chunks that are known by LodePNG should not be added in that way. E.g. to make -LodePNG add a bKGD chunk, set background_defined to true and add the correct -parameters there instead. - - -9. compiler support -------------------- - -No libraries other than the current standard C library are needed to compile -LodePNG. For the C++ version, only the standard C++ library is needed on top. -Add the files lodepng.c(pp) and lodepng.h to your project, include -lodepng.h where needed, and your program can read/write PNG files. - -It is compatible with C90 and up, and C++03 and up. - -If performance is important, use optimization when compiling! For both the -encoder and decoder, this makes a large difference. - -Make sure that LodePNG is compiled with the same compiler of the same version -and with the same settings as the rest of the program, or the interfaces with -std::vectors and std::strings in C++ can be incompatible. - -CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. - -*) gcc and g++ - -LodePNG is developed in gcc so this compiler is natively supported. It gives no -warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ -version 4.7.1 on Linux, 32-bit and 64-bit. - -*) Clang - -Fully supported and warning-free. - -*) Mingw - -The Mingw compiler (a port of gcc for Windows) should be fully supported by -LodePNG. - -*) Visual Studio and Visual C++ Express Edition - -LodePNG should be warning-free with warning level W4. Two warnings were disabled -with pragmas though: warning 4244 about implicit conversions, and warning 4996 -where it wants to use a non-standard function fopen_s instead of the standard C -fopen. - -Visual Studio may want "stdafx.h" files to be included in each source file and -give an error "unexpected end of file while looking for precompiled header". -This is not standard C++ and will not be added to the stock LodePNG. You can -disable it for lodepng.cpp only by right clicking it, Properties, C/C++, -Precompiled Headers, and set it to Not Using Precompiled Headers there. - -NOTE: Modern versions of VS should be fully supported, but old versions, e.g. -VS6, are not guaranteed to work. - -*) Compilers on Macintosh - -LodePNG has been reported to work both with gcc and LLVM for Macintosh, both for -C and C++. - -*) Other Compilers - -If you encounter problems on any compilers, feel free to let me know and I may -try to fix it if the compiler is modern and standards compliant. - - -10. examples ------------- - -This decoder example shows the most basic usage of LodePNG. More complex -examples can be found on the LodePNG website. - -10.1. decoder C++ example -------------------------- - -#include "lodepng.h" -#include - -int main(int argc, char *argv[]) { - const char* filename = argc > 1 ? argv[1] : "test.png"; - - //load and decode - std::vector image; - unsigned width, height; - unsigned error = lodepng::decode(image, width, height, filename); - - //if there's an error, display it - if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; - - //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... -} - -10.2. decoder C example ------------------------ - -#include "lodepng.h" - -int main(int argc, char *argv[]) { - unsigned error; - unsigned char* image; - size_t width, height; - const char* filename = argc > 1 ? argv[1] : "test.png"; - - error = lodepng_decode32_file(&image, &width, &height, filename); - - if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); - - / * use image here * / - - free(image); - return 0; -} - -11. state settings reference ----------------------------- - -A quick reference of some settings to set on the LodePNGState - -For decoding: - -state.decoder.zlibsettings.ignore_adler32: ignore ADLER32 checksums -state.decoder.zlibsettings.custom_...: use custom inflate function -state.decoder.ignore_crc: ignore CRC checksums -state.decoder.ignore_critical: ignore unknown critical chunks -state.decoder.ignore_end: ignore missing IEND chunk. May fail if this corruption causes other errors -state.decoder.color_convert: convert internal PNG color to chosen one -state.decoder.read_text_chunks: whether to read in text metadata chunks -state.decoder.remember_unknown_chunks: whether to read in unknown chunks -state.info_raw.colortype: desired color type for decoded image -state.info_raw.bitdepth: desired bit depth for decoded image -state.info_raw....: more color settings, see struct LodePNGColorMode -state.info_png....: no settings for decoder but ouput, see struct LodePNGInfo - -For encoding: - -state.encoder.zlibsettings.btype: disable compression by setting it to 0 -state.encoder.zlibsettings.use_lz77: use LZ77 in compression -state.encoder.zlibsettings.windowsize: tweak LZ77 windowsize -state.encoder.zlibsettings.minmatch: tweak min LZ77 length to match -state.encoder.zlibsettings.nicematch: tweak LZ77 match where to stop searching -state.encoder.zlibsettings.lazymatching: try one more LZ77 matching -state.encoder.zlibsettings.custom_...: use custom deflate function -state.encoder.auto_convert: choose optimal PNG color type, if 0 uses info_png -state.encoder.filter_palette_zero: PNG filter strategy for palette -state.encoder.filter_strategy: PNG filter strategy to encode with -state.encoder.force_palette: add palette even if not encoding to one -state.encoder.add_id: add LodePNG identifier and version as a text chunk -state.encoder.text_compression: use compressed text chunks for metadata -state.info_raw.colortype: color type of raw input image you provide -state.info_raw.bitdepth: bit depth of raw input image you provide -state.info_raw: more color settings, see struct LodePNGColorMode -state.info_png.color.colortype: desired color type if auto_convert is false -state.info_png.color.bitdepth: desired bit depth if auto_convert is false -state.info_png.color....: more color settings, see struct LodePNGColorMode -state.info_png....: more PNG related settings, see struct LodePNGInfo - - -12. changes ------------ - -The version number of LodePNG is the date of the change given in the format -yyyymmdd. - -Some changes aren't backwards compatible. Those are indicated with a (!) -symbol. - -Not all changes are listed here, the commit history in github lists more: -https://github.com/lvandeve/lodepng - -*) 06 mar 2020: simplified some of the dynamic memory allocations. -*) 12 jan 2020: (!) added 'end' argument to lodepng_chunk_next to allow correct - overflow checks. -*) 14 aug 2019: around 25% faster decoding thanks to huffman lookup tables. -*) 15 jun 2019: (!) auto_choose_color API changed (for bugfix: don't use palette - if gray ICC profile) and non-ICC LodePNGColorProfile renamed to - LodePNGColorStats. -*) 30 dec 2018: code style changes only: removed newlines before opening braces. -*) 10 sep 2018: added way to inspect metadata chunks without full decoding. -*) 19 aug 2018: (!) fixed color mode bKGD is encoded with and made it use - palette index in case of palette. -*) 10 aug 2018: (!) added support for gAMA, cHRM, sRGB and iCCP chunks. This - change is backwards compatible unless you relied on unknown_chunks for those. -*) 11 jun 2018: less restrictive check for pixel size integer overflow -*) 14 jan 2018: allow optionally ignoring a few more recoverable errors -*) 17 sep 2017: fix memory leak for some encoder input error cases -*) 27 nov 2016: grey+alpha auto color model detection bugfix -*) 18 apr 2016: Changed qsort to custom stable sort (for platforms w/o qsort). -*) 09 apr 2016: Fixed colorkey usage detection, and better file loading (within - the limits of pure C90). -*) 08 dec 2015: Made load_file function return error if file can't be opened. -*) 24 okt 2015: Bugfix with decoding to palette output. -*) 18 apr 2015: Boundary PM instead of just package-merge for faster encoding. -*) 24 aug 2014: Moved to github -*) 23 aug 2014: Reduced needless memory usage of decoder. -*) 28 jun 2014: Removed fix_png setting, always support palette OOB for - simplicity. Made ColorProfile public. -*) 09 jun 2014: Faster encoder by fixing hash bug and more zeros optimization. -*) 22 dec 2013: Power of two windowsize required for optimization. -*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. -*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). -*) 11 mar 2013: (!) Bugfix with custom free. Changed from "my" to "lodepng_" - prefix for the custom allocators and made it possible with a new #define to - use custom ones in your project without needing to change lodepng's code. -*) 28 jan 2013: Bugfix with color key. -*) 27 okt 2012: Tweaks in text chunk keyword length error handling. -*) 8 okt 2012: (!) Added new filter strategy (entropy) and new auto color mode. - (no palette). Better deflate tree encoding. New compression tweak settings. - Faster color conversions while decoding. Some internal cleanups. -*) 23 sep 2012: Reduced warnings in Visual Studio a little bit. -*) 1 sep 2012: (!) Removed #define's for giving custom (de)compression functions - and made it work with function pointers instead. -*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc - and free functions and toggle #defines from compiler flags. Small fixes. -*) 6 may 2012: (!) Made plugging in custom zlib/deflate functions more flexible. -*) 22 apr 2012: (!) Made interface more consistent, renaming a lot. Removed - redundant C++ codec classes. Reduced amount of structs. Everything changed, - but it is cleaner now imho and functionality remains the same. Also fixed - several bugs and shrunk the implementation code. Made new samples. -*) 6 nov 2011: (!) By default, the encoder now automatically chooses the best - PNG color model and bit depth, based on the amount and type of colors of the - raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. -*) 9 okt 2011: simpler hash chain implementation for the encoder. -*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. -*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. - A bug with the PNG filtertype heuristic was fixed, so that it chooses much - better ones (it's quite significant). A setting to do an experimental, slow, - brute force search for PNG filter types is added. -*) 17 aug 2011: (!) changed some C zlib related function names. -*) 16 aug 2011: made the code less wide (max 120 characters per line). -*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. -*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. -*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman - to optimize long sequences of zeros. -*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and - LodePNG_InfoColor_canHaveAlpha functions for convenience. -*) 7 nov 2010: added LodePNG_error_text function to get error code description. -*) 30 okt 2010: made decoding slightly faster -*) 26 okt 2010: (!) changed some C function and struct names (more consistent). - Reorganized the documentation and the declaration order in the header. -*) 08 aug 2010: only changed some comments and external samples. -*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. -*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. -*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could - read by ignoring the problem but windows apps couldn't. -*) 06 jun 2008: added more error checks for out of memory cases. -*) 26 apr 2008: added a few more checks here and there to ensure more safety. -*) 06 mar 2008: crash with encoding of strings fixed -*) 02 feb 2008: support for international text chunks added (iTXt) -*) 23 jan 2008: small cleanups, and #defines to divide code in sections -*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. -*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. -*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added - Also various fixes, such as in the deflate and the padding bits code. -*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved - filtering code of encoder. -*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A - C++ wrapper around this provides an interface almost identical to before. - Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code - are together in these files but it works both for C and C++ compilers. -*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks -*) 30 aug 2007: bug fixed which makes this Borland C++ compatible -*) 09 aug 2007: some VS2005 warnings removed again -*) 21 jul 2007: deflate code placed in new namespace separate from zlib code -*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images -*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing - invalid std::vector element [0] fixed, and level 3 and 4 warnings removed -*) 02 jun 2007: made the encoder add a tag with version by default -*) 27 may 2007: zlib and png code separated (but still in the same file), - simple encoder/decoder functions added for more simple usage cases -*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), - moved some examples from here to lodepng_examples.cpp -*) 12 may 2007: palette decoding bug fixed -*) 24 apr 2007: changed the license from BSD to the zlib license -*) 11 mar 2007: very simple addition: ability to encode bKGD chunks. -*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding - palettized PNG images. Plus little interface change with palette and texts. -*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. - Fixed a bug where the end code of a block had length 0 in the Huffman tree. -*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented - and supported by the encoder, resulting in smaller PNGs at the output. -*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. -*) 24 jan 2007: gave encoder an error interface. Added color conversion from any - greyscale type to 8-bit greyscale with or without alpha. -*) 21 jan 2007: (!) Totally changed the interface. It allows more color types - to convert to and is more uniform. See the manual for how it works now. -*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: - encode/decode custom tEXt chunks, separate classes for zlib & deflate, and - at last made the decoder give errors for incorrect Adler32 or Crc. -*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. -*) 29 dec 2006: Added support for encoding images without alpha channel, and - cleaned out code as well as making certain parts faster. -*) 28 dec 2006: Added "Settings" to the encoder. -*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. - Removed some code duplication in the decoder. Fixed little bug in an example. -*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. - Fixed a bug of the decoder with 16-bit per color. -*) 15 okt 2006: Changed documentation structure -*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the - given image buffer, however for now it's not compressed. -*) 08 sep 2006: (!) Changed to interface with a Decoder class -*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different - way. Renamed decodePNG to decodePNGGeneric. -*) 29 jul 2006: (!) Changed the interface: image info is now returned as a - struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. -*) 28 jul 2006: Cleaned the code and added new error checks. - Corrected terminology "deflate" into "inflate". -*) 23 jun 2006: Added SDL example in the documentation in the header, this - example allows easy debugging by displaying the PNG and its transparency. -*) 22 jun 2006: (!) Changed way to obtain error value. Added - loadFile function for convenience. Made decodePNG32 faster. -*) 21 jun 2006: (!) Changed type of info vector to unsigned. - Changed position of palette in info vector. Fixed an important bug that - happened on PNGs with an uncompressed block. -*) 16 jun 2006: Internally changed unsigned into unsigned where - needed, and performed some optimizations. -*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them - in LodePNG namespace. Changed the order of the parameters. Rewrote the - documentation in the header. Renamed files to lodepng.cpp and lodepng.h -*) 22 apr 2006: Optimized and improved some code -*) 07 sep 2005: (!) Changed to std::vector interface -*) 12 aug 2005: Initial release (C++, decoder only) - - -13. contact information ------------------------ - -Feel free to contact me with suggestions, problems, comments, ... concerning -LodePNG. If you encounter a PNG image that doesn't work properly with this -decoder, feel free to send it and I'll use it to find and fix the problem. - -My email address is (puzzle the account and domain together with an @ symbol): -Domain: gmail dot com. -Account: lode dot vandevenne. - - -Copyright (c) 2005-2020 Lode Vandevenne -*/ diff --git a/vendor/librw/src/matfx.cpp b/vendor/librw/src/matfx.cpp deleted file mode 100644 index f86b9a7..0000000 --- a/vendor/librw/src/matfx.cpp +++ /dev/null @@ -1,637 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" -#include "rwanim.h" -#include "rwplugins.h" -#include "ps2/rwps2.h" -#include "ps2/rwps2plg.h" -#include "d3d/rwxbox.h" -#include "d3d/rwd3d8.h" -#include "d3d/rwd3d9.h" -#include "gl/rwwdgl.h" -#include "gl/rwgl3.h" -#include "gl/rwgl3plg.h" - -#define PLUGIN_ID ID_MATFX - -namespace rw { - -bool32 MatFX::modulateEnvMap; - -// Atomic - -static void* -createAtomicMatFX(void *object, int32 offset, int32) -{ - *PLUGINOFFSET(int32, object, offset) = 0; - return object; -} - -static void* -copyAtomicMatFX(void *dst, void *src, int32 offset, int32) -{ - // don't call seteffects, it will override the pipeline - if(*PLUGINOFFSET(int32, src, offset)) - *PLUGINOFFSET(int32, dst, offset) = 1; - return dst; -} - -static Stream* -readAtomicMatFX(Stream *stream, int32, void *object, int32, int32) -{ - if(stream->readI32()) - MatFX::enableEffects((Atomic*)object); - return stream; -} - -static Stream* -writeAtomicMatFX(Stream *stream, int32, void *object, int32 offset, int32) -{ - stream->writeI32(*PLUGINOFFSET(int32, object, offset)); - return stream; -} - -static int32 -getSizeAtomicMatFX(void *object, int32 offset, int32) -{ - int32 flag = *PLUGINOFFSET(int32, object, offset); - // TODO: not sure which version - return flag || rw::version < 0x34000 ? 4 : 0; -} - -// Material - -MatFXGlobals matFXGlobals = { 0, 0, { nil }, nil }; - -// TODO: Frames and Matrices? -static void -clearMatFX(MatFX *matfx) -{ - for(int i = 0; i < 2; i++) - switch(matfx->fx[i].type){ - case MatFX::BUMPMAP: - if(matfx->fx[i].bump.bumpedTex) - matfx->fx[i].bump.bumpedTex->destroy(); - if(matfx->fx[i].bump.tex) - matfx->fx[i].bump.tex->destroy(); - break; - - case MatFX::ENVMAP: - if(matfx->fx[i].env.tex) - matfx->fx[i].env.tex->destroy(); - break; - - case MatFX::DUAL: - if(matfx->fx[i].dual.tex) - matfx->fx[i].dual.tex->destroy(); - break; - } - memset(matfx, 0, sizeof(MatFX)); -} - -void -MatFX::setEffects(Material *mat, uint32 type) -{ - MatFX *matfx; - - matfx = MatFX::get(mat); - if(matfx == nil){ - matfx = rwNewT(MatFX, 1, MEMDUR_EVENT | ID_MATFX); - memset(matfx, 0, sizeof(MatFX)); - *PLUGINOFFSET(MatFX*, mat, matFXGlobals.materialOffset) = matfx; - } - - if(matfx->type != 0 && matfx->type != type) - clearMatFX(matfx); - matfx->type = type; - switch(type){ - case BUMPMAP: - case ENVMAP: - case DUAL: - case UVTRANSFORM: - matfx->fx[0].type = type; - matfx->fx[1].type = NOTHING; - break; - - case BUMPENVMAP: - matfx->fx[0].type = BUMPMAP; - matfx->fx[1].type = ENVMAP; - break; - - case DUALUVTRANSFORM: - matfx->fx[0].type = UVTRANSFORM; - matfx->fx[1].type = DUAL; - break; - } -} - -uint32 -MatFX::getEffects(const Material *m) -{ - MatFX *fx = *PLUGINOFFSET(MatFX*, m, matFXGlobals.materialOffset); - if(fx) - return fx->type; - return 0; -} - -MatFX* -MatFX::get(const Material *m) -{ - return *PLUGINOFFSET(MatFX*, m, matFXGlobals.materialOffset); -} - -int32 -MatFX::getEffectIndex(uint32 type) -{ - for(int i = 0; i < 2; i++) - if(this->fx[i].type == type) - return i; - return -1; -} - -void -MatFX::setBumpTexture(Texture *t) -{ - int32 i = this->getEffectIndex(BUMPMAP); - if(i >= 0){ - if(this->fx[i].bump.tex) - this->fx[i].bump.tex->destroy(); - this->fx[i].bump.tex = t; - if(t) - t->addRef(); - } -} - -void -MatFX::setBumpCoefficient(float32 coef) -{ - int32 i = this->getEffectIndex(BUMPMAP); - if(i >= 0) - this->fx[i].bump.coefficient = coef; -} - -Texture* -MatFX::getBumpTexture(void) -{ - int32 i = this->getEffectIndex(BUMPMAP); - if(i >= 0) - return this->fx[i].bump.tex; - return nil; -} - -float32 -MatFX::getBumpCoefficient(void) -{ - int32 i = this->getEffectIndex(BUMPMAP); - if(i >= 0) - return this->fx[i].bump.coefficient; - return 0.0f; -} - -void -MatFX::setEnvTexture(Texture *t) -{ - int32 i = this->getEffectIndex(ENVMAP); - if(i >= 0){ - if(this->fx[i].env.tex) - this->fx[i].env.tex->destroy(); - this->fx[i].env.tex = t; - if(t) - t->addRef(); - } -} - -void -MatFX::setEnvFrame(Frame *f) -{ - int32 i = this->getEffectIndex(ENVMAP); - if(i >= 0) - this->fx[i].env.frame = f; -} - -void -MatFX::setEnvCoefficient(float32 coef) -{ - int32 i = this->getEffectIndex(ENVMAP); - if(i >= 0) - this->fx[i].env.coefficient = coef; -} - -void -MatFX::setEnvFBAlpha(bool32 useFBAlpha) -{ - int32 i = this->getEffectIndex(ENVMAP); - if(i >= 0) - this->fx[i].env.fbAlpha = useFBAlpha; -} - -Texture* -MatFX::getEnvTexture(void) -{ - int32 i = this->getEffectIndex(ENVMAP); - if(i >= 0) - return this->fx[i].env.tex; - return nil; -} - -Frame* -MatFX::getEnvFrame(void) -{ - int32 i = this->getEffectIndex(ENVMAP); - if(i >= 0) - return this->fx[i].env.frame; - return nil; -} - -float32 -MatFX::getEnvCoefficient(void) -{ - int32 i = this->getEffectIndex(ENVMAP); - if(i >= 0) - return this->fx[i].env.coefficient; - return 0.0f; -} - -bool32 -MatFX::getEnvFBAlpha(void) -{ - int32 i = this->getEffectIndex(ENVMAP); - if(i >= 0) - return this->fx[i].env.fbAlpha; - return 0; -} - - -void -MatFX::setDualTexture(Texture *t) -{ - int32 i = this->getEffectIndex(DUAL); - if(i >= 0){ - if(this->fx[i].dual.tex) - this->fx[i].dual.tex->destroy(); - this->fx[i].dual.tex = t; - if(t) - t->addRef(); - } -} - -void -MatFX::setDualSrcBlend(int32 blend) -{ - int32 i = this->getEffectIndex(DUAL); - if(i >= 0) - this->fx[i].dual.srcBlend = blend; -} - -void -MatFX::setDualDestBlend(int32 blend) -{ - int32 i = this->getEffectIndex(DUAL); - if(i >= 0) - this->fx[i].dual.dstBlend = blend; -} - -Texture* -MatFX::getDualTexture(void) -{ - int32 i = this->getEffectIndex(DUAL); - if(i >= 0) - return this->fx[i].dual.tex; - return nil; -} - -int32 -MatFX::getDualSrcBlend(void) -{ - int32 i = this->getEffectIndex(DUAL); - if(i >= 0) - return this->fx[i].dual.srcBlend; - return 0; -} - -int32 -MatFX::getDualDestBlend(void) -{ - int32 i = this->getEffectIndex(DUAL); - if(i >= 0) - return this->fx[i].dual.dstBlend; - return 0; -} - -void -MatFX::setUVTransformMatrices(Matrix *base, Matrix *dual) -{ - int32 i = this->getEffectIndex(UVTRANSFORM); - if(i >= 0){ - this->fx[i].uvtransform.baseTransform = base; - this->fx[i].uvtransform.dualTransform = dual; - } -} - -void -MatFX::getUVTransformMatrices(Matrix **base, Matrix **dual) -{ - int32 i = this->getEffectIndex(UVTRANSFORM); - if(i >= 0){ - if(base) *base = this->fx[i].uvtransform.baseTransform; - if(dual) *dual = this->fx[i].uvtransform.dualTransform; - return; - } - if(base) *base = nil; - if(dual) *dual = nil; -} - -static void* -createMaterialMatFX(void *object, int32 offset, int32) -{ - *PLUGINOFFSET(MatFX*, object, offset) = nil; - return object; -} - -static void* -destroyMaterialMatFX(void *object, int32 offset, int32) -{ - MatFX *matfx = *PLUGINOFFSET(MatFX*, object, offset); - if(matfx){ - clearMatFX(matfx); - rwFree(matfx); - } - return object; -} - -static void* -copyMaterialMatFX(void *dst, void *src, int32 offset, int32) -{ - MatFX *srcfx = *PLUGINOFFSET(MatFX*, src, offset); - if(srcfx == nil) - return dst; - MatFX *dstfx = rwNewT(MatFX, 1, MEMDUR_EVENT | ID_MATFX); - *PLUGINOFFSET(MatFX*, dst, offset) = dstfx; - memcpy(dstfx, srcfx, sizeof(MatFX)); - for(int i = 0; i < 2; i++) - switch(dstfx->fx[i].type){ - case MatFX::BUMPMAP: - if(dstfx->fx[i].bump.bumpedTex) - dstfx->fx[i].bump.bumpedTex->addRef(); - if(dstfx->fx[i].bump.tex) - dstfx->fx[i].bump.tex->addRef(); - break; - - case MatFX::ENVMAP: - if(dstfx->fx[i].env.tex) - dstfx->fx[i].env.tex->addRef(); - break; - - case MatFX::DUAL: - if(dstfx->fx[i].dual.tex) - dstfx->fx[i].dual.tex->addRef(); - break; - } - return dst; -} - -static Stream* -readMaterialMatFX(Stream *stream, int32, void *object, int32 offset, int32) -{ - Material *mat; - MatFX *matfx; - Texture *tex, *bumpedTex; - float coefficient; - int32 fbAlpha; - int32 srcBlend, dstBlend; - int32 idx; - - mat = (Material*)object; - MatFX::setEffects(mat, stream->readU32()); - matfx = MatFX::get(mat); - - for(int i = 0; i < 2; i++){ - uint32 type = stream->readU32(); - switch(type){ - case MatFX::BUMPMAP: - coefficient = stream->readF32(); - bumpedTex = tex = nil; - if(stream->readI32()){ - if(!findChunk(stream, ID_TEXTURE, - nil, nil)){ - RWERROR((ERR_CHUNK, "TEXTURE")); - return nil; - } - bumpedTex = Texture::streamRead(stream); - } - if(stream->readI32()){ - if(!findChunk(stream, ID_TEXTURE, - nil, nil)){ - RWERROR((ERR_CHUNK, "TEXTURE")); - return nil; - } - tex = Texture::streamRead(stream); - } - idx = matfx->getEffectIndex(type); - assert(idx >= 0); - matfx->fx[idx].bump.bumpedTex = bumpedTex; - matfx->fx[idx].bump.tex = tex; - matfx->fx[idx].bump.coefficient = coefficient; - break; - - case MatFX::ENVMAP: - coefficient = stream->readF32(); - fbAlpha = stream->readI32(); - tex = nil; - if(stream->readI32()){ - if(!findChunk(stream, ID_TEXTURE, - nil, nil)){ - RWERROR((ERR_CHUNK, "TEXTURE")); - return nil; - } - tex = Texture::streamRead(stream); - } - idx = matfx->getEffectIndex(type); - assert(idx >= 0); - matfx->fx[idx].env.tex = tex; - matfx->fx[idx].env.fbAlpha = fbAlpha; - matfx->fx[idx].env.coefficient = coefficient; - break; - - case MatFX::DUAL: - srcBlend = stream->readI32(); - dstBlend = stream->readI32(); - tex = nil; - if(stream->readI32()){ - if(!findChunk(stream, ID_TEXTURE, - nil, nil)){ - RWERROR((ERR_CHUNK, "TEXTURE")); - return nil; - } - tex = Texture::streamRead(stream); - } - idx = matfx->getEffectIndex(type); - assert(idx >= 0); - matfx->fx[idx].dual.tex = tex; - matfx->fx[idx].dual.srcBlend = srcBlend; - matfx->fx[idx].dual.dstBlend = dstBlend; - break; - } - } - return stream; -} - -static Stream* -writeMaterialMatFX(Stream *stream, int32, void *object, int32 offset, int32) -{ - MatFX *matfx = *PLUGINOFFSET(MatFX*, object, offset); - - stream->writeU32(matfx->type); - for(int i = 0; i < 2; i++){ - stream->writeU32(matfx->fx[i].type); - switch(matfx->fx[i].type){ - case MatFX::BUMPMAP: - stream->writeF32(matfx->fx[i].bump.coefficient); - stream->writeI32(matfx->fx[i].bump.bumpedTex != nil); - if(matfx->fx[i].bump.bumpedTex) - matfx->fx[i].bump.bumpedTex->streamWrite(stream); - stream->writeI32(matfx->fx[i].bump.tex != nil); - if(matfx->fx[i].bump.tex) - matfx->fx[i].bump.tex->streamWrite(stream); - break; - - case MatFX::ENVMAP: - stream->writeF32(matfx->fx[i].env.coefficient); - stream->writeI32(matfx->fx[i].env.fbAlpha); - stream->writeI32(matfx->fx[i].env.tex != nil); - if(matfx->fx[i].env.tex) - matfx->fx[i].env.tex->streamWrite(stream); - break; - - case MatFX::DUAL: - stream->writeI32(matfx->fx[i].dual.srcBlend); - stream->writeI32(matfx->fx[i].dual.dstBlend); - stream->writeI32(matfx->fx[i].dual.tex != nil); - if(matfx->fx[i].dual.tex) - matfx->fx[i].dual.tex->streamWrite(stream); - break; - } - } - return stream; -} - -static int32 -getSizeMaterialMatFX(void *object, int32 offset, int32) -{ - MatFX *matfx = *PLUGINOFFSET(MatFX*, object, offset); - if(matfx == nil) - return -1; - int32 size = 4 + 4 + 4; - - for(int i = 0; i < 2; i++){ - switch(matfx->fx[i].type){ - case MatFX::BUMPMAP: - size += 4 + 4 + 4; - if(matfx->fx[i].bump.bumpedTex) - size += 12 + - matfx->fx[i].bump.bumpedTex->streamGetSize(); - if(matfx->fx[i].bump.tex) - size += 12 + - matfx->fx[i].bump.tex->streamGetSize(); - break; - - case MatFX::ENVMAP: - size += 4 + 4 + 4; - if(matfx->fx[i].env.tex) - size += 12 + - matfx->fx[i].env.tex->streamGetSize(); - break; - - case MatFX::DUAL: - size += 4 + 4 + 4; - if(matfx->fx[i].dual.tex) - size += 12 + - matfx->fx[i].dual.tex->streamGetSize(); - break; - } - } - return size; -} - -void -MatFX::enableEffects(Atomic *atomic) -{ - *PLUGINOFFSET(int32, atomic, matFXGlobals.atomicOffset) = 1; - atomic->pipeline = matFXGlobals.pipelines[rw::platform]; -} - -// This prevents setting the pipeline on clone -void -MatFX::disableEffects(Atomic *atomic) -{ - *PLUGINOFFSET(int32, atomic, matFXGlobals.atomicOffset) = 0; -} - -bool32 -MatFX::getEffects(Atomic *atomic) -{ - return *PLUGINOFFSET(int32, atomic, matFXGlobals.atomicOffset); -} - -static void* -matfxOpen(void *o, int32, int32) -{ - // init dummy pipelines - matFXGlobals.dummypipe = ObjPipeline::create(); - matFXGlobals.dummypipe->pluginID = 0; //ID_MATFX; - matFXGlobals.dummypipe->pluginData = 0; - for(uint i = 0; i < nelem(matFXGlobals.pipelines); i++) - matFXGlobals.pipelines[i] = matFXGlobals.dummypipe; - return o; -} - -static void* -matfxClose(void *o, int32, int32) -{ - for(uint i = 0; i < nelem(matFXGlobals.pipelines); i++) - if(matFXGlobals.pipelines[i] == matFXGlobals.dummypipe) - matFXGlobals.pipelines[i] = nil; - matFXGlobals.dummypipe->destroy(); - matFXGlobals.dummypipe = nil; - return o; -} - -void -registerMatFXPlugin(void) -{ - Driver::registerPlugin(PLATFORM_NULL, 0, ID_MATFX, - matfxOpen, matfxClose); - ps2::initMatFX(); - xbox::initMatFX(); - d3d8::initMatFX(); - d3d9::initMatFX(); - wdgl::initMatFX(); - gl3::initMatFX(); - - matFXGlobals.atomicOffset = - Atomic::registerPlugin(sizeof(int32), ID_MATFX, - createAtomicMatFX, nil, copyAtomicMatFX); - Atomic::registerPluginStream(ID_MATFX, - readAtomicMatFX, - writeAtomicMatFX, - getSizeAtomicMatFX); - - matFXGlobals.materialOffset = - Material::registerPlugin(sizeof(MatFX*), ID_MATFX, - createMaterialMatFX, destroyMaterialMatFX, - copyMaterialMatFX); - Material::registerPluginStream(ID_MATFX, - readMaterialMatFX, - writeMaterialMatFX, - getSizeMaterialMatFX); -} - -} diff --git a/vendor/librw/src/pipeline.cpp b/vendor/librw/src/pipeline.cpp deleted file mode 100644 index 6284f68..0000000 --- a/vendor/librw/src/pipeline.cpp +++ /dev/null @@ -1,198 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -#define COLOR_ARGB(a,r,g,b) \ - ((uint32)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff))) - -namespace rw { - -static void nothing(ObjPipeline *, Atomic*) {} - -void -ObjPipeline::init(uint32 platform) -{ - Pipeline::init(platform); - this->impl.instance = nothing; - this->impl.uninstance = nothing; - this->impl.render = nothing; -} - -ObjPipeline* -ObjPipeline::create(void) -{ - ObjPipeline *pipe = rwNewT(ObjPipeline, 1, MEMDUR_GLOBAL); - pipe->init(PLATFORM_NULL); - return pipe; -} - -void -ObjPipeline::destroy(void) -{ - rwFree(this); -} - -// helper functions - -void -findMinVertAndNumVertices(uint16 *indices, uint32 numIndices, uint32 *minVert, int32 *numVertices) -{ - uint32 min = 0xFFFFFFFF; - uint32 max = 0; - while(numIndices--){ - if(*indices < min) - min = *indices; - if(*indices > max) - max = *indices; - indices++; - } - uint32 num = max - min + 1; - // if mesh is empty, this can happen - if(min > max){ - min = 0; - num = 0; - } - if(minVert) - *minVert = min; - if(numVertices) - *numVertices = num; -} - -void -instV4d(int type, uint8 *dst, V4d *src, uint32 numVertices, uint32 stride) -{ - if(type == VERT_FLOAT4) - for(uint32 i = 0; i < numVertices; i++){ - memcpy(dst, src, 16); - dst += stride; - src++; - } - else - assert(0 && "unsupported instV4d type"); -} - -void -instV3d(int type, uint8 *dst, V3d *src, uint32 numVertices, uint32 stride) -{ - if(type == VERT_FLOAT3) - for(uint32 i = 0; i < numVertices; i++){ - memcpy(dst, src, 12); - dst += stride; - src++; - } - else if(type == VERT_COMPNORM) - for(uint32 i = 0; i < numVertices; i++){ - uint32 n = ((((uint32)(src->z * 511.0f)) & 0x3ff) << 22) | - ((((uint32)(src->y * 1023.0f)) & 0x7ff) << 11) | - ((((uint32)(src->x * 1023.0f)) & 0x7ff) << 0); - *(uint32*)dst = n; - dst += stride; - src++; - } - else - assert(0 && "unsupported instV3d type"); -} - -void -uninstV3d(int type, V3d *dst, uint8 *src, uint32 numVertices, uint32 stride) -{ - if(type == VERT_FLOAT3) - for(uint32 i = 0; i < numVertices; i++){ - memcpy(dst, src, 12); - src += stride; - dst++; - } - else if(type == VERT_COMPNORM) - for(uint32 i = 0; i < numVertices; i++){ - uint32 n = *(uint32*)src; - int32 normal[3]; - normal[0] = n & 0x7FF; - normal[1] = (n >> 11) & 0x7FF; - normal[2] = (n >> 22) & 0x3FF; - // sign extend - if(normal[0] & 0x400) normal[0] |= ~0x7FF; - if(normal[1] & 0x400) normal[1] |= ~0x7FF; - if(normal[2] & 0x200) normal[2] |= ~0x3FF; - dst->x = normal[0] / 1023.0f; - dst->y = normal[1] / 1023.0f; - dst->z = normal[2] / 511.0f; - src += stride; - dst++; - } - else - assert(0 && "unsupported uninstV3d type"); -} - -void -instTexCoords(int type, uint8 *dst, TexCoords *src, uint32 numVertices, uint32 stride) -{ - assert(type == VERT_FLOAT2); - for(uint32 i = 0; i < numVertices; i++){ - memcpy(dst, src, 8); - dst += stride; - src++; - } -} - -void -uninstTexCoords(int type, TexCoords *dst, uint8 *src, uint32 numVertices, uint32 stride) -{ - assert(type == VERT_FLOAT2); - for(uint32 i = 0; i < numVertices; i++){ - memcpy(dst, src, 8); - src += stride; - dst++; - } -} - -bool32 -instColor(int type, uint8 *dst, RGBA *src, uint32 numVertices, uint32 stride) -{ - uint8 alpha = 0xFF; - if(type == VERT_ARGB){ - for(uint32 i = 0; i < numVertices; i++){ - dst[0] = src->blue; - dst[1] = src->green; - dst[2] = src->red; - dst[3] = src->alpha; - alpha &= src->alpha; - dst += stride; - src++; - } - }else if(type == VERT_RGBA){ - for(uint32 i = 0; i < numVertices; i++){ - dst[0] = src->red; - dst[1] = src->green; - dst[2] = src->blue; - dst[3] = src->alpha; - alpha &= src->alpha; - dst += stride; - src++; - } - }else - assert(0 && "unsupported color type"); - return alpha != 0xFF; -} - -void -uninstColor(int type, RGBA *dst, uint8 *src, uint32 numVertices, uint32 stride) -{ - assert(type == VERT_ARGB); - for(uint32 i = 0; i < numVertices; i++){ - dst->red = src[2]; - dst->green = src[1]; - dst->blue = src[0]; - dst->alpha = src[3]; - src += stride; - dst++; - } -} - -} diff --git a/vendor/librw/src/plg.cpp b/vendor/librw/src/plg.cpp deleted file mode 100644 index c5c3782..0000000 --- a/vendor/librw/src/plg.cpp +++ /dev/null @@ -1,246 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -namespace rw { - -static void *defCtor(void *object, int32, int32) { return object; } -static void *defDtor(void *object, int32, int32) { return object; } -static void *defCopy(void *dst, void*, int32, int32) { return dst; } - -static LinkList allPlugins; - -#define PLG(lnk) LLLinkGetData(lnk, Plugin, inParentList) - -void -PluginList::open(void) -{ - allPlugins.init(); -} - -void -PluginList::close(void) -{ - PluginList *l; - Plugin *p; - FORLIST(lnk, allPlugins){ - p = LLLinkGetData(lnk, Plugin, inGlobalList); - l = p->parentList; - p->inParentList.remove(); - p->inGlobalList.remove(); - rwFree(p); - if(l->plugins.isEmpty()) - l->size = l->defaultSize; - } - assert(allPlugins.isEmpty()); -} - -void -PluginList::construct(void *object) -{ - FORLIST(lnk, this->plugins){ - Plugin *p = PLG(lnk); - p->constructor(object, p->offset, p->size); - } -} - -void -PluginList::destruct(void *object) -{ - FORLIST(lnk, this->plugins){ - Plugin *p = PLG(lnk); - p->destructor(object, p->offset, p->size); - } -} - -void -PluginList::copy(void *dst, void *src) -{ - FORLIST(lnk, this->plugins){ - Plugin *p = PLG(lnk); - p->copy(dst, src, p->offset, p->size); - } -} - -bool -PluginList::streamRead(Stream *stream, void *object) -{ - int32 length; - ChunkHeaderInfo header; - if(!findChunk(stream, ID_EXTENSION, (uint32*)&length, nil)) - return false; - while(length > 0){ - if(!readChunkHeaderInfo(stream, &header)) - return false; - length -= 12; - FORLIST(lnk, this->plugins){ - Plugin *p = PLG(lnk); - if(p->id == header.type && p->read){ - p->read(stream, header.length, - object, p->offset, p->size); - goto cont; - } - } - stream->seek(header.length); -cont: - length -= header.length; - } - - // now the always callbacks - FORLIST(lnk, this->plugins){ - Plugin *p = PLG(lnk); - if(p->alwaysCallback) - p->alwaysCallback(object, p->offset, p->size); - } - return true; -} - -void -PluginList::streamWrite(Stream *stream, void *object) -{ - int size = this->streamGetSize(object); - writeChunkHeader(stream, ID_EXTENSION, size); - FORLIST(lnk, this->plugins){ - Plugin *p = PLG(lnk); - if(p->getSize == nil || - (size = p->getSize(object, p->offset, p->size)) <= 0) - continue; - writeChunkHeader(stream, p->id, size); - p->write(stream, size, object, p->offset, p->size); - } -} - -int -PluginList::streamGetSize(void *object) -{ - int32 size = 0; - int32 plgsize; - FORLIST(lnk, this->plugins){ - Plugin *p = PLG(lnk); - if(p->getSize && - (plgsize = p->getSize(object, p->offset, p->size)) > 0) - size += 12 + plgsize; - } - return size; -} - -void -PluginList::streamSkip(Stream *stream) -{ - int32 length; - ChunkHeaderInfo header; - if(!findChunk(stream, ID_EXTENSION, (uint32*)&length, nil)) - return; - while(length > 0){ - if(!readChunkHeaderInfo(stream, &header)) - return; - stream->seek(header.length); - length -= 12 + header.length; - } -} - -void -PluginList::assertRights(void *object, uint32 pluginID, uint32 data) -{ - FORLIST(lnk, this->plugins){ - Plugin *p = PLG(lnk); - if(p->id == pluginID){ - if(p->rightsCallback) - p->rightsCallback(object, - p->offset, p->size, data); - return; - } - } -} - - -int32 -PluginList::registerPlugin(int32 size, uint32 id, - Constructor ctor, Destructor dtor, CopyConstructor copy) -{ - Plugin *p = (Plugin*)rwMalloc(sizeof(Plugin), MEMDUR_GLOBAL); - p->offset = this->size; - this->size += size; - int32 round = sizeof(void*)-1; - this->size = (this->size + round)&~round; - - p->size = size; - p->id = id; - p->constructor = ctor ? ctor : defCtor; - p->destructor = dtor ? dtor : defDtor; - p->copy = copy ? copy : defCopy; - p->read = nil; - p->write = nil; - p->getSize = nil; - p->rightsCallback = nil; - p->alwaysCallback = nil; - p->parentList = this; - this->plugins.add(&p->inParentList); - allPlugins.add(&p->inGlobalList); - return p->offset; -} - -int32 -PluginList::registerStream(uint32 id, - StreamRead read, StreamWrite write, StreamGetSize getSize) -{ - FORLIST(lnk, this->plugins){ - Plugin *p = PLG(lnk); - if(p->id == id){ - p->read = read; - p->write = write; - p->getSize = getSize; - return p->offset; - } - } - return -1; -} - -int32 -PluginList::setStreamRightsCallback(uint32 id, RightsCallback cb) -{ - FORLIST(lnk, this->plugins){ - Plugin *p = PLG(lnk); - if(p->id == id){ - p->rightsCallback = cb; - return p->offset; - } - } - return -1; -} - -int32 -PluginList::setStreamAlwaysCallback(uint32 id, AlwaysCallback cb) -{ - FORLIST(lnk, this->plugins){ - Plugin *p = PLG(lnk); - if(p->id == id){ - p->alwaysCallback = cb; - return p->offset; - } - } - return -1; -} - -int32 -PluginList::getPluginOffset(uint32 id) -{ - FORLIST(lnk, this->plugins){ - Plugin *p = PLG(lnk); - if(p->id == id) - return p->offset; - } - return -1; -} - -} diff --git a/vendor/librw/src/png.cpp b/vendor/librw/src/png.cpp deleted file mode 100644 index 45aa102..0000000 --- a/vendor/librw/src/png.cpp +++ /dev/null @@ -1,151 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -#include "lodepng/lodepng.h" - -#define PLUGIN_ID 0 - -namespace rw { - - -Image* -readPNG(const char *filename) -{ - Image *image = nil; - uint32 length; - uint8 *data = getFileContents(filename, &length); - assert(data != nil); - - LodePNGState state; - lodepng_state_init(&state); - uint8 *raw = nil; - uint32 w, h; - - // First try: decode without conversion to see if we understand the format - state.decoder.color_convert = 0; - uint32 error = lodepng_decode(&raw, &w, &h, &state, data, length); - if(error){ - RWERROR((ERR_GENERAL, lodepng_error_text(error))); - return nil; - } - - if(state.info_raw.bitdepth == 4 && state.info_raw.colortype == LCT_PALETTE){ - image = Image::create(w, h, 4); - image->allocate(); - memcpy(image->palette, state.info_raw.palette, state.info_raw.palettesize*4); - expandPal4_BE(image->pixels, image->stride, raw, w/2, w, h); - }else if(state.info_raw.bitdepth == 8){ - switch(state.info_raw.colortype){ - case LCT_PALETTE: - image = Image::create(w, h, state.info_raw.palettesize <= 16 ? 4 : 8); - image->allocate(); - memcpy(image->palette, state.info_raw.palette, state.info_raw.palettesize*4); - memcpy(image->pixels, raw, w*h); - break; - case LCT_RGB: - image = Image::create(w, h, 24); - image->allocate(); - memcpy(image->pixels, raw, w*h*3); - break; - default: - // Second try: just load as 32 bit - free(raw); - lodepng_state_init(&state); - error = lodepng_decode(&raw, &w, &h, &state, data, length); - if(error){ - RWERROR((ERR_GENERAL, lodepng_error_text(error))); - return nil; - } - // fall through - case LCT_RGBA: - image = Image::create(w, h, 32); - image->allocate(); - memcpy(image->pixels, raw, w*h*4); - break; - } - } - - free(raw); // TODO: maybe override lodepng allocator - - return image; -} - -void -writePNG(Image *image, const char *filename) -{ - int32 i; - StreamFile file; - if(!file.open(filename, "wb")){ - RWERROR((ERR_FILE, filename)); - return; - } - - size_t rawsize; - uint8 *raw = nil; - uint8 *pixels; - LodePNGState state; - lodepng_state_init(&state); - - pixels = image->pixels; - switch(image->depth){ - case 4: - state.info_raw.bitdepth = 4; - state.info_raw.colortype = LCT_PALETTE; - state.info_png.color.bitdepth = 4; - state.info_png.color.colortype = LCT_PALETTE; - state.encoder.auto_convert = 0; - for(i = 0; i < (1<depth); i++){ - uint8 *col = &image->palette[i*4]; - lodepng_palette_add(&state.info_png.color, col[0], col[1], col[2], col[3]); - lodepng_palette_add(&state.info_raw, col[0], col[1], col[2], col[3]); - } - pixels = rwNewT(uint8, image->width/2*image->height, ID_IMAGE | MEMDUR_FUNCTION); - compressPal4_BE(pixels, image->width/2, image->pixels, image->width, image->width, image->height); - break; - case 8: - state.info_raw.colortype = LCT_PALETTE; - state.info_png.color.colortype = LCT_PALETTE; - state.encoder.auto_convert = 0; - for(i = 0; i < (1<depth); i++){ - uint8 *col = &image->palette[i*4]; - lodepng_palette_add(&state.info_png.color, col[0], col[1], col[2], col[3]); - lodepng_palette_add(&state.info_raw, col[0], col[1], col[2], col[3]); - } - break; - case 16: - // Don't think we can have 16 bits with PNG - // TODO: don't change original image - image->convertTo32(); - break; - case 24: - state.info_raw.colortype = LCT_RGB; - state.info_png.color.colortype = LCT_RGB; - state.encoder.auto_convert = 0; - break; - case 32: - // already done - break; - } - - uint32 error = lodepng_encode(&raw, &rawsize, pixels, image->width, image->height, &state); - if(error){ - RWERROR((ERR_GENERAL, lodepng_error_text(error))); - return; - } - if(pixels != image->pixels) - rwFree(pixels); - file.write8(raw, rawsize); - file.close(); - free(raw); -} - -} diff --git a/vendor/librw/src/prim.cpp b/vendor/librw/src/prim.cpp deleted file mode 100644 index eb353d9..0000000 --- a/vendor/librw/src/prim.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -#define PLUGIN_ID 0 - -namespace rw { - - -void -BBox::initialize(V3d *point) -{ - this->inf = *point; - this->sup = *point; -} - -void -BBox::addPoint(V3d *point) -{ - if(point->x < this->inf.x) - this->inf.x = point->x; - if(point->y < this->inf.y) - this->inf.y = point->y; - if(point->z < this->inf.z) - this->inf.z = point->z; - if(point->x > this->sup.x) - this->sup.x = point->x; - if(point->y > this->sup.y) - this->sup.y = point->y; - if(point->z > this->sup.z) - this->sup.z = point->z; -} - -void -BBox::calculate(V3d *points, int32 n) -{ - this->inf = points[0]; - this->sup = points[0]; - while(--n){ - points++; - if(points->x < this->inf.x) - this->inf.x = points->x; - if(points->y < this->inf.y) - this->inf.y = points->y; - if(points->z < this->inf.z) - this->inf.z = points->z; - if(points->x > this->sup.x) - this->sup.x = points->x; - if(points->y > this->sup.y) - this->sup.y = points->y; - if(points->z > this->sup.z) - this->sup.z = points->z; - } -} - -bool -BBox::containsPoint(V3d *point) -{ - return point->x >= this->inf.x && point->x <= this->sup.x && - point->y >= this->inf.y && point->y <= this->sup.y && - point->z >= this->inf.z && point->z <= this->sup.z; -} - -} diff --git a/vendor/librw/src/ps2/pds.cpp b/vendor/librw/src/ps2/pds.cpp deleted file mode 100644 index afdc6e8..0000000 --- a/vendor/librw/src/ps2/pds.cpp +++ /dev/null @@ -1,203 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#include "../rwanim.h" -#include "../rwplugins.h" -#include "rwps2.h" -#include "rwps2plg.h" - -namespace rw { -namespace ps2 { - -struct PdsGlobals -{ - Pipeline **pipes; - int32 maxPipes; - int32 numPipes; -}; -static PdsGlobals pdsGlobals; - -Pipeline* -getPDSPipe(uint32 data) -{ - for(int32 i = 0; i < pdsGlobals.numPipes; i++) - if(pdsGlobals.pipes[i]->pluginData == data) - return pdsGlobals.pipes[i]; - return nil; -} - -void -registerPDSPipe(Pipeline *pipe) -{ - if(pdsGlobals.pipes == nil) - pdsGlobals.pipes = rwNewT(Pipeline*, pdsGlobals.maxPipes, MEMDUR_GLOBAL | ID_PDS); - assert(pdsGlobals.numPipes < pdsGlobals.maxPipes); - pdsGlobals.pipes[pdsGlobals.numPipes++] = pipe; -} - -static void -atomicPDSRights(void *object, int32, int32, uint32 data) -{ - Atomic *a = (Atomic*)object; - a->pipeline = (ObjPipeline*)getPDSPipe(data); -// printf("atm pds: %x %x %x\n", data, a->pipeline->pluginID, a->pipeline->pluginData); -} - -static void -materialPDSRights(void *object, int32, int32, uint32 data) -{ - Material *m = (Material*)object; - m->pipeline = (ObjPipeline*)getPDSPipe(data); -// printf("mat pds: %x %x %x\n", data, m->pipeline->pluginID, m->pipeline->pluginData); -} - -static void *pdsOpen(void *object, int32 offset, int32 size) { return object; } -static void* -pdsClose(void *object, int32 offset, int32 size) -{ - // TODO MEMORY: free registered pipelines - rwFree(pdsGlobals.pipes); - return object; -} - -void -registerPDSPlugin(int32 n) -{ - pdsGlobals.maxPipes = n; - pdsGlobals.numPipes = 0; - pdsGlobals.pipes = nil; - Engine::registerPlugin(0, ID_PDS, pdsOpen, pdsClose); - Atomic::registerPlugin(0, ID_PDS, nil, nil, nil); - Atomic::setStreamRightsCallback(ID_PDS, atomicPDSRights); - - Material::registerPlugin(0, ID_PDS, nil, nil, nil); - Material::setStreamRightsCallback(ID_PDS, materialPDSRights); -} - -void -registerPluginPDSPipes(void) -{ - // TODO: how do we destroy them? - - // rwPDS_G3_Skin_GrpMatPipeID - MatPipeline *pipe = MatPipeline::create(); - pipe->pluginID = ID_PDS; - pipe->pluginData = 0x11001; - pipe->attribs[AT_XYZ] = &attribXYZ; - pipe->attribs[AT_UV] = &attribUV; - pipe->attribs[AT_RGBA] = &attribRGBA; - pipe->attribs[AT_NORMAL] = &attribNormal; - pipe->attribs[AT_NORMAL+1] = &attribWeights; - uint32 vertCount = MatPipeline::getVertCount(VU_Lights-0x100, 5, 3, 2); - pipe->setTriBufferSizes(5, vertCount); - pipe->vifOffset = pipe->inputStride*vertCount; - pipe->instanceCB = skinInstanceCB; - pipe->uninstanceCB = genericUninstanceCB; - pipe->preUninstCB = skinPreCB; - pipe->postUninstCB = skinPostCB; - registerPDSPipe(pipe); - - // rwPDS_G3_Skin_GrpAtmPipeID - ObjPipeline *opipe = ObjPipeline::create(); - opipe->pluginID = ID_PDS; - opipe->pluginData = 0x11002; - opipe->groupPipeline = pipe; - registerPDSPipe(opipe); - - // rwPDS_G3_MatfxUV1_GrpMatPipeID - pipe = MatPipeline::create(); - pipe->pluginID = ID_PDS; - pipe->pluginData = 0x1100b; - pipe->attribs[AT_XYZ] = &attribXYZ; - pipe->attribs[AT_UV] = &attribUV; - pipe->attribs[AT_RGBA] = &attribRGBA; - pipe->attribs[AT_NORMAL] = &attribNormal; - vertCount = MatPipeline::getVertCount(0x3C5, 4, 3, 3); - pipe->setTriBufferSizes(4, vertCount); - pipe->vifOffset = pipe->inputStride*vertCount; - pipe->uninstanceCB = genericUninstanceCB; - registerPDSPipe(pipe); - - // rwPDS_G3_MatfxUV1_GrpAtmPipeID - opipe = ObjPipeline::create(); - opipe->pluginID = ID_PDS; - opipe->pluginData = 0x1100d; - opipe->groupPipeline = pipe; - registerPDSPipe(opipe); - - // rwPDS_G3_MatfxUV2_GrpMatPipeID - pipe = MatPipeline::create(); - pipe->pluginID = ID_PDS; - pipe->pluginData = 0x1100c; - pipe->attribs[AT_XYZ] = &attribXYZ; - pipe->attribs[AT_UV] = &attribUV2; - pipe->attribs[AT_RGBA] = &attribRGBA; - pipe->attribs[AT_NORMAL] = &attribNormal; - vertCount = MatPipeline::getVertCount(0x3C5, 4, 3, 3); - pipe->setTriBufferSizes(4, vertCount); - pipe->vifOffset = pipe->inputStride*vertCount; - pipe->uninstanceCB = genericUninstanceCB; - registerPDSPipe(pipe); - - // rwPDS_G3_MatfxUV2_GrpAtmPipeID - opipe = ObjPipeline::create(); - opipe->pluginID = ID_PDS; - opipe->pluginData = 0x1100e; - opipe->groupPipeline = pipe; - registerPDSPipe(opipe); - - // RW World plugin - - // rwPDS_G3x_Generic_AtmPipeID - opipe = ObjPipeline::create(); - opipe->pluginID = ID_PDS; - opipe->pluginData = 0x50001; - registerPDSPipe(opipe); - - // rwPDS_G3x_Skin_AtmPipeID - opipe = ObjPipeline::create(); - opipe->pluginID = ID_PDS; - opipe->pluginData = 0x5000b; - registerPDSPipe(opipe); - - // rwPDS_G3xd_A4D_MatPipeID - pipe = MatPipeline::create(); - pipe->pluginID = ID_PDS; - pipe->pluginData = 0x5002f; - pipe->attribs[0] = &attribXYZW; - pipe->attribs[1] = &attribUV; - pipe->attribs[2] = &attribNormal; - vertCount = 0x50; - pipe->setTriBufferSizes(3, vertCount); - pipe->vifOffset = pipe->inputStride*vertCount; // 0xF0 - pipe->uninstanceCB = genericUninstanceCB; - pipe->preUninstCB = genericPreCB; - registerPDSPipe(pipe); - - // rwPDS_G3xd_A4DSkin_MatPipeID - pipe = MatPipeline::create(); - pipe->pluginID = ID_PDS; - pipe->pluginData = 0x5003e; - pipe->attribs[0] = &attribXYZW; - pipe->attribs[1] = &attribUV; - pipe->attribs[2] = &attribNormal; - pipe->attribs[3] = &attribWeights; - vertCount = 0x30; - pipe->setTriBufferSizes(4, vertCount); // 0xC0 - pipe->vifOffset = pipe->inputStride*vertCount; - pipe->instanceCB = skinInstanceCB; - pipe->uninstanceCB = genericUninstanceCB; - pipe->preUninstCB = genericPreCB; - pipe->postUninstCB = skinPostCB; - registerPDSPipe(pipe); -} - -} -} diff --git a/vendor/librw/src/ps2/ps2.cpp b/vendor/librw/src/ps2/ps2.cpp deleted file mode 100644 index bd0f54b..0000000 --- a/vendor/librw/src/ps2/ps2.cpp +++ /dev/null @@ -1,1573 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#include "../rwanim.h" -#include "../rwplugins.h" -#include "rwps2.h" -#include "rwps2plg.h" - -#include "rwps2impl.h" - -#define PLUGIN_ID 2 - -namespace rw { -namespace ps2 { - -#define ALIGNPTR(p,a) ((uint8*)(((uintptr)(p)+a-1) & ~(uintptr)(a-1))) - -static void* -driverOpen(void *o, int32, int32) -{ - engine->driver[PLATFORM_PS2]->defaultPipeline = makeDefaultPipeline(); - - engine->driver[PLATFORM_PS2]->rasterNativeOffset = nativeRasterOffset; - engine->driver[PLATFORM_PS2]->rasterCreate = rasterCreate; - engine->driver[PLATFORM_PS2]->rasterLock = rasterLock; - engine->driver[PLATFORM_PS2]->rasterUnlock = rasterUnlock; - engine->driver[PLATFORM_PS2]->rasterLockPalette = rasterLockPalette; - engine->driver[PLATFORM_PS2]->rasterUnlockPalette = rasterUnlockPalette; - engine->driver[PLATFORM_PS2]->rasterNumLevels = rasterNumLevels; - engine->driver[PLATFORM_PS2]->imageFindRasterFormat = imageFindRasterFormat; - engine->driver[PLATFORM_PS2]->rasterFromImage = rasterFromImage; - engine->driver[PLATFORM_PS2]->rasterToImage = rasterToImage; - - return o; -} - -static void* -driverClose(void *o, int32, int32) -{ - return o; -} - -void -registerPlatformPlugins(void) -{ - Driver::registerPlugin(PLATFORM_PS2, 0, PLATFORM_PS2, - driverOpen, driverClose); - - registerNativeRaster(); -} - -ObjPipeline *defaultObjPipe; -MatPipeline *defaultMatPipe; - -void* -destroyNativeData(void *object, int32, int32) -{ - Geometry *geometry = (Geometry*)object; - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_PS2) - return object; - InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - for(uint32 i = 0; i < header->numMeshes; i++) - rwFree(header->instanceMeshes[i].dataRaw); - rwFree(header->instanceMeshes); - rwFree(header); - geometry->instData = nil; - return object; -} - -Stream* -readNativeData(Stream *stream, int32, void *object, int32, int32) -{ - ASSERTLITTLE; - Geometry *geometry = (Geometry*)object; - uint32 platform; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - platform = stream->readU32(); - if(platform != PLATFORM_PS2){ - RWERROR((ERR_PLATFORM, platform)); - return nil; - } - InstanceDataHeader *header = rwNewT(InstanceDataHeader, 1, MEMDUR_EVENT | ID_GEOMETRY); - geometry->instData = header; - header->platform = PLATFORM_PS2; - assert(geometry->meshHeader != nil); - header->numMeshes = geometry->meshHeader->numMeshes; - header->instanceMeshes = rwNewT(InstanceData, header->numMeshes, MEMDUR_EVENT | ID_GEOMETRY); - Mesh *m = geometry->meshHeader->getMeshes(); - for(uint32 i = 0; i < header->numMeshes; i++){ - InstanceData *instance = &header->instanceMeshes[i]; - uint32 buf[2]; - stream->read32(buf, 8); - instance->dataSize = buf[0]; - instance->dataRaw = rwNewT(uint8, instance->dataSize+0x7F, MEMDUR_EVENT | ID_GEOMETRY); - instance->data = ALIGNPTR(instance->dataRaw, 0x80); -#ifdef RW_PS2 - uint32 a = (uint32)instance->data; - assert(a % 0x10 == 0); -#endif - stream->read8(instance->data, instance->dataSize); -#ifdef RW_PS2 - if(!buf[1]) - fixDmaOffsets(instance); -#endif - instance->material = m->material; -// sizedebug(instance); - m++; - } - return stream; -} - -Stream* -writeNativeData(Stream *stream, int32 len, void *object, int32, int32) -{ - ASSERTLITTLE; - Geometry *geometry = (Geometry*)object; - writeChunkHeader(stream, ID_STRUCT, len-12); - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_PS2) - return stream; - stream->writeU32(PLATFORM_PS2); - InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - for(uint32 i = 0; i < header->numMeshes; i++){ - InstanceData *instance = &header->instanceMeshes[i]; - uint32 buf[2]; - buf[0] = instance->dataSize; - buf[1] = unfixDmaOffsets(instance); - stream->write32(buf, 8); - stream->write8(instance->data, instance->dataSize); -#ifdef RW_PS2 - if(!buf[1]) - fixDmaOffsets(instance); -#endif - } - return stream; -} - -int32 -getSizeNativeData(void *object, int32, int32) -{ - Geometry *geometry = (Geometry*)object; - int32 size = 16; - if(geometry->instData == nil || - geometry->instData->platform != PLATFORM_PS2) - return 0; - InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - for(uint32 i = 0; i < header->numMeshes; i++){ - InstanceData *instance = &header->instanceMeshes[i]; - size += 8; - size += instance->dataSize; - } - return size; -} - -void -registerNativeDataPlugin(void) -{ - Geometry::registerPlugin(0, ID_NATIVEDATA, - nil, destroyNativeData, nil); - Geometry::registerPluginStream(ID_NATIVEDATA, - readNativeData, - writeNativeData, - getSizeNativeData); -} - -// Patch DMA ref ADDR fields to point to the actual data. -#ifdef RW_PS2 -void -fixDmaOffsets(InstanceData *inst) -{ - uint32 base = (uint32)inst->data; - uint32 *tag = (uint32*)inst->data; - for(;;){ - switch(tag[0]&0x70000000){ - // DMAcnt - case 0x10000000: - // no need to fix - tag += (1+(tag[0]&0xFFFF))*4; - break; - - // DMAref - case 0x30000000: - // fix address and jump to next - tag[1] = base + tag[1]<<4; - tag += 4; - break; - - // DMAret - case 0x60000000: - // we're done - return; - - default: - fprintf(stderr, "error: unknown DMAtag %X\n", tag[0]); - return; - } - } -} -#endif - -// Patch DMA ref ADDR fields to qword offsets and return whether -// no ref tags were found. -// Only under RW_PS2 are the addresses actually patched but we need -// the return value for streaming out. -bool32 -unfixDmaOffsets(InstanceData *inst) -{ - bool32 norefs = 1; -#ifdef RW_PS2 - uint32 base = (uint32)inst->data; -#endif - uint32 *tag = (uint32*)inst->data; - for(;;){ - switch(tag[0]&0x70000000){ - // DMAcnt - case 0x10000000: - // no need to unfix - tag += (1+(tag[0]&0xFFFF))*4; - break; - - // DMAref - case 0x30000000: - norefs = 0; - // unfix address and jump to next -#ifdef RW_PS2 - tag[1] = (tag[1] - base)>>4; -#endif - tag += 4; - break; - - // DMAret - case 0x60000000: - return norefs; - - default: - fprintf(stderr, "error: unknown DMAtag %X\n", tag[0]); - return norefs; - } - } -} - -// Pipeline - -PipeAttribute attribXYZ = { - "XYZ", - AT_V3_32 -}; - -PipeAttribute attribXYZW = { - "XYZW", - AT_V4_32 -}; - -PipeAttribute attribUV = { - "UV", - AT_V2_32 -}; - -PipeAttribute attribUV2 = { - "UV2", - AT_V4_32 -}; - -PipeAttribute attribRGBA = { - "RGBA", - AT_V4_8 | AT_UNSGN -}; - -PipeAttribute attribNormal = { - "Normal", - AT_V3_8 // RW has V4_8 but uses V3_8, wtf? -}; - -PipeAttribute attribWeights = { - "Weights", - AT_V4_32 | AT_RW -}; - -static uint32 -attribSize(uint32 unpack) -{ - static uint32 size[] = { 32, 16, 8, 16 }; - return ((unpack>>26 & 3)+1)*size[unpack>>24 & 3]/8; -} - -#define QWC(x) (((x)+0xF)>>4) - -static uint32 -getBatchSize(MatPipeline *pipe, uint32 vertCount) -{ - PipeAttribute *a; - if(vertCount == 0) - return 0; - uint32 size = 1; // ITOP &c. at the end - for(uint i = 0; i < nelem(pipe->attribs); i++) - if((a = pipe->attribs[i]) && (a->attrib & AT_RW) == 0){ - size++; // UNPACK &c. - size += QWC(vertCount*attribSize(a->attrib)); - } - return size; -} - -uint32* -instanceXYZ(uint32 *p, Geometry *g, Mesh *m, uint32 idx, uint32 n) -{ - uint16 j; - uint32 *d = (uint32*)g->morphTargets[0].vertices; - for(uint32 i = idx; i < idx+n; i++){ - j = m->indices[i]; - *p++ = d[j*3+0]; - *p++ = d[j*3+1]; - *p++ = d[j*3+2]; - } - while((uintptr)p % 0x10) - *p++ = 0; - return p; -} - -uint32* -instanceXYZW(uint32 *p, Geometry *g, Mesh *m, uint32 idx, uint32 n) -{ - uint16 j; - uint32 *d = (uint32*)g->morphTargets[0].vertices; - int8 *adcbits = getADCbitsForMesh(g, m); - for(uint32 i = idx; i < idx+n; i++){ - j = m->indices[i]; - *p++ = d[j*3+0]; - *p++ = d[j*3+1]; - *p++ = d[j*3+2]; - *p++ = adcbits && adcbits[i] ? 0x8000 : 0; - } - // don't need to pad - return p; -} - -uint32* -instanceUV(uint32 *p, Geometry *g, Mesh *m, uint32 idx, uint32 n) -{ - uint16 j; - uint32 *d = (uint32*)g->texCoords[0]; - if((g->flags & Geometry::TEXTURED) || - (g->flags & Geometry::TEXTURED2)) - for(uint32 i = idx; i < idx+n; i++){ - j = m->indices[i]; - *p++ = d[j*2+0]; - *p++ = d[j*2+1]; - } - else - for(uint32 i = idx; i < idx+n; i++){ - *p++ = 0; - *p++ = 0; - } - while((uintptr)p % 0x10) - *p++ = 0; - return p; -} - -uint32* -instanceUV2(uint32 *p, Geometry *g, Mesh *m, uint32 idx, uint32 n) -{ - uint16 j; - uint32 *d0 = (uint32*)g->texCoords[0]; - uint32 *d1 = (uint32*)g->texCoords[1]; - for(uint32 i = idx; i < idx+n; i++){ - j = m->indices[i]; - if(g->numTexCoordSets > 0){ - *p++ = d0[j*2+0]; - *p++ = d0[j*2+1]; - }else{ - *p++ = 0; - *p++ = 0; - } - if(g->numTexCoordSets > 1){ - *p++ = d1[j*2+0]; - *p++ = d1[j*2+1]; - }else{ - *p++ = 0; - *p++ = 0; - } - } - while((uintptr)p % 0x10) - *p++ = 0; - return p; -} - -uint32* -instanceRGBA(uint32 *p, Geometry *g, Mesh *m, uint32 idx, uint32 n) -{ - uint16 j; - uint32 *d = (uint32*)g->colors; - if((g->flags & Geometry::PRELIT)) - for(uint32 i = idx; i < idx+n; i++){ - j = m->indices[i]; - *p++ = d[j]; - } - else - for(uint32 i = idx; i < idx+n; i++) - *p++ = 0xFF000000; - while((uintptr)p % 0x10) - *p++ = 0; - return p; -} - -uint32* -instanceNormal(uint32 *wp, Geometry *g, Mesh *m, uint32 idx, uint32 n) -{ - uint16 j; - V3d *d = g->morphTargets[0].normals; - uint8 *p = (uint8*)wp; - if((g->flags & Geometry::NORMALS)) - for(uint32 i = idx; i < idx+n; i++){ - j = m->indices[i]; - *p++ = d[j].x*127.0f; - *p++ = d[j].y*127.0f; - *p++ = d[j].z*127.0f; - } - else - for(uint32 i = idx; i < idx+n; i++){ - *p++ = 0; - *p++ = 0; - *p++ = 0; - } - while((uintptr)p % 0x10) - *p++ = 0; - return (uint32*)p; -} - -void -MatPipeline::init(void) -{ - this->rw::Pipeline::init(PLATFORM_PS2); - for(int i = 0; i < 10; i++) - this->attribs[i] = nil; - this->instanceCB = nil; - this->uninstanceCB = nil; - this->preUninstCB = nil; - this->postUninstCB = nil; -} - -MatPipeline* -MatPipeline::create(void) -{ - MatPipeline *pipe = rwNewT(MatPipeline, 1, MEMDUR_GLOBAL); - pipe->init(); - return pipe; -} - -void -MatPipeline::destroy(void) -{ - rwFree(this); -} - -void -MatPipeline::dump(void) -{ - if(this->platform != PLATFORM_PS2) - return; - PipeAttribute *a; - printf("%x %x\n", this->pluginID, this->pluginData); - for(uint i = 0; i < nelem(this->attribs); i++){ - a = this->attribs[i]; - if(a) - printf("%d %s: %x\n", i, a->name, a->attrib); - } - printf("stride: %x\n", this->inputStride); - printf("vertcount: %x\n", this->vifOffset/this->inputStride); - printf("triSCount: %x\n", this->triStripCount); - printf("triLCount: %x\n", this->triListCount); - printf("vifOffset: %x\n", this->vifOffset); - printf("\n"); -} - -void -MatPipeline::setTriBufferSizes(uint32 inputStride, uint32 bufferSize) -{ - PipeAttribute *a; - - this->inputStride = inputStride; - uint32 numTLtris = bufferSize/3; - this->triListCount = (numTLtris & ~3) * 3; - this->triStripCount = bufferSize & ~3; - for(uint i = 0; i < nelem(this->attribs); i++){ - a = this->attribs[i]; - if(a && a->attrib & AT_RW){ - // broken out attribs have different requirement - // because we have to be able to restart a strip - // at an aligned offset - this->triStripCount = ((bufferSize-2) & ~3)+2; - return; - } - } -} - -// Instance format: -// no broken out clusters -// ====================== -// DMAret [FLUSH; MSKPATH3 || FLUSH; FLUSH] { -// foreach batch { -// foreach cluster { -// MARK/0; STMOD; STCYCL; UNPACK -// unpack-data -// } -// ITOP; MSCALF/MSCNT; // if first/not-first -// 0/FLUSH; 0/MSKPATH3 || 0/FLUSH; 0/FLUSH // if not-last/last -// } -// } -// -// broken out clusters -// =================== -// foreach batch { -// foreach broken out cluster { -// DMAref [STCYCL; UNPACK] -> pointer into unpack-data -// DMAcnt (empty) -// } -// DMAcnt/ret { -// foreach cluster { -// MARK/0; STMOD; STCYCL; UNPACK -// unpack-data -// } -// ITOP; MSCALF/MSCNT; // if first/not-first -// 0/FLUSH; 0/MSKPATH3 || 0/FLUSH; 0/FLUSH // if not-last/last -// } -// } -// unpack-data for broken out clusters - -uint32 markcnt = 0; - -enum { - DMAcnt = 0x10000000, - DMAref = 0x30000000, - DMAret = 0x60000000, - - VIF_NOP = 0, - VIF_STCYCL = 0x01000000, - VIF_STCYCL1 = 0x01000100, // WL = 1 - VIF_OFFSET = 0x02000000, - VIF_BASE = 0x03000000, - VIF_ITOP = 0x04000000, - VIF_STMOD = 0x05000000, - VIF_MSKPATH3 = 0x06000000, - VIF_MARK = 0x07000000, - VIF_FLUSHE = 0x10000000, - VIF_FLUSH = 0x11000000, - VIF_FLUSHA = 0x13000000, - VIF_MSCAL = 0x14000000, - VIF_MSCALF = 0x15000000, - VIF_MSCNT = 0x17000000, - VIF_STMASK = 0x20000000, - VIF_STROW = 0x30000000, - VIF_STCOL = 0x31000000, - VIF_MPG = 0x4A000000, - VIF_DIRECT = 0x50000000, - VIF_DIRECTHL = 0x51000000, - VIF_UNPACK = 0x60000000 // no mode encoded -}; - -struct InstMeshInfo -{ - uint32 numAttribs, numBrokenAttribs; - uint32 batchVertCount, lastBatchVertCount; - uint32 numBatches; - uint32 batchSize, lastBatchSize; - uint32 size; // size of DMA chain without broken out data - uint32 size2; // size of broken out data - uint32 vertexSize; - uint32 attribPos[10]; -}; - -InstMeshInfo -getInstMeshInfo(MatPipeline *pipe, Geometry *g, Mesh *m) -{ - PipeAttribute *a; - InstMeshInfo im; - im.numAttribs = 0; - im.numBrokenAttribs = 0; - im.vertexSize = 0; - for(uint i = 0; i < nelem(pipe->attribs); i++) - if((a = pipe->attribs[i])) { - if(a->attrib & AT_RW) - im.numBrokenAttribs++; - else{ - im.vertexSize += attribSize(a->attrib); - im.numAttribs++; - } - } - if(g->meshHeader->flags == MeshHeader::TRISTRIP){ - im.numBatches = (m->numIndices-2) / (pipe->triStripCount-2); - im.batchVertCount = pipe->triStripCount; - im.lastBatchVertCount = (m->numIndices-2) % (pipe->triStripCount-2); - if(im.lastBatchVertCount){ - im.numBatches++; - im.lastBatchVertCount += 2; - } - }else{ // TRILIST; nothing else supported yet - im.numBatches = (m->numIndices+pipe->triListCount-1) / - pipe->triListCount; - im.batchVertCount = pipe->triListCount; - im.lastBatchVertCount = m->numIndices % pipe->triListCount; - } - if(im.lastBatchVertCount == 0) - im.lastBatchVertCount = im.batchVertCount; - - im.batchSize = getBatchSize(pipe, im.batchVertCount); - im.lastBatchSize = getBatchSize(pipe, im.lastBatchVertCount); - if(im.numBrokenAttribs == 0) - im.size = 1 + im.batchSize*(im.numBatches-1) + im.lastBatchSize; - else - im.size = 2*im.numBrokenAttribs*im.numBatches + - (1+im.batchSize)*(im.numBatches-1) + 1+im.lastBatchSize; - - /* figure out size and addresses of broken out sections */ - im.size2 = 0; - for(uint i = 0; i < nelem(im.attribPos); i++) - if((a = pipe->attribs[i]) && a->attrib & AT_RW){ - im.attribPos[i] = im.size2 + im.size; - im.size2 += QWC(m->numIndices*attribSize(a->attrib)); - } - - return im; -} - -void -MatPipeline::instance(Geometry *g, InstanceData *inst, Mesh *m) -{ - PipeAttribute *a; - InstMeshInfo im = getInstMeshInfo(this, g, m); - - inst->dataSize = (im.size+im.size2)<<4; - // TODO: do this properly, just a test right now - inst->dataSize += 0x7F; - inst->dataRaw = rwNewT(uint8, inst->dataSize, MEMDUR_EVENT | ID_GEOMETRY); - inst->data = ALIGNPTR(inst->dataRaw, 0x80); - - /* make array of addresses of broken out sections */ - uint8 *datap[nelem(this->attribs)]; - uint8 **dp = datap; - for(uint i = 0; i < nelem(this->attribs); i++) - if((a = this->attribs[i]) && a->attrib & AT_RW) - dp[i] = inst->data + im.attribPos[i]*0x10; - - // TODO: not sure if this is correct - uint32 msk_flush = rw::version >= 0x35000 ? VIF_FLUSH : VIF_MSKPATH3; - - uint32 idx = 0; - uint32 *p = (uint32*)inst->data; - if(im.numBrokenAttribs == 0){ - *p++ = DMAret | im.size-1; - *p++ = 0; - *p++ = VIF_FLUSH; - *p++ = msk_flush; - } - for(uint32 j = 0; j < im.numBatches; j++){ - uint32 nverts, bsize; - if(j < im.numBatches-1){ - bsize = im.batchSize; - nverts = im.batchVertCount; - }else{ - bsize = im.lastBatchSize; - nverts = im.lastBatchVertCount; - } - for(uint i = 0; i < nelem(this->attribs); i++) - if((a = this->attribs[i]) && a->attrib & AT_RW){ - uint32 atsz = attribSize(a->attrib); - *p++ = DMAref | QWC(nverts*atsz); - *p++ = im.attribPos[i]; - *p++ = VIF_STCYCL1 | this->inputStride; - // Round up nverts so UNPACK will fit exactly into the DMA packet - // (can't pad with zeroes in broken out sections). - int num = (QWC(nverts*atsz)<<4)/atsz; - *p++ = (a->attrib&0xFF004000) - | 0x8000 | num << 16 | i; // UNPACK - // This probably shouldn't happen. - if(num*this->inputStride > this->vifOffset) - fprintf(stderr, "WARNING: PS2 instance data over vifOffset %08X, %X-> %X %X\n", - p[-1], num, - num*this->inputStride, this->vifOffset); - - *p++ = DMAcnt; - *p++ = 0x0; - *p++ = VIF_NOP; - *p++ = VIF_NOP; - - im.attribPos[i] += g->meshHeader->flags == 1 ? - QWC((im.batchVertCount-2)*atsz) : - QWC(im.batchVertCount*atsz); - } - if(im.numBrokenAttribs){ - *p++ = (j < im.numBatches-1 ? DMAcnt : DMAret) | bsize; - *p++ = 0x0; - *p++ = VIF_NOP; - *p++ = VIF_NOP; - } - - for(uint i = 0; i < nelem(this->attribs); i++) - if((a = this->attribs[i]) && (a->attrib & AT_RW) == 0){ - if(rw::version >= 0x35000) - *p++ = VIF_NOP; - else - *p++ = VIF_MARK | markcnt++; - *p++ = VIF_STMOD; - *p++ = VIF_STCYCL1 | this->inputStride; - *p++ = (a->attrib&0xFF004000) - | 0x8000 | nverts << 16 | i; // UNPACK - - if(a == &attribXYZ) - p = instanceXYZ(p, g, m, idx, nverts); - else if(a == &attribXYZW) - p = instanceXYZW(p, g, m, idx, nverts); - else if(a == &attribUV) - p = instanceUV(p, g, m, idx, nverts); - else if(a == &attribUV2) - p = instanceUV2(p, g, m, idx, nverts); - else if(a == &attribRGBA) - p = instanceRGBA(p, g, m, idx, nverts); - else if(a == &attribNormal) - p = instanceNormal(p, g, m, idx, nverts); - } - idx += g->meshHeader->flags == 1 - ? im.batchVertCount-2 : im.batchVertCount; - - *p++ = VIF_ITOP | nverts; - *p++ = j == 0 ? VIF_MSCALF : VIF_MSCNT; - if(j < im.numBatches-1){ - *p++ = VIF_NOP; - *p++ = VIF_NOP; - }else{ - *p++ = VIF_FLUSH; - *p++ = msk_flush; - } - } - - if(this->instanceCB) - this->instanceCB(this, g, m, datap); -#ifdef RW_PS2 - if(im.numBrokenAttribs) - fixDmaOffsets(inst); -#endif -} - -uint8* -MatPipeline::collectData(Geometry *g, InstanceData *inst, Mesh *m, uint8 *data[]) -{ - PipeAttribute *a; - InstMeshInfo im = getInstMeshInfo(this, g, m); - - uint8 *raw = rwNewT(uint8, im.vertexSize*m->numIndices, MEMDUR_EVENT | ID_GEOMETRY); - uint8 *dp = raw; - for(uint i = 0; i < nelem(this->attribs); i++) - if((a = this->attribs[i])) { - if(a->attrib & AT_RW){ - data[i] = inst->data + im.attribPos[i]*0x10; - }else{ - data[i] = dp; - dp += m->numIndices*attribSize(a->attrib); - } - } - - uint8 *datap[nelem(this->attribs)]; - memcpy(datap, data, sizeof(datap)); - - uint32 overlap = g->meshHeader->flags == 1 ? 2 : 0; - uint32 *p = (uint32*)inst->data; - if(im.numBrokenAttribs == 0) - p += 4; - for(uint32 j = 0; j < im.numBatches; j++){ - uint32 nverts = j < im.numBatches-1 ? im.batchVertCount : - im.lastBatchVertCount; - for(uint i = 0; i < nelem(this->attribs); i++) - if((a = this->attribs[i]) && a->attrib & AT_RW) - p += 8; - if(im.numBrokenAttribs) - p += 4; - for(uint i = 0; i < nelem(this->attribs); i++) - if((a = this->attribs[i]) && (a->attrib & AT_RW) == 0){ - uint32 asz = attribSize(a->attrib); - p += 4; - if((p[-1] & 0xff004000) != a->attrib){ - fprintf(stderr, "unexpected unpack: %08x %08x\n", p[-1], a->attrib); - assert(0 && "unexpected unpack\n"); - } - memcpy(datap[i], p, asz*nverts); - datap[i] += asz*(nverts-overlap); - p += QWC(asz*nverts)*4; - } - p += 4; - } - return raw; -} - -static void -objInstance(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - // TODO: allow for REINSTANCE - if(geo->instData) - return; - InstanceDataHeader *header = rwNewT(InstanceDataHeader, 1, MEMDUR_EVENT | ID_GEOMETRY); - geo->instData = header; - header->platform = PLATFORM_PS2; - assert(geo->meshHeader != nil); - header->numMeshes = geo->meshHeader->numMeshes; - header->instanceMeshes = rwNewT(InstanceData, header->numMeshes, MEMDUR_EVENT | ID_GEOMETRY); - for(uint32 i = 0; i < header->numMeshes; i++){ - Mesh *mesh = &geo->meshHeader->getMeshes()[i]; - InstanceData *instance = &header->instanceMeshes[i]; - - MatPipeline *m; - m = pipe->groupPipeline ? - pipe->groupPipeline : - (MatPipeline*)mesh->material->pipeline; - if(m == nil) - m = defaultMatPipe; - m->instance(geo, instance, mesh); - instance->material = mesh->material; - } -} - -/* -static void -printVertCounts(InstanceData *inst, int flag) -{ - uint32 *d = (uint32*)inst->data; - uint32 id = 0; - if(inst->material->pipeline) - id = inst->material->pipeline->pluginData; - int stride; - if(inst->arePointersFixed){ - d += 4; - while(d[3]&0x60000000){ // skip UNPACKs - stride = d[2]&0xFF; - d += 4 + 4*QWC(attribSize(d[3])*((d[3]>>16)&0xFF)); - } - if(d[2] == 0) - printf("ITOP %x %d (%d) %x\n", *d, stride, flag, id); - }else{ - while((*d&0x70000000) == 0x30000000){ - stride = d[2]&0xFF; - printf("UNPACK %x %d (%d) %x\n", d[3], stride, flag, id); - d += 8; - } - if((*d&0x70000000) == 0x10000000){ - d += (*d&0xFFFF)*4; - printf("ITOP %x %d (%d) %x\n", *d, stride, flag, id); - } - } -} -*/ - -static void -objUninstance(rw::ObjPipeline *rwpipe, Atomic *atomic) -{ - ObjPipeline *pipe = (ObjPipeline*)rwpipe; - Geometry *geo = atomic->geometry; - if((geo->flags & Geometry::NATIVE) == 0) - return; - assert(geo->instData != nil); - assert(geo->instData->platform == PLATFORM_PS2); - InstanceDataHeader *header = (InstanceDataHeader*)geo->instData; - // highest possible number of vertices - geo->numVertices = geo->meshHeader->totalIndices; - geo->numTriangles = geo->meshHeader->guessNumTriangles(); - geo->allocateData(); - geo->allocateMeshes(geo->meshHeader->numMeshes, geo->meshHeader->totalIndices, 0); - uint32 *flags = rwNewT(uint32, geo->numVertices, - MEMDUR_FUNCTION | ID_GEOMETRY); - memset(flags, 0, 4*geo->numVertices); - memset(geo->meshHeader->getMeshes()->indices, 0, 2*geo->meshHeader->totalIndices); - for(uint32 i = 0; i < header->numMeshes; i++){ - Mesh *mesh = &geo->meshHeader->getMeshes()[i]; - MatPipeline *m; - m = pipe->groupPipeline ? - pipe->groupPipeline : - (MatPipeline*)mesh->material->pipeline; - if(m == nil) m = defaultMatPipe; - if(m->preUninstCB) m->preUninstCB(m, geo); - } - geo->numVertices = 0; - for(uint32 i = 0; i < header->numMeshes; i++){ - Mesh *mesh = &geo->meshHeader->getMeshes()[i]; - InstanceData *instance = &header->instanceMeshes[i]; - MatPipeline *m; - m = pipe->groupPipeline ? - pipe->groupPipeline : - (MatPipeline*)mesh->material->pipeline; - if(m == nil) m = defaultMatPipe; - - //printDMAVIF(instance); - uint8 *data[nelem(m->attribs)] = { nil }; - uint8 *raw = m->collectData(geo, instance, mesh, data); - assert(m->uninstanceCB); - m->uninstanceCB(m, geo, flags, mesh, data); - rwFree(raw); - } - for(uint32 i = 0; i < header->numMeshes; i++){ - Mesh *mesh = &geo->meshHeader->getMeshes()[i]; - MatPipeline *m; - m = pipe->groupPipeline ? - pipe->groupPipeline : - (MatPipeline*)mesh->material->pipeline; - if(m == nil) m = defaultMatPipe; - if(m->postUninstCB) m->postUninstCB(m, geo); - } - - int8 *bits = getADCbits(geo); - geo->generateTriangles(bits); - rwFree(flags); - geo->flags &= ~Geometry::NATIVE; - destroyNativeData(geo, 0, 0); -/* - for(uint32 i = 0; i < header->numMeshes; i++){ - Mesh *mesh = &geo->meshHeader->mesh[i]; - InstanceData *instance = &header->instanceMeshes[i]; -// printf("numIndices: %d\n", mesh->numIndices); -// printDMA(instance); - printVertCounts(instance, geo->meshHeader->flags); - } -*/ -} - -void -ObjPipeline::init(void) -{ - this->rw::ObjPipeline::init(PLATFORM_PS2); - this->groupPipeline = nil; - this->impl.instance = objInstance; - this->impl.uninstance = objUninstance; -} - -ObjPipeline* -ObjPipeline::create(void) -{ - ObjPipeline *pipe = rwNewT(ObjPipeline, 1, MEMDUR_GLOBAL); - pipe->init(); - return pipe; -} - -void -insertVertex(Geometry *geo, int32 i, uint32 mask, Vertex *v) -{ - if(mask & 0x1) - geo->morphTargets[0].vertices[i] = v->p; - if(mask & 0x10) - geo->morphTargets[0].normals[i] = v->n; - if(mask & 0x100) - geo->colors[i] = v->c; - if(mask & 0x1000) - geo->texCoords[0][i] = v->t; - if(mask & 0x2000) - geo->texCoords[1][i] = v->t1; -} - -void -genericPreCB(MatPipeline *pipe, Geometry *geo) -{ - PipeAttribute *a; - for(int32 i = 0; i < (int)nelem(pipe->attribs); i++) - if((a = pipe->attribs[i])) - if(a == &attribXYZW){ - allocateADC(geo); - break; - } - skinPreCB(pipe, geo); -} - -void -genericUninstanceCB(MatPipeline *pipe, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[]) -{ - float32 *xyz = nil, *xyzw = nil; - float32 *uv = nil, *uv2 = nil; - uint8 *rgba = nil; - int8 *normals = nil; - uint32 *weights = nil; - int8 *adc = nil; - Skin *skin = nil; - if(skinGlobals.geoOffset) - skin = Skin::get(geo); - - PipeAttribute *a; - for(int32 i = 0; i < (int)nelem(pipe->attribs); i++) - if((a = pipe->attribs[i])){ - if(a == &attribXYZ) xyz = (float32*)data[i]; - else if(a == &attribXYZW) xyzw = (float32*)data[i]; - else if(a == &attribUV) uv = (float32*)data[i]; - else if(a == &attribUV2) uv2 = (float32*)data[i]; - else if(a == &attribRGBA) rgba = data[i]; - else if(a == &attribNormal) normals = (int8*)data[i]; - else if(a == &attribWeights) weights = (uint32*)data[i]; - } - - uint32 mask = 0x1; // vertices - if(normals && geo->flags & Geometry::NORMALS) - mask |= 0x10; - if(rgba && geo->flags & Geometry::PRELIT) - mask |= 0x100; - if((uv || uv2) && geo->numTexCoordSets > 0) - mask |= 0x1000; - if(uv2 && geo->numTexCoordSets > 1) - mask |= 0x2000; - if(weights && skin) - mask |= 0x10000; - if(xyzw) - adc = getADCbitsForMesh(geo, mesh); - - Vertex v; - for(uint32 i = 0; i < mesh->numIndices; i++){ - if(mask & 0x1) - memcpy(&v.p, xyz ? xyz : xyzw, 12); - if(mask & 0x10){ - // TODO: figure out scaling :/ - v.n.x = normals[0]/128.0f; - v.n.y = normals[1]/128.0f; - v.n.z = normals[2]/128.0f; - } - if(mask & 0x100) - memcpy(&v.c, rgba, 4); - if(mask & 0x1000) - memcpy(&v.t, uv ? uv : uv2, 8); - if(mask & 0x2000) - memcpy(&v.t1, uv2 + 2, 8); - if(mask & 0x10000) - for(int j = 0; j < 4; j++){ - ((uint32*)v.w)[j] = weights[j] & ~0x3FF; - v.i[j] = (weights[j] & 0x3FF) >> 2; - if(v.i[j]) v.i[j]--; - if(v.w[j] == 0.0f) v.i[j] = 0; - } - int32 idx = findVertexSkin(geo, flags, mask, &v); - if(idx < 0) - idx = geo->numVertices++; - mesh->indices[i] = idx; - if(adc) - adc[i] = xyzw[3] != 0.0f; - flags[idx] = mask; - insertVertexSkin(geo, idx, mask, &v); - if(xyz) xyz += 3; - if(xyzw) xyzw += 4; - if(uv) uv += 2; - if(uv2) uv2 += 4; - rgba += 4; - normals += 3; - weights += 4; - } -} - -/* -void -defaultUninstanceCB(MatPipeline *pipe, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[]) -{ - float32 *verts = (float32*)data[AT_XYZ]; - float32 *texcoords = (float32*)data[AT_UV]; - uint8 *colors = (uint8*)data[AT_RGBA]; - int8 *norms = (int8*)data[AT_NORMAL]; - uint32 mask = 0x1; // vertices - if(geo->flags & Geometry::NORMALS) - mask |= 0x10; - if(geo->flags & Geometry::PRELIT) - mask |= 0x100; - for(int32 i = 0; i < geo->numTexCoordSets; i++) - mask |= 0x1000 << i; - int numUV = pipe->attribs[AT_UV] == &attribUV2 ? 2 : 1; - - Vertex v; - for(uint32 i = 0; i < mesh->numIndices; i++){ - if(mask & 0x1) - memcpy(&v.p, verts, 12); - if(mask & 0x10){ - v.n[0] = norms[0]/127.0f; - v.n[1] = norms[1]/127.0f; - v.n[2] = norms[2]/127.0f; - } - if(mask & 0x100){ - memcpy(&v.c, colors, 4); - //v.c[3] = 0xFF; - } - if(mask & 0x1000) - memcpy(&v.t, texcoords, 8); - if(mask & 0x2000) - memcpy(&v.t1, texcoords+2, 8); - - int32 idx = findVertex(geo, flags, mask, &v); - if(idx < 0) - idx = geo->numVertices++; - mesh->indices[i] = idx; - flags[idx] = mask; - insertVertex(geo, idx, mask, &v); - verts += 3; - texcoords += 2*numUV; - colors += 4; - norms += 3; - } -} -*/ - -#undef QWC - -ObjPipeline* -makeDefaultPipeline(void) -{ - if(defaultMatPipe == nil){ - MatPipeline *pipe = MatPipeline::create(); - pipe->attribs[AT_XYZ] = &attribXYZ; - pipe->attribs[AT_UV] = &attribUV; - pipe->attribs[AT_RGBA] = &attribRGBA; - pipe->attribs[AT_NORMAL] = &attribNormal; - uint32 vertCount = MatPipeline::getVertCount(VU_Lights,4,3,2); - pipe->setTriBufferSizes(4, vertCount); - pipe->vifOffset = pipe->inputStride*vertCount; - pipe->uninstanceCB = genericUninstanceCB; - defaultMatPipe = pipe; - } - - if(defaultObjPipe == nil){ - ObjPipeline *opipe = ObjPipeline::create(); - defaultObjPipe = opipe; - } - return defaultObjPipe; -} - -// ADC - -int32 adcOffset; - -int8* -getADCbits(Geometry *geo) -{ - int8 *bits = nil; - if(adcOffset){ - ADCData *adc = PLUGINOFFSET(ADCData, geo, adcOffset); - if(adc->adcFormatted) - bits = adc->adcBits; - } - return bits; -} - -int8* -getADCbitsForMesh(Geometry *geo, Mesh *mesh) -{ - int8 *bits = getADCbits(geo); - if(bits == nil) - return nil; - int32 n = mesh - geo->meshHeader->getMeshes(); - for(int32 i = 0; i < n; i++) - bits += geo->meshHeader->getMeshes()[i].numIndices; - return bits; -} - -// TODO -void -convertADC(Geometry*) -{ -} - -// Not optimal but works -void -unconvertADC(Geometry *g) -{ - ADCData *adc = PLUGINOFFSET(ADCData, g, adcOffset); - if(!adc->adcFormatted) - return; - int8 *b = adc->adcBits; - - MeshHeader *oldmh = g->meshHeader; - g->meshHeader = nil; - // Don't allocate indices for now - MeshHeader *newmh = g->allocateMeshes(oldmh->numMeshes, 0, 1); - newmh->flags = oldmh->flags; // should be tristrip - Mesh *oldm = oldmh->getMeshes(); - Mesh *newm = newmh->getMeshes(); - for(int32 i = 0; i < newmh->numMeshes; i++){ - newm->material = oldm->material; - newm->numIndices = oldm->numIndices; - for(uint32 j = 0; j < oldm->numIndices; j++) - if(*b++) - newm->numIndices += 2; - newmh->totalIndices += newm->numIndices; - newm++; - oldm++; - } - // Now re-allocate with indices - newmh = g->allocateMeshes(newmh->numMeshes, newmh->totalIndices, 0); - b = adc->adcBits; - oldm = oldmh->getMeshes(); - newm = newmh->getMeshes(); - for(int32 i = 0; i < newmh->numMeshes; i++){ - int32 n = 0; - for(uint32 j = 0; j < oldm->numIndices; j++){ - if(*b++){ - newm->indices[n++] = oldm->indices[j-1]; - newm->indices[n++] = oldm->indices[j-1]; - } - newm->indices[n++] = oldm->indices[j]; - } - newm++; - oldm++; - } - rwFree(oldmh); - adc->adcFormatted = 0; - rwFree(adc->adcBits); - adc->adcBits = nil; - adc->numBits = 0; -} - -void -allocateADC(Geometry *geo) -{ - ADCData *adc = PLUGINOFFSET(ADCData, geo, adcOffset); - adc->adcFormatted = 1; - adc->numBits = geo->meshHeader->totalIndices; - int32 size = adc->numBits+3 & ~3; - adc->adcBits = rwNewT(int8, size, MEMDUR_EVENT | ID_ADC); - memset(adc->adcBits, 0, size); -} - -static void* -createADC(void *object, int32 offset, int32) -{ - ADCData *adc = PLUGINOFFSET(ADCData, object, offset); - adc->adcFormatted = 0; - return object; -} - -static void* -copyADC(void *dst, void *src, int32 offset, int32) -{ - ADCData *dstadc = PLUGINOFFSET(ADCData, dst, offset); - ADCData *srcadc = PLUGINOFFSET(ADCData, src, offset); - dstadc->adcFormatted = srcadc->adcFormatted; - if(!dstadc->adcFormatted) - return dst; - dstadc->numBits = srcadc->numBits; - int32 size = dstadc->numBits+3 & ~3; - dstadc->adcBits = rwNewT(int8, size, MEMDUR_EVENT | ID_ADC); - memcpy(dstadc->adcBits, srcadc->adcBits, size); - return dst; -} - -static void* -destroyADC(void *object, int32 offset, int32) -{ - ADCData *adc = PLUGINOFFSET(ADCData, object, offset); - if(adc->adcFormatted) - rwFree(adc->adcBits); - return object; -} - -static Stream* -readADC(Stream *stream, int32, void *object, int32 offset, int32) -{ - ADCData *adc = PLUGINOFFSET(ADCData, object, offset); - if(!findChunk(stream, ID_ADC, nil, nil)){ - RWERROR((ERR_CHUNK, "ADC")); - return nil; - } - adc->numBits = stream->readI32(); - adc->adcFormatted = 1; - if(adc->numBits == 0){ - adc->adcBits = nil; - adc->numBits = 0; - return stream; - } - int32 size = adc->numBits+3 & ~3; - adc->adcBits = rwNewT(int8, size, MEMDUR_EVENT | ID_ADC); - stream->read8(adc->adcBits, size); - return stream; -} - -static Stream* -writeADC(Stream *stream, int32 len, void *object, int32 offset, int32) -{ - ADCData *adc = PLUGINOFFSET(ADCData, object, offset); - Geometry *geometry = (Geometry*)object; - writeChunkHeader(stream, ID_ADC, len-12); - if(geometry->flags & Geometry::NATIVE){ - stream->writeI32(0); - return stream; - } - stream->writeI32(adc->numBits); - int32 size = adc->numBits+3 & ~3; - stream->write8(adc->adcBits, size); - return stream; -} - -static int32 -getSizeADC(void *object, int32 offset, int32) -{ - Geometry *geometry = (Geometry*)object; - ADCData *adc = PLUGINOFFSET(ADCData, object, offset); - if(!adc->adcFormatted) - return 0; - if(geometry->flags & Geometry::NATIVE) - return 16; - return 16 + (adc->numBits+3 & ~3); -} - -void -registerADCPlugin(void) -{ - adcOffset = Geometry::registerPlugin(sizeof(ADCData), ID_ADC, - createADC, destroyADC, copyADC); - Geometry::registerPluginStream(ID_ADC, - readADC, - writeADC, - getSizeADC); -} - -// misc stuff - -static uint32 -unpackSize(uint32 unpack) -{ - static uint32 size[] = { 32, 16, 8, 4 }; - return ((unpack>>26 & 3)+1)*size[unpack>>24 & 3]/8; -} - -/* A little dumb VIF interpreter */ -static void -sendVIF(uint32 w) -{ - enum VIFstate { - VST_cmd, - VST_stmask, - VST_strow, - VST_stcol, - VST_mpg, - VST_direct, - VST_unpack - }; -// static uint32 buf[256 * 16]; // maximum unpack size - static VIFstate state = VST_cmd; - static uint32 n; - static uint32 code; - uint32 imm, num; - - imm = w & 0xFFFF; - num = (w>>16) & 0xFF; - switch(state){ - case VST_cmd: - code = w; - if((code & 0x60000000) == VIF_UNPACK){ - printf("\t%08X VIF_UNPACK\n", code); - printf("\t...skipping...\n"); - state = VST_unpack; - n = (unpackSize(code)*num + 3) >> 2; - }else switch(code & 0x7F000000){ - case VIF_NOP: - printf("\t%08X VIF_NOP\n", code); - break; - case VIF_STCYCL: - printf("\t%08X VIF_STCYCL\n", code); - break; - case VIF_OFFSET: - printf("\t%08X VIF_OFFSET\n", code); - break; - case VIF_BASE: - printf("\t%08X VIF_BASE\n", code); - break; - case VIF_ITOP: - printf("\t%08X VIF_ITOP\n", code); - break; - case VIF_STMOD: - printf("\t%08X VIF_STMOD\n", code); - break; - case VIF_MSKPATH3: - printf("\t%08X VIF_MSKPATH3\n", code); - break; - case VIF_MARK: - printf("\t%08X VIF_MARK\n", code); - break; - case VIF_FLUSHE: - printf("\t%08X VIF_FLUSHE\n", code); - break; - case VIF_FLUSH: - printf("\t%08X VIF_FLUSH\n", code); - break; - case VIF_FLUSHA: - printf("\t%08X VIF_FLUSHA\n", code); - break; - case VIF_MSCAL: - printf("\t%08X VIF_MSCAL\n", code); - break; - case VIF_MSCALF: - printf("\t%08X VIF_MSCALF\n", code); - break; - case VIF_MSCNT: - printf("\t%08X VIF_MSCNT\n", code); - break; - case VIF_STMASK: - printf("\t%08X VIF_STMASK\n", code); - printf("\t...skipping...\n"); - state = VST_stmask; - n = 1; - break; - case VIF_STROW: - printf("\t%08X VIF_STROW\n", code); - printf("\t...skipping...\n"); - state = VST_strow; - n = 4; - break; - case VIF_STCOL: - printf("\t%08X VIF_STCOL\n", code); - printf("\t...skipping...\n"); - state = VST_stcol; - n = 4; - break; - case VIF_MPG: - printf("\t%08X VIF_MPG\n", code); - state = VST_mpg; - n = num*2; - break; - case VIF_DIRECT: - printf("\t%08X VIF_DIRECT\n", code); - printf("\t...skipping...\n"); - state = VST_direct; - n = imm*4; - break; - case VIF_DIRECTHL: - printf("\t%08X VIF_DIRECTHL\n", code); - printf("\t...skipping...\n"); - state = VST_direct; - n = imm*4; - break; - default: - printf("\tUnknown VIFcode %08X\n", code); - } - break; - /* TODO: actually do something here */ - case VST_stmask: - n--; - break; - case VST_strow: - n--; - break; - case VST_stcol: - n--; - break; - case VST_mpg: - n--; - break; - case VST_direct: - n--; - break; - case VST_unpack: - n--; - break; - } - if(n == 0) - state = VST_cmd; -} - -static void -dmaVIF(int32 qwc, uint32 *data) -{ - qwc *= 4; - while(qwc--) - sendVIF(*data++); -} - -void -printDMAVIF(InstanceData *inst) -{ - uint32 *tag = (uint32*)inst->data; - uint32 *base = (uint32*)inst->data; - uint32 qwc; - - for(;;){ - qwc = tag[0]&0xFFFF; - switch(tag[0]&0x70000000){ - case DMAcnt: - printf("DMAcnt %04x %08x\n", qwc, tag[1]); - sendVIF(tag[2]); - sendVIF(tag[3]); - dmaVIF(qwc, tag+4); - tag += (1+qwc)*4; - break; - - case DMAref: - printf("DMAref %04x %08x\n", qwc, tag[1]); - sendVIF(tag[2]); - sendVIF(tag[3]); - dmaVIF(qwc, base + tag[1]*4); - tag += 4; - break; - - case DMAret: - printf("DMAret %04x %08x\n", qwc, tag[1]); - sendVIF(tag[2]); - sendVIF(tag[3]); - dmaVIF(qwc, tag+4); - printf("\n"); - return; - } - } -} - -void -printDMA(InstanceData *inst) -{ - uint32 *tag = (uint32*)inst->data; - uint32 qwc; - for(;;){ - qwc = tag[0]&0xFFFF; - switch(tag[0]&0x70000000){ - case DMAcnt: - printf("CNT %04x %08x\n", qwc, tag[1]); - tag += (1+qwc)*4; - break; - - case DMAref: - printf("REF %04x %08x\n", qwc, tag[1]); - tag += 4; - break; - - case DMAret: - printf("RET %04x %08x\n\n", qwc, tag[1]); - return; - } - } -} - -/* -void -sizedebug(InstanceData *inst) -{ - if(inst->arePointersFixed == 2) - return; - uint32 *base = (uint32*)inst->data; - uint32 *tag = (uint32*)inst->data; - uint32 *last = nil; - for(;;){ - switch(tag[0]&0x70000000){ - case DMAcnt: - tag += (1+(tag[0]&0xFFFF))*4; - break; - - case DMAref: - last = base + tag[1]*4 + (tag[0]&0xFFFF)*4; - tag += 4; - break; - - case DMAret: - tag += (1+(tag[0]&0xFFFF))*4; - uint32 diff; - if(!last) - diff = (uint8*)tag - (uint8*)base; - else - diff = (uint8*)last - (uint8*)base; - printf("%x %x %x\n", inst->dataSize-diff, diff, inst->dataSize); - return; - - default: - printf("unkown DMAtag: %X %X\n", tag[0], tag[1]); - break; - } - } -} -*/ - -} -} diff --git a/vendor/librw/src/ps2/ps2device.cpp b/vendor/librw/src/ps2/ps2device.cpp deleted file mode 100644 index 98f9914..0000000 --- a/vendor/librw/src/ps2/ps2device.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#ifdef RW_PS2 - -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#include "../rwanim.h" -#include "../rwplugins.h" -#include "rwps2.h" -#include "rwps2plg.h" - -#include "rwps2impl.h" - -#define PLUGIN_ID 2 - -namespace rw { -namespace ps2 { - -Device renderdevice = { - 16777215.0f, 0.0f, - null::beginUpdate, - null::endUpdate, - null::clearCamera, - null::showRaster, - null::rasterRenderFast, - null::setRenderState, - null::getRenderState, - null::im2DRenderLine, - null::im2DRenderTriangle, - null::im2DRenderPrimitive, - null::im2DRenderIndexedPrimitive, - null::im3DTransform, - null::im3DRenderPrimitive, - null::im3DRenderIndexedPrimitive, - null::im3DEnd, - null::deviceSystem -}; - -} -} - -#endif diff --git a/vendor/librw/src/ps2/ps2matfx.cpp b/vendor/librw/src/ps2/ps2matfx.cpp deleted file mode 100644 index 6972a05..0000000 --- a/vendor/librw/src/ps2/ps2matfx.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwanim.h" -#include "../rwengine.h" -#include "../rwplugins.h" -#include "rwps2.h" -#include "rwps2plg.h" - -#define PLUGIN_ID ID_MATFX - -namespace rw { -namespace ps2 { - -static void* -matfxOpen(void *o, int32, int32) -{ - matFXGlobals.pipelines[PLATFORM_PS2] = makeMatFXPipeline(); - return o; -} - -static void* -matfxClose(void *o, int32, int32) -{ - ((ObjPipeline*)matFXGlobals.pipelines[PLATFORM_PS2])->groupPipeline->destroy(); - ((ObjPipeline*)matFXGlobals.pipelines[PLATFORM_PS2])->destroy(); - matFXGlobals.pipelines[PLATFORM_PS2] = nil; - return o; -} - -void -initMatFX(void) -{ - Driver::registerPlugin(PLATFORM_PS2, 0, ID_MATFX, - matfxOpen, matfxClose); -} - -ObjPipeline* -makeMatFXPipeline(void) -{ - MatPipeline *pipe = MatPipeline::create(); - pipe->pluginID = ID_MATFX; - pipe->pluginData = 0; - pipe->attribs[AT_XYZ] = &attribXYZ; - pipe->attribs[AT_UV] = &attribUV; - pipe->attribs[AT_RGBA] = &attribRGBA; - pipe->attribs[AT_NORMAL] = &attribNormal; - uint32 vertCount = MatPipeline::getVertCount(0x3C5, 4, 3, 3); - pipe->setTriBufferSizes(4, vertCount); - pipe->vifOffset = pipe->inputStride*vertCount; - pipe->uninstanceCB = genericUninstanceCB; - - ObjPipeline *opipe = ObjPipeline::create(); - opipe->pluginID = ID_MATFX; - opipe->pluginData = 0; - opipe->groupPipeline = pipe; - return opipe; -} - -} -} diff --git a/vendor/librw/src/ps2/ps2raster.cpp b/vendor/librw/src/ps2/ps2raster.cpp deleted file mode 100644 index 2b76b8b..0000000 --- a/vendor/librw/src/ps2/ps2raster.cpp +++ /dev/null @@ -1,2238 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwengine.h" -#include "rwps2.h" - -#define PLUGIN_ID ID_DRIVER - -#define min(a, b) ((a) < (b) ? (a) : (b)) -#define max(a, b) ((a) > (b) ? (a) : (b)) - -namespace rw { -namespace ps2 { - -int32 nativeRasterOffset; - -#define MAXLEVEL(r) ((r)->tex1low >> 2) -static bool32 noNewStyleRasters; - -enum Psm { - PSMCT32 = 0x0, - PSMCT24 = 0x1, - PSMCT16 = 0x2, - PSMCT16S = 0xA, - PSMT8 = 0x13, - PSMT4 = 0x14, - PSMT8H = 0x1B, - PSMT4HL = 0x24, - PSMT4HH = 0x2C, - PSMZ32 = 0x30, - PSMZ24 = 0x31, - PSMZ16 = 0x32, - PSMZ16S = 0x3A -}; - -// i don't really understand this, stolen from RW -static void -transferMinSize(int32 psm, int32 flags, int32 *minw, int32 *minh) -{ - *minh = 1; - switch(psm){ - case PSMCT32: - case PSMZ32: - *minw = 2; // 32 bit - break; - case PSMCT16: - case PSMCT16S: - case PSMZ16: - case PSMZ16S: - *minw = 4; // 16 bit - break; - case PSMCT24: - case PSMT8: - case PSMT4: - case PSMT8H: - case PSMT4HL: - case PSMT4HH: - case PSMZ24: - *minw = 8; // everything else - break; - } - if(flags & 0x2 && psm == PSMT8){ - *minw = 16; - *minh = 4; - } - if(flags & 0x4 && psm == PSMT4){ - *minw = 32; - *minh = 4; - } -} - -#define ALIGN(x,a) ((x) + (a)-1 & ~((a)-1)) -#define ALIGN16(x) ((x) + 0xF & ~0xF) -#define ALIGN64(x) ((x) + 0x3F & ~0x3F) -#define NSIZE(dim,pagedim) (((dim) + (pagedim)-1)/(pagedim)) - -void* -mallocalign(size_t size, int32 alignment) -{ - void *p; - void **pp; - p = rwMalloc(size + alignment + sizeof(void*), MEMDUR_EVENT | ID_RASTERPS2); - if(p == nil) return nil; - pp = (void**)(((uintptr)p + sizeof(void*) + alignment)&~(alignment-1)); - pp[-1] = p; - return (void*)pp; -} - -void -freealign(void *p) -{ - void *pp; - if(p == nil) return; - pp = ((void**)p)[-1]; - rwFree(pp); -} - -// TODO: these depend on video mode, set in deviceSystem! -int32 cameraFormat = Raster::C8888; -int32 cameraDepth = 32; -int32 cameraZDepth = 16; - -int32 defaultMipMapKL = 0xFC0; -int32 maxMipLevels = 7; - -int32 -getRasterFormat(Raster *raster) -{ - int32 palformat, pixelformat, mipmapflags; - pixelformat = raster->format & 0xF00; - palformat = raster->format & 0x6000; - mipmapflags = raster->format & 0x9000; - switch(raster->type){ - case Raster::ZBUFFER: - if(palformat || mipmapflags){ - RWERROR((ERR_INVRASTER)); - return 0; - } - if(raster->depth && raster->depth != cameraZDepth){ - RWERROR((ERR_INVRASTER)); - return 0; - } - raster->depth = cameraZDepth; - if(pixelformat){ - if((raster->depth == 16 && pixelformat != Raster::D16) || - (raster->depth == 32 && pixelformat != Raster::D32)){ - RWERROR((ERR_INVRASTER)); - return 0; - } - } - pixelformat = raster->depth == 16 ? Raster::D16 : Raster::D32; - raster->format = pixelformat; - break; - case Raster::CAMERA: - if(palformat || mipmapflags){ - RWERROR((ERR_INVRASTER)); - return 0; - } - if(raster->depth && raster->depth != cameraDepth){ - RWERROR((ERR_INVRASTER)); - return 0; - } - raster->depth = cameraDepth; - if(pixelformat && pixelformat != cameraFormat){ - RWERROR((ERR_INVRASTER)); - return 0; - } - pixelformat = cameraFormat; - raster->format = pixelformat; - break; - case Raster::NORMAL: - case Raster::CAMERATEXTURE: - if(palformat || mipmapflags){ - RWERROR((ERR_INVRASTER)); - return 0; - } - /* fallthrough */ - case Raster::TEXTURE: - // Find raster format by depth if none was given - if(pixelformat == 0) - switch(raster->depth){ - case 4: - pixelformat = Raster::C1555; - palformat = Raster::PAL4; - break; - case 8: - pixelformat = Raster::C1555; - palformat = Raster::PAL8; - break; - case 24: - // unsafe - // pixelformat = Raster::C888; - // palformat = 0; - // break; - case 32: - pixelformat = Raster::C8888; - palformat = 0; - break; - default: - pixelformat = Raster::C1555; - palformat = 0; - break; - } - raster->format = pixelformat | palformat | mipmapflags; - // Sanity check raster format and depth; set depth if none given - if(palformat){ - if(palformat == Raster::PAL8){ - if(raster->depth && raster->depth != 8){ - RWERROR((ERR_INVRASTER)); - return 0; - } - raster->depth = 8; - if(pixelformat != Raster::C1555 && pixelformat != Raster::C8888){ - RWERROR((ERR_INVRASTER)); - return 0; - } - }else if(palformat == Raster::PAL4){ - if(raster->depth && raster->depth != 4){ - RWERROR((ERR_INVRASTER)); - return 0; - } - raster->depth = 4; - if(pixelformat != Raster::C1555 && pixelformat != Raster::C8888){ - RWERROR((ERR_INVRASTER)); - return 0; - } - }else{ - RWERROR((ERR_INVRASTER)); - return 0; - } - }else if(pixelformat == Raster::C1555){ - if(raster->depth && raster->depth != 16){ - RWERROR((ERR_INVRASTER)); - return 0; - } - raster->depth = 16; - }else if(pixelformat == Raster::C8888){ - if(raster->depth && raster->depth != 32){ - RWERROR((ERR_INVRASTER)); - return 0; - } - raster->depth = 32; - }else if(pixelformat == Raster::C888){ - assert(0 && "24 bit rasters not supported"); - if(raster->depth && raster->depth != 24){ - RWERROR((ERR_INVRASTER)); - return 0; - } - raster->depth = 24; - }else{ - RWERROR((ERR_INVRASTER)); - return 0; - } - break; - default: - RWERROR((ERR_INVRASTER)); - return 0; - } - return 1; -} - -/* - * Memory units: - * Column: 64 bytes (single cycle access) - * Block: 256 bytes, 64 words, 4 columns. texture base pointers - * Page: 8 kbytes, 2 kwords, 128 columns, 32 blocks. frame buffer base pointers - * entire memory: 4 mbytes, 64k columns, 16k blocks, 512 pages - * - * PSMT4: 128x128 pixels, 4x8 blocks per page, 32x16 pixels per block - * PSMT8: 128x64 pixels, 8x4 blocks per page, 16x16 pixels per block - * PSMCT16(S): 64x64 pixels, 4x8 blocks per page, 16x8 pixels per block - * PSMCT24: 64x32 pixels, 8x4 blocks per page, 8x8 pixels per block - * PSMCT32: 64x32 pixels, 8x4 blocks per page, 8x8 pixels per block - * - * Layout of blocks in page: - * - * PSMCT24, PSMCT32, PSMT8 - * +----+----+----+----+----+----+----+----+ - * | 0 | 1 | 4 | 5 | 16 | 17 | 20 | 21 | - * +----+----+----+----+----+----+----+----+ - * | 2 | 3 | 6 | 7 | 18 | 19 | 22 | 23 | - * +----+----+----+----+----+----+----+----+ - * | 8 | 9 | 12 | 13 | 24 | 25 | 28 | 29 | - * +----+----+----+----+----+----+----+----+ - * | 10 | 11 | 14 | 15 | 26 | 27 | 30 | 31 | - * +----+----+----+----+----+----+----+----+ - * - * PSMCT16, PSMT4 - * +----+----+----+----+ - * | 0 | 2 | 8 | 10 | - * +----+----+----+----+ - * | 1 | 3 | 9 | 11 | - * +----+----+----+----+ - * | 4 | 6 | 12 | 14 | - * +----+----+----+----+ - * | 5 | 7 | 13 | 15 | - * +----+----+----+----+ - * | 16 | 18 | 24 | 26 | - * +----+----+----+----+ - * | 17 | 19 | 25 | 27 | - * +----+----+----+----+ - * | 20 | 22 | 28 | 30 | - * +----+----+----+----+ - * | 21 | 23 | 29 | 31 | - * +----+----+----+----+ - * - * PSMCT16S - * +----+----+----+----+ - * | 0 | 2 | 16 | 18 | - * +----+----+----+----+ - * | 1 | 3 | 17 | 19 | - * +----+----+----+----+ - * | 8 | 10 | 24 | 26 | - * +----+----+----+----+ - * | 9 | 11 | 25 | 27 | - * +----+----+----+----+ - * | 4 | 6 | 20 | 22 | - * +----+----+----+----+ - * | 5 | 7 | 21 | 23 | - * +----+----+----+----+ - * | 12 | 14 | 28 | 30 | - * +----+----+----+----+ - * | 13 | 15 | 29 | 31 | - * +----+----+----+----+ - * - */ - -static uint8 blockmap_PSMCT32[32] = { - 0, 1, 4, 5, 16, 17, 20, 21, - 2, 3, 6, 7, 18, 19, 22, 23, - 8, 9, 12, 13, 24, 25, 28, 29, - 10, 11, 14, 15, 26, 27, 30, 31, -}; -static uint8 blockmap_PSMCT16[32] = { - 0, 2, 8, 10, - 1, 3, 9, 11, - 4, 6, 12, 14, - 5, 7, 13, 15, - 16, 18, 24, 26, - 17, 19, 25, 27, - 20, 22, 28, 30, - 21, 23, 29, 31, -}; -static uint8 blockmap_PSMCT16S[32] = { - 0, 2, 16, 18, - 1, 3, 17, 19, - 8, 10, 24, 26, - 9, 11, 25, 27, - 4, 6, 20, 22, - 5, 7, 21, 23, - 12, 14, 28, 30, - 13, 15, 29, 31, -}; -static uint8 blockmap_PSMZ32[32] = { - 24, 25, 28, 29, 8, 9, 12, 13, - 26, 27, 30, 31, 10, 11, 14, 15, - 16, 17, 20, 21, 0, 1, 4, 5, - 18, 19, 22, 23, 2, 3, 6, 7, -}; -static uint8 blockmap_PSMZ16[32] = { - 24, 26, 16, 18, - 25, 27, 17, 19, - 28, 30, 20, 22, - 29, 31, 21, 23, - 8, 10, 0, 2, - 9, 11, 1, 3, - 12, 14, 4, 6, - 13, 15, 5, 7, -}; -static uint8 blockmap_PSMZ16S[32] = { - 24, 26, 8, 10, - 25, 27, 9, 11, - 16, 18, 0, 2, - 17, 19, 1, 3, - 28, 30, 12, 14, - 29, 31, 13, 15, - 20, 22, 4, 6, - 21, 23, 5, 7, -}; - -static uint8 blockmaprev_PSMCT32[32] = { - 0, 1, 8, 9, 2, 3, 10, 11, - 16, 17, 24, 25, 18, 19, 26, 27, - 4, 5, 12, 13, 6, 7, 14, 15, - 20, 21, 28, 29, 22, 23, 30, 31, -}; -static uint8 blockmaprev_PSMCT16[32] = { - 0, 4, 1, 5, - 8, 12, 9, 13, - 2, 6, 3, 7, - 10, 14, 11, 15, - 16, 20, 17, 21, - 24, 28, 25, 29, - 18, 22, 19, 23, - 26, 30, 27, 31, -}; - -/* Suffixes used: - * _Px - pixels - * _W - width units (pixels/64) - * _B - blocks - * _P - pages - */ - -/* Layout mipmaps and palette in GS memory */ -static void -calcOffsets(int32 width_Px, int32 height_Px, int32 psm, uint64 *bufferBase_B, uint64 *bufferWidth_W, uint32 *trxpos, uint32 *totalSize, uint32 *paletteBase) -{ - uint32 pageWidth_Px, pageHeight_Px; - uint32 blockWidth_Px, blockHeight_Px; - uint32 mindim_Px; - int32 nlevels; - int32 n; - uint32 mipw_Px, miph_Px; - uint32 lastmipw_Px, lastmiph_Px; - uint32 bufferHeight_P[8]; - uint32 bufferPage_B[8]; // address of page in which the level is allocated - uint32 xoff_Px, yoff_Px; // x/y offset the last level starts at - // Whenever we allocate horizontally inside a page, - // keep track of the region below it on this stack. - uint32 sp; - uint32 xoffstack_Px[8]; // actually unused... - uint32 widthstack_Px[8]; - uint32 heightstack_Px[8]; - uint32 basestack_B[8]; - uint32 flag; - - switch(psm){ - case PSMCT32: - case PSMCT24: - case PSMT8H: - case PSMT4HL: - case PSMT4HH: - case PSMZ32: - case PSMZ24: - pageWidth_Px = 64; - pageHeight_Px = 32; - blockWidth_Px = 8; - blockHeight_Px = 8; - break; - case PSMT8: - pageWidth_Px = 128; - pageHeight_Px = 64; - blockWidth_Px = 16; - blockHeight_Px = 16; - break; - case PSMT4: - pageWidth_Px = 128; - pageHeight_Px = 128; - blockWidth_Px = 32; - blockHeight_Px = 16; - break; - case PSMCT16: - case PSMCT16S: - case PSMZ16: - case PSMZ16S: - default: - pageWidth_Px = 64; - pageHeight_Px = 64; - blockWidth_Px = 16; - blockHeight_Px = 8; - break; - } - - mindim_Px = min(width_Px, height_Px); - for(nlevels = 1; mindim_Px > 8; nlevels++){ - if(nlevels >= maxMipLevels) - break; - mindim_Px /= 2; - } - -#define PAGEWIDTH_B (pageWidth_Px/blockWidth_Px) // number of horizontal blocks per page -#define NBLKX(dim) (NSIZE((dim), blockWidth_Px)) -#define NBLKY(dim) (NSIZE((dim), blockHeight_Px)) -#define NPGX(dim) (NSIZE((dim), pageWidth_Px)) -#define NPGY(dim) (NSIZE((dim), pageHeight_Px)) -#define REALWIDTH(w) (max((w), blockWidth_Px)) -#define REALHEIGHT(w) (max((w), blockHeight_Px)) - - bufferBase_B[0] = 0; - bufferWidth_W[0] = NPGX(width_Px)*pageWidth_Px/64; - bufferHeight_P[0] = NPGY(height_Px); - bufferPage_B[0] = 0; - lastmipw_Px = width_Px; - lastmiph_Px = height_Px; - sp = 0; - xoff_Px = 0; - yoff_Px = 0; - flag = 0; - // Calculate info for all mipmap levels. - // mipwidth/height are actually the dimensions of level n-1! - // This code was reversed from RW and is rather complicated... - // partially because it's not clear what the assumptions are, - // can width/height be non-powers of 2? - for(n = 1; n < nlevels; n++){ - mipw_Px = lastmipw_Px/2; - miph_Px = lastmiph_Px/2; - if(lastmipw_Px >= pageWidth_Px){ - if(lastmiph_Px >= pageHeight_Px){ - // CASE 0 - // We allocate full pages - // This is the only place bufferWidth can change. Similarly bufferBase_2, which is related - bufferBase_B[n] = bufferBase_B[n-1] + (lastmipw_Px/blockWidth_Px)*(lastmiph_Px/blockHeight_Px); - bufferPage_B[n] = bufferBase_B[n]; - bufferWidth_W[n] = NPGX(mipw_Px)*pageWidth_Px/64; - bufferHeight_P[n] = NPGY(miph_Px); - xoff_Px = 0; - yoff_Px = 0; - }else{ - // CASE 1 - // Allocate vertically in the current page - bufferPage_B[n] = bufferPage_B[n-1]; - bufferHeight_P[n] = bufferHeight_P[n-1]; - bufferWidth_W[n] = bufferWidth_W[n-1]; - // How do we know pageHeight - yoff - REALHEIGHT(lastmiph) >= miph? - // And how is this condition ever false? - // Assuming lastmipw >= pageWidth for any number of levels, lastmiph must be pageHeight/2 - // or lower to reach this code. No dimension is lower than 8. Then consequent mipmaps - // will have heights halved but even with PSMT4 we will only (vertically) fill the - // page with the last mipmap and not go beyond... - if(REALHEIGHT(lastmiph_Px) + yoff_Px < pageHeight_Px){ - // CASE 2 - yoff_Px += REALHEIGHT(lastmiph_Px); - bufferBase_B[n] = bufferBase_B[n-1] + - PAGEWIDTH_B * NBLKY(lastmiph_Px) * - bufferWidth_W[n]*64/pageWidth_Px; // number of horizontal pages for level - }else{ - // CASE 3 - // Can this happen? - xoff_Px += REALWIDTH(lastmipw_Px); - bufferBase_B[n] = bufferBase_B[n-1] + NBLKX(lastmipw_Px); - } - } - }else if(lastmiph_Px >= pageHeight_Px){ - // CASE 4 - // Allocate horizontally - bufferPage_B[n] = bufferPage_B[n-1]; - bufferHeight_P[n] = bufferHeight_P[n-1]; - bufferWidth_W[n] = bufferWidth_W[n-1]; - if(REALWIDTH(lastmipw_Px) + xoff_Px < pageWidth_Px){ - // CASE 5 - xoffstack_Px[sp] = xoff_Px; // unused... - heightstack_Px[sp] = REALHEIGHT(lastmiph_Px); - widthstack_Px[sp] = REALWIDTH(lastmipw_Px); - basestack_B[sp] = bufferBase_B[n-1] + NBLKY(lastmiph_Px) * PAGEWIDTH_B; - sp++; - xoff_Px += REALWIDTH(lastmipw_Px); - bufferBase_B[n] = bufferBase_B[n-1] + NBLKX(lastmipw_Px); - }else if(sp){ - // CASE 7 - bufferBase_B[n] = basestack_B[sp-1]; - if(REALWIDTH(mipw_Px) < widthstack_Px[sp-1]){ - // CASE 9 - basestack_B[sp-1] += NBLKX(mipw_Px); - widthstack_Px[sp-1] -= REALWIDTH(mipw_Px); - }else if(REALHEIGHT(miph_Px) < heightstack_Px[sp-1]){ - // CASE 8 - basestack_B[sp-1] += NBLKY(miph_Px) * PAGEWIDTH_B; - heightstack_Px[sp-1] -= REALHEIGHT(miph_Px); - }else{ - // CASE 10 - sp--; - } - flag = 1; - }else{ - // CASE 6 - yoff_Px += REALHEIGHT(lastmiph_Px); - bufferBase_B[n] = bufferBase_B[n-1] + PAGEWIDTH_B*NBLKY(lastmiph_Px); - } - }else{ - // CASE 11 - bufferHeight_P[n] = bufferHeight_P[n-1]; - bufferPage_B[n] = bufferPage_B[n-1]; - bufferWidth_W[n] = bufferWidth_W[n-1]; - if(REALWIDTH(lastmipw_Px) + xoff_Px < bufferWidth_W[n-1]*64){ - // CASE 12 - xoffstack_Px[sp] = xoff_Px; // unused... - widthstack_Px[sp] = REALWIDTH(lastmipw_Px); - heightstack_Px[sp] = REALHEIGHT(lastmiph_Px); - basestack_B[sp] = bufferBase_B[n-1] + PAGEWIDTH_B * NBLKY(lastmiph_Px); - sp++; - xoff_Px += REALWIDTH(lastmipw_Px); - bufferBase_B[n] = bufferBase_B[n-1] + NBLKX(lastmipw_Px); - }else if(REALHEIGHT(lastmiph_Px) + yoff_Px < pageHeight_Px*bufferHeight_P[n] && flag == 0){ - // CASE 13 - bufferBase_B[n] = bufferBase_B[n-1] + PAGEWIDTH_B * NBLKY(lastmiph_Px); - yoff_Px += blockHeight_Px ? lastmiph_Px : 0; // how exactly can blockHeight be 0?? This looks wrong... - flag = n; - }else{ - // CASE 14 - bufferBase_B[n] = basestack_B[sp-1]; - if(REALWIDTH(mipw_Px) < widthstack_Px[sp-1]){ - // CASE 15 - basestack_B[sp-1] += NBLKX(mipw_Px); - widthstack_Px[sp-1] -= REALWIDTH(mipw_Px); - }else if(REALHEIGHT(miph_Px) < heightstack_Px[sp-1]){ - // CASE 16 - basestack_B[sp-1] += PAGEWIDTH_B * NBLKY(miph_Px); - heightstack_Px[sp-1] -= REALHEIGHT(miph_Px); - }else{ - // CASE 17 - sp--; - } - } - } - lastmipw_Px = mipw_Px; - lastmiph_Px = miph_Px; - } - - // Calculate position of palette. - uint32 paletteBase_B = 0; - uint64 bufwidth_Px = bufferWidth_W[nlevels-1]*64; - uint64 bufheight_Px = bufferHeight_P[nlevels-1]*pageHeight_Px; - // != means > really - if(bufwidth_Px != lastmipw_Px || bufheight_Px != lastmiph_Px){ - if(psm == PSMT8){ - // 2x2 blocks at the end of the page (even for PSMCT16S) - paletteBase_B = bufferPage_B[nlevels-1] + - ((bufwidth_Px/pageWidth_Px)*bufferHeight_P[nlevels-1] << 5) // total number of blocks - - (bufheight_Px/pageWidth_Px) * PAGEWIDTH_B // one block up - - 2; // two blocks left - }else if(psm == PSMT4){ - // One block at the end of the page - paletteBase_B = bufferPage_B[nlevels-1] + - ((bufwidth_Px/pageWidth_Px) * bufferHeight_P[nlevels-1] << 5) - - 1; - } - }else{ - if(psm == PSMT8 || psm == PSMT4){ - paletteBase_B = bufferPage_B[nlevels-1] + - (bufwidth_Px/blockWidth_Px) * (bufheight_Px/blockHeight_Px); - } - } - - uint32 bufwidth_W = bufferWidth_W[0]; - uint32 bufpage_B = bufferPage_B[0]; - uint32 pixeloff; - for(n = 0; n < nlevels; n++){ - // Calculate TRXPOS register (DSAX and DSAY, shifted up later) - // Start of buffer on current page (x in pixels, y in blocks) - pixeloff = (bufferBase_B[n] - bufpage_B) * blockWidth_Px; - // y coordinate of first pixel - yoff_Px = (pixeloff / (bufwidth_W*64)) * blockHeight_Px; - // x coordinate of first pixel - xoff_Px = pixeloff % (bufwidth_W*64); - if(bufferWidth_W[n] == bufwidth_W && - // Not quite sure what's the meaning of this. - // DSAY is 11 bits, but so is DSAX and it is not checked? - yoff_Px < 0x800){ - trxpos[n] = yoff_Px<<16 | xoff_Px; - }else{ - bufwidth_W = bufferWidth_W[n]; - bufpage_B = bufferPage_B[n]; - trxpos[n] = 0; - } - - // If using more than one page we have to swizzle rows inside page rows - if(bufwidth_W*64 / pageWidth_Px > 1){ - uint32 bufpagestride_B = bufwidth_W*64 * 32 / pageWidth_Px; // one row of pages - uint32 bufwidth_B = bufwidth_W*64 / blockWidth_Px; // one row of blocks - // To illustrate assume: - // - 8x4 block pages - // - texture is 4 pages wide - // Then the lower bits of an input block address look like: RRRPPCC - // where the C bits are the block's column inside a page - // the P bits are the block's page horizontally - // the R bits are the block's row in a row of pages - // We want to swap P and R: PPRRRCC - bufferBase_B[n] = - (bufferBase_B[n] & ~((uint64)bufpagestride_B - PAGEWIDTH_B)) // mask out R and P - | ((bufferBase_B[n] & (bufwidth_B - PAGEWIDTH_B)) * (bufpagestride_B/bufwidth_B)) // extract P and shift left - | ((bufferBase_B[n] & (bufpagestride_B - bufwidth_B)) / (bufwidth_B/PAGEWIDTH_B)); // extract R and shift right - } - - // Always have to swizzle blocks inside pages. We use a lookup, RW does bit operations - switch(psm){ - case PSMCT32: - case PSMCT24: - case PSMT8: - case PSMT8H: - case PSMT4HL: - case PSMT4HH: - // ABCDE -> CADBE - bufferBase_B[n] = (bufferBase_B[n]&~0x1F) | (uint64)blockmap_PSMCT32[bufferBase_B[n]&0x1F]; - break; - case PSMT4: - case PSMCT16: - // ABCDE -> ADBEC - bufferBase_B[n] = (bufferBase_B[n]&~0x1F) | (uint64)blockmap_PSMCT16[bufferBase_B[n]&0x1F]; - break; - case PSMCT16S: - // ABCDE -> DBAEC - bufferBase_B[n] = (bufferBase_B[n]&~0x1F) | (uint64)blockmap_PSMCT16S[bufferBase_B[n]&0x1F]; - break; - case PSMZ32: - case PSMZ24: - // ABCDE -> ~C~ADBE - bufferBase_B[n] = (bufferBase_B[n]&~0x1F) | (uint64)blockmap_PSMZ32[bufferBase_B[n]&0x1F]; - break; - case PSMZ16: - // ABCDE -> ~A~DBEC - bufferBase_B[n] = (bufferBase_B[n]&~0x1F) | (uint64)blockmap_PSMZ16[bufferBase_B[n]&0x1F]; - break; - case PSMZ16S: - // ABCDE -> ~D~BAEC - bufferBase_B[n] = (bufferBase_B[n]&~0x1F) | (uint64)blockmap_PSMZ16S[bufferBase_B[n]&0x1F]; - break; - default: break; - } - } - - // Same dance as above, with the palette - if(bufwidth_W*64 / pageWidth_Px > 1){ - uint32 bufpagestride_B = bufwidth_W*64 * 32 / pageWidth_Px; // one row of pages - uint32 bufwidth_B = bufwidth_W*64 / blockWidth_Px; // one row of blocks - paletteBase_B = - (paletteBase_B & ~(bufpagestride_B - PAGEWIDTH_B)) // mask out R and P - | ((paletteBase_B & (bufwidth_B - PAGEWIDTH_B)) * (bufpagestride_B/bufwidth_B)) // extract P and shift left - | ((paletteBase_B & (bufpagestride_B - bufwidth_B)) / (bufwidth_B/PAGEWIDTH_B)); // extract R and shift right - } - switch(psm){ - case PSMCT32: - case PSMCT24: - case PSMT8: - case PSMT8H: - case PSMT4HL: - case PSMT4HH: - paletteBase_B = (paletteBase_B&~0x1F) | (uint64)blockmap_PSMCT32[paletteBase_B&0x1F]; - break; - case PSMT4: - case PSMCT16: - paletteBase_B = (paletteBase_B&~0x1F) | (uint64)blockmap_PSMCT16[paletteBase_B&0x1F]; - break; - case PSMCT16S: - paletteBase_B = (paletteBase_B&~0x1F) | (uint64)blockmap_PSMCT16S[paletteBase_B&0x1F]; - break; - case PSMZ32: - case PSMZ24: - paletteBase_B = (paletteBase_B&~0x1F) | (uint64)blockmap_PSMZ32[paletteBase_B&0x1F]; - break; - case PSMZ16: - paletteBase_B = (paletteBase_B&~0x1F) | (uint64)blockmap_PSMZ16[paletteBase_B&0x1F]; - break; - case PSMZ16S: - paletteBase_B = (paletteBase_B&~0x1F) | (uint64)blockmap_PSMZ16S[paletteBase_B&0x1F]; - break; - default: break; - } - *paletteBase = paletteBase_B; - *totalSize = bufferPage_B[nlevels-1] + // start of last buffer` - bufferWidth_W[nlevels-1]*64/blockWidth_Px * // number of horizontal blocks in last level - pageHeight_Px*bufferHeight_P[nlevels-1]/blockHeight_Px; // number of vertical blocks in last level - *totalSize *= 64; // to words - -#undef BLKSTRIDE -#undef NBLKX -#undef NBLKY -#undef NPGX -#undef NPGY -#undef REALWIDTH -#undef REALHEIGHT -} - -static Raster* -rasterCreateTexture(Raster *raster) -{ - // We use a map for fast lookup, even for impossible depths - static int32 pageWidths[32] = { - 128, 128, 128, 128, - 128, 128, 128, 128, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - }; - static int32 pageHeights[32] = { - 128, 128, 128, 128, - 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, - }; - enum { - TCC_RGBA = 1 << 2, - CLD_1 = 1 << 29, - - WD2BLK = 64, // words per block - WD2PG = 2048, // words per page - }; - int32 pixelformat, palformat; - // TEX0 fields (not all) - int64 tbw = 0; // texture buffer width, texels/64 - int64 psm = 0; // pixel storage mode - int64 tw = 0; // texture width exponent, width = 2^tw - int64 th = 0; // texture height exponent, height = 2^th - int64 tcc = 0; // texture color component, 0 = rgb, 1 = rgba - int64 cpsm = 0; // CLUT pixel storage mode - int64 cld = 0; // CLUT buffer load control - - uint64 bufferWidth[7]; // in number of pixels / 64 - uint64 bufferBase[7]; // block address - uint32 trxpos_hi[8]; - int32 width, height, depth; - int32 pageWidth, pageHeight; - int32 paletteWidth, paletteHeight, paletteDepth; - int32 palettePagewidth, palettePageheight; - - - Ps2Raster *ras = GETPS2RASTEREXT(raster); - pixelformat = raster->format & 0xF00; - palformat = raster->format & 0x6000; - width = raster->width; - height = raster->height; - depth = raster->depth; - // RW's code does not seem to quite work with 24 bit rasters - // so make sure we're not generating them for safety - assert(depth != 24); - - ras->flags = 0; - ras->data = nil; - ras->dataSize = 0; - - // RW doesn't seem to check this, hm... - if(raster->flags & Raster::DONTALLOCATE) - return raster; - - //printf("%x %x %x %x\n", raster->format, raster->flags, raster->type, noNewStyleRasters); - pageWidth = pageWidths[depth-1]; - pageHeight = pageHeights[depth-1]; - - int32 s; - tw = 0; - for(s = 1; s < width; s *= 2) - tw++; - th = 0; - for(s = 1; s < height; s *= 2) - th++; - ras->kl = defaultMipMapKL; - // unk2[0] = 1 - //printf("%d %d %d %d\n", raster->width, logw, raster->height, logh); - - // round up to page width, set TBW, TW, TH - tbw = max(width,pageWidth)/64; - - // set PSM, TCC, CLD, CPSM and figure out palette format - if(palformat){ - if(palformat == Raster::PAL8){ - psm = PSMT8; - paletteWidth = 16; - paletteHeight = 16; - }else if(palformat == Raster::PAL4){ - psm = PSMT4; - paletteWidth = 8; - paletteHeight = 2; - }else{ - // can't happen, sanity check in getRasterFormat - return nil;; - } - tcc = 1; // RGBA - cld = 1; - if(pixelformat == Raster::C1555){ - paletteDepth = 2; - cpsm = PSMCT16S; - palettePagewidth = 64; - palettePageheight = 64; - }else if(pixelformat == Raster::C8888){ - paletteDepth = 4; - cpsm = PSMCT32; - palettePagewidth = 64; - palettePageheight = 32; - }else - // can't happen, sanity check in getRasterFormat - return nil;; - }else{ - paletteWidth = 0; - paletteHeight = 0; - paletteDepth = 0; - palettePagewidth = 0; - palettePageheight = 0; - if(pixelformat == Raster::C8888){ - psm = PSMCT32; - tcc = 1; // RGBA - }else if(pixelformat == Raster::C888){ - psm = PSMCT24; - tcc = 0; // RGB - }else if(pixelformat == Raster::C1555){ - psm = PSMCT16S; - tcc = 1; // RGBA - }else - // can't happen, sanity check in getRasterFormat - return nil;; - } - - for(int i = 0; i < 7; i++){ - bufferWidth[i] = 1; - bufferBase[i] = 0; - } - - int32 mipw, miph; - int32 w, h; - int32 n; - int32 nPagW, nPagH; - raster->stride = width*depth/8; - - if(raster->format & Raster::MIPMAP){ - // NOTE: much of this code seems to be totally useless. - // calcOffsets overwrites what we calculate here. I wonder - // why this code even is in RW. Maybe it's older code that used - // the GS' automatic base pointer calculation? - - // see the left columns in the maps above - static uint32 blockOffset32_24_8[8] = { 0, 2, 2, 8, 8, 10, 10, 32 }; - static uint32 blockOffset16_4[8] = { 0, 1, 4, 5, 16, 17, 20, 21 }; - static uint32 blockOffset16S[8] = { 0, 1, 8, 9, 4, 5, 12, 13 }; - uint64 lastBufferWidth; - mipw = width; - miph = height; - lastBufferWidth = max(pageWidth, width)/64; - ras->pixelSize = 0; - int32 lastaddress = 0; // word address - int32 nextaddress = 0; // word address - int32 stride; // in bytes - for(n = 0; mipw != 0 && miph != 0 && n < maxMipLevels; n++){ - if(width >= 8 && height >= 8 && (mipw < 8 || miph < 8)) - break; - ras->pixelSize += ALIGN64(mipw*miph*depth/8); - bufferWidth[n] = max(pageWidth, mipw)/64; - stride = bufferWidth[n]*64*depth/8; - - // If buffer width changes, align next address to page - if(bufferWidth[n] != lastBufferWidth){ - nPagW = ((width >> (n-1)) + pageWidth-1)/pageWidth; - nPagH = ((height >> (n-1)) + pageHeight-1)/pageHeight; - nextaddress = (lastaddress + nPagW*nPagH*WD2PG) & ~(WD2PG-1); - } - lastBufferWidth = bufferWidth[n]; - nextaddress = ALIGN64(nextaddress); // this should already be the case... - uint32 b = nextaddress>>(11-3) & 7; // upper three bits of block-in-page address - switch(psm){ - case PSMCT32: - case PSMCT24: - case PSMT8: - b = blockOffset32_24_8[b]; - break; - case PSMCT16: - case PSMT4: - b = blockOffset16_4[b]; - break; - case PSMCT16S: - b = blockOffset16S[b]; - break; - default: - // can't happen - break; - } - // shift to page address, then to block address and add offset inside page - bufferBase[n] = b + (nextaddress>>11 << 5); - - lastaddress = nextaddress; - nextaddress = ALIGN64(miph*stride/4 + lastaddress); - - mipw /= 2; - miph /= 2; - } - - // Do the real work here - uint32 paletteBase; - uint32 totalSize; - calcOffsets(width, height, psm, bufferBase, bufferWidth, trxpos_hi, &totalSize, &paletteBase); - - ras->paletteSize = paletteWidth*paletteHeight*paletteDepth; - ras->miptbp1 = - bufferWidth[1]<<14 | (bufferBase[1] & 0x3FFF)<<0 - | bufferWidth[2]<<34 | (bufferBase[2] & 0x3FFF)<<20 - | bufferWidth[3]<<54 | (bufferBase[3] & 0x3FFF)<<40; - ras->miptbp2 = - bufferWidth[4]<<14 | (bufferBase[4] & 0x3FFF)<<0 - | bufferWidth[5]<<34 | (bufferBase[5] & 0x3FFF)<<20 - | bufferWidth[6]<<54 | (bufferBase[6] & 0x3FFF)<<40; - ras->tex1low = (n-1)<<2; - ras->totalSize = totalSize; - if(ras->paletteSize){ - ras->paletteBase = paletteBase; - if(ras->paletteBase*64 == ras->totalSize) - ras->totalSize += WD2PG; - }else - ras->paletteBase = 0; - }else{ - // No mipmaps - - ras->pixelSize = ALIGN16(raster->stride*raster->height); - ras->paletteSize = paletteWidth*paletteHeight*paletteDepth; - ras->miptbp1 = 1ULL<<54 | 1ULL<<34 | 1ULL<<14; - ras->miptbp2 = 1ULL<<54 | 1ULL<<34 | 1ULL<<14; - ras->tex1low = 0; // one mipmap level - - // find out number of pages needed - nPagW = (width + pageWidth-1)/pageWidth; - nPagH = (height + pageHeight-1)/pageHeight; - - // calculate buffer width in units of pixels/64 - bufferBase[0] = 0; - trxpos_hi[0] = 0; - bufferWidth[0] = nPagW*pageWidth / 64; - - // calculate whole buffer size in words - ras->totalSize = nPagW*nPagH*WD2PG; - - // calculate palette offset on GS in units of words/64 - if(ras->paletteSize){ - // Maximum palette size is 256 words. - // If there is still room, use it! - // If dimensions don't fill a page, we have at least - // half a page left, enough for any palette -//TODO: this was not always done it seems but even gta3's 3.1 seems to?? - if(pageWidth*nPagW > width || - pageHeight*nPagH > height){ - ras->paletteBase = (ras->totalSize - 256) / WD2BLK; - }else{ - // Otherwise allocate more space... - ras->paletteBase = ras->totalSize / WD2BLK; - // ...using the same calculation as above. - // WHY? we never need more than one page! - nPagW = (paletteWidth + palettePagewidth-1)/palettePagewidth; - nPagH = (paletteHeight + palettePageheight-1)/palettePageheight; - ras->totalSize += nPagW*nPagH*WD2PG; - } - }else - ras->paletteBase = 0; - } - ras->tex0 = tbw << 14 | - psm << 20 | - tw << 26 | - th << 30 | - tcc << 34 | - cpsm << 51 | - 0ULL << 55 | // csm0 - 0ULL << 56 | // entry offset - cld << 61; - - - - // allocate data and fill with GIF packets - ras->pixelSize = ALIGN16(ras->pixelSize); - int32 numLevels = MAXLEVEL(ras)+1; - // No GIF packet because we either don't want it (pre 0x310 rasters) - // or the data wouldn't fit into a DMA packet - if(noNewStyleRasters || - (raster->width*raster->height*raster->depth/8/0x10) >= 0x7FFF){ - ras->dataSize = ras->paletteSize+ras->pixelSize; - uint8 *data = (uint8*)mallocalign(ras->dataSize, 0x40); - assert(data); - ras->data = data; - raster->pixels = data; - if(ras->paletteSize) - raster->palette = data + ras->pixelSize; - if(raster->depth == 8) - ras->flags |= Ps2Raster::SWIZZLED8; - }else{ - ras->flags |= Ps2Raster::NEWSTYLE; - uint64 paltrxpos = 0; - uint32 dsax = trxpos_hi[numLevels-1] & 0x7FF; - uint32 dsay = trxpos_hi[numLevels-1]>>16 & 0x7FF; - // Set swizzle flags and calculate TRXPOS for palette - if(psm == PSMT8){ - ras->flags |= Ps2Raster::SWIZZLED8; - if(cpsm == PSMCT32 && bufferWidth[numLevels-1] == 2){ // one page - // unswizzle the starting block of the last buffer and palette - uint32 bufbase_B = (bufferBase[numLevels-1]&~0x1F) | (uint64)blockmaprev_PSMCT32[bufferBase[numLevels-1]&0x1F]; - uint32 palbase_B = (ras->paletteBase&~0x1F) | (uint64)blockmaprev_PSMCT32[ras->paletteBase&0x1F]; - // find start of page of last level (16,16 are PSMT8 block dimensions) - uint32 page_B = bufbase_B - 8*(dsay/16) - dsax/16; - // find palette DSAX/Y (in PSMCT32!) - dsay = (palbase_B - page_B)/8 * 8; // block/blocksPerPageX * blockHeight - dsax = (palbase_B - page_B)*8 % 64; // block*blockWidth % pageWidth - if(dsay < 0x800) - paltrxpos = dsay<<16 | dsax; - } - } - if(psm == PSMT4){ - // swizzle flag depends on version :/ - // but which version? .... - if(rw::version > 0x31000){ - ras->flags |= Ps2Raster::SWIZZLED4; - // Where can this come from? if anything we're using PSMCT16S - // Looks like they wanted to swizzle palettes too... - if(cpsm == PSMCT16){ - // unswizzle the starting block of the last buffer and palette - uint32 bufbase_B = (bufferBase[numLevels-1]&~0x1F) | (uint64)blockmaprev_PSMCT16[bufferBase[numLevels-1]&0x1F]; - uint32 palbase_B = (ras->paletteBase&~0x1F) | (uint64)blockmaprev_PSMCT16[ras->paletteBase&0x1F]; - // find start of page of last level (32,16 are PSMT4 block dimensions) - uint32 page_B = bufbase_B - 4*(dsay/32) - dsax/16; - // find palette DSAX/Y (in PSMCT16!) - dsay = (palbase_B - page_B)/4 * 8; // block/blocksPerPageX * blockHeight - dsax = (palbase_B - page_B)*16 % 128; // block*blockWidth % pageWidth - if(dsay < 0x800) - paltrxpos = dsay<<16 | dsax; - } - } - } - ras->pixelSize = 0x50*numLevels; // GIF packets - int32 minW, minH; - transferMinSize(psm, ras->flags, &minW, &minH); - w = raster->width; - h = raster->height; - n = numLevels; - while(n--){ - mipw = max(w, minW); - miph = max(h, minH); - ras->pixelSize += ALIGN16(mipw*miph*raster->depth/8); - w /= 2; - h /= 2; - } - if(ras->paletteSize){ - if(rw::version > 0x31000 && paletteHeight == 2) - paletteHeight = 3; - ras->paletteSize = 0x50 + - paletteDepth*paletteWidth*paletteHeight; - } - // One transfer per buffer width, 4 qwords: - // DMAcnt(2) [NOP, DIRECT] - // GIF tag A+D - // BITBLTBUF - // DMAref(pixel data) [NOP, DIRECT] - uint32 extrasize = 0x10; // PixelPtr - int32 numTransfers = 0; - for(n = 0; n < numLevels; n++) - if(trxpos_hi[n] == 0){ - extrasize += 0x40; - numTransfers++; - } - if(ras->paletteSize){ - extrasize += 0x40; - numTransfers++; - } - // What happens here? - if(ras->paletteSize && paltrxpos == 0) - ras->dataSize = ALIGN(ras->pixelSize,128) + ALIGN(ras->paletteSize,64) + extrasize + 0x70; - else - ras->dataSize = ALIGN(ras->paletteSize+ras->pixelSize,64) + extrasize + 0x70; - uint8 *data = (uint8*)mallocalign(ras->dataSize, 0x40); - uint32 *xferchain = (uint32*)(data + 0x10); - assert(data); - ras->data = data; - Ps2Raster::PixelPtr *pp = (Ps2Raster::PixelPtr*)data; - pp->numTransfers = numTransfers; - pp->numTotalTransfers = numTransfers; - pp->pixels = (uint8*)ALIGN((uintptr)data + extrasize, 128); - raster->pixels = (uint8*)pp; - if(ras->paletteSize) - raster->palette = pp->pixels + ALIGN(ras->pixelSize, 128) + 0x50; - uint32 *p = (uint32*)pp->pixels; - w = raster->width; - h = raster->height; - for(n = 0; n < numLevels; n++){ - mipw = max(w, minW); - miph = max(h, minH); - - // GIF tag - *p++ = 3; // NLOOP = 3 - *p++ = 0x10000000; // NREG = 1 - *p++ = 0xE; // A+D - *p++ = 0; - - // TRXPOS - if((ras->flags & Ps2Raster::SWIZZLED8 && psm == PSMT8) || - (ras->flags & Ps2Raster::SWIZZLED4 && psm == PSMT4)){ - *p++ = 0; // SSAX/Y is always 0 - *p++ = (trxpos_hi[n] & ~0x10001)/2; // divide both DSAX/Y by 2 - }else{ - *p++ = 0; - *p++ = trxpos_hi[n]; - } - *p++ = 0x51; - *p++ = 0; - - // TRXREG - if((ras->flags & Ps2Raster::SWIZZLED8 && psm == PSMT8) || - (ras->flags & Ps2Raster::SWIZZLED4 && psm == PSMT4)){ - *p++ = mipw/2; - *p++ = miph/2; - }else{ - *p++ = mipw; - *p++ = miph; - } - *p++ = 0x52; - *p++ = 0; - - // TRXDIR - *p++ = 0; // host -> local - *p++ = 0; - *p++ = 0x53; - *p++ = 0; - - // GIF tag - uint32 sz = ALIGN16(mipw*miph*raster->depth/8)/16; - *p++ = sz & 0x7FFF; - *p++ = 0x08000000; // IMAGE - *p++ = 0; - *p++ = 0; - - if(trxpos_hi[n] == 0){ - // Add a transfer, see above for layout - - *xferchain++ = 0x10000002; // DMAcnt, 2 qwords - *xferchain++ = 0; - *xferchain++ = 0; // VIF nop - *xferchain++ = 0x50000002; // VIF DIRECT 2 qwords - - // GIF tag - *xferchain++ = 1; // NLOOP = 1 - *xferchain++ = 0x10000000; // NREG = 1 - *xferchain++ = 0xE; // A+D - *xferchain++ = 0; - - // BITBLTBUF - if(ras->flags & Ps2Raster::SWIZZLED8 && psm == PSMT8){ - // PSMT8 is swizzled to PSMCT32 and dimensions are halved - *xferchain++ = PSMCT32<<24 | bufferWidth[n]/2<<16; // src buffer - *xferchain++ = PSMCT32<<24 | bufferWidth[n]/2<<16 | bufferBase[n]; // dst buffer - }else if(ras->flags & Ps2Raster::SWIZZLED4 && psm == PSMT4){ - // PSMT4 is swizzled to PSMCT16 and dimensions are halved - *xferchain++ = PSMCT16<<24 | bufferWidth[n]/2<<16; // src buffer - *xferchain++ = PSMCT16<<24 | bufferWidth[n]/2<<16 | bufferBase[n]; // dst buffer - }else{ - *xferchain++ = psm<<24 | bufferWidth[n]<<16; // src buffer - *xferchain++ = psm<<24 | bufferWidth[n]<<16 | bufferBase[n]; // dst buffer - } - *xferchain++ = 0x50; - *xferchain++ = 0; - - *xferchain++ = 0x30000000 | sz+5; // DMAref - // this obviously only works with 32 bit pointers, but it's only needed on the PS2 anyway - *xferchain++ = (uint32)(uintptr)p - 0x50; - *xferchain++ = 0; // VIF nop - *xferchain++ = 0x50000000 | sz+5; // VIF DIRECT 2 qwords - }else{ - // Add to existing transfer - xferchain[-4] = 0x30000000 | (xferchain[-4]&0xFFFF) + sz+5; // last DMAref - xferchain[-1] = 0x50000000 | (xferchain[-1]&0xFFFF) + sz+5; // last DIRECT - } - - p += sz*4; - w /= 2; - h /= 2; - } - - if(ras->paletteSize){ - // huh? - if(paltrxpos) - raster->palette = (uint8*)p + 0x50; - p = (uint32*)(raster->palette - 0x50); - // GIF tag - *p++ = 3; // NLOOP = 3 - *p++ = 0x10000000; // NREG = 1 - *p++ = 0xE; // A+D - *p++ = 0; - - // TRXPOS - *(uint64*)p = paltrxpos; - p += 2; - *p++ = 0x51; - *p++ = 0; - - // TRXREG - *p++ = paletteWidth; - *p++ = paletteHeight; - *p++ = 0x52; - *p++ = 0; - - // TRXDIR - *p++ = 0; // host -> local - *p++ = 0; - *p++ = 0x53; - *p++ = 0; - - // GIF tag - uint32 sz = ALIGN16(ras->paletteSize - 0x50)/16; - *p++ = sz & 0x7FFF; - *p++ = 0x08000000; // IMAGE - *p++ = 0; - *p++ = 0; - - // Transfer - *xferchain++ = 0x10000002; // DMAcnt, 2 qwords - *xferchain++ = 0; - *xferchain++ = 0; // VIF nop - *xferchain++ = 0x50000002; // VIF DIRECT 2 qwords - - // GIF tag - *xferchain++ = 1; // NLOOP = 1 - *xferchain++ = 0x10000000; // NREG = 1 - *xferchain++ = 0xE; // A+D - *xferchain++ = 0; - - // BITBLTBUF - if(paltrxpos == 0){ - *xferchain++ = cpsm<<24 | 1<<16; // src buffer - *xferchain++ = cpsm<<24 | 1<<16 | ras->paletteBase; // dst buffer - *xferchain++ = 0x50; - *xferchain++ = 0; - }else{ - // copy last pixel bitbltbuf...if uploading palette separately it's still the same buffer - xferchain[0] = xferchain[-16]; - xferchain[1] = xferchain[-15]; - xferchain[2] = xferchain[-14]; - xferchain[3] = xferchain[-13]; - // Add to last transfer - xferchain[-16] = 0x30000000 | (xferchain[-16]&0xFFFF) + sz+5; // last DMAref - xferchain[-13] = 0x50000000 | (xferchain[-13]&0xFFFF) + sz+5; // last DIRECT - xferchain += 4; - pp->numTransfers--; - } - - *xferchain++ = 0x30000000 | sz+5; // DMAref - // this obviously only works with 32 bit pointers, but it's only needed on the PS2 anyway - *xferchain++ = (uint32)(uintptr)p - 0x50; - *xferchain++ = 0; // VIF nop - *xferchain++ = 0x50000000 | sz+5; // VIF DIRECT 2 qwords - } - } - raster->originalPixels = raster->pixels; - raster->originalStride = raster->stride; - if(ras->flags & Ps2Raster::NEWSTYLE) - raster->pixels = ((Ps2Raster::PixelPtr*)raster->pixels)->pixels + 0x50; - return raster; -} - -Raster* -rasterCreate(Raster *raster) -{ - if(!getRasterFormat(raster)) - return nil; - - // init raster - raster->pixels = nil; - raster->palette = nil; - raster->originalWidth = raster->width; - raster->originalHeight = raster->height; - raster->originalPixels = raster->pixels; - if(raster->width == 0 || raster->height == 0){ - raster->flags = Raster::DONTALLOCATE; - raster->stride = 0; - raster->originalStride = 0; - return raster; - } - - switch(raster->type){ - case Raster::NORMAL: - case Raster::TEXTURE: - return rasterCreateTexture(raster); - case Raster::ZBUFFER: - // TODO. only RW_PS2 - // get info from video mode - raster->flags = Raster::DONTALLOCATE; - return raster; - case Raster::CAMERA: - // TODO. only RW_PS2 - // get info from video mode - raster->flags = Raster::DONTALLOCATE; - return raster; - case Raster::CAMERATEXTURE: - // TODO. only RW_PS2 - // check width/height and fall through to texture - return nil; - } - return nil; -} - -static uint32 -swizzle(uint32 x, uint32 y, uint32 logw) -{ -#define X(n) ((x>>(n))&1) -#define Y(n) ((y>>(n))&1) - - uint32 nx, ny, n; - x ^= (Y(1)^Y(2))<<2; - nx = (x&7) | ((x>>1)&~7); - ny = (y&1) | ((y>>1)&~1); - n = Y(1) | X(3)<<1; - return n | nx<<2 | ny<<(logw-1+2); -} - -void -unswizzleRaster(Raster *raster) -{ - uint8 tmpbuf[1024*4]; // 1024x4px, maximum possible width - uint32 mask; - int32 x, y, w, h; - int32 i; - int32 logw; - Ps2Raster *natras = GETPS2RASTEREXT(raster); - uint8 *px; - - if((raster->format & (Raster::PAL4|Raster::PAL8)) == 0) - return; - - int minw, minh; - transferMinSize(raster->format & Raster::PAL4 ? PSMT4 : PSMT8, natras->flags, &minw, &minh); - w = max(raster->width, minw); - h = max(raster->height, minh); - px = raster->pixels; - logw = 0; - for(i = 1; i < w; i *= 2) logw++; - mask = (1<<(logw+2))-1; - - if(raster->format & Raster::PAL4 && natras->flags & Ps2Raster::SWIZZLED4){ - for(y = 0; y < h; y += 4){ - memcpy(tmpbuf, &px[y<<(logw-1)], 2*w); - for(i = 0; i < 4; i++) - for(x = 0; x < w; x++){ - uint32 a = ((y+i)<>1] >> 4 : tmpbuf[s>>1] & 0xF; - px[a>>1] = a & 1 ? (px[a>>1]&0xF) | c<<4 : (px[a>>1]&0xF0) | c; - } - } - }else if(raster->format & Raster::PAL8 && natras->flags & Ps2Raster::SWIZZLED8){ - for(y = 0; y < h; y += 4){ - memcpy(tmpbuf, &px[y<format & (Raster::PAL4|Raster::PAL8)) == 0) - return; - - int minw, minh; - transferMinSize(raster->format & Raster::PAL4 ? PSMT4 : PSMT8, natras->flags, &minw, &minh); - w = max(raster->width, minw); - h = max(raster->height, minh); - px = raster->pixels; - logw = 0; - for(i = 1; i < raster->width; i *= 2) logw++; - mask = (1<<(logw+2))-1; - - if(raster->format & Raster::PAL4 && natras->flags & Ps2Raster::SWIZZLED4){ - for(y = 0; y < h; y += 4){ - for(i = 0; i < 4; i++) - for(x = 0; x < w; x++){ - uint32 a = ((y+i)<>1] >> 4 : px[a>>1] & 0xF; - tmpbuf[s>>1] = s & 1 ? (tmpbuf[s>>1]&0xF) | c<<4 : (tmpbuf[s>>1]&0xF0) | c; - } - memcpy(&px[y<<(logw-1)], tmpbuf, 2*w); - } - }else if(raster->format & Raster::PAL8 && natras->flags & Ps2Raster::SWIZZLED8){ - for(y = 0; y < h; y += 4){ - for(i = 0; i < 4; i++) - for(x = 0; x < w; x++){ - uint32 a = ((y+i)<depth != 24); - - if(level > 0){ - int32 minw, minh; - int32 mipw, miph; - transferMinSize(raster->format & Raster::PAL4 ? PSMT4 : PSMT8, natras->flags, &minw, &minh); - while(level--){ - mipw = max(raster->width, minw); - miph = max(raster->height, minh); - raster->pixels += ALIGN16(mipw*miph*raster->depth/8) + 0x50; - raster->width /= 2; - raster->height /= 2; - } - } - - if((lockMode & Raster::LOCKNOFETCH) == 0) - unswizzleRaster(raster); - if(lockMode & Raster::LOCKREAD) raster->privateFlags |= Raster::PRIVATELOCK_READ; - if(lockMode & Raster::LOCKWRITE) raster->privateFlags |= Raster::PRIVATELOCK_WRITE; - return raster->pixels; -} - -void -rasterUnlock(Raster *raster, int32 level) -{ - Ps2Raster *natras = GETPS2RASTEREXT(raster); - if(raster->format & (Raster::PAL4 | Raster::PAL8)) - swizzleRaster(raster); - - raster->width = raster->originalWidth; - raster->height = raster->originalHeight; - raster->pixels = raster->originalPixels; - raster->stride = raster->originalStride; - if(natras->flags & Ps2Raster::NEWSTYLE) - raster->pixels = ((Ps2Raster::PixelPtr*)raster->pixels)->pixels + 0x50; - - raster->privateFlags &= ~(Raster::PRIVATELOCK_READ|Raster::PRIVATELOCK_WRITE); - // TODO: generate mipmaps -} - -static void -convertCSM1_16(uint32 *pal) -{ - int i, j; - uint32 tmp; - for(i = 0; i < 256; i++) - // palette index bits 0x08 and 0x10 are flipped - if((i & 0x18) == 0x10){ - j = i ^ 0x18; - tmp = pal[i]; - pal[i] = pal[j]; - pal[j] = tmp; - } -} - -static void -convertCSM1_32(uint32 *pal) -{ - int i, j; - uint32 tmp; - for(i = 0; i < 256; i++) - // palette index bits 0x08 and 0x10 are flipped - if((i & 0x18) == 0x10){ - j = i ^ 0x18; - tmp = pal[i]; - pal[i] = pal[j]; - pal[j] = tmp; - } -} - -static void -convertPalette(Raster *raster) -{ - if(raster->format & Raster::PAL8){ - if((raster->format & 0xF00) == Raster::C8888) - convertCSM1_32((uint32*)raster->palette); - else if((raster->format & 0xF00) == Raster::C8888) - convertCSM1_16((uint32*)raster->palette); - } -} - -// NB: RW doesn't convert the palette when locking/unlocking -uint8* -rasterLockPalette(Raster *raster, int32 lockMode) -{ - if((raster->format & (Raster::PAL4 | Raster::PAL8)) == 0) - return nil; - if((lockMode & Raster::LOCKNOFETCH) == 0) - convertPalette(raster); - if(lockMode & Raster::LOCKREAD) raster->privateFlags |= Raster::PRIVATELOCK_READ_PALETTE; - if(lockMode & Raster::LOCKWRITE) raster->privateFlags |= Raster::PRIVATELOCK_WRITE_PALETTE; - return raster->palette; -} - -void -rasterUnlockPalette(Raster *raster) -{ - if(raster->format & (Raster::PAL4 | Raster::PAL8)) - convertPalette(raster); - raster->privateFlags &= ~(Raster::PRIVATELOCK_READ_PALETTE|Raster::PRIVATELOCK_WRITE_PALETTE); -} - -// Almost the same as d3d9 and gl3 function -bool32 -imageFindRasterFormat(Image *img, int32 type, - int32 *pWidth, int32 *pHeight, int32 *pDepth, int32 *pFormat) -{ - int32 width, height, depth, format; - - assert((type&0xF) == Raster::TEXTURE); - - for(width = 1; width < img->width; width <<= 1); - for(height = 1; height < img->height; height <<= 1); - - depth = img->depth; - - switch(depth){ - case 32: - case 24: - // C888 24 bit is unsafe - format = Raster::C8888; - depth = 32; - break; - case 16: - format = Raster::C1555; - break; - case 8: - format = Raster::PAL8 | Raster::C8888; - break; - case 4: - format = Raster::PAL4 | Raster::C8888; - break; - default: - RWERROR((ERR_INVRASTER)); - return 0; - } - - format |= type; - - *pWidth = width; - *pHeight = height; - *pDepth = depth; - *pFormat = format; - - return 1; -} - -bool32 -rasterFromImage(Raster *raster, Image *image) -{ - Ps2Raster *natras = GETPS2RASTEREXT(raster); - - int32 pallength = 0; - switch(image->depth){ - case 24: - case 32: - if(raster->format != Raster::C8888 && - raster->format != Raster::C888) // unsafe already - goto err; - break; - case 16: - if(raster->format != Raster::C1555) goto err; - break; - case 8: - if(raster->format != (Raster::PAL8 | Raster::C8888)) goto err; - pallength = 256; - break; - case 4: - if(raster->format != (Raster::PAL4 | Raster::C8888)) goto err; - pallength = 16; - break; - default: - err: - RWERROR((ERR_INVRASTER)); - return 0; - } - - // unsafe - if((raster->format&0xF00) == Raster::C888){ - RWERROR((ERR_INVRASTER)); - return 0; - } - - uint8 *in, *out; - if(image->depth <= 8){ - in = image->palette; - out = raster->lockPalette(Raster::LOCKWRITE|Raster::LOCKNOFETCH); - memcpy(out, in, 4*pallength); - for(int32 i = 0; i < pallength; i++){ - out[3] = out[3]*128/255; - out += 4; - } - raster->unlockPalette(); - } - - int minw, minh; - int tw; - transferMinSize(image->depth == 4 ? PSMT4 : PSMT8, natras->flags, &minw, &minh); - tw = max(image->width, minw); - uint8 *src = image->pixels; - out = raster->lock(0, Raster::LOCKWRITE|Raster::LOCKNOFETCH); - if(image->depth == 4){ - compressPal4(out, tw/2, src, image->stride, image->width, image->height); - }else if(image->depth == 8){ - copyPal8(out, tw, src, image->stride, image->width, image->height); - }else{ - for(int32 y = 0; y < image->height; y++){ - in = src; - for(int32 x = 0; x < image->width; x++){ - switch(image->depth){ - case 16: - conv_ARGB1555_from_ABGR1555(out, in); - out += 2; - break; - case 24: - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - out[3] = 0x80; - out += 4; - break; - case 32: - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - out[3] = in[3]*128/255; - out += 4; - break; - } - in += image->bpp; - } - src += image->stride; - } - } - raster->unlock(0); - return 1; -} - -Image* -rasterToImage(Raster *raster) -{ - Image *image; - int depth; - Ps2Raster *natras = GETPS2RASTEREXT(raster); - - int32 rasterFormat = raster->format & 0xF00; - switch(rasterFormat){ - case Raster::C1555: - depth = 16; - break; - case Raster::C8888: - depth = 32; - break; - case Raster::C888: - depth = 24; - break; - case Raster::C555: - depth = 16; - break; - - default: - case Raster::C565: - case Raster::C4444: - case Raster::LUM8: - assert(0 && "unsupported ps2 raster format"); - } - int32 pallength = 0; - if((raster->format & Raster::PAL4) == Raster::PAL4){ - depth = 4; - pallength = 16; - }else if((raster->format & Raster::PAL8) == Raster::PAL8){ - depth = 8; - pallength = 256; - } - - uint8 *in, *out; - image = Image::create(raster->width, raster->height, depth); - image->allocate(); - - if(pallength){ - out = image->palette; - in = raster->lockPalette(Raster::LOCKREAD); - if(rasterFormat == Raster::C8888){ - memcpy(out, in, pallength*4); - for(int32 i = 0; i < pallength; i++){ - out[3] = out[3]*255/128; - out += 4; - } - }else - memcpy(out, in, pallength*2); - raster->unlockPalette(); - } - - int minw, minh; - int tw; - transferMinSize(depth == 4 ? PSMT4 : PSMT8, natras->flags, &minw, &minh); - tw = max(raster->width, minw); - uint8 *dst = image->pixels; - in = raster->lock(0, Raster::LOCKREAD); - if(depth == 4){ - expandPal4(dst, image->stride, in, tw/2, raster->width, raster->height); - }else if(depth == 8){ - copyPal8(dst, image->stride, in, tw, raster->width, raster->height); - }else{ - for(int32 y = 0; y < image->height; y++){ - out = dst; - for(int32 x = 0; x < image->width; x++){ - switch(raster->format & 0xF00){ - case Raster::C8888: - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - out[3] = in[3]*255/128; - in += 4; - break; - case Raster::C888: - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - in += 4; - break; - case Raster::C1555: - conv_ARGB1555_from_ABGR1555(out, in); - in += 2; - break; - case Raster::C555: - conv_ARGB1555_from_ABGR1555(out, in); - out[1] |= 0x80; - in += 2; - break; - default: - assert(0 && "unknown ps2 raster format"); - break; - } - out += image->bpp; - } - dst += image->stride; - } - } - raster->unlock(0); - - return image; -} - -int32 -rasterNumLevels(Raster *raster) -{ - Ps2Raster *ras = GETPS2RASTEREXT(raster); - if(raster->pixels == nil) return 0; - if(raster->format & Raster::MIPMAP) - return MAXLEVEL(ras)+1; - return 1; -} - -static void* -createNativeRaster(void *object, int32 offset, int32) -{ - Ps2Raster *raster = GETPS2RASTEREXT(object); - raster->tex0 = 0; - raster->paletteBase = 0; - raster->kl = defaultMipMapKL; - raster->tex1low = 0; - raster->unk2 = 0; - raster->miptbp1 = 0; - raster->miptbp2 = 0; - raster->pixelSize = 0; - raster->paletteSize = 0; - raster->totalSize = 0; - raster->flags = 0; - - raster->dataSize = 0; - raster->data = nil; - return object; -} - -static void* -destroyNativeRaster(void *object, int32 offset, int32) -{ - Ps2Raster *raster = GETPS2RASTEREXT(object); - freealign(raster->data); - return object; -} - -static void* -copyNativeRaster(void *dst, void *src, int32 offset, int32) -{ - Ps2Raster *dstraster = GETPS2RASTEREXT(dst); - Ps2Raster *srcraster = GETPS2RASTEREXT(src); - *dstraster = *srcraster; - return dst; -} - -static Stream* -readMipmap(Stream *stream, int32, void *object, int32 offset, int32) -{ - uint16 val = stream->readI32(); - Texture *tex = (Texture*)object; - if(tex->raster == nil) - return stream; - Ps2Raster *raster = GETPS2RASTEREXT(tex->raster); - raster->kl = val; - return stream; -} - -static Stream* -writeMipmap(Stream *stream, int32, void *object, int32 offset, int32) -{ - Texture *tex = (Texture*)object; - if(tex->raster){ - stream->writeI32(defaultMipMapKL); - return stream; - } - Ps2Raster *raster = GETPS2RASTEREXT(tex->raster); - stream->writeI32(raster->kl); - return stream; -} - -static int32 -getSizeMipmap(void*, int32, int32) -{ - return rw::platform == PLATFORM_PS2 ? 4 : 0; -} - -void -registerNativeRaster(void) -{ - nativeRasterOffset = Raster::registerPlugin(sizeof(Ps2Raster), - ID_RASTERPS2, - createNativeRaster, - destroyNativeRaster, - copyNativeRaster); - - Texture::registerPlugin(0, ID_SKYMIPMAP, nil, nil, nil); - Texture::registerPluginStream(ID_SKYMIPMAP, readMipmap, writeMipmap, getSizeMipmap); -} - -void -printTEX0(uint64 tex0) -{ - printf("%016lX ", tex0); - uint32 tbp0 = tex0 & 0x3FFF; tex0 >>= 14; - uint32 tbw = tex0 & 0x3F; tex0 >>= 6; - uint32 psm = tex0 & 0x3F; tex0 >>= 6; - uint32 tw = tex0 & 0xF; tex0 >>= 4; - uint32 th = tex0 & 0xF; tex0 >>= 4; - uint32 tcc = tex0 & 0x1; tex0 >>= 1; - uint32 tfx = tex0 & 0x3; tex0 >>= 2; - uint32 cbp = tex0 & 0x3FFF; tex0 >>= 14; - uint32 cpsm = tex0 & 0xF; tex0 >>= 4; - uint32 csm = tex0 & 0x1; tex0 >>= 1; - uint32 csa = tex0 & 0x1F; tex0 >>= 5; - uint32 cld = tex0 & 0x7; - printf("TBP0:%4X TBW:%2X PSM:%2X TW:%X TH:%X TCC:%X TFX:%X CBP:%4X CPSM:%X CSM:%X CSA:%2X CLD:%X\n", - tbp0, tbw, psm, tw, th, tcc, tfx, cbp, cpsm, csm, csa, cld); -} - -void -printTEX1(uint64 tex1) -{ - printf("%016lX ", tex1); - uint32 lcm = tex1 & 0x1; tex1 >>= 2; - uint32 mxl = tex1 & 0x7; tex1 >>= 3; - uint32 mmag = tex1 & 0x1; tex1 >>= 1; - uint32 mmin = tex1 & 0x7; tex1 >>= 3; - uint32 mtba = tex1 & 0x1; tex1 >>= 10; - uint32 l = tex1 & 0x3; tex1 >>= 13; - uint32 k = tex1 & 0xFFF; - printf("LCM:%X MXL:%X MMAG:%X MMIN:%X MTBA:%X L:%X K:%X\n", - lcm, mxl, mmag, mmin, mtba, l, k); -} - -void -calcTEX1(Raster *raster, uint64 *tex1, int32 filter) -{ - enum { - NEAREST = 0, - LINEAR, - NEAREST_MIPMAP_NEAREST, - NEAREST_MIPMAP_LINEAR, - LINEAR_MIPMAP_NEAREST, - LINEAR_MIPMAP_LINEAR, - }; - Ps2Raster *natras = GETPS2RASTEREXT(raster); - uint64 t1 = natras->tex1low; - uint64 k = natras->kl & 0xFFF; - uint64 l = (natras->kl >> 12) & 0x3; - t1 |= k << 32; - t1 |= l << 19; - switch(filter){ - case Texture::NEAREST: - t1 |= (NEAREST << 5) | - (NEAREST << 6); - break; - case Texture::LINEAR: - t1 |= (LINEAR << 5) | - (LINEAR << 6); - break; - case Texture::MIPNEAREST: - t1 |= (NEAREST << 5) | - (NEAREST_MIPMAP_NEAREST << 6); - break; - case Texture::MIPLINEAR: - t1 |= (LINEAR << 5) | - (LINEAR_MIPMAP_NEAREST << 6); - break; - case Texture::LINEARMIPNEAREST: - t1 |= (NEAREST << 5) | - (NEAREST_MIPMAP_LINEAR << 6); - break; - case Texture::LINEARMIPLINEAR: - t1 |= (LINEAR << 5) | - (LINEAR_MIPMAP_LINEAR << 6); - break; - } - *tex1 = t1; -} - -struct StreamRasterExt -{ - int32 width; - int32 height; - int32 depth; - uint16 rasterFormat; - int16 version; - uint64 tex0; - uint32 paletteOffset; - uint32 tex1low; - uint64 miptbp1; - uint64 miptbp2; - uint32 pixelSize; - uint32 paletteSize; - uint32 totalSize; - uint32 mipmapVal; -}; - -Texture* -readNativeTexture(Stream *stream) -{ - uint32 length, oldversion, version; - uint32 fourcc; - Raster *raster; - Ps2Raster *natras; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - fourcc = stream->readU32(); - if(fourcc != FOURCC_PS2){ - RWERROR((ERR_PLATFORM, fourcc)); - return nil; - } - Texture *tex = Texture::create(nil); - if(tex == nil) - return nil; - - // Texture - tex->filterAddressing = stream->readU32(); - if(!findChunk(stream, ID_STRING, &length, nil)){ - RWERROR((ERR_CHUNK, "STRING")); - goto fail; - } - stream->read8(tex->name, length); - if(!findChunk(stream, ID_STRING, &length, nil)){ - RWERROR((ERR_CHUNK, "STRING")); - goto fail; - } - stream->read8(tex->mask, length); - - // Raster - StreamRasterExt streamExt; - oldversion = rw::version; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - goto fail; - } - if(!findChunk(stream, ID_STRUCT, nil, &version)){ - RWERROR((ERR_CHUNK, "STRUCT")); - goto fail; - } - ASSERTLITTLE; - stream->read8(&streamExt, 0x40); -/* -printf("%X %X %X %X %X %016llX %X %X %016llX %016llX %X %X %X %X\n", -streamExt.width, -streamExt.height, -streamExt.depth, -streamExt.rasterFormat, -streamExt.version, -streamExt.tex0, -streamExt.paletteOffset, -streamExt.tex1low, -streamExt.miptbp1, -streamExt.miptbp2, -streamExt.pixelSize, -streamExt.paletteSize, -streamExt.totalSize, -streamExt.mipmapVal); -*/ - noNewStyleRasters = streamExt.version < 2; - rw::version = version; - raster = Raster::create(streamExt.width, streamExt.height, - streamExt.depth, streamExt.rasterFormat, - PLATFORM_PS2); - noNewStyleRasters = 0; - rw::version = oldversion; - tex->raster = raster; - natras = GETPS2RASTEREXT(raster); -//printf("%X %X\n", natras->paletteBase, natras->tex1low); -// printf("%08X%08X %08X%08X %08X%08X\n", -// (uint32)natras->tex0, (uint32)(natras->tex0>>32), -// (uint32)natras->miptbp1, (uint32)(natras->miptbp1>>32), -// (uint32)natras->miptbp2, (uint32)(natras->miptbp2>>32)); -// printTEX0(natras->tex0); - uint64 tex1; - calcTEX1(raster, &tex1, tex->filterAddressing & 0xF); -// printTEX1(tex1); - - // TODO: GTA SA LD_OTB.txd loses here - assert(natras->pixelSize >= streamExt.pixelSize); - assert(natras->paletteSize >= streamExt.paletteSize); - -//if(natras->tex0 != streamExt.tex0){ -//printf("TEX0: %016llX\n %016llX\n", natras->tex0, streamExt.tex0); -//printTEX0(natras->tex0); -//printTEX0(streamExt.tex0); -//fflush(stdout); -//} -//if(natras->tex1low != streamExt.tex1low) -//printf("TEX1: %08X\n %08X\n", natras->tex1low, streamExt.tex1low); -//if(natras->miptbp1 != streamExt.miptbp1) -//printf("MIP1: %016llX\n %016llX\n", natras->miptbp1, streamExt.miptbp1); -//if(natras->miptbp2 != streamExt.miptbp2) -//printf("MIP2: %016llX\n %016llX\n", natras->miptbp2, streamExt.miptbp2); -//if(natras->paletteBase != streamExt.paletteOffset) -//printf("PAL: %08X\n %08X\n", natras->paletteBase, streamExt.paletteOffset); -//if(natras->pixelSize != streamExt.pixelSize) -//printf("PXS: %08X\n %08X\n", natras->pixelSize, streamExt.pixelSize); -//if(natras->paletteSize != streamExt.paletteSize) -//printf("PLS: %08X\n %08X\n", natras->paletteSize, streamExt.paletteSize); -//if(natras->totalSize != streamExt.totalSize) -//printf("TSZ: %08X\n %08X\n", natras->totalSize, streamExt.totalSize); - - // junk addresses, no need to store them - streamExt.tex0 &= ~0x3FFFULL; - streamExt.tex0 &= ~(0x3FFFULL << 37); - - assert(natras->tex0 == streamExt.tex0); - natras->tex0 = streamExt.tex0; - assert(natras->paletteBase == streamExt.paletteOffset); - natras->paletteBase = streamExt.paletteOffset; - assert(natras->tex1low == streamExt.tex1low); - natras->tex1low = streamExt.tex1low; - assert(natras->miptbp1 == streamExt.miptbp1); - natras->miptbp1 = streamExt.miptbp1; - assert(natras->miptbp2 == streamExt.miptbp2); - natras->miptbp2 = streamExt.miptbp2; - assert(natras->pixelSize == streamExt.pixelSize); - natras->pixelSize = streamExt.pixelSize; - assert(natras->paletteSize == streamExt.paletteSize); - natras->paletteSize = streamExt.paletteSize; - assert(natras->totalSize == streamExt.totalSize); - natras->totalSize = streamExt.totalSize; - natras->kl = streamExt.mipmapVal; -//printf("%X %X\n", natras->paletteBase, natras->tex1low); -// printf("%08X%08X %08X%08X %08X%08X\n", -// (uint32)natras->tex0, (uint32)(natras->tex0>>32), -// (uint32)natras->miptbp1, (uint32)(natras->miptbp1>>32), -// (uint32)natras->miptbp2, (uint32)(natras->miptbp2>>32)); -// printTEX0(natras->tex0); - calcTEX1(raster, &tex1, tex->filterAddressing & 0xF); -// printTEX1(tex1); - - // this is weird stuff - if(streamExt.version < 2){ - if(streamExt.version == 1){ - // Version 1 has swizzled 8 bit textures - if(!(natras->flags & Ps2Raster::NEWSTYLE)) - natras->flags |= Ps2Raster::SWIZZLED8; - else - assert(0 && "can't happen"); - }else{ - // Version 0 has no swizzling at all - if(!(natras->flags & Ps2Raster::NEWSTYLE)) - natras->flags &= ~Ps2Raster::SWIZZLED8; - else - assert(0 && "can't happen"); - } - } - - if(!findChunk(stream, ID_STRUCT, &length, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - goto fail; - } - if(streamExt.version < 2){ - stream->read8(raster->pixels, length); - }else{ - stream->read8(((Ps2Raster::PixelPtr*)raster->originalPixels)->pixels, natras->pixelSize); - stream->read8(raster->palette-0x50, natras->paletteSize); - } -//printf("\n"); - return tex; - -fail: - tex->destroy(); - return nil; -} - -void -writeNativeTexture(Texture *tex, Stream *stream) -{ - Raster *raster = tex->raster; - Ps2Raster *ras = GETPS2RASTEREXT(raster); - writeChunkHeader(stream, ID_STRUCT, 8); - stream->writeU32(FOURCC_PS2); - stream->writeU32(tex->filterAddressing); - int32 len = strlen(tex->name)+4 & ~3; - writeChunkHeader(stream, ID_STRING, len); - stream->write8(tex->name, len); - len = strlen(tex->mask)+4 & ~3; - writeChunkHeader(stream, ID_STRING, len); - stream->write8(tex->mask, len); - - int32 sz = ras->pixelSize + ras->paletteSize; - writeChunkHeader(stream, ID_STRUCT, 12 + 64 + 12 + sz); - writeChunkHeader(stream, ID_STRUCT, 64); - StreamRasterExt streamExt; - streamExt.width = raster->width; - streamExt.height = raster->height; - streamExt.depth = raster->depth; - streamExt.rasterFormat = raster->format | raster->type; - streamExt.version = 0; - if(ras->flags == Ps2Raster::SWIZZLED8 && raster->depth == 8) - streamExt.version = 1; - if(ras->flags & Ps2Raster::NEWSTYLE) - streamExt.version = 2; - streamExt.tex0 = ras->tex0; - streamExt.paletteOffset = ras->paletteBase; - streamExt.tex1low = ras->tex1low; - streamExt.miptbp1 = ras->miptbp1; - streamExt.miptbp2 = ras->miptbp2; - streamExt.pixelSize = ras->pixelSize; - streamExt.paletteSize = ras->paletteSize; - streamExt.totalSize = ras->totalSize; - streamExt.mipmapVal = ras->kl; - ASSERTLITTLE; - stream->write8(&streamExt, 64); - - writeChunkHeader(stream, ID_STRUCT, sz); - if(streamExt.version < 2){ - stream->write8(raster->pixels, sz); - }else{ - stream->write8(((Ps2Raster::PixelPtr*)raster->originalPixels)->pixels, ras->pixelSize); - stream->write8(raster->palette-0x50, ras->paletteSize); - } -} - -uint32 -getSizeNativeTexture(Texture *tex) -{ - uint32 size = 12 + 8; - size += 12 + strlen(tex->name)+4 & ~3; - size += 12 + strlen(tex->mask)+4 & ~3; - size += 12; - size += 12 + 64; - Ps2Raster *ras = GETPS2RASTEREXT(tex->raster); - size += 12 + ras->pixelSize + ras->paletteSize; - return size; -} - -} -} diff --git a/vendor/librw/src/ps2/ps2skin.cpp b/vendor/librw/src/ps2/ps2skin.cpp deleted file mode 100644 index d4c9d79..0000000 --- a/vendor/librw/src/ps2/ps2skin.cpp +++ /dev/null @@ -1,334 +0,0 @@ -#include -#include -#include -#include - -#include "../rwbase.h" -#include "../rwerror.h" -#include "../rwplg.h" -#include "../rwpipeline.h" -#include "../rwobjects.h" -#include "../rwanim.h" -#include "../rwengine.h" -#include "../rwplugins.h" -#include "rwps2.h" -#include "rwps2plg.h" - -#include "rwps2impl.h" - -#define PLUGIN_ID ID_SKIN - -namespace rw { -namespace ps2 { - -static void* -skinOpen(void *o, int32, int32) -{ - skinGlobals.pipelines[PLATFORM_PS2] = makeSkinPipeline(); - return o; -} - -static void* -skinClose(void *o, int32, int32) -{ - ((ObjPipeline*)skinGlobals.pipelines[PLATFORM_PS2])->groupPipeline->destroy(); - ((ObjPipeline*)skinGlobals.pipelines[PLATFORM_PS2])->groupPipeline = nil; - ((ObjPipeline*)skinGlobals.pipelines[PLATFORM_PS2])->destroy(); - skinGlobals.pipelines[PLATFORM_PS2] = nil; - return o; -} - -void -initSkin(void) -{ - Driver::registerPlugin(PLATFORM_PS2, 0, ID_SKIN, - skinOpen, skinClose); -} - -ObjPipeline* -makeSkinPipeline(void) -{ - MatPipeline *pipe = MatPipeline::create(); - pipe->pluginID = ID_SKIN; - pipe->pluginData = 1; - pipe->attribs[AT_XYZ] = &attribXYZ; - pipe->attribs[AT_UV] = &attribUV; - pipe->attribs[AT_RGBA] = &attribRGBA; - pipe->attribs[AT_NORMAL] = &attribNormal; - pipe->attribs[AT_NORMAL+1] = &attribWeights; - uint32 vertCount = MatPipeline::getVertCount(VU_Lights-0x100, 5, 3, 2); - pipe->setTriBufferSizes(5, vertCount); - pipe->vifOffset = pipe->inputStride*vertCount; - pipe->instanceCB = skinInstanceCB; - pipe->uninstanceCB = genericUninstanceCB; - pipe->preUninstCB = skinPreCB; - pipe->postUninstCB = skinPostCB; - - ObjPipeline *opipe = ObjPipeline::create(); - opipe->pluginID = ID_SKIN; - opipe->pluginData = 1; - opipe->groupPipeline = pipe; - return opipe; -} - -Stream* -readNativeSkin(Stream *stream, int32, void *object, int32 offset) -{ - uint8 header[4]; - Geometry *geometry = (Geometry*)object; - uint32 platform; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - platform = stream->readU32(); - if(platform != PLATFORM_PS2){ - RWERROR((ERR_PLATFORM, platform)); - return nil; - } - stream->read8(header, 4); - Skin *skin = rwNewT(Skin, 1, MEMDUR_EVENT | ID_SKIN); - *PLUGINOFFSET(Skin*, geometry, offset) = skin; - - // numUsedBones and numWeights appear in/after 34003 - // but not in/before 33002 (probably rw::version >= 0x34000) - bool oldFormat = header[1] == 0; - - // Use numBones for numUsedBones to allocate data - if(oldFormat) - skin->init(header[0], header[0], 0); - else - skin->init(header[0], header[1], 0); - skin->numWeights = header[2]; - - if(!oldFormat) - stream->read8(skin->usedBones, skin->numUsedBones); - if(skin->numBones) - stream->read32(skin->inverseMatrices, skin->numBones*64); - - // dummy data in case we need to write data in the new format - if(oldFormat){ - skin->numWeights = 4; - for(int32 i = 0; i < skin->numUsedBones; i++) - skin->usedBones[i] = i; - } - - if(!oldFormat){ - // TODO: what is this? - stream->seek(4*4); - - readSkinSplitData(stream, skin); - } - return stream; -} - -Stream* -writeNativeSkin(Stream *stream, int32 len, void *object, int32 offset) -{ - uint8 header[4]; - - writeChunkHeader(stream, ID_STRUCT, len-12); - stream->writeU32(PLATFORM_PS2); - Skin *skin = *PLUGINOFFSET(Skin*, object, offset); - // not sure which version introduced the new format - bool oldFormat = version < 0x34000; - header[0] = skin->numBones; - if(oldFormat){ - header[1] = 0; - header[2] = 0; - }else{ - header[1] = skin->numUsedBones; - header[2] = skin->numWeights; - } - header[3] = 0; - stream->write8(header, 4); - - if(!oldFormat) - stream->write8(skin->usedBones, skin->numUsedBones); - stream->write32(skin->inverseMatrices, skin->numBones*64); - if(!oldFormat){ - uint32 buffer[4] = { 0, 0, 0, 0, }; - stream->write32(buffer, 4*4); - - writeSkinSplitData(stream, skin); - } - return stream; -} - -int32 -getSizeNativeSkin(void *object, int32 offset) -{ - Skin *skin = *PLUGINOFFSET(Skin*, object, offset); - if(skin == nil) - return -1; - int32 size = 12 + 4 + 4 + skin->numBones*64; - // not sure which version introduced the new format - if(version >= 0x34000) - size += skin->numUsedBones + 16 + skinSplitDataSize(skin); - return size; -} - -void -instanceSkinData(Geometry*, Mesh *m, Skin *skin, uint32 *data) -{ - uint16 j; - float32 *weights = (float32*)data; - uint32 *indices = data; - for(uint32 i = 0; i < m->numIndices; i++){ - j = m->indices[i]; - for(int32 k = 0; k < 4; k++){ - *weights++ = skin->weights[j*4+k]; - *indices &= ~0x3FF; - *indices++ |= skin->indices[j*4+k] && skin->weights[j*4+k] ? - (skin->indices[j*4+k]+1) << 2 : 0; - } - } -} - -void -skinInstanceCB(MatPipeline *, Geometry *g, Mesh *m, uint8 **data) -{ - Skin *skin = Skin::get(g); - if(skin == nil) - return; - instanceSkinData(g, m, skin, (uint32*)data[4]); -} - -// TODO: call base function perhaps? -int32 -findVertexSkin(Geometry *g, uint32 flags[], uint32 mask, Vertex *v) -{ - Skin *skin = Skin::get(g); - float32 *wghts = nil; - uint8 *inds = nil; - if(skin){ - wghts = skin->weights; - inds = skin->indices; - } - - V3d *verts = g->morphTargets[0].vertices; - TexCoords *tex = g->texCoords[0]; - TexCoords *tex1 = g->texCoords[1]; - V3d *norms = g->morphTargets[0].normals; - RGBA *cols = g->colors; - - for(int32 i = 0; i < g->numVertices; i++){ - uint32 flag = flags ? flags[i] : ~0; - if(mask & flag & 0x1 && !equal(*verts, v->p)) - goto cont; - if(mask & flag & 0x10 && !equal(*norms, v->n)) - goto cont; - if(mask & flag & 0x100 && !equal(*cols, v->c)) - goto cont; - if(mask & flag & 0x1000 && !equal(*tex, v->t)) - goto cont; - if(mask & flag & 0x2000 && !equal(*tex1, v->t1)) - goto cont; - if(mask & flag & 0x10000 && - !(wghts[0] == v->w[0] && wghts[1] == v->w[1] && - wghts[2] == v->w[2] && wghts[3] == v->w[3] && - inds[0] == v->i[0] && inds[1] == v->i[1] && - inds[2] == v->i[2] && inds[3] == v->i[3])) - goto cont; - return i; - cont: - verts++; - tex++; - tex1++; - norms++; - cols++; - wghts += 4; - inds += 4; - } - return -1; -} - -void -insertVertexSkin(Geometry *geo, int32 i, uint32 mask, Vertex *v) -{ - Skin *skin = Skin::get(geo); - insertVertex(geo, i, mask, v); - if(mask & 0x10000){ - memcpy(&skin->weights[i*4], v->w, 16); - memcpy(&skin->indices[i*4], v->i, 4); - } -} - -/* -void -skinUninstanceCB(MatPipeline*, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[]) -{ - float32 *verts = (float32*)data[AT_XYZ]; - float32 *texcoords = (float32*)data[AT_UV]; - uint8 *colors = (uint8*)data[AT_RGBA]; - int8 *norms = (int8*)data[AT_NORMAL]; - uint32 *wghts = (uint32*)data[AT_NORMAL+1]; - uint32 mask = 0x1; // vertices - if(geo->flags & Geometry::NORMALS) - mask |= 0x10; - if(geo->flags & Geometry::PRELIT) - mask |= 0x100; - if(geo->numTexCoordSets > 0) - mask |= 0x1000; - mask |= 0x10000; - - Vertex v; - for(uint32 i = 0; i < mesh->numIndices; i++){ - if(mask & 0x1) - memcpy(&v.p, verts, 12); - if(mask & 0x10){ - v.n[0] = norms[0]/127.0f; - v.n[1] = norms[1]/127.0f; - v.n[2] = norms[2]/127.0f; - } - if(mask & 0x100) - memcpy(&v.c, colors, 4); - if(mask & 0x1000) - memcpy(&v.t, texcoords, 8); - for(int j = 0; j < 4; j++){ - ((uint32*)v.w)[j] = wghts[j] & ~0x3FF; - v.i[j] = (wghts[j] & 0x3FF) >> 2; - if(v.i[j]) v.i[j]--; - if(v.w[j] == 0.0f) v.i[j] = 0; - } - int32 idx = findVertexSkin(geo, flags, mask, &v); - if(idx < 0) - idx = geo->numVertices++; - mesh->indices[i] = idx; - flags[idx] = mask; - insertVertexSkin(geo, idx, mask, &v); - verts += 3; - texcoords += 2; - colors += 4; - norms += 3; - wghts += 4; - } -} -*/ - -void -skinPreCB(MatPipeline*, Geometry *geo) -{ - Skin *skin = Skin::get(geo); - if(skin == nil) - return; - uint8 *data = skin->data; - float *invMats = skin->inverseMatrices; - // meshHeader->totalIndices is highest possible number of vertices again - skin->init(skin->numBones, skin->numBones, geo->meshHeader->totalIndices); - memcpy(skin->inverseMatrices, invMats, skin->numBones*64); - rwFree(data); -} - -void -skinPostCB(MatPipeline*, Geometry *geo) -{ - Skin *skin = Skin::get(geo); - if(skin){ - skin->findNumWeights(geo->numVertices); - skin->findUsedBones(geo->numVertices); - } -} - -} -} diff --git a/vendor/librw/src/ps2/rwps2.h b/vendor/librw/src/ps2/rwps2.h deleted file mode 100644 index 899bb86..0000000 --- a/vendor/librw/src/ps2/rwps2.h +++ /dev/null @@ -1,258 +0,0 @@ -namespace rw { - -#ifdef RW_PS2 -struct EngineOpenParams -{ -}; -#endif - -namespace ps2 { - -void registerPlatformPlugins(void); - -extern Device renderdevice; - -struct Im2DVertex -{ - float32 x, y, z, w; - uint32 r, g, b, a; - float32 u, v, q, PAD; - - void setScreenX(float32 x) { this->x = x; } - void setScreenY(float32 y) { this->y = y; } - void setScreenZ(float32 z) { this->z = z; } - void setCameraZ(float32 z) { this->w = z; } - void setRecipCameraZ(float32 recipz) { this->q = recipz; } - void setColor(uint8 r, uint8 g, uint8 b, uint8 a) { - this->r = r; this->g = g; this->b = b; this->a = a; } - void setU(float32 u, float recipz) { this->u = u; } - void setV(float32 v, float recipz) { this->v = v; } - - float getScreenX(void) { return this->x; } - float getScreenY(void) { return this->y; } - float getScreenZ(void) { return this->z; } - float getCameraZ(void) { return this->w; } - float getRecipCameraZ(void) { return this->q; } - RGBA getColor(void) { return makeRGBA(this->r, this->g, this->b, this->a); } - float getU(void) { return this->u; } - float getV(void) { return this->v; } -}; - - -struct InstanceData -{ - uint32 dataSize; - uint8 *dataRaw; - uint8 *data; - Material *material; -}; - -struct InstanceDataHeader : rw::InstanceDataHeader -{ - uint32 numMeshes; - InstanceData *instanceMeshes; -}; - -enum { - VU_Lights = 0x3d0 -}; - -enum PS2Attribs { - AT_V2_32 = 0x64000000, - AT_V2_16 = 0x65000000, - AT_V2_8 = 0x66000000, - AT_V3_32 = 0x68000000, - AT_V3_16 = 0x69000000, - AT_V3_8 = 0x6A000000, - AT_V4_32 = 0x6C000000, - AT_V4_16 = 0x6D000000, - AT_V4_8 = 0x6E000000, - AT_UNSGN = 0x00004000, - - AT_RW = 0x6 -}; - -// Not really types as in RW but offsets -enum PS2AttibTypes { - AT_XYZ = 0, - AT_UV = 1, - AT_RGBA = 2, - AT_NORMAL = 3 -}; - -void *destroyNativeData(void *object, int32, int32); -Stream *readNativeData(Stream *stream, int32 len, void *object, int32, int32); -Stream *writeNativeData(Stream *stream, int32 len, void *object, int32, int32); -int32 getSizeNativeData(void *object, int32, int32); -void registerNativeDataPlugin(void); - -void printDMA(InstanceData *inst); -void printDMAVIF(InstanceData *inst); -void sizedebug(InstanceData *inst); - -void fixDmaOffsets(InstanceData *inst); // only RW_PS2 -int32 unfixDmaOffsets(InstanceData *inst); - -struct PipeAttribute -{ - const char *name; - uint32 attrib; -}; - -extern PipeAttribute attribXYZ; -extern PipeAttribute attribXYZW; -extern PipeAttribute attribUV; -extern PipeAttribute attribUV2; -extern PipeAttribute attribRGBA; -extern PipeAttribute attribNormal; -extern PipeAttribute attribWeights; - -class MatPipeline : public rw::Pipeline -{ -public: - uint32 vifOffset; - uint32 inputStride; - // number of vertices for tri strips and lists - uint32 triStripCount, triListCount; - PipeAttribute *attribs[10]; - void (*instanceCB)(MatPipeline*, Geometry*, Mesh*, uint8**); - void (*uninstanceCB)(MatPipeline*, Geometry*, uint32*, Mesh*, uint8**); - void (*preUninstCB)(MatPipeline*, Geometry*); - void (*postUninstCB)(MatPipeline*, Geometry*); - // RW has more: - // instanceTestCB() - // resEntryAllocCB() - // bridgeCB() - // postMeshCB() - // vu1code - // primtype - - static uint32 getVertCount(uint32 top, uint32 inAttribs, - uint32 outAttribs, uint32 outBufs) { - return (top-outBufs)/(inAttribs*2+outAttribs*outBufs); - } - - void init(void); - static MatPipeline *create(void); - void destroy(void); - void dump(void); - void setTriBufferSizes(uint32 inputStride, uint32 bufferSize); - void instance(Geometry *g, InstanceData *inst, Mesh *m); - uint8 *collectData(Geometry *g, InstanceData *inst, Mesh *m, uint8 *data[]); -}; - -class ObjPipeline : public rw::ObjPipeline -{ -public: - void init(void); - static ObjPipeline *create(void); - - MatPipeline *groupPipeline; - // RW has more: - // setupCB() - // finalizeCB() - // lightOffset - // lightSize -}; - -struct Vertex { - V3d p; - TexCoords t; - TexCoords t1; - RGBA c; - V3d n; - // skin - float32 w[4]; - uint8 i[4]; -}; - -void insertVertex(Geometry *geo, int32 i, uint32 mask, Vertex *v); - -extern ObjPipeline *defaultObjPipe; -extern MatPipeline *defaultMatPipe; - -void genericUninstanceCB(MatPipeline *pipe, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[]); -void genericPreCB(MatPipeline *pipe, Geometry *geo); // skin and ADC -//void defaultUninstanceCB(MatPipeline *pipe, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[]); -void skinInstanceCB(MatPipeline *, Geometry *g, Mesh *m, uint8 **data); -//void skinUninstanceCB(MatPipeline*, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[]); - -ObjPipeline *makeDefaultPipeline(void); -void dumpPipeline(rw::Pipeline *pipe); - -// ADC plugin - -// Each element in adcBits corresponds to an index in Mesh->indices, -// this assumes the Mesh indices are ADC formatted. -// ADCData->numBits != Mesh->numIndices. ADCData->numBits is probably -// equal to Mesh->numIndices before the Mesh gets ADC formatted. -// -// Can't convert between ADC-formatted and non-ADC-formatted yet :( - -struct ADCData -{ - bool32 adcFormatted; - int8 *adcBits; - int32 numBits; -}; -extern int32 adcOffset; -void registerADCPlugin(void); - -int8 *getADCbits(Geometry *geo); -int8 *getADCbitsForMesh(Geometry *geo, Mesh *mesh); -void convertADC(Geometry *g); -void unconvertADC(Geometry *geo); -void allocateADC(Geometry *geo); - -// PDS plugin - -Pipeline *getPDSPipe(uint32 data); -void registerPDSPipe(Pipeline *pipe); -void registerPDSPlugin(int32 n); -void registerPluginPDSPipes(void); - -// Native Texture and Raster - -struct Ps2Raster -{ - enum Flags { - NEWSTYLE = 0x1, // has GIF tags and transfer DMA chain - SWIZZLED8 = 0x2, - SWIZZLED4 = 0x4 - }; - struct PixelPtr { - // RW has pixels as second element but we don't want this struct - // to be longer than 16 bytes - uint8 *pixels; - // palette can be allocated in last level, in that case numTransfers is - // one less than numTotalTransfers. - int32 numTransfers; - int32 numTotalTransfers; - }; - - uint64 tex0; - uint32 paletteBase; // block address from beginning of GS data (words/64) - uint16 kl; - uint8 tex1low; // MXL and LCM of TEX1 - uint8 unk2; - uint64 miptbp1; - uint64 miptbp2; - uint32 pixelSize; // in bytes - uint32 paletteSize; // in bytes - uint32 totalSize; // total size of texture on GS in words - int8 flags; - - uint8 *data; //tmp - uint32 dataSize; -}; - -extern int32 nativeRasterOffset; -void registerNativeRaster(void); -#define GETPS2RASTEREXT(raster) PLUGINOFFSET(rw::ps2::Ps2Raster, raster, rw::ps2::nativeRasterOffset) - -Texture *readNativeTexture(Stream *stream); -void writeNativeTexture(Texture *tex, Stream *stream); -uint32 getSizeNativeTexture(Texture *tex); - -} -} diff --git a/vendor/librw/src/ps2/rwps2impl.h b/vendor/librw/src/ps2/rwps2impl.h deleted file mode 100644 index f455bd2..0000000 --- a/vendor/librw/src/ps2/rwps2impl.h +++ /dev/null @@ -1,16 +0,0 @@ -namespace rw { -namespace ps2 { - -Raster *rasterCreate(Raster *raster); -uint8 *rasterLock(Raster*, int32 level, int32 lockMode); -void rasterUnlock(Raster*, int32 level); -uint8 *rasterLockPalette(Raster*, int32 lockMode); -void rasterUnlockPalette(Raster*); -int32 rasterNumLevels(Raster*); -bool32 imageFindRasterFormat(Image *img, int32 type, - int32 *width, int32 *height, int32 *depth, int32 *format); -bool32 rasterFromImage(Raster *raster, Image *image); -Image *rasterToImage(Raster *raster); - -} -} diff --git a/vendor/librw/src/ps2/rwps2plg.h b/vendor/librw/src/ps2/rwps2plg.h deleted file mode 100644 index 8776a51..0000000 --- a/vendor/librw/src/ps2/rwps2plg.h +++ /dev/null @@ -1,27 +0,0 @@ -namespace rw { -namespace ps2 { - -// MatFX plugin - -void initMatFX(void); -ObjPipeline *makeMatFXPipeline(void); - -// Skin plugin - -void initSkin(void); -ObjPipeline *makeSkinPipeline(void); - -void insertVertexSkin(Geometry *geo, int32 i, uint32 mask, Vertex *v); -int32 findVertexSkin(Geometry *g, uint32 flags[], uint32 mask, Vertex *v); - -Stream *readNativeSkin(Stream *stream, int32, void *object, int32 offset); -Stream *writeNativeSkin(Stream *stream, int32 len, void *object, int32 offset); -int32 getSizeNativeSkin(void *object, int32 offset); - -void instanceSkinData(Geometry *g, Mesh *m, Skin *skin, uint32 *data); - -void skinPreCB(MatPipeline*, Geometry*); -void skinPostCB(MatPipeline*, Geometry*); - -} -} diff --git a/vendor/librw/src/raster.cpp b/vendor/librw/src/raster.cpp deleted file mode 100644 index fb654ef..0000000 --- a/vendor/librw/src/raster.cpp +++ /dev/null @@ -1,559 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" -//#include "ps2/rwps2.h" -#include "d3d/rwd3d.h" -#include "d3d/rwxbox.h" -//#include "d3d/rwd3d8.h" -//#include "d3d/rwd3d9.h" -#include "gl/rwgl3.h" - -#define PLUGIN_ID 0 - -namespace rw { - -int32 Raster::numAllocated; - -struct RasterGlobals -{ - int32 sp; - Raster *stack[32]; -}; -int32 rasterModuleOffset; - -#define RASTERGLOBAL(v) (PLUGINOFFSET(RasterGlobals, engine, rasterModuleOffset)->v) - -static void* -rasterOpen(void *object, int32 offset, int32 size) -{ - int i; - rasterModuleOffset = offset; - RASTERGLOBAL(sp) = -1; - for(i = 0; i < (int)nelem(RASTERGLOBAL(stack)); i++) - RASTERGLOBAL(stack)[i] = nil; - return object; -} - -static void* -rasterClose(void *object, int32 offset, int32 size) -{ - return object; -} - -void -Raster::registerModule(void) -{ - Engine::registerPlugin(sizeof(RasterGlobals), ID_RASTERMODULE, rasterOpen, rasterClose); -} - -Raster* -Raster::create(int32 width, int32 height, int32 depth, int32 format, int32 platform) -{ - // TODO: pass arguments through to the driver and create the raster there - Raster *raster = (Raster*)rwMalloc(s_plglist.size, MEMDUR_EVENT); // TODO - assert(raster != nil); - numAllocated++; - raster->parent = raster; - raster->offsetX = 0; - raster->offsetY = 0; - raster->platform = platform ? platform : rw::platform; - raster->type = format & 0x7; - raster->flags = format & 0xF8; - raster->privateFlags = 0; - raster->format = format & 0xFF00; - raster->width = width; - raster->height = height; - raster->depth = depth; - raster->stride = 0; - raster->pixels = raster->palette = nil; - s_plglist.construct(raster); - -// printf("%d %d %d %d\n", raster->type, raster->width, raster->height, raster->depth); - return engine->driver[raster->platform]->rasterCreate(raster); -} - -void -Raster::subRaster(Raster *parent, Rect *r) -{ - if((this->flags & DONTALLOCATE) == 0) - return; - this->width = r->w; - this->height = r->h; - this->offsetX += r->x; - this->offsetY += r->y; - this->parent = parent->parent; -} - -void -Raster::destroy(void) -{ - s_plglist.destruct(this); - rwFree(this); - numAllocated--; -} - -uint8* -Raster::lock(int32 level, int32 lockMode) -{ - return engine->driver[this->platform]->rasterLock(this, level, lockMode); -} - -void -Raster::unlock(int32 level) -{ - engine->driver[this->platform]->rasterUnlock(this, level); -} - -uint8* -Raster::lockPalette(int32 lockMode) -{ - return engine->driver[this->platform]->rasterLockPalette(this, lockMode); -} - -void -Raster::unlockPalette(void) -{ - engine->driver[this->platform]->rasterUnlockPalette(this); -} - -int32 -Raster::getNumLevels(void) -{ - return engine->driver[this->platform]->rasterNumLevels(this); -} - -int32 -Raster::calculateNumLevels(int32 width, int32 height) -{ - int32 size = width >= height ? width : height; - int32 n; - for(n = 0; size != 0; n++) - size /= 2; - return n; -} - -bool -Raster::formatHasAlpha(int32 format) -{ - return (format & 0xF00) == Raster::C8888 || - (format & 0xF00) == Raster::C1555 || - (format & 0xF00) == Raster::C4444; -} - -bool32 -Raster::imageFindRasterFormat(Image *image, int32 type, - int32 *pWidth, int32 *pHeight, int32 *pDepth, int32 *pFormat, - int32 platform) -{ - return engine->driver[platform ? platform : rw::platform]->imageFindRasterFormat( - image, type, pWidth, pHeight, pDepth, pFormat); -} - -Raster* -Raster::setFromImage(Image *image, int32 platform) -{ - if(engine->driver[platform ? platform : rw::platform]->rasterFromImage(this, image)) - return this; - return nil; -} - -Raster* -Raster::createFromImage(Image *image, int32 platform) -{ - Raster *raster; - int32 width, height, depth, format; - if(!imageFindRasterFormat(image, TEXTURE, &width, &height, &depth, &format, platform)) - return nil; - raster = Raster::create(width, height, depth, format, platform); - if(raster == nil) - return nil; - return raster->setFromImage(image, platform); -} - -Image* -Raster::toImage(void) -{ - return engine->driver[this->platform]->rasterToImage(this); -} - -void -Raster::show(uint32 flags) -{ - engine->device.showRaster(this, flags); -} - -Raster* -Raster::pushContext(Raster *raster) -{ - RasterGlobals *g = PLUGINOFFSET(RasterGlobals, engine, rasterModuleOffset); - if(g->sp >= (int32)nelem(g->stack)-1) - return nil; - return g->stack[++g->sp] = raster; -} - -Raster* -Raster::popContext(void) -{ - RasterGlobals *g = PLUGINOFFSET(RasterGlobals, engine, rasterModuleOffset); - if(g->sp < 0) - return nil; - return g->stack[g->sp--]; -} - -Raster* -Raster::getCurrentContext(void) -{ - RasterGlobals *g = PLUGINOFFSET(RasterGlobals, engine, rasterModuleOffset); - if(g->sp < 0 || g->sp >= (int32)nelem(g->stack)) - return nil; - return g->stack[g->sp]; -} - -bool32 -Raster::renderFast(int32 x, int32 y) -{ - return engine->device.rasterRenderFast(this,x, y); -} - -void -conv_RGBA8888_from_RGBA8888(uint8 *out, uint8 *in) -{ - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - out[3] = in[3]; -} - -void -conv_BGRA8888_from_RGBA8888(uint8 *out, uint8 *in) -{ - out[2] = in[0]; - out[1] = in[1]; - out[0] = in[2]; - out[3] = in[3]; -} - -void -conv_RGBA8888_from_RGB888(uint8 *out, uint8 *in) -{ - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - out[3] = 0xFF; -} - -void -conv_BGRA8888_from_RGB888(uint8 *out, uint8 *in) -{ - out[2] = in[0]; - out[1] = in[1]; - out[0] = in[2]; - out[3] = 0xFF; -} - -void -conv_RGB888_from_RGB888(uint8 *out, uint8 *in) -{ - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; -} - -void -conv_BGR888_from_RGB888(uint8 *out, uint8 *in) -{ - out[2] = in[0]; - out[1] = in[1]; - out[0] = in[2]; -} - -void -conv_ARGB1555_from_ARGB1555(uint8 *out, uint8 *in) -{ - out[0] = in[0]; - out[1] = in[1]; -} - -void -conv_ARGB1555_from_RGB555(uint8 *out, uint8 *in) -{ - out[0] = in[0]; - out[1] = in[1] | 0x80; -} - -void -conv_RGBA5551_from_ARGB1555(uint8 *out, uint8 *in) -{ - uint32 r, g, b, a; - a = (in[1]>>7) & 1; - r = (in[1]>>2) & 0x1F; - g = (in[1]&3)<<3 | ((in[0]>>5)&7); - b = in[0] & 0x1F; - out[0] = a | b<<1 | g<<6; - out[1] = g>>2 | r<<3; -} - -void -conv_ARGB1555_from_RGBA5551(uint8 *out, uint8 *in) -{ - uint32 r, g, b, a; - a = in[0] & 1; - b = (in[0]>>1) & 0x1F; - g = (in[1]&7)<<2 | ((in[0]>>6)&3); - r = (in[1]>>3) & 0x1F; - out[0] = b | g<<5; - out[1] = g>>3 | r<<2 | a<<7; -} - -void -conv_RGBA8888_from_ARGB1555(uint8 *out, uint8 *in) -{ - uint32 r, g, b, a; - a = (in[1]>>7) & 1; - r = (in[1]>>2) & 0x1F; - g = (in[1]&3)<<3 | ((in[0]>>5)&7); - b = in[0] & 0x1F; - out[0] = r*0xFF/0x1f; - out[1] = g*0xFF/0x1f; - out[2] = b*0xFF/0x1f; - out[3] = a*0xFF; -} - -void -conv_ABGR1555_from_ARGB1555(uint8 *out, uint8 *in) -{ - uint32 r, b; - r = (in[1]>>2) & 0x1F; - b = in[0] & 0x1F; - out[1] = (in[1]&0x83) | b<<2; - out[0] = (in[0]&0xE0) | r; -} - -void -expandPal4(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h) -{ - int32 x, y; - for(y = 0; y < h; y++) - for(x = 0; x < w/2; x++){ - dst[y*dststride + x*2 + 0] = src[y*srcstride + x] & 0xF; - dst[y*dststride + x*2 + 1] = src[y*srcstride + x] >> 4; - } -} -void -compressPal4(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h) -{ - int32 x, y; - for(y = 0; y < h; y++) - for(x = 0; x < w/2; x++) - dst[y*dststride + x] = src[y*srcstride + x*2 + 0] | src[y*srcstride + x*2 + 1] << 4; -} - -void -expandPal4_BE(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h) -{ - int32 x, y; - for(y = 0; y < h; y++) - for(x = 0; x < w/2; x++){ - dst[y*dststride + x*2 + 1] = src[y*srcstride + x] & 0xF; - dst[y*dststride + x*2 + 0] = src[y*srcstride + x] >> 4; - } -} -void -compressPal4_BE(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h) -{ - int32 x, y; - for(y = 0; y < h; y++) - for(x = 0; x < w/2; x++) - dst[y*dststride + x] = src[y*srcstride + x*2 + 1] | src[y*srcstride + x*2 + 0] << 4; -} - -void -copyPal8(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h) -{ - int32 x, y; - for(y = 0; y < h; y++) - for(x = 0; x < w; x++) - dst[y*dststride + x] = src[y*srcstride + x]; -} - - - -// Platform conversion - -static rw::Raster* -xbox_to_d3d(rw::Raster *ras) -{ - using namespace rw; - - int dxt = 0; - xbox::XboxRaster *xboxras = GETXBOXRASTEREXT(ras); - if(xboxras->customFormat){ - switch(xboxras->format){ - case xbox::D3DFMT_DXT1: dxt = 1; break; - case xbox::D3DFMT_DXT3: dxt = 3; break; - case xbox::D3DFMT_DXT5: dxt = 5; break; - } - } - if(dxt == 0) - return nil; - - Raster *newras = Raster::create(ras->width, ras->height, ras->depth, - ras->format | Raster::TEXTURE | Raster::DONTALLOCATE); - int numLevels = ras->getNumLevels(); - d3d::allocateDXT(newras, dxt, numLevels, xboxras->hasAlpha); - for(int i = 0; i < numLevels; i++){ - uint8 *srcpx = ras->lock(i, Raster::LOCKREAD); - // uint8 *dstpx = newras->lock(i, Raster::LOCKWRITE | Raster::LOCKNOFETCH); - d3d::setTexels(newras, srcpx, i); - // flipDXT(dxt, dstpx, srcpx, ras->width, ras->height); - ras->unlock(i); - // newras->unlock(i); - } - - return newras; -} - -static rw::Raster* -d3d_to_gl3(rw::Raster *ras) -{ -#ifdef RW_GL3 - using namespace rw; - - if(!gl3::gl3Caps.dxtSupported) - return nil; - - int dxt = 0; - d3d::D3dRaster *d3dras = GETD3DRASTEREXT(ras); - if(d3dras->customFormat){ - switch(d3dras->format){ - case d3d::D3DFMT_DXT1: dxt = 1; break; - case d3d::D3DFMT_DXT3: dxt = 3; break; - case d3d::D3DFMT_DXT5: dxt = 5; break; - } - } - if(dxt == 0) - return nil; - - Raster *newras = Raster::create(ras->width, ras->height, ras->depth, - ras->format | Raster::TEXTURE | Raster::DONTALLOCATE); - int numLevels = ras->getNumLevels(); - gl3::allocateDXT(newras, dxt, numLevels, d3dras->hasAlpha); - for(int i = 0; i < numLevels; i++){ - uint8 *srcpx = ras->lock(i, Raster::LOCKREAD); - uint8 *dstpx = newras->lock(i, Raster::LOCKWRITE | Raster::LOCKNOFETCH); - flipDXT(dxt, dstpx, srcpx, ras->width, ras->height); - ras->unlock(i); - newras->unlock(i); - } - - return newras; -#else - return nil; -#endif -} - -static rw::Raster* -xbox_to_gl3(rw::Raster *ras) -{ -#ifdef RW_GL3 - using namespace rw; - - int dxt = 0; - xbox::XboxRaster *xboxras = GETXBOXRASTEREXT(ras); - if(xboxras->customFormat){ - switch(xboxras->format){ - case xbox::D3DFMT_DXT1: dxt = 1; break; - case xbox::D3DFMT_DXT3: dxt = 3; break; - case xbox::D3DFMT_DXT5: dxt = 5; break; - } - } - if(dxt == 0) - return nil; - - Raster *newras = Raster::create(ras->width, ras->height, ras->depth, - ras->format | Raster::TEXTURE | Raster::DONTALLOCATE); - int numLevels = ras->getNumLevels(); - gl3::allocateDXT(newras, dxt, numLevels, xboxras->hasAlpha); - for(int i = 0; i < numLevels; i++){ - uint8 *srcpx = ras->lock(i, Raster::LOCKREAD); - uint8 *dstpx = newras->lock(i, Raster::LOCKWRITE | Raster::LOCKNOFETCH); - flipDXT(dxt, dstpx, srcpx, ras->width, ras->height); - ras->unlock(i); - newras->unlock(i); - } - - return newras; -#else - return nil; -#endif -} - -rw::Raster* -Raster::convertTexToCurrentPlatform(rw::Raster *ras) -{ - using namespace rw; - - if(ras->platform == rw::platform) - return ras; - // compatible platforms - if((ras->platform == PLATFORM_D3D8 && rw::platform == PLATFORM_D3D9) || - (ras->platform == PLATFORM_D3D9 && rw::platform == PLATFORM_D3D8)) - return ras; - - // special cased conversion for DXT - if((ras->platform == PLATFORM_D3D8 || ras->platform == PLATFORM_D3D9) && rw::platform == PLATFORM_GL3){ - Raster *newras = d3d_to_gl3(ras); - if(newras){ - ras->destroy(); - return newras; - } - }else if(ras->platform == PLATFORM_XBOX && (rw::platform == PLATFORM_D3D9 || rw::platform == PLATFORM_D3D8)){ - Raster *newras = xbox_to_d3d(ras); - if(newras){ - ras->destroy(); - return newras; - } - }else if(ras->platform == PLATFORM_XBOX && rw::platform == PLATFORM_GL3){ - Raster *newras = xbox_to_gl3(ras); - if(newras){ - ras->destroy(); - return newras; - } - } - - // fall back to going through Image directly - int32 width, height, depth, format; - Image *img = ras->toImage(); - // TODO: maybe don't *always* do this? - img->unpalettize(); - Raster::imageFindRasterFormat(img, Raster::TEXTURE, &width, &height, &depth, &format); - format |= ras->format & (Raster::MIPMAP | Raster::AUTOMIPMAP); - Raster *newras = Raster::create(width, height, depth, format); - newras->setFromImage(img); - img->destroy(); - int numLevels = ras->getNumLevels(); - for(int i = 1; i < numLevels; i++){ - ras->lock(i, Raster::LOCKREAD); - img = ras->toImage(); - // TODO: maybe don't *always* do this? - img->unpalettize(); - newras->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH); - newras->setFromImage(img); - newras->unlock(i); - ras->unlock(i); - } - ras->destroy(); - ras = newras; - return ras; -} - - -} diff --git a/vendor/librw/src/render.cpp b/vendor/librw/src/render.cpp deleted file mode 100644 index 814f682..0000000 --- a/vendor/librw/src/render.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include - -#include "rwbase.h" -#include "rwplg.h" -#include "rwengine.h" - -namespace rw { - -void SetRenderState(int32 state, uint32 value){ - engine->device.setRenderState(state, (void*)(uintptr)value); } - -void SetRenderStatePtr(int32 state, void *value){ - engine->device.setRenderState(state, value); } - -uint32 GetRenderState(int32 state){ - return (uint32)(uintptr)engine->device.getRenderState(state); } - -void *GetRenderStatePtr(int32 state){ - return engine->device.getRenderState(state); } - -// Im2D - -namespace im2d { - -float32 GetNearZ(void) { return engine->device.zNear; } -float32 GetFarZ(void) { return engine->device.zFar; } -void -RenderLine(void *verts, int32 numVerts, int32 vert1, int32 vert2) -{ - engine->device.im2DRenderLine(verts, numVerts, vert1, vert2); -} -void -RenderTriangle(void *verts, int32 numVerts, int32 vert1, int32 vert2, int32 vert3) -{ - engine->device.im2DRenderTriangle(verts, numVerts, vert1, vert2, vert3); -} -void -RenderIndexedPrimitive(PrimitiveType type, void *verts, int32 numVerts, void *indices, int32 numIndices) -{ - engine->device.im2DRenderIndexedPrimitive(type, verts, numVerts, indices, numIndices); -} -void -RenderPrimitive(PrimitiveType type, void *verts, int32 numVerts) -{ - engine->device.im2DRenderPrimitive(type, verts, numVerts); -} - -} - -// Im3D - -namespace im3d { - -void -Transform(void *vertices, int32 numVertices, Matrix *world, uint32 flags) -{ - engine->device.im3DTransform(vertices, numVertices, world, flags); -} -void -RenderPrimitive(PrimitiveType primType) -{ - engine->device.im3DRenderPrimitive(primType); -} -void -RenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices) -{ - engine->device.im3DRenderIndexedPrimitive(primType, indices, numIndices); -} -void -End(void) -{ - engine->device.im3DEnd(); -} - -} - -} - diff --git a/vendor/librw/src/rwanim.h b/vendor/librw/src/rwanim.h deleted file mode 100644 index e6dd1d5..0000000 --- a/vendor/librw/src/rwanim.h +++ /dev/null @@ -1,195 +0,0 @@ -#include - -namespace rw { - -struct Animation; - -// These sizes of these are sadly not platform independent -// because pointer sizes can vary. - -struct KeyFrameHeader -{ - KeyFrameHeader *prev; - float32 time; - - KeyFrameHeader *next(int32 sz){ - return (KeyFrameHeader*)((uint8*)this + sz); } -}; - -struct InterpFrameHeader -{ - KeyFrameHeader *keyFrame1; - KeyFrameHeader *keyFrame2; -}; - -struct AnimInterpolatorInfo -{ - typedef void (*ApplyCB)(void *result, void *frame); - typedef void (*BlendCB)(void *out, void *in1, void *in2, float32 a); - typedef void (*InterpCB)(void *out, void *in1, void *in2, float32 t, - void *custom); - typedef void (*AddCB)(void *out, void *in1, void *in2); - typedef void (*MulRecipCB)(void *frame, void *start); - - int32 id; - int32 interpKeyFrameSize; - int32 animKeyFrameSize; - int32 customDataSize; - - ApplyCB applyCB; - BlendCB blendCB; - InterpCB interpCB; - AddCB addCB; - MulRecipCB mulRecipCB; - void (*streamRead)(Stream *stream, Animation *anim); - void (*streamWrite)(Stream *stream, Animation *anim); - uint32 (*streamGetSize)(Animation *anim); - - static void registerInterp(AnimInterpolatorInfo *interpInfo); - static void unregisterInterp(AnimInterpolatorInfo *interpInfo); - static AnimInterpolatorInfo *find(int32 id); -}; - -struct Animation -{ - AnimInterpolatorInfo *interpInfo; - int32 numFrames; - int32 flags; - float32 duration; - void *keyframes; - void *customData; - - static Animation *create(AnimInterpolatorInfo*, int32 numFrames, - int32 flags, float duration); - void destroy(void); - int32 getNumNodes(void); - KeyFrameHeader *getAnimFrame(int32 n){ - return (KeyFrameHeader*)((uint8*)this->keyframes + - n*this->interpInfo->animKeyFrameSize); - } - static Animation *streamRead(Stream *stream); - static Animation *streamReadLegacy(Stream *stream); - bool streamWrite(Stream *stream); - bool streamWriteLegacy(Stream *stream); - uint32 streamGetSize(void); -}; - -struct AnimInterpolator -{ - Animation *currentAnim; - float32 currentTime; - void *nextFrame; - int32 maxInterpKeyFrameSize; - int32 currentInterpKeyFrameSize; - int32 currentAnimKeyFrameSize; - int32 numNodes; - // TODO some callbacks, parent/sub - // cached from the InterpolatorInfo - AnimInterpolatorInfo::ApplyCB applyCB; - AnimInterpolatorInfo::BlendCB blendCB; - AnimInterpolatorInfo::InterpCB interpCB; - AnimInterpolatorInfo::AddCB addCB; - // after this interpolated frames - - static AnimInterpolator *create(int32 numNodes, int32 maxKeyFrameSize); - void destroy(void); - bool32 setCurrentAnim(Animation *anim); - void addTime(float32 t); - void *getFrames(void){ return this+1;} - InterpFrameHeader *getInterpFrame(int32 n){ - return (InterpFrameHeader*)((uint8*)getFrames() + - n*currentInterpKeyFrameSize); - } - KeyFrameHeader *getAnimFrame(int32 n){ - return (KeyFrameHeader*)((uint8*)currentAnim->keyframes + - n*currentAnimKeyFrameSize); - } -}; - -// -// UV anim -// - -struct UVAnimParamData -{ - float32 theta; // rotation - float32 s0; // scale x - float32 s1; // scale y - float32 skew; // skew - float32 x; // x pos - float32 y; // y pos -}; - -struct UVAnimKeyFrame -{ - UVAnimKeyFrame *prev; - float32 time; - float32 uv[6]; -}; - -struct UVAnimInterpFrame -{ - UVAnimKeyFrame *keyFrame1; - UVAnimKeyFrame *keyFrame2; - float32 uv[6]; -}; - -struct UVAnimDictionary; - -// RW does it differently...maybe we should implement RtDict -// and make it more general? - -struct UVAnimCustomData -{ - char name[32]; - int32 nodeToUVChannel[8]; - int32 refCount; - - void destroy(Animation *anim); - static UVAnimCustomData *get(Animation *anim){ - return (UVAnimCustomData*)anim->customData; } -}; - -// This should be more general probably -struct UVAnimDictEntry -{ - Animation *anim; - LLLink inDict; - static UVAnimDictEntry *fromDict(LLLink *lnk){ - return LLLinkGetData(lnk, UVAnimDictEntry, inDict); } -}; - -// This too -struct UVAnimDictionary -{ - LinkList animations; - - static UVAnimDictionary *create(void); - void destroy(void); - int32 count(void) { return this->animations.count(); } - void add(Animation *anim); - Animation *find(const char *name); - - static UVAnimDictionary *streamRead(Stream *stream); - bool streamWrite(Stream *stream); - uint32 streamGetSize(void); -}; - -extern UVAnimDictionary *currentUVAnimDictionary; - -// Material plugin -struct UVAnim -{ - Matrix *uv[2]; - AnimInterpolator *interp[8]; - - static bool32 exists(Material *mat); - static void addTime(Material *mat, float32 t); - static void applyUpdate(Material *mat); -}; - -extern int32 uvAnimOffset; - -void registerUVAnimPlugin(void); - -} diff --git a/vendor/librw/src/rwbase.h b/vendor/librw/src/rwbase.h deleted file mode 100644 index 0c07b2e..0000000 --- a/vendor/librw/src/rwbase.h +++ /dev/null @@ -1,712 +0,0 @@ -#ifndef RW_PS2 -#include -#endif -#include -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -// TODO: clean up the opengl defines -// and figure out what we even want here... -#ifdef RW_GL3 -#define RW_OPENGL -#define RWDEVICE gl3 -// doesn't help -//#define RW_GL_USE_VAOS -#endif - -#ifdef RW_GLES2 -#define RW_GLES -#endif -#ifdef RW_GLES3 -#define RW_GLES -#endif - -#ifdef RW_D3D9 -#define RWDEVICE d3d -#define RWHALFPIXEL -#endif - -#ifdef RW_D3D8 -#define RWDEVICE d3d -#endif - -#ifdef RW_PS2 -#define RWHALFPIXEL -#define RWDEVICE ps2 -#endif - -#ifdef RW_WDGL -#define RW_OPENGL -#endif - -namespace rw { - -#ifdef RW_PS2 - typedef char int8; - typedef short int16; - typedef int int32; - typedef long long int64; - typedef unsigned char uint8; - typedef unsigned short uint16; - typedef unsigned int uint32; - typedef unsigned long long uint64; - typedef unsigned int uintptr; -#else - /* get rid of the stupid _t */ - typedef int8_t int8; - typedef int16_t int16; - typedef int32_t int32; - typedef int64_t int64; - typedef uint8_t uint8; - typedef uint16_t uint16; - typedef uint32_t uint32; - typedef uint64_t uint64; - typedef uintptr_t uintptr; -#endif - -typedef float float32; -typedef int32 bool32; -typedef uint8 byte; -typedef uint32 uint; - -#define nil NULL - -#define nelem(A) (sizeof(A) / sizeof A[0]) - -#ifdef __GNUC__ -#define RWALIGN(n) __attribute__ ((aligned (n))) -#else -#ifdef _MSC_VER -#define RWALIGN(n) __declspec(align(n)) -#else -#define RWALIGN(n) // unknown compiler...ignore -#endif -#endif - -// Lists - -struct LLLink -{ - LLLink *next; - LLLink *prev; - void init(void){ - this->next = nil; - this->prev = nil; - } - void remove(void){ - this->prev->next = this->next; - this->next->prev = this->prev; - } -}; - -#define LLLinkGetData(linkvar,type,entry) \ - ((type*)(((rw::uint8*)(linkvar))-offsetof(type,entry))) - -// Have to be careful since the link might be deleted. -#define FORLIST(_link, _list) \ - for(rw::LLLink *_next = nil, *_link = (_list).link.next; \ - _next = (_link)->next, (_link) != (_list).end(); \ - (_link) = _next) - -struct LinkList -{ - LLLink link; - void init(void){ - this->link.next = &this->link; - this->link.prev = &this->link; - } - bool32 isEmpty(void){ - return this->link.next == &this->link; - } - void add(LLLink *link){ - link->next = this->link.next; - link->prev = &this->link; - this->link.next->prev = link; - this->link.next = link; - } - void append(LLLink *link){ - link->next = &this->link; - link->prev = this->link.prev; - this->link.prev->next = link; - this->link.prev = link; - } - LLLink *end(void){ - return &this->link; - } - int32 count(void){ - int32 n = 0; - FORLIST(lnk, (*this)) - n++; - return n; - } -}; - -// Mathematical types - -struct RGBA -{ - uint8 red; - uint8 green; - uint8 blue; - uint8 alpha; -}; -inline RGBA makeRGBA(uint8 r, uint8 g, uint8 b, uint8 a) { RGBA c = { r, g, b, a }; return c; } -inline bool32 equal(const RGBA &c1, const RGBA &c2) { return c1.red == c2.red && c1.green == c2.green && c1.blue == c2.blue && c1.alpha == c2.alpha; } -#define RWRGBAINT(r, g, b, a) ((uint32)((((a)&0xff)<<24)|(((b)&0xff)<<16)|(((g)&0xff)<<8)|((r)&0xff))) - -struct RGBAf -{ - float32 red; - float32 green; - float32 blue; - float32 alpha; -}; -inline RGBAf makeRGBAf(float32 r, float32 g, float32 b, float32 a) { RGBAf c = { r, g, b, a }; return c; } -inline bool32 equal(const RGBAf &c1, const RGBAf &c2) { return c1.red == c2.red && c1.green == c2.green && c1.blue == c2.blue && c1.alpha == c2.alpha; } -inline RGBAf add(const RGBAf &a, const RGBAf &b) { return makeRGBAf(a.red+b.red, a.green+b.green, a.blue+b.blue, a.alpha+b.alpha); } -inline RGBAf modulate(const RGBAf &a, const RGBAf &b) { return makeRGBAf(a.red*b.red, a.green*b.green, a.blue*b.blue, a.alpha*b.alpha); } -inline RGBAf scale(const RGBAf &a, float32 f) { return makeRGBAf(a.red*f, a.green*f, a.blue*f, a.alpha*f); } -inline void clamp(RGBAf *a) { - if(a->red > 1.0f) a->red = 1.0f; - if(a->red < 0.0f) a->red = 0.0f; - if(a->green > 1.0f) a->green = 1.0f; - if(a->green < 0.0f) a->green = 0.0f; - if(a->blue > 1.0f) a->blue = 1.0f; - if(a->blue < 0.0f) a->blue = 0.0f; - if(a->alpha > 1.0f) a->alpha = 1.0f; - if(a->alpha < 0.0f) a->alpha = 0.0f; -} - -inline void convColor(RGBA *i, const RGBAf *f){ - int32 c; - c = (int32)(f->red*255.0f + 0.5f); - i->red = (uint8)c; - c = (int32)(f->green*255.0f + 0.5f); - i->green = (uint8)c; - c = (int32)(f->blue*255.0f + 0.5f); - i->blue = (uint8)c; - c = (int32)(f->alpha*255.0f + 0.5f); - i->alpha = (uint8)c; -} - -inline void convColor(RGBAf *f, const RGBA *i){ - f->red = i->red/255.0f; - f->green = i->green/255.0f; - f->blue = i->blue/255.0f; - f->alpha = i->alpha/255.0f; -} - -struct TexCoords -{ - float32 u, v; -}; -inline bool32 equal(const TexCoords &t1, const TexCoords &t2) { return t1.u == t2.u && t1.v == t2.v; } - -struct V2d; -struct V3d; -struct Quat; -struct Matrix; - -struct V2d -{ - float32 x, y; - void set(float32 x, float32 y){ - this->x = x; this->y = y; } -}; - -inline V2d makeV2d(float32 x, float32 y) { V2d v = { x, y }; return v; } -inline bool32 equal(const V2d &v1, const V2d &v2) { return v1.x == v2.x && v1.y == v2.y; } -inline V2d neg(const V2d &a) { return makeV2d(-a.x, -a.y); } -inline V2d add(const V2d &a, const V2d &b) { return makeV2d(a.x+b.x, a.y+b.y); } -inline V2d sub(const V2d &a, const V2d &b) { return makeV2d(a.x-b.x, a.y-b.y); } -inline V2d scale(const V2d &a, float32 r) { return makeV2d(a.x*r, a.y*r); } -inline float32 length(const V2d &v) { return sqrtf(v.x*v.x + v.y*v.y); } -inline V2d normalize(const V2d &v) { return scale(v, 1.0f/length(v)); } - -struct V3d -{ - float32 x, y, z; - void set(float32 x, float32 y, float32 z){ - this->x = x; this->y = y; this->z = z; } - static void transformPoints(V3d *out, const V3d *in, int32 n, const Matrix *m); - static void transformVectors(V3d *out, const V3d *in, int32 n, const Matrix *m); -}; - -inline V3d makeV3d(float32 x, float32 y, float32 z) { V3d v = { x, y, z }; return v; } -inline bool32 equal(const V3d &v1, const V3d &v2) { return v1.x == v2.x && v1.y == v2.y && v1.z == v2.z; } -inline V3d neg(const V3d &a) { return makeV3d(-a.x, -a.y, -a.z); } -inline V3d add(const V3d &a, const V3d &b) { return makeV3d(a.x+b.x, a.y+b.y, a.z+b.z); } -inline V3d sub(const V3d &a, const V3d &b) { return makeV3d(a.x-b.x, a.y-b.y, a.z-b.z); } -inline V3d scale(const V3d &a, float32 r) { return makeV3d(a.x*r, a.y*r, a.z*r); } -inline float32 length(const V3d &v) { return sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); } -inline V3d normalize(const V3d &v) { return scale(v, 1.0f/length(v)); } -inline V3d setlength(const V3d &v, float32 l) { return scale(v, l/length(v)); } -V3d cross(const V3d &a, const V3d &b); -inline float32 dot(const V3d &a, const V3d &b) { return a.x*b.x + a.y*b.y + a.z*b.z; } -inline V3d lerp(const V3d &a, const V3d &b, float32 r){ - return makeV3d(a.x + r*(b.x - a.x), - a.y + r*(b.y - a.y), - a.z + r*(b.z - a.z)); -}; - -struct V4d -{ - float32 x, y, z, w; -}; -inline bool32 equal(const V4d &v1, const V4d &v2) { return v1.x == v2.x && v1.y == v2.y && v1.z == v2.z && v1.w == v2.w; } - -enum CombineOp -{ - COMBINEREPLACE, - COMBINEPRECONCAT, - COMBINEPOSTCONCAT -}; - - -Quat makeQuat(float32 w, float32 x, float32 y, float32 z); -Quat makeQuat(float32 w, const V3d &vec); - -struct Quat -{ - // order is important for streaming and RW compatibility - float32 x, y, z, w; - - static Quat rotation(float32 angle, const V3d &axis){ - return makeQuat(cosf(angle/2.0f), scale(normalize(axis), sinf(angle/2.0f))); } - void set(float32 w, float32 x, float32 y, float32 z){ - this->w = w; this->x = x; this->y = y; this->z = z; } - V3d vec(void){ return makeV3d(x, y, z); } - - Quat *rotate(const V3d *axis, float32 angle, CombineOp op); -}; - -inline Quat makeQuat(float32 w, float32 x, float32 y, float32 z) { Quat q = { x, y, z, w }; return q; } -inline Quat makeQuat(float32 w, const V3d &vec) { Quat q = { vec.x, vec.y, vec.z, w }; return q; } -inline Quat add(const Quat &q, const Quat &p) { return makeQuat(q.w+p.w, q.x+p.x, q.y+p.y, q.z+p.z); } -inline Quat sub(const Quat &q, const Quat &p) { return makeQuat(q.w-p.w, q.x-p.x, q.y-p.y, q.z-p.z); } -inline Quat negate(const Quat &q) { return makeQuat(-q.w, -q.x, -q.y, -q.z); } -inline float32 dot(const Quat &q, const Quat &p) { return q.w*p.w + q.x*p.x + q.y*p.y + q.z*p.z; } -inline Quat scale(const Quat &q, float32 r) { return makeQuat(q.w*r, q.x*r, q.y*r, q.z*r); } -inline float32 length(const Quat &q) { return sqrtf(q.w*q.w + q.x*q.x + q.y*q.y + q.z*q.z); } -inline Quat normalize(const Quat &q) { return scale(q, 1.0f/length(q)); } -inline Quat conj(const Quat &q) { return makeQuat(q.w, -q.x, -q.y, -q.z); } -Quat mult(const Quat &q, const Quat &p); -inline V3d rotate(const V3d &v, const Quat &q) { return mult(mult(q, makeQuat(0.0f, v)), conj(q)).vec(); } -Quat lerp(const Quat &q, const Quat &p, float32 r); -Quat slerp(const Quat &q, const Quat &p, float32 a); - -struct RawMatrix -{ - V3d right; - float32 rightw; - V3d up; - float32 upw; - V3d at; - float32 atw; - V3d pos; - float32 posw; - - static void mult(RawMatrix *dst, RawMatrix *src1, RawMatrix *src2); - static void transpose(RawMatrix *dst, RawMatrix *src); - static void setIdentity(RawMatrix *dst); -}; - -struct Matrix -{ - enum Type { - TYPENORMAL = 1, - TYPEORTHOGONAL = 2, - TYPEORTHONORMAL = 3, - TYPEMASK = 3 - }; - enum Flags { - IDENTITY = 0x20000 - }; - struct Tolerance { - float32 normal; - float32 orthogonal; - float32 identity; - }; - - V3d right; - uint32 flags; - V3d up; - uint32 pad1; - V3d at; - uint32 pad2; - V3d pos; - uint32 pad3; - - static Matrix *create(void); - void destroy(void); - void setIdentity(void); - void optimize(Tolerance *tolerance = nil); - void update(void) { flags &= ~(IDENTITY|TYPEMASK); } - static Matrix *mult(Matrix *dst, const Matrix *src1, const Matrix *src2); - static Matrix *invert(Matrix *dst, const Matrix *src); - static Matrix *transpose(Matrix *dst, const Matrix *src); - Matrix *rotate(const V3d *axis, float32 angle, CombineOp op); - Matrix *rotate(const Quat &q, CombineOp op); - Matrix *translate(const V3d *translation, CombineOp op); - Matrix *scale(const V3d *scl, CombineOp op); - Matrix *transform(const Matrix *mat, CombineOp op); - Quat getRotation(void); - void lookAt(const V3d &dir, const V3d &up); - - // helper functions. consider private - static void mult_(Matrix *dst, const Matrix *src1, const Matrix *src2); - static void invertOrthonormal(Matrix *dst, const Matrix *src); - static Matrix *invertGeneral(Matrix *dst, const Matrix *src); - static void makeRotation(Matrix *dst, const V3d *axis, float32 angle); - static void makeRotation(Matrix *dst, const Quat &q); -private: - float32 normalError(void); - float32 orthogonalError(void); - float32 identityError(void); -}; - -inline void convMatrix(Matrix *dst, RawMatrix *src){ - *dst = *(Matrix*)src; - dst->optimize(); -} - -inline void convMatrix(RawMatrix *dst, Matrix *src){ - *dst = *(RawMatrix*)src; - dst->rightw = 0.0; - dst->upw = 0.0; - dst->atw = 0.0; - dst->posw = 1.0; -} - -struct Line -{ - V3d start; - V3d end; -}; - -struct Rect -{ - int32 x, y; - int32 w, h; -}; - -struct Sphere -{ - V3d center; - float32 radius; -}; - -struct Plane -{ - V3d normal; - float32 distance; -}; - -struct BBox -{ - V3d sup; - V3d inf; - - void initialize(V3d *point); - void addPoint(V3d *point); - void calculate(V3d *points, int32 n); - bool containsPoint(V3d *point); -}; - -enum PrimitiveType -{ - PRIMTYPENONE = 0, - PRIMTYPELINELIST, - PRIMTYPEPOLYLINE, - PRIMTYPETRILIST, - PRIMTYPETRISTRIP, - PRIMTYPETRIFAN, - PRIMTYPEPOINTLIST -}; - -/* - * Memory - */ - -void memNative32_func(void *data, uint32 size); -void memNative16_func(void *data, uint32 size); -void memLittle32_func(void *data, uint32 size); -void memLittle16_func(void *data, uint32 size); - -#ifdef BIGENDIAN -inline void memNative32(void *data, uint32 size) { memNative32_func(data, size); } -inline void memNative16(void *data, uint32 size) { memNative16_func(data, size); } -inline void memLittle32(void *data, uint32 size) { memLittle32_func(data, size); } -inline void memLittle16(void *data, uint32 size) { memLittle16_func(data, size); } -#define ASSERTLITTLE assert(0 && "unsafe code on big-endian") -#else -inline void memNative32(void *data, uint32 size) { } -inline void memNative16(void *data, uint32 size) { } -inline void memLittle32(void *data, uint32 size) { } -inline void memLittle16(void *data, uint32 size) { } -#define ASSERTLITTLE -#endif - -/* - * Streams - */ - -void makePath(char *filename); - -class Stream -{ -public: - virtual ~Stream(void) { close(); } - virtual void close(void) {} - virtual uint32 write8(const void *data, uint32 length) = 0; - virtual uint32 read8(void *data, uint32 length) = 0; - virtual void seek(int32 offset, int32 whence = 1) = 0; - virtual uint32 tell(void) = 0; - virtual bool eof(void) = 0; - uint32 write32(const void *data, uint32 length); - uint32 write16(const void *data, uint32 length); - uint32 read32(void *data, uint32 length); - uint32 read16(void *data, uint32 length); - int32 writeI8(int8 val); - int32 writeU8(uint8 val); - int32 writeI16(int16 val); - int32 writeU16(uint16 val); - int32 writeI32(int32 val); - int32 writeU32(uint32 val); - int32 writeF32(float32 val); - int8 readI8(void); - uint8 readU8(void); - int16 readI16(void); - uint16 readU16(void); - int32 readI32(void); - uint32 readU32(void); - float32 readF32(void); -}; - -class StreamMemory : public Stream -{ -public: - uint8 *data; - uint32 length; - uint32 capacity; - uint32 position; - - void close(void); - uint32 write8(const void *data, uint32 length); - uint32 read8(void *data, uint32 length); - void seek(int32 offset, int32 whence = 1); - uint32 tell(void); - bool eof(void); - StreamMemory *open(uint8 *data, uint32 length, uint32 capacity = 0); - uint32 getLength(void); - - enum { - S_EOF = 0xFFFFFFFF - }; -}; - -class StreamFile : public Stream -{ -public: - FILE *file; - - StreamFile(void) { file = nil; } - void close(void); - uint32 write8(const void *data, uint32 length); - uint32 read8(void *data, uint32 length); - void seek(int32 offset, int32 whence = 1); - uint32 tell(void); - bool eof(void); - StreamFile *open(const char *path, const char *mode); -}; - -enum Platform -{ - PLATFORM_NULL = 0, - // D3D7 - PLATFORM_GL = 2, - // MAC - PLATFORM_PS2 = 4, - PLATFORM_XBOX = 5, - // GAMECUBE - // SOFTRAS - PLATFORM_D3D8 = 8, - PLATFORM_D3D9 = 9, - // PSP - - // non-stock-RW platforms - - PLATFORM_WDGL = 11, // WarDrum OpenGL - PLATFORM_GL3 = 12, // my GL3 implementation - - NUM_PLATFORMS, - - FOURCC_PS2 = 0x00325350 // 'PS2\0' -}; - -#define MAKEPLUGINID(v, id) (((v & 0xFFFFFF) << 8) | (id & 0xFF)) -#define MAKEPIPEID(v, id) (((v & 0xFFFF) << 16) | (id & 0xFFFF)) - -enum VendorID -{ - VEND_CORE = 0, - VEND_CRITERIONTK = 1, - VEND_CRITERIONINT = 4, - VEND_CRITERIONWORLD = 5, - // Used for rasters (platform-specific) - VEND_RASTER = 10, - // Used for driver/device allocation tags - VEND_DRIVER = 11 -}; - -// TODO: modules (VEND_CRITERIONINT) - -enum PluginID -{ - // Core - ID_NAOBJECT = MAKEPLUGINID(VEND_CORE, 0x00), - ID_STRUCT = MAKEPLUGINID(VEND_CORE, 0x01), - ID_STRING = MAKEPLUGINID(VEND_CORE, 0x02), - ID_EXTENSION = MAKEPLUGINID(VEND_CORE, 0x03), - ID_CAMERA = MAKEPLUGINID(VEND_CORE, 0x05), - ID_TEXTURE = MAKEPLUGINID(VEND_CORE, 0x06), - ID_MATERIAL = MAKEPLUGINID(VEND_CORE, 0x07), - ID_MATLIST = MAKEPLUGINID(VEND_CORE, 0x08), - ID_WORLD = MAKEPLUGINID(VEND_CORE, 0x0B), - ID_MATRIX = MAKEPLUGINID(VEND_CORE, 0x0D), - ID_FRAMELIST = MAKEPLUGINID(VEND_CORE, 0x0E), - ID_GEOMETRY = MAKEPLUGINID(VEND_CORE, 0x0F), - ID_CLUMP = MAKEPLUGINID(VEND_CORE, 0x10), - ID_LIGHT = MAKEPLUGINID(VEND_CORE, 0x12), - ID_ATOMIC = MAKEPLUGINID(VEND_CORE, 0x14), - ID_TEXTURENATIVE = MAKEPLUGINID(VEND_CORE, 0x15), - ID_TEXDICTIONARY = MAKEPLUGINID(VEND_CORE, 0x16), - ID_IMAGE = MAKEPLUGINID(VEND_CORE, 0x18), - ID_GEOMETRYLIST = MAKEPLUGINID(VEND_CORE, 0x1A), - ID_ANIMANIMATION = MAKEPLUGINID(VEND_CORE, 0x1B), - ID_RIGHTTORENDER = MAKEPLUGINID(VEND_CORE, 0x1F), - ID_UVANIMDICT = MAKEPLUGINID(VEND_CORE, 0x2B), - - // Toolkit - ID_SKYMIPMAP = MAKEPLUGINID(VEND_CRITERIONTK, 0x10), - ID_SKIN = MAKEPLUGINID(VEND_CRITERIONTK, 0x16), - ID_HANIM = MAKEPLUGINID(VEND_CRITERIONTK, 0x1E), - ID_USERDATA = MAKEPLUGINID(VEND_CRITERIONTK, 0x1F), - ID_MATFX = MAKEPLUGINID(VEND_CRITERIONTK, 0x20), - ID_ANISOT = MAKEPLUGINID(VEND_CRITERIONTK, 0x27), - ID_PDS = MAKEPLUGINID(VEND_CRITERIONTK, 0x31), - ID_ADC = MAKEPLUGINID(VEND_CRITERIONTK, 0x34), - ID_UVANIMATION = MAKEPLUGINID(VEND_CRITERIONTK, 0x35), - - // World - ID_MESH = MAKEPLUGINID(VEND_CRITERIONWORLD, 0x0E), - ID_NATIVEDATA = MAKEPLUGINID(VEND_CRITERIONWORLD, 0x10), - ID_VERTEXFMT = MAKEPLUGINID(VEND_CRITERIONWORLD, 0x11), - - // custom native raster - ID_RASTERGL = MAKEPLUGINID(VEND_RASTER, PLATFORM_GL), - ID_RASTERPS2 = MAKEPLUGINID(VEND_RASTER, PLATFORM_PS2), - ID_RASTERXBOX = MAKEPLUGINID(VEND_RASTER, PLATFORM_XBOX), - ID_RASTERD3D8 = MAKEPLUGINID(VEND_RASTER, PLATFORM_D3D8), - ID_RASTERD3D9 = MAKEPLUGINID(VEND_RASTER, PLATFORM_D3D9), - ID_RASTERWDGL = MAKEPLUGINID(VEND_RASTER, PLATFORM_WDGL), - ID_RASTERGL3 = MAKEPLUGINID(VEND_RASTER, PLATFORM_GL3), - - // anything driver/device related (only as allocation tag) - ID_DRIVER = MAKEPLUGINID(VEND_DRIVER, 0) -}; - -enum CoreModuleID -{ - ID_NAMODULE = MAKEPLUGINID(VEND_CRITERIONINT, 0x00), - // vector - // matrix - ID_FRAMEMODULE = MAKEPLUGINID(VEND_CRITERIONINT, 0x03), - // stream - // camera - ID_IMAGEMODULE = MAKEPLUGINID(VEND_CRITERIONINT, 0x06), - ID_RASTERMODULE = MAKEPLUGINID(VEND_CRITERIONINT, 0x07), - ID_TEXTUREMODULE = MAKEPLUGINID(VEND_CRITERIONINT, 0x08) - // pip - // immediate - // resources - // device - // color - // unused - // error - // metrics - // driver - // chunk group -}; - -#define ECODE(c, s) c - -enum Errors -{ - ERR_NONE = 0x80000000, -#include "base.err" -}; - -#undef ECODE - -extern int32 version; -extern int32 build; -extern int32 platform; -extern bool32 streamAppendFrames; -extern char *debugFile; - -int strcmp_ci(const char *s1, const char *s2); -int strncmp_ci(const char *s1, const char *s2, int n); - -// 0x04000000 3.1 -// 0x08000000 3.2 -// 0x0C000000 3.3 -// 0x10000000 3.4 -// 0x14000000 3.5 -// 0x18000000 3.6 -// 0x1C000000 3.7 - -inline uint32 -libraryIDPack(int version, int build) -{ - if(version <= 0x31000) - return version>>8; - return ((version-0x30000) & 0x3FF00) << 14 | (version&0x3F) << 16 | - (build & 0xFFFF); -} - -inline int -libraryIDUnpackVersion(uint32 libid) -{ - if(libid & 0xFFFF0000) - return ((libid>>14 & 0x3FF00) + 0x30000) | - (libid>>16 & 0x3F); - else - return libid<<8; -} - -inline int -libraryIDUnpackBuild(uint32 libid) -{ - if(libid & 0xFFFF0000) - return libid & 0xFFFF; - else - return 0; -} - -struct ChunkHeaderInfo -{ - uint32 type; - uint32 length; - uint32 version, build; -}; - -// TODO?: make these methods of ChunkHeaderInfo? -bool writeChunkHeader(Stream *s, int32 type, int32 size); -bool readChunkHeaderInfo(Stream *s, ChunkHeaderInfo *header); -bool findChunk(Stream *s, uint32 type, uint32 *length, uint32 *version); - -int32 findPointer(void *p, void **list, int32 num); -uint8 *getFileContents(const char *name, uint32 *len); -} diff --git a/vendor/librw/src/rwcharset.h b/vendor/librw/src/rwcharset.h deleted file mode 100644 index 3988654..0000000 --- a/vendor/librw/src/rwcharset.h +++ /dev/null @@ -1,25 +0,0 @@ -namespace rw { - -struct Charset -{ - struct Desc { - int32 count; // num of chars - int32 tileWidth, tileHeight; // chars in raster - int32 width, height; // of char - int32 width_internal, height_internal; // + border - } desc; - Raster *raster; - - static bool32 open(void); - static void close(void); - static Charset *create(const RGBA *foreground, const RGBA *background); - void destroy(void); - Charset *setColors(const RGBA *foreground, const RGBA *background); - void print(const char *str, int32 x, int32 y, bool32 hideSpaces); - void printBuffered(const char *str, int32 x, int32 y, bool32 hideSpaces); - static void flushBuffer(void); -private: - void printChar(int32 c, int32 x, int32 y); -}; - -} diff --git a/vendor/librw/src/rwengine.h b/vendor/librw/src/rwengine.h deleted file mode 100644 index a84aa3a..0000000 --- a/vendor/librw/src/rwengine.h +++ /dev/null @@ -1,263 +0,0 @@ -namespace rw { - -// uhhhm..... why are these not actual functions? -enum DeviceReq -{ - // Device initialization before Engine/Driver plugins are opened - DEVICEINIT, - // Device de-initialization after Engine/Driver plugins are closed - DEVICETERM, - - // Device/Context creation - DEVICEOPEN, - // Device/Context shutdown - DEVICECLOSE, - - // Device initialization after Engine/Driver plugins are opened - DEVICEFINALIZE, - // TODO? counterpart to FINALIZE? - - // Video adapters - DEVICEGETNUMSUBSYSTEMS, - DEVICEGETCURRENTSUBSYSTEM, - DEVICESETSUBSYSTEM, - DEVICEGETSUBSSYSTEMINFO, - - // Video modes - DEVICEGETNUMVIDEOMODES, - DEVICEGETCURRENTVIDEOMODE, - DEVICESETVIDEOMODE, - DEVICEGETVIDEOMODEINFO, - - // Multisampling - DEVICEGETMAXMULTISAMPLINGLEVELS, - DEVICEGETMULTISAMPLINGLEVELS, - DEVICESETMULTISAMPLINGLEVELS, - -}; - -typedef int DeviceSystem(DeviceReq req, void *arg, int32 n); - -struct Camera; -struct Image; -struct Texture; -struct Raster; -class ObjPipeline; - -// This is for the render device, we only have one -struct Device -{ - float32 zNear, zFar; - void (*beginUpdate)(Camera*); - void (*endUpdate)(Camera*); - void (*clearCamera)(Camera*, RGBA *col, uint32 mode); - void (*showRaster)(Raster *raster, uint32 flags); - bool32 (*rasterRenderFast)(Raster *raster, int32 x, int32 y); - void (*setRenderState)(int32 state, void *value); - void *(*getRenderState)(int32 state); - - void (*im2DRenderLine)(void *vertices, int32 numVertices, int32 vert1, int32 vert2); - void (*im2DRenderTriangle)(void *vertices, int32 numVertices, int32 vert1, int32 vert2, int32 vert3); - void (*im2DRenderPrimitive)(PrimitiveType primType, void *vertices, int32 numVertices); - void (*im2DRenderIndexedPrimitive)(PrimitiveType primType, void *vertices, int32 numVertices, void *indices, int32 numIndices); - - void (*im3DTransform)(void *vertices, int32 numVertices, Matrix *world, uint32 flags); - void (*im3DRenderPrimitive)(PrimitiveType primType); - void (*im3DRenderIndexedPrimitive)(PrimitiveType primType, void *indices, int32 numIndices); - void (*im3DEnd)(void); - - DeviceSystem *system; -}; - -// This is for platform-dependent but portable things -// so the engine has one for every platform -struct Driver -{ - ObjPipeline *defaultPipeline; - int32 rasterNativeOffset; - - Raster* (*rasterCreate)(Raster*); - uint8 *(*rasterLock)(Raster*, int32 level, int32 lockMode); - void (*rasterUnlock)(Raster*, int32 level); - uint8 *(*rasterLockPalette)(Raster*, int32 lockMode); - void (*rasterUnlockPalette)(Raster*); - int32 (*rasterNumLevels)(Raster*); - bool32 (*imageFindRasterFormat)(Image *img, int32 type, - int32 *width, int32 *height, int32 *depth, int32 *format); - bool32 (*rasterFromImage)(Raster*, Image*); - Image *(*rasterToImage)(Raster*); - - static PluginList s_plglist[NUM_PLATFORMS]; - static int32 registerPlugin(int32 platform, int32 size, uint32 id, - Constructor ctor, Destructor dtor){ - return s_plglist[platform].registerPlugin(size, id, - ctor, dtor, nil); - } -}; - -struct EngineOpenParams; - -enum MemHint -{ - MEMDUR_NA = 0, - // used inside function - MEMDUR_FUNCTION = 0x10000, - // used for one frame - MEMDUR_FRAME = 0x20000, - // used for longer time - MEMDUR_EVENT = 0x30000, - // used while the engine is running - MEMDUR_GLOBAL = 0x40000 -}; - -struct MemoryFunctions -{ - void *(*rwmalloc)(size_t sz, uint32 hint); - void *(*rwrealloc)(void *p, size_t sz, uint32 hint); - void (*rwfree)(void *p); - // These are temporary until we have better error handling - // TODO: Maybe don't put them here since they shouldn't really be switched out - void *(*rwmustmalloc)(size_t sz, uint32 hint); - void *(*rwmustrealloc)(void *p, size_t sz, uint32 hint); -}; - -struct SubSystemInfo -{ - char name[80]; -}; - -enum VideoModeFlags -{ - VIDEOMODEEXCLUSIVE = 1 -}; - -struct VideoMode -{ - int32 width; - int32 height; - int32 depth; - uint32 flags; -}; - -struct Camera; -struct World; - -// This is for platform independent things -// TODO: move more stuff into this -struct Engine -{ - enum State { - Dead = 0, - Initialized, - Opened, - Started - }; - Camera *currentCamera; - World *currentWorld; - LinkList frameDirtyList; - - // Dynamically allocated because of plugins - Driver *driver[NUM_PLATFORMS]; - Device device; - ObjPipeline *dummyDefaultPipeline; - - // These must always be available - static MemoryFunctions memfuncs; - static State state; - - static bool32 init(MemoryFunctions *memfuncs = nil); - static bool32 open(EngineOpenParams*); - static bool32 start(void); - static void term(void); - static void close(void); - static void stop(void); - - static int32 getNumSubSystems(void); - static int32 getCurrentSubSystem(void); - static bool32 setSubSystem(int32 subsys); - static SubSystemInfo *getSubSystemInfo(SubSystemInfo *info, int32 subsys); - - static int32 getNumVideoModes(void); - static int32 getCurrentVideoMode(void); - static bool32 setVideoMode(int32 mode); - static VideoMode *getVideoModeInfo(VideoMode *info, int32 mode); - - static uint32 getMaxMultiSamplingLevels(void); - static uint32 getMultiSamplingLevels(void); - static bool32 setMultiSamplingLevels(uint32 levels); - - static PluginList s_plglist; - static int32 registerPlugin(int32 size, uint32 id, - Constructor ctor, Destructor dtor){ - return s_plglist.registerPlugin(size, id, ctor, dtor, nil); - } -}; - -extern Engine *engine; - -#define RWTOSTR_(X) #X -#define RWTOSTR(X) RWTOSTR_(X) -#define RWHERE "file: " __FILE__ " line: " RWTOSTR(__LINE__) - -extern const char *allocLocation; - -inline void *malloc_LOC(size_t sz, uint32 hint, const char *here) { allocLocation = here; return rw::Engine::memfuncs.rwmalloc(sz,hint); } -inline void *realloc_LOC(void *p, size_t sz, uint32 hint, const char *here) { allocLocation = here; return rw::Engine::memfuncs.rwrealloc(p,sz,hint); } -inline void *mustmalloc_LOC(size_t sz, uint32 hint, const char *here) { allocLocation = here; return rw::Engine::memfuncs.rwmustmalloc(sz,hint); } -inline void *mustrealloc_LOC(void *p, size_t sz, uint32 hint, const char *here) { allocLocation = here; return rw::Engine::memfuncs.rwmustrealloc(p,sz,hint); } - -char *strdup_LOC(const char *s, uint32 hint, const char *here); - -#define rwMalloc(s, h) rw::malloc_LOC(s,h,RWHERE) -#define rwMallocT(t, s, h) (t*)rw::malloc_LOC((s)*sizeof(t),h,RWHERE) -#define rwRealloc(p, s, h) rw::realloc_LOC(p,s,h,RWHERE) -#define rwReallocT(t, p, s, h) (t*)rw::realloc_LOC(p,(s)*sizeof(t),h,RWHERE) -#define rwFree(p) rw::Engine::memfuncs.rwfree(p) -#define rwNew(s, h) rw::mustmalloc_LOC(s,h,RWHERE) -#define rwNewT(t, s, h) (t*)rw::mustmalloc_LOC((s)*sizeof(t),h,RWHERE) -#define rwResize(p, s, h) rw::mustrealloc_LOC(p,s,h,RWHERE) -#define rwResizeT(t, p, s, h) (t*)rw::mustrealloc_LOC(p,(s)*sizeof(t),h,RWHERE) -#define rwStrdup(s, h) rw::strdup_LOC(s,h,RWHERE) - -extern MemoryFunctions defaultMemfuncs; -extern MemoryFunctions managedMemfuncs; -void printleaks(void); // when using managed mem funcs - -namespace null { - void beginUpdate(Camera*); - void endUpdate(Camera*); - void clearCamera(Camera*, RGBA *col, uint32 mode); - void showRaster(Raster*, uint32 flags); - - void setRenderState(int32 state, void *value); - void *getRenderState(int32 state); - - bool32 rasterRenderFast(Raster *raster, int32 x, int32 y); - - Raster *rasterCreate(Raster*); - uint8 *rasterLock(Raster*, int32 level, int32 lockMode); - void rasterUnlock(Raster*, int32 level); - uint8 *rasterLockPalette(Raster*, int32 lockMode); - void rasterUnlockPalette(Raster*); - int32 rasterNumLevels(Raster*); - bool32 imageFindRasterFormat(Image *img, int32 type, - int32 *width, int32 *height, int32 *depth, int32 *format); - bool32 rasterFromImage(Raster*, Image*); - Image *rasterToImage(Raster*); - - void im2DRenderLine(void*, int32, int32, int32); - void im2DRenderTriangle(void*, int32, int32, int32, int32); - void im2DRenderPrimitive(PrimitiveType, void*, int32); - void im2DRenderIndexedPrimitive(PrimitiveType, void*, int32, void*, int32); - - void im3DTransform(void *vertices, int32 numVertices, Matrix *world, uint32 flags); - void im3DRenderPrimitive(PrimitiveType primType); - void im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices); - void im3DEnd(void); - - int deviceSystem(DeviceReq req, void *arg0, int32 n); - - extern Device renderdevice; -} - -} diff --git a/vendor/librw/src/rwerror.h b/vendor/librw/src/rwerror.h deleted file mode 100644 index 2575626..0000000 --- a/vendor/librw/src/rwerror.h +++ /dev/null @@ -1,25 +0,0 @@ -namespace rw { - -struct Error -{ - uint32 plugin; - uint32 code; -}; - -void setError(Error *e); -Error *getError(Error *e); - -#define _ERRORCODE(code, ...) code -char *dbgsprint(uint32 code, ...); - -/* ecode is supposed to be in format "(errorcode, printf-arguments..)" */ -#define RWERROR(ecode) do{ \ - rw::Error _e; \ - _e.plugin = PLUGIN_ID; \ - _e.code = _ERRORCODE ecode; \ - fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \ - fprintf(stderr, "%s\n", rw::dbgsprint ecode); \ - rw::setError(&_e); \ -}while(0) - -} diff --git a/vendor/librw/src/rwobjects.h b/vendor/librw/src/rwobjects.h deleted file mode 100644 index 2a85586..0000000 --- a/vendor/librw/src/rwobjects.h +++ /dev/null @@ -1,904 +0,0 @@ -#include - -namespace rw { - -struct Object -{ - uint8 type; - uint8 subType; - uint8 flags; - uint8 privateFlags; - void *parent; - - void init(uint8 type, uint8 subType){ - this->type = type; - this->subType = subType; - this->flags = 0; - this->privateFlags = 0; - this->parent = nil; - } - void copy(Object *o){ - this->type = o->type; - this->subType = o->subType; - this->flags = o->flags; - this->privateFlags = o->privateFlags; - this->parent = nil; - } -}; - -struct Frame -{ - PLUGINBASE - typedef Frame *(*Callback)(Frame *f, void *data); - enum { ID = 0 }; - enum { // private flags - // The hierarchy has unsynched frames - HIERARCHYSYNCLTM = 0x01, // LTM not synched - HIERARCHYSYNCOBJ = 0x02, // attached objects not synched - HIERARCHYSYNC = HIERARCHYSYNCLTM | HIERARCHYSYNCOBJ, - // This frame is not synched - SUBTREESYNCLTM = 0x04, - SUBTREESYNCOBJ = 0x08, - SUBTREESYNC = SUBTREESYNCLTM | SUBTREESYNCOBJ, - SYNCLTM = HIERARCHYSYNCLTM | SUBTREESYNCLTM, - SYNCOBJ = HIERARCHYSYNCOBJ | SUBTREESYNCOBJ - // STATIC = 0x10 - }; - - Object object; - LLLink inDirtyList; - LinkList objectList; - Matrix matrix; - Matrix ltm; - - Frame *child; - Frame *next; - Frame *root; - - static int32 numAllocated; - - static Frame *create(void); - Frame *cloneHierarchy(void); - void destroy(void); - void destroyHierarchy(void); - Frame *addChild(Frame *f, bool32 append = 0); - Frame *removeChild(void); - Frame *forAllChildren(Callback cb, void *data); - Frame *getParent(void) const { - return (Frame*)this->object.parent; } - int32 count(void); - bool32 dirty(void) const { - return !!(this->root->object.privateFlags & HIERARCHYSYNC); } - Matrix *getLTM(void); - void rotate(const V3d *axis, float32 angle, CombineOp op); - void translate(const V3d *trans, CombineOp op); - void scale(const V3d *scale, CombineOp op); - void transform(const Matrix *mat, CombineOp op); - void updateObjects(void); - - - void syncHierarchyLTM(void); - void setHierarchyRoot(Frame *root); - Frame *cloneAndLink(void); - void purgeClone(void); - -#ifndef RWPUBLIC - static void registerModule(void); -#endif - static void syncDirty(void); -}; - -struct FrameList_ -{ - int32 numFrames; - Frame **frames; - - FrameList_ *streamRead(Stream *stream); - void streamWrite(Stream *stream); - static uint32 streamGetSize(Frame *f); -}; -Frame **makeFrameList(Frame *frame, Frame **flist); - -struct ObjectWithFrame -{ - typedef void (*Sync)(ObjectWithFrame*); - - Object object; - LLLink inFrame; - Sync syncCB; - - void setFrame(Frame *f){ - if(this->object.parent) - this->inFrame.remove(); - this->object.parent = f; - if(f){ - f->objectList.add(&this->inFrame); - f->updateObjects(); - } - } - void sync(void){ this->syncCB(this); } - static ObjectWithFrame *fromFrame(LLLink *lnk){ - return LLLinkGetData(lnk, ObjectWithFrame, inFrame); - } -}; - -struct Image -{ - int32 flags; - int32 width, height; - int32 depth; - int32 bpp; // bytes per pixel - int32 stride; - uint8 *pixels; - uint8 *palette; - - static int32 numAllocated; - - static Image *create(int32 width, int32 height, int32 depth); - void destroy(void); - void allocate(void); - void free(void); - void setPixels(uint8 *pixels); - void setPixelsDXT(int32 type, uint8 *pixels); - void setPalette(uint8 *palette); - void compressPalette(void); // turn 8 bit into 4 bit if possible - bool32 hasAlpha(void); - void convertTo32(void); - void palettize(int32 depth); - void unpalettize(bool forceAlpha = false); - void makeMask(void); - void applyMask(Image *mask); - void removeMask(void); - Image *extractMask(void); - - static void setSearchPath(const char*); - static void printSearchPath(void); - static char *getFilename(const char*); - static Image *read(const char *imageName); - static Image *readMasked(const char *imageName, const char *maskName); - - - typedef Image *(*fileRead)(const char *afilename); - typedef void (*fileWrite)(Image *image, const char *filename); - static bool32 registerFileFormat(const char *ext, fileRead read, fileWrite write); - -#ifndef RWPUBLIC - static void registerModule(void); -#endif -}; - -Image *readTGA(const char *filename); -void writeTGA(Image *image, const char *filename); -Image *readBMP(const char *filename); -void writeBMP(Image *image, const char *filename); -Image *readPNG(const char *filename); -void writePNG(Image *image, const char *filename); - -enum { QUANTDEPTH = 8 }; - -struct ColorQuant -{ - struct Node { - uint32 r, g, b, a; - int32 numPixels; - Node *parent; - Node *children[16]; - LLLink link; - - void destroy(void); - void addColor(RGBA color); - bool isLeaf(void) { for(int32 i = 0; i < 16; i++) if(this->children[i]) return false; return true; } - }; - - Node *root; - LinkList leaves; - - void init(void); - void destroy(void); - Node *createNode(int32 level); - Node *getNode(Node *root, uint32 addr, int32 level); - Node *findNode(Node *root, uint32 addr, int32 level); - void reduceNode(Node *node); - void addColor(RGBA color); - uint8 findColor(RGBA color); - void addImage(Image *img); - void makePalette(int32 numColors, RGBA *colors); - void matchImage(uint8 *dstPixels, uint32 dstStride, Image *src); -}; - -// used to emulate d3d and xbox textures -struct RasterLevels -{ - int32 numlevels; - uint32 format; - struct Level { - int32 width, height, size; - uint8 *data; - } levels[1]; // 0 is illegal :/ -}; - -struct Raster -{ - enum { FLIPWAITVSYNCH = 1 }; - - PLUGINBASE - int32 platform; - - // TODO: use bytes - int32 type; - int32 flags; - int32 privateFlags; - int32 format; - int32 width, height, depth; - int32 stride; - uint8 *pixels; - uint8 *palette; - // remember for locked rasters - uint8 *originalPixels; - int32 originalWidth; - int32 originalHeight; - int32 originalStride; - // subraster - Raster *parent; - int32 offsetX, offsetY; - - static int32 numAllocated; - - static Raster *create(int32 width, int32 height, int32 depth, - int32 format, int32 platform = 0); - void subRaster(Raster *parent, Rect *r); - void destroy(void); - static bool32 imageFindRasterFormat(Image *image, int32 type, - int32 *pWidth, int32 *pHeight, int32 *pDepth, int32 *pFormat, int32 platform = 0); - Raster *setFromImage(Image *image, int32 platform = 0); - static Raster *createFromImage(Image *image, int32 platform = 0); - Image *toImage(void); - uint8 *lock(int32 level, int32 lockMode); - void unlock(int32 level); - uint8 *lockPalette(int32 lockMode); - void unlockPalette(void); - int32 getNumLevels(void); - static int32 calculateNumLevels(int32 width, int32 height); - static bool formatHasAlpha(int32 format); - - void show(uint32 flags); - - static Raster *pushContext(Raster *raster); - static Raster *popContext(void); - static Raster *getCurrentContext(void); - bool32 renderFast(int32 x, int32 y); - - static Raster *convertTexToCurrentPlatform(Raster *ras); -#ifndef RWPUBLIC - static void registerModule(void); -#endif - - enum Format { - DEFAULT = 0, - C1555 = 0x0100, - C565 = 0x0200, - C4444 = 0x0300, - LUM8 = 0x0400, - C8888 = 0x0500, - C888 = 0x0600, - D16 = 0x0700, - D24 = 0x0800, - D32 = 0x0900, - C555 = 0x0A00, - AUTOMIPMAP = 0x1000, - PAL8 = 0x2000, - PAL4 = 0x4000, - MIPMAP = 0x8000 - }; - enum Type { - NORMAL = 0x00, - ZBUFFER = 0x01, - CAMERA = 0x02, - TEXTURE = 0x04, - CAMERATEXTURE = 0x05, - DONTALLOCATE = 0x80 - }; - enum LockMode { - LOCKWRITE = 1, - LOCKREAD = 2, - LOCKNOFETCH = 4, // don't fetch pixel data - LOCKRAW = 8, - }; - - enum - { - // from RW - PRIVATELOCK_READ = 0x02, - PRIVATELOCK_WRITE = 0x04, - PRIVATELOCK_READ_PALETTE = 0x08, - PRIVATELOCK_WRITE_PALETTE = 0x10, - }; -}; - -void conv_RGBA8888_from_RGBA8888(uint8 *out, uint8 *in); -void conv_BGRA8888_from_RGBA8888(uint8 *out, uint8 *in); -void conv_RGBA8888_from_RGB888(uint8 *out, uint8 *in); -void conv_BGRA8888_from_RGB888(uint8 *out, uint8 *in); -void conv_RGB888_from_RGB888(uint8 *out, uint8 *in); -void conv_BGR888_from_RGB888(uint8 *out, uint8 *in); -void conv_ARGB1555_from_ARGB1555(uint8 *out, uint8 *in); -void conv_ARGB1555_from_RGB555(uint8 *out, uint8 *in); -void conv_RGBA5551_from_ARGB1555(uint8 *out, uint8 *in); -void conv_ARGB1555_from_RGBA5551(uint8 *out, uint8 *in); -void conv_RGBA8888_from_ARGB1555(uint8 *out, uint8 *in); -void conv_ABGR1555_from_ARGB1555(uint8 *out, uint8 *in); -inline void conv_8_from_8(uint8 *out, uint8 *in) { *out = *in; } -// some swaps are the same, so these are just more descriptive names -inline void conv_RGBA8888_from_BGRA8888(uint8 *out, uint8 *in) { conv_BGRA8888_from_RGBA8888(out, in); } -inline void conv_RGB888_from_BGR888(uint8 *out, uint8 *in) { conv_BGR888_from_RGB888(out, in); } -inline void conv_ARGB1555_from_ABGR1555(uint8 *out, uint8 *in) { conv_ABGR1555_from_ARGB1555(out, in); } - -void expandPal4(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h); -void compressPal4(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h); -void expandPal4_BE(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h); -void compressPal4_BE(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h); -void copyPal8(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h); - -void flipDXT(int32 type, uint8 *dst, uint8 *src, uint32 width, uint32 height); - - -#define IGNORERASTERIMP 0 - -struct TexDictionary; - -struct Texture -{ - enum FilterMode { - NEAREST = 1, - LINEAR, - MIPNEAREST, // one mipmap - MIPLINEAR, - LINEARMIPNEAREST, // mipmap interpolated - LINEARMIPLINEAR - }; - enum Addressing { - WRAP = 1, - MIRROR, - CLAMP, - BORDER - }; - - PLUGINBASE - Raster *raster; - TexDictionary *dict; - LLLink inDict; - char name[32]; - char mask[32]; - uint32 filterAddressing; // VVVVUUUU FFFFFFFF - int32 refCount; - - LLLink inGlobalList; // actually not in RW - - static int32 numAllocated; - - static Texture *create(Raster *raster); - void addRef(void) { this->refCount++; } - void destroy(void); - static Texture *fromDict(LLLink *lnk){ - return LLLinkGetData(lnk, Texture, inDict); } - FilterMode getFilter(void) { return (FilterMode)(filterAddressing & 0xFF); } - void setFilter(FilterMode f) { filterAddressing = (filterAddressing & ~0xFF) | f; } - Addressing getAddressU(void) { return (Addressing)((filterAddressing >> 8) & 0xF); } - Addressing getAddressV(void) { return (Addressing)((filterAddressing >> 12) & 0xF); } - void setAddressU(Addressing u) { filterAddressing = (filterAddressing & ~0xF00) | u<<8; } - void setAddressV(Addressing v) { filterAddressing = (filterAddressing & ~0xF000) | v<<12; } - static Texture *streamRead(Stream *stream); - bool streamWrite(Stream *stream); - uint32 streamGetSize(void); - static Texture *read(const char *name, const char *mask); - static Texture *streamReadNative(Stream *stream); - void streamWriteNative(Stream *stream); - uint32 streamGetSizeNative(void); - - static Texture *(*findCB)(const char *name); - static Texture *(*readCB)(const char *name, const char *mask); - static void setLoadTextures(bool32); // default: true - static void setCreateDummies(bool32); // default: false - static void setMipmapping(bool32); // default: false - static void setAutoMipmapping(bool32); // default: false - static bool32 getMipmapping(void); - static bool32 getAutoMipmapping(void); - - void setMaxAnisotropy(int32 maxaniso); // only if plugin is attached - int32 getMaxAnisotropy(void); - -#ifndef RWPUBLIC - static void registerModule(void); -#endif -}; - -extern int32 anisotOffset; -#define GETANISOTROPYEXT(texture) PLUGINOFFSET(int32, texture, rw::anisotOffset) -void registerAnisotropyPlugin(void); -int32 getMaxSupportedMaxAnisotropy(void); - -struct SurfaceProperties -{ - float32 ambient; - float32 specular; - float32 diffuse; -}; - -struct Material -{ - PLUGINBASE - Texture *texture; - RGBA color; - SurfaceProperties surfaceProps; - Pipeline *pipeline; - int32 refCount; - - static int32 numAllocated; - - static Material *create(void); - void addRef(void) { this->refCount++; } - Material *clone(void); - void destroy(void); - void setTexture(Texture *tex); - static Material *streamRead(Stream *stream); - bool streamWrite(Stream *stream); - uint32 streamGetSize(void); -}; - -void registerMaterialRightsPlugin(void); - -struct Mesh -{ - uint16 *indices; - uint32 numIndices; - Material *material; -}; - -struct MeshHeader -{ - enum { - TRISTRIP = 1 - }; - uint32 flags; - uint16 numMeshes; - uint16 serialNum; - uint32 totalIndices; - uint32 pad; // needed for alignment of Meshes - // after this the meshes - - Mesh *getMeshes(void) { return (Mesh*)(this+1); } - void setupIndices(void); - uint32 guessNumTriangles(void); -}; - -struct Geometry; - -struct MorphTarget -{ - Geometry *parent; - Sphere boundingSphere; - V3d *vertices; - V3d *normals; - - Sphere calculateBoundingSphere(void) const; -}; - -struct InstanceDataHeader -{ - uint32 platform; -}; - -struct Triangle -{ - uint16 v[3]; - uint16 matId; -}; - -struct MaterialList -{ - Material **materials; - int32 numMaterials; - int32 space; - - void init(void); - void deinit(void); - int32 appendMaterial(Material *mat); - int32 findIndex(Material *mat); - static MaterialList *streamRead(Stream *stream, MaterialList *matlist); - bool streamWrite(Stream *stream); - uint32 streamGetSize(void); -}; - -struct Geometry -{ - PLUGINBASE - enum { ID = 8 }; - Object object; - uint32 flags; - uint16 lockedSinceInst; - int32 numTriangles; - int32 numVertices; - int32 numMorphTargets; - int32 numTexCoordSets; - - Triangle *triangles; - RGBA *colors; - TexCoords *texCoords[8]; - - MorphTarget *morphTargets; - MaterialList matList; - - MeshHeader *meshHeader; - InstanceDataHeader *instData; - - int32 refCount; - - static int32 numAllocated; - - static Geometry *create(int32 numVerts, int32 numTris, uint32 flags); - void addRef(void) { this->refCount++; } - void destroy(void); - void lock(int32 lockFlags); - void unlock(void); - void addMorphTargets(int32 n); - void calculateBoundingSphere(void); - bool32 hasColoredMaterial(void); - void allocateData(void); - MeshHeader *allocateMeshes(int32 numMeshes, uint32 numIndices, bool32 noIndices); - void generateTriangles(int8 *adc = nil); - void buildMeshes(void); - void buildTristrips(void); // private, used by buildMeshes - void correctTristripWinding(void); - void removeUnusedMaterials(void); - static Geometry *streamRead(Stream *stream); - bool streamWrite(Stream *stream); - uint32 streamGetSize(void); - - enum Flags - { - TRISTRIP = 0x01, - POSITIONS = 0x02, - TEXTURED = 0x04, - PRELIT = 0x08, - NORMALS = 0x10, - LIGHT = 0x20, - MODULATE = 0x40, - TEXTURED2 = 0x80, - // When this flag is set the geometry has - // native geometry. When streamed out this geometry - // is written out instead of the platform independent data. - // When streamed in with this flag, the geometry is mostly empty. - NATIVE = 0x01000000, - // Just for documentation: RW sets this flag - // to prevent rendering when executing a pipeline, - // so only instancing will occur. - // librw's pipelines are different so it's unused here. - NATIVEINSTANCE = 0x02000000 - }; - - enum LockFlags - { - LOCKPOLYGONS = 0x0001, - LOCKVERTICES = 0x0002, - LOCKNORMALS = 0x0004, - LOCKPRELIGHT = 0x0008, - - LOCKTEXCOORDS = 0x0010, - LOCKTEXCOORDS1 = 0x0010, - LOCKTEXCOORDS2 = 0x0020, - LOCKTEXCOORDS3 = 0x0040, - LOCKTEXCOORDS4 = 0x0080, - LOCKTEXCOORDS5 = 0x0100, - LOCKTEXCOORDS6 = 0x0200, - LOCKTEXCOORDS7 = 0x0400, - LOCKTEXCOORDS8 = 0x0800, - LOCKTEXCOORDSALL = 0x0ff0, - - LOCKALL = 0x0fff - }; -}; - -void registerMeshPlugin(void); -void registerNativeDataPlugin(void); - -struct Clump; -struct World; - -struct Atomic -{ - PLUGINBASE - typedef void (*RenderCB)(Atomic *atomic); - enum { ID = 1 }; - enum { - // flags - COLLISIONTEST = 0x01, // unused here - RENDER = 0x04, - // private flags - WORLDBOUNDDIRTY = 0x01, - // for setGeometry - SAMEBOUNDINGSPHERE = 0x01 - }; - - ObjectWithFrame object; - Geometry *geometry; - Sphere boundingSphere; - Sphere worldBoundingSphere; - Clump *clump; - LLLink inClump; - ObjPipeline *pipeline; - RenderCB renderCB; - - World *world; - ObjectWithFrame::Sync originalSync; - - static int32 numAllocated; - - static Atomic *create(void); - Atomic *clone(void); - void destroy(void); - void setFrame(Frame *f) { - this->object.setFrame(f); - this->object.object.privateFlags |= WORLDBOUNDDIRTY; - } - Frame *getFrame(void) const { return (Frame*)this->object.object.parent; } - static Atomic *fromClump(LLLink *lnk){ - return LLLinkGetData(lnk, Atomic, inClump); } - void setGeometry(Geometry *geo, uint32 flags); - Sphere *getWorldBoundingSphere(void); - ObjPipeline *getPipeline(void); - void instance(void); - void uninstance(void); - void render(void) { this->renderCB(this); } - void setRenderCB(RenderCB renderCB){ - this->renderCB = renderCB; - if(this->renderCB == nil) - this->renderCB = defaultRenderCB; - }; - void setFlags(uint32 flags) { this->object.object.flags = flags; } - uint32 getFlags(void) const { return this->object.object.flags; } - static Atomic *streamReadClump(Stream *stream, - FrameList_ *frameList, Geometry **geometryList); - bool streamWriteClump(Stream *stream, FrameList_ *frmlst); - uint32 streamGetSize(void); - - static void defaultRenderCB(Atomic *atomic); -}; - -void registerAtomicRightsPlugin(void); - -struct Light -{ - PLUGINBASE - enum { ID = 3 }; - ObjectWithFrame object; - float32 radius; - RGBAf color; - float32 minusCosAngle; - LLLink inWorld; - - // clump extension - Clump *clump; - LLLink inClump; - - // world extension - World *world; - ObjectWithFrame::Sync originalSync; - - static int32 numAllocated; - - static Light *create(int32 type); - void destroy(void); - void setFrame(Frame *f) { this->object.setFrame(f); } - Frame *getFrame(void) const { return (Frame*)this->object.object.parent; } - static Light *fromClump(LLLink *lnk){ - return LLLinkGetData(lnk, Light, inClump); } - static Light *fromWorld(LLLink *lnk){ - return LLLinkGetData(lnk, Light, inWorld); } - void setAngle(float32 angle); - float32 getAngle(void); - void setColor(float32 r, float32 g, float32 b); - int32 getType(void){ return this->object.object.subType; } - void setFlags(uint32 flags) { this->object.object.flags = flags; } - uint32 getFlags(void) { return this->object.object.flags; } - static Light *streamRead(Stream *stream); - bool streamWrite(Stream *stream); - uint32 streamGetSize(void); - - enum Type { - DIRECTIONAL = 1, - AMBIENT, - POINT = 0x80, // positioned - SPOT, - SOFTSPOT - }; - enum Flags { - LIGHTATOMICS = 1, - LIGHTWORLD = 2 - }; -}; - -struct FrustumPlane -{ - Plane plane; - /* Used for BBox tests: - * 0 = inf is closer to normal direction - * 1 = sup is closer to normal direction */ - uint8 closestX; - uint8 closestY; - uint8 closestZ; -}; - -struct Camera -{ - PLUGINBASE - enum { ID = 4 }; - enum { PERSPECTIVE = 1, PARALLEL }; - enum { CLEARIMAGE = 0x1, CLEARZ = 0x2, CLEARSTENCIL = 0x4 }; - // return value of frustumTestSphere - enum { SPHEREOUTSIDE, SPHEREBOUNDARY, SPHEREINSIDE }; - - ObjectWithFrame object; - void (*beginUpdateCB)(Camera*); - void (*endUpdateCB)(Camera*); - V2d viewWindow; - V2d viewOffset; - float32 nearPlane, farPlane; - float32 fogPlane; - int32 projection; - - Matrix viewMatrix; - float32 zScale, zShift; - - FrustumPlane frustumPlanes[6]; - V3d frustumCorners[8]; - BBox frustumBoundBox; - - Raster *frameBuffer; - Raster *zBuffer; - - // Device dependent view and projection matrices - // optional - RawMatrix devView; - RawMatrix devProj; - - // clump link handled by plugin in RW - Clump *clump; - LLLink inClump; - - // world extension - /* RW: frustum sectors, space, position */ - World *world; - ObjectWithFrame::Sync originalSync; - void (*originalBeginUpdate)(Camera*); - void (*originalEndUpdate)(Camera*); - - static int32 numAllocated; - - static Camera *create(void); - Camera *clone(void); - void destroy(void); - void setFrame(Frame *f) { this->object.setFrame(f); } - Frame *getFrame(void)const { return (Frame*)this->object.object.parent; } - static Camera *fromClump(LLLink *lnk){ - return LLLinkGetData(lnk, Camera, inClump); } - void beginUpdate(void) { this->beginUpdateCB(this); } - void endUpdate(void) { this->endUpdateCB(this); } - void clear(RGBA *col, uint32 mode); - void showRaster(uint32 flags); - void setNearPlane(float32); - void setFarPlane(float32); - void setViewWindow(const V2d *window); - void setViewOffset(const V2d *offset); - void setProjection(int32 proj); - int32 frustumTestSphere(const Sphere *s) const; - static Camera *streamRead(Stream *stream); - bool streamWrite(Stream *stream); - uint32 streamGetSize(void); - - // fov in degrees - void setFOV(float32 fov, float32 ratio); -}; - -struct Clump -{ - PLUGINBASE - enum { ID = 2 }; - Object object; - LinkList atomics; - LinkList lights; - LinkList cameras; - - World *world; - LLLink inWorld; - - static int32 numAllocated; - - static Clump *create(void); - Clump *clone(void); - void destroy(void); - static Clump *fromWorld(LLLink *lnk){ - return LLLinkGetData(lnk, Clump, inWorld); } - int32 countAtomics(void) { return this->atomics.count(); } - void addAtomic(Atomic *a); - void removeAtomic(Atomic *a); - int32 countLights(void) { return this->lights.count(); } - void addLight(Light *l); - void removeLight(Light *l); - int32 countCameras(void) { return this->cameras.count(); } - void addCamera(Camera *c); - void removeCamera(Camera *c); - void setFrame(Frame *f){ - this->object.parent = f; } - Frame *getFrame(void) const { - return (Frame*)this->object.parent; } - static Clump *streamRead(Stream *stream); - bool streamWrite(Stream *stream); - uint32 streamGetSize(void); - void render(void); -}; - -// used by enumerateLights for lighting callback -struct WorldLights -{ - int32 numAmbients; - RGBAf ambient; // all ambients added - int32 numDirectionals; - Light **directionals; // only directionals - int32 numLocals; - Light **locals; // points, (soft)spots -}; - -// A bit of a stub right now -struct World -{ - PLUGINBASE - enum { ID = 7 }; - Object object; - LinkList localLights; // these have positions (type >= 0x80) - LinkList globalLights; // these do not (type < 0x80) - LinkList clumps; - - static int32 numAllocated; - - static World *create(void); - void destroy(void); - void addLight(Light *light); - void removeLight(Light *light); - void addCamera(Camera *cam); - void removeCamera(Camera *cam); - void addAtomic(Atomic *atomic); - void removeAtomic(Atomic *atomic); - void addClump(Clump *clump); - void removeClump(Clump *clump); - void render(void); - void enumerateLights(Atomic *atomic, WorldLights *lightData); -}; - -struct TexDictionary -{ - PLUGINBASE - enum { ID = 6 }; - Object object; - LinkList textures; - LLLink inGlobalList; - - static int32 numAllocated; - - static TexDictionary *create(void); - static TexDictionary *fromLink(LLLink *lnk){ - return LLLinkGetData(lnk, TexDictionary, inGlobalList); } - void destroy(void); - int32 count(void) { return this->textures.count(); } - void add(Texture *t); - void addFront(Texture *t); - void remove(Texture *t); - Texture *find(const char *name); - static TexDictionary *streamRead(Stream *stream); - void streamWrite(Stream *stream); - uint32 streamGetSize(void); - - static void setCurrent(TexDictionary *txd); - static TexDictionary *getCurrent(void); -}; - -} diff --git a/vendor/librw/src/rwpipeline.h b/vendor/librw/src/rwpipeline.h deleted file mode 100644 index 9a0410a..0000000 --- a/vendor/librw/src/rwpipeline.h +++ /dev/null @@ -1,65 +0,0 @@ -namespace rw { - -struct Atomic; - -class Pipeline -{ -public: - uint32 pluginID; - uint32 pluginData; - int32 platform; - - void init(uint32 platform) { - this->pluginID = 0; - this->pluginData = 0; - this->platform = platform; - } -}; - -class ObjPipeline : public Pipeline -{ -public: - void init(uint32 platform); - static ObjPipeline *create(void); // always PLATFORM_NULL - void destroy(void); - - // not the most beautiful way of doing things but still - // better than virtual methods (i hope?). - struct { - void (*instance)(ObjPipeline *pipe, Atomic *atomic); - void (*uninstance)(ObjPipeline *pipe, Atomic *atomic); - void (*render)(ObjPipeline *pipe, Atomic *atomic); - } impl; - // just for convenience - void instance(Atomic *atomic) { this->impl.instance(this, atomic); } - void uninstance(Atomic *atomic) { this->impl.uninstance(this, atomic); } - void render(Atomic *atomic) { this->impl.render(this, atomic); } -}; - -void findMinVertAndNumVertices(uint16 *indices, uint32 numIndices, uint32 *minVert, int32 *numVertices); - -// everything xbox, d3d8 and d3d9 may want to use -enum { - VERT_BYTE2 = 1, - VERT_BYTE3, - VERT_SHORT2, - VERT_SHORT3, - VERT_NORMSHORT2, - VERT_NORMSHORT3, - VERT_FLOAT2, - VERT_FLOAT3, - VERT_FLOAT4, - VERT_ARGB, - VERT_RGBA, - VERT_COMPNORM -}; - -void instV4d(int type, uint8 *dst, V4d *src, uint32 numVertices, uint32 stride); -void instV3d(int type, uint8 *dst, V3d *src, uint32 numVertices, uint32 stride); -void uninstV3d(int type, V3d *dst, uint8 *src, uint32 numVertices, uint32 stride); -void instTexCoords(int type, uint8 *dst, TexCoords *src, uint32 numVertices, uint32 stride); -void uninstTexCoords(int type, TexCoords *dst, uint8 *src, uint32 numVertices, uint32 stride); -bool32 instColor(int type, uint8 *dst, RGBA *src, uint32 numVertices, uint32 stride); -void uninstColor(int type, RGBA *dst, uint8 *src, uint32 numVertices, uint32 stride); - -} diff --git a/vendor/librw/src/rwplg.h b/vendor/librw/src/rwplg.h deleted file mode 100644 index ad2116a..0000000 --- a/vendor/librw/src/rwplg.h +++ /dev/null @@ -1,85 +0,0 @@ -namespace rw { - -#define PLUGINOFFSET(type, base, offset) \ - ((type*)((char*)(base) + (offset))) - -typedef void *(*Constructor)(void *object, int32 offset, int32 size); -typedef void *(*Destructor)(void *object, int32 offset, int32 size); -typedef void *(*CopyConstructor)(void *dst, void *src, int32 offset, int32 size); -typedef Stream *(*StreamRead)(Stream *stream, int32 length, void *object, int32 offset, int32 size); -typedef Stream *(*StreamWrite)(Stream *stream, int32 length, void *object, int32 offset, int32 size); -typedef int32 (*StreamGetSize)(void *object, int32 offset, int32 size); -typedef void (*RightsCallback)(void *object, int32 offset, int32 size, uint32 data); -typedef void (*AlwaysCallback)(void *object, int32 offset, int32 size); - -struct PluginList -{ - int32 size; - int32 defaultSize; - LinkList plugins; - - PluginList(void) {} - PluginList(int32 defSize) - : size(defSize), defaultSize(defSize) - { plugins.init(); } - - static void open(void); - static void close(void); - - void construct(void *); - void destruct(void *); - void copy(void *dst, void *src); - bool streamRead(Stream *stream, void *); - void streamWrite(Stream *stream, void *); - int streamGetSize(void *); - void streamSkip(Stream *stream); - void assertRights(void *, uint32 pluginID, uint32 data); - - int32 registerPlugin(int32 size, uint32 id, - Constructor, Destructor, CopyConstructor); - int32 registerStream(uint32 id, StreamRead, StreamWrite, StreamGetSize); - int32 setStreamRightsCallback(uint32 id, RightsCallback cb); - int32 setStreamAlwaysCallback(uint32 id, AlwaysCallback cb); - int32 getPluginOffset(uint32 id); -}; - -struct Plugin -{ - int32 offset; - int32 size; - uint32 id; - Constructor constructor; - Destructor destructor; - CopyConstructor copy; - StreamRead read; - StreamWrite write; - StreamGetSize getSize; - RightsCallback rightsCallback; - AlwaysCallback alwaysCallback; - PluginList *parentList; - LLLink inParentList; - LLLink inGlobalList; -}; - -#define PLUGINBASE \ - static PluginList s_plglist; \ - static int32 registerPlugin(int32 size, uint32 id, Constructor ctor, \ - Destructor dtor, CopyConstructor copy){ \ - return s_plglist.registerPlugin(size, id, ctor, dtor, copy); \ - } \ - static int32 registerPluginStream(uint32 id, StreamRead read, \ - StreamWrite write, StreamGetSize getSize){ \ - return s_plglist.registerStream(id, read, write, getSize); \ - } \ - static int32 setStreamRightsCallback(uint32 id, RightsCallback cb){ \ - return s_plglist.setStreamRightsCallback(id, cb); \ - } \ - static int32 setStreamAlwaysCallback(uint32 id, AlwaysCallback cb){ \ - return s_plglist.setStreamAlwaysCallback(id, cb); \ - } \ - static int32 getPluginOffset(uint32 id){ \ - return s_plglist.getPluginOffset(id); \ - } - - -} diff --git a/vendor/librw/src/rwplugins.h b/vendor/librw/src/rwplugins.h deleted file mode 100644 index 65a63b7..0000000 --- a/vendor/librw/src/rwplugins.h +++ /dev/null @@ -1,249 +0,0 @@ -namespace rw { - -/* - * HAnim - */ - -struct HAnimKeyFrame -{ - HAnimKeyFrame *prev; - float32 time; - Quat q; - V3d t; -}; - -struct HAnimInterpFrame -{ - HAnimKeyFrame *keyFrame1; - HAnimKeyFrame *keyFrame2; - Quat q; - V3d t; -}; - -struct HAnimNodeInfo -{ - int32 id; - int32 index; - int32 flags; - Frame *frame; -}; - -struct HAnimHierarchy -{ - int32 flags; - int32 numNodes; - Matrix *matrices; - void *matricesUnaligned; - HAnimNodeInfo *nodeInfo; - Frame *parentFrame; - HAnimHierarchy *parentHierarchy; // mostly unused - AnimInterpolator *interpolator; - - static HAnimHierarchy *create(int32 numNodes, int32 *nodeFlags, - int32 *nodeIDs, int32 flags, int32 maxKeySize); - void destroy(void); - void attachByIndex(int32 id); - void attach(void); - int32 getIndex(int32 id); - int32 getIndex(Frame *f); - void updateMatrices(void); - - static HAnimHierarchy *get(Frame *f); - static HAnimHierarchy *get(Clump *c){ - return find(c->getFrame()); } - static HAnimHierarchy *find(Frame *f); - - enum Flags { - SUBHIERARCHY = 0x1, - NOMATRICES = 0x2, - - UPDATEMODELLINGMATRICES = 0x1000, - UPDATELTMS = 0x2000, - LOCALSPACEMATRICES = 0x4000 - }; - enum NodeFlag { - POP = 1, - PUSH - }; -}; - -struct HAnimData -{ - int32 id; - HAnimHierarchy *hierarchy; - - static HAnimData *get(Frame *f); -}; - -extern int32 hAnimOffset; -extern bool32 hAnimDoStream; -void registerHAnimPlugin(void); - - -/* - * MatFX - */ - -struct MatFX -{ - enum { - NOTHING = 0, - BUMPMAP, - ENVMAP, - BUMPENVMAP, // BUMP | ENV - DUAL, - UVTRANSFORM, - DUALUVTRANSFORM - }; - struct Bump { - Frame *frame; - Texture *bumpedTex; - Texture *tex; - float coefficient; - }; - struct Env { - Frame *frame; - Texture *tex; - float coefficient; - int32 fbAlpha; - }; - struct Dual { - Texture *tex; - int32 srcBlend; - int32 dstBlend; - }; - struct UVtransform { - Matrix *baseTransform; - Matrix *dualTransform; - }; - struct { - uint32 type; - union { - Bump bump; - Env env; - Dual dual; - UVtransform uvtransform; - }; - } fx[2]; - uint32 type; - - static void setEffects(Material *m, uint32 flags); - static uint32 getEffects(const Material *m); - static MatFX *get(const Material *m); - int32 getEffectIndex(uint32 type); - // Bump - void setBumpTexture(Texture *t); - void setBumpCoefficient(float32 coef); - Texture *getBumpTexture(void); - float32 getBumpCoefficient(void); - // Env - void setEnvTexture(Texture *t); - void setEnvFrame(Frame *f); - void setEnvCoefficient(float32 coef); - void setEnvFBAlpha(bool32 useFBAlpha); - Texture *getEnvTexture(void); - Frame *getEnvFrame(void); - float32 getEnvCoefficient(void); - bool32 getEnvFBAlpha(void); - // Dual - void setDualTexture(Texture *t); - void setDualSrcBlend(int32 blend); - void setDualDestBlend(int32 blend); - Texture *getDualTexture(void); - int32 getDualSrcBlend(void); - int32 getDualDestBlend(void); - // UV transform - void setUVTransformMatrices(Matrix *base, Matrix *dual); - void getUVTransformMatrices(Matrix **base, Matrix **dual); - - static void enableEffects(Atomic *atomic); - static void disableEffects(Atomic *atomic); - static bool32 getEffects(Atomic *atomic); - - static bool32 modulateEnvMap; -}; - -struct MatFXGlobals -{ - int32 atomicOffset; - int32 materialOffset; - ObjPipeline *pipelines[NUM_PLATFORMS]; - ObjPipeline *dummypipe; -}; -extern MatFXGlobals matFXGlobals; -void registerMatFXPlugin(void); - - -/* - * Skin - */ - -struct SkinGlobals -{ - int32 geoOffset; - int32 atomicOffset; - ObjPipeline *pipelines[NUM_PLATFORMS]; - ObjPipeline *dummypipe; -}; -extern SkinGlobals skinGlobals; - -struct Skin -{ - int32 numBones; - int32 numUsedBones; - int32 numWeights; - uint8 *usedBones; - float *inverseMatrices; - uint8 *indices; - float *weights; - - // split skin - - // points into rle for each mesh - struct RLEcount { - uint8 start; - uint8 size; - }; - // run length encoded used bones - struct RLE { - uint8 startbone; // into remapIndices - uint8 n; - }; - int32 boneLimit; - int32 numMeshes; - int32 rleSize; - int8 *remapIndices; - RLEcount *rleCount; - RLE *rle; - - uint8 *data; // only used by delete - void *platformData; // a place to store platform specific stuff - bool32 legacyType; // old skin attached to atomic, needed for always CB - - void init(int32 numBones, int32 numUsedBones, int32 numVertices); - void findNumWeights(int32 numVertices); - void findUsedBones(int32 numVertices); - - static void setPipeline(Atomic *a, int32 type); - static Skin *get(const Geometry *geo){ - return *PLUGINOFFSET(Skin*, geo, skinGlobals.geoOffset); - } - static void set(Geometry *geo, Skin *skin){ - *PLUGINOFFSET(Skin*, geo, skinGlobals.geoOffset) = skin; - } - static void setHierarchy(Atomic *atomic, HAnimHierarchy *hier){ - *PLUGINOFFSET(HAnimHierarchy*, atomic, - skinGlobals.atomicOffset) = hier; - } - static HAnimHierarchy *getHierarchy(const Atomic *atomic){ - return *PLUGINOFFSET(HAnimHierarchy*, atomic, - skinGlobals.atomicOffset); - } -}; - -Stream *readSkinSplitData(Stream *stream, Skin *skin); -Stream *writeSkinSplitData(Stream *stream, Skin *skin); -int32 skinSplitDataSize(Skin *skin); -void registerSkinPlugin(void); - -} diff --git a/vendor/librw/src/rwrender.h b/vendor/librw/src/rwrender.h deleted file mode 100644 index 5882356..0000000 --- a/vendor/librw/src/rwrender.h +++ /dev/null @@ -1,137 +0,0 @@ -namespace rw { - -// Render states - -enum RenderState -{ - TEXTURERASTER, - TEXTUREADDRESS, - TEXTUREADDRESSU, - TEXTUREADDRESSV, - TEXTUREFILTER, - VERTEXALPHA, - SRCBLEND, - DESTBLEND, - ZTESTENABLE, - ZWRITEENABLE, - FOGENABLE, - FOGCOLOR, - CULLMODE, - // TODO: - // fog type, density ? - // ? shademode - - STENCILENABLE, - STENCILFAIL, - STENCILZFAIL, - STENCILPASS, - STENCILFUNCTION, - STENCILFUNCTIONREF, - STENCILFUNCTIONMASK, - STENCILFUNCTIONWRITEMASK, - - // platform specific or opaque? - ALPHATESTFUNC, - ALPHATESTREF, - - // emulation of PS2 GS alpha test - // in the mode where it still writes color but nor depth - GSALPHATEST, - GSALPHATESTREF -}; - -enum AlphaTestFunc -{ - ALPHAALWAYS, - ALPHAGREATEREQUAL, - ALPHALESS -}; - -enum StencilOp -{ - STENCILKEEP = 1, - STENCILZERO, - STENCILREPLACE, - STENCILINCSAT, - STENCILDECSAT, - STENCILINVERT, - STENCILINC, - STENCILDEC -}; - -enum StencilFunc -{ - STENCILNEVER = 1, - STENCILLESS, - STENCILEQUAL, - STENCILLESSEQUAL, - STENCILGREATER, - STENCILNOTEQUAL, - STENCILGREATEREQUAL, - STENCILALWAYS -}; - -enum CullMode -{ - CULLNONE = 1, - CULLBACK, - CULLFRONT -}; - -enum BlendFunction -{ - BLENDZERO = 1, - BLENDONE, - BLENDSRCCOLOR, - BLENDINVSRCCOLOR, - BLENDSRCALPHA, - BLENDINVSRCALPHA, - BLENDDESTALPHA, - BLENDINVDESTALPHA, - BLENDDESTCOLOR, - BLENDINVDESTCOLOR, - BLENDSRCALPHASAT - // TODO: add more perhaps -}; - -void SetRenderState(int32 state, uint32 value); -void SetRenderStatePtr(int32 state, void *value); -uint32 GetRenderState(int32 state); -void *GetRenderStatePtr(int32 state); - -// Im2D - -namespace im2d { - -float32 GetNearZ(void); -float32 GetFarZ(void); -void RenderLine(void *verts, int32 numVerts, int32 vert1, int32 vert2); -void RenderTriangle(void *verts, int32 numVerts, int32 vert1, int32 vert2, int32 vert3); -void RenderIndexedPrimitive(PrimitiveType, void *verts, int32 numVerts, void *indices, int32 numIndices); -void RenderPrimitive(PrimitiveType type, void *verts, int32 numVerts); - -} - -// Im3D - -namespace im3d { - -enum TransformFlags -{ - VERTEXUV = 1, // has tex Coords - ALLOPAQUE = 2, // no vertex alpha - NOCLIP = 4, // don't frustum clip - VERTEXXYZ = 8, // has position - VERTEXRGBA = 16, // has color - EVERYTHING = VERTEXUV|VERTEXXYZ|VERTEXRGBA -}; - -void Transform(void *vertices, int32 numVertices, Matrix *world, uint32 flags); -void RenderPrimitive(PrimitiveType primType); -void RenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices); -void End(void); - -} - -} - diff --git a/vendor/librw/src/rwuserdata.h b/vendor/librw/src/rwuserdata.h deleted file mode 100644 index 00d7355..0000000 --- a/vendor/librw/src/rwuserdata.h +++ /dev/null @@ -1,94 +0,0 @@ -namespace rw { - -enum UserDataType -{ - USERDATANA = 0, - USERDATAINT = 1, - USERDATAFLOAT = 2, - USERDATASTRING = 3 -}; - -struct UserDataArray -{ - char *name; - uint32 datatype; - int32 numElements; - void *data; - - int32 getInt(int32 n) { return ((int32*)this->data)[n]; } - float32 getFloat(int32 n) { return ((float32*)this->data)[n]; } - char *getString(int32 n) { return ((char**)this->data)[n]; } - void setInt(int32 n, int32 i) { ((int32*)this->data)[n] = i; } - void setFloat(int32 n, float32 f) { ((float32*)this->data)[n] = f; } - void setString(int32 n, const char *s); - - static int32 geometryAdd(Geometry *g, const char *name, int32 datatype, int32 numElements); - static void geometryRemove(Geometry *g, int32 n); - static int32 geometryGetCount(Geometry *g); - static UserDataArray *geometryGet(Geometry *g, int32 n); - static int32 geometryFindIndex(Geometry *g, const char *name); - - static int32 frameAdd(Frame *f, const char *name, int32 datatype, int32 numElements); - static void frameRemove(Frame *f, int32 n); - static int32 frameGetCount(Frame *f); - static UserDataArray *frameGet(Frame *f, int32 n); - static int32 frameFindIndex(Frame *f, const char *name); - - static int32 cameraAdd(Camera *c, const char *name, int32 datatype, int32 numElements); - static void cameraRemove(Camera *c, int32 n); - static int32 cameraGetCount(Camera *c); - static UserDataArray *cameraGet(Camera *c, int32 n); - static int32 cameraFindIndex(Camera *c, const char *name); - - static int32 lightAdd(Light *l, const char *name, int32 datatype, int32 numElements); - static void lightRemove(Light *l, int32 n); - static int32 lightGetCount(Light *l); - static UserDataArray *lightGet(Light *l, int32 n); - static int32 lightFindIndex(Light *l, const char *name); - - static int32 materialAdd(Material *m, const char *name, int32 datatype, int32 numElements); - static void materialRemove(Material *m, int32 n); - static int32 materialGetCount(Material *m); - static UserDataArray *materialGet(Material *m, int32 n); - static int32 materialFindIndex(Material *m, const char *name); - - static int32 textureAdd(Texture *t, const char *name, int32 datatype, int32 numElements); - static void textureRemove(Texture *t, int32 n); - static int32 textureGetCount(Texture *t); - static UserDataArray *textureGet(Texture *t, int32 n); - static int32 textureFindIndex(Texture *t, const char *name); -}; - -struct UserDataExtension -{ - int32 numArrays; - UserDataArray *arrays; - - int32 add(const char *name, int32 datatype, int32 numElements); - void remove(int32 n); - int32 getCount(void) { return numArrays; } - UserDataArray *get(int32 n) { return n >= numArrays ? nil : &arrays[n]; } - int32 findIndex(const char *name); - - static UserDataExtension *get(Geometry *geo); - static UserDataExtension *get(Frame *frame); - static UserDataExtension *get(Camera *cam); - static UserDataExtension *get(Light *light); - static UserDataExtension *get(Material *mat); - static UserDataExtension *get(Texture *tex); -}; - -struct UserDataGlobals -{ - int32 geometryOffset; - int32 frameOffset; - int32 cameraOffset; - int32 lightOffset; - int32 materialOffset; - int32 textureOffset; -}; -extern UserDataGlobals userDataGlobals; - -void registerUserDataPlugin(void); - -} diff --git a/vendor/librw/src/skin.cpp b/vendor/librw/src/skin.cpp deleted file mode 100644 index abaa548..0000000 --- a/vendor/librw/src/skin.cpp +++ /dev/null @@ -1,486 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwanim.h" -#include "rwengine.h" -#include "rwplugins.h" -#include "ps2/rwps2.h" -#include "ps2/rwps2plg.h" -#include "d3d/rwxbox.h" -#include "d3d/rwd3d8.h" -#include "d3d/rwd3d9.h" -#include "gl/rwwdgl.h" -#include "gl/rwgl3.h" -#include "gl/rwgl3plg.h" - -#define PLUGIN_ID ID_SKIN - -namespace rw { - -SkinGlobals skinGlobals = { 0, 0, { nil }, nil }; - -static void* -createSkin(void *object, int32 offset, int32) -{ - *PLUGINOFFSET(Skin*, object, offset) = nil; - return object; -} - -static void* -destroySkin(void *object, int32 offset, int32) -{ - Skin *skin = *PLUGINOFFSET(Skin*, object, offset); - if(skin){ - rwFree(skin->data); - rwFree(skin->remapIndices); -// delete[] skin->platformData; - } - rwFree(skin); - return object; -} - -static void* -copySkin(void *dst, void *src, int32 offset, int32) -{ - Skin *srcskin = *PLUGINOFFSET(Skin*, src, offset); - if(srcskin == nil) - return dst; - Geometry *geometry = (Geometry*)src; - assert(geometry->instData == nil); - assert(((Geometry*)src)->numVertices == ((Geometry*)dst)->numVertices); - Skin *dstskin = rwNewT(Skin, 1, MEMDUR_EVENT | ID_SKIN); - *PLUGINOFFSET(Skin*, dst, offset) = dstskin; - dstskin->numBones = srcskin->numBones; - dstskin->numUsedBones = srcskin->numUsedBones; - dstskin->numWeights = srcskin->numWeights; - - assert(0 && "can't copy skin yet"); - dstskin->init(srcskin->numBones, srcskin->numUsedBones, - geometry->numVertices); - memcpy(dstskin->usedBones, srcskin->usedBones, srcskin->numUsedBones); - memcpy(dstskin->inverseMatrices, srcskin->inverseMatrices, - srcskin->numBones*64); - memcpy(dstskin->indices, srcskin->indices, geometry->numVertices*4); - memcpy(dstskin->weights, srcskin->weights, geometry->numVertices*16); - return dst; -} - -Stream* -readSkinSplitData(Stream *stream, Skin *skin) -{ - uint32 sz; - int8 *data; - - skin->boneLimit = stream->readI32(); - skin->numMeshes = stream->readI32(); - skin->rleSize = stream->readI32(); - if(skin->numMeshes){ - sz = skin->numBones + 2*(skin->numMeshes+skin->rleSize); - data = (int8*)rwMalloc(sz, MEMDUR_EVENT | ID_SKIN); - stream->read8(data, sz); - skin->remapIndices = data; - skin->rleCount = (Skin::RLEcount*)(data + skin->numBones); - skin->rle = (Skin::RLE*)(data + skin->numBones + 2*skin->numMeshes); - } - return stream; -} - -Stream* -writeSkinSplitData(Stream *stream, Skin *skin) -{ - stream->writeI32(skin->boneLimit); - stream->writeI32(skin->numMeshes); - stream->writeI32(skin->rleSize); - if(skin->numMeshes) - stream->write8(skin->remapIndices, - skin->numBones + 2*(skin->numMeshes+skin->rleSize)); - return stream; -} - -int32 -skinSplitDataSize(Skin *skin) -{ - if(skin->numMeshes == 0) - return 12; - return 12 + skin->numBones + 2*(skin->numMeshes+skin->rleSize); -} - -static Stream* -readSkin(Stream *stream, int32 len, void *object, int32 offset, int32) -{ - uint8 header[4]; - Geometry *geometry = (Geometry*)object; - - if(geometry->instData){ - // TODO: function pointers - if(geometry->instData->platform == PLATFORM_PS2) - return ps2::readNativeSkin(stream, len, object, offset); - else if(geometry->instData->platform == PLATFORM_WDGL) - return wdgl::readNativeSkin(stream, len, object, offset); - else if(geometry->instData->platform == PLATFORM_XBOX) - return xbox::readNativeSkin(stream, len, object, offset); - else{ - assert(0 && "unsupported native skin platform"); - return nil; - } - } - - stream->read8(header, 4); // numBones, numUsedBones, - // numWeights, unused - Skin *skin = rwNewT(Skin, 1, MEMDUR_EVENT | ID_SKIN); - *PLUGINOFFSET(Skin*, geometry, offset) = skin; - - // numUsedBones and numWeights appear in/after 34003 - // but not in/before 33002 (probably rw::version >= 0x34000) - bool oldFormat = header[1] == 0; - - // Use numBones for numUsedBones to allocate data, - // find out the correct value later - if(oldFormat) - skin->init(header[0], header[0], geometry->numVertices); - else - skin->init(header[0], header[1], geometry->numVertices); - skin->numWeights = header[2]; - - if(!oldFormat) - stream->read8(skin->usedBones, skin->numUsedBones); - if(skin->indices) - stream->read8(skin->indices, geometry->numVertices*4); - if(skin->weights) - stream->read32(skin->weights, geometry->numVertices*16); - for(int32 i = 0; i < skin->numBones; i++){ - if(oldFormat) - stream->seek(4); // skip 0xdeaddead - stream->read32(&skin->inverseMatrices[i*16], 64); - } - - if(oldFormat){ - skin->findNumWeights(geometry->numVertices); - skin->findUsedBones(geometry->numVertices); - } - - if(!oldFormat) - readSkinSplitData(stream, skin); - - return stream; -} - -static Stream* -writeSkin(Stream *stream, int32 len, void *object, int32 offset, int32) -{ - uint8 header[4]; - Geometry *geometry = (Geometry*)object; - - if(geometry->instData){ - if(geometry->instData->platform == PLATFORM_PS2) - return ps2::writeNativeSkin(stream, len, object, offset); - else if(geometry->instData->platform == PLATFORM_WDGL) - return wdgl::writeNativeSkin(stream, len, object, offset); - else if(geometry->instData->platform == PLATFORM_XBOX) - return xbox::writeNativeSkin(stream, len, object, offset); - else{ - assert(0 && "unsupported native skin platform"); - return nil; - } - } - - Skin *skin = *PLUGINOFFSET(Skin*, object, offset); - // not sure which version introduced the new format - bool oldFormat = version < 0x34000; - header[0] = skin->numBones; - if(oldFormat){ - header[1] = 0; - header[2] = 0; - }else{ - header[1] = skin->numUsedBones; - header[2] = skin->numWeights; - } - header[3] = 0; - stream->write8(header, 4); - if(!oldFormat) - stream->write8(skin->usedBones, skin->numUsedBones); - stream->write8(skin->indices, geometry->numVertices*4); - stream->write32(skin->weights, geometry->numVertices*16); - for(int32 i = 0; i < skin->numBones; i++){ - if(oldFormat) - stream->writeU32(0xdeaddead); - stream->write32(&skin->inverseMatrices[i*16], 64); - } - - if(!oldFormat) - writeSkinSplitData(stream, skin); - return stream; -} - -static int32 -getSizeSkin(void *object, int32 offset, int32) -{ - Geometry *geometry = (Geometry*)object; - - if(geometry->instData){ - if(geometry->instData->platform == PLATFORM_PS2) - return ps2::getSizeNativeSkin(object, offset); - if(geometry->instData->platform == PLATFORM_WDGL) - return wdgl::getSizeNativeSkin(object, offset); - if(geometry->instData->platform == PLATFORM_XBOX) - return xbox::getSizeNativeSkin(object, offset); - if(geometry->instData->platform == PLATFORM_D3D8) - return -1; - if(geometry->instData->platform == PLATFORM_D3D9) - return -1; - assert(0 && "unsupported native skin platform"); - } - - Skin *skin = *PLUGINOFFSET(Skin*, object, offset); - if(skin == nil) - return -1; - - int32 size = 4 + geometry->numVertices*(16+4) + - skin->numBones*64; - // not sure which version introduced the new format - if(version < 0x34000) - size += skin->numBones*4; - else - size += skin->numUsedBones + skinSplitDataSize(skin); - return size; -} - -static Stream* -readSkinLegacy(Stream *stream, int32 len, void *object, int32, int32) -{ - Atomic *atomic = (Atomic*)object; - Geometry *geometry = atomic->geometry; - - int32 numBones = stream->readI32(); - int32 numVertices = stream->readI32(); - assert(numVertices == geometry->numVertices); - - Skin *skin = rwNewT(Skin, 1, MEMDUR_EVENT | ID_SKIN); - *PLUGINOFFSET(Skin*, geometry, skinGlobals.geoOffset) = skin; - skin->init(numBones, numBones, numVertices); - skin->legacyType = 1; - skin->numWeights = 4; - - stream->read8(skin->indices, numVertices*4); - stream->read32(skin->weights, numVertices*16); - - HAnimHierarchy *hier = HAnimHierarchy::create(numBones, nil, nil, 0, 36); - - for(int i = 0; i < numBones; i++){ - hier->nodeInfo[i].id = stream->readI32(); - hier->nodeInfo[i].index = stream->readI32(); - hier->nodeInfo[i].flags = stream->readI32() & 3; -// printf("%d %d %d %d\n", i, hier->nodeInfo[i].id, hier->nodeInfo[i].index, hier->nodeInfo[i].flags); - stream->read32(&skin->inverseMatrices[i*16], 64); - - Matrix mat; - Matrix::invert(&mat, (Matrix*)&skin->inverseMatrices[i*16]); -// printf("[ [ %8.4f, %8.4f, %8.4f, %8.4f ]\n" -// " [ %8.4f, %8.4f, %8.4f, %8.4f ]\n" -// " [ %8.4f, %8.4f, %8.4f, %8.4f ]\n" -// " [ %8.4f, %8.4f, %8.4f, %8.4f ] ]\n" -// " %08x == flags\n", -// mat.right.x, mat.up.x, mat.at.x, mat.pos.x, -// mat.right.y, mat.up.y, mat.at.y, mat.pos.y, -// mat.right.z, mat.up.z, mat.at.z, mat.pos.z, -// 0.0f, 0.0f, 0.0f, 1.0f, -// mat.flags); - } - Frame *frame = atomic->getFrame()->child; - assert(frame->next == nil); // in old files atomic is above hierarchy it seems - assert(frame->count() == numBones); // assuming one frame per node this should also be true - HAnimData::get(frame)->hierarchy = hier; - hier->parentFrame = frame; - - return stream; -} - -static void -skinRights(void *object, int32, int32, uint32) -{ - Skin::setPipeline((Atomic*)object, 1); -} - -static void -skinAlways(void *object, int32, int32) -{ - Atomic *atomic = (Atomic*)object; - Geometry *geo = atomic->geometry; - if(geo == nil) return; - Skin *skin = Skin::get(geo); - if(skin == nil) return; - Skin::setPipeline((Atomic*)object, 1); -} - -static void* -createSkinAtm(void *object, int32 offset, int32) -{ - *PLUGINOFFSET(void*, object, offset) = nil; - return object; -} - -static void* -destroySkinAtm(void *object, int32 offset, int32) -{ - return object; -} - -static void* -copySkinAtm(void *dst, void *src, int32 offset, int32) -{ - *PLUGINOFFSET(void*, dst, offset) = *PLUGINOFFSET(void*, src, offset); - return dst; -} - -static void* -skinOpen(void *o, int32, int32) -{ - // init dummy pipelines - skinGlobals.dummypipe = ObjPipeline::create(); - skinGlobals.dummypipe->pluginID = ID_SKIN; - skinGlobals.dummypipe->pluginData = 1; - for(uint i = 0; i < nelem(skinGlobals.pipelines); i++) - skinGlobals.pipelines[i] = skinGlobals.dummypipe; - return o; -} - -static void* -skinClose(void *o, int32, int32) -{ - for(uint i = 0; i < nelem(skinGlobals.pipelines); i++) - if(skinGlobals.pipelines[i] == skinGlobals.dummypipe) - matFXGlobals.pipelines[i] = nil; - skinGlobals.dummypipe->destroy(); - skinGlobals.dummypipe = nil; - return o; -} - -void -registerSkinPlugin(void) -{ - Driver::registerPlugin(PLATFORM_NULL, 0, ID_SKIN, - skinOpen, skinClose); - ps2::initSkin(); - xbox::initSkin(); - d3d8::initSkin(); - d3d9::initSkin(); - wdgl::initSkin(); - gl3::initSkin(); - - int32 o; - o = Geometry::registerPlugin(sizeof(Skin*), ID_SKIN, - createSkin, destroySkin, copySkin); - Geometry::registerPluginStream(ID_SKIN, - readSkin, writeSkin, getSizeSkin); - skinGlobals.geoOffset = o; - o = Atomic::registerPlugin(sizeof(HAnimHierarchy*),ID_SKIN, - createSkinAtm, destroySkinAtm, copySkinAtm); - skinGlobals.atomicOffset = o; - Atomic::registerPluginStream(ID_SKIN, readSkinLegacy, nil, nil); - Atomic::setStreamRightsCallback(ID_SKIN, skinRights); - Atomic::setStreamAlwaysCallback(ID_SKIN, skinAlways); -} - -void -Skin::init(int32 numBones, int32 numUsedBones, int32 numVertices) -{ - this->numBones = numBones; - this->numUsedBones = numUsedBones; - uint32 size = this->numUsedBones + - this->numBones*64 + - numVertices*(16+4) + 0xF; - this->data = rwNewT(uint8, size, MEMDUR_EVENT | ID_SKIN); - uint8 *p = this->data; - - this->usedBones = nil; - if(this->numUsedBones){ - this->usedBones = p; - p += this->numUsedBones; - } - - p = (uint8*)(((uintptr)p + 0xF) & ~0xF); - this->inverseMatrices = nil; - if(this->numBones){ - this->inverseMatrices = (float*)p; - p += 64*this->numBones; - } - - this->indices = nil; - if(numVertices){ - this->indices = p; - p += 4*numVertices; - } - - this->weights = nil; - if(numVertices) - this->weights = (float*)p; - - this->boneLimit = 0; - this->numMeshes = 0; - this->rleSize = 0; - this->remapIndices = nil; - this->rleCount = nil; - this->rle = nil; - - this->platformData = nil; - this->legacyType = 0; -} - - - -//static_assert(sizeof(Skin::RLEcount) == 2, "RLEcount size"); -//static_assert(sizeof(Skin::RLE) == 2, "RLE size"); - -void -Skin::findNumWeights(int32 numVertices) -{ - this->numWeights = 1; - float *w = this->weights; - while(numVertices--){ - while(w[this->numWeights] != 0.0f){ - this->numWeights++; - if(this->numWeights == 4) - return; - } - w += 4; - } -} - -void -Skin::findUsedBones(int32 numVertices) -{ - uint8 usedTab[256]; - uint8 *indices = this->indices; - float *weights = this->weights; - memset(usedTab, 0, 256); - while(numVertices--){ - for(int32 i = 0; i < this->numWeights; i++){ - if(weights[i] == 0.0f) - continue; // TODO: this could probably be optimized - if(usedTab[indices[i]] == 0) - usedTab[indices[i]]++; - } - indices += 4; - weights += 4; - } - this->numUsedBones = 0; - for(int32 i = 0; i < 256; i++) - if(usedTab[i]) - this->usedBones[this->numUsedBones++] = i; -} - -void -Skin::setPipeline(Atomic *a, int32 type) -{ - (void)type; - a->pipeline = skinGlobals.pipelines[rw::platform]; -} - -} diff --git a/vendor/librw/src/texture.cpp b/vendor/librw/src/texture.cpp deleted file mode 100644 index 958ae08..0000000 --- a/vendor/librw/src/texture.cpp +++ /dev/null @@ -1,596 +0,0 @@ -#include -#include -#include -#include - -#define WITH_D3D -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" -#include "ps2/rwps2.h" -#include "d3d/rwd3d.h" -#include "d3d/rwxbox.h" -#include "d3d/rwd3d8.h" -#include "d3d/rwd3d9.h" -#include "d3d/rwd3dimpl.h" -#include "gl/rwgl3.h" - -#define PLUGIN_ID 0 - -namespace rw { - -int32 Texture::numAllocated; -int32 TexDictionary::numAllocated; - -PluginList TexDictionary::s_plglist(sizeof(TexDictionary)); -PluginList Texture::s_plglist(sizeof(Texture)); -PluginList Raster::s_plglist(sizeof(Raster)); - -struct TextureGlobals -{ - TexDictionary *initialTexDict; - TexDictionary *currentTexDict; - // load textures from files - bool32 loadTextures; - // create dummy textures to store just names - bool32 makeDummies; - bool32 mipmapping; - bool32 autoMipmapping; - LinkList texDicts; - - LinkList textures; -}; -int32 textureModuleOffset; - -#define TEXTUREGLOBAL(v) (PLUGINOFFSET(TextureGlobals, engine, textureModuleOffset)->v) - -static void* -textureOpen(void *object, int32 offset, int32 size) -{ - TexDictionary *texdict; - textureModuleOffset = offset; - TEXTUREGLOBAL(texDicts).init(); - TEXTUREGLOBAL(textures).init(); - texdict = TexDictionary::create(); - TEXTUREGLOBAL(initialTexDict) = texdict; - TexDictionary::setCurrent(texdict); - TEXTUREGLOBAL(loadTextures) = 1; - TEXTUREGLOBAL(makeDummies) = 0; - TEXTUREGLOBAL(mipmapping) = 0; - TEXTUREGLOBAL(autoMipmapping) = 0; - return object; -} -static void* -textureClose(void *object, int32 offset, int32 size) -{ - FORLIST(lnk, TEXTUREGLOBAL(texDicts)) - TexDictionary::fromLink(lnk)->destroy(); - TEXTUREGLOBAL(initialTexDict) = nil; - TEXTUREGLOBAL(currentTexDict) = nil; - - FORLIST(lnk, TEXTUREGLOBAL(textures)){ - Texture *tex = LLLinkGetData(lnk, Texture, inGlobalList); - printf("Tex still allocated: %d %s %s\n", tex->refCount, tex->name, tex->mask); - assert(tex->dict == nil); - tex->destroy(); - } - return object; -} - -void -Texture::registerModule(void) -{ - Engine::registerPlugin(sizeof(TextureGlobals), ID_TEXTUREMODULE, textureOpen, textureClose); -} - -void -Texture::setLoadTextures(bool32 b) -{ - TEXTUREGLOBAL(loadTextures) = b; -} - -void -Texture::setCreateDummies(bool32 b) -{ - TEXTUREGLOBAL(makeDummies) = b; -} - -void Texture::setMipmapping(bool32 b) { TEXTUREGLOBAL(mipmapping) = b; } -void Texture::setAutoMipmapping(bool32 b) { TEXTUREGLOBAL(autoMipmapping) = b; } -bool32 Texture::getMipmapping(void) { return TEXTUREGLOBAL(mipmapping); } -bool32 Texture::getAutoMipmapping(void) { return TEXTUREGLOBAL(autoMipmapping); } - -// -// TexDictionary -// - -TexDictionary* -TexDictionary::create(void) -{ - TexDictionary *dict = (TexDictionary*)rwMalloc(s_plglist.size, MEMDUR_EVENT | ID_TEXDICTIONARY); - if(dict == nil){ - RWERROR((ERR_ALLOC, s_plglist.size)); - return nil; - } - numAllocated++; - dict->object.init(TexDictionary::ID, 0); - dict->textures.init(); - TEXTUREGLOBAL(texDicts).add(&dict->inGlobalList); - s_plglist.construct(dict); - return dict; -} - -void -TexDictionary::destroy(void) -{ - if(TEXTUREGLOBAL(currentTexDict) == this) - TEXTUREGLOBAL(currentTexDict) = nil; - FORLIST(lnk, this->textures){ - Texture *tex = Texture::fromDict(lnk); - this->remove(tex); - tex->destroy(); - } - s_plglist.destruct(this); - this->inGlobalList.remove(); - rwFree(this); - numAllocated--; -} - -void -TexDictionary::add(Texture *t) -{ - if(t->dict) - t->inDict.remove(); - t->dict = this; - this->textures.append(&t->inDict); -} - -void -TexDictionary::remove(Texture *t) -{ - assert(t->dict == this); - t->inDict.remove(); - t->dict = nil; -} - -void -TexDictionary::addFront(Texture *t) -{ - if(t->dict) - t->inDict.remove(); - t->dict = this; - this->textures.add(&t->inDict); -} - -Texture* -TexDictionary::find(const char *name) -{ - FORLIST(lnk, this->textures){ - Texture *tex = Texture::fromDict(lnk); - if(strncmp_ci(tex->name, name, 32) == 0) - return tex; - } - return nil; -} - -TexDictionary* -TexDictionary::streamRead(Stream *stream) -{ - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - int32 numTex = stream->readI16(); - stream->readI16(); // device id (0 = unknown, 1 = d3d8, 2 = d3d9, - // 3 = gcn, 4 = null, 5 = opengl, - // 6 = ps2, 7 = softras, 8 = xbox, 9 = psp) - TexDictionary *txd = TexDictionary::create(); - if(txd == nil) - return nil; - Texture *tex; - for(int32 i = 0; i < numTex; i++){ - if(!findChunk(stream, ID_TEXTURENATIVE, nil, nil)){ - RWERROR((ERR_CHUNK, "TEXTURENATIVE")); - goto fail; - } - tex = Texture::streamReadNative(stream); - if(tex == nil) - goto fail; - Texture::s_plglist.streamRead(stream, tex); - txd->add(tex); - } - if(s_plglist.streamRead(stream, txd)) - return txd; -fail: - txd->destroy(); - return nil; -} - -void -TexDictionary::streamWrite(Stream *stream) -{ - writeChunkHeader(stream, ID_TEXDICTIONARY, this->streamGetSize()); - writeChunkHeader(stream, ID_STRUCT, 4); - int32 numTex = this->count(); - stream->writeI16(numTex); - stream->writeI16(0); - FORLIST(lnk, this->textures){ - Texture *tex = Texture::fromDict(lnk); - uint32 sz = tex->streamGetSizeNative(); - sz += 12 + Texture::s_plglist.streamGetSize(tex); - writeChunkHeader(stream, ID_TEXTURENATIVE, sz); - tex->streamWriteNative(stream); - Texture::s_plglist.streamWrite(stream, tex); - } - s_plglist.streamWrite(stream, this); -} - -uint32 -TexDictionary::streamGetSize(void) -{ - uint32 size = 12 + 4; - FORLIST(lnk, this->textures){ - Texture *tex = Texture::fromDict(lnk); - size += 12 + tex->streamGetSizeNative(); - size += 12 + Texture::s_plglist.streamGetSize(tex); - } - size += 12 + s_plglist.streamGetSize(this); - return size; -} - -void -TexDictionary::setCurrent(TexDictionary *txd) -{ - PLUGINOFFSET(TextureGlobals, engine, textureModuleOffset)->currentTexDict = txd; -} - -TexDictionary* -TexDictionary::getCurrent(void) -{ - return PLUGINOFFSET(TextureGlobals, engine, textureModuleOffset)->currentTexDict; -} - -// -// Texture -// - -static Texture *defaultFindCB(const char *name); -static Texture *defaultReadCB(const char *name, const char *mask); - -Texture *(*Texture::findCB)(const char *name) = defaultFindCB; -Texture *(*Texture::readCB)(const char *name, const char *mask) = defaultReadCB; - -Texture* -Texture::create(Raster *raster) -{ - Texture *tex = (Texture*)rwMalloc(s_plglist.size, MEMDUR_EVENT | ID_TEXTURE); - if(tex == nil){ - RWERROR((ERR_ALLOC, s_plglist.size)); - return nil; - } - numAllocated++; - tex->dict = nil; - tex->inDict.init(); - memset(tex->name, 0, 32); - memset(tex->mask, 0, 32); - tex->filterAddressing = (WRAP << 12) | (WRAP << 8) | NEAREST; - tex->raster = raster; - tex->refCount = 1; - TEXTUREGLOBAL(textures).add(&tex->inGlobalList); - s_plglist.construct(tex); - return tex; -} - -void -Texture::destroy(void) -{ - this->refCount--; - if(this->refCount <= 0){ - s_plglist.destruct(this); - if(this->dict) - this->inDict.remove(); - if(this->raster) - this->raster->destroy(); - this->inGlobalList.remove(); - rwFree(this); - numAllocated--; - } -} - -static Texture* -defaultFindCB(const char *name) -{ - if(TEXTUREGLOBAL(currentTexDict)) - return TEXTUREGLOBAL(currentTexDict)->find(name); - // TODO: RW searches *all* TXDs otherwise - return nil; -} - - -static Texture* -defaultReadCB(const char *name, const char *mask) -{ - Texture *tex; - Image *img; - - img = Image::readMasked(name, mask); - if(img){ - tex = Texture::create(Raster::createFromImage(img)); - strncpy(tex->name, name, 32); - if(mask) - strncpy(tex->mask, mask, 32); - img->destroy(); - return tex; - }else - return nil; -} - -Texture* -Texture::read(const char *name, const char *mask) -{ - (void)mask; - Raster *raster = nil; - Texture *tex; - - if(tex = Texture::findCB(name), tex){ - tex->addRef(); - return tex; - } - if(TEXTUREGLOBAL(loadTextures)){ - tex = Texture::readCB(name, mask); - if(tex == nil) - goto dummytex; - }else dummytex: if(TEXTUREGLOBAL(makeDummies)){ -//printf("missing texture %s %s\n", name ? name : "", mask ? mask : ""); - tex = Texture::create(nil); - if(tex == nil) - return nil; - strncpy(tex->name, name, 32); - if(mask) - strncpy(tex->mask, mask, 32); - raster = Raster::create(0, 0, 0, Raster::DONTALLOCATE); - tex->raster = raster; - } - if(tex && TEXTUREGLOBAL(currentTexDict)){ - if(tex->dict) - tex->inDict.remove(); - TEXTUREGLOBAL(currentTexDict)->add(tex); - } - return tex; -} - -Texture* -Texture::streamRead(Stream *stream) -{ - uint32 length; - char name[128], mask[128]; - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - uint32 filterAddressing = stream->readU32(); - // if V addressing is 0, copy U - if((filterAddressing & 0xF000) == 0) - filterAddressing |= (filterAddressing&0xF00) << 4; - - // if using mipmap filter mode, set automipmapping, - // if 0x10000 is set, set mipmapping - - if(!findChunk(stream, ID_STRING, &length, nil)){ - RWERROR((ERR_CHUNK, "STRING")); - return nil; - } - stream->read8(name, length); - - if(!findChunk(stream, ID_STRING, &length, nil)){ - RWERROR((ERR_CHUNK, "STRING")); - return nil; - } - stream->read8(mask, length); - - bool32 mipState = getMipmapping(); - bool32 autoMipState = getAutoMipmapping(); - int32 filter = filterAddressing&0xFF; - if(filter == MIPNEAREST || filter == MIPLINEAR || - filter == LINEARMIPNEAREST || filter == LINEARMIPLINEAR){ - setMipmapping(1); - setAutoMipmapping((filterAddressing&0x10000) == 0); - }else{ - setMipmapping(0); - setAutoMipmapping(0); - } - - Texture *tex = Texture::read(name, mask); - - setMipmapping(mipState); - setAutoMipmapping(autoMipState); - - if(tex == nil){ - s_plglist.streamSkip(stream); - return nil; - } - if(tex->refCount == 1) - tex->filterAddressing = filterAddressing&0xFFFF; - - if(s_plglist.streamRead(stream, tex)) - return tex; - - tex->destroy(); - return nil; -} - -bool -Texture::streamWrite(Stream *stream) -{ - int size; - char buf[36]; - writeChunkHeader(stream, ID_TEXTURE, this->streamGetSize()); - writeChunkHeader(stream, ID_STRUCT, 4); - uint32 filterAddressing = this->filterAddressing; - if(this->raster && (raster->format & Raster::AUTOMIPMAP) == 0) - filterAddressing |= 0x10000; - stream->writeU32(filterAddressing); - - memset(buf, 0, 36); - strncpy(buf, this->name, 32); - size = strlen(buf)+4 & ~3; - writeChunkHeader(stream, ID_STRING, size); - stream->write8(buf, size); - - memset(buf, 0, 36); - strncpy(buf, this->mask, 32); - size = strlen(buf)+4 & ~3; - writeChunkHeader(stream, ID_STRING, size); - stream->write8(buf, size); - - s_plglist.streamWrite(stream, this); - return true; -} - -uint32 -Texture::streamGetSize(void) -{ - uint32 size = 0; - size += 12 + 4; - size += 12 + 12; - size += strlen(this->name)+4 & ~3; - size += strlen(this->mask)+4 & ~3; - size += 12 + s_plglist.streamGetSize(this); - return size; -} - -Texture* -Texture::streamReadNative(Stream *stream) -{ - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - uint32 platform = stream->readU32(); - stream->seek(-16); - if(platform == FOURCC_PS2) - return ps2::readNativeTexture(stream); - if(platform == PLATFORM_D3D8) - return d3d8::readNativeTexture(stream); - if(platform == PLATFORM_D3D9) - return d3d9::readNativeTexture(stream); - if(platform == PLATFORM_XBOX) - return xbox::readNativeTexture(stream); - if(platform == PLATFORM_GL3) - return gl3::readNativeTexture(stream); - assert(0 && "unsupported platform"); - return nil; -} - -void -Texture::streamWriteNative(Stream *stream) -{ - if(this->raster->platform == PLATFORM_PS2) - ps2::writeNativeTexture(this, stream); - else if(this->raster->platform == PLATFORM_D3D8) - d3d8::writeNativeTexture(this, stream); - else if(this->raster->platform == PLATFORM_D3D9) - d3d9::writeNativeTexture(this, stream); - else if(this->raster->platform == PLATFORM_XBOX) - xbox::writeNativeTexture(this, stream); - else if(this->raster->platform == PLATFORM_GL3) - gl3::writeNativeTexture(this, stream); - else - assert(0 && "unsupported platform"); -} - -uint32 -Texture::streamGetSizeNative(void) -{ - if(this->raster->platform == PLATFORM_PS2) - return ps2::getSizeNativeTexture(this); - if(this->raster->platform == PLATFORM_D3D8) - return d3d8::getSizeNativeTexture(this); - if(this->raster->platform == PLATFORM_D3D9) - return d3d9::getSizeNativeTexture(this); - if(this->raster->platform == PLATFORM_XBOX) - return xbox::getSizeNativeTexture(this); - if(this->raster->platform == PLATFORM_GL3) - return gl3::getSizeNativeTexture(this); - assert(0 && "unsupported platform"); - return 0; -} - - - -int32 anisotOffset; - -static void* -createAnisot(void *object, int32 offset, int32) -{ - *GETANISOTROPYEXT(object) = 1; - return object; -} - -static void* -copyAnisot(void *dst, void *src, int32 offset, int32) -{ - *GETANISOTROPYEXT(dst) = *GETANISOTROPYEXT(src); - return dst; -} - -static Stream* -readAnisot(Stream *stream, int32, void *object, int32 offset, int32) -{ - *GETANISOTROPYEXT(object) = stream->readI32(); - return stream; -} - -static Stream* -writeAnisot(Stream *stream, int32, void *object, int32 offset, int32) -{ - stream->writeI32(*GETANISOTROPYEXT(object)); - return stream; -} - -static int32 -getSizeAnisot(void *object, int32 offset, int32) -{ - if(*GETANISOTROPYEXT(object) == 1) - return 0; - return sizeof(int32); -} - -void -registerAnisotropyPlugin(void) -{ - anisotOffset = Texture::registerPlugin(sizeof(int32), ID_ANISOT, createAnisot, nil, copyAnisot); - Texture::registerPluginStream(ID_ANISOT, readAnisot, writeAnisot, getSizeAnisot); -} - -void -Texture::setMaxAnisotropy(int32 maxaniso) -{ - if(anisotOffset > 0) - *GETANISOTROPYEXT(this) = maxaniso; -} - -int32 -Texture::getMaxAnisotropy(void) -{ - if(anisotOffset > 0) - return *GETANISOTROPYEXT(this); - return 1; -} - -int32 -getMaxSupportedMaxAnisotropy(void) -{ -#ifdef RW_D3D9 - return d3d::d3d9Globals.caps.MaxAnisotropy; -#endif -#ifdef RW_GL3 - return (int32)gl3::gl3Caps.maxAnisotropy; -#endif - return 1; -} - -} diff --git a/vendor/librw/src/tga.cpp b/vendor/librw/src/tga.cpp deleted file mode 100644 index cbe845f..0000000 --- a/vendor/librw/src/tga.cpp +++ /dev/null @@ -1,222 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -#define PLUGIN_ID 0 - -namespace rw { - - -// NB: this has padding and cannot be streamed directly! -struct TGAHeader -{ - int8 IDlen; - int8 colorMapType; - int8 imageType; - int16 colorMapOrigin; - int16 colorMapLength; - int8 colorMapDepth; - int16 xOrigin, yOrigin; - int16 width, height; - uint8 depth; - uint8 descriptor; - - void read(Stream *stream); - void write(Stream *stream); -}; - -void -TGAHeader::read(Stream *stream) -{ - IDlen = stream->readI8(); - colorMapType = stream->readI8(); - imageType = stream->readI8(); - colorMapOrigin = stream->readI16(); - colorMapLength = stream->readI16(); - colorMapDepth = stream->readI8(); - xOrigin = stream->readI16(); - yOrigin = stream->readI16(); - width = stream->readI16(); - height = stream->readI16(); - depth = stream->readU8(); - descriptor = stream->readU8(); -} - -void -TGAHeader::write(Stream *stream) -{ - stream->writeI8(IDlen); - stream->writeI8(colorMapType); - stream->writeI8(imageType); - stream->writeI16(colorMapOrigin); - stream->writeI16(colorMapLength); - stream->writeI8(colorMapDepth); - stream->writeI16(xOrigin); - stream->writeI16(yOrigin); - stream->writeI16(width); - stream->writeI16(height); - stream->writeU8(depth); - stream->writeU8(descriptor); -} - -Image* -readTGA(const char *filename) -{ - TGAHeader header; - Image *image; - int depth = 0, palDepth = 0; - uint32 length; - uint8 *data = getFileContents(filename, &length); - assert(data != nil); - StreamMemory file; - file.open(data, length); - header.read(&file); - - assert(header.imageType == 1 || header.imageType == 2); - file.seek(header.IDlen); - if(header.colorMapType){ - assert(header.colorMapOrigin == 0); - depth = (header.colorMapLength <= 16) ? 4 : 8; - palDepth = header.colorMapDepth; - assert(palDepth == 24 || palDepth == 32); - }else{ - depth = header.depth; - assert(depth == 16 || depth == 24 || depth == 32); - } - - image = Image::create(header.width, header.height, depth); - image->allocate(); - uint8 *palette = header.colorMapType ? image->palette : nil; - uint8 (*color)[4] = nil; - if(palette){ - int maxlen = depth == 4 ? 16 : 256; - color = (uint8(*)[4])palette; - int i; - for(i = 0; i < header.colorMapLength; i++){ - color[i][2] = file.readU8(); - color[i][1] = file.readU8(); - color[i][0] = file.readU8(); - color[i][3] = 0xFF; - if(palDepth == 32) - color[i][3] = file.readU8(); - } - for(; i < maxlen; i++){ - color[i][0] = color[i][1] = color[i][2] = 0; - color[i][3] = 0xFF; - } - } - - uint8 *pixels = image->pixels; - if(!(header.descriptor & 0x20)) - pixels += (image->height-1)*image->stride; - for(int y = 0; y < image->height; y++){ - uint8 *line = pixels; - for(int x = 0; x < image->width; x++){ - switch(image->depth){ - case 4: - case 8: - line[0] = file.readU8(); - break; - case 16: - line[0] = file.readU8(); - line[1] = file.readU8(); - break; - case 24: - line[2] = file.readU8(); - line[1] = file.readU8(); - line[0] = file.readU8(); - break; - case 32: - line[2] = file.readU8(); - line[1] = file.readU8(); - line[0] = file.readU8(); - line[3] = file.readU8(); - break; - } - line += image->bpp; - } - pixels += (header.descriptor&0x20) ? - image->stride : -image->stride; - } - - file.close(); - rwFree(data); - return image; -} - -void -writeTGA(Image *image, const char *filename) -{ - TGAHeader header; - StreamFile file; - if(!file.open(filename, "wb")){ - RWERROR((ERR_FILE, filename)); - return; - } - header.IDlen = 0; - header.imageType = image->palette != nil ? 1 : 2; - header.colorMapType = image->palette != nil; - header.colorMapOrigin = 0; - header.colorMapLength = image->depth == 4 ? 16 : - image->depth == 8 ? 256 : 0; - header.colorMapDepth = image->palette ? 32 : 0; - header.xOrigin = 0; - header.yOrigin = 0; - header.width = image->width; - header.height = image->height; - header.depth = image->depth == 4 ? 8 : image->depth; - header.descriptor = 0x20 | (image->depth == 32 ? 8 : 0); - header.write(&file); - - uint8 *palette = header.colorMapType ? image->palette : nil; - uint8 (*color)[4] = (uint8(*)[4])palette;; - if(palette) - for(int i = 0; i < header.colorMapLength; i++){ - file.writeU8(color[i][2]); - file.writeU8(color[i][1]); - file.writeU8(color[i][0]); - file.writeU8(color[i][3]); - } - - uint8 *line = image->pixels; - uint8 *p; - for(int y = 0; y < image->height; y++){ - p = line; - for(int x = 0; x < image->width; x++){ - switch(image->depth){ - case 4: - case 8: - file.writeU8(p[0]); - break; - case 16: - file.writeU8(p[0]); - file.writeU8(p[1]); - break; - case 24: - file.writeU8(p[2]); - file.writeU8(p[1]); - file.writeU8(p[0]); - break; - case 32: - file.writeU8(p[2]); - file.writeU8(p[1]); - file.writeU8(p[0]); - file.writeU8(p[3]); - break; - } - p += image->bpp; - } - line += image->stride; - } - file.close(); -} - -} diff --git a/vendor/librw/src/tristrip.cpp b/vendor/librw/src/tristrip.cpp deleted file mode 100644 index bd9123f..0000000 --- a/vendor/librw/src/tristrip.cpp +++ /dev/null @@ -1,682 +0,0 @@ -#include -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -#define PLUGIN_ID 2 - -namespace rw { - -struct GraphEdge -{ - int32 node; /* index of the connected node */ - uint32 isConnected : 1; /* is connected to other node */ - uint32 otherEdge : 2; /* edge number on connected node */ - uint32 isStrip : 1; /* is strip edge */ -}; - -struct StripNode -{ - uint16 v[3]; /* vertex indices */ - uint8 parent : 2; /* tunnel parent node (edge index) */ - uint8 visited : 1; /* visited in breadth first search */ - uint8 stripVisited : 1; /* strip starting at this node was visited during search */ - uint8 isEnd : 1; /* is in end list */ - GraphEdge e[3]; - int32 stripId; /* index of start node */ - LLLink inlist; -}; - -struct StripMesh -{ - int32 numNodes; - StripNode *nodes; - LinkList loneNodes; /* nodes not connected to any others */ - LinkList endNodes; /* strip start/end nodes */ -}; - -//#define trace(...) printf(__VA_ARGS__) -#define trace(...) - -static void -printNode(StripMesh *sm, StripNode *n) -{ - trace("%3ld: %3d %3d.%d %3d.%d %3d.%d || %3d %3d %3d\n", - n - sm->nodes, - n->stripId, - n->e[0].node, - n->e[0].isStrip, - n->e[1].node, - n->e[1].isStrip, - n->e[2].node, - n->e[2].isStrip, - n->v[0], - n->v[1], - n->v[2]); -} - -static void -printLone(StripMesh *sm) -{ - FORLIST(lnk, sm->loneNodes) - printNode(sm, LLLinkGetData(lnk, StripNode, inlist)); -} - -static void -printEnds(StripMesh *sm) -{ - FORLIST(lnk, sm->endNodes) - printNode(sm, LLLinkGetData(lnk, StripNode, inlist)); -} - -static void -printSmesh(StripMesh *sm) -{ - for(int32 i = 0; i < sm->numNodes; i++) - printNode(sm, &sm->nodes[i]); -} - -static void -collectFaces(Geometry *geo, StripMesh *sm, uint16 m) -{ - StripNode *n; - Triangle *t; - sm->numNodes = 0; - for(int32 i = 0; i < geo->numTriangles; i++){ - t = &geo->triangles[i]; - if(t->matId == m){ - n = &sm->nodes[sm->numNodes++]; - n->v[0] = t->v[0]; - n->v[1] = t->v[1]; - n->v[2] = t->v[2]; - assert(t->v[0] < geo->numVertices); - assert(t->v[1] < geo->numVertices); - assert(t->v[2] < geo->numVertices); - n->e[0].node = 0; - n->e[1].node = 0; - n->e[2].node = 0; - n->e[0].isConnected = 0; - n->e[1].isConnected = 0; - n->e[2].isConnected = 0; - n->e[0].isStrip = 0; - n->e[1].isStrip = 0; - n->e[2].isStrip = 0; - n->parent = 0; - n->visited = 0; - n->stripVisited = 0; - n->isEnd = 0; - n->stripId = -1; - n->inlist.init(); - } - } -} - -/* Find Triangle that has edge e that is not connected yet. */ -static GraphEdge -findEdge(StripMesh *sm, int32 e[2]) -{ - StripNode *n; - GraphEdge ge = { 0, 0, 0, 0 }; - for(int32 i = 0; i < sm->numNodes; i++){ - n = &sm->nodes[i]; - for(int32 j = 0; j < 3; j++){ - if(n->e[j].isConnected) - continue; - if(e[0] == n->v[j] && - e[1] == n->v[(j+1) % 3]){ - ge.node = i; - // signal success - ge.isConnected = 1; - ge.otherEdge = j; - return ge; - } - } - } - return ge; -} - -/* Connect nodes sharing an edge, preserving winding */ -static void -connectNodesPreserve(StripMesh *sm) -{ - StripNode *n, *nn; - int32 e[2]; - GraphEdge ge; - for(int32 i = 0; i < sm->numNodes; i++){ - n = &sm->nodes[i]; - for(int32 j = 0; j < 3; j++){ - if(n->e[j].isConnected) - continue; - - /* flip edge and search for node */ - e[1] = n->v[j]; - e[0] = n->v[(j+1) % 3]; - ge = findEdge(sm, e); - if(ge.isConnected){ - /* found node, now connect */ - n->e[j].node = ge.node; - n->e[j].isConnected = 1; - n->e[j].otherEdge = ge.otherEdge; - n->e[j].isStrip = 0; - nn = &sm->nodes[ge.node]; - nn->e[ge.otherEdge].node = i; - nn->e[ge.otherEdge].isConnected = 1; - nn->e[ge.otherEdge].otherEdge = j; - nn->e[ge.otherEdge].isStrip = 0; - } - } - } -} - -static int32 -numConnections(StripNode *n) -{ - return n->e[0].isConnected + - n->e[1].isConnected + - n->e[2].isConnected; -} - -static int32 -numStripEdges(StripNode *n) -{ - return n->e[0].isStrip + - n->e[1].isStrip + - n->e[2].isStrip; -} - -#define IsEnd(n) (numConnections(n) > 0 && numStripEdges(n) < 2) - -/* Complement the strip-ness of an edge */ -static void -complementEdge(StripMesh *sm, GraphEdge *e) -{ - e->isStrip = !e->isStrip; - e = &sm->nodes[e->node].e[e->otherEdge]; - e->isStrip = !e->isStrip; -} - -/* While possible extend a strip from a starting node until - * we find a node already in a strip. N.B. this function - * makes no attempts to connect to an already existing strip. - * It also doesn't try to alternate between left and right. */ -static void -extendStrip(StripMesh *sm, StripNode *start) -{ - StripNode *n, *nn; - n = start; - if(numConnections(n) == 0){ - sm->loneNodes.append(&n->inlist); - return; - } - sm->endNodes.append(&n->inlist); - n->isEnd = 1; -loop: - /* Find the next node to connect to on any of the three edges */ - for(int32 i = 0; i < 3; i++){ - if(!n->e[i].isConnected) - continue; - nn = &sm->nodes[n->e[i].node]; - if(nn->stripId >= 0) - continue; - - /* found one */ - nn->stripId = n->stripId; - /* We know it's not a strip edge yet, - * so complementing it will make it one. */ - complementEdge(sm, &n->e[i]); - n = nn; - goto loop; - } - if(n != start){ - sm->endNodes.append(&n->inlist); - n->isEnd = 1; - } -} - -static void -buildStrips(StripMesh *sm) -{ - StripNode *n; - for(int32 i = 0; i < sm->numNodes; i++){ - n = &sm->nodes[i]; - if(n->stripId >= 0) - continue; - n->stripId = i; - extendStrip(sm, n); - } -} - -static StripNode* -findTunnel(StripMesh *sm, StripNode *n) -{ - LinkList searchNodes; - StripNode *nn; - int edgetype; - int isEnd; - - searchNodes.init(); - edgetype = 0; - for(;;){ - for(int32 i = 0; i < 3; i++){ - /* Find a node connected by the right edgetype */ - if(!n->e[i].isConnected || - n->e[i].isStrip != edgetype) - continue; - nn = &sm->nodes[n->e[i].node]; - - /* If the node has been visited already, - * there's a shorter path. */ - if(nn->visited) - continue; - - /* Don't allow non-strip edge between nodes of the same - * strip to prevent loops. - * Actually these edges are allowed under certain - * circumstances, but they require complex checks. */ - if(edgetype == 0 && - n->stripId == nn->stripId) - continue; - - isEnd = IsEnd(nn); - - /* Can't add end nodes to two lists, so skip. */ - if(isEnd && edgetype == 1) - continue; - - nn->parent = n->e[i].otherEdge; - nn->visited = 1; - sm->nodes[nn->stripId].stripVisited = 1; - - /* Search complete. */ - if(isEnd && edgetype == 0) - return nn; - - /* Found a valid node. */ - searchNodes.append(&nn->inlist); - } - if(searchNodes.isEmpty()) - return nil; - n = LLLinkGetData(searchNodes.link.next, StripNode, inlist); - n->inlist.remove(); - edgetype = !edgetype; - } -} - -static void -resetGraph(StripMesh *sm) -{ - StripNode *n; - for(int32 i = 0; i < sm->numNodes; i++){ - n = &sm->nodes[i]; - n->visited = 0; - n->stripVisited = 0; - } -} - -static StripNode* -walkStrip(StripMesh *sm, StripNode *start) -{ - StripNode *n, *nn; - int32 last; - -//trace("stripend: "); -//printNode(sm, start); - - n = start; - last = -1; - for(;;n = nn){ - n->visited = 0; - n->stripVisited = 0; - if(n->isEnd) - n->inlist.remove(); - n->isEnd = 0; - - if(IsEnd(n) && n != start) - return n; - - /* find next node */ - nn = nil; - for(int32 i = 0; i < 3; i++){ - if(!n->e[i].isStrip || i == last) - continue; - nn = &sm->nodes[n->e[i].node]; - last = n->e[i].otherEdge; - nn->stripId = n->stripId; - break; - } -//trace(" next: "); -//printNode(sm, nn); - if(nn == nil) - return nil; - } -} - -static void -applyTunnel(StripMesh *sm, StripNode *end, StripNode *start) -{ - LinkList tmplist; - StripNode *n, *nn; - - for(n = end; n != start; n = &sm->nodes[n->e[n->parent].node]){ -//trace(" "); -//printNode(sm, n); - complementEdge(sm, &n->e[n->parent]); - } -//trace(" "); -//printNode(sm, start); - -//printSmesh(sm); -//trace("-------\n"); - tmplist.init(); - while(!sm->endNodes.isEmpty()){ - n = LLLinkGetData(sm->endNodes.link.next, StripNode, inlist); - /* take out of end list */ - n->inlist.remove(); - n->isEnd = 0; - /* no longer an end node */ - if(!IsEnd(n)) - continue; - // TODO: only walk strip if it was touched - /* set new id, walk strip and find other end */ - n->stripId = n - sm->nodes; - nn = walkStrip(sm, n); - tmplist.append(&n->inlist); - n->isEnd = 1; - if(nn && n != nn){ - tmplist.append(&nn->inlist); - nn->isEnd = 1; - } - } - /* Move new end nodes to the real list. */ - sm->endNodes = tmplist; - sm->endNodes.link.next->prev = &sm->endNodes.link; - sm->endNodes.link.prev->next = &sm->endNodes.link; -} - -static void -tunnel(StripMesh *sm) -{ - StripNode *n, *nn; - -again: - FORLIST(lnk, sm->endNodes){ - n = LLLinkGetData(lnk, StripNode, inlist); -// trace("searching %p %d\n", n, numStripEdges(n)); - nn = findTunnel(sm, n); -// trace(" %p %p\n", n, nn); - - if(nn){ - applyTunnel(sm, nn, n); - resetGraph(sm); - /* applyTunnel changes sm->endNodes, so we have to - * jump out of the loop. */ - goto again; - } - resetGraph(sm); - } - trace("tunneling done!\n"); -} - -/* Get next edge in strip. - * Last is the edge index whence we came lest we go back. */ -static int -getNextEdge(StripNode *n, int32 last) -{ - int32 i; - for(i = 0; i < 3; i++) - if(n->e[i].isStrip && i != last) - return i; - return -1; -} - -#define NEXT(x) (((x)+1) % 3) -#define PREV(x) (((x)+2) % 3) -#define RIGHT(x) NEXT(x) -#define LEFT(x) PREV(x) - -/* Generate mesh indices for all strips in a StripMesh */ -static void -makeMesh(StripMesh *sm, Mesh *m) -{ - int32 i, j; - int32 rightturn, lastrightturn; - int32 seam; - int32 even; - StripNode *n; - - /* three indices + two for stitch per triangle must be enough */ - m->indices = rwNewT(uint16, sm->numNodes*5, MEMDUR_FUNCTION | ID_GEOMETRY); - memset(m->indices, 0xFF, sm->numNodes*5*sizeof(uint16)); - - even = 1; - FORLIST(lnk, sm->endNodes){ - n = LLLinkGetData(lnk, StripNode, inlist); - /* only interested in start nodes, not the ends */ - if(n->stripId != (n - sm->nodes)) - continue; - - /* i is the edge we enter this triangle from. - * j is the edge we exit. */ - j = getNextEdge(n, -1); - /* starting triangle must have connection */ - if(j < 0) - continue; - /* Space to stitch together strips */ - seam = m->numIndices; - if(seam) - m->numIndices += 2; - /* Start ccw for even tris */ - if(even){ - /* Start with a right turn */ - i = LEFT(j); - m->indices[m->numIndices++] = n->v[i]; - m->indices[m->numIndices++] = n->v[NEXT(i)]; - }else{ - /* Start with a left turn */ - i = RIGHT(j); - m->indices[m->numIndices++] = n->v[NEXT(i)]; - m->indices[m->numIndices++] = n->v[i]; - } -trace("\nstart %d %d\n", numStripEdges(n), m->numIndices-2); - lastrightturn = -1; - - while(j >= 0){ - rightturn = RIGHT(i) == j; - if(rightturn == lastrightturn){ - // insert a swap if we're not alternating - m->indices[m->numIndices] = m->indices[m->numIndices-2]; -trace("SWAP\n"); - m->numIndices++; - even = !even; - } -trace("%d:%d%c %d %d %d\n", n-sm->nodes, m->numIndices, even ? ' ' : '.', n->v[0], n->v[1], n->v[2]); - lastrightturn = rightturn; - if(rightturn) - m->indices[m->numIndices++] = n->v[NEXT(j)]; - else - m->indices[m->numIndices++] = n->v[j]; - even = !even; - - /* go to next triangle */ - i = n->e[j].otherEdge; - n = &sm->nodes[n->e[j].node]; - j = getNextEdge(n, i); - } - - /* finish strip */ -trace("%d:%d%c %d %d %d\nend\n", n-sm->nodes, m->numIndices, even ? ' ' : '.', n->v[0], n->v[1], n->v[2]); - m->indices[m->numIndices++] = n->v[LEFT(i)]; - even = !even; - if(seam){ - m->indices[seam] = m->indices[seam-1]; - m->indices[seam+1] = m->indices[seam+2]; -trace("STITCH %d: %d %d\n", seam, m->indices[seam], m->indices[seam+1]); - } - } - - /* Add all unconnected and lonely triangles */ - FORLIST(lnk, sm->endNodes){ - n = LLLinkGetData(lnk, StripNode, inlist); - if(numStripEdges(n) != 0) - continue; - if(m->numIndices != 0){ - m->indices[m->numIndices] = m->indices[m->numIndices-1]; - m->numIndices++; - m->indices[m->numIndices++] = n->v[!even]; - } - m->indices[m->numIndices++] = n->v[!even]; - m->indices[m->numIndices++] = n->v[even]; - m->indices[m->numIndices++] = n->v[2]; - even = !even; - } - FORLIST(lnk, sm->loneNodes){ - n = LLLinkGetData(lnk, StripNode, inlist); - if(m->numIndices != 0){ - m->indices[m->numIndices] = m->indices[m->numIndices-1]; - m->numIndices++; - m->indices[m->numIndices++] = n->v[!even]; - } - m->indices[m->numIndices++] = n->v[!even]; - m->indices[m->numIndices++] = n->v[even]; - m->indices[m->numIndices++] = n->v[2]; - even = !even; - } -} - -static void verifyMesh(Geometry *geo); - -/* - * For each material: - * 1. build dual graph (collectFaces, connectNodes) - * 2. make some simple strip (buildStrips) - * 3. apply tunnel operator (tunnel) - */ -void -Geometry::buildTristrips(void) -{ - int32 i; - uint16 *indices; - MeshHeader *header; - Mesh *ms, *md; - StripMesh smesh; - -// trace("%ld\n", sizeof(StripNode)); - - this->allocateMeshes(matList.numMaterials, 0, 1); - - smesh.nodes = rwNewT(StripNode, this->numTriangles, MEMDUR_FUNCTION | ID_GEOMETRY); - ms = this->meshHeader->getMeshes(); - for(int32 i = 0; i < this->matList.numMaterials; i++){ - smesh.loneNodes.init(); - smesh.endNodes.init(); - collectFaces(this, &smesh, i); - connectNodesPreserve(&smesh); - buildStrips(&smesh); -printSmesh(&smesh); -//trace("-------\n"); -//printLone(&smesh); -//trace("-------\n"); -//printEnds(&smesh); -//trace("-------\n"); - // TODO: make this work -// tunnel(&smesh); -//trace("-------\n"); -//printEnds(&smesh); - - ms[i].material = this->matList.materials[i]; - makeMesh(&smesh, &ms[i]); - this->meshHeader->totalIndices += ms[i].numIndices; - } - rwFree(smesh.nodes); - - /* Now re-allocate and copy data */ - header = this->meshHeader; - this->meshHeader = nil; - this->allocateMeshes(header->numMeshes, header->totalIndices, 0); - this->meshHeader->flags = MeshHeader::TRISTRIP; - md = this->meshHeader->getMeshes(); - indices = md->indices; - for(i = 0; i < header->numMeshes; i++){ - md[i].material = ms[i].material; - md[i].numIndices = ms[i].numIndices; - md[i].indices = indices; - indices += md[i].numIndices; - memcpy(md[i].indices, ms[i].indices, md[i].numIndices*sizeof(uint16)); - rwFree(ms[i].indices); - } - rwFree(header); - - verifyMesh(this); -} - -/* Check that tristripped mesh and geometry triangles are actually the same. */ -static void -verifyMesh(Geometry *geo) -{ - int32 i, k; - uint32 j; - int32 x; - int32 a, b, c, m; - Mesh *mesh; - Triangle *t; - uint8 *seen; - - seen = rwNewT(uint8, geo->numTriangles, MEMDUR_FUNCTION | ID_GEOMETRY); - memset(seen, 0, geo->numTriangles); - - mesh = geo->meshHeader->getMeshes(); - for(i = 0; i < geo->meshHeader->numMeshes; i++){ - m = geo->matList.findIndex(mesh->material); - x = 0; - for(j = 0; j < mesh->numIndices-2; j++){ - a = mesh->indices[j+x]; - x = !x; - b = mesh->indices[j+x]; - c = mesh->indices[j+2]; - if(a >= geo->numVertices || - b >= geo->numVertices || - c >= geo->numVertices){ - fprintf(stderr, "triangle %d %d %d out of range (%d)\n", a, b, c, geo->numVertices); - goto loss; - } - if(a == b || a == c || b == c) - continue; -trace("%d %d %d\n", a, b, c); - - /* now that we have a triangle, try to find it */ - for(k = 0; k < geo->numTriangles; k++){ - t = &geo->triangles[k]; - if(seen[k] || t->matId != m) continue; - if((t->v[0] == a && t->v[1] == b && t->v[2] == c) || - (t->v[1] == a && t->v[2] == b && t->v[0] == c) || - (t->v[2] == a && t->v[0] == b && t->v[1] == c)){ - seen[k] = 1; - goto found; - } - } - goto loss; - found: ; - } - mesh++; - } - - /* Also check that all triangles are in the mesh */ - for(i = 0; i < geo->numTriangles; i++) - if(!seen[i]){ - loss: - fprintf(stderr, "TRISTRIP verify failed\n"); - exit(1); - } - - rwFree(seen); -} - -} diff --git a/vendor/librw/src/userdata.cpp b/vendor/librw/src/userdata.cpp deleted file mode 100644 index e17a3d5..0000000 --- a/vendor/librw/src/userdata.cpp +++ /dev/null @@ -1,364 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" -#include "rwuserdata.h" - -#define PLUGIN_ID ID_USERDATA - -namespace rw { - -UserDataGlobals userDataGlobals; - -#define udMalloc(sz) rwMalloc(sz, MEMDUR_EVENT | ID_USERDATA) - -void -UserDataArray::setString(int32 n, const char *s) -{ - int32 len; - char **sp = &((char**)this->data)[n]; - rwFree(*sp); - len = (int32)strlen(s)+1; - *sp = (char*)udMalloc(len); - if(*sp) - strncpy(*sp, s, len); -} - -static void* -createUserData(void *object, int32 offset, int32) -{ - UserDataExtension *ext = PLUGINOFFSET(UserDataExtension, object, offset); - ext->numArrays = 0; - ext->arrays = nil; - return object; -} - -static void* -destroyUserData(void *object, int32 offset, int32) -{ - int32 i, j; - char **strar; - UserDataArray *a; - UserDataExtension *ext = PLUGINOFFSET(UserDataExtension, object, offset); - a = ext->arrays; - for(i = 0; i < ext->numArrays; i++){ - rwFree(a->name); - switch(a->datatype){ - case USERDATASTRING: - strar = (char**)a->data; - for(j = 0; j < a->numElements; j++) - rwFree(strar[j]); - /* fallthrough */ - case USERDATAINT: - case USERDATAFLOAT: - rwFree(a->data); - break; - } - a++; - } - rwFree(ext->arrays); - ext->numArrays = 0; - ext->arrays = nil; - return object; -} - -static void* -copyUserData(void *dst, void *src, int32 offset, int32) -{ - int32 i, j; - char **srcstrar, **dststrar; - UserDataArray *srca, *dsta; - UserDataExtension *srcext = PLUGINOFFSET(UserDataExtension, src, offset); - UserDataExtension *dstext = PLUGINOFFSET(UserDataExtension, dst, offset); - dstext->numArrays = srcext->numArrays; - dstext->arrays = (UserDataArray*)udMalloc(dstext->numArrays*sizeof(UserDataArray)); - srca = srcext->arrays; - dsta = srcext->arrays; - for(i = 0; i < srcext->numArrays; i++){ - int32 len = (int32)strlen(srca->name)+1; - dsta->name = (char*)udMalloc(len); - strncpy(dsta->name, srca->name, len); - dsta->datatype = srca->datatype; - dsta->numElements = srca->numElements; - switch(srca->datatype){ - case USERDATAINT: - dsta->data = (int32*)udMalloc(sizeof(int32)*dsta->numElements); - memcpy(dsta->data, srca->data, sizeof(int32)*dsta->numElements); - break; - case USERDATAFLOAT: - dsta->data = (float32*)udMalloc(sizeof(float32)*dsta->numElements); - memcpy(dsta->data, srca->data, sizeof(float32)*dsta->numElements); - break; - case USERDATASTRING: - dststrar = (char**)udMalloc(sizeof(char*)*dsta->numElements); - dsta->data = dststrar; - srcstrar = (char**)srca->data; - for(j = 0; j < dsta->numElements; j++){ - len = (int32)strlen(srcstrar[j])+1; - dststrar[j] = (char*)udMalloc(len); - strncpy(dststrar[j], srcstrar[j], len); - } - break; - } - srca++; - dsta++; - } - return dst; -} - -static Stream* -readUserData(Stream *stream, int32, void *object, int32 offset, int32) -{ - int32 i, j; - char **strar; - UserDataArray *a; - UserDataExtension *ext = PLUGINOFFSET(UserDataExtension, object, offset); - ext->numArrays = stream->readI32(); - ext->arrays = (UserDataArray*)udMalloc(ext->numArrays*sizeof(UserDataArray)); - a = ext->arrays; - for(i = 0; i < ext->numArrays; i++){ - int32 len = stream->readI32(); - a->name = (char*)udMalloc(len); - stream->read8(a->name, len); - a->datatype = stream->readU32(); - a->numElements = stream->readI32(); - switch(a->datatype){ - case USERDATAINT: - a->data = (int32*)udMalloc(sizeof(int32)*a->numElements); - stream->read32(a->data, sizeof(int32)*a->numElements); - break; - case USERDATAFLOAT: - a->data = (float32*)udMalloc(sizeof(float32)*a->numElements); - stream->read32(a->data, sizeof(float32)*a->numElements); - break; - case USERDATASTRING: - strar = (char**)udMalloc(sizeof(char*)*a->numElements); - a->data = strar; - for(j = 0; j < a->numElements; j++){ - len = stream->readI32(); - strar[j] = (char*)udMalloc(len); - stream->read8(strar[j], len); - } - break; - } - a++; - } - return stream; -} - -static Stream* -writeUserData(Stream *stream, int32, void *object, int32 offset, int32) -{ - int32 len; - int32 i, j; - char **strar; - UserDataArray *a; - UserDataExtension *ext = PLUGINOFFSET(UserDataExtension, object, offset); - stream->writeI32(ext->numArrays); - a = ext->arrays; - for(i = 0; i < ext->numArrays; i++){ - len = (int32)strlen(a->name)+1; - stream->writeI32(len); - stream->write8(a->name, len); - stream->writeU32(a->datatype); - stream->writeI32(a->numElements); - switch(a->datatype){ - case USERDATAINT: - stream->write32(a->data, sizeof(int32)*a->numElements); - break; - case USERDATAFLOAT: - stream->write32(a->data, sizeof(float32)*a->numElements); - break; - case USERDATASTRING: - strar = (char**)a->data; - for(j = 0; j < a->numElements; j++){ - len = (int32)strlen(strar[j])+1; - stream->writeI32(len); - stream->write8(strar[j], len); - } - break; - } - a++; - } - return stream; -} - -static int32 -getSizeUserData(void *object, int32 offset, int32) -{ - int32 len; - int32 i, j; - char **strar; - int32 size; - UserDataArray *a; - UserDataExtension *ext = PLUGINOFFSET(UserDataExtension, object, offset); - if(ext->numArrays == 0) - return 0; - size = 4; // numArrays - a = ext->arrays; - for(i = 0; i < ext->numArrays; i++){ - len = (int32)strlen(a->name)+1; - size += 4 + len + 4 + 4; // name len, name, type, numElements - switch(a->datatype){ - case USERDATAINT: - size += sizeof(int32)*a->numElements; - break; - case USERDATAFLOAT: - size += sizeof(float32)*a->numElements; - break; - case USERDATASTRING: - strar = (char**)a->data; - for(j = 0; j < a->numElements; j++){ - len = (int32)strlen(strar[j])+1; - size += 4 + len; // len and string - } - break; - } - a++; - } - return size; -} - -int32 -UserDataExtension::add(const char *name, int32 datatype, int32 numElements) -{ - int32 i; - int32 len; - int32 typesz; - UserDataArray *a; - // try to find empty slot - for(i = 0; i < this->numArrays; i++) - if(this->arrays[i].datatype == USERDATANA) - goto alloc; - // have to realloc - a = (UserDataArray*)udMalloc((this->numArrays+1)*sizeof(UserDataArray)); - if(a == nil) - return -1; - memcpy(a, this->arrays, this->numArrays*sizeof(UserDataArray)); - rwFree(this->arrays); - this->arrays = a; - i = this->numArrays++; -alloc: - a = &this->arrays[i]; - len = (int32)strlen(name)+1; - a->name = (char*)udMalloc(len+1); - assert(a->name); - strncpy(a->name, name, len); - a->datatype = datatype; - a->numElements = numElements; - typesz = datatype == USERDATAINT ? sizeof(int32) : - datatype == USERDATAFLOAT ? sizeof(float32) : - datatype == USERDATASTRING ? sizeof(char*) : 0; - a->data = udMalloc(typesz*numElements); - assert(a->data); - memset(a->data, 0, typesz*numElements); - return i; -} - -void -UserDataExtension::remove(int32 n) -{ - int32 i; - UserDataArray *a = &this->arrays[n]; - if(a->name){ - rwFree(a->name); - a->name = nil; - } - if(a->datatype == USERDATASTRING) - for(i = 0; i < a->numElements; i++) - rwFree(((char**)a->data)[i]); - if(a->data){ - rwFree(a->data); - a->data = nil; - } - a->datatype = USERDATANA; - a->numElements = 0; -} - -int32 -UserDataExtension::findIndex(const char *name) { - for(int32 i = 0; i < this->numArrays; i++) - if(strcmp(this->arrays[i].name, name) == 0) - return i; - return -1; -} - -#define ACCESSOR(TYPE, NAME) \ -int32 \ -UserDataArray::NAME##Add(TYPE *t, const char *name, int32 datatype, int32 numElements) \ -{ \ - return PLUGINOFFSET(UserDataExtension, t, userDataGlobals.NAME##Offset)->add(name, datatype, numElements); \ -} \ -void \ -UserDataArray::NAME##Remove(TYPE *t, int32 n) \ -{ \ - PLUGINOFFSET(UserDataExtension, t, userDataGlobals.NAME##Offset)->remove(n); \ -} \ -int32 \ -UserDataArray::NAME##GetCount(TYPE *t) \ -{ \ - return PLUGINOFFSET(UserDataExtension, t, userDataGlobals.NAME##Offset)->getCount(); \ -} \ -UserDataArray* \ -UserDataArray::NAME##Get(TYPE *t, int32 n) \ -{ \ - return PLUGINOFFSET(UserDataExtension, t, userDataGlobals.NAME##Offset)->get(n); \ -} \ -int32 \ -UserDataArray::NAME##FindIndex(TYPE *t, const char *name) \ -{ \ - return PLUGINOFFSET(UserDataExtension, t, userDataGlobals.NAME##Offset)->findIndex(name); \ -} - -ACCESSOR(Geometry, geometry) -ACCESSOR(Frame, frame) -ACCESSOR(Camera, camera) -ACCESSOR(Light, light) -ACCESSOR(Material, material) -ACCESSOR(Texture, texture) - -UserDataExtension *UserDataExtension::get(Geometry *geo) { return PLUGINOFFSET(UserDataExtension, geo, userDataGlobals.geometryOffset); } -UserDataExtension *UserDataExtension::get(Frame *frame) { return PLUGINOFFSET(UserDataExtension, frame, userDataGlobals.frameOffset); } -UserDataExtension *UserDataExtension::get(Camera *cam) { return PLUGINOFFSET(UserDataExtension, cam, userDataGlobals.cameraOffset); } -UserDataExtension *UserDataExtension::get(Light *light) { return PLUGINOFFSET(UserDataExtension, light, userDataGlobals.lightOffset); } -UserDataExtension *UserDataExtension::get(Material *mat) { return PLUGINOFFSET(UserDataExtension, mat, userDataGlobals.materialOffset); } -UserDataExtension *UserDataExtension::get(Texture *tex) { return PLUGINOFFSET(UserDataExtension, tex, userDataGlobals.textureOffset); } - -void -registerUserDataPlugin(void) -{ - // TODO: World Sector - - userDataGlobals.geometryOffset = Geometry::registerPlugin(sizeof(UserDataExtension), - ID_USERDATA, createUserData, destroyUserData, copyUserData); - Geometry::registerPluginStream(ID_USERDATA, readUserData, writeUserData, getSizeUserData); - - userDataGlobals.frameOffset = Frame::registerPlugin(sizeof(UserDataExtension), - ID_USERDATA, createUserData, destroyUserData, copyUserData); - Frame::registerPluginStream(ID_USERDATA, readUserData, writeUserData, getSizeUserData); - - userDataGlobals.cameraOffset = Camera::registerPlugin(sizeof(UserDataExtension), - ID_USERDATA, createUserData, destroyUserData, copyUserData); - Camera::registerPluginStream(ID_USERDATA, readUserData, writeUserData, getSizeUserData); - - userDataGlobals.lightOffset = Light::registerPlugin(sizeof(UserDataExtension), - ID_USERDATA, createUserData, destroyUserData, copyUserData); - Light::registerPluginStream(ID_USERDATA, readUserData, writeUserData, getSizeUserData); - - userDataGlobals.materialOffset = Material::registerPlugin(sizeof(UserDataExtension), - ID_USERDATA, createUserData, destroyUserData, copyUserData); - Material::registerPluginStream(ID_USERDATA, readUserData, writeUserData, getSizeUserData); - - userDataGlobals.textureOffset = Texture::registerPlugin(sizeof(UserDataExtension), - ID_USERDATA, createUserData, destroyUserData, copyUserData); - Texture::registerPluginStream(ID_USERDATA, readUserData, writeUserData, getSizeUserData); -} - -} diff --git a/vendor/librw/src/uvanim.cpp b/vendor/librw/src/uvanim.cpp deleted file mode 100644 index f197b28..0000000 --- a/vendor/librw/src/uvanim.cpp +++ /dev/null @@ -1,502 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" -#include "rwanim.h" -#include "rwplugins.h" - -#define PLUGIN_ID ID_UVANIMATION - -namespace rw { - -// -// UVAnim -// - -void -UVAnimCustomData::destroy(Animation *anim) -{ - this->refCount--; - if(this->refCount <= 0) - anim->destroy(); -} - -UVAnimDictionary *currentUVAnimDictionary; - -UVAnimDictionary* -UVAnimDictionary::create(void) -{ - UVAnimDictionary *dict = (UVAnimDictionary*)rwMalloc(sizeof(UVAnimDictionary), MEMDUR_EVENT | ID_UVANIMATION); - if(dict == nil){ - RWERROR((ERR_ALLOC, sizeof(UVAnimDictionary))); - return nil; - } - dict->animations.init(); - return dict; -} - -void -UVAnimDictionary::destroy(void) -{ - FORLIST(lnk, this->animations){ - UVAnimDictEntry *de = UVAnimDictEntry::fromDict(lnk); - UVAnimCustomData *cust = UVAnimCustomData::get(de->anim); - cust->destroy(de->anim); - rwFree(de); - } - rwFree(this); -} - -void -UVAnimDictionary::add(Animation *anim) -{ - UVAnimDictEntry *de = rwNewT(UVAnimDictEntry, 1, MEMDUR_EVENT | ID_UVANIMDICT); - de->anim = anim; - this->animations.append(&de->inDict); -} - -UVAnimDictionary* -UVAnimDictionary::streamRead(Stream *stream) -{ - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - UVAnimDictionary *dict = UVAnimDictionary::create(); - if(dict == nil) - return nil; - int32 numAnims = stream->readI32(); - Animation *anim; - for(int32 i = 0; i < numAnims; i++){ - if(!findChunk(stream, ID_ANIMANIMATION, nil, nil)){ - RWERROR((ERR_CHUNK, "ANIMANIMATION")); - goto fail; - } - anim = Animation::streamRead(stream); - if(anim == nil) - goto fail; - dict->add(anim); - } - return dict; -fail: - dict->destroy(); - return nil; -} - -bool -UVAnimDictionary::streamWrite(Stream *stream) -{ - uint32 size = this->streamGetSize(); - writeChunkHeader(stream, ID_UVANIMDICT, size); - writeChunkHeader(stream, ID_STRUCT, 4); - int32 numAnims = this->count(); - stream->writeI32(numAnims); - FORLIST(lnk, this->animations){ - UVAnimDictEntry *de = UVAnimDictEntry::fromDict(lnk); - de->anim->streamWrite(stream); - } - return true; -} - -uint32 -UVAnimDictionary::streamGetSize(void) -{ - uint32 size = 12 + 4; - FORLIST(lnk, this->animations){ - UVAnimDictEntry *de = UVAnimDictEntry::fromDict(lnk); - size += 12 + de->anim->streamGetSize(); - } - return size; -} - -Animation* -UVAnimDictionary::find(const char *name) -{ - FORLIST(lnk, this->animations){ - Animation *anim = UVAnimDictEntry::fromDict(lnk)->anim; - UVAnimCustomData *custom = UVAnimCustomData::get(anim); - if(strncmp_ci(custom->name, name, 32) == 0) - return anim; - } - return nil; -} - -static void -uvAnimStreamRead(Stream *stream, Animation *anim) -{ - UVAnimCustomData *custom = UVAnimCustomData::get(anim); - UVAnimKeyFrame *frames = (UVAnimKeyFrame*)anim->keyframes; - stream->readI32(); - stream->read8(custom->name, 32); - stream->read32(custom->nodeToUVChannel, 8*4); - custom->refCount = 1; - - for(int32 i = 0; i < anim->numFrames; i++){ - frames[i].time = stream->readF32(); - stream->read32(frames[i].uv, 6*4); - int32 prev = stream->readI32(); - frames[i].prev = &frames[prev]; - } -} - -static void -uvAnimStreamWrite(Stream *stream, Animation *anim) -{ - UVAnimCustomData *custom = UVAnimCustomData::get(anim); - UVAnimKeyFrame *frames = (UVAnimKeyFrame*)anim->keyframes; - stream->writeI32(0); - stream->write8(custom->name, 32); - stream->write32(custom->nodeToUVChannel, 8*4); - - for(int32 i = 0; i < anim->numFrames; i++){ - stream->writeF32(frames[i].time); - stream->write32(frames[i].uv, 6*4); - stream->writeI32(frames[i].prev - frames); - } -} - -static uint32 -uvAnimStreamGetSize(Animation *anim) -{ - return 4 + 32 + 8*4 + anim->numFrames*(4 + 6*4 + 4); -} - -static void -uvAnimLinearApplyCB(void *result, void *frame) -{ - Matrix *m = (Matrix*)result; - UVAnimInterpFrame *f = (UVAnimInterpFrame*)frame; - m->right.x = f->uv[0]; - m->right.y = f->uv[1]; - m->right.z = 0.0f; - m->up.x = f->uv[2]; - m->up.y = f->uv[3]; - m->up.z = 0.0f; - m->at.x = 0.0f; - m->at.y = 0.0f; - m->at.z = 0.0f; - m->pos.x = f->uv[4]; - m->pos.y = f->uv[5]; - m->pos.z = 0.0f; - m->update(); -} - -static void -uvAnimLinearInterpCB(void *out, void *in1, void *in2, float32 t, void *custom) -{ - UVAnimInterpFrame *intf = (UVAnimInterpFrame*)out; - UVAnimKeyFrame *kf1 = (UVAnimKeyFrame*)in1; - UVAnimKeyFrame *kf2 = (UVAnimKeyFrame*)in2; - float32 f = (t - kf1->time) / (kf2->time - kf1->time); - intf->uv[0] = (kf2->uv[0] - kf1->uv[0])*f + kf1->uv[0]; - intf->uv[1] = (kf2->uv[1] - kf1->uv[1])*f + kf1->uv[1]; - intf->uv[2] = (kf2->uv[2] - kf1->uv[2])*f + kf1->uv[2]; - intf->uv[3] = (kf2->uv[3] - kf1->uv[3])*f + kf1->uv[3]; - intf->uv[4] = (kf2->uv[4] - kf1->uv[4])*f + kf1->uv[4]; - intf->uv[5] = (kf2->uv[5] - kf1->uv[5])*f + kf1->uv[5]; -} - -static void -uvAnimParamApplyCB(void *result, void *frame) -{ - Matrix *m = (Matrix*)result; - UVAnimInterpFrame *f = (UVAnimInterpFrame*)frame; - UVAnimParamData *p = (UVAnimParamData*)f->uv; - - m->right.x = p->s0; - m->right.y = p->skew; - m->right.z = 0.0f; - m->up.x = 0.0f; - m->up.y = p->s1; - m->up.z = 0.0f; - m->at.x = 0.0f; - m->at.y = 0.0f; - m->at.z = 0.0f; - m->pos.x = p->x; - m->pos.y = p->y; - m->pos.z = 0.0f; - m->update(); - static V3d xlat1 = { -0.5f, -0.5f, 0.0f }; - static V3d xlat2 = { 0.5f, 0.5f, 0.0f }; - static V3d axis = { 0.0f, 0.0f, 1.0f }; - m->translate(&xlat1, COMBINEPOSTCONCAT); - m->rotate(&axis, p->theta*180.0f/(float)M_PI, COMBINEPOSTCONCAT); - m->translate(&xlat2, COMBINEPOSTCONCAT); -} - -static void -uvAnimParamInterpCB(void *out, void *in1, void *in2, float32 t, void *custom) -{ - UVAnimInterpFrame *intf = (UVAnimInterpFrame*)out; - UVAnimKeyFrame *kf1 = (UVAnimKeyFrame*)in1; - UVAnimKeyFrame *kf2 = (UVAnimKeyFrame*)in2; - float32 f = (t - kf1->time) / (kf2->time - kf1->time); - - float32 a = kf2->uv[0] - kf1->uv[0]; - while(a < (float)M_PI) a += 2 * (float)M_PI; - while(a > (float)M_PI) a -= 2 * (float)M_PI; - intf->uv[0] = a*f + kf1->uv[0]; - intf->uv[1] = (kf2->uv[1] - kf1->uv[1])*f + kf1->uv[1]; - intf->uv[2] = (kf2->uv[2] - kf1->uv[2])*f + kf1->uv[2]; - intf->uv[3] = (kf2->uv[3] - kf1->uv[3])*f + kf1->uv[3]; - intf->uv[4] = (kf2->uv[4] - kf1->uv[4])*f + kf1->uv[4]; - intf->uv[5] = (kf2->uv[5] - kf1->uv[5])*f + kf1->uv[5]; -} - - -static void -registerUVAnimInterpolator(void) -{ - // TODO: implement this fully - - // Linear - AnimInterpolatorInfo *info = rwNewT(AnimInterpolatorInfo, 1, MEMDUR_GLOBAL | ID_UVANIMATION); - info->id = 0x1C0; - info->interpKeyFrameSize = sizeof(UVAnimInterpFrame); - info->animKeyFrameSize = sizeof(UVAnimKeyFrame); - info->customDataSize = sizeof(UVAnimCustomData); - info->applyCB = uvAnimLinearApplyCB; - info->blendCB = nil; - info->interpCB = uvAnimLinearInterpCB; - info->addCB = nil; - info->mulRecipCB = nil; - info->streamRead = uvAnimStreamRead; - info->streamWrite = uvAnimStreamWrite; - info->streamGetSize = uvAnimStreamGetSize; - AnimInterpolatorInfo::registerInterp(info); - - // Param - info = rwNewT(AnimInterpolatorInfo, 1, MEMDUR_GLOBAL | ID_UVANIMATION); - info->id = 0x1C1; - info->interpKeyFrameSize = sizeof(UVAnimInterpFrame); - info->animKeyFrameSize = sizeof(UVAnimKeyFrame); - info->customDataSize = sizeof(UVAnimCustomData); - info->applyCB = uvAnimParamApplyCB; - info->blendCB = nil; - info->interpCB = uvAnimParamInterpCB; - info->addCB = nil; - info->mulRecipCB = nil; - info->streamRead = uvAnimStreamRead; - info->streamWrite = uvAnimStreamWrite; - info->streamGetSize = uvAnimStreamGetSize; - AnimInterpolatorInfo::registerInterp(info); -} - -int32 uvAnimOffset; - -static void* -createUVAnim(void *object, int32 offset, int32) -{ - UVAnim *uvanim; - uvanim = PLUGINOFFSET(UVAnim, object, offset); - memset(uvanim, 0, sizeof(*uvanim)); - return object; -} - -static void* -destroyUVAnim(void *object, int32 offset, int32) -{ - UVAnim *uvanim; - uvanim = PLUGINOFFSET(UVAnim, object, offset); - for(int32 i = 0; i < 8; i++){ - AnimInterpolator *ip = uvanim->interp[i]; - if(ip){ - UVAnimCustomData *custom = - UVAnimCustomData::get(ip->currentAnim); - custom->destroy(ip->currentAnim); - rwFree(ip); - } - } - return object; -} - -static void* -copyUVAnim(void *dst, void *src, int32 offset, int32) -{ - UVAnim *srcuvanim, *dstuvanim; - dstuvanim = PLUGINOFFSET(UVAnim, dst, offset); - srcuvanim = PLUGINOFFSET(UVAnim, src, offset); - for(int32 i = 0; i < 8; i++){ - AnimInterpolator *srcip = srcuvanim->interp[i]; - AnimInterpolator *dstip; - if(srcip){ - Animation *anim = srcip->currentAnim; - UVAnimCustomData *custom = UVAnimCustomData::get(anim); - dstip = AnimInterpolator::create(anim->getNumNodes(), - anim->interpInfo->interpKeyFrameSize); - dstip->setCurrentAnim(anim); - custom->refCount++; - dstuvanim->interp[i] = dstip; - } - } - return dst; -} - -Animation* -makeDummyAnimation(const char *name) -{ - AnimInterpolatorInfo *interpInfo = AnimInterpolatorInfo::find(0x1C0); - Animation *anim = Animation::create(interpInfo, 2, 0, 1.0f); - UVAnimCustomData *custom = UVAnimCustomData::get(anim); - strncpy(custom->name, name, 32); - memset(custom->nodeToUVChannel, 0, sizeof(custom->nodeToUVChannel)); - custom->refCount = 1; - UVAnimKeyFrame *frames = (UVAnimKeyFrame*)anim->keyframes; - frames[0].time = 0.0; - frames[0].prev = nil; - frames[1].time = 1.0; - frames[1].prev = &frames[0]; - return anim; -} - -static Stream* -readUVAnim(Stream *stream, int32, void *object, int32 offset, int32) -{ - UVAnim *uvanim = PLUGINOFFSET(UVAnim, object, offset); - if(!findChunk(stream, ID_STRUCT, nil, nil)){ - RWERROR((ERR_CHUNK, "STRUCT")); - return nil; - } - char name[32]; - uint32 mask = stream->readI32(); - uint32 bit = 1; - for(int32 i = 0; i < 8; i++){ - if(mask & bit){ - stream->read8(name, 32); - Animation *anim = nil; - if(currentUVAnimDictionary) - anim = currentUVAnimDictionary->find(name); - if(anim == nil){ - anim = makeDummyAnimation(name); - if(currentUVAnimDictionary) - currentUVAnimDictionary->add(anim); - } - UVAnimCustomData *custom = UVAnimCustomData::get(anim); - AnimInterpolator *interp; - interp = AnimInterpolator::create(anim->getNumNodes(), - anim->interpInfo->interpKeyFrameSize); - interp->setCurrentAnim(anim); - custom->refCount++; - uvanim->interp[i] = interp; - } - bit <<= 1; - } - // TEMP - if(uvanim->uv[0] == nil) - uvanim->uv[0] = Matrix::create(); - if(uvanim->uv[1] == nil) - uvanim->uv[1] = Matrix::create(); - return stream; -} - -static Stream* -writeUVAnim(Stream *stream, int32 size, void *object, int32 offset, int32) -{ - UVAnim *uvanim = PLUGINOFFSET(UVAnim, object, offset); - writeChunkHeader(stream, ID_STRUCT, size-12); - uint32 mask = 0; - uint32 bit = 1; - for(int32 i = 0; i < 8; i++){ - if(uvanim->interp[i]) - mask |= bit; - bit <<= 1; - } - stream->writeI32(mask); - for(int32 i = 0; i < 8; i++){ - if(uvanim->interp[i]){ - UVAnimCustomData *custom = - UVAnimCustomData::get(uvanim->interp[i]->currentAnim); - stream->write8(custom->name, 32); - } - } - return stream; -} - -static int32 -getSizeUVAnim(void *object, int32 offset, int32) -{ - UVAnim *uvanim = PLUGINOFFSET(UVAnim, object, offset); - int32 size = 0; - for(int32 i = 0; i < 8; i++) - if(uvanim->interp[i]) - size += 32; - return size ? size + 12 + 4 : 0; -} - -static void* -uvanimOpen(void *object, int32 offset, int32 size) -{ - registerUVAnimInterpolator(); - return object; -} -static void *uvanimClose(void *object, int32 offset, int32 size) { return object; } - -void -registerUVAnimPlugin(void) -{ - Engine::registerPlugin(0, ID_UVANIMATION, uvanimOpen, uvanimClose); - uvAnimOffset = Material::registerPlugin(sizeof(UVAnim), ID_UVANIMATION, - createUVAnim, destroyUVAnim, copyUVAnim); - Material::registerPluginStream(ID_UVANIMATION, - readUVAnim, writeUVAnim, getSizeUVAnim); -} - -bool32 -UVAnim::exists(Material *mat) -{ - int32 i; - UVAnim *uvanim = PLUGINOFFSET(UVAnim, mat, uvAnimOffset); - for(i = 0; i < 8; i++) - if(uvanim->interp[i]) - return 1; - return 0; -} - -void -UVAnim::addTime(Material *mat, float32 t) -{ - int32 i; - UVAnim *uvanim = PLUGINOFFSET(UVAnim, mat, uvAnimOffset); - for(i = 0; i < 8; i++) - if(uvanim->interp[i]) - uvanim->interp[i]->addTime(t); -} - -void -UVAnim::applyUpdate(Material *mat) -{ - int32 i, j; - int32 uv; - Matrix m; - UVAnim *uvanim = PLUGINOFFSET(UVAnim, mat, uvAnimOffset); - for(i = 0; i < 2; i++) - if(uvanim->uv[i]) - uvanim->uv[i]->setIdentity(); - m.setIdentity(); - - for(i = 0; i < 8; i++){ - AnimInterpolator *ip = uvanim->interp[i]; - if(ip == nil) - continue; - UVAnimCustomData *custom = UVAnimCustomData::get(ip->currentAnim); - for(j = 0; j < ip->numNodes; j++){ - InterpFrameHeader *f = ip->getInterpFrame(j); - uv = custom->nodeToUVChannel[j]; - if(uv < 2 && uvanim->uv[uv]){ - ip->applyCB(&m, f); - uvanim->uv[uv]->transform(&m, COMBINEPRECONCAT); - } - } - } - MatFX *mfx = MatFX::get(mat); - if(mfx) mfx->setUVTransformMatrices(uvanim->uv[0], uvanim->uv[1]); -} - -} diff --git a/vendor/librw/src/vgafont.inc b/vendor/librw/src/vgafont.inc deleted file mode 100644 index 110d824..0000000 --- a/vendor/librw/src/vgafont.inc +++ /dev/null @@ -1,256 +0,0 @@ -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/vendor/librw/src/world.cpp b/vendor/librw/src/world.cpp deleted file mode 100644 index 447eebc..0000000 --- a/vendor/librw/src/world.cpp +++ /dev/null @@ -1,198 +0,0 @@ -#include -#include -#include -#include - -#include "rwbase.h" -#include "rwerror.h" -#include "rwplg.h" -#include "rwpipeline.h" -#include "rwobjects.h" -#include "rwengine.h" - -#define PLUGIN_ID ID_WORLD - -namespace rw { - -int32 World::numAllocated = 0; - -PluginList World::s_plglist(sizeof(World)); - -World* -World::create(void) -{ - World *world = (World*)rwMalloc(s_plglist.size, MEMDUR_EVENT | ID_WORLD); - if(world == nil){ - RWERROR((ERR_ALLOC, s_plglist.size)); - return nil; - } - numAllocated++; - world->object.init(World::ID, 0); - world->localLights.init(); - world->globalLights.init(); - world->clumps.init(); - s_plglist.construct(world); - return world; -} - -void -World::destroy(void) -{ - s_plglist.destruct(this); - rwFree(this); - numAllocated--; -} - -void -World::addLight(Light *light) -{ - assert(light->world == nil); - light->world = this; - if(light->getType() < Light::POINT){ - this->globalLights.append(&light->inWorld); - }else{ - this->localLights.append(&light->inWorld); - if(light->getFrame()) - light->getFrame()->updateObjects(); - } -} - -void -World::removeLight(Light *light) -{ - assert(light->world == this); - light->inWorld.remove(); - light->world = nil; -} - -void -World::addCamera(Camera *cam) -{ - assert(cam->world == nil); - cam->world = this; - if(cam->getFrame()) - cam->getFrame()->updateObjects(); -} - -void -World::removeCamera(Camera *cam) -{ - assert(cam->world == this); - cam->world = nil; -} - -void -World::addAtomic(Atomic *atomic) -{ - assert(atomic->world == nil); - atomic->world = this; - if(atomic->getFrame()) - atomic->getFrame()->updateObjects(); -} - -void -World::removeAtomic(Atomic *atomic) -{ - assert(atomic->world == this); - atomic->world = nil; -} - -void -World::addClump(Clump *clump) -{ - assert(clump->world == nil); - clump->world = this; - this->clumps.add(&clump->inWorld); - FORLIST(lnk, clump->atomics) - this->addAtomic(Atomic::fromClump(lnk)); - FORLIST(lnk, clump->lights) - this->addLight(Light::fromClump(lnk)); - FORLIST(lnk, clump->cameras) - this->addCamera(Camera::fromClump(lnk)); - - if(clump->getFrame()){ - clump->getFrame()->matrix.optimize(); - clump->getFrame()->updateObjects(); - } -} - -void -World::removeClump(Clump *clump) -{ - assert(clump->world == this); - clump->inWorld.remove(); - FORLIST(lnk, clump->atomics) - this->removeAtomic(Atomic::fromClump(lnk)); - FORLIST(lnk, clump->lights) - this->removeLight(Light::fromClump(lnk)); - FORLIST(lnk, clump->cameras) - this->removeCamera(Camera::fromClump(lnk)); - clump->world = nil; -} - -void -World::render(void) -{ - // this is very wrong, we really want world sectors - FORLIST(lnk, this->clumps) - Clump::fromWorld(lnk)->render(); -} - -// Find lights that illuminate an atomic -void -World::enumerateLights(Atomic *atomic, WorldLights *lightData) -{ - int32 maxDirectionals, maxLocals; - - maxDirectionals = lightData->numDirectionals; - maxLocals = lightData->numLocals; - - lightData->numDirectionals = 0; - lightData->numLocals = 0; - lightData->numAmbients = 0; - lightData->ambient.red = 0.0f; - lightData->ambient.green = 0.0f; - lightData->ambient.blue = 0.0f; - lightData->ambient.alpha = 1.0f; - - bool32 normals = atomic->geometry->flags & Geometry::NORMALS; - - FORLIST(lnk, this->globalLights){ - Light *l = Light::fromWorld(lnk); - if((l->getFlags() & Light::LIGHTATOMICS) == 0) - continue; - if(l->getType() == Light::AMBIENT){ - lightData->ambient.red += l->color.red; - lightData->ambient.green += l->color.green; - lightData->ambient.blue += l->color.blue; - lightData->numAmbients++; - }else if(normals && l->getType() == Light::DIRECTIONAL){ - if(lightData->numDirectionals < maxDirectionals) - lightData->directionals[lightData->numDirectionals++] = l; - } - } - - if(atomic->world != this) - return; - - if(!normals) - return; - - // TODO: for this we would use an atomic's world sectors, but we don't have those yet - FORLIST(lnk, this->localLights){ - if(lightData->numLocals >= maxLocals) - return; - - Light *l = Light::fromWorld(lnk); - if((l->getFlags() & Light::LIGHTATOMICS) == 0) - continue; - - // check if spheres are intersecting - Sphere *atomsphere = atomic->getWorldBoundingSphere(); - V3d dist = sub(l->getFrame()->getLTM()->pos, atomsphere->center); - if(length(dist) < atomsphere->radius + l->radius) - lightData->locals[lightData->numLocals++] = l; - } -} - -} diff --git a/vendor/librw/tools/CMakeLists.txt b/vendor/librw/tools/CMakeLists.txt deleted file mode 100644 index 1d06544..0000000 --- a/vendor/librw/tools/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -if(NOT LIBRW_PLATFORM_PS2) - add_subdirectory(dumprwtree) -endif() - -if(TARGET librw_skeleton_imgui) - add_subdirectory(imguitest) -endif() - -if(LIBRW_PLATFORM_PS2) - add_subdirectory(ps2test) -endif() diff --git a/vendor/librw/tools/dumprwtree/CMakeLists.txt b/vendor/librw/tools/dumprwtree/CMakeLists.txt deleted file mode 100644 index b2c35bc..0000000 --- a/vendor/librw/tools/dumprwtree/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -add_executable(dumprwtree - dumprwtree.cpp -) - -target_link_libraries(dumprwtree - PUBLIC - librw -) - -if(LIBRW_INSTALL) - install(TARGETS dumprwtree - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - ) -endif() diff --git a/vendor/librw/tools/dumprwtree/dumprwtree.cpp b/vendor/librw/tools/dumprwtree/dumprwtree.cpp deleted file mode 100644 index ca86d3c..0000000 --- a/vendor/librw/tools/dumprwtree/dumprwtree.cpp +++ /dev/null @@ -1,145 +0,0 @@ -#include -#include -#include -#include - -#include - -using namespace std; -using namespace rw; - -const char *chunks[] = { "None", "Struct", "String", "Extension", "Unknown", - "Camera", "Texture", "Material", "Material List", "Atomic Section", - "Plane Section", "World", "Spline", "Matrix", "Frame List", - "Geometry", "Clump", "Unknown", "Light", "Unicode String", "Atomic", - "Texture Native", "Texture Dictionary", "Animation Database", - "Image", "Skin Animation", "Geometry List", "Anim Animation", - "Team", "Crowd", "Delta Morph Animation", "Right To Render", - "MultiTexture Effect Native", "MultiTexture Effect Dictionary", - "Team Dictionary", "Platform Independet Texture Dictionary", - "Table of Contents", "Particle Standard Global Data", "AltPipe", - "Platform Independet Peds", "Patch Mesh", "Chunk Group Start", - "Chunk Group End", "UV Animation Dictionary", "Coll Tree" -}; - -/* From 0x0101 through 0x0135 */ -const char *toolkitchunks0[] = { "Metrics PLG", "Spline PLG", "Stereo PLG", - "VRML PLG", "Morph PLG", "PVS PLG", "Memory Leak PLG", "Animation PLG", - "Gloss PLG", "Logo PLG", "Memory Info PLG", "Random PLG", - "PNG Image PLG", "Bone PLG", "VRML Anim PLG", "Sky Mipmap Val", - "MRM PLG", "LOD Atomic PLG", "ME PLG", "Lightmap PLG", - "Refine PLG", "Skin PLG", "Label PLG", "Particles PLG", "GeomTX PLG", - "Synth Core PLG", "STQPP PLG", - "Part PP PLG", "Collision PLG", "HAnim PLG", "User Data PLG", - "Material Effects PLG", "Particle System PLG", "Delta Morph PLG", - "Patch PLG", "Team PLG", "Crowd PP PLG", "Mip Split PLG", - "Anisotrophy PLG", "Not used", "GCN Material PLG", "Geometric PVS PLG", - "XBOX Material PLG", "Multi Texture PLG", "Chain PLG", "Toon PLG", - "PTank PLG", "Particle Standard PLG", "PDS PLG", "PrtAdv PLG", - "Normal Map PLG", "ADC PLG", "UV Animation PLG" -}; - -/* From 0x0180 through 0x01c1 */ -const char *toolkitchunks1[] = { - "Character Set PLG", "NOHS World PLG", "Import Util PLG", - "Slerp PLG", "Optim PLG", "TL World PLG", "Database PLG", - "Raytrace PLG", "Ray PLG", "Library PLG", - "Not used", "Not used", "Not used", "Not used", "Not used", "Not used", - "2D PLG", "Tile Render PLG", "JPEG Image PLG", "TGA Image PLG", - "GIF Image PLG", "Quat PLG", "Spline PVS PLG", "Mipmap PLG", - "MipmapK PLG", "2D Font", "Intersection PLG", "TIFF Image PLG", - "Pick PLG", "BMP Image PLG", "RAS Image PLG", "Skin FX PLG", - "VCAT PLG", "2D Path", "2D Brush", "2D Object", "2D Shape", "2D Scene", - "2D Pick Region", "2D Object String", "2D Animation PLG", - "2D Animation", - "Not used", "Not used", "Not used", "Not used", "Not used", "Not used", - "2D Keyframe", "2D Maestro", "Barycentric", - "Platform Independent Texture Dictionary TK", "TOC TK", "TPL TK", - "AltPipe TK", "Animation TK", "Skin Split Tookit", "Compressed Key TK", - "Geometry Conditioning PLG", "Wing PLG", "Generic Pipeline TK", - "Lightmap Conversion TK", "Filesystem PLG", "Dictionary TK", - "UV Animation Linear", "UV Animation Parameter" -}; - -const char *RSchunks[] = { "Unused 1", "Unused 2", "Extra Normals", - "Pipeline Set", "Unused 5", "Unused 6", "Specular Material", - "Unused 8", "2dfx", "Extra Colors", "Collision Model", - "Unused 12", "Environment Material", "Breakable", "Node Name", - "Unused 16" -}; - -const char* -getChunkName(uint32 id) -{ - switch(id){ - case 0x50E: - return "Bin Mesh PLG"; - case 0x510: - return "Native Data PLG"; - case 0x511: - return "Vertex Format PLG"; - case 0xF21E: - return "ZModeler Lock"; - } - - if(id <= 45) - return chunks[id]; - else if(id <= 0x0253F2FF && id >= 0x0253F2F0) - return RSchunks[id-0x0253F2F0]; - else if(id <= 0x0135 && id >= 0x0101) - return toolkitchunks0[id-0x0101]; - else if(id <= 0x01C0 && id >= 0x0181) - return toolkitchunks1[id-0x0181]; - else - return "Unknown"; -} - -void -readchunk(StreamFile *s, ChunkHeaderInfo *h, int level) -{ - for(int i = 0; i < level; i++) - printf(" "); - const char *name = getChunkName(h->type); - printf("%s (%x bytes @ 0x%x/0x%x) - [0x%x]\n", - name, h->length, s->tell()-12, s->tell(), h->type); - - uint32 end = s->tell() + h->length; - while(s->tell() < end){ - ChunkHeaderInfo nh; - readChunkHeaderInfo(s, &nh); - if(nh.version == h->version && nh.build == h->build){ - readchunk(s, &nh, level+1); - if(h->type == 0x510) - s->seek(end, 0); - }else{ - s->seek(h->length-12); - break; - } - } -} - -int -main(int argc, char *argv[]) -{ - if(argc < 2){ - fprintf(stderr, "usage: %s rwStreamFile\n", argv[0]); - return 0; - } - StreamFile s; - s.open(argv[1], "rb"); - - ChunkHeaderInfo header, last; - while(readChunkHeaderInfo(&s, &header)){ - if(header.type == 0) - break; - last = header; - if(argc == 2) - readchunk(&s, &header, 0); - } - - printf("%x %x %x\n", last.version, last.build, - libraryIDPack(last.version, last.build)); - - s.close(); - return 0; -} diff --git a/vendor/librw/tools/imguitest/CMakeLists.txt b/vendor/librw/tools/imguitest/CMakeLists.txt deleted file mode 100644 index 7cd5ed0..0000000 --- a/vendor/librw/tools/imguitest/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -add_executable(imguitest WIN32 - main.cpp -) - -target_link_libraries(imguitest - PUBLIC - librw - librw_skeleton_imgui -) - -if(LIBRW_INSTALL) - install(TARGETS imguitest - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - ) -endif() diff --git a/vendor/librw/tools/imguitest/main.cpp b/vendor/librw/tools/imguitest/main.cpp deleted file mode 100644 index 6806d2d..0000000 --- a/vendor/librw/tools/imguitest/main.cpp +++ /dev/null @@ -1,173 +0,0 @@ -#include -#include -#include - -rw::V3d zero = { 0.0f, 0.0f, 0.0f }; -struct SceneGlobals { - rw::World *world; - rw::Camera *camera; -} Scene; -rw::EngineOpenParams engineOpenParams; - -void -Init(void) -{ - sk::globals.windowtitle = "ImGui test"; - sk::globals.width = 1280; - sk::globals.height = 800; - sk::globals.quit = 0; -} - -bool -attachPlugins(void) -{ - rw::ps2::registerPDSPlugin(40); - rw::ps2::registerPluginPDSPipes(); - - rw::registerMeshPlugin(); - rw::registerNativeDataPlugin(); - rw::registerAtomicRightsPlugin(); - rw::registerMaterialRightsPlugin(); - rw::xbox::registerVertexFormatPlugin(); - rw::registerSkinPlugin(); - rw::registerUserDataPlugin(); - rw::registerHAnimPlugin(); - rw::registerMatFXPlugin(); - rw::registerUVAnimPlugin(); - rw::ps2::registerADCPlugin(); - return true; -} - -bool -InitRW(void) -{ -// rw::platform = rw::PLATFORM_D3D8; - if(!sk::InitRW()) - return false; - - Scene.world = rw::World::create(); - - rw::Light *ambient = rw::Light::create(rw::Light::AMBIENT); - ambient->setColor(0.2f, 0.2f, 0.2f); - Scene.world->addLight(ambient); - - rw::V3d xaxis = { 1.0f, 0.0f, 0.0f }; - rw::Light *direct = rw::Light::create(rw::Light::DIRECTIONAL); - direct->setColor(0.8f, 0.8f, 0.8f); - direct->setFrame(rw::Frame::create()); - direct->getFrame()->rotate(&xaxis, 180.0f, rw::COMBINEREPLACE); - Scene.world->addLight(direct); - - Scene.camera = sk::CameraCreate(sk::globals.width, sk::globals.height, 1); - Scene.world->addCamera(Scene.camera); - - ImGui_ImplRW_Init(); - ImGui::StyleColorsClassic(); - - return true; -} - -void -Draw(float timeDelta) -{ - static bool show_demo_window = true; - static bool show_another_window = false; - static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - rw::RGBA clearcol = rw::makeRGBA(clear_color.x*255, clear_color.y*255, clear_color.z*255, clear_color.w*255); - Scene.camera->clear(&clearcol, rw::Camera::CLEARIMAGE|rw::Camera::CLEARZ); - Scene.camera->beginUpdate(); - - ImGui_ImplRW_NewFrame(timeDelta); - - // 1. Show a simple window. - // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets automatically appears in a window called "Debug". - { - static float f = 0.0f; - ImGui::Text("Hello, world!"); // Some text (you can use a format string too) - ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float as a slider from 0.0f to 1.0f - ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats as a color - if(ImGui::Button("Demo Window")) // Use buttons to toggle our bools. We could use Checkbox() as well. - show_demo_window ^= 1; - if(ImGui::Button("Another Window")) - show_another_window ^= 1; - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - } - - // 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name the window. - if(show_another_window){ - ImGui::Begin("Another Window", &show_another_window); - ImGui::Text("Hello from another window!"); - ImGui::End(); - } - - // 3. Show the ImGui demo window. Most of the sample code is in ImGui::ShowDemoWindow(). - if(show_demo_window){ - ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver); // Normally user code doesn't need/want to call this because positions are saved in .ini file anyway. Here we just want to make the demo initial state a bit more friendly! - ImGui::ShowDemoWindow(&show_demo_window); - } - - - ImGui::EndFrame(); - ImGui::Render(); - - Scene.camera->endUpdate(); - Scene.camera->showRaster(0); -} - - -void -KeyUp(int key) -{ -} - -void -KeyDown(int key) -{ - switch(key){ - case sk::KEY_ESC: - sk::globals.quit = 1; - break; - } -} - -sk::EventStatus -AppEventHandler(sk::Event e, void *param) -{ - using namespace sk; - Rect *r; - - ImGuiEventHandler(e, param); - - switch(e){ - case INITIALIZE: - Init(); - return EVENTPROCESSED; - case RWINITIALIZE: - return ::InitRW() ? EVENTPROCESSED : EVENTERROR; - case PLUGINATTACH: - return attachPlugins() ? EVENTPROCESSED : EVENTERROR; - case KEYDOWN: - KeyDown(*(int*)param); - return EVENTPROCESSED; - case KEYUP: - KeyUp(*(int*)param); - return EVENTPROCESSED; - case RESIZE: - r = (Rect*)param; - // TODO: register when we're minimized - if(r->w == 0) r->w = 1; - if(r->h == 0) r->h = 1; - - sk::globals.width = r->w; - sk::globals.height = r->h; - // TODO: set aspect ratio - if(Scene.camera) - sk::CameraSize(Scene.camera, r); - break; - case IDLE: - Draw(*(float*)param); - return EVENTPROCESSED; - } - return sk::EVENTNOTPROCESSED; -} diff --git a/vendor/librw/tools/lights/checker.dff b/vendor/librw/tools/lights/checker.dff deleted file mode 100644 index f955e8c..0000000 Binary files a/vendor/librw/tools/lights/checker.dff and /dev/null differ diff --git a/vendor/librw/tools/lights/main.cpp b/vendor/librw/tools/lights/main.cpp deleted file mode 100644 index 5d2bab1..0000000 --- a/vendor/librw/tools/lights/main.cpp +++ /dev/null @@ -1,365 +0,0 @@ -#include -#include -#include - -rw::V3d zero = { 0.0f, 0.0f, 0.0f }; -struct SceneGlobals { - rw::World *world; - rw::Camera *camera; -} Scene; -rw::EngineOpenParams engineOpenParams; -float FOV = 70.0f; - -rw::V3d Xaxis = { 1.0f, 0.0, 0.0f }; -rw::V3d Yaxis = { 0.0f, 1.0, 0.0f }; -rw::V3d Zaxis = { 0.0f, 0.0, 1.0f }; - -rw::Light *BaseAmbientLight; -bool BaseAmbientLightOn; - -rw::Light *CurrentLight; -rw::Light *AmbientLight; -rw::Light *PointLight; -rw::Light *DirectLight; -rw::Light *SpotLight; -rw::Light *SpotSoftLight; - -float LightRadius = 100.0f; -float LightConeAngle = 45.0f; -rw::V3d LightPos = {0.0f, 0.0f, 75.0f}; - -void -Init(void) -{ - sk::globals.windowtitle = "Light test"; - sk::globals.width = 1280; - sk::globals.height = 800; - sk::globals.quit = 0; -} - -bool -attachPlugins(void) -{ - rw::ps2::registerPDSPlugin(40); - rw::ps2::registerPluginPDSPipes(); - - rw::registerMeshPlugin(); - rw::registerNativeDataPlugin(); - rw::registerAtomicRightsPlugin(); - rw::registerMaterialRightsPlugin(); - rw::xbox::registerVertexFormatPlugin(); - rw::registerSkinPlugin(); - rw::registerUserDataPlugin(); - rw::registerHAnimPlugin(); - rw::registerMatFXPlugin(); - rw::registerUVAnimPlugin(); - rw::ps2::registerADCPlugin(); - return true; -} - -rw::Light* -CreateBaseAmbientLight(void) -{ - rw::Light *light = rw::Light::create(rw::Light::AMBIENT); - assert(light); - light->setColor(0.5f, 0.5f, 0.5f); - return light; -} - -rw::Light* -CreateAmbientLight(void) -{ - return rw::Light::create(rw::Light::AMBIENT); -} - -rw::Light* -CreateDirectLight(void) -{ - rw::Light *light = rw::Light::create(rw::Light::DIRECTIONAL); - assert(light); - rw::Frame *frame = rw::Frame::create(); - assert(frame); - frame->rotate(&Xaxis, 45.0f, rw::COMBINEREPLACE); - rw::V3d pos = LightPos; - frame->translate(&pos, rw::COMBINEPOSTCONCAT); - light->setFrame(frame); - return light; -} - -rw::Light* -CreatePointLight(void) -{ - rw::Light *light = rw::Light::create(rw::Light::POINT); - assert(light); - light->radius = LightRadius; - rw::Frame *frame = rw::Frame::create(); - assert(frame); - rw::V3d pos = LightPos; - frame->translate(&pos, rw::COMBINEREPLACE); - light->setFrame(frame); - return light; -} - -rw::Light* -CreateSpotLight(void) -{ - rw::Light *light = rw::Light::create(rw::Light::SPOT); - assert(light); - light->radius = LightRadius; - light->setAngle(LightConeAngle/180.0f*M_PI); - rw::Frame *frame = rw::Frame::create(); - assert(frame); - frame->rotate(&Xaxis, 45.0f, rw::COMBINEREPLACE); - rw::V3d pos = LightPos; - frame->translate(&pos, rw::COMBINEPOSTCONCAT); - light->setFrame(frame); - return light; -} - -rw::Light* -CreateSpotSoftLight(void) -{ - rw::Light *light = rw::Light::create(rw::Light::SOFTSPOT); - assert(light); - light->radius = LightRadius; - light->setAngle(LightConeAngle/180.0f*M_PI); - rw::Frame *frame = rw::Frame::create(); - assert(frame); - frame->rotate(&Xaxis, 45.0f, rw::COMBINEREPLACE); - rw::V3d pos = LightPos; - frame->translate(&pos, rw::COMBINEPOSTCONCAT); - light->setFrame(frame); - return light; -} - -bool -CreateTestScene(rw::World *world) -{ - rw::Clump *clump; - rw::StreamFile in; - const char *filename = "checker.dff"; - if(in.open(filename, "rb") == NULL){ - printf("couldn't open file\n"); - return false; - } - if(!rw::findChunk(&in, rw::ID_CLUMP, NULL, NULL)) - return false; - clump = rw::Clump::streamRead(&in); - in.close(); - if(clump == nil) - return false; - - rw::Clump *clone; - rw::Frame *clumpFrame; - rw::V3d pos; - float zOffset = 75.0f; - - // Bottom panel - clumpFrame = clump->getFrame(); - clumpFrame->rotate(&Xaxis, 90.0f, rw::COMBINEREPLACE); - - pos.x = 0.0f; - pos.y = -25.0f; - pos.z = zOffset; - clumpFrame->translate(&pos, rw::COMBINEPOSTCONCAT); - - // only need to add once - world->addClump(clump); - - // Top panel - clone = clump->clone(); - clumpFrame = clone->getFrame(); - clumpFrame->rotate(&Xaxis, -90.0f, rw::COMBINEREPLACE); - - pos.x = 0.0f; - pos.y = 25.0f; - pos.z = zOffset; - clumpFrame->translate(&pos, rw::COMBINEPOSTCONCAT); - - // Left panel - clone = clump->clone(); - clumpFrame = clone->getFrame(); - clumpFrame->rotate(&Xaxis, 0.0f, rw::COMBINEREPLACE); - clumpFrame->rotate(&Yaxis, 90.0f, rw::COMBINEPOSTCONCAT); - - pos.x = 25.0f; - pos.y = 0.0f; - pos.z = zOffset; - clumpFrame->translate(&pos, rw::COMBINEPOSTCONCAT); - - // Right panel - clone = clump->clone(); - clumpFrame = clone->getFrame(); - clumpFrame->rotate(&Xaxis, 0.0f, rw::COMBINEREPLACE); - clumpFrame->rotate(&Yaxis, -90.0f, rw::COMBINEPOSTCONCAT); - - pos.x = -25.0f; - pos.y = 0.0f; - pos.z = zOffset; - clumpFrame->translate(&pos, rw::COMBINEPOSTCONCAT); - - // Back panel - clone = clump->clone(); - clumpFrame = clone->getFrame(); - clumpFrame->rotate(&Xaxis, 0.0f, rw::COMBINEREPLACE); - - pos.x = 0.0f; - pos.y = 0.0f; - pos.z = zOffset + 25.0f; - clumpFrame->translate(&pos, rw::COMBINEPOSTCONCAT); - - return 1; -} - -bool -InitRW(void) -{ -// rw::platform = rw::PLATFORM_D3D8; - if(!sk::InitRW()) - return false; - - Scene.world = rw::World::create(); - - BaseAmbientLight = CreateBaseAmbientLight(); - AmbientLight = CreateAmbientLight(); - DirectLight = CreateDirectLight(); - PointLight = CreatePointLight(); - SpotLight = CreateSpotLight(); - SpotSoftLight = CreateSpotSoftLight(); - - Scene.camera = sk::CameraCreate(sk::globals.width, sk::globals.height, 1); - Scene.camera->setNearPlane(0.1f); - Scene.camera->setFarPlane(300.0f); - Scene.camera->setFOV(FOV, (float)sk::globals.width/sk::globals.height); - Scene.world->addCamera(Scene.camera); - - CreateTestScene(Scene.world); - - ImGui_ImplRW_Init(); - ImGui::StyleColorsClassic(); - - return true; -} - -void -SwitchToLight(rw::Light *light) -{ - if(CurrentLight) - Scene.world->removeLight(CurrentLight); - CurrentLight = light; - Scene.world->addLight(CurrentLight); -} - -void -Gui(void) -{ -// ImGui::ShowDemoWindow(&show_demo_window); - - static bool showLightWindow = true; - ImGui::Begin("Lights", &showLightWindow); - static int lightswitch = 0; - if(ImGui::RadioButton("Light Off", &lightswitch, 0)){ - if(CurrentLight) - Scene.world->removeLight(CurrentLight); - CurrentLight = nil; - } - if(ImGui::RadioButton("Ambient Light", &lightswitch, 1)){ - SwitchToLight(AmbientLight); - } - ImGui::SameLine(); - if(ImGui::RadioButton("Directional Light", &lightswitch, 2)){ - SwitchToLight(DirectLight); - } - ImGui::SameLine(); - if(ImGui::RadioButton("Point Light", &lightswitch, 3)){ - SwitchToLight(PointLight); - } - if(ImGui::RadioButton("Spot Light", &lightswitch, 4)){ - SwitchToLight(SpotLight); - } - ImGui::SameLine(); - if(ImGui::RadioButton("Soft Spot Light", &lightswitch, 5)){ - SwitchToLight(SpotSoftLight); - } - ImGui::End(); -} - -void -Draw(float timeDelta) -{ - static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - rw::RGBA clearcol = rw::makeRGBA(clear_color.x*255, clear_color.y*255, clear_color.z*255, clear_color.w*255); - Scene.camera->clear(&clearcol, rw::Camera::CLEARIMAGE|rw::Camera::CLEARZ); - Scene.camera->beginUpdate(); - - ImGui_ImplRW_NewFrame(timeDelta); - - Scene.world->render(); - - Gui(); - - ImGui::EndFrame(); - ImGui::Render(); - - Scene.camera->endUpdate(); - Scene.camera->showRaster(0); -} - - -void -KeyUp(int key) -{ -} - -void -KeyDown(int key) -{ - switch(key){ - case sk::KEY_ESC: - sk::globals.quit = 1; - break; - } -} - -sk::EventStatus -AppEventHandler(sk::Event e, void *param) -{ - using namespace sk; - Rect *r; - - ImGuiEventHandler(e, param); - - switch(e){ - case INITIALIZE: - Init(); - return EVENTPROCESSED; - case RWINITIALIZE: - return ::InitRW() ? EVENTPROCESSED : EVENTERROR; - case PLUGINATTACH: - return attachPlugins() ? EVENTPROCESSED : EVENTERROR; - case KEYDOWN: - KeyDown(*(int*)param); - return EVENTPROCESSED; - case KEYUP: - KeyUp(*(int*)param); - return EVENTPROCESSED; - case RESIZE: - r = (Rect*)param; - // TODO: register when we're minimized - if(r->w == 0) r->w = 1; - if(r->h == 0) r->h = 1; - - sk::globals.width = r->w; - sk::globals.height = r->h; - if(Scene.camera){ - sk::CameraSize(Scene.camera, r); - Scene.camera->setFOV(FOV, (float)sk::globals.width/sk::globals.height); - } - break; - case IDLE: - Draw(*(float*)param); - return EVENTPROCESSED; - } - return sk::EVENTNOTPROCESSED; -} diff --git a/vendor/librw/tools/playground/Bm437_IBM_BIOS.FON b/vendor/librw/tools/playground/Bm437_IBM_BIOS.FON deleted file mode 100644 index be2443f..0000000 Binary files a/vendor/librw/tools/playground/Bm437_IBM_BIOS.FON and /dev/null differ diff --git a/vendor/librw/tools/playground/Bm437_IBM_BIOS.tga b/vendor/librw/tools/playground/Bm437_IBM_BIOS.tga deleted file mode 100644 index 50034b4..0000000 Binary files a/vendor/librw/tools/playground/Bm437_IBM_BIOS.tga and /dev/null differ diff --git a/vendor/librw/tools/playground/Bm437_IBM_VGA8.FON b/vendor/librw/tools/playground/Bm437_IBM_VGA8.FON deleted file mode 100644 index 6ffa09a..0000000 Binary files a/vendor/librw/tools/playground/Bm437_IBM_VGA8.FON and /dev/null differ diff --git a/vendor/librw/tools/playground/Bm437_IBM_VGA8.tga b/vendor/librw/tools/playground/Bm437_IBM_VGA8.tga deleted file mode 100644 index 521fb40..0000000 Binary files a/vendor/librw/tools/playground/Bm437_IBM_VGA8.tga and /dev/null differ diff --git a/vendor/librw/tools/playground/camera.cpp b/vendor/librw/tools/playground/camera.cpp deleted file mode 100644 index cf45f5f..0000000 --- a/vendor/librw/tools/playground/camera.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include -#include - -#include - -#define PI 3.14159265359f -#include "camera.h" - -using rw::Quat; -using rw::V3d; - -void -Camera::update(void) -{ - if(m_rwcam){ - m_rwcam->setNearPlane(m_near); - m_rwcam->setFarPlane(m_far); - m_rwcam->setFOV(m_fov, m_aspectRatio); - - rw::Frame *f = m_rwcam->getFrame(); - if(f){ - V3d forward = normalize(sub(m_target, m_position)); - V3d left = normalize(cross(m_up, forward)); - V3d nup = cross(forward, left); - f->matrix.right = left; // lol - f->matrix.up = nup; - f->matrix.at = forward; - f->matrix.pos = m_position; - f->matrix.optimize(); - f->updateObjects(); - } - } -} - -void -Camera::setTarget(V3d target) -{ - m_position = sub(m_position, sub(m_target, target)); - m_target = target; -} - -float -Camera::getHeading(void) -{ - V3d dir = sub(m_target, m_position); - float a = atan2(dir.y, dir.x)-PI/2.0f; - return m_localup.z < 0.0f ? a-PI : a; -} - -void -Camera::turn(float yaw, float pitch) -{ - V3d dir = sub(m_target, m_position); - Quat r = Quat::rotation(yaw, rw::makeV3d(0.0f, 0.0f, 1.0f)); - dir = rotate(dir, r); - m_localup = rotate(m_localup, r); - - V3d right = normalize(cross(dir, m_localup)); - r = Quat::rotation(pitch, right); - dir = rotate(dir, r); - m_localup = normalize(cross(right, dir)); - if(m_localup.z >= 0.0) m_up.z = 1.0; - else m_up.z = -1.0f; - - m_target = add(m_position, dir); -} - -void -Camera::orbit(float yaw, float pitch) -{ - V3d dir = sub(m_target, m_position); - Quat r = Quat::rotation(yaw, rw::makeV3d(0.0f, 0.0f, 1.0f)); - dir = rotate(dir, r); - m_localup = rotate(m_localup, r); - - V3d right = normalize(cross(dir, m_localup)); - r = Quat::rotation(-pitch, right); - dir = rotate(dir, r); - m_localup = normalize(cross(right, dir)); - if(m_localup.z >= 0.0) m_up.z = 1.0; - else m_up.z = -1.0f; - - m_position = sub(m_target, dir); -} - -void -Camera::dolly(float dist) -{ - V3d dir = setlength(sub(m_target, m_position), dist); - m_position = add(m_position, dir); - m_target = add(m_target, dir); -} - -void -Camera::zoom(float dist) -{ - V3d dir = sub(m_target, m_position); - float curdist = length(dir); - if(dist >= curdist) - dist = curdist-0.01f; - dir = setlength(dir, dist); - m_position = add(m_position, dir); -} - -void -Camera::pan(float x, float y) -{ - V3d dir = normalize(sub(m_target, m_position)); - V3d right = normalize(cross(dir, m_up)); - V3d localup = normalize(cross(right, dir)); - dir = add(scale(right, x), scale(localup, y)); - m_position = add(m_position, dir); - m_target = add(m_target, dir); -} - -float -Camera::distanceTo(V3d v) -{ - return length(sub(m_position, v)); -} - -Camera::Camera() -{ - m_position.set(0.0f, 6.0f, 0.0f); - m_target.set(0.0f, 0.0f, 0.0f); - m_up.set(0.0f, 0.0f, 1.0f); - m_localup = m_up; - m_fov = 70.0f; - m_aspectRatio = 1.0f; - m_near = 0.1f; - m_far = 100.0f; - m_rwcam = NULL; -} - diff --git a/vendor/librw/tools/playground/camera.h b/vendor/librw/tools/playground/camera.h deleted file mode 100644 index 8a0315d..0000000 --- a/vendor/librw/tools/playground/camera.h +++ /dev/null @@ -1,26 +0,0 @@ -class Camera -{ -public: - rw::Camera *m_rwcam; - rw::V3d m_position; - rw::V3d m_target; - rw::V3d m_up; - rw::V3d m_localup; - - float m_fov, m_aspectRatio; - float m_near, m_far; - - - void setTarget(rw::V3d target); - float getHeading(void); - - void turn(float yaw, float pitch); - void orbit(float yaw, float pitch); - void dolly(float dist); - void zoom(float dist); - void pan(float x, float y); - - void update(void); - float distanceTo(rw::V3d v); - Camera(void); -}; diff --git a/vendor/librw/tools/playground/font.cpp b/vendor/librw/tools/playground/font.cpp deleted file mode 100644 index 3ced5fb..0000000 --- a/vendor/librw/tools/playground/font.cpp +++ /dev/null @@ -1,181 +0,0 @@ -#include -#include - -using namespace rw; - -struct Font -{ - Texture *tex; - int32 glyphwidth, glyphheight; - int32 numglyphs; -}; -Font vga = { nil, 8, 16, 256 }; -Font bios = { nil, 8, 8, 256 }; -Font *curfont = &bios; - -#define NUMCHARS 100 -uint16 indices[NUMCHARS*6]; -RWDEVICE::Im2DVertex vertices[NUMCHARS*4]; -int32 curVert; -int32 curIndex; - -void -printScreen(const char *s, float32 x, float32 y) -{ - char c; - Camera *cam; - RWDEVICE::Im2DVertex *vert; - uint16 *ix; - curVert = 0; - curIndex = 0; - float32 u, v, du, dv; - float recipZ; - - cam = (Camera*)engine->currentCamera; - vert = &vertices[curVert]; - ix = &indices[curIndex]; - du = curfont->glyphwidth/(float32)curfont->tex->raster->width; - dv = curfont->glyphheight/(float32)curfont->tex->raster->height; - recipZ = 1.0f/cam->nearPlane; - while(c = *s){ - if(c >= curfont->numglyphs) - c = 0; - u = (c % 16)*curfont->glyphwidth / (float32)curfont->tex->raster->width; - v = (c / 16)*curfont->glyphheight / (float32)curfont->tex->raster->height; - - vert->setScreenX(x); - vert->setScreenY(y); - vert->setScreenZ(rw::im2d::GetNearZ()); - vert->setCameraZ(cam->nearPlane); - vert->setRecipCameraZ(recipZ); - vert->setColor(255, 255, 255, 255); - vert->setU(u, recipZ); - vert->setV(v, recipZ); - vert++; - - vert->setScreenX(x+curfont->glyphwidth); - vert->setScreenY(y); - vert->setScreenZ(rw::im2d::GetNearZ()); - vert->setCameraZ(cam->nearPlane); - vert->setRecipCameraZ(recipZ); - vert->setColor(255, 255, 255, 255); - vert->setU(u+du, recipZ); - vert->setV(v, recipZ); - vert++; - - vert->setScreenX(x); - vert->setScreenY(y+curfont->glyphheight); - vert->setScreenZ(rw::im2d::GetNearZ()); - vert->setCameraZ(cam->nearPlane); - vert->setRecipCameraZ(recipZ); - vert->setColor(255, 255, 255, 255); - vert->setU(u, recipZ); - vert->setV(v+dv, recipZ); - vert++; - - vert->setScreenX(x+curfont->glyphwidth); - vert->setScreenY(y+curfont->glyphheight); - vert->setScreenZ(rw::im2d::GetNearZ()); - vert->setCameraZ(cam->nearPlane); - vert->setRecipCameraZ(recipZ); - vert->setColor(255, 255, 255, 255); - vert->setU(u+du, recipZ); - vert->setV(v+dv, recipZ); - vert++; - - *ix++ = curVert; - *ix++ = curVert+1; - *ix++ = curVert+2; - *ix++ = curVert+2; - *ix++ = curVert+1; - *ix++ = curVert+3; - - curVert += 4; - curIndex += 6; - x += curfont->glyphwidth+1; - - s++; - } - - rw::SetRenderStatePtr(rw::TEXTURERASTER, curfont->tex->raster); - rw::SetRenderState(rw::TEXTUREADDRESS, rw::Texture::WRAP); - rw::SetRenderState(rw::TEXTUREFILTER, rw::Texture::NEAREST); - - im2d::RenderIndexedPrimitive(rw::PRIMTYPETRILIST, - vertices, curVert, indices, curIndex); - -} - -void -initFont(void) -{ - vga.tex = Texture::read("Bm437_IBM_VGA8", ""); - bios.tex = Texture::read("Bm437_IBM_BIOS", ""); - -/* - FILE *foo = fopen("font.c", "w"); - assert(foo); - int x, y; - rw::Image *img = rw::readTGA("vga_font.tga"); - assert(img); - for(y = 0; y < img->height; y++){ - for(x = 0; x < img->width; x++) - fprintf(foo, "%d, ", !!img->pixels[y*img->width + x]); - fprintf(foo, "\n"); - } -*/ -} - -/* -#define NUMGLYPHS 256 -#define GLYPHWIDTH 8 -#define GLYPHHEIGHT 16 - - -void -convertFont(void) -{ - FILE *f; - Image *img; - uint8 data[NUMGLYPHS*GLYPHHEIGHT]; - int32 i, x, y; - uint8 *px, *line, *glyph; -// f = fopen("font0.bin", "rb"); - f = fopen("Bm437_IBM_VGA8.FON", "rb"); -// f = fopen("Bm437_IBM_BIOS.FON", "rb"); - if(f == nil) - return; -fseek(f, 0x65A, 0); - fread(data, 1, NUMGLYPHS*GLYPHHEIGHT, f); - fclose(f); - - img = Image::create(16*GLYPHWIDTH, NUMGLYPHS/16*GLYPHHEIGHT, 32); - img->allocate(); - for(i = 0; i < NUMGLYPHS; i++){ - glyph = &data[i*GLYPHHEIGHT]; - x = (i % 16)*GLYPHWIDTH; - y = (i / 16)*GLYPHHEIGHT; - line = &img->pixels[x*4 + y*img->stride]; - for(y = 0; y < GLYPHHEIGHT; y++){ - px = line; - for(x = 0; x < 8; x++){ - if(*glyph & 1<<(8-x)){ - *px++ = 255; - *px++ = 255; - *px++ = 255; - *px++ = 255; - }else{ - *px++ = 0; - *px++ = 0; - *px++ = 0; - *px++ = 0; - } - } - glyph++; - line += img->stride; - } - } -// writeTGA(img, "Bm437_IBM_BIOS.tga"); - writeTGA(img, "Bm437_IBM_VGA8.tga"); -} -*/ \ No newline at end of file diff --git a/vendor/librw/tools/playground/foobar.tga b/vendor/librw/tools/playground/foobar.tga deleted file mode 100644 index 895bae0..0000000 Binary files a/vendor/librw/tools/playground/foobar.tga and /dev/null differ diff --git a/vendor/librw/tools/playground/main.cpp b/vendor/librw/tools/playground/main.cpp deleted file mode 100644 index 87acd6e..0000000 --- a/vendor/librw/tools/playground/main.cpp +++ /dev/null @@ -1,641 +0,0 @@ -#include -#include -#include "camera.h" -#include - -rw::V3d zero = { 0.0f, 0.0f, 0.0f }; -Camera *camera; -struct SceneGlobals { - rw::World *world; - rw::Camera *camera; - rw::Clump *clump; -} Scene; -rw::Texture *tex, *tex2; -rw::Raster *testras; -rw::EngineOpenParams engineOpenParams; - -rw::Texture *frontbuffer; - -bool dosoftras = 0; - -namespace gen { -void tlTest(rw::Clump *clump); -} -void genIm3DTransform(void *vertices, rw::int32 numVertices, rw::Matrix *xform); -void genIm3DRenderIndexed(rw::PrimitiveType prim, void *indices, rw::int32 numIndices); -void genIm3DEnd(void); -void initFont(void); -void printScreen(const char *s, float x, float y); - -void initsplines(void); -void rendersplines(void); - -rw::Charset *testfont; - -//#include - -void -Init(void) -{ -// AllocConsole(); -// freopen("CONIN$", "r", stdin); -// freopen("CONOUT$", "w", stdout); -// freopen("CONOUT$", "w", stderr); - - sk::globals.windowtitle = "Clump viewer"; - sk::globals.width = 640; - sk::globals.height = 448; - sk::globals.quit = 0; -} - -bool -attachPlugins(void) -{ - rw::ps2::registerPDSPlugin(40); - rw::ps2::registerPluginPDSPipes(); - - rw::registerMeshPlugin(); - rw::registerNativeDataPlugin(); - rw::registerAtomicRightsPlugin(); - rw::registerMaterialRightsPlugin(); - rw::xbox::registerVertexFormatPlugin(); - rw::registerSkinPlugin(); - rw::registerUserDataPlugin(); - rw::registerHAnimPlugin(); - rw::registerMatFXPlugin(); - rw::registerUVAnimPlugin(); - rw::ps2::registerADCPlugin(); - return true; -} - -void -dumpUserData(rw::UserDataArray *ar) -{ - int i; - printf("name: %s\n", ar->name); - for(i = 0; i < ar->numElements; i++){ - switch(ar->datatype){ - case rw::USERDATAINT: - printf(" %d\n", ar->getInt(i)); - break; - case rw::USERDATAFLOAT: - printf(" %f\n", ar->getFloat(i)); - break; - case rw::USERDATASTRING: - printf(" %s\n", ar->getString(i)); - break; - } - } -} - -static rw::Frame* -dumpFrameUserDataCB(rw::Frame *f, void*) -{ - using namespace rw; - int32 i; - UserDataArray *ar; - int32 n = UserDataArray::frameGetCount(f); - for(i = 0; i < n; i++){ - ar = UserDataArray::frameGet(f, i); - dumpUserData(ar); - } - f->forAllChildren(dumpFrameUserDataCB, nil); - return f; -} - -void -dumpUserData(rw::Clump *clump) -{ - printf("Frames\n"); - dumpFrameUserDataCB(clump->getFrame(), nil); -} - -static rw::Frame* -getHierCB(rw::Frame *f, void *data) -{ - using namespace rw; - HAnimData *hd = rw::HAnimData::get(f); - if(hd->hierarchy){ - *(HAnimHierarchy**)data = hd->hierarchy; - return nil; - } - f->forAllChildren(getHierCB, data); - return f; -} - -rw::HAnimHierarchy* -getHAnimHierarchyFromClump(rw::Clump *clump) -{ - using namespace rw; - HAnimHierarchy *hier = nil; - getHierCB(clump->getFrame(), &hier); - return hier; -} - -void -setupAtomic(rw::Atomic *atomic) -{ - using namespace rw; - // just remove pipelines that we can't handle for now -// if(atomic->pipeline && atomic->pipeline->platform != rw::platform) - atomic->pipeline = NULL; - - // Attach hierarchy to atomic if we're skinned - HAnimHierarchy *hier = getHAnimHierarchyFromClump(atomic->clump); - if(hier) - Skin::setHierarchy(atomic, hier); -} - -static void -initHierFromFrames(rw::HAnimHierarchy *hier) -{ - using namespace rw; - int32 i; - for(i = 0; i < hier->numNodes; i++){ - if(hier->nodeInfo[i].frame){ - hier->matrices[hier->nodeInfo[i].index] = *hier->nodeInfo[i].frame->getLTM(); - }else - assert(0); - } -} - -void -setupClump(rw::Clump *clump) -{ - using namespace rw; - HAnimHierarchy *hier = getHAnimHierarchyFromClump(clump); - if(hier){ - hier->attach(); - initHierFromFrames(hier); - } - - FORLIST(lnk, clump->atomics){ - rw::Atomic *a = rw::Atomic::fromClump(lnk); - setupAtomic(a); - } -} - -#define MUL(x, y) ((x)*(y)/255) - -int -calcVCfx(int fb, int col, int a, int iter) -{ - int prev = fb; - int col2 = col*2; - if(col2 > 255) col2 = 255; - for(int i = 0; i < iter; i++){ - int tmp = MUL(fb, 255-a) + MUL(MUL(prev, col2), a); - tmp += MUL(prev, col); - tmp += MUL(prev, col); - prev = tmp > 255 ? 255 : tmp; - } - return prev; -} - -int -calcIIIfx(int fb, int col, int a, int iter) -{ - int prev = fb; - for(int i = 0; i < iter; i++){ - int tmp = MUL(fb, 255-a) + MUL(MUL(prev, col), a); - prev = tmp > 255 ? 255 : tmp; - } - return prev; -} - -void -postfxtest(void) -{ - rw::Image *img = rw::Image::create(256, 256, 32); - img->allocate(); - int x, y; - int iter; - static char filename[100]; - for(iter = 0; iter < 10; iter++){ - for(y = 0; y < 256; y++) - for(x = 0; x < 256; x++){ - int res = calcVCfx(y, x, 30, iter); -// int res = calcIIIfx(y, x, 30, iter); - if(0 && res == y){ - img->pixels[y*img->stride + x*img->bpp + 0] = 255; - img->pixels[y*img->stride + x*img->bpp + 1] = 0; - img->pixels[y*img->stride + x*img->bpp + 2] = 0; - }else{ - img->pixels[y*img->stride + x*img->bpp + 0] = res; - img->pixels[y*img->stride + x*img->bpp + 1] = res; - img->pixels[y*img->stride + x*img->bpp + 2] = res; - } - img->pixels[y*img->stride + x*img->bpp + 3] = 255; - } - sprintf(filename, "vcfx_%02d.bmp", iter); -// sprintf(filename, "iiifx_%02d.bmp", iter); - rw::writeBMP(img, filename); - } - exit(0); -} - -bool -InitRW(void) -{ -// rw::platform = rw::PLATFORM_D3D8; - if(!sk::InitRW()) - return false; - - rw::d3d::isP8supported = false; - -// postfxtest(); - - initFont(); - - rw::RGBA foreground = { 255, 255, 0, 255 }; - rw::RGBA background = { 0, 0, 0, 0 }; - rw::Charset::open(); - testfont = rw::Charset::create(&foreground, &background); - assert(testfont); - foreground.blue = 255.0f; - testfont->setColors(&foreground, &background); - - tex = rw::Texture::read("maze", nil); - tex2 = rw::Texture::read("checkers", nil); - - const char *filename = "teapot2.dff"; - if(sk::args.argc > 1) - filename = sk::args.argv[1]; - rw::StreamFile in; - if(in.open(filename, "rb") == NULL){ - printf("couldn't open file\n"); - return false; - } - rw::findChunk(&in, rw::ID_CLUMP, NULL, NULL); - Scene.clump = rw::Clump::streamRead(&in); - assert(Scene.clump); - in.close(); - - // TEST - Set texture to the all materials of the clump -// FORLIST(lnk, Scene.clump->atomics){ -// rw::Atomic *a = rw::Atomic::fromClump(lnk); -// for(int i = 0; i < a->geometry->matList.numMaterials; i++) -// a->geometry->matList.materials[i]->setTexture(tex); -// } - - Scene.clump->getFrame()->translate(&zero, rw::COMBINEREPLACE); - - dumpUserData(Scene.clump); - setupClump(Scene.clump); - - Scene.world = rw::World::create(); - - rw::Light *ambient = rw::Light::create(rw::Light::AMBIENT); - ambient->setColor(0.3f, 0.3f, 0.3f); - Scene.world->addLight(ambient); - - rw::V3d xaxis = { 1.0f, 0.0f, 0.0f }; - rw::Light *direct = rw::Light::create(rw::Light::DIRECTIONAL); - direct->setColor(0.8f, 0.8f, 0.8f); - direct->setFrame(rw::Frame::create()); - direct->getFrame()->rotate(&xaxis, 180.0f, rw::COMBINEREPLACE); - Scene.world->addLight(direct); - - camera = new Camera; - Scene.camera = sk::CameraCreate(sk::globals.width, sk::globals.height, 1); - camera->m_rwcam = Scene.camera; - camera->m_aspectRatio = 640.0f/448.0f; -// camera->m_near = 0.5f; - camera->m_near = 1.5f; -// camera->m_far = 450.0f; - camera->m_far = 15.0f; - camera->m_target.set(0.0f, 0.0f, 0.0f); - camera->m_position.set(0.0f, -10.0f, 0.0f); -// camera->setPosition(Vec3(0.0f, 5.0f, 0.0f)); -// camera->setPosition(Vec3(0.0f, -70.0f, 0.0f)); -// camera->setPosition(Vec3(0.0f, -1.0f, 3.0f)); - camera->update(); - - Scene.world->addCamera(camera->m_rwcam); - - initsplines(); - - return true; -} - -void -im2dtest(void) -{ - using namespace rw::RWDEVICE; - int i; - static struct - { - float x, y; - rw::uint8 r, g, b, a; - float u, v; - } vs[4] = { - { 0.0f, 0.0f, 255, 0, 0, 128, 0.0f, 0.0f }, - { 640.0f, 0.0f, 0, 255, 0, 128, 1.0f, 0.0f }, - { 0.0f, 448.0f, 0, 0, 255, 128, 0.0f, 1.0f }, - { 640.0f, 448.0f, 0, 255, 255, 128, 1.0f, 1.0f }, -/* - { 0.0f, 0.0f, 255, 0, 0, 128, 0.0f, 1.0f }, - { 640.0f, 0.0f, 0, 255, 0, 128, 0.0f, 0.0f }, - { 0.0f, 448.0f, 0, 0, 255, 128, 1.0f, 1.0f }, - { 640.0f, 448.0f, 0, 255, 255, 128, 1.0f, 0.0f }, -*/ - }; - Im2DVertex verts[4]; - static short indices[] = { - 0, 1, 2, 3 - }; - - float recipZ = 1.0f/Scene.camera->nearPlane; - for(i = 0; i < 4; i++){ - verts[i].setScreenX(vs[i].x); - verts[i].setScreenY(vs[i].y); - verts[i].setScreenZ(rw::im2d::GetNearZ()); - verts[i].setCameraZ(Scene.camera->nearPlane); - verts[i].setRecipCameraZ(recipZ); - verts[i].setColor(vs[i].r, vs[i].g, vs[i].b, vs[i].a); - if(dosoftras) - verts[i].setColor(255, 255, 255, 255); - verts[i].setU(vs[i].u + 0.5f/640.0f, recipZ); - verts[i].setV(vs[i].v + 0.5f/448.0f, recipZ); - } - - rw::SetRenderStatePtr(rw::TEXTURERASTER, tex->raster); - if(dosoftras) - rw::SetRenderStatePtr(rw::TEXTURERASTER, testras); - rw::SetRenderState(rw::TEXTUREADDRESS, rw::Texture::WRAP); - rw::SetRenderState(rw::TEXTUREFILTER, rw::Texture::NEAREST); - rw::SetRenderState(rw::VERTEXALPHA, 1); - rw::im2d::RenderIndexedPrimitive(rw::PRIMTYPETRISTRIP, - &verts, 4, &indices, 4); -} - -void -im2dtest2(void) -{ - using namespace rw::RWDEVICE; - int i; - rw::Camera *cam = Scene.camera; - float n = cam->nearPlane; - float f = cam->farPlane; - float mid = (n+f)/4.0f; - struct - { - float x, y, z; - rw::uint8 r, g, b, a; - float u, v; - } vs[4] = { - { 0.5f, 0.5f, n, 255, 255, 255, 255, 0.0f, 0.0f }, - { 0.5f, 0.5f, mid, 255, 255, 255, 255, 1.0f, 0.0f }, - { 0.5f, -0.5f, n, 255, 255, 255, 255, 0.0f, 1.0f }, - { 0.5f, -0.5f, mid, 255, 255, 255, 255, 1.0f, 1.0f }, - }; - Im2DVertex verts[4]; - static short indices[] = { - 0, 1, 2, 3 - }; - - for(i = 0; i < 4; i++){ - float recipZ = 1.0f/vs[i].z; - verts[i].setScreenX((vs[i].x*recipZ + 0.5f) * 640.0f); - verts[i].setScreenY((vs[i].y*recipZ + 0.5f) * 448.0f); - verts[i].setScreenZ(recipZ * cam->zScale + cam->zShift); -// verts[i].setCameraZ(vs[i].z); - verts[i].setRecipCameraZ(recipZ); - verts[i].setColor(vs[i].r, vs[i].g, vs[i].b, vs[i].a); - if(dosoftras) - verts[i].setColor(255, 255, 255, 255); - verts[i].setU(vs[i].u + 0.5f/640.0f, recipZ); - verts[i].setV(vs[i].v + 0.5f/448.0f, recipZ); - } - - rw::SetRenderStatePtr(rw::TEXTURERASTER, tex->raster); - rw::SetRenderState(rw::TEXTUREADDRESS, rw::Texture::WRAP); - rw::SetRenderState(rw::TEXTUREFILTER, rw::Texture::NEAREST); - rw::SetRenderState(rw::VERTEXALPHA, 1); - rw::im2d::RenderIndexedPrimitive(rw::PRIMTYPETRISTRIP, - &verts, 4, &indices, 4); -} - -void -im3dtest(void) -{ - using namespace rw::RWDEVICE; - int i; - static struct - { - float x, y, z; - rw::uint8 r, g, b, a; - float u, v; - } vs[8] = { - { -1.0f, -1.0f, -1.0f, 255, 0, 0, 128, 0.0f, 0.0f }, - { -1.0f, 1.0f, -1.0f, 0, 255, 0, 128, 0.0f, 1.0f }, - { 1.0f, -1.0f, -1.0f, 0, 0, 255, 128, 1.0f, 0.0f }, - { 1.0f, 1.0f, -1.0f, 255, 0, 255, 128, 1.0f, 1.0f }, - - { -1.0f, -1.0f, 1.0f, 255, 0, 0, 128, 0.0f, 0.0f }, - { -1.0f, 1.0f, 1.0f, 0, 255, 0, 128, 0.0f, 1.0f }, - { 1.0f, -1.0f, 1.0f, 0, 0, 255, 128, 1.0f, 0.0f }, - { 1.0f, 1.0f, 1.0f, 255, 0, 255, 128, 1.0f, 1.0f }, - }; - Im3DVertex verts[8]; - static short indices[2*6] = { - 0, 1, 2, 2, 1, 3, - 4, 5, 6, 6, 5, 7 - }; - - for(i = 0; i < 8; i++){ - verts[i].setX(vs[i].x); - verts[i].setY(vs[i].y); - verts[i].setZ(vs[i].z); - verts[i].setColor(vs[i].r, vs[i].g, vs[i].b, vs[i].a); - verts[i].setU(vs[i].u); - verts[i].setV(vs[i].v); - } - - rw::SetRenderStatePtr(rw::TEXTURERASTER, tex->raster); -// rw::SetRenderStatePtr(rw::TEXTURERASTER, testfont->raster); -// rw::SetRenderStatePtr(rw::TEXTURERASTER, frontbuffer->raster); - rw::SetRenderState(rw::TEXTUREADDRESS, rw::Texture::WRAP); - rw::SetRenderState(rw::TEXTUREFILTER, rw::Texture::NEAREST); - -/* - genIm3DTransform(verts, 8, nil); - genIm3DRenderIndexed(rw::PRIMTYPETRILIST, indices, 12); - genIm3DEnd(); -*/ - rw::im3d::Transform(verts, 8, nil, rw::im3d::EVERYTHING); - rw::im3d::RenderIndexedPrimitive(rw::PRIMTYPETRILIST, indices, 12); - rw::im3d::End(); -} - -void -getFrontBuffer(void) -{ - rw::Raster *fb = Scene.camera->frameBuffer; - - if(frontbuffer == nil || fb->width > frontbuffer->raster->width || fb->height > frontbuffer->raster->height){ - int w, h; - for(w = 1; w < fb->width; w <<= 1); - for(h = 1; h < fb->height; h <<= 1); - rw::Raster *ras = rw::Raster::create(w, h, fb->depth, rw::Raster::CAMERATEXTURE); - if(frontbuffer){ - frontbuffer->raster->destroy(); - frontbuffer->raster = ras; - }else - frontbuffer = rw::Texture::create(ras); - printf("created FB with %d %d %d\n", ras->width, ras->height, ras->depth); - } - - rw::Raster::pushContext(frontbuffer->raster); - fb->renderFast(0, 0); - rw::Raster::popContext(); -} - -void -Draw(float timeDelta) -{ - getFrontBuffer(); - - rw::SetRenderState(rw::FOGCOLOR, 0xFF0000FF); - rw::SetRenderState(rw::FOGENABLE, 1); - camera->m_rwcam->fogPlane = camera->m_rwcam->nearPlane; - - static rw::RGBA clearcol = { 161, 161, 161, 0xFF }; - camera->m_rwcam->clear(&clearcol, rw::Camera::CLEARIMAGE|rw::Camera::CLEARZ); - camera->update(); - camera->m_rwcam->beginUpdate(); - -extern void beginSoftras(void); - beginSoftras(); - -// gen::tlTest(Scene.clump); -void drawtest(void); -// drawtest(); - -extern void endSoftras(void); - if(dosoftras){ - endSoftras(); - } - //im2dtest(); - im2dtest2(); - -// Scene.clump->render(); -// im3dtest(); -// printScreen("Hello, World!", 10, 10); - -// testfont->print("foo ABC", 200, 200, true); - -// rendersplines(); - - camera->m_rwcam->endUpdate(); - - camera->m_rwcam->showRaster(0); -} - - -void -KeyUp(int key) -{ -} - -void -KeyDown(int key) -{ - switch(key){ - case 'W': - camera->orbit(0.0f, 0.1f); - break; - case 'S': - camera->orbit(0.0f, -0.1f); - break; - case 'A': - camera->orbit(-0.1f, 0.0f); - break; - case 'D': - camera->orbit(0.1f, 0.0f); - break; - case sk::KEY_UP: - camera->turn(0.0f, 0.1f); - break; - case sk::KEY_DOWN: - camera->turn(0.0f, -0.1f); - break; - case sk::KEY_LEFT: - camera->turn(0.1f, 0.0f); - break; - case sk::KEY_RIGHT: - camera->turn(-0.1f, 0.0f); - break; - case 'R': - camera->zoom(0.1f); - break; - case 'F': - camera->zoom(-0.1f); - break; - case 'V': - dosoftras = !dosoftras; - break; - case sk::KEY_ESC: - sk::globals.quit = 1; - break; - } -} - -void -MouseMove(int x, int y) -{ -} - -void -MouseButton(int buttons) -{ -} - -sk::EventStatus -AppEventHandler(sk::Event e, void *param) -{ - using namespace sk; - Rect *r; - MouseState *ms; - - switch(e){ - case INITIALIZE: - Init(); - return EVENTPROCESSED; - case RWINITIALIZE: - return ::InitRW() ? EVENTPROCESSED : EVENTERROR; - case PLUGINATTACH: - return attachPlugins() ? EVENTPROCESSED : EVENTERROR; - case KEYDOWN: - KeyDown(*(int*)param); - return EVENTPROCESSED; - case KEYUP: - KeyUp(*(int*)param); - return EVENTPROCESSED; - case MOUSEBTN: - ms = (MouseState*)param; - MouseButton(ms->buttons); - return EVENTPROCESSED; - case MOUSEMOVE: - ms = (MouseState*)param; - MouseMove(ms->posx, ms->posy); - return EVENTPROCESSED; - case RESIZE: - r = (Rect*)param; - // TODO: register when we're minimized - if(r->w == 0) r->w = 1; - if(r->h == 0) r->h = 1; - - sk::globals.width = r->w; - sk::globals.height = r->h; - if(camera) - camera->m_aspectRatio = (float)r->w/r->h; - if(Scene.camera) - sk::CameraSize(Scene.camera, r); - break; - case IDLE: - Draw(*(float*)param); - return EVENTPROCESSED; - } - return sk::EVENTNOTPROCESSED; -} diff --git a/vendor/librw/tools/playground/maze.tga b/vendor/librw/tools/playground/maze.tga deleted file mode 100644 index 4714c42..0000000 Binary files a/vendor/librw/tools/playground/maze.tga and /dev/null differ diff --git a/vendor/librw/tools/playground/ras_test.cpp b/vendor/librw/tools/playground/ras_test.cpp deleted file mode 100644 index 185fdec..0000000 --- a/vendor/librw/tools/playground/ras_test.cpp +++ /dev/null @@ -1,902 +0,0 @@ -#include -#include - -namespace rs { - -typedef int8_t i8; -typedef uint8_t u8; -typedef int16_t i16; -typedef uint16_t u16; -typedef int32_t i32; -typedef uint32_t u32; -typedef int64_t i64; -typedef uint64_t u64; - -typedef struct Canvas Canvas; -struct Canvas -{ - u8 *fb; - u32 *zbuf; - int w, h; -}; -extern Canvas *canvas; - -typedef struct Texture Texture; -struct Texture -{ - u8 *pixels; - int w, h; - int wrap; -}; - -typedef struct Point3 Point3; -struct Point3 -{ - int x, y, z; -}; - -typedef struct Color Color; -struct Color -{ - u8 r, g, b, a; -}; - -typedef struct Vertex Vertex; -struct Vertex -{ - i32 x, y, z; - float q; // 1/z - u8 r, g, b, a; - u8 f; // fog - float s, t; -}; - -Canvas *makecanvas(int w, int h); -Texture *maketexture(int w, int h); -void putpixel(Canvas *canvas, Point3 p, Color c); -void clearcanvas(Canvas *canvas); -void drawTriangle(Canvas *canvas, Vertex p1, Vertex p2, Vertex p3); - -// not good -void drawRect(Canvas *canvas, Point3 p1, Point3 p2, Color c); -void drawLine(Canvas *canvas, Point3 p1, Point3 p2, Color c); - -//#define trace(...) printf(__VA_ARGS__) -#define trace(...) - - -int clamp(int x); - - -/* - * Render States - */ -enum TextureWrap { - WRAP_REPEAT, - WRAP_CLAMP, - WRAP_BORDER, -}; - -enum TextureFunction { - TFUNC_MODULATE, - TFUNC_DECAL, - TFUNC_HIGHLIGHT, - TFUNC_HIGHLIGHT2, -}; - -enum AlphaTestFunc { - ALPHATEST_NEVER, - ALPHATEST_ALWAYS, - ALPHATEST_LESS, - ALPHATEST_LEQUAL, - ALPHATEST_EQUAL, - ALPHATEST_GEQUAL, - ALPHATEST_GREATER, - ALPHATEST_NOTEQUAL, -}; - -enum AlphaTestFail { - ALPHAFAIL_KEEP, - ALPHAFAIL_FB_ONLY, - ALPHAFAIL_ZB_ONLY, -}; - -enum DepthTestFunc { - DEPTHTEST_NEVER, - DEPTHTEST_ALWAYS, - DEPTHTEST_GEQUAL, - DEPTHTEST_GREATER, -}; - -// The blend equation is -// out = ((A - B) * C >> 7) + D -// A, B and D select the color, C the alpha value -enum AlphaBlendOp { - ALPHABLEND_SRC, - ALPHABLEND_DST, - ALPHABLEND_ZERO, - ALPHABLEND_FIX = ALPHABLEND_ZERO, -}; - -extern int srScissorX0, srScissorX1; -extern int srScissorY0, srScissorY1; -extern int srDepthTestEnable; -extern int srDepthTestFunction; -extern int srWriteZ; -extern int srAlphaTestEnable; -extern int srAlphaTestFunction; -extern int srAlphaTestReference; -extern int srAlphaTestFail; -extern int srAlphaBlendEnable; -extern int srAlphaBlendA; -extern int srAlphaBlendB; -extern int srAlphaBlendC; -extern int srAlphaBlendD; -extern int srAlphaBlendFix; -extern int srTexEnable; -extern Texture *srTexture; -extern int srWrapU; -extern int srWrapV; -extern Color srBorder; -extern int srTexUseAlpha; -extern int srTexFunc; -extern int srFogEnable; -extern Color srFogCol; - - - -// end header - - - - -#define CEIL(p) (((p)+15) >> 4) - -// render states -int srScissorX0, srScissorX1; -int srScissorY0, srScissorY1; -int srDepthTestEnable = 1; -int srDepthTestFunction = DEPTHTEST_GEQUAL; -int srWriteZ = 1; -int srAlphaTestEnable = 1; -int srAlphaTestFunction = ALPHATEST_ALWAYS; -int srAlphaTestReference; -int srAlphaTestFail = ALPHAFAIL_FB_ONLY; -int srAlphaBlendEnable = 1; -int srAlphaBlendA = ALPHABLEND_SRC; -int srAlphaBlendB = ALPHABLEND_DST; -int srAlphaBlendC = ALPHABLEND_SRC; -int srAlphaBlendD = ALPHABLEND_DST; -int srAlphaBlendFix = 0x80; -int srTexEnable = 0; -Texture *srTexture; -int srWrapU = WRAP_REPEAT; -int srWrapV = WRAP_REPEAT; -Color srBorder = { 255, 0, 0, 255 }; -int srTexUseAlpha = 1; -int srTexFunc = TFUNC_MODULATE; -int srFogEnable = 0; -Color srFogCol = { 0, 0, 0, 0 }; - -int clamp(int x) { if(x < 0) return 0; if(x > 255) return 255; return x; } - -Canvas* -makecanvas(int w, int h) -{ - Canvas *canv; - canv = (Canvas*)malloc(sizeof(*canv) + w*h*(4+4)); - canv->w = w; - canv->h = h; - canv->fb = ((u8*)canv + sizeof(*canv)); - canv->zbuf = (u32*)(canv->fb + w*h*4); - return canv; -} - -Texture* -maketexture(int w, int h) -{ - Texture *t; - t = (Texture*)malloc(sizeof(*t) + w*h*4); - t->w = w; - t->h = h; - t->pixels = (u8*)t + sizeof(*t); - t->wrap = 0x11; // wrap u and v - return t; -} - -void -clearcanvas(Canvas *canvas) -{ - memset(canvas->fb, 0, canvas->w*canvas->h*4); - memset(canvas->zbuf, 0, canvas->w*canvas->h*4); -} - -void -writefb(Canvas *canvas, int x, int y, Color c) -{ - u8 *px = &canvas->fb[(y*canvas->w + x)*4]; - u32 *z = &canvas->zbuf[y*canvas->w + x]; - - px[3] = c.r; - px[2] = c.g; - px[1] = c.b; - px[0] = c.a; -} - -void -putpixel(Canvas *canvas, Point3 p, Color c) -{ - // scissor test - if(p.x < srScissorX0 || p.x > srScissorX1 || - p.y < srScissorY0 || p.y > srScissorY1) - return; - - u8 *px = &canvas->fb[(p.y*canvas->w + p.x)*4]; - u32 *z = &canvas->zbuf[p.y*canvas->w + p.x]; - - int fbwrite = 1; - int zbwrite = srWriteZ; - - // alpha test - if(srAlphaTestEnable){ - int fail; - switch(srAlphaTestFunction){ - case ALPHATEST_NEVER: - fail = 1; - break; - case ALPHATEST_ALWAYS: - fail = 0; - break; - case ALPHATEST_LESS: - fail = c.a >= srAlphaTestReference; - break; - case ALPHATEST_LEQUAL: - fail = c.a > srAlphaTestReference; - break; - case ALPHATEST_EQUAL: - fail = c.a != srAlphaTestReference; - break; - case ALPHATEST_GEQUAL: - fail = c.a < srAlphaTestReference; - break; - case ALPHATEST_GREATER: - fail = c.a <= srAlphaTestReference; - break; - case ALPHATEST_NOTEQUAL: - fail = c.a == srAlphaTestReference; - break; - } - if(fail){ - switch(srAlphaTestFail){ - case ALPHAFAIL_KEEP: - return; - case ALPHAFAIL_FB_ONLY: - zbwrite = 0; - break; - case ALPHAFAIL_ZB_ONLY: - fbwrite = 0; - } - } - } - - // ztest - if(srDepthTestEnable){ - switch(srDepthTestFunction){ - case DEPTHTEST_NEVER: - return; - case DEPTHTEST_ALWAYS: - break; - case DEPTHTEST_GEQUAL: - if((u32)p.z < *z) - return; - break; - case DEPTHTEST_GREATER: - if((u32)p.z <= *z) - return; - break; - } - } - - Color d = { px[3], px[2], px[1], px[0] }; - - // blend - if(srAlphaBlendEnable){ - int ar, ag, ab; - int br, bg, bb; - int dr, dg, db; - int ca; - switch(srAlphaBlendA){ - case ALPHABLEND_SRC: - ar = c.r; - ag = c.g; - ab = c.b; - break; - case ALPHABLEND_DST: - ar = d.r; - ag = d.g; - ab = d.b; - break; - case ALPHABLEND_ZERO: - ar = 0; - ag = 0; - ab = 0; - break; - default: assert(0); - } - switch(srAlphaBlendB){ - case ALPHABLEND_SRC: - br = c.r; - bg = c.g; - bb = c.b; - break; - case ALPHABLEND_DST: - br = d.r; - bg = d.g; - bb = d.b; - break; - case ALPHABLEND_ZERO: - br = 0; - bg = 0; - bb = 0; - break; - default: assert(0); - } - switch(srAlphaBlendC){ - case ALPHABLEND_SRC: - ca = c.a; - break; - case ALPHABLEND_DST: - ca = d.a; - break; - case ALPHABLEND_FIX: - ca = srAlphaBlendFix; - break; - default: assert(0); - } - switch(srAlphaBlendD){ - case ALPHABLEND_SRC: - dr = c.r; - dg = c.g; - db = c.b; - break; - case ALPHABLEND_DST: - dr = d.r; - dg = d.g; - db = d.b; - break; - case ALPHABLEND_ZERO: - dr = 0; - dg = 0; - db = 0; - break; - default: assert(0); - } - - int r, g, b; - r = ((ar - br) * ca >> 7) + dr; - g = ((ag - bg) * ca >> 7) + dg; - b = ((ab - bb) * ca >> 7) + db; - - c.r = clamp(r); - c.g = clamp(g); - c.b = clamp(b); - } - - if(fbwrite) - writefb(canvas, p.x, p.y, c); - if(zbwrite) - *z = p.z; -} - -Color -sampletex_nearest(int u, int v) -{ - Texture *tex = srTexture; - - const int usize = tex->w; - const int vsize = tex->h; - - int iu = u >> 4; - int iv = v >> 4; - - switch(srWrapU){ - case WRAP_REPEAT: - iu %= usize; - break; - case WRAP_CLAMP: - if(iu < 0) iu = 0; - if(iu >= usize) iu = usize-1; - break; - case WRAP_BORDER: - if(iu < 0 || iu >= usize) - return srBorder; - } - - switch(srWrapV){ - case WRAP_REPEAT: - iv %= vsize; - break; - case WRAP_CLAMP: - if(iv < 0) iv = 0; - if(iv >= vsize) iv = vsize-1; - break; - case WRAP_BORDER: - if(iv < 0 || iv >= vsize) - return srBorder; - } - - u8 *cp = &tex->pixels[(iv*tex->w + iu)*4]; - Color c = { cp[0], cp[1], cp[2], cp[3] }; - return c; -} - -// t is texture, f is fragment -Color -texfunc(Color t, Color f) -{ - int r, g, b, a; - switch(srTexFunc){ - case TFUNC_MODULATE: - r = t.r * f.r >> 7; - g = t.g * f.g >> 7; - b = t.b * f.b >> 7; - a = srTexUseAlpha ? - t.a * f.a >> 7 : - f.a; - break; - case TFUNC_DECAL: - r = t.r; - g = t.g; - b = t.b; - a = srTexUseAlpha ? t.a : f.a; - break; - case TFUNC_HIGHLIGHT: - r = (t.r * f.r >> 7) + f.a; - g = (t.g * f.g >> 7) + f.a; - b = (t.b * f.b >> 7) + f.a; - a = srTexUseAlpha ? - t.a + f.a : - f.a; - break; - case TFUNC_HIGHLIGHT2: - r = (t.r * f.r >> 7) + f.a; - g = (t.g * f.g >> 7) + f.a; - b = (t.b * f.b >> 7) + f.a; - a = srTexUseAlpha ? t.a : f.a; - break; - } - Color v; - v.r = clamp(r); - v.g = clamp(g); - v.b = clamp(b); - v.a = clamp(a); - return v; -} - -Point3 mkpnt(int x, int y, int z) { Point3 p = { x, y, z}; return p; } - -void -drawRect(Canvas *canvas, Point3 p1, Point3 p2, Color c) -{ - int x, y; - for(y = p1.y; y <= p2.y; y++) - for(x = p1.x; x <= p2.x; x++) - putpixel(canvas, mkpnt(x, y, 0), c); -} - -void -drawLine(Canvas *canvas, Point3 p1, Point3 p2, Color c) -{ - int dx, dy; - int incx, incy; - int e; - int x, y; - - dx = abs(p2.x-p1.x); - incx = p2.x > p1.x ? 1 : -1; - dy = abs(p2.y-p1.y); - incy = p2.y > p1.y ? 1 : -1; - e = 0; - if(dx == 0){ - for(y = p1.y; y != p2.y; y += incy) - putpixel(canvas, mkpnt(p1.x, y, 0), c); - }else if(dx > dy){ - y = p1.y; - for(x = p1.x; x != p2.x; x += incx){ - putpixel(canvas, mkpnt(x, y, 0), c); - e += dy; - if(2*e >= dx){ - e -= dx; - y += incy; - } - } - }else{ - x = p1.x; - for(y = p1.y; y != p2.y; y += incy){ - putpixel(canvas, mkpnt(x, y, 0), c); - e += dx; - if(2*e >= dy){ - e -= dy; - x += incx; - } - } - } -} - -/* - attibutes we want to interpolate: - R G B A - U V / S T Q - X Y Z F -*/ - -struct TriAttribs -{ - i64 z; - i32 r, g, b, a; - i32 f; - float s, t; - float q; -}; - -static void -add1(struct TriAttribs *a, struct TriAttribs *b) -{ - a->z += b->z; - a->r += b->r; - a->g += b->g; - a->b += b->b; - a->a += b->a; - a->f += b->f; - a->s += b->s; - a->t += b->t; - a->q += b->q; -} - -static void -sub1(struct TriAttribs *a, struct TriAttribs *b) -{ - a->z -= b->z; - a->r -= b->r; - a->g -= b->g; - a->b -= b->b; - a->a -= b->a; - a->f -= b->f; - a->s -= b->s; - a->t -= b->t; - a->q -= b->q; -} - -static void -guard(struct TriAttribs *a) -{ - if(a->z < 0) a->z = 0; - else if(a->z > 0x3FFFFFFFC000LL) a->z = 0x3FFFFFFFC000LL; - if(a->r < 0) a->r = 0; - else if(a->r > 0xFF000) a->r = 0xFF000; - if(a->g < 0) a->g = 0; - else if(a->g > 0xFF000) a->g = 0xFF000; - if(a->b < 0) a->b = 0; - else if(a->b > 0xFF000) a->b = 0xFF000; - if(a->a < 0) a->a = 0; - else if(a->a > 0xFF000) a->a = 0xFF000; - if(a->f < 0) a->f = 0; - else if(a->f > 0xFF000) a->f = 0xFF000; -} - -struct RasTri -{ - int x, y; - int ymid, yend; - int right; - int e[2], dx[3], dy[3]; - struct TriAttribs gx, gy, v, s; -}; - -static int -triangleSetup(struct RasTri *tri, Vertex v1, Vertex v2, Vertex v3) -{ - int dx1, dx2, dx3; - int dy1, dy2, dy3; - - dy1 = v3.y - v1.y; // long edge - if(dy1 == 0) return 1; - dx1 = v3.x - v1.x; - dx2 = v2.x - v1.x; // first small edge - dy2 = v2.y - v1.y; - dx3 = v3.x - v2.x; // second small edge - dy3 = v3.y - v2.y; - - // this is twice the triangle area - const int area = dx2*dy1 - dx1*dy2; - if(area == 0) return 1; - // figure out if 0 or 1 is the right edge - tri->right = area < 0; - - /* The gradients are to step whole pixels, - * so they are pre-multiplied by 16. */ - - float denom = 16.0f/area; - // gradients x -#define GX(p) ((v2.p - v1.p)*dy1 - (v3.p - v1.p)*dy2) - tri->gx.z = GX(z)*denom * 16384; - tri->gx.r = GX(r)*denom * 4096; - tri->gx.g = GX(g)*denom * 4096; - tri->gx.b = GX(b)*denom * 4096; - tri->gx.a = GX(a)*denom * 4096; - tri->gx.f = GX(f)*denom * 4096; - tri->gx.s = GX(s)*denom; - tri->gx.t = GX(t)*denom; - tri->gx.q = GX(q)*denom; - - // gradients y - denom = -denom; -#define GY(p) ((v2.p - v1.p)*dx1 - (v3.p - v1.p)*dx2) - tri->gy.z = GY(z)*denom * 16384; - tri->gy.r = GY(r)*denom * 4096; - tri->gy.g = GY(g)*denom * 4096; - tri->gy.b = GY(b)*denom * 4096; - tri->gy.a = GY(a)*denom * 4096; - tri->gy.f = GY(f)*denom * 4096; - tri->gy.s = GY(s)*denom; - tri->gy.t = GY(t)*denom; - tri->gy.q = GY(q)*denom; - - tri->ymid = CEIL(v2.y); - tri->yend = CEIL(v3.y); - - tri->y = CEIL(v1.y); - tri->x = CEIL(v1.x); - - tri->dy[0] = dy2<<4; // upper edge - tri->dy[1] = dy1<<4; // lower edge - tri->dy[2] = dy3<<4; // long edge - tri->dx[0] = dx2<<4; - tri->dx[1] = dx1<<4; - tri->dx[2] = dx3<<4; - - // prestep to land on pixel center - - int stepx = v1.x - (tri->x<<4); - int stepy = v1.y - (tri->y<<4); - tri->e[0] = (-stepy*tri->dx[0] + stepx*tri->dy[0]) >> 4; - tri->e[1] = (-stepy*tri->dx[1] + stepx*tri->dy[1]) >> 4; - - // attributes along interpolated edge - // why is this cast needed? (mingw) - tri->v.z = (i64)v1.z*16384 - (stepy*tri->gy.z + stepx*tri->gx.z)/16; - tri->v.r = v1.r*4096 - (stepy*tri->gy.r + stepx*tri->gx.r)/16; - tri->v.g = v1.g*4096 - (stepy*tri->gy.g + stepx*tri->gx.g)/16; - tri->v.b = v1.b*4096 - (stepy*tri->gy.b + stepx*tri->gx.b)/16; - tri->v.a = v1.a*4096 - (stepy*tri->gy.a + stepx*tri->gx.a)/16; - tri->v.f = v1.f*4096 - (stepy*tri->gy.f + stepx*tri->gx.f)/16; - tri->v.s = v1.s - (stepy*tri->gy.s + stepx*tri->gx.s)/16.0f; - tri->v.t = v1.t - (stepy*tri->gy.t + stepx*tri->gx.t)/16.0f; - tri->v.q = v1.q - (stepy*tri->gy.q + stepx*tri->gx.q)/16.0f; - - return 0; -} - -void -drawTriangle(Canvas *canvas, Vertex v1, Vertex v2, Vertex v3) -{ - Color c; - struct RasTri tri; - int stepx, stepy; - - // Sort such that we have from top to bottom v1,v2,v3 - if(v2.y < v1.y){ Vertex tmp = v1; v1 = v2; v2 = tmp; } - if(v3.y < v1.y){ Vertex tmp = v1; v1 = v3; v3 = tmp; } - if(v3.y < v2.y){ Vertex tmp = v2; v2 = v3; v3 = tmp; } - - if(triangleSetup(&tri, v1, v2, v3)) - return; - - // Current scanline start and end - int xn[2] = { tri.x, tri.x }; - int a = !tri.right; // left edge - int b = tri.right; // right edge - - // If upper triangle has no height, only do the lower part - if(tri.dy[0] == 0) - goto secondtri; - while(tri.y < tri.yend){ - /* TODO: is this the righ way to step the edges? */ - - /* Step x and interpolated value down left edge */ - while(tri.e[a] <= -tri.dy[a]){ - xn[a]--; - tri.e[a] += tri.dy[a]; - sub1(&tri.v, &tri.gx); - } - while(tri.e[a] > 0){ - xn[a]++; - tri.e[a] -= tri.dy[a]; - add1(&tri.v, &tri.gx); - } - - /* Step x down right edge */ - while(tri.e[b] <= -tri.dy[b]){ - xn[b]--; - tri.e[b] += tri.dy[b]; - } - while(tri.e[b] > 0){ - xn[b]++; - tri.e[b] -= tri.dy[b]; - } - - // When we reach the mid vertex, change state and jump to start of loop again - // TODO: this is a bit ugly in here...can we fix it? - if(tri.y == tri.ymid){ - secondtri: - tri.dx[0] = tri.dx[2]; - tri.dy[0] = tri.dy[2]; - // Either the while prevents this or we returned early because dy1 == 0 - assert(tri.dy[0] != 0); - stepx = v2.x - (xn[0]<<4); - stepy = v2.y - (tri.y<<4); - tri.e[0] = (-stepy*tri.dx[0] + stepx*tri.dy[0]) >> 4; - - tri.ymid = -1; // so we don't do this again - continue; - } - - /* Rasterize one line */ - tri.s = tri.v; - for(tri.x = xn[a]; tri.x < xn[b]; tri.x++){ - guard(&tri.s); - c.r = tri.s.r >> 12; - c.g = tri.s.g >> 12; - c.b = tri.s.b >> 12; - c.a = tri.s.a >> 12; - if(srTexEnable && srTexture){ - float w = 1.0f/tri.s.q; - float s = tri.s.s * w; - float t = tri.s.t * w; - int u = s * srTexture->w * 16; - int v = t * srTexture->h * 16; - Color texc = sampletex_nearest(u, v); - c = texfunc(texc, c); - } - if(srFogEnable){ - const int f = tri.s.f >> 12; - c.r = (f*c.r >> 8) + ((255 - f)*srFogCol.r >> 8); - c.g = (f*c.g >> 8) + ((255 - f)*srFogCol.g >> 8); - c.b = (f*c.b >> 8) + ((255 - f)*srFogCol.b >> 8); - } - putpixel(canvas, mkpnt(tri.x, tri.y, tri.s.z>>14), c); - add1(&tri.s, &tri.gx); - } - - /* Step in y */ - tri.y++; - tri.e[a] += tri.dx[a]; - tri.e[b] += tri.dx[b]; - add1(&tri.v, &tri.gy); - } -} - -Canvas *canvas; - -} - -using namespace rw; - -void -rastest_renderTriangles(RWDEVICE::Im2DVertex *scrverts, int32 numVerts, uint16 *indices, int32 numTris) -{ - int i; - RGBA col; - rs::Vertex v[3]; - RWDEVICE::Im2DVertex *iv; - - rs::srDepthTestEnable = 1; - rs::srAlphaTestEnable = 0; - rs::srTexEnable = 0; - rs::srAlphaBlendEnable = 0; - - while(numTris--){ - for(i = 0; i < 3; i++){ - iv = &scrverts[indices[i]]; - v[i].x = iv->getScreenX() * 16.0f; - v[i].y = iv->getScreenY() * 16.0f; - v[i].z = 16777216*(1.0f-iv->getScreenZ()); - v[i].q = iv->getRecipCameraZ(); - col = iv->getColor(); - v[i].r = col.red; - v[i].g = col.green; - v[i].b = col.blue; - v[i].a = col.alpha; - v[i].f = 0; - v[i].s = iv->u*iv->getRecipCameraZ(); - v[i].t = iv->v*iv->getRecipCameraZ(); - } - drawTriangle(rs::canvas, v[0], v[1], v[2]); - - indices += 3; - } -} - -extern rw::Raster *testras; - -void -beginSoftras(void) -{ - Camera *cam = (Camera*)engine->currentCamera; - - if(rs::canvas == nil || - cam->frameBuffer->width != rs::canvas->w || - cam->frameBuffer->height != rs::canvas->h){ - rs::canvas = rs::makecanvas(cam->frameBuffer->width, cam->frameBuffer->height); - testras = rw::Raster::create(rs::canvas->w, rs::canvas->h, 32, rw::Raster::C8888); - } - - clearcanvas(rs::canvas); - rs::srScissorX0 = 0; - rs::srScissorX1 = rs::canvas->w-1; - rs::srScissorY0 = 0; - rs::srScissorY1 = rs::canvas->h-1; -} - -void -endSoftras(void) -{ - int i; - uint8 *dst = testras->lock(0, Raster::LOCKWRITE|Raster::LOCKNOFETCH); - if(dst == nil) - return; - uint8 *src = rs::canvas->fb; - for(i = 0; i < rs::canvas->w*rs::canvas->h; i++){ - dst[0] = src[1]; - dst[1] = src[2]; - dst[2] = src[3]; - dst[3] = src[0]; - dst += 4; - src += 4; - } - // abgr in canvas - // bgra in raster - testras->unlock(0); -} - - -/* -typedef struct PixVert PixVert; -struct PixVert -{ - float x, y, z, q; - int r, g, b, a; - float u, v; -}; -#include "test.inc" - -void -drawtest(void) -{ - int i, j; - rs::Vertex v[3]; - - rs::srDepthTestEnable = 1; - rs::srAlphaTestEnable = 0; - rs::srTexEnable = 0; - rs::srAlphaBlendEnable = 0; - - for(i = 0; i < nelem(verts); i += 3){ - for(j = 0; j < 3; j++){ - v[j].x = verts[i+j].x * 16.0f; - v[j].y = verts[i+j].y * 16.0f; - v[j].z = 16777216*(1.0f - verts[i+j].z); - v[j].q = verts[i+j].q; - v[j].r = verts[i+j].r; - v[j].g = verts[i+j].g; - v[j].b = verts[i+j].b; - v[j].a = verts[i+j].a; - v[j].f = 0; - v[j].s = verts[i+j].u*v[j].q; - v[j].t = verts[i+j].v*v[j].q; - } - drawTriangle(rs::canvas, v[0], v[1], v[2]); - } -//exit(0); -} -*/ diff --git a/vendor/librw/tools/playground/splines.cpp b/vendor/librw/tools/playground/splines.cpp deleted file mode 100644 index 73d32eb..0000000 --- a/vendor/librw/tools/playground/splines.cpp +++ /dev/null @@ -1,520 +0,0 @@ -#include -#include - -#include - -using namespace rw; -using namespace RWDEVICE; - -static Im3DVertex im3dVerts[1024]; -static int numImVerts; -static rw::PrimitiveType imPrim; -static Im3DVertex imVert; - -void -BeginIm3D(rw::PrimitiveType prim) -{ - numImVerts = 0; - imPrim = prim; -} - -void -EndIm3D(void) -{ - rw::im3d::Transform(im3dVerts, numImVerts, nil, rw::im3d::EVERYTHING); - rw::im3d::RenderPrimitive(imPrim); - rw::im3d::End(); -} - -void -AddVertex(const rw::V3d &vert) -{ - if(numImVerts >= 1024){ - EndIm3D(); - switch(imPrim){ - case PRIMTYPEPOLYLINE: - im3dVerts[0] = im3dVerts[numImVerts-1]; - numImVerts = 1; - break; - case PRIMTYPETRISTRIP: - // TODO: winding? - im3dVerts[0] = im3dVerts[numImVerts-2]; - im3dVerts[1] = im3dVerts[numImVerts-1]; - numImVerts = 2; - break; - case PRIMTYPETRIFAN: - im3dVerts[1] = im3dVerts[numImVerts-1]; - numImVerts = 2; - break; - default: - numImVerts = 0; - } - } - - imVert.setX(vert.x); - imVert.setY(vert.y); - imVert.setZ(vert.z); - im3dVerts[numImVerts++] = imVert; -} - -float epsilon = 0.000001; - -class RBCurve -{ -public: - int degree; - std::vector verts; - std::vector weights; // for rational - std::vector knots; - - V3d eval(float u); - void drawHull(void); - void drawSpline(void); -}; - -class RBSurf -{ -public: - int degreeU, degreeV; - int numU, numV; - std::vector verts; - std::vector weights; - std::vector knotsU, knotsV; - - void update(void); - V3d eval(float u, float v); - void drawHull(void); - void drawIsoparms(void); - void drawShaded(void); -}; - -float div0(float a, float b) { return b == 0.0f ? a : a/b; } - -// naive algorithm -float -evalBasis(int i, int d, float u, float knots[]) -{ - if(d == 0){ - if(knots[i] <= u && u < knots[i+1]) - return 1.0f; - return 0.0f; - } - - float b0 = evalBasis(i, d-1, u, knots); - float b1 = evalBasis(i+1, d-1, u, knots); - return b0*div0(u-knots[i], knots[i+d] - knots[i]) + b1*div0(knots[i+d+1]-u, knots[i+d+1] - knots[i+1]); -} - -float -evalBasisFast(int i, int d, float u, float knots[]) -{ - int r, j; - float tmp[10]; - - // degree 0 values - for(j = 0; j < d+1; j++) - tmp[j] = knots[i+j] <= u && u < knots[i+j+1] ? 1.0f : 0.0f; - - // build up from degree zero - for(r = d, d = 1; r > 0; r--, d++){ - for(j = 0; j < r; j++){ - float t1 = div0(u-knots[i+j], knots[i+j + d] - knots[i+j]); - float t2 = div0(knots[i+j + d+1]-u, knots[i+j + d+1] - knots[i+j + 1]); - tmp[j] = tmp[j]*t1 + tmp[j+1]*t2; - } - } - return tmp[0]; -} - -V3d -RBCurve::eval(float u) -{ - int i; - V3d vert = { 0.0f, 0.0f, 0.0f }; - float w = 0.0f; - - // Find knots we're interested in - for(i = 0; i < knots.size(); i++) - if(knots[i] <= u && u < knots[i+1]) - break; - int startI = i-degree; - int endI = i+1; - - for(i = startI; i < endI; i++){ - float r = evalBasisFast(i, degree, u, &knots[0]); - w += weights[i]*r; - vert = add(vert, scale(verts[i], weights[i]*r)); - } - return scale(vert, div0(1.0f,w)); -} - -void -RBCurve::drawHull(void) -{ - int i; - - rw::SetRenderState(rw::TEXTURERASTER, nil); - rw::SetRenderState(rw::FOGENABLE, 0); - - BeginIm3D(rw::PRIMTYPEPOLYLINE); - imVert.setU(0.0f); - imVert.setV(0.0f); - imVert.setColor(138, 72, 51, 255); -// imVert.setColor(228, 172, 121, 255); - for(i = 0; i < verts.size(); i++) - AddVertex(verts[i]); - EndIm3D(); -} - -void -RBCurve::drawSpline(void) -{ - int i; - float u, endu; - V3d vert; - - rw::SetRenderState(rw::TEXTURERASTER, nil); - rw::SetRenderState(rw::FOGENABLE, 0); - BeginIm3D(rw::PRIMTYPEPOLYLINE); - imVert.setU(0.0f); - imVert.setV(0.0f); - imVert.setColor(0, 4, 96, 255); - - u = knots[0]; - endu = knots[knots.size()-1] - epsilon; - float uinc = (endu-knots[0])/40.0f; - for(;; u += uinc){ - if(u > endu) - u = endu; - AddVertex(eval(u)); - if(u >= endu) - break; - } - - EndIm3D(); -} - -void -RBSurf::update(void) -{ - numU = knotsU.size() - degreeU - 1; - numV = knotsV.size() - degreeV - 1; -} - -V3d -RBSurf::eval(float u, float v) -{ - int i, j; - V3d vert = { 0.0f, 0.0f, 0.0f }; - float w = 0.0f; - - float basisU[10], basisV[10]; - - // Find knots we're interested in - int k; - for(k = 0; k < knotsU.size(); k++) - if(knotsU[k] <= u && u < knotsU[k+1]) - break; - int startI = k-degreeU; - int endI = k+1; - for(k = 0; k < knotsV.size(); k++) - if(knotsV[k] <= v && v < knotsV[k+1]) - break; - int startJ = k-degreeV; - int endJ = k+1; - - for(i = startI; i < endI; i++) basisU[i-startI] = evalBasisFast(i, degreeU, u, &knotsU[0]); - for(j = startJ; j < endJ; j++) basisV[j-startJ] = evalBasisFast(j, degreeV, v, &knotsV[0]); - - for(j = startJ; j < endJ; j++) - for(i = startI; i < endI; i++){ - float r = basisV[j-startJ]*basisU[i-startI]; - w += weights[j*numU + i]*r; - vert = add(vert, scale(verts[j*numU + i], weights[j*numU + i]*r)); - } - return scale(vert, div0(1.0f,w)); -} - -void -RBSurf::drawHull(void) -{ - rw::SetRenderState(rw::TEXTURERASTER, nil); - rw::SetRenderState(rw::FOGENABLE, 0); - - imVert.setU(0.0f); - imVert.setV(0.0f); - imVert.setColor(138, 72, 51, 255); -// imVert.setColor(228, 172, 121, 255); - - int iu, iv; - for(iv = 0; iv < numV; iv++){ - BeginIm3D(rw::PRIMTYPEPOLYLINE); - for(iu = 0; iu < numU; iu++) - AddVertex(verts[iu + iv*numU]); - EndIm3D(); - } - - for(iu = 0; iu < numU; iu++){ - BeginIm3D(rw::PRIMTYPEPOLYLINE); - for(iv = 0; iv < numV; iv++) - AddVertex(verts[iu + iv*numU]); - EndIm3D(); - } -} - -void -RBSurf::drawIsoparms(void) -{ - V3d vert; - int iu, iv; - float u, v; - - rw::SetRenderState(rw::TEXTURERASTER, nil); - rw::SetRenderState(rw::FOGENABLE, 0); - - imVert.setU(0.0f); - imVert.setV(0.0f); - imVert.setColor(0, 4, 96, 255); - - float endu = knotsU[knotsU.size()-1] - epsilon; - float endv = knotsU[knotsV.size()-1] - epsilon; - float uinc = (endu-knotsU[0])/40.0f; - float vinc = (endv-knotsV[0])/40.0f; - - v = -100000.0f; - for(iv = 0; iv < knotsV.size(); iv++){ - if(knotsV[iv] <= v) continue; - v = knotsV[iv]; - if(v > endv) v = endv; - - BeginIm3D(rw::PRIMTYPEPOLYLINE); - for(u = knotsU[0];; u += uinc){ - if(u > endu) - u = endu; - AddVertex(eval(u, v)); - if(u >= endu) - break; - } - EndIm3D(); - } - - u = -100000.0f; - for(iu = 0; iu < knotsU.size(); iu++){ - if(knotsU[iu] <= u) continue; - u = knotsU[iu]; - if(u > endu) u = endu; - - BeginIm3D(rw::PRIMTYPEPOLYLINE); - for(v = knotsV[0];; v += vinc){ - if(v > endv) - v = endv; - AddVertex(eval(u, v)); - if(v >= endv) - break; - } - EndIm3D(); - } -} - -void -RBSurf::drawShaded(void) -{ - V3d vert; - int iu, iv; - float u, v; - - rw::SetRenderState(rw::TEXTURERASTER, nil); - rw::SetRenderState(rw::FOGENABLE, 0); - - imVert.setU(0.0f); - imVert.setV(0.0f); - imVert.setColor(0, 128, 240, 255); - - float endu = knotsU[knotsU.size()-1] - epsilon; - float endv = knotsU[knotsV.size()-1] - epsilon; - float uinc = (endu-knotsU[0])/40.0f; - float vinc = (endv-knotsV[0])/40.0f; - - float vnext; - for(v = knotsV[0];; v = vnext){ - if(v > endv) - v = endv; - vnext = v + vinc; - - BeginIm3D(rw::PRIMTYPETRISTRIP); - for(u = knotsU[0];; u += uinc){ - if(u > endu) - u = endu; - - AddVertex(eval(u, v)); - AddVertex(eval(u, vnext)); - - if(u >= endu) - break; - } - EndIm3D(); - if(vnext >= endv) - break; - } -} - - -RBCurve testspline1, testspline2; -RBSurf testsurf; - -void -initsplines(void) -{ - V3d vert; - - testspline1.degree = 3; - testspline1.verts.clear(); - testspline1.weights.clear(); - vert.set(-30.63383, 22.65459, 0); - vert = scale(vert, 1.0f/20.0f); - testspline1.verts.push_back(vert); - testspline1.weights.push_back(1.0f); - vert.set(13.50783, 33.01786, 15.06403); - vert = scale(vert, 1.0f/20.0f); - testspline1.verts.push_back(vert); - testspline1.weights.push_back(1.0f); - vert.set(34.252, -10.36327, 15.06403); - vert = scale(vert, 1.0f/20.0f); - testspline1.verts.push_back(vert); - testspline1.weights.push_back(1.0f); - vert.set(-7.959972, -1.205032, 0); - vert = scale(vert, 1.0f/20.0f); - testspline1.verts.push_back(vert); - testspline1.weights.push_back(1.0f); - vert.set(6.995127, -41.32158, -18.19684); - vert = scale(vert, 1.0f/20.0f); - testspline1.verts.push_back(vert); - testspline1.weights.push_back(1.0f); - - testspline1.knots.clear(); - testspline1.knots.push_back(0); - testspline1.knots.push_back(0); - testspline1.knots.push_back(0); - testspline1.knots.push_back(0); - testspline1.knots.push_back(1); - testspline1.knots.push_back(2); - testspline1.knots.push_back(2); - testspline1.knots.push_back(2); - testspline1.knots.push_back(2); - - - testspline2.degree = 2; - testspline2.verts.clear(); -#define V(x, y, z) \ - vert.set(x, y, z); \ - testspline2.verts.push_back(scale(vert, 1.0f/20.0f)); \ - testspline2.weights.push_back(1.0f); - V(-61.9913, 9.158239, 0); - V(-32.32231, 27.23371, 0); - V(25.80961, -4.820126, 0); - testspline2.knots.clear(); - testspline2.knots.push_back(0); - testspline2.knots.push_back(0); - testspline2.knots.push_back(0); - testspline2.knots.push_back(1); - testspline2.knots.push_back(1); - testspline2.knots.push_back(1); - -/* - testspline2 = testspline1; -// testspline2.knots.clear(); -// testspline2.knots.push_back(0); -// testspline2.knots.push_back(0); -// testspline2.knots.push_back(0); -// testspline2.knots.push_back(0); -// testspline2.knots.push_back(3); -// testspline2.knots.push_back(4); -// testspline2.knots.push_back(4); -// testspline2.knots.push_back(4); -// testspline2.knots.push_back(4); - testspline1.weights[2] = 5.0f; -*/ - -#define V(x, y, z) \ - vert.set(x, y, z); \ - testsurf.verts.push_back(scale(vert, 1.0f/20.0f)); \ - testsurf.weights.push_back(1.0f); - - testsurf.degreeU = 3; - testsurf.degreeV = 3; - testsurf.verts.clear(); - testsurf.weights.clear(); - V(-69.22764, -0, 12.77366); - V(-48.72468, 0, 29.16251); - V(-24.84476, 0, 39.52605); - V(22.43265, -0, 45.79238); - V(36.4229, 0, 28.9215); - V(61.02645, 0, 6.74835); - V(86.35364, -0, 20.96809); - V(-69.22764, 9.286676, 12.77366); - V(-48.72468, 9.286676, 29.16251); - V(-24.84476, 9.286676, 39.52605); - V(22.43265, 9.286676, 45.79238); - V(36.4229, 9.286676, 28.9215); - V(61.02645, 9.286676, 6.74835); - V(86.35364, 9.286676, 20.96809); - V(-68.13416, 23.51821, 6.114491); - V(-48.19925, 23.51821, 22.27994); - V(-26.91943, 23.51821, 33.20763); - V(18.69658, 23.51821, 39.0488); - V(27.88844, 23.51821, 30.80604); - V(57.49908, 23.51821, -0.6488895); - V(86.35364, 23.51821, 14.21974); - V(-67.00163, 52.46369, -0.7825046); - V(-47.65504, 52.46369, 15.15157); - V(-29.06818, 52.46369, 26.66356); - V(14.82709, 52.46369, 32.06438); - V(19.04919, 52.46369, 32.75788); - V(53.84574, 52.46369, -8.310311); - V(86.35364, 52.46369, 7.230374); - V(-67.86079, 70.07219, 4.449699); - V(-48.06789, 70.07219, 20.5593); - V(-27.43809, 70.07219, 31.62803); - V(17.76257, 70.07219, 37.36291); - V(25.75483, 70.07219, 31.27717); - V(56.61724, 70.07219, -2.498198); - V(86.35364, 70.07219, 12.53265); - testsurf.knotsU.clear(); - testsurf.knotsU.push_back(0); - testsurf.knotsU.push_back(0); - testsurf.knotsU.push_back(0); - testsurf.knotsU.push_back(0); - testsurf.knotsU.push_back(0.25); - testsurf.knotsU.push_back(0.5); - testsurf.knotsU.push_back(0.75); - testsurf.knotsU.push_back(1); - testsurf.knotsU.push_back(1); - testsurf.knotsU.push_back(1); - testsurf.knotsU.push_back(1); - testsurf.knotsV.clear(); - testsurf.knotsV.push_back(0); - testsurf.knotsV.push_back(0); - testsurf.knotsV.push_back(0); - testsurf.knotsV.push_back(0); - testsurf.knotsV.push_back(0.5); - testsurf.knotsV.push_back(1); - testsurf.knotsV.push_back(1); - testsurf.knotsV.push_back(1); - testsurf.knotsV.push_back(1); - - testsurf.update(); -} - -void -rendersplines(void) -{ - testspline1.drawHull(); - testspline1.drawSpline(); - -// testspline2.drawHull(); -// testspline2.drawSpline(); - - testsurf.drawHull(); - testsurf.drawShaded(); - testsurf.drawIsoparms(); -} diff --git a/vendor/librw/tools/playground/teapot.dff b/vendor/librw/tools/playground/teapot.dff deleted file mode 100644 index 7a65176..0000000 Binary files a/vendor/librw/tools/playground/teapot.dff and /dev/null differ diff --git a/vendor/librw/tools/playground/tl_tests.cpp b/vendor/librw/tools/playground/tl_tests.cpp deleted file mode 100644 index 7cfc59a..0000000 --- a/vendor/librw/tools/playground/tl_tests.cpp +++ /dev/null @@ -1,766 +0,0 @@ -#include -#include - -extern bool dosoftras; - -using namespace rw; -using namespace RWDEVICE; - -void rastest_renderTriangles(RWDEVICE::Im2DVertex *scrverts, int32 verts, uint16 *indices, int32 numTris); - -// -// This is a test to implement T&L in software and render with Im2D -// - -namespace gen { - -#define MAX_LIGHTS 8 - -struct Directional { - V3d at; - RGBAf color; -}; -static Directional directionals[MAX_LIGHTS]; -static int32 numDirectionals; -static RGBAf ambLight; - -static void -enumLights(Matrix *lightmat) -{ - int32 n; - World *world; - - world = (World*)engine->currentWorld; - ambLight.red = 0.0; - ambLight.green = 0.0; - ambLight.blue = 0.0; - ambLight.alpha = 0.0; - numDirectionals = 0; - // only unpositioned lights right now - FORLIST(lnk, world->globalLights){ - Light *l = Light::fromWorld(lnk); - if(l->getType() == Light::DIRECTIONAL){ - if(numDirectionals >= MAX_LIGHTS) - continue; - n = numDirectionals++; - V3d::transformVectors(&directionals[n].at, &l->getFrame()->getLTM()->at, 1, lightmat); - directionals[n].color = l->color; - directionals[n].color.alpha = 0.0f; - }else if(l->getType() == Light::AMBIENT){ - ambLight.red += l->color.red; - ambLight.green += l->color.green; - ambLight.blue += l->color.blue; - } - } -} - -struct ObjSpace3DVertex -{ - V3d objVertex; - V3d objNormal; - RGBA color; - TexCoords texCoords; -}; - -enum { - CLIPXLO = 0x01, - CLIPXHI = 0x02, - CLIPX = 0x03, - CLIPYLO = 0x04, - CLIPYHI = 0x08, - CLIPY = 0x0C, - CLIPZLO = 0x10, - CLIPZHI = 0x20, - CLIPZ = 0x30, -}; - -struct CamSpace3DVertex -{ - V3d camVertex; - uint8 clipFlags; - RGBAf color; - TexCoords texCoords; -}; - -struct InstanceData -{ - uint16 *indices; - int32 numIndices; - ObjSpace3DVertex *vertices; - int32 numVertices; - // int vertStride; // not really needed right now - Material *material; - Mesh *mesh; -}; - -struct InstanceDataHeader : public rw::InstanceDataHeader -{ - uint32 serialNumber; - ObjSpace3DVertex *vertices; - uint16 *indices; - InstanceData *inst; -}; - -static void -instanceAtomic(Atomic *atomic) -{ - static V3d zeroNorm = { 0.0f, 0.0f, 0.0f }; - static RGBA black = { 0, 0, 0, 255 }; - static TexCoords zeroTex = { 0.0f, 0.0f }; - int i; - uint j; - int x, x1, x2, x3; - Geometry *geo; - MeshHeader *header; - Mesh *mesh; - InstanceDataHeader *insthead; - InstanceData *inst; - uint32 firstVert; - uint16 *srcindices, *dstindices; - - geo = atomic->geometry; - if(geo->instData) - return; - header = geo->meshHeader; - int numTris; - if(header->flags & MeshHeader::TRISTRIP) - numTris = header->totalIndices - 2*header->numMeshes; - else - numTris = header->totalIndices / 3; - int size; - size = sizeof(InstanceDataHeader) + header->numMeshes*sizeof(InstanceData) + - geo->numVertices*sizeof(ObjSpace3DVertex) + numTris*6*sizeof(uint16); - insthead = (InstanceDataHeader*)rwNew(size, ID_GEOMETRY); - geo->instData = insthead; - insthead->platform = 0; - insthead->serialNumber = header->serialNum; - inst = (InstanceData*)(insthead+1); - insthead->inst = inst; - insthead->vertices = (ObjSpace3DVertex*)(inst+header->numMeshes); - dstindices = (uint16*)(insthead->vertices+geo->numVertices); - insthead->indices = dstindices; - - // TODO: morphing - MorphTarget *mt = geo->morphTargets; - for(i = 0; i < geo->numVertices; i++){ - insthead->vertices[i].objVertex = mt->vertices[i]; - if(geo->flags & Geometry::NORMALS) - insthead->vertices[i].objNormal = mt->normals[i]; - else - insthead->vertices[i].objNormal = zeroNorm; - if(geo->flags & Geometry::PRELIT) - insthead->vertices[i].color = geo->colors[i]; - else - insthead->vertices[i].color = black; - if(geo->numTexCoordSets > 0) - insthead->vertices[i].texCoords = geo->texCoords[0][i]; - else - insthead->vertices[i].texCoords = zeroTex; - } - - mesh = header->getMeshes(); - for(i = 0; i < header->numMeshes; i++){ - findMinVertAndNumVertices(mesh->indices, mesh->numIndices, - &firstVert, &inst->numVertices); - inst->indices = dstindices; - inst->vertices = &insthead->vertices[firstVert]; - inst->mesh = mesh; - inst->material = mesh->material; - srcindices = mesh->indices; - if(header->flags & MeshHeader::TRISTRIP){ - inst->numIndices = 0; - x = 0; - for(j = 0; j < mesh->numIndices-2; j++){ - x1 = srcindices[j+x]; - x ^= 1; - x2 = srcindices[j+x]; - x3 = srcindices[j+2]; - if(x1 != x2 && x2 != x3 && x1 != x3){ - dstindices[0] = x1; - dstindices[1] = x2; - dstindices[2] = x3; - dstindices += 3; - inst->numIndices += 3; - } - } - }else{ - inst->numIndices = mesh->numIndices; - for(j = 0; j < mesh->numIndices; j += 3){ - dstindices[0] = srcindices[j+0] - firstVert; - dstindices[1] = srcindices[j+1] - firstVert; - dstindices[2] = srcindices[j+2] - firstVert; - dstindices += 3; - } - } - - inst++; - mesh++; - } -} - -struct MeshState -{ - int32 flags; - Matrix obj2cam; - Matrix obj2world; - int32 numVertices; - int32 numPrimitives; - SurfaceProperties surfProps; - RGBA matCol; -}; - -static void -cam2screen(Im2DVertex *scrvert, CamSpace3DVertex *camvert) -{ - RGBA col; - float32 recipZ; - Camera *cam = (Camera*)engine->currentCamera; - int32 width = cam->frameBuffer->width; - int32 height = cam->frameBuffer->height; - recipZ = 1.0f/camvert->camVertex.z; - -// scrvert->setScreenX(camvert->camVertex.x * recipZ * width); -// scrvert->setScreenY(camvert->camVertex.y * recipZ * height); - scrvert->setScreenX(camvert->camVertex.x * recipZ * width/2 + width/4); - scrvert->setScreenY(camvert->camVertex.y * recipZ * height/2 + height/4); - scrvert->setScreenZ(recipZ * cam->zScale + cam->zShift); - scrvert->setCameraZ(camvert->camVertex.z); - scrvert->setRecipCameraZ(recipZ); - scrvert->setU(camvert->texCoords.u, recipZ); - scrvert->setV(camvert->texCoords.v, recipZ); - convColor(&col, &camvert->color); - scrvert->setColor(col.red, col.green, col.blue, col.alpha); -} - -static void -transform(MeshState *mstate, ObjSpace3DVertex *objverts, CamSpace3DVertex *camverts, Im2DVertex *scrverts) -{ - int32 i; - float32 z; - Camera *cam = (Camera*)engine->currentCamera; - - for(i = 0; i < mstate->numVertices; i++){ - V3d::transformPoints(&camverts[i].camVertex, &objverts[i].objVertex, 1, &mstate->obj2cam); - convColor(&camverts[i].color, &objverts[i].color); - camverts[i].texCoords = objverts[i].texCoords; - - camverts[i].clipFlags = 0; - z = camverts[i].camVertex.z; - // 0 < x < z - if(camverts[i].camVertex.x >= z) camverts[i].clipFlags |= CLIPXHI; - if(camverts[i].camVertex.x <= 0) camverts[i].clipFlags |= CLIPXLO; - // 0 < y < z - if(camverts[i].camVertex.y >= z) camverts[i].clipFlags |= CLIPYHI; - if(camverts[i].camVertex.y <= 0) camverts[i].clipFlags |= CLIPYLO; - // near < z < far - if(z >= cam->farPlane) camverts[i].clipFlags |= CLIPZHI; - if(z <= cam->nearPlane) camverts[i].clipFlags |= CLIPZLO; - - cam2screen(&scrverts[i], &camverts[i]); - } -} - -static void -light(MeshState *mstate, ObjSpace3DVertex *objverts, CamSpace3DVertex *camverts) -{ - int32 i; - RGBAf colf; - RGBAf amb = ambLight; - amb = scale(ambLight, mstate->surfProps.ambient); - for(i = 0; i < mstate->numVertices; i++){ - camverts[i].color = add(camverts[i].color, amb); - if((mstate->flags & Geometry::NORMALS) == 0) - continue; - for(int32 k = 0; k < numDirectionals; k++){ - float32 f = dot(objverts[i].objNormal, neg(directionals[k].at)); - if(f <= 0.0f) continue; - f *= mstate->surfProps.diffuse; - colf = scale(directionals[k].color, f); - camverts[i].color = add(camverts[i].color, colf); - } - } -} - -static void -postlight(MeshState *mstate, CamSpace3DVertex *camverts, Im2DVertex *scrverts) -{ - int32 i; - RGBA col; - RGBAf colf; - for(i = 0; i < mstate->numVertices; i++){ - convColor(&colf, &mstate->matCol); - camverts[i].color = modulate(camverts[i].color, colf); - clamp(&camverts[i].color); - convColor(&col, &camverts[i].color); - scrverts[i].setColor(col.red, col.green, col.blue, col.alpha); - } -} - -static int32 -cullTriangles(MeshState *mstate, CamSpace3DVertex *camverts, uint16 *indices, uint16 *clipindices) -{ - int32 i; - int32 x1, x2, x3; - int32 newNumPrims; - int32 numClip; - - newNumPrims = 0; - numClip = 0; - for(i = 0; i < mstate->numPrimitives; i++, indices += 3){ - x1 = indices[0]; - x2 = indices[1]; - x3 = indices[2]; - // Only a simple frustum call - if(camverts[x1].clipFlags & - camverts[x2].clipFlags & - camverts[x3].clipFlags) - continue; - if(camverts[x1].clipFlags | - camverts[x2].clipFlags | - camverts[x3].clipFlags) - numClip++; - // The Triangle is in, probably - clipindices[0] = x1; - clipindices[1] = x2; - clipindices[2] = x3; - clipindices += 3; - newNumPrims++; - } - mstate->numPrimitives = newNumPrims; - return numClip; -} - -static void -interpVertex(CamSpace3DVertex *out, CamSpace3DVertex *v1, CamSpace3DVertex *v2, float32 t) -{ - float32 z; - float32 invt; - Camera *cam = (Camera*)engine->currentCamera; - - invt = 1.0f - t; - out->camVertex = add(scale(v1->camVertex, invt), scale(v2->camVertex, t)); - out->color = add(scale(v1->color, invt), scale(v2->color, t)); - out->texCoords.u = v1->texCoords.u*invt + v2->texCoords.u*t; - out->texCoords.v = v1->texCoords.v*invt + v2->texCoords.v*t; - - out->clipFlags = 0; - z = out->camVertex.z; - // 0 < x < z - if(out->camVertex.x >= z) out->clipFlags |= CLIPXHI; - if(out->camVertex.x <= 0) out->clipFlags |= CLIPXLO; - // 0 < y < z - if(out->camVertex.y >= z) out->clipFlags |= CLIPYHI; - if(out->camVertex.y <= 0) out->clipFlags |= CLIPYLO; - // near < z < far - if(z >= cam->farPlane) out->clipFlags |= CLIPZHI; - if(z <= cam->nearPlane) out->clipFlags |= CLIPZLO; -} - -static void -clipTriangles(MeshState *mstate, CamSpace3DVertex *camverts, Im2DVertex *scrverts, uint16 *indices, uint16 *clipindices) -{ - int32 i, j; - int32 x1, x2, x3; - int32 newNumPrims; - CamSpace3DVertex buf[18]; - CamSpace3DVertex *in, *out, *tmp; - int32 nin, nout; - float32 t; - Camera *cam = (Camera*)engine->currentCamera; - - newNumPrims = 0; - for(i = 0; i < mstate->numPrimitives; i++, indices += 3){ - x1 = indices[0]; - x2 = indices[1]; - x3 = indices[2]; - - if((camverts[x1].clipFlags | - camverts[x2].clipFlags | - camverts[x3].clipFlags) == 0){ - // all inside - clipindices[0] = x1; - clipindices[1] = x2; - clipindices[2] = x3; - clipindices += 3; - newNumPrims++; - continue; - } - - // set up triangle - in = &buf[0]; - out = &buf[9]; - in[0] = camverts[x1]; - in[1] = camverts[x2]; - in[2] = camverts[x3]; - nin = 3; - nout = 0; - -#define V(a) in[a].camVertex. - - // clip z near - for(j = 0; j < nin; j++){ - x1 = j; - x2 = (j+1) % nin; - if((in[x1].clipFlags ^ in[x2].clipFlags) & CLIPZLO){ - t = (cam->nearPlane - V(x1)z)/(V(x2)z - V(x1)z); - interpVertex(&out[nout++], &in[x1], &in[x2], t); - } - if((in[x2].clipFlags & CLIPZLO) == 0) - out[nout++] = in[x2]; - } - // clip z far - nin = nout; nout = 0; - tmp = in; in = out; out = tmp; - for(j = 0; j < nin; j++){ - x1 = j; - x2 = (j+1) % nin; - if((in[x1].clipFlags ^ in[x2].clipFlags) & CLIPZHI){ - t = (cam->farPlane - V(x1)z)/(V(x2)z - V(x1)z); - interpVertex(&out[nout++], &in[x1], &in[x2], t); - } - if((in[x2].clipFlags & CLIPZHI) == 0) - out[nout++] = in[x2]; - } - // clip y 0 - nin = nout; nout = 0; - tmp = in; in = out; out = tmp; - for(j = 0; j < nin; j++){ - x1 = j; - x2 = (j+1) % nin; - if((in[x1].clipFlags ^ in[x2].clipFlags) & CLIPYLO){ - t = -V(x1)y/(V(x2)y - V(x1)y); - interpVertex(&out[nout++], &in[x1], &in[x2], t); - } - if((in[x2].clipFlags & CLIPYLO) == 0) - out[nout++] = in[x2]; - } - // clip y z - nin = nout; nout = 0; - tmp = in; in = out; out = tmp; - for(j = 0; j < nin; j++){ - x1 = j; - x2 = (j+1) % nin; - if((in[x1].clipFlags ^ in[x2].clipFlags) & CLIPYHI){ - t = (V(x1)z - V(x1)y)/(V(x1)z - V(x1)y + V(x2)y - V(x2)z); - interpVertex(&out[nout++], &in[x1], &in[x2], t); - } - if((in[x2].clipFlags & CLIPYHI) == 0) - out[nout++] = in[x2]; - } - // clip x 0 - nin = nout; nout = 0; - tmp = in; in = out; out = tmp; - for(j = 0; j < nin; j++){ - x1 = j; - x2 = (j+1) % nin; - if((in[x1].clipFlags ^ in[x2].clipFlags) & CLIPXLO){ - t = -V(x1)x/(V(x2)x - V(x1)x); - interpVertex(&out[nout++], &in[x1], &in[x2], t); - } - if((in[x2].clipFlags & CLIPXLO) == 0) - out[nout++] = in[x2]; - } - // clip x z - nin = nout; nout = 0; - tmp = in; in = out; out = tmp; - for(j = 0; j < nin; j++){ - x1 = j; - x2 = (j+1) % nin; - if((in[x1].clipFlags ^ in[x2].clipFlags) & CLIPXHI){ - t = (V(x1)z - V(x1)x)/(V(x1)z - V(x1)x + V(x2)x - V(x2)z); - interpVertex(&out[nout++], &in[x1], &in[x2], t); - } - if((in[x2].clipFlags & CLIPXHI) == 0) - out[nout++] = in[x2]; - } - - // Insert new triangles - x1 = mstate->numVertices; - for(j = 0; j < nout; j++){ - x2 = mstate->numVertices++; - camverts[x2] = out[j]; - cam2screen(&scrverts[x2], &camverts[x2]); - } - x2 = x1+1; - for(j = 0; j < nout-2; j++){ - clipindices[0] = x1; - clipindices[1] = x2++; - clipindices[2] = x2; - clipindices += 3; - newNumPrims++; - } - } - mstate->numPrimitives = newNumPrims; -} - -static int32 -clipPoly(CamSpace3DVertex *in, int32 nin, CamSpace3DVertex *out, Plane *plane) -{ - int32 j; - int32 nout; - int32 x1, x2; - float32 d1, d2, t; - - nout = 0; - for(j = 0; j < nin; j++){ - x1 = j; - x2 = (j+1) % nin; - - d1 = dot(plane->normal, in[x1].camVertex) + plane->distance; - d2 = dot(plane->normal, in[x2].camVertex) + plane->distance; - if(d1*d2 < 0.0f){ - t = d1/(d1 - d2); - interpVertex(&out[nout++], &in[x1], &in[x2], t); - } - if(d2 >= 0.0f) - out[nout++] = in[x2]; - } - return nout; -} - -static void -clipTriangles2(MeshState *mstate, CamSpace3DVertex *camverts, Im2DVertex *scrverts, uint16 *indices, uint16 *clipindices) -{ - int32 i, j; - int32 x1, x2, x3; - int32 newNumPrims; - CamSpace3DVertex buf[18]; - CamSpace3DVertex *in, *out; - int32 nout; - Camera *cam = (Camera*)engine->currentCamera; - - Plane planes[6] = { - { { 0.0f, 0.0f, 1.0f }, -cam->nearPlane }, // z = near - { { 0.0f, 0.0f, -1.0f }, cam->farPlane }, // z = far - - { { -1.0f, 0.0f, 1.0f }, 0.0f }, // x = w -// { { 1.0f, 0.0f, 1.0f }, 0.0f }, // x = -w - { { 1.0f, 0.0f, 0.0f }, 0.0f }, // x = 0 - - { { 0.0f, -1.0f, 1.0f }, 0.0f }, // y = w -// { { 0.0f, 1.0f, 1.0f }, 0.0f } // y = -1 - { { 0.0f, 1.0f, 0.0f }, 0.0f } // y = 0 - }; - - newNumPrims = 0; - for(i = 0; i < mstate->numPrimitives; i++, indices += 3){ - x1 = indices[0]; - x2 = indices[1]; - x3 = indices[2]; - - if((camverts[x1].clipFlags | - camverts[x2].clipFlags | - camverts[x3].clipFlags) == 0){ - // all inside - clipindices[0] = x1; - clipindices[1] = x2; - clipindices[2] = x3; - clipindices += 3; - newNumPrims++; - continue; - } - - // set up triangle - in = &buf[0]; - out = &buf[9]; - in[0] = camverts[x1]; - in[1] = camverts[x2]; - in[2] = camverts[x3]; - nout = 0; - - // clip here - if(nout = clipPoly(in, 3, out, &planes[0]), nout == 0) continue; - if(nout = clipPoly(out, nout, in, &planes[1]), nout == 0) continue; - if(nout = clipPoly(in, nout, out, &planes[2]), nout == 0) continue; - if(nout = clipPoly(out, nout, in, &planes[3]), nout == 0) continue; - if(nout = clipPoly(in, nout, out, &planes[4]), nout == 0) continue; - if(nout = clipPoly(out, nout, in, &planes[5]), nout == 0) continue; - out = in; - - // Insert new triangles - x1 = mstate->numVertices; - for(j = 0; j < nout; j++){ - x2 = mstate->numVertices++; - camverts[x2] = out[j]; - cam2screen(&scrverts[x2], &camverts[x2]); - } - x2 = x1+1; - for(j = 0; j < nout-2; j++){ - clipindices[0] = x1; - clipindices[1] = x2++; - clipindices[2] = x2; - clipindices += 3; - newNumPrims++; - } - } - mstate->numPrimitives = newNumPrims; -} - -static void -submitTriangles(RWDEVICE::Im2DVertex *scrverts, int32 numVerts, uint16 *indices, int32 numTris) -{ - rw::SetRenderStatePtr(rw::TEXTURERASTER, nil); - if(dosoftras) - rastest_renderTriangles(scrverts, numVerts, indices, numTris); - else{ - //int i; - //for(i = 0; i < numVerts; i++){ - // scrverts[i].x = (int)(scrverts[i].x*16.0f) / 16.0f; - // scrverts[i].y = (int)(scrverts[i].y*16.0f) / 16.0f; - //} - im2d::RenderIndexedPrimitive(rw::PRIMTYPETRILIST, scrverts, numVerts, - indices, numTris*3); - } -} - - -static void -drawMesh(MeshState *mstate, ObjSpace3DVertex *objverts, uint16 *indices) -{ - CamSpace3DVertex *camverts; - Im2DVertex *scrverts; - uint16 *cullindices, *clipindices; - uint32 numClip; - - camverts = rwNewT(CamSpace3DVertex, mstate->numVertices, MEMDUR_FUNCTION); - scrverts = rwNewT(Im2DVertex, mstate->numVertices, MEMDUR_FUNCTION); - cullindices = rwNewT(uint16, mstate->numPrimitives*3, MEMDUR_FUNCTION); - - transform(mstate, objverts, camverts, scrverts); - - numClip = cullTriangles(mstate, camverts, indices, cullindices); - -// int32 i; -// for(i = 0; i < mstate->numVertices; i++){ -// if(camverts[i].clipFlags & CLIPX) -// camverts[i].color.red = 255; -// if(camverts[i].clipFlags & CLIPY) -// camverts[i].color.green = 255; -// if(camverts[i].clipFlags & CLIPZ) -// camverts[i].color.blue = 255; -// } - - light(mstate, objverts, camverts); - -// mstate->matCol.red = 255; -// mstate->matCol.green = 255; -// mstate->matCol.blue = 255; - - postlight(mstate, camverts, scrverts); - - // each triangle can have a maximum of 9 vertices (7 triangles) after clipping - // so resize to whatever we may need - camverts = rwResizeT(CamSpace3DVertex, camverts, mstate->numVertices + numClip*9, MEMDUR_FUNCTION); - scrverts = rwResizeT(Im2DVertex, scrverts, mstate->numVertices + numClip*9, MEMDUR_FUNCTION); - clipindices = rwNewT(uint16, mstate->numPrimitives*3 + numClip*7*3, MEMDUR_FUNCTION); - -// clipTriangles(mstate, camverts, scrverts, cullindices, clipindices); - clipTriangles2(mstate, camverts, scrverts, cullindices, clipindices); - - submitTriangles(scrverts, mstate->numVertices, clipindices, mstate->numPrimitives); - - rwFree(camverts); - rwFree(scrverts); - rwFree(cullindices); - rwFree(clipindices); -} - -static void -drawAtomic(Atomic *atomic) -{ - MeshState mstate; - Matrix lightmat; - Geometry *geo; - MeshHeader *header; - InstanceData *inst; - int i; - Camera *cam = (Camera*)engine->currentCamera; - - instanceAtomic(atomic); - - mstate.obj2world = *atomic->getFrame()->getLTM(); - mstate.obj2cam = mstate.obj2world; - mstate.obj2cam.transform(&cam->viewMatrix, COMBINEPOSTCONCAT); - Matrix::invert(&lightmat, &mstate.obj2world); - enumLights(&lightmat); - - geo = atomic->geometry; - header = geo->meshHeader; - inst = ((InstanceDataHeader*)geo->instData)->inst; - for(i = 0; i < header->numMeshes; i++){ - mstate.flags = geo->flags; - mstate.numVertices = inst->numVertices; - mstate.numPrimitives = inst->numIndices / 3; - mstate.surfProps = inst->material->surfaceProps; - mstate.matCol = inst->material->color; - drawMesh(&mstate, inst->vertices, inst->indices); - inst++; - } -} - -void -tlTest(Clump *clump) -{ - FORLIST(lnk, clump->atomics){ - Atomic *a = Atomic::fromClump(lnk); - drawAtomic(a); - } -} - -} - -static Im2DVertex *clipverts; -static int32 numClipverts; - -void -genIm3DTransform(void *vertices, int32 numVertices, Matrix *world) -{ - Im3DVertex *objverts; - V3d pos; - Matrix xform; - Camera *cam; - int32 i; - objverts = (Im3DVertex*)vertices; - - cam = (Camera*)engine->currentCamera; - int32 width = cam->frameBuffer->width; - int32 height = cam->frameBuffer->height; - - - xform = cam->viewMatrix; - if(world) - xform.transform(world, COMBINEPRECONCAT); - - clipverts = rwNewT(Im2DVertex, numVertices, MEMDUR_EVENT); - numClipverts = numVertices; - - for(i = 0; i < numVertices; i++){ - V3d::transformPoints(&pos, &objverts[i].position, 1, &xform); - - float32 recipZ = 1.0f/pos.z; - RGBA c = objverts[i].getColor(); - - clipverts[i].setScreenX(pos.x * recipZ * width); - clipverts[i].setScreenY(pos.y * recipZ * height); - clipverts[i].setScreenZ(recipZ * cam->zScale + cam->zShift); - clipverts[i].setCameraZ(pos.z); - clipverts[i].setRecipCameraZ(recipZ); - clipverts[i].setColor(c.red, c.green, c.blue, c.alpha); - clipverts[i].setU(objverts[i].u, recipZ); - clipverts[i].setV(objverts[i].v, recipZ); - } -} - -void -genIm3DRenderIndexed(PrimitiveType prim, void *indices, int32 numIndices) -{ - im2d::RenderIndexedPrimitive(prim, clipverts, numClipverts, indices, numIndices); -} - -void -genIm3DEnd(void) -{ - rwFree(clipverts); - clipverts = nil; - numClipverts = 0; -} diff --git a/vendor/librw/tools/ps2test/CMakeLists.txt b/vendor/librw/tools/ps2test/CMakeLists.txt deleted file mode 100644 index 9ed4260..0000000 --- a/vendor/librw/tools/ps2test/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -add_executable(ps2test - gs.h - main.cpp - mem.h - ps2.h - vu/defaultpipe.dsm - vu/skinpipe.dsm -) - -target_link_libraries(ps2test - PUBLIC - librw - kernel -) - -add_erl_executable(PS2TEST_ERL ps2test) - -if(LIBRW_INSTALL) - install(TARGETS ps2test - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - ) - install(FILES "${PS2TEST_ERL}" - DESTINATION "${CMAKE_INSTALL_BINDIR}" - ) -endif() diff --git a/vendor/librw/tools/ps2test/gs.h b/vendor/librw/tools/ps2test/gs.h deleted file mode 100644 index 361ad8c..0000000 --- a/vendor/librw/tools/ps2test/gs.h +++ /dev/null @@ -1,437 +0,0 @@ -#define GS_NONINTERLACED 0 -#define GS_INTERLACED 1 - -#define GS_NTSC 2 -#define GS_PAL 3 -#define GS_VESA1A 0x1a -#define GS_VESA1B 0x1b -#define GS_VESA1C 0x1c -#define GS_VESA1D 0x1d -#define GS_VESA2A 0x2a -#define GS_VESA2B 0x2b -#define GS_VESA2C 0x2c -#define GS_VESA2D 0x2d -#define GS_VESA2E 0x2e -#define GS_VESA3B 0x3b -#define GS_VESA3C 0x3c -#define GS_VESA3D 0x3d -#define GS_VESA3E 0x3e -#define GS_VESA4A 0x4a -#define GS_VESA4B 0x4b -#define GS_DTV480P 0x50 - -#define GS_FIELD 0 -#define GS_FRAME 1 - -#define GS_PSMCT32 0 -#define GS_PSMCT24 1 -#define GS_PSMCT16 2 -#define GS_PSMCT16S 10 -#define GS_PS_GPU24 18 - -#define GS_PSMZ32 0 -#define GS_PSMZ24 1 -#define GS_PSMZ16 2 -#define GS_PSMZ16S 10 - -#define GS_ZTST_NEVER 0 -#define GS_ZTST_ALWAYS 1 -#define GS_ZTST_GREATER 2 -#define GS_ZTST_GEQUAL 3 - -#define GS_PRIM_POINT 0 -#define GS_PRIM_LINE 1 -#define GS_PRIM_LINE_STRIP 2 -#define GS_PRIM_TRI 3 -#define GS_PRIM_TRI_STRIP 4 -#define GS_PRIM_TRI_FAN 5 -#define GS_PRIM_SPRITE 6 -#define GS_PRIM_NO_SPEC 7 -#define GS_IIP_FLAT 0 -#define GS_IIP_GOURAUD 1 - -/* GS general purpose registers */ - -#define GS_PRIM 0x00 -#define GS_RGBAQ 0x01 -#define GS_ST 0x02 -#define GS_UV 0x03 -#define GS_XYZF2 0x04 -#define GS_XYZ2 0x05 -#define GS_TEX0_1 0x06 -#define GS_TEX0_2 0x07 -#define GS_CLAMP_1 0x08 -#define GS_CLAMP_2 0x09 -#define GS_FOG 0x0a -#define GS_XYZF3 0x0c -#define GS_XYZ3 0x0d -#define GS_TEX1_1 0x14 -#define GS_TEX1_2 0x15 -#define GS_TEX2_1 0x16 -#define GS_TEX2_2 0x17 -#define GS_XYOFFSET_1 0x18 -#define GS_XYOFFSET_2 0x19 -#define GS_PRMODECONT 0x1a -#define GS_PRMODE 0x1b -#define GS_TEXCLUT 0x1c -#define GS_SCANMSK 0x22 -#define GS_MIPTBP1_1 0x34 -#define GS_MIPTBP1_2 0x35 -#define GS_MIPTBP2_1 0x36 -#define GS_MIPTBP2_2 0x37 -#define GS_TEXA 0x3b -#define GS_FOGCOL 0x3d -#define GS_TEXFLUSH 0x3f -#define GS_SCISSOR_1 0x40 -#define GS_SCISSOR_2 0x41 -#define GS_ALPHA_1 0x42 -#define GS_ALPHA_2 0x43 -#define GS_DIMX 0x44 -#define GS_DTHE 0x45 -#define GS_COLCLAMP 0x46 -#define GS_TEST_1 0x47 -#define GS_TEST_2 0x48 -#define GS_PABE 0x49 -#define GS_FBA_1 0x4a -#define GS_FBA_2 0x4b -#define GS_FRAME_1 0x4c -#define GS_FRAME_2 0x4d -#define GS_ZBUF_1 0x4e -#define GS_ZBUF_2 0x4f -#define GS_BITBLTBUF 0x50 -#define GS_TRXPOS 0x51 -#define GS_TRXREG 0x52 -#define GS_TRXDIR 0x53 -#define GS_HWREG 0x54 -#define GS_SIGNAL 0x60 -#define GS_FINISH 0x61 -#define GS_LABEL 0x62 - -typedef union -{ - struct { - uint64 EN1 : 1; - uint64 EN2 : 1; - uint64 CRTMD : 3; - uint64 MMOD : 1; - uint64 AMOD : 1; - uint64 SLBG : 1; - uint64 ALP : 8; - } f; - uint64 d; -} GsPmode; - -#define GS_MAKE_PMODE(EN1,EN2,MMOD,AMOD,SLBG,ALP) \ - (BIT64(EN1,0) | BIT64(EN2,1) | BIT64(1,2) | \ - BIT64(MMOD,5) | BIT64(AMOD,6) | BIT64(SLBG,7) | BIT64(ALP,8)) - -typedef union -{ - struct { - uint64 INT : 1; - uint64 FFMD : 1; - uint64 DPMS : 2; - } f; - uint64 d; -} GsSmode2; - -#define GS_MAKE_SMODE2(INT,FFMD,DPMS) \ - (BIT64(INT,0) | BIT64(FFMD,1) | BIT64(DPMS,2)) - -typedef union -{ - struct { - uint64 FBP : 9; - uint64 FBW : 6; - uint64 PSM : 5; - uint64 : 12; - uint64 DBX : 11; - uint64 DBY : 11; - } f; - uint64 d; -} GsDispfb; - -#define GS_MAKE_DISPFB(FBP,FBW,PSM,DBX,DBY) \ - (BIT64(FBP,0) | BIT64(FBW,9) | BIT64(PSM,15) | \ - BIT64(DBX,32) | BIT64(DBY,43)) - -typedef union -{ - struct { - uint64 DX : 12; - uint64 DY : 11; - uint64 MAGH : 4; - uint64 MAGV : 2; - uint64 : 3; - uint64 DW : 12; - uint64 DH : 11; - } f; - uint64 d; -} GsDisplay; - -#define GS_MAKE_DISPLAY(DX,DY,MAGH,MAGV,DW,DH) \ - (BIT64(DX,0) | BIT64(DY,12) | BIT64(MAGH,23) | \ - BIT64(MAGV,27) | BIT64(DW,32) | BIT64(DH,44)) - -typedef union -{ - struct { - uint64 EXBP : 14; - uint64 EXBW : 6; - uint64 FBIN : 2; - uint64 WFFMD : 1; - uint64 EMODA : 2; - uint64 EMODC : 2; - uint64 : 5; - uint64 WDX : 11; - uint64 WDY : 11; - } f; - uint64 d; -} GsExtbuf; - -#define GS_MAKE_EXTBUF(EXBP,EXBW,FBIN,WFFMD,EMODA,EMODC,WDX,WDY) \ - (BIT64(EXBP,0) | BIT64(EXBW,14) | BIT64(FBIN,20) | \ - BIT64(WFFMD,22) | BIT64(EMODA,23) | BIT64(EMODC,25) | \ - BIT64(WDX,32) | BIT64(WDY,43)) - -typedef union -{ - struct { - uint64 SX : 12; - uint64 SY : 11; - uint64 SMPH : 4; - uint64 SMPV : 2; - uint64 : 3; - uint64 WW : 12; - uint64 WH : 11; - } f; - uint64 d; -} GsExtdata; - -#define GS_MAKE_EXTDATA(SX,SY,SMPH,SMPV,WW,WH) \ - (BIT64(SX,0) | BIT64(SY,12) | BIT64(SMPH,23) | \ - BIT64(SMPV,27) | BIT64(WW,32) | BIT64(WH,44)) - -typedef union -{ - struct { - uint64 WRITE : 1; - } f; - uint64 d; -} GsExtwrite; - -typedef union -{ - struct { - uint64 R : 8; - uint64 G : 8; - uint64 B : 8; - } f; - uint64 d; -} GsBgcolor; - -#define GS_MAKE_BGCOLOR(R,G,B) \ - (BIT64(R,0) | BIT64(G,8) | BIT64(B,16)) - -typedef union -{ - struct { - uint64 SIGNAL : 1; - uint64 FINISH : 1; - uint64 HSINT : 1; - uint64 VSINT : 1; - uint64 EDWINT : 1; - uint64 : 3; - uint64 FLUSH : 1; - uint64 RESET : 1; - uint64 : 2; - uint64 NFIELD : 1; - uint64 FIELD : 1; - uint64 FIFO : 2; - uint64 REV : 8; - uint64 ID : 8; - } f; - uint64 d; -} GsCsr; - -#define GS_CSR_SIGNAL_O 0 -#define GS_CSR_FINISH_O 1 -#define GS_CSR_HSINT_O 2 -#define GS_CSR_VSINT_O 3 -#define GS_CSR_EDWINT_O 4 -#define GS_CSR_FLUSH_O 8 -#define GS_CSR_RESET_O 9 -#define GS_CSR_NFIELD_O 12 -#define GS_CSR_FIELD_O 13 -#define GS_CSR_FIFO_O 14 -#define GS_CSR_REV_O 16 -#define GS_CSR_ID_O 24 - -typedef union -{ - struct { - uint64 : 8; - uint64 SIGMSK : 1; - uint64 FINISHMSK : 1; - uint64 HSMSKMSK : 1; - uint64 VSMSKMSK : 1; - uint64 EDWMSKMSK : 1; - } f; - uint64 d; -} GsImr; - -typedef union -{ - struct { - uint64 DIR : 1; - } f; - uint64 d; -} GsBusdir; - -typedef union -{ - struct { - uint64 SIGID : 32; - uint64 LBLID : 32; - } f; - uint64 d; -} GsSiglblid; - - -typedef union -{ - struct { - uint64 FBP : 9; - uint64 : 7; - uint64 FBW : 6; - uint64 : 2; - uint64 PSM : 6; - uint64 : 2; - uint64 FBMSK : 32; - } f; - uint64 d; -} GsFrame; - -#define GS_MAKE_FRAME(FBP,FBW,PSM,FBMASK) \ - (BIT64(FBP,0) | BIT64(FBW,16) | BIT64(PSM,24) | BIT64(FBMASK,32)) - -typedef union -{ - struct { - uint64 ZBP : 9; - uint64 : 15; - uint64 PSM : 4; - uint64 : 4; - uint64 ZMSDK : 1; - } f; - uint64 d; -} GsZbuf; - -#define GS_MAKE_ZBUF(ZBP,PSM,ZMSK) \ - (BIT64(ZBP,0) | BIT64(PSM,24) | BIT64(ZMSK,32)) - -typedef union -{ - struct { - uint64 OFX : 16; - uint64 : 16; - uint64 OFY : 16; - } f; - uint64 d; -} GsXyOffset; - -#define GS_MAKE_XYOFFSET(OFX,OFY) \ - (BIT64(OFX,0) | BIT64(OFY,32)) - -typedef union -{ - struct { - uint64 SCAX0 : 11; - uint64 : 5; - uint64 SCAX1 : 11; - uint64 : 5; - uint64 SCAY0 : 11; - uint64 : 5; - uint64 SCAY1 : 11; - } f; - uint64 d; -} GsScissor; - -#define GS_MAKE_SCISSOR(SCAX0,SCAX1,SCAY0,SCAY1) \ - (BIT64(SCAX0,0) | BIT64(SCAX1,16) | BIT64(SCAY0,32) | BIT64(SCAY1,48)) - -#define GS_MAKE_TEST(ATE,ATST,AREF,AFAIL,DATE,DATM,ZTE,ZTST) \ - (BIT64(ATE,0) | BIT64(ATST,1) | BIT64(AREF,4) | BIT64(AFAIL,12) | \ - BIT64(DATE,14) | BIT64(DATM,15) | BIT64(ZTE,16) | BIT64(ZTST,17)) - -#define GS_MAKE_PRIM(PRIM,IIP,TME,FGE,ABE,AA1,FST,CTXT,FIX) \ - (BIT64(PRIM,0) | BIT64(IIP,3) | BIT64(TME,4) | BIT64(FGE,5) | \ - BIT64(ABE,6) | BIT64(AA1,7) | BIT64(FST,8) | BIT64(CTXT,9) | BIT64(FIX,10)) - -#define GS_MAKE_RGBAQ(R,G,B,A,Q) \ - (BIT64(R,0) | BIT64(G,8) | BIT64(B,16) | BIT64(A,24) | BIT64(Q,32)) - -#define GS_MAKE_XYZ(X,Y,Z) \ - (BIT64(X,0) | BIT64(Y,16) | BIT64(Z,32)) - -#define GIF_PACKED 0 -#define GIF_REGLIST 1 -#define GIF_IMAGE 2 - -#define GIF_MAKE_TAG(NLOOP,EOP,PRE,PRIM,FLG,NREG) \ - (BIT64(NLOOP,0) | BIT64(EOP,15) | BIT64(PRE,46) | \ - BIT64(PRIM,47) | BIT64(FLG,58) | BIT64(NREG,60)) - -/* This is global and not tied to a user context because - * it is set up by kernel functions and not really changed - * afterwards. */ -typedef struct GsCrtState GsCrtState; -struct GsCrtState -{ - short inter, mode, ff; -}; -extern GsCrtState gsCrtState; - -typedef struct GsDispCtx GsDispCtx; -struct GsDispCtx -{ - // two circuits - GsPmode pmode; - GsDispfb dispfb1; - GsDispfb dispfb2; - GsDisplay display1; - GsDisplay display2; - GsBgcolor bgcolor; -}; - -typedef struct GsDrawCtx GsDrawCtx; -struct GsDrawCtx -{ - //two contexts - uint128 gifTag; - GsFrame frame1; - uint64 ad_frame1; - GsFrame frame2; - uint64 ad_frame2; - GsZbuf zbuf1; - uint64 ad_zbuf1; - GsZbuf zbuf2; - uint64 ad_zbuf2; - GsXyOffset xyoffset1; - uint64 ad_xyoffset1; - GsXyOffset xyoffset2; - uint64 ad_xyoffset2; - GsScissor scissor1; - uint64 ad_scissor1; - GsScissor scissor2; - uint64 ad_scissor2; -}; - -typedef struct GsCtx GsCtx; -struct GsCtx -{ - // display context; two buffers - GsDispCtx disp[2]; - // draw context; two buffers - GsDrawCtx draw[2]; -}; diff --git a/vendor/librw/tools/ps2test/main.cpp b/vendor/librw/tools/ps2test/main.cpp deleted file mode 100755 index 5e58558..0000000 --- a/vendor/librw/tools/ps2test/main.cpp +++ /dev/null @@ -1,787 +0,0 @@ -#include -#include - -#define PAL - -#include -using rw::uint8; -using rw::uint16; -using rw::uint32; -using rw::uint64; -using rw::int8; -using rw::int16; -using rw::int32; -using rw::int64; -using rw::bool32; -using rw::float32; -typedef uint8 uchar; -typedef uint16 ushort; -typedef uint32 uint; - -#define WIDTH 640 -#ifdef PAL -#define HEIGHT 512 -#define VMODE GS_PAL -#else -#define HEIGHT 448 -#define VMODE GS_NTSC -#endif - -#include "ps2.h" - -// getting undefined references otherwise :/ -int *__errno() { return &errno; } - -// NONINTERLACED and FRAME have half of the FIELD vertical resolution! -// NONINTERLACED has half the vertical units - -uint128 packetbuf[128]; -uint128 vuXYZScale; -uint128 vuXYZOffset; -extern uint32 geometryCall[]; -extern uint32 skinPipe[]; - -uint128 *curVifPtr; -uint128 lightpacket[128]; -int32 numLightQ; - - - -rw::World *world; -rw::Camera *camera; - - -int frames; - -void -printquad(uint128 p) -{ - uint64 *lp; - lp = (uint64*)&p; - printf("%016lx %016lx\n", lp[1], lp[0]); -} - -void -printquad4(uint128 p) -{ - uint32 *lp; - lp = (uint32*)&p; - printf("%08x %08x %08x %08x\n", lp[0], lp[1], lp[2], lp[3]); -} - -void -dump4(uint128 *p, int n) -{ -printf("data at %p\n", p); - while(n--) - printquad4(*p++); -} - -struct DmaChannel { - uint32 chcr; uint32 pad0[3]; - uint32 madr; uint32 pad1[3]; - uint32 qwc; uint32 pad2[3]; - uint32 tadr; uint32 pad3[3]; - uint32 asr0; uint32 pad4[3]; - uint32 asr1; uint32 pad5[3]; - uint32 pad6[8]; - uint32 sadr; -}; - -static struct DmaChannel *dmaChannels[] = { - (struct DmaChannel *) &D0_CHCR, - (struct DmaChannel *) &D1_CHCR, - (struct DmaChannel *) &D2_CHCR, - (struct DmaChannel *) &D3_CHCR, - (struct DmaChannel *) &D4_CHCR, - (struct DmaChannel *) &D5_CHCR, - (struct DmaChannel *) &D6_CHCR, - (struct DmaChannel *) &D7_CHCR, - (struct DmaChannel *) &D8_CHCR, - (struct DmaChannel *) &D9_CHCR -}; - -void -dmaReset(void) -{ - /* don't clear the SIF channels */ - int doclear[] = { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1 }; - int i; - - D_CTRL = 0; - for(i = 0; i < 10; i++) - if(doclear[i]){ - dmaChannels[i]->chcr = 0; - dmaChannels[i]->madr = 0; - dmaChannels[i]->qwc = 0; - dmaChannels[i]->tadr = 0; - dmaChannels[i]->asr0 = 0; - dmaChannels[i]->asr1 = 0; - dmaChannels[i]->sadr = 0; - } - D_CTRL = 1; -} - -void -waitDMA(volatile uint32 *chcr) -{ - while(*chcr & (1<<8)); -} - -void -qwcpy(uint128 *dst, uint128 *src, int n) -{ - while(n--) *dst++ = *src++; -} - -void -toGIF(void *src, int n) -{ - FlushCache(0); - D2_QWC = n; - D2_MADR = (uint32)src; - D2_CHCR = 1<<8; - waitDMA(&D2_CHCR); -} - -void -toGIFchain(void *src) -{ - FlushCache(0); - D2_QWC = 0; - D2_TADR = (uint32)src & 0x0FFFFFFF; - D2_CHCR = 1<<0 | 1<<2 | 1<<6 | 1<<8; - waitDMA(&D2_CHCR); -} - -void -toVIF1chain(void *src) -{ - FlushCache(0); - D1_QWC = 0; - D1_TADR = (uint32)src & 0x0FFFFFFF; - D1_CHCR = 1<<0 | 1<<2 | 1<<6 | 1<<8; - waitDMA(&D1_CHCR); -} - - -GsCrtState gsCrtState; - -int psmsizemap[64] = { - 4, // GS_PSMCT32 - 4, // GS_PSMCT24 - 2, // GS_PSMCT16 - 0, 0, 0, 0, 0, 0, 0, - 2, // GS_PSMCT16S - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, // GS_PSMZ32 - 4, // GS_PSMZ24 - 2, // GS_PSMZ16 - 2, // GS_PSMZ16S - 0, 0, 0, 0, 0 -}; - -void -GsResetCrt(uchar inter, uchar mode, uchar ff) -{ - gsCrtState.inter = inter; - gsCrtState.mode = mode; - gsCrtState.ff = ff; - GS_CSR = 1 << GS_CSR_RESET_O; - __asm__("sync.p; nop"); - GsPutIMR(0xff00); - SetGsCrt(gsCrtState.inter, gsCrtState.mode, gsCrtState.ff); -} - -uint gsAllocPtr = 0; - -void -GsInitDispCtx(GsDispCtx *disp, int width, int height, int psm) -{ - int magh, magv; - int dx, dy; - int dw, dh; - - dx = gsCrtState.mode == GS_NTSC ? 636 : 656; - dy = gsCrtState.mode == GS_NTSC ? 25 : 36; - magh = 2560/width - 1; - magv = 0; - dw = 2560-1; - dh = height-1; - - if(gsCrtState.inter == GS_INTERLACED){ - dy *= 2; - if(gsCrtState.ff == GS_FRAME) - dh = (dh+1)*2-1; - } - - disp->pmode.d = GS_MAKE_PMODE(0, 1, 1, 1, 0, 0x00); -// disp->bgcolor.d = 0x404040; - disp->bgcolor.d = 0x000000; - disp->dispfb1.d = 0; - disp->dispfb2.d = GS_MAKE_DISPFB(0, width/64, psm, 0, 0); - disp->display1.d = 0; - disp->display2.d = GS_MAKE_DISPLAY(dx, dy, magh, magv, dw, dh); -} - -void -GsPutDispCtx(GsDispCtx *disp) -{ - GS_PMODE = disp->pmode.d; - GS_DISPFB1 = disp->dispfb1.d; - GS_DISPLAY1 = disp->display1.d; - GS_DISPFB2 = disp->dispfb2.d; - GS_DISPLAY2 = disp->display2.d; - GS_BGCOLOR = disp->bgcolor.d; -} - -void -GsInitDrawCtx(GsDrawCtx *draw, int width, int height, int psm, int zpsm) -{ - MAKE128(draw->gifTag, 0xe, - GIF_MAKE_TAG(8, 1, 0, 0, GIF_PACKED, 1)); - draw->frame1.d = GS_MAKE_FRAME(0, width/64, psm, 0); - draw->ad_frame1 = GS_FRAME_1; - draw->frame2.d = draw->frame1.d; - draw->ad_frame2 = GS_FRAME_2; - draw->zbuf1.d = GS_MAKE_ZBUF(0, zpsm, 0); - draw->ad_zbuf1 = GS_ZBUF_1; - draw->zbuf2.d = draw->zbuf1.d; - draw->ad_zbuf2 = GS_ZBUF_2; - draw->xyoffset1.d = GS_MAKE_XYOFFSET(2048<<4, 2048<<4); - draw->ad_xyoffset1 = GS_XYOFFSET_1; - draw->xyoffset2.d = draw->xyoffset1.d; - draw->ad_xyoffset2 = GS_XYOFFSET_2; - draw->scissor1.d = GS_MAKE_SCISSOR(0, width-1, 0, height-1); - draw->ad_scissor1 = GS_SCISSOR_1; - draw->scissor2.d = draw->scissor1.d; - draw->ad_scissor2 = GS_SCISSOR_2; -} - -void -GsPutDrawCtx(GsDrawCtx *draw) -{ -// printquad(*(uint128*)&draw->frame1); - toGIF(draw, 9); -} - -void -GsInitCtx(GsCtx *ctx, int width, int height, int psm, int zpsm) -{ - uint fbsz, zbsz; - uint fbp, zbp; - fbsz = (width*height*psmsizemap[psm] + 2047)/2048; - zbsz = (width*height*psmsizemap[0x30|zpsm] + 2047)/2048; - gsAllocPtr = 2*fbsz + zbsz; - fbp = fbsz; - zbp = fbsz*2; - - GsInitDispCtx(&ctx->disp[0], width, height, psm); - GsInitDispCtx(&ctx->disp[1], width, height, psm); - GsInitDrawCtx(&ctx->draw[0], width, height, psm, zpsm); - GsInitDrawCtx(&ctx->draw[1], width, height, psm, zpsm); - ctx->disp[1].dispfb2.f.FBP = fbp/4; - ctx->draw[0].frame1.f.FBP = fbp/4; - ctx->draw[0].frame2.f.FBP = fbp/4; - ctx->draw[0].zbuf1.f.ZBP = zbp/4; - ctx->draw[0].zbuf2.f.ZBP = zbp/4; - ctx->draw[1].zbuf1.f.ZBP = zbp/4; - ctx->draw[1].zbuf2.f.ZBP = zbp/4; -} - -void -initrender(void) -{ - uint128 *p, tmp; - p = packetbuf; - MAKE128(tmp, 0xe, GIF_MAKE_TAG(2, 1, 0, 0, GIF_PACKED, 1)); - *p++ = tmp; - MAKE128(tmp, GS_PRMODECONT, 1); - *p++ = tmp; - MAKE128(tmp, GS_COLCLAMP, 1); - *p++ = tmp; - toGIF(packetbuf, 3); -} - -void -clearscreen(int r, int g, int b) -{ - int x, y; - uint128 *p, tmp; - p = packetbuf; - - x = (2048 + WIDTH)<<4; - y = (2048 + HEIGHT)<<4; - - MAKE128(tmp, 0xe, GIF_MAKE_TAG(5, 1, 0, 0, GIF_PACKED, 1)); - *p++ = tmp; - MAKE128(tmp, GS_TEST_1, GS_MAKE_TEST(0, 0, 0, 0, 0, 0, 1, 1)); - *p++ = tmp; - MAKE128(tmp, GS_PRIM, GS_MAKE_PRIM(GS_PRIM_SPRITE,0,0,0,0,0,0,0,0)); - *p++ = tmp; - MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(r, g, b, 0, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(2048<<4, 2048<<4, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x, y, 0)); - *p++ = tmp; - toGIF(packetbuf, 6); -} - -void -drawtest(void) -{ - int x0, x1, x2, x3; - int y0, y1, y2; - uint128 *p, tmp; - int n; - - x0 = 2048<<4; - x1 = (2048 + 210)<<4; - x2 = (2048 + 430)<<4; - x3 = (2048 + 640)<<4; - y0 = 2048<<4; - y1 = (2048 + 224)<<4; - y2 = (2048 + 448)<<4; - - n = 2 + 3*7; - p = packetbuf; - MAKEQ(tmp, 0x70000000 | n+1, 0, 0, 0); - *p++ = tmp; - MAKE128(tmp, 0xe, GIF_MAKE_TAG(n, 1, 0, 0, GIF_PACKED, 1)); - *p++ = tmp; - MAKE128(tmp, GS_TEST_1, GS_MAKE_TEST(0, 0, 0, 0, 0, 0, 1, 1)); - *p++ = tmp; - MAKE128(tmp, GS_PRIM, GS_MAKE_PRIM(GS_PRIM_SPRITE,0,0,0,0,0,0,0,0)); - *p++ = tmp; - MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(255, 0, 0, 0, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x0, y0, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x1, y1, 0)); - *p++ = tmp; - MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(0, 255, 0, 0, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x1, y0, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x2, y1, 0)); - *p++ = tmp; - MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(0, 0, 255, 0, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x2, y0, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x3, y1, 0)); - *p++ = tmp; - MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(0, 255, 255, 0, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x0, y1, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x1, y2, 0)); - *p++ = tmp; - MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(255, 0, 255, 0, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x1, y1, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x2, y2, 0)); - *p++ = tmp; - MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(255, 255, 0, 0, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x2, y1, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x3, y2, 0)); - *p++ = tmp; - MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(255, 255, 255, 0, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ((2048+20)<<4, y0, 0)); - *p++ = tmp; - MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x3, (2048+20)<<4, 0)); - *p++ = tmp; - toGIFchain(packetbuf); -} - -void -drawtri(void) -{ - uint128 *p, tmp; - uint32 *ip; - int nverts, n; - - nverts = 3; - n = 2*nverts; - p = packetbuf; - MAKEQ(tmp, 0x70000000 | n+1, 0, 0, 0); - *p++ = tmp; - MAKE128(tmp, (0x5<<4) | 0x1, - GIF_MAKE_TAG(nverts, 1, 1, GS_MAKE_PRIM(GS_PRIM_TRI, 1, 0, 0, 0, 0, 0, 0, 0), GIF_PACKED, 2)); - *p++ = tmp; - MAKEQ(tmp, 255, 0, 0, 0); - *p++ = tmp; - MAKEQ(tmp, (2048+85)<<4, (2048+70)<<4, 0, 0); - *p++ = tmp; - MAKEQ(tmp, 0, 255, 0, 0); - *p++ = tmp; - MAKEQ(tmp, (2048+260)<<4, (2048+200)<<4, 0, 0); - *p++ = tmp; - MAKEQ(tmp, 0, 0, 255, 0); - *p++ = tmp; - MAKEQ(tmp, (2048+180)<<4, (2048+350)<<4, 0, 0); - *p++ = tmp; - toGIFchain(packetbuf); -} - -void -printMatrix(rw::Matrix *m) -{ - rw::V3d *x = &m->right; - rw::V3d *y = &m->up; - rw::V3d *z = &m->at; - rw::V3d *w = &m->pos; - printf( - "[ [ %8.4f, %8.4f, %8.4f, %8.4f ]\n" - " [ %8.4f, %8.4f, %8.4f, %8.4f ]\n" - " [ %8.4f, %8.4f, %8.4f, %8.4f ]\n" - " [ %8.4f, %8.4f, %8.4f, %8.4f ] ]\n" - " %08x == flags\n", - x->x, y->x, z->x, w->x, - x->y, y->y, z->y, w->y, - x->z, y->z, z->z, w->z, - 0.0f, 0.0f, 0.0f, 1.0f, - m->flags); -} - -// This is not proper data, just for testing -void -setupLight(rw::Atomic *atomic) -{ - using namespace rw; - Matrix *lightmat; - float32 *lp; - - numLightQ = 0; - lp = (float32*)lightpacket; - - // TODO: this is the wrong matrix. we actually want to - // transform the light, not all normals. - lightmat = atomic->getFrame()->getLTM(); - *lp++ = lightmat->right.x; - *lp++ = lightmat->right.y; - *lp++ = lightmat->right.z; - *lp++ = 0.0f; - *lp++ = lightmat->up.x; - *lp++ = lightmat->up.y; - *lp++ = lightmat->up.z; - *lp++ = 0.0f; - *lp++ = lightmat->at.x; - *lp++ = lightmat->at.y; - *lp++ = lightmat->at.z; - *lp++ = 0.0f; - *lp++ = lightmat->pos.x; - *lp++ = lightmat->pos.y; - *lp++ = lightmat->pos.z; - *lp++ = 1.0f; - // TODO: make a proper light block - // ambient - *lp++ = 80.0f; - *lp++ = 80.0f; - *lp++ = 80.0f; - *lp++ = 0.0f; - // directional - *lp++ = 0.5f; - *lp++ = -0.5f; - *lp++ = -0.7071f; - *lp++ = 0.0f; - numLightQ = 6; -} - -void -setupTransform(rw::Atomic *atomic, rw::Matrix *trans) -{ - rw::Matrix::mult(trans, atomic->getFrame()->getLTM(), &camera->viewMatrix); -} - -enum { - DMAcnt = 0x10000000, - DMAref = 0x30000000, - DMAcall = 0x50000000, - DMAret = 0x60000000, - DMAend = 0x70000000, - - V4_32 = 0x6C -}; - -#define UNPACK(type, nq, offset) ((type)<<24 | (nq)<<16 | (offset)) -#define STCYCL(WL,CL) (0x01000000 | (WL)<<8 | (CL)) - -void -drawAtomic(rw::Atomic *atomic) -{ - using namespace rw; - - Matrix trans; - Geometry *geo; - ps2::ObjPipeline *pipe; - ps2::MatPipeline *matpipe; - Material *material; - uint128 tmp, *lp; - uint32 *vec; - RGBAf color; - int i; - - geo = atomic->geometry; - pipe = (ps2::ObjPipeline*)atomic->getPipeline(); - if(pipe->platform != PLATFORM_PS2) - return; - - setupLight(atomic); - setupTransform(atomic, &trans); - - curVifPtr = packetbuf; - // upload lights - MAKEQ(tmp, DMAcnt | numLightQ+8, 0, STCYCL(4,4), UNPACK(V4_32, numLightQ, 0x3d0)); - *curVifPtr++ = tmp; - for(lp = lightpacket; numLightQ--;) - *curVifPtr++ = *lp++; - - // upload transformation matrix - MAKEQ(tmp, 0, 0, STCYCL(4,4), UNPACK(V4_32, 4, 0x3f0)); - *curVifPtr++ = tmp; - vec = (uint32*)&trans.right; - MAKEQ(tmp, vec[0], vec[1], vec[2], vec[2]); - *curVifPtr++ = tmp; - vec = (uint32*)&trans.up; - MAKEQ(tmp, vec[0], vec[1], vec[2], vec[2]); - *curVifPtr++ = tmp; - vec = (uint32*)&trans.at; - MAKEQ(tmp, vec[0], vec[1], vec[2], vec[2]); - *curVifPtr++ = tmp; - vec = (uint32*)&trans.pos; - MAKEQ(tmp, vec[0], vec[1], vec[2], vec[2]); - *curVifPtr++ = tmp; - - // upload camera/screen info - MAKEQ(tmp, 0, 0, STCYCL(4,4), UNPACK(V4_32, 2, 0x3f7)); - *curVifPtr++ = tmp; - *curVifPtr++ = vuXYZScale; - *curVifPtr++ = vuXYZOffset; - - assert(geo->instData != NULL); - rw::ps2::InstanceDataHeader *instData = - (rw::ps2::InstanceDataHeader*)geo->instData; - rw::MeshHeader *meshHeader = geo->meshHeader; - rw::Mesh *mesh; - for(i = 0; i < instData->numMeshes; i++){ - material = instData->instanceMeshes[i].material; - matpipe = pipe->groupPipeline; - if(matpipe == nil) - matpipe = (ps2::MatPipeline*)material->pipeline; - if(matpipe == nil) - matpipe = ps2::defaultMatPipe; - - // call vu code - MAKEQ(tmp, DMAcall, (uint32)skinPipe, 0, 0); - *curVifPtr++ = tmp; - // unpack GIF tag, material color, surface properties - MAKEQ(tmp, DMAcnt | 3, 0, STCYCL(4,4), UNPACK(V4_32, 3, 0x3fa)); - *curVifPtr++ = tmp; - MAKE128(tmp, 0x412, - GIF_MAKE_TAG(0, 1, 1, GS_MAKE_PRIM(GS_PRIM_TRI_STRIP,1,0,0,0,0,0,0,0), GIF_PACKED, 3)); - *curVifPtr++ = tmp; - convColor(&color, &material->color); - color.alpha *= 128.0f/255.0f; - MAKEQ(tmp, *(uint32*)&color.red, *(uint32*)&color.green, - *(uint32*)&color.blue, *(uint32*)&color.alpha); - *curVifPtr++ = tmp; - MAKEQ(tmp, *(uint32*)&material->surfaceProps.ambient, - *(uint32*)&material->surfaceProps.specular, - *(uint32*)&material->surfaceProps.diffuse, - 0.0f); // extra - *curVifPtr++ = tmp; - // call geometry - MAKEQ(tmp, DMAcall, (uint32)instData->instanceMeshes[i].data, 0x03000000, 0x02000000 | matpipe->vifOffset); - *curVifPtr++ = tmp; - } - MAKEQ(tmp, DMAend, 0, 0, 0); - *curVifPtr++ = tmp; -// for(lp = packetbuf; lp < curVifPtr; lp++) -// printquad4(*lp); - toVIF1chain(packetbuf); -} - -void -beginCamera(void) -{ - uint128 *p, tmp; - float32 *f; - - p = packetbuf; - MAKE128(tmp, 0xe, GIF_MAKE_TAG(2, 1, 0, 0, GIF_PACKED, 1)); - *p++ = tmp; - MAKE128(tmp, GS_XYOFFSET_1, GS_MAKE_XYOFFSET(2048-WIDTH/2 <<4, 2048-HEIGHT/2 <<4)); - *p++ = tmp; - MAKE128(tmp, GS_TEST_1, GS_MAKE_TEST(0, 0, 0, 0, 0, 0, 1, 2)); - *p++ = tmp; - toGIF(packetbuf, 3); - f = (float32*)&vuXYZScale; - f[0] = WIDTH; - f[1] = HEIGHT; - f[2] = camera->zScale; - f[3] = 0.0f; - f = (float32*)&vuXYZOffset; - f[0] = 2048.0f; - f[1] = 2048.0f; - f[2] = camera->zShift; - f[3] = 0.0f; -} - -rw::EngineOpenParams engineOpenParams; - -void -pluginattach(void) -{ - rw::ps2::registerPDSPlugin(40); - rw::ps2::registerPluginPDSPipes(); - - rw::registerMeshPlugin(); - rw::registerNativeDataPlugin(); - rw::registerAtomicRightsPlugin(); - rw::registerMaterialRightsPlugin(); - rw::xbox::registerVertexFormatPlugin(); - rw::registerSkinPlugin(); - rw::registerHAnimPlugin(); - rw::registerMatFXPlugin(); - rw::registerUVAnimPlugin(); - rw::ps2::registerADCPlugin(); -} - -bool32 -initrw(void) -{ - rw::version = 0x34000; - rw::platform = rw::PLATFORM_PS2; - if(!rw::Engine::init()) - return 0; - pluginattach(); - if(!rw::Engine::open(&engineOpenParams)) - return 0; - if(!rw::Engine::start()) - return 0; - rw::Texture::setLoadTextures(0); - - rw::TexDictionary::setCurrent(rw::TexDictionary::create()); - rw::Image::setSearchPath("."); - - world = rw::World::create(); - camera = rw::Camera::create(); - camera->frameBuffer = rw::Raster::create(WIDTH, HEIGHT, 0, rw::Raster::CAMERA); - camera->zBuffer = rw::Raster::create(WIDTH, HEIGHT, 0, rw::Raster::ZBUFFER); - camera->setFrame(rw::Frame::create()); - rw::V3d t = { 0.0f, 0.0f, -4.0f }; -// rw::V3d t = { 0.0f, 0.0f, -40.0f }; - camera->getFrame()->translate(&t, rw::COMBINEPOSTCONCAT); - rw::V3d axis = { 0.0f, 1.0f, 0.0f }; - camera->getFrame()->rotate(&axis, 40.0f, rw::COMBINEPOSTCONCAT); - camera->setNearPlane(0.1f); - camera->setFarPlane(450.0f); - camera->setFOV(60.0f, 4.0f/3.0f); - world->addCamera(camera); - return 1; -} - -int vsynchInt = 0; - -int -vsynch(int id) -{ - vsynchInt = 1; - frames++; - ExitHandler(); - return 0; -} - -int -main() -{ - FlushCache(0); - if(!initrw()){ - printf("init failed!\n"); - for(;;); - } - - rw::uint32 len; - rw::uint8 *data = rw::getFileContents("host:player.DFF", &len); -// rw::uint8 *data = rw::getFileContents("host:od_newscafe_dy.dff", &len); - rw::StreamMemory in; - in.open(data, len); - rw::findChunk(&in, rw::ID_CLUMP, NULL, NULL); - rw::Clump *clump = rw::Clump::streamRead(&in); - in.close(); - rwFree(data); - - GsCtx gsCtx; - - dmaReset(); - -// GsResetCrt(GS_NONINTERLACED, GS_NTSC, 0); -// GsInitCtx(&gsCtx, 640, 224, GS_PSMCT32, GS_PSMZ32); - -// GsResetCrt(GS_INTERLACED, GS_NTSC, GS_FRAME); -// GsInitCtx(&gsCtx, 640, 224, GS_PSMCT32, GS_PSMZ32); - - GsResetCrt(GS_INTERLACED, VMODE, GS_FIELD); - GsInitCtx(&gsCtx, WIDTH, HEIGHT, GS_PSMCT32, GS_PSMZ32); - - initrender(); - - AddIntcHandler(2, vsynch, 0); - EnableIntc(2); - - GsPutDrawCtx(&gsCtx.draw[0]); - GsPutDispCtx(&gsCtx.disp[1]); - // PCSX2 needs a delay for some reason - { int i; for(i = 0; i < 1000000; i++); } - clearscreen(0x80, 0x80, 0x80); -// drawtest(); -// drawtri(); - - float angle = 40.0f; - int drawbuf = 0; - int dispbuf = 1; - for(;;){ - clearscreen(0x80, 0x80, 0x80); - - rw::V3d t = { 0.0f, 0.0f, -4.0f }; - camera->getFrame()->translate(&t, rw::COMBINEREPLACE); - rw::V3d axis = { 0.0f, 1.0f, 0.0f }; - camera->getFrame()->rotate(&axis, angle, rw::COMBINEPOSTCONCAT); - angle += 1.0f; - - camera->beginUpdate(); - beginCamera(); - FORLIST(lnk, clump->atomics) - drawAtomic(rw::Atomic::fromClump(lnk)); - camera->endUpdate(); - printf(""); - - while(vsynchInt == 0); - GsPutDrawCtx(&gsCtx.draw[drawbuf]); - GsPutDispCtx(&gsCtx.disp[dispbuf]); - drawbuf = !drawbuf; - dispbuf = !dispbuf; - vsynchInt = 0; - } -/* - camera->beginUpdate(); - beginCamera(); - FORLIST(lnk, clump->atomics) - drawAtomic(rw::Atomic::fromClump(lnk)); - camera->endUpdate(); - - printf("hello %p\n", clump); - for(;;) - printf(""); -*/ - - return 0; -} diff --git a/vendor/librw/tools/ps2test/mem.h b/vendor/librw/tools/ps2test/mem.h deleted file mode 100644 index 088c1d4..0000000 --- a/vendor/librw/tools/ps2test/mem.h +++ /dev/null @@ -1,95 +0,0 @@ -/* FIFOs */ -#define VIF0_FIFO (*(volatile uint128*)0x10004000) -#define VIF1_FIFO (*(volatile uint128*)0x10005000) -#define GIF_FIFO (*(volatile uint128*)0x10006000) -#define IPU_out_FIFO (*(volatile uint128*)0x10007000) -#define IPU_in_FIFO (*(volatile uint128*)0x10007010) - -/* DMA channels */ -// to VIF0 -#define D0_CHCR (*(volatile uint32*)0x10008000) -#define D0_MADR (*(volatile uint32*)0x10008010) -#define D0_QWC (*(volatile uint32*)0x10008020) -#define D0_TADR (*(volatile uint32*)0x10008030) -#define D0_ASR0 (*(volatile uint32*)0x10008040) -#define D0_ASR1 (*(volatile uint32*)0x10008050) -// VIF1 -#define D1_CHCR (*(volatile uint32*)0x10009000) -#define D1_MADR (*(volatile uint32*)0x10009010) -#define D1_QWC (*(volatile uint32*)0x10009020) -#define D1_TADR (*(volatile uint32*)0x10009030) -#define D1_ASR0 (*(volatile uint32*)0x10009040) -#define D1_ASR1 (*(volatile uint32*)0x10009050) -// to GIF -#define D2_CHCR (*(volatile uint32*)0x1000a000) -#define D2_MADR (*(volatile uint32*)0x1000a010) -#define D2_QWC (*(volatile uint32*)0x1000a020) -#define D2_TADR (*(volatile uint32*)0x1000a030) -#define D2_ASR0 (*(volatile uint32*)0x1000a040) -#define D2_ASR1 (*(volatile uint32*)0x1000a050) -// fromIPU -#define D3_CHCR (*(volatile uint32*)0x1000b000) -#define D3_MADR (*(volatile uint32*)0x1000b010) -#define D3_QWC (*(volatile uint32*)0x1000b020) -// toIPU -#define D4_CHCR (*(volatile uint32*)0x1000b400) -#define D4_MADR (*(volatile uint32*)0x1000b410) -#define D4_QWC (*(volatile uint32*)0x1000b420) -#define D4_TADR (*(volatile uint32*)0x1000b430) -// from SIF0 -#define D5_CHCR (*(volatile uint32*)0x1000c000) -#define D5_MADR (*(volatile uint32*)0x1000c010) -#define D5_QWC (*(volatile uint32*)0x1000c020) -// to SIF1 -#define D6_CHCR (*(volatile uint32*)0x1000c400) -#define D6_MADR (*(volatile uint32*)0x1000c410) -#define D6_QWC (*(volatile uint32*)0x1000c420) -#define D6_TADR (*(volatile uint32*)0x1000c430) -// SIF2 -#define D7_CHCR (*(volatile uint32*)0x1000c800) -#define D7_MADR (*(volatile uint32*)0x1000c810) -#define D7_QWC (*(volatile uint32*)0x1000c820) -// fromSPR -#define D8_CHCR (*(volatile uint32*)0x1000d000) -#define D8_MADR (*(volatile uint32*)0x1000d010) -#define D8_QWC (*(volatile uint32*)0x1000d020) -#define D8_SADR (*(volatile uint32*)0x1000d080) -// toSPR -#define D9_CHCR (*(volatile uint32*)0x1000d400) -#define D9_MADR (*(volatile uint32*)0x1000d410) -#define D9_QWC (*(volatile uint32*)0x1000d420) -#define D9_TADR (*(volatile uint32*)0x1000d430) -#define D9_SADR (*(volatile uint32*)0x1000d480) - -/* DMA controller */ -#define D_CTRL (*(volatile uint32*)0x1000e000) -#define D_STAT (*(volatile uint32*)0x1000e010) -#define D_PCR (*(volatile uint32*)0x1000e020) -#define D_SQWC (*(volatile uint32*)0x1000e030) -#define D_RBSR (*(volatile uint32*)0x1000e040) -#define D_RBOR (*(volatile uint32*)0x1000e050) -#define D_STADR (*(volatile uint32*)0x1000e060) -#define D_ENABLER (*(volatile uint32*)0x1000f520) -#define D_ENABLEW (*(volatile uint32*)0x1000f590) - - -/* GS privileged registers */ -#define GS_PMODE (*(volatile uint64*)0x12000000) -#define GS_SMODE1 (*(volatile uint64*)0x12000010) -#define GS_SMODE2 (*(volatile uint64*)0x12000020) -#define GS_SRFSH (*(volatile uint64*)0x12000030) -#define GS_SYNCH1 (*(volatile uint64*)0x12000040) -#define GS_SYNCH2 (*(volatile uint64*)0x12000050) -#define GS_SYNCV (*(volatile uint64*)0x12000060) -#define GS_DISPFB1 (*(volatile uint64*)0x12000070) -#define GS_DISPLAY1 (*(volatile uint64*)0x12000080) -#define GS_DISPFB2 (*(volatile uint64*)0x12000090) -#define GS_DISPLAY2 (*(volatile uint64*)0x120000a0) -#define GS_EXTBUF (*(volatile uint64*)0x120000b0) -#define GS_EXTDATA (*(volatile uint64*)0x120000c0) -#define GS_EXTWRITE (*(volatile uint64*)0x120000d0) -#define GS_BGCOLOR (*(volatile uint64*)0x120000e0) -#define GS_CSR (*(volatile uint64*)0x12001000) -#define GS_IMR (*(volatile uint64*)0x12001010) -#define GS_BUSDIR (*(volatile uint64*)0x12001040) -#define GS_SIGLBLID (*(volatile uint64*)0x12001080) diff --git a/vendor/librw/tools/ps2test/ps2.h b/vendor/librw/tools/ps2test/ps2.h deleted file mode 100644 index ced015a..0000000 --- a/vendor/librw/tools/ps2test/ps2.h +++ /dev/null @@ -1,23 +0,0 @@ -#include - -typedef int quad __attribute__((mode(TI))); -typedef int int128 __attribute__((mode(TI))); -typedef unsigned int uquad __attribute__((mode(TI))); -typedef unsigned int uint128 __attribute__((mode(TI))); - -#define MAKE128(RES,MSB,LSB) \ - __asm__ ( "pcpyld %0, %1, %2" : "=r" (RES) : "r" ((uint64)MSB), "r" ((uint64)LSB)) -#define UINT64(LOW,HIGH) (((uint64)HIGH)<<32 | ((uint64)LOW)) -#define MAKEQ(RES,W0,W1,W2,W3) MAKE128(RES,UINT64(W2,W3),UINT64(W0,W1)) - -#define BIT64(v,s) (((uint64)(v)) << (s)) - -#include "mem.h" -#include "gs.h" - -extern uint128 packetbuf[128]; - -void waitDMA(volatile uint32 *chcr); -void toGIF(void *src, int n); - -void drawcube(void); diff --git a/vendor/librw/tools/ps2test/vu/defaultpipe.dsm b/vendor/librw/tools/ps2test/vu/defaultpipe.dsm deleted file mode 100644 index ae3fa39..0000000 --- a/vendor/librw/tools/ps2test/vu/defaultpipe.dsm +++ /dev/null @@ -1,93 +0,0 @@ -.global defaultPipe - -.equ vertexTop, 0x3d0 -.equ numInAttribs, 4 -.equ numOutAttribs, 3 -.equ numOutBuf, 2 -.equ vertCount, ((vertexTop-numOutBuf)/(numInAttribs*2+numOutAttribs*numOutBuf)) -.equ offset, (vertCount*numInAttribs) -.equ outBuf1, (2*offset) -.equ outSize, ((vertexTop-outBuf1-2)/2) -.equ outBuf2, (outBuf1+outSize) - -.equ lightMat, 0x3d0 -.equ ambientLight, 0x3d4 -.equ lightDir, 0x3d5 - -.equ matrix, 0x3f0 -.equ XYZScale, 0x3f7 -.equ XYZOffset, 0x3f8 -.equ gifTag, 0x3fa -.equ matColor, 0x3fb -.equ surfProps, 0x3fc - - -.balign 16,0 -defaultPipe: -DMAret * -MPG 0, * -.vu -Start: -#include "setup_persp.vu" -Cnt: - NOP XTOP VI02 ; input pointer - NOP LQ VF01, gifTag(VI00) - NOP XITOP VI01 ; vertex count - NOP IADDIU VI05, VI00, 0x4000 - NOP IADD VI05, VI05, VI05 - NOP IOR VI05, VI05, VI01 - NOP SQ VF01, 0(VI12) - NOP ISW.x VI05, 0(VI12) - NOP IADDIU VI03, VI12, 1 ; output pointer - NOP LQ VF18, lightMat(VI00) - NOP LQ VF19, lightMat+1(VI00) - NOP LQ VF20, lightMat+2(VI00) - -Loop: - NOP LQI VF01, (VI02++) ; vertex - NOP LQI VF02, (VI02++) ; UV - NOP LQI VF03, (VI02++) ; color - NOP LQI VF04, (VI02++) ; normal - - MULAw.xyzw ACC, VF31, VF00w NOP ; transform vertex - MADDAx.xyw ACC, VF28, VF01x NOP - MADDAy.xyw ACC, VF29, VF01y NOP - MADDz.xyzw VF01, VF30, VF01z NOP - ITOF0 VF03, VF03 NOP - ITOF0[I] VF04, VF04 LOI 0.0078125 ; - normal scale - NOP NOP - NOP DIV Q, VF00w, VF01w - NOP WAITQ - MULq VF01, VF01, Q NOP ; perspective division - MULi VF04, VF04, I NOP ; scale normal - NOP MR32.z VF02, VF00 - NOP NOP - SUB.w VF01, VF01, VF01 NOP - MULAx.xyz ACC, VF18, VF04x NOP ; transform normal - MADDAy.xyz ACC, VF19, VF04y NOP - MADDz.xyz VF04, VF20, VF04z NOP - ADD.xyz VF01, VF01, VF25 NOP - MULq VF02, VF02, Q NOP - NOP NOP - FTOI0 VF03, VF03 NOP - FTOI4 VF01, VF01 NOP - NOP SQ VF04, -2(VI02) ; store normal - NOP IADDI VI01, VI01, -1 - NOP SQI VF02, (VI03++) ; STQ - NOP SQI VF03, (VI03++) ; color - NOP SQI VF01, (VI03++) ; vertex - NOP IBNE VI01, VI00, Loop - NOP NOP - -#include "light.vu" - - NOP XGKICK VI12 - NOP IADD VI15,VI00,VI12 - NOP IADD VI12,VI00,VI13 - NOP[E] IADD VI13,VI00,VI15 - NOP NOP - NOP B Cnt - NOP NOP - -.EndMPG -.EndDmaData diff --git a/vendor/librw/tools/ps2test/vu/light.vu b/vendor/librw/tools/ps2test/vu/light.vu deleted file mode 100644 index 8f7a31c..0000000 --- a/vendor/librw/tools/ps2test/vu/light.vu +++ /dev/null @@ -1,94 +0,0 @@ -; Ambient light: - NOP LQ VF26, ambientLight(VI00) - NOP XITOP VI01 - NOP IADDIU VI03, VI12, 2 -Ambloop: - NOP LQ VF03, 0(VI03) ; output color - NOP NOP - NOP NOP - NOP NOP - ITOF0 VF03, VF03 NOP - NOP NOP - NOP NOP - NOP NOP - ADD.xyz VF03, VF03, VF26 NOP - NOP NOP - NOP NOP - NOP NOP - FTOI0 VF03, VF03 NOP - NOP IADDI VI01, VI01, -1 - NOP IADDIU VI03, VI03, numOutAttribs - NOP IBNE VI01, VI00, Ambloop - NOP SQ VF03, -numOutAttribs(VI03) -; end amblight - -; Direct Light - NOP LQ VF26, lightDir(VI00) - NOP XITOP VI01 - NOP XTOP VI02 - NOP IADDIU VI03, VI12, 2 - SUB.xyz VF26, VF00, VF26 NOP -Dirloop: - NOP LQ VF01, 3(VI02); ; normal - NOP LQ VF02, 0(VI03); ; output color - NOP NOP - NOP NOP - MUL VF03, VF01, VF26 NOP - ITOF0 VF02, VF02 NOP - NOP NOP - NOP NOP - ADDy.x VF03, VF03, VF03y NOP - NOP NOP - NOP NOP - NOP NOP - ADDz.x VF03, VF03, VF03z NOP - NOP NOP - NOP NOP - NOP NOP - MAX.x VF03, VF00, VF03 NOP ; clamp to 0 - NOP[I] LOI 255 - NOP NOP - NOP NOP - MULi.x VF03, VF03, I NOP - NOP NOP - NOP NOP - NOP NOP - ADDx.xyz VF02, VF02, VF03x NOP - NOP NOP - NOP NOP - NOP NOP - FTOI0 VF02, VF02 NOP - NOP IADDI VI01, VI01, -1 - NOP IADDIU VI02, VI02, numInAttribs - NOP IADDIU VI03, VI03, numOutAttribs - NOP IBNE VI01, VI00, Dirloop - NOP SQ VF02, -numOutAttribs(VI03) -; end dirlight - -; Material color and clamp - NOP LQ VF27, matColor(VI00) - NOP XITOP VI01 - NOP IADDIU VI03, VI12, 2 -Colorloop: - NOP LQ VF03, 0(VI03) - NOP NOP - NOP NOP - NOP NOP - ITOF0 VF03, VF03 NOP - NOP NOP - NOP NOP - NOP NOP - MUL VF03, VF03, VF27 NOP - NOP[I] LOI 255 - NOP NOP - NOP NOP - MINIi VF03, VF03, I NOP - NOP NOP - NOP NOP - NOP NOP - FTOI0 VF03, VF03 NOP - NOP IADDI VI01, VI01, -1 - NOP IADDIU VI03, VI03, numOutAttribs - NOP IBNE VI01, VI00, Colorloop - NOP SQ VF03, -numOutAttribs(VI03) -; end material color diff --git a/vendor/librw/tools/ps2test/vu/setup_persp.vu b/vendor/librw/tools/ps2test/vu/setup_persp.vu deleted file mode 100644 index b9ea42f..0000000 --- a/vendor/librw/tools/ps2test/vu/setup_persp.vu +++ /dev/null @@ -1,39 +0,0 @@ -/* This is the the projection matrix we start with: - * 1/2w 0 ox/2w + 1/2 -ox/2w - * 0 -1/2h -oy/2h + 1/2 oy/2h - * 0 0 1 0 - * 0 0 1 0 - * To get rid of the +1/2 in the combined matrix we - * subtract the z-row/2 from the x- and y-rows. - * - * The z-row is then set to [0 0 0 1] such that multiplication - * by XYZscale gives [0 0 0 zScale]. After perspective division - * and addition of XYZoffset we then get zScale/w + zShift for z. - * - * XYZScale scales xy to the resolution and z by zScale. - * XYZOffset translates xy to the GS coordinate system (where - * [2048, 2048] is the center of the frame buffer) and add zShift to z. - */ - -; constant: -; VF28-VF31 transformation matrix -; VF25 XYZ offset - - - SUB.z VF28, VF28, VF28 LOI 0.5 ; right.z = 0 - SUB.z VF29, VF29, VF29 LQ VF28, matrix(VI00) ; up.z = 0 - load matrix - SUB.z VF30, VF30, VF30 LQ VF29, matrix+1(VI00) ; at.z = 0 - load matrix - ADDw.z VF31, VF00, VF00 LQ VF30, matrix+2(VI00) ; at.z = 1 - load matrix - NOP LQ VF31, matrix+3(VI00) ; - load matrix - MULi.w VF20, VF28, I LQ.xyz VF01, XYZScale(VI00) ; fix matrix - load scale - MULi.w VF21, VF29, I NOP ; fix matrix - MULi.w VF22, VF30, I NOP ; fix matrix - MULi.w VF23, VF31, I NOP ; fix matrix - SUBw.xy VF28, VF28, VF20 NOP ; fix matrix - SUBw.xy VF29, VF29, VF21 NOP ; fix matrix - SUBw.xy VF30, VF30, VF22 NOP ; fix matrix - SUBw.xy VF31, VF31, VF23 NOP ; fix matrix - MUL.xy VF28, VF28, VF01 LQ.xyz VF25, XYZOffset(VI00) ; scale matrix - MUL.xy VF29, VF29, VF01 IADDIU VI12, VI00, outBuf1 ; scale matrix - MUL.xy VF30, VF30, VF01 IADDIU VI13, VI00, outBuf2 ; scale matrix - MUL.xyz VF31, VF31, VF01 NOP ; scale matrix diff --git a/vendor/librw/tools/ps2test/vu/skinpipe.dsm b/vendor/librw/tools/ps2test/vu/skinpipe.dsm deleted file mode 100644 index 18536cd..0000000 --- a/vendor/librw/tools/ps2test/vu/skinpipe.dsm +++ /dev/null @@ -1,94 +0,0 @@ -.global skinPipe - -.equ vertexTop, 0x2d0 -.equ numInAttribs, 5 -.equ numOutAttribs, 3 -.equ numOutBuf, 2 -.equ vertCount, ((vertexTop-numOutBuf)/(numInAttribs*2+numOutAttribs*numOutBuf)) -.equ offset, (vertCount*numInAttribs) -.equ outBuf1, (2*offset) -.equ outSize, ((vertexTop-outBuf1-2)/2) -.equ outBuf2, (outBuf1+outSize) - -.equ lightMat, 0x3d0 -.equ ambientLight, 0x3d4 -.equ lightDir, 0x3d5 - -.equ matrix, 0x3f0 -.equ XYZScale, 0x3f7 -.equ XYZOffset, 0x3f8 -.equ gifTag, 0x3fa -.equ matColor, 0x3fb -.equ surfProps, 0x3fc - - -.balign 16,0 -skinPipe: -DMAret * -MPG 0, * -.vu -Start: -#include "setup_persp.vu" -Cnt: - NOP XTOP VI02 ; input pointer - NOP LQ VF01, gifTag(VI00) - NOP XITOP VI01 ; vertex count - NOP IADDIU VI05, VI00, 0x4000 - NOP IADD VI05, VI05, VI05 - NOP IOR VI05, VI05, VI01 - NOP SQ VF01, 0(VI12) - NOP ISW.x VI05, 0(VI12) - NOP IADDIU VI03, VI12, 1 ; output pointer - NOP LQ VF18, lightMat(VI00) - NOP LQ VF19, lightMat+1(VI00) - NOP LQ VF20, lightMat+2(VI00) - -Loop: - NOP LQI VF01, (VI02++) ; vertex - NOP LQI VF02, (VI02++) ; UV - NOP LQI VF03, (VI02++) ; color - NOP LQI VF04, (VI02++) ; normal - NOP IADDIU VI02, VI02, 1 ; skip weights - - MULAw.xyzw ACC, VF31, VF00w NOP ; transform vertex - MADDAx.xyw ACC, VF28, VF01x NOP - MADDAy.xyw ACC, VF29, VF01y NOP - MADDz.xyzw VF01, VF30, VF01z NOP - ITOF0 VF03, VF03 NOP - ITOF0[I] VF04, VF04 LOI 0.0078125 ; - normal scale - NOP NOP - NOP DIV Q, VF00w, VF01w - NOP WAITQ - MULq VF01, VF01, Q NOP ; perspective division - MULi VF04, VF04, I NOP ; scale normal - NOP MR32.z VF02, VF00 - NOP NOP - SUB.w VF01, VF01, VF01 NOP - MULAx.xyz ACC, VF18, VF04x NOP ; transform normal - MADDAy.xyz ACC, VF19, VF04y NOP - MADDz.xyz VF04, VF20, VF04z NOP - ADD.xyz VF01, VF01, VF25 NOP - MULq VF02, VF02, Q NOP - NOP NOP - FTOI0 VF03, VF03 NOP - FTOI4 VF01, VF01 NOP - NOP SQ VF04, -2(VI02) ; store normal - NOP IADDI VI01, VI01, -1 - NOP SQI VF02, (VI03++) ; STQ - NOP SQI VF03, (VI03++) ; color - NOP SQI VF01, (VI03++) ; vertex - NOP IBNE VI01, VI00, Loop - NOP NOP - -#include "light.vu" - - NOP XGKICK VI12 - NOP IADD VI15,VI00,VI12 - NOP IADD VI12,VI00,VI13 - NOP[E] IADD VI13,VI00,VI15 - NOP NOP - NOP B Cnt - NOP NOP - -.EndMPG -.EndDmaData diff --git a/vendor/librw/tools/ska2anm/ska2anm.cpp b/vendor/librw/tools/ska2anm/ska2anm.cpp deleted file mode 100644 index 900ba82..0000000 --- a/vendor/librw/tools/ska2anm/ska2anm.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include -#include -#include -#include - -#include -#include - -using namespace rw; - -char *argv0; - -void -usage(void) -{ - fprintf(stderr, "usage: %s in.ska [out.anm]\n", argv0); - fprintf(stderr, " or: %s in.anm [out.ska]\n", argv0); - exit(1); -} - -int -main(int argc, char *argv[]) -{ - rw::Engine::init(); - rw::registerHAnimPlugin(); - rw::Engine::open(nil); - rw::Engine::start(); - - ARGBEGIN{ - case 'v': - sscanf(EARGF(usage()), "%x", &rw::version); - break; - default: - usage(); - }ARGEND; - - if(argc < 1) - usage(); - - StreamFile stream; - if(!stream.open(argv[0], "rb")){ - fprintf(stderr, "Error: couldn't open %s\n", argv[0]); - return 1; - } - - int32 firstword = stream.readU32(); - stream.seek(0, 0); - Animation *anim = nil; - if(firstword == ID_ANIMANIMATION){ - // it's an anm file - if(findChunk(&stream, ID_ANIMANIMATION, nil, nil)) - anim = Animation::streamRead(&stream); - }else{ - // it's a ska file - anim = Animation::streamReadLegacy(&stream); - } - stream.close(); - - if(anim == nil){ - fprintf(stderr, "Error: couldn't read anim file\n"); - return 1; - } - - const char *file; - if(argc > 1) - file = argv[1]; - else if(firstword == ID_ANIMANIMATION) - file = "out.ska"; - else - file = "out.anm"; - if(!stream.open(file, "wb")){ - fprintf(stderr, "Error: couldn't open %s\n", file); - return 1; - } - if(firstword == ID_ANIMANIMATION) - anim->streamWriteLegacy(&stream); - else - anim->streamWrite(&stream); - - anim->destroy(); - - return 0; -}